Skip to content

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

Merged
diegosouzapw merged 36 commits into
cheaper-inference:release/v3.8.53from
xiaoyaner0201:feat/log-export-otlp-destination
Oct 28, 2026
Merged

diegosouzapw merged 36 commits into
cheaper-inference:release/v3.8.53from
xiaoyaner0201:feat/log-export-otlp-destination

Conversation

@xiaoyaner0201

@xiaoyaner0201 xiaoyaner0201 commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Add an OTLP/HTTP traces destination for persisted call logs, with optional Langfuse mapping and opt-in original request Header attributes. Each exported call-log row becomes a span; the existing isolated export process and cursor semantics remain in place.

This is PR B of #16454, building on the merged #16663. The branch includes release/v3.8.53 through e9cb075cf6db161661b01f5dde2a1f0b033f7660. This update adds Header export without changing the database schema or importing a newer base.

Why

Standard trace export makes persisted gateway activity available to an OpenTelemetry backend: model usage, latency, TTFT, errors, sessions and optional request/response inspection. Original client Headers add context such as the calling application, user agent or SDK version, without hard-coding an application taxonomy into the exporter.

Changes

  • Register otlp-http with configurable endpoint, encrypted collector authentication Headers, service/environment, allowed request paths, timeout, optional Langfuse mapping and user identity mode.
  • Export OpenTelemetry GenAI and omniroute.* attributes. Optional Langfuse mapping supplies model, usage, input/output, session, user, level and TTFT. Bodies are emitted once, rather than duplicated under both mappings.
  • Derive trace/span IDs from the call-log ID; resending a row retains its IDs. Langfuse v4 can retain multiple rows with the same IDs, so this is not a deduplication guarantee.
  • Bound requests to 500 spans and 4 MiB. Check every span before sending a cursor batch, preserve the cursor on failure or partial acceptance, and use bounded retries for 408/429/5xx/network errors. Redirects are not followed.
  • Keep diagnostic messages limited to exporter-owned facts. Collector response bodies and Headers are not echoed into persisted errors, the dashboard or logs.
  • Carry the existing ttft_ms column through the export record. New BigQuery tables include a nullable ttft_ms; old tables without it remain supported.
  • Add create-time startFromCurrentPosition, with its UI string in all 67 catalogs.
  • Update LOG-EXPORT.md, the changelog fragment, packaging coverage and focused tests. Refresh the document's 66 translated mirrors through the official pipeline.

Original request Headers

requestHeaderAllowlist defaults to empty. It accepts exact names or a trailing-prefix wildcard, as an array or comma/newline-separated text:

{
  "requestHeaderAllowlist": [
    "user-agent",
    "x-stainless-package-version",
    "x-omniroute-meta-*"
  ]
}

With the original client snapshot available, the span contains ordinary OpenTelemetry attributes:

http.request.header.user-agent = ["SyntheticHarness/2.0.0"]
http.request.header.x-stainless-package-version = ["9.8.7"]
http.request.header.x-omniroute-meta-app = ["synthetic-test-platform"]
user_agent.original = "SyntheticHarness/2.0.0"
  • Header names become lowercase; values remain string arrays. A selected, single-valued User-Agent also supplies user_agent.original.
  • X-OmniRoute-Meta-* has no special interpretation: the complete name is preserved, without prefix stripping or a Langfuse-specific business-field mapping. SDK/version parsing belongs to downstream analysis.
  • The source is the existing hydrated pipelineClientRequest, not the Headers sent to a model provider. includeBodies=true and retained detailed logging are required. Missing, malformed, oversized or truncated snapshots contribute no Header attributes; the exporter does not reconstruct them.
  • Credential Header names and recognized credential values are excluded even if explicitly allowlisted. Types, control characters, Unicode validity, counts and byte sizes are bounded. With the default empty allowlist, the Header path does not read the snapshot.
  • Allowlisting remains an operator privacy decision. Arbitrary sensitive business data is not automatically classified. Enabling includeBodies also retains its existing prompt/response export behavior; identity pseudonymization applies only to the user identifier.

The destination's existing headers option is separate: it authenticates exporter → collector HTTP requests and is not an input to span attributes.

