diff --git a/open-sse/config/appConstants.js b/open-sse/config/appConstants.js index 62e2f888..5ddf95ac 100644 --- a/open-sse/config/appConstants.js +++ b/open-sse/config/appConstants.js @@ -156,6 +156,13 @@ export const LOAD_CODE_ASSIST_HEADERS = { "Client-Metadata": JSON.stringify({ ideType: IDE_TYPE.ANTIGRAVITY, platform: getPlatformEnum(), pluginType: PLUGIN_TYPE.GEMINI }), }; +// Real Antigravity IDE doesn't send X-Goog-Api-Client/Client-Metadata on loadCodeAssist/onboardUser — +// Google's backend fingerprints those and silently refuses to provision a cloudaicompanionProject. +export const ANTIGRAVITY_LOAD_CODE_ASSIST_HEADERS = { + "Content-Type": "application/json", + "User-Agent": ANTIGRAVITY_IDE_USER_AGENT, +}; + export const LOAD_CODE_ASSIST_METADATA = { ideType: IDE_TYPE.ANTIGRAVITY, platform: getPlatformEnum(), diff --git a/open-sse/providers/registry/antigravity.js b/open-sse/providers/registry/antigravity.js index a4ca7346..1a7c4347 100644 --- a/open-sse/providers/registry/antigravity.js +++ b/open-sse/providers/registry/antigravity.js @@ -76,8 +76,7 @@ export default { apiVersion: "v1internal", loadCodeAssistEndpoint: "https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist", onboardUserEndpoint: "https://cloudcode-pa.googleapis.com/v1internal:onboardUser", - loadCodeAssistUserAgent: "google-api-nodejs-client/9.15.1", - loadCodeAssistApiClient: "google-cloud-sdk vscode_cloudshelleditor/0.1", + loadCodeAssistUserAgent: ANTIGRAVITY_IDE_USER_AGENT, refreshLeadMs: 300000, }, features: { diff --git a/open-sse/services/projectId.js b/open-sse/services/projectId.js index 3801ac69..84ab5a2b 100644 --- a/open-sse/services/projectId.js +++ b/open-sse/services/projectId.js @@ -7,7 +7,7 @@ * This significantly reduces the risk of being flagged by Google's anti-abuse systems. */ -import { CLOUD_CODE_API, LOAD_CODE_ASSIST_HEADERS, LOAD_CODE_ASSIST_METADATA } from "../config/appConstants.js"; +import { CLOUD_CODE_API, LOAD_CODE_ASSIST_HEADERS, ANTIGRAVITY_LOAD_CODE_ASSIST_HEADERS, LOAD_CODE_ASSIST_METADATA } from "../config/appConstants.js"; // ─── Cache ──────────────────────────────────────────────────────────────────── // connectionId -> { projectId: string, fetchedAt: number } @@ -157,9 +157,10 @@ export function removeConnection(connectionId) { */ async function fetchProjectId(accessToken, signal, provider) { const endpoints = CLOUD_CODE_API[provider] || CLOUD_CODE_API["gemini-cli"]; + const headers = provider === "antigravity" ? ANTIGRAVITY_LOAD_CODE_ASSIST_HEADERS : LOAD_CODE_ASSIST_HEADERS; const response = await fetch(endpoints.loadCodeAssist, { method: "POST", - headers: { ...LOAD_CODE_ASSIST_HEADERS, "Authorization": `Bearer ${accessToken}` }, + headers: { ...headers, "Authorization": `Bearer ${accessToken}` }, body: JSON.stringify({ metadata: LOAD_CODE_ASSIST_METADATA }), signal }); @@ -186,7 +187,7 @@ async function fetchProjectId(accessToken, signal, provider) { } } - return onboardUser(accessToken, tierID, signal, endpoints); + return onboardUser(accessToken, tierID, signal, endpoints, provider); } /** @@ -197,10 +198,11 @@ async function fetchProjectId(accessToken, signal, provider) { * @param {AbortSignal} externalSignal – propagated from the connection's AbortController * @returns {Promise} */ -async function onboardUser(accessToken, tierID, externalSignal, endpoints) { +async function onboardUser(accessToken, tierID, externalSignal, endpoints, provider) { console.log(`[ProjectId] Onboarding user with tier: ${tierID}`); const reqBody = { tierId: tierID, metadata: LOAD_CODE_ASSIST_METADATA }; + const headers = provider === "antigravity" ? ANTIGRAVITY_LOAD_CODE_ASSIST_HEADERS : LOAD_CODE_ASSIST_HEADERS; const MAX_ATTEMPTS = 5; for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) { @@ -216,7 +218,7 @@ async function onboardUser(accessToken, tierID, externalSignal, endpoints) { try { const response = await fetch(endpoints.onboardUser, { method: "POST", - headers: { ...LOAD_CODE_ASSIST_HEADERS, "Authorization": `Bearer ${accessToken}` }, + headers: { ...headers, "Authorization": `Bearer ${accessToken}` }, body: JSON.stringify(reqBody), signal: localCtrl.signal }); diff --git a/src/lib/oauth/providers/antigravity.js b/src/lib/oauth/providers/antigravity.js index 6cf28e81..10453ad8 100644 --- a/src/lib/oauth/providers/antigravity.js +++ b/src/lib/oauth/providers/antigravity.js @@ -39,13 +39,10 @@ const antigravity = { return await response.json(); }, postExchange: async (tokens) => { - // Numeric enums matching Antigravity binary ClientMetadata const loadHeaders = { "Authorization": `Bearer ${tokens.access_token}`, "Content-Type": "application/json", "User-Agent": ANTIGRAVITY_CONFIG.loadCodeAssistUserAgent, - "X-Goog-Api-Client": ANTIGRAVITY_CONFIG.loadCodeAssistApiClient, - "Client-Metadata": ANTIGRAVITY_CONFIG.loadCodeAssistClientMetadata, "x-request-source": "local", }; const metadata = getOAuthClientMetadata(); diff --git a/src/lib/oauth/services/antigravity.js b/src/lib/oauth/services/antigravity.js index cda6bde3..6540f055 100644 --- a/src/lib/oauth/services/antigravity.js +++ b/src/lib/oauth/services/antigravity.js @@ -85,8 +85,6 @@ export class AntigravityService { "Authorization": `Bearer ${accessToken}`, "Content-Type": "application/json", "User-Agent": this.config.loadCodeAssistUserAgent, - "X-Goog-Api-Client": this.config.loadCodeAssistApiClient, - "Client-Metadata": this.config.loadCodeAssistClientMetadata, }; }