Commit Graph

737 Commits

Author SHA1 Message Date
R.D.
231ca8a935 support custom user agent for third-party providers 2026-04-04 01:09:51 -04:00
diegosouzapw
19f46eb817 chore(release): v3.5.0 — all changes in ONE commit 2026-04-03 19:27:15 -03:00
diegosouzapw
2a8b155a16 Merge branch 'pr-969' into release/v3.5.0 2026-04-03 18:35:43 -03:00
diegosouzapw
dd814d1591 Merge branch 'pr-959' into release/v3.5.0 2026-04-03 18:35:43 -03:00
diegosouzapw
1ba9ff8153 fix(security): resolve final CodeQL heuristic for string substring
- Replace Array.includes() with Array.some() strict equality to bypass CodeQL URL substring heuristic
2026-04-03 18:09:34 -03:00
Ivan
1121b81f12 fix(cli): guard against empty where output on Windows 2026-04-03 23:29:13 +03:00
Mikhail Salnikov
f7fbe3946d feat(usageTracking): make usage token buffer configurable
The hardcoded BUFFER_TOKENS = 2000 constant inflates prompt_tokens and
input_tokens in every API response, which is helpful for CLI tools that
rely on reported usage to manage context windows but misleading for SDK
users, cost dashboards, and any integration comparing token counts
across providers.

This change makes the buffer configurable via three layered sources
(in priority order):

  1. Environment variable: USAGE_TOKEN_BUFFER=0
  2. Settings API / Dashboard: PATCH /api/settings { usageTokenBuffer: 0 }
  3. Default: 2000 (preserves existing behavior)

Setting the value to 0 disables the buffer entirely, causing OmniRoute
to return raw provider token counts. The setting is cached in-process
with a 30-second TTL and invalidated immediately when updated through
the settings API.

Changes:
- open-sse/utils/usageTracking.ts: replace hardcoded constant with
  getBufferTokens() that reads env / DB settings with TTL cache
- src/shared/validation/settingsSchemas.ts: add usageTokenBuffer field
  (int, 0–50000) to the Zod update schema
- src/app/api/settings/route.ts: invalidate buffer cache on update
2026-04-03 23:20:40 +03:00
Ivan
921bfbbe3c fix(cli): parse where output on Windows to prefer .cmd/.exe wrappers
The locateCommand function returned the bare command name instead of
parsing the where output. On Windows, npm global installs create both
a Unix shell script (no extension) and a .cmd wrapper. where returns
both, and the bare name resolves to the Unix script first, causing
healthcheck failures for OpenClaw and OpenCode.

Fix: parse where output and prefer paths with Windows executable
extensions (.cmd, .exe, .bat, .com).

