247 Commits

Author SHA1 Message Date
Diego Rodrigues de Sa e Souza
b100325fe0 chore(release): v3.5.2 — Qoder DashScope Native Integration & Stability (#999)
* feat(qoder): native cosy integration

* feat(qoder): implement native COSY encryption algorithm and remove CLI child instances, plus workflow bumps

* feat(resilience): context overflow fallback, OAuth token detection, empty content guard & context-optimized combo strategy

- Add isContextOverflowError + isContextOverflow detectors (400 + token-limit signals)
- Auto-fallback to next family model on context overflow in chatCore
- Add isEmptyContentResponse to catch fake-success empty responses, trigger fallback + recursive retry
- Add OAUTH_INVALID_TOKEN error type (T11) with isOAuthInvalidToken signal matching; warn instead of deactivating node
- Add getModelContextLimit helper in modelsDevSync (reads limit_context from synced capabilities)
- Upgrade getTokenLimit in contextManager to check models.dev DB before registry (fixes gemini-2.5-pro: 1000000→1048576)
- Add findLargerContextModel in modelFamilyFallback for context-aware model selection
- Add sortModelsByContextSize + context-optimized combo strategy in combo.ts
- Update context-manager unit test for corrected gemini-2.5-pro limit

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(review): address Gemini code review — tool_calls path, infinite recursion, dedup signals, findLargerContextModel

- Fix isEmptyContentResponse: check message.tool_calls/delta.tool_calls instead
  of firstChoice.tool_calls (wrong OpenAI API path, caused tool-call responses
  to be falsely flagged as empty)
- Fix empty content fallback: replace recursive handleChatCore call (infinite
  recursion risk + wrong model due to original body.model) with non-recursive
  pattern — call executeProviderRequest, parse fallback response body, reassign
  responseBody and fall through to existing processing
- Fix context overflow: use findLargerContextModel over family candidates first,
  fall back to getNextFamilyFallback — ensures we pick a model with actually
  larger context window on overflow
- Fix signal dedup: export CONTEXT_OVERFLOW_SIGNALS + CONTEXT_OVERFLOW_REGEX
  from errorClassifier.ts; import shared regex in modelFamilyFallback.ts,
  removing duplicate signal list and per-call RegExp construction

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(UI): add context-optimized strategy to frontend schema and options

* fix(sse): preserve Responses API events in stream translation

When translating Claude-format responses (e.g. GLM) to Responses API
format for Codex CLI, the sanitizer stripped {event, data} structured
items to {"object":"chat.completion.chunk"}, losing all content and
the critical response.completed event.

Only run sanitizeStreamingChunk on OpenAI Chat Completions chunks,
skipping items that have the Responses API {event, data} structure.

* test(sse): add regression test for Claude→Responses stream sanitization

Verifies that {event,data} structured items from the Responses API
translator bypass sanitizeStreamingChunk when translating Claude-format
providers (e.g. GLM) to Responses API format for Codex CLI.

* fix(sse): strengthen Responses API event detection with response. prefix check

Use explicit `response.` prefix check instead of generic `event && data`
presence check, as recommended in PR review.

* fix: pin Next.js to 16.0.10 to prevent Turbopack hashed module bug

Remove ^ prefix from next and eslint-config-next to prevent
automatic upgrades to 16.1.x+ which introduced content-based
hashing for external module references in Turbopack.

Also remove duplicate Material Symbols @import from globals.css
(font already loaded via <link> in layout.tsx).

Fixes #509

* align cc-compatible cache handling with client passthrough

* chore: integrate resilience and turbopack fixes (PRs #992, #990, #987)

* chore(release): bump to v3.5.2 — changelog, docs, version sync

* docs(i18n): sync documentation updates to 33 languages

* fix(qoder): replace any with unknown to comply with strict any-budget

---------

Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
Co-authored-by: oyi77 <oyi77@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Chris Staley <christopher-s@users.noreply.github.com>
Co-authored-by: Ivan <shanin-i2011@yandex.ru>
Co-authored-by: R.D. <rogerproself@gmail.com>
2026-04-05 02:54:44 -03:00
oyi77
cc048e55bf feat: integrate models.dev as authoritative model database with UI controls
- Add models.dev sync engine (src/lib/modelsDevSync.ts) for pricing, capabilities, and model specs
- Fetch from https://models.dev/api.json (109 providers, 4,146+ models, MIT licensed)
- 4-layer pricing resolution: User Override > models.dev > LiteLLM > Hardcoded Default
- New model_capabilities DB table for synced capability data
- UI toggle in Settings > AI tab: enable/disable sync, configure interval (1h-7d), manual sync trigger
- Live stats dashboard showing provider/model/capability counts
- New API route /api/settings/models-dev for sync status and manual triggers
- Fix 39 missing i18n keys across all 30 languages (Memory & Skills tab fully translated)
- 25 unit + integration tests, 1,439 existing tests pass, lint clean, typecheck clean

Closes #979
2026-04-04 18:38:25 +07:00
diegosouzapw
c62145af31 chore: resolve merge conflicts with main (Gemini header auth + custom UA) 2026-04-04 07:35:11 -03:00
Paijo
9148dc9e03 fix(providers): resolve Gemini validation 4xx errors with header-based auth (#977)
Switch validateGeminiLikeProvider from query-param auth (?key=) to
x-goog-api-key header auth, matching the actual request pipeline.

Parse Google error response bodies to distinguish auth failures
(API_KEY_INVALID, API_KEY_EXPIRED, PERMISSION_DENIED) from other
400 errors. Google returns 400 (not 401/403) for invalid keys.

Add 5 new test cases covering 400/401 rejection paths and success.

Fixes #976

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>
2026-04-04 07:32:51 -03:00
Randi
606824d282 fix: providers filter persistence and settings i18n (#970) 2026-04-04 07:32:31 -03:00
R.D.
231ca8a935 support custom user agent for third-party providers 2026-04-04 01:09:51 -04: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
xiaoge1688
a668ac7235 fix(auth): normalize codex alias credential lookup 2026-04-03 23:23:55 +08: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
Randi
be2f7cb3e5 fix(cc-compatible): keep cache ttl ordering valid (#948) 2026-04-03 10:17:21 -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
diegosouzapw
7c76f7443e Merge branch 'pr-946' into release/v3.4.9
# Conflicts:
#	open-sse/utils/stream.ts
2026-04-03 03:28:10 -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
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
Diego Rodrigues de Sa e Souza
7dea0441ac Merge pull request #943 from rdself/coder/fix-github-copilot-body
fix: restore GitHub Copilot combo requests
2026-04-03 03:20:52 -03:00
dalbit-mir
d3058cbe07 fix: preserve Claude Code rendering on responses translation 2026-04-03 15:09:52 +09:00
xiaoge1688
587bab3eb1 fix(gemini): preserve thought signatures across antigravity tool calls 2026-04-03 12:55:57 +08:00
R.D.
629a6936fa fix(github): use copilot token and materialize tls responses 2026-04-03 00:46:41 -04: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
R.D.
bcc374eb31 fix claude oauth and cc-compatible regressions 2026-04-02 20:54:19 -04:00
Chris Staley
6698d33f04 fix(tests): update T28/T31 for gemini dynamic model sync
Gemini AI Studio no longer has a hardcoded model registry — models come
from API sync. Updated tests:
- T28: assert gemini registry is empty (API sync), check gemini-cli instead
- T31: check antigravity static catalog for pro-high/pro-low model IDs
2026-04-02 17:29:03 -06:00
Diego Rodrigues de Sa e Souza
0ae31e0acc Merge pull request #925 from rdself/coder/fix-cloudflared-restart-warning
fix(cloudflared): avoid stale quick tunnel restart state
2026-04-02 14:37:15 -03:00
Diego Rodrigues de Sa e Souza
24721cf2fa Merge pull request #924 from rdself/coder/add-github-copilot-gemini-3-1-pro-preview
feat(github): add Gemini 3.1 Pro Preview to GitHub Copilot
2026-04-02 14:37:10 -03:00
Diego Rodrigues de Sa e Souza
c87167cac4 Merge pull request #921 from rdself/coder/cc-compatible-streaming-ui
Fix CC compatible streaming and compatible provider UI
2026-04-02 14:36:59 -03:00
Diego Rodrigues de Sa e Souza
46311dfaba Merge pull request #918 from rdself/coder/fix-timeout-env-stream-300s
fix: make request and stream timeouts fully env-configurable
2026-04-02 14:36:53 -03:00
Diego Rodrigues de Sa e Souza
3319fd6a21 Merge pull request #916 from oyi77/feat/cliproxyapi-3-version-manager
feat(cliproxyapi): version manager service, API routes, CLI Tools UI & Docker
2026-04-02 14:36:43 -03:00
Diego Rodrigues de Sa e Souza
0f75387f41 Merge pull request #915 from oyi77/feat/cliproxyapi-2-routing
feat(cliproxyapi): executor, proxy routing with SSRF guard & module-level cache
2026-04-02 14:36:37 -03:00
Diego Rodrigues de Sa e Souza
9fd5d8241e Merge pull request #914 from oyi77/feat/cliproxyapi-1-schema-settings
feat(cliproxyapi): DB schema, upstream proxy config & settings UI
2026-04-02 14:36:31 -03:00
Diego Rodrigues de Sa e Souza
0bfee823dd Merge pull request #913 from carmin777/feat/qoder-pat-qodercli
feat(qoder): support PAT via qodercli and remove stale qoder.cn defaults
2026-04-02 14:36:25 -03:00
R.D.
ed72ddc4d3 fix(cloudflared): avoid stale restart state 2026-04-02 05:40:26 -04:00
R.D.
a7fa34c2fc feat(github): add gemini-3.1-pro-preview 2026-04-02 05:27:54 -04:00
R.D.
4d97023938 sync cc compatible available models with claude oauth 2026-04-02 04:16:19 -04:00
R.D.
e7e4bf39fe remove cc compatible models listing configuration 2026-04-02 03:55:02 -04:00
R.D.
bf7d4ebea5 fix cc compatible streaming and compatible provider ui 2026-04-02 03:34:50 -04:00
R.D.
94eb7b155e refactor: add shared request timeout baseline 2026-04-02 03:12:09 -04:00
R.D.
50f12869bf fix: make streaming timeouts env-configurable 2026-04-02 02:59:12 -04:00
oyi77
2e2afa616d feat(cliproxyapi): add version manager service, API routes, CLI Tools UI & Docker
Part 3 of CLIProxyAPI integration (#902). Depends on PR1 + PR2.

- releaseChecker.ts: GitHub releases API with 5min cache
- binaryManager.ts: download, SHA256 verify, install, symlink, rollback
- processManager.ts: spawn, graceful stop (SIGTERM→SIGKILL with interval cleanup), restart
- healthMonitor.ts: periodic /v1/models health checks
- index.ts: orchestrator (install/start/stop/restart/checkUpdates/pin/rollback)
- 6 API routes under /api/version-manager/ with Zod validation
- CliproxyapiToolCard: CLI Tools page card
- Docker: cliproxyapi profile with sidecar service + healthcheck
- 78 unit tests across 5 test files
2026-04-02 13:37:43 +07:00
oyi77
d82a7040f1 feat(cliproxyapi): add executor, proxy routing with SSRF guard & module-level cache
Part 2 of CLIProxyAPI integration (#902). Depends on PR1.

- CliproxyapiExecutor: HTTP bridge to localhost:8317, reuses BaseExecutor.mergeAbortSignals
- Executor registration with cliproxyapi + cpa aliases
- chatCore.ts: resolveExecutorWithProxy() with Object.create (preserves prototype methods)
- Module-level proxy config cache (10s TTL, shared across requests)
- Three routing modes: native (default), cliproxyapi (passthrough), fallback (auto-retry on 5xx/429)
- 21 unit tests for executor
2026-04-02 13:28:46 +07:00
oyi77
8fc97a7f91 feat(cliproxyapi): add DB schema, upstream proxy config & settings UI
Part 1 of CLIProxyAPI integration (#902).

- DB migration for version_manager + upstream_proxy_config tables
- DB modules: versionManager.ts (tool lifecycle CRUD), upstreamProxy.ts (proxy config CRUD + SSRF guard)
- localDb.ts re-exports for new modules
- Provider registration: UPSTREAM_PROXY_PROVIDERS in providers.ts
- Zod validation schemas for version-manager API routes
- Settings UI: CliproxyapiSettingsTab (Advanced tab)
- 47 unit tests for DB modules
2026-04-02 13:27:51 +07:00
carmim777
5789c1ae7d feat(qoder): support PAT via qodercli 2026-04-02 01:35:23 -03:00
Diego Rodrigues de Sa e Souza
e121fec599 Merge pull request #905 from rdself/coder/sqlite-wal-checkpoint-shutdown
Flush SQLite WAL on graceful shutdown
2026-04-02 01:00:50 -03:00
Diego Rodrigues de Sa e Souza
6c669abb23 Merge pull request #909 from christopher-s/fix/responses-api-flush-total-tokens
fix(translator): emit response.completed with total_tokens for Responses API clients
2026-04-02 01:00:34 -03:00
R.D.
de162eb719 fix: drop assistant prefill for cc bridge 2026-04-01 22:48:34 -03:00
R.D.
33297e0226 fix: repair cc compatible v1 route handling 2026-04-01 22:48:34 -03:00
R.D.
a07e643020 fix(model-sync): store real provider in log summary 2026-04-01 22:48:34 -03:00