diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index 69a45432dc5..53909d0fe68 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -24,6 +24,7 @@ import { CodeSearchTool } from "./codesearch" import { Flag } from "@/flag/flag" import { Log } from "@/util/log" import { LspTool } from "./lsp" +import { Permission } from "../permission" export namespace ToolRegistry { const log = Log.create({ service: "tool.registry" }) @@ -64,7 +65,20 @@ export namespace ToolRegistry { parameters: z.object(def.args), description: def.description, execute: async (args, ctx) => { - const result = await def.execute(args as any, ctx) + const result = await def.execute(args as any, { + ...ctx, + askPermission: async (input) => { + await Permission.ask({ + type: input.type, + title: input.title, + pattern: input.pattern, + sessionID: ctx.sessionID, + messageID: ctx.messageID, + callID: ctx.callID, + metadata: input.metadata, + }) + }, + }) return { title: "", output: result, diff --git a/packages/plugin/src/tool.ts b/packages/plugin/src/tool.ts index 37e802ac408..184bdb8eab6 100644 --- a/packages/plugin/src/tool.ts +++ b/packages/plugin/src/tool.ts @@ -5,6 +5,16 @@ export type ToolContext = { messageID: string agent: string abort: AbortSignal + /** + * Request user permission for an action. Throws if user denies. + * @param input Permission request details + */ + askPermission?: (input: { + type: string + title: string + pattern?: string | string[] + metadata: Record + }) => Promise } export function tool(input: {