Skip to content

feat(dev): wire the Agent Inspector into project dev - #2086

Open
tejaskash wants to merge 4 commits into
refactorfrom
feat/inspector-wiring
Open

feat(dev): wire the Agent Inspector into project dev#2086
tejaskash wants to merge 4 commits into
refactorfrom
feat/inspector-wiring

Conversation

@tejaskash

Copy link
Copy Markdown
Contributor

What

Third and final PR of the Agent Inspector stack (C1 #2082 → C2 #2085C3). C1 built the Inspector HTTP layer and C2 added the agent-proxy routes, both tested in isolation behind fake dependencies. This PR wires that layer into agentcore project dev and adds the two IO leaves it needs, so the Inspector is reachable from the CLI for the first time.

Changes

  • project dev is UI-by-default. New --ui flag (default true, so --no-ui is auto-generated) and --ui-port. In UI mode the handler resolves a UI port (explicit port must be free, else scans from 8081), starts the Inspector server via startHttpServer(createInspectorHandler({...})), hands the collector's TraceStore to it as InspectorTraces, watches agentcore.json to reload the supervised runtime set live, and opens the browser when interactive and not --json. --no-ui keeps the existing plain single-runtime log stream.
  • src/io/openBrowser.ts — best-effort detached browser launch (open / cmd start / xdg-open), never blocks or fails the command.
  • src/io/watchFile.ts — single-file watcher, debounced, closes on abort, fails quietly on a missing file or unsupported platform.
  • OtelCollector.store renamed to traces so the collector hands its store to the Inspector without the Inspector knowing the collector exists. DevTraceCollector gains the matching traces accessor.

Why the two IO primitives belong in src/io

The handler is a real second caller of both, and both are raw platform mechanics (child-process spawn, fs.watch) that the boundary rule keeps out of src/core and the handlers. They live beside checkPort, startHttpServer, and the other IO leaves.

Lifecycle

The Inspector server rides the one AbortController shared with the collector, supervisor, and watcher, so Ctrl-C tears everything down through one cancellation domain. The collector closes only after runners return, so an agent's final spans still reach it. The config watcher's onChange swallows parse errors deliberately: a half-saved config parses on the next change event.

Tests

  • project dev UI-mode suite: starts the Inspector and prints the URL, opens the browser only on a TTY and never in --json, /api/status lists every runtime with none started (lazy), agentcore.json edits reload the set, --agent narrows it, a taken --ui-port fails fast, --port with several runtimes is rejected.
  • watchFile suite: debounces a burst of edits to one callback and stops on abort, a missing file fails quietly.
  • All existing trace-collection and interruption tests kept, updated for the traces rename.
  • bun test full suite green, typecheck / lint:check / format:check clean.

Verification altitudes

  • Per layer: the suites above.
  • End to end: pending on this branch after review — build the CLI, real project with two runtimes, confirm the browser opens the Inspector, invocations stream, MCP/A2A/resources answer, config reload is live, --no-ui gives the plain stream, --json never opens a browser.

Stacked on #2085. Merge C1 → C2 → C3 in order.

@github-actions github-actions Bot added the size/l PR size: L label Aug 24, 2026
@github-actions github-actions Bot added agentcore-harness-reviewing AgentCore Harness review in progress and removed agentcore-harness-reviewing AgentCore Harness review in progress size/l PR size: L labels Aug 24, 2026
@github-actions github-actions Bot added the size/l PR size: L label Aug 24, 2026
@tejaskash
tejaskash force-pushed the feat/inspector-wiring branch from 2dfad97 to 7786d33 Compare August 25, 2026 17:35
@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Aug 25, 2026
@tejaskash tejaskash changed the title feat(dev): wire the Agent Inspector into project dev (C3) feat(dev): wire the Agent Inspector into project dev Aug 25, 2026
@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Aug 25, 2026
@tejaskash
tejaskash force-pushed the feat/inspector-wiring branch from 7786d33 to 35a3427 Compare August 25, 2026 17:45
@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Aug 25, 2026
@codecov-commenter

codecov-commenter commented Aug 25, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 88.67925% with 18 lines in your changes missing coverage. Please review.
✅ Project coverage is 97.15%. Comparing base (2595b9d) to head (98e0b2a).

Files with missing lines Patch % Lines
src/io/openBrowser.ts 11.76% 15 Missing ⚠️
src/handlers/project/index.ts 72.72% 3 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##           refactor    #2086      +/-   ##
============================================
- Coverage     97.22%   97.15%   -0.08%     
============================================
  Files           463      465       +2     
  Lines         28160    28301     +141     
============================================
+ Hits          27378    27495     +117     
- Misses          782      806      +24     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@tejaskash
tejaskash force-pushed the feat/inspector-wiring branch from 35a3427 to 2d789c8 Compare August 25, 2026 19:01
@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Aug 25, 2026
@tejaskash
tejaskash force-pushed the feat/inspector-wiring branch from 2d789c8 to cf7416c Compare August 25, 2026 19:39
@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Aug 25, 2026
Base automatically changed from feat/inspector-agent-proxies to refactor August 26, 2026 21:02
@github-actions github-actions Bot added size/xl PR size: XL and removed size/l PR size: L labels Aug 26, 2026
@tejaskash
tejaskash force-pushed the feat/inspector-wiring branch from cf7416c to 0791591 Compare August 26, 2026 22:21
@github-actions github-actions Bot added size/l PR size: L and removed size/xl PR size: XL labels Aug 26, 2026
@agentcore-devx-automation agentcore-devx-automation Bot added the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automation agentcore-devx-automation Bot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 26, 2026
@tejaskash
tejaskash force-pushed the feat/inspector-wiring branch from 0791591 to 685f400 Compare August 27, 2026 12:03
@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Aug 27, 2026
@agentcore-devx-automation agentcore-devx-automation Bot added the claude-security-reviewing Claude Code /security-review in progress label Aug 27, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automation agentcore-devx-automation Bot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 27, 2026
Make the Inspector reachable from the CLI. project dev now runs UI-by-default:
resolve a UI port, start the Inspector HTTP server, watch agentcore.json to
reload the supervised runtime set live, and open the browser when interactive
and not --json. --no-ui keeps the plain single-runtime log stream.

Add the two IO leaves the handler needs: openBrowser (best-effort detached
launch) and watchFile (debounced single-file watch, closes on abort). Expose
the collector's TraceStore to the Inspector by renaming OtelCollector.store to
traces so the store is handed over without the Inspector knowing the collector.

The Inspector server rides the one AbortController with the collector,
supervisor, and watcher, so Ctrl-C tears everything down through one
cancellation domain; the collector closes only after runners return so final
spans persist.
- Extract findFreePort in core/dev/port.ts; resolveDevPort delegates to it and
  the dev handler's UI port resolution reuses it, deleting the duplicated
  resolveUiPort helper and its UI_PORT_ATTEMPTS copy of MAX_PORT_ATTEMPTS.
- Drop the dead resolvePort ternary: the --port guard already rejects an
  explicit port with more than one runtime, so flags.port applies directly.
- Rewrite the config-watch closure as a linear async function.
- Add projectSpecPath/PROJECT_SPEC_RELATIVE_PATH in core/project/fsUtils.ts and
  route the manager and the watch target through it, so the watched file and
  the read file resolve from one source.
Without the UI there is no lazy per-agent start, so a multi-runtime
project must name which one streams to the terminal.
Rename extractSseEventText to extractA2aEventText; it only handles A2A
artifact/status/task event kinds, so the generic SSE name misled.
Addresses review feedback on #2085.
@tejaskash
tejaskash force-pushed the feat/inspector-wiring branch from 685f400 to 98e0b2a Compare August 27, 2026 17:21
@github-actions github-actions Bot added size/l PR size: L and removed size/l PR size: L labels Aug 27, 2026
@agentcore-devx-automation agentcore-devx-automation Bot added the claude-security-reviewing Claude Code /security-review in progress label Aug 27, 2026
@agentcore-devx-automation

Copy link
Copy Markdown
Contributor

Claude Security Review: no high-confidence findings. (run)

@agentcore-devx-automation agentcore-devx-automation Bot removed the claude-security-reviewing Claude Code /security-review in progress label Aug 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/l PR size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants