From 73549b99d50180a571eef002eae7625023ba2ad8 Mon Sep 17 00:00:00 2001 From: Sean O'Bannon Date: Tue, 27 Jan 2026 18:10:42 -0800 Subject: [PATCH] feat: stream partial tool arguments via state.raw Accumulate tool-input-delta events into state.raw during streaming, allowing consumers to access partial tool arguments before the full tool call completes. Follows the same pattern as text-delta handling. --- packages/opencode/src/session/index.ts | 4 ++++ packages/opencode/src/session/processor.ts | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index fb0836bfb78b..26eff424c84e 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -406,6 +406,10 @@ export namespace Session { part: MessageV2.ReasoningPart, delta: z.string(), }), + z.object({ + part: MessageV2.ToolPart, + delta: z.string(), + }), ]) export const updatePart = fn(UpdatePartInput, async (input) => { diff --git a/packages/opencode/src/session/processor.ts b/packages/opencode/src/session/processor.ts index 27071056180a..24c3ddd49d84 100644 --- a/packages/opencode/src/session/processor.ts +++ b/packages/opencode/src/session/processor.ts @@ -117,8 +117,14 @@ export namespace SessionProcessor { toolcalls[value.id] = part as MessageV2.ToolPart break - case "tool-input-delta": + case "tool-input-delta": { + const match = toolcalls[value.id] + if (match && match.state.status === "pending") { + match.state.raw += value.delta + await Session.updatePart({ part: match, delta: value.delta }) + } break + } case "tool-input-end": break