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,
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)) {

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 {
for (const key of LOCAL_MCP_LAUNCH_ENV_KEYS) {
delete env[key];

View file

@ -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',