From e9fbf6b72aa465deb310f2e6383b1e7dc71ff9f9 Mon Sep 17 00:00:00 2001 From: Alex Alecu Date: Fri, 3 Apr 2026 12:05:57 +0300 Subject: [PATCH] fix(cli): require recall permission prompts --- packages/opencode/src/agent/agent.ts | 1 + packages/opencode/src/tool/recall.ts | 46 ++++++++++++---------------- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index 8bfbe786a21..27723206cb1 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -187,6 +187,7 @@ export namespace Agent { "*": "allow", bash, // kilocode_change doom_loop: "ask", + recall: "ask", // kilocode_change external_directory: { "*": "ask", ...Object.fromEntries(whitelistedDirs.map((dir) => [dir, "allow"])), diff --git a/packages/opencode/src/tool/recall.ts b/packages/opencode/src/tool/recall.ts index e472ce4ee80..064b771bf29 100644 --- a/packages/opencode/src/tool/recall.ts +++ b/packages/opencode/src/tool/recall.ts @@ -27,6 +27,16 @@ async function search(params: { query?: string; limit?: number }, ctx: Tool.Cont throw new Error("The 'query' parameter is required when mode is 'search'") } + await ctx.ask({ + permission: "recall", + patterns: ["search"], + always: ["search"], + metadata: { + mode: "search", + query: params.query, + }, + }) + const limit = Math.min(params.limit ?? 20, 50) const current = Instance.project.id @@ -54,19 +64,6 @@ async function search(params: { query?: string; limit?: number }, ctx: Tool.Cont }) } - const dirs = [...new Set(results.filter((r) => !r.current).map((r) => r.directory))] - if (dirs.length > 0) { - await ctx.ask({ - permission: "recall", - patterns: dirs, - always: dirs, - metadata: { - mode: "search", - query: params.query, - }, - }) - } - if (results.length === 0) { return { title: `Search: "${params.query}" (no results)`, @@ -95,20 +92,17 @@ async function read(params: { sessionID?: string }, ctx: Tool.Context) { const session = await Session.get(params.sessionID).catch(() => { throw new Error(`Session "${params.sessionID}" not found. Use search mode first to find valid session IDs.`) }) - const cross = session.projectID !== Instance.project.id - if (cross) { - await ctx.ask({ - permission: "recall", - patterns: [session.directory], - always: [session.directory], - metadata: { - sessionID: session.id, - title: session.title, - directory: session.directory, - }, - }) - } + await ctx.ask({ + permission: "recall", + patterns: [session.directory], + always: [session.directory], + metadata: { + sessionID: session.id, + title: session.title, + directory: session.directory, + }, + }) const msgs = await Session.messages({ sessionID: session.id }) const lines: string[] = [