- WiFi: use iwgetid -r (privilege-free) before nmcli fallback
- systemd: move StartLimit directives to [Unit] section
- pi-gen: add netdev group for NetworkManager permissions
- Setup page: add enter pairing code shortcut link
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- SetupRobotPage: 4-step wizard (AP connect → WiFi scan → connect → pairing code)
- DeviceDetailPage: health metrics dashboard + log viewer with filters
- Robot local API client for captive portal communication (192.168.4.1)
- API endpoints for health reports, alerts, and device logs
- Dashboard: clickable device cards linking to detail, "Nouveau robot" button
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Robot-client: TelemetryReporter collects system metrics (CPU, RAM, disk, WiFi)
and sends them to backend every 60s via WebSocket
- Robot-client: LogForwarder buffers Pino logs and flushes them in batches
every 5s to the backend via WebSocket
- Backend: HealthReport entity + HealthTelemetryService with alert thresholds
(CPU >80°C, RAM >90%, disk >90%, load >3.0, heap >85%)
- Backend: DeviceLog entity + LogIngestionService with EventEmitter2 for SSE
- Backend: REST endpoints GET /devices/:id/health/reports and /alerts
- Backend: REST endpoint GET /devices/:id/logs with filtering (level, logger, search)
- Backend: SSE endpoint GET /admin/logs/stream for real-time log streaming
- Migrations for health_reports and device_logs tables with proper indexes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>