Skip to content

Release v3.8.0 - #2111

Merged
diegosouzapw merged 356 commits into
mainfrom
release/v3.8.0
May 14, 2026
Merged

diegosouzapw merged 356 commits into
mainfrom
release/v3.8.0

Conversation

@diegosouzapw

@diegosouzapw diegosouzapw commented May 10, 2026

Copy link
Copy Markdown
Owner

[3.8.0] — 2026-05-06

✨ New Features

🐛 Bug Fixes

🔒 Security

📝 Documentation

🔧 Improvements

🧹 Chores & Maintenance

🏆 v3.8.0 Community Contributors

Thank you to all 55+ community contributors who made v3.8.0 possible! 🎉

Contributor PRs Contributions
@NomenAK 12 #2217, #2218, #2219, #2221, #2222, #2223, #2224, #2228, #2233, #2234, #2242, #2192
@oyi77 12 #2010, #2014, #2041, #2052, #2061, #2074, #2091, #2094, #2096, #2131, #2135, #2240
@backryun 8 #1992, #2033, #2088, #2123, #2138, #2141, #2150, #2177
@Brkic-Nikola 6 #2165, #2189, #2190, #2191, #2192, #2197
@Gioxaa 5 #2105, #2149, #2153, #2154, #2159
@dhaern 4 #2028, #2039, #2087, #2090
@andrewmunsell 3 #2169, #2176, #2238
@ddarkr 3 #2047, #2199, #2243
@nickwizard 3 #1991, #2196, #2227
@herjarsa 3 #2030, #2136, #2152
@rafacpti23 3 #2086, #2146, #2201
@Tentoxa 2 #2011, #2053
@wauputr4 2 #2009, #2046
@hartmark 2 #2045, #2137
@payne0420 2 #2082, #2128
@bypanghu 2 #2027, #2156
@eleata 2 #2116, #2133
@Tr0sT 1 #2012
@AveryanAlex 1 #2008
@rodrigogbbr-stack 1 #1996
@NekoMonci12 1 #1999
@congvc-dev 1 #2004
@tatsster 1 #2007
@xssdem 1 #2023
@wucm667 1 #2031
@tces1 1 #2048
@guanbear 1 #2054
@Gi99lin 1 #2055
@ivan-mezentsev 1 #2063
@JxnLexn 1 #2019
@yoviarpauzi 1 #2092
@gleber 1 #2103
@rilham97 1 #2104
@boa-z 1 #2115
@rdself 1 #2118
@clousky2020 1 #2119
@abhinavjnu 1 #2122
@HoaPham98 1 #2089
@christlau 1 #2129
@flyingmongoose 1 #2134
@05dunski 1 #1978 (cherry-picked)
@DavyMassoneto 1 #2140
@Zhaba1337228 1 #2168
@faisalill 1 #2166
@Yosee11 1 #2164
@hachimed 1 #2162
@JohnDoe-oss 1 #2161
@brucevoin 1 #2163
@InkshadeWoods 1 #2202
@kang-heewon 1 #2231
@one-vs 1 #2236

dhaern and others added 6 commits May 10, 2026 00:52
Integrated into release/v3.8.0
# Conflicts:
#	open-sse/handlers/chatCore.ts
#	open-sse/services/comboConfig.ts
#	open-sse/services/usage.ts
#	src/app/(dashboard)/dashboard/providers/[id]/page.tsx
#	src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.tsx
#	src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.tsx
#	src/app/api/usage/analytics/route.ts
#	src/lib/db/migrationRunner.ts
#	src/lib/usage/providerLimits.ts
#	src/shared/constants/providers.ts
#	src/sse/handlers/chat.ts
#	tests/unit/provider-limits-ui.test.ts
#	tests/unit/usage-analytics.test.ts
#	tests/unit/usage-service-hardening.test.ts
Comment thread open-sse/config/glmProvider.ts Fixed
Comment thread open-sse/config/glmProvider.ts Fixed
Comment thread open-sse/config/glmProvider.ts Fixed
Comment thread open-sse/executors/claudeIdentity.ts Fixed
Comment thread open-sse/services/antigravityIdentity.ts Fixed
Comment thread src/lib/db/apiKeys.ts Fixed
Comment thread tests/unit/compression/rtk-code-stripper.test.ts Dismissed
Comment thread open-sse/executors/cursor.ts Fixed

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a comprehensive CLI integration suite for OmniRoute, including commands for guided setup, system diagnostics, and provider management. It also integrates Redis for rate limiting in Docker environments and significantly expands documentation and internationalization. Technical feedback highlights several critical issues, including a database schema mismatch in the CLI key management, unsafe SQLite backup procedures using file copying, and missing dependencies in the production Docker image for the diagnostic tools. Additionally, the review flags a security vulnerability regarding plaintext password entry during setup and a version typo in the Redis configuration.

