diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index f0d6e939..c1cf034d 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -1,4 +1,5 @@ import path from "path" +import { exec } from "child_process" import { Decimal } from "decimal.js" import { z, ZodSchema } from "zod" import { @@ -43,7 +44,6 @@ import { Plugin } from "../plugin" import { Agent } from "../agent/agent" import { Permission } from "../permission" import { Wildcard } from "../util/wildcard" -import { BashTool } from "../tool/bash" import { ulid } from "ulid" export namespace Session { @@ -967,7 +967,7 @@ export namespace Session { content: x, }), ), - ...MessageV2.toModelMessage(msgs), + ...MessageV2.toModelMessage(msgs.filter((m) => !(m.info.role === "assistant" && m.info.error))), ], tools: model.info.tool_call === false ? undefined : tools, model: wrapLanguageModel({ @@ -1049,27 +1049,41 @@ export namespace Session { }, } await updatePart(part) - const tool = await BashTool.init() - const result = await tool.execute( - { - command: input.command, - description: "User command", - }, - { - messageID: msg.id, - sessionID: input.sessionID, - abort: abort.signal, - callID: part.callID, - agent: input.agent, - metadata: async (e) => { - if (part.state.status === "running") { - part.state.title = e.title - part.state.metadata = e.metadata - await updatePart(part) - } - }, - }, - ) + const app = App.info() + const process = exec(input.command, { + cwd: app.path.cwd, + signal: abort.signal, + }) + + let output = "" + + process.stdout?.on("data", (chunk) => { + output += chunk.toString() + if (part.state.status === "running") { + part.state.metadata = { + output: output, + description: "", + } + updatePart(part) + } + }) + + process.stderr?.on("data", (chunk) => { + output += chunk.toString() + if (part.state.status === "running") { + part.state.metadata = { + output: output, + description: "", + } + updatePart(part) + } + }) + + await new Promise((resolve) => { + process.on("close", () => { + resolve() + }) + }) msg.time.completed = Date.now() await updateMessage(msg) if (part.state.status === "running") { @@ -1080,9 +1094,12 @@ export namespace Session { end: Date.now(), }, input: part.state.input, - title: result.title, - metadata: result.metadata, - output: result.output, + title: "", + metadata: { + output, + description: "", + }, + output, } await updatePart(part) }