4426 Commits

Author SHA1 Message Date
Diego Rodrigues de Sa e Souza
8169b97d84 Release v3.8.18 (#3482)
* chore(release): open v3.8.18 development cycle

* fix(catalog): stop Codex CLI model-catalog refresh from erroring (#3481)

Codex's model-catalog refresh (codex_models_manager) does
GET /v1/models?client_version=<v> and decodes a JSON object with a
TOP-LEVEL `models` array. OmniRoute answers in the OpenAI-standard
`{object,data}` shape, so codex fails with "missing field `models`"
and logs "failed to refresh available models" on every startup.

Detect codex clients via the `originator` / `user-agent` = `codex_*`
headers they send and add an EMPTY top-level `models: []` so the decode
succeeds. Non-codex OpenAI clients keep the byte-identical `{object,data}`
response.

The array is intentionally empty: codex replaces its built-in per-model
agent prompt (`base_instructions`, ~21k chars) with whatever a populated
entry carries for the selected model, so emitting our catalog would drop
the agent prompt to nothing and break codex's agent behaviour (verified
empirically against codex 0.137). An empty list keeps codex on its
built-in model info — same inference as before, minus the error.

Validated end-to-end with the real handler against codex 0.137:
"failed to refresh available models" → 0 occurrences, instructions
preserved (built-in Codex agent prompt, not empty).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore: ignore quality reports and local prompt artifacts

Add generated quality gate reports, metrics files, and local setup prompt
artifacts to .gitignore to prevent committing environment-specific or
temporary files.

* fix(provider): detect Responses API format when body has `input` but … (#3490)

Integrated into release/v3.8.18

* fix(sse): normalize numeric provider ids to strings (#3451)

Integrated into release/v3.8.18

* feat(browserPool): resolve Playwright proxy from proxy_registry DB (#3492)

Integrated into release/v3.8.18

* fix(theoldllm): generate X-Request-Token server-side, drop Playwright (#3491)

Integrated into release/v3.8.18

* feat(plugins): add lifecycle hooks and theme-manager plugin (#3473)

Integrated into release/v3.8.18

* fix(combo): parallel pre-screen + circuit-breaker fast-exit for priority combos (#3169)

Integrated into release/v3.8.18

* feat(ui): unifi active and finished requests into single view #1422 (#3401)

Integrated into release/v3.8.18

* docs(changelog): record #3401, #3473, #3492, #3490, #3451, #3491, #3169 under v3.8.18

* feat(docs): add doc accuracy gate + refresh AGENTS.md counts (#3510)

Integrated into release/v3.8.18

* fix(sse): drop empty-choices chunks without usage instead of injecting retry text (#3513)

PR #3422 ('allow OpenAI usage-only empty choices chunks') reintroduced the
assistant-content injection '[OmniRoute] Upstream returned an empty response.
Please retry.' for empty `choices: []` chunks that carry no valid usage. Clients
(Goose/opencode) feed that text back as a turn and spin in a retry loop -- the
exact regression #3400 had fixed by dropping the chunk.

Restore the drop behavior for the no-usage case while preserving #3422's
standards-compliant forwarding of usage-only `include_usage` final chunks.
Realign the mislabeled stream-utils test (it asserted the injection) and add a
dedicated regression guard.

Reported-by: @mochizzan
Refs: #3502, #3388, #3400, #3422

* fix(authz): fall back to URL token when Authorization isn't a usable Bearer (#3504)

Integrated into release/v3.8.18

* fix(playground): authenticate via session, test key policy by id (#3503)

Integrated into release/v3.8.18

* docs(changelog): record #3510, #3504, #3503 under v3.8.18

* fix: llama base url normalization (#3519)

* docs(changelog): reconcile v3.8.18 — add #3519, #3513, #3435-repair, gitignore chore (full commit↔changelog coverage)

* fix(opencode-plugin): bound regex quantifiers in normaliseFreeLabel (polynomial-ReDoS)

CodeQL js/polynomial-redos: unbounded \s* before an anchored \s*$ allowed
O(n²) backtracking on attacker-influenced display names. Bounded to {0,8}/{1,8}
(ample for any real label spacing). Plugin builds + 254 tests green.

* fix(types): restore clean typecheck:core for v3.8.18 release gate

- getPendingRequests() typed to real shape (was widened to object) → fixes
  unknown 'count' in the unified-requests view (#3401)
- streamChunks log payload cast to its declared type (callLogs.ts)
- preScreenTargets aligned to canonical IsModelAvailable signature (#3169),
  Promise.resolve-normalized so .catch never hits a bare boolean

All 5 gates green: lint(0 err) + typecheck:core + cycles + docs-all + unit + vitest(146).

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Andrey Borodulin <borodulin@gmail.com>
Co-authored-by: Dmitrii Safronov <zimniy@cyberbrain.cc>
Co-authored-by: Paijo <14921983+oyi77@users.noreply.github.com>
Co-authored-by: PizzaV <103120356+pizzav-xyz@users.noreply.github.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
Co-authored-by: Felipe Almeman <4226997+zhiru@users.noreply.github.com>
v3.8.18
2026-06-09 15:56:24 -03:00
Nicolas Lorin
50ce13bce6 fix(providerRegistry): update Claude model entries to latest versions (#3521) 2026-06-09 14:29:11 -03:00
diegosouzapw
e1a9c61179 fix(opencode-plugin): remove duplicated blocks + wire missing schema fields (#3435 merge corruption)
PR #3435's branch shipped a corrupted index.ts that never built — the npm
publish-opencode-plugin job failed on DTS errors. Root causes:

- Duplicate apiFormat block (ensureV1Suffix/DEFAULT_ANTHROPIC_PREFIXES/
  resolveApiBlock) — kept the canonical #3420 copy (anthropic url WITHOUT /v1),
  removed the duplicate that wrongly appended /v1 to the Anthropic SDK base.
- Duplicate debug-logging block (DebugLogEntry + debugLog* + createDebugLoggingFetch)
  with mid-file imports — kept the canonical copy using top-of-file imports.
- Local normaliseFreeLabel def superseded by the naming.ts extraction —
  removed it, routed the lone caller to the imported _normaliseFreeLabel.
- sdkBaseURL → resolvedBaseURL (undefined identifier in the auth loader).
- featuresSchema missing startupDebug + logLevel (referenced but never declared).
- shortProviderLabel dropped the prefix on long displayName + no alias; now
  keeps the long label, matching the test intent.

Plugin builds (DTS clean) and all 254 tests pass.
2026-06-09 08:21:57 -03:00
diegosouzapw
2441a4f441 fix(docs): add ACP.md frontmatter and flatten docs/meta.json pages format
fumadocs-mdx requires a YAML title in every .md file and does not support
nested object entries in meta.json pages arrays — both were introduced by
PR #3438 and broke the webpack build.
v3.8.17
2026-06-09 02:48:41 -03:00
Diego Rodrigues de Sa e Souza
6ebc493770 Release v3.8.17
Release v3.8.17
2026-06-09 02:12:29 -03:00
diegosouzapw
259486afb5 chore(release): v3.8.17 — 2026-06-09
CHANGELOG: 8 features, 15 bug fixes, 6 maintenance entries (29 bullets / 32 commits since v3.8.16).
i18n: sync [3.8.17] section to all 41 locale CHANGELOG files.

fix(translator): strip empty reasoning_content on non-tool-call kimi-k2 messages (#3433 regression)
fix(translator): update placeholder assertion for non-empty cache-miss behaviour (test alignment)
fix(executor): lmarena.ts return wrapper shape {response,url,headers,transformedBody} (#3421 regression)
test: align lmarena-provider + tool-request-sanitization to corrected executor contract
2026-06-09 01:51:51 -03:00
Randi
500197846d Add model catalog name feature flag (#3464)
Integrated into release/v3.8.17
2026-06-08 23:58:28 -03:00
diegosouzapw
ee0fdcb6c8 docs(env): document COMMAND_CODE_VERSION override (#3462 follow-up)
#3462 added a process.env.COMMAND_CODE_VERSION read but did not document it,
tripping the env-doc-sync gate on the release branch (PR-merges bypass the
pre-commit check-docs-sync hook). Add the var to .env.example + ENVIRONMENT.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 23:56:43 -03:00
Randi
5c3545b045 Add Endpoint Token Saver visibility setting (#3461)
Integrated into release/v3.8.17
2026-06-08 23:36:26 -03:00
Hevener Ancelmo Pereira
1cc2313a4f fix(command-code): align CLI version header (#3462)
Integrated into release/v3.8.17
2026-06-08 23:35:08 -03:00
Randi
49c11f0cea fix(browser): avoid bundling optional cloakbrowser import (#3460)
Integrated into release/v3.8.17
2026-06-08 23:34:07 -03:00
Diego Rodrigues de Sa e Souza
4f38167964 fix(catalog): surface imported models on no-auth providers in /api/v1/models (#3200) (#3463)
The custom-models loop in getUnifiedModelsResponse gated every model through hasEligibleConnectionForModel(getConnectionsForProvider(...)). no-auth providers (theoldllm, etc.) never create DB connection rows, so that returned [] and the gate dropped every imported/custom model for them — the Playground dropdown showed nothing for imported models while built-in/custom models on auth providers worked. Built-in models survived because they go through providerSupportsModel(), which already has a no-auth bypass (#2798).

The custom-model gate now applies the same no-auth bypass, keeping the eligibility check (with parentProviderType) intact for auth providers.

Co-authored-by: tjengbudi <tjengbudi@users.noreply.github.com>
Co-authored-by: a2belugin <a2belugin@users.noreply.github.com>
2026-06-08 22:53:22 -03:00
Diego Rodrigues de Sa e Souza
ff65652cdf fix(claude): respect client anthropic-beta instead of forcing thinking/effort betas (#3415) (#3458)
Claude Code -> claude-opus-4-8 turns intermittently died with 'tool call could not be parsed (retry also failed)'. OmniRoute's claude identity cloak rebuilt the anthropic-beta header from scratch and unconditionally forced interleaved-thinking-2025-05-14 (+ advanced-tool-use / effort for heavy agents), even when the client never negotiated them. The forced interleaved-thinking conflicts with tool_choice-forced turns, producing malformed opus tool_use streams (and sibling 400 'Thinking may not be enabled when tool_choice forces tool use').

selectBetaFlags now takes the client's inbound anthropic-beta: when present, thinking/effort betas are only emitted if the client requested them. Opaque clients (no header — the OAuth cloak path) keep the full set unchanged, so existing behavior and the #2454 model-tier gating are preserved.

Co-authored-by: Forcerecon <Forcerecon@users.noreply.github.com>
2026-06-08 20:59:38 -03:00
Diego Rodrigues de Sa e Souza
cc850122e3 fix(translator): strip function_call.id for Vertex AI provider (#3440) (#3457)
Vertex AI's FunctionCall/FunctionResponse protos have no id field; emitting it made Vertex reject tool calls with 400 'Unknown name id'. The id is now stripped only when the routed provider is vertex/vertex-partner (threaded via credentials._provider), preserving it for the public Gemini API where Gemini 3+ uses it for signature matching.

Co-authored-by: nullbytef0x <nullbytef0x@users.noreply.github.com>
2026-06-08 20:54:20 -03:00
sdfsdfw2
42887b65b2 feat: add connection pagination, health filter, batch delete confirmation, and custom banned keywords (#3454)
Integrated into release/v3.8.17
2026-06-08 20:41:06 -03:00
Paijo
1a98dfe8ed test(auto-combo): cover same-provider connection identity (#3378)
Integrated into release/v3.8.17
2026-06-08 19:10:40 -03:00
M.M
003e6a80b7 feat(plugin+api): auto combos + free model quota display + /api/combos/auto (#3435)
Integrated into release/v3.8.17
2026-06-08 19:08:17 -03:00
ViFigueiredo
617a648088 fix(translator): use non-empty reasoning_content placeholder on cache miss instead of empty string (#3433)
Integrated into release/v3.8.17
2026-06-08 19:04:36 -03:00
Hernan Javier Ardila Sanchez
1322411343 feat(opencode-plugin): per-prefix API format + debug logging + free-label normaliser (3 mrmm-fork backports) (#3420)
Integrated into release/v3.8.17
2026-06-08 18:51:22 -03:00
Ardem2025
da273d37e2 fix(stream): resolve index mismatch in textual tool-call slicing and deduplicate containsTextualToolCallMarker (#3413)
Integrated into release/v3.8.17
2026-06-08 18:50:53 -03:00
Hernan Javier Ardila Sanchez
dbd70ddd1f fix(catalog): make combos auto-compute context_length for any provider id form (#3417)
Integrated into release/v3.8.17
2026-06-08 18:50:21 -03:00
Xiangzhe
89a76d8c1c fix(stream): allow OpenAI usage-only empty choices chunks (#3422)
Integrated into release/v3.8.17
2026-06-08 18:50:05 -03:00
Paijo
a00366602b docs: close critical documentation gaps (ACP, router strategies, APIs, compression) (#3438)
Integrated into release/v3.8.17
2026-06-08 18:44:48 -03:00
Hernan Javier Ardila Sanchez
96e5ec9269 docs(opencode-plugin): lead with the why — make plugin the recommended path over @omniroute/opencode-provider (#3418)
Integrated into release/v3.8.17
2026-06-08 18:44:30 -03:00
Hernan Javier Ardila Sanchez
858b6742e8 fix(publish): remove onnxruntime CUDA binary from tarball to avoid 413 (#3437)
Integrated into release/v3.8.17
2026-06-08 18:44:13 -03:00
Benjamin
3c98e9f1ef fix: probe container bridge network IP in healthcheck (#3151) (#3434)
Integrated into release/v3.8.17
2026-06-08 18:43:50 -03:00
Paijo
2427df2f2c feat: add Gemini Business provider (Phase 2C of #3368) (#3436)
Integrated into release/v3.8.17
2026-06-08 18:43:30 -03:00
Paijo
07a81c8a40 feat: add LMArena provider (Phase 2A of #3368) (#3421)
Integrated into release/v3.8.17
2026-06-08 18:43:10 -03:00
Paijo
ea0c0d8499 feat: add ZenMux provider (Phase 2B of #3368) (#3429)
Integrated into release/v3.8.17
2026-06-08 18:42:50 -03:00
Nicolas Lorin
23f31faf38 fix claude-web and cleanup (#3449)
Integrated into release/v3.8.17
2026-06-08 18:42:31 -03:00
ReqX
1e4185edac fix(analytics): scope SQL named params per query context (#3446) (#3447)
Integrated into release/v3.8.17
2026-06-08 18:42:12 -03:00
Muhammad Nabil Muyassar Rahman
b3372e46c4 fix(command-code): revert chat endpoint to /alpha/generate and fix model sync discovery (#3432)
Integrated into release/v3.8.17
2026-06-08 18:41:52 -03:00
Dmitrii Safronov
fc437ddecd fix(sse): normalize provider ids to strings (#3427)
Integrated into release/v3.8.17
2026-06-08 18:41:33 -03:00
dependabot[bot]
70c6610fa8 deps: bump electron-builder from 26.14.0 to 26.15.2 in /electron (#3443)
Integrated into release/v3.8.17
2026-06-08 18:40:58 -03:00
dependabot[bot]
d3ff0b3bde deps: bump electron-updater from 6.8.8 to 6.8.9 in /electron (#3442)
Integrated into release/v3.8.17
2026-06-08 18:40:27 -03:00
dependabot[bot]
f01a0b0c6d deps: bump the development group with 4 updates (#3445)
Integrated into release/v3.8.17
2026-06-08 18:40:04 -03:00
dependabot[bot]
de2420a35c deps: bump the production group with 10 updates (#3444)
Integrated into release/v3.8.17
2026-06-08 18:40:00 -03:00
dependabot[bot]
eb8651780d deps: bump electron from 42.3.2 to 42.3.3 in /electron (#3441)
Integrated into release/v3.8.17
2026-06-08 18:39:52 -03:00
diegosouzapw
c0dcdcc12f chore(release): open v3.8.17 development cycle 2026-06-08 16:48:16 -03:00
diegosouzapw
ea9d22beda fix(docker): copy playwright from builder instead of npx fetch in runner-web
npx playwright falls back to a registry download when playwright is absent from
the slim runtime image's node_modules. On GitHub-hosted runners this download
fails with exit 127, breaking both amd64 and arm64 -web image builds.

Fix: COPY playwright and playwright-core from the builder stage and invoke
node node_modules/playwright/cli.js directly — no network access, same version,
and playwright remains available at runtime for web-session providers.
v3.8.16
2026-06-08 16:14:26 -03:00
Diego Rodrigues de Sa e Souza
60fc41f638 Release v3.8.16
Release v3.8.16
2026-06-08 15:14:18 -03:00
diegosouzapw
ac4fd7e078 chore(release): cover missing agentSkills TS-overload fix in CHANGELOG 2026-06-08 15:14:02 -03:00
diegosouzapw
85351bc63d chore(release): finalize v3.8.16 CHANGELOG — 2026-06-08 2026-06-08 14:44:24 -03:00
diegosouzapw
ed3c188881 fix(e2e): use .first() on Close button to avoid strict-mode violation (2 elements) 2026-06-08 13:37:00 -03:00
diegosouzapw
11bd96ec5c fix(e2e): dismiss import-models modal after adding connection (sync-models mock + close) 2026-06-08 13:12:37 -03:00
diegosouzapw
f112bc966f fix(e2e): wait for add-dialog close before clicking Edit (backdrop race) 2026-06-08 12:44:30 -03:00
diegosouzapw
b60839b90c ci(e2e): increase E2E shard timeout 30→45min for slow runners 2026-06-08 11:55:26 -03:00
diegosouzapw
717f56bf93 docs: update Codex CLI profile naming guidance
Update Codex CLI docs and configuration skill to use the v0.137+
profile file naming format: ~/.codex/<name>.config.toml instead of
the deprecated profile- prefix.

Clarify that missing profile files silently fall back to defaults, and
rename the setup workflow heading to match the config-codex-cli skill.
2026-06-08 10:47:04 -03:00
diegosouzapw
3ea416350e fix(tests+ci): update 42→43 skill count, fix E2E artifact path
- Unit/integration tests: update hardcoded 42→43 in 7 test files
  (agentSkillTools-mcp, agentSkills-catalog, agentSkills-generator,
  agent-skills-content, agent-skills-discovery, listCapabilities-a2a)
  to match the 43rd skill (config-codex-cli) added in the previous commit.
- Include CONFIG_SKILL_IDS in integration content test ALL_IDS so
  skills/config-codex-cli/ is no longer "unexpected".
- listCapabilities.ts: change totalSkills from literal 42 to catalog.length
  so it adapts to catalog growth automatically.
- computeCoverage assertions: include config.have in totalSkills check.
- CI: switch E2E artifact from upload-artifact path (ambiguous stripping)
  to explicit tar archive. Fixes "Could not find a production build in
  ./.build/next" — the previous approach's download path was double-nested
  (.build/next/next/...) due to upload-artifact LCA computation. tar -czf
  stores .build/next/... relative to CWD; tar -xzf restores them verbatim.
- Also exclude .build/next/cache from the tar to keep archive lean.
- feat(translator): strip client_metadata in Responses→Chat translation
  (Mistral 422 extra_forbidden fix); add regression test.
2026-06-08 10:41:00 -03:00
diegosouzapw
1012603a1b fix(ci+tests): fix E2E artifact (exclude 558MB standalone/node_modules, cp after download) and update skill count to 43 2026-06-08 10:13:24 -03:00