Validation

  • 479 focused tests passed on each of Node 22, 24 and 26 at d953b1be9eeef847810d1fc4f19b2a03f7a5de4d, covering Header export, OTLP payload/error handling, adjacent export paths and packaging. Each test file ran in its own process; the Header file contains 68 passing cases, including real compiled-child tests.
  • 22 tests across four independent regression probes passed, including literal and escaped-quote credential counterexamples through the real logger, persistence/hydration, compiled export child and loopback collector; default-off output matched the pre-Header implementation in 12 byte-level controls with zero snapshot reads. Credential selection reuses the existing complete public recognition path as an omission signal, while safe Header values remain unchanged.
  • Lint, file-size, complexity, changelog integrity, pack policy and repository inventory checks passed on the final commit; the verification checkout remained clean.
  • 66 locale mirrors refreshed and source/target hashes independently verified. The strict structural checker passed 62 mirrors directly; four contained one additional, unchanged inline-code literal each (null in ka; a repeated headers in kn/mr/te). These presentation-only differences were reviewed separately, with no missing literals or other structural failures. The new Header subsection was read in zh-CN, ja, de, ar, es and ru. The same-scope --all drift comparison adds no entries relative to the frozen base, and contains no LOG-EXPORT.md drift.
  • TypeScript compiler checks were not rerun locally for the final credential-filter repair. Earlier scoped typecheck results are historical; the current compiler result must come from CI.

An independent read-only review of this exact commit/tree found no remaining blocking findings. The original escaped-credential regression was reproduced against the parent and rejected by the candidate; a further eight-case canonical/adversarial suite passed, including safe-value parity and default-off zero reads.

A synthetic receiver acceptance test used the candidate's actual OTLP client against Langfuse 4.56.0. Readback through both the v2 observations API and ClickHouse confirmed the complete Header names, string-array values and scalar User-Agent. Credential attributes were absent. Header arrays are stored in Langfuse metadata as JSON-array strings, so a scalar equality filter and an array-string equality filter are different queries. No model request or production exporter activation was involved.

Earlier receiver testing also covered input/output, usage, model, session, user, error level, TTFT and same-ID resends. It is historical evidence for those unchanged mappings, not a substitute for the latest Header checks.

Known limits

  • Complete credential recognition has an opt-in CPU cost near the snapshot limits. A synthetic 985,933-byte snapshot with 240 maximum-sized selected values took 7.38 seconds in a comparison run versus 1.48 seconds with the previous helper; separate bounded stress runs remained below 15 seconds. These are extreme local helper measurements, not production latency figures. Work stays in the isolated export child, but larger detailed batches can take longer; Header capture remains off by default.
  • Full local unit/Vitest/E2E suites and a production application build were not run for this update. Read the checks attached to the published head for full CI status.
  • The sandboxed real-child proxy fixture targeting hostname sidecar is blocked by the loopback-only test guard. The remaining child cases were exercised without removing the guard.
  • Four documentation consistency tests reproduce with the same failing assertions on the frozen upstream base and the candidate: README/package version consistency, docs-counts, and provenance for RESILIENCE_GUIDE and ENVIRONMENT. These unrelated failures are left unchanged. The scoped LOG-EXPORT.md translation result is reported separately above.
  • This remains persisted-log export, not live request instrumentation. Detail retention, includeBodies and downstream handling determine which optional data is available.

Infographic

A restaurant keeps serving while an independent courier delivers copies of saved call logs to an OTLP backend.

The restaurant serves the client while a separate courier delivers copies of the saved receipts. Streaming pieces are assembled before export; body export is opt-in. The bookmark (cursor) advances only after an acknowledged batch; a delivery failure leaves it at the last confirmed position. The isolated courier is the prerequisite from #16663; this PR adds the OTLP/HTTP delivery format. This illustrates the mechanism, not a product screenshot or an exactly-once guarantee.

中文说明

概要

新增 OTLP/HTTP traces 日志导出目的地,并提供可选的 Langfuse 字段映射及默认关闭的原始请求 Header 导出。每条调用日志对应一个 span,复用已有的隔离子进程与游标处理。

这是 #16454 的 PR B,前置 #16663 已合并。当前分支包含 release/v3.8.53 的固定基线 e9cb075cf6db161661b01f5dde2a1f0b033f7660;本轮新增 Header 支持,不改数据库结构,也没有再次追合上游。

Header 的处理方式

  • 使用 requestHeaderAllowlist 选择需要的 Header,支持精确名字及末尾前缀通配符;默认空列表,不读取请求快照。
  • 从已有详细日志的原始客户端快照取值,输出 http.request.header.<完整小写名字>,值为字符串数组。选中的单值 User-Agent 额外输出 user_agent.original。
  • X-OmniRoute-Meta-* 与普通 Header 一样处理:保留完整名字,不剥前缀、不生成专用业务字段,也不在导出器里解析 CLI 或 SDK 版本。
  • 需要 includeBodies=true 和仍可读取的详细日志。快照缺失、损坏、过大或截断时不生成 Header 属性;不会用模型厂商侧的请求头代替。
  • 凭据头及可识别的凭据值强制排除,并限制类型、字符、条数和字节数。业务敏感数据仍需管理员通过白名单自行控制。开启 includeBodies 同时沿用原有的提示词/响应正文导出行为。
  • 配置里的 headers 仍是导出器请求 collector 时的鉴权头,与上述 span 属性无关。

