Commit Graph

4934 Commits

Author SHA1 Message Date
墨林ObsidianGrove
153a421354 test: cover managed model alias lifecycle
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 20:52:08 +08:00
diegosouzapw
18ab2e9259 chore(release): open v3.8.0 staging branch for post-release patches 2026-05-14 09:47:36 -03:00
Diego Rodrigues de Sa e Souza
c6f5b394f8 Release v3.8.0 (#2111)
Release v3.8.0
2026-05-14 09:46:39 -03:00
diegosouzapw
c49d817a68 docs(changelog): add 18 missing PR entries and fix contributor credits
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+.
2026-05-14 09:41:28 -03:00
8mbe
26758b3ed9 fix(kiro): harden OpenAI-to-Kiro translator for API compliance
- Normalize tool schemas: strip additionalProperties and empty required arrays
- Merge consecutive assistant messages and adjacent user turns after role normalization
- Prepend synthetic user message when conversation starts with assistant
- Convert orphaned toolResults to inline text when assistant with toolUses is missing
- Enforce strictly alternating user/assistant roles in history
- Use deterministic uuidv5 conversationId based on first message for session caching
- Ensure origin field is present on all userInputMessage entries
2026-05-14 15:33:19 +03:00
diegosouzapw
678dee2ede Merge PR #2240: feat: CLI Integration Suite for issue #2016
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>
2026-05-14 09:27:18 -03:00
diegosouzapw
da939ca2ba fix: resolve merge conflict in RoutingTab.tsx and fix help text indentation
- 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)
2026-05-14 09:25:09 -03:00
diegosouzapw
6c976a6b68 fix(tests): align requiresReasoningReplay xiaomi-mimo tests with object 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.
2026-05-14 09:22:17 -03:00
kang-heewon
c2bf5c7db5 test(deepseek): fix cache key in translator replay tests to message:0 2026-05-14 09:21:17 -03:00
kang-heewon
4726dea901 fix(deepseek): use consistent messageIndex 0 for non-tool-call reasoning replay 2026-05-14 09:21:12 -03:00
kang-heewon
72dd7c9b49 fix(deepseek): pass requestId context to cache and widen sanitizer regex
- chatCore.ts: pass {requestId:skillRequestId,messageIndex:0} to cacheReasoningFromAssistantMessage
- responseSanitizer.ts: widen isDeepSeekV4Model regex to match all deepseek-v4 variants
2026-05-14 09:21:07 -03:00
diegosouzapw
18ef28ea77 fix(deepseek): preserve reasoning_content for DeepSeek V4 models (cherry-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>
2026-05-14 09:20:21 -03:00
diegosouzapw
35a55d73f3 Merge PR #2224: fix(claudeHelper): preserve latest assistant thinking 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>
2026-05-14 09:18:57 -03:00
diegosouzapw
fe9efd2191 chore(electron): align engines.node with root package.json (drop Node 20.x)
The root package.json was updated in 52f3285d 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>
2026-05-14 09:09:18 -03:00
墨林ObsidianGrove
bcbc095798 fix: sync managed model aliases with visibility
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 19:31:38 +08:00
diegosouzapw
52f3285dcd chore!: bump engines.node to drop Node 20.x support (hpm 4.x compat)
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>
2026-05-14 08:28:50 -03:00
Anton
ebed308fbb build(deps): regenerate package-lock.json to match package.json (#2228)
Integrated into release/v3.8.0 (http-proxy-middleware bumped to 4.x; engines.node updated in follow-up)
2026-05-14 08:23:33 -03:00
Anton
52285d8a7a fix(translator): coerce submit_pr_review functionalChanges/findings to arrays (#2242)
Integrated into release/v3.8.0 — surgical streaming translator shim for submit_pr_review functionalChanges/findings array fields.
2026-05-14 08:08:02 -03:00
Dohyun Jung
1b14b5b012 fix(providers/command-code): fix validation request format for Command Code API (#2243)
Integrated into release/v3.8.0 — Command Code validation now sends correct external environment and stream=false.
2026-05-14 08:06:55 -03:00
oyi77
2d601ea459 feat: CLI Integration Suite for issue #2016
- 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)
2026-05-14 17:26:30 +07:00
diegosouzapw
831f64ed38 test: fix post-merge test breakages from #2227 #2233 #2238
- 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).
2026-05-14 06:19:02 -03:00
Vitalii
0c3d33899d Fix Azure AI Foundry provider connection handling (#2236)
Integrated into release/v3.8.0 with unit tests for Azure-AI /responses routing
2026-05-14 05:53:26 -03:00
Andrew Munsell
0caca472d4 feat(search): add Z.AI Coding Plan Search via MCP protocol (#2238)
Integrated into release/v3.8.0 with Zod schema validation replacing JSON.parse(parsed)
2026-05-14 05:42:22 -03:00
nickwizard
ce746d4f5b Feat/antigravity project (#2227)
Integrated into release/v3.8.0 as bf83aa55 (i18n keys propagated)
2026-05-14 05:23:44 -03:00
Anton
b9db934e39 fix(sse-heartbeat): shape-aware keepalives keep streams alive through stricter proxies (#2233)
Integrated into release/v3.8.0 with idle timeout default reverted to 600s
2026-05-14 05:23:26 -03:00
diegosouzapw
bf83aa55de feat(antigravity): support custom Google Cloud project ID (#2227)
Co-authored-by: nickwizard <nickwizard@users.noreply.github.com>
2026-05-14 05:11:24 -03:00
diegosouzapw
22f2c033da test(modelSync,antigravity): align with post-merge route behavior
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.
2026-05-14 00:40:18 -03:00
diegosouzapw
30130d6c2c fix(model): narrow ModelAliasValue with typed check before string ops
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.
2026-05-14 00:24:08 -03:00
Anton
44a04df4f6 fix(rateLimit): never .stop() during runtime reset, evict cache instead (#2218)
Integrated into release/v3.8.0
2026-05-14 00:21:16 -03:00
Anton
253f5e5904 fix(ModelSync): shared loopback readiness gate + IPv4 force (#2221)
Integrated into release/v3.8.0
2026-05-14 00:16:22 -03:00
Anton
e2b4c2b06e fix(antigravity): strip generationConfig.thinkingConfig for Claude models (#2217)
Integrated into release/v3.8.0
2026-05-14 00:15:40 -03:00
Anton
9ae31e7f05 fix(model): local aliases override cross-proxy provider inference (#2223)
Integrated into release/v3.8.0
2026-05-14 00:10:05 -03:00
Anton
bbdcb97a06 fix(antigravity): bootstrap project via loadCodeAssist + fetchAvailableModels fallback (#2219)
Integrated into release/v3.8.0
2026-05-14 00:09:26 -03:00
Anton
29b9f27919 fix(proxyFetch): retry once on undici dispatcher failure before native fallback (#2222)
Integrated into release/v3.8.0
2026-05-14 00:08:35 -03:00
Anton
46df8470a9 fix(requestLogger): exempt tools field from array truncation for full debug visibility (#2234)
Integrated into release/v3.8.0
2026-05-14 00:07:47 -03:00
diegosouzapw
8c4d726c7b Merge upstream/registry-per-model-specs-refresh: registry per-model specs refresh (gpt-5.5 cap, kimi-coding context)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	open-sse/config/providerRegistry.ts
#	src/shared/constants/modelSpecs.ts
2026-05-13 22:27:20 -03:00
diegosouzapw
81928cccc5 Merge upstream/cliproxyapi-anthropic-shape-fixes: Anthropic shape + Capy strip + mcp rewrite
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	open-sse/executors/cliproxyapi.ts
#	tests/unit/cliproxyapi-executor.test.ts
2026-05-13 22:19:02 -03:00
diegosouzapw
14884568a9 Merge upstream/responses-background-degrade: responses background → synchronous degrade
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 22:15:57 -03:00
diegosouzapw
788f8e1794 Merge upstream/executors-sanitize-reasoning-effort: sanitize reasoning_effort for non-supporting providers
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	tests/unit/base-executor-sanitize-effort.test.ts
2026-05-13 22:15:19 -03:00
diegosouzapw
6a0b19c535 Merge upstream/translator-claude-thinking-placeholder: thinking placeholder for Claude-shape upstreams
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	open-sse/translator/helpers/claudeHelper.ts
#	tests/unit/translator-claude-helper-thinking.test.ts
2026-05-13 22:13:13 -03:00
diegosouzapw
2eb4b1ac3b Merge follow-up-2100-useUpstream429BreakerHints: resilience 429 hints toggle
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	open-sse/services/accountFallback.ts
#	src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx
#	src/lib/resilience/settings.ts
#	src/shared/utils/classify429.ts
#	src/shared/utils/providerHints.ts
#	src/sse/handlers/chat.ts
#	src/sse/handlers/chatHelpers.ts
#	tests/unit/provider-hints.test.ts
#	tests/unit/resilience-settings-upstream429-breaker.test.ts
2026-05-13 22:06:57 -03:00
diegosouzapw
8b93dd5583 Merge feature/ollama-search-provider: Ollama Search web provider
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 21:52:58 -03:00
diegosouzapw
a249724777 Merge feat/devin-cli-windsurf-provider: Devin CLI + Windsurf provider + OAuth
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	src/shared/services/cliRuntime.ts
2026-05-13 21:52:20 -03:00
diegosouzapw
078f687592 Merge feat/combo-model-metadata-catalog: aggregate combo model metadata in catalog
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	CHANGELOG.md
#	scripts/scratch/check_usage.js
2026-05-13 21:50:42 -03:00
diegosouzapw
6f93d81e58 Merge prclean/resilience-model-cooldown: expose model cooldown list with manual re-enable
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx
2026-05-13 21:46:39 -03:00
diegosouzapw
e584fe9e33 Merge fix/combo-context-length-auto-calc: CustomModelEntry refactor
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	.issues/feat-batch-delete-provider-accounts.md
2026-05-13 21:44:46 -03:00
diegosouzapw
7d0e51a7a7 Merge fix/searxng-test-connection: allow optional-key providers to pass connection test
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

# Conflicts:
#	src/shared/constants/providers.ts
#	tests/unit/proxy-connection-test.test.ts
2026-05-13 21:43:52 -03:00
diegosouzapw
799959432b Merge bugfix/preserve-reasoning-content-tool-calls: preserve reasoning_content in tool_calls
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 21:41:58 -03:00
diegosouzapw
9fcc8648e9 Merge platform overhaul finalize (FASES 5-9)
Builds on the FASE 1-4 merges already on release/v3.8.0.

### FASE 5 — i18n docs pipeline (hash-based incremental)
- config/i18n.json canonical locale list (41 locales) + JSON schema
- scripts/i18n/run-translation.mjs (cx/gpt-5.4-mini via OMNIROUTE_TRANSLATION_*)
- scripts/i18n/check-translation-drift.mjs
- .i18n-state.json tracks SHA-256 source/target hashes
- Legacy scripts (i18n_autotranslate.py, generate-multilang.mjs) deprecated with banners
- Built-in .env auto-loader so npm scripts work standalone

### FASE 6 — i18n UI pipeline
- scripts/i18n/sync-ui-keys.mjs replicates en.json keys to 40 locales
- scripts/i18n/check-ui-keys-coverage.mjs (gate 80%)
- DocsI18n.tsx (cosmetic) removed — locale unified via next-intl
- [slug]/page.tsx serves locale-translated docs with English fallback

### FASE 7 — /src/app/docs sync
- Drift fixes: 179->177 providers, 13->14 strategies, 36->37 MCP tools
- YAML frontmatter on all 44 docs (title/version/lastUpdated)
- ApiExplorer consumes docs/reference/openapi.yaml (19 endpoints, dynamic)
- content.ts updated: 37 MCP tool groups, 7 deployment guides with internal hrefs

### FASE 8 — CI gates & hooks
- scripts/check/check-doc-links.mjs validates internal markdown refs
- Husky pre-commit extended (env-doc-sync strict, i18n advisories)
- ci.yml: 2 new jobs (docs-sync-strict, i18n-ui-coverage)

### FASE 9 — Sign-off
- 270 broken doc links rewritten (post-restructure relativization fix)
- .i18n-state.json drift in ARCHITECTURE.md re-translated
- CHANGELOG.md and RELEASE_CHECKLIST.md updated

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 21:21:43 -03:00
diegosouzapw
91b457a802 docs(release): add i18n / doc-links / env-doc checks to RELEASE_CHECKLIST
Wires the new platform-overhaul gates into the Detailed Checklist used by
the release-cut workflow:

  Documentation block:
    npm run check:docs-all   (umbrella over sync, counts, env-doc, deprecated, doc-links)
    npm run check:env-doc-sync   (code ↔ .env.example ↔ ENVIRONMENT.md parity)
    npm run check:doc-links   (no broken internal markdown refs)

  i18n block (replaces stale `scripts/i18n-check.mjs` mention):
    npm run i18n:check   (drift between source docs and .i18n-state.json)
    npm run i18n:check-ui-coverage   (every locale ≥ 80% UI key coverage)
    npm run i18n:sync-ui:dry   (0 missing keys across 40 locales)
    Note about running npm run i18n:run when source English docs change.

These are the same checks newly enforced by the docs-sync-strict and
i18n-ui-coverage CI jobs added in commit acf6b93d.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 20:00:22 -03:00