{"id":52047586,"url":"https://github.com/cblage/antigravity-ai-launcher","last_synced_at":"2026-08-02T09:02:03.727Z","repository":{"id":373503359,"uuid":"1298604178","full_name":"cblage/antigravity-ai-launcher","owner":"cblage","description":"AI launcher extension for Antigravity IDE","archived":false,"fork":false,"pushed_at":"2026-07-28T05:29:38.000Z","size":113,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-28T07:17:22.594Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cblage.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-12T20:33:03.000Z","updated_at":"2026-07-28T05:30:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cblage/antigravity-ai-launcher","commit_stats":null,"previous_names":["cblage/antigravity-ai-launcher"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/cblage/antigravity-ai-launcher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cblage%2Fantigravity-ai-launcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cblage%2Fantigravity-ai-launcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cblage%2Fantigravity-ai-launcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cblage%2Fantigravity-ai-launcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cblage","download_url":"https://codeload.github.com/cblage/antigravity-ai-launcher/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cblage%2Fantigravity-ai-launcher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36188195,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-08-02T02:00:06.915Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-08-02T09:02:02.647Z","updated_at":"2026-08-02T09:02:03.716Z","avatar_url":"https://github.com/cblage.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Antigravity AI Launcher\n\nA small local Antigravity IDE extension that keeps Antigravity, Claude Code,\nCodex, DeepSeek, Grok, and Kimi Code launchers visible even when no editor is\nopen, and shows\nthe available quota gauges for whichever quota-based provider is selected in\nthe secondary sidebar. Antigravity, Claude, and Kimi expose separate 5h and\nweekly gauges; Codex and Grok expose only their main weekly gauges. The gauges\ndisappear whenever the sidebar is closed, and remain hidden while DeepSeek is\nselected because its usage is billed per token.\n\nThe gauges report **usage** rather than quota remaining:\n\n```text\n[5h $(circle-filled)$(circle)$(circle)$(circle)$(circle) 01%]\n[7d $(circle-filled)$(circle-filled)$(circle)$(circle)$(circle) 28% $(pass-filled)]\n```\n\nWeekly-only providers use this form and never fabricate a 5h bucket:\n\n```text\n[7d $(circle-filled)$(circle)$(circle)$(circle)$(circle) 11% $(warning)]\n```\n\nEach five-position bar uses VS Code's filled and hollow circle Codicons\n(`$(circle-filled)` and `$(circle)`).\nPositive usage is rounded upward to the next circle for visibility; the\nadjacent numeric percentage remains exact and authoritative. This avoids the\ninconsistent fallback-font metrics used by fractional Unicode Block Elements.\n\nEvery weekly gauge compares quota used with the percentage of its seven-day\nwindow that had elapsed when the quota sample was observed. `$(pass-filled)`\nmeans usage is at or below that pace; `$(warning)` means usage is ahead of it.\nThe tooltip shows both percentages and the exact percentage-point difference.\nUsing the quota sample's observation time prevents stale cached data from\nappearing progressively healthier merely because the wall clock advanced.\n\nThe provider name is intentionally omitted from the gauges. Provider launchers\nuse plain text with no icons or active-state markers. The launcher currently\nselected in the secondary sidebar uses Antigravity's focus/accent color. The VS\nCode extension API only permits warning and error status-bar backgrounds, so\nthe active-state accent is applied to the label foreground.\n\nThe visible quota gauges use that same active-provider accent. Warning and error\ngauges retain Antigravity's native foreground/background pairing for readability.\n\nIt refreshes every minute. Every visible quota gauge is clickable and forces an\nimmediate refresh, as does **Antigravity AI Launcher: Refresh Active AI Quota**\nin the Command Palette. There is no persistent refresh widget. During a manual\nrefresh, a normally hidden, one-glyph activity item appears immediately to the\nleft of the gauges, animates with the Braille spinner, and briefly becomes a\nsuccess check. Both states use the same focus/accent color as the active\nprovider and its gauges. The gauges remain visible and unchanged throughout. The\nactivity item sits farthest left and therefore wraps out before either gauge if\nthe refresh temporarily exceeds the available width. Further narrowing wraps\nthe 5h gauge, then the 7d gauge. Codex and Grok show only the 7d gauge. Each gauge\nindependently receives the warning status-bar color at 70% usage and the error\ncolor at 90% usage.\nIf no quota snapshot can be loaded, the gauge collapses to\n`$(warning) Unable to load quota` with the native warning background; its\ntooltip retains the provider error and the item remains clickable to retry.\n\nThe complete activity/gauge/launcher cluster uses priorities 0.7 through 0.025,\nso it stays grouped immediately to the left of Antigravity's priority-0\n**Antigravity - Settings** item. The always-visible `$(eye)` control sits\nimmediately to the right of Kimi.\n\nWhile the secondary sidebar is active, the global timer checks the selected\nprovider every minute, but Claude and Kimi live endpoint reads and Grok ACP\nbilling probes are limited to once per five minutes. A fresh Claude Code shared cache\nalways wins and can satisfy\nthose checks without an endpoint request. The launcher also persists Claude's\nlast good snapshot, last automatic attempt/error, and active rate-limit backoff\nin extension-global state, so installing a VSIX or reloading the window cannot\nreset the five-minute guard and immediately hit the endpoint again. Grok uses\nthe same persisted last-good and attempt guard. Each Grok probe starts the\nofficial CLI only long enough to perform the ACP handshake and billing request,\nthen terminates it; an authentication or CLI failure therefore cannot create a\nnew process on every one-minute UI tick. Manual refresh bypasses the ordinary\nfive-minute freshness/failure guard.\n\n## Launchers\n\n| Button | Target command | Behavior |\n| --- | --- | --- |\n| Antigravity | `antigravity.agentSidePanel.focus` | Opens and focuses the Antigravity agent view without toggling it closed. |\n| Claude | `claude-vscode.sidebar.open` | Runs **Claude Code: Open in Side Bar**, matching the Actions search command exactly. |\n| Codex | `chatgpt.openSidebar` | Opens the Codex secondary sidebar. |\n| DeepSeek | `cblage.codewhale.openChat` | Opens the cblage CodeWhale extension in the secondary sidebar and hides the quota gauges. |\n| Grok | `grok.open` | Opens Grok in the secondary sidebar and shows its shared weekly quota gauge. |\n| Kimi | `kimi.openInSideBar` | Enables Kimi Code's secondary-sidebar setting globally, opens Kimi there, and shows its 5h and weekly quota gauges. |\n| `$(eye)` | `workbench.action.toggleMaximizedAuxiliaryBar` | Toggles maximize/restore while the secondary sidebar is open. When it is closed, opens the last selected provider (Antigravity by default) and maximizes it. |\n\nAntigravity and the `$(eye)` control are always visible. Claude, Codex,\nDeepSeek, Grok, and Kimi are shown only while their corresponding extensions are\ninstalled and enabled. The status bar updates immediately when an extension is\ninstalled, uninstalled, enabled, or disabled. If the last selected provider is\nno longer available, the eye control falls back to Antigravity.\n\nEach model launcher is a toggle. Clicking an inactive model opens it in the\nsecondary sidebar. Clicking the active model closes the secondary sidebar;\nits launcher immediately returns to the normal neutral status-bar foreground\nand the gauges disappear.\n\nThe Command Palette also contains **Antigravity AI Launcher: New Antigravity\nConversation**.\n\n## Active-provider detection\n\nVS Code's extension API does not expose the selected secondary-sidebar\ncontainer. Antigravity does persist it in the current workspace database under\n`workbench.auxiliarybar.activepanelid`, so the extension reads that value with\nmacOS's `/usr/bin/sqlite3` in read-only mode. A single 40ms loop checks the\ndatabase and WAL signatures, querying SQLite only after a storage change or on\nthe two-second fallback cadence. Opening a launcher suppresses persisted state\nfor 1100ms, then refuses stale hidden snapshots until persistence confirms the\nexact requested visible view. Standard Secondary Side Bar controls invoke\n`workbench.action.toggleAuxiliaryBar`; the launcher intercepts that command,\nupdates its state synchronously, and delegates to the idempotent close or focus\ncommand. Antigravity's custom React close button bypasses workbench commands,\nso a serialized 40ms `Cascade.getFocusState()` probe reads its live view-\ncontainer visibility directly. SQLite cannot overwrite that live Antigravity\nstate. X-button changes therefore do not wait for SQLite. Clicking\nthe active launcher to close uses the same 1100ms suppression before its forced\nreconciliation. Reads are serialized, and a read started before an optimistic\naction cannot overwrite that newer UI state. Every subsequent launcher click\ncancels the prior grace, invalidates reads from that state, and starts a new\n1100ms grace for the latest open or closed intent. The optimistic state and\ngrace begin synchronously at the first line of the click handler, before the\nmain-thread command-discovery\nRPC or target sidebar command runs. Delayed command discovery is discarded if\na newer click has replaced its generation, so async completion order cannot\nreorder user intent. Transitional database writes cannot flash an obsolete\nstate, and completion of an older command never reapplies its intent. The\nextension activates eagerly, registers its commands without\nwaiting for the initial SQLite read, and begins neutral while that read runs in\nthe background. A first click therefore cannot be interrupted by cold-start\ninitialization; it invalidates the background read if necessary.\n\nRecognized containers are:\n\n| Provider | Antigravity container ID |\n| --- | --- |\n| Antigravity | `antigravity.agentViewContainerId` |\n| Claude | `workbench.view.extension.claude-sidebar-secondary` |\n| Codex | `workbench.view.extension.codexSecondaryViewContainer` |\n| DeepSeek | `workbench.view.extension.cblage-codewhale` |\n| Grok | `workbench.view.extension.grokSidebar` |\n| Kimi | `workbench.view.extension.kimi-secondary-sidebar` |\n\nIf the secondary sidebar is hidden, no launcher is marked active and all gauges\nare hidden. The last-selected provider's quota stays cached so reopening it can\nrestore the gauges immediately; data older than 15 seconds is refreshed. If\nAntigravity changes its internal state key, launcher clicks still select the\ncorrect provider optimistically, but automatic detection will need an update.\n\nAn explicit model-button close remains authoritative after its 1100ms grace\nuntil workspace persistence actually confirms that the secondary sidebar is\nhidden. Antigravity can defer that workspace-state write beyond the grace\ndeadline, so stale persisted `visible` values are rejected instead of briefly\nreactivating the launcher and gauges. A newer model-button intent immediately\ncancels this close confirmation latch. Incomplete SQLite query results preserve\nthe last known visibility and selection rather than defaulting to active.\n\n## Quota sources\n\nNo extra account, API key, or hosted service is required.\n\n| Provider | Source |\n| --- | --- |\n| Antigravity | Antigravity's authenticated localhost `RetrieveUserQuotaSummary` endpoint, using its real `gemini-5h` and `gemini-weekly` buckets. |\n| Claude | Claude Code's local shared usage cache when no more than five minutes old; otherwise the existing Claude Code OAuth credential is used only for `https://api.anthropic.com/api/oauth/usage`. Live endpoint reads have a five-minute memory TTL. HTTP 429 responses honor numeric or HTTP-date `Retry-After`, default to a 15-minute backoff, and double repeated fallback backoffs up to one hour. |\n| Codex | The configured Codex CLI's `app-server` and `account/rateLimits/read`; if that is unavailable, the latest main `codex` local session rate-limit event is used. The current weekly-only main bucket is shown and model-specific buckets such as Codex Spark are ignored. The extension honors Antigravity's `chatgpt.cliExecutable` setting, including the Codex.app binary. |\n| DeepSeek | No quota source. The launcher hides both gauges because DeepSeek usage is billed per token. |\n| Grok | The configured official Grok CLI's ACP stdio interface and `_x.ai/billing`. The shared weekly pool uses `creditUsagePercent` and `currentPeriod`; the probe performs no `session/new` or model request. The extension honors Grok's `grok.cliPath` setting, then checks `~/.grok/bin/grok`, then `PATH`. |\n| Kimi | Kimi Code's hidden `_kimi.getManagedUsage` command. Kimi retains its OAuth credentials and returns only versioned, JSON-safe quota windows and optional Booster wallet totals. The launcher shows the 5h and weekly windows and keeps Booster balance/monthly spend in the shared tooltip. |\n\nThe extension never logs, displays, or stores provider credentials. Antigravity's\nCSRF token is read from the local Antigravity language-server process and sent\nonly back to an authenticated loopback port. The Claude token is read from the\nexisting credentials file or macOS Keychain and sent only to Anthropic over\nHTTPS. Codex and Grok authentication remain inside their official CLIs, and\nKimi authentication remains inside Kimi Code; the launcher never reads or\nstores their credential files.\n\nIf Codex Pulse or Claude Control is also installed, their separate status-bar\ngauges can be disabled in Settings to avoid duplicate quota displays; this\nextension does not change their settings automatically.\n\n## Settings\n\n| Setting | Default | Effect |\n| --- | --- | --- |\n| `antigravityAiLauncher.quota.enabled` | `true` | Shows the active provider's available gauges while the secondary sidebar is open: 5h and weekly for Antigravity/Claude/Kimi, weekly only for Codex/Grok, and none for DeepSeek. |\n| `antigravityAiLauncher.quota.showBars` | `true` | Shows five-position filled-and-hollow circle Codicon bars alongside the percentages. |\n\n## Test\n\n```sh\nnpm run check\nnpm test\n```\n\nThe extension has no runtime npm dependencies and requires no build step.\n\n## Package\n\n```sh\nnpx --yes @vscode/vsce package --no-dependencies\n```\n\n`vsce` reads the version from `package.json` and names the output\n`antigravity-ai-launcher-\u003cversion\u003e.vsix` automatically.\n\n## Install in Antigravity IDE\n\nRun **Extensions: Install from VSIX...** from Antigravity's Command Palette,\nchoose the generated `antigravity-ai-launcher-\u003cversion\u003e.vsix`, and then run **Developer: Reload\nWindow**.\n\n## Uninstall\n\n```sh\n\"/Applications/Antigravity IDE.app/Contents/Resources/app/bin/antigravity-ide\" \\\n  --uninstall-extension cblage.antigravity-ai-launcher\n```\n\n## Compatibility\n\nThis is intentionally a local macOS Antigravity integration. The provider\ncommands, Antigravity workspace-state key, localhost quota endpoint, Codex\napp-server protocol, Grok ACP billing method, and Kimi sidebar/managed-usage\ncommands are integration surfaces owned by their respective apps.\nFailures preserve the last good quota value and mark it stale rather than\nsilently replacing it with zero. Manual Claude refreshes bypass ordinary\nfreshness caching but never bypass an active rate-limit backoff; only a\nsuccessful Claude endpoint response resets exponential backoff state. Grok\nrate-limit errors use the same bounded backoff principle, while ordinary Grok\ntransport/configuration failures remain manually retryable and preserve only a\nlast-good snapshot whose weekly period has not ended.\n\nSee `THIRD_PARTY_NOTICES.md` for acknowledgements.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcblage%2Fantigravity-ai-launcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcblage%2Fantigravity-ai-launcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcblage%2Fantigravity-ai-launcher/lists"}