Commit Graph

1634 Commits

Author SHA1 Message Date
Diego Rodrigues de Sa e Souza
b67f2c58da fix(dashboard): disambiguate colliding passthrough model aliases (port from 9router#1850) (#6431)
disambiguate colliding passthrough model aliases (port #1850) (net +1/-0, test OK). Integrated into release/v3.8.46.
2026-07-06 19:24:59 -03:00
Diego Rodrigues de Sa e Souza
2ecaae7c40 fix(translator): preserve co-located functionResponse parts in gemini→openai (#6376)
preserve co-located functionResponse parts (port PR #2394) (net +1/-0, test OK). Integrated into release/v3.8.46.
2026-07-06 19:24:43 -03:00
Diego Rodrigues de Sa e Souza
259d9b0f38 fix(headroom): detect python managed by mise/pyenv/asdf/conda (port from 9router#2353) (#6382)
detect python managed by mise/pyenv/asdf/conda (port #2353) (net +1/-0, test OK). Integrated into release/v3.8.46.
2026-07-06 19:24:24 -03:00
Diego Rodrigues de Sa e Souza
bd65eeb045 fix(executors): strip client_metadata for NVIDIA requests (port from 9router#1887) (#6411)
strip client_metadata for NVIDIA (port #1887) (net +1/-0, test OK). Integrated into release/v3.8.46.
2026-07-06 19:24:08 -03:00
Diego Rodrigues de Sa e Souza
d415cc0216 fix(translator): strip thinking for NVIDIA glm-5.2 (port from 9router#2023) (#6413)
strip thinking for NVIDIA glm-5.2 (port #2023) (net +1/-0, test OK). Integrated into release/v3.8.46.
2026-07-06 19:23:43 -03:00
Diego Rodrigues de Sa e Souza
cfbc2c27c2 fix(translator): suppress </think> marker for Antigravity client (port from 9router#1061) (#6415)
suppress </think> marker for Antigravity (port #1061) (net +1/-0, test OK). Integrated into release/v3.8.46.
2026-07-06 19:23:27 -03:00
Diego Rodrigues de Sa e Souza
58bb2cd8c7 fix(executors): strip nested reasoning_content for Mistral (port from 9router#1649) (#6417)
strip nested reasoning_content for Mistral (port #1649) (net +1/-0, test OK). Integrated into release/v3.8.46.
2026-07-06 19:22:52 -03:00
Diego Rodrigues de Sa e Souza
4b1c1859f8 fix(executors): strip client_metadata on the OpenCode path (port from 9router#1442) (#6418)
strip client_metadata on OpenCode path (port #1442) (net +1/-0, test OK). Integrated into release/v3.8.46.
2026-07-06 19:22:27 -03:00
Diego Rodrigues de Sa e Souza
f0b085ebca fix(executors): inject reasoning_content for native Kimi provider (port from 9router#1480) (#6419)
inject reasoning_content for native Kimi (port #1480) (net +1/-0, test OK). Integrated into release/v3.8.46.
2026-07-06 19:22:02 -03:00
Diego Rodrigues de Sa e Souza
1636ace600 fix(executors): strip client context_management on 400 (port from 9router#1468) (#6420)
recover from client context_management 400 (port #1468) (net +1/-0, test OK). Integrated into release/v3.8.46.
2026-07-06 19:21:38 -03:00
Diego Rodrigues de Sa e Souza
7a7a72c6f4 fix(network): enable Happy Eyeballs on direct egress (port from 9router#1237) (#6423)
Happy Eyeballs on direct egress (port #1237). Integrated into release/v3.8.46.
2026-07-06 19:20:53 -03:00
Diego Rodrigues de Sa e Souza
465f0a0e83 fix(combo): advance round-robin pointer past the served model (port from 9router#948) (#6428)
combo round-robin advances pointer past served model (port #948). Test combo-rr-fallback-advance-948 (green). Integrated into release/v3.8.46.
2026-07-06 19:18:42 -03:00
Chirag Singhal
a73c6ca5fb fix(sse): reject non-string model with 400 before resolver (#6407) (#6433)
reject non-string model with 400 before resolver (#6407, 6/6). Reconciled with #6437 early schema validation on chat.ts. Integrated into release/v3.8.46.
2026-07-06 18:43:06 -03:00
Chirag Singhal
a7e0dddac4 fix(chat): validate scalar params before provider lookup (#6412) (#6437)
JSON 404 for unknown /api/* (#6424) + early scalar-param validation before provider lookup (#6412, 10/10). Integrated into release/v3.8.46.
2026-07-06 18:40:39 -03:00
Chirag Singhal
d12ac37d4d fix(api): reject non-JSON Content-Type on /v1/chat/completions with 415 (#6414) (#6434)
reject non-JSON Content-Type on /v1/chat/completions (#6414, 4/4). Integrated into release/v3.8.46.
2026-07-06 18:39:25 -03:00
Chirag Singhal
fa3a09cb43 fix(api): echo X-OmniRoute-Compression response header (#6422) (#6441)
echo X-OmniRoute-Compression header on completions routes (#6422, 6/6). Reconciled with #6429 body.model echo. Integrated into release/v3.8.46.
2026-07-06 18:38:12 -03:00
Chirag Singhal
d11bf528af fix(api): coalesce concurrent GET /v1/models to one builder run (#6408) (#6440)
coalesce concurrent GET /v1/models (#6408, 3/3). Integrated into release/v3.8.46.
2026-07-06 18:36:37 -03:00
Chirag Singhal
ac96c0dd02 fix(completions): echo requested body.model on /v1/completions to match x-omniroute-model header (#6429)
echo body.model on /v1/completions (5/5). Integrated into release/v3.8.46.
2026-07-06 18:35:25 -03:00
Chirag Singhal
6ea7c68e6e fix(api): env-var master keys see full /v1/models catalog (#6406) (#6436)
env-key master sees full /v1/models catalog (#6406, 2/2). Integrated into release/v3.8.46.
2026-07-06 18:35:01 -03:00
Chirag Singhal
c8e94d7a14 fix(chatCore): align non-streaming body.model with X-OmniRoute-Model header (#6426) (#6432)
align non-streaming body.model with X-OmniRoute-Model (#6426, 3/3). Integrated into release/v3.8.46.
2026-07-06 18:33:49 -03:00
Chirag Singhal
a2fabdde8f fix(api): return JSON 404 for unknown /v1/* routes (#6405) (#6435)
JSON 404 for unknown /v1/* routes (#6405). Test tests/unit/api/v1-catchall-json-404.test.ts (3/3). Integrated into release/v3.8.46.
2026-07-06 18:32:33 -03:00
Diego Rodrigues de Sa e Souza
2f4b793c3d fix(api): provider-models route — redirect→local-catalog fallback + custom-model merge (#6267, #6247) (#6449) 2026-07-06 18:17:02 -03:00
Diego Rodrigues de Sa e Souza
cd4a720b7e fix(providers): bound GitLab Duo tool-exchange prompt to avoid 422 (#6220) (#6446) 2026-07-06 18:16:49 -03:00
Diego Rodrigues de Sa e Souza
4a2172e569 fix(i18n): translate provider connection-status filter labels across locales (#6290) (#6448) 2026-07-06 18:16:35 -03:00
Diego Rodrigues de Sa e Souza
53aa6d9716 fix(providers): add redacted WS debug logging to copilot-m365-web (#6210) (#6447) 2026-07-06 18:16:22 -03:00
Diego Rodrigues de Sa e Souza
d98a31587e fix(resilience): combo falls back to compat-rejected healthy targets before 503 (#6238) (#6450) 2026-07-06 18:16:10 -03:00
Diego Rodrigues de Sa e Souza
f1a02f602b fix(startup): best-effort self-heal for corrupted Turbopack dev cache on Windows (#6289) (#6445) 2026-07-06 18:15:58 -03:00
Diego Rodrigues de Sa e Souza
c50a83a94d fix(providers): resolve qodercli via cliRuntime on Windows (#6263) (#6389) 2026-07-06 18:13:31 -03:00
Diego Rodrigues de Sa e Souza
76b1b04495 fix(sse): do not inflate probe-sized max_tokens in reasoning buffer (#6274) (#6388) 2026-07-06 18:13:18 -03:00
Diego Rodrigues de Sa e Souza
e3d29d1419 fix(cli): register reset-password subcommand + non-TTY stdin path (#6261, #6258) (#6387) 2026-07-06 18:13:06 -03:00
Diego Rodrigues de Sa e Souza
db7a6c2437 fix(db): migration safety abort — add bypass hint + memoize to stop cascade (#6260) (#6386) 2026-07-06 18:12:35 -03:00
Diego Rodrigues de Sa e Souza
6fff4d6df1 fix(auth): dedup Codex OAuth import by workspace AND user id (#6301) (#6385) 2026-07-06 18:11:37 -03:00
Diego Rodrigues de Sa e Souza
f60090b278 fix(providers): venice-web static-catalog fallback for models listing (#6269) (#6384) 2026-07-06 18:09:42 -03:00
Makcim Ivanov
0086f1772b fix(api): filter specialty model catalogs (#6303)
Derive specialty model catalogs from the unified catalog via a shared predicate filter. Integrated into release/v3.8.46.
2026-07-06 17:44:16 -03:00
Milan Soni
49795c24ef fix(api): dynamic import for MITM + fix Turbopack over-bundling warnings (#6366)
Dynamic MITM manager import on the agent-bridge route + Turbopack static-analyzer anchor in the skills generator (#6329). Integrated into release/v3.8.46.
2026-07-06 17:34:33 -03:00
jmengit
049bad494b fix(internal): use explicit internal key selection for dashboard probes (#6372)
Internal probes pick a management-scoped key (pickApiKeyForInternalUse); API-manager model-editor fallback catalog. Integrated into release/v3.8.46.
2026-07-06 17:20:53 -03:00
jordansilly77-stack
b796f2b457 feat(providers): link web session guide to provider site (#6316)
Add an Open-provider-site link to the web-session credential guide (+host-extraction test). Integrated into release/v3.8.46.
2026-07-06 17:19:47 -03:00
Vinayak Kulkarni
fb3da7ce98 fix(live-ws): reject on bind failure instead of crashing the process (closes #6324) (#6332)
LiveWS server rejects on bind failure instead of crash-looping the process (closes #6324). Integrated into release/v3.8.46.
2026-07-06 16:42:20 -03:00
Xiangzhe
8853b257aa fix(dashboard): trust provider topology live state (#6322)
Trust live provider-topology state on the Home dashboard. Integrated into release/v3.8.46.
2026-07-06 16:25:05 -03:00
backryun
0785cd2e55 feat(cerebras): add Gemma 4 31B model (#6331)
Add Cerebras Gemma 4 31B model + pricing + catalog test. Integrated into release/v3.8.46.
2026-07-06 16:16:27 -03:00
Diego Rodrigues de Sa e Souza
a0ab693c4b fix(docker): make MITM manager Turbopack stub opt-in so npm/Electron/VPS bundle the real manager (#6344) (#6374)
* fix(docker): make @/mitm/manager Turbopack stub opt-in (OMNIROUTE_MITM_STUB=1) so npm/Electron/VPS builds bundle the real manager (#6344)

v3.8.45 flipped the production bundler default to Turbopack. next.config.mjs
aliased @/mitm/manager to the Docker-only degraded stub unconditionally, which
was harmless while Docker was the only Turbopack consumer but shipped the stub
to every npm/Electron/VPS artifact once Turbopack became the default — breaking
Agent Bridge start with 'MITM manager stub reached at runtime'. The alias is now
gated on OMNIROUTE_MITM_STUB=1 (set only by the Dockerfile) via the shared
scripts/build/mitm-stub-flag.mjs helper.

Regression guard: tests/unit/mitm-stub-alias-6344.test.mjs (4).

* test(next-config): align mitm-manager alias assertion with opt-in stub (#6344)

The existing test asserted the alias was always present; #6344 makes it opt-in
(OMNIROUTE_MITM_STUB=1). Default build now asserts no alias, plus a new env-matrix
test covering both the default (no stub) and Docker (stub) cases.

* docs(changelog): restore #6359 bullet eaten by merge auto-resolve
2026-07-06 15:20:40 -03:00
Diego Rodrigues de Sa e Souza
a69547a7f5 fix(sse): coerce tool-call function schema root type:null to "object" (#6359) (#6375)
Clients like the Codex app emit parameters:{type:null,...} for some tools;
OpenAI-compatible upstreams reject with '400 Invalid schema for function ...:
schema must be a JSON Schema of type object, got type null'. toolSchemaSanitizer
already dropped the null; it now re-adds the mandatory root object type (plus
empty properties / open additionalProperties when absent). Combinator roots
(anyOf/oneOf/allOf) and explicit root types are preserved.

Regression guard: 5 new cases in tests/unit/tool-schema-sanitizer.test.mjs.
2026-07-06 14:58:21 -03:00
Diego Rodrigues de Sa e Souza
f3d285ba90 fix(ci): sync-next-cycle — widen git() maxBuffer (ENOBUFS on >1MiB CHANGELOG) + propagate finalized section to i18n mirrors (#6327)
Two defects found live in the v3.8.45 Phase 5 run (2026-07-06):
- execFileSync default 1 MiB maxBuffer crashed on git show origin/main:CHANGELOG.md
- the i18n resync only synced the [NEXT] (TBD) section, leaving the just-shipped
  finalized section as '— TBD' in all 42 mirrors; now also syncs [prevVersion]
  bounded by the heading below it (new pure helper versionAfter, unit-tested)
2026-07-06 10:50:41 -03:00
Diego Rodrigues de Sa e Souza
c0430342c6 test(ci): quarantine concurrency-sensitive flakes into a serial pass (#6347)
* test(ci): quarantine concurrency-sensitive flakes into a serial pass (tests/unit/serial/)

glm-coding-plan-monthly-3580, quota-division-blocks and provider-health-autopilot
fail under --test-concurrency>1 CPU contention but pass isolated (v3.8.45 release
benchmark: this class cost ~28min re-runs per CI round). They now live in
tests/unit/serial/ and run in a dedicated --test-concurrency=1 step appended to
every runner (test:unit, :ci, :ci:shard, :fast, :shard:1/2, coverage:runner —
sharded variants shard the serial pass too, so concurrent shard jobs never
self-collide). Discovery + TIA gates know the new glob; stryker.conf.json path
updated. Guard: tests/unit/test-serial-quarantine.test.ts (4 tests).

* test(ci): quarantine combo-health-autopilot too (async logger writes after test end under load)

Fresh evidence from this PR's own CI: all 3 subtests pass but an async log write
lands after the test ends (ENOENT app.log -> uncaughtException) — same
concurrency-flake family. Moved to tests/unit/serial/, imports adjusted,
stryker path updated, guard test now asserts 4 quarantined files.
2026-07-06 10:41:43 -03:00
Diego Rodrigues de Sa e Souza
5d07bdd76f perf(release-green): run the 4 slow suites concurrently — pre-flight wall time ~sum -> ~slowest (#6319)
The pre-flight ran unit (~25-35min) + vitest (~3-8min) + integration (~3-10min)
+ pack-artifact (~15min) SEQUENTIALLY via execFileSync — ~1h wall in the
v3.8.45 release (the dominant cost of Phase 0). They are independent processes
with per-process DATA_DIR isolation, so they now run in a single Promise.all
over an async runAsync() twin of run(): total drops to ~the slowest single
suite (~30min). Each still saves its per-gate log (_artifacts/release-green/)
and reports HARD independently. --quick still skips them; --with-build folds
pack-artifact into the same wave (or runs it alone under --quick).
Guard: tests/unit/validate-release-green.test.ts (13/13).
2026-07-06 08:25:48 -03:00
Diego Rodrigues de Sa e Souza
6c1d597d42 fix(mitm): test suite and CI must never mutate the OS trust store (OMNIROUTE_SKIP_SYSTEM_TRUST) (#6310)
Incident 2026-07-05 on the self-hosted release runner (VM 113): the
integration test 'POST /cert: installs trust when cert exists' exercised the
REAL install path, wrote a 105-byte fake PEM (FakeMITMCertForTestingOnly)
into /usr/local/share/ca-certificates and update-ca-certificates baked the
invalid entry into ca-certificates.crt — breaking ALL system TLS on the VM
(curl error 77, apt cert failures, and the intermittent gzip-corrupted
next-build artifacts that failed 6/9 e2e shards in run 28754447912). Hosted
runners are ephemeral, so the same mutation went unnoticed for months.

- installCert/uninstallCert: skip the OS dispatch under
  OMNIROUTE_SKIP_SYSTEM_TRUST=1 — AFTER the input checks, so the #4546
  environment-skip contract (missing file throws -> structured skip) and the
  already-installed/not-installed early returns are preserved.
- installTproxyCa/uninstallTproxyCa: same guard, only when no run dep is
  injected (DI'd tests keep exercising the full command sequence with mocks).
- tests/_setup/isolateDataDir.ts sets the env for every node:test process;
  ci.yml/quality.yml/nightly-release-green.yml set it workflow-wide (e2e runs
  the real app outside the test setup).

TDD: tests/unit/system-trust-test-guard.test.ts (guard exported to every test
process; guarded install resolves on a real file without touching the OS;
missing-file contract preserved). 82/82 across the affected cert/tproxy/
agent-bridge suites.
2026-07-05 21:40:01 -03:00
Diego Rodrigues de Sa e Souza
6f41775a1c fix(security): 405 method-first for /api/keys/{id}/devices (dast-smoke QUERY check)
Schemathesis's newer unsupported-methods check (unpinned tool drift) sends
QUERY /api/keys/{id}/devices and demands 405 Method Not Allowed; the path had
no HIGH_RISK_METHOD_RULES entry, so the auth layer answered 401 first. Add
the devices rule (GET-only) so undocumented methods get a clean method-first
405 — same pattern as the v3.8.44 TRACE fix. TDD:
tests/unit/dast-method-not-allowed.test.ts gains the devices QUERY case (4/4).
2026-07-05 21:19:43 -03:00
Diego Rodrigues de Sa e Souza
dd12539a2c fix(api): Zod-validate POST /api/github-skills + document new gate envs + pin merge-integrity actions
Three latent heavy-CI reds surfaced by the VPS validation dispatch (the fast
path never runs these gates):

- t06 route-validation: POST /api/github-skills destructured request.json()
  blind — a non-array 'targets' would .map-crash. Now validateBody(zod)
  with defaults preserved (Hard Rule #7). Guard:
  tests/unit/github-skills-route-validation.test.ts (4/4).
- env-doc-sync: document OMNIROUTE_SKIP_SYSTEM_TRUST (#6310) and the
  changelog-integrity gate envs CHANGELOG_BASE_REF/ALLOW_CHANGELOG_REMOVALS
  (#6300) in .env.example + ENVIRONMENT.md.
- zizmor ratchet: the new merge-integrity job's checkout/setup-node uses were
  unpinned (+1 finding, 160 > baseline 159); pinned by SHA -> 158 (< baseline).
2026-07-05 20:04:49 -03:00
Diego Rodrigues de Sa e Souza
5c953d1f51 fix(quality): type the 7 net-new 'as any' casts from #6292 (Lint red on the release tip)
#6292 rewrote/added zero-width-marker tests with 7 new 'as any' result casts,
pushing the file past its frozen suppression (84) — and when violations
exceed the suppressed count ESLint reports ALL of them, so the ci.yml Lint
job went red with 90 errors. The 7 new sites get typed shapes (delta /
arguments / choices / output accessors — same pattern as fecf888fd); the
pre-existing debt stays frozen at the exact new count (83). 50/50 tests
green, file lint-clean under the suppressions baseline.
2026-07-05 18:34:45 -03:00
Diego Rodrigues de Sa e Souza
1ad8b3b637 fix(a2a): finish the #6186 catalog-count update — 3 hardcoded 22s left in production
#6186 added omni-github-skills (API 22 -> 23) and updated computeCoverage's
total, but left the old count hardcoded in the A2A layer: listCapabilities
metadata reported coverage.api.total 22 (type literal + value) and
SkillCoverageSchema pinned z.literal(22) — so the schema would REJECT the
correct runtime value. Aligned all three to 23 + the unit fixtures
(listCapabilities-a2a, agentSkills-schemas, 46/46 with agentSkillTools-mcp).
2026-07-05 17:54:41 -03:00