import { DEFAULT_ANTIGRAVITY_CLIENT_PROFILE, normalizeAntigravityClientProfile, type AntigravityClientProfile, } from "@/shared/constants/antigravityClientProfile"; import { getAntigravityContentHeaders } from "./antigravityHeaders.ts"; import type { AntigravityCredentialsLike } from "./antigravityIdentity.ts"; import { resolveAntigravityCliVersion, resolveAntigravityIdeVersion, } from "./antigravityVersion.ts"; export { ANTIGRAVITY_CLIENT_PROFILE_VALUES, DEFAULT_ANTIGRAVITY_CLIENT_PROFILE, normalizeAntigravityClientProfile, type AntigravityClientProfile, } from "@/shared/constants/antigravityClientProfile"; type AntigravityProfileCredentials = AntigravityCredentialsLike & { providerSpecificData?: Record | null; }; const ABSENT_CONTENT_IDENTITY_HEADERS = [ "x-client-name", "x-client-version", "x-machine-id", "x-vscode-sessionid", "X-Goog-Api-Client", "Client-Metadata", ] as const; export function getAntigravityClientProfile( credentials?: AntigravityProfileCredentials | null ): AntigravityClientProfile { const fromProviderData = credentials?.providerSpecificData && typeof credentials.providerSpecificData === "object" && !Array.isArray(credentials.providerSpecificData) ? credentials.providerSpecificData.clientProfile : undefined; return normalizeAntigravityClientProfile(fromProviderData); } export function resolveAntigravityClientVersion( profile: AntigravityClientProfile ): Promise { return profile === "cli" ? resolveAntigravityCliVersion() : resolveAntigravityIdeVersion(); } export function removeHeaderCaseInsensitive(headers: Record, name: string): void { const lowerName = name.toLowerCase(); for (const key of Object.keys(headers)) { if (key.toLowerCase() === lowerName) { delete headers[key]; } } } function getProjectHeaderValue(body: unknown): string | null { const project = body && typeof body === "object" ? (body as Record).project : null; if (typeof project !== "string" || project.trim().length === 0) return null; if (project === "test-project" || project === "project-id") return null; return project; } /** Apply the selected official client identity to a Cloud Code content request. */ export function applyAntigravityClientProfileHeaders( headers: Record, credentials: AntigravityProfileCredentials | null | undefined, body: unknown ): AntigravityClientProfile { const profile = getAntigravityClientProfile(credentials); const identityHeaders = getAntigravityContentHeaders(profile); removeHeaderCaseInsensitive(headers, "User-Agent"); headers["User-Agent"] = identityHeaders["User-Agent"]; for (const name of ABSENT_CONTENT_IDENTITY_HEADERS) { removeHeaderCaseInsensitive(headers, name); } const project = getProjectHeaderValue(body); removeHeaderCaseInsensitive(headers, "x-goog-user-project"); if (project) { headers["x-goog-user-project"] = project; } return profile; }