Dax Raad 6 месяцев назад
Родитель
Сommit
e729eed34d
1 измененных файлов с 43 добавлено и 26 удалено
  1. 43 26
      packages/opencode/src/session/index.ts

+ 43 - 26
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<void>((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)
     }