Repository navigation
Conversation
|
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:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (26)
🚧 Files skipped from review as they are similar to previous changes (25)
Included review availability: Your plan includes up to 10 reviews per rolling hour; 8 remain after this review. 📝 WalkthroughWalkthroughAdded Antigravity quota parsing, bounded HTTP/HTTPS loopback requests, CLI and desktop discovery, CSRF handling, timeout and cancellation support, and structured unavailable states. Integrated Antigravity into independent rate-limit refreshes. Updated status-bar visibility, bucket rendering, compact and detailed views, tooltip sections, and related tests. 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Description checkExplanation The description is complete and directly addresses the template. It includes the ELI5 explanation, scope, rationale, linked issues, visual proof, testing, AI disclosure, security and compatibility review, and checklist status. The missing standalone Agent skill upstream boundary and Notes headings are non-critical because the relevant scope considerations are covered elsewhere.
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
🧹 Nitpick comments (4)
src/main/rate-limits/antigravity-loopback-client.ts (1)
75-90: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winRelax the
__APP_CONFIG__terminator match.The pattern requires
};</script>with no characters between. Antigravity can emit whitespace, a newline, or additional statements before the closing tag. In that case the match fails,parseAntigravityAppConfigreturnsnull, and desktop CSRF negotiation degrades silently to an unauthenticated retry.Allow optional whitespace and stop at the first
</script>.♻️ Proposed relaxation
- const configJson = html.match(/window\.__APP_CONFIG__\s*=\s*(\{.*?\});<\/script>/s)?.[1] + const configJson = html.match(/window\.__APP_CONFIG__\s*=\s*(\{.*?\})\s*;?\s*(?:<\/script>|$)/s)?.[1]src/main/rate-limits/antigravity-usage-fetcher.ts (1)
58-65: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueCompute the log directory once.
getAntigravityCliLogDirectory(homePath)is called at Line 61 and again at Line 65 with the same argument. Hoist it above thereaddircall.♻️ Proposed cleanup
async function fetchFromCliLogs(homePath: string, signal: AbortSignal): Promise<FetchAttempt> { + const logDirectory = getAntigravityCliLogDirectory(homePath) let entries: Dirent[] try { - entries = await readdir(getAntigravityCliLogDirectory(homePath), { withFileTypes: true }) + entries = await readdir(logDirectory, { withFileTypes: true }) } catch { return { discovered: false, answered: false, limits: null } } - const logDirectory = getAntigravityCliLogDirectory(homePath) const logNames = entriessrc/main/rate-limits/antigravity-usage-fetcher.test.ts (1)
33-51: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueDuplicated loopback test-server setup across the two Antigravity test files. Six tests repeat the same sequence: create a server,
listen(0, '127.0.0.1'), narrowserver.address(), throw when the address is not a TCP object, and close the server infinally. The shared root cause is the absence of one loopback test fixture that returns the bound port and handles teardown.
src/main/rate-limits/antigravity-usage-fetcher.test.ts#L33-L51: replace the four inline setup and teardown blocks in this file with the shared fixture, and keep the HTTPS variant as an option of that fixture.src/main/rate-limits/antigravity-loopback-client.test.ts#L53-L93: replace the two inline setup and teardown blocks with the same fixture.Give the fixture a concrete domain name such as
antigravity-loopback-test-server.ts. Do not name ithelpersorutils. This is optional cleanup; the current assertions are correct. As per coding guidelines: "Do not use vague names such ashelpers,utils,common,misc, orshared-stufffor files, folders, or modules; use concrete domain-oriented names instead."Source: Coding guidelines
src/main/rate-limits/service.test.ts (1)
2139-2153: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winAdd a test that pins Antigravity independence from Gemini.
The failure-isolation test now covers an Antigravity rejection. It does not cover the specific regression this PR fixes: Antigravity state must not mirror Gemini state. Add a case where
fetchGeminiRateLimitsrejects or reports unavailable whilefetchAntigravityRateLimitsresolves, then assertstate.antigravity?.statusis'ok'and its usage does not equal the Gemini values. That assertion prevents a future refactor from reintroducing the mirroring described in the linked issue.Also consider asserting the
'unavailable'plusfailureKind: 'cli-unavailable'result reaches state, because the status bar renders that case differently from'error'.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 0c7e5489-cf33-48f1-9c80-6228b13c046c
📒 Files selected for processing (18)
config/tsconfig.node.jsonsrc/main/rate-limits/antigravity-loopback-client.test.tssrc/main/rate-limits/antigravity-loopback-client.tssrc/main/rate-limits/antigravity-quota-parser.test.tssrc/main/rate-limits/antigravity-quota-parser.tssrc/main/rate-limits/antigravity-usage-fetcher.test.tssrc/main/rate-limits/antigravity-usage-fetcher.tssrc/main/rate-limits/service.test.tssrc/main/rate-limits/service.tssrc/renderer/src/components/status-bar/StatusBar.tsxsrc/renderer/src/components/status-bar/UsageRosterPanel.test.tsxsrc/renderer/src/components/status-bar/UsageRosterPanel.tsxsrc/renderer/src/components/status-bar/provider-segment-monthly-window.test.tsxsrc/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/shared/rate-limit-types.ts
|
Addressed the CodeRabbit feedback in
I left the suggested shared test-server fixture out because it was marked optional and would add structural churn without changing coverage. Validation after the changes:
|
|
Note GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer. |
|
Integrated current Fresh validation on the rebased head:
The two Actions workflows currently show @coderabbitai review |
|
Your plan includes PR reviews subject to rate limits. Reviews are available now. |
There was a problem hiding this comment.
🧹 Nitpick comments (2)
src/main/rate-limits/antigravity-loopback-client.ts (2)
75-119: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winCompute the script boundary during the scan, not before it.
endis fixed at the first</script>match afterstart. If a JSON string value contains the text</script>, the scan stops inside the object andparseAntigravityAppConfigreturns null. The brace matcher already tracks string state, so the bound is redundant: an unterminated object ends the loop athtml.lengthanyway.♻️ Proposed simplification
- const scriptEndPattern = /<\/script\s*>/gi - scriptEndPattern.lastIndex = start - const end = scriptEndPattern.exec(html)?.index ?? html.length let depth = 0 let escaped = false let inString = false - for (let index = start; index < end; index += 1) { + for (let index = start; index < html.length; index += 1) {
139-233: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winConfirm the promise settles when the request closes without an
errorevent.The promise resolves on
endand rejects onerrorortimeout. A socket that closes after headers but beforeend, or an externalreq.destroy()with no error argument, leaves the promise pending. Acloseguard removes that risk.🛡️ Proposed guard
req.on('error', (error) => { @@ reject(error) }) + req.on('close', () => + reject(new AntigravityLoopbackResponseError('Antigravity quota request closed early')) + ) req.end(body)The extra
rejectafter a settled promise is a no-op.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: bd7437b5-611e-4c55-b6c1-74cbd26eea18
📒 Files selected for processing (25)
config/tsconfig.node.jsonsrc/main/rate-limits/antigravity-loopback-client.test.tssrc/main/rate-limits/antigravity-loopback-client.tssrc/main/rate-limits/antigravity-quota-parser.test.tssrc/main/rate-limits/antigravity-quota-parser.tssrc/main/rate-limits/antigravity-usage-fetcher.test.tssrc/main/rate-limits/antigravity-usage-fetcher.tssrc/main/rate-limits/antigravity-usage-log-rotation.test.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.tssrc/renderer/src/components/status-bar/StatusBar.tsxsrc/renderer/src/components/status-bar/UsageRosterPanel.test.tsxsrc/renderer/src/components/status-bar/UsageRosterPanel.tsxsrc/renderer/src/components/status-bar/provider-segment-monthly-window.test.tsxsrc/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/shared/rate-limit-types.ts
🚧 Files skipped from review as they are similar to previous changes (15)
- config/tsconfig.node.json
- src/renderer/src/components/status-bar/UsageRosterPanel.tsx
- src/renderer/src/components/status-bar/tooltip.tsx
- src/renderer/src/components/status-bar/UsageRosterPanel.test.tsx
- src/shared/rate-limit-types.ts
- src/renderer/src/components/status-bar/provider-segment-monthly-window.test.tsx
- src/renderer/src/components/status-bar/status-bar-provider-visibility.test.ts
- src/main/rate-limits/antigravity-usage-fetcher.test.ts
- src/main/rate-limits/antigravity-quota-parser.ts
- src/renderer/src/components/status-bar/status-bar-provider-visibility.ts
- src/main/rate-limits/antigravity-loopback-client.test.ts
- src/renderer/src/components/status-bar/StatusBar.tsx
- src/main/rate-limits/service.ts
- src/main/rate-limits/antigravity-quota-parser.test.ts
- src/renderer/src/components/status-bar/tooltip.test.ts
|
Addressed the two nitpicks from the full review in
Validation on the pushed commit:
@coderabbitai review |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== HEAD AND TARGET COMMIT ==='
git rev-parse --short HEAD
git show --no-ext-diff --format=fuller --stat f47d07f57
echo '=== TARGET COMMIT DIFF ==='
git diff --no-ext-diff --unified=80 f47d07f57^ f47d07f57 -- \
src/main/rate-limits/antigravity-loopback-client.ts \
src/main/rate-limits/antigravity-loopback-client.test.ts
echo '=== SOURCE OUTLINE ==='
ast-grep outline src/main/rate-limits/antigravity-loopback-client.ts --items all --view expanded
echo '=== TEST OUTLINE ==='
ast-grep outline src/main/rate-limits/antigravity-loopback-client.test.ts --items all --view expanded
echo '=== REQUEST AND APP-CONFIG REFERENCES ==='
rg -n -C 8 --glob 'antigravity-loopback-client*.ts' \
'requestAntigravityLoopbackPage|parseAntigravityAppConfig|\.on\(.close.|\.once\(.close.|</script>|__APP_CONFIG__|AntigravityLoopbackResponseError' \
src/main/rate-limitsLength of output: 38472 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== CLOSE-EVENT TEST OUTLINE AND CONTENT ==='
ast-grep outline src/main/rate-limits/antigravity-loopback-request-close.test.ts --items all --view expanded
cat -n src/main/rate-limits/antigravity-loopback-request-close.test.ts
echo '=== PR MERGE BASE AND CHANGED FILES ==='
base="$(git merge-base HEAD origin/main 2>/dev/null || git merge-base HEAD main)"
printf 'merge-base: %s\n' "$base"
git diff --no-ext-diff --name-status "$base"...HEAD
echo '=== COMPLETE PR DIFF STAT ==='
git diff --no-ext-diff --stat "$base"...HEAD
echo '=== COMPLETE PR DIFF (COMPACT) ==='
git diff --no-ext-diff --unified=12 "$base"...HEAD -- \
src/main/rate-limits \
src/renderer/src/components/status-bar \
src/shared/rate-limit-types.ts \
config/tsconfig.node.jsonLength of output: 105444
The request now settles when it closes before response completion. The isolated regression verifies the structured The parser stops at the closing I will now run the updated PR review. If you found this review helpful, would you consider giving us a shout-out on X? Thank you for using CodeRabbit!
|
|
Note GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer. |
|
Updated this branch to current The only merge conflict was in the shared provider refresh orchestration. The resolution preserves main's new Codex skip-state gating while keeping Antigravity as an independent, host-local quota fetch, so a Codex account transition cannot block or misroute Antigravity discovery. Fresh validation after the merge:
@coderabbitai review |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '=== MERGE COMMIT ==='
git show --no-ext-diff --format=fuller --stat 135f74210
git show --no-ext-diff --format= --cc --unified=50 135f74210 -- src/main/rate-limits/service.ts
echo '=== SERVICE MODULE OUTLINE ==='
ast-grep outline src/main/rate-limits/service.ts --items all --view expanded
echo '=== ORCHESTRATION REFERENCES ==='
rg -n -C 10 --type ts \
'fetchAntigravityRateLimits|fetchCodexRateLimits|codex|antigravity|skip' \
src/main/rate-limits/service.ts \
src/main/rate-limits/service-refresh-orchestration.test.ts \
src/main/rate-limits/service-window-activation.test.ts \
src/main/rate-limits/service-account-target-selection.test.ts
echo '=== PR CHANGED SERVICE-RELATED FILES ==='
base="$(git merge-base HEAD origin/main 2>/dev/null || git merge-base HEAD main)"
git diff --no-ext-diff --name-status "$base"...HEAD -- src/main/rate-limitsLength of output: 201409 🏁 Script executed: #!/bin/bash
set -euo pipefail
parents=($(git show -s --format=%P 135f74210))
printf 'parents: %s\n' "${parents[*]}"
echo '=== SERVICE: FIRST PARENT TO MERGE ==='
git diff --no-ext-diff --unified=25 "${parents[0]}" 135f74210 -- src/main/rate-limits/service.ts
echo '=== SERVICE: SECOND PARENT TO MERGE ==='
git diff --no-ext-diff --unified=25 "${parents[1]}" 135f74210 -- src/main/rate-limits/service.ts
echo '=== FULL-REFRESH IMPLEMENTATION ==='
sed -n '1600,1910p' src/main/rate-limits/service.ts
echo '=== TARGETED ORCHESTRATION TESTS ==='
rg -n -A45 -B8 --type ts \
'keeps Antigravity usage when Gemini usage is unavailable|fetches Gemini, Antigravity, and OpenCode Go|skip|gated Codex|Codex.*skip' \
src/main/rate-limits/service-refresh-orchestration.test.ts \
src/main/rate-limits/service-account-target-selection.test.tsLength of output: 74517
The merge preserves the Codex skip-state gate in A skipped Codex home gates only the Codex fetch slot. It does not return from the full refresh cycle.
The reviewed tests cover Codex skip handling and Antigravity health when Gemini is unavailable. The merge does not restore Gemini-mirrored Antigravity usage. ✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 06d2a238-580c-4d84-86ff-91188b6c9a6c
📒 Files selected for processing (26)
config/tsconfig.node.jsonsrc/main/rate-limits/antigravity-loopback-client.test.tssrc/main/rate-limits/antigravity-loopback-client.tssrc/main/rate-limits/antigravity-loopback-request-close.test.tssrc/main/rate-limits/antigravity-quota-parser.test.tssrc/main/rate-limits/antigravity-quota-parser.tssrc/main/rate-limits/antigravity-usage-fetcher.test.tssrc/main/rate-limits/antigravity-usage-fetcher.tssrc/main/rate-limits/antigravity-usage-log-rotation.test.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.tssrc/renderer/src/components/status-bar/StatusBar.tsxsrc/renderer/src/components/status-bar/UsageRosterPanel.test.tsxsrc/renderer/src/components/status-bar/UsageRosterPanel.tsxsrc/renderer/src/components/status-bar/provider-segment-monthly-window.test.tsxsrc/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/shared/rate-limit-types.ts
🚧 Files skipped from review as they are similar to previous changes (24)
- src/renderer/src/components/status-bar/tooltip.tsx
- src/main/rate-limits/service-live-claude-usage.test.ts
- src/main/rate-limits/service-account-target-selection.test.ts
- src/main/rate-limits/service-window-activation.test.ts
- src/main/rate-limits/service-minimax-usage.test.ts
- src/shared/rate-limit-types.ts
- src/renderer/src/components/status-bar/UsageRosterPanel.tsx
- src/main/rate-limits/antigravity-loopback-request-close.test.ts
- src/renderer/src/components/status-bar/status-bar-provider-visibility.ts
- src/renderer/src/components/status-bar/status-bar-provider-visibility.test.ts
- src/main/rate-limits/service-inactive-account-previews.test.ts
- src/renderer/src/components/status-bar/tooltip.test.ts
- config/tsconfig.node.json
- src/renderer/src/components/status-bar/UsageRosterPanel.test.tsx
- src/main/rate-limits/antigravity-quota-parser.ts
- src/main/rate-limits/antigravity-quota-parser.test.ts
- src/main/rate-limits/antigravity-loopback-client.test.ts
- src/main/rate-limits/antigravity-usage-fetcher.test.ts
- src/renderer/src/components/status-bar/provider-segment-monthly-window.test.tsx
- src/main/rate-limits/service-refresh-orchestration.test.ts
- src/main/rate-limits/service.ts
- src/main/rate-limits/rate-limit-service-test-harness.ts
- src/main/rate-limits/antigravity-usage-fetcher.ts
- src/renderer/src/components/status-bar/StatusBar.tsx
Included review availability: Your plan includes up to 10 reviews per rolling hour; 9 remain after this review.
|
Note GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer. |
|
Addressed the latest full-review finding and updated this branch to current The loopback client now enforces both socket-inactivity and fixed wall-clock request deadlines. The wall-clock timer is cleared on completion/error/close, and regression coverage verifies a trickling response cannot keep the request alive, early close cancels the timer, and the independent six-second discovery deadline remains effective across multiple silent endpoints. The CodeRabbit thread has been replied to and resolved. Fresh validation:
The aggregate web typecheck currently stops in an untouched current-main tab-bar test fixture introduced by @coderabbitai review |
|
Your plan includes PR reviews subject to rate limits. Reviews are available now. |
|
Updated #14571 to current I also re-audited the two related implementations. This PR remains the bounded provider-preserving option: newest-responsive log-tail discovery, HTTP/HTTPS plus desktop fallback, fixed endpoint/response/time limits, no credential or process-command inspection, and explicit stale-runtime/race coverage. The PR description now also links #7809, whose pending/visibility acceptance criteria this implementation covers. Fresh validation:
The full run had three environment-dependent assertions in two new, untouched current-main files. @coderabbitai review |
|
Your plan includes PR reviews subject to rate limits. Reviews are available now. |
|
Updated #14571 to current The additional hardening:
Fresh validation on the pushed head:
The PR description now includes the refreshed evidence and a current comparison with #11536 and #12095. |
|
I found one reproducible edge case in the bounded CLI-log discovery.
I tested a bounded fix that:
This preserves the bounded I/O/cancellation and late-open cleanup behavior while retaining both startup listener announcements and later log content. I also added a regression with the listener near the start followed by >128 KiB of filler. Validation of the patched #14571 code:
I also validated it against a real host-local Antigravity runtime. The quota RPC returned all four buckets, and Orca rendered them correctly in both Detailed and Compact usage views across refreshes. I additionally checked the desktop UI directly against Antigravity CLI quota output; the values/reset windows were consistent. I did not have a naturally occurring >256 KiB Antigravity log locally (largest CLI log was ~31 KiB), so that exact real-world long-log condition is covered synthetically rather than by a natural runtime sample. The local validation commit is |
|
Windows validation from a current install:
The existing Orca release still mirrors Gemini usage and fails when the legacy agy -p /usage --output-format json --print-timeout 1mThat returns structured
Each bucket includes This does not replace the loopback implementation in this PR, but it may be a useful Windows fallback or future simplification because print mode works without a PTY in Agy 1.1.18. No credentials or account identifiers are involved in the output parsing. |
Preserve native Antigravity quota authority, adapt upstream mirror regressions, and retain bounded head/tail log discovery.
Keep desktop-only Antigravity usage visible without requiring agy on PATH, preserve absent-runtime gating, and stop parsing when cancellation lands after the final log read.
|
Updated #14571 to current Thanks @plaonn — the long-log edge case is now covered by a bounded read of the whole file up to 256 KiB, or the first and final 128 KiB for larger logs. Regression coverage places the listener announcement at both the beginning and end of a >256 KiB log, and the read now observes cancellation at the final-read boundary. Thanks @mikeascendx — I also fixed the desktop-only visibility gap: a healthy Antigravity Desktop runtime can expose the usage item even when The current-main integration also supersedes the temporary Gemini-to-Antigravity mirror with the native provider and adapts its regression tests so Gemini state cannot overwrite Antigravity state. Fresh validation on the pushed head:
The PR description now contains the refreshed comparison with #11536 and #12095 plus the exact validation/disclosure details. |
|
Refreshed this branch onto current The integration was conflict-free. A completed adversarial review found two current-main edge cases, both now fixed with regression coverage:
Final adversarial review through Validation:
The exhaustive repository run also completed. Its failures were limited to six unchanged current-main/environment-sensitive files; no changed-path test failed. The remote-terminal and palette failures passed in isolation, while the shell and Codex failures reproduce independently of this PR on this local checkout. |
|
Closing this PR as superseded by #24073 and its status-bar follow-up #24074, both now merged into The merged implementation reads quota through |
ELI5
Antigravity already knows the real quota for the account it is running. Orca was showing a copy of Gemini usage instead. This change asks the already-running, host-local Antigravity service for its own quota and displays the four real 5-hour/weekly buckets in both Compact and Detailed views—without taking ownership of Antigravity credentials.
What Changed
agyis not installed onPATH, while still hiding the item after discovery confirms no runtime exists.mainand migrate coverage into the new split rate-limit test architecture.Why
The running Antigravity language server is the quota authority for the active account. Reading that host-local runtime fixes the incorrect Gemini mirror while keeping the change focused: Orca does not read, refresh, or write OAuth/keychain credentials, inspect process command lines, or replace the current Gemini usage backend.
Removing Gemini usage is intentionally separable migration work: it spans persisted settings, telemetry, localization, mobile/web projections, and compatibility behavior. Preserving it here keeps the correctness fix bounded and avoids forcing that broader migration on existing users.
This is the focused successor to #8735. It retains that PR's loopback-first architecture, updated for the current Compact/Detailed usage UI and narrowed to bounded runtime discovery.
Current
mainadded a temporary Gemini-to-Antigravity mirror while this PR was open. This integration deliberately replaces that compatibility mirror with the native host-local authority and adapts its regression coverage so Gemini failures, successes, and cached snapshots can no longer overwrite Antigravity state.The headless
agy -p /usageoutput reported for Agy 1.1.18 is a promising future fallback, but adopting it safely also requires cross-platform executable resolution and subprocess deadline policy. It is not required for desktop-only installs here: a healthy desktop runtime snapshot now exposes the item without requiringagyonPATH.Related implementations
lsof/ps, including command-line CSRF; HTTP path onlyAs of the validation below, #11536 is 116 commits behind current
mainand changes 72 files; #12095 is 673 commits behind, conflicting, and has three unresolved review threads. This PR is current withmain, mergeable, changes 33 files, and has no unresolved review threads.Linked Issue
Fixes #9122
Fixes #7809
Visual Proof
Before — broken bottom icon
Before — broken popup
After — Compact view
After — Detailed view, Used
After — Detailed view, Left
Testing
Validation on current
main(94e7586665c2), at PR head05ea85005:pnpm lint: passed, including reliability, max-lines, runtime, bundled-skill, and localization gates.pnpm tc: passed.pnpm format: passed.git diff --check: passed.The exhaustive full-repository run reported 12 failures across six files untouched by this PR: four current-main Codex PTY assertions supplemented their mocks from this machine's real
~/.codex/auth.json, one shellZDOTDIRassertion is environment-dependent, two palette performance budgets missed under load, and five remote-terminal timers missed under load. The palette suite passed 3/3 and the remote-terminal suites passed 37/37 in isolation. The shell and Codex failures reproduce in isolation on this checkout and are absent from the PR diff. No changed-path test failed.AI Disclosure
OpenAI Codex was used for implementation assistance, conflict resolution, test expansion, and adversarial review. Google Antigravity (
agy) was used for additional repository analysis and adversarial checks. The behavior shown above was manually exercised, and repository validation was run after integrating currentmain.Review
127.0.0.1; the self-signed HTTPS exception cannot apply to network hosts. The fetcher uses a fixed RPC path, validates ports and Antigravity page identity, caps responses at 1 MiB, reads at most 256 KiB per log, and never accesses credentials/keychains.lsof/pscommands. macOS is the platform manually exercised; CI covers the remaining supported platforms.Checklist
pnpm lintand the expanded affected suite passAuthor