The PTY runtime exported an empty NODE_CHANNEL_FD to override the daemon's IPC descriptor, because bun-pty merges the native environ back into the child and a JS-only delete does not stick. Node CLIs launched from the shell (opencode, claude) then printed "warn: Failed to parse IPC channel number ''" on exit. The Linux-only env -u ARGV0 wrapper now applies on macOS and Linux and also unsets NODE_CHANNEL_FD, so the variable is gone instead of empty. Testing: runtime and inherited-env tests updated for the POSIX wrapper; verified in the running app that exiting opencode no longer prints the warning.
65 lines
1.9 KiB
JavaScript
65 lines
1.9 KiB
JavaScript
import { describe, expect, it } from 'vitest';
|
|
import {
|
|
clearAppImageArgv0FromProcessEnv,
|
|
resolvePosixPtyLaunch,
|
|
stripAppImageArgv0Leak,
|
|
} from './inherited-env.js';
|
|
|
|
describe('stripAppImageArgv0Leak', () => {
|
|
it('removes ARGV0 from a child env object', () => {
|
|
const env = {
|
|
PATH: '/usr/bin',
|
|
ARGV0: '/path/to/OpenChamber-1.17.2-linux-x86_64.AppImage',
|
|
SHELL: '/bin/zsh',
|
|
};
|
|
|
|
expect(stripAppImageArgv0Leak(env)).toBe(env);
|
|
expect(env).toEqual({
|
|
PATH: '/usr/bin',
|
|
SHELL: '/bin/zsh',
|
|
});
|
|
});
|
|
|
|
it('is a no-op when ARGV0 is absent', () => {
|
|
const env = { PATH: '/usr/bin', SHELL: '/bin/bash' };
|
|
stripAppImageArgv0Leak(env);
|
|
expect(env).toEqual({ PATH: '/usr/bin', SHELL: '/bin/bash' });
|
|
});
|
|
|
|
it('tolerates nullish env values', () => {
|
|
expect(stripAppImageArgv0Leak(null)).toBeNull();
|
|
expect(stripAppImageArgv0Leak(undefined)).toBeUndefined();
|
|
});
|
|
});
|
|
|
|
describe('clearAppImageArgv0FromProcessEnv', () => {
|
|
it('removes ARGV0 from process.env', () => {
|
|
const previous = process.env.ARGV0;
|
|
process.env.ARGV0 = '/path/to/OpenChamber.AppImage';
|
|
try {
|
|
clearAppImageArgv0FromProcessEnv();
|
|
expect(process.env.ARGV0).toBeUndefined();
|
|
} finally {
|
|
if (previous === undefined) delete process.env.ARGV0;
|
|
else process.env.ARGV0 = previous;
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('resolvePosixPtyLaunch', () => {
|
|
it('wraps the shell with env -u for every host-private variable on POSIX', () => {
|
|
if (process.platform === 'win32') return;
|
|
expect(resolvePosixPtyLaunch('/bin/zsh', ['-l'])).toEqual({
|
|
executable: expect.stringMatching(/\/env$/),
|
|
args: ['-u', 'ARGV0', '-u', 'NODE_CHANNEL_FD', '/bin/zsh', '-l'],
|
|
});
|
|
});
|
|
|
|
it('leaves the launch unchanged with nothing to unset', () => {
|
|
expect(resolvePosixPtyLaunch('/bin/zsh', ['-l'], [])).toEqual({
|
|
executable: '/bin/zsh',
|
|
args: ['-l'],
|
|
});
|
|
});
|
|
});
|