Commit Graph

3952 Commits

Author SHA1 Message Date
oyi77
ac10d25f5f feat(settings): add appearance tab and whitelabeling features
- Add dedicated 'appearance' tab to settings navigation
- Move AppearanceTab from general to dedicated tab
- Add whitelabeling fields to Zod schema (customLogoUrl, customLogoBase64)
- Add whitelabeling UI section with:
  - App name customization
  - Custom logo URL input
  - Logo file upload with preview
  - Reset to default functionality
- Add i18n keys for whitelabeling features

This allows users to customize the application name and logo for white-labeling purposes.
2026-04-01 03:41:47 +07:00
diegosouzapw
597a0f21e0 chore: rollback to 3.4.1, add env migration script, restore debug menu, and consolidate orphaned a2a/mcp routes 2026-03-31 16:14:47 -03:00
gmw
4c15a83e9c docs: Translate the Chinese version of the document 2026-04-01 02:28:14 +08:00
Chris Staley
2df8b234fe fix: address PR review feedback
- Deduplicate in-flight loadCodeAssist requests to prevent thundering herd
- Add typeof guard on cloudaicompanionProject.id before calling .trim()
- Evict oldest cache entry when all entries are still valid
- Fix unwrapGeminiChunk to use explicit null-safe check
- Update test description for null response case
2026-03-31 11:41:19 -06:00
Chris Staley
d852a51672 fix: refresh Gemini CLI project ID via loadCodeAssist to prevent 403 errors
The stored projectId from OAuth connection time becomes stale because the
Cloud Code API rotates free-tier projects. Native Gemini CLI refreshes the
project every 30 seconds via loadCodeAssist — OmniRoute never did, causing
403 "has not been used in project X" errors that permanently banned accounts.

- Add refreshProject() to GeminiCLIExecutor that calls loadCodeAssist API
  with 10s timeout and caches the result for 30s (matching native CLI)
- transformRequest() replaces the stale projectId in the envelope before
  sending to the Cloud Code API, falling back to the stored ID on failure
- Make transformRequest calls await-compatible in base executor and
  all subclasses (antigravity, cursor, kiro) so async overrides work
2026-03-31 11:13:04 -06:00
Chris Staley
5ec8d943a3 fix: resolve Gemini CLI 403 project-routing errors and content accumulation
- Remove x-goog-user-project header and executor-level project override
  that caused 403 "Cloud Code Private API has not been used in project X"
- Add PROJECT_ROUTE_ERROR classifier type so project-routing 403s don't
  permanently ban accounts (keeps accounts active, tracks the error)
- Fix Cloud Code envelope unwrapping for content accumulation in stream.ts
  (Cloud Code wraps responses in { response: { candidates: [...] } })