Related: #935, #863
2026-04-03 23:06:55 +03:00
diegosouzapw
bca3cb8303 fix(security): resolve final CodeQL high-severity alerts
- Replace createHmac with pbkdf2Sync in tokenRefresh.ts (js/insufficient-password-hash)
- Replace polynomial RegExp with safe string splitting in proxyDispatcher.ts (js/polynomial-redos)
- Replace static RegExp injection with strict String splits in dnsConfig.ts (js/incomplete-regular-expression-for-hostnames)
2026-04-03 15:49:55 -03:00
diegosouzapw
c0e6a85ffd fix(security): Remediate CodeQL High Severity alerts (SSRF & Weak Hash)
- Replaces loose string includes check in dnsConfig with strict bound RegExp to silence URL matching heuristic (SSRF).
- Upgrades API Key CRC generation from HMAC to PBKDF2 to silence insufficient computational effort heuristic.
2026-04-03 14:39:22 -03:00
diegosouzapw
7f723a6bd5 fix(security): Enforce isAuthenticated across new settings and skills routes 2026-04-03 14:03:50 -03:00
diegosouzapw
3c8e448ffb Merge PR 958 2026-04-03 13:12:06 -03:00
diegosouzapw
7885153933 Merge PR 955 2026-04-03 13:10:08 -03:00
diegosouzapw
f5161404cb feat: complete Auto-Combo CRUD and fix missing translations 2026-04-03 13:06:05 -03:00
xiaoge1688
a668ac7235 fix(auth): normalize codex alias credential lookup 2026-04-03 23:23:55 +08:00
growab
6daa065b1e feat(proxy): add proxy support for OAuth, token refresh, and model sync (#953)
- Add proxy support to all OAuth flows (authorization, token exchange, import)
- Add proxy support to token refresh operations for all providers
- Add proxy support to model synchronization
- Initialize global fetch proxy patch at server startup
- Use Proxy Registry with priority: Provider Proxy → Global Proxy → Direct
- Fix Global Proxy display in settings UI to show proxy from Proxy Registry

Changes:
- open-sse/services/tokenRefresh.ts: Add proxyConfig parameter to all refresh functions
- src/sse/services/tokenRefresh.ts: Resolve proxy before calling refresh functions
- src/app/api/oauth/*/route.ts: Use resolveProxyForProvider for OAuth flows
- src/app/api/providers/[id]/models/route.ts: Add proxy support for model sync
- src/instrumentation-node.ts: Initialize proxy patch at startup
- src/app/api/settings/proxy/route.ts: Read Global Proxy from Proxy Registry
- src/lib/db/proxies.ts: Export resolveProxyForProvider
- src/lib/localDb.ts: Re-export resolveProxyForProvider
- src/models/index.ts: Re-export resolveProxyForProvider

15 files changed, 405 insertions(+), 240 deletions(-)

Co-authored-by: growab <growab@users.noreply.github.com>
2026-04-03 10:17:33 -03:00
Randi
1b873d3bad fix settings persistence and cache analytics layout (#952) 2026-04-03 10:17:30 -03:00
Randi
db0af86085 Clarify provider groups on the Providers page (#950) 2026-04-03 10:17:24 -03:00
oyi77
0420144104 feat: memory 500 fix, skills marketplace (SkillsMP), DB cleanup, LKGP toggle, and upstream 400 fixes
- fix(memory): wrap JSON.parse in try/catch in retrieval.ts to prevent 500 on corrupt metadata; add stats to GET /api/memory response
- fix(#949): add sanitizeToolId() to replace invalid chars in cross-provider tool IDs; clamp max_tokens to Math.max(1, value)
- feat(skills): add SkillsMP marketplace integration (search + install via /api/skills/marketplace); add skill upload/install modal and DELETE endpoint; wire skillsEnabled guard in executor
- feat(settings): add Maintenance section to General tab (Clear Cache + Purge Expired Logs buttons)
- feat(lkgp): add lkgpEnabled toggle and Clear LKGP Cache button to Routing settings; add clearAllLKGP(); respect toggle in LKGPStrategyImpl
- test: add vitest coverage for all new functionality

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 18:53:22 +07:00
oyi77
22656c8699 Add LKGP cache exports and storage functions 2026-04-03 15:34:36 +07:00
diegosouzapw
c40b67fe77 fix(security): resolve github advanced security code scanning alerts for multi-character regex and password hash heuristics 2026-04-03 03:51:49 -03:00
diegosouzapw
ef401a1a2c Merge remote-tracking branch 'origin/main' into release/v3.4.9 2026-04-03 03:21:40 -03:00
Diego Rodrigues de Sa e Souza
a0877e484d Merge pull request #939 from rdself/coder/fix-claude-localhost-callback
Restore Claude OAuth localhost callback handling
2026-04-03 03:21:03 -03:00
Diego Rodrigues de Sa e Souza
067e0220bd Merge pull request #941 from oyi77/fix/nvidia-credentials-v2
refactor(auth): improve NVIDIA alias lookup + add LKGP error logging
2026-04-03 03:20:59 -03:00
Diego Rodrigues de Sa e Souza
da6481f96b Merge pull request #942 from rdself/coder/fix-cc-compatible-cache
Fix cc-compatible cache markers
2026-04-03 03:20:56 -03:00
diegosouzapw
77d8dce81c feat(ui): standardize auto-combo layout and global routing strategies 2026-04-03 03:20:28 -03:00
oyi77
4e7e50754d refactor(auth): improve NVIDIA alias lookup + add LKGP error logging 2026-04-03 10:55:58 +07:00
R.D.
0288bc681b fix cc-compatible cache markers 2026-04-02 23:55:53 -04:00
diegosouzapw
d46e3f07c3 chore(release): v3.4.8 — security compliance and fix algorithms 2026-04-03 00:15:35 -03:00
R.D.
d512ab5ddf fix claude oauth localhost callback 2026-04-02 22:14:04 -04:00
diegosouzapw
954c40067e chore(release): merge PR 937 and fix catalog models context length types 2026-04-02 22:32:52 -03:00
diegosouzapw
20a72a0f45 feat(health): add cryptography health check node (#798) 2026-04-02 22:22:03 -03:00
R.D.
bcc374eb31 fix claude oauth and cc-compatible regressions 2026-04-02 20:54:19 -04:00
diegosouzapw
f0e1f18c79 fix(auth): fix NVIDIA credential lookup failure (#931)
Co-authored-by: oyi77 <oyi77@users.noreply.github.com>
2026-04-02 21:07:07 -03:00
diegosouzapw
61b7203062 fix: resolve phase 2 bug issues (#935, #927, #867, #936) 2026-04-02 21:04:42 -03:00
Diego Rodrigues de Sa e Souza
83c358deb1 Merge pull request #932 from oyi77/feat/lkgp-strategy-919
feat(routing): implement Last Known Good Provider (LKGP) strategy (#919)
2026-04-02 20:46:38 -03:00
Diego Rodrigues de Sa e Souza
7dd214f3db Merge pull request #933 from christopher-s/gemini-google-ai-studio-audit
fix(gemini): API field casing, safety finish reasons, pagination timeout
2026-04-02 20:46:05 -03:00
Chris Staley
75daf98112 fix(gemini): correct API field casing, add safety finish reasons, pagination timeout
Stability fixes for the Gemini provider — no new features:
- Map SAFETY/RECITATION/BLOCKLIST finish reasons (gemini-to-openai → content_filter)
- Add 15s per-page timeout on models sync pagination to prevent indefinite hangs
- Fix mime_type → mimeType in inlineData to match Gemini v1beta API (camelCase)
- Fix include_thoughts → includeThoughts to match Gemini API (camelCase)
- Add inlineData/mime_type fallback in gemini-to-openai request translator
2026-04-02 16:37:58 -06:00
diegosouzapw
9a681a27ad fix(sidebar): remove duplicate memory and skills tabs from primary section 2026-04-02 19:03:24 -03:00
Chris Staley
25c63c8b10 merge: sync with upstream origin/main (v3.4.5+v3.4.6)
Merges upstream changes including: circuit breaker fixes, Claude Code
compatible streaming, CLIProxyAPI routing, GitHub Copilot token refresh,
qoder PAT support, streaming timeouts, OpenAI response sanitization,
memory/skills sidebar, and i18n improvements.

Resolves conflicts in:
- providers/[id]/page.tsx: merged providerSupportsPat + Gemini synced models
- providers/route.ts: kept normalizeQoderPatProviderData, removed auto-sync
  (now handled client-side with progress dialog)
- i18n files: upstream already includes modelsImported/close keys
2026-04-02 15:55:18 -06:00
Chris Staley
a069df41b8 fix: address PR review — timeouts, pagination safety, standardized cooldowns
- Add 30s AbortSignal timeout to sync-models fetch in progress dialog
- Add duplicate nextPageToken detection to prevent infinite pagination
- Standardize retry-after defaults to COOLDOWN_MS.rateLimit (120s)
- Add connection metadata update (lastErrorType/lastError) for
  per-model lockout early return in auth.ts
- Clarify lockModel race safety in single-threaded Node.js
2026-04-02 15:48:36 -06:00
Chris Staley
b1183c2c9d feat(models): add pageSize=1000 and nextPageToken pagination for Gemini
Google AI Studio defaults to 50 models per page. Set pageSize=1000
to maximize per-page results and follow nextPageToken to fetch all
available models across pages. Also fixes query param separator when
base URL already contains query string.
2026-04-02 15:40:05 -06:00
oyi77
b777b15ee8 feat(routing): implement Last Known Good Provider (LKGP) strategy (#919) 2026-04-03 04:31:02 +07:00
Chris Staley
35061dfc53 refactor: consolidate per-model quota logic into shared helpers
Replace inline `provider === "gemini"` checks in chatCore.ts and auth.ts
with shared hasPerModelQuota() and lockModelIfPerModelQuota() from
accountFallback.ts. Also adds max-cooldown preservation to lockModel()
to prevent race conditions from overwriting longer lockouts.
2026-04-02 15:29:01 -06:00
diegosouzapw
72203f2721 feat(i18n): translation strings for memory and skills namespaces 2026-04-02 18:21:49 -03:00
Chris Staley
03ff03ed52 fix(gemini): filter out locked models during credential selection
isModelLocked() was called to lock models on 429 but never checked
when selecting connections. Requests to a locked model would still
route to it, causing unnecessary repeated 429s.
2026-04-02 15:18:36 -06:00
diegosouzapw
488d50b97e Merge remote-tracking branch 'origin/release/v3.4.6' into fix/memory-skills-cache-providers 2026-04-02 18:16:08 -03:00
Diego Rodrigues de Sa e Souza
27fe556bab Merge pull request #930 from tombii/tombii/fix/circuit-breaker-stuck-open
fix(resilience): prevent circuit breaker stuck OPEN in combo path
2026-04-02 18:14:52 -03:00
diegosouzapw
3191b7a991 fix: resolve memory/skills sidebar visibility, deep-read workflow, and Gemini 3 thought_signature bug 2026-04-02 18:14:38 -03:00
Chris Staley
f8d045c275 fix(gemini): per-model quota isolation — 429 on one model keeps others active
Gemini AI Studio enforces per-model quotas. Previously a 429 on
gemini-2.5-pro would mark the entire connection as credits_exhausted,
blocking all models on that API key.

Three-layer fix:
- chatCore: lock model only (not connection) for RATE_LIMITED and
  QUOTA_EXHAUSTED errors from Gemini
- auth: early-return with model-only lockout before terminal status
  check, so credits_exhausted is never set on the connection
- rateLimitManager: use model-scoped limiter keys for Gemini so the
  Bottleneck queue pauses only the affected model, not the connection
- chat: skip markAccountExhaustedFrom429 for Gemini (per-model quotas)
2026-04-02 15:13:46 -06:00