Comment thread bin/cli-commands.mjs Outdated
);
log(`API key for ${provider} updated`, "green");
} else {
db.prepare(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

There is a schema mismatch here. The provider_connections table defined in bin/cli/provider-store.mjs uses provider and auth_type columns, but this code attempts to insert into provider_id and enabled. This will cause a runtime error when adding a key via the CLI.

Comment thread bin/cli-commands.mjs
for (const file of filesToBackup) {
const sourcePath = join(dataDir, file.name);
if (existsSync(sourcePath)) {
const destPath = join(backupPath, file.dest);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Backing up a live SQLite database using copyFileSync is unsafe and can lead to a corrupt backup if a write operation is in progress. Use the SQLite VACUUM INTO command or the backup API provided by better-sqlite3 to create a consistent snapshot.

Comment thread bin/cli/commands/doctor.mjs Outdated
}

async function checkNodeRuntime(rootDir) {
const { getNodeRuntimeSupport } = await import(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

This dynamic import relies on bin/nodeRuntimeSupport.mjs, which is not included in the production Docker image (based on the Dockerfile changes). This will cause the doctor command to fail when running inside a container.

Comment thread bin/cli/commands/doctor.mjs Outdated
return warn("Native binary", "better-sqlite3 native binary was not found", { candidates });
}

const { isNativeBinaryCompatible } = await import(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

This dynamic import relies on scripts/native-binary-compat.mjs, which is not included in the production Docker image. This will cause the doctor command to fail when running inside a container.

Comment thread docker-compose.yml Outdated
services:
# ── Redis (Rate Limiter Backend) ──────────────────────────────────
redis:
image: redis:8.6.2

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The Redis image version 8.6.2 appears to be a typo. The current stable version of Redis is 7.x, and version 8.0 is in early development. This will likely result in an 'image not found' error.

References
  1. Ensure all unit tests, scripts, and utilities are correctly placed and configured. Redundant or broken configurations should be avoided. (link)

Comment thread bin/cli-commands.mjs Outdated

try {
// Try multiple methods
execCommand("lsof -ti:20128 | xargs kill -9 2>/dev/null || true", 2000);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using kill -9 (SIGKILL) is not recommended as it doesn't allow the process to perform any cleanup (e.g., closing database connections, removing PID files). It's better to try SIGTERM first and only use SIGKILL as a last resort if the process doesn't terminate within a timeout.

}
}

function checkPort(port, label) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The port check only probes 127.0.0.1. If the application is configured to bind to a specific external IP or 0.0.0.0, this check might not accurately reflect whether the port is available for the intended binding.

Comment thread bin/cli/commands/setup.mjs Outdated
const answer = await prompt.ask("Set an admin password now? [y/N]", "N");
if (!/^y(es)?$/i.test(answer)) return "";

const password = await prompt.ask("Admin password");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

security-medium medium

The password is being read using a standard readline question, which displays the input in plaintext on the terminal. For security, passwords should be masked or hidden during entry.

return initializer?.kind === ts.SyntaxKind.TrueKeyword;
}

function extractProviderBlocks(source, filePath) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Parsing source code files using the TypeScript compiler API at runtime to extract provider definitions is fragile. If the structure of src/shared/constants/providers.ts changes slightly, the CLI logic may break. Consider exporting the provider list as a JSON file or a structured object that can be safely imported.

Comment thread open-sse/executors/claudeIdentity.ts Fixed
Comment thread src/lib/db/apiKeys.ts Fixed
Comment thread open-sse/executors/cursor.ts Fixed
Comment thread open-sse/utils/error.ts Fixed
diegosouzapw and others added 9 commits May 10, 2026 09:10
…essions

- Fix stream readiness loop and upstream error code propagation in chatCore.ts

- Resolve Headers iterator TypeScript errors

- Fix type mismatches and missing props in BuilderIntelligentStep, Card, and providers page

- Fix providerLimits typecasts and resolve implicit any errors

- Ensure green build and strict type compliance for production
…ress false-positive hash warnings

- Sanitize error messages in errorResponse() and cursor buildErrorResponse() to strip stack traces before sending to client (fixes js/stack-trace-exposure)
- Add explicit CodeQL suppression comments for intentional SHA-256 usage in API key hashing (fast O(1) lookup, not password storage) and deterministic UUID generation (fixes js/insufficient-password-hash false positives)
Comment thread open-sse/executors/claudeIdentity.ts Dismissed
Comment thread src/lib/db/apiKeys.ts Dismissed
Comment thread open-sse/executors/cursor.ts Fixed
Comment thread open-sse/utils/error.ts Dismissed
abhinavjnu and others added 8 commits May 10, 2026 11:01
…2122)

Integrated into release/v3.8.0 — thank you @abhinavjnu for this contribution! 🎉
Integrated into release/v3.8.0 — thank you @clousky2020 for this contribution! 🎉
Integrated into release/v3.8.0 — thank you @rdself for this contribution! 🎉
Integrated into release/v3.8.0 — thank you @boa-z for this contribution! 🎉
Integrated into release/v3.8.0 — thank you @HoaPham98 for this contribution! 🎉
Integrated into release/v3.8.0 — thank you @backryun! 🎉
… and sync CHANGELOG i18n

- Fix check-docs-sync.mjs: CHANGELOG.md i18n mirrors use translation-aware validation
  (version sections + size check) instead of exact byte comparison, since translated
  CHANGELOGs have translated section headings
- Add v3.8.0 Community Contributors section with 38 external contributors credited
- Sync CHANGELOG.md translations across 40 locales
…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
NomenAK and others added 24 commits May 14, 2026 00:16
The local-aliases-precedence path used `typeof aliases[parsed.model] === "string"`
to guard string-only operations, but TypeScript does not narrow the variable
`directTarget` from that index-expression test — the variable retained the union
type ModelAliasValue (string | object), so `indexOf`/`slice` were typed as
property accesses on the object branch and the strict-core typecheck failed.

Refactors to capture `directTarget` first and run `typeof directTarget === "string"`
on the variable, which TS does narrow. No runtime semantics change — local-aliases
tests still pass.
After merging PRs #2221 (ModelSync shared loopback readiness gate + IPv4 force)
and #2219 (Antigravity loadCodeAssist bootstrap + fetchAvailableModels fallback)
into release/v3.8.0, two test suites needed updates to match the new routing:

- tests/unit/model-sync-route.test.ts:
  * resetStorage() now calls __resetLoopbackReadinessForTests() so the
    module-level __loopbackReadyPromise cache does not leak between tests.
  * Every fetch mock now answers the /__readiness_probe__/ URL with 404 so
    the gate opens immediately (any HTTP response satisfies the probe).
  * Self-fetch target URL assertions updated from http://localhost/...
    to http://127.0.0.1:20128/... per PR #2221's IPv4-force.
- tests/unit/provider-models-route.test.ts:
  * The Antigravity discovery-retry test now treats loadCodeAssist calls as
    non-fatal failures so the discovery path is still exercised.
  * The expected discovery URL sequence is updated to the new
    fetchAvailableModels-first order introduced by PR #2219.
Co-authored-by: nickwizard <nickwizard@users.noreply.github.com>
… stricter proxies (#2233)

Integrated into release/v3.8.0 with idle timeout default reverted to 600s
Integrated into release/v3.8.0 as bf83aa5 (i18n keys propagated)
Integrated into release/v3.8.0 with Zod schema validation replacing JSON.parse(parsed)
Integrated into release/v3.8.0 with unit tests for Azure-AI /responses routing
- antigravity: AntigravityCredentials.projectId widened to string|null
  to match base ProviderCredentials shape post-#2227 squash merge.
- responses-handler: heartbeat assertion updated for #2233's new
  openai-responses-in-progress shape (was: keepalive comment).
- search-registry: expected count is now 12 (ollama-search +
  zai-search both landed in this release).
- Add tool-detector.ts (6 CLI tools: claude, codex, opencode, cline, kilocode, continue)
- Add config-generator/ factory + 6 generators (JSON + YAML)
- Add doctor/checks.ts for CLI tool health checks
- Add log-streamer.ts for usage log streaming
- Add @omniroute/opencode-provider npm package
- Add 5 CLI commands: config, status, logs, update, provider
- Add 3 API routes: config, detect, apply
- Update bin/omniroute.mjs, bin/cli/index.mjs, package.json
- Update docs: SETUP_GUIDE.md, CLI-TOOLS.md
- All tests pass (4302/4326, 24 pre-existing failures unchanged)
…d Code API (#2243)

Integrated into release/v3.8.0 — Command Code validation now sends correct external environment and stream=false.
…o arrays (#2242)

Integrated into release/v3.8.0 — surgical streaming translator shim for submit_pr_review functionalChanges/findings array fields.
Integrated into release/v3.8.0 (http-proxy-middleware bumped to 4.x; engines.node updated in follow-up)
http-proxy-middleware 4.x (introduced via #2228) requires Node >=22.15.0.
Updated engines.node to >=22.22.2 <23 || >=24.0.0 <27 (drops 20.x).

BREAKING CHANGE: users on Node 20.x must upgrade to Node 22.22.2+ or 24+.

Refs: #2228

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… 20.x)

The root package.json was updated in 52f3285 to drop Node 20.x support
(http-proxy-middleware 4.x requirement). electron/package.json had no
engines field declared, leaving the desktop build implicitly permissive.

Adds the same constraint (>=22.22.2 <23 || >=24.0.0 <27) to keep the
electron workspace consistent with the root engine policy.

Refs: #2228

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… blocks verbatim

Fixes Anthropic HTTP 400 errors (~49/h on claude-opus-4-7) by preserving
the latest assistant message's thinking blocks verbatim instead of
rewriting them to redacted_thinking.

Co-authored-by: NomenAK <anton@nomenak.dev>
…rry-pick from PR #2231)

Cherry-picks non-overlapping changes from @kang-heewon's PR #2231:
- isDeepSeekV4Model() check in responseSanitizer
- providerRegistry V4 model entries with supportsReasoning
- schemaCoercion model-param for injectEmptyReasoningContentForToolCalls
- reasoningCache request-ID-based stable keys
- translator reasoning-only message replay for DeepSeek
- Comprehensive test coverage (81 tests across 5 providers)

Co-authored-by: kang-heewon <owen@kangheewon.dev>
- chatCore.ts: pass {requestId:skillRequestId,messageIndex:0} to cacheReasoningFromAssistantMessage
- responseSanitizer.ts: widen isDeepSeekV4Model regex to match all deepseek-v4 variants
…ct signature

After cherry-picking PR #2231, the function signature changed from
positional (provider, model) to object ({ provider, model }). Fixes the
2 pre-existing tests that still used the old positional style.
…tation

- Resolve <<<<<<< HEAD conflict in RoutingTab.tsx by keeping the
  HEAD version with aria-disabled and pre-computed titleText
- Fix inconsistent indentation in CLI help text (providers commands
  and CLI Tools section)
Adds 5 new CLI management commands (config, status, logs, update, provider),
3 API endpoints (/api/cli-tools/{detect,config,apply}), config generators
for 6 tools (Claude, Cline, Codex, Continue, KiloCode, OpenCode), zero-config
auto-routing via auto/ prefix, and @omniroute/opencode-provider npm package.

Fixes: merge conflict in RoutingTab.tsx, help text indentation, README conflicts.
Closes #2016

Co-authored-by: oyi77 <paijo@users.noreply.github.com>
Comment thread @omniroute/opencode-provider/index.ts Dismissed
Deep audit of all 320 commits since v3.7.9 found:
- 18 merged PRs not documented in CHANGELOG (4 features, 10 bug fixes, 1 security, 2 chores, 1 debug improvement)
- 3 contributors entirely missing from credits table (@NomenAK with 12 PRs, @kang-heewon, @one-vs)
- 4 existing contributors with inaccurate PR counts (@oyi77 8→12, @ddarkr 2→3, @andrewmunsell 2→3, @nickwizard 2→3)

New entries added:
- feat: #2135 (1proxy settings), #2227 (antigravity project ID), #2238 (Z.AI Search), #2240 (CLI Suite)
- fix: #2217, #2218, #2219, #2221, #2222, #2223, #2224, #2231, #2233, #2236, #2242, #2243
- security: #2209 (stack trace exposure)
- chore: #2228, #2234

Total contributors updated from 50+ to 55+.
@diegosouzapw
diegosouzapw merged commit c6f5b39 into main May 14, 2026
7 checks passed
HouMinXi pushed a commit to HouMinXi/OmniRoute that referenced this pull request Aug 2, 2026
Poid-ZA pushed a commit to Poid-ZA/OmniRoute that referenced this pull request Aug 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.