fix(opencode): preserve explicit mcp fallback env

This commit is contained in:
777genius 2026-05-16 22:49:43 +03:00
parent 2c393bc78f
commit bfadfc95ee
3 changed files with 40 additions and 0 deletions

View file

@ -73,6 +73,7 @@ import {
copyOpenCodeLocalMcpLaunchEnv, copyOpenCodeLocalMcpLaunchEnv,
hasOpenCodeLocalMcpLaunchEnv, hasOpenCodeLocalMcpLaunchEnv,
isOpenCodeMcpHttpBridgeEnabled, isOpenCodeMcpHttpBridgeEnabled,
snapshotOpenCodeLocalMcpLaunchEnv,
} from '@main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv'; } from '@main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv';
import { ReviewApplierService } from '@main/services/team/ReviewApplierService'; import { ReviewApplierService } from '@main/services/team/ReviewApplierService';
import { TeamBackupService } from '@main/services/team/TeamBackupService'; import { TeamBackupService } from '@main/services/team/TeamBackupService';
@ -360,6 +361,7 @@ async function createOpenCodeRuntimeAdapterRegistry(
bridgeEnv.CLAUDE_TEAM_APP_INSTANCE_ID = openCodeManagedHostInstanceId; bridgeEnv.CLAUDE_TEAM_APP_INSTANCE_ID = openCodeManagedHostInstanceId;
bridgeEnv.AGENT_TEAMS_MCP_CLAUDE_DIR = getClaudeBasePath(); bridgeEnv.AGENT_TEAMS_MCP_CLAUDE_DIR = getClaudeBasePath();
const useHttpMcpBridge = isOpenCodeMcpHttpBridgeEnabled(bridgeEnv); const useHttpMcpBridge = isOpenCodeMcpHttpBridgeEnabled(bridgeEnv);
const explicitLocalMcpLaunchEnv = snapshotOpenCodeLocalMcpLaunchEnv(bridgeEnv);
if (!useHttpMcpBridge) { if (!useHttpMcpBridge) {
delete bridgeEnv.CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_URL; delete bridgeEnv.CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_URL;
} else { } else {
@ -401,6 +403,11 @@ async function createOpenCodeRuntimeAdapterRegistry(
copyOpenCodeLocalMcpLaunchEnv(bridgeEnv, targetEnv); copyOpenCodeLocalMcpLaunchEnv(bridgeEnv, targetEnv);
return; return;
} }
if (explicitLocalMcpLaunchEnv) {
copyOpenCodeLocalMcpLaunchEnv(explicitLocalMcpLaunchEnv, targetEnv);
copyOpenCodeLocalMcpLaunchEnv(explicitLocalMcpLaunchEnv, bridgeEnv);
return;
}
await applyMcpLaunchSpecEnv(targetEnv, options); await applyMcpLaunchSpecEnv(targetEnv, options);
if (hasOpenCodeLocalMcpLaunchEnv(targetEnv)) { if (hasOpenCodeLocalMcpLaunchEnv(targetEnv)) {

View file

@ -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 { export function clearOpenCodeLocalMcpLaunchEnv(env: OpenCodeMcpBridgeEnv): void {
for (const key of LOCAL_MCP_LAUNCH_ENV_KEYS) { for (const key of LOCAL_MCP_LAUNCH_ENV_KEYS) {
delete env[key]; delete env[key];

View file

@ -5,6 +5,7 @@ import {
copyOpenCodeLocalMcpLaunchEnv, copyOpenCodeLocalMcpLaunchEnv,
hasOpenCodeLocalMcpLaunchEnv, hasOpenCodeLocalMcpLaunchEnv,
isOpenCodeMcpHttpBridgeEnabled, isOpenCodeMcpHttpBridgeEnabled,
snapshotOpenCodeLocalMcpLaunchEnv,
} from '@main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv'; } from '@main/services/team/opencode/bridge/OpenCodeMcpBridgeEnv';
describe('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'); 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', () => { it('removes local MCP launch env when HTTP MCP is active', () => {
const env: NodeJS.ProcessEnv = { const env: NodeJS.ProcessEnv = {
CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_COMMAND: 'node', CLAUDE_MULTIMODEL_AGENT_TEAMS_MCP_COMMAND: 'node',