Commit Graph

726 Commits

Author SHA1 Message Date
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
Chris Staley
0038fe5ff1 feat(gemini): per-model quota lockout instead of connection-wide
Gemini AI Studio has per-model quota limits. When one model hits its
quota (429), other models on the same API key may still be available.

- Use lockModel() for 429s on Gemini (model-only lockout, connection
  stays active for other models)
- Skip markAccountExhaustedFrom429 for Gemini (prevents deprioritizing
  the entire connection in credential selection)
- Apply model-only 404 lockout for Gemini too (deprecated/unavailable
  models shouldn't disable the provider)
2026-04-02 14:51:01 -06:00
Chris Staley
3ae810a18e fix(gemini): log sync errors, optimize synced models query
- Replace silent catch blocks with logged errors in catalog and v1beta
- Use SQL LIKE filter instead of fetching all rows and filtering in-memory
2026-04-02 14:42:38 -06:00
tombii
afe72c8029 fix(resilience): reset lastFailureTime on OPEN → CLOSED transition
Match reset() behavior — clear lastFailureTime when recovering from
OPEN state to avoid stale timestamps in persisted state.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 22:42:13 +02:00
Chris Staley
2341bba973 feat(gemini): progress dialog on key save, remove hardcoded registry, categorize by endpoint
- Show import progress dialog when adding Gemini API key with model
  list, completion status, and Close button
- Remove hardcoded Gemini model registry — models come exclusively
  from Google API sync per API key
- Hide "Import from /models" button for Gemini (sync handles it)
- Remove server-side fire-and-forget auto-sync (client handles it)
- Categorize synced Gemini models by endpoint type in catalog:
  embedding, image, and audio (transcription + speech)
- Add modelsImported and close i18n keys to all 33 languages
2026-04-02 14:38:28 -06:00
tombii
c0da968af2 fix(resilience): prevent circuit breaker stuck OPEN in combo path
Combo handlers call _onSuccess()/_onFailure() directly instead of
execute(), bypassing the OPEN→HALF_OPEN→CLOSED transition. After
resetTimeout elapses, canExecute() returns true and requests flow
through, but _onSuccess() only reset failureCount without changing
state — leaving the breaker permanently OPEN with 0 failures.

Handle OPEN state in both methods: _onSuccess() now transitions
OPEN→CLOSED, _onFailure() skips redundant re-transition.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 22:36:57 +02:00
diegosouzapw
d71c4a0ea7 fix(db): correct migration versions sequence (014-017) to resolve UNIQUE constraint failure in CI tests 2026-04-02 17:13:36 -03:00
Chris Staley
7f785b8fa5 fix(gemini): refresh Available Models UI after API key add/delete
Auto-sync is fire-and-forget on the server, so the dashboard needs to
poll for model updates after saving a Gemini key (3s delay). On delete,
refresh models immediately since DB cleanup is synchronous.
2026-04-02 12:44:18 -06:00
Chris Staley
b4e674aeb0 fix(gemini): no registry fallback — show 0 models when no API keys exist
Removed hardcoded registry fallback for Gemini in dashboard, catalog,
and v1beta endpoints. Without synced models (no API keys), Gemini shows
nothing. Hardcoded entries are always removed from v1beta regardless
of sync result.
2026-04-02 12:12:57 -06:00
Chris Staley
8ed091703f feat(gemini): per-connection model tracking with cleanup on key delete
Store synced models keyed by providerId:connectionId so each API key's
models are tracked separately. On read, union across all connections.
On connection delete, remove only that key's models. Models with no
remaining connections are automatically excluded.
2026-04-02 12:00:59 -06:00
Chris Staley
464fd6d4d3 fix(v1beta): remove Gemini duplicates — filter non-consecutive entries, skip custom models 2026-04-02 11:47:41 -06:00
Chris Staley
5b140d26c3 feat(api): catalog and v1beta read from synced Gemini models 2026-04-02 11:42:46 -06:00