Commit Graph

4934 Commits

Author SHA1 Message Date
diegosouzapw
a1261ccf80 fix(cli,docs): use requireCliToolsAuth in logs route + document OPENCODE quota env
Post-merge contract fixes for v3.8.6:
- src/app/api/cli-tools/logs/route.ts (#2810) now uses the shared
  requireCliToolsAuth guard (param renamed req->request) to satisfy the
  cli-tools-auth-hardening contract test.
- Document OMNIROUTE_OPENCODE_QUOTA_URL (#2867) in docs/reference/ENVIRONMENT.md
  to satisfy the env/docs sync contract.
2026-05-29 02:03:03 -03:00
yuna amelia
dbaf25079c refactor(oauth): annotate retired PKCE fields in WINDSURF_CONFIG
No behaviour change - comment-only update documenting that authorizeUrl,
codeChallengeMethod, callbackPort, callbackPath, apiServerUrl, and
exchangePath are no longer consumed. Active fields (inferenceUrl,
showAuthTokenUrl, firebaseApiKey, ideName) called out separately.
2026-05-29 13:00:46 +08:00
yuna amelia
82999c021f fix(oauth): return 410 Gone for retired windsurf/devin-cli PKCE actions
start-callback-server, authorize, and poll-callback (GET + POST) now
return 410 Gone with a pointer to /import-token. The 410 short-circuit
runs before auth so the response is honest about the action being
permanently gone, not gated. Codex PKCE flow unchanged.

Tests: 5 new assertions cover GET + POST 410 paths and a Codex
regression check.
2026-05-29 12:59:17 +08:00
yuna amelia
6d157e481f fix(oauth): switch windsurf provider to import_token flow
The PKCE auth URL targeting app.devin.ai/editor/signin returns 404
post-rebrand. Until Phase 2 ports Firebase OAuth + RegisterUser, the
only supported path is import-token via windsurf.com/show-auth-token.

- windsurf.ts: drop buildAuthUrl, set flowType=import_token
- generateAuthData returns supported:false + helpful error for windsurf/devin-cli
- tests: assert flowType + disabled stub
2026-05-29 12:50:46 +08:00
Randi
b971db8e77 fix(claude): preserve max effort for supported models (#2875)
Integrated into release/v3.8.6.
2026-05-29 01:49:57 -03:00
Randi
e510a57555 Rename proxy log Public IP to Client IP (#2880)
Integrated into release/v3.8.6.
2026-05-29 01:46:25 -03:00
Diego Rodrigues de Sa e Souza
c02b6ea008 fix(combo): normalize upstream Headers for Node 24 undici interop (#2751) (#2823)
Integrated into release/v3.8.6.
2026-05-29 01:46:12 -03:00
Diego Rodrigues de Sa e Souza
ed36bd7264 fix(cli): restore omniroute logs command stream (#2756) (#2810)
Integrated into release/v3.8.6.
2026-05-29 01:45:59 -03:00
Randi
2428ad2bcd feat(claude): default xhigh support for newer Opus models (#2874)
Integrated into release/v3.8.6.
2026-05-29 01:44:58 -03:00
Diego Rodrigues de Sa e Souza
517c3c6e44 fix(usage): add opencode quota fetcher (#2852) (#2867)
Integrated into release/v3.8.6.
2026-05-29 01:44:43 -03:00
Paijo
f270d20de0 fix: wire CLIProxyAPI fallback settings into chatCore routing engine (#2866)
Integrated into release/v3.8.6.
2026-05-29 01:44:32 -03:00
Hernan Javier Ardila Sanchez
1d55f96e01 fix(combo): preserve system messages during context handoff summary generation (#2865)
Integrated into release/v3.8.6.
2026-05-29 01:44:22 -03:00
Hernan Javier Ardila Sanchez
1442e086e4 fix(cli): allow nullable/optional apiKey in cliMitmStartSchema (#2857)
Integrated into release/v3.8.6.
2026-05-29 01:44:11 -03:00
Tushar Agarwal
c9251f9326 fix(geminiHelper): support rec.image content shape + warn on dropped remote URLs (refs #2807) (#2855)
Integrated into release/v3.8.6.
2026-05-29 01:44:01 -03:00
Lenine Júnior
32adf6275a feat(sse): add RTK filters for kubectl, docker-build, composer, gh (#2824)
Integrated into release/v3.8.6.
2026-05-29 01:43:51 -03:00
JeferssonLemes
9dfe482c1c fix(skills): skip interception for unregistered client-native tools (#2815) (#2817)
Integrated into release/v3.8.6.
2026-05-29 01:43:40 -03:00
Diego Rodrigues de Sa e Souza
1a4c4f8d94 fix(cli): replace cli-table3 with hand-rolled formatter (#2752) (#2813)
Integrated into release/v3.8.6.
2026-05-29 01:43:30 -03:00
yuna amelia
dd10b4b94c docs(plan): Phase 1 windsurf login hotfix implementation plan
10 tasks covering:
- TDD assertions for flowType + 410 Gone responses
- Provider switch to import_token
- Route handler retiring authorize/start-callback-server/poll-callback
- OAuthModal UI override
- i18n sync
- Verification + PR steps
2026-05-29 12:31:39 +08:00
yuna amelia
dbe7b62cbe docs(oauth): add Windsurf login fix design (Phase 1 hotfix + Phase 2 Firebase OAuth)
Two-phase plan to fix the broken Windsurf OAuth flow:
- Phase 1: drop the dead app.devin.ai/editor/signin PKCE path, promote
  import-token from windsurf.com/show-auth-token as the primary path
- Phase 2: port Firebase OAuth + RegisterUser flow from
  fendoushaonian/WindSurf-gRPC-API for full browser-based automation

Spec only - no code changes yet.
2026-05-29 12:28:20 +08:00
GreatLiu
b741bd6b23 fix(github): route claude-opus-4.6 via chat completions (#2821)
Integrated into release/v3.8.6.
2026-05-29 01:25:18 -03:00
Diego Rodrigues de Sa e Souza
c216085e92 fix(translator): pass-through tool_search built-in tool type (#2766) (#2811)
Integrated into release/v3.8.6.
2026-05-29 01:00:54 -03:00
Diego Rodrigues de Sa e Souza
fee1c17d51 fix(opencode): qwen3.x max/plus models lack vision support (#2822) (#2836)
Integrated into release/v3.8.6.
2026-05-29 01:00:24 -03:00
Diego Rodrigues de Sa e Souza
283c05d3d0 fix(nous-research): correct baseUrl to include /chat/completions (#2826) (#2835)
Integrated into release/v3.8.6.
2026-05-29 00:59:54 -03:00
Diego Rodrigues de Sa e Souza
0a101b95b3 fix(usage): un-invert GitHub Copilot Free/limited quota — limited_user_quotas is remaining (#2876) (#2881)
Integrated into release/v3.8.6.
2026-05-29 00:59:29 -03:00
Diego Rodrigues de Sa e Souza
01041967de fix(quota): honor explicit per-connection preflight opt-out (#2831) (#2844)
Integrated into release/v3.8.6.
2026-05-29 00:58:58 -03:00
Diego Rodrigues de Sa e Souza
5f886dc73a fix(translator): strip safety_identifier in openai-responses cleanup (#2770) (#2809)
Integrated into release/v3.8.6.
2026-05-29 00:58:01 -03:00
Diego Rodrigues de Sa e Souza
b677dd6b25 fix(combo): resolve custom provider targets via combo name (#2778) (#2812)
Integrated into release/v3.8.6.
2026-05-29 00:57:41 -03:00
Diego Rodrigues de Sa e Souza
18dae1ab95 fix(api): include noAuth providers in /v1/models catalog (#2798) (#2814)
Integrated into release/v3.8.6.
2026-05-29 00:57:36 -03:00
Diego Rodrigues de Sa e Souza
25db3dee59 fix(cli): register openclaw in tool-detector (#2833) (#2850)
Integrated into release/v3.8.6.
2026-05-29 00:57:30 -03:00
Hernan Javier Ardila Sanchez
94a34899b2 fix(qoder): reject invalid/expired PATs returning Cosy 500 error (#2860)
Integrated into release/v3.8.6.
2026-05-29 00:56:19 -03:00
Tushar Agarwal
f3404227d2 fix(deepseek-web): return 400 when client sends tools[] - chat.deepseek.com has no tool support (#2854)
Integrated into release/v3.8.6.
2026-05-29 00:56:16 -03:00
Annas Alghoffar
0c9740c771 fix(cli): respect PORT env var in serve command (#2845)
Integrated into release/v3.8.6.
2026-05-29 00:56:13 -03:00
diegosouzapw
05276bc549 chore(docs): set coverage gate to 40/40/40/40 in CLAUDE.md
Aligns the documented coverage gate with the v3.8.6 release decision
(lowered from 75/75/75/70). Matches the threshold already set in
package.json by the large feature PRs (planos 11-22).
2026-05-29 00:55:54 -03:00
diegosouzapw
1b7cc370a3 chore(agents): sync review-discussions skill + workflow + command (orthogonal to Group A)
These files were dirty in the worktree at session start and survived all
R3/R4/R5 fix work untouched — they belong to the review-discussions skill
and are independent of the AgentBridge/Traffic Inspector implementation.
Committing here so the worktree is clean for removal.
2026-05-28 22:29:03 -03:00
diegosouzapw
4295ecc5a7 fix(mitm): wire configureUpstreamCa at boot + after POST so AGENTBRIDGE_UPSTREAM_CA_CERT has runtime effect (R5-1)
In startMitm(), read AGENTBRIDGE_UPSTREAM_CA_CERT (env wins over stored path in
<dataDir>/mitm/upstream-ca.path) and call configureUpstreamCa() at process start;
failures are caught and logged — boot continues without custom CA.  In the POST
/api/tools/agent-bridge/upstream-ca handler, call configureUpstreamCa() immediately
after persisting the new path so the CA takes effect without reboot; throws → 400
with sanitizeErrorMessage (Hard Rule #12).  New test file
tests/unit/mitm-upstream-ca-wiring.test.ts validates the path-selection logic and
the route wiring (8 tests, 0 failures).
2026-05-28 22:13:30 -03:00
Lenine Júnior
b0191f1237 fix(i18n): translate 144 new __MISSING__ pt-BR strings (#2816)
Integrated into release/v3.8.6
2026-05-28 22:09:56 -03:00
levonk
12bacb03d4 feat(build): nix multi-OS package manager install (#2806)
Integrated into release/v3.8.6
2026-05-28 22:08:19 -03:00
diegosouzapw
4c48730e43 feat(inspector-ui): post snapshots to session requests endpoint while recording (R5-5 frontend half) 2026-05-28 22:07:56 -03:00
diegosouzapw
39dcfd7307 feat(inspector-ui): expose pendingCount for X-new badge during pause (R5-9) 2026-05-28 22:07:51 -03:00
diegosouzapw
7c16f75f99 feat(inspector-ui): wire 'same context' filter end-to-end — chip onClick + applyFilter branch + clear-banner (R5-4) 2026-05-28 22:07:45 -03:00
diegosouzapw
5b39527e11 fix(inspector-ui): use export.har URL (slash→dot) so HAR export works (R5-3) 2026-05-28 22:07:40 -03:00
diegosouzapw
00bb0416d3 fix(memory): harden extractLastUserText + add missing configureCta i18n key
Third code-review pass on plan 21 found two follow-up issues from the
previous round.

1. extractLastUserText accepted Responses API items with role===undefined
   regardless of their type. function_call_output / tool_call_output /
   reasoning items would slip through and be treated as user query input,
   leaking the tool's reply or the model's chain of thought into the
   memory retrieval query.

   Fix: when role is undefined, skip items whose type is in a denylist of
   non-user item types (function_call, function_call_output, tool_call,
   tool_call_output, reasoning, computer_call, computer_call_output,
   web_search_call, file_search_call). Also reject non-text content
   parts inside multi-modal arrays (image_url, tool_use, ...) so that
   image-only or tool-only user messages do not produce a query made of
   irrelevant fragments.

2. MemoryEngineStatus introduced t("engine.configureCta") in round 2 but
   the key was never added to en.json / pt-BR.json — even with the new
   EN fallback merger, the CTA would render the literal key path.
   Added "Configure" / "Configurar" to both locales.

Verified: typecheck:core clean; vitest UI 46/46; cli-memory-commands,
memory-settings, and mcp-memory-tools-strategy isolated sanity all
green; grep audit of memory.* i18n keys used by the UI confirms zero
missing keys in en.json.
2026-05-28 22:07:08 -03:00
diegosouzapw
fbc09af6c9 refactor(mitm): replace console.log/error in manager.ts with pino logger (R5-7)
Replaces 15 raw console.log/console.error calls in src/mitm/manager.ts with
structured pino logger calls via createLogger("mitm-manager"), aligning with
the project convention documented in docs/architecture/RESILIENCE_GUIDE.md.
Multi-arg console calls are converted to pino object form: logger.info({ x, y }, "msg").
2026-05-28 22:04:54 -03:00
diegosouzapw
516a7e5520 fix(memory): code-review hardening — guards, asserts, useEffect
Smaller fixes from the 2nd code-review pass on plan 21.

Backend / CLI / DB:
- memoryTools.ts: error-path fallback no longer hardcodes
  retrievalStrategy:"exact"; uses DEFAULT_MEMORY_SETTINGS via
  toMemoryRetrievalConfig (D16 / Bug #7).
- memory.mjs: applyLegacyTypeMap also runs on search / list / clear
  (was only on add); legacy user/feedback/project/reference remap to
  canonical types with a stderr warning (D17 / Bug #4).
- migrationRunner.ts: case "073" guards via
  hasColumn(memories, needs_reindex) so an unmarked re-run of
  073_memory_vec.sql is skipped cleanly (D27).

UI:
- MemoryEngineStatus: optional onConfigure callback; "Configurar →"
  CTAs on the Embedding / Qdrant / Rerank rows when those components
  are off or missing (matches §4.3 wireframe).
- EngineTab: scroll IDs on config cards + handleConfigure wired to
  the status panel. Providers fetch moved from render body
  (setState-during-render anti-pattern) into useEffect.
- RerankConfigCard: toggle is disabled when no provider has a key —
  blocks turning rerank ON without a provider, still allows turning
  it OFF (D13).
- MemoriesTab: Import validates each entry against the canonical
  type enum before POST so invalid types are caught locally with a
  clear skipped count.

Tooling:
- package.json: test:all includes test:vitest:ui so the UI suite
  is no longer orphaned in CI.

Tests:
- cli-memory-commands: asserts updated for the new legacy->canonical
  remap on search/clear.
- memory-embedding-resolve: drop always-true `|| reason.length > 0`
  clauses that neutralized two assertions.
- memory-embedding-static-potion: model_load_failed test forces a
  real load failure via MEMORY_STATIC_CACHE_DIR=/dev/null/<subdir>
  and asserts EmbeddingError shape + reason + sanitized message
  (replaces the previous `assert.ok(true)`).
- rerank-config-card.test.tsx: happy-path now uses a provider with
  hasKey; new test covers the disabled-toggle guard.

Full memory suite green: 331/331 unit tests, 46/46 UI tests.
typecheck:core, typecheck:noimplicit:core, check:cycles clean.
2026-05-28 21:46:54 -03:00
diegosouzapw
5a32e42508 fix(i18n): deep-merge en.json as fallback for locales missing keys
D12 of master-plan-21 assumed next-intl had a built-in fallback to EN
already configured. It did not — request.ts loaded only
messages/${locale}.json and no getMessageFallback was defined, so any
key absent in the user's locale rendered the key path literally
(for example "memory.concept.title").

Plan 21 added 156 memory.* keys to en and pt-BR but the other 39
locales kept only the pre-existing 36 memory.* keys, so users on those
locales saw raw key paths across the new Memory studio.

Fix: load en.json as the base and deep-merge the locale-specific
messages on top. Existing translations are untouched; only missing
keys fall back to English. Satisfies §7 "i18n 41 locales".
2026-05-28 21:46:54 -03:00
diegosouzapw
feb0e983eb fix(memory): activate semantic + hybrid + Qdrant tier-2 in chat hot path
Code review of plan 21 found two functional gaps:

FAIL #1 — toMemoryRetrievalConfig never forwarded the user query, so the
gate `if (config.query && useModernTable)` in retrieval.ts was always
false in the chat hot path. semantic/hybrid silently fell back to
"ORDER BY created_at DESC LIMIT 100", the pre-plan-21 behaviour.
sqlite-vec + RRF only ran in the Playground (retrievePreview, which
takes `query` positionally).

FAIL #2 — Bug #1 was not closed: searchSemanticMemory (Qdrant) was only
imported by /api/settings/qdrant/search, never by retrieval. With
vectorStore="qdrant", engineStatus reported backend="qdrant" but
retrieveMemories/retrievePreview kept using sqlite-vec — the status
diverged from the actual search path.

- settings.ts: toMemoryRetrievalConfig(settings, { query? }) accepts
  and forwards the query.
- chatCore.ts: extracts the last user message from body.messages or
  body.input (Chat + Responses APIs).
- retrieval.ts: adds a Qdrant branch in case "semantic", case "hybrid"
  and retrievePreview; falls through to sqlite-vec on failure or empty
  results so the §7 "degrades to sqlite-vec / FTS5" contract holds.
- engineStatus only reports backend="qdrant" when the user opted in
  (settings.vectorStore === "qdrant") and Qdrant is healthy.
- memories[] tier union includes "qdrant".

331 memory unit tests pass; typecheck:core / typecheck:noimplicit:core /
check:cycles clean.
2026-05-28 21:46:54 -03:00
diegosouzapw
139581dc80 refactor(inspector): remove dead extractLlmMetadata stub from kindDetector (R5-10) 2026-05-28 21:44:03 -03:00
diegosouzapw
0f192cae2b feat(i18n): add getMessageFallback so non-EN locales inherit EN keys (R5-6, D17) 2026-05-28 21:44:00 -03:00
diegosouzapw
e32abf5802 feat(inspector): minimal cost estimate table for LlmDetailsTab (R5-11)
Add src/mitm/inspector/pricing.ts with a 10-entry USD/1M-token table and
estimateCost() helper. Wire it into extractLlmMetadata() replacing the
hardcoded null. Tests: 11 new in inspector-pricing.test.ts + 4 new
assertions in inspector-llm-metadata.test.ts (25 pass total).
2026-05-28 21:43:48 -03:00
diegosouzapw
e06d72e270 fix(inspector): set source="custom-host" in agentBridgeHook for custom-host requests (R5-8)
recordRequestStart() now performs a cheap DB lookup (isCustomHost) before
building the InterceptedRequest. Hosts registered in inspector_custom_hosts
with enabled=1 receive source="custom-host" and agent=undefined, so they
appear correctly under the "Custom" profile filter instead of being
silently routed to "agent-bridge" entries.

Added isCustomHost() helper to inspectorCustomHosts.ts and a unit test
covering enabled custom-host, non-custom host, and disabled custom-host cases.
2026-05-28 21:43:36 -03:00