From 1d24f95a3f39a1bea69e7cb4fe06ab0eb4ddbe55 Mon Sep 17 00:00:00 2001 From: Dmytro Salnyk <156218623+dlynx13@users.noreply.github.com> Date: Tue, 30 Sep 2025 12:35:34 +0200 Subject: [PATCH] fix(telemetry): Improve Cloud Shell surface type detection for telemetry purposes (#10162) --- packages/core/src/ide/detect-ide.ts | 6 ++++- .../clearcut-logger/clearcut-logger.test.ts | 26 +++++++++++++++++++ .../clearcut-logger/clearcut-logger.ts | 8 +++++- 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/core/src/ide/detect-ide.ts b/packages/core/src/ide/detect-ide.ts index 637b98b735..1f3e805d04 100644 --- a/packages/core/src/ide/detect-ide.ts +++ b/packages/core/src/ide/detect-ide.ts @@ -21,6 +21,10 @@ export interface IdeInfo { displayName: string; } +export function isCloudShell(): boolean { + return !!(process.env['EDITOR_IN_CLOUD_SHELL'] || process.env['CLOUD_SHELL']); +} + export function detectIdeFromEnv(): IdeInfo { if (process.env['__COG_BASHRC_SOURCED']) { return IDE_DEFINITIONS.devin; @@ -34,7 +38,7 @@ export function detectIdeFromEnv(): IdeInfo { if (process.env['CODESPACES']) { return IDE_DEFINITIONS.codespaces; } - if (process.env['EDITOR_IN_CLOUD_SHELL'] || process.env['CLOUD_SHELL']) { + if (isCloudShell()) { return IDE_DEFINITIONS.cloudshell; } if (process.env['TERM_PRODUCT'] === 'Trae') { 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 0dcd531d21..ba9ffa7ce8 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.test.ts @@ -221,6 +221,32 @@ describe('ClearcutLogger', () => { }); }); + it('logs the current surface from Cloud Shell via EDITOR_IN_CLOUD_SHELL', () => { + const { logger } = setup({}); + + vi.stubEnv('EDITOR_IN_CLOUD_SHELL', 'true'); + + const event = logger?.createLogEvent(EventNames.CHAT_COMPRESSION, []); + + expect(event?.event_metadata[0]).toContainEqual({ + gemini_cli_key: EventMetadataKey.GEMINI_CLI_SURFACE, + value: 'cloudshell', + }); + }); + + it('logs the current surface from Cloud Shell via CLOUD_SHELL', () => { + const { logger } = setup({}); + + vi.stubEnv('CLOUD_SHELL', 'true'); + + const event = logger?.createLogEvent(EventNames.CHAT_COMPRESSION, []); + + expect(event?.event_metadata[0]).toContainEqual({ + gemini_cli_key: EventMetadataKey.GEMINI_CLI_SURFACE, + value: 'cloudshell', + }); + }); + it('logs default metadata', () => { // Define expected values const session_id = 'my-session-id'; diff --git a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts index 1ab4f56e16..2489ac9962 100644 --- a/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts +++ b/packages/core/src/telemetry/clearcut-logger/clearcut-logger.ts @@ -39,7 +39,11 @@ import { UserAccountManager } from '../../utils/userAccountManager.js'; import { safeJsonStringify } from '../../utils/safeJsonStringify.js'; import { FixedDeque } from 'mnemonist'; import { GIT_COMMIT_INFO, CLI_VERSION } from '../../generated/git-commit.js'; -import { IDE_DEFINITIONS, detectIdeFromEnv } from '../../ide/detect-ide.js'; +import { + IDE_DEFINITIONS, + detectIdeFromEnv, + isCloudShell, +} from '../../ide/detect-ide.js'; export enum EventNames { START_SESSION = 'start_session', @@ -114,6 +118,8 @@ export interface LogRequest { function determineSurface(): string { if (process.env['SURFACE']) { return process.env['SURFACE']; + } else if (isCloudShell()) { + return IDE_DEFINITIONS.cloudshell.name; } else if (process.env['GITHUB_SHA']) { return 'GitHub'; } else if (process.env['TERM_PROGRAM'] === 'vscode') {