原有功能与验证

保留 OTLP/GenAI 属性、可选 Langfuse 映射、稳定 trace/span ID、有界重试与批次大小、失败不前移游标、仅含导出器自有事实的错误信息,以及 BigQuery 的 ttft_ms 兼容和从当前位置开始导出的选项。

本轮最终测试、独立审查及 66 份翻译的结果见上方 Validation。真实 Langfuse 4.56.0 验收使用合成数据和候选自己的导出客户端,分别从 observations API 与 ClickHouse 回读,确认原始 Header 名、字符串数组及 User-Agent 都已保存,凭据属性不存在。没有发起模型请求,也没有启用生产导出器。

独立只读复审未发现剩余阻塞项。完整凭据识别存在极限输入下的 CPU 代价:约 986KB、240 个大值的合成快照在一次对照中由 1.48 秒增加到 7.38 秒;这是本地 helper 的压力测量,不是生产请求延迟。处理仍在隔离导出子进程内,Header 捕获默认关闭。

完整本地 unit/Vitest/E2E、生产应用构建及最终修复后的 TypeScript 编译检查未跑;完整 CI 以发布后准确 head 的 checks 为准。sidecar 代理夹具受本地网络保护限制;另外四项文档一致性失败已在固定上游基线上同命令复现,未扩大修改范围。日志详情和保留策略仍决定可导出的数据范围。

比喻图

餐厅照常出餐,独立邮递员把已保存的调用日志副本送到 OTLP 后端。

餐厅照常给顾客出餐,独立邮递员另送已保存的账单副本。流式片段先组装为回答,正文导出需要显式开启;收到一批数据的确认后,书签(游标)才向前移动,发送失败则停在上次确认的位置。独立邮递员对应前置 PR #16663,本 PR 增加 OTLP/HTTP 这种寄送格式。此图解释机制,不是产品截图,也不承诺恰好一次投递。

@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 15, 2026
@diegosouzapw diegosouzapw changed the title feat(logs): add an OTLP/HTTP traces log-export destination [defer] feat(logs): add an OTLP/HTTP traces log-export destination Oct 15, 2026
@xiaoyaner0201
xiaoyaner0201 marked this pull request as ready for review October 18, 2026 10:59
@xiaoyaner0201

Copy link
Copy Markdown
Contributor Author

Thanks for merging #16663. Following the A-first order, #16664 is now refreshed on release/v3.8.52: an ordinary merge commit (no rebase or force-push), so the PR diff is the OTLP destination only. The shared export code from #16663 and your refactors are unchanged; the only shared-query change is mapping the existing call_logs.ttft_ms column. Focused log-export tests pass on Node 22/24/26 (399/399 each), and the refreshed code was re-verified against a self-hosted Langfuse v4.56.0. Details are in the PR body.

A note on why we would like this to land: we run OmniRoute as a shared gateway and use this OTLP path to send its call logs to a self-hosted Langfuse. It is how we measure per-key and per-session usage, latency/TTFT and error rates, and it shows where the gateway's capability limits are. More generally, a standard OpenTelemetry destination lets any OmniRoute deployment plug into Langfuse, Phoenix, Tempo or an OTel Collector instead of building one integration per tool, and it stays off unless a destination is created.

I see it is labelled for v3.8.53. If anything would help it move (a narrower first slice, dropping the BigQuery ttft_ms part into a follow-up, or a specific test you want), tell me and I will turn it around quickly. Converting it to Ready now so the full CI runs.

中文说明

感谢合并 #16663。按先 A 后 B 的顺序,#16664 已基于 release/v3.8.52 更新:用的是普通 merge 提交(没有 rebase 或 force-push),所以 PR 的 diff 只剩 OTLP 目的地本身。#16663 的共享导出代码和你的重构都没有改动;共享查询唯一的改动,是映射 call_logs 里已有的 ttft_ms 列。日志导出的定向测试在 Node 22/24/26 上各 399 项全部通过,更新后的代码也重新对自建的 Langfuse v4.56.0 做了验证。细节见 PR 正文。

说明一下我们为什么希望它能合入:我们把 OmniRoute 当作共享网关运行,用这条 OTLP 路径把调用日志送进自建的 Langfuse。我们靠它按 Key、按会话衡量用量,看延迟、首字耗时和错误率,也靠它看清网关的能力边界。更一般地说,有了一个标准的 OpenTelemetry 目的地,任何 OmniRoute 部署都能接入 Langfuse、Phoenix、Tempo 或 OTel Collector,不用每个工具各做一套集成;而且不建目的地就不会启用。

