Wholesale UX upgrade modeled on VisionPOC's pattern so debugging
'why didn't it hear me' actually has visible answers.
NEW: LogStream (ring buffer + stdout + /tmp/voicepoc.log mirror)
- Sources/VoicePOC/Logging/LogStream.swift
- Sources/VoicePOC/Logging/LogStreamView.swift
- Direct port of VisionPOC's pattern. Per-source filter (APP / AUDIO /
WAKE / STT / VAD / LLM / TTS / HUD / STATE / PERF), per-level filter,
auto-scroll, pause, clear. Polled at 100ms; only re-renders on
version bump.
NEW: Visible main window — JarvisMainWindowController
- Sources/VoicePOC/HUD/JarvisMainWindowController.swift
- Two-pane: HUD orb on the left, live diagnostic status panel on right
- Status panel: state badge, RMS meter, VAD probability meter,
last user transcript, streaming JARVIS reply with chunk count
- Sources/VoicePOC/HUD/JarvisStatusView.swift
NEW: LogStreamWindowController + menu integration
- View → Log Stream (⌘L)
- Conversation → Toggle Conversation
- App is now .regular activation policy (Dock icon, real window)
instead of LSUIElement so the user has a real visible UI
ConversationCoordinator instrumentation:
- Per-buffer RMS pushed to HUD state via onRMS observer
- Per-frame VAD probability pushed via onVAD observer
- Final transcript pushed via onTranscript
- Streaming LLM tokens pushed via onLLMProgress (partial text + count)
- Final LLM response pushed via onLLMResponse
- Every state transition and subsystem event also logged to LogStream
with a clear source tag
AppDelegate:
- Bootstraps LogStream file mirror on launch
- Builds & shows main window before async init
- Wires all coordinator observers to mutate hudState on @MainActor
- 4 Hz state mirror keeps HUD mode in sync with coordinator
- Top menu: App / Conversation / View / Window
JarvisHUDState gains: micRMS, vadProbability, streamingTokenCount
for the meters and progress display.
Old terminal/stdin keyboard reading removed — the app has a proper
visible window now.
20 tests still pass. .app builds clean. tail -f /tmp/voicepoc.log
works from any terminal.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>