feat: Sensing-only UI mode with Gaussian splat visualization and Rust migration ADR

- Add Python WebSocket sensing server (ws_server.py) with ESP32 UDP CSI
  and Windows RSSI auto-detect collectors on port 8765
- Add Three.js Gaussian splat renderer with custom GLSL shaders for
  real-time WiFi signal field visualization (blue→green→red gradient)
- Add SensingTab component with RSSI sparkline, feature meters, and
  motion classification badge
- Add sensing.service.js WebSocket client with reconnect and simulation fallback
- Implement sensing-only mode: suppress all DensePose API calls when
  FastAPI backend (port 8000) is not running, clean console output
- ADR-019: Document sensing-only UI architecture and data flow
- ADR-020: Migrate AI/model inference to Rust with RuVector ONNX Runtime,
  replacing ~2.7GB Python stack with ~50MB static binary
- Add ruvnet/ruvector as upstream remote for RuVector crate ecosystem

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
ruv
2026-02-28 14:37:29 -05:00
parent 6e4cb0ad5b
commit b7e0f07e6e
20 changed files with 2551 additions and 24 deletions

View File

@@ -55,15 +55,16 @@ export class HealthService {
return;
}
// Initial check
this.getSystemHealth().catch(error => {
console.error('Initial health check failed:', error);
// Initial check (silent on failure — DensePose API may not be running)
this.getSystemHealth().catch(() => {
// DensePose API not running — sensing-only mode, skip polling
this._backendUnavailable = true;
});
// Set up periodic checks
// Set up periodic checks only if backend was reachable
this.healthCheckInterval = setInterval(() => {
if (this._backendUnavailable) return;
this.getSystemHealth().catch(error => {
console.error('Health check failed:', error);
this.notifySubscribers({
status: 'error',
error: error.message,