我看到它标了 v3.8.53。如果有什么能帮它推进(比如先合一个更窄的切片、把 BigQuery 的 ttft_ms 拆到后续 PR,或者你想要某个具体测试),告诉我,我会尽快处理。现在把它转为正式待审,好让完整 CI 跑起来。

@diegosouzapw
diegosouzapw changed the base branch from release/v3.8.52 to release/v3.8.53 October 19, 2026 13:27
@diegosouzapw

Copy link
Copy Markdown
Collaborator

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.

@xiaoyaner0201

Copy link
Copy Markdown
Contributor Author

Thanks for clarifying and moving this to the live branch, @diegosouzapw. We are not asking for an exception to the v3.8.52 freeze. Could you prioritize review and landing of this PR early in the v3.8.53 development cycle, once the required checks are satisfied, and point out any remaining merge blockers?

Our shared gateway's planned production collection integration is waiting on this upstream-supported exporter. The branch has been tested against a self-hosted Langfuse; we have not deployed it to our production gateway. A standard OTLP destination would make retained call logs usable for per-key/session usage, latency/TTFT, error analysis and request/response inspection, without a separate gateway integration for each backend.

The scope is bounded: export is opt-in and runs in the isolated child from #16663; this is call-log export, not application-internal agent/skill tracing or proof that a tool executed successfully. It does not export monetary cost, automatically delete source logs, or provide prompt/response redaction—identity pseudonymization only covers the user identifier. Retry delivery is not an exactly-once guarantee.

I see CI has restarted against the new base, and I am not claiming it is green. I can address PR-specific CI/review findings, or move the optional BigQuery TTFT addition into a follow-up if that would help the OTLP feature land sooner. The concrete request is review and a path to merge into the active 53 branch.

@xiaoyaner0201

Copy link
Copy Markdown
Contributor Author

Updated the branch with the LOG-EXPORT.md translations for all 66 locales using the official translation pipeline. Only those mirrors and their state entry changed in the translation commit; existing drift for other documents is untouched.

  • 66/66 passed structural checks; semantic spot-checks of the new OTLP section passed in six languages.
  • Focused log-export suite: 399/399 pass; typecheck:core: pass.
  • LOG-EXPORT.md has no remaining source, target or stale-locale drift. The full drift check still reports the same pre-existing entries as the frozen release/v3.8.53 base (e9cb075).

The branch includes that base through an ordinary merge; the feature delta is unchanged. The PR description now reflects the v3.8.53 base and the translation refresh.

@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(logs): add an OTLP/HTTP traces log-export destination feat(logs): add an OTLP/HTTP traces log-export destination Oct 20, 2026
xiaoyaner0201 and others added 7 commits October 21, 2026 18:06
Reuse the existing includeBodies client snapshot without new source fields or storage. Capture exact names and bounded terminal prefixes as standard OTLP string arrays; preserve full header names in either Langfuse mode.

Keep capture disabled by default, exclude credentials regardless of selection, and bound or omit malformed detail without failing the batch. Include hydration, local HTTP, real child and packaging regression coverage.

Validated on Node 24: 421 focused assertions, 18 inventory checks, packaged child smoke, lint and core typecheck.
Refresh all 66 LOG-EXPORT locale mirrors through the official translation pipeline. Preserve source literals and unrelated translation state; document original-header selection, standard OTLP arrays, and retained-detail requirements.
Use the complete public error sanitizer only as a credential-marker signal, retaining the existing detector and redactor checks and exporting safe selected values unchanged.

Cover canonical escaped quotes, delimiters, byte-limit tails, neutral header shapes, and the real logger/artifact/hydration/compiled-child loopback path. Validate focused Node 24 suites and Header tests on Node 22 and 26.
Resolve DestinationFormModal imports (UI Kit adoption from the release plus useTranslations for the new startFromCurrentPosition label), regenerate routeNamespaces.generated.json and make the OTLP retry-bounds test independent of machine load (only the timeout case uses the 30 ms request timeout).

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
The release (cheaper-inference#18276) now requires a dashboard session on the log-export
routes in every mode, so the OTLP route tests send an authenticated
request like log-export-routes.test.ts does. No source change.

Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
@diegosouzapw
diegosouzapw merged commit 4ae71e8 into cheaper-inference:release/v3.8.53 Oct 28, 2026
0 of 2 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 mentioned this pull request Nov 3, 2026
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.

2 participants