Skip to content

Read Antigravity usage from the agy CLI - #16653

Open
baioccheg-bit wants to merge 4 commits into
stablyai:mainfrom
baioccheg-bit:fix/antigravity-usage-from-cli
Open

baioccheg-bit wants to merge 4 commits into
stablyai:mainfrom
baioccheg-bit:fix/antigravity-usage-from-cli

Conversation

@baioccheg-bit

@baioccheg-bit baioccheg-bit commented Aug 26, 2026 •

Copy link
Copy Markdown

ELI5

Orca's Antigravity meter was showing Gemini's numbers, because it assumed both share one quota. Google turned Gemini Code Assist off for individuals, so there is nothing left to copy and the meter reads 0% forever. This asks the Antigravity CLI for its own numbers instead.

What Changed

  • New fetchAntigravityRateLimits runs agy -p "/usage" and parses its tab-separated rows.
  • It joins the existing Promise.allSettled batch in service.ts, so it costs no extra wall-clock.
  • Both quota pools survive as named buckets; the headline session/weekly windows come from the Gemini pool.
  • deriveAntigravityRateLimits stays as the fallback, so machines without agy keep today's behaviour byte for byte.
  • A CLI that is installed but signed out answers for itself instead of blaming a Gemini sign-in.

No renderer changes: the Antigravity status-bar toggle and label already exist and simply never received real data.

Why

deriveAntigravityRateLimits derives the meter from a successful Gemini CLI read. Google stopped serving Gemini Code Assist for individual accounts on 2026-06-18 and directed those users to Antigravity, so that read now always fails:

IneligibleTierError: This client is no longer supported for Gemini Code Assist for
individuals.   reasonCode: 'UNSUPPORTED_CLIENT'   tierId: 'free-tier'

The existing code comment already names the constraint — agy keeps its token in the OS keyring, so no file the Gemini fetcher reads can ever describe it. #9122 reaches the same conclusion and suggests exactly this approach ("or by shelling out to agy — CodexBar takes this approach and reliably reports both Antigravity pools"), including the detail that the two pools have independent resets.

agy -p "/usage" on Windows, verbatim:

Gemini Models            Weekly Limit Remaining      100%   2026-09-02T18:04:43Z
Gemini Models            Five Hour Limit Remaining   100%   2026-08-26T23:04:43Z
Claude and GPT models    Weekly Limit Remaining      100%   2026-09-02T18:04:43Z
Claude and GPT models    Five Hour Limit Remaining   100%   2026-08-26T23:04:43Z

Five Hour → session (300 min), Weekly → weekly (10080 min). The CLI reports what is left, so it is converted to used percentage like every other provider.

Linked Issue

Fixes #9122

Visual Proof

N/A — I could not produce a before/after of the status-bar segment. pnpm install resolves, but the postinstall native rebuild of node-pty needs a Visual Studio C++ toolchain I do not have, so I cannot run a local Electron build. The change only populates ProviderRateLimits for an existing segment and touches no renderer code. Happy to add captures if a maintainer can point me at a build that skips the native step.

Testing

  • vitest run src/main/rate-limits/antigravity-cli-usage.test.ts src/main/rate-limits/antigravity-usage-mirror.test.ts → 12 passed. The pre-existing mirror tests are unchanged and still pass.
  • tsc --noEmit -p config/tsconfig.node.json → clean.
  • oxfmt + oxlint on the touched files → clean.
  • Fixture data is real agy -p "/usage" output from Windows 11 with agy 1.1.21.

Platforms actually exercised: Windows 11 (CLI output and binary resolution). macOS/Linux paths are code-reviewed only, not run.

  • I manually tested these changes locally
  • Automated tests added/updated, or explained why not below

Not checking the manual box: the parser and CLI invocation are verified on Windows, but I have not seen the segment render in a running Orca for the build reason above.

AI Disclosure

Written with Claude Opus 5 via Claude Code. Every command, test run and the agy output quoted above were executed on a real machine; nothing here is model recollection.

Review

Automated review flagged two things on the first commit; both are addressed in 0ab6a06:

  • Stale non-executable fallback could hide a usable CLI — fixed. Resolution now checks X_OK rather than mere existence, and considers every where/which hit instead of only the first.
  • Could report quota from the wrong machine during remote sessions — real, but not introduced here and not a regression. fetchGeminiRateLimits, which this replaces, takes no runtime target and reads local credentials only (zero occurrences of wsl/runtimeTarget/executionHost in that file), so the mirror was always local-scoped too. Making both providers runtime-aware is a genuine gap; it needs a resolver wired through RateLimitService like Codex/Kimi have, which is a larger change than this fix and better scoped separately. I documented the boundary in a docstring rather than leaving it implicit. Glad to take it on as a follow-up if you want it.

