From bfadfc95ee7f583cb2aa480944a104a2d31deff6 Mon Sep 17 00:00:00 2001 From: 777genius Date: Sat, 16 May 2026 22:49:43 +0300 Subject: [PATCH] fix(opencode): preserve explicit mcp fallback env --- src/main/index.ts | 7 +++++++ .../opencode/bridge/OpenCodeMcpBridgeEnv.ts | 12 +++++++++++ .../team/OpenCodeMcpBridgeEnv.test.ts | 21 +++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/src/main/index.ts b/src/main/index.ts index 7dee47f0..1de646af 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -73,6 +73,7 @@ import { copyOpenCodeLocalMcpLaunchEnv, hasOpenCodeLocalMcpLaunchEnv, isOpenCodeMcpHttpBridgeEnabled, + snapshotOpenCodeLocalMcpLaunchEnv, } from '@main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv'; import { ReviewApplierService } from '@main/services/team/ReviewApplierService'; import { TeamBackupService } from '@main/services/team/TeamBackupService'; @@ -360,6 +361,7 @@ async function createOpenCodeRuntimeAdapterRegistry( bridgeEnv.CLAUDE_TEAM_APP_INSTANCE_ID = openCodeManagedHostInstanceId; bridgeEnv.AGENT_TEAMS_MCP_CLAUDE_DIR = getClaudeBasePath(); const useHttpMcpBridge = isOpenCodeMcpHttpBridgeEnabled(bridgeEnv); + const explicitLocalMcpLaunchEnv = snapshotOpenCodeLocalMcpLaunchEnv(bridgeEnv); if (!useHttpMcpBridge) { delete bridgeEnv.CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_URL; } else { @@ -401,6 +403,11 @@ async function createOpenCodeRuntimeAdapterRegistry( copyOpenCodeLocalMcpLaunchEnv(bridgeEnv, targetEnv); return; } + if (explicitLocalMcpLaunchEnv) { + copyOpenCodeLocalMcpLaunchEnv(explicitLocalMcpLaunchEnv, targetEnv); + copyOpenCodeLocalMcpLaunchEnv(explicitLocalMcpLaunchEnv, bridgeEnv); + return; + } await applyMcpLaunchSpecEnv(targetEnv, options); if (hasOpenCodeLocalMcpLaunchEnv(targetEnv)) { diff --git a/src/main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv.ts b/src/main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv.ts index 6bf354cb..965c68ea 100644 --- a/src/main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv.ts +++ b/src/main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv.ts @@ -31,6 +31,18 @@ export function copyOpenCodeLocalMcpLaunchEnv( } } +export function snapshotOpenCodeLocalMcpLaunchEnv( + env: OpenCodeMcpBridgeEnv +): OpenCodeMcpBridgeEnv | null { + if (!hasOpenCodeLocalMcpLaunchEnv(env)) { + return null; + } + + const snapshot: OpenCodeMcpBridgeEnv = {}; + copyOpenCodeLocalMcpLaunchEnv(env, snapshot); + return snapshot; +} + export function clearOpenCodeLocalMcpLaunchEnv(env: OpenCodeMcpBridgeEnv): void { for (const key of LOCAL_MCP_LAUNCH_ENV_KEYS) { delete env[key]; diff --git a/test/main/services/team/OpenCodeMcpBridgeEnv.test.ts b/test/main/services/team/OpenCodeMcpBridgeEnv.test.ts index e9e8f533..9b905630 100644 --- a/test/main/services/team/OpenCodeMcpBridgeEnv.test.ts +++ b/test/main/services/team/OpenCodeMcpBridgeEnv.test.ts @@ -5,6 +5,7 @@ import { copyOpenCodeLocalMcpLaunchEnv, hasOpenCodeLocalMcpLaunchEnv, isOpenCodeMcpHttpBridgeEnabled, + snapshotOpenCodeLocalMcpLaunchEnv, } from '@main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv'; describe('OpenCodeMcpBridgeEnv', () => { @@ -69,6 +70,26 @@ describe('OpenCodeMcpBridgeEnv', () => { expect(target.CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_URL).toBe('http://127.0.0.1:41001/mcp'); }); + it('snapshots explicit local MCP launch env before HTTP mode clears it', () => { + const env: NodeJS.ProcessEnv = { + CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_COMMAND: ' node ', + CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_ENTRY: ' mcp-server/dist/index.js ', + CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_ARGS_JSON: ' ["mcp-server/dist/index.js"] ', + CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_URL: 'http://127.0.0.1:41001/mcp', + }; + + const snapshot = snapshotOpenCodeLocalMcpLaunchEnv(env); + clearOpenCodeLocalMcpLaunchEnv(env); + + expect(snapshot).toEqual({ + CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_COMMAND: 'node', + CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_ENTRY: 'mcp-server/dist/index.js', + CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_ARGS_JSON: '["mcp-server/dist/index.js"]', + }); + expect(hasOpenCodeLocalMcpLaunchEnv(snapshot ?? {})).toBe(true); + expect(env.CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_COMMAND).toBeUndefined(); + }); + it('removes local MCP launch env when HTTP MCP is active', () => { const env: NodeJS.ProcessEnv = { CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_COMMAND: 'node',