- Extract unwrapGeminiChunk() into streamHelpers.ts with format guard
- Remove _currentModel singleton race condition from GeminiCLIExecutor
- Add handler for PROJECT_ROUTE_ERROR in chatCore.ts
- Add TODO in antigravity.ts about same stale-project risk
- Add 7 unit tests for error classifier and stream unwrap paths
2026-03-31 09:22:30 -06:00
diegosouzapw
9b4a5523cc docs: add Void Linux install template to README and translations (#732) 2026-03-31 11:37:29 -03:00
Diego Rodrigues de Sa e Souza
70a4d38d04 Release v3.4.0 (Integration) (#861)
* test(settings): add unit tests for debugMode and hiddenSidebarItems

Tests cover:
- PATCH debugMode=true/false
- PATCH hiddenSidebarItems with array values
- Combined updates with both fields

* test(e2e): add Playwright tests for settings toggles

Tests cover:
- Debug mode toggle on/off
- Sidebar visibility toggle
- Settings persistence after page reload

* fix(tests): address code review issues

- Unit tests: fix async/await for getSettings, use direct db functions
- E2E tests: remove conditional logic, use Playwright auto-waiting assertions

* feat(logging): unify request log retention and artifacts

* docs: add dashboard settings toggles to CONTRIBUTING

Add section documenting:
- Debug Mode toggle (Settings → Advanced)
- Sidebar Visibility toggle (Settings → General)

* fix(cache): only inject prompt_cache_key for supported providers

Only inject prompt_cache_key for providers that support prompt caching
(Claude, Anthropic, ZAI, Qwen, DeepSeek). This fixes issue #848 where
NVIDIA API rejected the parameter.

* fix(model-sync): log only channel-level model changes

* feat(providers): add 4 free models to opencode-zen

* feat(providers): add explicit contextLength for opencode-zen free models

* feat(providers): add contextLength for all opencode-zen models

* feat: Improve the Chinese translation

* fix: preserve client cache_control for all Claude-protocol providers

Previously, the cache control preservation logic only recognized a
hardcoded list of providers (claude, anthropic, zai, qwen, deepseek).
This caused OmniRoute to inject its own cache_control markers for
Claude-protocol providers not in that list (bailian-coding-plan, glm,
minimax, minimax-cn, etc.), overwriting the client's cache markers.

The fix checks both:
1. Known caching providers list (existing behavior)
2. Whether targetFormat === 'claude' (all Claude-protocol providers)

This ensures all Claude-compatible providers properly preserve client
cache_control headers when appropriate (Claude Code client, deterministic
routing, etc.).

Also removes unused CacheStatsCard from settings/components (duplicate
of the one in cache/ page).

Fixes cache token calculation for GLM, Minimax, and other Claude-compatible providers.

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

* fix: pure passthrough for Claude→Claude when cache_control preserved

The Claude passthrough path round-trips through OpenAI format
(claude→openai→claude) for structural normalization. This strips
cache_control markers from every content block since OpenAI format
has no equivalent, causing ~42k cache creation tokens per request
with zero cache reads.

When preserveCacheControl is true (Claude Code client, "always"
setting, or deterministic combo), skip the round-trip entirely and
forward the body as-is. Claude Code sends well-formed Messages API
payloads — the normalization was only needed for non-Code clients.

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

* fix: restore CacheStatsCard — was not a duplicate

The first commit incorrectly deleted CacheStatsCard from
settings/components/ as a "duplicate". It's the only copy — both
settings/page.tsx and cache/page.tsx import from this location.

Restored the i18n-ized version from main.

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

* fix(429): parse long quota reset times from error body

- Parse XhYmZs format from antigravity error messages (e.g., 27h41m36s)
- Dynamic retry-after threshold (60s default) instead of hardcoded 10s
- Add parseRetryFromErrorText() in accountFallback.ts for body parsing
- Fix 403 'verify your account' to trigger permanent deactivation
- Add keyword matching for 'quota will reset', 'exhausted capacity'
- Add unit tests for retry parsing and keyword matching

Fixes #858 (Antigravity 429 handling)
Fixes #832 (Qwen quota 429 - same underlying bug)

* chore: bump version to v3.4.0-dev

* fix(migrations): rename 013 to 014 to avoid collision with v3.3.11

* chore(docs): update CHANGELOG for v3.4.0 integrations

* fix: Claude token refresh, Antigravity quota, and 429 rate-limit handling

- Fix Claude OAuth token refresh to use form-urlencoded format (standard OAuth2)
- Add anthropic-beta header required by Claude OAuth API
- Switch Antigravity quota to use retrieveUserQuota API (same as Gemini CLI)
- Parse quota reset time for all providers (not just Antigravity)
- Add quota reset keywords to error classifier
- Cap maximum retry time at 24 hours to prevent infinite wait

Closes #836, #857, #858, #832

* fix(dashboard): resolve /dashboard/limits hanging UI with 70+ accounts via chunk parallelization (#784)

---------

Co-authored-by: oyi77 <oyi77@users.noreply.github.com>
Co-authored-by: R.D. <rogerproself@gmail.com>
Co-authored-by: kang-heewon <heewon.dev@gmail.com>
Co-authored-by: gmw <rorschach1167@qq.com>
Co-authored-by: tombii <github@tombii.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
v3.4.0
2026-03-31 10:22:52 -03:00
diegosouzapw
0ad8576ae5 fix(dashboard): resolve /dashboard/limits hanging UI with 70+ accounts via chunk parallelization (#784) 2026-03-31 10:21:38 -03:00
diegosouzapw
e712883ce1 Merge PR #862: fix: Claude token refresh, Antigravity quota, and 429 rate-limit handling 2026-03-31 09:33:22 -03:00
oyi77
c0f9b33bba fix: Claude token refresh, Antigravity quota, and 429 rate-limit handling
- Fix Claude OAuth token refresh to use form-urlencoded format (standard OAuth2)
- Add anthropic-beta header required by Claude OAuth API
- Switch Antigravity quota to use retrieveUserQuota API (same as Gemini CLI)
- Parse quota reset time for all providers (not just Antigravity)
- Add quota reset keywords to error classifier
- Cap maximum retry time at 24 hours to prevent infinite wait

Closes #836, #857, #858, #832
2026-03-31 19:30:15 +07:00
diegosouzapw
6de76ea5d1 chore(docs): update CHANGELOG for v3.4.0 integrations 2026-03-31 09:18:00 -03:00
diegosouzapw
262e72d541 fix(migrations): rename 013 to 014 to avoid collision with v3.3.11 2026-03-31 09:13:25 -03:00
diegosouzapw
2f765529e5 Merge PR #851: feat(logging): unify request log retention and artifacts 2026-03-31 09:11:57 -03:00
diegosouzapw
bcea92e313 chore: bump version to v3.4.0-dev 2026-03-31 09:11:38 -03:00
diegosouzapw
56ef849868 Merge PR #850: test: add unit and E2E tests for settings toggles 2026-03-31 09:11:11 -03:00
diegosouzapw
2a0c4d2b0d Merge PR #853: fix(model-sync): log only real channel model changes 2026-03-31 09:11:10 -03:00
diegosouzapw
d4ad9b3778 Merge PR #854: feat(providers): add 4 free models to opencode-zen 2026-03-31 09:11:09 -03:00
diegosouzapw
df972b9ae9 Merge PR #855: feat: Improve the Chinese translation 2026-03-31 09:11:07 -03:00
diegosouzapw
f695559379 Merge PR #856: fix: preserve client cache_control for all Claude-protocol providers 2026-03-31 09:11:02 -03:00
diegosouzapw
3fa7828324 Merge PR #859: fix(429): parse long quota reset times from error body 2026-03-31 09:10:56 -03:00
Diego Rodrigues de Sa e Souza
dbe17b4b16 Merge pull request #860 from diegosouzapw/release/v3.3.11
chore(release): v3.3.11 — analytics, backup control, CLI fixes, workflow unification
v3.3.11
2026-03-31 08:20:04 -03:00
diegosouzapw
ee4df2806f chore(release): v3.3.11 — analytics, backup control, CLI fixes, workflow unification 2026-03-31 08:17:07 -03:00
oyi77
a405f2e81e fix(429): parse long quota reset times from error body
- Parse XhYmZs format from antigravity error messages (e.g., 27h41m36s)
- Dynamic retry-after threshold (60s default) instead of hardcoded 10s
- Add parseRetryFromErrorText() in accountFallback.ts for body parsing
- Fix 403 'verify your account' to trigger permanent deactivation
- Add keyword matching for 'quota will reset', 'exhausted capacity'
- Add unit tests for retry parsing and keyword matching

Fixes #858 (Antigravity 429 handling)
Fixes #832 (Qwen quota 429 - same underlying bug)
2026-03-31 17:59:54 +07:00
diegosouzapw
afc0bc9323 fix: resolve CLI detection regression and model catalog tests 2026-03-31 07:57:43 -03:00
tombii
ce28dcc630 fix: restore CacheStatsCard — was not a duplicate
The first commit incorrectly deleted CacheStatsCard from
settings/components/ as a "duplicate". It's the only copy — both
settings/page.tsx and cache/page.tsx import from this location.

Restored the i18n-ized version from main.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 11:40:55 +02:00
tombii
892830e125 fix: pure passthrough for Claude→Claude when cache_control preserved
The Claude passthrough path round-trips through OpenAI format
(claude→openai→claude) for structural normalization. This strips
cache_control markers from every content block since OpenAI format
has no equivalent, causing ~42k cache creation tokens per request
with zero cache reads.

When preserveCacheControl is true (Claude Code client, "always"
setting, or deterministic combo), skip the round-trip entirely and
forward the body as-is. Claude Code sends well-formed Messages API
payloads — the normalization was only needed for non-Code clients.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 11:17:05 +02:00
tombii
75425ab1a9 fix: preserve client cache_control for all Claude-protocol providers
Previously, the cache control preservation logic only recognized a
hardcoded list of providers (claude, anthropic, zai, qwen, deepseek).
This caused OmniRoute to inject its own cache_control markers for
Claude-protocol providers not in that list (bailian-coding-plan, glm,
minimax, minimax-cn, etc.), overwriting the client's cache markers.

The fix checks both:
1. Known caching providers list (existing behavior)
2. Whether targetFormat === 'claude' (all Claude-protocol providers)

This ensures all Claude-compatible providers properly preserve client
cache_control headers when appropriate (Claude Code client, deterministic
routing, etc.).

Also removes unused CacheStatsCard from settings/components (duplicate
of the one in cache/ page).

Fixes cache token calculation for GLM, Minimax, and other Claude-compatible providers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 11:17:05 +02:00
gmw
2722847a59 feat: Improve the Chinese translation 2026-03-31 15:16:51 +08:00
kang-heewon
641f84e9f8 feat(providers): add contextLength for all opencode-zen models 2026-03-31 14:54:56 +09:00
kang-heewon
1f0a5842f9 feat(providers): add explicit contextLength for opencode-zen free models 2026-03-31 14:53:09 +09:00
kang-heewon
28c2fb92a8 feat(providers): add 4 free models to opencode-zen 2026-03-31 14:46:34 +09:00
R.D.
715101cf5e fix(model-sync): log only channel-level model changes 2026-03-31 00:44:38 -04:00
oyi77
ac37a44ffa fix(cache): only inject prompt_cache_key for supported providers
Only inject prompt_cache_key for providers that support prompt caching
(Claude, Anthropic, ZAI, Qwen, DeepSeek). This fixes issue #848 where
NVIDIA API rejected the parameter.
2026-03-31 11:30:03 +07:00
oyi77
ae3d2bebbe docs: add dashboard settings toggles to CONTRIBUTING
Add section documenting:
- Debug Mode toggle (Settings → Advanced)
- Sidebar Visibility toggle (Settings → General)
2026-03-31 11:21:30 +07:00
R.D.
f8d4e1a307 feat(logging): unify request log retention and artifacts 2026-03-31 00:19:55 -04:00
oyi77
b98d6984a1 fix(tests): address code review issues
- Unit tests: fix async/await for getSettings, use direct db functions
- E2E tests: remove conditional logic, use Playwright auto-waiting assertions
2026-03-31 11:15:54 +07:00
oyi77
8f5c9a3c72 test(e2e): add Playwright tests for settings toggles
Tests cover:
- Debug mode toggle on/off
- Sidebar visibility toggle
- Settings persistence after page reload
2026-03-31 10:54:07 +07:00
diegosouzapw
e071393eb5 chore(release): v3.3.10 — version bump and docs v3.3.10 2026-03-31 00:16:51 -03:00
Diego Rodrigues de Sa e Souza
6f9fec658f chore(release): v3.3.10 — merge Analytics and SQLite fixes (#849)
Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
2026-03-31 00:15:20 -03:00
Owen
9227964cb6 feat(analytics): add subscription utilization analytics (#847)
- Add quota_snapshots table for time-series quota tracking
- Add QuotaSnapshot DB module with CRUD + cleanup (6h gate)
- Add snapshot save hook in quotaCache.setQuotaCache()
- Add Provider Utilization API: GET /api/usage/utilization
- Add Combo Health API: GET /api/usage/combo-health
- Add ProviderUtilizationTab with recharts LineChart
- Add ComboHealthTab with quota/skew/performance metrics
- Add TimeRangeSelector component (1h/24h/7d/30d)
- Integrate tabs into /dashboard/analytics
- Add unit tests for quotaSnapshots module
- Add E2E tests for analytics tabs
- Add i18n keys for 33 languages
2026-03-31 00:12:27 -03:00
Randi
cf6056cede Add env flag to disable automatic SQLite backups (#846)
* feat(db): allow disabling sqlite auto backups

* chore(db): rename sqlite auto backup env flag
2026-03-31 00:12:23 -03:00
Diego Rodrigues de Sa e Souza
4397612349 Merge pull request #842 from rdself/coder/fix-codex-fast-tier-light-mode
Restore Codex fast tier toggle visibility in light mode
2026-03-30 23:24:44 -03:00
diegosouzapw
cf3719a663 Merge pull request #843 from rdself/coder/provider-limits-last-refreshed with i18n synchronization 2026-03-30 23:24:41 -03:00
diegosouzapw
77bf35d728 chore(i18n): sync lastUsed key across all 30 languages 2026-03-30 23:11:55 -03:00
R.D.
e7addec0a1 fix(usage): track provider limit refreshes per account 2026-03-30 21:17:24 -04:00
R.D.
243d61d95f fix(ui): restore codex service tier toggle contrast 2026-03-30 21:14:52 -04:00
Diego Rodrigues de Sa e Souza
028874fd05 Merge pull request #840 from diegosouzapw/release/v3.3.9
chore(release): v3.3.9 — summary
v3.3.9
2026-03-30 21:38:32 -03:00
diegosouzapw
6d366fe80f chore(release): v3.3.9 — custom provider key rotation fix 2026-03-30 21:33:21 -03:00
Diego Rodrigues de Sa e Souza
0924f767e9 Merge pull request #839 from diegosouzapw/fix/issue-815-custom-provider-key-rotation
fix: rotate extra api keys for custom providers (#815)
2026-03-30 21:30:56 -03:00