Releases: tuxevil/tuxevil-rotator
Release list
v3.7.0 - Audio transcription and live streaming
What's Changed
- feat(audio): add OpenAI audio transcription endpoint and live streaming proxy by @javargasm in #33
Full Changelog: v3.6.1...v3.7.0
v3.6.1 - Quota pool reconciliation
Patch release focused on Google quota-state reconciliation.
Fixed
- Reset-only quota entries are treated as exhausted instead of being discarded.
- Partial quota snapshots preserve omitted pools from the last known-good state.
- Claude and Gemini cooldowns reconcile independently and honor fresh provider reset deadlines.
Included
- Effort-based model routing from #32.
See CHANGELOG.md for details.
v3.6.0 - Dynamic catalog hardening and partial model specification overrides
Highlights:\n\n- Dynamic Antigravity model ownership and quota-state persistence hardening (PR #30, contributed by @javargasm).\n- Partial modelSpecs overrides now survive configuration normalization and persistence, including context-window lookups (PR #31, contributed by @javargasm).\n\nSee CHANGELOG.md for the complete change list.
v3.5.0
Highlights
- Added live Antigravity model discovery from successful quota polls, including dynamic model metadata, account availability, and per-account routing (#29 by @javargasm).
- Added dynamic catalog safety for retired model IDs, operator
modelSpecsoverrides, full account identity keys, and removed-model routing (#29 by @javargasm).
Thanks to @javargasm for #29 and to @CyR1en for the Gemini 3.8 Flash work in #28.
v3.4.0 - Gemini 3.8 Flash support
Highlights
- Added native Gemini 3.8 Flash support for
gemini-3.8-flash-high,gemini-3.8-flash-medium, andgemini-3.8-flash-low. - Added 1M-token context limits, 65,536-token output limits, pricing, quota routing, dashboard visualization, telemetry, model discovery, and integration documentation.
- Updated the default Antigravity client version to 2.11.0.
- Removed Gemini 3.5 Flash from the user-facing catalog and defaults to match Antigravity 2.11.
Contributors
Thank you to @CyR1en for the Gemini 3.8 Flash implementation and regression coverage in PR #28.
npm publishing
This release is ready for npm publication as tuxevil-rotator@3.4.0. The package metadata and lockfile are aligned, and npm pack --dry-run was verified. Run npm publish when ready.
v3.3.2
Fixed
- Model-scoped Antigravity cooldowns:
RESOURCE_EXHAUSTED429s now cool only the exhausted Claude or Gemini pool; sibling pools on the same account remain routable immediately (#26 by @javargasm). - Explicit reset duration honored on
RESOURCE_EXHAUSTED: The rotator parsesResets in Xh Ym Zsfrom Antigravity error messages and applies that exact cooldown instead of the generic 30-minute cap. Falls back to 30 minutes when no duration is present (#26 by @javargasm). - Persisted Antigravity pool deadlines survive restarts:
claudeandgeminicooldown deadlines are no longer truncated to 30 minutes on startup; only generic model cooldowns are capped (#26 by @javargasm). - Untouched 100% pools show idle instead of a fake countdown: When Google reports
remainingFraction >= 1the reset timestamp is discarded and the pool renders asidlewith no timer (#26 by @javargasm). - RAW POLL reconciliation of exhausted pool deadlines: A successful quota poll reporting 0% with a valid future reset replaces the stale cooldown deadline for that pool; invalid, past, or unchanged resets are ignored (#26 by @javargasm).
- Serialized per-account quota polling with trailing repoll: Overlapping
pollAccountQuotacalls for the same account queue a single trailing repoll instead of running concurrently;pollAllQuotasis now single-flighted (#26 by @javargasm). gpt-oss:20bkickstarts routed through Ollama: On multi-provider accounts (Google + Ollama), the kickstart for the Ollama session pool is correctly sent to the Ollama endpoint with the Ollama API key (#26 by @javargasm).- Kickstart actions hidden for disabled/flagged accounts: The dashboard no longer renders
▶ StartorStart Idle Timersbuttons for accounts that are not eligible for kickstart (#26 by @javargasm). gemini-3.7-flash-tieredadded to OpenCode integration docs: Context window updated to 1,000,000 tokens; set as the recommended default model (#26 by @javargasm).- CodeQL security fixes: Strip internal error details from kickstart HTTP error responses (stack-trace exposure); annotate
credentialFingerprintSHA-256 as a non-password deduplication hash.
v3.3.1
Fixed
- Admin token propagation on hosted login: Propagate the configured admin token to the "Continue With Google" link on the
/loginlanding page, preventing a 401 Unauthorized error when navigating to/auth/antigravity/start(#25 by @CelestialCreator).
Full Changelog: v3.3.0...v3.3.1
v3.3.0 - feat: queued multi-request Antigravity pooling (5x5 concurrent streams)
What's New in v3.3.0
Queued Multi-Request Antigravity Pooling (5×5 Concurrent Streams)
- High Concurrency Capacity: Allows up to 5 concurrent Antigravity streams per account across model pools, with a 25-stream total across 5 accounts. Requests are distributed breadth-first by total account load across mixed Gemini and Claude traffic (#24 by @javargasm).
- Config Defaults:
maxConcurrentRequestsPerAccountandmaxConcurrentRequestsPerProjectModeldefaults raised from1to5.
Process-Local Strict FIFO Request Queue
- Queue Overflow Handling: Requests exceeding total pool capacity wait in a strict FIFO queue with automatic 300-second expiration (#24 by @javargasm).
- Disconnect Cancellation: Client disconnects before admission abort immediately via
AbortSignal, preventing lease leaks. - Immediate Wakeups: Enqueued requests automatically wake up upon lease releases, cooldown expiries, circuit-breaker resets, catalog additions, or config reloads.
Dashboard Concurrency Metrics
- Account cards on the web dashboard display active vs. max concurrency (e.g.
Concurrency: 3/5) for Google Antigravity accounts (#24 by @javargasm).
Canonical Project ID Resolution
- Unified resolution of
projectIdacross forwarding, quota polling, Code Assist passthrough, and admission gating, safely sanitizing whitespace and prioritizing nested credentials over legacy fields (#24 by @javargasm).
v3.2.3 - fix: 429 quota resilience, token refresh isolation, and concurrency safety
What's Fixed
Account-Scoped 429 RESOURCE_EXHAUSTED Recovery
- When an individual account exhausts its quota (returning 429
RESOURCE_EXHAUSTEDon Claude or Gemini), the proxy now safely releases the failed account before rotating, allowing immediate retry with the next eligible account in the pool instead of failing prematurely (#23 by @javargasm).
Synchronous Account Leasing & Atomic Concurrency Accounting
inFlightRequestsreservation and model assignment tracking now occur synchronously and indivisibly at lease time before asynchronous save or refresh operations. If activation fails, in-flight counters are rolled back and token buckets are refunded immediately (#23 by @javargasm).
Snapshot-Based Token Refresh & Generation Tracking
- Provider token refreshes execute against isolated account snapshot clones. Refreshed tokens are published only if the credential generation has not changed during flight, cleanly discarding stale tokens if credentials were reconfigured (#23 by @javargasm).
Provider-Scoped Token Publication
- Token refreshes for multi-provider accounts (e.g. Google Antigravity + OpenAI Codex) now update strictly provider-owned fields, preventing cross-provider token and credential overwrites (#23 by @javargasm).
Identity Resolution with Non-Secret Credential Fingerprinting
- Duplicate-email accounts without stable provider IDs are resolved using a 12-character SHA-256 non-secret credential fingerprint, isolating runtime state during
replaceConfig(#23 by @javargasm).
Exact Incarnation Exclusion on Retry
rotateToNext(model, failedAccount)binds exclusion strictly to the exact runtime object instance, preventing false 503 errors when an account is replaced by a healthy incarnation (#23 by @javargasm).
v3.2.2 - fix: spend-logger memory leak, CTE idempotency, and virtual key cache bounding
What's Changed
This release resolves a critical memory leak in file-based storage mode, introduces atomic and idempotent PostgreSQL spend log tracking via CTEs, bounds the virtual-key in-memory cache, and surfaces official per-model context windows.
Fixed
- Spend-logger memory leak in file-based storage mode: When running without PostgreSQL,
flushSpendLogs()returned early without draining the spend log queue, leading to unbounded heap memory accumulation.logSpend()now short-circuits and clearsqueuewhen PostgreSQL is not configured (#22 by @javargasm). - Atomic PostgreSQL spend log insert & daily aggregation via CTE: Combined
rotator_spend_logsinsert androtator_daily_spendupsert into a single atomic Common Table Expression query. Re-attempted inserts with existingrequest_idvalues produce 0 rows fromins_log, guaranteeing strict idempotency without double-counting on retries. On DB errors, only uncommitted logs are re-enqueued under a strict FIFO cap (MAX_QUEUE_CAP = 100) (#22 by @javargasm). - Virtual Key cache bounded: Added
KEY_CACHE_MAX = 500with 1-minute TTL and FIFO eviction tokeyCacheinsrc/virtual-keys.ts, preventing memory exhaustion from negative lookup caching and key scanning (#22 by @javargasm). /v1/modelsno longer reports the outdated 500K Claude context window.
Added
- Official per-model context windows surfaced across providers: Published upstream context windows for Claude (Opus 4.6 / Sonnet 4.6 → 1M, Opus 4.5 / Sonnet 4.5 → 200K), Google Gemini (3.1 Pro, 3 Pro, 3 Flash variants, 2.5 Pro/Flash → 1M each), and
gpt-oss-120b(131,072) viasrc/providers/google-antigravity/catalog.ts. /api/showlookup for Ollama model context windows: Dynamic context length lookup from Ollama.ModelSpec.contextWindow: Context window spec exposed across/v1/modelsendpoints.
Changed
- OpenAI Codex catalog updated to GPT-5.6 family official 1.05M window.
- OpenCode Zen catalog exposes per-model context helper.
- Claude Opus 4.6 / Sonnet 4.6 context window in
MODEL_CATALOGraised to 1M.
Full changelog: https://github.com/tuxevil/tuxevil-rotator/blob/main/CHANGELOG.md