Skip to content

feat(tool): add streaming output support#220

Merged
chaliy merged 3 commits intomainfrom
claude/add-bashkit-streaming-dVUD9
Feb 18, 2026
Merged

feat(tool): add streaming output support#220
chaliy merged 3 commits intomainfrom
claude/add-bashkit-streaming-dVUD9

Conversation

@chaliy
Copy link
Contributor

@chaliy chaliy commented Feb 18, 2026

Summary

  • Add exec_streaming to Bash and ToolDef::invoke_streaming to the tool layer, delivering stdout/stderr incrementally via callbacks while still returning the full ToolResult
  • Update spec 009-tool-contract.md with streaming API documentation
  • Add example (streaming_output.rs) and equivalence tests verifying streamed chunks reassemble to full output

Test plan

  • cargo test --all-features passes (includes streaming equivalence tests)
  • cargo run --example streaming_output runs end-to-end
  • CI green

Add incremental output streaming via callbacks for long-running scripts.

Interpreter changes:
- OutputCallback type: Box<dyn FnMut(&str, &str) + Send + Sync>
- Emission points at loop iterations, command lists, sequences, and
  top-level execute with a dedup counter to prevent double-emission

Public API additions:
- Bash::exec_streaming() - execute with output callback
- ToolStatus::stdout()/stderr() - constructors for output events
- ToolStatus.output and .stream fields (optional, backward-compatible)
- BashTool::execute_with_status now streams output as ToolStatus events

For a script like `for i in 1 2 3; do echo $i; done`, each iteration's
output is emitted incrementally via the callback, while the complete
result is still returned in ExecResult/ToolResponse.

https://claude.ai/code/session_01H1H5WiZVgpjWJ7fTjip51p
… tests

- Add streaming_output.rs example showing exec_streaming usage
- Add 8 equivalence tests that run same script through exec() and
  exec_streaming(), asserting identical ExecResult and that
  concatenated chunks == final stdout/stderr

https://claude.ai/code/session_01H1H5WiZVgpjWJ7fTjip51p
@chaliy chaliy merged commit f4f9d31 into main Feb 18, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants