This document provides complete instructions for the coding model to port the Antigravity Executor from OmniRoute (/tmp/omni_antigravity.ts) to 9router-new (/media/DiskE/Code/9router-new/open-sse/executors/antigravity.js).
Port AntigravityExecutor to support anti-ban measures (tool cloaking, ZWJ obfuscation), automatic Google Cloud project bootstrap, advanced 429 rate-limit handling, and Google One AI credit redirection logic on rate limits.
- All required helper modules under
open-sse/services/(Identity, Headers, Credits, 429 Engine, etc.) have been verified to exist and export the correct symbols. - The destination file
open-sse/executors/antigravity.jsexists but has an incomplete implementation inheriting the defaultexecuteflow. It needs a full overwrite.
We have verified that the following files exist and should be imported directly:
open-sse/services/antigravityIdentity.jsgenerateAntigravityRequestId,getAntigravitySessionId,getAntigravityEnvelopeUserAgent,deriveAntigravityMachineId,getAntigravityVscodeSessionId
open-sse/services/antigravityVersion.jsresolveAntigravityVersion,getCachedAntigravityVersion
open-sse/services/antigravityHeaders.jsantigravityUserAgent
open-sse/services/antigravityHeaderScrub.jsscrubProxyAndFingerprintHeaders
open-sse/services/antigravityCredits.jsinjectCreditsField,shouldRetryWithCredits,handleCreditsFailure,getCreditsMode,shouldUseCreditsFirst
open-sse/services/antigravityClientProfile.jsapplyAntigravityClientProfileHeaders
open-sse/services/antigravity429Engine.jsclassify429,decide429
open-sse/services/cloudCodeThinking.jsshouldStripCloudCodeThinking,stripCloudCodeThinkingConfig
open-sse/config/antigravityModelAliases.jsresolveAntigravityModelId,getAntigravityModelFallbacks
open-sse/executors/antigravity/sseCollect.jsprocessAntigravitySSEText,flushAntigravitySSEText
src/lib/localDb.js(relative../../src/lib/localDb.js)getMitmAlias,updateProviderConnection
open-sse/utils/error.jsbuildErrorBody
open-sse/translator/formats/gemini.jsDEFAULT_SAFETY_SETTINGS(line 31),cleanJSONSchemaForAntigravity
open-sse/config/appConstants.jsOAUTH_ENDPOINTS,ANTIGRAVITY_HEADERS,AG_DEFAULT_TOOLS,AG_TOOL_SUFFIX,ANTIGRAVITY_PRE_RESPONSE_TIMEOUT_CODE
open-sse/config/runtimeConfig.jsHTTP_STATUS
open-sse/utils/sessionManager.jsresolveSessionId
open-sse/utils/proxyFetch.jsproxyAwareFetch
open-sse/config/defaultThinkingSignature.jsDEFAULT_THINKING_AG_SIGNATURE
Since these files/modules do not exist in 9router-new, you must inline them:
cliFingerprints-> Drop entirely (YAGNI). Simplify request serialization:serializeAntigravityRequest(provider, headers, body) => ({ headers, bodyString: JSON.stringify(cloneAntigravityRequestBody(body)) })geminiToolsSanitizer-> InlinebuildGeminiToolsandsanitizeGeminiToolNametoolCloaking-> InlinecloakAntigravityToolPayload,stripEnumDescriptions
Define these in the top-level scope of /media/DiskE/Code/9router-new/open-sse/executors/antigravity.js:
const STREAM_READINESS_TIMEOUT_MS = 8000;
const CREDIT_BALANCE_TTL_MS = 5 * 60 * 1000;
const CREDITS_EXHAUSTED_TTL_MS = 5 * 60 * 60 * 1000; // 5 hours
const MAX_CREDITS_EXHAUSTED_ENTRIES = 50;
const MAX_CREDIT_BALANCE_ENTRIES = 50;
const creditsExhaustedUntil = new Map();
const creditBalanceCache = new Map();
const ANTIGRAVITY_UNSUPPORTED_SAFETY_CATEGORIES = new Set([
"HARM_CATEGORY_CIVIC_INTEGRITY",
]);
const IMAGE_MODEL_PATTERNS = [
/image/i,
/imagen/i,
/image-generation/i,
];Implement in-memory credit balance caching helper:
export function updateAntigravityRemainingCredits(accountId, balance) {
// ponytail: skip DB persistence of credit balances since 9router has no equivalent schema
if (creditBalanceCache.size >= MAX_CREDIT_BALANCE_ENTRIES && !creditBalanceCache.has(accountId)) {
const oldestKey = creditBalanceCache.keys().next().value;
if (oldestKey !== undefined) creditBalanceCache.delete(oldestKey);
}
creditBalanceCache.set(accountId, { balance, updatedAt: Date.now() });
}-
buildUrl(model, stream, urlIndex = 0)buildUrl(model, stream, urlIndex = 0) { const baseUrls = this.getBaseUrls(); const baseUrl = baseUrls[urlIndex] || baseUrls[0]; if (isImageModel(model)) { return `${baseUrl}/v1internal:generateContent`; } return `${baseUrl}/v1internal:streamGenerateContent?alt=sse`; }
-
buildHeaders(credentials, stream = true)buildHeaders(credentials, _stream = true) { const raw = { "Content-Type": "application/json", Authorization: `Bearer ${credentials.accessToken}`, "User-Agent": antigravityUserAgent(), Accept: "text/event-stream", "X-OmniRoute-Source": "omniroute", }; return scrubProxyAndFingerprintHeaders(raw); }
-
transformRequest(model, body, stream, credentials, modelIdOverride)- Translate
/tmp/omni_antigravity.tstransformRequestmethod (lines 600-800). - Use
ensureAntigravityProjectAssigned(credentials.accessToken)ifprojectIdis missing. - Support image generation payload conversion if
isImageModelis true. - Clean/strip system instructions, safety settings, and tool structures based on
isClaudeflag. - Obfuscate prompt texts via
obfuscateSensitiveWords.
- Translate
-
execute(input)&executeOnce(input, modelIdOverride)- Implement the Pro fallback chain in
executeutilizinggetAntigravityModelFallbacks. - Implement
executeOnce:- Run
ensureAntigravityProjectAssignedbefore firing request. - Enforce
duplex: "half"in stream fetch settings if streaming. - Implement the pre-response timeout
fetchWithReadinessTimeoutwithSTREAM_READINESS_TIMEOUT_MS. - Implement 429 classification & cooldown mechanism. When
full_quota_exhaustedis hit, call:updateProviderConnection(accountId, { rateLimitedUntil: new Date(Date.now() + retryAfterMs).toISOString() })Note:accountIdshould resolve tocredentials?.connectionId || "unknown". - Synthesize non-streaming responses for
stream = falsecallers usingcollectStreamToResponse. - For streaming responses, pipe
response.bodythrough aTransformStreamto parseremainingCreditsfrom SSEdata:payloads on the fly without consuming the stream, updating local credit caches.
- Run
- Implement the Pro fallback chain in
- Read the parsed helper code in
/tmp/omni_sseCollect.ts,/tmp/omni_toolCloaking.ts,/tmp/omni_geminiToolsSanitizer.ts, and/tmp/omni_upstreamError.tsto copy missing helper logic. - Open
/media/DiskE/Code/9router-new/open-sse/executors/antigravity.jsand rewrite it entirely. - Validate by checking syntax:
node -c open-sse/executors/antigravity.js. - Run executor vitest suite:
pnpm test tests/unit/executors(or closest matching test suite).