Files
Jarvis/packages/DevOverlay
james.maes 6ea2852af1 feat(devoverlay,logging): live log stream — every swift-log line into the overlay
Slice 3 of dev-overlay-end-to-end. Adds a fourth DevOverlay tab that
tails every log record from every Jarvis subsystem in real time —
agent, voice, vision, memory, MCP, bus, replay, system — without
polling files or relying on Console.app.

How it works:

1. `LogBroadcaster` (new) — process-wide actor with a 500-line ring
   buffer + subscriber set. Borrowed shape from
   OrchestratorEventBroadcaster so the project's three broadcasters
   share a mental model. New subscribers replay the buffer in order,
   then go live.

2. `BroadcastLogHandler` (new) — swift-log LogHandler conformance.
   Formats each log call into a `LogLine` and schedules an unstructured
   `Task { await LogBroadcaster.shared.publish(...) }` so the logging
   caller never blocks on actor isolation. Synchronous handler contract
   preserved; ordering is best-effort under heavy load.

3. `LoggingBootstrap.make(label:)` now returns
   `MultiplexLogHandler([file, os, broadcast])` — the new handler is
   purely additive. File rotation + os.Logger streaming unchanged.

4. `DevOverlayLogsView` (new) — fourth tab in the overlay. Subscribes
   to `LogBroadcaster.shared` on appear, caps at 1000 lines, renders
   monospaced. Per-channel filter (Menu w/ checkboxes), per-level
   filter (debug → critical), substring search, Pause/Resume button
   (Cmd+P), auto-scroll-to-bottom while not paused. Color-coded by
   level (warn=orange, error/critical=red).

Tests:
- 5 new LogBroadcasterTests covering publish/cap/replay/live/handler.
- swift test --package-path packages/Logging → 22/22 pass.
- swift test --package-path packages/DevOverlay → 14/14 pass.
- bash scripts/check-app-builds.sh → PASS.
- 18/18 boundary gates green.

Redaction note: file handler still routes through Redact.apply for
disk writes; the broadcaster sees raw messages because the DevOverlay
is a developer-only in-process surface. If this ever becomes
user-facing, route through Redact before publishing.
2026-05-12 14:27:57 -05:00
..

DevOverlay

Cmd+Option+D toggleable debug panel. Shows current agent state, last 5 tool calls (inputs + outputs), context token count, and per-turn latency breakdown. Not user-facing — a developer tool.

Key public types

Type Purpose
DevOverlayWindow The borderless NSWindow that hosts the SwiftUI view
DevOverlayView SwiftUI panel — state, tool calls, tokens, latencies
DevOverlayViewModel Subscribes to OrchestratorEvent + MemoryEvent streams
DevOverlayBridge Wiring from AppDelegate (event-stream subscriber + window controller)

Depends on

AgentCore, AgentOrchestrator, Logging. External: swift-log.

Used by

App/AppDelegate. Not consumed by other packages.

Key invariants / contracts

  • Read-only consumer. DevOverlay never mutates orchestrator/memory state — it only watches.
  • Latency tracking is wall-clock, not LLM-billed. Per-turn breakdown shows network + decode + tool dispatch separately.
  • Token count is provider-reported usage. Not a local re-tokenization.

Tests

XCTest. Snapshot tests on view-model state transitions, integration with mock orchestrator events.

Notable files

  • Sources/DevOverlay/DevOverlayView.swift — SwiftUI panel
  • Sources/DevOverlay/DevOverlayViewModel.swift — event-stream subscriber
  • Sources/DevOverlay/DevOverlayBridge.swift — AppDelegate wiring