summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-08-11 01:23:00 -0400
committerDax Raad <[email protected]>2025-08-11 01:23:00 -0400
commit061ba65d20e0c7a7c536fbce0cc5c5bd16dd5ae1 (patch)
tree22c6579c1f4d61edfd082ae046284677c73be2a7
parent457386ad08c8add2b8f9c80434582785ca07c557 (diff)
downloadopencode-061ba65d20e0c7a7c536fbce0cc5c5bd16dd5ae1.tar.gz
opencode-061ba65d20e0c7a7c536fbce0cc5c5bd16dd5ae1.zip
show combined output of bash tool progressively
-rw-r--r--packages/opencode/src/tool/bash.ts47
-rw-r--r--packages/opencode/test/tool/bash.test.ts2
-rw-r--r--packages/tui/internal/components/chat/message.go10
-rw-r--r--packages/web/src/components/share/part.tsx2
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}
/>
)