From 71ad9e53e75b45da31c9d43c3b0a10433947f696 Mon Sep 17 00:00:00 2001 From: 777genius Date: Sat, 16 May 2026 23:56:43 +0300 Subject: [PATCH] test(opencode): cover local mcp fallback with http --- src/main/index.ts | 8 ++++- .../opencode/bridge/OpenCodeMcpBridgeEnv.ts | 7 +++++ .../team/OpenCodeMcpBridgeEnv.test.ts | 30 +++++++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/main/index.ts b/src/main/index.ts index 7d064f31..d63e37d8 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -72,6 +72,7 @@ import { copyOpenCodeLocalMcpLaunchEnv, hasOpenCodeLocalMcpLaunchEnv, isOpenCodeMcpHttpBridgeEnabled, + shouldEnsureOpenCodeLocalMcpLaunchEnv, snapshotOpenCodeLocalMcpLaunchEnv, } from '@main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv'; import { ReviewApplierService } from '@main/services/team/ReviewApplierService'; @@ -450,7 +451,12 @@ async function createOpenCodeRuntimeAdapterRegistry( ); } } - if (useHttpMcpBridge || !bridgeEnv.CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_URL) { + if ( + shouldEnsureOpenCodeLocalMcpLaunchEnv({ + httpBridgeEnabled: useHttpMcpBridge, + mcpUrl: bridgeEnv.CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_URL, + }) + ) { await ensureOpenCodeLocalMcpLaunchEnv(bridgeEnv, { emitProgress: true }); } diff --git a/src/main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv.ts b/src/main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv.ts index 965c68ea..cbf99f2e 100644 --- a/src/main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv.ts +++ b/src/main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv.ts @@ -17,6 +17,13 @@ export function hasOpenCodeLocalMcpLaunchEnv(env: OpenCodeMcpBridgeEnv): boolean return LOCAL_MCP_LAUNCH_ENV_KEYS.every((key) => Boolean(env[key]?.trim())); } +export function shouldEnsureOpenCodeLocalMcpLaunchEnv(input: { + httpBridgeEnabled: boolean; + mcpUrl: string | undefined; +}): boolean { + return input.httpBridgeEnabled || !input.mcpUrl?.trim(); +} + export function copyOpenCodeLocalMcpLaunchEnv( sourceEnv: OpenCodeMcpBridgeEnv, targetEnv: OpenCodeMcpBridgeEnv diff --git a/test/main/services/team/OpenCodeMcpBridgeEnv.test.ts b/test/main/services/team/OpenCodeMcpBridgeEnv.test.ts index 9b905630..349028ff 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, + shouldEnsureOpenCodeLocalMcpLaunchEnv, snapshotOpenCodeLocalMcpLaunchEnv, } from '@main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv'; @@ -70,7 +71,32 @@ 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', () => { + it('resolves local MCP launch env even when HTTP MCP already has a URL', () => { + expect( + shouldEnsureOpenCodeLocalMcpLaunchEnv({ + httpBridgeEnabled: true, + mcpUrl: 'http://127.0.0.1:41001/mcp', + }) + ).toBe(true); + }); + + it('skips local MCP launch env only when HTTP bridge is disabled and a URL already exists', () => { + expect( + shouldEnsureOpenCodeLocalMcpLaunchEnv({ + httpBridgeEnabled: false, + mcpUrl: 'http://127.0.0.1:41001/mcp', + }) + ).toBe(false); + + expect( + shouldEnsureOpenCodeLocalMcpLaunchEnv({ + httpBridgeEnabled: false, + mcpUrl: undefined, + }) + ).toBe(true); + }); + + it('snapshots explicit local MCP launch env before mutating an env object', () => { const env: NodeJS.ProcessEnv = { CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_COMMAND: ' node ', CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_ENTRY: ' mcp-server/dist/index.js ', @@ -90,7 +116,7 @@ describe('OpenCodeMcpBridgeEnv', () => { expect(env.CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_COMMAND).toBeUndefined(); }); - it('removes local MCP launch env when HTTP MCP is active', () => { + it('removes local MCP launch env when explicitly requested', () => { const env: NodeJS.ProcessEnv = { CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_COMMAND: 'node', CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_ENTRY: 'mcp-server/dist/index.js',