Repository navigation
Description
Area
Authentication and account pool
What are you trying to accomplish?
Use a Google AI Pro Antigravity subscription through opencodex from a local, single-user harness (Codex CLI / Claude Code) without re-extracting the OAuth credential and replaying it against cloudcode-pa.googleapis.com, because that pattern is currently being auto-banned.
Concrete evidence from this week: a two-account Antigravity pool lost one account to 403 PERMISSION_DENIED / reason=TOS_VIOLATION / domain=cloudcode-pa.googleapis.com on 2026-11-06 07:12 UTC. The other account still answers 200. The official forum shows a batch of identical reports on 2026-11-05/06:
- https://discuss.ai.google.dev/t/appeal-3-antigravity-gemini-cli-accounts-disabled-403-tos-2026-11-06-wave-form-and-email-submitted/198506
- https://discuss.ai.google.dev/t/request-for-manual-review-antigravity-access-disabled-403-tos-violation-third-party-integration-removed/198604
What prevents this today?
opencodex's Antigravity path is a reverse proxy: it imports the OAuth credential and replays it with a spoofed official client fingerprint. From src/adapters/client-fingerprint.ts:
ANTIGRAVITY_IDE_VERSION = "2.5.5"
ANTIGRAVITY_IDE_PLATFORM = "windows/amd64" // constant, regardless of host OS
ANTIGRAVITY_CLI_VERSION = "1.3.4"
ANTIGRAVITY_CLI_PLATFORM = "darwin/arm64"That is exactly the class of traffic Google's gateway classifies as third-party token proxying, and the ban is enforced on request characteristics, not on credential validity (403, not 401).
What should OpenCodex do?
Add an ACP-backed Antigravity transport that never touches the credential.
agy acp (Antigravity CLI >= 1.5.0) is an official ACP v1 server: JSON-RPC over stdin/stdout, identifies as Antigravity ACP Server, exposing a Model picker and a Thinking level picker (Low/Medium/High/Extra/Max). opencodex would be the ACP client: spawn agy acp, drive session/*, stream updates, translate to Responses / Chat Completions for the harness.
This is not a new architecture for this codebase — an ACP transport already existed here and was retired for product reasons, not technical ones. src/providers/devin-cli-authmode-migration.ts:4:
devin-cliused to be a local provider whose adapter spawneddevin acp; it later became an
account provider on the shareddevinadapter.
The ACP provider must be deliberately constrained, because Google's permission has explicit edges (staff statement, 2026-11-07):
| Constraint from Google | Consequence for opencodex |
|---|---|
| Never extract, proxy, or reuse internal OAuth tokens outside the binary | ACP provider must not import/store the credential; agy owns auth |
| No automated account rotation | account pool, failover and auto-pause must be disabled for this provider |
| No multi-user serving | must refuse hub / remote exposure on an ACP provider |
| Outside first-party IDEs, ACP sessions are scoped to Gemini models | no Claude/GPT-via-Antigravity through ACP |
Example usage or interface
ocx provider add antigravity-acp --adapter acp --command agy --args acp
- single account, rotation/failover refused by validation
- model list read from the ACP
session/newoption set (Gemini only) - thinking level mapped from the catalog ladder to the ACP picker values
401/-32000 Authentication requiredsurfaced as an actionable "runagyand sign in" error
Alternatives or workarounds
No response
Additional context
No response
Checks
- I searched existing issues and documentation.
- This request describes a concrete OpenCodex workflow rather than merely naming a desired technology.
- I removed secrets and personal data.
Activity
coderabbitai commentedon Nov 10, 2026
🔗 Related PRs
#7819 - fix(google): honor Retry-After floor and recognize the Cloud Code Assist ToS account ban [merged]
📝 Issue Planner
Check the box below or use the
@coderabbitai plancommand to generate an implementation plan and prompts that you can use with your favorite coding assistant.🧪 Issue enrichment is currently in open beta.
To disable automatic issue enrichment, add the following to your
.coderabbit.yaml:💬 Have feedback or questions? Drop into our discord!