diff --git a/src/agents/tool-search-config.ts b/src/agents/tool-search-config.ts index 45983e5c90e9..77ffaab1d977 100644 --- a/src/agents/tool-search-config.ts +++ b/src/agents/tool-search-config.ts @@ -37,7 +37,12 @@ export function isToolSearchCodeModeSupported(): boolean { if (toolSearchCodeModeSupportedForTest !== undefined) { return toolSearchCodeModeSupportedForTest; } - return process.allowedNodeEnvironmentFlags.has("--permission"); + // Electron advertises Node flags but process.execPath remains the host binary, + // so the isolated code child cannot be launched as a plain Node process. + return ( + typeof process.versions.electron !== "string" && + process.allowedNodeEnvironmentFlags.has("--permission") + ); } function resolveMinCodeTimeoutMs(): number { diff --git a/src/agents/tool-search.test.ts b/src/agents/tool-search.test.ts index 2bba5527cc38..5949bbf9d821 100644 --- a/src/agents/tool-search.test.ts +++ b/src/agents/tool-search.test.ts @@ -1127,6 +1127,25 @@ describe("Tool Search", () => { } }); + it("falls back to structured controls under Electron without changing Node mode", () => { + const electronDescriptor = Object.getOwnPropertyDescriptor(process.versions, "electron"); + Object.defineProperty(process.versions, "electron", { + configurable: true, + value: "99.0.0", + }); + try { + expect(resolveToolSearchConfig({ tools: { toolSearch: true } } as never).mode).toBe("tools"); + } finally { + if (electronDescriptor) { + Object.defineProperty(process.versions, "electron", electronDescriptor); + } else { + delete (process.versions as NodeJS.ProcessVersions & { electron?: string }).electron; + } + } + + expect(resolveToolSearchConfig({ tools: { toolSearch: true } } as never).mode).toBe("code"); + }); + it("guides structured control tools toward compact catalog calls", () => { const tools = createToolSearchTools({ config: {} as never }); const byName = new Map(tools.map((tool) => [tool.name, tool]));