diff --git a/src/apiv2.ts b/src/apiv2.ts index 54cae61a8e5..274e49d681f 100644 --- a/src/apiv2.ts +++ b/src/apiv2.ts @@ -9,6 +9,7 @@ import util from "util"; import * as auth from "./auth"; import { FirebaseError } from "./error"; +import { isFirebaseMcp, detectAIAgent } from "./env"; import { logger } from "./logger"; import { responseToError } from "./responseToError"; import * as FormData from "form-data"; @@ -18,10 +19,15 @@ import * as FormData from "form-data"; const pkg = require("../package.json"); const CLI_VERSION: string = pkg.version; +const agent = detectAIAgent(); +const agentStr = agent === "unknown" ? "None" : agent; +const platform = isFirebaseMcp() ? "FirebaseMCP" : "FirebaseCLI"; +const clientVersion = `${platform}/${CLI_VERSION}/${agentStr}`; + export const STANDARD_HEADERS: Record = { Connection: "keep-alive", - "User-Agent": `FirebaseCLI/${CLI_VERSION}`, - "X-Client-Version": `FirebaseCLI/${CLI_VERSION}`, + "User-Agent": clientVersion, + "X-Client-Version": clientVersion, }; const GOOG_QUOTA_USER_HEADER = "x-goog-quota-user"; diff --git a/src/env.ts b/src/env.ts index 637dfb7084d..70014af79a7 100644 --- a/src/env.ts +++ b/src/env.ts @@ -11,3 +11,15 @@ export function isFirebaseStudio() { export function isFirebaseMcp() { return !!process.env.IS_FIREBASE_MCP; } + +// Detect if the CLI was invoked by a coding agent, based on well-known env vars. +export function detectAIAgent(): string { + if (process.env.ANTIGRAVITY_CLI_ALIAS) return "antigravity"; + if (process.env.CLAUDECODE) return "claude_code"; + if (process.env.CLINE_ACTIVE) return "cline"; + if (process.env.CODEX_SANDBOX) return "codex_cli"; + if (process.env.CURSOR_AGENT) return "cursor"; + if (process.env.GEMINI_CLI) return "gemini_cli"; + if (process.env.OPENCODE) return "open_code"; + return "unknown"; +} diff --git a/src/track.ts b/src/track.ts index 02b12fff6dd..8cf745bf627 100644 --- a/src/track.ts +++ b/src/track.ts @@ -4,20 +4,9 @@ import { getGlobalDefaultAccount } from "./auth"; import { configstore } from "./configstore"; import { logger } from "./logger"; -import { isFirebaseStudio } from "./env"; +import { isFirebaseStudio, detectAIAgent } from "./env"; const pkg = require("../package.json"); -// Detect if the CLI was invoked by a coding agent, based on well-known env vars. -function detectAIAgent(): string { - if (process.env.CLAUDECODE) return "claude_code"; - if (process.env.CLINE_ACTIVE) return "cline"; - if (process.env.CODEX_SANDBOX) return "codex_cli"; - if (process.env.CURSOR_AGENT) return "cursor"; - if (process.env.GEMINI_CLI) return "gemini_cli"; - if (process.env.OPENCODE) return "open_code"; - return "unknown"; -} - type cliEventNames = | "command_execution" | "product_deploy"