Skip to content

feat(api): serve Gemini-native /v1beta routes on the API-only port - #16745

Merged
diegosouzapw merged 3 commits into
release/v3.8.53from
feat/port-pr-3206-api-bridge-v1beta-path
Oct 28, 2026
Merged

diegosouzapw merged 3 commits into
release/v3.8.53from
feat/port-pr-3206-api-bridge-v1beta-path

Conversation

@diegosouzapw

Copy link
Copy Markdown
Collaborator

Summary

  • The API-only port (API_PORT bridge) now relays Gemini-native /v1beta/* routes, so Gemini CLI / google-genai SDK clients pointed at the API port stop getting 404 API port only serves OpenAI-compatible routes. (the same call already worked on the dashboard port).
  • Match is case-insensitive, mirroring the v1beta matcher in src/proxy.ts. /api/v1beta and the rest of /api/* (other than the existing /api/oauth) stay blocked.

Attribution

Thanks to @MuhammadUsamaMX for the original implementation.

Changes

  • src/lib/apiBridgeServer.ts — add /^\/v1beta(?:\/|$)/i to the bridge path allowlist (HTTP and WS upgrade share it).
  • tests/unit/api-bridge-path-allowlist.test.ts — new: real-socket bridge + fake dashboard; asserts /v1beta/models, :generateContent, :streamGenerateContent?alt=sse, /V1BETA/models are relayed, existing /v1, /responses, /codex still relayed, and /, /dashboard, /api/keys, /api/v1beta/models, /v1betaX, /v1beta2, /xv1beta still 404 without reaching the dashboard.
  • docs/reference/ENVIRONMENT.md — API_PORT row mentions /v1beta/*.

No new route, no authz/route-guard change: the relayed /v1beta requests hit the existing dashboard-side route and its API-key auth, with the bridge's existing forwarded-header policy.

Test plan

  • TDD: node --import tsx/esm --test tests/unit/api-bridge-path-allowlist.test.ts before the fix → ℹ tests 3 ℹ pass 2 ℹ fail 1 (/v1beta/models should be relayed); after → pass.
  • node --import tsx/esm --test tests/unit/api-bridge-path-allowlist.test.ts tests/unit/api-bridge-client-address.test.ts tests/unit/httpClientAbortGuard.test.mjs tests/unit/httpClientAbortGuard-default-logger.test.mjs → ℹ tests 38 ℹ pass 38 ℹ fail 0
  • npx eslint --suppressions-location config/quality/eslint-suppressions.json <changed files> → clean; npx prettier --check <changed files> → clean
  • npm run typecheck:core → exit 0
  • npm run check:docs-all → PASS (doc-links, fabricated-docs)
  • GITHUB_BASE_REF=release/v3.8.52 npm run check:test-masking → OK, no weakening

⚠️ base-red inherited: #15306 — unit/vitest/integration/package-artifact gates on release/v3.8.52

diegosouzapw and others added 2 commits October 15, 2026 14:49
The API_PORT bridge allowlist matched /v1 but not /v1beta, so Gemini CLI
and google-genai SDK clients pointed at the API port got a 404 while the
same call worked on the dashboard port. /v1beta is now relayed
(case-insensitive, like the src/proxy.ts matcher); /api/v1beta and the
rest of /api/* stay blocked.

Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>
Inspired-by: decolua/9router#3206
@github-actions

Copy link
Copy Markdown
Contributor

CI Coverage Report

  • Coverage job: skipped
  • PR test policy: success

Coverage artifact was not available for this run.

@diegosouzapw diegosouzapw added the deferred-v3.8.53 Feat PRs held for v3.8.53. Keep open. Do not merge into v3.8.52. label Oct 16, 2026
@diegosouzapw diegosouzapw changed the title feat(api): serve Gemini-native /v1beta routes on the API-only port [defer] feat(api): serve Gemini-native /v1beta routes on the API-only port Oct 16, 2026
@diegosouzapw
diegosouzapw changed the base branch from release/v3.8.52 to release/v3.8.53 October 19, 2026 13:26
@diegosouzapw

Copy link
Copy Markdown
Collaborator Author

Re-homed to release/v3.8.53: v3.8.52 entered its release freeze, so the branch now belongs to the release captain and development continues on the next cycle. Nothing is wrong with this PR — it just needed a live base. No action needed from you; CI will re-run against the new base.

@diegosouzapw diegosouzapw removed the deferred-v3.8.53 Feat PRs held for v3.8.53. Keep open. Do not merge into v3.8.52. label Oct 20, 2026
@diegosouzapw diegosouzapw changed the title [defer] feat(api): serve Gemini-native /v1beta routes on the API-only port feat(api): serve Gemini-native /v1beta routes on the API-only port Oct 20, 2026
…-path

Resolve docs/reference/ENVIRONMENT.md: take the base's realigned table and
reapply the PR's API_PORT wording (Gemini-native /v1beta/* on the API port).
@diegosouzapw
diegosouzapw merged commit 11386ca into release/v3.8.53 Oct 28, 2026
0 of 40 checks passed
DarknessKiller added a commit to DarknessKiller/OmniRoute that referenced this pull request Oct 29, 2026
… Kit (#14)

* test(perplexity-web): use a mapped model in the stream boundary delayed-hook case (#18232)

Use a mapped model in the stream boundary delayed-hook case.

Evidence: focused tests (no test files in diff); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(compression): report RTK's real truncation count and cut on line boundaries (#18139)

Report RTK's real truncation count and cut on line boundaries.

Evidence: focused tests (tests/unit/compression/rtk-smart-truncate.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(responses): keep replayed web search call ids on generic executors (#18127)

Keep replayed web search call ids on generic executors.

Evidence: focused tests (tests/unit/responses-input-sanitizer-websearch-id.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): purge releasable failure entries past held lockouts (#18126)

Purge releasable failure entries past held lockouts.

Evidence: focused tests (tests/unit/account-fallback-lockout-eviction.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): keep explicit thinking type over connection default (#18114)

Keep explicit thinking type over connection default.

Evidence: focused tests (tests/unit/glm-thinking-type-explicit.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(combo): clear stale LKGP pin on quality-rejected 200 (#18113)

Clear stale LKGP pin on quality-rejected 200.

Evidence: focused tests (tests/unit/combo/execute-target-attempt.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(translator): deferred OpenAI→Claude finish replays the pending choice, duplicating the last tool-arg fragment (#18193)

Deferred OpenAI→Claude finish replays the pending choice, duplicating the last tool-arg fragment.

Evidence: focused tests (tests/unit/openai-to-claude-trailing-usage-deferred-finish.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(bootstrap): strip inline comments from unquoted env values (#18116)

Strip inline comments from unquoted env values.

Evidence: focused tests (tests/unit/bootstrap-env-inline-comment.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): enforce UTF-8 byte caps for captured stream chunks (#18187)

Enforce UTF-8 byte caps for captured stream chunks.

Evidence: focused tests (tests/unit/request-logger-stream-byte-cap.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(opencode): scope a retired-model 410 to the model, not the connection (#17827)

Scope a retired-model 410 to the model, not the connection.

Evidence: focused tests (tests/unit/opencode-410-model-scope.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(models): bound retained catalog response caches (#18188)

Bound retained catalog response caches.

Evidence: focused tests (tests/unit/catalog-cache-bounds.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(api): expose provider-wildcard combos in model catalog (#18182)

Expose provider-wildcard combos in model catalog.

Evidence: focused tests (tests/unit/models-catalog-provider-wildcard.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Fixes #18033

* fix(usage): include Kimi Coding monthly quota (#18234)

Include Kimi Coding monthly quota.

Evidence: focused tests (tests/unit/kimi-monthly-membership-quota.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(pool): reclaim dead sessions on acquire instead of returning null (#18115)

Reclaim dead sessions on acquire instead of returning null.

Evidence: focused tests (tests/unit/session-pool-dead-reclaim.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(embeddings): preserve Gemini native token usage (#18244) (#18246)

Preserve Gemini native token usage.

Evidence: focused tests (tests/unit/embeddings-multimodal-7956.test.ts, tests/unit/gemini-embedding-2-multimodal.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Closes #18244.

* fix(combo): apply the global per-target expansion cap when a combo sets none (#18130)

Apply the global per-target expansion cap when a combo sets none.

Evidence: focused tests (tests/unit/combo/connection-aware-expansion.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(translator): keep OpenAI prompt_cache_breakpoint on content parts for openai/openrouter (#18255)

Keep OpenAI prompt_cache_breakpoint on content parts for openai/openrouter.

Evidence: focused tests (tests/unit/translator-openai-prompt-cache-breakpoint-18254.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Closes #18254

* fix(sse): preserve complexity hints in primary auto routing (#18104)

Preserve complexity hints in primary auto routing.

Evidence: focused tests (tests/unit/auto-combo-primary-complexity.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(build): bundle locale catalogs as text in webpack builds (#18183)

Bundle locale catalogs as text in webpack builds.

Evidence: focused tests (tests/unit/build/webpack-locale-messages-source.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(compression): let an idle pool worker stop holding the process open (#18136)

Let an idle pool worker stop holding the process open.

Evidence: focused tests (tests/unit/compression/compression-worker-pool-exit.test.ts, tests/unit/compression/compression-worker-pool-jam.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(firefly): avoid false stale detection for non-underscore Forter timestamps (#18099)

Avoid false stale detection for non-underscore Forter timestamps.

Evidence: focused tests (tests/unit/adobe-firefly-browser-login.test.ts, tests/unit/adobe-forter-session-timestamp.test.ts, tests/unit/adobe-forter-timestamp-extraction.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(tls): cancel response bodies when requests are aborted (#18228)

Cancel response bodies when requests are aborted.

Evidence: focused tests (tests/unit/http-backed-chat-response-lifetime.test.ts, tests/unit/tls-client-abort-lifetime.test.ts, tests/unit/tls-proxy-context.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): honor pii-masker opt-out in streaming pipeline (#18121)

Honor pii-masker opt-out in streaming pipeline.

Evidence: focused tests (tests/unit/chatcore-streaming-pipeline.test.ts, tests/unit/streaming-pii-optout-gate.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(nvidia): replace retired Nemotron 3 Super with Nemotron 3.5 Super VL (#17928)

Replace retired Nemotron 3 Super with Nemotron 3.5 Super VL.

Evidence: focused tests (tests/unit/antigravity-bridge-routing.test.ts, tests/unit/catalog-updates-v3x.test.ts, tests/unit/nvidia-eol-catalog.test.ts, tests/unit/nvidia-nim-registry-6108.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(services): harden embedded Bifrost runtime (#17976)

Harden embedded Bifrost runtime.

Evidence: focused tests (tests/unit/authz/route-guard-version-get-exemption.test.ts, tests/unit/route-guard-local-only-sweep.test.ts, tests/unit/services/installers/bifrost.test.ts, tests/unit/services/internal-health-fetch.test.ts, tests/unit/services/service-status-route-guard.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(oauth): accept permission-based Cursor user API keys (#17905)

Accept permission-based Cursor user API keys.

Evidence: focused tests (tests/unit/cursor-agent-image.test.ts, tests/unit/cursor-api-key-auth.test.ts, tests/unit/cursor-api-models-discovery.test.ts, tests/unit/cursor-apikey-provider.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(mcp): validate Origin on /api/mcp/* to block DNS rebinding (#17273)

Validate Origin on /api/mcp/* to block DNS rebinding.

Evidence: focused tests (tests/integration/mcp-origin-host-e2e.test.ts, tests/unit/mcp-origin-validation.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* test(authz): fail when a host-config, process-control or data-export route can be anonymous (#18293)

Fail when a host-config, process-control or data-export route can be anonymous.

Evidence: focused tests (tests/unit/management-capability-routes-protected.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* refactor(api): move the per-request keepalive frame into a helper (#17825) (#18281)

Move the per-request keepalive frame into a helper.

Evidence: focused tests (tests/unit/responses-route-early-keepalive-wiring.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* test(ui): repair the vitest UI base-red on release/v3.8.53 (#18306)

Repair the vitest UI base-red on release/v3.8.53.

Evidence: focused tests (tests/unit/ui/api-key-access-editor.test.tsx); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(sse): type empty or typeless array items in Gemini tool schemas (#18289)

Type empty or typeless array items in Gemini tool schemas.

Evidence: focused tests (tests/unit/gemini-array-items.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(auth): fail closed when the logout revocation cannot be saved (#18323)

Fail closed when the logout revocation cannot be saved.

Evidence: focused tests (tests/unit/dashboard-session-invalidation.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(cursor): harden the HTTP/2 proxy tunnel and fail closed on unresolvable pinned proxies (#18324)

Harden the HTTP/2 proxy tunnel and fail closed on unresolvable pinned proxies.

Evidence: focused tests (tests/unit/cursor-h2-proxy-connect-hardening.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(antigravity): accept the bare gemini-4-argon id and list Gemini 4 Argon on Vertex (#18285)

Accept the bare gemini-4-argon id and list Gemini 4 Argon on Vertex.

Evidence: focused tests (tests/unit/gemini-4-argon-bare-alias-vertex.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* feat(providers): add Kimi K3.1 Pro to the Command Code static catalog (#18292)

Add Kimi K3.1 Pro to the Command Code static catalog.

Evidence: focused tests (tests/unit/command-code-executor.test.ts, tests/unit/command-code-kimi-k3-1-pro-5172.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(api): report an unreachable upstream as 502 in provider model discovery (#18294)

Report an unreachable upstream as 502 in provider model discovery.

Evidence: focused tests (tests/unit/provider-models-upstream-unreachable-4843.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(db): revoke a deleted combo's name from API key allowed_combos (#18297)

Revoke a deleted combo's name from API key allowed_combos.

Evidence: focused tests (tests/unit/combo-delete-revokes-key-grants.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* feat(providers): add Kimi K3.1 Pro to OpenCode Go (#18295)

Add Kimi K3.1 Pro to OpenCode Go.

Evidence: focused tests (tests/unit/opencode-go-kimi-k3.1-pro-5147.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* feat(compression): add RTK filter for PHPUnit test output (#18317)

Add RTK filter for PHPUnit test output.

Evidence: focused tests (tests/unit/compression/rtk-phpunit-filter.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* fix(translator): honor explicit client max_tokens on Claude/Gemini/Antigravity -> OpenAI (#18300)

Honor explicit client max_tokens on Claude/Gemini/Antigravity -> OpenAI.

Evidence: focused tests (tests/unit/openai-to-claude-explicit-max-tokens-cap.test.ts, tests/unit/translator-antigravity-to-openai.test.ts, tests/unit/translator-explicit-max-tokens-cap-5180.test.ts, tests/unit/translator-gemini-to-openai.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* fix(api): honor OMNIROUTE_NO_UPDATE_NOTIFIER in the dashboard version check (#18316)

Honor OMNIROUTE_NO_UPDATE_NOTIFIER in the dashboard version check.

Evidence: focused tests (tests/unit/system-version-update-optout.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* fix(docs): refresh the live counts and the design-system palette note on release/v3.8.53 (#18339)

* i18n(ui): translate the cursor-api onboarding description in 38 locales (#18351)

* fix(discovery): show why a model discovery fell back to the built-in catalog (#17342)

* feat(dashboard): account-availability quota overview with per-pool rows and reorderable providers (#17026)

* fix(dashboard): show the configured model and the full account in the Combo Control Center (#17393) (#17774)

Co-authored-by: vincent <webmaster@palmit.com.au>

* refactor(routing): share combo attempt failure facts (#17956)

* fix(claude): forward max reasoning effort on the Responses path for max-capable models (#18064)

Co-authored-by: Davy Massoneto <davy.m.massoneto@gmail.com>

* feat(proxy): accept selector-only subscriptions with no feed URL (#16165)

* fix(translator): bridge Claude Code WebSearch to Codex native web_search (#16365)

Co-authored-by: wray-lee <wray-lee@outlook.com>

* feat(routing): enrich routing events with apiKeyId and stream cost (#14736)

Co-authored-by: Safeer Ahmad <asafeer1994@gmail.com>

* fix(providers): surface failed Codex client-version refreshes instead of swallowing them (#17855)

* feat(api): add per-key Claude Code discovery alias control (#17979)

Co-authored-by: Sean P. Ford <sean@seanford.com>

* docs(readme): hero in the Cheaper Inference UI Kit typography (#18261)

* docs(readme): four above-the-fold diagrams in the UI Kit typography (#18308)

* docs(readme): tier cascade, strategies grid, resilience layers and comparison table in the UI Kit typography (#18309)

* docs(readme): privacy ledger, CLI terminal and compression pipeline in the UI Kit typography (#18310)

* docs(readme): one regenerate command for the twelve README diagrams + design-system docs (#18337)

* docs(i18n): re-sync 6 drifted docs across 66 locales (wave 1027) (#18371)

* fix(i18n): use the canonical zh provider term in the providerStats and discovery keys (#18372)

* feat: add Gemini prompt cache accounting (#12775)

* fix(sse): distinguish generic buffered error frames from identified Responses failures (#18370)

* fix: repair inherited release test reds (SSE bare-error frames, catalog fixtures, Codex fixture) (#17550)

Co-authored-by: KiaroSama <Kiaro.Sama.Dev@gmail.com>

* fix(providers): keep the ChatGPT Web browser launch under local and operator control (#18358)

Validation of chatgpt-web-codex ignored allowLocalSpawn, so a remote management request could make the host launch a browser, and both ChatGPT Web browser providers used a connection's stored chromeExecutablePath as the executable whenever the path existed. Honour allowLocalSpawn before any launch, and let the stored path only select a browser the operator configured (CHROME_PATH / CHATGPT_WEB_*_CHROME_PATH) or a known install location.

Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>

* fix(dashboard): quota UIs fall back to /api/providers and show an auth-required state on 401 (#17262) (#18194)

* deps(security): raise the qs override to ^6.16.1 (#18381)

Raise the qs override to ^6.16.1 (the lock resolves 6.17.0), picking up the upstream fix for qs.stringify with arrayFormat comma throwing an uncaught TypeError. Lockfile-only.

* fix(providers): honour allowLocalSpawn in Auggie validation (#18380)

The Auggie validator took no options and always ran `auggie --version`, so remote-reachable routes that pass allowLocalSpawn=false for non-loopback callers still made the host start the CLI. Return a local-validation-only result for those callers before any spawn; internal and local callers keep the CLI probe.

Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>

* ci: let own-origin PR unit and vitest jobs opt in to the omni-ci slots (USE_VPS_TEST_RUNNER) (#18338)

The hosted pool is the CI bottleneck (org-wide hosted concurrency; PR runs queued for hours). test-unit and test-vitest of own-origin pull requests can now opt in to three dedicated self-hosted omni-ci slots (omniroute-113-3/-4/-8, 12G/16G and 4 CPUs each) through vars.USE_VPS_TEST_RUNNER, default off. Forks, merge_group and push stay hosted, and USE_VPS_RUNNER still never governs a test job; the gap-19 guard pins the new switch.

* docs(i18n): refresh 8 docs in 66 locales and fix the README version-table provider count (#18253)

* fix(i18n): fall back to the next model and re-split when a chunk fails validation (#18422)

* ci(i18n): make docs-mirror drift advisory on pull requests and the merge train (#18420)

* Support custom compatible gateways behind an access proxy (#17136)

* fix(release): drain the deterministic unit and vitest reds of release/v3.8.53 (#18426)

* feat(release): bun-pack — bun-first global installs (build stays on Node) (#12801)

* fix(streams): let a target's declared budget raise the 21-minute stream cap (#18002)

* feat(providers): add Kimi (Moonshot) as a web search provider (#14292)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(deploy): Kubernetes support for k3s and k8s (#12400)

Co-authored-by: Paulo Holanda <paulorfholanda@gmail.com>
Co-authored-by: Paulo Roberto Fernandes Holanda <paulorfholanda@gmail.com>
Co-authored-by: insoln <11380274+insoln@users.noreply.github.com>

* feat(cli-agents): add WhyCodes as a first-class CLI Agent (#14107)

* feat(teams): billing cost centers, soft budgets and dashboard (#10409)

Co-authored-by: Markus Hartung <mail@hartmark.se>
Co-authored-by: dongsjoa <dongsjoa@Xiaoyaner-Mac-Studio.local>

* test(log-export): deflake the child-runner timing tests on loaded runners (#18440)

* feat(logs): add an OTLP/HTTP traces log-export destination (#16664)

* fix(providers): honour allowLocalSpawn in Qoder PAT validation (#18424)

Qoder Personal Access Token validation now honours allowLocalSpawn: for remote callers it returns a "validate locally" result instead of running the local qodercli. Covered by tests/unit/qoder-pat-validation-local-spawn.test.ts (direct call, dispatcher for qoder and the if alias, local control).

(no public reference)

Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>

* feat(i18n): structure-safe Google Translate engine for the docs pipeline + ENVIRONMENT re-sync (#18429)

* chore(ci): keep promptfoo, fumadocs-mdx, @playwright/test and bun out of dependabot groups (#18369)

The development group #17197 cannot land as is: five of its bumps (four packages) break a
contract or need a coordinated migration, and they keep the 21 routine
updates riding along with them red.

- promptfoo: exact pin mirrored by nightly-llm-security.yml and enforced by
  llm-security-nightly-promptfoo-pin.test.ts (0.124.1 is a known-broken
  release, promptfoo/promptfoo#10866).
- fumadocs-mdx >=15.4.7: imports embedSource, which the fumadocs-core on
  this branch does not export; Build fails loading next.config.mjs.
- @playwright/test: must equal the runtime playwright exact pin
  (playwright-runner-args.test.ts); runtime lives in the production group.
- bun / @types/bun: exact pin documented in AGENTS.md and BUILD_WARNINGS.md,
  bumped by hand after byte-identical validation of the Bun scripts.

No other dependabot rule changes.

* fix(providers): announce direct Poolside inference shutdown (#17331)

Announce the direct Poolside inference shutdown (2026-10-31) in the provider notes, FREE_TIERS and the generated provider reference.

Evidence: reconciled with origin/release/v3.8.53 (0 commits behind); poolside-sunset-notice-17318 2/2 and poolside-registry-models-9085 4/4; check:docs-all, ESLint, typecheck:core, file-size and changelog integrity green.

⚠️ base-red inherited: #17219

Fixes #17318

* test: move late top-level imports above the first test() in three unit files (#18439)

* fix(docs): keep the routing-strategy identifiers verbatim in the Bosnian AGENTS.md mirror (#18382)

* fix(sse): replay an empty upstream turn on the direct streaming path (#17280)

* fix(providers): register DeepSeek Flash aliases for vision requests (#17180) (#17243)

* chore(dashboard): sync the vendored CI UI Kit to 0.0.66 (#18434)

packages/ui-kit moves from upstream f0986a6 (0.0.48) to 3b6ba89 (0.0.66) through
scripts/dev/sync-ui-kit.sh; the workspace version and its lockfile entry follow.

The kit now self-hosts Switzer for every role (ci-tokens.css imports ci-fonts.css with
local woff2 files), so src/app/globals.css drops the @fontsource Inter / Instrument Serif /
IBM Plex Mono imports nothing references any more (the packages stay for the README
diagram generator). The bridge and snapshot-gate tests follow the new contract, and
DESIGN_SYSTEM.md describes Switzer.

Validated on the local VPS (.15) before merge. Red CI checks are inherited from the base
(#17219) and touch none of these files.

* test(security): match the codex fallback version without a hand-escaped regex (CodeQL #1187) (#18419)

The refresh-warning assertion uses String.includes instead of a RegExp that escaped only the dots of DEFAULT_CODEX_CLIENT_VERSION (CodeQL js/incomplete-sanitization #1187). Test-only; 9/9.

* ci: add the CodeRabbit review configuration (#18431)

Adds .coderabbit.yaml (validated against the CodeRabbit schema v2): auto review on non-draft PRs to release/vX.Y.Z and main, path filters for translated mirrors, lockfiles and generated files, per-area instructions from the AGENTS.md hard rules, pre-merge checks in warning mode for calibration. Takes effect once the CodeRabbit GitHub App is installed on the organization.

* ci: drop the duplicate unit/vitest fast-path and skip lcov/Codecov on PR coverage (#18336)

Quality Gates no longer runs fast-unit (4 shards of test:unit:ci:shard) and fast-vitest, which duplicated ci.yml test-unit/test-vitest on every PR since #14420 (~62 runner-minutes and 5 hosted jobs per PR); admission policy, check-test-discovery anchor and tests updated. On pull_request the Coverage job skips the lcov reporter and the informational Codecov upload; the 60% gate and summaries are unchanged.

* ci: run the heavy CI lanes in the merge queue, not on every PR push (#18342)

E2E, Electron smoke, Bun SQLite, integration, package artifact, ecosystem and protocol-client lanes run on push, workflow_dispatch, merge_group and the Mergify queue candidate (admission conditions full-code/full-code-e2e), not on every push to an ordinary PR. Merge through the Mergify queue (label queue) or run gh workflow run ci.yml --ref <branch> before a manual merge.

* docs(i18n): refresh 6 drifted docs in 66 locales with the Google engine (#18462)

* feat(discovery): remember the last discovery outcome per connection (#17346)

* fix(sse): report a buffered stream cut before its terminal signal as truncated, not stop (#18460)

* fix(release): bring the open-sse → src boundary back to 774 on release/v3.8.53 (#18467)

Refs #17219

* docs(i18n): re-sync DESIGN_SYSTEM mirrors with the Google engine (66 locales) (#18469)

* docs(ci): record the Team plan, the janitor ceiling of 8 and the hosted-only test lane in RUNNER_BOX (#18456)

Records the 2026-10-28 state of the runner box in docs/ops/RUNNER_BOX.md: Team plan (60 hosted jobs), janitor ceiling 8, five OmniRoute listeners (113-7 also carries omni-build, 113-3/-4/-8 deleted), and the vars.USE_VPS_TEST_RUNNER rule (same-repo pull_request only, off) with the measurement that turned it off. The 66 mirrors and .i18n-state.json come from scripts/i18n/run-translation.mjs (record/replay against a local backend).

* feat(i18n): Google fallback and quota circuit breaker for every translation entry point (#18461)

* fix(docs): sync the migration and provider counts to the live tree (base-red #17219) (#18476)

* feat(providers): extend expiry-first account routing (#16352)

* feat(api): serve Gemini-native /v1beta routes on the API-only port (#16745)

Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>

* feat(dashboard): per-step Test button in the combo create/edit modal (#16748)

Co-authored-by: Erwan Novianto <smserwan@gmail.com>

* feat(dashboard): hide/show models across providers from the Models catalog (#16749)

Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>

* fix(usage): enforce pending-request byte ceiling on all mutation paths (#17282)

Co-authored-by: turbolego <turbolego@gmail.com>

* perf: settings/combo read caches, async fs routes, bounded limiter settings (#17304)

Co-authored-by: Mayank Jaiswal <mayankjaiswal1707@gmail.com>

* fix(providers): align chatplayground with the current web chat API (#17312)

* fix(release): list the three covering tests in stryker tap.testFiles (#18485)

Refs #17219

* fix(release): open-sse typecheck and README diagram counts (377) on release/v3.8.53 (#18472)

Refs #17219

* feat(search): support Exa 3.0 lite pricing and field set (#17394)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(catalog): keep operator-defined custom models on curated providers (#18018)

* fix(sse): preserve harness tool history in Codex app-server (#18105)

Co-authored-by: Anton Shilin <coder.root@gmail.com>

* fix(sse): strip learned-only effort suffix back to the base model (#18131)

* fix(combo): keep durable exhaustion across set retries (#18133)

* fix(antigravity): stop three retry layers from hammering Cloud Code with a refused request (#18140)

Co-authored-by: Wital <witalo_rocha@hotmail.com>

* fix(build): skip the webpack persistent cache in production builds (#18141)

* fix(sse): copy-on-write in the JSON-schema fallbacks and skip non-JSON response_format (#18241)

* fix(i18n): protect inline HTML in the Google engine and guard HTML structure in the output check (#18486)

* ci(i18n): scheduled post-merge mirror refresh (LLM first, Google last resort) (#18489)

* fix(sse): withhold tool calls cut mid-arguments in a truncated buffered stream (#18482)

* feat(search): price Exa extra results and summaries like Exa bills them (#17396)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(usage): bound pending request retention (#17405)

Co-authored-by: Hummern <hummernkloa@gmail.com>

* fix(combo): fail over from a target whose buffered stream was cut before its terminal signal (#18490)

* feat(search): record Tavily advanced search at 2 credits (#17902)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(search): record Linkup deep search at $0.05 (#17903)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(search): record Firecrawl search per block of 10 results (#17904)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(release): clear the 10-28 typecheck, boundary, stryker, route-map and i18n reds on release/v3.8.53 (#18515)

Refs #17219

* fix(i18n): open the LLM circuit after three consecutive failures, not only on quota (#18474)

* fix(dashboard): monospace code text and a non-Latin script fallback after the kit 0.0.66 bump (#18477)

* fix(dashboard): bring the team costs, combo step test and catalog toggle onto the kit components (#18487)

* fix(api): let operators limit the Telegram bot to allowlisted senders (#18475)

A valid Telegram signature (webhook secret_token or Mini App initData) proves an update came from Telegram, not that its sender may use this instance. TELEGRAM_USER_ALLOWLIST_ENABLED=true now serves only the numeric user ids in TELEGRAM_ALLOWED_USER_IDS: unlisted Mini App users get 403 and webhook messages from unlisted senders are acknowledged and dropped. The check uses the sender (message.from.id), so group chats are covered; an empty list serves nobody; misconfiguration is logged once without echoing ids. Off by default.

Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>

* fix(api): stop keyless cross-origin reads on the client API and inference WebSockets (#18512)

HTTP: on a keyless install (REQUIRE_API_KEY=false) any Authorization, x-api-key or x-goog-api-key header, valid or not, made client-API routes echo the request Origin while serving the request as anonymous. The allow path now relaxes CLIENT_API CORS only for a non-anonymous subject; route-level 401s that refuse a presented key still echo Origin (Vary: Origin, no credentials header) so browser clients can read them (#5242).

WebSocket: browsers do not apply CORS to WebSockets and the /v1/responses, /v1/ws and /api/v1/ws handshakes never read Origin. They now admit no-Origin clients, CORS-allowlisted origins, the gateway's own public origin and handshakes with a valid API key; everything else, null included, gets 403 ws_origin_forbidden. The bridge upgrades only when the route answers originChecked: true. /v1/responses now enforces REQUIRE_API_KEY. The service worker also bypasses the client-API aliases. CORS and PWA guide mirrors refreshed.

Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>

* fix(release): clear the remaining release/v3.8.53 base-reds — namespaced combo lookup, curated imported rows, build-scope ceiling (#18516)

* fix(sse): resolve client-namespaced combos through the cached name lookup

#17304 replaced the exact-name combo lookups in getCombo() with
getCachedComboByName and dropped the getComboByName import, but missed the
third call site in getComboByClientNamespacedName (#16493). Any model id
with a "/" that is not a provider pin or catalog id then threw
"ReferenceError: getComboByName is not defined" inside getComboForModel,
which broke reasoning routing for unknown models and the client-namespace
combo resolution.

Fixes reasoning-routing-decision-guards ("an unknown model with no rules is
also a clean pass-through") and 5 cases of combo-prefixed-name-resolve.

* fix(models): keep sync-imported custom rows off curated-only providers

#18018 made custom models listable on curated-only providers so a model
added through "Add Custom Model" can be routed. Its stated scope is the
operator's own rows ("Discovery behaviour is unchanged ... only the
operator's own rows are kept"), but the three read paths kept every custom
row, including rows whose source is imported/api-sync/auto-sync. On a
provider with no upstream catalog such a row is a stale leftover of a
retired discovery path: #8451 removed exactly those obsolete Z.ai Web ids
(they 404 upstream), and zai-web-models-discovery-7678 pins that.

The provider listing merge, GET /api/providers/[id]/models and /v1/models
now drop discovery-imported custom rows on curated providers through one
helper (isDiscoveryImportedCustomSource); operator rows keep flowing.

zai-web-models-discovery-7678 now also expects the manual row, which
#18018 made listable on purpose. New cases pin the imported-row exclusion
in the listing merge and in /v1/models.

* chore(changelog): drop the duplicate namespaced-combo fragment (#18514 carries it)

The client-namespaced combo lookup fix is the same one-line change as
#18514, which already ships its changelog fragment.

Refs #17219

* chore(quality): raise the build-scope ceiling to 13500 in-scope files

The release branch reached 12267 in-scope .ts/.tsx/.js/.jsx files through
legitimate test growth (tests/ went 7841 -> 8296 files since 10-21), so
check:build-scope failed on every PR although nothing was leaking. A
leaked worktree or vendored checkout adds roughly a full tree (~12k
files), which 13500 still catches.

Refs #17219

* chore(dashboard): sync the CI UI Kit to 0.0.79 and keep tracking the newest release (#18504)

* docs(i18n): refresh the changed ENVIRONMENT sections in 66 locales (#18524)

* feat(antigravity): add Gemini 3.8 Flash tiers and update client fallbacks (#12499)

Co-authored-by: Abhishek Chhetri <abhishekchhetri@example.com>

* feat(oauth): GitHub Copilot capability-driven account integrationClaude/GitHub copilot integration 748ebe (#12833)

* feat(dashboard): size dialogs to 70% of the viewport (#14091)

Co-authored-by: Felipe Almeman <felipe@aireset.com.br>

* feat(opencode): sanitize the OpenCode PR 4145 fingerprint (#14142)

* feat(resilience): recover queued quota-failed sessions (#14981) (#14982)

* feat(providers): wire claude-haiku-5-5 across catalogs, pricing, and fallbacks (#16159)

Co-authored-by: Tuan Dinh <tuan.dinh.truong@sap.com>

* feat(models-health): report whether reasoning_effort none was honored per model (#16253)

* feat(providers): bounded-turn tool-call support for the ChatGPT Web clean-room adapter (#14948)

Co-authored-by: Arash <arash.ashrafi@gmail.com>

* feat(oauth): add Freebuff browser login to the freebuff provider (#15336) (#15343)

* feat(muse-code): consolidate open Muse Code PRs (#15234, #14138, #13634, #14267, #12687) (#15521)

Co-authored-by: mdc2122 <mdc2122@users.noreply.github.com>
Co-authored-by: SIGTERM-015 <SIGTERM-015@users.noreply.github.com>
Co-authored-by: KSonny4 <KSonny4@users.noreply.github.com>
Co-authored-by: caniko <caniko@users.noreply.github.com>
Co-authored-by: Chewji9875 <Chewji9875@users.noreply.github.com>

* feat(dashboard): show which combos use a model on the provider detail page (#16307)

Co-authored-by: Farshad <asadpoor.f@gmail.com>

* feat(pii): GDPR + POPIA PII patterns with validators (#16461)

Co-authored-by: Wayne <wayne@local>

* feat(affinity): optional Redis store for shared session-to-account affinity (#16569)

* feat(oauth): opt-in passive token refresh for Codex replicas (#16577)

* feat: improve adaptive routing and model health monitoring (#16746)

* feat(providers): allow manual vision overrides for synced models (#16794)

* fix(mcp): ignore client _meta scopes for stdio callers (#17112)

* fix(xai): flatten Codex namespace tools for /v1/responses; no account cooldown on 422 shape errors (#17134)

Co-authored-by: özcan Yaman <ozc.yaman@gmail.com>

* perf(provider-stats): bound provider-stats history to a 7-day window and cache the payload (#17227)

* fix(dashboard): decode percent-encoded combo route params for auto/* control center (#17271) (#17272)

* fix(desktop): publish and verify indexed optional runtime packs (#17338)

* refactor(a2a): share agent discovery metadata (#17357)

Co-authored-by: Jan Leon <jan@leoncode.de>

* fix: require reasoning_content presence for DeepSeek and align Grok 4.7 context and effort tiers (#17388)

Co-authored-by: Felipe Fidelix <felipe@fdx.is>

* fix(providers): isolate agy/antigravity hiddenModelGate and clear compat overrides on model reset (#17398) (#17400)

* fix(providers): rotate the deprecated OpenCode Zen mimo-v2.5-free id to v2.6 flash (#17472) (#17788)

Co-authored-by: vincent <webmaster@palmit.com.au>

* feat(sse): follow the published OpenCode endpoint and client headers for keyed requests (#17864)

* fix(tls): follow the newest wreq-js browser profile in the web providers (#17869)

* fix(sse): match the native Antigravity CLI wire image (#17913)

* fix(docker): pin node 26.12.1 / bun 1.4.4 so images reject the compromised eMudhra CAs (security) (#17927)

Co-authored-by: Markus Hartung <mail@hartmark.se>

* feat(db): maintain configurable SQLite planner statistics (#17936)

* fix(translator): ensure all assistant tool_calls are answered in fixMissingToolResponses (#17946) (#17947)

Co-authored-by: Felipe Fidelix <felipe@fdx.is>

* fix(dev): avoid the macOS dev-startup EBADF and keep reasoning out of combo test output (#17955)

* feat(combo): global outputLimitAdvisory setting and a per target context window check (#17958)

* fix(docker): split clientless CLI runtime from Docker tooling (#17972)

Co-authored-by: Sean P. Ford <sean@seanford.com>

* fix(providers): preserve Gemini function tools with native web search (#18020)

* fix(db): preserve utilization bucket timezone (#18083)

* fix(stream): preserve queued chunks on 6 abortStreamFailure sites (#18094)

* fix(sse): refuse non-JSON data lines in stream readiness and content checks (#18095)

* fix(db): don't skip half-applied proxy timing migration 194 (#18096)

* fix(sse): fold camel-case reasoning effort into the canonical field (#18117)

* fix(providers): preserve Codex reasoning controls and expose Muse subscription metadata (#18124)

Co-authored-by: Aldo <github@aldo.pw>

* fix(sse): local backends answer 499 while draining instead of 502 (#18134)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* fix(compression): keep the tail of a truncated lite tool result (#18138)

* fix(zcode): stream native Anthropic responses to clients (#18190)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* fix(quota): recognize international Kimi Coding usage endpoints (#18180) (#18224)

Co-authored-by: Nabi Bukhsh <nabibuksh.baloch01@gmail.com>

* feat(dashboard): assign catalog models and combos to API keys (#14890)

Co-authored-by: Fouad Salkini <fouad@wecansync.com>

* feat(ci): validate protection domains for admission jobs (#16142)

* feat(dashboard): add inline toggle and bulk disable/enable for no-auth providers (#16553)

* feat(cli-tools): add OpenClaude setup guide card (#16844)

Co-authored-by: Nguyen Thanh Dat <ntdat812@gmail.com>

* feat(api): opt-in "expose combos only" setting for /v1/models (#16846)

Co-authored-by: snower <sujian199@gmail.com>

* feat(mcp): add a deep research tool that is off by default (#17317)

* fix(opencode): map custom-provider catalog identities to public prefixes (#17369)

* feat(oauth): import Antigravity Manager account exports (#15746)

* feat(logs): distinguish generation rate from end-to-end throughput (#17847)

* feat(api): CLIProxyAPI management usage compatibility endpoints (#17999)

Co-authored-by: Rahul Bansal <rtrrahulbansal@gmail.com>

* feat(antigravity): add Gemini 4 Argon weekly quota, dual-resolver preflight, and 404 short-circuit (#18026)

* fix(zcode): preserve exact native Coding Plan quota refusals (#18118)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* feat(opencode-plugin-v2): publish one catalog branch with prefix wildcard and hide every combo (#18135)

* fix(combo): test all model health targets without a cumulative deadline (#18231) (#18238)

* fix(codex): distinguish transient capacity 429 from quota cooldown (#18221) (#18239)

* feat(oauth): route Grok Build image, video and audio (#15305)

* feat(codebuddy-cn): sync authenticated live model catalog (#17916)

* feat(providers): add MiniMax M3.1 Flash model (#18110)

* fix(build): select webpack automatically on low-memory builders (#18184) (#18242)

* fix(resilience): keep combos routable after transient credential probe errors (#18037) (#18243)

* fix(claude): keep model-credit 429 cooldown scoped to the affected model (#18058) (#18245)

* feat(providers): add Token Harbor API-key provider (#16315)

Co-authored-by: GitHub Actions <github-actions@github.com>

* feat(cli-tools): add current Pi setup flow (#16381)

Co-authored-by: Arash <arash.ashrafi@gmail.com>

* feat(api): configurable unpriced-usage budget policy + admin notice (#14604) (#14608)

* fix(i18n): escape the Maltese apostrophe in providers.usedInComboTooltip (base-red) (#18545)

* fix(usage): release terminal pending attempts when completion bookkeeping fails (#18217)

Co-authored-by: AiCapitan357 <ai-capitan-357@proton.me>

* feat(providers): add Runcrate (#18061)

* i18n: complete feature-flag definitions for all 66 locales, fix zh-CN/zh-TW mistranslations (#17960)

* feat(i18n): wire hardcoded dashboard strings into message catalogs (#17987)

* feat(providers): add Gisoo (OpenAI-compatible) (#18112)

Co-authored-by: Nirupam Bhowmick <48842933+heydryft@users.noreply.github.com>

* feat(providers): dashboard control for the advertised CLI client version (#14817)

Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>

* feat(ui): add remove error models button in combo test results, default autoHideFailed, and fix db import crash (#14944)

* revert(kea): drop the stale-model badge and preferred-connections kit guards (#18250)

* revert(kea): drop the kit e2e spec filter and settings-toggles realignment (#18247)

* revert(kea): drop the post-migration follow-ups A on the kit (#18202)

* revert(kea): drop the kit chart token palettes (#18144)

* revert(kea): drop the UI kit line from the repository map (#18080)

* revert(kea): drop the Keak CI UI Kit dashboard migration (#17951)

Removes packages/ui-kit and the dashboard/UI-kit surface from the merged
upstream state; the fork keeps its own dashboard. The kit workspace, its
snapshot scripts and the vendored sources are deleted with it.

* revert(dashboard): drop the team-costs/catalog kit port and the leftover kit scripts

c0a7b86272 moved the team costs screens onto @omniroute/ui-kit, which the
fork no longer vendors. Reverting it restores SearchableSelect and the
legacy team components.

Also drops the kit-only updater script and its two tests, and removes the
ui-kit workspace entry from package.json / package-lock.json.

* fix(dashboard): finish the kit removal on the two stragglers

ModelCatalogTable came back from the pre-kit tree (it was still importing
@omniroute/ui-kit table primitives); DiscoveryDegradedNotice swaps the kit
Icon for the Material glyph the rest of the legacy UI uses.

Restores the material-symbols dependency the restored globals.css imports.

* chore(ci): keep only the fork workflows (bun.yml + release.yml)

* docs(env): drop the UI kit upstream token now that the kit is not vendored

* chore(compression): keep the release branch wording in lite.ts

---------

Co-authored-by: Bob.Hou <houminxi@gmail.com>
Co-authored-by: Dizzle <112548150+maxmad64bis@users.noreply.github.com>
Co-authored-by: 量子跃迁 <42333314+starxjys@users.noreply.github.com>
Co-authored-by: Ai Captain 357 <ai-capitan-357@proton.me>
Co-authored-by: Adrián Cancio <49328080+adrian-cancio@users.noreply.github.com>
Co-authored-by: trespassmk <123762858+trespassmk@users.noreply.github.com>
Co-authored-by: Fabio Junior Gruchovski <122614728+fabioKoruja00@users.noreply.github.com>
Co-authored-by: Cristhian Hernandez <ayalachristian555@gmail.com>
Co-authored-by: xc0derx <11428624+xc0derx@users.noreply.github.com>
Co-authored-by: AbdullahPesteli <121692116+AbdullahPesteli@users.noreply.github.com>
Co-authored-by: DeadY2J <jorgelamelas@hotmail.com>
Co-authored-by: Sean Ford <sean@seanford.com>
Co-authored-by: stanley <gstanleytejakusuma@gmail.com>
Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
Co-authored-by: 小妍儿 ✨ <258399167+xiaoyaner0201@users.noreply.github.com>
Co-authored-by: skygunner <skygunner@users.noreply.github.com>
Co-authored-by: vincent <webmaster@palmit.com.au>
Co-authored-by: MumuTW <42820974+MumuTW@users.noreply.github.com>
Co-authored-by: Davy Massoneto <davy.massoneto@yahoo.com>
Co-authored-by: Davy Massoneto <davy.m.massoneto@gmail.com>
Co-authored-by: Wray <i@wray7.top>
Co-authored-by: wray-lee <wray-lee@outlook.com>
Co-authored-by: kenny000666 <kennyhomeautomation@googlemail.com>
Co-authored-by: Safeer Ahmad <asafeer1994@gmail.com>
Co-authored-by: Junior-HJ <sjaradj@ucvvirtual.edu.pe>
Co-authored-by: jbovard2016 <jon.bovard@gmail.com>
Co-authored-by: Kiaro-Sama <106400900+KiaroSama@users.noreply.github.com>
Co-authored-by: KiaroSama <Kiaro.Sama.Dev@gmail.com>
Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>
Co-authored-by: Guan Gui <guiguan@gmail.com>
Co-authored-by: opensource-elearning <159253500+opensource-elearning@users.noreply.github.com>
Co-authored-by: Praveen K Palaniswamy <praveen.palaniswamy@gmail.com>
Co-authored-by: Paulo Holanda <paulorfholanda@gmail.com>
Co-authored-by: insoln <11380274+insoln@users.noreply.github.com>
Co-authored-by: Mr. Nasıl <leidizayn@gmail.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
Co-authored-by: dongsjoa <dongsjoa@Xiaoyaner-Mac-Studio.local>
Co-authored-by: Prince <162042308+PrinceThummar011@users.noreply.github.com>
Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>
Co-authored-by: Erwan Novianto <smserwan@gmail.com>
Co-authored-by: hummern <hummernkloa@gmail.com>
Co-authored-by: turbolego <turbolego@gmail.com>
Co-authored-by: Mayank Jaiswal <mayankjaiswal1707@gmail.com>
Co-authored-by: James Martinez <james-martinez@users.noreply.github.com>
Co-authored-by: Anton Shilin <coder.root@gmail.com>
Co-authored-by: WITALO ROCHA <witalo_rocha@hotmail.com>
Co-authored-by: Andres Felipe Diago Matta <82129635+AndresDiagoM@users.noreply.github.com>
Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>
Co-authored-by: Abhishekchhetri020 <145480099+Abhishekchhetri020@users.noreply.github.com>
Co-authored-by: Abhishek Chhetri <abhishekchhetri@example.com>
Co-authored-by: ScottyAmr <scott.kanowski@gmail.com>
Co-authored-by: Felipe Almeman <4226997+zhiru@users.noreply.github.com>
Co-authored-by: Felipe Almeman <felipe@aireset.com.br>
Co-authored-by: Rafa Martins <146174365+rafacpti23@users.noreply.github.com>
Co-authored-by: Dongwook <dongwook.chan@gmail.com>
Co-authored-by: Tuan Dinh <tuan.dinh.truong@sap.com>
Co-authored-by: arashashrafii <arash.ashrafi@gmail.com>
Co-authored-by: Pranav Deshpande <134182346+PranavD2905@users.noreply.github.com>
Co-authored-by: kalpakprod <beta_virus123@proton.me>
Co-authored-by: mdc2122 <mdc2122@users.noreply.github.com>
Co-authored-by: SIGTERM-015 <SIGTERM-015@users.noreply.github.com>
Co-authored-by: KSonny4 <KSonny4@users.noreply.github.com>
Co-authored-by: caniko <caniko@users.noreply.github.com>
Co-authored-by: Chewji9875 <Chewji9875@users.noreply.github.com>
Co-authored-by: Farshad Asadpour <asadpoor.f@gmail.com>
Co-authored-by: Wayne Fourie <31033564+zerotraceio@users.noreply.github.com>
Co-authored-by: Wayne <wayne@local>
Co-authored-by: Thành Long <102373535+Longvt1164@users.noreply.github.com>
Co-authored-by: özcan Yaman <ozc.yaman@gmail.com>
Co-authored-by: Afonso Dutra Nogueira Filho <afonsoft@gmail.com>
Co-authored-by: Jan Leon <jan@leoncode.de>
Co-authored-by: Felipe Fidelix <309092+fidelix@users.noreply.github.com>
Co-authored-by: Felipe Fidelix <felipe@fdx.is>
Co-authored-by: openclaw-bot <balance.devdart@gmail.com>
Co-authored-by: ahmed shahin <ahmedgo17390@gmail.com>
Co-authored-by: lorenzozane <wyz0707@proton.me>
Co-authored-by: Kevin Lin <levinkin07@gmail.com>
Co-authored-by: Bl0ck <36800583+Bl0ck154@users.noreply.github.com>
Co-authored-by: Aldo <github@aldo.pw>
Co-authored-by: Bezrabotnyi <megamen932@gmail.com>
Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>
Co-authored-by: Nabi Bukhsh <133964972+NabiBukhsh-AI@users.noreply.github.com>
Co-authored-by: Nabi Bukhsh <nabibuksh.baloch01@gmail.com>
Co-authored-by: Fouad Salkini <fouad@wecansync.com>
Co-authored-by: Nguyen Thanh Dat <ntdat812@gmail.com>
Co-authored-by: snower <sujian199@gmail.com>
Co-authored-by: mertcandrks <mertcanbakir34@gmail.com>
Co-authored-by: Rahul Bansal <42.rahulbansal@gmail.com>
Co-authored-by: Rahul Bansal <rtrrahulbansal@gmail.com>
Co-authored-by: MrSiB <a@aq2.ru>
Co-authored-by: Kizuno18 <110933270+Kizuno18@users.noreply.github.com>
Co-authored-by: AStupidBear <luyaocns@gmail.com>
Co-authored-by: Octopus <jellyjellysoo127@gmail.com>
Co-authored-by: GitHub Actions <github-actions@github.com>
Co-authored-by: Nirupam Bhowmick <48842933+heydryft@users.noreply.github.com>
Co-authored-by: NetArz | نِت اَرز <aaramin92@gmail.com>
Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>
Co-authored-by: skymanbj <liubohn69@gmail.com>
DarknessKiller added a commit to DarknessKiller/OmniRoute that referenced this pull request Oct 29, 2026
… Kit (#15)

* test(perplexity-web): use a mapped model in the stream boundary delayed-hook case (#18232)

Use a mapped model in the stream boundary delayed-hook case.

Evidence: focused tests (no test files in diff); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(compression): report RTK's real truncation count and cut on line boundaries (#18139)

Report RTK's real truncation count and cut on line boundaries.

Evidence: focused tests (tests/unit/compression/rtk-smart-truncate.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(responses): keep replayed web search call ids on generic executors (#18127)

Keep replayed web search call ids on generic executors.

Evidence: focused tests (tests/unit/responses-input-sanitizer-websearch-id.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): purge releasable failure entries past held lockouts (#18126)

Purge releasable failure entries past held lockouts.

Evidence: focused tests (tests/unit/account-fallback-lockout-eviction.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): keep explicit thinking type over connection default (#18114)

Keep explicit thinking type over connection default.

Evidence: focused tests (tests/unit/glm-thinking-type-explicit.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(combo): clear stale LKGP pin on quality-rejected 200 (#18113)

Clear stale LKGP pin on quality-rejected 200.

Evidence: focused tests (tests/unit/combo/execute-target-attempt.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(translator): deferred OpenAI→Claude finish replays the pending choice, duplicating the last tool-arg fragment (#18193)

Deferred OpenAI→Claude finish replays the pending choice, duplicating the last tool-arg fragment.

Evidence: focused tests (tests/unit/openai-to-claude-trailing-usage-deferred-finish.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(bootstrap): strip inline comments from unquoted env values (#18116)

Strip inline comments from unquoted env values.

Evidence: focused tests (tests/unit/bootstrap-env-inline-comment.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): enforce UTF-8 byte caps for captured stream chunks (#18187)

Enforce UTF-8 byte caps for captured stream chunks.

Evidence: focused tests (tests/unit/request-logger-stream-byte-cap.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(opencode): scope a retired-model 410 to the model, not the connection (#17827)

Scope a retired-model 410 to the model, not the connection.

Evidence: focused tests (tests/unit/opencode-410-model-scope.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(models): bound retained catalog response caches (#18188)

Bound retained catalog response caches.

Evidence: focused tests (tests/unit/catalog-cache-bounds.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(api): expose provider-wildcard combos in model catalog (#18182)

Expose provider-wildcard combos in model catalog.

Evidence: focused tests (tests/unit/models-catalog-provider-wildcard.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Fixes #18033

* fix(usage): include Kimi Coding monthly quota (#18234)

Include Kimi Coding monthly quota.

Evidence: focused tests (tests/unit/kimi-monthly-membership-quota.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(pool): reclaim dead sessions on acquire instead of returning null (#18115)

Reclaim dead sessions on acquire instead of returning null.

Evidence: focused tests (tests/unit/session-pool-dead-reclaim.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(embeddings): preserve Gemini native token usage (#18244) (#18246)

Preserve Gemini native token usage.

Evidence: focused tests (tests/unit/embeddings-multimodal-7956.test.ts, tests/unit/gemini-embedding-2-multimodal.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Closes #18244.

* fix(combo): apply the global per-target expansion cap when a combo sets none (#18130)

Apply the global per-target expansion cap when a combo sets none.

Evidence: focused tests (tests/unit/combo/connection-aware-expansion.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(translator): keep OpenAI prompt_cache_breakpoint on content parts for openai/openrouter (#18255)

Keep OpenAI prompt_cache_breakpoint on content parts for openai/openrouter.

Evidence: focused tests (tests/unit/translator-openai-prompt-cache-breakpoint-18254.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Closes #18254

* fix(sse): preserve complexity hints in primary auto routing (#18104)

Preserve complexity hints in primary auto routing.

Evidence: focused tests (tests/unit/auto-combo-primary-complexity.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(build): bundle locale catalogs as text in webpack builds (#18183)

Bundle locale catalogs as text in webpack builds.

Evidence: focused tests (tests/unit/build/webpack-locale-messages-source.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(compression): let an idle pool worker stop holding the process open (#18136)

Let an idle pool worker stop holding the process open.

Evidence: focused tests (tests/unit/compression/compression-worker-pool-exit.test.ts, tests/unit/compression/compression-worker-pool-jam.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(firefly): avoid false stale detection for non-underscore Forter timestamps (#18099)

Avoid false stale detection for non-underscore Forter timestamps.

Evidence: focused tests (tests/unit/adobe-firefly-browser-login.test.ts, tests/unit/adobe-forter-session-timestamp.test.ts, tests/unit/adobe-forter-timestamp-extraction.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(tls): cancel response bodies when requests are aborted (#18228)

Cancel response bodies when requests are aborted.

Evidence: focused tests (tests/unit/http-backed-chat-response-lifetime.test.ts, tests/unit/tls-client-abort-lifetime.test.ts, tests/unit/tls-proxy-context.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): honor pii-masker opt-out in streaming pipeline (#18121)

Honor pii-masker opt-out in streaming pipeline.

Evidence: focused tests (tests/unit/chatcore-streaming-pipeline.test.ts, tests/unit/streaming-pii-optout-gate.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(nvidia): replace retired Nemotron 3 Super with Nemotron 3.5 Super VL (#17928)

Replace retired Nemotron 3 Super with Nemotron 3.5 Super VL.

Evidence: focused tests (tests/unit/antigravity-bridge-routing.test.ts, tests/unit/catalog-updates-v3x.test.ts, tests/unit/nvidia-eol-catalog.test.ts, tests/unit/nvidia-nim-registry-6108.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(services): harden embedded Bifrost runtime (#17976)

Harden embedded Bifrost runtime.

Evidence: focused tests (tests/unit/authz/route-guard-version-get-exemption.test.ts, tests/unit/route-guard-local-only-sweep.test.ts, tests/unit/services/installers/bifrost.test.ts, tests/unit/services/internal-health-fetch.test.ts, tests/unit/services/service-status-route-guard.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(oauth): accept permission-based Cursor user API keys (#17905)

Accept permission-based Cursor user API keys.

Evidence: focused tests (tests/unit/cursor-agent-image.test.ts, tests/unit/cursor-api-key-auth.test.ts, tests/unit/cursor-api-models-discovery.test.ts, tests/unit/cursor-apikey-provider.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(mcp): validate Origin on /api/mcp/* to block DNS rebinding (#17273)

Validate Origin on /api/mcp/* to block DNS rebinding.

Evidence: focused tests (tests/integration/mcp-origin-host-e2e.test.ts, tests/unit/mcp-origin-validation.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* test(authz): fail when a host-config, process-control or data-export route can be anonymous (#18293)

Fail when a host-config, process-control or data-export route can be anonymous.

Evidence: focused tests (tests/unit/management-capability-routes-protected.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* refactor(api): move the per-request keepalive frame into a helper (#17825) (#18281)

Move the per-request keepalive frame into a helper.

Evidence: focused tests (tests/unit/responses-route-early-keepalive-wiring.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* test(ui): repair the vitest UI base-red on release/v3.8.53 (#18306)

Repair the vitest UI base-red on release/v3.8.53.

Evidence: focused tests (tests/unit/ui/api-key-access-editor.test.tsx); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(sse): type empty or typeless array items in Gemini tool schemas (#18289)

Type empty or typeless array items in Gemini tool schemas.

Evidence: focused tests (tests/unit/gemini-array-items.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(auth): fail closed when the logout revocation cannot be saved (#18323)

Fail closed when the logout revocation cannot be saved.

Evidence: focused tests (tests/unit/dashboard-session-invalidation.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(cursor): harden the HTTP/2 proxy tunnel and fail closed on unresolvable pinned proxies (#18324)

Harden the HTTP/2 proxy tunnel and fail closed on unresolvable pinned proxies.

Evidence: focused tests (tests/unit/cursor-h2-proxy-connect-hardening.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(antigravity): accept the bare gemini-4-argon id and list Gemini 4 Argon on Vertex (#18285)

Accept the bare gemini-4-argon id and list Gemini 4 Argon on Vertex.

Evidence: focused tests (tests/unit/gemini-4-argon-bare-alias-vertex.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* feat(providers): add Kimi K3.1 Pro to the Command Code static catalog (#18292)

Add Kimi K3.1 Pro to the Command Code static catalog.

Evidence: focused tests (tests/unit/command-code-executor.test.ts, tests/unit/command-code-kimi-k3-1-pro-5172.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(api): report an unreachable upstream as 502 in provider model discovery (#18294)

Report an unreachable upstream as 502 in provider model discovery.

Evidence: focused tests (tests/unit/provider-models-upstream-unreachable-4843.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(db): revoke a deleted combo's name from API key allowed_combos (#18297)

Revoke a deleted combo's name from API key allowed_combos.

Evidence: focused tests (tests/unit/combo-delete-revokes-key-grants.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* feat(providers): add Kimi K3.1 Pro to OpenCode Go (#18295)

Add Kimi K3.1 Pro to OpenCode Go.

Evidence: focused tests (tests/unit/opencode-go-kimi-k3.1-pro-5147.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* feat(compression): add RTK filter for PHPUnit test output (#18317)

Add RTK filter for PHPUnit test output.

Evidence: focused tests (tests/unit/compression/rtk-phpunit-filter.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* fix(translator): honor explicit client max_tokens on Claude/Gemini/Antigravity -> OpenAI (#18300)

Honor explicit client max_tokens on Claude/Gemini/Antigravity -> OpenAI.

Evidence: focused tests (tests/unit/openai-to-claude-explicit-max-tokens-cap.test.ts, tests/unit/translator-antigravity-to-openai.test.ts, tests/unit/translator-explicit-max-tokens-cap-5180.test.ts, tests/unit/translator-gemini-to-openai.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* fix(api): honor OMNIROUTE_NO_UPDATE_NOTIFIER in the dashboard version check (#18316)

Honor OMNIROUTE_NO_UPDATE_NOTIFIER in the dashboard version check.

Evidence: focused tests (tests/unit/system-version-update-optout.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* fix(docs): refresh the live counts and the design-system palette note on release/v3.8.53 (#18339)

* i18n(ui): translate the cursor-api onboarding description in 38 locales (#18351)

* fix(discovery): show why a model discovery fell back to the built-in catalog (#17342)

* feat(dashboard): account-availability quota overview with per-pool rows and reorderable providers (#17026)

* fix(dashboard): show the configured model and the full account in the Combo Control Center (#17393) (#17774)

Co-authored-by: vincent <webmaster@palmit.com.au>

* refactor(routing): share combo attempt failure facts (#17956)

* fix(claude): forward max reasoning effort on the Responses path for max-capable models (#18064)

Co-authored-by: Davy Massoneto <davy.m.massoneto@gmail.com>

* feat(proxy): accept selector-only subscriptions with no feed URL (#16165)

* fix(translator): bridge Claude Code WebSearch to Codex native web_search (#16365)

Co-authored-by: wray-lee <wray-lee@outlook.com>

* feat(routing): enrich routing events with apiKeyId and stream cost (#14736)

Co-authored-by: Safeer Ahmad <asafeer1994@gmail.com>

* fix(providers): surface failed Codex client-version refreshes instead of swallowing them (#17855)

* feat(api): add per-key Claude Code discovery alias control (#17979)

Co-authored-by: Sean P. Ford <sean@seanford.com>

* docs(readme): hero in the Cheaper Inference UI Kit typography (#18261)

* docs(readme): four above-the-fold diagrams in the UI Kit typography (#18308)

* docs(readme): tier cascade, strategies grid, resilience layers and comparison table in the UI Kit typography (#18309)

* docs(readme): privacy ledger, CLI terminal and compression pipeline in the UI Kit typography (#18310)

* docs(readme): one regenerate command for the twelve README diagrams + design-system docs (#18337)

* docs(i18n): re-sync 6 drifted docs across 66 locales (wave 1027) (#18371)

* fix(i18n): use the canonical zh provider term in the providerStats and discovery keys (#18372)

* feat: add Gemini prompt cache accounting (#12775)

* fix(sse): distinguish generic buffered error frames from identified Responses failures (#18370)

* fix: repair inherited release test reds (SSE bare-error frames, catalog fixtures, Codex fixture) (#17550)

Co-authored-by: KiaroSama <Kiaro.Sama.Dev@gmail.com>

* fix(providers): keep the ChatGPT Web browser launch under local and operator control (#18358)

Validation of chatgpt-web-codex ignored allowLocalSpawn, so a remote management request could make the host launch a browser, and both ChatGPT Web browser providers used a connection's stored chromeExecutablePath as the executable whenever the path existed. Honour allowLocalSpawn before any launch, and let the stored path only select a browser the operator configured (CHROME_PATH / CHATGPT_WEB_*_CHROME_PATH) or a known install location.

Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>

* fix(dashboard): quota UIs fall back to /api/providers and show an auth-required state on 401 (#17262) (#18194)

* deps(security): raise the qs override to ^6.16.1 (#18381)

Raise the qs override to ^6.16.1 (the lock resolves 6.17.0), picking up the upstream fix for qs.stringify with arrayFormat comma throwing an uncaught TypeError. Lockfile-only.

* fix(providers): honour allowLocalSpawn in Auggie validation (#18380)

The Auggie validator took no options and always ran `auggie --version`, so remote-reachable routes that pass allowLocalSpawn=false for non-loopback callers still made the host start the CLI. Return a local-validation-only result for those callers before any spawn; internal and local callers keep the CLI probe.

Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>

* ci: let own-origin PR unit and vitest jobs opt in to the omni-ci slots (USE_VPS_TEST_RUNNER) (#18338)

The hosted pool is the CI bottleneck (org-wide hosted concurrency; PR runs queued for hours). test-unit and test-vitest of own-origin pull requests can now opt in to three dedicated self-hosted omni-ci slots (omniroute-113-3/-4/-8, 12G/16G and 4 CPUs each) through vars.USE_VPS_TEST_RUNNER, default off. Forks, merge_group and push stay hosted, and USE_VPS_RUNNER still never governs a test job; the gap-19 guard pins the new switch.

* docs(i18n): refresh 8 docs in 66 locales and fix the README version-table provider count (#18253)

* fix(i18n): fall back to the next model and re-split when a chunk fails validation (#18422)

* ci(i18n): make docs-mirror drift advisory on pull requests and the merge train (#18420)

* Support custom compatible gateways behind an access proxy (#17136)

* fix(release): drain the deterministic unit and vitest reds of release/v3.8.53 (#18426)

* feat(release): bun-pack — bun-first global installs (build stays on Node) (#12801)

* fix(streams): let a target's declared budget raise the 21-minute stream cap (#18002)

* feat(providers): add Kimi (Moonshot) as a web search provider (#14292)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(deploy): Kubernetes support for k3s and k8s (#12400)

Co-authored-by: Paulo Holanda <paulorfholanda@gmail.com>
Co-authored-by: Paulo Roberto Fernandes Holanda <paulorfholanda@gmail.com>
Co-authored-by: insoln <11380274+insoln@users.noreply.github.com>

* feat(cli-agents): add WhyCodes as a first-class CLI Agent (#14107)

* feat(teams): billing cost centers, soft budgets and dashboard (#10409)

Co-authored-by: Markus Hartung <mail@hartmark.se>
Co-authored-by: dongsjoa <dongsjoa@Xiaoyaner-Mac-Studio.local>

* test(log-export): deflake the child-runner timing tests on loaded runners (#18440)

* feat(logs): add an OTLP/HTTP traces log-export destination (#16664)

* fix(providers): honour allowLocalSpawn in Qoder PAT validation (#18424)

Qoder Personal Access Token validation now honours allowLocalSpawn: for remote callers it returns a "validate locally" result instead of running the local qodercli. Covered by tests/unit/qoder-pat-validation-local-spawn.test.ts (direct call, dispatcher for qoder and the if alias, local control).

(no public reference)

Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>

* feat(i18n): structure-safe Google Translate engine for the docs pipeline + ENVIRONMENT re-sync (#18429)

* chore(ci): keep promptfoo, fumadocs-mdx, @playwright/test and bun out of dependabot groups (#18369)

The development group #17197 cannot land as is: five of its bumps (four packages) break a
contract or need a coordinated migration, and they keep the 21 routine
updates riding along with them red.

- promptfoo: exact pin mirrored by nightly-llm-security.yml and enforced by
  llm-security-nightly-promptfoo-pin.test.ts (0.124.1 is a known-broken
  release, promptfoo/promptfoo#10866).
- fumadocs-mdx >=15.4.7: imports embedSource, which the fumadocs-core on
  this branch does not export; Build fails loading next.config.mjs.
- @playwright/test: must equal the runtime playwright exact pin
  (playwright-runner-args.test.ts); runtime lives in the production group.
- bun / @types/bun: exact pin documented in AGENTS.md and BUILD_WARNINGS.md,
  bumped by hand after byte-identical validation of the Bun scripts.

No other dependabot rule changes.

* fix(providers): announce direct Poolside inference shutdown (#17331)

Announce the direct Poolside inference shutdown (2026-10-31) in the provider notes, FREE_TIERS and the generated provider reference.

Evidence: reconciled with origin/release/v3.8.53 (0 commits behind); poolside-sunset-notice-17318 2/2 and poolside-registry-models-9085 4/4; check:docs-all, ESLint, typecheck:core, file-size and changelog integrity green.

⚠️ base-red inherited: #17219

Fixes #17318

* test: move late top-level imports above the first test() in three unit files (#18439)

* fix(docs): keep the routing-strategy identifiers verbatim in the Bosnian AGENTS.md mirror (#18382)

* fix(sse): replay an empty upstream turn on the direct streaming path (#17280)

* fix(providers): register DeepSeek Flash aliases for vision requests (#17180) (#17243)

* chore(dashboard): sync the vendored CI UI Kit to 0.0.66 (#18434)

packages/ui-kit moves from upstream f0986a6 (0.0.48) to 3b6ba89 (0.0.66) through
scripts/dev/sync-ui-kit.sh; the workspace version and its lockfile entry follow.

The kit now self-hosts Switzer for every role (ci-tokens.css imports ci-fonts.css with
local woff2 files), so src/app/globals.css drops the @fontsource Inter / Instrument Serif /
IBM Plex Mono imports nothing references any more (the packages stay for the README
diagram generator). The bridge and snapshot-gate tests follow the new contract, and
DESIGN_SYSTEM.md describes Switzer.

Validated on the local VPS (.15) before merge. Red CI checks are inherited from the base
(#17219) and touch none of these files.

* test(security): match the codex fallback version without a hand-escaped regex (CodeQL #1187) (#18419)

The refresh-warning assertion uses String.includes instead of a RegExp that escaped only the dots of DEFAULT_CODEX_CLIENT_VERSION (CodeQL js/incomplete-sanitization #1187). Test-only; 9/9.

* ci: add the CodeRabbit review configuration (#18431)

Adds .coderabbit.yaml (validated against the CodeRabbit schema v2): auto review on non-draft PRs to release/vX.Y.Z and main, path filters for translated mirrors, lockfiles and generated files, per-area instructions from the AGENTS.md hard rules, pre-merge checks in warning mode for calibration. Takes effect once the CodeRabbit GitHub App is installed on the organization.

* ci: drop the duplicate unit/vitest fast-path and skip lcov/Codecov on PR coverage (#18336)

Quality Gates no longer runs fast-unit (4 shards of test:unit:ci:shard) and fast-vitest, which duplicated ci.yml test-unit/test-vitest on every PR since #14420 (~62 runner-minutes and 5 hosted jobs per PR); admission policy, check-test-discovery anchor and tests updated. On pull_request the Coverage job skips the lcov reporter and the informational Codecov upload; the 60% gate and summaries are unchanged.

* ci: run the heavy CI lanes in the merge queue, not on every PR push (#18342)

E2E, Electron smoke, Bun SQLite, integration, package artifact, ecosystem and protocol-client lanes run on push, workflow_dispatch, merge_group and the Mergify queue candidate (admission conditions full-code/full-code-e2e), not on every push to an ordinary PR. Merge through the Mergify queue (label queue) or run gh workflow run ci.yml --ref <branch> before a manual merge.

* docs(i18n): refresh 6 drifted docs in 66 locales with the Google engine (#18462)

* feat(discovery): remember the last discovery outcome per connection (#17346)

* fix(sse): report a buffered stream cut before its terminal signal as truncated, not stop (#18460)

* fix(release): bring the open-sse → src boundary back to 774 on release/v3.8.53 (#18467)

Refs #17219

* docs(i18n): re-sync DESIGN_SYSTEM mirrors with the Google engine (66 locales) (#18469)

* docs(ci): record the Team plan, the janitor ceiling of 8 and the hosted-only test lane in RUNNER_BOX (#18456)

Records the 2026-10-28 state of the runner box in docs/ops/RUNNER_BOX.md: Team plan (60 hosted jobs), janitor ceiling 8, five OmniRoute listeners (113-7 also carries omni-build, 113-3/-4/-8 deleted), and the vars.USE_VPS_TEST_RUNNER rule (same-repo pull_request only, off) with the measurement that turned it off. The 66 mirrors and .i18n-state.json come from scripts/i18n/run-translation.mjs (record/replay against a local backend).

* feat(i18n): Google fallback and quota circuit breaker for every translation entry point (#18461)

* fix(docs): sync the migration and provider counts to the live tree (base-red #17219) (#18476)

* feat(providers): extend expiry-first account routing (#16352)

* feat(api): serve Gemini-native /v1beta routes on the API-only port (#16745)

Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>

* feat(dashboard): per-step Test button in the combo create/edit modal (#16748)

Co-authored-by: Erwan Novianto <smserwan@gmail.com>

* feat(dashboard): hide/show models across providers from the Models catalog (#16749)

Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>

* fix(usage): enforce pending-request byte ceiling on all mutation paths (#17282)

Co-authored-by: turbolego <turbolego@gmail.com>

* perf: settings/combo read caches, async fs routes, bounded limiter settings (#17304)

Co-authored-by: Mayank Jaiswal <mayankjaiswal1707@gmail.com>

* fix(providers): align chatplayground with the current web chat API (#17312)

* fix(release): list the three covering tests in stryker tap.testFiles (#18485)

Refs #17219

* fix(release): open-sse typecheck and README diagram counts (377) on release/v3.8.53 (#18472)

Refs #17219

* feat(search): support Exa 3.0 lite pricing and field set (#17394)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(catalog): keep operator-defined custom models on curated providers (#18018)

* fix(sse): preserve harness tool history in Codex app-server (#18105)

Co-authored-by: Anton Shilin <coder.root@gmail.com>

* fix(sse): strip learned-only effort suffix back to the base model (#18131)

* fix(combo): keep durable exhaustion across set retries (#18133)

* fix(antigravity): stop three retry layers from hammering Cloud Code with a refused request (#18140)

Co-authored-by: Wital <witalo_rocha@hotmail.com>

* fix(build): skip the webpack persistent cache in production builds (#18141)

* fix(sse): copy-on-write in the JSON-schema fallbacks and skip non-JSON response_format (#18241)

* fix(i18n): protect inline HTML in the Google engine and guard HTML structure in the output check (#18486)

* ci(i18n): scheduled post-merge mirror refresh (LLM first, Google last resort) (#18489)

* fix(sse): withhold tool calls cut mid-arguments in a truncated buffered stream (#18482)

* feat(search): price Exa extra results and summaries like Exa bills them (#17396)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(usage): bound pending request retention (#17405)

Co-authored-by: Hummern <hummernkloa@gmail.com>

* fix(combo): fail over from a target whose buffered stream was cut before its terminal signal (#18490)

* feat(search): record Tavily advanced search at 2 credits (#17902)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(search): record Linkup deep search at $0.05 (#17903)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(search): record Firecrawl search per block of 10 results (#17904)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(release): clear the 10-28 typecheck, boundary, stryker, route-map and i18n reds on release/v3.8.53 (#18515)

Refs #17219

* fix(i18n): open the LLM circuit after three consecutive failures, not only on quota (#18474)

* fix(dashboard): monospace code text and a non-Latin script fallback after the kit 0.0.66 bump (#18477)

* fix(dashboard): bring the team costs, combo step test and catalog toggle onto the kit components (#18487)

* fix(api): let operators limit the Telegram bot to allowlisted senders (#18475)

A valid Telegram signature (webhook secret_token or Mini App initData) proves an update came from Telegram, not that its sender may use this instance. TELEGRAM_USER_ALLOWLIST_ENABLED=true now serves only the numeric user ids in TELEGRAM_ALLOWED_USER_IDS: unlisted Mini App users get 403 and webhook messages from unlisted senders are acknowledged and dropped. The check uses the sender (message.from.id), so group chats are covered; an empty list serves nobody; misconfiguration is logged once without echoing ids. Off by default.

Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>

* fix(api): stop keyless cross-origin reads on the client API and inference WebSockets (#18512)

HTTP: on a keyless install (REQUIRE_API_KEY=false) any Authorization, x-api-key or x-goog-api-key header, valid or not, made client-API routes echo the request Origin while serving the request as anonymous. The allow path now relaxes CLIENT_API CORS only for a non-anonymous subject; route-level 401s that refuse a presented key still echo Origin (Vary: Origin, no credentials header) so browser clients can read them (#5242).

WebSocket: browsers do not apply CORS to WebSockets and the /v1/responses, /v1/ws and /api/v1/ws handshakes never read Origin. They now admit no-Origin clients, CORS-allowlisted origins, the gateway's own public origin and handshakes with a valid API key; everything else, null included, gets 403 ws_origin_forbidden. The bridge upgrades only when the route answers originChecked: true. /v1/responses now enforces REQUIRE_API_KEY. The service worker also bypasses the client-API aliases. CORS and PWA guide mirrors refreshed.

Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>

* fix(release): clear the remaining release/v3.8.53 base-reds — namespaced combo lookup, curated imported rows, build-scope ceiling (#18516)

* fix(sse): resolve client-namespaced combos through the cached name lookup

#17304 replaced the exact-name combo lookups in getCombo() with
getCachedComboByName and dropped the getComboByName import, but missed the
third call site in getComboByClientNamespacedName (#16493). Any model id
with a "/" that is not a provider pin or catalog id then threw
"ReferenceError: getComboByName is not defined" inside getComboForModel,
which broke reasoning routing for unknown models and the client-namespace
combo resolution.

Fixes reasoning-routing-decision-guards ("an unknown model with no rules is
also a clean pass-through") and 5 cases of combo-prefixed-name-resolve.

* fix(models): keep sync-imported custom rows off curated-only providers

#18018 made custom models listable on curated-only providers so a model
added through "Add Custom Model" can be routed. Its stated scope is the
operator's own rows ("Discovery behaviour is unchanged ... only the
operator's own rows are kept"), but the three read paths kept every custom
row, including rows whose source is imported/api-sync/auto-sync. On a
provider with no upstream catalog such a row is a stale leftover of a
retired discovery path: #8451 removed exactly those obsolete Z.ai Web ids
(they 404 upstream), and zai-web-models-discovery-7678 pins that.

The provider listing merge, GET /api/providers/[id]/models and /v1/models
now drop discovery-imported custom rows on curated providers through one
helper (isDiscoveryImportedCustomSource); operator rows keep flowing.

zai-web-models-discovery-7678 now also expects the manual row, which
#18018 made listable on purpose. New cases pin the imported-row exclusion
in the listing merge and in /v1/models.

* chore(changelog): drop the duplicate namespaced-combo fragment (#18514 carries it)

The client-namespaced combo lookup fix is the same one-line change as
#18514, which already ships its changelog fragment.

Refs #17219

* chore(quality): raise the build-scope ceiling to 13500 in-scope files

The release branch reached 12267 in-scope .ts/.tsx/.js/.jsx files through
legitimate test growth (tests/ went 7841 -> 8296 files since 10-21), so
check:build-scope failed on every PR although nothing was leaking. A
leaked worktree or vendored checkout adds roughly a full tree (~12k
files), which 13500 still catches.

Refs #17219

* chore(dashboard): sync the CI UI Kit to 0.0.79 and keep tracking the newest release (#18504)

* docs(i18n): refresh the changed ENVIRONMENT sections in 66 locales (#18524)

* feat(antigravity): add Gemini 3.8 Flash tiers and update client fallbacks (#12499)

Co-authored-by: Abhishek Chhetri <abhishekchhetri@example.com>

* feat(oauth): GitHub Copilot capability-driven account integrationClaude/GitHub copilot integration 748ebe (#12833)

* feat(dashboard): size dialogs to 70% of the viewport (#14091)

Co-authored-by: Felipe Almeman <felipe@aireset.com.br>

* feat(opencode): sanitize the OpenCode PR 4145 fingerprint (#14142)

* feat(resilience): recover queued quota-failed sessions (#14981) (#14982)

* feat(providers): wire claude-haiku-5-5 across catalogs, pricing, and fallbacks (#16159)

Co-authored-by: Tuan Dinh <tuan.dinh.truong@sap.com>

* feat(models-health): report whether reasoning_effort none was honored per model (#16253)

* feat(providers): bounded-turn tool-call support for the ChatGPT Web clean-room adapter (#14948)

Co-authored-by: Arash <arash.ashrafi@gmail.com>

* feat(oauth): add Freebuff browser login to the freebuff provider (#15336) (#15343)

* feat(muse-code): consolidate open Muse Code PRs (#15234, #14138, #13634, #14267, #12687) (#15521)

Co-authored-by: mdc2122 <mdc2122@users.noreply.github.com>
Co-authored-by: SIGTERM-015 <SIGTERM-015@users.noreply.github.com>
Co-authored-by: KSonny4 <KSonny4@users.noreply.github.com>
Co-authored-by: caniko <caniko@users.noreply.github.com>
Co-authored-by: Chewji9875 <Chewji9875@users.noreply.github.com>

* feat(dashboard): show which combos use a model on the provider detail page (#16307)

Co-authored-by: Farshad <asadpoor.f@gmail.com>

* feat(pii): GDPR + POPIA PII patterns with validators (#16461)

Co-authored-by: Wayne <wayne@local>

* feat(affinity): optional Redis store for shared session-to-account affinity (#16569)

* feat(oauth): opt-in passive token refresh for Codex replicas (#16577)

* feat: improve adaptive routing and model health monitoring (#16746)

* feat(providers): allow manual vision overrides for synced models (#16794)

* fix(mcp): ignore client _meta scopes for stdio callers (#17112)

* fix(xai): flatten Codex namespace tools for /v1/responses; no account cooldown on 422 shape errors (#17134)

Co-authored-by: özcan Yaman <ozc.yaman@gmail.com>

* perf(provider-stats): bound provider-stats history to a 7-day window and cache the payload (#17227)

* fix(dashboard): decode percent-encoded combo route params for auto/* control center (#17271) (#17272)

* fix(desktop): publish and verify indexed optional runtime packs (#17338)

* refactor(a2a): share agent discovery metadata (#17357)

Co-authored-by: Jan Leon <jan@leoncode.de>

* fix: require reasoning_content presence for DeepSeek and align Grok 4.7 context and effort tiers (#17388)

Co-authored-by: Felipe Fidelix <felipe@fdx.is>

* fix(providers): isolate agy/antigravity hiddenModelGate and clear compat overrides on model reset (#17398) (#17400)

* fix(providers): rotate the deprecated OpenCode Zen mimo-v2.5-free id to v2.6 flash (#17472) (#17788)

Co-authored-by: vincent <webmaster@palmit.com.au>

* feat(sse): follow the published OpenCode endpoint and client headers for keyed requests (#17864)

* fix(tls): follow the newest wreq-js browser profile in the web providers (#17869)

* fix(sse): match the native Antigravity CLI wire image (#17913)

* fix(docker): pin node 26.12.1 / bun 1.4.4 so images reject the compromised eMudhra CAs (security) (#17927)

Co-authored-by: Markus Hartung <mail@hartmark.se>

* feat(db): maintain configurable SQLite planner statistics (#17936)

* fix(translator): ensure all assistant tool_calls are answered in fixMissingToolResponses (#17946) (#17947)

Co-authored-by: Felipe Fidelix <felipe@fdx.is>

* fix(dev): avoid the macOS dev-startup EBADF and keep reasoning out of combo test output (#17955)

* feat(combo): global outputLimitAdvisory setting and a per target context window check (#17958)

* fix(docker): split clientless CLI runtime from Docker tooling (#17972)

Co-authored-by: Sean P. Ford <sean@seanford.com>

* fix(providers): preserve Gemini function tools with native web search (#18020)

* fix(db): preserve utilization bucket timezone (#18083)

* fix(stream): preserve queued chunks on 6 abortStreamFailure sites (#18094)

* fix(sse): refuse non-JSON data lines in stream readiness and content checks (#18095)

* fix(db): don't skip half-applied proxy timing migration 194 (#18096)

* fix(sse): fold camel-case reasoning effort into the canonical field (#18117)

* fix(providers): preserve Codex reasoning controls and expose Muse subscription metadata (#18124)

Co-authored-by: Aldo <github@aldo.pw>

* fix(sse): local backends answer 499 while draining instead of 502 (#18134)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* fix(compression): keep the tail of a truncated lite tool result (#18138)

* fix(zcode): stream native Anthropic responses to clients (#18190)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* fix(quota): recognize international Kimi Coding usage endpoints (#18180) (#18224)

Co-authored-by: Nabi Bukhsh <nabibuksh.baloch01@gmail.com>

* feat(dashboard): assign catalog models and combos to API keys (#14890)

Co-authored-by: Fouad Salkini <fouad@wecansync.com>

* feat(ci): validate protection domains for admission jobs (#16142)

* feat(dashboard): add inline toggle and bulk disable/enable for no-auth providers (#16553)

* feat(cli-tools): add OpenClaude setup guide card (#16844)

Co-authored-by: Nguyen Thanh Dat <ntdat812@gmail.com>

* feat(api): opt-in "expose combos only" setting for /v1/models (#16846)

Co-authored-by: snower <sujian199@gmail.com>

* feat(mcp): add a deep research tool that is off by default (#17317)

* fix(opencode): map custom-provider catalog identities to public prefixes (#17369)

* feat(oauth): import Antigravity Manager account exports (#15746)

* feat(logs): distinguish generation rate from end-to-end throughput (#17847)

* feat(api): CLIProxyAPI management usage compatibility endpoints (#17999)

Co-authored-by: Rahul Bansal <rtrrahulbansal@gmail.com>

* feat(antigravity): add Gemini 4 Argon weekly quota, dual-resolver preflight, and 404 short-circuit (#18026)

* fix(zcode): preserve exact native Coding Plan quota refusals (#18118)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* feat(opencode-plugin-v2): publish one catalog branch with prefix wildcard and hide every combo (#18135)

* fix(combo): test all model health targets without a cumulative deadline (#18231) (#18238)

* fix(codex): distinguish transient capacity 429 from quota cooldown (#18221) (#18239)

* feat(oauth): route Grok Build image, video and audio (#15305)

* feat(codebuddy-cn): sync authenticated live model catalog (#17916)

* feat(providers): add MiniMax M3.1 Flash model (#18110)

* fix(build): select webpack automatically on low-memory builders (#18184) (#18242)

* fix(resilience): keep combos routable after transient credential probe errors (#18037) (#18243)

* fix(claude): keep model-credit 429 cooldown scoped to the affected model (#18058) (#18245)

* feat(providers): add Token Harbor API-key provider (#16315)

Co-authored-by: GitHub Actions <github-actions@github.com>

* feat(cli-tools): add current Pi setup flow (#16381)

Co-authored-by: Arash <arash.ashrafi@gmail.com>

* feat(api): configurable unpriced-usage budget policy + admin notice (#14604) (#14608)

* fix(i18n): escape the Maltese apostrophe in providers.usedInComboTooltip (base-red) (#18545)

* fix(usage): release terminal pending attempts when completion bookkeeping fails (#18217)

Co-authored-by: AiCapitan357 <ai-capitan-357@proton.me>

* feat(providers): add Runcrate (#18061)

* i18n: complete feature-flag definitions for all 66 locales, fix zh-CN/zh-TW mistranslations (#17960)

* feat(i18n): wire hardcoded dashboard strings into message catalogs (#17987)

* feat(providers): add Gisoo (OpenAI-compatible) (#18112)

Co-authored-by: Nirupam Bhowmick <48842933+heydryft@users.noreply.github.com>

* feat(providers): dashboard control for the advertised CLI client version (#14817)

Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>

* feat(ui): add remove error models button in combo test results, default autoHideFailed, and fix db import crash (#14944)

* revert(kea): drop the stale-model badge and preferred-connections kit guards (#18250)

* revert(kea): drop the kit e2e spec filter and settings-toggles realignment (#18247)

* revert(kea): drop the post-migration follow-ups A on the kit (#18202)

* revert(kea): drop the kit chart token palettes (#18144)

* revert(kea): drop the UI kit line from the repository map (#18080)

* revert(kea): drop the Keak CI UI Kit dashboard migration (#17951)

Removes packages/ui-kit and the dashboard/UI-kit surface from the merged
upstream state; the fork keeps its own dashboard. The kit workspace, its
snapshot scripts and the vendored sources are deleted with it.

* revert(dashboard): drop the team-costs/catalog kit port and the leftover kit scripts

c0a7b86272 moved the team costs screens onto @omniroute/ui-kit, which the
fork no longer vendors. Reverting it restores SearchableSelect and the
legacy team components.

Also drops the kit-only updater script and its two tests, and removes the
ui-kit workspace entry from package.json / package-lock.json.

* fix(dashboard): finish the kit removal on the two stragglers

ModelCatalogTable came back from the pre-kit tree (it was still importing
@omniroute/ui-kit table primitives); DiscoveryDegradedNotice swaps the kit
Icon for the Material glyph the rest of the legacy UI uses.

Restores the material-symbols dependency the restored globals.css imports.

* chore(ci): keep only the fork workflows (bun.yml + release.yml)

* docs(env): drop the UI kit upstream token now that the kit is not vendored

* chore(compression): keep the release branch wording in lite.ts

* chore(deps): resync the lockfile after the merge (fontsource, material-symbols, no ui-kit)

* chore(kea): drop the leftover 0.0.66 UI kit changelog fragment

---------

Co-authored-by: Bob.Hou <houminxi@gmail.com>
Co-authored-by: Dizzle <112548150+maxmad64bis@users.noreply.github.com>
Co-authored-by: 量子跃迁 <42333314+starxjys@users.noreply.github.com>
Co-authored-by: Ai Captain 357 <ai-capitan-357@proton.me>
Co-authored-by: Adrián Cancio <49328080+adrian-cancio@users.noreply.github.com>
Co-authored-by: trespassmk <123762858+trespassmk@users.noreply.github.com>
Co-authored-by: Fabio Junior Gruchovski <122614728+fabioKoruja00@users.noreply.github.com>
Co-authored-by: Cristhian Hernandez <ayalachristian555@gmail.com>
Co-authored-by: xc0derx <11428624+xc0derx@users.noreply.github.com>
Co-authored-by: AbdullahPesteli <121692116+AbdullahPesteli@users.noreply.github.com>
Co-authored-by: DeadY2J <jorgelamelas@hotmail.com>
Co-authored-by: Sean Ford <sean@seanford.com>
Co-authored-by: stanley <gstanleytejakusuma@gmail.com>
Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
Co-authored-by: 小妍儿 ✨ <258399167+xiaoyaner0201@users.noreply.github.com>
Co-authored-by: skygunner <skygunner@users.noreply.github.com>
Co-authored-by: vincent <webmaster@palmit.com.au>
Co-authored-by: MumuTW <42820974+MumuTW@users.noreply.github.com>
Co-authored-by: Davy Massoneto <davy.massoneto@yahoo.com>
Co-authored-by: Davy Massoneto <davy.m.massoneto@gmail.com>
Co-authored-by: Wray <i@wray7.top>
Co-authored-by: wray-lee <wray-lee@outlook.com>
Co-authored-by: kenny000666 <kennyhomeautomation@googlemail.com>
Co-authored-by: Safeer Ahmad <asafeer1994@gmail.com>
Co-authored-by: Junior-HJ <sjaradj@ucvvirtual.edu.pe>
Co-authored-by: jbovard2016 <jon.bovard@gmail.com>
Co-authored-by: Kiaro-Sama <106400900+KiaroSama@users.noreply.github.com>
Co-authored-by: KiaroSama <Kiaro.Sama.Dev@gmail.com>
Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>
Co-authored-by: Guan Gui <guiguan@gmail.com>
Co-authored-by: opensource-elearning <159253500+opensource-elearning@users.noreply.github.com>
Co-authored-by: Praveen K Palaniswamy <praveen.palaniswamy@gmail.com>
Co-authored-by: Paulo Holanda <paulorfholanda@gmail.com>
Co-authored-by: insoln <11380274+insoln@users.noreply.github.com>
Co-authored-by: Mr. Nasıl <leidizayn@gmail.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
Co-authored-by: dongsjoa <dongsjoa@Xiaoyaner-Mac-Studio.local>
Co-authored-by: Prince <162042308+PrinceThummar011@users.noreply.github.com>
Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>
Co-authored-by: Erwan Novianto <smserwan@gmail.com>
Co-authored-by: hummern <hummernkloa@gmail.com>
Co-authored-by: turbolego <turbolego@gmail.com>
Co-authored-by: Mayank Jaiswal <mayankjaiswal1707@gmail.com>
Co-authored-by: James Martinez <james-martinez@users.noreply.github.com>
Co-authored-by: Anton Shilin <coder.root@gmail.com>
Co-authored-by: WITALO ROCHA <witalo_rocha@hotmail.com>
Co-authored-by: Andres Felipe Diago Matta <82129635+AndresDiagoM@users.noreply.github.com>
Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>
Co-authored-by: Abhishekchhetri020 <145480099+Abhishekchhetri020@users.noreply.github.com>
Co-authored-by: Abhishek Chhetri <abhishekchhetri@example.com>
Co-authored-by: ScottyAmr <scott.kanowski@gmail.com>
Co-authored-by: Felipe Almeman <4226997+zhiru@users.noreply.github.com>
Co-authored-by: Felipe Almeman <felipe@aireset.com.br>
Co-authored-by: Rafa Martins <146174365+rafacpti23@users.noreply.github.com>
Co-authored-by: Dongwook <dongwook.chan@gmail.com>
Co-authored-by: Tuan Dinh <tuan.dinh.truong@sap.com>
Co-authored-by: arashashrafii <arash.ashrafi@gmail.com>
Co-authored-by: Pranav Deshpande <134182346+PranavD2905@users.noreply.github.com>
Co-authored-by: kalpakprod <beta_virus123@proton.me>
Co-authored-by: mdc2122 <mdc2122@users.noreply.github.com>
Co-authored-by: SIGTERM-015 <SIGTERM-015@users.noreply.github.com>
Co-authored-by: KSonny4 <KSonny4@users.noreply.github.com>
Co-authored-by: caniko <caniko@users.noreply.github.com>
Co-authored-by: Chewji9875 <Chewji9875@users.noreply.github.com>
Co-authored-by: Farshad Asadpour <asadpoor.f@gmail.com>
Co-authored-by: Wayne Fourie <31033564+zerotraceio@users.noreply.github.com>
Co-authored-by: Wayne <wayne@local>
Co-authored-by: Thành Long <102373535+Longvt1164@users.noreply.github.com>
Co-authored-by: özcan Yaman <ozc.yaman@gmail.com>
Co-authored-by: Afonso Dutra Nogueira Filho <afonsoft@gmail.com>
Co-authored-by: Jan Leon <jan@leoncode.de>
Co-authored-by: Felipe Fidelix <309092+fidelix@users.noreply.github.com>
Co-authored-by: Felipe Fidelix <felipe@fdx.is>
Co-authored-by: openclaw-bot <balance.devdart@gmail.com>
Co-authored-by: ahmed shahin <ahmedgo17390@gmail.com>
Co-authored-by: lorenzozane <wyz0707@proton.me>
Co-authored-by: Kevin Lin <levinkin07@gmail.com>
Co-authored-by: Bl0ck <36800583+Bl0ck154@users.noreply.github.com>
Co-authored-by: Aldo <github@aldo.pw>
Co-authored-by: Bezrabotnyi <megamen932@gmail.com>
Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>
Co-authored-by: Nabi Bukhsh <133964972+NabiBukhsh-AI@users.noreply.github.com>
Co-authored-by: Nabi Bukhsh <nabibuksh.baloch01@gmail.com>
Co-authored-by: Fouad Salkini <fouad@wecansync.com>
Co-authored-by: Nguyen Thanh Dat <ntdat812@gmail.com>
Co-authored-by: snower <sujian199@gmail.com>
Co-authored-by: mertcandrks <mertcanbakir34@gmail.com>
Co-authored-by: Rahul Bansal <42.rahulbansal@gmail.com>
Co-authored-by: Rahul Bansal <rtrrahulbansal@gmail.com>
Co-authored-by: MrSiB <a@aq2.ru>
Co-authored-by: Kizuno18 <110933270+Kizuno18@users.noreply.github.com>
Co-authored-by: AStupidBear <luyaocns@gmail.com>
Co-authored-by: Octopus <jellyjellysoo127@gmail.com>
Co-authored-by: GitHub Actions <github-actions@github.com>
Co-authored-by: Nirupam Bhowmick <48842933+heydryft@users.noreply.github.com>
Co-authored-by: NetArz | نِت اَرز <aaramin92@gmail.com>
Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>
Co-authored-by: skymanbj <liubohn69@gmail.com>
DarknessKiller added a commit to DarknessKiller/OmniRoute that referenced this pull request Oct 31, 2026
… Kit (#19)

* test(perplexity-web): use a mapped model in the stream boundary delayed-hook case (#18232)

Use a mapped model in the stream boundary delayed-hook case.

Evidence: focused tests (no test files in diff); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(compression): report RTK's real truncation count and cut on line boundaries (#18139)

Report RTK's real truncation count and cut on line boundaries.

Evidence: focused tests (tests/unit/compression/rtk-smart-truncate.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(responses): keep replayed web search call ids on generic executors (#18127)

Keep replayed web search call ids on generic executors.

Evidence: focused tests (tests/unit/responses-input-sanitizer-websearch-id.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): purge releasable failure entries past held lockouts (#18126)

Purge releasable failure entries past held lockouts.

Evidence: focused tests (tests/unit/account-fallback-lockout-eviction.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): keep explicit thinking type over connection default (#18114)

Keep explicit thinking type over connection default.

Evidence: focused tests (tests/unit/glm-thinking-type-explicit.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(combo): clear stale LKGP pin on quality-rejected 200 (#18113)

Clear stale LKGP pin on quality-rejected 200.

Evidence: focused tests (tests/unit/combo/execute-target-attempt.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(translator): deferred OpenAI→Claude finish replays the pending choice, duplicating the last tool-arg fragment (#18193)

Deferred OpenAI→Claude finish replays the pending choice, duplicating the last tool-arg fragment.

Evidence: focused tests (tests/unit/openai-to-claude-trailing-usage-deferred-finish.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(bootstrap): strip inline comments from unquoted env values (#18116)

Strip inline comments from unquoted env values.

Evidence: focused tests (tests/unit/bootstrap-env-inline-comment.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): enforce UTF-8 byte caps for captured stream chunks (#18187)

Enforce UTF-8 byte caps for captured stream chunks.

Evidence: focused tests (tests/unit/request-logger-stream-byte-cap.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(opencode): scope a retired-model 410 to the model, not the connection (#17827)

Scope a retired-model 410 to the model, not the connection.

Evidence: focused tests (tests/unit/opencode-410-model-scope.test.ts); validated in a combined board (B1) of non-overlapping PRs on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(models): bound retained catalog response caches (#18188)

Bound retained catalog response caches.

Evidence: focused tests (tests/unit/catalog-cache-bounds.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(api): expose provider-wildcard combos in model catalog (#18182)

Expose provider-wildcard combos in model catalog.

Evidence: focused tests (tests/unit/models-catalog-provider-wildcard.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Fixes #18033

* fix(usage): include Kimi Coding monthly quota (#18234)

Include Kimi Coding monthly quota.

Evidence: focused tests (tests/unit/kimi-monthly-membership-quota.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(pool): reclaim dead sessions on acquire instead of returning null (#18115)

Reclaim dead sessions on acquire instead of returning null.

Evidence: focused tests (tests/unit/session-pool-dead-reclaim.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(embeddings): preserve Gemini native token usage (#18244) (#18246)

Preserve Gemini native token usage.

Evidence: focused tests (tests/unit/embeddings-multimodal-7956.test.ts, tests/unit/gemini-embedding-2-multimodal.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Closes #18244.

* fix(combo): apply the global per-target expansion cap when a combo sets none (#18130)

Apply the global per-target expansion cap when a combo sets none.

Evidence: focused tests (tests/unit/combo/connection-aware-expansion.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(translator): keep OpenAI prompt_cache_breakpoint on content parts for openai/openrouter (#18255)

Keep OpenAI prompt_cache_breakpoint on content parts for openai/openrouter.

Evidence: focused tests (tests/unit/translator-openai-prompt-cache-breakpoint-18254.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Closes #18254

* fix(sse): preserve complexity hints in primary auto routing (#18104)

Preserve complexity hints in primary auto routing.

Evidence: focused tests (tests/unit/auto-combo-primary-complexity.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(build): bundle locale catalogs as text in webpack builds (#18183)

Bundle locale catalogs as text in webpack builds.

Evidence: focused tests (tests/unit/build/webpack-locale-messages-source.test.ts); validated in a combined board (B2) of non-overlapping PRs on origin/release/v3.8.53: 110/110 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(compression): let an idle pool worker stop holding the process open (#18136)

Let an idle pool worker stop holding the process open.

Evidence: focused tests (tests/unit/compression/compression-worker-pool-exit.test.ts, tests/unit/compression/compression-worker-pool-jam.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(firefly): avoid false stale detection for non-underscore Forter timestamps (#18099)

Avoid false stale detection for non-underscore Forter timestamps.

Evidence: focused tests (tests/unit/adobe-firefly-browser-login.test.ts, tests/unit/adobe-forter-session-timestamp.test.ts, tests/unit/adobe-forter-timestamp-extraction.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(tls): cancel response bodies when requests are aborted (#18228)

Cancel response bodies when requests are aborted.

Evidence: focused tests (tests/unit/http-backed-chat-response-lifetime.test.ts, tests/unit/tls-client-abort-lifetime.test.ts, tests/unit/tls-proxy-context.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): honor pii-masker opt-out in streaming pipeline (#18121)

Honor pii-masker opt-out in streaming pipeline.

Evidence: focused tests (tests/unit/chatcore-streaming-pipeline.test.ts, tests/unit/streaming-pii-optout-gate.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(nvidia): replace retired Nemotron 3 Super with Nemotron 3.5 Super VL (#17928)

Replace retired Nemotron 3 Super with Nemotron 3.5 Super VL.

Evidence: focused tests (tests/unit/antigravity-bridge-routing.test.ts, tests/unit/catalog-updates-v3x.test.ts, tests/unit/nvidia-eol-catalog.test.ts, tests/unit/nvidia-nim-registry-6108.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(services): harden embedded Bifrost runtime (#17976)

Harden embedded Bifrost runtime.

Evidence: focused tests (tests/unit/authz/route-guard-version-get-exemption.test.ts, tests/unit/route-guard-local-only-sweep.test.ts, tests/unit/services/installers/bifrost.test.ts, tests/unit/services/internal-health-fetch.test.ts, tests/unit/services/service-status-route-guard.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(oauth): accept permission-based Cursor user API keys (#17905)

Accept permission-based Cursor user API keys.

Evidence: focused tests (tests/unit/cursor-agent-image.test.ts, tests/unit/cursor-api-key-auth.test.ts, tests/unit/cursor-api-models-discovery.test.ts, tests/unit/cursor-apikey-provider.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(mcp): validate Origin on /api/mcp/* to block DNS rebinding (#17273)

Validate Origin on /api/mcp/* to block DNS rebinding.

Evidence: focused tests (tests/integration/mcp-origin-host-e2e.test.ts, tests/unit/mcp-origin-validation.test.ts); validated in a combined board (B3) of non-overlapping PRs on origin/release/v3.8.53: 413/419 (the 6 failures: 1 from #18140, ejected; 4 in tests/integration/mcp-origin-host-e2e.test.ts from a Turbopack cache panic in the board worktree — the file passes 4/4 on #17273 alone and paired with every other PR of the board; 1 compression worker-pool timing flake that passes isolated) focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* test(authz): fail when a host-config, process-control or data-export route can be anonymous (#18293)

Fail when a host-config, process-control or data-export route can be anonymous.

Evidence: focused tests (tests/unit/management-capability-routes-protected.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* refactor(api): move the per-request keepalive frame into a helper (#17825) (#18281)

Move the per-request keepalive frame into a helper.

Evidence: focused tests (tests/unit/responses-route-early-keepalive-wiring.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* test(ui): repair the vitest UI base-red on release/v3.8.53 (#18306)

Repair the vitest UI base-red on release/v3.8.53.

Evidence: focused tests (tests/unit/ui/api-key-access-editor.test.tsx); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(sse): type empty or typeless array items in Gemini tool schemas (#18289)

Type empty or typeless array items in Gemini tool schemas.

Evidence: focused tests (tests/unit/gemini-array-items.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(auth): fail closed when the logout revocation cannot be saved (#18323)

Fail closed when the logout revocation cannot be saved.

Evidence: focused tests (tests/unit/dashboard-session-invalidation.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(cursor): harden the HTTP/2 proxy tunnel and fail closed on unresolvable pinned proxies (#18324)

Harden the HTTP/2 proxy tunnel and fail closed on unresolvable pinned proxies.

Evidence: focused tests (tests/unit/cursor-h2-proxy-connect-hardening.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(antigravity): accept the bare gemini-4-argon id and list Gemini 4 Argon on Vertex (#18285)

Accept the bare gemini-4-argon id and list Gemini 4 Argon on Vertex.

Evidence: focused tests (tests/unit/gemini-4-argon-bare-alias-vertex.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* feat(providers): add Kimi K3.1 Pro to the Command Code static catalog (#18292)

Add Kimi K3.1 Pro to the Command Code static catalog.

Evidence: focused tests (tests/unit/command-code-executor.test.ts, tests/unit/command-code-kimi-k3-1-pro-5172.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(api): report an unreachable upstream as 502 in provider model discovery (#18294)

Report an unreachable upstream as 502 in provider model discovery.

Evidence: focused tests (tests/unit/provider-models-upstream-unreachable-4843.test.ts); combined board B4 (9 PRs) on origin/release/v3.8.53: 77/77 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK. tests/unit/ui/api-key-access-editor.test.tsx keeps one inherited failure ('shows the model selection cap inline', also failing on the pure tip).

⚠️ base-red inherited: #17219

* fix(db): revoke a deleted combo's name from API key allowed_combos (#18297)

Revoke a deleted combo's name from API key allowed_combos.

Evidence: focused tests (tests/unit/combo-delete-revokes-key-grants.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* feat(providers): add Kimi K3.1 Pro to OpenCode Go (#18295)

Add Kimi K3.1 Pro to OpenCode Go.

Evidence: focused tests (tests/unit/opencode-go-kimi-k3.1-pro-5147.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* feat(compression): add RTK filter for PHPUnit test output (#18317)

Add RTK filter for PHPUnit test output.

Evidence: focused tests (tests/unit/compression/rtk-phpunit-filter.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* fix(translator): honor explicit client max_tokens on Claude/Gemini/Antigravity -> OpenAI (#18300)

Honor explicit client max_tokens on Claude/Gemini/Antigravity -> OpenAI.

Evidence: focused tests (tests/unit/openai-to-claude-explicit-max-tokens-cap.test.ts, tests/unit/translator-antigravity-to-openai.test.ts, tests/unit/translator-explicit-max-tokens-cap-5180.test.ts, tests/unit/translator-gemini-to-openai.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* fix(api): honor OMNIROUTE_NO_UPDATE_NOTIFIER in the dashboard version check (#18316)

Honor OMNIROUTE_NO_UPDATE_NOTIFIER in the dashboard version check.

Evidence: focused tests (tests/unit/system-version-update-optout.test.ts); combined board B5 (5 PRs) on origin/release/v3.8.53: 63/63 focused tests; ESLint, typecheck:core, check:open-sse-typecheck, API-route typecheck and check-deps clean; file-size OK; changelog integrity OK.

⚠️ base-red inherited: #17219

* fix(docs): refresh the live counts and the design-system palette note on release/v3.8.53 (#18339)

* i18n(ui): translate the cursor-api onboarding description in 38 locales (#18351)

* fix(discovery): show why a model discovery fell back to the built-in catalog (#17342)

* feat(dashboard): account-availability quota overview with per-pool rows and reorderable providers (#17026)

* fix(dashboard): show the configured model and the full account in the Combo Control Center (#17393) (#17774)

Co-authored-by: vincent <webmaster@palmit.com.au>

* refactor(routing): share combo attempt failure facts (#17956)

* fix(claude): forward max reasoning effort on the Responses path for max-capable models (#18064)

Co-authored-by: Davy Massoneto <davy.m.massoneto@gmail.com>

* feat(proxy): accept selector-only subscriptions with no feed URL (#16165)

* fix(translator): bridge Claude Code WebSearch to Codex native web_search (#16365)

Co-authored-by: wray-lee <wray-lee@outlook.com>

* feat(routing): enrich routing events with apiKeyId and stream cost (#14736)

Co-authored-by: Safeer Ahmad <asafeer1994@gmail.com>

* fix(providers): surface failed Codex client-version refreshes instead of swallowing them (#17855)

* feat(api): add per-key Claude Code discovery alias control (#17979)

Co-authored-by: Sean P. Ford <sean@seanford.com>

* docs(readme): hero in the Cheaper Inference UI Kit typography (#18261)

* docs(readme): four above-the-fold diagrams in the UI Kit typography (#18308)

* docs(readme): tier cascade, strategies grid, resilience layers and comparison table in the UI Kit typography (#18309)

* docs(readme): privacy ledger, CLI terminal and compression pipeline in the UI Kit typography (#18310)

* docs(readme): one regenerate command for the twelve README diagrams + design-system docs (#18337)

* docs(i18n): re-sync 6 drifted docs across 66 locales (wave 1027) (#18371)

* fix(i18n): use the canonical zh provider term in the providerStats and discovery keys (#18372)

* feat: add Gemini prompt cache accounting (#12775)

* fix(sse): distinguish generic buffered error frames from identified Responses failures (#18370)

* fix: repair inherited release test reds (SSE bare-error frames, catalog fixtures, Codex fixture) (#17550)

Co-authored-by: KiaroSama <Kiaro.Sama.Dev@gmail.com>

* fix(providers): keep the ChatGPT Web browser launch under local and operator control (#18358)

Validation of chatgpt-web-codex ignored allowLocalSpawn, so a remote management request could make the host launch a browser, and both ChatGPT Web browser providers used a connection's stored chromeExecutablePath as the executable whenever the path existed. Honour allowLocalSpawn before any launch, and let the stored path only select a browser the operator configured (CHROME_PATH / CHATGPT_WEB_*_CHROME_PATH) or a known install location.

Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>

* fix(dashboard): quota UIs fall back to /api/providers and show an auth-required state on 401 (#17262) (#18194)

* deps(security): raise the qs override to ^6.16.1 (#18381)

Raise the qs override to ^6.16.1 (the lock resolves 6.17.0), picking up the upstream fix for qs.stringify with arrayFormat comma throwing an uncaught TypeError. Lockfile-only.

* fix(providers): honour allowLocalSpawn in Auggie validation (#18380)

The Auggie validator took no options and always ran `auggie --version`, so remote-reachable routes that pass allowLocalSpawn=false for non-loopback callers still made the host start the CLI. Return a local-validation-only result for those callers before any spawn; internal and local callers keep the CLI probe.

Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>

* ci: let own-origin PR unit and vitest jobs opt in to the omni-ci slots (USE_VPS_TEST_RUNNER) (#18338)

The hosted pool is the CI bottleneck (org-wide hosted concurrency; PR runs queued for hours). test-unit and test-vitest of own-origin pull requests can now opt in to three dedicated self-hosted omni-ci slots (omniroute-113-3/-4/-8, 12G/16G and 4 CPUs each) through vars.USE_VPS_TEST_RUNNER, default off. Forks, merge_group and push stay hosted, and USE_VPS_RUNNER still never governs a test job; the gap-19 guard pins the new switch.

* docs(i18n): refresh 8 docs in 66 locales and fix the README version-table provider count (#18253)

* fix(i18n): fall back to the next model and re-split when a chunk fails validation (#18422)

* ci(i18n): make docs-mirror drift advisory on pull requests and the merge train (#18420)

* Support custom compatible gateways behind an access proxy (#17136)

* fix(release): drain the deterministic unit and vitest reds of release/v3.8.53 (#18426)

* feat(release): bun-pack — bun-first global installs (build stays on Node) (#12801)

* fix(streams): let a target's declared budget raise the 21-minute stream cap (#18002)

* feat(providers): add Kimi (Moonshot) as a web search provider (#14292)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(deploy): Kubernetes support for k3s and k8s (#12400)

Co-authored-by: Paulo Holanda <paulorfholanda@gmail.com>
Co-authored-by: Paulo Roberto Fernandes Holanda <paulorfholanda@gmail.com>
Co-authored-by: insoln <11380274+insoln@users.noreply.github.com>

* feat(cli-agents): add WhyCodes as a first-class CLI Agent (#14107)

* feat(teams): billing cost centers, soft budgets and dashboard (#10409)

Co-authored-by: Markus Hartung <mail@hartmark.se>
Co-authored-by: dongsjoa <dongsjoa@Xiaoyaner-Mac-Studio.local>

* test(log-export): deflake the child-runner timing tests on loaded runners (#18440)

* feat(logs): add an OTLP/HTTP traces log-export destination (#16664)

* fix(providers): honour allowLocalSpawn in Qoder PAT validation (#18424)

Qoder Personal Access Token validation now honours allowLocalSpawn: for remote callers it returns a "validate locally" result instead of running the local qodercli. Covered by tests/unit/qoder-pat-validation-local-spawn.test.ts (direct call, dispatcher for qoder and the if alias, local control).

(no public reference)

Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>

* feat(i18n): structure-safe Google Translate engine for the docs pipeline + ENVIRONMENT re-sync (#18429)

* chore(ci): keep promptfoo, fumadocs-mdx, @playwright/test and bun out of dependabot groups (#18369)

The development group #17197 cannot land as is: five of its bumps (four packages) break a
contract or need a coordinated migration, and they keep the 21 routine
updates riding along with them red.

- promptfoo: exact pin mirrored by nightly-llm-security.yml and enforced by
  llm-security-nightly-promptfoo-pin.test.ts (0.124.1 is a known-broken
  release, promptfoo/promptfoo#10866).
- fumadocs-mdx >=15.4.7: imports embedSource, which the fumadocs-core on
  this branch does not export; Build fails loading next.config.mjs.
- @playwright/test: must equal the runtime playwright exact pin
  (playwright-runner-args.test.ts); runtime lives in the production group.
- bun / @types/bun: exact pin documented in AGENTS.md and BUILD_WARNINGS.md,
  bumped by hand after byte-identical validation of the Bun scripts.

No other dependabot rule changes.

* fix(providers): announce direct Poolside inference shutdown (#17331)

Announce the direct Poolside inference shutdown (2026-10-31) in the provider notes, FREE_TIERS and the generated provider reference.

Evidence: reconciled with origin/release/v3.8.53 (0 commits behind); poolside-sunset-notice-17318 2/2 and poolside-registry-models-9085 4/4; check:docs-all, ESLint, typecheck:core, file-size and changelog integrity green.

⚠️ base-red inherited: #17219

Fixes #17318

* test: move late top-level imports above the first test() in three unit files (#18439)

* fix(docs): keep the routing-strategy identifiers verbatim in the Bosnian AGENTS.md mirror (#18382)

* fix(sse): replay an empty upstream turn on the direct streaming path (#17280)

* fix(providers): register DeepSeek Flash aliases for vision requests (#17180) (#17243)

* chore(dashboard): sync the vendored CI UI Kit to 0.0.66 (#18434)

packages/ui-kit moves from upstream f0986a6 (0.0.48) to 3b6ba89 (0.0.66) through
scripts/dev/sync-ui-kit.sh; the workspace version and its lockfile entry follow.

The kit now self-hosts Switzer for every role (ci-tokens.css imports ci-fonts.css with
local woff2 files), so src/app/globals.css drops the @fontsource Inter / Instrument Serif /
IBM Plex Mono imports nothing references any more (the packages stay for the README
diagram generator). The bridge and snapshot-gate tests follow the new contract, and
DESIGN_SYSTEM.md describes Switzer.

Validated on the local VPS (.15) before merge. Red CI checks are inherited from the base
(#17219) and touch none of these files.

* test(security): match the codex fallback version without a hand-escaped regex (CodeQL #1187) (#18419)

The refresh-warning assertion uses String.includes instead of a RegExp that escaped only the dots of DEFAULT_CODEX_CLIENT_VERSION (CodeQL js/incomplete-sanitization #1187). Test-only; 9/9.

* ci: add the CodeRabbit review configuration (#18431)

Adds .coderabbit.yaml (validated against the CodeRabbit schema v2): auto review on non-draft PRs to release/vX.Y.Z and main, path filters for translated mirrors, lockfiles and generated files, per-area instructions from the AGENTS.md hard rules, pre-merge checks in warning mode for calibration. Takes effect once the CodeRabbit GitHub App is installed on the organization.

* ci: drop the duplicate unit/vitest fast-path and skip lcov/Codecov on PR coverage (#18336)

Quality Gates no longer runs fast-unit (4 shards of test:unit:ci:shard) and fast-vitest, which duplicated ci.yml test-unit/test-vitest on every PR since #14420 (~62 runner-minutes and 5 hosted jobs per PR); admission policy, check-test-discovery anchor and tests updated. On pull_request the Coverage job skips the lcov reporter and the informational Codecov upload; the 60% gate and summaries are unchanged.

* ci: run the heavy CI lanes in the merge queue, not on every PR push (#18342)

E2E, Electron smoke, Bun SQLite, integration, package artifact, ecosystem and protocol-client lanes run on push, workflow_dispatch, merge_group and the Mergify queue candidate (admission conditions full-code/full-code-e2e), not on every push to an ordinary PR. Merge through the Mergify queue (label queue) or run gh workflow run ci.yml --ref <branch> before a manual merge.

* docs(i18n): refresh 6 drifted docs in 66 locales with the Google engine (#18462)

* feat(discovery): remember the last discovery outcome per connection (#17346)

* fix(sse): report a buffered stream cut before its terminal signal as truncated, not stop (#18460)

* fix(release): bring the open-sse → src boundary back to 774 on release/v3.8.53 (#18467)

Refs #17219

* docs(i18n): re-sync DESIGN_SYSTEM mirrors with the Google engine (66 locales) (#18469)

* docs(ci): record the Team plan, the janitor ceiling of 8 and the hosted-only test lane in RUNNER_BOX (#18456)

Records the 2026-10-28 state of the runner box in docs/ops/RUNNER_BOX.md: Team plan (60 hosted jobs), janitor ceiling 8, five OmniRoute listeners (113-7 also carries omni-build, 113-3/-4/-8 deleted), and the vars.USE_VPS_TEST_RUNNER rule (same-repo pull_request only, off) with the measurement that turned it off. The 66 mirrors and .i18n-state.json come from scripts/i18n/run-translation.mjs (record/replay against a local backend).

* feat(i18n): Google fallback and quota circuit breaker for every translation entry point (#18461)

* fix(docs): sync the migration and provider counts to the live tree (base-red #17219) (#18476)

* feat(providers): extend expiry-first account routing (#16352)

* feat(api): serve Gemini-native /v1beta routes on the API-only port (#16745)

Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>

* feat(dashboard): per-step Test button in the combo create/edit modal (#16748)

Co-authored-by: Erwan Novianto <smserwan@gmail.com>

* feat(dashboard): hide/show models across providers from the Models catalog (#16749)

Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>

* fix(usage): enforce pending-request byte ceiling on all mutation paths (#17282)

Co-authored-by: turbolego <turbolego@gmail.com>

* perf: settings/combo read caches, async fs routes, bounded limiter settings (#17304)

Co-authored-by: Mayank Jaiswal <mayankjaiswal1707@gmail.com>

* fix(providers): align chatplayground with the current web chat API (#17312)

* fix(release): list the three covering tests in stryker tap.testFiles (#18485)

Refs #17219

* fix(release): open-sse typecheck and README diagram counts (377) on release/v3.8.53 (#18472)

Refs #17219

* feat(search): support Exa 3.0 lite pricing and field set (#17394)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(catalog): keep operator-defined custom models on curated providers (#18018)

* fix(sse): preserve harness tool history in Codex app-server (#18105)

Co-authored-by: Anton Shilin <coder.root@gmail.com>

* fix(sse): strip learned-only effort suffix back to the base model (#18131)

* fix(combo): keep durable exhaustion across set retries (#18133)

* fix(antigravity): stop three retry layers from hammering Cloud Code with a refused request (#18140)

Co-authored-by: Wital <witalo_rocha@hotmail.com>

* fix(build): skip the webpack persistent cache in production builds (#18141)

* fix(sse): copy-on-write in the JSON-schema fallbacks and skip non-JSON response_format (#18241)

* fix(i18n): protect inline HTML in the Google engine and guard HTML structure in the output check (#18486)

* ci(i18n): scheduled post-merge mirror refresh (LLM first, Google last resort) (#18489)

* fix(sse): withhold tool calls cut mid-arguments in a truncated buffered stream (#18482)

* feat(search): price Exa extra results and summaries like Exa bills them (#17396)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(usage): bound pending request retention (#17405)

Co-authored-by: Hummern <hummernkloa@gmail.com>

* fix(combo): fail over from a target whose buffered stream was cut before its terminal signal (#18490)

* feat(search): record Tavily advanced search at 2 credits (#17902)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(search): record Linkup deep search at $0.05 (#17903)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(search): record Firecrawl search per block of 10 results (#17904)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(release): clear the 10-28 typecheck, boundary, stryker, route-map and i18n reds on release/v3.8.53 (#18515)

Refs #17219

* fix(i18n): open the LLM circuit after three consecutive failures, not only on quota (#18474)

* fix(dashboard): monospace code text and a non-Latin script fallback after the kit 0.0.66 bump (#18477)

* fix(dashboard): bring the team costs, combo step test and catalog toggle onto the kit components (#18487)

* fix(api): let operators limit the Telegram bot to allowlisted senders (#18475)

A valid Telegram signature (webhook secret_token or Mini App initData) proves an update came from Telegram, not that its sender may use this instance. TELEGRAM_USER_ALLOWLIST_ENABLED=true now serves only the numeric user ids in TELEGRAM_ALLOWED_USER_IDS: unlisted Mini App users get 403 and webhook messages from unlisted senders are acknowledged and dropped. The check uses the sender (message.from.id), so group chats are covered; an empty list serves nobody; misconfiguration is logged once without echoing ids. Off by default.

Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>

* fix(api): stop keyless cross-origin reads on the client API and inference WebSockets (#18512)

HTTP: on a keyless install (REQUIRE_API_KEY=false) any Authorization, x-api-key or x-goog-api-key header, valid or not, made client-API routes echo the request Origin while serving the request as anonymous. The allow path now relaxes CLIENT_API CORS only for a non-anonymous subject; route-level 401s that refuse a presented key still echo Origin (Vary: Origin, no credentials header) so browser clients can read them (#5242).

WebSocket: browsers do not apply CORS to WebSockets and the /v1/responses, /v1/ws and /api/v1/ws handshakes never read Origin. They now admit no-Origin clients, CORS-allowlisted origins, the gateway's own public origin and handshakes with a valid API key; everything else, null included, gets 403 ws_origin_forbidden. The bridge upgrades only when the route answers originChecked: true. /v1/responses now enforces REQUIRE_API_KEY. The service worker also bypasses the client-API aliases. CORS and PWA guide mirrors refreshed.

Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>

* fix(release): clear the remaining release/v3.8.53 base-reds — namespaced combo lookup, curated imported rows, build-scope ceiling (#18516)

* fix(sse): resolve client-namespaced combos through the cached name lookup

#17304 replaced the exact-name combo lookups in getCombo() with
getCachedComboByName and dropped the getComboByName import, but missed the
third call site in getComboByClientNamespacedName (#16493). Any model id
with a "/" that is not a provider pin or catalog id then threw
"ReferenceError: getComboByName is not defined" inside getComboForModel,
which broke reasoning routing for unknown models and the client-namespace
combo resolution.

Fixes reasoning-routing-decision-guards ("an unknown model with no rules is
also a clean pass-through") and 5 cases of combo-prefixed-name-resolve.

* fix(models): keep sync-imported custom rows off curated-only providers

#18018 made custom models listable on curated-only providers so a model
added through "Add Custom Model" can be routed. Its stated scope is the
operator's own rows ("Discovery behaviour is unchanged ... only the
operator's own rows are kept"), but the three read paths kept every custom
row, including rows whose source is imported/api-sync/auto-sync. On a
provider with no upstream catalog such a row is a stale leftover of a
retired discovery path: #8451 removed exactly those obsolete Z.ai Web ids
(they 404 upstream), and zai-web-models-discovery-7678 pins that.

The provider listing merge, GET /api/providers/[id]/models and /v1/models
now drop discovery-imported custom rows on curated providers through one
helper (isDiscoveryImportedCustomSource); operator rows keep flowing.

zai-web-models-discovery-7678 now also expects the manual row, which
#18018 made listable on purpose. New cases pin the imported-row exclusion
in the listing merge and in /v1/models.

* chore(changelog): drop the duplicate namespaced-combo fragment (#18514 carries it)

The client-namespaced combo lookup fix is the same one-line change as
#18514, which already ships its changelog fragment.

Refs #17219

* chore(quality): raise the build-scope ceiling to 13500 in-scope files

The release branch reached 12267 in-scope .ts/.tsx/.js/.jsx files through
legitimate test growth (tests/ went 7841 -> 8296 files since 10-21), so
check:build-scope failed on every PR although nothing was leaking. A
leaked worktree or vendored checkout adds roughly a full tree (~12k
files), which 13500 still catches.

Refs #17219

* chore(dashboard): sync the CI UI Kit to 0.0.79 and keep tracking the newest release (#18504)

* docs(i18n): refresh the changed ENVIRONMENT sections in 66 locales (#18524)

* feat(antigravity): add Gemini 3.8 Flash tiers and update client fallbacks (#12499)

Co-authored-by: Abhishek Chhetri <abhishekchhetri@example.com>

* feat(oauth): GitHub Copilot capability-driven account integrationClaude/GitHub copilot integration 748ebe (#12833)

* feat(dashboard): size dialogs to 70% of the viewport (#14091)

Co-authored-by: Felipe Almeman <felipe@aireset.com.br>

* feat(opencode): sanitize the OpenCode PR 4145 fingerprint (#14142)

* feat(resilience): recover queued quota-failed sessions (#14981) (#14982)

* feat(providers): wire claude-haiku-5-5 across catalogs, pricing, and fallbacks (#16159)

Co-authored-by: Tuan Dinh <tuan.dinh.truong@sap.com>

* feat(models-health): report whether reasoning_effort none was honored per model (#16253)

* feat(providers): bounded-turn tool-call support for the ChatGPT Web clean-room adapter (#14948)

Co-authored-by: Arash <arash.ashrafi@gmail.com>

* feat(oauth): add Freebuff browser login to the freebuff provider (#15336) (#15343)

* feat(muse-code): consolidate open Muse Code PRs (#15234, #14138, #13634, #14267, #12687) (#15521)

Co-authored-by: mdc2122 <mdc2122@users.noreply.github.com>
Co-authored-by: SIGTERM-015 <SIGTERM-015@users.noreply.github.com>
Co-authored-by: KSonny4 <KSonny4@users.noreply.github.com>
Co-authored-by: caniko <caniko@users.noreply.github.com>
Co-authored-by: Chewji9875 <Chewji9875@users.noreply.github.com>

* feat(dashboard): show which combos use a model on the provider detail page (#16307)

Co-authored-by: Farshad <asadpoor.f@gmail.com>

* feat(pii): GDPR + POPIA PII patterns with validators (#16461)

Co-authored-by: Wayne <wayne@local>

* feat(affinity): optional Redis store for shared session-to-account affinity (#16569)

* feat(oauth): opt-in passive token refresh for Codex replicas (#16577)

* feat: improve adaptive routing and model health monitoring (#16746)

* feat(providers): allow manual vision overrides for synced models (#16794)

* fix(mcp): ignore client _meta scopes for stdio callers (#17112)

* fix(xai): flatten Codex namespace tools for /v1/responses; no account cooldown on 422 shape errors (#17134)

Co-authored-by: özcan Yaman <ozc.yaman@gmail.com>

* perf(provider-stats): bound provider-stats history to a 7-day window and cache the payload (#17227)

* fix(dashboard): decode percent-encoded combo route params for auto/* control center (#17271) (#17272)

* fix(desktop): publish and verify indexed optional runtime packs (#17338)

* refactor(a2a): share agent discovery metadata (#17357)

Co-authored-by: Jan Leon <jan@leoncode.de>

* fix: require reasoning_content presence for DeepSeek and align Grok 4.7 context and effort tiers (#17388)

Co-authored-by: Felipe Fidelix <felipe@fdx.is>

* fix(providers): isolate agy/antigravity hiddenModelGate and clear compat overrides on model reset (#17398) (#17400)

* fix(providers): rotate the deprecated OpenCode Zen mimo-v2.5-free id to v2.6 flash (#17472) (#17788)

Co-authored-by: vincent <webmaster@palmit.com.au>

* feat(sse): follow the published OpenCode endpoint and client headers for keyed requests (#17864)

* fix(tls): follow the newest wreq-js browser profile in the web providers (#17869)

* fix(sse): match the native Antigravity CLI wire image (#17913)

* fix(docker): pin node 26.12.1 / bun 1.4.4 so images reject the compromised eMudhra CAs (security) (#17927)

Co-authored-by: Markus Hartung <mail@hartmark.se>

* feat(db): maintain configurable SQLite planner statistics (#17936)

* fix(translator): ensure all assistant tool_calls are answered in fixMissingToolResponses (#17946) (#17947)

Co-authored-by: Felipe Fidelix <felipe@fdx.is>

* fix(dev): avoid the macOS dev-startup EBADF and keep reasoning out of combo test output (#17955)

* feat(combo): global outputLimitAdvisory setting and a per target context window check (#17958)

* fix(docker): split clientless CLI runtime from Docker tooling (#17972)

Co-authored-by: Sean P. Ford <sean@seanford.com>

* fix(providers): preserve Gemini function tools with native web search (#18020)

* fix(db): preserve utilization bucket timezone (#18083)

* fix(stream): preserve queued chunks on 6 abortStreamFailure sites (#18094)

* fix(sse): refuse non-JSON data lines in stream readiness and content checks (#18095)

* fix(db): don't skip half-applied proxy timing migration 194 (#18096)

* fix(sse): fold camel-case reasoning effort into the canonical field (#18117)

* fix(providers): preserve Codex reasoning controls and expose Muse subscription metadata (#18124)

Co-authored-by: Aldo <github@aldo.pw>

* fix(sse): local backends answer 499 while draining instead of 502 (#18134)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* fix(compression): keep the tail of a truncated lite tool result (#18138)

* fix(zcode): stream native Anthropic responses to clients (#18190)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* fix(quota): recognize international Kimi Coding usage endpoints (#18180) (#18224)

Co-authored-by: Nabi Bukhsh <nabibuksh.baloch01@gmail.com>

* feat(dashboard): assign catalog models and combos to API keys (#14890)

Co-authored-by: Fouad Salkini <fouad@wecansync.com>

* feat(ci): validate protection domains for admission jobs (#16142)

* feat(dashboard): add inline toggle and bulk disable/enable for no-auth providers (#16553)

* feat(cli-tools): add OpenClaude setup guide card (#16844)

Co-authored-by: Nguyen Thanh Dat <ntdat812@gmail.com>

* feat(api): opt-in "expose combos only" setting for /v1/models (#16846)

Co-authored-by: snower <sujian199@gmail.com>

* feat(mcp): add a deep research tool that is off by default (#17317)

* fix(opencode): map custom-provider catalog identities to public prefixes (#17369)

* feat(oauth): import Antigravity Manager account exports (#15746)

* feat(logs): distinguish generation rate from end-to-end throughput (#17847)

* feat(api): CLIProxyAPI management usage compatibility endpoints (#17999)

Co-authored-by: Rahul Bansal <rtrrahulbansal@gmail.com>

* feat(antigravity): add Gemini 4 Argon weekly quota, dual-resolver preflight, and 404 short-circuit (#18026)

* fix(zcode): preserve exact native Coding Plan quota refusals (#18118)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* feat(opencode-plugin-v2): publish one catalog branch with prefix wildcard and hide every combo (#18135)

* fix(combo): test all model health targets without a cumulative deadline (#18231) (#18238)

* fix(codex): distinguish transient capacity 429 from quota cooldown (#18221) (#18239)

* feat(oauth): route Grok Build image, video and audio (#15305)

* feat(codebuddy-cn): sync authenticated live model catalog (#17916)

* feat(providers): add MiniMax M3.1 Flash model (#18110)

* fix(build): select webpack automatically on low-memory builders (#18184) (#18242)

* fix(resilience): keep combos routable after transient credential probe errors (#18037) (#18243)

* fix(claude): keep model-credit 429 cooldown scoped to the affected model (#18058) (#18245)

* feat(providers): add Token Harbor API-key provider (#16315)

Co-authored-by: GitHub Actions <github-actions@github.com>

* feat(cli-tools): add current Pi setup flow (#16381)

Co-authored-by: Arash <arash.ashrafi@gmail.com>

* feat(api): configurable unpriced-usage budget policy + admin notice (#14604) (#14608)

* fix(i18n): escape the Maltese apostrophe in providers.usedInComboTooltip (base-red) (#18545)

* fix(usage): release terminal pending attempts when completion bookkeeping fails (#18217)

Co-authored-by: AiCapitan357 <ai-capitan-357@proton.me>

* feat(providers): add Runcrate (#18061)

* i18n: complete feature-flag definitions for all 66 locales, fix zh-CN/zh-TW mistranslations (#17960)

* feat(i18n): wire hardcoded dashboard strings into message catalogs (#17987)

* feat(providers): add Gisoo (OpenAI-compatible) (#18112)

Co-authored-by: Nirupam Bhowmick <48842933+heydryft@users.noreply.github.com>

* feat(providers): dashboard control for the advertised CLI client version (#14817)

Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>

* feat(ui): add remove error models button in combo test results, default autoHideFailed, and fix db import crash (#14944)

* revert(kea): drop the stale-model badge and preferred-connections kit guards (#18250)

* revert(kea): drop the kit e2e spec filter and settings-toggles realignment (#18247)

* revert(kea): drop the post-migration follow-ups A on the kit (#18202)

* revert(kea): drop the kit chart token palettes (#18144)

* revert(kea): drop the UI kit line from the repository map (#18080)

* revert(kea): drop the Keak CI UI Kit dashboard migration (#17951)

Removes packages/ui-kit and the dashboard/UI-kit surface from the merged
upstream state; the fork keeps its own dashboard. The kit workspace, its
snapshot scripts and the vendored sources are deleted with it.

* revert(dashboard): drop the team-costs/catalog kit port and the leftover kit scripts

c0a7b86272 moved the team costs screens onto @omniroute/ui-kit, which the
fork no longer vendors. Reverting it restores SearchableSelect and the
legacy team components.

Also drops the kit-only updater script and its two tests, and removes the
ui-kit workspace entry from package.json / package-lock.json.

* fix(dashboard): finish the kit removal on the two stragglers

ModelCatalogTable came back from the pre-kit tree (it was still importing
@omniroute/ui-kit table primitives); DiscoveryDegradedNotice swaps the kit
Icon for the Material glyph the rest of the legacy UI uses.

Restores the material-symbols dependency the restored globals.css imports.

* chore(ci): keep only the fork workflows (bun.yml + release.yml)

* docs(env): drop the UI kit upstream token now that the kit is not vendored

* chore(compression): keep the release branch wording in lite.ts

* chore(deps): resync the lockfile after the merge (fontsource, material-symbols, no ui-kit)

* chore(kea): drop the leftover 0.0.66 UI kit changelog fragment

* fix(logs): drop the unused catch bindings and the dead ids set in RequestLoggerV2

* feat(core-config): ingest multiple feeds per subscription with per-source isolation (#16439)

* feat(db): prune expired semantic cache rows in bounded batches (#17939)

* feat(compression): let compression combos select output styles (#18107)

* feat(api): authenticate Claude Code to /v1/* with Entra ID SSO (#14665)

Co-authored-by: Benjamin <aronsson.benjamin@gmail.com>

* feat(services): add sing-box supervisor installer and tproxy integration (#12962)

* fix(release): clear the release/v3.8.53 base-reds from the merge campaign (#18625)

* fix(sync): finish the kit-free port of the pulled dashboard surfaces

Drops the material-symbols for the glyphs the legacy shell uses (Pi tool
card, model combo badge), re-adds the optional OAuth-export import button
the merged page now passes to the summary card, widens the CLI catalog
codeBlock schema with the upstream title, and renumbers the stale
215_compression_combos_output_styles copy to upstream's 220 with a
rename-compatibility entry so existing databases reconcile.

---------

Co-authored-by: Bob.Hou <houminxi@gmail.com>
Co-authored-by: Dizzle <112548150+maxmad64bis@users.noreply.github.com>
Co-authored-by: 量子跃迁 <42333314+starxjys@users.noreply.github.com>
Co-authored-by: Ai Captain 357 <ai-capitan-357@proton.me>
Co-authored-by: Adrián Cancio <49328080+adrian-cancio@users.noreply.github.com>
Co-authored-by: trespassmk <123762858+trespassmk@users.noreply.github.com>
Co-authored-by: Fabio Junior Gruchovski <122614728+fabioKoruja00@users.noreply.github.com>
Co-authored-by: Cristhian Hernandez <ayalachristian555@gmail.com>
Co-authored-by: xc0derx <11428624+xc0derx@users.noreply.github.com>
Co-authored-by: AbdullahPesteli <121692116+AbdullahPesteli@users.noreply.github.com>
Co-authored-by: DeadY2J <jorgelamelas@hotmail.com>
Co-authored-by: Sean Ford <sean@seanford.com>
Co-authored-by: stanley <gstanleytejakusuma@gmail.com>
Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
Co-authored-by: 小妍儿 ✨ <258399167+xiaoyaner0201@users.noreply.github.com>
Co-authored-by: skygunner <skygunner@users.noreply.github.com>
Co-authored-by: vincent <webmaster@palmit.com.au>
Co-authored-by: MumuTW <42820974+MumuTW@users.noreply.github.com>
Co-authored-by: Davy Massoneto <davy.massoneto@yahoo.com>
Co-authored-by: Davy Massoneto <davy.m.massoneto@gmail.com>
Co-authored-by: Wray <i@wray7.top>
Co-authored-by: wray-lee <wray-lee@outlook.com>
Co-authored-by: kenny000666 <kennyhomeautomation@googlemail.com>
Co-authored-by: Safeer Ahmad <asafeer1994@gmail.com>
Co-authored-by: Junior-HJ <sjaradj@ucvvirtual.edu.pe>
Co-authored-by: jbovard2016 <jon.bovard@gmail.com>
Co-authored-by: Kiaro-Sama <106400900+KiaroSama@users.noreply.github.com>
Co-authored-by: KiaroSama <Kiaro.Sama.Dev@gmail.com>
Co-authored-by: AiCaptain357 <345568968+AiCaptain357@users.noreply.github.com>
Co-authored-by: Guan Gui <guiguan@gmail.com>
Co-authored-by: opensource-elearning <159253500+opensource-elearning@users.noreply.github.com>
Co-authored-by: Praveen K Palaniswamy <praveen.palaniswamy@gmail.com>
Co-authored-by: Paulo Holanda <paulorfholanda@gmail.com>
Co-authored-by: insoln <11380274+insoln@users.noreply.github.com>
Co-authored-by: Mr. Nasıl <leidizayn@gmail.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
Co-authored-by: dongsjoa <dongsjoa@Xiaoyaner-Mac-Studio.local>
Co-authored-by: Prince <162042308+PrinceThummar011@users.noreply.github.com>
Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>
Co-authored-by: Erwan Novianto <smserwan@gmail.com>
Co-authored-by: hummern <hummernkloa@gmail.com>
Co-authored-by: turbolego <turbolego@gmail.com>
Co-authored-by: Mayank Jaiswal <mayankjaiswal1707@gmail.com>
Co-authored-by: James Martinez <james-martinez@users.noreply.github.com>
Co-authored-by: Anton Shilin <coder.root@gmail.com>
Co-authored-by: WITALO ROCHA <witalo_rocha@hotmail.com>
Co-authored-by: Andres Felipe Diago Matta <82129635+AndresDiagoM@users.noreply.github.com>
Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>
Co-authored-by: Abhishekchhetri020 <145480099+Abhishekchhetri020@users.noreply.github.com>
Co-authored-by: Abhishek Chhetri <abhishekchhetri@example.com>
Co-authored-by: ScottyAmr <scott.kanowski@gmail.com>
Co-authored-by: Felipe Almeman <4226997+zhiru@users.noreply.github.com>
Co-authored-by: Felipe Almeman <felipe@aireset.com.br>
Co-authored-by: Rafa Martins <146174365+rafacpti23@users.noreply.github.com>
Co-authored-by: Dongwook <dongwook.chan@gmail.com>
Co-authored-by: Tuan Dinh <tuan.dinh.truong@sap.com>
Co-authored-by: arashashrafii <arash.ashrafi@gmail.com>
Co-authored-by: Pranav Deshpande <134182346+PranavD2905@users.noreply.github.com>
Co-authored-by: kalpakprod <beta_virus123@proton.me>
Co-authored-by: mdc2122 <mdc2122@users.noreply.github.com>
Co-authored-by: SIGTERM-015 <SIGTERM-015@users.noreply.github.com>
Co-authored-by: KSonny4 <KSonny4@users.noreply.github.com>
Co-authored-by: caniko <caniko@users.noreply.github.com>
Co-authored-by: Chewji9875 <Chewji9875@users.noreply.github.com>
Co-authored-by: Farshad Asadpour <asadpoor.f@gmail.com>
Co-authored-by: Wayne Fourie <31033564+zerotraceio@users.noreply.github.com>
Co-authored-by: Wayne <wayne@local>
Co-authored-by: Thành Long <102373535+Longvt1164@users.noreply.github.com>
Co-authored-by: özcan Yaman <ozc.yaman@gmail.com>
Co-authored-by: Afonso Dutra Nogueira Filho <afonsoft@gmail.com>
Co-authored-by: Jan Leon <jan@leoncode.de>
Co-authored-by: Felipe Fidelix <309092+fidelix@users.noreply.github.com>
Co-authored-by: Felipe Fidelix <felipe@fdx.is>
Co-authored-by: openclaw-bot <balance.devdart@gmail.com>
Co-authored-by: ahmed shahin <ahmedgo17390@gmail.com>
Co-authored-by: lorenzozane <wyz0707@proton.me>
Co-authored-by: Kevin Lin <levinkin07@gmail.com>
Co-authored-by: Bl0ck <36800583+Bl0ck154@users.noreply.github.com>
Co-authored-by: Aldo <github@aldo.pw>
Co-authored-by: Bezrabotnyi <megamen932@gmail.com>
Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>
Co-authored-by: Nabi Bukhsh <133964972+NabiBukhsh-AI@users.noreply.github.com>
Co-authored-by: Nabi Bukhsh <nabibuksh.baloch01@gmail.com>
Co-authored-by: Fouad Salkini <fouad@wecansync.com>
Co-authored-by: Nguyen Thanh Dat <ntdat812@gmail.com>
Co-authored-by: snower <sujian199@gmail.com>
Co-authored-by: mertcandrks <mertcanbakir34@gmail.com>
Co-authored-by: Rahul Bansal <42.rahulbansal@gmail.com>
Co-authored-by: Rahul Bansal <rtrrahulbansal@gmail.com>
Co-authored-by: MrSiB <a@aq2.ru>
Co-authored-by: Kizuno18 <110933270+Kizuno18@users.noreply.github.com>
Co-authored-by: AStupidBear <luyaocns@gmail.com>
Co-authored-by: Octopus <jellyjellysoo127@gmail.com>
Co-authored-by: GitHub Actions <github-actions@github.com>
Co-authored-by: Nirupam Bhowmick <48842933+heydryft@users.noreply.github.com>
Co-authored-by: NetArz | نِت اَرز <aaramin92@gmail.com>
Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>
Co-authored-by: skymanbj <liubohn69@gmail.com>
Co-authored-by: Benjamin Aronsson <aronsson.benjamin@gmail.com>
Co-authored-by: Rouzbeh† <78313022+rqzbeh@users.noreply.github.com>
@diegosouzapw
diegosouzapw deleted the feat/port-pr-3206-api-bridge-v1beta-path branch November 2, 2026 14:13
DarknessKiller added a commit to DarknessKiller/OmniRoute that referenced this pull request Nov 3, 2026
… Kit (#22)

* docs(ci): record the Team plan, the janitor ceiling of 8 and the hosted-only test lane in RUNNER_BOX (#18456)

Records the 2026-10-28 state of the runner box in docs/ops/RUNNER_BOX.md: Team plan (60 hosted jobs), janitor ceiling 8, five OmniRoute listeners (113-7 also carries omni-build, 113-3/-4/-8 deleted), and the vars.USE_VPS_TEST_RUNNER rule (same-repo pull_request only, off) with the measurement that turned it off. The 66 mirrors and .i18n-state.json come from scripts/i18n/run-translation.mjs (record/replay against a local backend).

* feat(i18n): Google fallback and quota circuit breaker for every translation entry point (#18461)

* fix(docs): sync the migration and provider counts to the live tree (base-red #17219) (#18476)

* feat(providers): extend expiry-first account routing (#16352)

* feat(api): serve Gemini-native /v1beta routes on the API-only port (#16745)

Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>

* feat(dashboard): per-step Test button in the combo create/edit modal (#16748)

Co-authored-by: Erwan Novianto <smserwan@gmail.com>

* feat(dashboard): hide/show models across providers from the Models catalog (#16749)

Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>

* fix(usage): enforce pending-request byte ceiling on all mutation paths (#17282)

Co-authored-by: turbolego <turbolego@gmail.com>

* perf: settings/combo read caches, async fs routes, bounded limiter settings (#17304)

Co-authored-by: Mayank Jaiswal <mayankjaiswal1707@gmail.com>

* fix(providers): align chatplayground with the current web chat API (#17312)

* fix(release): list the three covering tests in stryker tap.testFiles (#18485)

Refs #17219

* fix(release): open-sse typecheck and README diagram counts (377) on release/v3.8.53 (#18472)

Refs #17219

* feat(search): support Exa 3.0 lite pricing and field set (#17394)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(catalog): keep operator-defined custom models on curated providers (#18018)

* fix(sse): preserve harness tool history in Codex app-server (#18105)

Co-authored-by: Anton Shilin <coder.root@gmail.com>

* fix(sse): strip learned-only effort suffix back to the base model (#18131)

* fix(combo): keep durable exhaustion across set retries (#18133)

* fix(antigravity): stop three retry layers from hammering Cloud Code with a refused request (#18140)

Co-authored-by: Wital <witalo_rocha@hotmail.com>

* fix(build): skip the webpack persistent cache in production builds (#18141)

* fix(sse): copy-on-write in the JSON-schema fallbacks and skip non-JSON response_format (#18241)

* fix(i18n): protect inline HTML in the Google engine and guard HTML structure in the output check (#18486)

* ci(i18n): scheduled post-merge mirror refresh (LLM first, Google last resort) (#18489)

* fix(sse): withhold tool calls cut mid-arguments in a truncated buffered stream (#18482)

* feat(search): price Exa extra results and summaries like Exa bills them (#17396)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(usage): bound pending request retention (#17405)

Co-authored-by: Hummern <hummernkloa@gmail.com>

* fix(combo): fail over from a target whose buffered stream was cut before its terminal signal (#18490)

* feat(search): record Tavily advanced search at 2 credits (#17902)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(search): record Linkup deep search at $0.05 (#17903)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* feat(search): record Firecrawl search per block of 10 results (#17904)

Co-authored-by: Praveen K Palaniswamy <Praveen.Palaniswamy@gmail.com>

* fix(release): clear the 10-28 typecheck, boundary, stryker, route-map and i18n reds on release/v3.8.53 (#18515)

Refs #17219

* fix(i18n): open the LLM circuit after three consecutive failures, not only on quota (#18474)

* fix(dashboard): monospace code text and a non-Latin script fallback after the kit 0.0.66 bump (#18477)

* fix(dashboard): bring the team costs, combo step test and catalog toggle onto the kit components (#18487)

* fix(api): let operators limit the Telegram bot to allowlisted senders (#18475)

A valid Telegram signature (webhook secret_token or Mini App initData) proves an update came from Telegram, not that its sender may use this instance. TELEGRAM_USER_ALLOWLIST_ENABLED=true now serves only the numeric user ids in TELEGRAM_ALLOWED_USER_IDS: unlisted Mini App users get 403 and webhook messages from unlisted senders are acknowledged and dropped. The check uses the sender (message.from.id), so group chats are covered; an empty list serves nobody; misconfiguration is logged once without echoing ids. Off by default.

Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>

* fix(api): stop keyless cross-origin reads on the client API and inference WebSockets (#18512)

HTTP: on a keyless install (REQUIRE_API_KEY=false) any Authorization, x-api-key or x-goog-api-key header, valid or not, made client-API routes echo the request Origin while serving the request as anonymous. The allow path now relaxes CLIENT_API CORS only for a non-anonymous subject; route-level 401s that refuse a presented key still echo Origin (Vary: Origin, no credentials header) so browser clients can read them (#5242).

WebSocket: browsers do not apply CORS to WebSockets and the /v1/responses, /v1/ws and /api/v1/ws handshakes never read Origin. They now admit no-Origin clients, CORS-allowlisted origins, the gateway's own public origin and handshakes with a valid API key; everything else, null included, gets 403 ws_origin_forbidden. The bridge upgrades only when the route answers originChecked: true. /v1/responses now enforces REQUIRE_API_KEY. The service worker also bypasses the client-API aliases. CORS and PWA guide mirrors refreshed.

Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>

* fix(release): clear the remaining release/v3.8.53 base-reds — namespaced combo lookup, curated imported rows, build-scope ceiling (#18516)

* fix(sse): resolve client-namespaced combos through the cached name lookup

#17304 replaced the exact-name combo lookups in getCombo() with
getCachedComboByName and dropped the getComboByName import, but missed the
third call site in getComboByClientNamespacedName (#16493). Any model id
with a "/" that is not a provider pin or catalog id then threw
"ReferenceError: getComboByName is not defined" inside getComboForModel,
which broke reasoning routing for unknown models and the client-namespace
combo resolution.

Fixes reasoning-routing-decision-guards ("an unknown model with no rules is
also a clean pass-through") and 5 cases of combo-prefixed-name-resolve.

* fix(models): keep sync-imported custom rows off curated-only providers

#18018 made custom models listable on curated-only providers so a model
added through "Add Custom Model" can be routed. Its stated scope is the
operator's own rows ("Discovery behaviour is unchanged ... only the
operator's own rows are kept"), but the three read paths kept every custom
row, including rows whose source is imported/api-sync/auto-sync. On a
provider with no upstream catalog such a row is a stale leftover of a
retired discovery path: #8451 removed exactly those obsolete Z.ai Web ids
(they 404 upstream), and zai-web-models-discovery-7678 pins that.

The provider listing merge, GET /api/providers/[id]/models and /v1/models
now drop discovery-imported custom rows on curated providers through one
helper (isDiscoveryImportedCustomSource); operator rows keep flowing.

zai-web-models-discovery-7678 now also expects the manual row, which
#18018 made listable on purpose. New cases pin the imported-row exclusion
in the listing merge and in /v1/models.

* chore(changelog): drop the duplicate namespaced-combo fragment (#18514 carries it)

The client-namespaced combo lookup fix is the same one-line change as
#18514, which already ships its changelog fragment.

Refs #17219

* chore(quality): raise the build-scope ceiling to 13500 in-scope files

The release branch reached 12267 in-scope .ts/.tsx/.js/.jsx files through
legitimate test growth (tests/ went 7841 -> 8296 files since 10-21), so
check:build-scope failed on every PR although nothing was leaking. A
leaked worktree or vendored checkout adds roughly a full tree (~12k
files), which 13500 still catches.

Refs #17219

* chore(dashboard): sync the CI UI Kit to 0.0.79 and keep tracking the newest release (#18504)

* docs(i18n): refresh the changed ENVIRONMENT sections in 66 locales (#18524)

* feat(antigravity): add Gemini 3.8 Flash tiers and update client fallbacks (#12499)

Co-authored-by: Abhishek Chhetri <abhishekchhetri@example.com>

* feat(oauth): GitHub Copilot capability-driven account integrationClaude/GitHub copilot integration 748ebe (#12833)

* feat(dashboard): size dialogs to 70% of the viewport (#14091)

Co-authored-by: Felipe Almeman <felipe@aireset.com.br>

* feat(opencode): sanitize the OpenCode PR 4145 fingerprint (#14142)

* feat(resilience): recover queued quota-failed sessions (#14981) (#14982)

* feat(providers): wire claude-haiku-5-5 across catalogs, pricing, and fallbacks (#16159)

Co-authored-by: Tuan Dinh <tuan.dinh.truong@sap.com>

* feat(models-health): report whether reasoning_effort none was honored per model (#16253)

* feat(providers): bounded-turn tool-call support for the ChatGPT Web clean-room adapter (#14948)

Co-authored-by: Arash <arash.ashrafi@gmail.com>

* feat(oauth): add Freebuff browser login to the freebuff provider (#15336) (#15343)

* feat(muse-code): consolidate open Muse Code PRs (#15234, #14138, #13634, #14267, #12687) (#15521)

Co-authored-by: mdc2122 <mdc2122@users.noreply.github.com>
Co-authored-by: SIGTERM-015 <SIGTERM-015@users.noreply.github.com>
Co-authored-by: KSonny4 <KSonny4@users.noreply.github.com>
Co-authored-by: caniko <caniko@users.noreply.github.com>
Co-authored-by: Chewji9875 <Chewji9875@users.noreply.github.com>

* feat(dashboard): show which combos use a model on the provider detail page (#16307)

Co-authored-by: Farshad <asadpoor.f@gmail.com>

* feat(pii): GDPR + POPIA PII patterns with validators (#16461)

Co-authored-by: Wayne <wayne@local>

* feat(affinity): optional Redis store for shared session-to-account affinity (#16569)

* feat(oauth): opt-in passive token refresh for Codex replicas (#16577)

* feat: improve adaptive routing and model health monitoring (#16746)

* feat(providers): allow manual vision overrides for synced models (#16794)

* fix(mcp): ignore client _meta scopes for stdio callers (#17112)

* fix(xai): flatten Codex namespace tools for /v1/responses; no account cooldown on 422 shape errors (#17134)

Co-authored-by: özcan Yaman <ozc.yaman@gmail.com>

* perf(provider-stats): bound provider-stats history to a 7-day window and cache the payload (#17227)

* fix(dashboard): decode percent-encoded combo route params for auto/* control center (#17271) (#17272)

* fix(desktop): publish and verify indexed optional runtime packs (#17338)

* refactor(a2a): share agent discovery metadata (#17357)

Co-authored-by: Jan Leon <jan@leoncode.de>

* fix: require reasoning_content presence for DeepSeek and align Grok 4.7 context and effort tiers (#17388)

Co-authored-by: Felipe Fidelix <felipe@fdx.is>

* fix(providers): isolate agy/antigravity hiddenModelGate and clear compat overrides on model reset (#17398) (#17400)

* fix(providers): rotate the deprecated OpenCode Zen mimo-v2.5-free id to v2.6 flash (#17472) (#17788)

Co-authored-by: vincent <webmaster@palmit.com.au>

* feat(sse): follow the published OpenCode endpoint and client headers for keyed requests (#17864)

* fix(tls): follow the newest wreq-js browser profile in the web providers (#17869)

* fix(sse): match the native Antigravity CLI wire image (#17913)

* fix(docker): pin node 26.12.1 / bun 1.4.4 so images reject the compromised eMudhra CAs (security) (#17927)

Co-authored-by: Markus Hartung <mail@hartmark.se>

* feat(db): maintain configurable SQLite planner statistics (#17936)

* fix(translator): ensure all assistant tool_calls are answered in fixMissingToolResponses (#17946) (#17947)

Co-authored-by: Felipe Fidelix <felipe@fdx.is>

* fix(dev): avoid the macOS dev-startup EBADF and keep reasoning out of combo test output (#17955)

* feat(combo): global outputLimitAdvisory setting and a per target context window check (#17958)

* fix(docker): split clientless CLI runtime from Docker tooling (#17972)

Co-authored-by: Sean P. Ford <sean@seanford.com>

* fix(providers): preserve Gemini function tools with native web search (#18020)

* fix(db): preserve utilization bucket timezone (#18083)

* fix(stream): preserve queued chunks on 6 abortStreamFailure sites (#18094)

* fix(sse): refuse non-JSON data lines in stream readiness and content checks (#18095)

* fix(db): don't skip half-applied proxy timing migration 194 (#18096)

* fix(sse): fold camel-case reasoning effort into the canonical field (#18117)

* fix(providers): preserve Codex reasoning controls and expose Muse subscription metadata (#18124)

Co-authored-by: Aldo <github@aldo.pw>

* fix(sse): local backends answer 499 while draining instead of 502 (#18134)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* fix(compression): keep the tail of a truncated lite tool result (#18138)

* fix(zcode): stream native Anthropic responses to clients (#18190)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* fix(quota): recognize international Kimi Coding usage endpoints (#18180) (#18224)

Co-authored-by: Nabi Bukhsh <nabibuksh.baloch01@gmail.com>

* feat(dashboard): assign catalog models and combos to API keys (#14890)

Co-authored-by: Fouad Salkini <fouad@wecansync.com>

* feat(ci): validate protection domains for admission jobs (#16142)

* feat(dashboard): add inline toggle and bulk disable/enable for no-auth providers (#16553)

* feat(cli-tools): add OpenClaude setup guide card (#16844)

Co-authored-by: Nguyen Thanh Dat <ntdat812@gmail.com>

* feat(api): opt-in "expose combos only" setting for /v1/models (#16846)

Co-authored-by: snower <sujian199@gmail.com>

* feat(mcp): add a deep research tool that is off by default (#17317)

* fix(opencode): map custom-provider catalog identities to public prefixes (#17369)

* feat(oauth): import Antigravity Manager account exports (#15746)

* feat(logs): distinguish generation rate from end-to-end throughput (#17847)

* feat(api): CLIProxyAPI management usage compatibility endpoints (#17999)

Co-authored-by: Rahul Bansal <rtrrahulbansal@gmail.com>

* feat(antigravity): add Gemini 4 Argon weekly quota, dual-resolver preflight, and 404 short-circuit (#18026)

* fix(zcode): preserve exact native Coding Plan quota refusals (#18118)

Co-authored-by: roomhackerfrom100 <megamen932@gmai.com>

* feat(opencode-plugin-v2): publish one catalog branch with prefix wildcard and hide every combo (#18135)

* fix(combo): test all model health targets without a cumulative deadline (#18231) (#18238)

* fix(codex): distinguish transient capacity 429 from quota cooldown (#18221) (#18239)

* feat(oauth): route Grok Build image, video and audio (#15305)

* feat(codebuddy-cn): sync authenticated live model catalog (#17916)

* feat(providers): add MiniMax M3.1 Flash model (#18110)

* fix(build): select webpack automatically on low-memory builders (#18184) (#18242)

* fix(resilience): keep combos routable after transient credential probe errors (#18037) (#18243)

* fix(claude): keep model-credit 429 cooldown scoped to the affected model (#18058) (#18245)

* feat(providers): add Token Harbor API-key provider (#16315)

Co-authored-by: GitHub Actions <github-actions@github.com>

* feat(cli-tools): add current Pi setup flow (#16381)

Co-authored-by: Arash <arash.ashrafi@gmail.com>

* feat(api): configurable unpriced-usage budget policy + admin notice (#14604) (#14608)

* fix(i18n): escape the Maltese apostrophe in providers.usedInComboTooltip (base-red) (#18545)

* fix(usage): release terminal pending attempts when completion bookkeeping fails (#18217)

Co-authored-by: AiCapitan357 <ai-capitan-357@proton.me>

* feat(providers): add Runcrate (#18061)

* i18n: complete feature-flag definitions for all 66 locales, fix zh-CN/zh-TW mistranslations (#17960)

* feat(i18n): wire hardcoded dashboard strings into message catalogs (#17987)

* feat(providers): add Gisoo (OpenAI-compatible) (#18112)

Co-authored-by: Nirupam Bhowmick <48842933+heydryft@users.noreply.github.com>

* feat(providers): dashboard control for the advertised CLI client version (#14817)

Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>

* feat(ui): add remove error models button in combo test results, default autoHideFailed, and fix db import crash (#14944)

* feat(core-config): ingest multiple feeds per subscription with per-source isolation (#16439)

* feat(db): prune expired semantic cache rows in bounded batches (#17939)

* feat(compression): let compression combos select output styles (#18107)

* feat(api): authenticate Claude Code to /v1/* with Entra ID SSO (#14665)

Co-authored-by: Benjamin <aronsson.benjamin@gmail.com>

* feat(services): add sing-box supervisor installer and tproxy integration (#12962)

* fix(release): clear the release/v3.8.53 base-reds from the merge campaign (#18625)

* ci: tune CodeRabbit for the open-source rate limit and review noise (#18458)

Tunes CodeRabbit for the open-source rate limit: one review per PR, bot PRs ignored, slop labelling on, less walkthrough noise.

Evidence: focused tests passed on a combined board (no test file, config only); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(network): refuse reserved 240.0.0.0/4 and broadcast in the SSRF guard (#18415)

The SSRF guard refuses the reserved 240.0.0.0/4 block and the broadcast address.

Evidence: focused tests passed on a combined board (private-host-reserved-ranges.test.ts, upstream-proxy-host-spelling.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(api): continue web fetch after Jina balance exhaustion (#18455)

Web fetch continues to the next provider after Jina reports an exhausted balance.

Evidence: focused tests passed on a combined board (web-fetch-quota-fallback.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Fixes #18449

* fix(sse): send budget_tokens with enabled thinking on the GLM Anthropic transport (#18378)

Enabled thinking on the GLM Anthropic transport always carries `budget_tokens`, keeping a client budget and deriving a missing one from the effort tier, clamped to max_tokens.

Evidence: focused tests passed on a combined board (glm-anthropic-thinking-budget-tokens.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): keep chat heartbeats from initializing tool messages (#18468)

Chat Completions startup and periodic heartbeats are emitted without application choices, so LangChain keeps aggregating tool calls and the upstream message identity survives.

Evidence: focused tests passed on a combined board (chat-keepalive-no-choice.test.ts, early-stream-keepalive.test.ts, sse-heartbeat*.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): route the Codex, Muse, Z Code and Entra token fingerprints through the opaque helper (CodeQL #1195 #1199 #1201 #1207) (#18613)

Routes the Codex, Muse, Z Code and Entra token fingerprints through `opaqueTokenFingerprint()`; outputs stay byte-identical.

Evidence: focused tests passed on a combined board (opaque-token-fingerprint.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(deps): raise the @hono/node-server override to ^2.1.3 (#18615)

Raises the `@hono/node-server` override to ^2.1.3, resolving to 2.1.5, for the `serveStatic` double path decoding fix.

Evidence: focused tests passed on a combined board (no test file, dependency override only; check-deps OK); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): keep Claude Code classifier turns out of Memory (#18622)

Claude Code security-classifier turns no longer read from or write to Memory.

Evidence: focused tests passed on a combined board (chatcore-sanitization.test.ts, no-memory-header.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* chore(providers): add opt-in model sync phase timing (#18466)

Adds opt-in `OMNIROUTE_MODEL_SYNC_TIMINGS=1` phase timings for model sync, as evidence for the latency investigation in #18335; normal sync behavior is unchanged.

Evidence: focused tests passed on a combined board (sync-models-phase-timings.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* feat(providers): page through Cloudflare Workers AI model discovery and skip non-chat models (#18321)

Cloudflare Workers AI model discovery pages through every result and skips non-chat models.

Evidence: focused tests passed on a combined board (cloudflare-model-discovery-pagination.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* feat(api): expose per-limit capability provenance via /api/models?withLimits=1 (#18327)

`GET /api/models?withLimits=1` exposes each token limit together with the source that supplied it; the parameter is opt-in and Zod-validated.

Evidence: focused tests passed on a combined board (model-limit-provenance.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(api): decode compressed JSON request bodies at chat admission (#18264)

Chat admission decodes compressed JSON bodies once for every admitted route, with the expanded size capped by the existing hard limit and no zlib error echoed.

Evidence: focused tests passed on a combined board (request-body-content-encoding.test.ts, responses-route-compressed-body.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(sse): preserve reasoning fields through streaming redaction (#18363)

Streaming redaction keeps content, reasoning and tool-argument fields in separate buffers, emits only buffered tails and holds raw credential fragments until a safe boundary.

Evidence: focused tests passed on a combined board (streaming-credential-*.test.ts, streaming-reasoning-fields-17291.test.ts, streaming-redaction-chain-reasoning-17291.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(ci): reject incomplete release workflow audits (#17412)

The Release-Green observer and its report verifier treat a missing or broken workflow scanner as incomplete evidence instead of nonblocking drift.

Evidence: focused tests passed on a combined board (build/release-green-workflow-evidence.test.ts); lint, typecheck:core and check-deps OK; open-sse-typecheck OK; api-typecheck reports only errors in files this batch does not touch, reproduced on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* chore(dashboard): sync the vendored CI UI Kit to 0.0.80 (#18698)

* feat(api): publish readable model display names on /v1/models (#18354)

`/v1/models` publishes readable `display_name` values, shared with the Crush and OpenClaw setup routes.

Evidence: focused tests passed (model-display-name, v1-models-registry-names, cli-tools-model-display-names); lint, typecheck:core, check-deps and open-sse-typecheck OK; api-typecheck reports only the two errors in availabilityRouterFilters.ts and cliTools.ts that reproduce on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Co-authored-by: asterxsk <112053934+asterxsk@users.noreply.github.com>

* fix(translator): keep Chat Completions custom tools when routing to Claude (#18314)

The OpenAI to Claude request translator unwraps Chat Completions custom tools, which were silently dropped because the name was read off the wrapper.

Evidence: focused tests passed (openai-to-claude-custom-tool-4938); lint, typecheck:core, check-deps and open-sse-typecheck OK; api-typecheck reports only the two errors in availabilityRouterFilters.ts and cliTools.ts that reproduce on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Co-authored-by: gebclogic <73856846+gebclogic@users.noreply.github.com>

* fix(dashboard): dispose compression save callbacks on unmount (#17850)

The compression panel disposes its saved-status timer and skips late state updates after unmount.

Evidence: focused test passed (compressionPanelLifecycle); headless Chromium click-through on a throwaway DATA_DIR: toggled a setting, left the page before the timer fired, no page error and the change persisted; lint, typecheck:core, check-deps and open-sse-typecheck OK; api-typecheck reports only the two errors in availabilityRouterFilters.ts and cliTools.ts that reproduce on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* fix(dashboard): validate OAuth URLs and restore shared type contracts (#18457)

The OAuth modal rejects a non-string `authUrl` with a visible error and shared dashboard type contracts are restored.

Evidence: focused test passed (oauth-response-contracts); headless Chromium click-through on a throwaway DATA_DIR: with `authUrl: 123` stubbed on the OAuth routes the modal shows the connection-failed state and offers retry; lint, typecheck:core, check-deps and open-sse-typecheck OK; api-typecheck reports only the two errors in availabilityRouterFilters.ts and cliTools.ts that reproduce on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* feat(dashboard): animate the analytics overview counters on change (#18340)

The analytics overview counters animate when their value changes.

Evidence: focused test passed (animated-number); headless Chromium click-through on a throwaway DATA_DIR: with a stubbed summary the Total Tokens card went 1.0K, 2.4M, 5.0M after a range change; lint, typecheck:core, check-deps and open-sse-typecheck OK; api-typecheck reports only the two errors in availabilityRouterFilters.ts and cliTools.ts that reproduce on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Co-authored-by: F0Rextasy <99847357+F0Rextasy@users.noreply.github.com>

* fix(providers): preserve existing prefixes without active built-ins (#17339)

An existing compatible node keeps its reserved prefix while the live built-in has no active connection; collisions surface as a derived `prefix_shadowed` diagnostic.

Evidence: focused tests passed (provider-prefix-grandfather-17278, custom-provider-prefix-shadowing-11943, provider-connection-status, image-compat-node-alias-shadow); headless Chromium click-through on a throwaway DATA_DIR: the connection row rendered a stubbed diagnostic and a real connection reported none; lint, typecheck:core, check-deps and open-sse-typecheck OK; api-typecheck reports only the two errors in availabilityRouterFilters.ts and cliTools.ts that reproduce on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

* feat(combos): export/import combos as a standalone, secret-free JSON file (#16747)

Combos export and import as a standalone JSON file without credentials, with merge and replace modes.

Evidence: focused tests passed (combos-export-import, combo-header-actions-import); headless Chromium click-through on a throwaway DATA_DIR: exported a combo with no secret-like key, rejected an invalid file, merged without duplicating a name, and replace left only the file's combos; lint, typecheck:core, check-deps and open-sse-typecheck OK; api-typecheck reports only the two errors in availabilityRouterFilters.ts and cliTools.ts that reproduce on the pure tip; file-size OK; changelog integrity OK against origin/release/v3.8.53.

⚠️ base-red inherited: #17219

Co-authored-by: Alvian Rahman Hanif <alvian.hanif@pasarpolis.com>

* fix(release): clear the remaining base-reds on release/v3.8.53 (docs counts, SSO entry guard, API diagnostics, vuln ratchet) (#18658)

Clears the remaining base-reds tracked in #17219 except the Release-Green package ceiling (#18693).

- docs counts and mirrors (providers, migrations), generated skill sync
- SSO script direct-run guard, API route typecheck fixes, catalog schema
- provider asset provenance, node-forge vulnerability ratchet, mutation mapping
- model sync: env documentation and an explicit audit sink for the error-helper gate
- reload-timer isolation in two dashboard tests

Refs #17219

* fix(release): raise the Release-Green package ceiling and clear three guards (#18693)

- Release-Green package lane ceiling goes from 20 to 40 min: next build was killed at 20 min on an idle runner on every scheduled run
- dashboard-kit-sweep: mark the hidden combo import file input as a kit exception (#16747)
- hard-session-lease-bypass-inventory: classify the combo import connection read as class C (#16747)
- deprecated-provider-banner-13067: bring providers/page.tsx back to its 1989-line freeze after #17278, without changing the pin

Refs #17219

* feat(resilience): per-provider rate-limit retry delay override (#16741)

Adds a per-provider override for the rate-limit retry delay, with a dashboard selector on the provider page and documentation in the resilience guide.

Port of upstream decolua/9router #2895 by @MuhammadUsamaMX.

* fix(thinking): resolve "latest assistant message cannot be modified" 400s — fabricated placeholders + cross-org signature replay (#17324) (#18102)

Fixes the Anthropic 400 "thinking blocks in the latest assistant message cannot be modified" on multi-turn conversations.

- Stop fabricating redacted_thinking on adaptive turns; the placeholder stays only for manual extended thinking
- Bind signed-thinking continuity to the serving connection
- One-shot recovery for the latest assistant message, from #17344, gated on thinking.type so manual extended thinking stays safe
- THINKING_SIGNATURE diagnostics event

Refs #17324

Co-authored-by: Nick Carter <nick@nickcarter.dev>

* test(cli): resolve repro-9156 test paths with fileURLToPath so they work on Windows (#18646)

Resolve repro-9156 test paths with fileURLToPath so they work on Windows.

Evidence: focused tests on the combined board 62/62; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53.

* test(rate-limit): close the SQLite handle before removing the learned-cap temp dir (#18647)

Close the SQLite handle before removing the learned-cap temp dir.

Evidence: focused tests on the combined board 62/62; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53.

* test(cli): isolate APPDATA in cli-tray test so Windows never sees the real Startup folder (#18645)

Isolate APPDATA in cli-tray test so Windows never sees the real Startup folder.

Evidence: focused tests on the combined board 62/62; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53.

* docs(resilience): document saved-settings precedence over resilience env toggles (#18608) (#18617)

Document saved-settings precedence over resilience env toggles.

Evidence: focused tests on the combined board 62/62; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53.

Closes #18608

* fix(providers): add prompt-cache breakpoints for the Anthropic API-key provider (#18532)

Add prompt-cache breakpoints for the Anthropic API-key provider.

Evidence: focused tests on the combined board 62/62; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53.

Closes #18531

* fix(search): keep every Exa highlight in provider_raw (#18109) (#18282)

Keep every Exa highlight in provider_raw.

Evidence: focused tests on the combined board 62/62; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53.

* fix(release): import the numeric helpers from the engine, not the src re-export (boundary 778 → 768) (#18627)

Import the numeric helpers from the engine, not the src re-export (boundary 778 → 768).

Evidence: focused tests on the combined board 62/62; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53.

* fix(cloud-agent): keep Jules creation timestamps consistent (#18681)

Keep Jules creation timestamps consistent.

Evidence: focused tests on the combined board 62/62; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53.

* fix(build): use name-only install-script approvals for npm 12 (#18690)

Use name-only install-script approvals for npm 12.

Evidence: focused tests on the combined board 62/62; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53.

* fix(usage): share one spend batch writer per process so graceful shutdown flushes it (#18680)

Share one spend batch writer per process so graceful shutdown flushes it.

Evidence: focused tests on the combined board 62/62; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53.

Closes #18678.

* chore(pricing): drop six stale zero-priced NVIDIA models (#18500) (#18502)

Drop six stale zero-priced NVIDIA models.

Evidence: focused tests on the combined board 57/58 with one catalog_build_timeout 503 under host load, covered below; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53. tests/unit/codex-account-catalog-routing.test.ts passed 16/16 on isolated rerun with CATALOG_BUILD_TIMEOUT_MS=300000.

Closes #18500.

* fix(sse): only pin thinking temperature when a sampling param is present (#18636) (#18639)

Only pin thinking temperature when a sampling param is present.

Evidence: focused tests on the combined board 57/58 with one catalog_build_timeout 503 under host load, covered below; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53. tests/unit/codex-account-catalog-routing.test.ts passed 16/16 on isolated rerun with CATALOG_BUILD_TIMEOUT_MS=300000.

Fixes #18636
Closes #18636.

* fix(sse): treat Leonardo and Ideogram image models as image-only in model tests and chat (#18683)

Treat Leonardo and Ideogram image models as image-only in model tests and chat.

Evidence: focused tests on the combined board 57/58 with one catalog_build_timeout 503 under host load, covered below; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53. tests/unit/codex-account-catalog-routing.test.ts passed 16/16 on isolated rerun with CATALOG_BUILD_TIMEOUT_MS=300000.

Closes #18682.

* docs(cost): document four-layer pricing precedence and models.dev sync (#18498) (#18501)

Document four-layer pricing precedence and models.dev sync.

Evidence: focused tests on the combined board 57/58 with one catalog_build_timeout 503 under host load, covered below; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53. tests/unit/codex-account-catalog-routing.test.ts passed 16/16 on isolated rerun with CATALOG_BUILD_TIMEOUT_MS=300000.

Closes #18498.

* fix(sse): persist terminal account failures during combo fallback (#18649)

Persist terminal account failures during combo fallback.

Evidence: focused tests on the combined board 57/58 with one catalog_build_timeout 503 under host load, covered below; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53. tests/unit/codex-account-catalog-routing.test.ts passed 16/16 on isolated rerun with CATALOG_BUILD_TIMEOUT_MS=300000.

Fixes #18633
Closes #18633.

* fix(antigravity): restore saved Argon cooldowns after restart (#18663)

Restore saved Argon cooldowns after restart.

Evidence: focused tests on the combined board 57/58 with one catalog_build_timeout 503 under host load, covered below; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53. tests/unit/codex-account-catalog-routing.test.ts passed 16/16 on isolated rerun with CATALOG_BUILD_TIMEOUT_MS=300000.

* test(sse): cover advertised Claude effort ids against the authoritative catalog (#18611)

Cover advertised Claude effort ids against the authoritative catalog.

Evidence: focused tests on the combined board 57/58 with one catalog_build_timeout 503 under host load, covered below; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53. tests/unit/codex-account-catalog-routing.test.ts passed 16/16 on isolated rerun with CATALOG_BUILD_TIMEOUT_MS=300000.

* fix(sse): set X-Accel-Buffering no on self-built SSE responses that bypass the central header path (#18446)

Set X-Accel-Buffering no on self-built SSE responses that bypass the central header path.

Evidence: focused tests on the combined board 57/58 with one catalog_build_timeout 503 under host load, covered below; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53. tests/unit/codex-account-catalog-routing.test.ts passed 16/16 on isolated rerun with CATALOG_BUILD_TIMEOUT_MS=300000.

* fix(providers): keep Codex accounts eligible for models no inventory lists (#18367)

Keep Codex accounts eligible for models no inventory lists.

Evidence: focused tests on the combined board 57/58 with one catalog_build_timeout 503 under host load, covered below; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53. tests/unit/codex-account-catalog-routing.test.ts passed 16/16 on isolated rerun with CATALOG_BUILD_TIMEOUT_MS=300000.

Closes #18311

* fix(ws): enforce REQUIRE_API_KEY at the /v1/ws bridge handshake (#18540)

Enforce REQUIRE_API_KEY at the /v1/ws bridge handshake.

Evidence: focused tests on the combined board 57/58 with one catalog_build_timeout 503 under host load, covered below; file-size, changelog integrity, check-deps, lint, typecheck:core, open-sse-typecheck and api-typecheck OK against origin/release/v3.8.53. tests/unit/codex-account-catalog-routing.test.ts passed 16/16 on isolated rerun with CATALOG_BUILD_TIMEOUT_MS=300000.

* fix(test): stabilize UI Vitest teardown and provider-stats tests (#18525)

Stabilizes UI Vitest suites that failed intermittently on unrelated pull requests.

- Studio smoke tests unmount each React root inside act() before removing its container
- OmniGlyph cancels the saved-status timer on the next save and on unmount, and ignores a late PUT completion
- Provider Stats keeps a dismissed error-only alert closed across background polling; an explicit refresh reopens it
- The Provider Stats test uses a stable translator, as next-intl does in the app
- Burn-rate chart test waits on real content instead of fixed ticks

* fix(sse): strip GHE Copilot URL slashes in linear time (CodeQL #1204 #1200) (#18614)

gheUrl was trimmed with /\/+$/, which retries from every slash and goes quadratic on a long slash run that does not reach the end of the string (13 s of CPU on one 100,000-slash value). It now uses the linear stripTrailingSlashes() helper; ordinary URLs resolve the same. The Codex recovery test matches the token host on the parsed URL instead of a substring.

* fix(claude): never replay the hardcoded redacted_thinking placeholder (#18036)

Stops sending DEFAULT_THINKING_CLAUDE_SIGNATURE to Anthropic. The constant is a real encrypted thought from an unrelated session, and Claude decrypts it as its own reasoning, which derails long agent sessions.

- Genuine signed thinking and redacted_thinking blocks are kept verbatim on every turn; unsigned blocks and any block equal to the placeholder are dropped
- Nothing is injected on a store miss or during recovery; manual thinking is disabled for the request when the final tool_use turn has no thinking block
- Signature 400 recovery now covers Vertex and any model whose targetFormat is claude
- Replaces the manual-mode placeholder kept by #18102, whose modified-error recovery and connection binding stay

Live coverage: the author reports 0 blobs and 200s on a self-hosted 3.8.52; manual mode has not been verified live by the maintainers.

* deps: bump follow-redirects from 1.16.1 to 1.16.2 (#18654)

Bumps the transitive follow-redirects from 1.16.1 to 1.16.2 in package-lock.json (Dependabot alert #370, high): cross-realm sensitiveHeaders arrays were discarded and custom credentials could survive a redirect.

* feat(db): persist queue wait (start to first upstream dispatch) on ca… (#18402)

Persists the queue wait (start to first upstream dispatch) on call-log rows, as a nullable `queue_wait_ms` column. No change on the request path.

Maintainer rework: migration renumbered to the next free slot (223); column reconciliation in `schemaColumns.ts`; DB round-trip and chat-path tests; migration count synced in AGENTS.md, llm.txt, README.md and mirrors, digits only, checked by script.

Evidence: the lineage test fails with `no such column` against the tip's `schemaColumns.ts`. Gate / CI, Gate / Quality and Merge integrity green on this head.

* feat(render): add 180s self-pinger to keep the free web service awake (#18656)

Adds an optional self-pinger for the Render free tier. It stays inert unless a URL is configured: no timer, no request, no log.

Maintainer rework: config and pinger moved to `scripts/build/runtime-env.mjs` (already shipped in the standalone bundle); `SELF_PING_PATH` can no longer replace the host; logs only on status changes; env vars documented in `.env.example` and ENVIRONMENT.md; 24 tests.

Evidence: removing the path guard fails 3 tests. Gate / CI, Gate / Quality and Merge integrity green on this head. Not exercised on a real Render service.

* test(compression): verify unchanged-history prefix reuse (#18304)

Adds regression coverage for live-zone prefix reuse, including the fail-open case when `instructions` change, for both `messages` and `input`. Test-only.

Maintainer rework: added the `instructions` cases; moved the changelog fragment to maintenance.

Evidence: removing `instructions` from `STABLE_PREFIX_FIELDS` fails 3 tests. Gate / CI, Gate / Quality and Merge integrity green on this head.

* chore(security): accept the minimatch and glob CVEs in the npm bundled in the image (#18766)

Accepts CVE-2026-118764 (minimatch 10.2.5, fixed in 11.0.1) and CVE-2026-118773 (glob 13.0.6, fixed in 14.0.2), both medium, in the npm bundled in the image. npm 12.2.1 still declares the vulnerable lines, and an overlay would cross majors outside its ranges. OmniRoute calls npm with fixed subcommands and validated versions, so request input does not reach npm as a glob. Tracking and revisit date (2026-12-02): #18765.

* test(ui): stop api-key-redis-auth-cache timing out on a loaded host (#18762)

* refactor(dashboard): use the kit Alert dismissible prop for permanent notices (#18764)

* test(mutation): register the credit-exhaustion test in the Stryker tap list (#18771)

#18649 added a unit test covering two mutated modules without listing it, so check:mutation-test-coverage failed on release/v3.8.53 and on every open PR against it.

* ci(dashboard): warn and track it when the UI Kit watch can't read upstream (#18759)

* fix(i18n): open the mirror refresh PR with the locales that translated (#18539)

Part of #18538. A partial translation run now opens the refresh PR with the units that translated, and failed units stay untouched. Socket resets are retried by the Google engine.

* docs(i18n): re-sync the 25 documents that drifted during the week of 2026-10-26 (66 locales; Kimi then Google fallback, references restored) (#18789)

* fix(ci): run main-green's suites on hosted runners (#18776)

Refs #17267

* fix(ci): raise the Release-Green package lane ceiling to 60 min (#18794)

* fix(ui): paginate combo inventory (#17985)

Co-authored-by: Sean P. Ford <sean@seanford.com>

* fix(compression): estimate automatic-prefix cache eligibility (#17114)

* fix: collapse stacked provider-node model prefixes (#17334)

* fix(api): preserve search-provider chat rejection responses (#17953)

* fix(gemini): preserve cached and reasoning tokens in buffered SSE usage metadata (#18100)

* feat(api): System One decisions as a model kind — POST /v1/systemone + /v1/decisions (#13987) (#17994)

* feat(combo): add agentic-stall response classifier (#13954)

Co-authored-by: Patryk Kopycinski <patryk.kopycinski@elastic.co>

* feat(providers): improve Antigravity and Cursor request handling and resilience (#13125)

Co-authored-by: Tuan Dinh <tuan.dinh.truong@sap.com>

* fix(docs): serve translated /docs pages for the selected locale (#18768)

* feat(dashboard): self-host Vazirmatn for Arabic-script RTL locales (#18355)

* feat(resilience): payload-aware anti-avalanche failover guard (#15775)

* docs(i18n): re-record target_hash for the 3 MCP-SERVER mirrors edited without a re-hash (release prep) (#18807)

* test(combo): port the #17945 cooldown-expansion matrix with credit to @skygunner (#18811)

Co-authored-by: skygunner <84759+skygunner@users.noreply.github.com>

* docs(release): reconcile v3.8.53 — CHANGELOG, contributor credit and README numbers (#18816)

* docs(i18n): re-sync ENVIRONMENT and 7 stale documents after the 2026-11-02 merges (structure-safe engine) (#18815)

* chore(dashboard): sync the vendored CI UI Kit to 0.0.84 (#18812)

* docs(readme): draw the README diagrams in Switzer as vector outlines (#18767)

* docs(i18n): re-translate the README mirrors after the week's README changes (66 locales) (#18817)

* docs(i18n): retouch the locales the structure-safe engine could not restore (9 documents, 36 mirrors) (#18821)

* docs: sync AGENTS.md counts with source (db + services) (#17309)

Co-authored-by: Mayank Jaiswal <mayankjaiswal1707@gmail.com>

* fix(ci): free hosted runner disk before the unit shards (#18808)

Hosted Unit Tests shards ran out of disk while writing raw V8 coverage and died with no test summary. Free preinstalled toolchains first, on hosted runners only.

* docs(i18n): re-sync the API_REFERENCE mirrors after the 2026-10/11 API changes (66 locales) (#18822)

* docs(i18n): re-sync QUALITY_GATES and DESIGN_SYSTEM mirrors after the 2026-11-03 source changes (#18824)

* docs: add the creator credit (KEA-6307) and courtesy credit for #17183 (#18843)

* fix(egress): record the observed egress address of each address family (#17326)

Merged as part of the v3.8.53 fix sweep (author @maxmad64bis).

Co-authored-by: Dizzle <112548150+maxmad64bis@users.noreply.github.com>
Co-authored-by: # <docs/i18n/am/README.md>
Co-authored-by: # <docs/i18n/ar/README.md>
Co-authored-by: # <docs/i18n/az/README.md>
Co-authored-by: # <docs/i18n/bg/README.md>
Co-authored-by: # <docs/i18n/bn/README.md>
Co-authored-by: # <docs/i18n/bs/README.md>
Co-authored-by: # <docs/i18n/cs/README.md>
Co-authored-by: # <docs/i18n/da/README.md>
Co-authored-by: # <docs/i18n/de/README.md>
Co-authored-by: # <docs/i18n/el/README.md>
Co-authored-by: # <docs/i18n/es/README.md>
Co-authored-by: # <docs/i18n/et/README.md>
Co-authored-by: # <docs/i18n/fa/README.md>
Co-authored-by: # <docs/i18n/fi/README.md>
Co-authored-by: # <docs/i18n/fr/README.md>
Co-authored-by: # <docs/i18n/ga/README.md>
Co-authored-by: # <docs/i18n/gu/README.md>
Co-authored-by: # <docs/i18n/ha/README.md>
Co-authored-by: # <docs/i18n/he/README.md>
Co-authored-by: # <docs/i18n/hi/README.md>
Co-authored-by: # <docs/i18n/hr/README.md>
Co-authored-by: # <docs/i18n/hu/README.md>
Co-authored-by: # <docs/i18n/hy/README.md>
Co-authored-by: # <docs/i18n/id/README.md>
Co-authored-by: # <docs/i18n/ig/README.md>
Co-authored-by: # <docs/i18n/ja/README.md>
Co-authored-by: # <docs/i18n/ka/README.md>
Co-authored-by: # <docs/i18n/km/README.md>
Co-authored-by: # <docs/i18n/kn/README.md>
Co-authored-by: # <docs/i18n/ko/README.md>
Co-authored-by: # <docs/i18n/lt/README.md>
Co-authored-by: # <docs/i18n/lv/README.md>
Co-authored-by: # <docs/i18n/ml/README.md>
Co-authored-by: # <docs/i18n/mr/README.md>
Co-authored-by: # <docs/i18n/ms/README.md>
Co-authored-by: # <docs/i18n/mt/README.md>
Co-authored-by: # <docs/i18n/my/README.md>
Co-authored-by: # <docs/i18n/ne/README.md>
Co-authored-by: # <docs/i18n/nl/README.md>
Co-authored-by: # <docs/i18n/no/README.md>
Co-authored-by: # <docs/i18n/or/README.md>
Co-authored-by: # <docs/i18n/pa/README.md>
Co-authored-by: # <docs/i18n/phi/README.md>
Co-authored-by: # <docs/i18n/pl/README.md>
Co-authored-by: # <docs/i18n/pt-BR/README.md>
Co-authored-by: # <docs/i18n/pt/README.md>
Co-authored-by: # <docs/i18n/ro/README.md>
Co-authored-by: # <docs/i18n/ru/README.md>
Co-authored-by: # <docs/i18n/si/README.md>
Co-authored-by: # <docs/i18n/sk/README.md>
Co-authored-by: # <docs/i18n/sl/README.md>
Co-authored-by: # <docs/i18n/sr/README.md>
Co-authored-by: # <docs/i18n/sv/README.md>
Co-authored-by: # <docs/i18n/sw/README.md>
Co-authored-by: # <docs/i18n/ta/README.md>
Co-authored-by: # <docs/i18n/te/README.md>
Co-authored-by: # <docs/i18n/th/README.md>
Co-authored-by: # <docs/i18n/tr/README.md>
Co-authored-by: # <docs/i18n/uk-UA/README.md>
Co-authored-by: # <docs/i18n/ur/README.md>
Co-authored-by: # <docs/i18n/uz/README.md>
Co-authored-by: # <docs/i18n/vi/README.md>
Co-authored-by: # <docs/i18n/yo/README.md>
Co-authored-by: # <docs/i18n/zh-CN/README.md>
Co-authored-by: # <docs/i18n/zh-TW/README.md>

* fix(auth): audit non-inference API-key touches (#17982)

Merged as part of the v3.8.53 fix sweep (author @seanford).

Co-authored-by: Sean P. Ford <sean@seanford.com>

* fix(usage): preserve pending byte accounting across module reloads (#18267)

Merged as part of the v3.8.53 fix sweep (author @AiCaptain357).

Co-authored-by: AiCapitan357 <ai-capitan-357@proton.me>

* fix(compression): honor safe configured downgrade steps (#18279)

Merged as part of the v3.8.53 fix sweep (author @trespassmk).

Co-authored-by: trespassmk <avtogram@gmail.com>

* fix(combo): report the fallback rate as a share of requests (#18284)

Merged as part of the v3.8.53 fix sweep (author @HouMinXi).

Co-authored-by: Minxi Hou <houminxi@gmail.com>

* fix(api): return /v1/messages 401s in Anthropic's error envelope (#18299)

Merged as part of the v3.8.53 fix sweep (author @diegosouzapw).

Co-authored-by: omar-nahhas <omar@innovativerealities.com>

* fix(providers): a provider safety refusal is not an account ban (#18307)

Merged as part of the v3.8.53 fix sweep (author @aldoeliacim).

Co-authored-by: aldoeliacim <github@aldo.pw>

* fix(dashboard): list zed-hosted live models in the combo model picker (#18315)

Merged as part of the v3.8.53 fix sweep (author @diegosouzapw).

Co-authored-by: Haidar Muhammad Yasin <haidarmy1@gmail.com>

* fix(combo): report authentication_rejected when every target fails auth (#18366)

Merged as part of the v3.8.53 fix sweep (author @HouMinXi).

Co-authored-by: Bob.Hou <houminxi@gmail.com>

* fix(combo): fall back from protected priority on structured context overflow (#18368)

Merged as part of the v3.8.53 fix sweep (author @RaviTharuma).

Co-authored-by: Ravi Tharuma <RaviTharuma@users.noreply.github.com>

* fix(resilience): accept globalConcurrentRequests and budgetMs in the settings schema (#18401)

Merged as part of the v3.8.53 fix sweep (author @HouMinXi).

Co-authored-by: Bob.Hou <houminxi@gmail.com>

* fix(autoCombo): keep the readiness gate for auto/<family> pools (#18428)

Merged as part of the v3.8.53 fix sweep (author @HouMinXi).

Co-authored-by: Bob.Hou <houminxi@gmail.com>

* fix(devin): fail with a non-retryable 503 when DEVIN_AGENTIC_HOME is unset or unsafe (#18433)

Merged as part of the v3.8.53 fix sweep (author @HouMinXi).

Co-authored-by: Bob.Hou <houminxi@gmail.com>
Co-authored-by: Bob.Hou <364432949@qq.com>

* fix(pricing): price the NVIDIA free catalog models at zero (#18470)

Merged as part of the v3.8.53 fix sweep (author @HouMinXi).

Co-authored-by: Bob.Hou <houminxi@gmail.com>

* fix(api-keys): check resolved models against the key the policy loaded (#18481)

Merged as part of the v3.8.53 fix sweep (author @HouMinXi).

Co-authored-by: Bob.Hou <houminxi@gmail.com>

* fix(logs): show each completed attempt once (#18491)

Merged as part of the v3.8.53 fix sweep (author @AiCaptain357).

Co-authored-by: AiCapitan357 <ai-capitan-357@proton.me>

* typecheck: add a production type ratchet, and pay down 453 -> 272 (#18603)

Merged as part of the v3.8.53 fix sweep (author @HouMinXi).

Co-authored-by: Minxi Hou <houminxi@gmail.com>

* fix(api): drop evidence-free combo members from advertised limits (#18618)

Merged as part of the v3.8.53 fix sweep (author @serenity-X).

Co-authored-by: serenity-X <295272363+serenity-X@users.noreply.github.com>

* docs(providers): document what the claude OAuth route does to client system prompts (#18640)

Merged as part of the v3.8.53 fix sweep (author @serenity-X).

Co-authored-by: serenity-X <295272363+serenity-X@users.noreply.github.com>

* fix(sse): preserve failed empty turns and expose native diagnostics (#18685)

Merged as part of the v3.8.53 fix sweep (author @fouadSalkini).

Co-authored-by: Fouad Salkini <fouad@wecansync.com>

* fix(db): preserve backup archives and unknown formats during retention (#18712)

Merged as part of the v3.8.53 fix sweep (author @aldoeliacim).

Co-authored-by: aldoeliacim <github@aldo.pw>

* test: isolate daily quota clocks and VS Code catalog discovery (#18748)

Merged as part of the v3.8.53 fix sweep (author @HouMinXi).

Co-authored-by: Minxi Hou <houminxi@gmail.com>

* fix(providers): accept Cloudflare test message model IDs (#18752)

Merged as part of the v3.8.53 fix sweep (author @trespassmk).

Co-authored-by: trespassmk <avtogram@gmail.com>

* fix(capabilities): restrict GLM-5.3 vision heuristic to Flash (#18758)

Merged as part of the v3.8.53 fix sweep (author @insoln).

Co-authored-by: insoln <insoln@ya.ru>

* fix(sse): keep in-stream provider safety stops terminal (#18760)

Merged as part of the v3.8.53 fix sweep (author @aldoeliacim).

Co-authored-by: aldoeliacim <github@aldo.pw>

* fix(compression): keep tool results intact unless a request overflows (#18761)

Merged as part of the v3.8.53 fix sweep (author @aldoeliacim).

Co-authored-by: aldoeliacim <github@aldo.pw>

* test(setup): opt-in egress guard for in-process tests, plus the #16631 Claude OAuth frozen-body case (#18819)

Merged as part of the v3.8.53 fix sweep (author @AndresDiagoM).

Co-authored-by: AndresDiagoM <andresdiag@unicauca.edu.co>

* fix(executors): clamp-and-retry max_tokens when upstream advertises a lower ceiling (#18407)

Merged as part of the v3.8.53 fix sweep (author @jjxyxsjr).

Co-authored-by: 沈俊杰 <shenjunjie@nndrobot.com>

* fix(translator): the system-role fold must not drop non-text parts of the first user message (#18437)

Merged as part of the v3.8.53 fix sweep (author @jjxyxsjr).

Co-authored-by: 沈俊杰 <shenjunjie@nndrobot.com>

* fix(auto-combo): treat account-semaphore capacity errors as local queue capacity (#18442)

Merged as part of the v3.8.53 fix sweep (author @jjxyxsjr).

Co-authored-by: 沈俊杰 <shenjunjie@nndrobot.com>

* fix(executors): forward Codex requests as the client sent them (#18274)

Merged as part of the v3.8.53 fix sweep (author @aldoeliacim).

Co-authored-by: aldoeliacim <github@aldo.pw>

* fix(usage): show the Kimi Coding subscription plan (#18578)

Merged as part of the v3.8.53 fix sweep (author @AiCaptain357).

Co-authored-by: AiCapitan357 <ai-capitan-357@proton.me>

* fix(antigravity): isolate consumer generation endpoints (#18706)

Merged as part of the v3.8.53 fix sweep (author @AiCaptain357).

Co-authored-by: AiCapitan357 <ai-capitan-357@proton.me>

* fix(providers): register Codex gpt-6.1-sol as an image model for combos and edits (#18826)

Merged as part of the v3.8.53 fix sweep (author @anhtahaylove).

Co-authored-by: anhtahaylove <everest.kill1@gmail.com>

* ci(dashboard): keep one UI kit sync PR open from the latest upstream release (#18769)

The UI Kit upstream watch only opened a tracking issue, so a new kit release still waited for
someone to run the sync by hand. It now runs daily and, while the pin is behind, keeps one PR open
against the highest release/vX.Y.Z branch through scripts/ci/ui-kit-sync-pr.sh. It never merges:
every kit release still needs a visual check on the local VPS.

The PR lives on the rolling branch chore/ui-kit-sync-latest because upstream can ship several
releases a day. The branch is rebuilt when a newer release is out and left alone otherwise. An open
PR with commits pushed by hand isn't overwritten, and a PR that a maintainer closed unmerged stays
closed until a newer release. The watch holds while the target release is frozen.

When no PR can be opened, the tracking issue says why. It's edited in place, since a comment on
every daily run would only be noise. The issue step no longer runs when the check itself failed:
an empty state used to fall through to the branch that closes the issue as up to date.

Opening the PR needs the new UI_KIT_SYNC_PR_TOKEN secret, because GITHUB_TOKEN can't create PRs in
this repository and a PR it opened wouldn't trigger CI. Without it only the branch is pushed.

* fix(claude): show a Team seat's own tier and name a member with no seat (#18763)

Merged as part of the v3.8.53 fix sweep (author @shipsfromrio).

Co-authored-by: Caio Figueiroa <334500047+shipsfromrio@users.noreply.github.com>

* docs(i18n): fix typos and broken tables in Uzbek README (#18659)

Merged as part of the v3.8.53 fix sweep (author @barkhayot).

Co-authored-by: Barkhayot Juraev <coderviewer@gmail.com>

* fix(sse): real newlines in the opencode DeepSeek json_schema prompt (#18691)

Merged as part of the v3.8.53 fix sweep (author @AndresDiagoM).

Co-authored-by: AndresDiagoM <andresdiag@unicauca.edu.co>

* fix(sse): let a combo opt out of the cooldown wait (#18708)

Merged as part of the v3.8.53 fix sweep (author @stanleytejakusuma).

Co-authored-by: Stanley Tejakusuma <70442355+stanleytejakusuma@users.noreply.github.com>

* fix(providers): drop retired Mistral devstral-latest (#18792)

Merged as part of the v3.8.53 fix sweep (author @costajohnt).

Co-authored-by: John Costa <costajohnt@gmail.com>

* fix(sync): wire the combo inventory pagination and the dismissed stats error

Closes the two gaps left open by the sync commit, and removes a duplicated
model-catalog block the merge reintroduced.

## Ported upstream features

- Combo inventory pagination is now wired into `combos/page.tsx`:
  `useComboPagination` over the filtered list, `ComboListToolbar` above the
  inventory, `ComboPaginationNav` below it, "Reorder all" as the only drag
  mode, `revealCreatedCombo` selecting the created combo's page (dropping the
  strategy filter when needed), and `prefetch={false}` on per-combo links.
- Provider stats keeps the last good snapshot on a failed poll: the load error
  is a dismissible banner, polling leaves a dismissal alone, and the header
  refresh reopens it.

## Merge bug fixed

`gpt-6.1-terra*` was present twice in the codex registry (the conflict
resolution kept the fork's legacy block next to upstream's single entry) and
once more in `modelSpecs`/the OpenAI registry. Those duplicates made an
uncatalogued model carry a confirmed 872K cap, which broke the #18609 combo
ceiling rule and would have advertised a window upstream does not.

## Tests

- `tests/unit/ui/provider-stats-dismissed-error.test.tsx` (new) covers the
  banner: appears on a failed poll, survives later polls once dismissed, comes
  back on an explicit refresh.
- `tests/unit/ui/combo-pagination.test.tsx` gains the wiring assertions.
- `tests/unit/auto-combo-route-param-page.test.tsx` restored: the encoded
  `/dashboard/combos/auto%2Ffast` crumb fix is ported to `Breadcrumbs`
  (`decodeRouteParam` + the `costs/teams` label).
- 26 upstream dashboard test files deleted: they assert the vendored UI kit's
  DOM (`data-slot`, `ci-button`, kit popover/dialog semantics) on surfaces this
  fork renders with its own components. They arrived with this sync and never
  matched this tree.

---------

Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
Co-authored-by: Junior-HJ <sjaradj@ucvvirtual.edu.pe>
Co-authored-by: Muhammad Usama <55662931+MuhammadUsamaMX@users.noreply.github.com>
Co-authored-by: Erwan Novianto <smserwan@gmail.com>
Co-authored-by: hummern <hummernkloa@gmail.com>
Co-authored-by: turbolego <turbolego@gmail.com>
Co-authored-by: Mayank Jaiswal <mayankjaiswal1707@gmail.com>
Co-authored-by: James Martinez <james-martinez@users.noreply.github.com>
Co-authored-by: Praveen K Palaniswamy <praveen.palaniswamy@gmail.com>
Co-authored-by: xc0derx <11428624+xc0derx@users.noreply.github.com>
Co-authored-by: Anton Shilin <coder.root@gmail.com>
Co-authored-by: Dizzle <112548150+maxmad64bis@users.noreply.github.com>
Co-authored-by: WITALO ROCHA <witalo_rocha@hotmail.com>
Co-authored-by: Bob.Hou <houminxi@gmail.com>
Co-authored-by: Andres Felipe Diago Matta <82129635+AndresDiagoM@users.noreply.github.com>
Co-authored-by: HouMinXi <19586012+HouMinXi@users.noreply.github.com>
Co-authored-by: Abhishekchhetri020 <145480099+Abhishekchhetri020@users.noreply.github.com>
Co-authored-by: Abhishek Chhetri <abhishekchhetri@example.com>
Co-authored-by: ScottyAmr <scott.kanowski@gmail.com>
Co-authored-by: Felipe Almeman <4226997+zhiru@users.noreply.github.com>
Co-authored-by: Felipe Almeman <felipe@aireset.com.br>
Co-authored-by: Rafa Martins <146174365+rafacpti23@users.noreply.github.com>
Co-authored-by: Dongwook <dongwook.chan@gmail.com>
Co-authored-by: Tuan Dinh <tuan.dinh.truong@sap.com>
Co-authored-by: arashashrafii <arash.ashrafi@gmail.com>
Co-authored-by: Pranav Deshpande <134182346+PranavD2905@users.norep…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant