The PerfState interface was only used twice, so inline it. Move
onChange/onHostLog subscriptions above the route definitions to keep
side-effects grouped. Skip perf.now() in proxy when timing is off.
Early-return on invalid input, then unify the GET/POST and display
paths so each concern is handled once instead of per-subcommand.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
spawnSync blocks the event loop while waiting for ps and du, which
stalls the SSE metrics stream and other requests. Running these
concurrently with async spawn (and Promise.all for du) keeps the
server responsive under load.
- Add /api/system endpoints for CPU, RAM, and disk metrics (SSE stream)
- Add /api/system/logs for unified log stream from all apps (SSE stream)
- Create Vitals component with three gauges: arc (CPU), bar (RAM), circular (Disk)
- Create UnifiedLogs component with real-time scrolling logs and status highlighting
- Update DashboardLanding with stats, vitals, and activity sections
Design follows Dieter Rams / Teenage Engineering aesthetic with neutral palette.
https://claude.ai/code/session_013L9HKHxMEoub76B1zuKive