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.
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 panelSources/DevOverlay/DevOverlayViewModel.swift— event-stream subscriberSources/DevOverlay/DevOverlayBridge.swift— AppDelegate wiring