Commit Graph

4520 Commits

Author SHA1 Message Date
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
b004b2950a ci(security): harden workflows — artipacked persist-credentials + cache-poisoning + SC2086 (#3965) 2026-06-16 08:44:38 -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
diegosouzapw
cf5d64a89d chore(release): open v3.8.27 development cycle 2026-06-16 03:16:03 -03:00
Diego Rodrigues de Sa e Souza
ca1e17f740 test(opencode-plugin): ESM default-export test (#3967)
The plugin became ESM-only when the CJS bundle was dropped to fix the OpenCode loader
(#3883), so tests/scaffold.test.ts's 'CJS default export resolves via require()' test
fails at publish time with 'Cannot find module ../dist/index.cjs' (it only runs in the
npm-publish opencode-plugin job, so the cycle never caught it). Replaced with an ESM
import of the built dist/index.js asserting the same v1 { id, server } shape; dropped the
now-unused createRequire import. omniroute@3.8.26 itself already published fine.
2026-06-16 02:50:40 -03:00
Diego Rodrigues de Sa e Souza
d59cd14391 fix(ci): electron-release publish-npm contents:write (#3966)
The v3.8.25→v3.8.26 #3874 fix bumped npm-publish.yml's publish job to contents:write
(gh release upload for the SBOM). electron-release.yml calls that workflow as a reusable
job (publish-npm) but only granted contents:read — a reusable job cannot request more
than the caller grants, so GitHub rejected the v3.8.26 electron run at startup
(startup_failure). Aligns the caller permission to contents:write.
2026-06-16 02:38:06 -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).
v3.8.26
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
dependabot[bot]
1f87a9589c deps: bump electron from 42.3.3 to 42.4.0 in /electron (#3914)
electron 42.3.3->42.4.0; rebased onto main after #3913 to resolve the electron/package-lock.json conflict. /electron-only, Build green.
2026-06-15 21:16:57 -03:00
dependabot[bot]
f5706a6528 deps: bump electron-builder from 26.15.2 to 26.15.3 in /electron (#3913)
electron-only dependency bump; Build green, reds are pre-existing main-wide (mid-cycle). Verified the PR touches only electron/package*.json.
2026-06-15 21:13:43 -03:00
Diego Rodrigues de Sa e Souza
4066a2ca31 fix(ci): grant contents:write to npm publish job for SBOM attach (#3874)
Post-release v3.8.25 CI hotfix — SBOM attach needs contents:write.
2026-06-15 04:17:19 -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.)
v3.8.25
2026-06-15 03:32:11 -03:00
Diego Rodrigues de Sa e Souza
b4180145e6 Merge release/v3.8.25 into main (#3863)
Code-sync release/v3.8.25 → main: unblocks main Build + Docker Hub (#3864 SUPPLY_CHAIN.md frontmatter) + mimocode per-account proxy (#3837) + trivy-action bump (#3862). i18n CHANGELOG drift left for /generate-release. Dev continues on release/v3.8.25.
2026-06-14 21:31:49 -03:00
dependabot[bot]
36baf77ad5 chore(deps): bump aquasecurity/trivy-action (#3862)
Integrated into release/v3.8.25 — chore(deps): bump aquasecurity/trivy-action 0.28.0→0.36.0 (supply-chain scan action, #3824 workflow).
2026-06-14 21:30:40 -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
e068a63530 fix(docs): add MDX frontmatter to SUPPLY_CHAIN.md (unblocks main Build) (#3864)
Integrated into release/v3.8.25 — fix(docs): SUPPLY_CHAIN.md MDX frontmatter (unblocks main Build + Docker Hub).
2026-06-14 21:17:09 -03:00
Diego Rodrigues de Sa e Souza
9847684f0d chore(release): continue v3.8.25 development cycle after main code-sync
main was fast-forwarded to release/v3.8.25 (#3805); this marker re-opens the
umbrella PR so further v3.8.25 work keeps flowing to main. No version bump —
development continues on the current v3.8.25 line.
2026-06-14 18:14:34 -03:00
Diego Rodrigues de Sa e Souza
78a1fb40a0 Merge release/v3.8.25 into main (#3805)
Code-sync release/v3.8.25 → main: 40 commits (review-prs r1-r3 + Fase 7/8 quality-gates, supply-chain, resilience, injection-guard, CCR IDOR fix). No versioned publish (no tag/npm/Electron) — dev continues on release/v3.8.25.
2026-06-14 18:11:45 -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
c4f2af70f0 ci(quality): install advisory security scanners so Fase 7 gates run (gitleaks/osv/actionlint/zizmor) (#3858)
Integrated into release/v3.8.25 — Fase 7: scanners advisory no CI (gitleaks/osv/actionlint/zizmor).
2026-06-14 18:03:21 -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
aa8fc4157d Fase 8 · Bloco A — supply-chain (provenance, SBOM, Trivy, Scorecard) advisory (#3824)
Integrated into release/v3.8.25 — Fase 8 Bloco A (supply-chain: provenance, SBOM, Trivy, Scorecard) advisory.
2026-06-14 18:02:21 -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
Abhishek Divekar
2670a0a819 docs(ui): clarify routing settings copy for strategy sync + sticky limit (#3843)
Clarifies that the Default Strategy control syncs both new combo defaults and global
account fallback routing, and updates the Round Robin sticky-limit helper text to call
out account-level fallback behavior. Copy-only change to ComboDefaultsTab + en.json.

Integrated into release/v3.8.25.

Co-authored-by: Abhishek Divekar <adivekar@utexas.edu>
2026-06-14 10:32:14 -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
Ramel Tecnologia - Rafa Martins
315ac98b49 fix(i18n): translate missing embeddedServices keys across 37 locales (#3819)
Fills the previously-untranslated embeddedServices / embeddedServicesSubtitle keys
(__MISSING__ placeholders) with proper translations in 37 locale message files,
improving UI key coverage. JSON validated; i18n UI-coverage gate (threshold 65) passes.

Integrated into release/v3.8.25.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
2026-06-14 09:49:52 -03:00
Ramel Tecnologia - Rafa Martins
f2f909bd7f fix(ui): expand request log table height with vertical resize (#3820)
The request log table is given a comfortable minimum height (~10 rows) and is
user-resizable vertically, replacing the previous flex/overflow-hidden constraints that
clipped it short. Pure layout change to the logs page and RequestLoggerV2 card.

Integrated into release/v3.8.25.

Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
2026-06-14 09:45:25 -03:00