Summary
In OpenCode V2, shell commands executed directly through a session can persist approximately 1 MiB of output and inject it into the next model request without applying the normal 50 KiB tool-output limit. The oversized request can exceed the model context window, fail as provider.unknown, and leave the session unable to continue automatically.
Environment
- opencode version:
opencode2 v0.0.0-beta-18230
- OS: macOS Darwin 25.5.0, arm64
- Terminal: Ghostty (
TERM=xterm-256color, COLORTERM=truecolor)
- Shell:
/bin/zsh
- Install/channel: V2 beta
- Active plugins: Not relevant; reproducible through the built-in session shell path.
Reproduction
- Start a V2 session with a model whose remaining context budget is smaller than approximately 1 MiB of shell output.
- Execute a user shell command through the session that writes more than 1 MiB, such as a failing typecheck with extensive diagnostics.
- Submit another prompt so OpenCode assembles a model request containing the persisted shell message.
- Observe the provider reject the oversized request and the session fail instead of recovering automatically.
Expected Behavior
Session shell output should obey the same bounded preview behavior as normal shell tool output. The model should receive a compact preview, with full output retained separately when appropriate, and the session should remain usable.
Actual Behavior
- Normal tool output defaults to 50 KiB in
packages/core/src/tool-output.ts.
- The session shell path captures up to 1 MiB through
SHELL_MAX_CAPTURE_BYTES in packages/core/src/session.ts.
packages/core/src/session/runner/to-llm-message.ts inserts the entire persisted shell output directly into the model-facing message.
- Automatic compaction considers token usage reported by the preceding model response, which does not include subsequently added shell output.
- The resulting provider failure can surface as
provider.unknown, bypassing context-overflow recovery.
Additional Context
Observed in a production session where a bun typecheck shell command persisted 1,048,701 characters despite output metadata reporting truncated: true. The session required manual compaction to recover.
The smallest likely fix is to apply the existing 50 KiB tool-output cap to session shell capture, rather than introducing request-wide token estimation solely to compensate for this inconsistent limit. Regression coverage should verify that a large session shell command cannot create an oversized model-facing shell message.
Summary
In OpenCode V2, shell commands executed directly through a session can persist approximately 1 MiB of output and inject it into the next model request without applying the normal 50 KiB tool-output limit. The oversized request can exceed the model context window, fail as
provider.unknown, and leave the session unable to continue automatically.Environment
opencode2 v0.0.0-beta-18230TERM=xterm-256color,COLORTERM=truecolor)/bin/zshReproduction
Expected Behavior
Session shell output should obey the same bounded preview behavior as normal shell tool output. The model should receive a compact preview, with full output retained separately when appropriate, and the session should remain usable.
Actual Behavior
packages/core/src/tool-output.ts.SHELL_MAX_CAPTURE_BYTESinpackages/core/src/session.ts.packages/core/src/session/runner/to-llm-message.tsinserts the entire persisted shell output directly into the model-facing message.provider.unknown, bypassing context-overflow recovery.Additional Context
Observed in a production session where a
bun typecheckshell command persisted 1,048,701 characters despite output metadata reportingtruncated: true. The session required manual compaction to recover.The smallest likely fix is to apply the existing 50 KiB tool-output cap to session shell capture, rather than introducing request-wide token estimation solely to compensate for this inconsistent limit. Regression coverage should verify that a large session shell command cannot create an oversized model-facing shell message.