Dax Raad před 8 měsíci
rodič
revize
14dcf43246

+ 1 - 0
packages/opencode/src/session/index.ts

@@ -362,6 +362,7 @@ export namespace Session {
           try {
           try {
             const result = await item.execute(args, {
             const result = await item.execute(args, {
               sessionID: input.sessionID,
               sessionID: input.sessionID,
+              abort: abort.signal,
             })
             })
             next.metadata!.tool![opts.toolCallId] = {
             next.metadata!.tool![opts.toolCallId] = {
               ...result.metadata,
               ...result.metadata,

+ 2 - 1
packages/opencode/src/tool/bash.ts

@@ -42,7 +42,7 @@ export const BashTool = Tool.define({
         "Clear, concise description of what this command does in 5-10 words. Examples:\nInput: ls\nOutput: Lists files in current directory\n\nInput: git status\nOutput: Shows working tree status\n\nInput: npm install\nOutput: Installs package dependencies\n\nInput: mkdir foo\nOutput: Creates directory 'foo'",
         "Clear, concise description of what this command does in 5-10 words. Examples:\nInput: ls\nOutput: Lists files in current directory\n\nInput: git status\nOutput: Shows working tree status\n\nInput: npm install\nOutput: Installs package dependencies\n\nInput: mkdir foo\nOutput: Creates directory 'foo'",
       ),
       ),
   }),
   }),
-  async execute(params) {
+  async execute(params, ctx) {
     const timeout = Math.min(params.timeout ?? DEFAULT_TIMEOUT, MAX_TIMEOUT)
     const timeout = Math.min(params.timeout ?? DEFAULT_TIMEOUT, MAX_TIMEOUT)
     if (BANNED_COMMANDS.some((item) => params.command.startsWith(item)))
     if (BANNED_COMMANDS.some((item) => params.command.startsWith(item)))
       throw new Error(`Command '${params.command}' is not allowed`)
       throw new Error(`Command '${params.command}' is not allowed`)
@@ -50,6 +50,7 @@ export const BashTool = Tool.define({
     const process = Bun.spawn({
     const process = Bun.spawn({
       cmd: ["bash", "-c", params.command],
       cmd: ["bash", "-c", params.command],
       maxBuffer: MAX_OUTPUT_LENGTH,
       maxBuffer: MAX_OUTPUT_LENGTH,
+      signal: ctx.abort,
       timeout: timeout,
       timeout: timeout,
       stdout: "pipe",
       stdout: "pipe",
       stderr: "pipe",
       stderr: "pipe",

+ 1 - 0
packages/opencode/src/tool/tool.ts

@@ -3,6 +3,7 @@ import type { StandardSchemaV1 } from "@standard-schema/spec"
 export namespace Tool {
 export namespace Tool {
   export type Context = {
   export type Context = {
     sessionID: string
     sessionID: string
+    abort: AbortSignal
   }
   }
   export interface Info<
   export interface Info<
     Parameters extends StandardSchemaV1 = StandardSchemaV1,
     Parameters extends StandardSchemaV1 = StandardSchemaV1,

+ 2 - 2
packages/opencode/src/tool/webfetch.ts

@@ -24,7 +24,7 @@ export const WebFetchTool = Tool.define({
       .describe("Optional timeout in seconds (max 120)")
       .describe("Optional timeout in seconds (max 120)")
       .nullable(),
       .nullable(),
   }),
   }),
-  async execute(params) {
+  async execute(params, ctx) {
     // Validate URL
     // Validate URL
     if (
     if (
       !params.url.startsWith("http://") &&
       !params.url.startsWith("http://") &&
@@ -42,7 +42,7 @@ export const WebFetchTool = Tool.define({
     const timeoutId = setTimeout(() => controller.abort(), timeout)
     const timeoutId = setTimeout(() => controller.abort(), timeout)
 
 
     const response = await fetch(params.url, {
     const response = await fetch(params.url, {
-      signal: controller.signal,
+      signal: AbortSignal.any([controller.signal, ctx.abort]),
       headers: {
       headers: {
         "User-Agent":
         "User-Agent":
           "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
           "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",