@google/gemini-cli 0.19.0-nightly.20251124.e177314a4 → 0.19.0-nightly.20251125.f6d97d448
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/google-gemini-cli-0.19.0-nightly.20251124.e177314a4.tgz +0 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/package.json +2 -2
- package/dist/src/commands/extensions.test.d.ts +6 -0
- package/dist/src/commands/extensions.test.js +67 -0
- package/dist/src/commands/extensions.test.js.map +1 -0
- package/dist/src/commands/utils.test.d.ts +6 -0
- package/dist/src/commands/utils.test.js +35 -0
- package/dist/src/commands/utils.test.js.map +1 -0
- package/dist/src/core/auth.test.d.ts +6 -0
- package/dist/src/core/auth.test.js +43 -0
- package/dist/src/core/auth.test.js.map +1 -0
- package/dist/src/core/initializer.test.d.ts +6 -0
- package/dist/src/core/initializer.test.js +101 -0
- package/dist/src/core/initializer.test.js.map +1 -0
- package/dist/src/core/theme.test.d.ts +6 -0
- package/dist/src/core/theme.test.js +46 -0
- package/dist/src/core/theme.test.js.map +1 -0
- package/dist/src/gemini.d.ts +1 -0
- package/dist/src/gemini.js +7 -2
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +621 -1
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/gemini_cleanup.test.d.ts +6 -0
- package/dist/src/gemini_cleanup.test.js +201 -0
- package/dist/src/gemini_cleanup.test.js.map +1 -0
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/nonInteractiveCli.test.js +336 -0
- package/dist/src/nonInteractiveCli.test.js.map +1 -1
- package/dist/src/ui/App.test.js +28 -14
- package/dist/src/ui/App.test.js.map +1 -1
- package/dist/src/ui/IdeIntegrationNudge.test.d.ts +6 -0
- package/dist/src/ui/IdeIntegrationNudge.test.js +147 -0
- package/dist/src/ui/IdeIntegrationNudge.test.js.map +1 -0
- package/dist/src/ui/auth/ApiAuthDialog.test.js +12 -17
- package/dist/src/ui/auth/ApiAuthDialog.test.js.map +1 -1
- package/dist/src/ui/auth/AuthDialog.test.js +120 -74
- package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
- package/dist/src/ui/auth/AuthInProgress.test.d.ts +6 -0
- package/dist/src/ui/auth/AuthInProgress.test.js +71 -0
- package/dist/src/ui/auth/AuthInProgress.test.js.map +1 -0
- package/dist/src/ui/auth/useAuth.test.d.ts +6 -0
- package/dist/src/ui/auth/useAuth.test.js +178 -0
- package/dist/src/ui/auth/useAuth.test.js.map +1 -0
- package/dist/src/ui/commands/extensionsCommand.js +28 -6
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.test.js +32 -0
- package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
- package/dist/src/ui/commands/statsCommand.js +27 -16
- package/dist/src/ui/commands/statsCommand.js.map +1 -1
- package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +62 -11
- package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +1 -1
- package/dist/src/ui/components/AnsiOutput.test.js +18 -23
- package/dist/src/ui/components/AnsiOutput.test.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +4 -4
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +5 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/state/extensions.test.js +208 -51
- package/dist/src/ui/state/extensions.test.js.map +1 -1
- package/dist/src/ui/utils/kittyProtocolDetector.test.d.ts +6 -0
- package/dist/src/ui/utils/kittyProtocolDetector.test.js +113 -0
- package/dist/src/ui/utils/kittyProtocolDetector.test.js.map +1 -0
- package/dist/src/ui/utils/terminalSetup.js +39 -38
- package/dist/src/ui/utils/terminalSetup.js.map +1 -1
- package/dist/src/ui/utils/terminalSetup.test.d.ts +6 -0
- package/dist/src/ui/utils/terminalSetup.test.js +131 -0
- package/dist/src/ui/utils/terminalSetup.test.js.map +1 -0
- package/dist/src/ui/utils/ui-sizing.test.d.ts +6 -0
- package/dist/src/ui/utils/ui-sizing.test.js +56 -0
- package/dist/src/ui/utils/ui-sizing.test.js.map +1 -0
- package/dist/src/utils/checks.test.d.ts +6 -0
- package/dist/src/utils/checks.test.js +29 -0
- package/dist/src/utils/checks.test.js.map +1 -0
- package/dist/src/utils/cleanup.test.js +69 -16
- package/dist/src/utils/cleanup.test.js.map +1 -1
- package/dist/src/utils/dialogScopeUtils.test.d.ts +6 -0
- package/dist/src/utils/dialogScopeUtils.test.js +81 -0
- package/dist/src/utils/dialogScopeUtils.test.js.map +1 -0
- package/dist/src/utils/errors.test.js +62 -0
- package/dist/src/utils/errors.test.js.map +1 -1
- package/dist/src/utils/events.test.d.ts +6 -0
- package/dist/src/utils/events.test.js +24 -0
- package/dist/src/utils/events.test.js.map +1 -0
- package/dist/src/utils/handleAutoUpdate.test.js +103 -24
- package/dist/src/utils/handleAutoUpdate.test.js.map +1 -1
- package/dist/src/utils/math.test.d.ts +6 -0
- package/dist/src/utils/math.test.js +23 -0
- package/dist/src/utils/math.test.js.map +1 -0
- package/dist/src/utils/persistentState.test.d.ts +6 -0
- package/dist/src/utils/persistentState.test.js +68 -0
- package/dist/src/utils/persistentState.test.js.map +1 -0
- package/dist/src/utils/readStdin.js +1 -0
- package/dist/src/utils/readStdin.js.map +1 -1
- package/dist/src/utils/readStdin.test.js +25 -0
- package/dist/src/utils/readStdin.test.js.map +1 -1
- package/dist/src/utils/resolvePath.test.d.ts +6 -0
- package/dist/src/utils/resolvePath.test.js +31 -0
- package/dist/src/utils/resolvePath.test.js.map +1 -0
- package/dist/src/utils/sandbox.js +6 -137
- package/dist/src/utils/sandbox.js.map +1 -1
- package/dist/src/utils/sandbox.test.d.ts +6 -0
- package/dist/src/utils/sandbox.test.js +302 -0
- package/dist/src/utils/sandbox.test.js.map +1 -0
- package/dist/src/utils/sandboxUtils.d.ts +14 -0
- package/dist/src/utils/sandboxUtils.js +120 -0
- package/dist/src/utils/sandboxUtils.js.map +1 -0
- package/dist/src/utils/sandboxUtils.test.d.ts +6 -0
- package/dist/src/utils/sandboxUtils.test.js +119 -0
- package/dist/src/utils/sandboxUtils.test.js.map +1 -0
- package/dist/src/utils/updateEventEmitter.test.d.ts +6 -0
- package/dist/src/utils/updateEventEmitter.test.js +18 -0
- package/dist/src/utils/updateEventEmitter.test.js.map +1 -0
- package/dist/src/utils/version.test.d.ts +6 -0
- package/dist/src/utils/version.test.js +39 -0
- package/dist/src/utils/version.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/dist/google-gemini-cli-0.19.0-nightly.20251123.dadd606c0.tgz +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export declare const LOCAL_DEV_SANDBOX_IMAGE_NAME = "gemini-cli-sandbox";
|
|
7
|
+
export declare const SANDBOX_NETWORK_NAME = "gemini-cli-sandbox";
|
|
8
|
+
export declare const SANDBOX_PROXY_NAME = "gemini-cli-sandbox-proxy";
|
|
9
|
+
export declare const BUILTIN_SEATBELT_PROFILES: string[];
|
|
10
|
+
export declare function getContainerPath(hostPath: string): string;
|
|
11
|
+
export declare function shouldUseCurrentUserInSandbox(): Promise<boolean>;
|
|
12
|
+
export declare function parseImageName(image: string): string;
|
|
13
|
+
export declare function ports(): string[];
|
|
14
|
+
export declare function entrypoint(workdir: string, cliArgs: string[]): string[];
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import { readFile } from 'node:fs/promises';
|
|
9
|
+
import { quote } from 'shell-quote';
|
|
10
|
+
import { debugLogger, GEMINI_DIR } from '@google/gemini-cli-core';
|
|
11
|
+
export const LOCAL_DEV_SANDBOX_IMAGE_NAME = 'gemini-cli-sandbox';
|
|
12
|
+
export const SANDBOX_NETWORK_NAME = 'gemini-cli-sandbox';
|
|
13
|
+
export const SANDBOX_PROXY_NAME = 'gemini-cli-sandbox-proxy';
|
|
14
|
+
export const BUILTIN_SEATBELT_PROFILES = [
|
|
15
|
+
'permissive-open',
|
|
16
|
+
'permissive-closed',
|
|
17
|
+
'permissive-proxied',
|
|
18
|
+
'restrictive-open',
|
|
19
|
+
'restrictive-closed',
|
|
20
|
+
'restrictive-proxied',
|
|
21
|
+
];
|
|
22
|
+
export function getContainerPath(hostPath) {
|
|
23
|
+
if (os.platform() !== 'win32') {
|
|
24
|
+
return hostPath;
|
|
25
|
+
}
|
|
26
|
+
const withForwardSlashes = hostPath.replace(/\\/g, '/');
|
|
27
|
+
const match = withForwardSlashes.match(/^([A-Z]):\/(.*)/i);
|
|
28
|
+
if (match) {
|
|
29
|
+
return `/${match[1].toLowerCase()}/${match[2]}`;
|
|
30
|
+
}
|
|
31
|
+
return withForwardSlashes;
|
|
32
|
+
}
|
|
33
|
+
export async function shouldUseCurrentUserInSandbox() {
|
|
34
|
+
const envVar = process.env['SANDBOX_SET_UID_GID']?.toLowerCase().trim();
|
|
35
|
+
if (envVar === '1' || envVar === 'true') {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
if (envVar === '0' || envVar === 'false') {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
// If environment variable is not explicitly set, check for Debian/Ubuntu Linux
|
|
42
|
+
if (os.platform() === 'linux') {
|
|
43
|
+
try {
|
|
44
|
+
const osReleaseContent = await readFile('/etc/os-release', 'utf8');
|
|
45
|
+
if (osReleaseContent.includes('ID=debian') ||
|
|
46
|
+
osReleaseContent.includes('ID=ubuntu') ||
|
|
47
|
+
osReleaseContent.match(/^ID_LIKE=.*debian.*/m) || // Covers derivatives
|
|
48
|
+
osReleaseContent.match(/^ID_LIKE=.*ubuntu.*/m) // Covers derivatives
|
|
49
|
+
) {
|
|
50
|
+
debugLogger.log('Defaulting to use current user UID/GID for Debian/Ubuntu-based Linux.');
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (_err) {
|
|
55
|
+
// Silently ignore if /etc/os-release is not found or unreadable.
|
|
56
|
+
// The default (false) will be applied in this case.
|
|
57
|
+
debugLogger.warn('Warning: Could not read /etc/os-release to auto-detect Debian/Ubuntu for UID/GID default.');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return false; // Default to false if no other condition is met
|
|
61
|
+
}
|
|
62
|
+
export function parseImageName(image) {
|
|
63
|
+
const [fullName, tag] = image.split(':');
|
|
64
|
+
const name = fullName.split('/').at(-1) ?? 'unknown-image';
|
|
65
|
+
return tag ? `${name}-${tag}` : name;
|
|
66
|
+
}
|
|
67
|
+
export function ports() {
|
|
68
|
+
return (process.env['SANDBOX_PORTS'] ?? '')
|
|
69
|
+
.split(',')
|
|
70
|
+
.filter((p) => p.trim())
|
|
71
|
+
.map((p) => p.trim());
|
|
72
|
+
}
|
|
73
|
+
export function entrypoint(workdir, cliArgs) {
|
|
74
|
+
const isWindows = os.platform() === 'win32';
|
|
75
|
+
const containerWorkdir = getContainerPath(workdir);
|
|
76
|
+
const shellCmds = [];
|
|
77
|
+
const pathSeparator = isWindows ? ';' : ':';
|
|
78
|
+
let pathSuffix = '';
|
|
79
|
+
if (process.env['PATH']) {
|
|
80
|
+
const paths = process.env['PATH'].split(pathSeparator);
|
|
81
|
+
for (const p of paths) {
|
|
82
|
+
const containerPath = getContainerPath(p);
|
|
83
|
+
if (containerPath.toLowerCase().startsWith(containerWorkdir.toLowerCase())) {
|
|
84
|
+
pathSuffix += `:${containerPath}`;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (pathSuffix) {
|
|
89
|
+
shellCmds.push(`export PATH="$PATH${pathSuffix}";`);
|
|
90
|
+
}
|
|
91
|
+
let pythonPathSuffix = '';
|
|
92
|
+
if (process.env['PYTHONPATH']) {
|
|
93
|
+
const paths = process.env['PYTHONPATH'].split(pathSeparator);
|
|
94
|
+
for (const p of paths) {
|
|
95
|
+
const containerPath = getContainerPath(p);
|
|
96
|
+
if (containerPath.toLowerCase().startsWith(containerWorkdir.toLowerCase())) {
|
|
97
|
+
pythonPathSuffix += `:${containerPath}`;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (pythonPathSuffix) {
|
|
102
|
+
shellCmds.push(`export PYTHONPATH="$PYTHONPATH${pythonPathSuffix}";`);
|
|
103
|
+
}
|
|
104
|
+
const projectSandboxBashrc = `${GEMINI_DIR}/sandbox.bashrc`;
|
|
105
|
+
if (fs.existsSync(projectSandboxBashrc)) {
|
|
106
|
+
shellCmds.push(`source ${getContainerPath(projectSandboxBashrc)};`);
|
|
107
|
+
}
|
|
108
|
+
ports().forEach((p) => shellCmds.push(`socat TCP4-LISTEN:${p},bind=$(hostname -i),fork,reuseaddr TCP4:127.0.0.1:${p} 2> /dev/null &`));
|
|
109
|
+
const quotedCliArgs = cliArgs.slice(2).map((arg) => quote([arg]));
|
|
110
|
+
const cliCmd = process.env['NODE_ENV'] === 'development'
|
|
111
|
+
? process.env['DEBUG']
|
|
112
|
+
? 'npm run debug --'
|
|
113
|
+
: 'npm rebuild && npm run start --'
|
|
114
|
+
: process.env['DEBUG']
|
|
115
|
+
? `node --inspect-brk=0.0.0.0:${process.env['DEBUG_PORT'] || '9229'} $(which gemini)`
|
|
116
|
+
: 'gemini';
|
|
117
|
+
const args = [...shellCmds, cliCmd, ...quotedCliArgs];
|
|
118
|
+
return ['bash', '-c', args.join(' ')];
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=sandboxUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandboxUtils.js","sourceRoot":"","sources":["../../../src/utils/sandboxUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import { readFile } from 'node:fs/promises';
|
|
10
|
+
import { getContainerPath, parseImageName, ports, entrypoint, shouldUseCurrentUserInSandbox, } from './sandboxUtils.js';
|
|
11
|
+
vi.mock('node:os');
|
|
12
|
+
vi.mock('node:fs');
|
|
13
|
+
vi.mock('node:fs/promises');
|
|
14
|
+
vi.mock('@google/gemini-cli-core', () => ({
|
|
15
|
+
debugLogger: {
|
|
16
|
+
log: vi.fn(),
|
|
17
|
+
warn: vi.fn(),
|
|
18
|
+
},
|
|
19
|
+
GEMINI_DIR: '.gemini',
|
|
20
|
+
}));
|
|
21
|
+
describe('sandboxUtils', () => {
|
|
22
|
+
const originalEnv = process.env;
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
vi.clearAllMocks();
|
|
25
|
+
process.env = { ...originalEnv };
|
|
26
|
+
});
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
process.env = originalEnv;
|
|
29
|
+
});
|
|
30
|
+
describe('getContainerPath', () => {
|
|
31
|
+
it('should return same path on non-Windows', () => {
|
|
32
|
+
vi.mocked(os.platform).mockReturnValue('linux');
|
|
33
|
+
expect(getContainerPath('/home/user')).toBe('/home/user');
|
|
34
|
+
});
|
|
35
|
+
it('should convert Windows path to container path', () => {
|
|
36
|
+
vi.mocked(os.platform).mockReturnValue('win32');
|
|
37
|
+
expect(getContainerPath('C:\\Users\\user')).toBe('/c/Users/user');
|
|
38
|
+
});
|
|
39
|
+
it('should handle Windows path without drive letter', () => {
|
|
40
|
+
vi.mocked(os.platform).mockReturnValue('win32');
|
|
41
|
+
expect(getContainerPath('\\Users\\user')).toBe('/Users/user');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('parseImageName', () => {
|
|
45
|
+
it('should parse image name with tag', () => {
|
|
46
|
+
expect(parseImageName('my-image:latest')).toBe('my-image-latest');
|
|
47
|
+
});
|
|
48
|
+
it('should parse image name without tag', () => {
|
|
49
|
+
expect(parseImageName('my-image')).toBe('my-image');
|
|
50
|
+
});
|
|
51
|
+
it('should handle registry path', () => {
|
|
52
|
+
expect(parseImageName('gcr.io/my-project/my-image:v1')).toBe('my-image-v1');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('ports', () => {
|
|
56
|
+
it('should return empty array if SANDBOX_PORTS is not set', () => {
|
|
57
|
+
delete process.env['SANDBOX_PORTS'];
|
|
58
|
+
expect(ports()).toEqual([]);
|
|
59
|
+
});
|
|
60
|
+
it('should parse comma-separated ports', () => {
|
|
61
|
+
process.env['SANDBOX_PORTS'] = '8080, 3000 , 9000';
|
|
62
|
+
expect(ports()).toEqual(['8080', '3000', '9000']);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
describe('entrypoint', () => {
|
|
66
|
+
beforeEach(() => {
|
|
67
|
+
vi.mocked(os.platform).mockReturnValue('linux');
|
|
68
|
+
vi.mocked(fs.existsSync).mockReturnValue(false);
|
|
69
|
+
});
|
|
70
|
+
it('should generate default entrypoint', () => {
|
|
71
|
+
const args = entrypoint('/work', ['node', 'gemini', 'arg1']);
|
|
72
|
+
expect(args).toEqual(['bash', '-c', 'gemini arg1']);
|
|
73
|
+
});
|
|
74
|
+
it('should include PATH and PYTHONPATH if set', () => {
|
|
75
|
+
process.env['PATH'] = '/work/bin:/usr/bin';
|
|
76
|
+
process.env['PYTHONPATH'] = '/work/lib';
|
|
77
|
+
const args = entrypoint('/work', ['node', 'gemini', 'arg1']);
|
|
78
|
+
expect(args[2]).toContain('export PATH="$PATH:/work/bin"');
|
|
79
|
+
expect(args[2]).toContain('export PYTHONPATH="$PYTHONPATH:/work/lib"');
|
|
80
|
+
});
|
|
81
|
+
it('should source sandbox.bashrc if exists', () => {
|
|
82
|
+
vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
83
|
+
const args = entrypoint('/work', ['node', 'gemini', 'arg1']);
|
|
84
|
+
expect(args[2]).toContain('source .gemini/sandbox.bashrc');
|
|
85
|
+
});
|
|
86
|
+
it('should include socat commands for ports', () => {
|
|
87
|
+
process.env['SANDBOX_PORTS'] = '8080';
|
|
88
|
+
const args = entrypoint('/work', ['node', 'gemini', 'arg1']);
|
|
89
|
+
expect(args[2]).toContain('socat TCP4-LISTEN:8080');
|
|
90
|
+
});
|
|
91
|
+
it('should use development command if NODE_ENV is development', () => {
|
|
92
|
+
process.env['NODE_ENV'] = 'development';
|
|
93
|
+
const args = entrypoint('/work', ['node', 'gemini', 'arg1']);
|
|
94
|
+
expect(args[2]).toContain('npm rebuild && npm run start --');
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('shouldUseCurrentUserInSandbox', () => {
|
|
98
|
+
it('should return true if SANDBOX_SET_UID_GID is 1', async () => {
|
|
99
|
+
process.env['SANDBOX_SET_UID_GID'] = '1';
|
|
100
|
+
expect(await shouldUseCurrentUserInSandbox()).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
it('should return false if SANDBOX_SET_UID_GID is 0', async () => {
|
|
103
|
+
process.env['SANDBOX_SET_UID_GID'] = '0';
|
|
104
|
+
expect(await shouldUseCurrentUserInSandbox()).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
it('should return true on Debian Linux', async () => {
|
|
107
|
+
delete process.env['SANDBOX_SET_UID_GID'];
|
|
108
|
+
vi.mocked(os.platform).mockReturnValue('linux');
|
|
109
|
+
vi.mocked(readFile).mockResolvedValue('ID=debian\n');
|
|
110
|
+
expect(await shouldUseCurrentUserInSandbox()).toBe(true);
|
|
111
|
+
});
|
|
112
|
+
it('should return false on non-Linux', async () => {
|
|
113
|
+
delete process.env['SANDBOX_SET_UID_GID'];
|
|
114
|
+
vi.mocked(os.platform).mockReturnValue('darwin');
|
|
115
|
+
expect(await shouldUseCurrentUserInSandbox()).toBe(false);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=sandboxUtils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandboxUtils.test.js","sourceRoot":"","sources":["../../../src/utils/sandboxUtils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
7
|
+
import { updateEventEmitter } from './updateEventEmitter.js';
|
|
8
|
+
describe('updateEventEmitter', () => {
|
|
9
|
+
it('should allow registering and emitting events', () => {
|
|
10
|
+
const callback = vi.fn();
|
|
11
|
+
const eventName = 'test-event';
|
|
12
|
+
updateEventEmitter.on(eventName, callback);
|
|
13
|
+
updateEventEmitter.emit(eventName, 'test-data');
|
|
14
|
+
expect(callback).toHaveBeenCalledWith('test-data');
|
|
15
|
+
updateEventEmitter.off(eventName, callback);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=updateEventEmitter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateEventEmitter.test.js","sourceRoot":"","sources":["../../../src/utils/updateEventEmitter.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,YAAY,CAAC;QAE/B,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC3C,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAEhD,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAEnD,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
import { getCliVersion } from './version.js';
|
|
8
|
+
import * as core from '@google/gemini-cli-core';
|
|
9
|
+
vi.mock('@google/gemini-cli-core', () => ({
|
|
10
|
+
getPackageJson: vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
describe('version', () => {
|
|
13
|
+
const originalEnv = process.env;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
vi.resetModules();
|
|
16
|
+
process.env = { ...originalEnv };
|
|
17
|
+
vi.mocked(core.getPackageJson).mockResolvedValue({ version: '1.0.0' });
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
process.env = originalEnv;
|
|
21
|
+
});
|
|
22
|
+
it('should return CLI_VERSION from env if set', async () => {
|
|
23
|
+
process.env['CLI_VERSION'] = '2.0.0';
|
|
24
|
+
const version = await getCliVersion();
|
|
25
|
+
expect(version).toBe('2.0.0');
|
|
26
|
+
});
|
|
27
|
+
it('should return version from package.json if CLI_VERSION is not set', async () => {
|
|
28
|
+
delete process.env['CLI_VERSION'];
|
|
29
|
+
const version = await getCliVersion();
|
|
30
|
+
expect(version).toBe('1.0.0');
|
|
31
|
+
});
|
|
32
|
+
it('should return "unknown" if package.json is not found and CLI_VERSION is not set', async () => {
|
|
33
|
+
delete process.env['CLI_VERSION'];
|
|
34
|
+
vi.mocked(core.getPackageJson).mockResolvedValue(undefined);
|
|
35
|
+
const version = await getCliVersion();
|
|
36
|
+
expect(version).toBe('unknown');
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=version.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.test.js","sourceRoot":"","sources":["../../../src/utils/version.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAEhD,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;IACxC,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;CACxB,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAEhC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;QACjC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;QAC/F,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAClC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|