@google/gemini-cli 0.12.0-nightly.20251027.cb0947c5 → 0.12.0-preview.11
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/README.md +7 -5
- package/dist/package.json +2 -2
- package/dist/src/commands/extensions/disable.d.ts +1 -1
- package/dist/src/commands/extensions/disable.js +5 -4
- package/dist/src/commands/extensions/disable.js.map +1 -1
- package/dist/src/commands/extensions/enable.d.ts +1 -1
- package/dist/src/commands/extensions/enable.js +3 -2
- package/dist/src/commands/extensions/enable.js.map +1 -1
- package/dist/src/commands/extensions/install.js +2 -1
- package/dist/src/commands/extensions/install.js.map +1 -1
- package/dist/src/commands/extensions/install.test.js +1 -0
- package/dist/src/commands/extensions/install.test.js.map +1 -1
- package/dist/src/commands/extensions/link.js +2 -1
- package/dist/src/commands/extensions/link.js.map +1 -1
- package/dist/src/commands/extensions/list.js +2 -2
- package/dist/src/commands/extensions/list.js.map +1 -1
- package/dist/src/commands/extensions/uninstall.js +2 -1
- package/dist/src/commands/extensions/uninstall.js.map +1 -1
- package/dist/src/commands/extensions/update.js +2 -2
- package/dist/src/commands/extensions/update.js.map +1 -1
- package/dist/src/commands/mcp/list.js +2 -2
- package/dist/src/commands/mcp/list.js.map +1 -1
- package/dist/src/config/config.d.ts +5 -3
- package/dist/src/config/config.js +43 -10
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +192 -171
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/extension-manager.d.ts +23 -10
- package/dist/src/config/extension-manager.js +89 -62
- package/dist/src/config/extension-manager.js.map +1 -1
- package/dist/src/config/extension.test.js +158 -74
- package/dist/src/config/extension.test.js.map +1 -1
- package/dist/src/config/extensions/extensionSettings.d.ts +3 -3
- package/dist/src/config/extensions/extensionSettings.js +74 -24
- package/dist/src/config/extensions/extensionSettings.js.map +1 -1
- package/dist/src/config/extensions/extensionSettings.test.js +145 -24
- package/dist/src/config/extensions/extensionSettings.test.js.map +1 -1
- package/dist/src/config/extensions/github.js +3 -3
- package/dist/src/config/extensions/github.js.map +1 -1
- package/dist/src/config/extensions/github.test.js +1 -1
- package/dist/src/config/extensions/github.test.js.map +1 -1
- package/dist/src/config/extensions/update.js +7 -6
- package/dist/src/config/extensions/update.js.map +1 -1
- package/dist/src/config/extensions/update.test.js +54 -31
- package/dist/src/config/extensions/update.test.js.map +1 -1
- package/dist/src/config/keyBindings.js +1 -1
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/policies/read-only.toml +56 -0
- package/dist/src/config/policies/write.toml +63 -0
- package/dist/src/config/policies/yolo.toml +31 -0
- package/dist/src/config/policy-engine.integration.test.js +41 -38
- package/dist/src/config/policy-engine.integration.test.js.map +1 -1
- package/dist/src/config/policy-toml-loader.d.ts +46 -0
- package/dist/src/config/policy-toml-loader.js +314 -0
- package/dist/src/config/policy-toml-loader.js.map +1 -0
- package/dist/src/config/policy-toml-loader.test.d.ts +6 -0
- package/dist/src/config/policy-toml-loader.test.js +626 -0
- package/dist/src/config/policy-toml-loader.test.js.map +1 -0
- package/dist/src/config/policy.d.ts +9 -2
- package/dist/src/config/policy.js +139 -110
- package/dist/src/config/policy.js.map +1 -1
- package/dist/src/config/policy.test.js +780 -82
- package/dist/src/config/policy.test.js.map +1 -1
- package/dist/src/config/settings.js +1 -1
- package/dist/src/config/settings.js.map +1 -1
- package/dist/src/config/settings.test.js +17 -57
- package/dist/src/config/settings.test.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +18 -9
- package/dist/src/config/settingsSchema.js +17 -8
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/config/settingsSchema.test.js +2 -0
- package/dist/src/config/settingsSchema.test.js.map +1 -1
- package/dist/src/gemini.js +6 -17
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +1 -0
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/test-utils/render.d.ts +12 -0
- package/dist/src/test-utils/render.js +28 -1
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/test-utils/render.test.d.ts +6 -0
- package/dist/src/test-utils/render.test.js +54 -0
- package/dist/src/test-utils/render.test.js.map +1 -0
- package/dist/src/ui/AppContainer.js +33 -22
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/AppContainer.test.js +30 -1
- package/dist/src/ui/AppContainer.test.js.map +1 -1
- package/dist/src/ui/commands/directoryCommand.js +1 -1
- package/dist/src/ui/commands/directoryCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.js +45 -1
- package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
- package/dist/src/ui/commands/extensionsCommand.test.js +64 -1
- package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.js +1 -1
- package/dist/src/ui/commands/memoryCommand.js.map +1 -1
- package/dist/src/ui/commands/memoryCommand.test.js +3 -1
- package/dist/src/ui/commands/memoryCommand.test.js.map +1 -1
- package/dist/src/ui/components/ConsoleSummaryDisplay.js +1 -1
- package/dist/src/ui/components/ConsoleSummaryDisplay.js.map +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js +1 -1
- package/dist/src/ui/components/DetailedMessagesDisplay.js.map +1 -1
- package/dist/src/ui/components/FolderTrustDialog.test.js +4 -5
- package/dist/src/ui/components/FolderTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/Footer.js +4 -3
- package/dist/src/ui/components/Footer.js.map +1 -1
- package/dist/src/ui/components/Footer.test.js +83 -0
- package/dist/src/ui/components/Footer.test.js.map +1 -1
- package/dist/src/ui/components/Help.test.js +0 -1
- package/dist/src/ui/components/Help.test.js.map +1 -1
- package/dist/src/ui/components/ModelDialog.test.js +5 -6
- package/dist/src/ui/components/ModelDialog.test.js.map +1 -1
- package/dist/src/ui/components/Notifications.js +38 -5
- package/dist/src/ui/components/Notifications.js.map +1 -1
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js +11 -13
- package/dist/src/ui/components/PermissionsModifyTrustDialog.test.js.map +1 -1
- package/dist/src/ui/components/SettingsDialog.test.js +12 -14
- package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
- package/dist/src/ui/components/shared/BaseSelectionList.test.js +11 -13
- package/dist/src/ui/components/shared/BaseSelectionList.test.js.map +1 -1
- package/dist/src/ui/components/shared/text-buffer.test.js +2 -2
- package/dist/src/ui/components/shared/text-buffer.test.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.js +8 -29
- package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
- package/dist/src/ui/contexts/KeypressContext.test.js +90 -73
- package/dist/src/ui/contexts/KeypressContext.test.js.map +1 -1
- package/dist/src/ui/contexts/SessionContext.test.js +27 -14
- package/dist/src/ui/contexts/SessionContext.test.js.map +1 -1
- package/dist/src/ui/hooks/atCommandProcessor.js +2 -2
- package/dist/src/ui/hooks/atCommandProcessor.js.map +1 -1
- package/dist/src/ui/hooks/useAtCompletion.test.js +32 -23
- package/dist/src/ui/hooks/useAtCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +2 -2
- package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.d.ts +1 -2
- package/dist/src/ui/hooks/useExtensionUpdates.js +2 -1
- package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
- package/dist/src/ui/hooks/useExtensionUpdates.test.js +14 -20
- package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
- package/dist/src/ui/hooks/useFlickerDetector.test.js +9 -6
- package/dist/src/ui/hooks/useFlickerDetector.test.js.map +1 -1
- package/dist/src/ui/hooks/useFolderTrust.test.js +45 -23
- package/dist/src/ui/hooks/useFolderTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.js +7 -5
- package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
- package/dist/src/ui/hooks/useGeminiStream.test.js +42 -41
- package/dist/src/ui/hooks/useGeminiStream.test.js.map +1 -1
- package/dist/src/ui/hooks/useHistoryManager.test.js +2 -2
- package/dist/src/ui/hooks/useHistoryManager.test.js.map +1 -1
- package/dist/src/ui/hooks/useInputHistory.test.js +2 -2
- package/dist/src/ui/hooks/useInputHistory.test.js.map +1 -1
- package/dist/src/ui/hooks/useInputHistoryStore.test.js +2 -2
- package/dist/src/ui/hooks/useInputHistoryStore.test.js.map +1 -1
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js +2 -3
- package/dist/src/ui/hooks/usePermissionsModifyTrust.test.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.js.map +1 -1
- package/dist/src/ui/hooks/usePhraseCycler.test.js +83 -111
- package/dist/src/ui/hooks/usePhraseCycler.test.js.map +1 -1
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js +2 -2
- package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
- package/dist/src/ui/hooks/useReactToolScheduler.test.js +1 -2
- package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +1 -1
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js +2 -2
- package/dist/src/ui/hooks/useReverseSearchCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useShellHistory.test.js +40 -17
- package/dist/src/ui/hooks/useShellHistory.test.js.map +1 -1
- package/dist/src/ui/hooks/useSlashCompletion.test.js +54 -49
- package/dist/src/ui/hooks/useSlashCompletion.test.js.map +1 -1
- package/dist/src/ui/hooks/useToolScheduler.test.js +48 -42
- package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
- package/dist/src/ui/keyMatchers.test.js +3 -3
- package/dist/src/ui/keyMatchers.test.js.map +1 -1
- package/dist/src/zed-integration/zedIntegration.d.ts +2 -2
- package/dist/src/zed-integration/zedIntegration.js +4 -6
- package/dist/src/zed-integration/zedIntegration.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
|
@@ -10,6 +10,7 @@ import { DEFAULT_FILE_FILTERING_OPTIONS, DEFAULT_GEMINI_MODEL, DEFAULT_GEMINI_MO
|
|
|
10
10
|
import { loadCliConfig, parseArguments } from './config.js';
|
|
11
11
|
import * as ServerConfig from '@google/gemini-cli-core';
|
|
12
12
|
import { isWorkspaceTrusted } from './trustedFolders.js';
|
|
13
|
+
import { ExtensionManager } from './extension-manager.js';
|
|
13
14
|
vi.mock('./trustedFolders.js', () => ({
|
|
14
15
|
isWorkspaceTrusted: vi
|
|
15
16
|
.fn()
|
|
@@ -72,10 +73,15 @@ vi.mock('@google/gemini-cli-core', async () => {
|
|
|
72
73
|
}),
|
|
73
74
|
},
|
|
74
75
|
loadEnvironment: vi.fn(),
|
|
75
|
-
loadServerHierarchicalMemory: vi.fn((cwd, dirs, debug, fileService,
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
loadServerHierarchicalMemory: vi.fn((cwd, dirs, debug, fileService, extensionLoader, _maxDirs) => {
|
|
77
|
+
const extensionPaths = extensionLoader
|
|
78
|
+
.getExtensions()
|
|
79
|
+
.flatMap((e) => e.contextFiles);
|
|
80
|
+
return Promise.resolve({
|
|
81
|
+
memoryContent: extensionPaths.join(',') || '',
|
|
82
|
+
fileCount: extensionPaths?.length || 0,
|
|
83
|
+
});
|
|
84
|
+
}),
|
|
79
85
|
DEFAULT_MEMORY_FILE_FILTERING_OPTIONS: {
|
|
80
86
|
respectGitIgnore: false,
|
|
81
87
|
respectGeminiIgnore: true,
|
|
@@ -86,11 +92,23 @@ vi.mock('@google/gemini-cli-core', async () => {
|
|
|
86
92
|
},
|
|
87
93
|
};
|
|
88
94
|
});
|
|
95
|
+
vi.mock('./extension-manager.js');
|
|
96
|
+
// Global setup to ensure clean environment for all tests in this file
|
|
97
|
+
const originalArgv = process.argv;
|
|
98
|
+
const originalGeminiModel = process.env['GEMINI_MODEL'];
|
|
99
|
+
beforeEach(() => {
|
|
100
|
+
delete process.env['GEMINI_MODEL'];
|
|
101
|
+
});
|
|
102
|
+
afterEach(() => {
|
|
103
|
+
process.argv = originalArgv;
|
|
104
|
+
if (originalGeminiModel !== undefined) {
|
|
105
|
+
process.env['GEMINI_MODEL'] = originalGeminiModel;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
delete process.env['GEMINI_MODEL'];
|
|
109
|
+
}
|
|
110
|
+
});
|
|
89
111
|
describe('parseArguments', () => {
|
|
90
|
-
const originalArgv = process.argv;
|
|
91
|
-
afterEach(() => {
|
|
92
|
-
process.argv = originalArgv;
|
|
93
|
-
});
|
|
94
112
|
it('should throw an error when both --prompt and --prompt-interactive are used together', async () => {
|
|
95
113
|
process.argv = [
|
|
96
114
|
'node',
|
|
@@ -380,14 +398,13 @@ describe('parseArguments', () => {
|
|
|
380
398
|
});
|
|
381
399
|
});
|
|
382
400
|
describe('loadCliConfig', () => {
|
|
383
|
-
const originalArgv = process.argv;
|
|
384
401
|
beforeEach(() => {
|
|
385
402
|
vi.resetAllMocks();
|
|
386
403
|
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
387
404
|
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
405
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
388
406
|
});
|
|
389
407
|
afterEach(() => {
|
|
390
|
-
process.argv = originalArgv;
|
|
391
408
|
vi.unstubAllEnvs();
|
|
392
409
|
vi.restoreAllMocks();
|
|
393
410
|
});
|
|
@@ -419,7 +436,7 @@ describe('loadCliConfig', () => {
|
|
|
419
436
|
process.argv = ['node', 'script.js'];
|
|
420
437
|
const argv = await parseArguments({});
|
|
421
438
|
const settings = {};
|
|
422
|
-
const config = await loadCliConfig(settings,
|
|
439
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
423
440
|
expect(config.getProxy()).toBeFalsy();
|
|
424
441
|
});
|
|
425
442
|
const proxy_url = 'http://localhost:7890';
|
|
@@ -459,7 +476,7 @@ describe('loadCliConfig', () => {
|
|
|
459
476
|
process.argv = ['node', 'script.js'];
|
|
460
477
|
const argv = await parseArguments({});
|
|
461
478
|
const settings = {};
|
|
462
|
-
const config = await loadCliConfig(settings,
|
|
479
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
463
480
|
expect(config.getProxy()).toBe(expected);
|
|
464
481
|
});
|
|
465
482
|
});
|
|
@@ -468,7 +485,7 @@ describe('loadCliConfig', () => {
|
|
|
468
485
|
process.argv = ['node', 'script.js'];
|
|
469
486
|
const argv = await parseArguments({});
|
|
470
487
|
const settings = {};
|
|
471
|
-
const config = await loadCliConfig(settings,
|
|
488
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
472
489
|
expect(config.getFileFilteringRespectGitIgnore()).toBe(DEFAULT_FILE_FILTERING_OPTIONS.respectGitIgnore);
|
|
473
490
|
expect(config.getFileFilteringRespectGeminiIgnore()).toBe(DEFAULT_FILE_FILTERING_OPTIONS.respectGeminiIgnore);
|
|
474
491
|
});
|
|
@@ -485,7 +502,7 @@ describe('Hierarchical Memory Loading (config.ts) - Placeholder Suite', () => {
|
|
|
485
502
|
it('should pass extension context file paths to loadServerHierarchicalMemory', async () => {
|
|
486
503
|
process.argv = ['node', 'script.js'];
|
|
487
504
|
const settings = {};
|
|
488
|
-
|
|
505
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
489
506
|
{
|
|
490
507
|
path: '/path/to/ext1',
|
|
491
508
|
name: 'ext1',
|
|
@@ -513,10 +530,10 @@ describe('Hierarchical Memory Loading (config.ts) - Placeholder Suite', () => {
|
|
|
513
530
|
],
|
|
514
531
|
isActive: true,
|
|
515
532
|
},
|
|
516
|
-
];
|
|
533
|
+
]);
|
|
517
534
|
const argv = await parseArguments({});
|
|
518
|
-
await loadCliConfig(settings,
|
|
519
|
-
expect(ServerConfig.loadServerHierarchicalMemory).toHaveBeenCalledWith(expect.any(String), [], false, expect.any(Object),
|
|
535
|
+
await loadCliConfig(settings, 'session-id', argv);
|
|
536
|
+
expect(ServerConfig.loadServerHierarchicalMemory).toHaveBeenCalledWith(expect.any(String), [], false, expect.any(Object), expect.any(ExtensionManager), true, 'tree', {
|
|
520
537
|
respectGitIgnore: false,
|
|
521
538
|
respectGeminiIgnore: true,
|
|
522
539
|
}, undefined);
|
|
@@ -563,7 +580,7 @@ describe('mergeMcpServers', () => {
|
|
|
563
580
|
},
|
|
564
581
|
},
|
|
565
582
|
};
|
|
566
|
-
|
|
583
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
567
584
|
{
|
|
568
585
|
path: '/path/to/ext1',
|
|
569
586
|
name: 'ext1',
|
|
@@ -577,11 +594,11 @@ describe('mergeMcpServers', () => {
|
|
|
577
594
|
contextFiles: [],
|
|
578
595
|
isActive: true,
|
|
579
596
|
},
|
|
580
|
-
];
|
|
597
|
+
]);
|
|
581
598
|
const originalSettings = JSON.parse(JSON.stringify(settings));
|
|
582
599
|
process.argv = ['node', 'script.js'];
|
|
583
600
|
const argv = await parseArguments({});
|
|
584
|
-
await loadCliConfig(settings,
|
|
601
|
+
await loadCliConfig(settings, 'test-session', argv);
|
|
585
602
|
expect(settings).toEqual(originalSettings);
|
|
586
603
|
});
|
|
587
604
|
});
|
|
@@ -593,6 +610,7 @@ describe('mergeExcludeTools', () => {
|
|
|
593
610
|
];
|
|
594
611
|
const originalIsTTY = process.stdin.isTTY;
|
|
595
612
|
beforeEach(() => {
|
|
613
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
596
614
|
process.stdin.isTTY = true;
|
|
597
615
|
});
|
|
598
616
|
afterEach(() => {
|
|
@@ -600,7 +618,7 @@ describe('mergeExcludeTools', () => {
|
|
|
600
618
|
});
|
|
601
619
|
it('should merge excludeTools from settings and extensions', async () => {
|
|
602
620
|
const settings = { tools: { exclude: ['tool1', 'tool2'] } };
|
|
603
|
-
|
|
621
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
604
622
|
{
|
|
605
623
|
path: '/path/to/ext1',
|
|
606
624
|
name: 'ext1',
|
|
@@ -619,16 +637,16 @@ describe('mergeExcludeTools', () => {
|
|
|
619
637
|
contextFiles: [],
|
|
620
638
|
isActive: true,
|
|
621
639
|
},
|
|
622
|
-
];
|
|
640
|
+
]);
|
|
623
641
|
process.argv = ['node', 'script.js'];
|
|
624
642
|
const argv = await parseArguments({});
|
|
625
|
-
const config = await loadCliConfig(settings,
|
|
643
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
626
644
|
expect(config.getExcludeTools()).toEqual(expect.arrayContaining(['tool1', 'tool2', 'tool3', 'tool4', 'tool5']));
|
|
627
645
|
expect(config.getExcludeTools()).toHaveLength(5);
|
|
628
646
|
});
|
|
629
647
|
it('should handle overlapping excludeTools between settings and extensions', async () => {
|
|
630
648
|
const settings = { tools: { exclude: ['tool1', 'tool2'] } };
|
|
631
|
-
|
|
649
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
632
650
|
{
|
|
633
651
|
path: '/path/to/ext1',
|
|
634
652
|
name: 'ext1',
|
|
@@ -638,16 +656,16 @@ describe('mergeExcludeTools', () => {
|
|
|
638
656
|
contextFiles: [],
|
|
639
657
|
isActive: true,
|
|
640
658
|
},
|
|
641
|
-
];
|
|
659
|
+
]);
|
|
642
660
|
process.argv = ['node', 'script.js'];
|
|
643
661
|
const argv = await parseArguments({});
|
|
644
|
-
const config = await loadCliConfig(settings,
|
|
662
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
645
663
|
expect(config.getExcludeTools()).toEqual(expect.arrayContaining(['tool1', 'tool2', 'tool3']));
|
|
646
664
|
expect(config.getExcludeTools()).toHaveLength(3);
|
|
647
665
|
});
|
|
648
666
|
it('should handle overlapping excludeTools between extensions', async () => {
|
|
649
667
|
const settings = { tools: { exclude: ['tool1'] } };
|
|
650
|
-
|
|
668
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
651
669
|
{
|
|
652
670
|
path: '/path/to/ext1',
|
|
653
671
|
name: 'ext1',
|
|
@@ -666,43 +684,41 @@ describe('mergeExcludeTools', () => {
|
|
|
666
684
|
contextFiles: [],
|
|
667
685
|
isActive: true,
|
|
668
686
|
},
|
|
669
|
-
];
|
|
687
|
+
]);
|
|
670
688
|
process.argv = ['node', 'script.js'];
|
|
671
689
|
const argv = await parseArguments({});
|
|
672
|
-
const config = await loadCliConfig(settings,
|
|
690
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
673
691
|
expect(config.getExcludeTools()).toEqual(expect.arrayContaining(['tool1', 'tool2', 'tool3', 'tool4']));
|
|
674
692
|
expect(config.getExcludeTools()).toHaveLength(4);
|
|
675
693
|
});
|
|
676
694
|
it('should return an empty array when no excludeTools are specified and it is interactive', async () => {
|
|
677
695
|
process.stdin.isTTY = true;
|
|
678
696
|
const settings = {};
|
|
679
|
-
const extensions = [];
|
|
680
697
|
process.argv = ['node', 'script.js'];
|
|
681
698
|
const argv = await parseArguments({});
|
|
682
|
-
const config = await loadCliConfig(settings,
|
|
699
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
683
700
|
expect(config.getExcludeTools()).toEqual([]);
|
|
684
701
|
});
|
|
685
702
|
it('should return default excludes when no excludeTools are specified and it is not interactive', async () => {
|
|
686
703
|
process.stdin.isTTY = false;
|
|
687
704
|
const settings = {};
|
|
688
|
-
const extensions = [];
|
|
689
705
|
process.argv = ['node', 'script.js', '-p', 'test'];
|
|
690
706
|
const argv = await parseArguments({});
|
|
691
|
-
const config = await loadCliConfig(settings,
|
|
707
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
692
708
|
expect(config.getExcludeTools()).toEqual(defaultExcludes);
|
|
693
709
|
});
|
|
694
710
|
it('should handle settings with excludeTools but no extensions', async () => {
|
|
695
711
|
process.argv = ['node', 'script.js'];
|
|
696
712
|
const argv = await parseArguments({});
|
|
697
713
|
const settings = { tools: { exclude: ['tool1', 'tool2'] } };
|
|
698
|
-
|
|
699
|
-
const config = await loadCliConfig(settings,
|
|
714
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
715
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
700
716
|
expect(config.getExcludeTools()).toEqual(expect.arrayContaining(['tool1', 'tool2']));
|
|
701
717
|
expect(config.getExcludeTools()).toHaveLength(2);
|
|
702
718
|
});
|
|
703
719
|
it('should handle extensions with excludeTools but no settings', async () => {
|
|
704
720
|
const settings = {};
|
|
705
|
-
|
|
721
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
706
722
|
{
|
|
707
723
|
path: '/path/to/ext',
|
|
708
724
|
name: 'ext1',
|
|
@@ -712,16 +728,16 @@ describe('mergeExcludeTools', () => {
|
|
|
712
728
|
contextFiles: [],
|
|
713
729
|
isActive: true,
|
|
714
730
|
},
|
|
715
|
-
];
|
|
731
|
+
]);
|
|
716
732
|
process.argv = ['node', 'script.js'];
|
|
717
733
|
const argv = await parseArguments({});
|
|
718
|
-
const config = await loadCliConfig(settings,
|
|
734
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
719
735
|
expect(config.getExcludeTools()).toEqual(expect.arrayContaining(['tool1', 'tool2']));
|
|
720
736
|
expect(config.getExcludeTools()).toHaveLength(2);
|
|
721
737
|
});
|
|
722
738
|
it('should not modify the original settings object', async () => {
|
|
723
739
|
const settings = { tools: { exclude: ['tool1'] } };
|
|
724
|
-
|
|
740
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([
|
|
725
741
|
{
|
|
726
742
|
path: '/path/to/ext',
|
|
727
743
|
name: 'ext1',
|
|
@@ -731,11 +747,11 @@ describe('mergeExcludeTools', () => {
|
|
|
731
747
|
contextFiles: [],
|
|
732
748
|
isActive: true,
|
|
733
749
|
},
|
|
734
|
-
];
|
|
750
|
+
]);
|
|
735
751
|
const originalSettings = JSON.parse(JSON.stringify(settings));
|
|
736
752
|
process.argv = ['node', 'script.js'];
|
|
737
753
|
const argv = await parseArguments({});
|
|
738
|
-
await loadCliConfig(settings,
|
|
754
|
+
await loadCliConfig(settings, 'test-session', argv);
|
|
739
755
|
expect(settings).toEqual(originalSettings);
|
|
740
756
|
});
|
|
741
757
|
});
|
|
@@ -747,6 +763,7 @@ describe('Approval mode tool exclusion logic', () => {
|
|
|
747
763
|
isTrusted: true,
|
|
748
764
|
source: undefined,
|
|
749
765
|
});
|
|
766
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
750
767
|
});
|
|
751
768
|
afterEach(() => {
|
|
752
769
|
process.stdin.isTTY = originalIsTTY;
|
|
@@ -755,8 +772,7 @@ describe('Approval mode tool exclusion logic', () => {
|
|
|
755
772
|
process.argv = ['node', 'script.js', '-p', 'test'];
|
|
756
773
|
const argv = await parseArguments({});
|
|
757
774
|
const settings = {};
|
|
758
|
-
const
|
|
759
|
-
const config = await loadCliConfig(settings, extensions, 'test-session', argv);
|
|
775
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
760
776
|
const excludedTools = config.getExcludeTools();
|
|
761
777
|
expect(excludedTools).toContain(SHELL_TOOL_NAME);
|
|
762
778
|
expect(excludedTools).toContain(EDIT_TOOL_NAME);
|
|
@@ -773,8 +789,7 @@ describe('Approval mode tool exclusion logic', () => {
|
|
|
773
789
|
];
|
|
774
790
|
const argv = await parseArguments({});
|
|
775
791
|
const settings = {};
|
|
776
|
-
const
|
|
777
|
-
const config = await loadCliConfig(settings, extensions, 'test-session', argv);
|
|
792
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
778
793
|
const excludedTools = config.getExcludeTools();
|
|
779
794
|
expect(excludedTools).toContain(SHELL_TOOL_NAME);
|
|
780
795
|
expect(excludedTools).toContain(EDIT_TOOL_NAME);
|
|
@@ -791,8 +806,7 @@ describe('Approval mode tool exclusion logic', () => {
|
|
|
791
806
|
];
|
|
792
807
|
const argv = await parseArguments({});
|
|
793
808
|
const settings = {};
|
|
794
|
-
const
|
|
795
|
-
const config = await loadCliConfig(settings, extensions, 'test-session', argv);
|
|
809
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
796
810
|
const excludedTools = config.getExcludeTools();
|
|
797
811
|
expect(excludedTools).toContain(SHELL_TOOL_NAME);
|
|
798
812
|
expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
|
|
@@ -809,8 +823,7 @@ describe('Approval mode tool exclusion logic', () => {
|
|
|
809
823
|
];
|
|
810
824
|
const argv = await parseArguments({});
|
|
811
825
|
const settings = {};
|
|
812
|
-
const
|
|
813
|
-
const config = await loadCliConfig(settings, extensions, 'test-session', argv);
|
|
826
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
814
827
|
const excludedTools = config.getExcludeTools();
|
|
815
828
|
expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
|
|
816
829
|
expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
|
|
@@ -820,8 +833,7 @@ describe('Approval mode tool exclusion logic', () => {
|
|
|
820
833
|
process.argv = ['node', 'script.js', '--yolo', '-p', 'test'];
|
|
821
834
|
const argv = await parseArguments({});
|
|
822
835
|
const settings = {};
|
|
823
|
-
const
|
|
824
|
-
const config = await loadCliConfig(settings, extensions, 'test-session', argv);
|
|
836
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
825
837
|
const excludedTools = config.getExcludeTools();
|
|
826
838
|
expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
|
|
827
839
|
expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
|
|
@@ -840,8 +852,7 @@ describe('Approval mode tool exclusion logic', () => {
|
|
|
840
852
|
process.argv = testCase.args;
|
|
841
853
|
const argv = await parseArguments({});
|
|
842
854
|
const settings = {};
|
|
843
|
-
const
|
|
844
|
-
const config = await loadCliConfig(settings, extensions, 'test-session', argv);
|
|
855
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
845
856
|
const excludedTools = config.getExcludeTools();
|
|
846
857
|
expect(excludedTools).not.toContain(SHELL_TOOL_NAME);
|
|
847
858
|
expect(excludedTools).not.toContain(EDIT_TOOL_NAME);
|
|
@@ -859,8 +870,7 @@ describe('Approval mode tool exclusion logic', () => {
|
|
|
859
870
|
];
|
|
860
871
|
const argv = await parseArguments({});
|
|
861
872
|
const settings = { tools: { exclude: ['custom_tool'] } };
|
|
862
|
-
const
|
|
863
|
-
const config = await loadCliConfig(settings, extensions, 'test-session', argv);
|
|
873
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
864
874
|
const excludedTools = config.getExcludeTools();
|
|
865
875
|
expect(excludedTools).toContain('custom_tool'); // From settings
|
|
866
876
|
expect(excludedTools).toContain(SHELL_TOOL_NAME); // From approval mode
|
|
@@ -875,8 +885,7 @@ describe('Approval mode tool exclusion logic', () => {
|
|
|
875
885
|
disableYoloMode: true,
|
|
876
886
|
},
|
|
877
887
|
};
|
|
878
|
-
|
|
879
|
-
await expect(loadCliConfig(settings, extensions, 'test-session', argv)).rejects.toThrow('Cannot start in YOLO mode when it is disabled by settings');
|
|
888
|
+
await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow('Cannot start in YOLO mode when it is disabled by settings');
|
|
880
889
|
});
|
|
881
890
|
it('should throw an error for invalid approval mode values in loadCliConfig', async () => {
|
|
882
891
|
// Create a mock argv with an invalid approval mode that bypasses argument parsing validation
|
|
@@ -887,19 +896,17 @@ describe('Approval mode tool exclusion logic', () => {
|
|
|
887
896
|
yolo: false,
|
|
888
897
|
};
|
|
889
898
|
const settings = {};
|
|
890
|
-
|
|
891
|
-
await expect(loadCliConfig(settings, extensions, 'test-session', invalidArgv)).rejects.toThrow('Invalid approval mode: invalid_mode. Valid values are: yolo, auto_edit, default');
|
|
899
|
+
await expect(loadCliConfig(settings, 'test-session', invalidArgv)).rejects.toThrow('Invalid approval mode: invalid_mode. Valid values are: yolo, auto_edit, default');
|
|
892
900
|
});
|
|
893
901
|
});
|
|
894
902
|
describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
895
|
-
const originalArgv = process.argv;
|
|
896
903
|
beforeEach(() => {
|
|
897
904
|
vi.resetAllMocks();
|
|
898
905
|
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
899
906
|
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
907
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
900
908
|
});
|
|
901
909
|
afterEach(() => {
|
|
902
|
-
process.argv = originalArgv;
|
|
903
910
|
vi.unstubAllEnvs();
|
|
904
911
|
vi.restoreAllMocks();
|
|
905
912
|
});
|
|
@@ -913,7 +920,7 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
913
920
|
it('should allow all MCP servers if the flag is not provided', async () => {
|
|
914
921
|
process.argv = ['node', 'script.js'];
|
|
915
922
|
const argv = await parseArguments({});
|
|
916
|
-
const config = await loadCliConfig(baseSettings,
|
|
923
|
+
const config = await loadCliConfig(baseSettings, 'test-session', argv);
|
|
917
924
|
expect(config.getMcpServers()).toEqual(baseSettings.mcpServers);
|
|
918
925
|
});
|
|
919
926
|
it('should allow only the specified MCP server', async () => {
|
|
@@ -924,7 +931,7 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
924
931
|
'server1',
|
|
925
932
|
];
|
|
926
933
|
const argv = await parseArguments({});
|
|
927
|
-
const config = await loadCliConfig(baseSettings,
|
|
934
|
+
const config = await loadCliConfig(baseSettings, 'test-session', argv);
|
|
928
935
|
expect(config.getMcpServers()).toEqual({
|
|
929
936
|
server1: { url: 'http://localhost:8080' },
|
|
930
937
|
});
|
|
@@ -939,7 +946,7 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
939
946
|
'server3',
|
|
940
947
|
];
|
|
941
948
|
const argv = await parseArguments({});
|
|
942
|
-
const config = await loadCliConfig(baseSettings,
|
|
949
|
+
const config = await loadCliConfig(baseSettings, 'test-session', argv);
|
|
943
950
|
expect(config.getMcpServers()).toEqual({
|
|
944
951
|
server1: { url: 'http://localhost:8080' },
|
|
945
952
|
server3: { url: 'http://localhost:8082' },
|
|
@@ -955,7 +962,7 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
955
962
|
'server4',
|
|
956
963
|
];
|
|
957
964
|
const argv = await parseArguments({});
|
|
958
|
-
const config = await loadCliConfig(baseSettings,
|
|
965
|
+
const config = await loadCliConfig(baseSettings, 'test-session', argv);
|
|
959
966
|
expect(config.getMcpServers()).toEqual({
|
|
960
967
|
server1: { url: 'http://localhost:8080' },
|
|
961
968
|
});
|
|
@@ -963,7 +970,7 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
963
970
|
it('should allow no MCP servers if the flag is provided but empty', async () => {
|
|
964
971
|
process.argv = ['node', 'script.js', '--allowed-mcp-server-names', ''];
|
|
965
972
|
const argv = await parseArguments({});
|
|
966
|
-
const config = await loadCliConfig(baseSettings,
|
|
973
|
+
const config = await loadCliConfig(baseSettings, 'test-session', argv);
|
|
967
974
|
expect(config.getMcpServers()).toEqual({});
|
|
968
975
|
});
|
|
969
976
|
it('should read allowMCPServers from settings', async () => {
|
|
@@ -973,7 +980,7 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
973
980
|
...baseSettings,
|
|
974
981
|
mcp: { allowed: ['server1', 'server2'] },
|
|
975
982
|
};
|
|
976
|
-
const config = await loadCliConfig(settings,
|
|
983
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
977
984
|
expect(config.getMcpServers()).toEqual({
|
|
978
985
|
server1: { url: 'http://localhost:8080' },
|
|
979
986
|
server2: { url: 'http://localhost:8081' },
|
|
@@ -986,7 +993,7 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
986
993
|
...baseSettings,
|
|
987
994
|
mcp: { excluded: ['server1', 'server2'] },
|
|
988
995
|
};
|
|
989
|
-
const config = await loadCliConfig(settings,
|
|
996
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
990
997
|
expect(config.getMcpServers()).toEqual({
|
|
991
998
|
server3: { url: 'http://localhost:8082' },
|
|
992
999
|
});
|
|
@@ -1001,7 +1008,7 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
1001
1008
|
allowed: ['server1', 'server2'],
|
|
1002
1009
|
},
|
|
1003
1010
|
};
|
|
1004
|
-
const config = await loadCliConfig(settings,
|
|
1011
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1005
1012
|
expect(config.getMcpServers()).toEqual({
|
|
1006
1013
|
server2: { url: 'http://localhost:8081' },
|
|
1007
1014
|
});
|
|
@@ -1021,7 +1028,7 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
1021
1028
|
allowed: ['server2'],
|
|
1022
1029
|
},
|
|
1023
1030
|
};
|
|
1024
|
-
const config = await loadCliConfig(settings,
|
|
1031
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1025
1032
|
expect(config.getMcpServers()).toEqual({
|
|
1026
1033
|
server1: { url: 'http://localhost:8080' },
|
|
1027
1034
|
});
|
|
@@ -1043,7 +1050,7 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
1043
1050
|
excluded: ['server3'], // Should be ignored
|
|
1044
1051
|
},
|
|
1045
1052
|
};
|
|
1046
|
-
const config = await loadCliConfig(settings,
|
|
1053
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1047
1054
|
expect(config.getMcpServers()).toEqual({
|
|
1048
1055
|
server2: { url: 'http://localhost:8081' },
|
|
1049
1056
|
server3: { url: 'http://localhost:8082' },
|
|
@@ -1051,6 +1058,12 @@ describe('loadCliConfig with allowed-mcp-server-names', () => {
|
|
|
1051
1058
|
});
|
|
1052
1059
|
});
|
|
1053
1060
|
describe('loadCliConfig model selection', () => {
|
|
1061
|
+
beforeEach(() => {
|
|
1062
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1063
|
+
});
|
|
1064
|
+
afterEach(() => {
|
|
1065
|
+
vi.resetAllMocks();
|
|
1066
|
+
});
|
|
1054
1067
|
it('selects a model from settings.json if provided', async () => {
|
|
1055
1068
|
process.argv = ['node', 'script.js'];
|
|
1056
1069
|
const argv = await parseArguments({});
|
|
@@ -1058,7 +1071,7 @@ describe('loadCliConfig model selection', () => {
|
|
|
1058
1071
|
model: {
|
|
1059
1072
|
name: 'gemini-2.5-pro',
|
|
1060
1073
|
},
|
|
1061
|
-
},
|
|
1074
|
+
}, 'test-session', argv);
|
|
1062
1075
|
expect(config.getModel()).toBe('gemini-2.5-pro');
|
|
1063
1076
|
});
|
|
1064
1077
|
it('uses the default gemini model if nothing is set', async () => {
|
|
@@ -1066,7 +1079,7 @@ describe('loadCliConfig model selection', () => {
|
|
|
1066
1079
|
const argv = await parseArguments({});
|
|
1067
1080
|
const config = await loadCliConfig({
|
|
1068
1081
|
// No model set.
|
|
1069
|
-
},
|
|
1082
|
+
}, 'test-session', argv);
|
|
1070
1083
|
expect(config.getModel()).toBe('auto');
|
|
1071
1084
|
});
|
|
1072
1085
|
it('always prefers model from argv', async () => {
|
|
@@ -1076,7 +1089,7 @@ describe('loadCliConfig model selection', () => {
|
|
|
1076
1089
|
model: {
|
|
1077
1090
|
name: 'gemini-2.5-pro',
|
|
1078
1091
|
},
|
|
1079
|
-
},
|
|
1092
|
+
}, 'test-session', argv);
|
|
1080
1093
|
expect(config.getModel()).toBe('gemini-2.5-flash-preview');
|
|
1081
1094
|
});
|
|
1082
1095
|
it('selects the model from argv if provided', async () => {
|
|
@@ -1084,11 +1097,17 @@ describe('loadCliConfig model selection', () => {
|
|
|
1084
1097
|
const argv = await parseArguments({});
|
|
1085
1098
|
const config = await loadCliConfig({
|
|
1086
1099
|
// No model provided via settings.
|
|
1087
|
-
},
|
|
1100
|
+
}, 'test-session', argv);
|
|
1088
1101
|
expect(config.getModel()).toBe('gemini-2.5-flash-preview');
|
|
1089
1102
|
});
|
|
1090
1103
|
});
|
|
1091
1104
|
describe('loadCliConfig model selection with model router', () => {
|
|
1105
|
+
beforeEach(() => {
|
|
1106
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1107
|
+
});
|
|
1108
|
+
afterEach(() => {
|
|
1109
|
+
vi.resetAllMocks();
|
|
1110
|
+
});
|
|
1092
1111
|
it('should use auto model when useModelRouter is true and no model is provided', async () => {
|
|
1093
1112
|
process.argv = ['node', 'script.js'];
|
|
1094
1113
|
const argv = await parseArguments({});
|
|
@@ -1096,7 +1115,7 @@ describe('loadCliConfig model selection with model router', () => {
|
|
|
1096
1115
|
experimental: {
|
|
1097
1116
|
useModelRouter: true,
|
|
1098
1117
|
},
|
|
1099
|
-
},
|
|
1118
|
+
}, 'test-session', argv);
|
|
1100
1119
|
expect(config.getModel()).toBe(DEFAULT_GEMINI_MODEL_AUTO);
|
|
1101
1120
|
});
|
|
1102
1121
|
it('should use default model when useModelRouter is false and no model is provided', async () => {
|
|
@@ -1106,7 +1125,7 @@ describe('loadCliConfig model selection with model router', () => {
|
|
|
1106
1125
|
experimental: {
|
|
1107
1126
|
useModelRouter: false,
|
|
1108
1127
|
},
|
|
1109
|
-
},
|
|
1128
|
+
}, 'test-session', argv);
|
|
1110
1129
|
expect(config.getModel()).toBe(DEFAULT_GEMINI_MODEL);
|
|
1111
1130
|
});
|
|
1112
1131
|
it('should prioritize argv over useModelRouter', async () => {
|
|
@@ -1116,7 +1135,7 @@ describe('loadCliConfig model selection with model router', () => {
|
|
|
1116
1135
|
experimental: {
|
|
1117
1136
|
useModelRouter: true,
|
|
1118
1137
|
},
|
|
1119
|
-
},
|
|
1138
|
+
}, 'test-session', argv);
|
|
1120
1139
|
expect(config.getModel()).toBe('gemini-from-argv');
|
|
1121
1140
|
});
|
|
1122
1141
|
it('should prioritize settings over useModelRouter', async () => {
|
|
@@ -1129,7 +1148,7 @@ describe('loadCliConfig model selection with model router', () => {
|
|
|
1129
1148
|
model: {
|
|
1130
1149
|
name: 'gemini-from-settings',
|
|
1131
1150
|
},
|
|
1132
|
-
},
|
|
1151
|
+
}, 'test-session', argv);
|
|
1133
1152
|
expect(config.getModel()).toBe('gemini-from-settings');
|
|
1134
1153
|
});
|
|
1135
1154
|
it('should prioritize environment variable over useModelRouter', async () => {
|
|
@@ -1140,19 +1159,18 @@ describe('loadCliConfig model selection with model router', () => {
|
|
|
1140
1159
|
experimental: {
|
|
1141
1160
|
useModelRouter: true,
|
|
1142
1161
|
},
|
|
1143
|
-
},
|
|
1162
|
+
}, 'test-session', argv);
|
|
1144
1163
|
expect(config.getModel()).toBe('gemini-from-env');
|
|
1145
1164
|
});
|
|
1146
1165
|
});
|
|
1147
1166
|
describe('loadCliConfig folderTrust', () => {
|
|
1148
|
-
const originalArgv = process.argv;
|
|
1149
1167
|
beforeEach(() => {
|
|
1150
1168
|
vi.resetAllMocks();
|
|
1151
1169
|
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1152
1170
|
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1171
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1153
1172
|
});
|
|
1154
1173
|
afterEach(() => {
|
|
1155
|
-
process.argv = originalArgv;
|
|
1156
1174
|
vi.unstubAllEnvs();
|
|
1157
1175
|
vi.restoreAllMocks();
|
|
1158
1176
|
});
|
|
@@ -1166,7 +1184,7 @@ describe('loadCliConfig folderTrust', () => {
|
|
|
1166
1184
|
},
|
|
1167
1185
|
};
|
|
1168
1186
|
const argv = await parseArguments({});
|
|
1169
|
-
const config = await loadCliConfig(settings,
|
|
1187
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1170
1188
|
expect(config.getFolderTrust()).toBe(false);
|
|
1171
1189
|
});
|
|
1172
1190
|
it('should be true when folderTrust is true', async () => {
|
|
@@ -1179,28 +1197,26 @@ describe('loadCliConfig folderTrust', () => {
|
|
|
1179
1197
|
},
|
|
1180
1198
|
},
|
|
1181
1199
|
};
|
|
1182
|
-
const config = await loadCliConfig(settings,
|
|
1200
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1183
1201
|
expect(config.getFolderTrust()).toBe(true);
|
|
1184
1202
|
});
|
|
1185
1203
|
it('should be false by default', async () => {
|
|
1186
1204
|
process.argv = ['node', 'script.js'];
|
|
1187
1205
|
const argv = await parseArguments({});
|
|
1188
1206
|
const settings = {};
|
|
1189
|
-
const config = await loadCliConfig(settings,
|
|
1207
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1190
1208
|
expect(config.getFolderTrust()).toBe(false);
|
|
1191
1209
|
});
|
|
1192
1210
|
});
|
|
1193
1211
|
describe('loadCliConfig with includeDirectories', () => {
|
|
1194
|
-
const originalArgv = process.argv;
|
|
1195
1212
|
beforeEach(() => {
|
|
1196
1213
|
vi.resetAllMocks();
|
|
1197
1214
|
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1198
1215
|
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1199
1216
|
vi.spyOn(process, 'cwd').mockReturnValue(path.resolve(path.sep, 'home', 'user', 'project'));
|
|
1217
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1200
1218
|
});
|
|
1201
1219
|
afterEach(() => {
|
|
1202
|
-
process.argv = originalArgv;
|
|
1203
|
-
vi.unstubAllEnvs();
|
|
1204
1220
|
vi.restoreAllMocks();
|
|
1205
1221
|
});
|
|
1206
1222
|
it('should combine and resolve paths from settings and CLI arguments', async () => {
|
|
@@ -1221,7 +1237,7 @@ describe('loadCliConfig with includeDirectories', () => {
|
|
|
1221
1237
|
],
|
|
1222
1238
|
},
|
|
1223
1239
|
};
|
|
1224
|
-
const config = await loadCliConfig(settings,
|
|
1240
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1225
1241
|
const expected = [
|
|
1226
1242
|
mockCwd,
|
|
1227
1243
|
path.resolve(path.sep, 'cli', 'path1'),
|
|
@@ -1234,50 +1250,44 @@ describe('loadCliConfig with includeDirectories', () => {
|
|
|
1234
1250
|
expect(config.getWorkspaceContext().getDirectories()).toHaveLength(expected.length);
|
|
1235
1251
|
});
|
|
1236
1252
|
});
|
|
1237
|
-
describe('loadCliConfig
|
|
1238
|
-
const originalArgv = process.argv;
|
|
1253
|
+
describe('loadCliConfig compressionThreshold', () => {
|
|
1239
1254
|
beforeEach(() => {
|
|
1240
1255
|
vi.resetAllMocks();
|
|
1241
1256
|
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1242
1257
|
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1258
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1243
1259
|
});
|
|
1244
1260
|
afterEach(() => {
|
|
1245
|
-
process.argv = originalArgv;
|
|
1246
1261
|
vi.unstubAllEnvs();
|
|
1247
1262
|
vi.restoreAllMocks();
|
|
1248
1263
|
});
|
|
1249
|
-
it('should pass
|
|
1264
|
+
it('should pass settings to the core config', async () => {
|
|
1250
1265
|
process.argv = ['node', 'script.js'];
|
|
1251
1266
|
const argv = await parseArguments({});
|
|
1252
1267
|
const settings = {
|
|
1253
1268
|
model: {
|
|
1254
|
-
|
|
1255
|
-
contextPercentageThreshold: 0.5,
|
|
1256
|
-
},
|
|
1269
|
+
compressionThreshold: 0.5,
|
|
1257
1270
|
},
|
|
1258
1271
|
};
|
|
1259
|
-
const config = await loadCliConfig(settings,
|
|
1260
|
-
expect(config.
|
|
1261
|
-
contextPercentageThreshold: 0.5,
|
|
1262
|
-
});
|
|
1272
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1273
|
+
expect(config.getCompressionThreshold()).toBe(0.5);
|
|
1263
1274
|
});
|
|
1264
|
-
it('should have undefined
|
|
1275
|
+
it('should have undefined compressionThreshold if not in settings', async () => {
|
|
1265
1276
|
process.argv = ['node', 'script.js'];
|
|
1266
1277
|
const argv = await parseArguments({});
|
|
1267
1278
|
const settings = {};
|
|
1268
|
-
const config = await loadCliConfig(settings,
|
|
1269
|
-
expect(config.
|
|
1279
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1280
|
+
expect(config.getCompressionThreshold()).toBeUndefined();
|
|
1270
1281
|
});
|
|
1271
1282
|
});
|
|
1272
1283
|
describe('loadCliConfig useRipgrep', () => {
|
|
1273
|
-
const originalArgv = process.argv;
|
|
1274
1284
|
beforeEach(() => {
|
|
1275
1285
|
vi.resetAllMocks();
|
|
1276
1286
|
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1277
1287
|
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1288
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1278
1289
|
});
|
|
1279
1290
|
afterEach(() => {
|
|
1280
|
-
process.argv = originalArgv;
|
|
1281
1291
|
vi.unstubAllEnvs();
|
|
1282
1292
|
vi.restoreAllMocks();
|
|
1283
1293
|
});
|
|
@@ -1285,21 +1295,21 @@ describe('loadCliConfig useRipgrep', () => {
|
|
|
1285
1295
|
process.argv = ['node', 'script.js'];
|
|
1286
1296
|
const argv = await parseArguments({});
|
|
1287
1297
|
const settings = {};
|
|
1288
|
-
const config = await loadCliConfig(settings,
|
|
1298
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1289
1299
|
expect(config.getUseRipgrep()).toBe(true);
|
|
1290
1300
|
});
|
|
1291
1301
|
it('should be false when useRipgrep is set to false in settings', async () => {
|
|
1292
1302
|
process.argv = ['node', 'script.js'];
|
|
1293
1303
|
const argv = await parseArguments({});
|
|
1294
1304
|
const settings = { tools: { useRipgrep: false } };
|
|
1295
|
-
const config = await loadCliConfig(settings,
|
|
1305
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1296
1306
|
expect(config.getUseRipgrep()).toBe(false);
|
|
1297
1307
|
});
|
|
1298
1308
|
it('should be true when useRipgrep is explicitly set to true in settings', async () => {
|
|
1299
1309
|
process.argv = ['node', 'script.js'];
|
|
1300
1310
|
const argv = await parseArguments({});
|
|
1301
1311
|
const settings = { tools: { useRipgrep: true } };
|
|
1302
|
-
const config = await loadCliConfig(settings,
|
|
1312
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1303
1313
|
expect(config.getUseRipgrep()).toBe(true);
|
|
1304
1314
|
});
|
|
1305
1315
|
describe('loadCliConfig useModelRouter', () => {
|
|
@@ -1307,34 +1317,33 @@ describe('loadCliConfig useRipgrep', () => {
|
|
|
1307
1317
|
process.argv = ['node', 'script.js'];
|
|
1308
1318
|
const argv = await parseArguments({});
|
|
1309
1319
|
const settings = {};
|
|
1310
|
-
const config = await loadCliConfig(settings,
|
|
1320
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1311
1321
|
expect(config.getUseModelRouter()).toBe(true);
|
|
1312
1322
|
});
|
|
1313
1323
|
it('should be true when useModelRouter is set to true in settings', async () => {
|
|
1314
1324
|
process.argv = ['node', 'script.js'];
|
|
1315
1325
|
const argv = await parseArguments({});
|
|
1316
1326
|
const settings = { experimental: { useModelRouter: true } };
|
|
1317
|
-
const config = await loadCliConfig(settings,
|
|
1327
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1318
1328
|
expect(config.getUseModelRouter()).toBe(true);
|
|
1319
1329
|
});
|
|
1320
1330
|
it('should be false when useModelRouter is explicitly set to false in settings', async () => {
|
|
1321
1331
|
process.argv = ['node', 'script.js'];
|
|
1322
1332
|
const argv = await parseArguments({});
|
|
1323
1333
|
const settings = { experimental: { useModelRouter: false } };
|
|
1324
|
-
const config = await loadCliConfig(settings,
|
|
1334
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1325
1335
|
expect(config.getUseModelRouter()).toBe(false);
|
|
1326
1336
|
});
|
|
1327
1337
|
});
|
|
1328
1338
|
});
|
|
1329
1339
|
describe('screenReader configuration', () => {
|
|
1330
|
-
const originalArgv = process.argv;
|
|
1331
1340
|
beforeEach(() => {
|
|
1332
1341
|
vi.resetAllMocks();
|
|
1333
1342
|
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1334
1343
|
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1344
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1335
1345
|
});
|
|
1336
1346
|
afterEach(() => {
|
|
1337
|
-
process.argv = originalArgv;
|
|
1338
1347
|
vi.unstubAllEnvs();
|
|
1339
1348
|
vi.restoreAllMocks();
|
|
1340
1349
|
});
|
|
@@ -1344,7 +1353,7 @@ describe('screenReader configuration', () => {
|
|
|
1344
1353
|
const settings = {
|
|
1345
1354
|
ui: { accessibility: { screenReader: true } },
|
|
1346
1355
|
};
|
|
1347
|
-
const config = await loadCliConfig(settings,
|
|
1356
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1348
1357
|
expect(config.getScreenReader()).toBe(true);
|
|
1349
1358
|
});
|
|
1350
1359
|
it('should use screenReader value from settings if CLI flag is not present (settings false)', async () => {
|
|
@@ -1353,7 +1362,7 @@ describe('screenReader configuration', () => {
|
|
|
1353
1362
|
const settings = {
|
|
1354
1363
|
ui: { accessibility: { screenReader: false } },
|
|
1355
1364
|
};
|
|
1356
|
-
const config = await loadCliConfig(settings,
|
|
1365
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1357
1366
|
expect(config.getScreenReader()).toBe(false);
|
|
1358
1367
|
});
|
|
1359
1368
|
it('should prioritize --screen-reader CLI flag (true) over settings (false)', async () => {
|
|
@@ -1362,19 +1371,18 @@ describe('screenReader configuration', () => {
|
|
|
1362
1371
|
const settings = {
|
|
1363
1372
|
ui: { accessibility: { screenReader: false } },
|
|
1364
1373
|
};
|
|
1365
|
-
const config = await loadCliConfig(settings,
|
|
1374
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1366
1375
|
expect(config.getScreenReader()).toBe(true);
|
|
1367
1376
|
});
|
|
1368
1377
|
it('should be false by default when no flag or setting is present', async () => {
|
|
1369
1378
|
process.argv = ['node', 'script.js'];
|
|
1370
1379
|
const argv = await parseArguments({});
|
|
1371
1380
|
const settings = {};
|
|
1372
|
-
const config = await loadCliConfig(settings,
|
|
1381
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1373
1382
|
expect(config.getScreenReader()).toBe(false);
|
|
1374
1383
|
});
|
|
1375
1384
|
});
|
|
1376
1385
|
describe('loadCliConfig tool exclusions', () => {
|
|
1377
|
-
const originalArgv = process.argv;
|
|
1378
1386
|
const originalIsTTY = process.stdin.isTTY;
|
|
1379
1387
|
beforeEach(() => {
|
|
1380
1388
|
vi.resetAllMocks();
|
|
@@ -1385,9 +1393,9 @@ describe('loadCliConfig tool exclusions', () => {
|
|
|
1385
1393
|
isTrusted: true,
|
|
1386
1394
|
source: undefined,
|
|
1387
1395
|
});
|
|
1396
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1388
1397
|
});
|
|
1389
1398
|
afterEach(() => {
|
|
1390
|
-
process.argv = originalArgv;
|
|
1391
1399
|
process.stdin.isTTY = originalIsTTY;
|
|
1392
1400
|
vi.unstubAllEnvs();
|
|
1393
1401
|
vi.restoreAllMocks();
|
|
@@ -1396,7 +1404,7 @@ describe('loadCliConfig tool exclusions', () => {
|
|
|
1396
1404
|
process.stdin.isTTY = true;
|
|
1397
1405
|
process.argv = ['node', 'script.js'];
|
|
1398
1406
|
const argv = await parseArguments({});
|
|
1399
|
-
const config = await loadCliConfig({},
|
|
1407
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1400
1408
|
expect(config.getExcludeTools()).not.toContain('run_shell_command');
|
|
1401
1409
|
expect(config.getExcludeTools()).not.toContain('replace');
|
|
1402
1410
|
expect(config.getExcludeTools()).not.toContain('write_file');
|
|
@@ -1405,7 +1413,7 @@ describe('loadCliConfig tool exclusions', () => {
|
|
|
1405
1413
|
process.stdin.isTTY = true;
|
|
1406
1414
|
process.argv = ['node', 'script.js', '--yolo'];
|
|
1407
1415
|
const argv = await parseArguments({});
|
|
1408
|
-
const config = await loadCliConfig({},
|
|
1416
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1409
1417
|
expect(config.getExcludeTools()).not.toContain('run_shell_command');
|
|
1410
1418
|
expect(config.getExcludeTools()).not.toContain('replace');
|
|
1411
1419
|
expect(config.getExcludeTools()).not.toContain('write_file');
|
|
@@ -1414,7 +1422,7 @@ describe('loadCliConfig tool exclusions', () => {
|
|
|
1414
1422
|
process.stdin.isTTY = false;
|
|
1415
1423
|
process.argv = ['node', 'script.js', '-p', 'test'];
|
|
1416
1424
|
const argv = await parseArguments({});
|
|
1417
|
-
const config = await loadCliConfig({},
|
|
1425
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1418
1426
|
expect(config.getExcludeTools()).toContain('run_shell_command');
|
|
1419
1427
|
expect(config.getExcludeTools()).toContain('replace');
|
|
1420
1428
|
expect(config.getExcludeTools()).toContain('write_file');
|
|
@@ -1423,7 +1431,7 @@ describe('loadCliConfig tool exclusions', () => {
|
|
|
1423
1431
|
process.stdin.isTTY = false;
|
|
1424
1432
|
process.argv = ['node', 'script.js', '-p', 'test', '--yolo'];
|
|
1425
1433
|
const argv = await parseArguments({});
|
|
1426
|
-
const config = await loadCliConfig({},
|
|
1434
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1427
1435
|
expect(config.getExcludeTools()).not.toContain('run_shell_command');
|
|
1428
1436
|
expect(config.getExcludeTools()).not.toContain('replace');
|
|
1429
1437
|
expect(config.getExcludeTools()).not.toContain('write_file');
|
|
@@ -1439,7 +1447,7 @@ describe('loadCliConfig tool exclusions', () => {
|
|
|
1439
1447
|
'ShellTool',
|
|
1440
1448
|
];
|
|
1441
1449
|
const argv = await parseArguments({});
|
|
1442
|
-
const config = await loadCliConfig({},
|
|
1450
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1443
1451
|
expect(config.getExcludeTools()).not.toContain(SHELL_TOOL_NAME);
|
|
1444
1452
|
});
|
|
1445
1453
|
it('should not exclude shell tool in non-interactive mode when --allowed-tools="run_shell_command" is set', async () => {
|
|
@@ -1453,7 +1461,7 @@ describe('loadCliConfig tool exclusions', () => {
|
|
|
1453
1461
|
'run_shell_command',
|
|
1454
1462
|
];
|
|
1455
1463
|
const argv = await parseArguments({});
|
|
1456
|
-
const config = await loadCliConfig({},
|
|
1464
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1457
1465
|
expect(config.getExcludeTools()).not.toContain(SHELL_TOOL_NAME);
|
|
1458
1466
|
});
|
|
1459
1467
|
it('should not exclude shell tool in non-interactive mode when --allowed-tools="ShellTool(wc)" is set', async () => {
|
|
@@ -1467,21 +1475,20 @@ describe('loadCliConfig tool exclusions', () => {
|
|
|
1467
1475
|
'ShellTool(wc)',
|
|
1468
1476
|
];
|
|
1469
1477
|
const argv = await parseArguments({});
|
|
1470
|
-
const config = await loadCliConfig({},
|
|
1478
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1471
1479
|
expect(config.getExcludeTools()).not.toContain(SHELL_TOOL_NAME);
|
|
1472
1480
|
});
|
|
1473
1481
|
});
|
|
1474
1482
|
describe('loadCliConfig interactive', () => {
|
|
1475
|
-
const originalArgv = process.argv;
|
|
1476
1483
|
const originalIsTTY = process.stdin.isTTY;
|
|
1477
1484
|
beforeEach(() => {
|
|
1478
1485
|
vi.resetAllMocks();
|
|
1479
1486
|
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1480
1487
|
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1481
1488
|
process.stdin.isTTY = true;
|
|
1489
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1482
1490
|
});
|
|
1483
1491
|
afterEach(() => {
|
|
1484
|
-
process.argv = originalArgv;
|
|
1485
1492
|
process.stdin.isTTY = originalIsTTY;
|
|
1486
1493
|
vi.unstubAllEnvs();
|
|
1487
1494
|
vi.restoreAllMocks();
|
|
@@ -1490,35 +1497,35 @@ describe('loadCliConfig interactive', () => {
|
|
|
1490
1497
|
process.stdin.isTTY = true;
|
|
1491
1498
|
process.argv = ['node', 'script.js'];
|
|
1492
1499
|
const argv = await parseArguments({});
|
|
1493
|
-
const config = await loadCliConfig({},
|
|
1500
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1494
1501
|
expect(config.isInteractive()).toBe(true);
|
|
1495
1502
|
});
|
|
1496
1503
|
it('should be interactive if prompt-interactive is set', async () => {
|
|
1497
1504
|
process.stdin.isTTY = false;
|
|
1498
1505
|
process.argv = ['node', 'script.js', '--prompt-interactive', 'test'];
|
|
1499
1506
|
const argv = await parseArguments({});
|
|
1500
|
-
const config = await loadCliConfig({},
|
|
1507
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1501
1508
|
expect(config.isInteractive()).toBe(true);
|
|
1502
1509
|
});
|
|
1503
1510
|
it('should not be interactive if not isTTY and no prompt', async () => {
|
|
1504
1511
|
process.stdin.isTTY = false;
|
|
1505
1512
|
process.argv = ['node', 'script.js'];
|
|
1506
1513
|
const argv = await parseArguments({});
|
|
1507
|
-
const config = await loadCliConfig({},
|
|
1514
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1508
1515
|
expect(config.isInteractive()).toBe(false);
|
|
1509
1516
|
});
|
|
1510
1517
|
it('should not be interactive if prompt is set', async () => {
|
|
1511
1518
|
process.stdin.isTTY = true;
|
|
1512
1519
|
process.argv = ['node', 'script.js', '--prompt', 'test'];
|
|
1513
1520
|
const argv = await parseArguments({});
|
|
1514
|
-
const config = await loadCliConfig({},
|
|
1521
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1515
1522
|
expect(config.isInteractive()).toBe(false);
|
|
1516
1523
|
});
|
|
1517
1524
|
it('should not be interactive if positional prompt words are provided with other flags', async () => {
|
|
1518
1525
|
process.stdin.isTTY = true;
|
|
1519
1526
|
process.argv = ['node', 'script.js', '--model', 'gemini-2.5-pro', 'Hello'];
|
|
1520
1527
|
const argv = await parseArguments({});
|
|
1521
|
-
const config = await loadCliConfig({},
|
|
1528
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1522
1529
|
expect(config.isInteractive()).toBe(false);
|
|
1523
1530
|
});
|
|
1524
1531
|
it('should not be interactive if positional prompt words are provided with multiple flags', async () => {
|
|
@@ -1532,7 +1539,7 @@ describe('loadCliConfig interactive', () => {
|
|
|
1532
1539
|
'Hello world',
|
|
1533
1540
|
];
|
|
1534
1541
|
const argv = await parseArguments({});
|
|
1535
|
-
const config = await loadCliConfig({},
|
|
1542
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1536
1543
|
expect(config.isInteractive()).toBe(false);
|
|
1537
1544
|
// Verify the question is preserved for one-shot execution
|
|
1538
1545
|
expect(argv.prompt).toBe('Hello world');
|
|
@@ -1542,7 +1549,7 @@ describe('loadCliConfig interactive', () => {
|
|
|
1542
1549
|
process.stdin.isTTY = true;
|
|
1543
1550
|
process.argv = ['node', 'script.js', '-e', 'none', 'hello'];
|
|
1544
1551
|
const argv = await parseArguments({});
|
|
1545
|
-
const config = await loadCliConfig({},
|
|
1552
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1546
1553
|
expect(config.isInteractive()).toBe(false);
|
|
1547
1554
|
expect(argv.query).toBe('hello');
|
|
1548
1555
|
expect(argv.extensions).toEqual(['none']);
|
|
@@ -1551,7 +1558,7 @@ describe('loadCliConfig interactive', () => {
|
|
|
1551
1558
|
process.stdin.isTTY = true;
|
|
1552
1559
|
process.argv = ['node', 'script.js', 'hello world how are you'];
|
|
1553
1560
|
const argv = await parseArguments({});
|
|
1554
|
-
const config = await loadCliConfig({},
|
|
1561
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1555
1562
|
expect(config.isInteractive()).toBe(false);
|
|
1556
1563
|
expect(argv.query).toBe('hello world how are you');
|
|
1557
1564
|
expect(argv.prompt).toBe('hello world how are you');
|
|
@@ -1571,7 +1578,7 @@ describe('loadCliConfig interactive', () => {
|
|
|
1571
1578
|
'array',
|
|
1572
1579
|
];
|
|
1573
1580
|
const argv = await parseArguments({});
|
|
1574
|
-
const config = await loadCliConfig({},
|
|
1581
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1575
1582
|
expect(config.isInteractive()).toBe(false);
|
|
1576
1583
|
expect(argv.query).toBe('write a function to sort array');
|
|
1577
1584
|
expect(argv.model).toBe('gemini-2.5-pro');
|
|
@@ -1580,7 +1587,7 @@ describe('loadCliConfig interactive', () => {
|
|
|
1580
1587
|
process.stdin.isTTY = true;
|
|
1581
1588
|
process.argv = ['node', 'script.js', ''];
|
|
1582
1589
|
const argv = await parseArguments({});
|
|
1583
|
-
const config = await loadCliConfig({},
|
|
1590
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1584
1591
|
expect(config.isInteractive()).toBe(true);
|
|
1585
1592
|
expect(argv.query).toBeUndefined();
|
|
1586
1593
|
});
|
|
@@ -1598,7 +1605,7 @@ describe('loadCliConfig interactive', () => {
|
|
|
1598
1605
|
'you',
|
|
1599
1606
|
];
|
|
1600
1607
|
const argv = await parseArguments({});
|
|
1601
|
-
const config = await loadCliConfig({},
|
|
1608
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1602
1609
|
expect(config.isInteractive()).toBe(false);
|
|
1603
1610
|
expect(argv.query).toBe('hello world how are you');
|
|
1604
1611
|
expect(argv.extensions).toEqual(['none']);
|
|
@@ -1607,7 +1614,7 @@ describe('loadCliConfig interactive', () => {
|
|
|
1607
1614
|
process.stdin.isTTY = true;
|
|
1608
1615
|
process.argv = ['node', 'script.js', '--model', 'gemini-2.5-pro'];
|
|
1609
1616
|
const argv = await parseArguments({});
|
|
1610
|
-
const config = await loadCliConfig({},
|
|
1617
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1611
1618
|
expect(config.isInteractive()).toBe(true);
|
|
1612
1619
|
});
|
|
1613
1620
|
});
|
|
@@ -1622,6 +1629,7 @@ describe('loadCliConfig approval mode', () => {
|
|
|
1622
1629
|
isTrusted: true,
|
|
1623
1630
|
source: undefined,
|
|
1624
1631
|
});
|
|
1632
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1625
1633
|
});
|
|
1626
1634
|
afterEach(() => {
|
|
1627
1635
|
process.argv = originalArgv;
|
|
@@ -1631,37 +1639,37 @@ describe('loadCliConfig approval mode', () => {
|
|
|
1631
1639
|
it('should default to DEFAULT approval mode when no flags are set', async () => {
|
|
1632
1640
|
process.argv = ['node', 'script.js'];
|
|
1633
1641
|
const argv = await parseArguments({});
|
|
1634
|
-
const config = await loadCliConfig({},
|
|
1642
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1635
1643
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1636
1644
|
});
|
|
1637
1645
|
it('should set YOLO approval mode when --yolo flag is used', async () => {
|
|
1638
1646
|
process.argv = ['node', 'script.js', '--yolo'];
|
|
1639
1647
|
const argv = await parseArguments({});
|
|
1640
|
-
const config = await loadCliConfig({},
|
|
1648
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1641
1649
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
|
|
1642
1650
|
});
|
|
1643
1651
|
it('should set YOLO approval mode when -y flag is used', async () => {
|
|
1644
1652
|
process.argv = ['node', 'script.js', '-y'];
|
|
1645
1653
|
const argv = await parseArguments({});
|
|
1646
|
-
const config = await loadCliConfig({},
|
|
1654
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1647
1655
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
|
|
1648
1656
|
});
|
|
1649
1657
|
it('should set DEFAULT approval mode when --approval-mode=default', async () => {
|
|
1650
1658
|
process.argv = ['node', 'script.js', '--approval-mode', 'default'];
|
|
1651
1659
|
const argv = await parseArguments({});
|
|
1652
|
-
const config = await loadCliConfig({},
|
|
1660
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1653
1661
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1654
1662
|
});
|
|
1655
1663
|
it('should set AUTO_EDIT approval mode when --approval-mode=auto_edit', async () => {
|
|
1656
1664
|
process.argv = ['node', 'script.js', '--approval-mode', 'auto_edit'];
|
|
1657
1665
|
const argv = await parseArguments({});
|
|
1658
|
-
const config = await loadCliConfig({},
|
|
1666
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1659
1667
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.AUTO_EDIT);
|
|
1660
1668
|
});
|
|
1661
1669
|
it('should set YOLO approval mode when --approval-mode=yolo', async () => {
|
|
1662
1670
|
process.argv = ['node', 'script.js', '--approval-mode', 'yolo'];
|
|
1663
1671
|
const argv = await parseArguments({});
|
|
1664
|
-
const config = await loadCliConfig({},
|
|
1672
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1665
1673
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
|
|
1666
1674
|
});
|
|
1667
1675
|
it('should prioritize --approval-mode over --yolo when both would be valid (but validation prevents this)', async () => {
|
|
@@ -1671,13 +1679,13 @@ describe('loadCliConfig approval mode', () => {
|
|
|
1671
1679
|
const argv = await parseArguments({});
|
|
1672
1680
|
// Manually set yolo to true to simulate what would happen if validation didn't prevent it
|
|
1673
1681
|
argv.yolo = true;
|
|
1674
|
-
const config = await loadCliConfig({},
|
|
1682
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1675
1683
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1676
1684
|
});
|
|
1677
1685
|
it('should fall back to --yolo behavior when --approval-mode is not set', async () => {
|
|
1678
1686
|
process.argv = ['node', 'script.js', '--yolo'];
|
|
1679
1687
|
const argv = await parseArguments({});
|
|
1680
|
-
const config = await loadCliConfig({},
|
|
1688
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1681
1689
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.YOLO);
|
|
1682
1690
|
});
|
|
1683
1691
|
// --- Untrusted Folder Scenarios ---
|
|
@@ -1691,25 +1699,25 @@ describe('loadCliConfig approval mode', () => {
|
|
|
1691
1699
|
it('should override --approval-mode=yolo to DEFAULT', async () => {
|
|
1692
1700
|
process.argv = ['node', 'script.js', '--approval-mode', 'yolo'];
|
|
1693
1701
|
const argv = await parseArguments({});
|
|
1694
|
-
const config = await loadCliConfig({},
|
|
1702
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1695
1703
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1696
1704
|
});
|
|
1697
1705
|
it('should override --approval-mode=auto_edit to DEFAULT', async () => {
|
|
1698
1706
|
process.argv = ['node', 'script.js', '--approval-mode', 'auto_edit'];
|
|
1699
1707
|
const argv = await parseArguments({});
|
|
1700
|
-
const config = await loadCliConfig({},
|
|
1708
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1701
1709
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1702
1710
|
});
|
|
1703
1711
|
it('should override --yolo flag to DEFAULT', async () => {
|
|
1704
1712
|
process.argv = ['node', 'script.js', '--yolo'];
|
|
1705
1713
|
const argv = await parseArguments({});
|
|
1706
|
-
const config = await loadCliConfig({},
|
|
1714
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1707
1715
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1708
1716
|
});
|
|
1709
1717
|
it('should remain DEFAULT when --approval-mode=default', async () => {
|
|
1710
1718
|
process.argv = ['node', 'script.js', '--approval-mode', 'default'];
|
|
1711
1719
|
const argv = await parseArguments({});
|
|
1712
|
-
const config = await loadCliConfig({},
|
|
1720
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1713
1721
|
expect(config.getApprovalMode()).toBe(ServerConfig.ApprovalMode.DEFAULT);
|
|
1714
1722
|
});
|
|
1715
1723
|
});
|
|
@@ -1721,6 +1729,7 @@ describe('loadCliConfig fileFiltering', () => {
|
|
|
1721
1729
|
vi.mocked(os.homedir).mockReturnValue('/mock/home/user');
|
|
1722
1730
|
vi.stubEnv('GEMINI_API_KEY', 'test-api-key');
|
|
1723
1731
|
process.argv = ['node', 'script.js']; // Reset argv for each test
|
|
1732
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1724
1733
|
});
|
|
1725
1734
|
afterEach(() => {
|
|
1726
1735
|
process.argv = originalArgv;
|
|
@@ -1776,33 +1785,39 @@ describe('loadCliConfig fileFiltering', () => {
|
|
|
1776
1785
|
},
|
|
1777
1786
|
};
|
|
1778
1787
|
const argv = await parseArguments(settings);
|
|
1779
|
-
const config = await loadCliConfig(settings,
|
|
1788
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1780
1789
|
expect(getter(config)).toBe(value);
|
|
1781
1790
|
});
|
|
1782
1791
|
});
|
|
1783
1792
|
describe('Output format', () => {
|
|
1793
|
+
beforeEach(() => {
|
|
1794
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1795
|
+
});
|
|
1796
|
+
afterEach(() => {
|
|
1797
|
+
vi.resetAllMocks();
|
|
1798
|
+
});
|
|
1784
1799
|
it('should default to TEXT', async () => {
|
|
1785
1800
|
process.argv = ['node', 'script.js'];
|
|
1786
1801
|
const argv = await parseArguments({});
|
|
1787
|
-
const config = await loadCliConfig({},
|
|
1802
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1788
1803
|
expect(config.getOutputFormat()).toBe(OutputFormat.TEXT);
|
|
1789
1804
|
});
|
|
1790
1805
|
it('should use the format from settings', async () => {
|
|
1791
1806
|
process.argv = ['node', 'script.js'];
|
|
1792
1807
|
const argv = await parseArguments({});
|
|
1793
|
-
const config = await loadCliConfig({ output: { format: OutputFormat.JSON } },
|
|
1808
|
+
const config = await loadCliConfig({ output: { format: OutputFormat.JSON } }, 'test-session', argv);
|
|
1794
1809
|
expect(config.getOutputFormat()).toBe(OutputFormat.JSON);
|
|
1795
1810
|
});
|
|
1796
1811
|
it('should prioritize the format from argv', async () => {
|
|
1797
1812
|
process.argv = ['node', 'script.js', '--output-format', 'json'];
|
|
1798
1813
|
const argv = await parseArguments({});
|
|
1799
|
-
const config = await loadCliConfig({ output: { format: OutputFormat.JSON } },
|
|
1814
|
+
const config = await loadCliConfig({ output: { format: OutputFormat.JSON } }, 'test-session', argv);
|
|
1800
1815
|
expect(config.getOutputFormat()).toBe(OutputFormat.JSON);
|
|
1801
1816
|
});
|
|
1802
1817
|
it('should accept stream-json as a valid output format', async () => {
|
|
1803
1818
|
process.argv = ['node', 'script.js', '--output-format', 'stream-json'];
|
|
1804
1819
|
const argv = await parseArguments({});
|
|
1805
|
-
const config = await loadCliConfig({},
|
|
1820
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1806
1821
|
expect(config.getOutputFormat()).toBe(OutputFormat.STREAM_JSON);
|
|
1807
1822
|
});
|
|
1808
1823
|
it('should error on invalid --output-format argument', async () => {
|
|
@@ -1868,12 +1883,18 @@ describe('parseArguments with positional prompt', () => {
|
|
|
1868
1883
|
});
|
|
1869
1884
|
});
|
|
1870
1885
|
describe('Telemetry configuration via environment variables', () => {
|
|
1886
|
+
beforeEach(() => {
|
|
1887
|
+
vi.spyOn(ExtensionManager.prototype, 'getExtensions').mockReturnValue([]);
|
|
1888
|
+
});
|
|
1889
|
+
afterEach(() => {
|
|
1890
|
+
vi.resetAllMocks();
|
|
1891
|
+
});
|
|
1871
1892
|
it('should prioritize GEMINI_TELEMETRY_ENABLED over settings', async () => {
|
|
1872
1893
|
vi.stubEnv('GEMINI_TELEMETRY_ENABLED', 'true');
|
|
1873
1894
|
process.argv = ['node', 'script.js'];
|
|
1874
1895
|
const argv = await parseArguments({});
|
|
1875
1896
|
const settings = { telemetry: { enabled: false } };
|
|
1876
|
-
const config = await loadCliConfig(settings,
|
|
1897
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1877
1898
|
expect(config.getTelemetryEnabled()).toBe(true);
|
|
1878
1899
|
});
|
|
1879
1900
|
it('should prioritize GEMINI_TELEMETRY_TARGET over settings', async () => {
|
|
@@ -1883,7 +1904,7 @@ describe('Telemetry configuration via environment variables', () => {
|
|
|
1883
1904
|
const settings = {
|
|
1884
1905
|
telemetry: { target: ServerConfig.TelemetryTarget.LOCAL },
|
|
1885
1906
|
};
|
|
1886
|
-
const config = await loadCliConfig(settings,
|
|
1907
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1887
1908
|
expect(config.getTelemetryTarget()).toBe('gcp');
|
|
1888
1909
|
});
|
|
1889
1910
|
it('should throw when GEMINI_TELEMETRY_TARGET is invalid', async () => {
|
|
@@ -1893,7 +1914,7 @@ describe('Telemetry configuration via environment variables', () => {
|
|
|
1893
1914
|
const settings = {
|
|
1894
1915
|
telemetry: { target: ServerConfig.TelemetryTarget.GCP },
|
|
1895
1916
|
};
|
|
1896
|
-
await expect(loadCliConfig(settings,
|
|
1917
|
+
await expect(loadCliConfig(settings, 'test-session', argv)).rejects.toThrow(/Invalid telemetry configuration: .*Invalid telemetry target/i);
|
|
1897
1918
|
vi.unstubAllEnvs();
|
|
1898
1919
|
});
|
|
1899
1920
|
it('should prioritize GEMINI_TELEMETRY_OTLP_ENDPOINT over settings and default env var', async () => {
|
|
@@ -1904,7 +1925,7 @@ describe('Telemetry configuration via environment variables', () => {
|
|
|
1904
1925
|
const settings = {
|
|
1905
1926
|
telemetry: { otlpEndpoint: 'http://settings.com' },
|
|
1906
1927
|
};
|
|
1907
|
-
const config = await loadCliConfig(settings,
|
|
1928
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1908
1929
|
expect(config.getTelemetryOtlpEndpoint()).toBe('http://gemini.env.com');
|
|
1909
1930
|
});
|
|
1910
1931
|
it('should prioritize GEMINI_TELEMETRY_OTLP_PROTOCOL over settings', async () => {
|
|
@@ -1912,7 +1933,7 @@ describe('Telemetry configuration via environment variables', () => {
|
|
|
1912
1933
|
process.argv = ['node', 'script.js'];
|
|
1913
1934
|
const argv = await parseArguments({});
|
|
1914
1935
|
const settings = { telemetry: { otlpProtocol: 'grpc' } };
|
|
1915
|
-
const config = await loadCliConfig(settings,
|
|
1936
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1916
1937
|
expect(config.getTelemetryOtlpProtocol()).toBe('http');
|
|
1917
1938
|
});
|
|
1918
1939
|
it('should prioritize GEMINI_TELEMETRY_LOG_PROMPTS over settings', async () => {
|
|
@@ -1920,7 +1941,7 @@ describe('Telemetry configuration via environment variables', () => {
|
|
|
1920
1941
|
process.argv = ['node', 'script.js'];
|
|
1921
1942
|
const argv = await parseArguments({});
|
|
1922
1943
|
const settings = { telemetry: { logPrompts: true } };
|
|
1923
|
-
const config = await loadCliConfig(settings,
|
|
1944
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1924
1945
|
expect(config.getTelemetryLogPromptsEnabled()).toBe(false);
|
|
1925
1946
|
});
|
|
1926
1947
|
it('should prioritize GEMINI_TELEMETRY_OUTFILE over settings', async () => {
|
|
@@ -1930,7 +1951,7 @@ describe('Telemetry configuration via environment variables', () => {
|
|
|
1930
1951
|
const settings = {
|
|
1931
1952
|
telemetry: { outfile: '/settings/telemetry.log' },
|
|
1932
1953
|
};
|
|
1933
|
-
const config = await loadCliConfig(settings,
|
|
1954
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1934
1955
|
expect(config.getTelemetryOutfile()).toBe('/gemini/env/telemetry.log');
|
|
1935
1956
|
});
|
|
1936
1957
|
it('should prioritize GEMINI_TELEMETRY_USE_COLLECTOR over settings', async () => {
|
|
@@ -1938,7 +1959,7 @@ describe('Telemetry configuration via environment variables', () => {
|
|
|
1938
1959
|
process.argv = ['node', 'script.js'];
|
|
1939
1960
|
const argv = await parseArguments({});
|
|
1940
1961
|
const settings = { telemetry: { useCollector: false } };
|
|
1941
|
-
const config = await loadCliConfig(settings,
|
|
1962
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1942
1963
|
expect(config.getTelemetryUseCollector()).toBe(true);
|
|
1943
1964
|
});
|
|
1944
1965
|
it('should use settings value when GEMINI_TELEMETRY_ENABLED is not set', async () => {
|
|
@@ -1946,7 +1967,7 @@ describe('Telemetry configuration via environment variables', () => {
|
|
|
1946
1967
|
process.argv = ['node', 'script.js'];
|
|
1947
1968
|
const argv = await parseArguments({});
|
|
1948
1969
|
const settings = { telemetry: { enabled: true } };
|
|
1949
|
-
const config = await loadCliConfig(settings,
|
|
1970
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1950
1971
|
expect(config.getTelemetryEnabled()).toBe(true);
|
|
1951
1972
|
});
|
|
1952
1973
|
it('should use settings value when GEMINI_TELEMETRY_TARGET is not set', async () => {
|
|
@@ -1956,35 +1977,35 @@ describe('Telemetry configuration via environment variables', () => {
|
|
|
1956
1977
|
const settings = {
|
|
1957
1978
|
telemetry: { target: ServerConfig.TelemetryTarget.LOCAL },
|
|
1958
1979
|
};
|
|
1959
|
-
const config = await loadCliConfig(settings,
|
|
1980
|
+
const config = await loadCliConfig(settings, 'test-session', argv);
|
|
1960
1981
|
expect(config.getTelemetryTarget()).toBe('local');
|
|
1961
1982
|
});
|
|
1962
1983
|
it("should treat GEMINI_TELEMETRY_ENABLED='1' as true", async () => {
|
|
1963
1984
|
vi.stubEnv('GEMINI_TELEMETRY_ENABLED', '1');
|
|
1964
1985
|
process.argv = ['node', 'script.js'];
|
|
1965
1986
|
const argv = await parseArguments({});
|
|
1966
|
-
const config = await loadCliConfig({},
|
|
1987
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1967
1988
|
expect(config.getTelemetryEnabled()).toBe(true);
|
|
1968
1989
|
});
|
|
1969
1990
|
it("should treat GEMINI_TELEMETRY_ENABLED='0' as false", async () => {
|
|
1970
1991
|
vi.stubEnv('GEMINI_TELEMETRY_ENABLED', '0');
|
|
1971
1992
|
process.argv = ['node', 'script.js'];
|
|
1972
1993
|
const argv = await parseArguments({});
|
|
1973
|
-
const config = await loadCliConfig({ telemetry: { enabled: true } },
|
|
1994
|
+
const config = await loadCliConfig({ telemetry: { enabled: true } }, 'test-session', argv);
|
|
1974
1995
|
expect(config.getTelemetryEnabled()).toBe(false);
|
|
1975
1996
|
});
|
|
1976
1997
|
it("should treat GEMINI_TELEMETRY_LOG_PROMPTS='1' as true", async () => {
|
|
1977
1998
|
vi.stubEnv('GEMINI_TELEMETRY_LOG_PROMPTS', '1');
|
|
1978
1999
|
process.argv = ['node', 'script.js'];
|
|
1979
2000
|
const argv = await parseArguments({});
|
|
1980
|
-
const config = await loadCliConfig({},
|
|
2001
|
+
const config = await loadCliConfig({}, 'test-session', argv);
|
|
1981
2002
|
expect(config.getTelemetryLogPromptsEnabled()).toBe(true);
|
|
1982
2003
|
});
|
|
1983
2004
|
it("should treat GEMINI_TELEMETRY_LOG_PROMPTS='false' as false", async () => {
|
|
1984
2005
|
vi.stubEnv('GEMINI_TELEMETRY_LOG_PROMPTS', 'false');
|
|
1985
2006
|
process.argv = ['node', 'script.js'];
|
|
1986
2007
|
const argv = await parseArguments({});
|
|
1987
|
-
const config = await loadCliConfig({ telemetry: { logPrompts: true } },
|
|
2008
|
+
const config = await loadCliConfig({ telemetry: { logPrompts: true } }, 'test-session', argv);
|
|
1988
2009
|
expect(config.getTelemetryLogPromptsEnabled()).toBe(false);
|
|
1989
2010
|
});
|
|
1990
2011
|
});
|