✨ New Features
- Detailed Token Tracking: Added granular token breakdown columns (cache read, cache write, reasoning) to call logs with proper null vs zero distinction. Includes DB migration 018 and 5-label UI display per provider capability (#1017 — thanks @rdself).
- Legacy JSON Config Import/Export: Restored JSON-based settings export and import for migration from legacy 9router configurations. Security-hardened with Zero-Trust redaction of passwords and
requireLoginfields, and automatic pre-import database backups (#1012 — thanks @luandiasrj). - Non-Stream Aliases: Added API support for explicit non-streaming aliases (
non_stream,disable_stream,disable_streaming,streaming=false), normalized at the boundary before provider translation (#1036 — thanks @wlfonseca). - Russian Dashboard Localization: Comprehensive Russian translation for the dashboard UI, including fixes for 2 Ukrainian locale keys (#1003 — thanks @mercs2910).
🐛 Bug Fixes
- Anthropic Streaming Input Undercount: Fixed a critical bug where Anthropic streaming
prompt_tokensonly reported non-cached tokens (e.g.,in=3when actual total was 113,616). Cache tokens are now summed into prompt_tokens during streaming (#1017). - Built-in Responses API Tool Types: Preserved built-in Responses API tools (
web_search,file_search,computer,code_interpreter,image_generation) from being silently stripped by the empty-name tool filter — these tools carry no.namefield (#1014 — thanks @rdself). - Cursor/Codex Responses Compatibility: Fixed empty output in Cursor when using Codex models by hoisting system input items to
instructions, sanitizing invalid tool names, and detecting Responses-format payloads on chat/completions endpoint (#1002 — thanks @mercs2910). - OAuth Token Expiry Display: Fixed OAuth connections showing "expired" badge even with valid tokens by reading
tokenExpiresAt(updated on refresh) instead ofexpiresAt(original grant timestamp) (#1032 — thanks @tombii). - Codex Fast-Tier Copy: Corrected dashboard settings copy from
service_tier=fasttoservice_tier=priority, matching the actual Codex wire format (#1045 — thanks @kfiramar). - macOS Desktop App Startup: Stabilized packaged macOS app launch by excluding desktop artifacts from the standalone bundle and improving launch path detection (#1004 — thanks @mercs2910).
- macOS Sidebar Layout: Fixed macOS traffic light overlap, sidebar spacing, and button overflow in the Electron desktop app (#1001 — thanks @mercs2910).
⚡ Performance
- Analytics Page Load: Dramatically reduced analytics page load times (30s→1-2s for 50K entries) via date-filtered DB queries, parallel
Promise.all()cost calculations, and merged 6 COUNT queries into a single CASE WHEN aggregate (#1038 — thanks @oyi77).
🔒 Security & Dependencies
- Node Base Image: Upgraded Docker base from
22-bookworm-slimto22.22.2-trixie-slim(#1011 — Snyk). - Production Dependencies: Bumped 5 production dependencies (#1044 — Dependabot).
- Vite: Bumped from 8.0.3 to 8.0.5 (#1031 — Dependabot).
- Development Dependencies: Bumped 4 development dependencies (#1030 — Dependabot).
🧪 Tests
- Token Accounting Tests: Added 18 new unit tests covering detailed token breakdown, null vs zero semantics, per-provider token extraction, and Anthropic streaming input fix (#1017).
- Built-in Tool Tests: Added 3 new test cases for built-in Responses API tool type preservation (#1014).
- ChatCore Sanitization: Updated sanitization tests to accommodate Responses format detection (PR #1002) and built-in tool preservation (PR #1014).
🛠️ Maintenance
- PR Workflow: Updated
/review-prsworkflow to merge PRs into the release branch (release/vX.Y.Z) instead of directly intomain, ensuring proper pre-release staging.
Coverage
- 2537 tests, 2532 passing — Statement coverage: 91.95%, Branch coverage: 78.79%, Function coverage: 93.19%
What's Changed
- [Snyk] Security upgrade node from 22-bookworm-slim to 22.22.2-trixie-slim by @diegosouzapw in #1011
- deps: bump the production group across 1 directory with 5 updates by @dependabot[bot] in #1044
- deps: bump vite from 8.0.3 to 8.0.5 by @dependabot[bot] in #1031
- deps: bump the development group with 4 updates by @dependabot[bot] in #1030
- fix: preserve built-in Responses API tool types in empty-name filter by @rdself in #1014
- feat: detailed token tracking + fix Anthropic input undercount by @rdself in #1017
- fix(ui): use tokenExpiresAt for OAuth token expiry display by @tombii in #1032
- feat(api): aceitar aliases explícitos para resposta sem stream by @wlfonseca in #1036
- perf: reduce analytics page load — DB filter, parallel costs, merged queries by @oyi77 in #1038
- feat: restore legacy JSON config import/export by @luandiasrj in #1012
- fix(settings): align Codex fast-tier copy with the actual wire value by @kfiramar in #1045
- fix(codex): improve Cursor/Codex Responses compatibility by @mercs2910 in #1002
- feat(i18n): add Russian dashboard localization by @mercs2910 in #1003
- fix(desktop): stabilize packaged app startup on macOS by @mercs2910 in #1004
- chore(release): v3.5.4 by @diegosouzapw in #1052
New Contributors
- @wlfonseca made their first contribution in #1036
- @luandiasrj made their first contribution in #1012
- @mercs2910 made their first contribution in #1002
Full Changelog: v3.5.3...v3.5.4