/** * Google Provider - API * * API calls for Google quota providers. * @module quota/providers/google/api */ const GOOGLE_PRIMARY_ENDPOINT = 'https://cloudcode-pa.googleapis.com'; const GOOGLE_ENDPOINTS = [ 'https://daily-cloudcode-pa.sandbox.googleapis.com', 'https://autopush-cloudcode-pa.sandbox.googleapis.com', GOOGLE_PRIMARY_ENDPOINT ]; const GOOGLE_HEADERS = { 'User-Agent': 'antigravity/1.11.5 windows/amd64', 'X-Goog-Api-Client': 'google-cloud-sdk vscode_cloudshelleditor/0.1', 'Client-Metadata': '{"ideType":"IDE_UNSPECIFIED","platform":"PLATFORM_UNSPECIFIED","pluginType":"GEMINI"}' }; export const refreshGoogleAccessToken = async (refreshToken, clientId, clientSecret) => { const response = await fetch('https://oauth2.googleapis.com/token', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ client_id: clientId, client_secret: clientSecret, refresh_token: refreshToken, grant_type: 'refresh_token' }) }); if (!response.ok) { return null; } const data = await response.json(); return typeof data?.access_token === 'string' ? data.access_token : null; }; export const fetchGoogleQuotaBuckets = async (accessToken, projectId) => { const body = projectId ? { project: projectId } : {}; try { const response = await fetch(`${GOOGLE_PRIMARY_ENDPOINT}/v1internal:retrieveUserQuota`, { method: 'POST', headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' }, body: JSON.stringify(body), signal: AbortSignal.timeout(15000) }); if (!response.ok) { return null; } return await response.json(); } catch { return null; } }; export const fetchGoogleModels = async (accessToken, projectId) => { const body = projectId ? { project: projectId } : {}; for (const endpoint of GOOGLE_ENDPOINTS) { try { const response = await fetch(`${endpoint}/v1internal:fetchAvailableModels`, { method: 'POST', headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json', ...GOOGLE_HEADERS }, body: JSON.stringify(body), signal: AbortSignal.timeout(15000) }); if (response.ok) { return await response.json(); } } catch { continue; } } return null; };