From 607eb2efbf499196a7f07d8d63e5a234ed9e512f Mon Sep 17 00:00:00 2001
From: Alix-007
Date: Thu, 20 Aug 2026 16:44:53 +0800
Subject: [PATCH] fix(agents): fall back from tool search code under Electron
(#122037)
Punchcard-Session: ember-cedar-willow-tp
---
src/agents/tool-search-config.ts | 7 ++++++-
src/agents/tool-search.test.ts | 19 +++++++++++++++++++
2 files changed, 25 insertions(+), 1 deletion(-)
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]));