5.1 KiB
5.1 KiB
summary, read_when
| summary | read_when | |||
|---|---|---|---|---|
| Gemini provider data sources: OAuth-backed quota APIs, token refresh, and tier detection. |
|
Gemini provider
Gemini uses the Gemini CLI OAuth credentials and private quota APIs. No browser cookies.
Data sources + fallback order
-
OAuth-backed quota API (only path used in
fetch())- Reads auth type from
~/.gemini/settings.json. - Supported:
oauth-personal(or unknown → try OAuth creds). - Unsupported:
api-key,vertex-ai(hard error).
- Reads auth type from
-
Legacy CLI parsing (parser exists but not used in current fetch path)
GeminiStatusProbe.parse(text:)can parse/statsoutput.
OAuth credentials
- File:
~/.gemini/oauth_creds.json. - Required fields:
access_token,refresh_token(optional),id_token,expiry_date. - If access token is expired, we refresh via Google OAuth using client ID/secret extracted from the Gemini CLI install (see below).
OAuth client ID/secret extraction
- Resolution order:
GEMINI_OAUTH_CLIENT_ID+GEMINI_OAUTH_CLIENT_SECRETenvironment override.GEMINI_OAUTH2_JS_PATHpointing at a readableoauth2.jsfile.- Installed Gemini CLI package (
oauth2.js/ bundle regex extraction). - Known global Gemini CLI install paths (Homebrew npm prefix layouts, then
Homebrew Cellar/
optlibexecpackage roots when the GUI cannot resolve thegeminibinary).
- We locate the installed
geminibinary, then search for:- Homebrew nested path:
.../libexec/lib/node_modules/@google/gemini-cli/node_modules/@google/gemini-cli-core/dist/src/code_assist/oauth2.js
- Homebrew Cellar/opt package root (no-binary fallback):
/opt/homebrew/Cellar/gemini-cli/<version>/libexec/lib/node_modules/@google/gemini-cli/opt/homebrew/opt/gemini-cli/libexec/lib/node_modules/@google/gemini-cli- same under
/usr/local
- Bun/npm sibling path:
.../node_modules/@google/gemini-cli-core/dist/src/code_assist/oauth2.js
- Homebrew nested path:
- Regex extraction:
OAUTH_CLIENT_IDandOAUTH_CLIENT_SECRETfromoauth2.jsor Homebrew bundle chunks.
API endpoints
- Quota:
POST https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota- Body:
{ "project": "<projectId>" }(or{}if unknown) - Header:
Authorization: Bearer <access_token>
- Project discovery (quota project ID):
- Primary:
cloudaicompanionProjectfromloadCodeAssist. - Fallback:
GET https://cloudresourcemanager.googleapis.com/v1/projects- Picks
gen-lang-client*or labelgenerative-language.
- Picks
- Primary:
- Tier detection:
POST https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist- Body:
{ "metadata": { "ideType": "GEMINI_CLI", "pluginType": "GEMINI" } }
- Token refresh:
POST https://oauth2.googleapis.com/token- Form body:
client_id,client_secret,refresh_token,grant_type=refresh_token.
Parsing + mapping
- Quota buckets:
remainingFraction,resetTime,modelId.- For each model, lowest
remainingFractionwins. percentLeft = remainingFraction * 100.
- Reset:
resetTimeparsed as ISO-8601, formatted as "Resets in Xh Ym".
- UI mapping:
- Primary: Pro models (lowest percent left).
- Secondary: Flash models (lowest percent left).
Plan detection
- Tier from
loadCodeAssist:paidTier.name→ paid subscription label from Google, preferred whenever presentstandard-tier→ "Paid" (fallback whenpaidTier.nameis absent)free-tier+hdclaim → "Workspace" (fallback whenpaidTier.nameis absent)free-tier→ "Free"legacy-tier→ "Legacy"
- Email from
id_tokenJWT claims.
Consumer-tier migration (June 2026)
- Google stopped serving Gemini CLI OAuth for individual, AI Pro, and Ultra accounts on 2026-06-18. Standard and Enterprise subscriptions remain supported; paid API-key access is outside CodexBar's OAuth-backed Gemini provider.
- When quota,
loadCodeAssist, or token-refresh responses include Google's unsupported-client migration signal (UNSUPPORTED_CLIENT,IneligibleTierError, or Antigravity migration copy), CodexBar surfacesconsumerTierDeprecatedwith guidance to use the Antigravity provider. - Settings shows an Enable Antigravity provider action only after CodexBar observes
consumerTierDeprecatedduring a Gemini refresh (typed sentinel state, not user-facing text matching). - The action is explicit: CodexBar never automatically enables Antigravity or falls back to it.
- Ordinary Gemini login,
notLoggedIn, and Antigravity setup errors remain unchanged. CodexBar does not capture TerminalgeminiOAuth output, so Terminal-only failures cannot activate the migration action. - Workspace and education Google accounts are outside the June 2026 consumer shutdown; keep using the Gemini provider. Antigravity remains the consumer replacement path for individual, AI Pro, and Ultra.
Key files
Sources/CodexBarCore/Providers/Gemini/GeminiStatusProbe.swift