diff --git a/src/main/sidecar/sidecarEnvironment.ts b/src/main/sidecar/sidecarEnvironment.ts new file mode 100644 index 0000000..12f61d7 --- /dev/null +++ b/src/main/sidecar/sidecarEnvironment.ts @@ -0,0 +1,17 @@ +const blockedEnvironmentKeys = new Set(['ELECTRON_RUN_AS_NODE', 'NODE_OPTIONS']); + +export function createSidecarEnvironment(baseEnvironment: NodeJS.ProcessEnv): NodeJS.ProcessEnv { + const sanitizedEnvironment: NodeJS.ProcessEnv = {}; + + for (const [name, value] of Object.entries(baseEnvironment)) { + const normalizedName = name.toUpperCase(); + + if (normalizedName.startsWith('COPILOT_') || blockedEnvironmentKeys.has(normalizedName)) { + continue; + } + + sanitizedEnvironment[name] = value; + } + + return sanitizedEnvironment; +} diff --git a/src/main/sidecar/sidecarProcess.ts b/src/main/sidecar/sidecarProcess.ts index fe26b90..e9421bb 100644 --- a/src/main/sidecar/sidecarProcess.ts +++ b/src/main/sidecar/sidecarProcess.ts @@ -10,6 +10,7 @@ import type { RunTurnCommand, } from '@shared/contracts/sidecar'; import type { ChatMessageRecord } from '@shared/domain/session'; +import { createSidecarEnvironment } from '@main/sidecar/sidecarEnvironment'; import { resolveSidecarProcess } from '@main/sidecar/sidecarRuntime'; type PendingCommand = @@ -78,6 +79,7 @@ export class SidecarClient { }); this.process = spawn(sidecar.command, sidecar.args, { cwd: sidecar.cwd, + env: createSidecarEnvironment(process.env), stdio: 'pipe', windowsHide: true, }); diff --git a/tests/main/sidecarEnvironment.test.ts b/tests/main/sidecarEnvironment.test.ts new file mode 100644 index 0000000..a50f6c1 --- /dev/null +++ b/tests/main/sidecarEnvironment.test.ts @@ -0,0 +1,34 @@ +import { describe, expect, test } from 'bun:test'; + +import { createSidecarEnvironment } from '@main/sidecar/sidecarEnvironment'; + +describe('createSidecarEnvironment', () => { + test('removes inherited Copilot loader variables before spawning the sidecar', () => { + expect( + createSidecarEnvironment({ + PATH: 'C:\\tools', + COPILOT_CLI: '1', + COPILOT_LOADER_PID: '1234', + copilot_run_app: '1', + NODE_OPTIONS: '--no-warnings', + electron_run_as_node: '1', + }), + ).toEqual({ + PATH: 'C:\\tools', + }); + }); + + test('preserves unrelated environment variables', () => { + expect( + createSidecarEnvironment({ + PATH: 'C:\\tools', + HOME: 'C:\\Users\\mail', + FORCE_COLOR: '1', + }), + ).toEqual({ + PATH: 'C:\\tools', + HOME: 'C:\\Users\\mail', + FORCE_COLOR: '1', + }); + }); +});