From 044c3a0e14f4da3bfbe58fbd7774fd76c3b23851 Mon Sep 17 00:00:00 2001 From: owenofbrien <86964623+owenofbrien@users.noreply.github.com> Date: Wed, 3 Sep 2025 04:58:47 -0500 Subject: [PATCH] Log config.useSmartEdit to Clearcut (#7617) --- .../cli/src/ui/hooks/useGeminiStream.test.tsx | 1 + .../cli/src/ui/hooks/useToolScheduler.test.ts | 1 + packages/core/src/core/client.test.ts | 1 + .../core/src/core/coreToolScheduler.test.ts | 9 +++++++ .../core/nonInteractiveToolExecutor.test.ts | 1 + .../clearcut-logger/clearcut-logger.test.ts | 24 +++++++++++++++++++ .../clearcut-logger/clearcut-logger.ts | 6 +++++ .../clearcut-logger/event-metadata-key.ts | 3 +++ 8 files changed, 46 insertions(+) diff --git a/packages/cli/src/ui/hooks/useGeminiStream.test.tsx b/packages/cli/src/ui/hooks/useGeminiStream.test.tsx index 0652d01e45..46869cf887 100644 --- a/packages/cli/src/ui/hooks/useGeminiStream.test.tsx +++ b/packages/cli/src/ui/hooks/useGeminiStream.test.tsx @@ -207,6 +207,7 @@ describe('useGeminiStream', () => { getContentGeneratorConfig: vi .fn() .mockReturnValue(contentGeneratorConfig), + getUseSmartEdit: () => false, } as unknown as Config; mockOnDebugMessage = vi.fn(); mockHandleSlashCommand = vi.fn().mockResolvedValue(false); diff --git a/packages/cli/src/ui/hooks/useToolScheduler.test.ts b/packages/cli/src/ui/hooks/useToolScheduler.test.ts index ad03b1ac64..3be6b13294 100644 --- a/packages/cli/src/ui/hooks/useToolScheduler.test.ts +++ b/packages/cli/src/ui/hooks/useToolScheduler.test.ts @@ -59,6 +59,7 @@ const mockConfig = { model: 'test-model', authType: 'oauth-personal', }), + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; diff --git a/packages/core/src/core/client.test.ts b/packages/core/src/core/client.test.ts index 4a9706c029..00d3b3e6d1 100644 --- a/packages/core/src/core/client.test.ts +++ b/packages/core/src/core/client.test.ts @@ -304,6 +304,7 @@ describe('Gemini Client (client.ts)', () => { setFallbackMode: vi.fn(), getChatCompression: vi.fn().mockReturnValue(undefined), getSkipNextSpeakerCheck: vi.fn().mockReturnValue(false), + getUseSmartEdit: vi.fn().mockReturnValue(false), getProjectRoot: vi.fn().mockReturnValue('/test/project/root'), storage: { getProjectTempDir: vi.fn().mockReturnValue('/test/temp'), diff --git a/packages/core/src/core/coreToolScheduler.test.ts b/packages/core/src/core/coreToolScheduler.test.ts index 55f6b9f0af..1bea8745e7 100644 --- a/packages/core/src/core/coreToolScheduler.test.ts +++ b/packages/core/src/core/coreToolScheduler.test.ts @@ -168,6 +168,7 @@ describe('CoreToolScheduler', () => { authType: 'oauth-personal', }), getToolRegistry: () => mockToolRegistry, + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; @@ -202,6 +203,7 @@ describe('CoreToolScheduler', () => { // Create mocked tool registry const mockConfig = { getToolRegistry: () => mockToolRegistry, + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; const mockToolRegistry = { @@ -267,6 +269,7 @@ describe('CoreToolScheduler with payload', () => { authType: 'oauth-personal', }), getToolRegistry: () => mockToolRegistry, + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; @@ -574,6 +577,7 @@ describe('CoreToolScheduler edit cancellation', () => { authType: 'oauth-personal', }), getToolRegistry: () => mockToolRegistry, + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; @@ -666,6 +670,7 @@ describe('CoreToolScheduler YOLO mode', () => { authType: 'oauth-personal', }), getToolRegistry: () => mockToolRegistry, + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; @@ -757,6 +762,7 @@ describe('CoreToolScheduler request queueing', () => { authType: 'oauth-personal', }), getToolRegistry: () => mockToolRegistry, + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; @@ -874,6 +880,7 @@ describe('CoreToolScheduler request queueing', () => { model: 'test-model', authType: 'oauth-personal', }), + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; @@ -955,6 +962,7 @@ describe('CoreToolScheduler request queueing', () => { authType: 'oauth-personal', }), getToolRegistry: () => mockToolRegistry, + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; @@ -1015,6 +1023,7 @@ describe('CoreToolScheduler request queueing', () => { setApprovalMode: (mode: ApprovalMode) => { approvalMode = mode; }, + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; diff --git a/packages/core/src/core/nonInteractiveToolExecutor.test.ts b/packages/core/src/core/nonInteractiveToolExecutor.test.ts index 698b72a9ad..24dcc1ac1b 100644 --- a/packages/core/src/core/nonInteractiveToolExecutor.test.ts +++ b/packages/core/src/core/nonInteractiveToolExecutor.test.ts @@ -41,6 +41,7 @@ describe('executeToolCall', () => { model: 'test-model', authType: 'oauth-personal', }), + getUseSmartEdit: () => false, getGeminiClient: () => null, // No client needed for these tests } as unknown as Config; diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts index 9cd740bead..366aa41618 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts @@ -27,6 +27,7 @@ import { UserPromptEvent, makeChatCompressionEvent } from '../types.js'; import { GIT_COMMIT_INFO, CLI_VERSION } from '../../generated/git-commit.js'; import { UserAccountManager } from '../../utils/userAccountManager.js'; import { InstallationManager } from '../../utils/installationManager.js'; +import { safeJsonStringify } from '../../utils/safeJsonStringify.js'; interface CustomMatchers { toHaveMetadataValue: ([key, value]: [EventMetadataKey, string]) => R; @@ -208,6 +209,7 @@ describe('ClearcutLogger', () => { const cli_version = CLI_VERSION; const git_commit_hash = GIT_COMMIT_INFO; const prompt_id = 'my-prompt-123'; + const user_settings = safeJsonStringify([{ smart_edit_enabled: false }]); // Setup logger with expected values const { logger, loggerConfig } = setup({ @@ -258,6 +260,10 @@ describe('ClearcutLogger', () => { gemini_cli_key: EventMetadataKey.GEMINI_CLI_OS, value: process.platform, }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_USER_SETTINGS, + value: user_settings, + }, ]), ); }); @@ -287,6 +293,24 @@ describe('ClearcutLogger', () => { }); }); + it('logs the value of config.useSmartEdit', () => { + const user_settings = safeJsonStringify([{ smart_edit_enabled: true }]); + + const { logger } = setup({ + config: { useSmartEdit: true }, + }); + + vi.stubEnv('TERM_PROGRAM', 'vscode'); + vi.stubEnv('SURFACE', 'ide-1234'); + + const event = logger?.createLogEvent(EventNames.TOOL_CALL, []); + + expect(event?.event_metadata[0]).toContainEqual({ + gemini_cli_key: EventMetadataKey.GEMINI_CLI_USER_SETTINGS, + value: user_settings, + }); + }); + it.each([ { env: { diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts index bbff163697..20ce4f8f3b 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts @@ -871,6 +871,12 @@ export class ClearcutLogger { gemini_cli_key: EventMetadataKey.GEMINI_CLI_NODE_VERSION, value: process.versions.node, }, + { + gemini_cli_key: EventMetadataKey.GEMINI_CLI_USER_SETTINGS, + value: safeJsonStringify([ + { smart_edit_enabled: this.config?.getUseSmartEdit() ?? false }, + ]), + }, ]; return [...data, ...defaultLogMetadata]; } diff --git a/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts b/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts index 4807b92451..31e718a466 100644 --- a/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts +++ b/packages/core/src/telemetry/clearcut-logger/event-metadata-key.ts @@ -166,6 +166,9 @@ export enum EventMetadataKey { // Logs the Gemini CLI OS GEMINI_CLI_OS = 82, + // Logs active user settings + GEMINI_CLI_USER_SETTINGS = 84, + // ========================================================================== // Loop Detected Event Keys // ===========================================================================