Commit Graph

760 Commits

Author SHA1 Message Date
diegosouzapw
8c48abc40c feat(cli): fase 4.1 — comando oauth com fluxos browser/import/social/device 2026-05-15 01:51:07 -03:00
diegosouzapw
28629bf7f0 feat(cli): adicionar omniroute audit (Fase 3.4)
5 subcomandos: tail, search, export, stats, get.
Mescla compliance e MCP por timestamp. --follow faz polling 2s.
--source filtra entre compliance|mcp|all. Mascaramento de actor.
2026-05-15 01:30:18 -03:00
diegosouzapw
2468ebf8f7 feat(cli): adicionar omniroute skills e marketplace (Fases 3.2 e 3.3)
skills: list, get, install, enable, disable, delete, execute, executions, skillssh.
marketplace: search, info, install, categories, featured.
Suporta --from-file, --from-url, --input-file, --type, --enabled, --status.
2026-05-15 01:24:36 -03:00
diegosouzapw
33ad5012c6 feat(cli): adicionar omniroute memory (Fase 3.1)
7 subcomandos: search, add, clear, list, get, delete, health.
Suporta --type, --api-key, --older-than (parser 30d/6m/1y), --token-budget.
Strings i18n em en.json e pt-BR.json.
2026-05-15 01:18:58 -03:00
diegosouzapw
ba14064ea4 feat(cli): adicionar omniroute providers metrics (Fase 2.6)
Extende o grupo `providers` com dois subcomandos:
- `providers metrics`: lista métricas de performance de todos os provedores
  (latência avg/P95, success rate, custo, breaker state, erros).
  Suporta --provider, --connection-id, --period, --sort-by, --limit,
  --watch (refresh 5s) e --compare (filtro multi-provider).
- `providers metric <id> <metric>`: retorna valor escalar de uma métrica
  específica para uma conexão.

Fonte: GET /api/provider-metrics — normaliza tanto formato objeto
{metrics: {[provider]: {}}} quanto array de providers.
2026-05-15 01:10:10 -03:00
diegosouzapw
85489a0295 feat(cli): adicionar grupo usage com 7 subcomandos (Fase 2.5)
Implementa `omniroute usage` com subcomandos:
- analytics: agregados por provedor com filtro --period/--provider
- budget list|get|set|reset: gerenciamento de budgets de custo
- quota: estado de quota por provedor com --check
- logs: call-logs com --search, --since, --api-key e --follow (tail 2s)
- utilization: métricas de uso por API key
- history: histórico de requisições
- proxy-logs: logs em nível de proxy

API keys mascaradas em outputs human. Todos os subcomandos suportam
--output json/table/csv/jsonl via emit().
2026-05-15 00:59:21 -03:00
diegosouzapw
993cd32829 feat(cli): adicionar comando cost com breakdown de custos (Fase 2.4)
Implementa `omniroute cost` que consulta /api/usage/analytics com:
- --period <range>: 1d|7d|30d|90d|ytd|all (padrão: 30d)
- --since/--until: faixa de datas ISO (substitui --period)
- --group-by: provider|model|api-key|combo|day (padrão: provider)
- --api-key: filtrar por chave específica
- --limit: top N resultados
- Total em stderr ao final (modo tabela)
- Ordenação por custo decrescente
2026-05-15 00:52:15 -03:00
diegosouzapw
18e5bf26a6 feat(cli): adicionar comando simulate para dry-run de routing (Fase 2.3)
Implementa `omniroute simulate [prompt]` que consulta /api/combos,
/api/monitoring/health e /api/usage/quota para mostrar qual caminho
de routing seria escolhido sem executar chamada upstream. Suporta:
- Tabela com provider, model, probabilidade, custo estimado, breaker e quota
- --explain: imprime árvore de fallback e faixa de custo no stderr
- --output json: retorna array de targets completo
- --file <path>: carrega body JSON para estimar tokens
- --combo <name>: filtra por combo específico
- Tratamento gracioso quando servidor está offline (exit 3)
2026-05-15 00:45:35 -03:00
diegosouzapw
7c128b0f4e feat(cli): adicionar comando stream com inspeção SSE (Fase 2.2)
Implementa `omniroute stream [prompt]` com suporte a:
- --raw: imprime linhas SSE brutas sem parsing
- --debug: timing por chunk no stderr com timestamp relativo
- --save <path>: persiste eventos em arquivo .jsonl
- --output json: retorna chunks + métricas (TTFT, totalMs, tokens/s)
- --responses-api: usa /v1/responses e lê campo delta
- SIGINT gracioso via reader.cancel()
- Métricas de TTFT e tokens/s no stderr ao final
2026-05-15 00:36:41 -03:00
diegosouzapw
685954c0dd feat(cli): adicionar comando chat one-shot (Fase 2.1)
Implementa `omniroute chat [prompt]` com suporte a --file, --stdin, --system,
--model, --max-tokens, --temperature, --top-p, --reasoning-effort,
--thinking-budget, --combo, --responses-api, --stream e --no-history.

Respostas impressas no stdout; latência e token count no stderr (não interfere
em pipes). Histórico salvo em ~/.omniroute/cli-history.jsonl. Streaming via
SSE com print incremental de deltas.
2026-05-15 00:28:36 -03:00
diegosouzapw
a5fa94bdcb feat(cli): crash recovery com backoff exponencial e PID granular (Fase 1.9)
Adiciona ServerSupervisor (bin/cli/runtime/processSupervisor.mjs) que reinicia o
servidor com backoff exponencial (1s, 2s, 4s... cap 10s) em caso de crash.
Após maxRestarts falhas em 30s exibe crash log e encerra. Detecta MITM como
causa do crash via heurística e desabilita automaticamente.

PID management agora é granular por subprocesso (~/.omniroute/{service}/.pid)
suportando server, mitm e tunnel/cloudflared|tailscale. `stop` e
`killAllSubprocesses` encerram todos os serviços registrados.

Novas opções em `serve`: --log (passa stdout/stderr inline), --no-recovery
(comportamento legado sem supervisor), --max-restarts <n> (padrão 2).
2026-05-15 00:18:53 -03:00
diegosouzapw
6b63aa3948 feat(cli): deletar bin/cli-commands.mjs monolito (Fase 1.8)
Remove o monolito bin/cli-commands.mjs (2853 linhas) e helpers redundantes
(bin/cli/args.mjs, tests/unit/cli-args.test.ts). Todos os subcomandos já foram
migrados individualmente para bin/cli/commands/ nas Fases 1.1–1.7. Atualiza
pack-artifact-policy para referenciar bin/cli/program.mjs no lugar de
bin/cli-commands.mjs e bin/cli/index.mjs. Atualiza docs e CHANGELOG.
2026-05-15 00:06:14 -03:00
diegosouzapw
0bb1ae7240 feat(cli): padronizar saída emit() — cli-table3/csv-stringify/schema (Fase 1.7) 2026-05-14 23:54:49 -03:00
diegosouzapw
9da0e704a7 feat(cli): consolidar CLI_TOOLS — listCliTools/getCliTool + setup --list (Fase 1.6) 2026-05-14 23:48:12 -03:00
diegosouzapw
ab911265ed feat(cli): banir SQLite direto — withRuntime + src/lib/db/* modules (Fase 1.5) 2026-05-14 23:41:02 -03:00
diegosouzapw
162e2f4b98 feat(cli): migrar backup/restore/health/quota/cache/mcp/a2a/tunnel/env/test/completion (Fase 1.4) 2026-05-14 23:24:52 -03:00
diegosouzapw
22d27ca273 feat(cli): migrar serve/stop/restart/dashboard/keys/models/combo (Fase 1.3)
Extrai 7 grupos de comandos do monolito bin/cli-commands.mjs (2853 linhas)
para módulos individuais em bin/cli/commands/, registrados via Commander.

- stop.mjs: SIGTERM/SIGKILL via process.kill(); fallback por porta usa execFile
  com array de args (evita injeção de shell / Semgrep CWE-78)
- restart.mjs: delega para runStopCommand + runServe
- dashboard.mjs: alias "open", fallback nativo por plataforma via execFile
- keys.mjs: server-first (POST /api/v1/providers/keys) → DB fallback; valida
  provider via loadAvailableProviders(); suporte a --stdin
- models.mjs: GET /api/models → fallback /api/v1/models; filtro por provider e --search
- combo.mjs: list/switch/create/delete; switch server-first → DB fallback via key_value;
  TODO(1.5) marcados para substituir SQL cru por src/lib/db/combos.ts
- serve.mjs: escreve PID via writePidFile() no spawn; limpa no shutdown; suporte daemon

utils/pid.mjs e i18n keys (en.json + pt-BR.json) já criados em iteração anterior.

Testes: cli-keys-command.test.ts atualizado para novos runners;
        cli-serve-stop-command.test.ts, cli-combo-command.test.ts,
        cli-models-command.test.ts adicionados (23 testes, 0 falhas).
2026-05-14 23:11:30 -03:00
diegosouzapw
4ed8e4e673 feat(cli): migrar comandos modulares para Commander (Fase 1.2)
Migra os 8 comandos restantes (doctor, setup, providers, config, status,
logs, update, provider) de parseArgs manual para a API do Commander.
Cada arquivo exporta register<Nome>(program) e run*Command(opts = {}).
Deleta bin/cli/index.mjs (substituído por commands/registry.mjs).
Remove dependência de bin/cli/args.mjs em todos os comandos migrados.
Corrige CWE-310 em doctor.mjs: authTagLength explícito no createDecipheriv.
2026-05-14 22:38:59 -03:00
diegosouzapw
31031422d3 feat(cli): adotar Commander.js como framework CLI (Fase 1.1)
- Instala commander@^14.0.0 com suporte nativo a ESM
- Cria bin/cli/program.mjs: programa raiz com opções globais
  (--output, --quiet, --no-color, --timeout, --api-key, --base-url)
- Cria bin/cli/commands/registry.mjs: adaptadores legados que delegam
  para os run*Command existentes sem quebrar compatibilidade
- Cria bin/cli/commands/serve.mjs: ação padrão (isDefault: true) com
  lógica de spawn extraída de omniroute.mjs, imports de runtime lazy
- Cria bin/cli/commands/reset-encrypted-columns.mjs: bypass de recuperação
- Refatora bin/omniroute.mjs: ~500 → ~90 linhas, delega ao Commander
- Adiciona strings i18n program.* e serve.description/port/no_open/daemon
  em en.json e pt-BR.json
- Adiciona 21 testes em tests/unit/cli-program.test.ts
2026-05-14 22:09:53 -03:00
diegosouzapw
2e494f8f07 feat(cli): Fase 0.3 — helpers base + convenções (api, i18n, output, runtime)
- bin/cli/CONVENTIONS.md: fonte normativa de flags, exit codes, output,
  retry/backoff, i18n, secrets, auditoria de ações destrutivas
- bin/cli/api.mjs: apiFetch() com retry/backoff, Retry-After, ApiError,
  statusToExitCode, isServerUp; computeBackoff/shouldRetryStatus exportados
- bin/cli/runtime.mjs: withRuntime/withHttp/withDb — server-first / DB-fallback;
  ServerOfflineError com exitCode 3
- bin/cli/i18n.mjs: t() com Map achatado (sem bracket em prototype), interpolação
  {vars}, setLocale/detectLocale/resetForTests; hardened contra __proto__ traversal
- bin/cli/output.mjs: emit() (table/json/jsonl/csv), EXIT_CODES, maskSecret,
  printSuccess/printError/printWarning/exitWith; output → stdout, diagnóstico → stderr
- bin/cli/locales/en.json + pt-BR.json: strings base (setup/doctor/providers/
  keys/combo/serve/backup/update/health/mcp/tunnel)
- bin/cli/README.md: mapa da estrutura e guia de uso dos helpers
- tests/unit/cli-exit-codes.test.ts: 10 casos — EXIT_CODES, statusToExitCode,
  backoff exponencial, jitter ±25%, t() i18n com pt-BR e anti-__proto__
- .env.example + docs/reference/ENVIRONMENT.md: documentar 4 novas env vars CLI
  (OMNIROUTE_LANG, OMNIROUTE_CLI_TOKEN, OMNIROUTE_HTTP_TIMEOUT_MS, OMNIROUTE_VERBOSE)
- scripts/check/check-env-doc-sync.mjs: adicionar LC_MESSAGES ao allowlist de sistema
2026-05-14 21:42:57 -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
墨林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
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
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
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
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
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
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
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
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
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
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
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