Commit Graph

2154 Commits

Author SHA1 Message Date
abix5
dbdfb8a328 feat(authz): introduce centralized proxy-based authz pipeline and lifecycle policy (#1632)
Integrated into release/v3.7.2
2026-04-27 07:12:42 -03:00
Payne
5026aaaabb fix(chatgpt-web): bound tls-client native deadlocks so requests never hang forever (#1664)
Integrated into release/v3.7.2
2026-04-27 07:11:17 -03:00
diegosouzapw
cbe7358dc8 chore(release): v3.7.1 — all changes in ONE commit 2026-04-27 01:47:54 -03:00
diegosouzapw
3008ba9a13 fix(transport): cap streaming logs and parse fragmented responses (#1647) 2026-04-27 01:45:36 -03:00
diegosouzapw
f14679f7a5 docs(changelog): add entries for merged PRs #1645 and #1646 2026-04-27 01:19:53 -03:00
Raxxoor
97912c7d9c fix(transport): harden GitHub and Kiro streaming (#1645)
Integrated into release/v3.7.1 — fixes GitHub executor concurrency bug, hardens Kiro streaming, adds defensive tool input parsing
2026-04-27 01:09:23 -03:00
backryun
725ec7f2a9 fix:Update Build env dependencys (#1646)
Integrated into release/v3.7.1 — CI dependency updates and Node 24.15.0 bump
2026-04-27 01:08:49 -03:00
diegosouzapw
c26c3a46a9 docs(changelog): add entries for #1643 and #1638 fixes 2026-04-27 00:37:31 -03:00
diegosouzapw
19edb8efa4 fix(claude): stabilize billing header fingerprint for prompt-cache affinity (#1638)
The billing header fingerprint was computed from the first user message text
via computeFingerprint(), which changes every conversation turn. This mutated
the system[] prefix on each request, invalidating Anthropic's prompt-cache
prefix and forcing ~100% cache_create (vs 96% cache_read with stable prefix).

Now uses a per-day SHA-256 hash of the date + ccVersion, keeping the billing
header format while preserving prompt-cache prefix stability across turns.

Includes 6 unit tests.
2026-04-27 00:37:25 -03:00
diegosouzapw
52d5b86e88 fix(codex): use per-conversation session_id as prompt_cache_key (#1643)
The prompt_cache_key was derived from the account-wide workspaceId, meaning
all conversations from the same OAuth account shared one cache partition.
The official Codex CLI uses conversation_id (a unique UUID per session).

Priority: body.session_id > body.conversation_id > workspaceId.
Session IDs are captured BEFORE deletion from the body.

Includes 10 unit tests.
2026-04-27 00:37:15 -03:00
diegosouzapw
738e108d06 docs(changelog): add entries for merged PRs #1641, #1642, #1640, #1639, #1644 2026-04-27 00:04:07 -03:00
diegosouzapw
78b845b68c feat(account-fallback): add daily quota lockout for quota_exhausted errors (#1644)
When a provider returns 429 with quota_exhausted reason, set cooldown until
tomorrow 00:00 instead of exponential backoff. Includes isDailyQuotaExhausted()
detection in chat handler and unit tests.

Co-authored-by: clousky2020 <clousky2020@users.noreply.github.com>
2026-04-27 00:02:44 -03:00
Prateek Rungta
56ae1b8246 fix: package Electron runtime deps (#1639)
Integrated into release/v3.7.1 — fixes Electron installer shipping empty node_modules. Adds separate extraResources FileSet, CI smoke test job, and cross-platform packaged app validation script. Closes #1636.
2026-04-26 23:59:51 -03:00
Dendy Adi Nirwana
314cad79ba fix(codex): avoid startup crash when wreq-js is unavailable (#1640)
Integrated into release/v3.7.1 — lazy-loads wreq-js WebSocket transport so server boots even when native module is unavailable. Fixes #1612.
2026-04-26 23:59:30 -03:00
Slavic Kozyuk
4eef082cf3 fix(usage): correct MiniMax token plan quota display (#1642)
Integrated into release/v3.7.1 — fixes inverted MiniMax quota display for token_plan/remains endpoint and rounds floating-point percentages.
2026-04-26 23:57:55 -03:00
Raxxoor
acf6ad4ba0 fix: route newer GitHub GPT models through Responses (#1641)
Integrated into release/v3.7.1 — routes gpt-5.4-nano, gpt-5.4-mini, gpt-5.4, and gpt-5.5 through the Responses API on GitHub Copilot.
2026-04-26 23:57:37 -03:00
diegosouzapw
2601e0e49d fix(migration): prevent compat-renamed version slot from shadowing new migrations (#1637)
After reconcileRenumberedMigrations() rewrites a legacy row (e.g. 028→029),
verify the old version slot is clear. A residual row at the old version
would cause getAppliedVersions() to skip the new migration file at that
version number (028_create_files_and_batches.sql).

Also adds 'batches' table to PHYSICAL_SCHEMA_SENTINELS for physical
schema recovery on upgrade paths.
2026-04-26 23:29:25 -03:00
diegosouzapw
f00e9a1272 fix(postinstall): extend native module repair to cover wreq-js for pnpm global installs (#1634)
- Add fixWreqJsBinary() to postinstall.mjs with 3-strategy repair:
  1. Copy platform binary from root node_modules
  2. Copy entire rust/ directory (all platform binaries)
  3. npm rebuild wreq-js fallback
- Fixes macOS arm64 global pnpm installs shipping only Linux binaries
- Adds reasoning replay cache feature for DeepSeek V4 (#1628)
- Updates CHANGELOG.md with both fixes
2026-04-26 20:15:47 -03:00
diegosouzapw
cabdfb04e7 fix(cache): replay cached reasoning for tool-calling think models
Prevent upstream 400 failures when clients omit prior
reasoning_content in multi-turn tool-calling conversations.

Capture reasoning_content from streaming and non-streaming assistant
responses, persist it in a memory-plus-SQLite cache keyed by
tool_call_id, and re-inject it on later requests when available.

Add the reasoning cache migration, service layer, authenticated API
endpoints, dashboard tab, and unit coverage to support inspection,
cleanup, and crash recovery.
2026-04-26 18:53:54 -03:00
diegosouzapw
e30969fecd fix(electron): cherry-pick macOS plist and Windows EPERM build fixes from main
Cherry-pick of dbd4b0a7 to keep release/v3.7.1 in sync with main.
2026-04-26 17:45:06 -03:00
diegosouzapw
abeb78b95c fix: integrate PRs #1630 (Docker build) and #1631 (Antigravity model cleanup), fix test regression
- PR #1630: Set NPM_CONFIG_LEGACY_PEER_DEPS=true in Dockerfile, remove duplicate COPY
- PR #1631: Hide deprecated gemini-claude-* models from catalogs, redirect to Claude 4.6
- Fix provider-models-route test to match renamed model display name
- Update CHANGELOG.md with both PR entries
2026-04-26 16:03:36 -03:00
backryun
4692621e4f fix(antigravity): hide deprecated Gemini-Claude models (#1631)
fix(antigravity): hide deprecated Gemini-Claude models, redirect legacy aliases to Claude 4.6 — integrated into release/v3.7.1
2026-04-26 15:59:07 -03:00
Randi
1c86cd5fec [Urgent] fix: include npm config in Docker install layer (#1630)
fix: include NPM_CONFIG_LEGACY_PEER_DEPS in Docker builder layer — integrated into release/v3.7.1
2026-04-26 15:58:52 -03:00
diegosouzapw
fbf129da56 chore(release): bump to v3.7.1 — changelog, docs, version sync 2026-04-26 15:03:59 -03:00
Aleksandr
0c90c9768b Add Codex GPT-5.5 support (#1617)
Integrated into release/v3.7.1
2026-04-26 14:56:25 -03:00
diegosouzapw
dd67b25df1 fix(cli-tools): preserve opencode config and raw key copy (#1626)
- Use jsonc-parser to update only provider.omniroute in opencode.json,
  preserving MCP servers, comments, and other provider entries
- Add /api/cli-tools/keys endpoint returning raw keys for CLI tools UI
  (session-auth protected via requireCliToolsAuth)
- Fix OpenCode guide step 3 to use ICU-style {baseUrl} placeholder
  instead of broken {{baseUrl}} across all 40+ locales
- Restore valid OpenCode light/dark SVG logos (were broken HTML downloads)
- Add customCliTab translation key to en.json
- Add modelLabels support for human-readable model names in config
- Fix 9 additional locale files (bn, fa, gu, in, mr, sw, ta, te, ur)
  that were added after the original PR and still had double-braces

Co-authored-by: JasonLandbridge <JasonLandbridge@users.noreply.github.com>
2026-04-26 14:26:34 -03:00
diegosouzapw
accb58f5b2 fix: per-model rate limiting for GitHub Copilot provider (#1624)
- Add 'github' to hasPerModelQuota() so 429 on one model doesn't lock the
  entire connection — same pattern already used for Gemini
- Add 'github' to getLimiterKey() for model-scoped Bottleneck rate limiter
  keys (github:connectionId:model)
- Add unit tests for hasPerModelQuota, shouldMarkAccountExhaustedFrom429,
  lockModelIfPerModelQuota (account-fallback-service.test.ts)
- Add integration test for model-scoped limiter keys (rate-limit-manager.test.ts)

Co-authored-by: slewis3600 <slewis3600@users.noreply.github.com>
2026-04-26 14:24:59 -03:00
diegosouzapw
d08301de8c fix(types): add explicit types to sync-env test helpers and dynamic import cast
Resolves 7 TypeScript errors: implicit 'any' on rootDir parameters and
unknown property 'rootDir' on the dynamically imported syncEnv options.
2026-04-26 14:09:44 -03:00
diegosouzapw
9c9f2b9d45 docs(env): add OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS to .env.example (#1623)
Makes the self-hosted provider URL allowlist more discoverable for users
running LM Studio, Ollama, vLLM, Llamafile, and other local providers.
2026-04-26 13:03:18 -03:00
diegosouzapw
05a50fcf53 fix(encryption): prevent STORAGE_ENCRYPTION_KEY regeneration on upgrade (#1622)
- sync-env.mjs: add hasEncryptedCredentials() guard before generating
  STORAGE_ENCRYPTION_KEY, matching the existing guard in bootstrap-env.mjs
- bootstrap-env.mjs: add decrypt-probe diagnostic on startup to detect
  key mismatch and log actionable recovery instructions
- bin/omniroute.mjs: add 'reset-encrypted-columns' CLI recovery command
  that nulls encrypted credential columns while preserving provider config
- tests/unit/sync-env.test.ts: isolate tests with DATA_DIR override

Root cause: postinstall → syncEnv() generated fresh crypto secrets into
the package-local .env on every 'npm install -g' upgrade, since the
package directory is wiped and recreated. The bootstrap-env guard never
triggered because sync-env already filled in the new keys. The DB still
contained credentials encrypted under the previous key, making them
permanently unrecoverable (AES-GCM auth-tag mismatch → silent 401s).
2026-04-26 12:57:38 -03:00
diegosouzapw
744a5606e4 feat(i18n): expand locale coverage with nine new language packs
Add Bengali, Persian, Gujarati, Indonesian alt, Marathi,
Swahili, Tamil, Telugu, and Urdu message bundles to the app's
locale configuration.

Extend RTL locale support for Persian and Urdu and update project
docs to reflect the broader 40+ language availability.
2026-04-26 11:43:51 -03:00
diegosouzapw
aa6b2f7567 fix(cli-tools): prevent React crash from object error in Apply handler
Two root causes fixed:
1. Schema: cliModelConfigSchema.apiKey was z.string().optional() but
   the frontend sends null when cloudEnabled is true. Zod rejects null
   for optional strings → validation 400 with structured error object.
   Fix: z.string().nullable().optional()

2. Frontend: All 25 tool card error handlers used data.error directly
   as React children. When data.error is an object ({message, details}),
   React crashes with Error #31 (Objects are not valid as React child).
   Fix: extract data.error.message when data.error is an object.
2026-04-26 11:04:52 -03:00
diegosouzapw
167404f19e fix(i18n): replace 83 placeholder values in usage/evals namespace
Replace Title Case placeholder values (e.g. 'Eval Controls Title',
'Suite Builder Case Name Label') with proper English text across all
31 locale files. These placeholder keys were auto-generated from
camelCase key names but never populated with meaningful values.
2026-04-26 10:47:57 -03:00
diegosouzapw
a691893413 fix(i18n): add 5 missing health namespace keys for rate limit status
Add limitExhausted, learnedFromHeaders, remainingOfLimit, throttleStatus,
and lastHeaderUpdate keys to all 31 locale files. These keys are used by
the health dashboard rate limit status section and were causing
MISSING_MESSAGE errors in production.
2026-04-26 10:18:11 -03:00
diegosouzapw
213d38cd50 fix(i18n): add 14 missing logs.* translation keys for ActiveRequestsPanel
Add runningRequests, runningRequestsDesc, model, provider, account,
elapsed, count, payloads, viewPayloads, activeCount, clientPayload,
upstreamPayload, upstreamNotSentYet, runningRequestDetailMeta to all
31 locale files (en + 30 translations).
2026-04-26 09:53:39 -03:00
diegosouzapw
d179ace708 fix(codex): make wreq-js import lazy to prevent startup crash (#1612) 2026-04-26 09:53:10 -03:00
Diego Rodrigues de Sa e Souza
6df01aeb34 chore(release): v3.7.0
Release v3.7.0
2026-04-26 04:34:46 -03:00
diegosouzapw
e30b706e66 Merge remote-tracking branch 'origin/main' into release/v3.7.0
# Conflicts:
#	src/i18n/messages/pt.json
2026-04-26 04:34:28 -03:00
diegosouzapw
6dc5bb9437 docs(release): refresh v3.7.0 docs for expanded provider and MCP counts
Update release notes and project documentation to reflect the
current 160+ provider catalog, 29-tool MCP server footprint, and
newly shipped v3.7.0 features and fixes.

This keeps public-facing docs, architecture references, and agent
guidance aligned with the actual release contents and supported
capabilities.
2026-04-26 04:05:09 -03:00
diegosouzapw
ead269d30d fix: clear INITIAL_PASSWORD and JWT_SECRET in integration tests
CI sets INITIAL_PASSWORD and JWT_SECRET env vars, which makes
isAuthRequired() return true even with a fresh temp DB. The tests
call route handlers directly without session cookies, so auth must
be fully disabled by clearing all auth-related env vars.
2026-04-26 03:49:10 -03:00
diegosouzapw
72afe8fe04 fix: resolve CI-only test failures from environment differences
- guide-settings-route.test.ts: control XDG_CONFIG_HOME so OpenCode config
  path resolves to the test dummy dir (CI runners have XDG set)
- proxy-registry-flow.test.ts: disable DASHBOARD_PASSWORD to prevent 401 on
  direct route handler calls (CI postinstall auto-generates it)
- _chatPipelineHarness.ts: clear DASHBOARD_PASSWORD for all integration tests
  using the shared chat pipeline harness
2026-04-26 03:35:54 -03:00
diegosouzapw
abaf2e9704 ci: trigger clean CI run for release/v3.7.0 2026-04-26 03:15:30 -03:00
diegosouzapw
3547258282 feat(skills): add workspace-scoped builtins with sandbox execution
Replace placeholder builtin skill responses with real file, HTTP, and
code-execution flows constrained to per-key workspaces, size limits, and
sanitized request headers.

Harden the Docker sandbox with dropped capabilities, tmpfs-backed
workdirs, configurable runtime limits, and clearer failure behavior for
disabled browser automation.

Also consolidate legacy dashboard usage navigation into logs, remove
stale sidebar and SSE backup artifacts, and expand tests to lock in the
new runtime and routing contracts.
2026-04-26 03:03:52 -03:00
diegosouzapw
77373ef9af fix(i18n): add missing Windsurf/Cline/Kimi docs keys and sync changelog to 39 languages 2026-04-26 01:03:46 -03:00
diegosouzapw
a6c96257a5 chore(release): finalize changelog and update any-budget for imageGeneration.ts 2026-04-25 23:58:05 -03:00
diegosouzapw
091b1238da fix(docs): improve docs provider layout and fix missing i18n keys 2026-04-25 23:52:16 -03:00
Payne
8a8fcc77a8 feat(chatgpt-web): image generation + edit (Open WebUI compatible) (#1607)
Integrated into release/v3.7.0
2026-04-25 23:51:37 -03:00
Jean Brito
13495d4d13 feat(providers): wire CrofAI /usage_api/ into quota preflight, monitor & Limits page (#1606)
Integrated into release/v3.7.0
2026-04-25 23:51:18 -03:00
diegosouzapw
df76aaef96 fix(cli-tools): preserve TOML integer/boolean types in Codex config round-trip
The parseToml function was stripping all value quotes uniformly, turning
every value into a JS string. When toToml re-serialized, unquoted
integers like 2 were wrapped in quotes becoming "2" — a TOML string.

This broke Codex CLI which expects u32 for tui.model_availability_nux:
  Error loading config.toml: invalid type: string "2", expected u32

Now parseToml detects booleans (true/false), integers, and floats,
preserving their native JS types. formatTomlValue already handles
number/boolean types correctly, so round-tripping no longer corrupts
third-party config sections.
2026-04-25 22:47:20 -03:00
diegosouzapw
1e9e6d4349 fix(dashboard): stabilize usage tab loading and refresh behavior
Prevent repeated provider-limit refresh requests by guarding the bulk
refresh flow with a ref-backed lock instead of a stale callback
dependency.

Also avoid tying eval data loading to translation updates and replace the
fetch failure path with a static error so the effect runs predictably.
Refresh English cost dashboard copy to provide clearer labels and empty
state messaging.
2026-04-25 22:45:08 -03:00