Commit Graph

1518 Commits

Author SHA1 Message Date
NOXX - Commiter
9cd9ae511e fix(perplexity-web): parse schematized diff_block stream so answers aren't empty (#4001)
Integrated into release/v3.8.27 — schematized diff_block parsing follow-up to #3938.
2026-06-16 10:42:38 -03:00
Randi
bba97cfc60 大量UI显示和i18n优化 (#3973)
Integrated into release/v3.8.27
2026-06-16 09:57:21 -03:00
Randi
09278297ae fix(db): persist backup retention days (#3970)
Integrated into release/v3.8.27
2026-06-16 09:49:04 -03:00
thezukiru
f785521832 fix(qwen-web): cookie validation false-positive - check response body for user object (#3958)
Integrated into release/v3.8.27
2026-06-16 09:47:53 -03:00
Diego Rodrigues de Sa e Souza
3ad2649d62 fix(executor): strip stream_options on non-streaming requests (#3884) (#4000)
Clients that send stream_options:{include_usage:true} regardless of stream (e.g. the OpenAI Python SDK) had it passed through on non-streaming calls; NVIDIA NIM rejected it with 400 'Stream options can only be defined when stream=True'. DefaultExecutor.transformRequest only injected/cleared stream_options on the streaming branch and never stripped a client-sent value when stream=false. Add a !stream strip branch; the streaming injection path is unchanged. Global to openai-compat providers.
2026-06-16 09:47:24 -03:00
WormAlien
2d498c28ae fix(vision-bridge): force bridge for tokenrouter deepseek models (#3946)
Integrated into release/v3.8.27
2026-06-16 09:46:02 -03:00
Felipe Sartori
5714640546 feat(providers): add model search filter to provider dashboard (#3950)
Integrated into release/v3.8.27
2026-06-16 09:44:39 -03:00
Diego Rodrigues de Sa e Souza
23c03b07c7 fix(claude): forward client tool-search-tool anthropic-beta on the Claude OAuth path (#3974) (#3999)
The client-negotiated anthropic-beta: tool-search-tool-2025-10-19 was dropped on both Claude code paths (default executor rebuilt from static ANTHROPIC_BETA_CLAUDE_OAUTH; selectBetaFlags only read the client beta to gate thinking/effort), so claude.ai rejected deferred-tool requests with 400 'Tool reference not found'. Add an allowlist-merge (mergeClientAnthropicBeta) that unions the client's allowlisted betas into the outbound set on both paths, preserving #3415 (no forced thinking/effort).
2026-06-16 09:44:05 -03:00
Randi
18aa874a4f Add provider auth visibility controls (#3953)
Integrated into release/v3.8.27
2026-06-16 09:43:11 -03:00
Diego Rodrigues de Sa e Souza
ef64392e06 fix(combo): shuffle strict-random fallback remainder to spread load (#3959) (#3998)
strict-random shuffled only the deck-selected slot 0 and left the fallback remainder in fixed priority order, so after a failing deck pick the chain always fell through to the same top-priority model — a persistently-failing model was retried on essentially every request and fallback load never spread across peers. Shuffle the remainder too (like the random strategy).
2026-06-16 09:38:31 -03:00
Veier04
57bbd8b9f3 feat(compression): add Indonesian caveman rules and language pack (#3975)
Integrated into release/v3.8.27

(cherry picked from commit c9b5b1a892)
2026-06-16 09:36:37 -03:00
Diego Rodrigues de Sa e Souza
bb40fbba09 fix(dashboard): logs auto-refresh reads live visibility, not a stale mount ref (#3972) (#3997)
The auto-refresh interval gated each tick on visibleRef, seeded once at mount and updated only by a visibilitychange event. A tab mounted while document.visibilityState is 'hidden' (background load, bfcache, embedded/proxied webviews) with no later visibilitychange left the ref false forever, so the interval ticked but never fetched — only the manual button worked. Read the live document.visibilityState in the tick instead.
2026-06-16 09:32:19 -03:00
Diego Rodrigues de Sa e Souza
074f6188de fix(providers): fetch live /models for LLM7 and BytePlus (#3976) (#3996)
llm7 and byteplus carry a real modelsUrl but were not classified by any live-fetch branch of the model-import route, so their hardcoded 4-entry registry catalog was served (source local_catalog) instead of the upstream catalog. Add both to NAMED_OPENAI_STYLE_PROVIDERS so the route probes <baseUrl>/models and serves the live list, falling back to the local catalog only on fetch failure.
2026-06-16 09:24:40 -03:00
Diego Rodrigues de Sa e Souza
314b6f1870 fix(resilience): respect connection cooldown stored as numeric epoch (#3954) (#3995)
rate_limited_until is a TEXT column, but setConnectionRateLimitUntil (Antigravity full-quota path) persists a raw epoch number that SQLite coerces to a numeric string ("1781696905131.0"). The selection predicate isAccountUnavailable then did new Date("1781696905131.0") -> NaN, so the cooling connection was never skipped and the router kept dispatching to rate-limited accounts. Normalize numeric-epoch strings (and number/Date/ISO) via a shared cooldownUntilMs() helper in isAccountUnavailable / getEarliestRateLimitedUntil / filterAvailableAccounts / parseFutureDateMs. ISO behavior preserved.
2026-06-16 09:20:28 -03:00
Diego Rodrigues de Sa e Souza
73205a2427 ci(quality): flip require-tighten + osv + Trivy to blocking (v3.8.27 cycle-end) (#3984) 2026-06-16 09:13:38 -03:00
Randi
2c193636c8 Capture actual upstream provider requests (#3941)
Integrated into release/v3.8.27
2026-06-16 09:12:31 -03:00
Randi
ac0b7add27 Gate control-plane proxy direct fallback (#3963)
Integrated into release/v3.8.27
2026-06-16 09:12:28 -03:00
Randi
b05aea5355 feat: add sidebar group separator toggles (#3971)
Integrated into release/v3.8.27
2026-06-16 09:12:24 -03:00
Randi
7737bfea77 Refine provider quota card display (#3969)
Integrated into release/v3.8.27
2026-06-16 09:12:21 -03:00
Diego Rodrigues de Sa e Souza
a9d73bcbfb fix(security): polynomial ReDoS in comboAgentMiddleware regex (#3982)
* fix(security): eliminate polynomial ReDoS in comboAgentMiddleware <omniModel> regex (CodeQL js/polynomial-redos)

CACHE_TAG_PATTERN wrapped the tag in an unbounded `(?:\\n|\n|\r)*` prefix/suffix.
On an unanchored `.test()`/`.exec()` that is O(n²) on inputs with many newlines
(CodeQL js/polynomial-redos, alerts #612/#613). The surrounding runs are irrelevant
to detecting/capturing the tag, so the detection pattern now matches only the core
`<omniModel>([^<]+)</omniModel>`; the global strip pattern still consumes the
wrapping newlines (combo.ts streaming, #531) but BOUNDED ({0,16}) so it stays linear.

Behavior preserved: detection, model extraction, multi-tag stripping (#454) and
blank-line cleanup all unchanged (107 related tests green). Adds ReDoS-safety
regression tests (50k-newline inputs complete in <1ms).

* docs(changelog): add #3982 ReDoS fix to [3.8.27]
2026-06-16 08:42:58 -03:00
Diego Rodrigues de Sa e Souza
4d21044ba5 fix(release): post-merge quality gates to main for v3.8.26 (#3964)
Cherry-picks #3961 + #3962 from release/v3.8.26 to main (parity before tagging).
2026-06-16 02:33:19 -03:00
Diego Rodrigues de Sa e Souza
81a37b67ed Release v3.8.26 (#3875)
OmniRoute v3.8.26 — see CHANGELOG.md [3.8.26] for the full notes.

Highlights: Vertex AI media generation (#3929), GLM-5.2 effort-tier routing (#3885),
sticky round-robin combos (#3846), OpenRouter connection presets (#3878), compression
prompt-cache fix (#3936/#3890), and a security pass (form-data/vite + workflow hardening, #3949).

Co-authored-by: artickc <artickc@users.noreply.github.com>
Co-authored-by: rdself <rdself@users.noreply.github.com>
Co-authored-by: herjarsa <herjarsa@users.noreply.github.com>
Co-authored-by: Jack Smith <16862258+YunyunZhai@users.noreply.github.com>
Co-authored-by: dhaern <dhaern@users.noreply.github.com>
Co-authored-by: adivekar-utexas <adivekar-utexas@users.noreply.github.com>
Co-authored-by: megamen32 <megamen32@users.noreply.github.com>
Co-authored-by: zhiru <zhiru@users.noreply.github.com>
Co-authored-by: insoln <insoln@users.noreply.github.com>
Co-authored-by: diego-anselmo <diego-anselmo@users.noreply.github.com>
2026-06-16 01:00:40 -03:00
Diego Rodrigues de Sa e Souza
35dbf0eea1 Release v3.8.25 (#3866)
* chore(release): continue v3.8.25 development cycle after main code-sync (r5)

main fast-forwarded to release/v3.8.25 (#3863): unblocked Build+Docker via
#3864, plus #3837 (mimocode proxy) and #3862 (trivy bump). This marker
re-opens the umbrella PR for further v3.8.25 work. No version bump.

* fix(db): persist the Keep-latest-backups retention setting (#3834) (#3867)

* fix(oauth): clear GitLab Duo setup message instead of 500 (#3861) (#3868)

* test(oauth): prove refresh_token preserved on real gemini-cli/antigravity dispatch (#3850) (#3869)

* feat(compression-ui): unified compression config UI — per-engine pages + combos editor + menu + WS default-on (#3860)

Integrated into release/v3.8.25 — feat(compression-ui): unified compression configuration UI (Compression Hub + per-engine Lite/Aggressive/Ultra pages + combos editor + sidebar entry + live-WS default-on). File-size re-baselined for sidebarVisibility.ts/chatCore.ts growth; orphan ws test relocated to a collected path.

* docs(changelog): complete the v3.8.25 release notes + credit all contributors

Audited every commit since v3.8.24 and filled the gaps the [3.8.25] section
was missing: a New Features section (compression engines + Compression Studios
#3848, compression UI #3860, injection-guard #3857, kiro discovery #3836, Veo
#3839, mimocode proxy #3837, Arena ELO flag #3821), 9 more Fixed entries
(#3811/#3807/#3759/#3849/#3838/#3835/#3814/#3820/#3819), a Security section
(CCR IDOR #3859, supply-chain #3824), and an Internal/Quality section. Every
contributor and issue reporter is now credited.

* docs(changelog): restore + complete the v3.8.25 release notes

Re-adds CHANGELOG.md (a prior server-side commit accidentally dropped it) with
the complete, audited [3.8.25] section: New Features, the full Fixed list,
Security & Hardening, and Internal/Quality — every contributor and issue
reporter credited.

* chore(release): finalize v3.8.25 — reconcile CHANGELOG + i18n mirrors, document OMNIROUTE_MAX_PENDING_MIGRATIONS, green the unit suite

Release-gate reconciliation for v3.8.25:
- CHANGELOG: dated 2026-06-14, linked #3826, rolled up file-size re-baselines (#3823/#3833),
  recorded the test-greening; re-synced all 41 i18n CHANGELOG mirrors.
- Documented OMNIROUTE_MAX_PENDING_MIGRATIONS (#3416) in .env.example + ENVIRONMENT.md.
- Greened the unit suite (was merged red on 4 CI shards): aligned 10 stale tests to this
  cycle's intended behavior (#3838/#3822/#3501/SOCKS5/Vertex-Express/Antigravity) and the
  same-provider 503 fall-through test; de-flaked the compression benchmark reproducibility
  and ServiceSupervisor crash tests. No production code changed.

* ci(security): clear OpenSSF Scorecard code-scanning noise + harden workflow token permissions

The Security tab held 155 open alerts, ALL from the advisory OpenSSF Scorecard tool
(#3824) — supply-chain/posture scores, not code vulnerabilities — which drowned out
real CodeQL findings.

- scorecard.yml: stop uploading SARIF to the code-scanning tab (drop the upload-sarif
  step + the now-unused security-events: write). The run still produces the OpenSSF
  badge (publish_results) and a downloadable SARIF artifact.
- TokenPermissions hardening (the high-severity, genuinely-valuable subset): set each
  workflow's top-level token to read-only and grant the exact writes at the job level
  that needs them — npm-publish (id-token/packages on publish jobs), docker-publish
  (packages on build), electron-release (contents on build/release, id-token/packages
  on publish-npm), build-fork (packages on build), claude (empty top-level; job grants
  its own). The 155 existing alerts were dismissed.

Not adopting repo-wide SHA-pinning (143 PinnedDependencies advisories) — declined.

* test(integration): align stale wiring/socks5 integration tests to this cycle's behavior

These were red on the CI Integration job (pre-existing). No production code changed:
- integration-wiring: the combos page no longer renders a per-page EmailPrivacyToggle
  (#3822 consolidated it into Settings → Appearance); the provider-detail test-result
  masking and upstream-proxy copy moved to decomposed components (#3501
  BatchTestResultsModal / UpstreamProxyCard) — assertions now read the owning files.
- api-routes-critical: SOCKS5 is now enabled by default (opt-out), so the disabled-
  rejection test must set ENABLE_SOCKS5_PROXY=false explicitly (an unset env now means
  enabled).

(The ~32 live-Gemini integration tests are gated on OMNIROUTE_API_KEY and skip in CI;
they only 'fail' locally when that key is present without a running server.)
2026-06-15 03:32:11 -03:00
PizzaV
f42e8fa751 feat(mimocode): per-account proxy support for multi-account round-robin (#3837)
Integrated into release/v3.8.25 — feat(mimocode): per-account proxy for multi-account round-robin (runWithProxyContext per account, keyed by fingerprint). Orphan test relocated to a collected vitest path (14/14 green).
2026-06-14 21:30:02 -03:00
Diego Rodrigues de Sa e Souza
337cd18932 fix(sse): clamp Gemini thinking budget to model cap (#3842) (#3865) 2026-06-14 21:27:25 -03:00
Diego Rodrigues de Sa e Souza
cbb332d355 Fase 7 finalize — 3 catracas advisory→bloqueante + re-baseline consciente v3.8.25 (#3809)
Integrated into release/v3.8.25 — Fase 7 finalize: 3 catracas advisory→bloqueante (dead-code/cognitive-complexity/type-coverage) + re-baseline consciente.
2026-06-14 18:06:56 -03:00
Diego Rodrigues de Sa e Souza
931afe3482 Fase 8 · Bloco B — suíte de correção (property + golden + SSE-correctness) (#3808)
Integrated into release/v3.8.25 — Fase 8 Bloco B (property + golden + SSE-correctness).
2026-06-14 18:02:51 -03:00
Diego Rodrigues de Sa e Souza
cf5898205a fix(security): CCR cross-tenant IDOR — scope store per-principal + bound memory (#3859)
Integrated into release/v3.8.25 — fix(security): CCR cross-tenant IDOR (scope store per-principal + bound memory).
2026-06-14 18:02:36 -03:00
Diego Rodrigues de Sa e Souza
d728bfbb1e Fase 8 · Bloco D — injection-guard em todas as rotas LLM + red-team (#3857)
Integrated into release/v3.8.25 — Fase 8 Bloco D (injection-guard em todas as rotas LLM + red-team).
2026-06-14 18:02:18 -03:00
Diego Rodrigues de Sa e Souza
d3146a1751 Fase 8 · Bloco C — resiliência runtime (chaos + heap-growth + k6 soak) (#3854)
Integrated into release/v3.8.25 — Fase 8 Bloco C (resilience: chaos + heap-growth + k6 soak).
2026-06-14 18:02:08 -03:00
Diego Rodrigues de Sa e Souza
4ffc55cfe4 feat(compression): compression engines + async pipeline + Compression Studios (#3848)
Integrated into release/v3.8.25.
2026-06-14 10:45:22 -03:00
Diego Rodrigues de Sa e Souza
c8b9544d54 test(proxy): guard per-connection direct bypass over global proxy (#2996) (#3853) 2026-06-14 10:33:22 -03:00
Diego Rodrigues de Sa e Souza
7c080941d1 feat(connections): per-connection disable-cooldown opt-out (#2997) (#3852) 2026-06-14 10:32:26 -03:00
NOXX - Commiter
948cf1f92c feat(kiro): live per-account model discovery via ListAvailableModels (#3836)
Kiro's catalog is per-account / per-tier (and admin-curated for IAM Identity Center
orgs), which the static registry can't reflect. The models route now discovers the
live list from the CodeWhisperer ListAvailableModels API with the stored OAuth token
(Builder ID / social and IdC accounts; profileArn only as a retry to avoid 403,
region-matched with us-east-1 fallback), falling back to the static registry catalog
when the token is missing/expired or the upstream is unavailable so import never breaks.

Integrated into release/v3.8.25.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
2026-06-14 10:30:32 -03:00
NOXX - Commiter
ed0638c0f1 feat(gemini/vertex): surface Veo video models in dynamic discovery (#3839)
Gemini / Vertex / Vertex AI Express already discover their catalog dynamically from
v1beta/models, but video (Veo) models use predictLongRunning, which was not mapped —
so they never surfaced. parseGeminiModelsList now recognizes predictLongRunning and
exposes Veo video models alongside chat/image/embedding/audio.

Integrated into release/v3.8.25.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
2026-06-14 10:28:48 -03:00
Abhishek Divekar
2a26fea530 fix(quota): surface OpenCode Go missing-quota-API as a latched diagnostic (#3838)
Diagnostic mitigation: OpenCode Go has no public quota API today (the configured
endpoints return 404 / Z.ai 401). The fetcher now logs a single latched (per-process)
404 warning pointing at the upstream tracking issues, caches the "endpoint unavailable"
result for 5 minutes to avoid hammering, and fails open. The dashboard messaging is
clarified with the OMNIROUTE_OPENCODE_GO_QUOTA_URL override hint.

Integrated into release/v3.8.25.

Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>
2026-06-14 10:27:39 -03:00
lukmanc405
058946bd04 fix(models): don't auto-hide transient (rate-limited/timeout) failures on Test All (#3849)
With Auto-hide failed models on (default), a Test All sweep across 10+ models in
parallel reliably trips per-account rate limits on subscription-tier providers, and
the 429'd/timed-out models were auto-hidden — silently removing working models from
/v1/models with no easy recovery. evaluateTestAllEntry now surfaces transient failures
(rateLimited/isTimeout) as an 'error' icon but keeps them visible; only genuine
(non-transient) failures are still auto-hidden.

Integrated into release/v3.8.25.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
2026-06-14 10:25:55 -03:00
NOXX - Commiter
bcb7ed00c7 fix(pricing): add missing Kiro model pricing rows (#3835)
The kiro table in DEFAULT_PRICING was missing models the Kiro registry serves
(most visibly claude-sonnet-4.6), so getPricingForModel() returned null and their
usage cost was reported as $0.00. Adds the missing rows.

Integrated into release/v3.8.25.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
2026-06-14 10:24:24 -03:00
Tubagus
5ace548bc5 fix(combo): return replay response in round-robin streaming path (#3811)
A round-robin combo serving a streaming response returned a 500
(TypeError: ReadableStream is locked). validateResponseQuality() peeks streaming
bodies via getReader(), which locks result.body and returns an unlocked replay in
quality.clonedResponse. The priority strategy already returns
`quality.clonedResponse ?? result`, but the round-robin success path returned the
locked original. This mirrors the priority strategy so the body pipes downstream.

Added a regression test (#3811) that fails (body locked) without the fix.

Integrated into release/v3.8.25.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
2026-06-14 09:42:59 -03:00
Diego Rodrigues de Sa e Souza
70319eb831 fix(combo): sessionless combo stickiness + reasoning-aware readiness (#3825) (#3847) 2026-06-14 09:04:28 -03:00
Randi
31e4e46ef9 Expose Arena ELO sync in feature flags (#3821)
Adds ARENA_ELO_SYNC_ENABLED to the Dashboard Feature Flags registry (DB-overridable),
routes Arena ELO startup/status checks through the shared feature-flag resolver while
preserving the existing env fallback, and refreshes env docs (adds the missing
STREAM_READINESS_TIMEOUT_MS example) so env/doc sync stays green.

Integrated into release/v3.8.25.

Co-authored-by: R.D. <rogerproself@gmail.com>
2026-06-14 08:45:02 -03:00
Randi
ebf06b5e6c fix(reasoning): map max effort to xhigh by default (#3826)
Reuse the xhigh opt-out policy for OpenAI-compatible `max` normalization: non-Claude
providers map `max` to `xhigh` unless the target model explicitly opts out (DeepSeek
via OpenRouter supports xhigh), downgrading to `high` only on explicit opt-outs.
Resolves common Claude aliases (anthropic/claude-opus-4.6, anthropic.claude-opus-4-6,
short/dated/-thinking variants) back to the canonical Claude xhigh-support list, and
keeps literal `max` pass-through for native Claude/CC providers that support it. Also
moves the mistral/github reasoning-effort rejection ahead of normalization (it was
previously dead code for `max`). Includes the v3.8.25 release file-size re-baseline.

Integrated into release/v3.8.25.

Co-authored-by: R.D. <rogerproself@gmail.com>
2026-06-14 08:43:45 -03:00
Diego Rodrigues de Sa e Souza
e2d171c63e test(combo): cover skipProviderBreaker consumer gate (#2743 gap d) (#3832) 2026-06-14 02:07:10 -03:00
Diego Rodrigues de Sa e Souza
5875c7993f fix(providers): surface real Devin error + fix Windsurf auth instructions (#3324) (#3829) 2026-06-14 02:05:22 -03:00
Diego Rodrigues de Sa e Souza
c9e24ae48c fix(grok-web): clearer 403 message for anti-bot/IP-reputation blocks (#3474) (#3830) 2026-06-14 02:04:12 -03:00
Diego Rodrigues de Sa e Souza
3e79d92744 fix(db): env-overridable mass-pending-migrations threshold (#3416) (#3827) 2026-06-14 02:02:56 -03:00
Diego Rodrigues de Sa e Souza
01c8f2d3dd test(proxy): cover Vercel-relay proxyFetch path (#2743 gap c) (#3831) 2026-06-14 02:02:30 -03:00
Diego Rodrigues de Sa e Souza
c29e83a0ba fix(cli): surface 'omniroute runtime repair' in native-module errors (#3476) (#3828) 2026-06-14 02:02:02 -03:00
Diego Rodrigues de Sa e Souza
5b71b05a5e fix(antigravity): per-request Pro-family upstream-id fallback chain (#3786) (#3818)
* fix(antigravity): per-request Pro-family upstream-id fallback chain (#3786)

* chore(quality): re-baseline file-size for antigravity.ts growth (#3786)
2026-06-14 01:40:35 -03:00
Diego Rodrigues de Sa e Souza
826c533a59 fix(sse): retry once on STREAM_EARLY_EOF for single-model requests (#3758) (#3817) 2026-06-14 01:39:05 -03:00