Agent skill upstream boundary

  • Not applicable.

Notes

  • Security — no new network calls; a local subprocess with a fixed argument list. execFile, never exec, so no shell interpolation, and windowsHide stays effective.
  • Cross-platform — PATH lookup via where.exe/which; fallbacks are the documented install prefixes per platform. Windows is the only one I ran.
  • Remote SSH — see Review above: unchanged scope relative to the Gemini read it replaces.
  • Mobile — not applicable, main-process only.
  • Backwards compatibility — without agy installed, behaviour is identical to today via the retained mirror.
  • Performance — one execFile inside the existing parallel batch, with the CLI's own 30s print timeout and the caller's AbortSignal.

Checklist

  • This PR is small and focused
  • I explained what changed and why (including ELI5)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

Last box unchecked deliberately: targeted vitest, typecheck:node, oxfmt and oxlint pass locally, but the full pnpm test and pnpm build need the native rebuild I cannot complete on this machine. Leaving that to CI.

🤖 Generated with Claude Code

Antigravity usage was derived from a successful Gemini CLI read, on the
assumption that both share Google Code Assist quota. Google stopped serving
Gemini Code Assist for individual accounts on 2026-06-18 and pointed those
users at Antigravity, so the mirror now has nothing to copy: the meter sits at
0% forever and the error blames a Gemini sign-in that can no longer exist.

Ask the Antigravity CLI instead. `agy -p "/usage"` works in print mode and
prints one tab-separated row per model family and window, which is the only
supported way to read a token the CLI keeps in the OS keyring.

The Gemini mirror stays as the fallback so machines without `agy` keep their
current behaviour. A CLI that is installed but signed out answers for itself,
because pointing that user back at Gemini would send them to a dead product.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 26, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds Antigravity CLI rate-limit support for host and WSL runtimes. The implementation resolves executable candidates, runs the CLI with timeout and abort-signal support, parses session and weekly quotas, and returns localized unavailable results with failure metadata. Provider refreshes resolve the local runtime target and use CLI results unless the CLI is unavailable. Vitest coverage validates quota mapping, percentage conversion, model precedence, named buckets, unavailable states, and metadata.

Merge Risk: 🟡 Moderate · up to 8e2b8

The PR adds Antigravity quota reporting, but SSH workspaces may show quota from the wrong machine, and rejected CLI requests may incorrectly display Gemini data instead. These bounded correctness issues should be addressed or explicitly accepted before merging.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 77.78% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 9 functions across 12 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly states the main change: reading Antigravity usage from the agy CLI.
Description check ✅ Passed The description is complete and follows the repository template. It explains the problem, implementation, linked issue, testing, platform coverage, limitations, and checklist status. The missing full …
Linked Issues check ✅ Passed The implementation addresses issue #9122 by querying agy directly, parsing the separate Gemini Models and Claude and GPT pools, preserving independent reset times, avoiding dependence on a local Gemin…
Out of Scope Changes check ✅ Passed The changes remain within scope for issue #9122. Runtime-target handling, WSL execution, executable discovery, localization, stale-result protection, and test mocks directly support reliable Antigravi…
Full details: Description check

Explanation

The description is complete and follows the repository template. It explains the problem, implementation, linked issue, testing, platform coverage, limitations, and checklist status. The missing full test and build runs are explicitly explained.

Full details: Linked Issues check

Explanation

The implementation addresses issue #9122 by querying agy directly, parsing the separate Gemini Models and Claude and GPT pools, preserving independent reset times, avoiding dependence on a local Gemini CLI, and returning clearer unavailable results. Gemini data remains an explicit fallback.

Full details: Out of Scope Changes check

Explanation

The changes remain within scope for issue #9122. Runtime-target handling, WSL execution, executable discovery, localization, stale-result protection, and test mocks directly support reliable Antigravity CLI usage detection.

  • Fix all pre-merge checks with AI

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e31a03ca-0868-4b68-87e4-16f3864b0319

📥 Commits

Reviewing files that changed from the base of the PR and between cda2280 and f317afd.

