- Set proxy TCP dial timeout to 5s and TLS handshake timeout to 5s
for quick failure detection instead of waiting 30s
- Reduce overall HTTP client timeout from 30s to 10s
- Detect proxy connection errors (IsConnectionError) and skip retries
immediately with clear "proxy unavailable" error
- Add 8s context timeout for token refresh on request path to cap
total wait time
- Mark account as temp-unschedulable for 10min when token refresh
fails (both background and request path)
- Sync temp-unschedulable state to Redis cache for immediate
scheduler effect
- Return UpstreamFailoverError on GetAccessToken failure to trigger
account failover instead of returning 502 directly
- Apply same 5s dial timeout to httpclient pool (proxy probe/test)
- Reduce proxy probe timeout from 30s to 10s
shouldMarkCreditsExhausted was blocked by isURLLevelRateLimit check when
credit overages retry returned "Resource has been exhausted (e.g. check quota).",
causing credits to never be marked as exhausted. This led to an infinite loop
where each request injected credits, bypassed model rate limits, and failed again.
- Remove isURLLevelRateLimit guard from shouldMarkCreditsExhausted (only called
for credit retry responses — if credits retry fails, mark exhausted)
- Add "resource has been exhausted" to creditsExhaustedKeywords
- Update tests to match corrected behavior
Introduce @tanstack/vue-virtual to DataTable with opt-in virtualScroll
prop. Only AccountsView enables it — other consumers are unaffected.
DOM renders ~20 visible rows instead of 100, eliminating the main
rendering bottleneck when switching to 100 items/page.
- DataTable: add virtualScroll/estimateRowHeight/overscan props,
virtualizer setup, padding-tr placeholders, defineExpose
- useSwipeSelect: dual-mode (DOM vs data-driven) for virtual compat
- AccountUsageCell: module-level Map cache with 5min TTL to avoid
re-fetching usage on scroll-induced mount/unmount cycles
- AccountsView: enable virtualScroll, wire up virtual context
Only shown when all selected accounts are on the antigravity platform.
Writes to extra.allow_overages via existing JSONB merge — no backend change needed.
- Batch state updates in swipe-select: 100 rows drag from 100 Set copies + 100 re-renders to 1 each
- Replace selIds.includes() with Set.has() for checkbox rendering (O(n²) → O(n))
- Add RAF throttle to mousemove handler to cap at 60fps
Move 529 overload cooldown configuration from config file to admin
settings UI. Adds an enable/disable toggle and configurable cooldown
duration (1-120 min) under /admin/settings gateway tab, stored as
JSON in the settings table.
When disabled, 529 errors are logged but accounts are no longer
paused from scheduling. Falls back to config file value when DB
is unreachable or settingService is nil.
Update model mapping target for claude-haiku-4-5 and
claude-haiku-4-5-20251001 from claude-sonnet-4-5 to claude-sonnet-4-6.
Includes migration script, default constants, and test updates.
Empty text blocks ({"type":"text","text":""}) cause Anthropic upstream to
return 400: "text content blocks must be non-empty". This was not caught
by the existing error detection pattern in isThinkingBlockSignatureError,
nor handled by FilterThinkingBlocksForRetry.
- Add empty text block stripping to FilterThinkingBlocksForRetry
- Fix isThinkingBlockSignatureError to match new Anthropic error format
- Add fast-path byte patterns to avoid unnecessary JSON parsing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add a platform filter dropdown to the admin subscriptions view, allowing
filtering subscriptions by platform (Anthropic, OpenAI, Gemini, etc.)
through the group association.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Show upstream model mapping (requested -> upstream) in UsageTable with arrow notation. Add requested/upstream/mapping source toggle to ModelDistributionChart with lazy loading — only fetches data when user switches tab, with per-source cache invalidation on filter changes. Include upstream_model column in Excel export and i18n for en/zh.
Cover IsValidModelSource/NormalizeModelSource, resolveModelDimensionExpression SQL expressions, invalid model_source 400 responses on both GetModelStats and GetUserBreakdown, upstream_model in scan/insert SQL mock expectations, and updated passthrough/billing test signatures.
Add model_source query parameter to GetModelStats and GetUserBreakdown handlers with explicit IsValidModelSource validation. Include model_source in cache key to prevent cross-source cache hits. Expose upstream_model in usage log DTO with omitempty semantics.