Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
162 commits
Select commit Hold shift + click to select a range
39349da
fix(install): add pnpm-workspace.yaml allowBuilds + pnpm.json for pnp…
chirag127 Jul 2, 2026
be420af
chore(release): open v3.8.44 development cycle
diegosouzapw Jul 2, 2026
dfbc89f
test(security): parse Kimi Web URL host instead of substring match (C…
diegosouzapw Jul 2, 2026
2e75ed2
refactor(translator): extract thinking-budget fitting from openai-to-…
diegosouzapw Jul 2, 2026
a8d1e7b
chore(release): pipeline hardening — test-masking pre-flight gate + c…
diegosouzapw Jul 2, 2026
0d6add1
refactor(translator): split openai-responses request translator into …
diegosouzapw Jul 2, 2026
16ccd5f
chore(ci): pr-evidence FAIL output tells you to push (body edit does …
diegosouzapw Jul 2, 2026
9ba79c7
fix(providers): Perplexity Web emits real tool_calls in streaming mod…
diegosouzapw Jul 2, 2026
cd81b2a
fix(discovery): resolve duplicate /v1 paths and redirect aborts (#5904)
hamsa0x7 Jul 2, 2026
f199e40
docs(changelog): record #5926 + #5944 (release-pipeline hardening) un…
diegosouzapw Jul 2, 2026
283a501
docs(claude): add Hard Rule #22 — cross-session safety (git stash + i…
diegosouzapw Jul 2, 2026
b6249dd
refactor(translator): extract pure helpers from response/openai-respo…
diegosouzapw Jul 2, 2026
26dc500
docs(compression): document upstream sync policy for RTK/Caveman engi…
diegosouzapw Jul 2, 2026
058cfd4
fix(sse): strip ANSI/VT100 codes from gemini-cli stream frames (#5934)
diegosouzapw Jul 2, 2026
18cf641
fix(translator): strict Anthropic content-block compliance in antigra…
diegosouzapw Jul 2, 2026
70a70e6
fix(mcp): auto-recover stale streamable HTTP sessions on initialize (…
Chewji9875 Jul 2, 2026
11a22bb
fix(providers): validate v0 Platform API keys via chats endpoint (#5954)
Jul 2, 2026
b2f77f3
fix(api): relax provider-scoped chat completion validation (#5907)
nickwizard Jul 2, 2026
ad9a859
fix(providers): strip /v1 unconditionally to avoid /v1/v1/models fetc…
anki1kr Jul 2, 2026
476968e
fix(resilience): per-window is_exhausted + honor quota-exhaustion pre…
diegosouzapw Jul 2, 2026
8d2df91
fix(resilience): honor active codex session affinity over per-request…
diegosouzapw Jul 2, 2026
2b0da37
fix(thinking): only inject redacted_thinking replay block when tool_u…
diegosouzapw Jul 2, 2026
26fd7b6
feat(providers): add ClinePass API-key provider (#5942)
diegosouzapw Jul 2, 2026
01d2e1a
feat(api): add /v1/ocr endpoint (Mistral OCR) + Mistral moderation (#…
diegosouzapw Jul 2, 2026
61bba3e
fix(codex): convert chat json schema to responses text format (#5933)
yusufrahadika Jul 2, 2026
4f157e9
feat(providers): add Claude Sonnet 5 support across the model pipelin…
ggiak Jul 2, 2026
b56a94c
feat(relay): gate bifrost auto routing by provider manifest (#5870)
KooshaPari Jul 2, 2026
717069a
refactor(translator): extract pure message helpers from openai-to-kir…
diegosouzapw Jul 2, 2026
4eaa2f4
refactor(executors): extract pure prompt + composer helpers from curs…
diegosouzapw Jul 2, 2026
81d640d
refactor(executors): extract pure SSE-collect parsing from antigravit…
diegosouzapw Jul 2, 2026
273e749
refactor(executors): extract pure model maps + resolvers from chatgpt…
diegosouzapw Jul 2, 2026
cc570cb
refactor(executors): decompose grok-web into pure tool/markup leaves …
diegosouzapw Jul 2, 2026
edb01b9
refactor(executors): extract pure quota parsing from codex (#5999)
diegosouzapw Jul 2, 2026
17d8cb9
refactor(executors): extract pure stream formatters from deepseek-web…
diegosouzapw Jul 2, 2026
4e69185
refactor(api): add validatedJsonBody helper (salvage #5075) (#5931)
diegosouzapw Jul 2, 2026
a3e6868
feat(qoder): drive PAT auth via qodercli, add dashboard quota, fix co…
AgentKiller45 Jul 2, 2026
501d4b2
fix(providers): minimax-m3 supportsVision (LEDGER-4) + stryker tap.te…
diegosouzapw Jul 2, 2026
de3fbd5
fix(registry): flag cline-pass/minimax-m3 as multimodal (supportsVisi…
diegosouzapw Jul 2, 2026
1a73dd2
refactor(executors): extract pure payload construction from claude-we…
diegosouzapw Jul 2, 2026
3a3d618
refactor(executors): extract pure upstream-header helpers from base (…
diegosouzapw Jul 2, 2026
7bcd750
refactor(executors): extract pure wire protocol from perplexity-web (…
diegosouzapw Jul 3, 2026
fa51354
refactor(executors): extract pure URL normalizers from default (#6015)
diegosouzapw Jul 3, 2026
babfa7b
feat(webfetch): support self-hosted FireCrawl instances (#5793)
diegosouzapw Jul 3, 2026
9e5d2d1
feat(xai): register XaiExecutor with reasoning-effort suffix parsing …
diegosouzapw Jul 3, 2026
0965c54
feat(discovery): Phase 2 — reporter, /api/discovery/* routes (strict …
diegosouzapw Jul 3, 2026
a49d34b
feat(providers): custom icon URL for compatible provider nodes (#5815)
diegosouzapw Jul 3, 2026
cbd08ef
feat(api): add /v1/audio/translations endpoint (#5809)
diegosouzapw Jul 3, 2026
f7dea02
feat(dashboard): wildcard-CORS runtime warning + CORS security doc (#…
diegosouzapw Jul 3, 2026
20a67d4
refactor(executors): extract pure JSONL stream translation from huggi…
diegosouzapw Jul 3, 2026
0c3498e
refactor(executors): extract pure Meta AI response parser from muse-s…
diegosouzapw Jul 3, 2026
2ce64e8
refactor(executors): extract pure EventStream framing from kiro (#6018)
diegosouzapw Jul 3, 2026
6756fa8
refactor(executors): extract challenge solver from duckduckgo-web (#6…
diegosouzapw Jul 3, 2026
cfa3686
test(cli): deflake setup-claude.test.ts — silence console to stop std…
diegosouzapw Jul 3, 2026
08b5e08
fix(cli): stabilize setup-claude.test.ts flake — inject dry-run log s…
diegosouzapw Jul 3, 2026
25783d1
refactor(executors): extract reasoning-effort (base) + tool-normaliza…
diegosouzapw Jul 3, 2026
3b512f4
test(ci): move orphaned executor tests to top-level so a runner colle…
diegosouzapw Jul 3, 2026
31e80a9
test(cli): deflake cli-setup-opencode.test.ts — silence console (#595…
diegosouzapw Jul 3, 2026
4b8056b
feat(agy): support Google Cloud project ID settings (#5905)
nickwizard Jul 3, 2026
bff75cb
feat(proxy): add Webshare proxy pool import and sync (#5993)
diegosouzapw Jul 3, 2026
b6a11f0
feat(api-keys): add per-key device/connection tracking (#5998)
diegosouzapw Jul 3, 2026
5d3f85f
fix(providers): only apply openai-family model inference fallback whe…
diegosouzapw Jul 3, 2026
1640b8c
fix(cc-compatible): send SSE accept for streamed requests (#5958)
rdself Jul 3, 2026
1264d1f
fix: deepseek-web reliability — auto-refresh on 401/403, refresh v2.0…
backryun Jul 3, 2026
b253d8a
feat(providers): support Vercel AI Gateway embeddings and images (#5968)
diegosouzapw Jul 3, 2026
c9ac305
feat(cli-tools): add Crush CLI tool to the dashboard (#5970)
diegosouzapw Jul 3, 2026
9838acc
feat(dashboard): suggest HuggingFace Hub media models (#5990)
diegosouzapw Jul 3, 2026
aac5ebc
feat(dashboard): collapse and sort provider quota rows by remaining (…
diegosouzapw Jul 3, 2026
a4872ce
feat(providers): refresh The Old LLM (Free) model catalog (#5181)
diegosouzapw Jul 3, 2026
cbe2ec1
feat(dashboard): add tool-source diagnostics settings toggle (#5978)
diegosouzapw Jul 3, 2026
cd10a6f
feat(oauth): import Codex connection from a raw ChatGPT access token …
diegosouzapw Jul 3, 2026
85a7be9
fix(resilience): parse Retry-After from 429 JSON body for cooldown (#…
diegosouzapw Jul 3, 2026
e6e6d36
fix(embeddings): forward connection-level proxy to embedding requests…
diegosouzapw Jul 3, 2026
08acf86
fix(api): guard shared API client against non-JSON error responses (#…
diegosouzapw Jul 3, 2026
ff64c9e
feat(dashboard): surface Codex banked reset credits per account (#5199)
diegosouzapw Jul 3, 2026
ef7b4fe
feat(providers): add NVIDIA NIM image generation (#5971)
diegosouzapw Jul 3, 2026
196375b
feat(providers): add Augment (Auggie CLI) local provider (#5972)
diegosouzapw Jul 3, 2026
7aaf109
feat(providers): add ModelScope OpenAI-compatible provider (#5965)
diegosouzapw Jul 3, 2026
a518ce8
feat(providers): add Qiniu OpenAI-compatible provider (#5966)
diegosouzapw Jul 3, 2026
70dd5df
feat(providers): add b.ai OpenAI-compatible provider (#5969)
diegosouzapw Jul 3, 2026
50f7705
feat(providers): add Nube.sh OpenAI-compatible provider (#5936)
diegosouzapw Jul 3, 2026
7658a7d
feat(providers): add Charm Hyper OpenAI-compatible provider (#5961)
diegosouzapw Jul 3, 2026
f984bef
feat(providers): add SumoPod and X5Lab OpenAI-compatible providers (#…
diegosouzapw Jul 3, 2026
4e16a49
feat(server): support reverse-proxy basePath deployment (#5992)
diegosouzapw Jul 3, 2026
373dd17
refactor(combo): extract buildTargetTimeoutRunner from handleComboCha…
diegosouzapw Jul 3, 2026
1bd4b02
feat(cli-tools): add CodeWhale CLI tool (#5996)
diegosouzapw Jul 3, 2026
c9032e4
feat(i18n): auto-detect browser language on first visit (#5979)
diegosouzapw Jul 3, 2026
e34d1a4
fix(dashboard): render Update-now API errors as text, not the raw env…
diegosouzapw Jul 3, 2026
6bce788
feat(api): expose provider plugin manifest (#6001)
KooshaPari Jul 3, 2026
96c04f7
feat(providers): add CN sign-up geo-restriction notices for SenseNova…
diegosouzapw Jul 3, 2026
0c2b057
feat(sidecar): advertise provider manifest url (#6007)
KooshaPari Jul 3, 2026
72ee806
feat(autoCombo): latency/speed-optimized routing mode + omniroute_pic…
KooshaPari Jul 3, 2026
9521864
Merge PR #6037: refresh The Old LLM (Free) model catalog (#5181)
diegosouzapw Jul 3, 2026
4f1803a
Merge PR #6038: surface Codex banked reset credits per account (#5199)
diegosouzapw Jul 3, 2026
29fc4a7
Merge PR #6045: CN sign-up geo-restriction notices for SenseNova & St…
diegosouzapw Jul 3, 2026
83f67c8
docs(changelog): restore #5181/#5199/#5462 feature bullets eaten by m…
diegosouzapw Jul 3, 2026
0e98534
feat(usage): on-demand period-scoped usage-data reset (re-cut onto re…
diegosouzapw Jul 3, 2026
204bd7f
chore(quality): rebaseline eslintWarnings 4199->4256 + cognitiveCompl…
diegosouzapw Jul 3, 2026
6a04114
feat(claude-code): opt-in auto-permission classifier compat mode (re-…
diegosouzapw Jul 3, 2026
e12bbd3
feat(providers): client-identity header profiles for compatible nodes…
diegosouzapw Jul 3, 2026
8fb0206
docs(openapi): document 9 newly-added routes to restore coverage ratc…
diegosouzapw Jul 3, 2026
d6dc869
refactor(sse): decompose handleComboChat auto-strategy region (Block …
diegosouzapw Jul 3, 2026
65602b5
fix(ci): release-green base-reds — #5695 test regex + file-size rebas…
diegosouzapw Jul 3, 2026
90aca8b
fix(translator): wrap Kiro system prompt in <system-reminder> (port f…
diegosouzapw Jul 3, 2026
f496738
fix(translator): strip multipleOf from antigravity/gemini tool schema…
diegosouzapw Jul 3, 2026
8d0ed4f
fix(kimi-web, qwen-web): align model catalog with live /models + map …
janeza2 Jul 3, 2026
5d902e5
feat(minimax): extract M3 <think> to reasoning_content on OpenAI-form…
KooshaPari Jul 3, 2026
772fea3
fix: unwrap Cline response envelope (#6046)
KooshaPari Jul 3, 2026
4573684
refactor(sse): extract applyStrategyOrdering leaf from handleComboCha…
diegosouzapw Jul 3, 2026
5fe2258
fix(combo): fallback to sibling model on 500 for per-model-quota prov…
hartmark Jul 3, 2026
b7160e9
feat(xai): surface Grok usage on quota dashboard via local usageHisto…
diegosouzapw Jul 3, 2026
dc7892c
feat(services): add Mux managed embedded service (#6034)
diegosouzapw Jul 3, 2026
556f191
feat(services): promote Bifrost to embedded/supervised service (#5670…
diegosouzapw Jul 3, 2026
d0be015
Merge pull request #5912 from chirag127/fix/pnpm11-allowbuilds-workspace
diegosouzapw Jul 3, 2026
8d7e3e2
fix(ci): document BIFROST_PORT to clear env-doc-sync base-red
diegosouzapw Jul 3, 2026
513e3b0
Merge pull request #6110 from diegosouzapw/fix/release-envdoc-bifrost…
diegosouzapw Jul 3, 2026
2a20e5c
fix(providers): emulate OpenAI tool_calls in GitLab Duo executor (#60…
diegosouzapw Jul 3, 2026
29e04b7
fix(providers): strip orphan tool_result on Antigravity MITM path (#6…
diegosouzapw Jul 3, 2026
9c6a364
fix(registry): update grok-cli model context lengths (#5913)
Chewji9875 Jul 3, 2026
ad58bc1
feat(proxy): batch delete, auto-test, health scheduler + transitive a…
oyi77 Jul 3, 2026
1f6ec5b
feat(minimax): extract M3 reasoning_content on OpenAI-format tiers (#…
KooshaPari Jul 3, 2026
439f28d
fix(ci): harden provider translate-path golden across CI runners (#6076)
KooshaPari Jul 3, 2026
dbc0cdb
test(embeddings): pin seeded connection to direct egress in route-edg…
diegosouzapw Jul 3, 2026
1f1fda7
fix(config): externalize ws for copilot-m365-web executor (#6130, clo…
diegosouzapw Jul 3, 2026
caeee89
fix(providers): update Perplexity Web models (#6106)
backryun Jul 3, 2026
91cda11
fix(providers): update Gemini Web cookies and models (#6095)
backryun Jul 3, 2026
9c2fbf5
fix(models): normalize GLM-5.2 provider context (#6091)
Thinkscape Jul 3, 2026
f884c40
fix(combo): prefer known context capacity over unknown (#6088)
Thinkscape Jul 3, 2026
c02f8d5
fix: keep Claude tool results adjacent (#6035)
KooshaPari Jul 3, 2026
f9b2fb4
fix(security): persist IP filter config + enforce it in the authz pip…
diegosouzapw Jul 3, 2026
00d97ca
fix(codex): use access_token.exp instead of id_token.exp for import e…
anki1kr Jul 3, 2026
631c6c4
fix(compression): send patch-only to PUT /api/settings/compression in…
anki1kr Jul 3, 2026
32e4c90
fix: reqId ReferenceError in safety-net redirect, dead code, filename…
fix2015 Jul 3, 2026
421a1ec
fix(combo): expand fingerprint-based providers into per-fingerprint c…
pizzav-xyz Jul 3, 2026
8c3bcf0
fix(auth): persist quota preflight account lockouts (#6090)
Thinkscape Jul 3, 2026
d072db2
fix(combos): expand OpenCode/MiMo fingerprint accounts in combo build…
anki1kr Jul 3, 2026
e267246
chore(quality): rebaseline v3.8.44 release-green drift (eslint/cognit…
diegosouzapw Jul 3, 2026
e9d83e7
fix(accountFallback): persist per-account 429 cascade + classify 'Mon…
KooshaPari Jul 3, 2026
8cded07
feat(build): backend-only fast build (skip the dashboard frontend) (#…
artickc Jul 3, 2026
7160412
fix(provider-limits): clear transient rate-limit state when quota rec…
janeza2 Jul 3, 2026
cfd1f72
docs: Normalize mixed-language documentation content (#6105)
Iammilansoni Jul 4, 2026
926b08a
chore docs
diegosouzapw Jul 3, 2026
e42e554
i18n(zh-CN): translate CHANGELOG entries and section headings (#6043)
studyzy Jul 4, 2026
4a7602f
chore(quality): rebaseline residual eslint + file-size drift (v3.8.44)
diegosouzapw Jul 4, 2026
d3edbb5
fix(repo): remove Windows case-conflicting DESIGN duplicate (#6140)
backryun Jul 4, 2026
c51693b
fix(provider-limits): close TOCTOU race in quota recovery clear (I2) …
janeza2 Jul 4, 2026
65bec99
fix(glm): suppress </think> close marker leak in GLM Anthropic transp…
dhaern Jul 4, 2026
81f5bce
fix(cli): give setup-claude a fallback profile generator like setup-c…
derhornspieler Jul 4, 2026
d8e4eee
fix(onboarding): route provider-details link by node id, not provider…
chirag127 Jul 4, 2026
d927f2d
fix(translator): strip Responses-only truncation field before Chat Co…
diegosouzapw Jul 4, 2026
0cc3256
fix(mitm): guard against concurrent MITM server starts (#6107)
diegosouzapw Jul 4, 2026
402d9de
feat(models): add claude-sonnet-5 to Antigravity catalog (#6103)
diegosouzapw Jul 4, 2026
c900bbb
fix(providers): strip thinking param for minimax-m2.7 on NVIDIA NIM (…
diegosouzapw Jul 4, 2026
016fec3
feat(providers): add Kenari OpenAI-compatible gateway (#6104)
diegosouzapw Jul 4, 2026
2fa47b7
feat(sse): per-request Auto-Combo controls (X-OmniRoute-Mode / X-Omni…
diegosouzapw Jul 4, 2026
dc2efa5
feat(resilience): throttle concurrent upstream quota fetches — closes…
diegosouzapw Jul 4, 2026
415d159
fix(oauth): graceful 400 for keychain-import-only providers (zed) (#6…
diegosouzapw Jul 4, 2026
5ca28f2
fix(dashboard): resolve broken Card import breaking next build (base-…
diegosouzapw Jul 4, 2026
979a7c6
fix(release): v3.8.44 Phase-0 pre-flight — base-red sweep + ratchet a…
diegosouzapw Jul 4, 2026
babb759
chore(release): v3.8.44 — 2026-07-04
diegosouzapw Jul 4, 2026
00c55af
fix(release): v3.8.44 one-pass release-PR CI sweep
diegosouzapw Jul 4, 2026
103236d
fix(release): round-2 CI findings — LocaleAutoDetect refresh gating +…
diegosouzapw Jul 4, 2026
6c6ab8a
test(release): collect the #6082 fingerprint-expansion ghost test
diegosouzapw Jul 4, 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
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,4 @@ app.__qa_backup/
.worktrees
.next-playwright/
cloud/
electron/dist-electron
66 changes: 66 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ DISABLE_SQLITE_AUTO_BACKUP=false
# Default: 20128
PORT=20128

# Base path (URL subpath) when serving OmniRoute behind a reverse proxy under a subpath.
# Used by: next.config.mjs — sets Next.js `basePath`; auth redirects are basePath-aware.
# Default: "" (served at the domain root). Example: /omniroute to serve under https://host/omniroute
# OMNIROUTE_BASE_PATH=

# Split-port mode: serve Dashboard and API on separate ports for network isolation.
# Used by: src/lib/runtime/ports.ts — overrides PORT for each service.
# API_PORT=20129
Expand Down Expand Up @@ -413,6 +418,15 @@ NEXT_PUBLIC_BASE_URL=http://localhost:20128
# Do not include /v1; if included accidentally it will be normalized away.
# OMNIROUTE_PUBLIC_BASE_URL=http://192.168.0.15:20128

# Absolute provider plugin manifest URL advertised to sidecar clients.
# Used by: open-sse/config/providerPluginManifestUrl.ts. When unset, OmniRoute
# derives the URL from request origin or HOST/PORT using OMNIROUTE_PUBLIC_PROTOCOL.
# OMNIROUTE_PROVIDER_MANIFEST_URL=https://omniroute.example.com/api/v1/provider-plugin-manifest

# Protocol used when deriving provider plugin manifest URLs without a request origin.
# Used by: open-sse/config/providerPluginManifestUrl.ts. Defaults to http.
# OMNIROUTE_PUBLIC_PROTOCOL=http

# Max wait time for an async chatgpt-web image to land via the celsius
# WebSocket, in milliseconds. Default 180000 (3 minutes). Increase during
# upstream queue-deep windows ("Lots of people are creating images right now").
Expand Down Expand Up @@ -568,6 +582,8 @@ NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=true
# CLI_CONTINUE_BIN=cn
# CLI_QODER_BIN=qoder
# CLI_QWEN_BIN=qwen
# CLI_AUGGIE_BIN=auggie
# AUGGIE_BIN=auggie

# Override the Hermes Agent home directory (where OmniRoute reads/writes the
# Hermes CLI config). Matches the env var the Hermes PowerShell installer sets
Expand Down Expand Up @@ -635,6 +651,14 @@ PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES=70
# to opt out (restores fully concurrent fetches). Default: 1500
PROVIDER_LIMITS_SYNC_SPACING_MS=1500

# Min interval (ms) between consecutive UPSTREAM quota fetches on the per-request
# preflight/monitor path (e.g. Codex /wham/usage), complementing the bulk-sync
# spacing above. Many accounts on one IP fetching quota in the same second can look
# like automation to the upstream and get an OAuth token revoked (#6009). This gate
# serializes genuine network calls (cache hits are unaffected). Set to 0 to disable.
# Default: 250 (clamped 0..5000).
# OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS=250

# Delay (ms) before refreshing provider limits after a real usage event (e.g. a
# completed request). Gives the upstream quota API time to register the consumption
# before the dashboard polls. Default: 5000
Expand Down Expand Up @@ -869,6 +893,8 @@ GITHUB_OAUTH_CLIENT_ID=Iv1.b507a08c87ecfe98
# QODER_PERSONAL_ACCESS_TOKEN=
# QODER_CLI_WORKSPACE=
# OMNIROUTE_QODER_WORKSPACE=
# Override the Qoder CLI config dir (isolated PAT session, avoids clobbering a browser login).
# QODER_CLI_CONFIG_DIR=

# ── Blackbox Web validated-token override (issue #2252) ──
# Used by: open-sse/executors/blackbox-web.ts. Blackbox `/api/chat` rejects
Expand Down Expand Up @@ -1037,6 +1063,12 @@ CURSOR_USER_AGENT="Cursor/3.4"
# fallback when FETCH_TIMEOUT_MS is unset. Default: 120000 (2 min).
# OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS=120000

# ── Firecrawl web-fetch executor ──
# Point at a self-hosted Firecrawl instance (defaults to the public cloud API).
# When set to a non-cloud base URL, the API key becomes optional.
# FIRECRAWL_BASE_URL=https://api.firecrawl.dev
# FIRECRAWL_TIMEOUT_MS=30000 # Per-request timeout (default: 30000 = 30s)

# ── ChatGPT TLS sidecar (Firefox-fingerprinted client) ──
# Used by: open-sse/services/chatgptTlsClient.ts — wire-level timeout for
# the bogdanfinn/tls-client koffi binding and the JS-side grace window
Expand Down Expand Up @@ -1442,6 +1474,13 @@ APP_LOG_TO_FILE=true
# CLIPROXYAPI_PORT=5544
# CLIPROXYAPI_CONFIG_DIR=~/.cli-proxy-api

# ── Mux embedded service ──
# Override the port where the embedded Mux (coder/mux) agent-orchestration
# daemon listens. Always bound to 127.0.0.1 — never configurable to 0.0.0.0.
# Rarely needed — defaults to 8322.
# Used by: src/lib/services/bootstrap.ts, src/app/api/services/mux/_lib.ts
# MUX_SERVICE_PORT=8322

# ── Local hostnames (Docker networking) ──
# Comma-separated additional hostnames treated as "local" for provider routing.
# Used by: open-sse/config/providerRegistry.ts — allows Docker service names.
Expand All @@ -1464,6 +1503,20 @@ APP_LOG_TO_FILE=true
# healthy-result cache window under high concurrency.
# PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS=2000

# Background proxy health scheduler (src/lib/proxyHealth/scheduler.ts).
# Periodically probes every registered proxy and (optionally) removes dead ones.
# Set "false" to disable the scheduler entirely. Default: enabled.
# PROXY_HEALTH_ENABLED=true
# Sweep interval in ms (minimum 60000). Default: 600000 (10min).
# PROXY_HEALTH_INTERVAL_MS=600000
# Reachability probe target for the scheduler and the auto-test endpoint.
# Point it at an internal/self-hosted URL to avoid the public default.
# PROXY_HEALTH_TEST_URL=https://httpbin.org/ip
# Set "true" to let the scheduler auto-remove proxies after repeated failures.
# PROXY_AUTO_REMOVE=false
# Consecutive failures before an auto-remove fires. Default: 3.
# PROXY_AUTO_REMOVE_AFTER=3

# 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.
Expand Down Expand Up @@ -1675,6 +1728,15 @@ APP_LOG_TO_FILE=true
# FREE_PROXY_IPLOCATE_ENABLED=false
# FREE_PROXY_IPLOCATE_BASE_URL=https://raw.githubusercontent.com/iplocate/free-proxy-list/main/protocols

# ── Free Proxy Pool (Webshare source) ──
# Used by: src/lib/freeProxyProviders/webshare.ts
# Paid, per-account proxy list — requires FREE_PROXY_WEBSHARE_API_KEY to activate,
# regardless of FREE_PROXY_WEBSHARE_ENABLED.
# FREE_PROXY_WEBSHARE_ENABLED=true
# FREE_PROXY_WEBSHARE_API_KEY=
# FREE_PROXY_WEBSHARE_API_URL=https://proxy.webshare.io/api/v2/proxy/list/
# FREE_PROXY_WEBSHARE_MAX=500

# ── Vercel Relay ──
# Used by: src/app/api/settings/proxy/vercel-deploy/route.ts
# Hides the "Deploy Relay" button when set to false.
Expand Down Expand Up @@ -1879,6 +1941,10 @@ QUOTA_STORE_DRIVER=sqlite # sqlite | redis
# duplicated). Falls back to TS path via X-Bifrost-Fallback header on
# timeout/failure. See bin/omniroute for the local-redis companion.
# BIFROST_BASE_URL=
# Port the supervised Bifrost embedded service binds to (127.0.0.1:<port>), read by
# src/lib/services/bootstrap.ts when OmniRoute manages the Bifrost sidecar lifecycle.
# Default: 8080.
# BIFROST_PORT=8080
# API key for the Bifrost gateway (sent as Authorization: Bearer ...). If
# unset, the route expects the request to carry a valid OmniRoute API key;
# this key is for gateway-side auth only.
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,7 @@ jobs:
cache: npm
- uses: ./.github/actions/npm-ci-retry
- run: npm run check:node-runtime
- run: node --max-old-space-size=4096 --import tsx --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=${{ matrix.shard }}/8 tests/unit/*.test.ts "tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,ui,usage}/**/*.test.ts"
- run: node --max-old-space-size=4096 --import tsx --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=${{ matrix.shard }}/8 tests/unit/*.test.ts "tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,dashboard,db,db-adapters,docs,executors,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,ui,usage}/**/*.test.ts"

test-vitest:
name: Vitest (MCP / autoCombo / UI components)
Expand Down Expand Up @@ -676,7 +676,7 @@ jobs:
cache: npm
- uses: ./.github/actions/npm-ci-retry
- run: npm run check:node-runtime
- run: node --max-old-space-size=4096 --import tsx --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=${{ matrix.shard }}/4 tests/unit/*.test.ts "tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,ui,usage}/**/*.test.ts"
- run: node --max-old-space-size=4096 --import tsx --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=${{ matrix.shard }}/4 tests/unit/*.test.ts "tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,dashboard,db,db-adapters,docs,executors,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,ui,usage}/**/*.test.ts"

node-26-compat-build:
name: Node 26 Compatibility Build
Expand Down Expand Up @@ -729,7 +729,7 @@ jobs:
cache: npm
- uses: ./.github/actions/npm-ci-retry
- run: npm run check:node-runtime
- run: node --max-old-space-size=4096 --import tsx --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=${{ matrix.shard }}/4 tests/unit/*.test.ts "tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,ui,usage}/**/*.test.ts"
- run: node --max-old-space-size=4096 --import tsx --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 --test-shard=${{ matrix.shard }}/4 tests/unit/*.test.ts "tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,dashboard,db,db-adapters,docs,executors,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,ui,usage}/**/*.test.ts"

test-coverage-shard:
name: Coverage Shard (${{ matrix.shard }}/8)
Expand Down Expand Up @@ -770,7 +770,7 @@ jobs:
--exclude=tests/** \
--exclude=**/*.test.* \
node --max-old-space-size=4096 --import tsx --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=4 \
--test-shard=${{ matrix.shard }}/8 tests/unit/*.test.ts "tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,ui,usage}/**/*.test.ts"
--test-shard=${{ matrix.shard }}/8 tests/unit/*.test.ts "tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,dashboard,db,db-adapters,docs,executors,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,ui,usage}/**/*.test.ts"
- name: Upload raw shard coverage
if: always()
uses: actions/upload-artifact@v7
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -145,4 +145,4 @@ jobs:
--import ./tests/_setup/isolateDataDir.ts
--test --test-force-exit --test-concurrency=4 --test-shard=${{ matrix.shard }}/2
tests/unit/*.test.ts
"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,dashboard,db,db-adapters,docs,gamification,guardrails,lib,mcp,runtime,security,services,settings,shared,ui}/**/*.test.ts"
"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,dashboard,db,db-adapters,docs,executors,gamification,guardrails,lib,mcp,runtime,security,services,settings,shared,ui}/**/*.test.ts"
20 changes: 10 additions & 10 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ Cohere, NVIDIA, Cerebras, Pollinations, Puter, Cloudflare AI, HuggingFace, DeepI
SambaNova, Meta Llama API, Moonshot AI, AI21 Labs, Databricks, Snowflake, and many more)
with **MCP Server** (94 tools), **A2A v0.3 Protocol**, and **Electron desktop app**.

> **Live counts (v3.8.40)**: providers 237 · MCP tools 94 · MCP scopes 30 · A2A skills 6 ·
> open-sse services 298 · routing strategies 17 · auto-combo scoring factors 12 ·
> DB modules 94 · DB migrations 106 · base tables 17 · search providers 11 ·
> **Live counts (v3.8.43)**: providers 237 · MCP tools 94 · MCP scopes 30 · A2A skills 6 ·
> open-sse services 134 · routing strategies 17 · auto-combo scoring factors 12 ·
> DB modules 95 · DB migrations 110 · base tables 17 · search providers 11 ·
> i18n locales 42. **Refresh with `npm run check:docs-all`.**

## Doc Accuracy Discipline (read before writing any doc)
Expand Down Expand Up @@ -178,7 +178,7 @@ Always run `prettier --write` on changed files.

### Data Layer (`src/lib/db/`)

All persistence uses SQLite through **83 domain-specific modules** in `src/lib/db/`. Top modules:
All persistence uses SQLite through **95 domain-specific modules** in `src/lib/db/`. Top modules:

- Core: `core.ts`, `migrationRunner.ts`, `encryption.ts`, `stateReset.ts`
- Providers / catalog: `providers.ts`, `models.ts`, `providerLimits.ts`, `compressionAnalytics.ts`
Expand All @@ -188,8 +188,8 @@ All persistence uses SQLite through **83 domain-specific modules** in `src/lib/d
- Storage: `backup.ts`, `cleanup.ts`, `jsonMigration.ts`, `healthCheck.ts`, `databaseSettings.ts`
- Extension modules: `evals.ts`, `webhooks.ts`, `reasoningCache.ts`, `readCache.ts`, `tierConfig.ts`, `compressionCombos.ts`, `compressionScheduler.ts`, `batches.ts`, `files.ts`, `syncTokens.ts`, `proxies.ts`, `oneproxy.ts`, `upstreamProxy.ts`, `versionManager.ts`, `cliToolState.ts`, `prompts.ts`, `detailedLogs.ts`, `contextHandoffs.ts`, `compression.ts`, `stats.ts`

Live count: `ls src/lib/db/*.ts | wc -l` (currently 83). Drift detection: `npm run check:docs-counts`.
Schema migrations live in `db/migrations/` (**97 files** as of v3.8.24) and run via `migrationRunner.ts`.
Live count: `ls src/lib/db/*.ts | wc -l` (currently 95). Drift detection: `npm run check:docs-counts`.
Schema migrations live in `db/migrations/` (**110 files** as of v3.8.43) and run via `migrationRunner.ts`.
`src/lib/localDb.ts` is a **re-export layer only** — never add logic there.

#### DB Internals
Expand All @@ -198,7 +198,7 @@ Schema migrations live in `db/migrations/` (**97 files** as of v3.8.24) and run
journaling. `SCHEMA_SQL` defines **17 base tables** (verify with `grep -c "CREATE TABLE" src/lib/db/core.ts` minus 1 for the bookkeeping `_omniroute_migrations` table). Helpers: `rowToCamel`, `encryptConnectionFields`.
- **`migrationRunner.ts`**: Applies versioned SQL files from `db/migrations/` inside transactions.
Tracks applied migrations in `_omniroute_migrations` table.
- **Migrations**: 97 files (`001_initial_schema.sql` → `099_*.sql`).
- **Migrations**: 110 files (`001_initial_schema.sql` → `110_*.sql`).
Each migration is idempotent and runs in a transaction. Live count: `ls src/lib/db/migrations/*.sql | wc -l`.
- **Domain modules** import `getDbInstance()` from `core.ts` for all CRUD operations.
Each module owns a specific table/set of tables (e.g., `providers.ts` → `provider_connections`,
Expand Down Expand Up @@ -336,7 +336,7 @@ Includes request/response translators with helpers for image handling.

### Services (`open-sse/services/`)

115 service modules in `open-sse/services/` (top-level only; 184 including sub-dirs like `autoCombo/` and `compression/`). Refresh: `ls open-sse/services/*.ts | wc -l`. Key modules:
134 service modules in `open-sse/services/` (top-level only; more including sub-dirs like `autoCombo/` and `compression/`). Refresh: `ls open-sse/services/*.ts | wc -l`. Key modules:
`combo.ts` (routing engine), `usage.ts`, `tokenRefresh.ts`,
`rateLimitManager.ts`, `accountFallback.ts`, `sessionManager.ts`, `wildcardRouter.ts`,
`autoCombo/`, `intentClassifier.ts`, `taskAwareRouter.ts`, `thinkingBudget.ts`,
Expand Down Expand Up @@ -378,8 +378,8 @@ Modular prompt compression that runs proactively before the existing reactive co
and iterates through targets in order until one succeeds or all fail.
- **`resolveComboTargets()`**: Expands a combo configuration into an ordered array of
`ResolvedComboTarget[]`, each specifying provider + model + account + credentials.
- **Strategies** (15): priority, weighted, fill-first, round-robin, P2C, random, least-used, reset-aware (v3.8),
reset-window, cost-optimized, strict-random, auto, lkgp, context-optimized, context-relay. Source: `ROUTING_STRATEGY_VALUES` in `src/shared/constants/routingStrategies.ts`.
- **Strategies** (17): priority, weighted, fill-first, round-robin, P2C, random, least-used, reset-aware (v3.8),
reset-window, cost-optimized, strict-random, auto, lkgp, context-optimized, context-relay, headroom, fusion. Source: `ROUTING_STRATEGY_VALUES` in `src/shared/constants/routingStrategies.ts`.
- Each target calls **`handleSingleModel()`** which wraps `handleChatCore()` with
per-target error handling and circuit breaker checks.

Expand Down
Loading
Loading