📒 Files selected for processing (3)
  • src/main/rate-limits/antigravity-cli-usage.test.ts
  • src/main/rate-limits/antigravity-cli-usage.ts
  • src/main/rate-limits/service.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.

Comment thread src/main/rate-limits/antigravity-cli-usage.ts Outdated
Comment thread src/main/rate-limits/antigravity-cli-usage.ts Outdated
Review feedback on the first commit.

Antigravity plans bill two independent pools with their own reset times, so
collapsing them to the Gemini numbers threw away half the data stablyai#9122 asks for.
Both pools now survive as named buckets; the headline session and weekly
windows still come from the Gemini pool.

Binary resolution now checks X_OK instead of mere existence, so a leftover
file from an older install cannot shadow a working `agy` found later in the
list, and every `where`/`which` hit is considered rather than only the first.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 0a49b6e3-ba9e-4b3f-ba48-9da8167fa377

📥 Commits

Reviewing files that changed from the base of the PR and between f317afd and 0ab6a06.

📒 Files selected for processing (2)
  • src/main/rate-limits/antigravity-cli-usage.test.ts
  • src/main/rate-limits/antigravity-cli-usage.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.

Comment thread src/main/rate-limits/antigravity-cli-usage.ts Outdated
@baioccheg-bit

Copy link
Copy Markdown
Author

Thanks — going through the three findings.

1. Fallback executable check — fixed in 0ab6a06, and I see it is already marked addressed. Worth recording the caveat your own analysis surfaced: X_OK is a no-op on Windows, so this hardens POSIX only. The companion change (considering every where/which hit rather than only the first) is what helps on Windows.

2. Run agy on the execution host — you are right, and my earlier reasoning was wrong.

I had argued parity with the fetchGeminiRateLimits read this replaces. That does not hold: reading a local credential file is not the same as executing an agent CLI, and docs/reference/ssh-execution-boundary.md governs execution specifically — its table puts "PTYs, agent CLIs" on remote, and rule 1 forbids exactly the silent local substitution I wrote.

Where I am stuck is the plumbing, and I would rather ask than guess:

RateLimitService has zero occurrences of connectionId, ssh, or executionHost. It is a global account-usage poller with no per-worktree target — every provider in it (Claude, Codex, Gemini, Kimi, MiniMax) reads client-local state today. So there is no target for this fetcher to consult, and honoring the boundary means giving the service a notion of execution host it does not currently have, wired from outside like the existing kimiHomeResolver / claudeAuthPreparationResolver hooks.

That is a design decision about a shared service rather than a detail of this fix, so I did not want to invent it unilaterally. Two options, happy with either:

  • (a) Keep this PR scoped to replacing the dead Gemini mirror, with the client-local boundary documented in the docstring as it is now, and open a follow-up that makes the rate-limit service execution-host aware for agy and any other provider that should be.
  • (b) Tell me the resolver shape you want and I will wire it here.

Worth noting for scope: whichever way this goes, the segment is currently broken for every individual-tier user since Google's 2026-06-18 shutdown, and this PR fixes that on local sessions regardless.

3. Localize the availability errors — I do not think this applies here, but tell me if I am reading the convention wrong.

These strings land in ProviderRateLimits.error, and every sibling in src/main/rate-limits/ uses raw English there: 'No credentials' (claude-managed-account-usage.ts:29), 'Token refresh failed' (gemini-usage-fetcher.ts:98), 'Rate-limit fetch aborted' (claude-usage-result.ts:21), 'RPC timeout' (codex-rpc-rate-limit-probe.ts:135). The file this PR modifies, antigravity-usage-mirror.ts, does the same for its two existing reasons.

Across src/main as a whole: 7 files reference localization, 92 define raw error: strings. Localizing only these two would make this file the odd one out in its own directory.

If main-process provider errors are meant to be localized going forward, I am glad to do it — but that reads like a directory-wide change rather than something to start in this PR, and I did not want to half-apply a convention.

Three corrections after reading AGENTS.md properly.

The fetcher spawned `node:child_process` directly, which the repo forbids and a
ratchet test fails on. It now goes through `runProcess`, and resolves system
binaries with `windowsSystem32Binary` rather than trusting the child's PATH.

`agy` signs in per runtime and keeps the token in that runtime's keyring, so a
WSL target must be asked inside WSL — the host copy answers for a different
account. The service now takes a runtime target resolver, wired from settings
the way Kimi's home resolver is (stablyai#12370). WSL argv is built with
buildWslExecArgs and fenced with buildWslCapturedLoginShellCommand, because the
login shell prints the distro banner to the stdout this parses.

