diff --git a/packages/opencode/src/tool/bash.ts b/packages/opencode/src/tool/bash.ts index de1eedaa..f6368ea1 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((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 ?? "", ``, ``, stderr ?? "", ``].join("\n"), + output, } }, }) diff --git a/packages/opencode/test/tool/bash.test.ts b/packages/opencode/test/tool/bash.test.ts index 016a6fe9..e19949d6 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 66f8d728..ee3535ad 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 30f927fc..5cfd3a04 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 ( )