Commit Graph

953 Commits

Author SHA1 Message Date
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
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
diegosouzapw
59c983e201 feat(inspector): add POST /sessions/[id]/requests to persist live snapshots (R5-5 backend half)
Wires the previously-dead appendSessionRequest() DB function to a new
POST /api/tools/traffic-inspector/sessions/[id]/requests route.
appendSessionRequest now returns the inserted seq so callers can confirm order.
InspectorSessionRequestAppendSchema (1 MB cap) guards the endpoint.
Integration test covers seq increments 1-2-3, requestCount sync, 400/404 paths,
and stack-trace-free error responses.
2026-05-28 21:43:24 -03:00
diegosouzapw
9f5db36af8 refactor(cli-tools): remove duplicated MITM tab and Antigravity card render (R5-2, plan 11 §12 #10) 2026-05-28 21:40:42 -03:00
diegosouzapw
1cb833acc4 docs(mitm): clarify CONNECT handler scope + guard activeConnections double-count (R4 #5)
The round-3 C1 fix added `server.on("connect", ...)` to satisfy plan 11 §4.6's
text. R4 architectural review confirmed the handler is essentially dead code
on port 443: `https.Server` runs the HTTP parser ABOVE TLS, so a
`server.on("connect")` handler only fires for CONNECT-tunneled-inside-TLS
(HTTPS-proxy-tunneled-in-TLS), not for the "no config required" AgentBridge
DNS-spoof flow where the IDE opens TLS directly to 127.0.0.1:443. Passthrough
for unmapped hosts is structurally handled elsewhere (DNS scoping for default
mode; httpProxyServer.ts:8080 for System-wide proxy mode). Genuine on-wire
bypass-without-decrypt at :443 under direct TLS would require SNI sniffing on
the raw 'connection' event — intentionally out of scope for this release.

This commit:
 - adds a block comment above the CONNECT handler explaining the real scope
   so future contributors don't assume it covers the primary AgentBridge flow
 - guards the `connection` listener with `socket.__mitmCounted` so the
   CONNECT "target" branch's `server.emit("connection", clientSocket)`
   re-entry doesn't double-increment `stats.activeConnections`
 - adds 2 source-grep regression tests asserting both the doc comment and
   the guard remain in place

C2 (x-omniroute-source/agent headers) was already correct and is unchanged.
2026-05-28 21:06:47 -03:00
diegosouzapw
51740a7279 feat(i18n): translate TimingTab + TimingWaterfall + add common.understand (R4 #1, #3)
Round-3 F-I18N covered ConversationTab, StatsTab, StatsCharts, and labels in
TimingWaterfall, but missed:

 - TimingTab.tsx — 5 user-visible labels (Timestamp, Method, Status, Request
   size, Response size) were hardcoded English.
 - TimingWaterfall.tsx — empty state ("No timing data available.") and Total
   latency label were also hardcoded.
 - common.understand — RiskNoticeModal calls
   `useTranslations("common")("understand")` but the key did not exist;
   only the `|| "I understand"` fallback rescued it, leaving pt-BR users
   seeing English.

Adds the missing 7 trafficInspector.timing* keys and common.understand to both
en.json and pt-BR.json, wires `useTranslations` in both components, and adds a
source-grep test asserting no English literals remain in JSX and that all 8
keys exist in both locales.
2026-05-28 21:06:47 -03:00
diegosouzapw
fab36115bc fix(agent-bridge): default-import Button in RiskNoticeModal to stop prod render crash (R4 #1)
`Button.tsx` exposes only a default export, but `RiskNoticeModal.tsx` was
importing `{ Button }` (named) — so `Button` resolved to `undefined` and every
render of the modal crashed with React's "Element type is invalid".

The modal opens on first DNS activation for every agent, so this bug
effectively broke DNS interception for every agent in production. It went
undetected through 3 rounds of code review because two test artifacts masked
the failure:

1. `tests/unit/ui/agent-card.test.tsx > calls onDnsToggle when DNS button
   clicked` failed since round 3 with the exact error "Element type is
   invalid... Check the render method of RiskNoticeModal", but was repeatedly
   dismissed as "pre-existing / flaky".
2. `tests/unit/ui/agent-card-risk-modal.test.tsx` (rodada 3) mocked Button
   as a named export — which made the test green even though the production
   import was broken. Classic "test alignment to broken code" anti-pattern.

This commit:
 - switches RiskNoticeModal to `import Button from "@/shared/components/Button"`
 - adds a regression-guard test that source-greps for the default-import shape
   and asserts Button.tsx remains default-only
 - updates the named mock in agent-card-risk-modal.test.tsx to `default:` so
   tests now reflect the real module shape (no more masking)
 - updates the agent-card.test.tsx DNS-click test to seed the per-agent
   risk-accepted localStorage flag, isolating the DNS-toggle path from the
   risk-modal path (the modal flow is covered by the risk-modal spec)

After: agent-card.test.tsx 4/4 green; agent-card-risk-modal.test.tsx 5/5 green;
new regression guard prevents recurrence of either pattern.
2026-05-28 21:06:47 -03:00
diegosouzapw
6991b9a8ea test(ui): coverage for page-moved banner + new translation paths
- mitm-proxy-moved-page.test.tsx: 4 tests — banner renders pageMoved.title/message, goNow triggers router.replace, setTimeout auto-redirect fires at 2500ms
- agent-bridge-server-card-a11y.test.tsx: source-inspection tests for all 6 aria-label attributes in AgentBridgeServerCard + 2 for SessionRecorderBar
- conversation-tab-separators.test.tsx: +1 test that conversationNotAvailable key resolves when body is null
2026-05-28 17:30:18 -03:00
diegosouzapw
907075f704 feat(db,inspector): add snapshotSession + restore hookBufferUpdate spec contract (M1+M2)
- Add `snapshotSession(sessionId)` to inspectorSessions.ts per master-plan §3.8:
  returns parsed InterceptedRequest[] in seq order, or null for non-existent sessions.
  Silently skips rows that fail InterceptedRequestSchema validation (defensive).
- Restore canonical no-arg form of `MitmHandlerBase.hookBufferUpdate(intercepted)`
  per master-plan §3.5: when opts is omitted, derive completion fields from
  the intercepted object itself (status/responseHeaders/responseBody/responseSize/
  *LatencyMs) rather than no-op'ing. Extended opts form preserved for legacy callers.
- Update Zod record() calls in InterceptedRequestSchema to current (key,value) signature.
- Add 3 unit tests for snapshotSession (happy path / non-existent / silent skip).
- Add 2 unit tests for hookBufferUpdate (no-arg form + extended opts form).
2026-05-28 17:07:01 -03:00
diegosouzapw
f6ed411c62 test(mitm): bypass matching + manager bypass-json writer
Cover the new CJS routing primitives and the bypass-JSON manager write
path so the C1/C2 contracts cannot regress silently.

- `mitm-server-connect.test.ts` (27 tests): exercises the
  `_internal/bypass.cjs` shim used by `server.cjs`:
    - DEFAULT_BYPASS_PATTERNS shape (≥4 regexes, all RegExp)
    - Default bank / gov / okta / auth0 → bypass
    - Bypass beats target match (precedence)
    - Known target hostname → target
    - Unknown hostname → passthrough
    - User glob pattern → bypass
    - Empty / undefined hostname → passthrough
    - Set-vs-Array shape for targetHosts
    - Case-insensitive hostname matching
    - bypassGlobMatch wildcard semantics + ReDoS-safe linear walk
    - parseBypassJson with valid / empty / malformed / wrong-shape inputs
    - Spec assertions on server.cjs source — header injection (C2),
      sanitizeErrorMessage wrapping (Hard Rule #12), and CONNECT handler
      registration (C1). These three guard against future regressions
      that would silently re-introduce the bugs the C1/C2 fixes closed.
- `mitm-manager-bypass-json.test.ts` (5 tests): exercises
  `writeBypassJson()`:
    - Creates the `mitm/` dir + valid JSON file shape
    - Empty array roundtrips as empty patterns
    - Falls back to `getUserBypassPatterns()` when no arg passed
    - Default patterns from the DB are NOT written to the file
    - Overwrites prior content
2026-05-28 16:48:44 -03:00
diegosouzapw
f0cdc3622e fix(agent-bridge-ui): remove double-write of risk-accepted localStorage (M5)
AgentCard.handleRiskAccept was calling markRiskAccepted() before opening the
RiskNoticeModal, which itself writes the same key via dontShowAgainKey on accept.
Remove the redundant markRiskAccepted call and delete the now-unused helper so
RiskNoticeModal (D16) is the sole canonical persistence owner. Add a spy-based
test asserting the key is written exactly once per accept.
2026-05-28 16:24:09 -03:00
diegosouzapw
fa655ab4df test(inspector-ui): assert StatsCharts is lazy-loaded via dynamic
11 assertions covering: dynamic import with ssr:false, absence of static
recharts import in StatsTab, absence of the discarded _rechartsPreload
pattern, and presence of recharts exports in StatsCharts.
2026-05-28 16:07:11 -03:00
diegosouzapw
9df7cad803 refactor(inspector): return 'unknown' from kindDetector for unclear signals (B1) 2026-05-28 16:06:25 -03:00
diegosouzapw
5377f6f0c4 test(ui): coverage for fix4 UI behaviors (3 specs) 2026-05-28 12:58:51 -03:00
diegosouzapw
f37148903d merge(fix2): system proxy revert on page exit (Group A) 2026-05-28 11:38:13 -03:00
diegosouzapw
5e51436ff3 test(mitm/api): coverage for dynamic DNS entries (fix1) 2026-05-28 11:23:52 -03:00
diegosouzapw
3d65f87f63 test(ui): system proxy exit guard hook (fix2) 2026-05-28 11:21:18 -03:00
diegosouzapw
48c31c4ce5 test(e2e): smoke flows for agent-bridge + traffic-inspector + cross (F9) 2026-05-28 09:14:27 -03:00
diegosouzapw
039ff0abd9 merge(F8): Traffic Inspector UI into Group A parent 2026-05-28 08:05:58 -03:00
diegosouzapw
e6bfe147d5 merge(F7): AgentBridge UI into Group A parent 2026-05-28 07:29:56 -03:00
diegosouzapw
1c0015a9ab merge(F6): Traffic Inspector REST + WS routes into Group A parent 2026-05-28 07:29:56 -03:00
diegosouzapw
bd31823259 test(ui): add traffic-inspector UI tests (56 cases passing) (F8) 2026-05-28 07:25:32 -03:00
diegosouzapw
f6f5d8da7d test(ui): agent-bridge UI unit tests (F7)
18 vitest/jsdom tests across 4 files:
- agent-bridge-page.test.tsx: EmptyState, RiskNoticeBanner (render/dismiss),
  BypassListEditor (defaults, initial patterns)
- agent-card.test.tsx: render, expand, DNS toggle, wizard open
- setup-wizard.test.tsx: step1 render, Next navigation, DNS enable, Cancel
- bypass-list-editor.test.tsx: defaults, patterns, save callback, button
All 18 tests pass. Timeout set to 30000ms (initial transform overhead).
2026-05-28 01:39:44 -03:00
diegosouzapw
1d9cb7eb03 test(api): integration tests for traffic-inspector routes (F6) 2026-05-28 01:24:33 -03:00
diegosouzapw
0c38ed57ec test(api): integration tests for agent-bridge routes (F5)
4 integration test files covering: happy paths for all 8 major routes,
LOCAL_ONLY classification assertion, Zod 400 paths, cert flow (status/trust/
download/regenerate), bypass CRUD (POST/GET/DELETE), mappings PUT→GET
round-trip. Every error path asserts no stack trace leakage (Hard Rule #12).
Total: 41 tests, 41 pass.
2026-05-28 00:24:48 -03:00
diegosouzapw
cb6a8c1641 merge(F4): Inspector core into Group A parent 2026-05-27 23:06:49 -03:00
diegosouzapw
1196d08aad test(mitm): handlers + targets + detection unit tests (F3)
- mitm-handler-base: hookBufferStart returns InterceptedRequest with
  sanitized headers, extractSourceModel parses body.model, writeError
  emits JSON with sanitized message (Hard Rule #12).
- mitm-handler-<id>: nine per-agent happy-path tests (antigravity,
  kiro, copilot, codex, cursor, zed, claude-code, open-code) exercise
  full intercept() with mocked fetch via _mitmHandlerHarness.ts;
  asserts mapped model is forwarded and AgentBridge correlation
  headers are present. Trae test confirms intercept() rejects with a
  structured error.
- mitm-targets-resolve: ALL_TARGETS contains 9 entries; resolveTarget
  is case-insensitive and returns null for unknown hosts.
- mitm-targets-route: bypass > target > passthrough precedence
  validated against representative hostnames.
- mitm-detection: DETECTORS covers every AgentId; detectAgent never
  throws and returns DetectionResult-shaped objects for all probes.
2026-05-27 22:33:56 -03:00
diegosouzapw
75b3e916bc test(inspector): unit tests for F4 inspector core (7 specs) 2026-05-27 21:44:53 -03:00
diegosouzapw
ddf6b0ef63 merge(F2): DB migrations + modules into Group A parent 2026-05-27 19:41:11 -03:00
diegosouzapw
97d607e7c5 test(mitm/inspector): unit tests for F1 foundation utilities
83 tests across 7 files: mitm-masksecrets (9), mitm-passthrough (10),
mitm-upstream-trust (5), inspector-kind-detector (14), inspector-context-key (11),
inspector-types (11), shared-schemas (23). All green.
2026-05-27 19:39:37 -03:00
diegosouzapw
80fa37f30f test(db): unit tests for F2 modules 2026-05-27 19:24:30 -03:00
diegosouzapw
722e9f41cd chore: apply unit test fixes, polyfills, and environment precedence fixes 2026-05-27 18:02:17 -03:00
JeferssonLemes
52a43d65d3 feat(modelSpecs): align opencode-go family with upstream provider limits (#2802)
Integrated into release/v3.8.6
2026-05-27 17:06:32 -03:00
Apostol Apostolov
87fad5d171 [codex] home: restore settings-driven home layout and quota auto-refresh (#2800)
Integrated into release/v3.8.6
2026-05-27 17:05:18 -03:00
akarray
83445a96b8 fix(oauth): repair Google loopback callback flow (#2796)
Integrated into release/v3.8.6
2026-05-27 17:04:31 -03:00
Paijo
aac17c01c3 fix: register missing web-cookie validators (claude-web, gemini-web, copilot-web, t3-web) (#2793)
Integrated into release/v3.8.6
2026-05-27 17:03:55 -03:00
JeferssonLemes
72a46581b6 fix(opencode-go): route qwen3.x via claude messages + repair fixMissingToolResponses for Claude-shape upstreams (#2791)
Integrated into release/v3.8.6
2026-05-27 17:02:38 -03:00
diegosouzapw
7042460292 chore: merge release/v3.8.5 to resolve conflicts 2026-05-27 10:41:52 -03:00
Jefersson Lemes
e9ead52a42 feat(opencode-go): register 4 missing models from upstream catalog
Add qwen3.7-max, mimo-v2-pro, mimo-v2-omni, hy3-preview to the
opencode-go provider. Extend executor tests and model specs.

- Registry now matches live https://opencode.ai/zen/go/v1/models response
  (16 models). Previously, four models returned by the upstream API were
  absent from the static registry, so requests to them failed model
  resolution before reaching the executor.
- qwen3.7-max: inherits defaultContextLength 200000; model spec mirrors
  qwen3.6-plus (Bailian multimodal, thinking + tools + vision).
- mimo-v2-pro: spec mirrors mimo-v2-omni (262144 ctx, 131072 maxOut,
  tools + vision).
- mimo-v2-omni: registry entry only (spec already present upstream).
- hy3-preview: registry entry only; falls back to __default__ spec.
- All four route to /chat/completions (default openai format), matching
  the existing opencode-go executor behavior.
2026-05-27 10:20:25 -03:00
akarray
0700705040 fix: use public callbacks for remote Google OAuth with custom creds 2026-05-27 09:49:28 -03:00
Jan Leon
3a5ad60eb2 fix: allow rate-limited provider connections after transient 429s (with unit & integration tests) 2026-05-27 09:49:24 -03:00
Jan Leon
e6ea8f13d9 fix: keep database log settings in sync with the pipeline toggle 2026-05-27 09:48:38 -03:00
Jan Leon
af96e33184 fix(codex): apply global service tiers to combo request bodies 2026-05-27 09:48:17 -03:00
Diego Rodrigues de Sa e Souza
f8e726fd1c Release v3.8.5 (#2776)
* chore(release): bump version to v3.8.5

* fix(docker): rebuild better-sqlite3 after hardened install (#2772)

Integrated into release/v3.8.5

* ci: build Docker platforms on native runners (#2774)

Integrated into release/v3.8.5

* docs(release): sync v3.8.5 documentation and metadata

Update changelog entries, API reference version, package metadata, and
localized LLM documentation for the 3.8.5 release. Refresh generated
docs source mappings and architecture counts for current executors and
OAuth providers.

* chore(release): bump to v3.8.5 — changelog, docs, version sync

* chore(release): translate Hall of Contributors to English in workflows and changelog

* fix(combos): make target timeout configurable (#2775)

Merge PR #2775 — fix(combos): make target timeout configurable

* feat: fix so restart of server restarts batch jobs instead of failing them (#2755)

Merge PR #2755 — feat: fix so restart of server restarts batch jobs instead of failing them

* chore(release): update changelog with merged PRs notes and credits

* feat(api): add endpoint restrictions for client API keys (#2777)

Merge PR #2777 — feat(api): add endpoint restrictions for client API keys

* chore(release): update changelog with PR #2777 entry and contributor credit

---------

Co-authored-by: Thanet S. <cho.112543@gmail.com>
Co-authored-by: Randi <55005611+rdself@users.noreply.github.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
Co-authored-by: Jack <5443152+hijak@users.noreply.github.com>
2026-05-27 06:22:15 -03:00
Jack
af5635e422 feat(api): add endpoint restrictions for client API keys (#2777)
Merge PR #2777 — feat(api): add endpoint restrictions for client API keys
2026-05-27 06:20:40 -03:00
Randi
744039403d fix(combos): make target timeout configurable (#2775)
Merge PR #2775 — fix(combos): make target timeout configurable
2026-05-27 05:54:00 -03:00