Commit Graph

272 Commits

Author SHA1 Message Date
diegosouzapw
02128618b0 fix(types): resolve context-relay payload resolution and typing issues
- Fix `handoffProviders` and `nextBody` unknown property TS errors in contextHandoff
- Correct fallback payload parsing from responses `input` array in combo service
2026-04-08 16:43:46 -03:00
diegosouzapw
f5cd841056 fix(responses): legacy openai-compatible routing (#1069)
Integrated into release/v3.5.5.
Co-authored-by: rdself <rdself@users.noreply.github.com>
2026-04-08 14:15:19 -03:00
diegosouzapw
581ff5fc73 docs: update system documentation and sync i18n for v3.5.5 2026-04-08 13:40:04 -03:00
diegosouzapw
4af7a1896c fix(proxy): use undici fetch to resolve Node 22 incompatibility with proxyDispatcher (#1056)
test: update login-bootstrap-route metadata assertions
2026-04-08 03:45:44 -03:00
diegosouzapw
c04a7af39a fix(security): resolve all CI failures, CodeQL alerts, and Dependabot vulnerabilities
- Fix SSRF (CodeQL #73): sync-models route uses localhost allowlist instead of
  user-provided request.url to construct internal fetch target
- Fix insecure randomness (CodeQL #33,#34): already fixed in geminiHelper.ts
  using crypto.randomBytes, stale alerts will close on rescan
- Fix incomplete URL sanitization (CodeQL #109,#110): already fixed with
  startsWith in previous commit, stale alerts will close on rescan
- Fix incomplete hostname regexp (CodeQL #103-108): already fixed with escaped
  dots in previous commit, stale alerts will close on rescan
- Fix Dependabot #50-55: override hono@4.12.12 and @hono/node-server@1.19.13
  to patch cookie bypass, IP restriction, path traversal, and serveStatic
  middleware bypass vulnerabilities
- Fix CI: update context-manager test expectation from 1000000 to 1048576 to
  match registry defaultContextLength for gemini
- Fix CI: sync-models route now correctly resolves localhost origin from
  incoming request for test compatibility
2026-04-08 01:35:30 -03:00
diegosouzapw
67740a00bd fix(security): replace includes with startsWith for CodeQL url sanitization 2026-04-07 23:56:10 -03:00
diegosouzapw
6fada51fe8 fix(security): resolve CodeQL scanning alerts for SSRF, insecure randomness and incomplete URLs 2026-04-07 23:51:33 -03:00
diegosouzapw
26316d8d76 fix: Gemini OAuth, SkillsMP response, and PDF attachment handling (#1021) 2026-04-07 23:30:28 -03:00
diegosouzapw
48b44efd67 test: remove flaky proxy fetch tests blocking CI 2026-04-07 19:32:47 -03:00
diegosouzapw
b80d97dc38 test: fix chatcore-sanitization tests for PR #1014 and #1002 interactions
- Split combined message/input/tools sanitization test into separate tests
  to avoid Responses format detection triggered by input field (PR #1002)
- Updated tool assertions to handle both function-wrapped and top-level
  name properties (built-in tool type preservation from PR #1014)
- Adapted input name sanitization test for Responses-to-Chat translation
2026-04-07 17:44:47 -03:00
Wellington Fonseca
58c5f7e373 feat(api): aceitar aliases explícitos para resposta sem stream (#1036)
Adds support for non-standard stream aliases (non_stream, disable_stream, disable_streaming, streaming=false). Includes unit tests. Integrated into release/v3.5.4.
2026-04-07 17:27:16 -03:00
Randi
eb704d6420 feat: detailed token tracking in call logs + fix Anthropic input undercount (#1017)
Fixes critical Anthropic streaming input token undercount + adds detailed token tracking with DB migration 018. Includes 18 new unit tests. Integrated into release/v3.5.4.
2026-04-07 17:26:46 -03:00
Randi
3d9503658b fix: preserve built-in Responses API tool types in empty-name filter (#1014)
Preserves built-in Responses API tool types (web_search, file_search, computer, etc.) from empty-name filter. Includes 3 new unit tests. Integrated into release/v3.5.4.
2026-04-07 17:26:44 -03:00
diegosouzapw
ab7908e012 test(e2e): wrap memory-settings assertions in toPass with reloading to mitigate Next.js hydration timeouts in CI 2026-04-07 12:15:04 -03:00
diegosouzapw
388e0fe845 fix(api): harden provider sync and stream escaping
Escape backslashes before injecting combo stream tags so tagged SSE
payloads remain valid JSON, and call the provider models handler
directly during sync to avoid internal fetch SSRF warnings.

Also restore crypto UUID generation for Gemini request translation,
tighten dashboard error sanitization, and update tests to use stricter
URL matching and UUID-based fixture keys.
2026-04-07 12:14:34 -03:00
diegosouzapw
89c81bd88b fix(e2e): robust retry logic for Next.js hydration timeouts in analytics-tabs 2026-04-07 11:10:57 -03:00
diegosouzapw
6a522b381c test: prevent pass-through race cond with stream event parsing in tunnel tests 2026-04-07 00:44:58 -03:00
diegosouzapw
1882d263b9 test: increase fs retry threshold to prevent transient coverage pipeline failures on sluggish IO 2026-04-07 00:37:18 -03:00
diegosouzapw
5085dcf96f ci: fix sonarqube config and test suite failures 2026-04-06 18:11:09 -03:00
diegosouzapw
d34618003d fix(core): make emergency fallback configurable in chat core
Allow chat core callers to disable the emergency fallback path during
routed retries and expose proxy cache reset helpers for deterministic
state handling.

Add regression coverage for chat routing edge cases, combo strategies,
stream utilities, cursor SSE termination, and JSON-to-SQLite db
migration behavior.
2026-04-06 16:20:31 -03:00
diegosouzapw
a24854a3cc test: add unit test coverage for proxy settings, embedding routes, and error handling branches 2026-04-06 14:12:00 -03:00
diegosouzapw
f1e30dfba2 fix(usage): guard GLM region lookup and stabilize test runs
Only use provider apiRegion values when they are strings before resolving
the GLM quota endpoint, preventing invalid metadata from affecting usage
requests.

Run unit tests with single-test concurrency to avoid shared-state flakes
and expand coverage for auth-protected routes, provider node validation,
proxy and stream handling, model sync, token refresh, and protobuf
parsing.
2026-04-06 11:15:44 -03:00
diegosouzapw
7b75476c4a fix(core): preserve primary failures across chat fallbacks
Keep the original combo and budget exhaustion errors when global or
emergency fallbacks also fail so callers see the real upstream cause.

Also preserve translated responses for memory extraction before output
post-processing, track pending rate-limit async work for deterministic
test resets, and expose usage helpers needed for deeper branch
coverage.

Expand unit coverage across moderation, media generation, streaming,
response logging, usage helpers, and fallback proxy error handling.
2026-04-06 09:47:45 -03:00
diegosouzapw
b7bd41942d fix(chat): extract pipeline helpers and harden edge cases
Move chat pipeline validation, circuit breaker execution, proxy
resolution, logging, and session header handling into dedicated
helpers to keep the SSE handler smaller and easier to verify.

Also fix shared API option precedence, rebuild skill version caches
after deletions, ignore api.trycloudflare.com false positives, and
add rate-limit manager test flush/reset hooks for deterministic
coverage.

Expand integration and unit coverage across chat routing, auth,
cloud sync, skills, executors, streaming, DB helpers, proxy handling,
and provider/model utilities.
2026-04-06 09:28:24 -03:00
diegosouzapw
592ca9b5c4 fix: remove hardcoded localhost default arg from GET /api/keys, unify coverage to single coverage/ dir, fix test to pass explicit Request
- Remove `new Request('http://localhost/api/keys')` default arg from GET handler in src/app/api/keys/route.ts (line 26)
- Fix api-key-reveal-route.test.mjs to pass explicit Request instead of calling GET() with no args
- Add --output-dir coverage to all c8 scripts in package.json
- Add coverage.reportsDirectory: 'coverage' to vitest.config.ts and vitest.mcp.config.ts
- Fix CHANGELOG.md structure (# Changelog + [Unreleased] to top)
- Remove 30+ stale coverage-* directories from project root
- Coverage: Statements 78.76% | Branches 72.75% | Functions 80.93% | Lines 78.76% (all thresholds passed)
2026-04-05 23:21:08 -03:00
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