Commit graph

10385 commits

Author SHA1 Message Date
diegosouzapw
70cbef3371 chore(changelog): fragment for #16524 2026-10-13 13:14:35 -03:00
diegosouzapw
560a2169bd fix(sse): drop duplicate passthrough finish chunks and fail empty native_finish_reason errors
Some OpenAI-compatible gateways repeat the finish chunk (the copy usually
carrying only usage). Strict clients such as the AI SDK reject anything after
the first finish_reason, so the passthrough stream now drops the duplicate;
its usage is still captured and forwarded as the trailing usage-only chunk.

OpenRouter-style gateways also report upstream failures behind an HTTP 200 by
ending an empty completion with native_finish_reason network_error / error /
server_error / timeout. The passthrough stream now routes that case through
the existing stream-failure path (502, code upstream_native_finish_error)
instead of returning a clean empty answer. Content or tool calls keep the
chunk untouched. The non-streaming path already turns these empty bodies into
a 502 via the empty-content guard; a regression test pins it.

Co-authored-by: askid <askid.mobile@gmail.com>
Inspired-by: https://github.com/decolua/9router/pull/3611
2026-10-13 13:12:32 -03:00
Praveen K Palaniswamy
47688ba5ea
test(guardrails): characterize the guardrail pipeline before the v4 module extraction (#16415)
Some checks are pending
CI / Ecosystem E2E (live server) (push) Blocked by required conditions
CI / Protocol Clients E2E (live server, advisory) (push) Blocked by required conditions
CI / Gate / CI (push) Blocked by required conditions
CI / CI Dashboard (push) Blocked by required conditions
Publish to Docker Hub / Resolve Docker release metadata (push) Waiting to run
Publish to Docker Hub / Preflight — amd64 runner availability (push) Blocked by required conditions
Publish to Docker Hub / Build Docker (linux/amd64) (push) Blocked by required conditions
Publish to Docker Hub / Build Docker (linux/arm64) (push) Blocked by required conditions
Release-Green (continuous) / Validate main branch (push) Waiting to run
Publish to Docker Hub / Publish multi-arch manifests (push) Blocked by required conditions
Publish to Docker Hub / omni-build runner offline alert (push) Waiting to run
Lock released branch / lock-branch (push) Waiting to run
Lock released branch / guard-no-push-after-release (push) Waiting to run
Release-Green (continuous) / Validate active release branch (push) Waiting to run
Release-Green (continuous) / Bank ratchet shrinks (push) Waiting to run
Release-Green (continuous) / Baseline headroom (push) Waiting to run
Quality Gates / Change Classification (push) Waiting to run
Quality Gates / Unit Tests fast-path (3/4) (push) Blocked by required conditions
Quality Gates / Docs Gates (fast-path) (push) Blocked by required conditions
Quality Gates / Fast Quality Gates (push) Blocked by required conditions
Quality Gates / Vitest (fast-path) (push) Blocked by required conditions
Quality Gates / Unit Tests fast-path (1/4) (push) Blocked by required conditions
Quality Gates / Unit Tests fast-path (2/4) (push) Blocked by required conditions
Quality Gates / Unit Tests fast-path (4/4) (push) Blocked by required conditions
Quality Gates / No new ESLint warnings (push) Blocked by required conditions
Quality Gates / Merge integrity (changelog + generated skills) (push) Waiting to run
Quality Gates / Gate / Quality (push) Blocked by required conditions
Radar Export / publish-export (push) Waiting to run
Release acceptance / Release acceptance (push) Waiting to run
OpenSSF Scorecard / Scorecard analysis (push) Waiting to run
Thanks @yourspraveen — the guardrail pipeline now has characterization tests for the current behavior, in `tests/unit/guardrail-pipeline-characterization.test.ts` and `tests/unit/guardrail-pipeline-wiring-characterization.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 11:02:32 -03:00
skygunner
228ed1e356
fix(models): give the Gemini /v1beta catalog /v1/models parity — prefix naming and the requireAuthForModels gate (#16316)
Thanks @skygunner — /v1beta/models uses the same requireAuthForModels gate as /v1/models, and custom-provider names use the operator prefix instead of the node UUID. Covered by `tests/unit/v1beta-models-route.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 11:02:13 -03:00
Dizzle
23ed6fd66a
fix(logs): read only the bounded tail of the console log (#16301)
Thanks @maxmad64bis — the console log route reads a bounded tail, in `src/app/api/logs/console/route.ts`, covered by `tests/unit/console-log-levels.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 11:01:55 -03:00
Dizzle
429e7f1ffd
fix(usage): retry a usage write once when the database is locked (#16276)
Thanks @maxmad64bis — a locked usage write is retried once, and `src/lib/usage/usageHistory.ts` shrinks below its frozen ceiling. Covered by `tests/unit/usage/usageWriteRetry.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 11:01:35 -03:00
Dizzle
572db6666c
fix(conversation-reconnect): elect the reconnect point with the longest verified run (#16268)
Thanks @maxmad64bis — conversation reconnect elects the point with the longest verified run, in `open-sse/services/conversationTracker.ts`, covered by `tests/unit/conversationTracker.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 11:01:17 -03:00
Dizzle
74a51fbd62
fix(app-log): file clock-prefixed lines under the real component and strip color codes from file messages (#16270)
Thanks @maxmad64bis — app-log files clock-prefixed lines under the real component and strips color codes, in `src/lib/consoleInterceptor.ts`, covered by `tests/unit/console-interceptor-message-fidelity.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 11:01:00 -03:00
Dizzle
181a1019f1
fix(calls): measure rendered content on streamed reply summaries (#16271)
Thanks @maxmad64bis — streamed reply summaries measure rendered content, in `src/lib/usage/callContentProvenance.ts`, covered by `tests/unit/call-content-provenance.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 11:00:42 -03:00
Dizzle
b9b07a9a5b
fix(resilience): accept streamRecovery block in PATCH /api/resilience (#16272)
Thanks @maxmad64bis — PATCH /api/resilience accepts a streamRecovery block, covered by `tests/unit/resilience-stream-recovery-api.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 11:00:26 -03:00
Dizzle
39a76e5f71
fix(settings): accept stored retention durations missing from database settings schema (#16273)
Thanks @maxmad64bis — stored retention durations that are missing from the database settings schema are accepted, in `src/shared/validation/settingsSchemas.ts`, covered by `tests/unit/database-settings-maintenance.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 11:00:09 -03:00
Dizzle
aa02e648bb
fix(models): retired models reporting 410 lock for 24 hours on status alone (#16303)
Thanks @maxmad64bis — a retired model that reports 410 locks for 24 hours on that status alone, in `open-sse/services/accountFallback.ts`. The file stays inside its frozen ceiling. Covered by `tests/unit/gemini-deprecated-model-lockout.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 10:59:54 -03:00
Dizzle
12e5c16c67
fix(perplexity-web): publish received upstream status on the active proxy sink (#16292)
Thanks @maxmad64bis — perplexity-web publishes the received upstream status on the active proxy sink, in `open-sse/executors/perplexity-web.ts`, covered by `tests/unit/perplexity-web-upstream-status.test.ts`.

Boarded on release/v3.8.52 at e2d5747872. Focused tests: 204 passed. The one failure is in tests/unit/codex-models-catalog-refresh.test.ts and belongs to #16299, which was ejected: it grows src/app/api/providers/[id]/models/route.ts from the frozen 2420 to 2422. File-size otherwise kept only the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 10:59:39 -03:00
Dizzle
e2d5747872
fix(logs): read only the log tail on the CLI logs route (#16386)
Thanks @maxmad64bis — the CLI logs route reads a bounded tail and still requires CLI tools auth, via `src/lib/logTail.ts`, covered by `tests/unit/cli-logs-route-bounded-tail.test.ts`.

Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:40:16 -03:00
Dizzle
981ef3a888
perf(usage-analytics): memoize pricing resolution per request (#16334)
Thanks @maxmad64bis — usage analytics resolves each provider and model price grid once per request, in `src/app/api/usage/analytics/route.ts`, covered by `tests/unit/usage-analytics-pricing-memoization.test.ts`.

Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:40:02 -03:00
Dizzle
2883b27a96
fix(db): prune pre-migration snapshots outside the migration window (#16363)
Thanks @maxmad64bis — pre-migration snapshots are pruned by the configured retention outside the migration window, in `src/lib/db/cleanup/backupPrune.ts`. This does not add a migration. Covered by `tests/unit/db-backup-prune-outside-migration-window.test.ts`.

Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:39:48 -03:00
Dizzle
059705e758
fix(checks): repo quality checks run in a throwaway data directory (#16353)
Thanks @maxmad64bis — repo quality checks run in a throwaway data directory. The route-guard membership check still loads `isLocalOnlyPath`; the import only moves to after that isolation. Covered by `tests/unit/repo-checks-isolate-datadir.test.ts`.

Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:39:35 -03:00
小妍儿 ✨
197a9de199
fix(settings): stop offering weighted as an account fallback strategy (#16459) (#16473)
Thanks @xiaoyaner0201 — account fallback no longer offers `weighted`, which had no account implementation. Combo-level weighted stays. Covered by `tests/unit/account-weighted-runtime-16459.test.ts`, `tests/unit/account-weighted-settings-16459.test.ts`, and `tests/unit/ui/combo-defaults-account-weighted-16459.test.tsx`.

Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:39:20 -03:00
Dizzle
5f17a3bdaf
perf(combos): share alias tables and resolved windows across combo list (#16331)
Thanks @maxmad64bis — the combo list shares alias tables and resolved windows for one request, in `src/lib/combos/comboContext.ts`, covered by `tests/unit/combos-list-shared-context-resolution.test.ts`.

Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:39:05 -03:00
Dizzle
75f9f400a7
fix(favicon): redirect to the default icon with an absolute URL instead of failing (#16336)
Thanks @maxmad64bis — a missing custom favicon redirects to the default icon with an absolute URL, in `src/app/api/settings/favicon/route.ts`, covered by `tests/unit/settings-favicon-fallback.test.ts`.

Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:38:52 -03:00
Dizzle
c99712d3e7
fix(api): accept partial database settings sections (#16335)
Thanks @maxmad64bis — a partial database settings patch is accepted and returns 200, in `src/app/api/settings/database/route.ts`, covered by `tests/unit/database-settings-maintenance.test.ts`.

Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:38:38 -03:00
Elisson Marques
95876ff32c
fix(antigravity): expose cachedContentTokenCount in OpenAI usage details (#16337)
Thanks @ElissonNadson — Antigravity usage now exposes cachedContentTokenCount in the OpenAI usage details, in `open-sse/executors/antigravity/sseCollect.ts`, covered by `tests/unit/antigravity-executor-split.test.ts`.

Boarded on release/v3.8.52 at ac590dafa6. Focused node tests: 74 passed, 0 failed. The #16473 dashboard case is a vitest file and passed 3/3 under vitest. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:38:25 -03:00
Dizzle
ac590dafa6
fix(sse): skip emergency fallback when its target leaves the live catalog (#16376)
Thanks @maxmad64bis — emergency fallback skips a target that has left the live catalog. `src/sse/handlers/chat.ts` nets down and the header helper lives in `src/sse/handlers/emergencyFallbackHeader.ts`, covered by `tests/unit/services/emergency-fallback.test.ts`.

Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:23:05 -03:00
Dizzle
32e370b92c
fix(stream-recovery): re-send a cut that rendered nothing on the same stream (#16377)
Thanks @maxmad64bis — stream recovery re-sends a cut that rendered nothing on the same stream, in `open-sse/services/streamRecovery.ts`, covered by `tests/unit/stream-continuation-responses.test.ts`.

Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:22:50 -03:00
skygunner
96d575f3d9
fix(resilience): wait out a short model lock instead of failing a combo instantly (#16319) (#16360)
Thanks @skygunner — a combo waits out a short model lock instead of failing the attempt immediately, in `open-sse/services/combo/comboAttemptLoop.ts` and `comboCooldownRetry.ts`, covered by `tests/unit/combo-model-lock-pre-dispatch-wait-16319.test.ts`.

Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306

Fixes #16319
2026-10-13 09:22:33 -03:00
opensource-elearning
431aa8ad58
perf(sse): route parseModel hot-path logging through level-gated logger (#16355)
Thanks @opensource-elearning — parseModel hot-path logging goes through the level-gated logger, in `open-sse/services/model.ts`, covered by `tests/unit/model-logger-gating.test.ts`.

Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:22:18 -03:00
DuqueSouza
030956b1b7
fix(github): auto vision header, Responses body for uncatalogued codex ids, GHE targetFormat override (#16357)
Thanks @DuqueSouza — GitHub Copilot sends the vision header automatically, uses a Responses body for uncatalogued Codex model ids, and honors a GHE targetFormat override. Covered by `tests/unit/github-copilot-vision-header-codex-body.test.ts`.

Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:22:03 -03:00
Praveen K Palaniswamy
316085133d
fix(memory): extract memories from sanitized response text when PII response sanitization is on (#16401)
Thanks @yourspraveen — memory extraction reads sanitized response text only when PII response sanitization is already on. The flag default stays off. Covered by `tests/unit/memory-extraction-pii-sanitization.test.ts`.

Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306

Closes #16400
2026-10-13 09:21:48 -03:00
Praveen K Palaniswamy
8cc346434a
chore(keys): remove unused keyGroupAuth service (#16418)
Thanks @yourspraveen — the unused `open-sse/services/keyGroupAuth.ts` module is removed. On the release tip it had no importers.

Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:21:34 -03:00
Dizzle
5c6ff1e649
fix(proxy): prefer selector member no sibling serves on switch (#16379)
Thanks @maxmad64bis — a selector switch prefers a member that no sibling is already serving, in `src/lib/proxySubscription/selectorTrigger.ts`, covered by `tests/unit/proxySubscription.selectorUnservedMember.test.ts`.

Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:21:18 -03:00
Dizzle
7f49658783
fix(sse): publish lmarena upstream status on the proxy sink (#16367)
Thanks @maxmad64bis — LMArena publishes the received upstream status on the proxy sink, in `open-sse/executors/lmarena.ts`, covered by `tests/unit/lmarena-upstream-status.test.ts`.

Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:21:02 -03:00
Dizzle
75207f9168
fix(notion-web): publish received upstream status on the active proxy sink (#16371)
Thanks @maxmad64bis — notion-web publishes the received upstream status on the active proxy sink, in `open-sse/executors/notion-web.ts`, covered by `tests/unit/notion-web-upstream-status.test.ts`.

Boarded on release/v3.8.52 at e23fb0f8e8. Focused tests: 87 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). This pull request does not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 09:20:49 -03:00
Dizzle
e23fb0f8e8
fix(call-logs): hold the artifact ceiling when files are already gone (#16354)
Thanks @maxmad64bis — call-log rotation holds the artifact ceiling when the files are already gone, in `src/lib/usage/callLogRotation.ts`, covered by `tests/unit/call-log-file-rotation.test.ts`.

Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 08:44:34 -03:00
Dizzle
8b37c4d4f9
fix(resilience): store only operator-provided values on PATCH (#16362)
Thanks @maxmad64bis — resilience PATCH stores only the values the operator sent. Normalization lives in `src/lib/resilience/settings/normalize.ts`, covered by `tests/unit/resilience-settings-normalize-split.test.ts`.

Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 08:44:20 -03:00
skygunner
8fc2b689a5
fix(sse): surface Codex replay-reasoning rejections instead of masking them as STREAM_EARLY_EOF (#16364) (#16375)
Thanks @skygunner — a Codex replay-reasoning rejection now surfaces as 400 invalid_encrypted_content instead of STREAM_EARLY_EOF, via `open-sse/utils/streamReadiness.ts` and `open-sse/executors/codex/reasoningReplayRejection.ts`. Covered by `tests/unit/stream-readiness-replay-rejection-16364.test.ts`.

Fixes #16364

Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 08:44:07 -03:00
skygunner
1f9aee0551
fix(resilience): keep empty_response stream errors from killing the server via the crash guard (#16347) (#16359)
Thanks @skygunner — an empty_response stream error no longer trips the crash guard in `src/shared/utils/httpClientAbortGuard.mjs`, covered by `tests/unit/http-client-abort-guard-empty-response-16347.test.ts`.

Fixes #16347

Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 08:43:55 -03:00
Lance Woodson
6dc75e5393
fix(api): skip usage reads for unlimited key quotas (#16392)
Thanks @woodsonl — unlimited key quotas skip the usage read on the hot path in `src/domain/keyQuota.ts` and `src/lib/db/keyQuota.ts`, covered by `tests/unit/key-quota-enforcement-hotpath.test.ts`.

Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 08:43:44 -03:00
skygunner
22050a83cb
fix(translator): rebuild OpenAI content parts from a field allowlist (#16384) (#16395)
Thanks @skygunner — OpenAI content parts are rebuilt from a field allowlist in `open-sse/translator/helpers/openaiHelper.ts`, so unknown fields are stripped while payload carriers survive. Covered by `tests/unit/translator-content-part-field-allowlist-16384.test.ts`.

Fixes #16384

Boarded on release/v3.8.52 at c188c8e682. Focused tests: 145 passed, 0 failed. Changelog integrity passed. File-size kept the inherited executeTargetAttempt.ts overage (1288 > 1284). Three siblings were ejected from this wave because they grow frozen files: #16388 (auth.ts 3588 > 3587), #16356 (imageGeneration.ts 3423 > 3390 and its test 2347 > 2216), #16387 (roundRobinCombo.ts 1294 > 1288). This pull request does not touch those files.

⚠️ base-red inherited: #15306
2026-10-13 08:43:29 -03:00
lorenzozane
c188c8e682
fix(providers): extend MiMo Token Plan model test deadline (#16213)
Thanks @lorenzozanee — MiMo Token Plan dashboard model tests now use a 60-second minimum deadline in `src/lib/api/modelTestRunner.ts`, covered by `tests/unit/model-test-runner.test.ts`. The changelog fragment was prefixed with a markdown bullet on `18db4d23` before this squash.

Fixes #16057


Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).

⚠️ base-red inherited: #15306
2026-10-13 08:34:27 -03:00
Paco Cartones
d2669ea14b
docs(env): document four CLI environment variables (#16441)
Thanks @pacocartones — `.env.example` and `docs/reference/ENVIRONMENT.md` now document `OMNIROUTE_NO_UPDATE_NOTIFIER`, `OMNIROUTE_DOCTOR_LIVENESS_URL`, `OMNIROUTE_PROVIDER_CATALOG_PATH`, and `OMNIROUTE_PROVIDER_TEST_MODEL`.


Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).

⚠️ base-red inherited: #15306
2026-10-13 08:34:13 -03:00
Jan Leon
d4a12fa44a
fix(models): preserve account catalogs across disable and reactivation (#16404)
Thanks @JxnLexn — account catalogs survive reactivation. The path is `src/lib/providerModels/managedModelImport.ts` and `prepareConnectionModelTest.ts`, covered by the connection-catalog and managed-model import tests.


Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).

⚠️ base-red inherited: #15306
2026-10-13 08:34:01 -03:00
Dizzle
27e0ad8dc0
docs(routing): document quality tracker as in-memory and cold at restart (#16408)
Thanks @maxmad64bis — the auto-combo quality tracker is documented as in-memory and cold after restart in `docs/routing/AUTO-COMBO.md`, locked by `tests/unit/auto-combo-quality-memory-cold-docs.test.ts`.


Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).

⚠️ base-red inherited: #15306
2026-10-13 08:33:48 -03:00
Bob.Hou
4868e72197
fix(agnes): fold the intl max catalog id back onto the free model (#16423)
Thanks @HouMinXi — the Agnes intl-max catalog id folds back onto the free model in `open-sse/config/providers/registry/agnes/index.ts` and `src/sse/services/model.ts`, covered by `tests/unit/agnes-intl-max-effort.test.ts`.


Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).

⚠️ base-red inherited: #15306
2026-10-13 08:33:33 -03:00
Kiaro-Sama
af161b46d1
fix: preserve account quota preferences (#16424)
Thanks @KiaroSama — Codex OAuth refresh keeps operator quota controls (`limitPolicy`, `quotaPreflightEnabled`) when the refresh payload does not supply them. The helper lives in `src/lib/db/providers/providerSpecificData.ts`, covered by `tests/unit/codex-quota-optout.test.ts`.


Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).

⚠️ base-red inherited: #15306
2026-10-13 08:33:20 -03:00
lorenzozane
5013873727
fix(api): coalesce monitoring health snapshot refreshes (#16426)
Thanks @lorenzozanee — monitoring health snapshots are coalesced in `src/app/api/monitoring/health/route.ts`, covered by `tests/integration/monitoring-health-cache.test.ts`.

Fixes #16414


Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).

⚠️ base-red inherited: #15306
2026-10-13 08:33:05 -03:00
lorenzozane
3c5e5aed1a
test(electron): cover playwright-core resolution after packing (#16433)
Thanks @lorenzozanee — `tests/unit/electron-packaging.test.ts` now covers playwright-core resolution after packing.


Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).

⚠️ base-red inherited: #15306
2026-10-13 08:32:47 -03:00
Tiago Rodrigues da Rosa
adee4ab35e
fix(claude): block extra usage when a plan window is exhausted and extra usage is enabled (#16464)
Thanks @tiagolabsit — extra usage is now blocked when a Claude plan window is exhausted and extra usage is enabled, in `src/lib/providers/claudeExtraUsage.ts`, covered by `tests/unit/claude-extra-usage.test.ts`.


Boarded on release/v3.8.52 at 146459b116. Focused tests: 76 passed, 0 failed. Changelog integrity passed. File-size shows only the inherited executeTargetAttempt.ts overage (1288 > frozen 1284).

⚠️ base-red inherited: #15306
2026-10-13 08:32:29 -03:00
foxy1402
146459b116
fix(security): close auth bypass via uppercase path variants (#16403)
Thanks @foxy1402 — the chat, completions, messages, and responses handlers now call `enforceClientApiRouteAuth` themselves, so an uppercase `/V1/` path that misses the proxy matcher cannot dispatch without a key. Covered by `tests/unit/authz/handler-auth-bypass.test.ts`.

Boarded on release/v3.8.52 at b0d53251b3 (after #15840). Focused unit tests: 43 passed, 0 failed. Changelog integrity passed. File-size: the inherited executeTargetAttempt.ts overage (1288 > 1284) remains. #16427 was ejected from this wave because it grows open-sse/executors/codex.ts from 1526 to 1608, over the frozen ceiling. These seven pull requests do not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 08:16:08 -03:00
Paco Cartones
59a474c59a
fix(chat): expose route metadata on pre-dispatch errors (#16456)
Thanks @pacocartones — pre-dispatch errors now expose the resolved provider and model route metadata from `open-sse/handlers/chatCore.ts`, covered by `tests/unit/pre-dispatch-error-route-meta.test.ts`. The new test is registered in `stryker.conf.json`.

Boarded on release/v3.8.52 at b0d53251b3 (after #15840). Focused unit tests: 43 passed, 0 failed. Changelog integrity passed. File-size: the inherited executeTargetAttempt.ts overage (1288 > 1284) remains. #16427 was ejected from this wave because it grows open-sse/executors/codex.ts from 1526 to 1608, over the frozen ceiling. These seven pull requests do not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 08:15:51 -03:00
Louayzouaoui1
4d64bcc677
fix(anthropic): send dashed model ids upstream for the dotted catalog ids (#16425)
Thanks @Louayzouaoui1 — dotted Anthropic catalog ids are sent upstream as dashed model ids via `open-sse/services/modelCanonicalization.ts` and `open-sse/handlers/chatCore/claudeEffortVariant.ts`, covered by `tests/unit/anthropic-dotted-model-ids-16406.test.ts`.

Boarded on release/v3.8.52 at b0d53251b3 (after #15840). Focused unit tests: 43 passed, 0 failed. Changelog integrity passed. File-size: the inherited executeTargetAttempt.ts overage (1288 > 1284) remains. #16427 was ejected from this wave because it grows open-sse/executors/codex.ts from 1526 to 1608, over the frozen ceiling. These seven pull requests do not touch that file.

⚠️ base-red inherited: #15306
2026-10-13 08:15:32 -03:00