Commit Graph

3952 Commits

Author SHA1 Message Date
diegosouzapw
6fc66eaba7 fix(catalog): cherry-pick type safety from PR #2152 — remove .ts imports, as any casts, add CustomModelEntry/ComboModelStep types
Co-authored-by: herjarsa <herjarsa@users.noreply.github.com>
2026-05-11 10:18:25 -03:00
backryun
6e2c5e2d4c chore(models): tidy up alibaba-coding-plan and cursor provider (#2150)
Integrated into release/v3.8.0 — tidies up Alibaba Coding Plan and Cursor provider model catalogs
2026-05-11 10:08:34 -03:00
Gioxa
fca89049c9 fix(openai-responses): propagate include so chat clients stream reasoning summaries (#2154)
Integrated into release/v3.8.0 — propagates include array so chat clients stream reasoning summaries via Responses API
2026-05-11 10:06:31 -03:00
Gioxa
1814d2bde0 fix(kiro): synthesize tools schema when history references tool_calls without body.tools (#2149)
Integrated into release/v3.8.0 — synthesizes tools schema for Kiro when body.tools is omitted but history has tool_calls
2026-05-11 10:06:05 -03:00
Gioxa
fdb4c63244 fix(kiro): avoid treating high-traffic 429s as quota exhaustion (#2153)
Integrated into release/v3.8.0 — fixes transient Kiro 429s being incorrectly classified as quota exhaustion
2026-05-11 10:05:48 -03:00
diegosouzapw
19c15a5139 chore(hooks): disable husky pre-push test enforcement
Comment out the npm availability guard and unit test execution in the
pre-push hook so pushes are no longer blocked by local hook checks. This
shifts validation away from developer machines and avoids failures in
environments where npm is unavailable or hooks are undesired.
2026-05-11 09:28:14 -03:00
diegosouzapw
bbecbccb0a fix(cli): harden setup, doctor, and backup workflows
Hide admin password entry during setup, make doctor degrade to warnings
when source-only runtime checks are unavailable, and improve stop
behavior by attempting graceful shutdown before force killing ports.

Also use SQLite's backup API for safer snapshots under WAL, align CLI
key writes with the current provider_connections schema, and include
follow-on compatibility fixes for GLM provider detection, stream error
sanitization, and auth-aware test coverage.
2026-05-11 09:13:49 -03:00
Automation
66d5808d4a refactor(catalog): replace bracket-access with CustomModelEntry interface
Addresses code review feedback from PR #2152: use a proper
CustomModelEntry interface instead of Record<string, unknown>
bracket-access for custom model fields like inputTokenLimit.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 09:43:19 +02:00
Automation
360a97b654 refactor(catalog): remove .ts import extensions, as any casts, and normalize alias resolution
Addresses code review feedback from PR #2136:

- Remove .ts extensions from @omniroute/open-sse imports for better
  module resolution
- Replace all as any casts with proper types: ComboModelStep for
  combo step iteration, Record<string, unknown> bracket access for
  custom model fields, ManagedAvailableModel.contextLength type
  for fallback models, and Error instanceof check for catch blocks
- Normalize provider alias resolution in combo context_length
  calculation via resolveCanonicalProviderId for consistent
  getTokenLimit lookups

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 09:27:55 +02:00
Ramel Tecnologia
66d5d40a7d feat(resilience): expose model cooldown list with manual re-enable 2026-05-11 01:09:14 -03:00
diegosouzapw
7d8b783195 fix(types): remove extraneous config/models from AutoComboConfig returns and type seedConnection overrides 2026-05-11 00:13:20 -03:00
diegosouzapw
966e411ecb docs(changelog): add PR #2141 entry and update contributor credits 2026-05-10 23:48:38 -03:00
backryun
602f897c50 fix: remove duplicate cloud agent provider constants (#2141)
Integrated into release/v3.8.0 — Kiro model alias normalization (dash→dot), trimmed duplicate catalog entries, and new tests.
2026-05-10 23:47:20 -03:00
Diego Rodrigues de Sa e Souza
67af6c303f Add claude GitHub actions 1778466254012 (#2142)
* "Claude PR Assistant workflow"

* "Claude Code Review workflow"
2026-05-10 23:36:43 -03:00
diegosouzapw
c5967381d6 docs(changelog): add entries for PRs #2136, #2137, #2138, #2140 and update contributor credits 2026-05-10 21:27:18 -03:00
Davy Massoneto
4e53fba8b9 fix(sanitizer): preserve reasoning_content on assistant messages with tool_calls (#2140)
Integrated into release/v3.8.0 — preserves reasoning_content on assistant messages with tool_calls/function_call, fixing Kimi 400 errors.
2026-05-10 21:25:32 -03:00
diegosouzapw
0f748cb732 Merge remote-tracking branch 'origin/release/v3.8.0' into bugfix/preserve-reasoning-content-tool-calls 2026-05-10 21:25:18 -03:00
diegosouzapw
f8812b95c7 Merge remote-tracking branch 'origin/release/v3.8.0' into fix/combo-context-length-auto-calc
# Conflicts:
#	tests/unit/models-catalog-route.test.ts
2026-05-10 21:24:21 -03:00
diegosouzapw
fa1295d3cf Merge remote-tracking branch 'origin/release/v3.8.0' into bugs/2120_docker
# Conflicts:
#	open-sse/executors/antigravity.ts
#	open-sse/services/accountFallback.ts
#	open-sse/services/usage.ts
#	open-sse/translator/helpers/geminiHelper.ts
#	open-sse/utils/error.ts
#	src/lib/db/apiKeys.ts
2026-05-10 21:22:21 -03:00
diegosouzapw
8b3f170b38 Merge branch 'release/v3.8.0' of https://github.com/diegosouzapw/OmniRoute into release/v3.8.0
# Conflicts:
#	open-sse/services/autoCombo/virtualFactory.ts
2026-05-10 21:21:31 -03:00
backryun
110fa35d04 fix: restore cloud agent provider exports and logger import (#2138)
Integrated into release/v3.8.0 — cloud agent provider exports and logger import fixes were already present in the release branch. Thank you for the quick response to the crash report!
2026-05-10 21:20:39 -03:00
diegosouzapw
ee408653dd fix(chatcore): stop leaking provider credentials in response headers
Remove upstream provider headers from non-stream chatCore JSON responses to
prevent authorization and API key values from being exposed to clients.

Add coverage to verify sensitive provider request headers are omitted while
OmniRoute metadata headers remain present.
2026-05-10 21:16:52 -03:00
DavyMassoneto
82a5bb3778 chore(sanitizer): remove explanatory reasoning comments
Keep the tool/function-call preservation logic intact while removing noisy implementation comments from the PR diff.

Co-Authored-By: OpenClaude (dmassoneto) <openclaude@gitlawb.com>
2026-05-10 21:12:30 -03:00
diegosouzapw
40bd60959e refactor(core): strengthen typing and normalize auth and model flows
Tighten executor, usage, model-resolution, and state-management
code with explicit types and safer record handling to reduce runtime
edge cases across providers.

Also normalize management-token failures to 403 responses, require API
keys consistently on cloud agent task routes with CORS-safe errors,
refresh stale Gemini CLI project IDs, prioritize Gemini search tools
correctly, add new provider/model registry entries, and serialize
integration tests for more reliable CI.
2026-05-10 20:48:03 -03:00
DavyMassoneto
9e7cb90a01 fix(sanitizer): preserve reasoning_content on assistant messages with tool_calls
When thinking is enabled on models like Kimi, assistant messages containing

tool_calls must also include reasoning_content. The response sanitizer was

incorrectly stripping reasoning_content whenever visible content existed,

breaking subsequent requests with:

  thinking is enabled but reasoning_content is missing in assistant tool

  call message

Now reasoning_content is preserved when tool_calls are present, while still

being stripped for plain text responses to avoid client rendering issues.

- Add condition !msgRecord.tool_calls before deleting reasoning_content

- Update existing test to expect preserved reasoning_content with tool_calls

- Add TDD tests covering both preservation and stripping behaviors

- Add translator tests for reasoning_content + tool_calls handling

Co-Authored-By: OpenClaude (dmassoneto) <openclaude@gitlawb.com>
2026-05-10 20:29:53 -03:00
Markus Hartung
bff9a0c4a6 refactor: improve type safety and add cloud agent providers
- Update types in several files to reduce usage of `any`
- Fix `fetch` body type error in `AntigravityExecutor` by returning `ReadableStream`
- Add `CLOUD_AGENT_PROVIDERS` constants

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-11 00:41:36 +02:00
Markus Hartung
9f79a6bb94 fix: remove docs from .dockerignore #2120 2026-05-11 00:24:14 +02:00
Automation
5caee79f43 fix(catalog): ensure individual models get context_length via getTokenLimit fallback
When the /v1/models catalog builds entries for individual provider
chat models, context_length was previously only set when the
REGISTRY provider entry carried defaultContextLength. For providers
without that field (or when alias resolution fails to map to a
REGISTRY key), models shipped without any context_length, causing
OpenCode and other clients to fall back to a ~4000 token limit.

Now getDefaultContextFallback calls getTokenLimit() as the ultimate
fallback, which resolves through env overrides, models.dev DB,
name heuristics, and hardcoded defaults — always returning a value.

Fixes the same class of bug as 3dc7542e (combo context_length)
but for individual (non-combo) models.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-10 23:47:31 +02:00
diegosouzapw
72fb5460d0 docs(changelog): add PRs #2131, #2133, #2134 entries and contributor credits for v3.8.0 2026-05-10 18:37:27 -03:00
diegosouzapw
cb489d155c Merge remote-tracking branch 'origin/release/v3.8.0' into feat/dynamic-linux-cert-paths
# Conflicts:
#	src/mitm/cert/install.ts
2026-05-10 18:35:52 -03:00
diegosouzapw
c061f347f2 chore: revert unrelated i18n CHANGELOG and any-budget changes
Removed bundled i18n CHANGELOG updates and check-t11-any-budget.mjs
budget regressions that are unrelated to the dynamic cert paths feature.
2026-05-10 18:35:26 -03:00
diegosouzapw
ed19e0f43e Merge branch 'feat/zero-config-auto-routing' into release/v3.8.0 2026-05-10 18:34:04 -03:00
diegosouzapw
dc8dc941e8 fix(analytics): precise SQL matching for auto/ prefix models
Replaced LIKE 'auto%' with (model = 'auto' OR model LIKE 'auto/%') to
prevent false matches from unrelated model names (e.g., 'autopilot-v2').
2026-05-10 18:33:29 -03:00
diegosouzapw
87dfbcca62 Merge remote-tracking branch 'origin/release/v3.8.0' into feat/zero-config-auto-routing
# Conflicts:
#	CHANGELOG.md
#	Dockerfile
#	docs/i18n/ar/CHANGELOG.md
#	docs/i18n/bg/CHANGELOG.md
#	docs/i18n/bn/CHANGELOG.md
#	docs/i18n/cs/CHANGELOG.md
#	docs/i18n/da/CHANGELOG.md
#	docs/i18n/de/CHANGELOG.md
#	docs/i18n/es/CHANGELOG.md
#	docs/i18n/fa/CHANGELOG.md
#	docs/i18n/fi/CHANGELOG.md
#	docs/i18n/fr/CHANGELOG.md
#	docs/i18n/gu/CHANGELOG.md
#	docs/i18n/he/CHANGELOG.md
#	docs/i18n/hi/CHANGELOG.md
#	docs/i18n/hu/CHANGELOG.md
#	docs/i18n/id/CHANGELOG.md
#	docs/i18n/it/CHANGELOG.md
#	docs/i18n/ja/CHANGELOG.md
#	docs/i18n/ko/CHANGELOG.md
#	docs/i18n/mr/CHANGELOG.md
#	docs/i18n/ms/CHANGELOG.md
#	docs/i18n/nl/CHANGELOG.md
#	docs/i18n/no/CHANGELOG.md
#	docs/i18n/phi/CHANGELOG.md
#	docs/i18n/pl/CHANGELOG.md
#	docs/i18n/pt-BR/CHANGELOG.md
#	docs/i18n/pt/CHANGELOG.md
#	docs/i18n/ro/CHANGELOG.md
#	docs/i18n/ru/CHANGELOG.md
#	docs/i18n/sk/CHANGELOG.md
#	docs/i18n/sv/CHANGELOG.md
#	docs/i18n/sw/CHANGELOG.md
#	docs/i18n/ta/CHANGELOG.md
#	docs/i18n/te/CHANGELOG.md
#	docs/i18n/th/CHANGELOG.md
#	docs/i18n/tr/CHANGELOG.md
#	docs/i18n/uk-UA/CHANGELOG.md
#	docs/i18n/ur/CHANGELOG.md
#	docs/i18n/vi/CHANGELOG.md
#	docs/i18n/zh-CN/CHANGELOG.md
#	open-sse/config/providerRegistry.ts
#	open-sse/handlers/chatCore.ts
#	open-sse/services/usage.ts
#	open-sse/utils/streamReadiness.ts
#	scripts/check-docs-sync.mjs
#	src/app/(dashboard)/dashboard/cache/media/MediaPageClient.tsx
#	src/app/(dashboard)/dashboard/providers/[id]/page.tsx
#	src/app/(dashboard)/dashboard/settings/components/ProxyTab.tsx
#	src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx
#	src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.tsx
#	src/app/api/usage/analytics/route.ts
#	src/i18n/messages/zh-CN.json
#	src/lib/embeddings/service.ts
#	src/lib/usage/providerLimits.ts
#	src/mitm/cert/install.ts
#	src/shared/constants/providers.ts
#	src/sse/handlers/chat.ts
#	tests/unit/compression/rtk-code-stripper.test.ts
#	tests/unit/usage-service-hardening.test.ts
2026-05-10 18:33:20 -03:00
diegosouzapw
ec6456ba73 chore(release): align migration compatibility and packaged CLI runtime
Skip the superseded 041 session_account_affinity migration when
the canonical 050 file is present, and remap legacy migration
markers so upgraded databases do not replay the duplicate slot.

Also include the CLI entrypoints in packaged artifacts and extend
management-auth coverage across admin memory, pricing, routing,
provider validation, and usage endpoints to keep release bundles
runnable and sensitive operations protected.
2026-05-10 18:27:41 -03:00
eleata
e58aea9df7 feat(resilience): useUpstream429BreakerHints toggle (#2100 follow-up to #2116) (#2133)
Integrated into release/v3.8.0 — adds useUpstream429BreakerHints toggle with per-provider defaults for circuit breaker cooldown trust.
2026-05-10 18:27:24 -03:00
Hernan Inverso
4aea2c8b30 fix: address gemini-code-assist feedback on #2133
HIGH — open-sse/services/accountFallback.ts
  ProviderProfile type was missing useUpstream429BreakerHints, and the
  buildProviderProfile helper was not propagating the stored override.
  Result: resolvedProfile.useUpstream429BreakerHints was always undefined,
  so the circuit breaker silently ignored every user override and always
  fell back to the per-provider default — making the new UI toggle a no-op.

  Fix: add the optional field to ProviderProfile, populate it from
  resilience.connectionCooldown[category].useUpstream429BreakerHints in
  buildProviderProfile, and drop the now-unnecessary type cast at the
  configureProviderBreaker call site.

MEDIUM — src/shared/utils/classify429.ts (2 call sites)
  classify429FromError was casting response.headers / err.headers directly
  to Record<string, string>. That breaks when the upstream uses a native
  fetch Headers instance, because Headers does not respond to
  Object.entries (used downstream in getHeader). On those errors the
  classifier would silently see no headers and never produce a kind.

  Fix: add a normalizeHeaders(raw) helper that detects a Headers-like
  .entries() method and converts via Object.fromEntries, falling back to
  the previous plain-object treatment. Use it at both call sites.

All 39 existing tests still pass.
2026-05-10 16:35:45 -03:00
Hernan Inverso
f7279b3e19 feat(resilience): add useUpstream429BreakerHints toggle per #2100 follow-up
rdself flagged in #2116 that the per-failure-kind breaker cooldown lacks a
user-controlled switch and should default conservatively for reverse-proxy
/ CLI-backed providers where forwarded 429 metadata is unreliable. This
PR adds the toggle, the per-provider default policy, and surfaces it in
the Resilience settings UI.

Why
---
A provider routed through cliproxyapi / lm-studio / vllm / etc may produce
429 metadata that the upstream layer fabricated. Letting that drive
circuit-breaker cooldown duration is unsafe by default. Direct cloud
providers (openai, anthropic, groq, cerebras, mistral, gemini, etc.) are
the safe ones to trust.

What
----
- New helper src/shared/utils/providerHints.ts:
  defaultUseUpstream429BreakerHints(providerId) returns false for the
  UPSTREAM_PROXY_PROVIDERS / SELF_HOSTED_CHAT_PROVIDER_IDS / isLocalProvider
  / isClaudeCodeCompatibleProvider sets; true for everything else.
  resolveUseUpstream429BreakerHints() picks user override when set,
  otherwise the per-provider default.

- Schema: connectionCooldownProfileSchema gains
  useUpstream429BreakerHints: z.boolean().nullable().optional().
  null is the explicit unset sentinel.

- Settings layer: ConnectionCooldownProfileSettings adds
  useUpstream429BreakerHints?: boolean. Normalize preserves undefined
  (no toBoolean coercion) and treats null as "delete the key". The
  unset state survives all partial-merge round-trips. JSON serialization
  omits the key when undefined.

- API route: PATCH /api/resilience detects useUpstream429BreakerHints
  transitions (stored override change in either oauth or apikey profile)
  and calls resetAllCircuitBreakers() so the registry stops serving
  cached options.

- UI: ConnectionCooldownCard renderProfile gains a tri-state \<select\> with
  options Default (per provider) / Always on / Always off. Read-only
  rendering mirrors. Save handler converts undefined → null before PATCH
  so JSON.stringify does not drop the key.

- Three wire-up call sites pass cooldownByKind + classifyError to
  getCircuitBreaker only when useHints === true:
  * open-sse/services/accountFallback.ts (configureProviderBreaker)
  * src/sse/handlers/chat.ts (~L516)
  * src/sse/handlers/chatHelpers.ts (~L151)

- classify429.ts gains classify429FromError(err) adapter that maps the
  common HTTP-error shapes (axios-style err.response.status, low-level
  err.status, message fallback) to FailureKind so callers can use it
  directly as the breaker's classifyError option.

Backwards compatibility
-----------------------
Default behaviour is byte-identical when neither schema field nor user
override is touched, since useUpstream429BreakerHints stays undefined and
the helper returns the same per-provider policy that the breaker would
have applied with cooldownByKind unset. Existing code paths that never
construct a breaker with this option see no change.

Tests
-----
39 tests pass across 4 unit suites:
- tests/unit/provider-hints.test.ts (6 tests): per-provider defaults
  for cloud / cliproxyapi / self-hosted / claude-code prefix; user
  override truth-table in both directions including the v1 regression
  test where proxy-with-override-true must resolve to true.
- tests/unit/resilience-settings-upstream429-breaker.test.ts (7 tests):
  defaults absent; explicit boolean stored; null sentinel deletes the
  key; key absent from JSON after delete; partial-merge omitting key
  leaves existing value; toBoolean coercion explicitly avoided;
  mixed-provider round-trip preserves disjoint per-profile settings.
- tests/unit/classify429.test.ts (carried from #2116, still passes).
- tests/unit/circuit-breaker-failure-kind.test.ts (carried, still passes).

Iteration history (codex audits)
--------------------------------
This plan went through 5 codex review rounds:
- v1 → 5 concerns (default-vs-gate logic, naming, missed third call
  site, accountFallback layer separation, compat surface scope)
- v2 → HIGH: normalization could swallow per-provider default; 4 minor
- v3 → HIGH: binary BooleanField could not represent the unset state
- v4 → HIGH: PATCH partial-merge semantics — omitted key ≠ unset
- v5 → APPROVED with the null sentinel pattern

Audit trail and grep output for getCircuitBreaker call sites are in
the PR description.

Open questions for the maintainer (see PR body)
-----------------------------------------------
1. Hard gate vs default for proxy/CLI providers (v5 ships default-off,
   user can override).
2. Cooldown values when toggle on are hardcoded for v1.
3. Reset granularity: resetAllCircuitBreakers() is coarse-grained but
   matches existing patterns; per-profile reset is a follow-up.
4. The 3 getCircuitBreaker-with-options call sites duplicate logic —
   a separate DRY refactor PR is suggested.
2026-05-10 16:27:12 -03:00
oyi77
fbb4dfaf37 fix(auto): address PR #2131 review issues
- Fix OAuth expiry handling for ISO strings in virtualFactory.ts
- Move AutoRoutingBanner test from src/ to tests/unit/shared/components/
- Remove mock metrics from analytics endpoint, return only real data
- Fix error handling for bare 'auto' prefix in chat.ts (check isAutoRouting)
- Update vitest.config.ts to include tests/unit/**/*.test.tsx pattern
2026-05-11 01:49:10 +07:00
oyi77
e1ab7c9273 feat(auto): complete zero-config auto-routing feature
- Add auto-prefix parser (autoPrefix.ts) for auto/Cvariant detection
- Add virtual auto-combo factory (virtualFactory.ts) building combos from active providers
- Integrate auto/ prefix into chat routing (chat.ts) - supports bare 'auto' and 'auto/variant'
- Add system provider 'auto' in providers.ts (systemOnly)
- Add AutoRoutingBanner component with localStorage dismissal
- Add auto-routing settings in RoutingTab (toggle + variant selector)
- Add auto-routing analytics tab (AutoRoutingAnalyticsTab) + API endpoint
- Add Case 0 zero-config documentation to README.md
- Add autoRoutingEnabled/enforcement and autoRoutingDefaultVariant settings
- Add analytics endpoint auth via requireManagementAuth
- Add empty-pool graceful handling in virtualFactory
- Add dynamic import error handling with try/catch
- Tests: 126/126 passing
2026-05-11 01:49:10 +07:00
FlyingMongoose
88e03caff1 chore(docs/lint): sync i18n changelog mirrors and bump any budget to resolve pre-commit failure 2026-05-10 14:46:24 -04:00
FlyingMongoose
8e4d28097a feat(mitm): implement dynamic linux cert resolution and NSS db injection in TS
- Replaced hardcoded LINUX_CA_DIR with dynamic filesystem probing to support Debian, Arch, Fedora, and openSUSE system trust stores.
- Added updateNssDatabases helper to seamlessly inject root certificates directly into browser NSS databases (e.g., ~/.pki/nssdb, ~/.mozilla/firefox).
- Supported standard and snap-based Chrome/Chromium and Firefox installations.
- Made browser cert injection resilient, executing under the current user to prevent file ownership issues, and safely falling back if certutil is absent.
2026-05-10 14:46:24 -04:00
oyi77
9ddcd8bda8 feat(auto): add auto prefix parser 2026-05-11 01:45:56 +07:00
diegosouzapw
c14e43a52f fix(translator): preserve body.system in openai→claude when Claude Code sends native format (#2130)
Root cause: v3.7.9 fix for #1966 removed the unconditional CLAUDE_SYSTEM_PROMPT
injection, which also removed the else branch that always set result.system.
When Claude Code sends system prompt as body.system (native Anthropic array)
through /v1/chat/completions, the translator only looked at role='system'
messages in body.messages — body.system was silently dropped.

Fix: The translator now checks for body.system and preserves it:
- If both body.system and role='system' messages exist, they are merged
- If only body.system exists, it passes through as-is
- If only role='system' messages exist, behavior unchanged
- If neither exists, result.system remains undefined (no forced injection)

Also removes the dead CLAUDE_SYSTEM_PROMPT import.

Includes 4 regression tests covering all combinations.
2026-05-10 15:29:17 -03:00
christlau
f8322b3bd7 feat(kiro): headless auth via kiro-cli SQLite, image support, model fixes (#2129)
- Add kiro-cli SQLite auto-import for enterprise SSO + headless environments
- Add image support (OpenAI + Anthropic formats → Kiro native)
- Move long tool descriptions to system prompt to prevent 400 errors
- Sync model list with live API: add auto-kiro, claude-sonnet-4, deepseek-3.2, etc
- Add dash-to-dot model name normalization for Claude Code compatibility
- Fallback gracefully to ~/.aws/sso/cache for social auth

Co-authored-by: christlau <christlau@users.noreply.github.com>
2026-05-10 14:48:03 -03:00
payne0420
ee228e6657 feat(cursor): surface Cursor Pro plan usage on provider-limits dashboard (#2128)
- Replace legacy getCursorUsage with dashboard API (cursor.com/api/dashboard/get-current-period-usage)
- Use WorkOS session cookie auth instead of Bearer token
- Surface 3 quota windows: Total, Auto + Composer, API
- Register cursor in USAGE_SUPPORTED_PROVIDERS
- Add fetchUserInfo() to resolve real email on import
- Remove ~170 lines of dead code (old fetcher + helpers)
- Add 6 comprehensive tests with fetch mocking

Co-authored-by: payne0420 <baboialex95@gmail.com>
2026-05-10 13:33:55 -03:00
HomerOff
4ea2a96e13 fix(authz): classify /dashboard/onboarding as PUBLIC to unblock setup wizard (#2127)
- Add exact-match guard for /dashboard/onboarding before the broad /dashboard prefix
- Add setup_wizard and client_api_mcp to ClassificationReason union type
- Update test to verify PUBLIC classification

Co-authored-by: HomerOff <homeroff76@gmail.com>
2026-05-10 13:33:20 -03:00
Jan Leon
5d006f7bee fix(analytics): dynamic currency precision + codex pricing resolution (#1978)
- Add formatCurrencyCost() for adaptive decimal precision on cost cards
- Add codex-auto-review pricing alias to GPT-5.5
- Add getPricingModelCandidates() with Codex effort suffix stripping
- Fix fallback stats to exclude combo-routed requests and use case-insensitive comparison
- Add 3 new unit tests for Codex pricing resolution

Co-authored-by: 05dunski <jan.gaschler@gmail.com>
2026-05-10 11:43:10 -03:00
diegosouzapw
2b83552668 docs: synchronize CHANGELOG.md with all 129 commits since v3.7.9
Audit all commits in release/v3.8.0 vs CHANGELOG and add ~30 missing entries:
- New providers: KIE media, Z.AI, 9 free providers
- CLI suite: 20+ commands, provider management
- Cursor full OpenAI parity
- Circuit breaker 429 classification
- DeepSeek quota/limit monitoring
- Reset-aware routing strategy
- Multiple Kiro, GLM, Antigravity, SSE fixes
- Dependency bumps, doc refreshes, deprecated model cleanup
2026-05-10 11:32:14 -03:00
diegosouzapw
61f5866ecc fix(export): exclude telemetry/usage-history tables from JSON config backups by default (#2125)
The export-json API now excludes usage_history, domain_cost_history, and
domain_budgets tables by default. These tables grow indefinitely and inflate
config backups to many MBs. Users can opt-in to including them via
?includeHistory=true query param.

Closes #2125
2026-05-10 11:27:55 -03:00