diff --git a/packages/cli/src/config/config.test.ts b/packages/cli/src/config/config.test.ts index 778d30fe56..ef55b9f554 100644 --- a/packages/cli/src/config/config.test.ts +++ b/packages/cli/src/config/config.test.ts @@ -301,22 +301,14 @@ describe('parseArguments', () => { expect(argv.promptInteractive).toBeUndefined(); }); - it('should map @path to prompt with ambient flags (debug, telemetry)', async () => { - // Ambient flags like debug, telemetry should NOT affect routing - process.argv = [ - 'node', - 'script.js', - '@path', - './file.md', - '--debug', - '--telemetry', - ]; + it('should map @path to prompt with ambient flags (debug)', async () => { + // Ambient flags like debug should NOT affect routing + process.argv = ['node', 'script.js', '@path', './file.md', '--debug']; const argv = await parseArguments({} as Settings); expect(argv.query).toBe('@path ./file.md'); expect(argv.prompt).toBe('@path ./file.md'); // Should map to one-shot expect(argv.promptInteractive).toBeUndefined(); expect(argv.debug).toBe(true); - expect(argv.telemetry).toBe(true); }); it('should map any @command to prompt (one-shot)', async () => { @@ -472,12 +464,12 @@ describe('parseArguments', () => { process.argv = [ 'node', 'script.js', - '--telemetry-target', - 'gcp', + '--model', + 'test-model-string', 'my-positional-arg', ]; const argv = await parseArguments({} as Settings); - expect(argv.telemetryTarget).toBe('gcp'); + expect(argv.model).toBe('test-model-string'); expect(argv.query).toBe('my-positional-arg'); }); @@ -721,413 +713,6 @@ describe('loadCliConfig', () => { }); }); -describe('loadCliConfig telemetry', () => { - const originalArgv = process.argv; - - beforeEach(() => { - vi.resetAllMocks(); - vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); - }); - - afterEach(() => { - process.argv = originalArgv; - vi.unstubAllEnvs(); - vi.restoreAllMocks(); - }); - - it('should set telemetry to false by default when no flag or setting is present', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = {}; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryEnabled()).toBe(false); - }); - - it('should set telemetry to true when --telemetry flag is present', async () => { - process.argv = ['node', 'script.js', '--telemetry']; - const argv = await parseArguments({} as Settings); - const settings: Settings = {}; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryEnabled()).toBe(true); - }); - - it('should set telemetry to false when --no-telemetry flag is present', async () => { - process.argv = ['node', 'script.js', '--no-telemetry']; - const argv = await parseArguments({} as Settings); - const settings: Settings = {}; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryEnabled()).toBe(false); - }); - - it('should use telemetry value from settings if CLI flag is not present (settings true)', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { enabled: true } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryEnabled()).toBe(true); - }); - - it('should use telemetry value from settings if CLI flag is not present (settings false)', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { enabled: false } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryEnabled()).toBe(false); - }); - - it('should prioritize --telemetry CLI flag (true) over settings (false)', async () => { - process.argv = ['node', 'script.js', '--telemetry']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { enabled: false } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryEnabled()).toBe(true); - }); - - it('should prioritize --no-telemetry CLI flag (false) over settings (true)', async () => { - process.argv = ['node', 'script.js', '--no-telemetry']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { enabled: true } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryEnabled()).toBe(false); - }); - - it('should use telemetry OTLP endpoint from settings if CLI flag is not present', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { - telemetry: { otlpEndpoint: 'http://settings.example.com' }, - }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryOtlpEndpoint()).toBe( - 'http://settings.example.com', - ); - }); - - it('should prioritize --telemetry-otlp-endpoint CLI flag over settings', async () => { - process.argv = [ - 'node', - 'script.js', - '--telemetry-otlp-endpoint', - 'http://cli.example.com', - ]; - const argv = await parseArguments({} as Settings); - const settings: Settings = { - telemetry: { otlpEndpoint: 'http://settings.example.com' }, - }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryOtlpEndpoint()).toBe('http://cli.example.com'); - }); - - it('should use default endpoint if no OTLP endpoint is provided via CLI or settings', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { enabled: true } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryOtlpEndpoint()).toBe('http://localhost:4317'); - }); - - it('should use telemetry target from settings if CLI flag is not present', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { - telemetry: { target: ServerConfig.DEFAULT_TELEMETRY_TARGET }, - }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryTarget()).toBe( - ServerConfig.DEFAULT_TELEMETRY_TARGET, - ); - }); - - it('should prioritize --telemetry-target CLI flag over settings', async () => { - process.argv = ['node', 'script.js', '--telemetry-target', 'gcp']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { - telemetry: { target: ServerConfig.DEFAULT_TELEMETRY_TARGET }, - }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryTarget()).toBe('gcp'); - }); - - it('should use default target if no target is provided via CLI or settings', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { enabled: true } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryTarget()).toBe( - ServerConfig.DEFAULT_TELEMETRY_TARGET, - ); - }); - - it('should use telemetry log prompts from settings if CLI flag is not present', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { logPrompts: false } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryLogPromptsEnabled()).toBe(false); - }); - - it('should prioritize --telemetry-log-prompts CLI flag (true) over settings (false)', async () => { - process.argv = ['node', 'script.js', '--telemetry-log-prompts']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { logPrompts: false } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryLogPromptsEnabled()).toBe(true); - }); - - it('should prioritize --no-telemetry-log-prompts CLI flag (false) over settings (true)', async () => { - process.argv = ['node', 'script.js', '--no-telemetry-log-prompts']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { logPrompts: true } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryLogPromptsEnabled()).toBe(false); - }); - - it('should use default log prompts (true) if no value is provided via CLI or settings', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { enabled: true } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryLogPromptsEnabled()).toBe(true); - }); - - it('should use telemetry OTLP protocol from settings if CLI flag is not present', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { - telemetry: { otlpProtocol: 'http' }, - }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryOtlpProtocol()).toBe('http'); - }); - - it('should prioritize --telemetry-otlp-protocol CLI flag over settings', async () => { - process.argv = ['node', 'script.js', '--telemetry-otlp-protocol', 'http']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { - telemetry: { otlpProtocol: 'grpc' }, - }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryOtlpProtocol()).toBe('http'); - }); - - it('should use default protocol if no OTLP protocol is provided via CLI or settings', async () => { - process.argv = ['node', 'script.js']; - const argv = await parseArguments({} as Settings); - const settings: Settings = { telemetry: { enabled: true } }; - const config = await loadCliConfig( - settings, - [], - new ExtensionEnablementManager( - ExtensionStorage.getUserExtensionsDir(), - argv.extensions, - ), - 'test-session', - argv, - ); - expect(config.getTelemetryOtlpProtocol()).toBe('grpc'); - }); - - it('should reject invalid --telemetry-otlp-protocol values', async () => { - process.argv = [ - 'node', - 'script.js', - '--telemetry-otlp-protocol', - 'invalid', - ]; - - const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => { - throw new Error('process.exit called'); - }); - - const mockConsoleError = vi - .spyOn(console, 'error') - .mockImplementation(() => {}); - - await expect(parseArguments({} as Settings)).rejects.toThrow( - 'process.exit called', - ); - - expect(mockConsoleError).toHaveBeenCalledWith( - expect.stringContaining('Invalid values:'), - ); - - mockExit.mockRestore(); - mockConsoleError.mockRestore(); - }); -}); - describe('Hierarchical Memory Loading (config.ts) - Placeholder Suite', () => { beforeEach(() => { vi.resetAllMocks(); diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index 589eb77506..accc621a6f 100755 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -70,13 +70,7 @@ export interface CliArgs { showMemoryUsage: boolean | undefined; yolo: boolean | undefined; approvalMode: string | undefined; - telemetry: boolean | undefined; checkpointing: boolean | undefined; - telemetryTarget: string | undefined; - telemetryOtlpEndpoint: string | undefined; - telemetryOtlpProtocol: string | undefined; - telemetryLogPrompts: boolean | undefined; - telemetryOutfile: string | undefined; allowedMcpServerNames: string[] | undefined; allowedTools: string[] | undefined; experimentalAcp: boolean | undefined; @@ -98,65 +92,7 @@ export async function parseArguments(settings: Settings): Promise { .usage( 'Usage: gemini [options] [command]\n\nGemini CLI - Launch an interactive CLI, use -p/--prompt for non-interactive mode', ) - .option('telemetry', { - type: 'boolean', - description: - 'Enable telemetry? This flag specifically controls if telemetry is sent. Other --telemetry-* flags set specific values but do not enable telemetry on their own.', - }) - .option('telemetry-target', { - type: 'string', - nargs: 1, - choices: ['local', 'gcp'], - description: - 'Set the telemetry target (local or gcp). Overrides settings files.', - }) - .option('telemetry-otlp-endpoint', { - type: 'string', - nargs: 1, - description: - 'Set the OTLP endpoint for telemetry. Overrides environment variables and settings files.', - }) - .option('telemetry-otlp-protocol', { - type: 'string', - nargs: 1, - choices: ['grpc', 'http'], - description: - 'Set the OTLP protocol for telemetry (grpc or http). Overrides settings files.', - }) - .option('telemetry-log-prompts', { - type: 'boolean', - description: - 'Enable or disable logging of user prompts for telemetry. Overrides settings files.', - }) - .option('telemetry-outfile', { - type: 'string', - nargs: 1, - description: 'Redirect all telemetry output to the specified file.', - }) - .deprecateOption( - 'telemetry', - 'Use the "telemetry.enabled" setting in settings.json instead. This flag will be removed in a future version.', - ) - .deprecateOption( - 'telemetry-target', - 'Use the "telemetry.target" setting in settings.json instead. This flag will be removed in a future version.', - ) - .deprecateOption( - 'telemetry-otlp-endpoint', - 'Use the "telemetry.otlpEndpoint" setting in settings.json instead. This flag will be removed in a future version.', - ) - .deprecateOption( - 'telemetry-otlp-protocol', - 'Use the "telemetry.otlpProtocol" setting in settings.json instead. This flag will be removed in a future version.', - ) - .deprecateOption( - 'telemetry-log-prompts', - 'Use the "telemetry.logPrompts" setting in settings.json instead. This flag will be removed in a future version.', - ) - .deprecateOption( - 'telemetry-outfile', - 'Use the "telemetry.outfile" setting in settings.json instead. This flag will be removed in a future version.', - ) + .option('debug', { alias: 'd', type: 'boolean', @@ -585,7 +521,6 @@ export async function loadCliConfig( let telemetrySettings; try { telemetrySettings = await resolveTelemetrySettings({ - argv, env: process.env as unknown as Record, settings: settings.telemetry, }); diff --git a/packages/cli/src/gemini.test.tsx b/packages/cli/src/gemini.test.tsx index d5ccdeef03..65779d263d 100644 --- a/packages/cli/src/gemini.test.tsx +++ b/packages/cli/src/gemini.test.tsx @@ -323,13 +323,7 @@ describe('gemini.tsx main function kitty protocol', () => { showMemoryUsage: undefined, yolo: undefined, approvalMode: undefined, - telemetry: undefined, checkpointing: undefined, - telemetryTarget: undefined, - telemetryOtlpEndpoint: undefined, - telemetryOtlpProtocol: undefined, - telemetryLogPrompts: undefined, - telemetryOutfile: undefined, allowedMcpServerNames: undefined, allowedTools: undefined, experimentalAcp: undefined,