Commit Graph

2875 Commits

Author SHA1 Message Date
diegosouzapw
47de3bf60f docs(changelog): add entries for PRs #2269, #2271, #2273
- #2269: ignore .playwright-mcp/ artifacts (@backryun)
- #2271: Command Code stream payload fix (@ddarkr)
- #2273: Android/Termux headless support (@t-way666)
2026-05-15 03:30:56 -03:00
t-way666
4a84ab9c1b feat(termux): Android/Termux headless support (#2273)
- Move wreq-js and tls-client-node to optionalDependencies
- Lazy-load wreq-js WS proxy with graceful 503 when unavailable
- Auto-detect Android platform for headless mode (no browser open)
- Set GYP_DEFINES for better-sqlite3 build on Android/ARM
- Extended build timeout to 600s for ARM compilation
- Skip wreq-js binary fix on Android (unsupported platform)
- Platform warnings for unsupported features (WS proxy, TLS, Electron, MITM)

Co-authored-by: t-way666 <t-way666@users.noreply.github.com>
2026-05-15 03:29:18 -03:00
ddarkr
4f80be1f2f fix(providers/command-code): send required stream payload (#2271)
- Force skills: "" and params.stream: true in Command Code wrapper
- Align validation probe payload with upstream-required shape
- Default validation model to deepseek/deepseek-v4-flash

Co-authored-by: ddarkr <ddarkr@users.noreply.github.com>
2026-05-15 03:25:22 -03:00
backryun
76c20240f1 chore: ignore Playwright MCP artifacts (#2269)
Remove tracked .playwright-mcp/ generated artifacts (CSP error logs,
accessibility tree snapshots) and add the directory to .gitignore.

Co-authored-by: backryun <backryun@users.noreply.github.com>
2026-05-15 03:23:45 -03:00
diegosouzapw
f79ab2c3d1 fix(settings): default debugMode to true on fresh installations
The Debug sidebar section (Translator, Playground, Search Tools) was
hidden on new installs because debugMode was not in the settings
defaults object. This made data?.debugMode === true evaluate to false,
while the toggle in System & Storage appeared active — an inconsistency.

Changes:
- Add debugMode: true to getSettings() defaults in settings.ts
- Align SystemStorageTab useState initial value to true
- Update CHANGELOG with fix entry
2026-05-15 01:57:17 -03:00
diegosouzapw
6e392932c2 feat(i18n): add Azerbaijani (az 🇦🇿) language support
- Add az locale to config/i18n.json (source of truth, 42 locales total)
- Create src/i18n/messages/az.json (UI strings from en.json base)
- Create docs/i18n/az/ directory with full documentation set
- Add 🇦🇿 Azərbaycan dili to README.md language bar
- Add az entry to docs/i18n/README.md index (40 doc languages)
- Add az to generate-multilang.mjs LOCALE_SPECS (Google TL: az)
- Add az to i18n_autotranslate.py lang_map
- Update CHANGELOG.md with feat(i18n) entry
2026-05-15 01:14:43 -03:00
diegosouzapw
6c6e8d3f2f docs(changelog): add missing PR references and contributor credits
Update changelog entries to include associated PR numbers and thank-you
attributions for recent features, improving release documentation
accuracy and contributor recognition.
2026-05-15 00:22:54 -03:00
diegosouzapw
7fb5505b12 fix(guardrails/vision-bridge): env override for non-Anthropic endpoint (#2232)
When users configured `visionBridgeModel: "gemini/gemini-2.0-flash"` (or
any non-Anthropic prefix like `openrouter/...`, `google/...`), every
request failed with `Vision API error 401: You didn't provide an API
key` from OpenAI. The helper hardcoded `https://api.openai.com/v1` as
the base URL and `OPENAI_API_KEY` as the auth header for any model
that wasn't `anthropic/*`, so users without an OpenAI key (or who
wanted to use Gemini/OpenRouter/OmniRoute self-loop) had no path that
worked.

This change adds two env vars:

- VISION_BRIDGE_BASE_URL — alternate OpenAI-compatible base URL.
  Priority: VISION_BRIDGE_BASE_URL → legacy OpenAI URL env →
  api.openai.com (default).
- VISION_BRIDGE_API_KEY — alternate API key for that endpoint.
  Priority: explicit caller arg → VISION_BRIDGE_API_KEY →
  per-provider env (Anthropic/Google/OpenAI) → OpenAI fallback.

Anthropic models (anthropic/*) keep their dedicated `x-api-key` path
with the Anthropic env key unchanged — the override only affects the
OpenAI-compat branch, since the wire format differs.

Operators now have stable paths to:

- Route through OmniRoute itself (any registered model works):
    VISION_BRIDGE_BASE_URL=http://localhost:20128/v1
    VISION_BRIDGE_API_KEY=sk-<omniroute-key>
- Use Google's Gemini OpenAI-compat endpoint directly:
    VISION_BRIDGE_BASE_URL=https://generativelanguage.googleapis.com/v1beta/openai
- Use OpenRouter directly:
    VISION_BRIDGE_BASE_URL=https://openrouter.ai/api/v1

Reported by @kapustacool-lgtm. Documented in `.env.example` and
`docs/reference/ENVIRONMENT.md`. 11 unit tests cover env precedence
and the Anthropic-bypass guarantee.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 22:42:48 -03:00
diegosouzapw
bd292b1e80 docs: add changelog entries for PRs #2264, #2265, #2266, #2267, #2259 2026-05-14 20:22:37 -03:00
backryun
c6b269a4d5 node dependency updates (#2259)
chore: node dependency updates (#2259 — thanks @backryun)
2026-05-14 20:20:54 -03:00
payne
aa0e312d8a feat(limits): per-window quota cutoffs across all providers with usage data (#2267)
feat(limits): per-window quota cutoffs across all providers with usage data (#2267 — thanks @payne0420)
2026-05-14 20:19:55 -03:00
Gleb Peregud
3ce114af44 feat(api-keys): configurable default rate limits via DEFAULT_RATE_LIMIT_PER_DAY (#2266)
feat(api-keys): configurable default rate limits via DEFAULT_RATE_LIMIT_PER_DAY (#2266 — thanks @gleber)
2026-05-14 20:19:15 -03:00
Gleb Peregud
24b2e77aae feat(authz): managementPolicy accepts API keys with manage scope (#2265)
feat(authz): managementPolicy accepts API keys with manage scope (#2265 — thanks @gleber)
2026-05-14 20:18:09 -03:00
Gleb Peregud
955049186f fix(sse): strip stale Content-Encoding/Content-Length on non-stream forward (#2264)
fix(sse): strip stale Content-Encoding/Content-Length on non-stream forward (#2264 — thanks @gleber)
2026-05-14 20:17:04 -03:00
diegosouzapw
4fe2ef8887 docs(opencode): announce @omniroute/opencode-provider on npm
- README: dedicated OpenCode integration section with npm/downloads/bundle
  size badges, install command, two-path usage example (CLI + npm), and
  the resulting opencode.json shape.
- CHANGELOG: note the 0.1.0 npm publish under Unreleased > Changed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 18:18:58 -03:00
diegosouzapw
4b1e57443a refactor(@omniroute/opencode-provider): rewrite for schema correctness + publishability
The 1.0.0 release of the package was broken end-to-end:

  1. index.js re-exported from "./index.ts" — Node can't import .ts at runtime,
     so any consumer who `npm install`ed the package got ERR_UNKNOWN_FILE_EXTENSION.
  2. The emitted provider shape did not match the OpenCode schema
     (https://opencode.ai/config.json). It used a custom `{id, name, npm, options, auth}`
     instead of the schema's `{npm: "@ai-sdk/openai-compatible", name, options, models}`.
  3. README told users to pass `baseURL: "http://localhost:20128/v1"` but the code
     appended `/v1` again — every request would 404 at `/v1/v1/...`.
  4. No build step, no LICENSE file, no repository/author/engines fields, no tests.

This rewrite:

- Moves source under `src/`, adds a tsup build emitting CJS + ESM + .d.ts.
- `createOmniRouteProvider` now returns a schema-valid entry with
  `npm: "@ai-sdk/openai-compatible"` + `models: Record<string, { name }>`.
- Adds `buildOmniRouteOpenCodeConfig` for full-document scaffolding.
- `normalizeBaseURL` deduplicates trailing `/` and `/v1`, accepts both forms,
  and rejects malformed URLs and empty inputs.
- 13 unit tests covering URL normalisation, input validation, default model
  catalog, custom models + labels, dedup/trim behaviour, and JSON round-trip.
- Adds LICENSE, full package.json (repository, engines, scripts, exports),
  .gitignore, .npmignore, tsconfig.json, and a comprehensive README.
- Resets version to 0.1.0 to signal the pre-1.0 reset (1.0.0 was never on npm).

Documentation:

- New `docs/frameworks/OPENCODE.md` covering both integration paths (CLI vs npm),
  URL normalisation, auth modes, troubleshooting, and runtime flow.
- README.md links the package and points to the new doc.
- CHANGELOG entry under Unreleased > Changed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 16:58:33 -03:00
diegosouzapw
d9b85704e4 docs(changelog): add PR #2261 managed model cleanup fix (@InkshadeWoods) 2026-05-14 15:48:31 -03:00
diegosouzapw
dd06e64207 Merge PR #2261: fix: align managed model cleanup for imported models (thanks @InkshadeWoods)
Adds deleteSyncedAvailableModelsForProvider() for full provider-level
cleanup, fixes delete-alias button visibility (source=alias only),
compatible models section gets proper 3-way delete logic.
2026-05-14 15:47:56 -03:00
diegosouzapw
d9c2c13851 fix(security): address P1/P2 findings from release review
Five issues raised in the v3.8.0 release review, all release-blocking:

P1 — open-sse/services/tokenRefresh.ts
Read Windsurf Firebase API key from WINDSURF_CONFIG.firebaseApiKey
(resolvePublicCred wrapper) instead of process.env directly. Without
this, the literal removal from .env.example silently broke browser-flow
Windsurf/Devin token refresh.

P1 — open-sse/translator/request/openai-to-kiro.ts
Mark synthetic "(empty)" turns injected for assistant-first chats as
non-enumerable __synthetic and skip them when deriving conversationId
via uuidv5. Prevents unrelated chats from colliding on the same upstream
Kiro/AWS Builder ID context.

P2 — open-sse/utils/publicCreds.ts
Harden decodePublicCred against raw credential overrides outside
RAW_VALUE_PATTERN: strict-base64 alphabet check + printable-plain check
on the decoded result. Buffer.from(v, "base64") is lenient and was
silently mangling unrecognized raw values.

P2 — src/sse/services/auth.ts
Gate the x-api-key fallback on the anthropic-version header. Without
this scoping, local-mode requests with placeholder x-api-key from
non-Anthropic clients were rejected as Invalid API key even with
REQUIRE_API_KEY=false.

P2 — src/app/api/providers/[id]/test/route.ts
Move Qoder OAuth+PAT disambiguation BEFORE the CLI-runtime early-return
that was making the new message branch unreachable for the target
scenario from #2247.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 15:23:46 -03:00
diegosouzapw
f3f1f9f36e fix(api): sanitize error responses in management routes
Prevent raw exception messages from leaking stack frames or absolute
paths in the console logs and token health endpoints.

Also harden the i18n mirror move script by replacing shell-based git
commands with execFileSync and a safer fallback for untracked files.
2026-05-14 15:23:46 -03:00
Owen
67f713d3a5 Merge PR #2231: fix(deepseek): preserve reasoning_content through full pipeline for DeepSeek V4 models (thanks @kang-heewon)
Squash merge as part of the v3.8.0 release housekeeping. Closes #2231.
2026-05-14 15:23:24 -03:00
墨林ObsidianGrove
4a31a795b9 test: cover provider synced model deletion
Add regression coverage for clearing provider-scoped synced available models without affecting other providers.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 02:05:32 +08:00
墨林ObsidianGrove
83f242fa4d fix: clear synced provider models on delete all
Ensure provider-level delete all removes synced available model lists so imported models do not reappear after clearing managed models.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 01:39:31 +08:00
墨林ObsidianGrove
2f794d92a4 fix: hide delete action for imported models
Prevent synced imported and fallback provider models from showing row-level delete actions, while keeping custom/manual and alias-only deletion behavior intact.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 01:31:08 +08:00
diegosouzapw
eff7de2284 docs(security): note CodeQL custom-sanitizer limitation as dismissal precedent
CodeQL js/stack-trace-exposure does not recognize sanitizers reached
through a custom helper indirection — flagging callsites like
open-sse/utils/error.ts::errorResponse and
open-sse/executors/cursor.ts::buildErrorResponse even though both route
through sanitizeErrorMessage().

Record the dismissal precedent (alerts #224 and #231, May 2026):
- Add a "Known CodeQL limitation" section in
  docs/security/ERROR_SANITIZATION.md documenting how to handle future
  occurrences (verify callchain → verify test coverage → dismiss with
  reference, do NOT duplicate the pattern inline).
- Extend CLAUDE.md Hard Rule #14 with the precedent so the next
  engineer doesn't try to "fix" the false positive by weakening the
  shared sanitizer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 14:10:29 -03:00
diegosouzapw
bbf3ba0138 docs(changelog): add 4 merged PRs (#2254, #2253, #2251, #2250) to Unreleased
- fix(executor/claude-code): non-enumerable tool remap metadata (@Rikonorus)
- fix(streaming): strip SSE compression headers (@Rikonorus)
- fix(kiro): harden translator for API compliance (@8mbe, closes #2213)
- fix(models): sync managed model aliases with visibility (@InkshadeWoods)
2026-05-14 13:47:03 -03:00
diegosouzapw
d2b413c9ab Merge PR #2251: fix(kiro): harden OpenAI-to-Kiro translator for API compliance (thanks @8mbe)
Closes #2213

Conflict resolution: kept both images field (HEAD) and origin field (PR),
kept toolsAttached return value (HEAD) while incorporating all 8mbe
improvements (schema normalization, synthetic user guard, orphaned tool
results, alternating role enforcement). All 16 tests pass.
2026-05-14 13:45:24 -03:00
diegosouzapw
ed1993d5bf Merge PR #2250: fix: sync managed model aliases with visibility (thanks @InkshadeWoods) 2026-05-14 13:42:14 -03:00
diegosouzapw
1d21eb1686 Merge PR #2253: fix: strip streaming compression headers (thanks @Rikonorus) 2026-05-14 13:41:41 -03:00
diegosouzapw
e1a6ecf238 Merge PR #2254: fix: keep Claude tool remap metadata off wire (thanks @Rikonorus) 2026-05-14 13:40:51 -03:00
diegosouzapw
57a80b6c1a fix(providers/blackbox-web): BLACKBOX_WEB_VALIDATED_TOKEN env override (#2252)
Blackbox's `/api/chat` now rejects requests whose `validated` field
doesn't match the frontend `tk` token (exported from app.blackbox.ai's
Next.js bundle), returning HTTP 403 even when the session cookie is
valid and the subscription is active. The previous executor sent a
random UUID, which works only until Blackbox enforces the check.

This change:

- Adds `resolveBlackboxValidatedToken()` that returns
  `BLACKBOX_WEB_VALIDATED_TOKEN` when set, otherwise falls back to the
  legacy random UUID (no regression for users who already work).
- Detects 403 responses whose body indicates a token-specific failure
  ("invalid validated token", "validation token", etc.) and replaces
  the generic "cookie expired" message with explicit guidance to set
  BLACKBOX_WEB_VALIDATED_TOKEN. The cookie-expired path is preserved
  for non-token 401/403.
- Documents the env var in `.env.example` and
  `docs/reference/ENVIRONMENT.md` (env-doc-sync check passes).

Deliberately NOT included: runtime scraping of Blackbox's Next.js
chunks to auto-extract `tk`. That coupling to their bundle hash would
silently break on every frontend deploy — the env override is the
stable path for operators who have already resolved the token.

Reported by @kazimshah39 with detailed root-cause analysis.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 13:00:15 -03:00
diegosouzapw
7210a73e1f fix(dashboard/api-manager): use getProviderDisplayName for owned_by labels (#2021)
Custom OpenAI-/Anthropic-compatible providers ship with synthetic IDs
like "openai-compatible-chat-<uuid>". ApiManagerPageClient was grouping
models by raw `model.owned_by`, so the user saw the full synthetic id
in the model picker.

Wrap `model.owned_by` with the existing centralized
`getProviderDisplayName` helper (already used by Endpoint, Health, and
Combos pages). The helper detects the dynamic-compatible pattern and
renders it as "Compatible (openai)" / "Compatible (anthropic)" — a
small but meaningful improvement that takes the dashboard one step
closer to issue #260's "no raw IDs in the UI" goal.

Showing the user-entered node name ("Poe") instead of the generic
"Compatible (openai)" label remains a follow-up (requires fetching
/api/provider-nodes here and matching by id/prefix); tracked separately.

Reported by @pulyankote with a complete surface-by-surface table.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 12:58:26 -03:00
diegosouzapw
f63f29830f fix(providers/qoder): disambiguate OAuth/CLI vs API-key error surface (#2247)
When a Qoder connection lands in OAuth/CLI-flavored mode but the user
has pasted a Personal Access Token, the provider test route surfaces
"Local CLI runtime is not installed" plus a cascading 401 from
DashScope. Neither error tells the user "you picked the wrong auth
mode, switch to API Key".

The runtime check now detects this state (Qoder + non-apikey authType +
a token present on the connection or providerSpecificData) and surfaces
a single actionable message: "Qoder OAuth/Local CLI mode is selected
but the Qoder CLI is not detected. If you have a Personal Access Token,
switch this connection to API Key auth instead."

Non-Qoder providers and Qoder in real OAuth/CLI mode without a token
still get the original generic message.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:46:07 -03:00
diegosouzapw
e84e1b41bf fix(ui): clarify Claude extra-usage toggle notification text (#2157)
The toggle is labeled "Block Claude Extra Usage" but the success
notification simply said "Claude extra-usage blocked / allowed". Users
who interpreted the toggle as "Allow Extra Usage" then read the message
as inverted ("I enabled it and it tells me it's blocked").

New text spells out the toggle→effect relationship:
- ON  → "Claude extra-usage blocking enabled (extra usage will be blocked)"
- OFF → "Claude extra-usage blocking disabled (extra usage is allowed)"

No functional change. Reported by @uwuclxdy.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:43:43 -03:00
diegosouzapw
5ce332d2ee fix(translator): exclude cache_creation_input_tokens from prompt_tokens (#2215)
When OmniRoute translates Claude responses to the OpenAI format,
prompt_tokens was summing input + cache_read + cache_creation. Anthropic
pads short prompts up to a 1024-token minimum to create a cache, so:

  Request: {"messages":[{"role":"user","content":"hi"}]}
  Claude usage: input=8, cache_read=4, cache_creation=2000
  Dashboard "Total In": 8
  HTTP response prompt_tokens: 2008 (8 + 4 + 2000)

That 250x inflation broke downstream billing systems (Sub2API, NewAPI,
OneAPI) that trust prompt_tokens as the source of truth.

This change:
- prompt_tokens = input_tokens + cache_read_input_tokens (matches what
  the dashboard reports as "Total In", preserves issue #1426's intent
  that cache reads are billable input)
- cache_creation_tokens stays visible in
  prompt_tokens_details.cache_creation_tokens for auditing — it just no
  longer inflates the headline number

Reported by @downdawn with a complete root-cause trace.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:41:27 -03:00
diegosouzapw
7ab68365ba fix(auth): accept x-api-key header in extractApiKey (#2225)
Anthropic-native clients (Claude Code, @anthropic-ai/sdk) authenticate
via x-api-key per the Messages API contract. extractApiKey only read
Authorization: Bearer, so:

- usage_history.api_key_id was NULL for all x-api-key traffic (~50% of
  real-world traffic invisible in Costs/Analytics)
- api_keys.last_used_at never updated for keys delivered via x-api-key
- per-key policies (allowedModels, budget, rateLimits, accessSchedule,
  expiresAt) were bypassed for every Anthropic-native client

The fallback honors x-api-key (case-insensitive) when no Authorization:
Bearer is present. Bearer still wins when both are set, preserving
back-compat for clients that already send both. Reported by
@Forcerecon with a complete repro and validation plan.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:39:35 -03:00
diegosouzapw
242c50cb0c fix(security): rewrite sanitizeErrorMessage path matcher to be linear
The PATH_REGEX introduced in 1a39c31f used a greedy character class
([\w\-./\\]+) that can backtrack quadratically on inputs like
"///////..." — flagged by CodeQL js/polynomial-redos (#232).

Replace it with simple whitespace tokenization + a length-bounded
prefix-check helper. Same observable behaviour (paths replaced with
<path>), but linear time regardless of input shape. Adds a 4096-char
input cap as defence in depth.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:15:35 -03:00
diegosouzapw
037f4e8d50 fix(security): close remaining CodeQL alerts + document mandatory patterns
Fixes the 4 fixable alerts opened in the recent scan and adds enforceable
guardrails so future development follows the same pattern.

Code fixes:
- src/mitm/cert/install.ts: pass certPath/certName/action via exec()'s env
  option instead of string-interpolating them into the bash script
  (CodeQL js/shell-command-injection-from-environment #225)
- scripts/docs/{gen-provider-reference,add-frontmatter,fix-internal-links}:
  escape backslash before other regex/markdown metacharacters
  (CodeQL js/incomplete-sanitization #227, #228, #229)

Documentation (mandatory patterns):
- docs/security/PUBLIC_CREDS.md — embedding public upstream OAuth/Firebase
  identifiers via resolvePublicCred(); never as string literals
- docs/security/ERROR_SANITIZATION.md — routing every error response through
  sanitizeErrorMessage()/buildErrorBody(); never raw err.stack/err.message
- CLAUDE.md: 4 new Hard Rules (#11-#14) + Security section + scenario notes
- AGENTS.md, CONTRIBUTING.md: cross-reference the two new docs
- SECURITY.md: extended Hard Security Rules with the new mandatory patterns
- docs/README.md: index entries pointing to the two new docs

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 11:12:14 -03:00
Kahramanov
e244fd51d4 fix: keep Claude tool remap metadata off wire 2026-05-14 17:00:28 +03:00
Kahramanov
7c89858797 fix: strip streaming compression headers 2026-05-14 16:52:34 +03:00
diegosouzapw
1a39c31ff4 fix(security): mask public upstream creds + centralize error sanitization
Embed Gemini, Antigravity and Windsurf public OAuth/Firebase identifiers
(extracted from upstream CLI binaries) through a XOR-masked byte sequence
in open-sse/utils/publicCreds.ts instead of source literals, so pattern
scanners (GitHub Secret Scanning, Semgrep) stop raising false positives on
every release. decodePublicCred passes raw values through unchanged for
users who already have plaintext in their .env (no migration needed).

- New utils/publicCreds.ts with decode/encode + tests
- Replace 6 hardcoded Google client_id/secret in oauth.ts + providerRegistry
- Drop literals from .env.example (comment-only documentation)
- Sanitize error messages inside buildErrorBody so every caller (incl.
  createErrorResult) is covered; cursor.ts now reuses the shared helper
- Cover the new helpers with unit tests (publicCreds + error sanitization)

Resolves the open code-scanning js/stack-trace-exposure findings and the
secret-scanning Google API Key alert without breaking existing setups.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 10:36:42 -03:00
墨林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