summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packages/opencode/src/session/index.ts1
-rw-r--r--packages/opencode/src/tool/bash.ts3
-rw-r--r--packages/opencode/src/tool/tool.ts1
-rw-r--r--packages/opencode/src/tool/webfetch.ts4
4 files changed, 6 insertions, 3 deletions
diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
index 02c98a77b..3310e87c8 100644
--- a/packages/opencode/src/session/index.ts
+++ b/packages/opencode/src/session/index.ts
@@ -362,6 +362,7 @@ export namespace Session {
try {
const result = await item.execute(args, {
sessionID: input.sessionID,
+ abort: abort.signal,
})
next.metadata!.tool![opts.toolCallId] = {
...result.metadata,
diff --git a/packages/opencode/src/tool/bash.ts b/packages/opencode/src/tool/bash.ts
index 43f39c726..d87332bbf 100644
--- a/packages/opencode/src/tool/bash.ts
+++ b/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'",
),
}),
- async execute(params) {
+ async execute(params, ctx) {
const timeout = Math.min(params.timeout ?? DEFAULT_TIMEOUT, MAX_TIMEOUT)
if (BANNED_COMMANDS.some((item) => params.command.startsWith(item)))
throw new Error(`Command '${params.command}' is not allowed`)
@@ -50,6 +50,7 @@ export const BashTool = Tool.define({
const process = Bun.spawn({
cmd: ["bash", "-c", params.command],
maxBuffer: MAX_OUTPUT_LENGTH,
+ signal: ctx.abort,
timeout: timeout,
stdout: "pipe",
stderr: "pipe",
diff --git a/packages/opencode/src/tool/tool.ts b/packages/opencode/src/tool/tool.ts
index 68bdc254f..f046e95b8 100644
--- a/packages/opencode/src/tool/tool.ts
+++ b/packages/opencode/src/tool/tool.ts
@@ -3,6 +3,7 @@ import type { StandardSchemaV1 } from "@standard-schema/spec"
export namespace Tool {
export type Context = {
sessionID: string
+ abort: AbortSignal
}
export interface Info<
Parameters extends StandardSchemaV1 = StandardSchemaV1,
diff --git a/packages/opencode/src/tool/webfetch.ts b/packages/opencode/src/tool/webfetch.ts
index b0010c4d3..551908987 100644
--- a/packages/opencode/src/tool/webfetch.ts
+++ b/packages/opencode/src/tool/webfetch.ts
@@ -24,7 +24,7 @@ export const WebFetchTool = Tool.define({
.describe("Optional timeout in seconds (max 120)")
.nullable(),
}),
- async execute(params) {
+ async execute(params, ctx) {
// Validate URL
if (
!params.url.startsWith("http://") &&
@@ -42,7 +42,7 @@ export const WebFetchTool = Tool.define({
const timeoutId = setTimeout(() => controller.abort(), timeout)
const response = await fetch(params.url, {
- signal: controller.signal,
+ signal: AbortSignal.any([controller.signal, ctx.abort]),
headers: {
"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",