diff --git a/src/adapters/client-fingerprint.ts b/src/adapters/client-fingerprint.ts index 91a51ea39a..7d733a8591 100644 --- a/src/adapters/client-fingerprint.ts +++ b/src/adapters/client-fingerprint.ts @@ -45,8 +45,6 @@ export function claudeCodeSessionId(token: string | undefined): string { export const ANTIGRAVITY_IDE_VERSION = "2.5.5"; const ANTIGRAVITY_IDE_CLIENT_NAME = "aidev_client"; const ANTIGRAVITY_IDE_PLATFORM = "windows/amd64"; -/** Secondary Google API client UA the Antigravity client library reports. */ -export const ANTIGRAVITY_GOOG_API_CLIENT_UA = "google-api-nodejs-client/10.3.0"; /** * The real Antigravity IDE User-Agent, e.g. diff --git a/src/oauth/google-antigravity.ts b/src/oauth/google-antigravity.ts index 0b2d202a96..94baa74256 100644 --- a/src/oauth/google-antigravity.ts +++ b/src/oauth/google-antigravity.ts @@ -12,7 +12,7 @@ import { OAuthCallbackFlow, type OAuthCallbackFlowOptions } from "./callback-server"; import { generatePKCE } from "./pkce"; import type { OAuthController, OAuthCredentials } from "./types"; -import { antigravityUserAgent, ANTIGRAVITY_GOOG_API_CLIENT_UA } from "../adapters/client-fingerprint"; +import { ANTIGRAVITY_IDE_VERSION, antigravityUserAgent } from "../adapters/client-fingerprint"; const CLIENT_ID = process.env.GOOGLE_ANTIGRAVITY_CLIENT_ID || "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com"; @@ -110,8 +110,8 @@ async function onboardProject(accessToken: string, signal?: AbortSignal): Promis if (signal?.aborted) throw signal.reason ?? new Error("Antigravity onboarding aborted"); const response = await fetch(`${DAILY_API}/${API_VERSION}:onboardUser`, { method: "POST", - headers: { Authorization: `Bearer ${accessToken}`, Accept: "*/*", "Content-Type": "application/json", "User-Agent": antigravityUserAgent(), "x-goog-api-client": ANTIGRAVITY_GOOG_API_CLIENT_UA }, - body: JSON.stringify({ tier_id: "free-tier", metadata: { ide_type: "ANTIGRAVITY", ide_name: "antigravity", ide_version: antigravityUserAgent() } }), + headers: { Authorization: `Bearer ${accessToken}`, Accept: "*/*", "Content-Type": "application/json", "User-Agent": antigravityUserAgent() }, + body: JSON.stringify({ tier_id: "free-tier", metadata: { ide_type: "ANTIGRAVITY", ide_name: "antigravity", ide_version: ANTIGRAVITY_IDE_VERSION } }), signal: requestSignal(signal), }); if (!response.ok) { diff --git a/tests/client-fingerprint.test.ts b/tests/client-fingerprint.test.ts index 9e30d494ef..e760a49a88 100644 --- a/tests/client-fingerprint.test.ts +++ b/tests/client-fingerprint.test.ts @@ -1,7 +1,6 @@ import { describe, expect, test } from "bun:test"; import { ANTIGRAVITY_IDE_VERSION, - ANTIGRAVITY_GOOG_API_CLIENT_UA, CLAUDE_CODE_HEADERS, antigravityUserAgent, claudeCodeSessionId, @@ -42,10 +41,6 @@ describe("client fingerprint — helpers", () => { } }); - test("secondary google api client UA is pinned", async () => { - expect(ANTIGRAVITY_GOOG_API_CLIENT_UA).toMatch(/^google-api-nodejs-client\/[\d.]+$/); - }); - test("claude session id is a stable v4-shaped uuid per token", async () => { const a = claudeCodeSessionId("tok-abc"); const b = claudeCodeSessionId("tok-abc"); diff --git a/tests/google-antigravity-oauth.test.ts b/tests/google-antigravity-oauth.test.ts index 961f3c056f..f4fc3a1b0f 100644 --- a/tests/google-antigravity-oauth.test.ts +++ b/tests/google-antigravity-oauth.test.ts @@ -1,4 +1,5 @@ import { afterEach, describe, expect, spyOn, test } from "bun:test"; +import { ANTIGRAVITY_IDE_VERSION } from "../src/adapters/client-fingerprint"; import { discoverAntigravityProject, refreshAntigravityToken } from "../src/oauth/google-antigravity"; import { mkdirSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; @@ -37,7 +38,14 @@ describe("antigravity project discovery", () => { test("falls back to onboardUser poll loop (not-done then done)", async () => { let onboardCalls = 0; - routeFetch((url) => { + routeFetch((url, init) => { + if (url.includes(":onboardUser")) { + const headers = (init?.headers ?? {}) as Record; + expect(headers["x-goog-api-client"]).toBeUndefined(); + expect(headers["User-Agent"]).toMatch(/^antigravity\/ide\//); + const body = JSON.parse(String(init?.body ?? "{}")); + expect(body.metadata?.ide_version).toBe(ANTIGRAVITY_IDE_VERSION); + } if (url.includes(":loadCodeAssist")) return new Response(JSON.stringify({}), { status: 200 }); // no project if (url.includes(":onboardUser")) { onboardCalls++;