Repository navigation
Conversation
agy older than 1.1.11 answers print-mode /usage with a billable agent turn instead of a quota report. Probe --version first and return an actionable unavailable result without ever spawning the usage argv.
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
The version parser admits prerelease builds such as 1.1.11-rc.1, allowing the billable /usage command before the stable safety fix.
Get a fresh assessment by requesting another Copilot review.
Review effort: Lite
Findings: 1
Open (1)
What changed in this PR
Replaces Gemini-mirrored Antigravity quotas with native agy CLI usage, gated by a minimum version and rendered with grouped quota windows.
Changes:
- Adds CLI probing, version gating, parsing, timeout, and abort handling.
- Integrates independent Antigravity results into the rate-limit service.
- Updates status-bar grouping, compact metrics, labels, visibility, and tests; removes the old mirror.
| File | Description |
|---|---|
src/shared/rate-limit-types.ts |
Adds provider-specific bucket metadata. |
src/renderer/src/components/status-bar/use-status-bar-controller.ts |
Updates Antigravity visibility rationale. |
src/renderer/src/components/status-bar/UsageRosterPanel.tsx |
Renders grouped native usage windows. |
src/renderer/src/components/status-bar/UsageRosterPanel.test.tsx |
Tests grouped and compact rendering. |
src/renderer/src/components/status-bar/usage-section-selection.ts |
Adds shared tightest-window selection. |
src/renderer/src/components/status-bar/tooltip.tsx |
Adds native labels and grouped panels. |
src/renderer/src/components/status-bar/tooltip.test.ts |
Tests grouped tooltip output. |
src/renderer/src/components/status-bar/StatusBarProviderSegment.tsx |
Adds Antigravity status summaries. |
src/renderer/src/components/status-bar/StatusBarProviderSegment.test.tsx |
Tests status-bar summaries. |
src/renderer/src/components/status-bar/status-bar-provider-visibility.ts |
Removes the Gemini OAuth visibility gate. |
src/renderer/src/components/status-bar/status-bar-provider-visibility.test.ts |
Updates visibility expectations. |
src/renderer/src/components/status-bar/antigravity-usage-format.ts |
Adds group labels and bucket sorting. |
src/renderer/src/components/status-bar/antigravity-compact-metrics.tsx |
Implements compact grouped metrics. |
src/main/rate-limits/service/service-full-cycle-preparation.ts |
Fetches Antigravity independently. |
src/main/rate-limits/service/service-full-cycle-application.ts |
Applies independent Antigravity results. |
src/main/rate-limits/service-antigravity-usage.test.ts |
Tests service independence and stale handling. |
src/main/rate-limits/antigravity-usage-mirror.ts |
Removes the Gemini mirror. |
src/main/rate-limits/antigravity-usage-mirror.test.ts |
Removes obsolete mirror tests. |
src/main/rate-limits/antigravity-usage-fetcher.ts |
Adds gated native CLI fetching and parsing. |
src/main/rate-limits/antigravity-usage-fetcher.test.ts |
Tests version gating and fetch behavior. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughAntigravity usage is fetched from its own CLI and processed through an independent refresh path. Shared version parsing is used by the Antigravity fetcher and Claude-related version checks. Rate-limit data carries provider window labels and group names into compact, verbose, and tooltip rendering. Antigravity visibility no longer requires Gemini CLI OAuth. Tests cover fetch parsing and failures, refresh behavior, grouped rendering, and visibility. Priority: ➖ Normal Severity of issue fixed: Medium Merge Risk: 🔵 Low · up to Users whose agy login has expired no longer see why usage is unavailable. Restore the actionable authentication message before merging, or accept this bounded UI regression. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Advanced
Run ID: fb8cb1e7-d925-4a97-9e9e-f252dece08b4
📒 Files selected for processing (20)
src/main/rate-limits/antigravity-usage-fetcher.test.tssrc/main/rate-limits/antigravity-usage-fetcher.tssrc/main/rate-limits/antigravity-usage-mirror.test.tssrc/main/rate-limits/antigravity-usage-mirror.tssrc/main/rate-limits/service-antigravity-usage.test.tssrc/main/rate-limits/service/service-full-cycle-application.tssrc/main/rate-limits/service/service-full-cycle-preparation.tssrc/renderer/src/components/status-bar/StatusBarProviderSegment.test.tsxsrc/renderer/src/components/status-bar/StatusBarProviderSegment.tsxsrc/renderer/src/components/status-bar/UsageRosterPanel.test.tsxsrc/renderer/src/components/status-bar/UsageRosterPanel.tsxsrc/renderer/src/components/status-bar/antigravity-compact-metrics.tsxsrc/renderer/src/components/status-bar/antigravity-usage-format.tssrc/renderer/src/components/status-bar/status-bar-provider-visibility.test.tssrc/renderer/src/components/status-bar/status-bar-provider-visibility.tssrc/renderer/src/components/status-bar/tooltip.test.tssrc/renderer/src/components/status-bar/tooltip.tsxsrc/renderer/src/components/status-bar/usage-section-selection.tssrc/renderer/src/components/status-bar/use-status-bar-controller.tssrc/shared/rate-limit-types.ts
💤 Files with no reviewable changes (2)
- src/main/rate-limits/antigravity-usage-mirror.ts
- src/main/rate-limits/antigravity-usage-mirror.test.ts
Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.
- Preserve prerelease/build metadata in extractAgyVersion so 1.1.11-rc.1 stays below the stable floor and never spawns /usage. - Reject the whole quota response on any malformed group/bucket instead of returning ok with a partial pool set. - JSDoc the new fetcher surface.
There was a problem hiding this comment.
ℹ️ No critical issues — two external wire-shape assumptions worth confirming with a real capture, plus stale comments and a scope question.
Reviewed changes
- Native Antigravity fetcher — new
fetchAntigravityRateLimitsrunsagy --version(semver >= 1.1.11 viahasReachedAppVersion, fails closed on unreadable output) before spawningagy --print /usage --output-format jsonthroughexecFileCaptureToTermination(fixed argv, no shell, abort-aware). The Gemini mirror (antigravity-usage-mirror.ts) and its tests are deleted. This addresses the 1.1.10 billable-turn finding. - Service wiring — Antigravity becomes its own
Promise.allSettledslot inservice-full-cycle-preparation.tsand participates inapplyStalePolicystale retention, independent of Gemini. - Renderer — grouped verbose/compact rendering, per-group tightest-window selection (
usage-section-selection.ts), native5h/wklabels, reset countdowns, and a grouped provider flyout (tooltip.tsx). - Visibility —
antigravityUsageConfigured(checked status item + detectedagy) replaces the Gemini OAuth requirement as the durable signal. - Shared types — additive optional
RateLimitWindow.windowLabelandRateLimitBucket.id/groupName/groupDescription.
ℹ️ Stale comments still describe the removed Gemini mirror
status-bar-provider-visibility.ts:11-15 still says durability "requires geminiCliOAuthEnabled — the snapshot mirrors the Gemini fetch", which this PR makes false by removing both the requirement and the mirror. Likewise rate-limit-types.ts:73 still narrows buckets to "(Gemini only)", but it now carries Antigravity data too. Both lines sit outside the diff hunks, so flagging them here rather than inline.
ℹ️ Scope: is this the vehicle, or is it superseded?
A maintainer noted on #20797 that this work is superseded by the maintained quota migration (#21654 → #21678), and the PR body itself offers to close in favor of #20797. Nothing in the code blocks merge, but it is worth settling which branch carries the change so two competing implementations do not both land.
ℹ️ Nitpicks
use-status-bar-controller.ts:106adds a third stacked// Why:line ("Antigravity visibility is based on its own detected CLI and snapshot") that restates the:105line above it; the block only needs one.
Technical details
# Rating scale and evidence sources
## External contract (verified, no action needed)
- A real agy 1.2.6 capture (HarnessDesk PR #769 fixture) matches the parser:
`command.data.groups[].buckets[]` with `id`/`name`/`window`/`remaining_fraction`/`reset_time`.
- Official status-line docs name `remaining_fraction`/`reset_time`.
- 1.1.11 release notes confirm print-mode `/usage` no longer starts a billable turn.
## Remaining open questions
- `window: '5h'` literal — only `'weekly'` observed in captures.
- `agy --version` flag existence/output — absent from the headless flag reference; no capture found.DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
There was a problem hiding this comment.
ℹ️ Both findings from the prior review are addressed; one small cleanup remains.
Reviewed changes (delta since ea59a23)
- Strict quota parsing —
parseAgyUsageResponsenow rejects any malformed group/bucket as aparseerror instead of skipping it and returningok, via a sharedagyQuotaFormatError; the malformed-JSONcatchreuses it too. New tests cover a missing group name, a bucket without a window, a negative/over-one fraction, and one malformed bucket beside a valid one. This resolves the partial-pool finding. - Prerelease-safe version gate —
extractAgyVersionnow preserves prerelease/build metadata, so1.1.11-rc.1ranks below the stable1.1.11floor throughhasReachedAppVersion; a new test proves a prerelease never receives the/usageargv.extractAgyVersiontests now assert the full version string. - Docs — JSDoc added to the exported and helper functions.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes (delta since fb950cf)
- Removed the unreachable empty-buckets branch —
parseAgyUsageResponseno longer falls back tounavailablewhenbuckets.length === 0. Every group is required to be non-empty above, and each bucket entry either pushes or returns a format error, sobucketsis always populated at the return site. The deletion is behavior-preserving and resolves the sole cleanup from the prior review.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
|
@copilot review — the open prerelease finding (18:20) was addressed in fb950cf: the extractor now preserves prerelease/build metadata, so For maintainers: |
|
Ready for review — everything actionable on my side is done. Review findings: all addressed.
Local gates on this branch are green: CodeRabbit's "Docstring Coverage 24%" line is advisory only — no such check run exists on this PR or on merged PRs such as #21418, and this repo's comment policy is non-obvious-only, so I did not pad the diff with generated docstrings. What I need from a maintainer (I have read-only access on stablyai/orca, so I cannot do either):
|
|
@oliver-mee — this is ready to land, but it's blocked on maintainer-only actions (my account is read-only on the repo). Three things:
Review state is clean: pullfrog's final delta review on |
Service suites spawned the real agy CLI on machines that have it installed, failing nine activation and orchestration tests. Co-Authored-By: Claude <noreply@anthropic.com>
… version parser - Spawn agy with runProcess and branch on its exit code and timedOut flag, dropping the git runner and the error-field guessing it required. - Move the semver extraction shared by the Claude and agy probes to parseCliVersion in shared/app-version. - A response missing command.data.groups is now a parse error; only an empty group list means no quota. - Sort buckets within each group at parse time and set windowLabel only for windows without a known duration. - Drop the never-rendered groupDescription field and the test-only exports; tests exercise fetchAntigravityRateLimits end to end. Co-Authored-By: Claude <noreply@anthropic.com>
… batch A slow agy CLI (up to 15s across the version probe and the usage read) held every other provider's result back inside Promise.allSettled. It now runs as its own promise and applies after the batch, the same way Grok does. Antigravity has no dedicated fetch cycle, so a persistent agy error keeps the 5-minute full-fetch retry cadence Kimi already uses; the activation test now covers both providers. Co-Authored-By: Claude <noreply@anthropic.com>
…vider checks
Buckets that carry a groupName now render the same way for any provider:
- one groupUsageSections helper replaces five ad hoc group-by loops;
- tooltips head each pool with its name and label buckets by window;
- the roster and status bar compact modes show the tightest window per pool
via getCompactUsageSections, which collapses to today's single figure for
ungrouped providers;
- the verbose status bar shows each pool's windows with their reset chips.
Main now orders buckets, so the renderer's Antigravity sorter goes, along
with antigravity-compact-metrics.tsx, antigravity-usage-format.ts, the
non-null assertions they needed, and the unreachable bucket branch. Pool
short labels come from word initials ("Claude and GPT models" -> "C/G")
instead of hardcoded model names, and chips fall back to a window's source
name when its duration is unknown. The roster's compact chip now uses the
row's shared countdown clock.
Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Advanced
Run ID: a229a645-76df-402e-8934-cea17fe237ad
📒 Files selected for processing (27)
src/main/agent-hooks/managed-hook-detection-commands.tssrc/main/claude/claude-session-end-hook-capability.test.tssrc/main/claude/claude-session-end-hook-capability.tssrc/main/rate-limits/antigravity-usage-fetcher.test.tssrc/main/rate-limits/antigravity-usage-fetcher.tssrc/main/rate-limits/rate-limit-service-test-harness.tssrc/main/rate-limits/service-account-target-selection.test.tssrc/main/rate-limits/service-inactive-account-previews.test.tssrc/main/rate-limits/service-live-claude-usage.test.tssrc/main/rate-limits/service-minimax-usage.test.tssrc/main/rate-limits/service-refresh-orchestration.test.tssrc/main/rate-limits/service-window-activation.test.tssrc/main/rate-limits/service/service-full-cycle-application.tssrc/main/rate-limits/service/service-full-cycle-preparation.tssrc/relay/managed-hook-installer.tssrc/renderer/src/components/status-bar/StatusBarProviderSegment.test.tsxsrc/renderer/src/components/status-bar/StatusBarProviderSegment.tsxsrc/renderer/src/components/status-bar/UsageRosterPanel.test.tsxsrc/renderer/src/components/status-bar/UsageRosterPanel.tsxsrc/renderer/src/components/status-bar/tooltip.test.tssrc/renderer/src/components/status-bar/tooltip.tsxsrc/renderer/src/components/status-bar/usage-section-selection.tssrc/renderer/src/lib/window-label-formatter.test.tssrc/renderer/src/lib/window-label-formatter.tssrc/shared/app-version.test.tssrc/shared/app-version.tssrc/shared/rate-limit-types.ts
💤 Files with no reviewable changes (1)
- src/renderer/src/components/status-bar/tooltip.test.ts
Included review availability: Your plan provides up to 10 included reviews per hour; 4 remain after this review.
There was a problem hiding this comment.
Important
Antigravity's CLI spawn no longer terminates the process tree on timeout or abort. execFileCaptureToTermination always enabled the termination barrier (terminationBarrier: termination ?? true); the migrated runProcess call does not, so a hung or aborted agy can leave descendants behind — sharper on Windows, where a .cmd shim makes cmd.exe the root. One-line fix inline.
Reviewed changes (delta since e502328)
- Shared CLI version parser —
parseCliVersionmoved toshared/app-version.ts;parseClaudeCliVersionandextractAgyVersionare deleted, and the Claude capability, managed-hook detection, and relay installer now import the shared parser. - agy fetch through
runProcess— the--versionprobe and/usageread now go through the sharedrunProcessrunner (bounded output, timeout, abort) instead ofexecFileCaptureToTermination, with failures swallowed to a fail-closed version result. - Antigravity applied outside the shared provider batch — its fetch starts alongside Grok in preparation and applies in its own
updateStateafter the batch, re-checking the abort signal before applying. - Renderer grouping made generic —
usage-section-selection.tsgainsgroupUsageSections/getUsageGroupShortLabel;UsageRosterPanel,StatusBarProviderSegment, andtooltipgroup bybucket.groupNamerather than Antigravity-specific branches;antigravity-usage-format.tsandantigravity-compact-metrics.tsxare deleted. - Test-harness coverage — the shared service harness stubs
fetchAntigravityRateLimits, and all seven service suites mock the fetcher so the real spawn no longer runs in unit tests.
ℹ️ Nitpicks
- The deleted fetcher-level abort test (
propagates refresh cancellation instead of converting it to a provider error) has no replacement: the new post-awaitif (signal.aborted) returninservice-full-cycle-application.ts:211is now the only guard and is untested for Antigravity.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
execFileCaptureToTermination defaulted terminationBarrier to true; the runProcess migration dropped it, so a timed-out or aborted agy killed only the root and left descendants behind (cmd.exe behind a .cmd shim on Windows). Pin it with a regression assertion.
formatRateLimitWindowChipLabel defaulted to render-time Date.now() and ProviderSegment scheduled no boundary render, so remaining-time chips went stale until an unrelated state update. Feed useResetCountdownClock through the verbose and compact label paths.
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to GitHub limitations.
🟡 Minor · Preserve the authentication-specific /usage failure. · antigravity-usage-fetcher.ts:137-184
src/main/rate-limits/antigravity-usage-fetcher.ts:137-184
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winPreserve the authentication-specific
/usagefailure.When
agy --versionmeets the minimum, an authentication failure reaches the/usagebranch. The refactor ignoresusageRun.stderrand changes the previous authentication-specificunavailableresult into genericerror/unknownoutput. The status bar then loses the actionable authentication detail. Restore the previous classification only for authentication-related stderr. Keep other failures generic.Suggested fix
if (usageRun?.code !== 0) { + const timedOut = usageRun?.timedOut === true + const authFailure = + !timedOut && /auth|login|sign.?in|credential/i.test(usageRun?.stderr.trim() ?? '') return antigravityFailure( - 'error', - usageRun?.timedOut + authFailure ? 'unavailable' : 'error', + timedOut ? 'Antigravity usage could not be refreshed before the agy CLI timed out.' + : authFailure + ? 'Antigravity usage is unavailable because the agy CLI is not authenticated.' : 'Antigravity usage could not be read from the agy CLI.', - 'unknown', + authFailure ? 'usage-unavailable' : 'unknown', now ) }
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Advanced
Run ID: 16792419-9eb4-40db-960b-ff1fb3f31a1c
📒 Files selected for processing (4)
src/main/rate-limits/antigravity-usage-fetcher.test.tssrc/main/rate-limits/antigravity-usage-fetcher.tssrc/renderer/src/components/status-bar/StatusBarProviderSegment.test.tsxsrc/renderer/src/components/status-bar/StatusBarProviderSegment.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
- src/renderer/src/components/status-bar/StatusBarProviderSegment.test.tsx
- src/renderer/src/components/status-bar/StatusBarProviderSegment.tsx
Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes (delta since ce258be)
- Restored process-tree termination for the agy spawn —
runAgynow passesterminationBarrier: true, matching the barrier the oldexecFileCaptureToTerminationpath enabled by default, so a timed-out or abortedagytakes its descendants with it. A regression assertion on both the--versionand/usagespecs keeps it from being dropped again. - Drove reset-countdown chips from the countdown clock —
ProviderSegmentre-introducesuseResetCountdownClock, now seeded with every window reset (session/weekly/fableWeekly/monthlyplus buckets), and threads the returnednowthrough the verbose chip labels andgetCompactUsageSections, so remaining-time text re-renders on the label boundary instead of waiting for an unrelated state update. A hoisted hook mock pins the wiring in the new test.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
…-version-gate # Conflicts: # src/renderer/src/components/status-bar/status-bar-provider-visibility.test.ts # src/renderer/src/components/status-bar/status-bar-provider-visibility.ts
|
Status: all findings addressed, branch back to MERGEABLE (head
Verification: status-bar + rate-limits suites 940/940,
|
|
@oliver-mee @nwparker — gentle nudge: this one is ready and only waiting on maintainer-only actions (author account is read-only). Head
Where things stand: pullfrog ✅ and CodeRabbit ✅ both confirmed the last two findings ( Heads-up for whoever approves CI: |
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes (delta since 354f593)
- Merged upstream
main(7a4f080) into the branch. The only conflicts werestatus-bar-provider-visibility.tsand its test; the resolution keeps the PR's standaloneantigravityUsageConfiguredsignal and layers upstream's newopencodeGoApiKeyConfiguredterm on top, in bothhasUsageProviderSettingsand the per-provideropencode-gobranch, with the test expectations updated to match. Both sides are preserved correctly. - Adopted the upstream rate-limit/status-bar changes that auto-merged alongside the PR —
fetchOpenCodeGoUsagewithonApiKeyResolvedinservice-full-cycle-preparation.ts, plus the grouped-usage renderer,window-label-formatter, and service-suite test updates. Antigravity's separate fetch/apply path andapplyStalePolicywiring survived the merge intact, and the PR's files now diff cleanly againstmain(34 files, all PR-owned). - Unrelated formatting collapse in
agent-status-main-agent-fact.test.ts(an upstream-only file) rode in with the merge; cosmetic, no assertions changed.
All prior inline threads are resolved.
DeepSeek Flash (free via Pullfrog for OSS) | 𝕏
The merge commit's lint-staged oxfmt pass rewrote line wrapping in a file this PR does not otherwise touch, adding unrelated diff noise against main. Restored to main's exact content (hook skipped — oxfmt would reapply it).
|
Closing as superseded — not abandoned. While this PR was waiting for review, #24073 landed the agy-CLI quota core on main (same direction, different implementation: response parsing restructured, the model-turn latch replacing a version gate). Rebasing this branch on top of that restructure would mean resolving conflicts across a half-redundant diff. What survives from this PR is now #24283 (branch
Tracked by #24282. The renderer bucket-group work from this PR's later commits is already covered by #24073's own rendering. Thanks for the reviews here — the prerelease finding in particular carried over verbatim into #24283 as a pinned regression test. |


ELI5
The Antigravity row in the status bar shows your real agy quota instead of copying Gemini's numbers. Old or broken agy installs get a plain message telling you to update, instead of a blank row or someone else's numbers.
What Changed
Before: the Antigravity status-bar row mirrored Gemini quota, or (with #20797 alone) spawned
agy -p /usageon every refresh with no version check.After: the row shows native Antigravity quota (Gemini Models + Claude/GPT pools, 5h/weekly windows with reset countdowns) once
agy1.1.11+ is detected.Mechanism:
antigravity-usage-fetcher.tsrunsagy --print /usage --output-format jsonthrough the sharedexecFileCaptureToTerminationpath (no shell, fixed argv, 10s timeout, abort-aware) and maps the four quota buckets onto the existing provider model. The Gemini mirror is deleted; the fetch cycle reads Antigravity independently.agy --versionmust parse to >= 1.1.11 before/usageis ever spawned (prerelease/build metadata preserved, so1.1.11-rc.1stays gated; unreadable versions fail closed). Pre-1.1.11 answers print-mode/usagewith a billable agent turn, so this prevents quota spend on every refresh.ok.Why
agy -p /usageneeds no tokens, keychain access, or Gemini CLI install (agyhandles sign-in), per the 1.1.11 release notes and https://antigravity.google/docs/cli/headless/. Keychain/OAuth and language-server alternatives (#21999, #20933) add credential handling this path avoids.Linked Issue
Fixes #9122
Closes #20797 as superseded (this rebases #20797 by @abti-ai onto current main with authorship preserved, plus the version gate and strict parsing; happy to close in favor of #20797 if @abti-ai picks those up there instead).
Visual Proof
N/A — no signed-in agy host on this machine to capture live quota; the renderer paths are covered by renderToStaticMarkup tests (
StatusBarProviderSegment,UsageRosterPanel, tooltip).Testing
antigravity-usage-fetcher.test.ts(33 tests incl. 1.1.10/1.1.11-rc.1 never receiving the usage argv, unreadable-version and probe-failure fail-closed cases, malformed-entry parse errors); neighbor suites (service, status-bar segments, roster, visibility, tooltip) pass.AI Disclosure
Implemented with OpenCode (Muse Spark).
Review
Addresses @abruption's version-compatibility finding on #20797, Copilot's prerelease-gate finding, and CodeRabbit's strict-parsing finding on this PR.
Agent skill upstream boundary
Notes
Security: fixed argv, no shell interpolation, bounded output/deadline, process-tree termination. Cross-platform: no
node:child_processimports (shared runner only). SSH/remote and Mobile: untouched paths.Checklist
N/Awith reasonpnpm lint,pnpm typecheck,pnpm test, andpnpm buildpass (or CI will cover; local preferred)