User-facing availability strings go through translateMain with intent-named
ids.

SSH remains unhandled: RateLimitService has no execution-host vocabulary at
all, so honouring ssh-execution-boundary.md there is a service-wide change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@baioccheg-bit

Copy link
Copy Markdown
Author

Reworked in f3c650c — and I owe a retraction plus two problems you did not have to catch, because I found them by finally reading AGENTS.md properly instead of pattern-matching the neighbouring files.

Localization — you were right, I was wrong. I argued the convention from raw error: strings in sibling rate-limit files. That was reasoning from what happens to be there rather than from the stated rule. Both strings now go through translateMain with intent-named ids (rateLimits.antigravity.cliMissing, rateLimits.antigravity.quotaUnreadable).

Two things I broke that review had not reached yet:

  • The fetcher spawned node:child_process directly. AGENTS.md forbids it — "start them through runProcess/spawnProcess in src/shared/child-process/ — never child_process directly… A ratchet test fails on any new direct import." Now uses runProcess, and resolves where.exe/wsl.exe through windowsSystem32Binary rather than trusting the child's PATH.
  • My WSL path (added in the same breath as the execution-host discussion) hand-rolled wsl.exe -d … --exec argv and parsed raw stdout. Also forbidden, and for a concrete reason: the interactive login shell prints the distro banner to the same stdout. Now built with buildWslExecArgs and fenced with buildWslCapturedLoginShellCommand, with buildPosixCommandPathLookupScript(..., { skipWindowsMountDirs: true }) so the Windows agy on the mounted PATH cannot answer for the guest.

Execution host — partly addressed. agy signs in per runtime and keeps its token in that runtime's keyring, so the host copy genuinely answers for a different account. RateLimitService now takes a runtime target resolver, wired from settings exactly the way setKimiHomeResolver is (#12370 is the same failure shape), and a WSL target is asked inside WSL.

SSH is still not honoured, and I did not want to fake it. RateLimitService has no execution-host vocabulary — zero occurrences of connectionId, ssh, or executionHost — and every provider in it reads client-local state. Giving it that notion is a service-wide change touching Claude, Codex, Gemini, Kimi and MiniMax equally, not something to smuggle into this fix. It is called out in the fetcher docstring. Still happy to do it as a follow-up, or here if you tell me the shape you want.

Verification: 16 tests pass (my 7, the 5 pre-existing mirror tests, and child-process-import-boundary.test.ts which is the ratchet that would have caught the first item). tsc --noEmit -p config/tsconfig.node.json clean, oxfmt and oxlint clean on all four touched files. check:code-quality:changed cannot run on this machine — its wrapper fails with EINVAL spawnSync pnpm.cmd before linting — so I ran oxlint directly on the exact file list it resolved.

Unchanged from before: I still cannot produce a running-app capture, because node-pty's native rebuild needs a Visual Studio toolchain I do not have. The parser is exercised against real agy -p "/usage" output; the spawn layer is now the repo's own tested helper rather than my own.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 08399914-dc25-4f5c-b0a7-391e63d4d356

📥 Commits

Reviewing files that changed from the base of the PR and between 0ab6a06 and f3c650c.

📒 Files selected for processing (3)
  • src/main/index.ts
  • src/main/rate-limits/antigravity-cli-usage.ts
  • src/main/rate-limits/service.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.

…stop the fetch leaking into tests

Two problems, both found by running the whole rate-limits suite rather than
only the files this change adds.

A runtime switch while `agy` is running left the old runtime's answer on
screen until the next full refresh. The target is now captured before the
fetch and compared after it, matching how the Codex and Claude targets are
guarded; a stale answer keeps the previous reading instead.

Adding a seventh provider to the parallel batch also meant every service test
that exercises refresh() ran the real fetcher, spawning `where`/`agy` on the
test machine. That broke 11 tests and took the suite from 8s to 83s, and it
made results depend on whether the machine happened to have Antigravity
installed. The fetcher is now mocked alongside the other providers, defaulting
to the no-CLI case so the Gemini mirror stays under test.

Suite is back to the base commit's 9 pre-existing failures in 7.6s.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@baioccheg-bit

Copy link
Copy Markdown
Author

