diff options
| author | Dax Raad <[email protected]> | 2025-08-11 01:23:00 -0400 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-08-11 01:23:00 -0400 |
| commit | 061ba65d20e0c7a7c536fbce0cc5c5bd16dd5ae1 (patch) | |
| tree | 22c6579c1f4d61edfd082ae046284677c73be2a7 | |
| parent | 457386ad08c8add2b8f9c80434582785ca07c557 (diff) | |
| download | opencode-061ba65d20e0c7a7c536fbce0cc5c5bd16dd5ae1.tar.gz opencode-061ba65d20e0c7a7c536fbce0cc5c5bd16dd5ae1.zip | |
show combined output of bash tool progressively
| -rw-r--r-- | packages/opencode/src/tool/bash.ts | 47 | ||||
| -rw-r--r-- | packages/opencode/test/tool/bash.test.ts | 2 | ||||
| -rw-r--r-- | packages/tui/internal/components/chat/message.go | 10 | ||||
| -rw-r--r-- | packages/web/src/components/share/part.tsx | 2 |
4 files changed, 44 insertions, 17 deletions
diff --git a/packages/opencode/src/tool/bash.ts b/packages/opencode/src/tool/bash.ts index de1eedaa8..f6368ea14 100644 --- a/packages/opencode/src/tool/bash.ts +++ b/packages/opencode/src/tool/bash.ts @@ -1,6 +1,6 @@ import { z } from "zod" import { exec } from "child_process" -import { text } from "stream/consumers" + import { Tool } from "./tool" import DESCRIPTION from "./bash.txt" import { App } from "../app/app" @@ -130,8 +130,35 @@ export const BashTool = Tool.define("bash", { timeout, }) - const stdoutPromise = text(process.stdout!) - const stderrPromise = text(process.stderr!) + let output = "" + + // Initialize metadata with empty output + ctx.metadata({ + metadata: { + output: "", + description: params.description, + }, + }) + + process.stdout?.on("data", (chunk) => { + output += chunk.toString() + ctx.metadata({ + metadata: { + output: output, + description: params.description, + }, + }) + }) + + process.stderr?.on("data", (chunk) => { + output += chunk.toString() + ctx.metadata({ + metadata: { + output: output, + description: params.description, + }, + }) + }) await new Promise<void>((resolve) => { process.on("close", () => { @@ -139,18 +166,22 @@ export const BashTool = Tool.define("bash", { }) }) - const stdout = await stdoutPromise - const stderr = await stderrPromise + ctx.metadata({ + metadata: { + output: output, + exit: process.exitCode, + description: params.description, + }, + }) return { title: params.command, metadata: { - stderr, - stdout, + output, exit: process.exitCode, description: params.description, }, - output: [`<stdout>`, stdout ?? "", `</stdout>`, `<stderr>`, stderr ?? "", `</stderr>`].join("\n"), + output, } }, }) diff --git a/packages/opencode/test/tool/bash.test.ts b/packages/opencode/test/tool/bash.test.ts index 016a6fe9e..e19949d6a 100644 --- a/packages/opencode/test/tool/bash.test.ts +++ b/packages/opencode/test/tool/bash.test.ts @@ -27,7 +27,7 @@ describe("tool.bash", () => { ctx, ) expect(result.metadata.exit).toBe(0) - expect(result.metadata.stdout).toContain("test") + expect(result.metadata.output).toContain("test") }) }) diff --git a/packages/tui/internal/components/chat/message.go b/packages/tui/internal/components/chat/message.go index 66f8d728e..ee3535ad8 100644 --- a/packages/tui/internal/components/chat/message.go +++ b/packages/tui/internal/components/chat/message.go @@ -569,13 +569,9 @@ func renderToolDetails( case "bash": command := toolInputMap["command"].(string) body = fmt.Sprintf("```console\n$ %s\n", command) - stdout := metadata["stdout"] - if stdout != nil { - body += ansi.Strip(fmt.Sprintf("%s", stdout)) - } - stderr := metadata["stderr"] - if stderr != nil { - body += ansi.Strip(fmt.Sprintf("%s", stderr)) + output := metadata["output"] + if output != nil { + body += ansi.Strip(fmt.Sprintf("%s", output)) } body += "```" body = util.ToMarkdown(body, width, backgroundColor) diff --git a/packages/web/src/components/share/part.tsx b/packages/web/src/components/share/part.tsx index 30f927fc4..5cfd3a045 100644 --- a/packages/web/src/components/share/part.tsx +++ b/packages/web/src/components/share/part.tsx @@ -605,7 +605,7 @@ export function BashTool(props: ToolProps) { return ( <ContentBash command={props.state.input.command} - output={props.state.metadata?.stdout || ""} + output={props.state.metadata.output ?? props.state.metadata?.stdout} description={props.state.metadata.description} /> ) |
