Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
5993a58
fix(sse): pause failover dispatch after repeated transient upstream f…
Sep 13, 2026
f7dbfc8
chore(tests): revive 51 vitest files parked behind a closed tracker (…
diegosouzapw Sep 14, 2026
30bf6af
fix(nvidia): fail open when a synced model catalog goes stale (#12849…
diegosouzapw Sep 14, 2026
963d3c4
fix(ci): clear three base-reds on release/v3.8.51 — open-sse typechec…
diegosouzapw Sep 14, 2026
0d13ef4
feat(i18n): 8 new locales — Kannada, Malayalam, Odia, Punjabi, Nepali…
diegosouzapw Sep 14, 2026
8f36211
docs(i18n): sync provider and migration counts in the eight new llm.t…
diegosouzapw Sep 14, 2026
8786c17
fix(ci): clear the orphan base-reds on release/v3.8.51 — the #12867 p…
diegosouzapw Sep 14, 2026
895dda3
fix(ci): clear the base-reds on release/v3.8.51 — doc counts, catalog…
diegosouzapw Sep 14, 2026
5ca724d
fix(api): scope batch bulk-delete to the calling API key (#12969)
diegosouzapw Sep 14, 2026
67cb0ac
fix: chain serial quarantine step in npm test script (fixes #13286) (…
KooshaPari Sep 15, 2026
8bad85f
fix(logging): mask *-api-key headers in request-log pipeline (#13273)…
KooshaPari Sep 15, 2026
65f5131
fix(tests): correct stale Jina catalog prefix in custom-models test (…
KooshaPari Sep 15, 2026
04bea60
fix(backend): prune old backups after health-check-repair snapshots (…
KooshaPari Sep 15, 2026
43b2661
feat(mcp): carry context_length through MCP list_models_catalog proje…
KooshaPari Sep 15, 2026
2a6d058
fix: skip non-chat generation models in Test all models (#13409)
KooshaPari Sep 15, 2026
f938a08
fix(resilience): add CJK quota-exhaustion patterns to 429 classifier …
KooshaPari Sep 15, 2026
fdfa921
fix(backend): eval runner: failed calls no longer score as passed + d…
KooshaPari Sep 15, 2026
76c928d
fix(backend): eval runner opts out of output-style and memory injecti…
KooshaPari Sep 15, 2026
3a186c1
fix(dashboard): send provider in body for mini-playground web search …
KooshaPari Sep 15, 2026
38ce449
fix(providers): de-duplicate agy and antigravity model catalogs (#13410)
KooshaPari Sep 15, 2026
1738beb
fix(memory): merge memory into top-level system field instead of unsh…
KooshaPari Sep 15, 2026
fc111dc
feat(cli): make startup readiness budget configurable (#13369) (#13433)
KooshaPari Sep 15, 2026
222fe43
docs(providers): add Microsoft 365 Copilot (BizChat) provider guide (…
KooshaPari Sep 15, 2026
cce3a95
fix(tests): add DISABLE_IOREG_STRATEGY env var for macOS test compati…
KooshaPari Sep 15, 2026
97ae101
fix(combo): use traceId for call log id to prevent UNIQUE constraint …
KooshaPari Sep 15, 2026
bf66589
fix(auth): check model lockout before returning synthetic noauth conn…
KooshaPari Sep 15, 2026
c46ca1d
fix(compression): preserve instruction blocks from lossy engines (#13…
KooshaPari Sep 15, 2026
56fedf9
fix(compression): preserve polarity words and newlines in ultra heuri…
KooshaPari Sep 15, 2026
d4a1470
fix(compression): run user preservePatterns before built-in patterns …
KooshaPari Sep 15, 2026
918546a
fix(resilience): increase requestQueue.maxWaitMs default from 15s to …
KooshaPari Sep 15, 2026
fb3f298
fix(security): empty whitelist allows through to prevent admin lockou…
KooshaPari Sep 15, 2026
a0d8ad7
fix(antigravity): derive stable session ID from credentials for promp…
KooshaPari Sep 15, 2026
0b358db
fix(backend): guard memory_fts_au trigger with WHEN clause to stop FT…
KooshaPari Sep 15, 2026
d6e62ae
fix(free-tiers): remove obsolete Together $25 signup credit (#12526) …
KooshaPari Sep 15, 2026
cd112e3
chore(deps): pin csv-parse to ^7.0.2 via overrides (#13117) (#13300)
KooshaPari Sep 15, 2026
6a55d0a
chore(deps): bump hono from ^4.12.34 to ^4.13.7 (#13148) (#13301)
KooshaPari Sep 15, 2026
93a398f
chore(deps): pin joi to ^18.2.8 via overrides (#13085) (#13302)
KooshaPari Sep 15, 2026
30b5bf1
fix(guardrails): skip credential redaction for base64 image data URLs…
KooshaPari Sep 15, 2026
1cbb77c
fix(analytics): normalize provider aliases to canonical id in usage_h…
KooshaPari Sep 15, 2026
56ae80a
fix(reasoning): expand deepseek-v4 regex to match v4.1+ and add comma…
KooshaPari Sep 15, 2026
3b5ce24
fix(playground): allow Compare columns to scroll independently (#13532)
KooshaPari Sep 15, 2026
2d1a281
fix(providers): add alwaysReasons metadata for reka-flash-3 (#13531)
KooshaPari Sep 15, 2026
4745fca
fix(zed-hosted): map developer role and Gemini enums for Zed proxy (#…
KooshaPari Sep 15, 2026
3311ad2
fix(docs): document OMNIROUTE_READY_TIMEOUT_MS and allowlist the test…
diegosouzapw Sep 15, 2026
c0f92ec
fix(security): resolve findings from omni-code-sec battery (fix/batch…
diegosouzapw Sep 15, 2026
5d6352f
Merge remote-tracking branch 'origin/release/v3.8.51' into rework/13615
diegosouzapw Sep 15, 2026
fdebb01
feat(flags): add opt-in OPENCODE_TRANSIENT_FAILOVER_BACKOFF flag (def…
diegosouzapw Sep 15, 2026
2811b9a
fix(opencode): make the transient failover pause opt-in, bounded and …
diegosouzapw Sep 15, 2026
3b7603a
refactor(opencode): move the pre-pause body release into opencodeTran…
diegosouzapw Sep 15, 2026
5c1e35b
fix(api): give the #13376 model-test skip a real httpStatus (#13730)
diegosouzapw Sep 15, 2026
f782f3b
chore(skills): regenerate cli-serve after --ready-timeout was added (…
diegosouzapw Sep 15, 2026
9442bde
fix(ci): clear the release/v3.8.51 base-reds on the PR fast path (#13…
dpozimski Sep 15, 2026
d36251c
fix(ci): clear five uncovered base-reds on release/v3.8.51 — auto-com…
diegosouzapw Sep 15, 2026
58f88a8
feat(i18n): 7 new locales — Hausa, Yoruba, Igbo, Amharic, Uzbek, Geor…
diegosouzapw Sep 15, 2026
1d03ba0
fix(api): keep omitted fields on partial updates (#13582)
maxmad64bis Sep 15, 2026
ee3fbaf
fix(proxies): preserve inactive and dead statuses during pool validat…
maxmad64bis Sep 15, 2026
225da11
ci(radar-export): publish on release-branch catalog pushes; daily sch…
diegosouzapw Sep 15, 2026
3af620e
fix(combos): stop dropping live keys and persisting dead ones (#13217)
maxmad64bis Sep 15, 2026
aaf0777
fix(proxies): keep the stored status when a write does not send one (…
maxmad64bis Sep 15, 2026
5cc3362
fix(providers): route Muse Spark 1.3 to the Responses API on OpenCode…
maxmad64bis Sep 15, 2026
ca9254e
fix(opencode): read management token from environment with startup fa…
maxmad64bis Sep 15, 2026
5395618
fix(opencode-plugin-v2): write catalog snapshot atomically via temp f…
maxmad64bis Sep 15, 2026
c0e5b0a
fix(connection-cooldown): skip cooldown for locally rejected token-bu…
maxmad64bis Sep 15, 2026
4c0e45d
fix(models): return 503 with Retry-After when a cold catalog build ex…
maxmad64bis Sep 15, 2026
5a7a3d0
fix(combos): abort combo test probes when the client disconnects (#13…
maxmad64bis Sep 15, 2026
3266d16
fix(call-logs): versioned error_type vocabulary with unknown fail-ope…
maxmad64bis Sep 15, 2026
5169271
fix(call-logs): zod write-point guard for error_type (#13441)
maxmad64bis Sep 15, 2026
831b485
test(batches): rename the two seeded-batch labels that gitleaks repor…
diegosouzapw Sep 15, 2026
cb420db
fix(call-logs): hide search rows without a live provider (#13641)
maxmad64bis Sep 15, 2026
1d17c23
fix(build): stop the client bundle from reaching server-only modules,…
maxmad64bis Sep 15, 2026
215ac43
fix(proxy): keep proxy credentials holding a literal percent (#13605)
maxmad64bis Sep 15, 2026
7cabac4
fix(quota): bound routing caches with shared boundedMap factory (#13280)
maxmad64bis Sep 15, 2026
62cd277
fix(db): persist WAL busy counter across restarts (#13218)
maxmad64bis Sep 15, 2026
104a34c
chore(deps): bump the adm-zip override to ^0.6.1 (#13737)
diegosouzapw Sep 15, 2026
e498c34
fix(security): add Groq, xAI and OpenAI-compatible key shapes to the …
diegosouzapw Sep 15, 2026
b97338a
fix(security): pin the public-only guard on client-supplied image URL…
diegosouzapw Sep 15, 2026
e7f9fec
fix(api): enforce API-key ownership on files and batches — null-owner…
diegosouzapw Sep 15, 2026
c8b24ff
fix(authz): gate the cli-tools status and skills execution routes to …
diegosouzapw Sep 15, 2026
45c54ca
fix(dashboard): require provider free-tier for the Free badge (#13645)
maxmad64bis Sep 15, 2026
b283ed1
fix(api): use shared SOCKS5 flag reader in settings routes (#13646)
maxmad64bis Sep 15, 2026
520428c
fix(resilience): honor user daily-reset clock for non-TPD quota coold…
maxmad64bis Sep 15, 2026
cad0fcc
fix(sse): bound daily quota cooldowns around daylight-saving transiti…
maxmad64bis Sep 15, 2026
ac52d4d
fix(sse): omit synthetic Retry-After and mark retry provenance on dra…
maxmad64bis Sep 15, 2026
6113426
fix(combo): return 502 for non-quota protected-priority stops (#13439)
maxmad64bis Sep 15, 2026
defa0f0
fix(routing): await stale provider-pin clears and gate swallowed erro…
maxmad64bis Sep 15, 2026
53ed8c4
fix(stream-recovery): order-aware in-flight tool-call detection behin…
maxmad64bis Sep 15, 2026
931c9f9
fix(stream-recovery): log recovery traces with continuation attempt (…
maxmad64bis Sep 15, 2026
08fe9e5
fix(usage): skip billing for estimated token usage, bill real output …
maxmad64bis Sep 15, 2026
87d9d82
fix(sse): fail over to sibling connection on stream early EOF (#13153)
maxmad64bis Sep 15, 2026
df87e93
fix(auth): close the JWT_SECRET bootstrap chain — real-peer loopback,…
diegosouzapw Sep 15, 2026
29d66cb
feat(proxies): stop re-serving a proxy that just failed (#13578)
maxmad64bis Sep 15, 2026
238cb1b
feat(proxy-logs): keep the HTTP status the provider actually returned…
maxmad64bis Sep 15, 2026
6922332
feat(proxies): stop re-serving a pool member the provider just refuse…
maxmad64bis Sep 15, 2026
ca312d5
feat(proxies): show how many egress IPs actually served a proxy pool …
maxmad64bis Sep 15, 2026
5cf4316
fix(proxy-health): refused probe responses reset the consecutive-fail…
maxmad64bis Sep 15, 2026
d8c0448
fix(opencode): rotate once when a Responses stream stalls before its …
maxmad64bis Sep 15, 2026
e325888
fix(sse): fail over opencode request on refused-route 403 (#13498)
maxmad64bis Sep 15, 2026
9dacf05
Merge release/v3.8.51 into #13615
diegosouzapw Sep 15, 2026
9b008f1
chore: reconcile #13615 with the release tip (flag counts, stale supp…
diegosouzapw Sep 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
50 changes: 48 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -737,6 +737,12 @@ NEXT_PUBLIC_CLOUD_URL=
ENABLE_SOCKS5_PROXY=true
NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=true

# Opt-in feature flag (default off; a dashboard DB override wins over this value): proxy pools
# and per-account rotation stop re-serving a member that just failed (TCP probe refused, or a
# 429 received through it) for a period that doubles on each repeat, up to a cap. No proxy
# status is written. "true" (or 1, yes) enables it; unset keeps plain selection.
# PROXY_SKIP_RECENTLY_FAILED=false

# Standard proxy variables (lowercase variants also supported).
# HTTP_PROXY=http://127.0.0.1:7890
# HTTPS_PROXY=http://127.0.0.1:7890
Expand Down Expand Up @@ -1140,6 +1146,22 @@ PROVIDER_LIMITS_SYNC_SPACING_MS=1500
# Used by: src/lib/db/core.ts::getWalTruncateIntervalMs().
#OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS=21600000

# Frequent wal_checkpoint(PASSIVE) cadence (ms). Set to 0 to disable. Default: 300000 (5m).
# Used by: src/lib/db/walMaintenance.ts.
#OMNIROUTE_WAL_PASSIVE_INTERVAL_MS=300000

# WAL size (MB) above which a PASSIVE tick escalates to wal_checkpoint(TRUNCATE). Default: 256.
# Used by: src/lib/db/walMaintenance.ts.
#OMNIROUTE_WAL_GUARD_MAX_MB=256

# Minimum rows a cleanup must delete before the post-cleanup VACUUM runs. Default: 1000.
# 0 always vacuums when rows were freed. Used by: src/lib/db/cleanup.ts.
#OMNIROUTE_VACUUM_MIN_DELETED_ROWS=1000

# Explicit path to sql-wasm.wasm for the sql.js fallback adapter. Default: auto-detect.
# Used by: src/lib/db/adapters/sqljsAdapter.ts.
#OMNIROUTE_SQLJS_WASM_PATH=

# Skip the Redis-backed auth cache used by API key lookups (forces DB reads).
# Used by: src/lib/db/apiKeys.ts. Set to 1 to disable. Default: enabled.
#OMNIROUTE_DISABLE_REDIS_AUTH_CACHE=0
Expand Down Expand Up @@ -1670,6 +1692,8 @@ CURSOR_USER_AGENT="Cursor/3.4"
# ── TLS client (wreq-js fingerprint proxy) ──
# TLS_CLIENT_TIMEOUT_MS=600000 # Inherits from FETCH_TIMEOUT_MS by default
# TLS_FIRST_BYTE_WATCHDOG_MS=10000 # #12656: bounds time-to-first-byte on the wreq body (0 disables)
# OPENCODE_RESPONSES_STALL_ROTATION=false # #13484 feature flag (Settings → Feature Flags wins): rotate once when a streamed Responses reply stalls before its first byte
# RESPONSES_FIRST_BYTE_TIMEOUT_MS=15000 # #13484: OpenCode Responses first-byte window, only used when the OPENCODE_RESPONSES_STALL_ROTATION flag is on (0 disables)

# ── API Bridge (/v1 proxy server) ──
# API_BRIDGE_PROXY_TIMEOUT_MS=600000 # Proxy hop timeout (default: 10min)
Expand Down Expand Up @@ -1800,6 +1824,13 @@ APP_LOG_TO_FILE=true
# Override only to hand-tune for a known workload.
# HEAP_PRESSURE_THRESHOLD_MB=

# Exit the process after critical resource pressure persists, so a supervisor
# (systemd Restart=always, Docker restart policy) brings back a clean process.
# Accepts 1/true/yes/on. Default: false. Used by: open-sse/utils/resourcePressure.ts.
# OMNIROUTE_PRESSURE_SELF_RESTART=false
# How long (ms) critical pressure must persist before that exit fires. Default: 120000 (2m).
# OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS=120000

# ── CLI helpers (bin/cli/) ──
# Override UI language for CLI output. Accepts BCP-47 locale (e.g. en, pt-BR).
# Falls back to LC_ALL / LC_MESSAGES / LANG / en if unset.
Expand All @@ -1817,6 +1848,10 @@ APP_LOG_TO_FILE=true
# Per-attempt HTTP timeout for CLI → server calls (milliseconds). Default: 30000.
# OMNIROUTE_HTTP_TIMEOUT_MS=30000

# How long `omniroute serve` waits for the health endpoint before printing the
# readiness-timeout warning (milliseconds). Also --ready-timeout. Default: 60000.
# OMNIROUTE_READY_TIMEOUT_MS=60000

# Set to 1 to print retry/backoff details to stderr during CLI commands.
# OMNIROUTE_VERBOSE=0

Expand Down Expand Up @@ -1962,6 +1997,12 @@ APP_LOG_TO_FILE=true
# Default: 8000 (8 seconds). On timeout, a last-good 200 is served when available.
# CATALOG_BUILD_TIMEOUT_MS=8000

# Age after which a connection's synced model list stops being authoritative for routing (#12849).
# A stale (or never-timestamped) synced catalog fails open to the provider registry.
# Used by: src/lib/db/models/activeSyncedCatalog.ts
# Default: 2592000000 (30 days)
# OMNIROUTE_SYNCED_CATALOG_STALE_AFTER_MS=2592000000

# ── NanoBanana (Image Generation) ──
# Polling config for async image generation jobs.
# Used by: open-sse/handlers/imageGeneration.ts
Expand Down Expand Up @@ -2198,15 +2239,20 @@ APP_LOG_TO_FILE=true
# proxy — only the operator sets active/inactive (a flaky probe must not strand an
# assigned proxy; #6246). Set "true" to restore the legacy test-and-set behaviour.
# PROXY_HEALTH_AUTO_DEACTIVATE=false
# Opt-in feature flag (default off; a dashboard DB override wins over this value): show,
# under a proxy pool in the dashboard, how many observed egress IPs served its members over
# the last 24 h and how many connections used them (read-only, computed from the proxy log,
# never used for routing). "true" (or 1, yes) enables it.
# PROXY_POOL_EGRESS_OBSERVATION=false

# Allow OAuth and provider validation flows to bypass a pinned proxy and connect
# directly when proxy reachability pre-checks fail. Default: false.
# Also configurable from Dashboard > Settings > Feature Flags.
# OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK=false

# Rate limit maximum wait time before failing a request (ms). Default: 15000 (15s)
# Rate limit maximum wait time before failing a request (ms). Default: 30000 (30s)
# Used by: open-sse/services/rateLimitManager.ts
# RATE_LIMIT_MAX_WAIT_MS=15000
# RATE_LIMIT_MAX_WAIT_MS=30000

# Limiter-managed execution backstop (Bottleneck `expiration`): bounds a job's
# post-dispatch execution, never queue wait. Must stay ABOVE upstream
Expand Down
16 changes: 16 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,12 @@ jobs:
- run: npm run check:test-discovery
- run: npm run check:radar-sentinels
- run: npm run check:tracked-artifacts
# A test parked in vitest.config.ts's exclude list does not run, and looks like
# coverage to whoever reads the tree. 62 files accumulated behind a comment pointing
# at #8618 — closed in August while the list grew to 62; 51 of them passed when
# finally measured (#13204). This gate requires every exclusion to name a tracker and
# to appear in config/quality/vitest-exclusions.json, so the debt stays reviewable.
- run: npm run check:vitest-exclusions
# (gap 30) Also lives in quality.yml's PR-only "Merge integrity" job — because the
# CHANGELOG half of that job needs a base to diff against. This half does NOT: the
# generator either reproduces the committed SKILL.md files or it does not.
Expand Down Expand Up @@ -515,6 +521,16 @@ jobs:
env:
BASE_REF: ${{ github.base_ref && format('origin/{0}', github.base_ref) || '' }}
run: node scripts/i18n/check-ui-value-drift.mjs
# Sibling of the drift gate above. That one catches an English value that was
# REWRITTEN; this one catches an English key that was ADDED while some locales never
# got it. The coverage gate at the top of this job cannot: it is a percentage per
# locale, and 11 absent keys out of ~13,000 leaves coverage at 99.9%. Incident: the
# Phase 3 canvas keys were translated across the 42 locales that existed, then the EU
# batch (#13044) took the repo to 51 and the nine newcomers shipped untranslated.
- name: i18n new-key coverage (a new key must reach every locale)
env:
BASE_REF: ${{ github.base_ref && format('origin/{0}', github.base_ref) || '' }}
run: node scripts/i18n/check-new-key-coverage.mjs

# #8038: cheap glossary/protected-terms consistency gate —
# complements i18n-ui-coverage (key parity) and the ICU `i18n` job below
Expand Down
10 changes: 8 additions & 2 deletions .github/workflows/radar-export.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ name: Radar Export
on:
workflow_dispatch: # o operador pode publicar sob demanda (de qualquer ref)
push:
branches: [main] # produção: só o catálogo do main clobra o asset estável
# `main` e a release ativa (default branch) publicam no mesmo asset estável: o
# radar-server só consome o asset, então um merge de catálogo na release que ficasse
# à espera do cron semanal deixava o feed até 7 dias atrás do README (2026-09-14: a
# linha da Together removida em d6e62ae só saiu do feed com dispatch manual).
branches: [main, "release/**"]
paths:
- open-sse/config/freeModelCatalog.data.ts
- open-sse/config/freeModelCatalog.ts
Expand All @@ -19,7 +23,9 @@ on:
- scripts/release/radar-export.mjs
- .github/workflows/radar-export.yml
schedule:
- cron: "17 6 * * 1" # semanal (segunda 06:17 UTC): mantém geradoEm/proveniência frescos
# Diário 03:17 UTC — antes do `radar-feed.timer` do servidor (04:23 UTC), para o ciclo
# do dia já enxergar o export do dia; também mantém geradoEm/proveniência frescos.
- cron: "17 3 * * *"

permissions:
contents: read
Expand Down
Loading
Loading