From 2a8f9066cd1179cac7e3a87a6a64381e4dc035d0 Mon Sep 17 00:00:00 2001 From: dyoshikawa Date: Thu, 11 Jun 2026 23:03:59 -0700 Subject: [PATCH] fix: correct Zed web search tool name to search_web Zed's built-in web-search tool is named search_web, not web_search. The permissions adapter mapped websearch to web_search, so generated entries were silently ignored by Zed and real search_web entries did not round-trip back to websearch. Closes #1850 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../permissions/zed-permissions.test.ts | 22 +++++++++++++++++++ src/features/permissions/zed-permissions.ts | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/features/permissions/zed-permissions.test.ts b/src/features/permissions/zed-permissions.test.ts index 50fc824d8..01c83627a 100644 --- a/src/features/permissions/zed-permissions.test.ts +++ b/src/features/permissions/zed-permissions.test.ts @@ -226,6 +226,28 @@ describe("ZedPermissions", () => { expect(json.permission.webfetch).toEqual({ "domain:github.com": "allow" }); }); + it("should round-trip websearch via Zed's search_web tool name", async () => { + const rulesyncPermissions = createRulesyncPermissions({ + websearch: { "*": "allow" }, + }); + + const generated = await ZedPermissions.fromRulesyncPermissions({ + outputRoot: testDir, + rulesyncPermissions, + }); + + // `websearch` must map to Zed's built-in `search_web` tool, not `web_search`. + const generatedJson = JSON.parse(generated.getFileContent()); + expect(generatedJson.agent.tool_permissions.tools.search_web.default).toBe("allow"); + expect(generatedJson.agent.tool_permissions.tools.web_search).toBeUndefined(); + + await writeFileContent(join(testDir, ".zed", "settings.json"), generated.getFileContent()); + const imported = await ZedPermissions.fromFile({ outputRoot: testDir }); + const json = JSON.parse(imported.toRulesyncPermissions().getFileContent()); + + expect(json.permission.websearch).toEqual({ "*": "allow" }); + }); + it("should pass through non-canonical mcp tool keys across generate → import", async () => { const rulesyncPermissions = createRulesyncPermissions({ "mcp:context7:get-docs": { "*": "allow", secret: "deny" }, diff --git a/src/features/permissions/zed-permissions.ts b/src/features/permissions/zed-permissions.ts index cc62eec5d..96777596e 100644 --- a/src/features/permissions/zed-permissions.ts +++ b/src/features/permissions/zed-permissions.ts @@ -53,7 +53,7 @@ const CANONICAL_TO_ZED_TOOL_NAMES: Record = { read: "read_file", edit: "edit_file", webfetch: "fetch", - websearch: "web_search", + websearch: "search_web", }; const ZED_TO_CANONICAL_TOOL_NAMES: Record = Object.fromEntries(