Description
opencode run exits 1 (and the TUI shows an error toast) when a provider rejects a request for size (HTTP 413 / ContextOverflowError), even though auto-compaction recovers: the session compacts, retries, and produces a complete correct answer. Anything scripting opencode run or tailing --format json sees the run as failed.
Cause: the auto-compact branch in processor.ts halt() publishes Session.Event.Error before attempting recovery:
ctx.needsCompaction = true
yield* events.publish(Session.Event.Error, { sessionID: ctx.sessionID, error })
return
Consumers (cli/cmd/run.ts, tui/app.tsx, app/context/notification.tsx) all treat session.error as the run's outcome. This publish is inconsistent with the rest of the codebase: it doesn't set message.error (the durable message says no error), it isn't followed by idle or a throw, and nothing consumes it — compaction is triggered by the "compact" return value. Retried 429s and the proactive overflow check are both silent.
Steps to reproduce
- Run a non-interactive prompt against a session large enough that the provider returns 413, with auto-compaction enabled
- Compaction recovers and the final answer is produced
opencode run exits 1; --format json stdout contains an error event
Reproducible with the test-LLM harness: push a 413 (request_too_large), then two text replies; opencode run --format json exits 1 despite emitting the recovered output.
OpenCode version
dev (processor.ts:616)
Description
opencode runexits 1 (and the TUI shows an error toast) when a provider rejects a request for size (HTTP 413 /ContextOverflowError), even though auto-compaction recovers: the session compacts, retries, and produces a complete correct answer. Anything scriptingopencode runor tailing--format jsonsees the run as failed.Cause: the auto-compact branch in
processor.tshalt()publishesSession.Event.Errorbefore attempting recovery:Consumers (
cli/cmd/run.ts,tui/app.tsx,app/context/notification.tsx) all treatsession.erroras the run's outcome. This publish is inconsistent with the rest of the codebase: it doesn't setmessage.error(the durable message says no error), it isn't followed by idle or a throw, and nothing consumes it — compaction is triggered by the"compact"return value. Retried 429s and the proactive overflow check are both silent.Steps to reproduce
opencode runexits 1;--format jsonstdout contains anerroreventReproducible with the test-LLM harness: push a 413 (
request_too_large), then two text replies;opencode run --format jsonexits 1 despite emitting the recovered output.OpenCode version
dev (
processor.ts:616)