8e2b85c addresses the runtime-switch race, and fixes something worse that I only found because chasing it made me run the whole suite instead of my own files.

Discard results after a runtime switch — fixed. The target is captured before the fetch and compared after it, following the isSameCodexTarget / isSameClaudeTarget guards already in the service. A stale answer keeps the previous reading rather than showing the runtime you just left.

The bigger one, which review had not reached: my fetcher was leaking into every service test.

Adding a seventh provider to the Promise.allSettled batch meant every service-*.test.ts that exercises refresh() ran the real fetchAntigravityRateLimits, spawning where/agy on the test machine. Consequences:

  • 11 tests failed that pass on main — 9 of them in service-window-activation.test.ts, where fake timers meet a real process spawn.
  • The suite went from 7.7s to 82.7s.
  • Results became machine-dependent: on a machine with agy signed in it returned ok, so the assertions expecting unavailable failed; CI would have returned the opposite.

Mocked alongside the other providers, with resetRateLimitProviderMocks defaulting to the no-CLI case so the Gemini mirror stays the tested default.

Before/after on src/main/rate-limits:

files tests time
cda2280d (base) 4 failed / 41 passed 9 failed / 435 passed 7.67s
this branch, before 6 failed / 40 passed 20 failed / 433 passed 82.71s
this branch, now 4 failed / 42 passed 9 failed / 444 passed 7.62s

The 9 remaining failures are identical by name to the base commit's — codex-fetcher (2), service-account-target-selection (5), service-inactive-account-previews (1), service-refresh-orchestration (1). None are mine, and I have not touched them.

New coverage in service-antigravity-usage.test.ts: a real CLI reading beats the mirror, and a signed-out CLI answers for itself rather than mirroring Gemini numbers for an account that is not signed in. The three pre-existing mirror tests there are unchanged and still pass.

tsc --noEmit -p config/tsconfig.node.json and oxlint clean across src/main/rate-limits and src/main/index.ts.

Still open: SSH. Unchanged from my last comment — RateLimitService has no execution-host vocabulary, and giving it one touches every provider in it. Your call whether that belongs here or in a follow-up; I am happy either way, I just did not want to invent the shape unilaterally.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 1bcbe681-04a8-4d42-abc2-737521cf6121

📥 Commits

Reviewing files that changed from the base of the PR and between f3c650c and 8e2b85c.

📒 Files selected for processing (9)
  • src/main/rate-limits/rate-limit-service-test-harness.ts
  • src/main/rate-limits/service-account-target-selection.test.ts
  • src/main/rate-limits/service-antigravity-usage.test.ts
  • src/main/rate-limits/service-inactive-account-previews.test.ts
  • src/main/rate-limits/service-live-claude-usage.test.ts
  • src/main/rate-limits/service-minimax-usage.test.ts
  • src/main/rate-limits/service-refresh-orchestration.test.ts
  • src/main/rate-limits/service-window-activation.test.ts
  • src/main/rate-limits/service.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 7 remain after this review.

Comment on lines +1747 to +1750
fetchAntigravityRateLimits({
target: antigravityTarget,
signal
})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Run agy on the SSH execution host. LocalAccountRuntimeTarget cannot represent SSH, so this call can show local quota for an SSH workspace; add execution-host plumbing or publish an unverifiable result. As per coding guidelines: “the execution host owns everything that touches execution.”

Source: Coding guidelines

Comment on lines +1806 to +1814
const antigravityCli =
!antigravityTargetStale && antigravityResult.status === 'fulfilled'
? antigravityResult.value
: null
const antigravity = antigravityTargetStale
? (previousState.antigravity ?? deriveAntigravityRateLimits(gemini))
: antigravityCli && antigravityCli.usageMetadata?.failureKind !== 'cli-unavailable'
? antigravityCli
: deriveAntigravityRateLimits(gemini)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Do not mirror a rejected CLI call. A rejected fetchAntigravityRateLimits produces null, so Line 1814 uses Gemini data even though only cli-unavailable should use that fallback; map rejection to an Antigravity error result and add a regression test.

@nwparker

Copy link
Copy Markdown
Contributor

Review verdict: Do not merge as-is; superseded by #21654 → #21678. This PR's older CLI usage implementation predates the supported-version gate and configured-executable handling now covered by the maintained stack. Keep it open only as historical reference; do not promote it.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Antigravity usage is a copy of the Gemini quota — wrong pools, and refresh breaks entirely without a local Gemini CLI install

2 participants