From 9409f180350b06f4a792f56b01b48f87a7cb8ef4 Mon Sep 17 00:00:00 2001 From: nielpattin <66520542+nielpattin@users.noreply.github.com> Date: Tue, 23 Dec 2025 21:49:58 +0700 Subject: [PATCH] feat(plugin): add optional askPermission to ToolContext --- packages/opencode/src/tool/registry.ts | 16 +++++++++++++++- packages/plugin/src/tool.ts | 10 ++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index 69a45432dc5a..53909d0fe688 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 37e802ac408e..184bdb8eab6b 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: {