Commit Graph

272 Commits

Author SHA1 Message Date
github-actions[bot] d1d9c7d243 chore: update vendor submodules to latest main 2026-03-09 06:28:37 +00:00
rUv bc5408bd80
feat: complete Tauri desktop frontend with all pages and enhanced design (#198)
* docs: add ADR-052 Tauri desktop frontend with DDD bounded contexts

Proposes a Tauri v2 desktop application as the primary UI for RuView,
replacing 6+ CLI tools with a single cross-platform app. Covers hardware
discovery, firmware flashing (espflash), OTA updates, WASM module
management, sensing server control, and live visualization.

Includes DDD domain model with 6 bounded contexts, aggregate definitions,
domain events, and anti-corruption layers for ESP32 firmware APIs.

Closes #177

Co-Authored-By: claude-flow <ruv@ruv.net>

* docs: add persistent node registry, OTA safety gate, plugin architecture to ADR-052

Incorporates engineering review feedback:
- Persistent node registry (~/.ruview/nodes.db) — discovery becomes reconciliation
- BatchOtaSession aggregate with TdmSafe rolling update strategy
- Plugin architecture section — control plane extensibility trajectory
- Renumbered sections for new content (9-12 added, impl phases now section 13)

Co-Authored-By: claude-flow <ruv@ruv.net>

* docs: add ADR-053 UI design system — Foundation Book + Unity-inspired interface

- Dark professional theme with rUv purple accent (#7c3aed)
- Foundation Book typographic hierarchy (heading-xl through body-sm)
- Unity Editor-inspired panel layout (sidebar + list/detail split + inspector)
- 6 component specs: NodeCard, FlashProgress, MeshGraph, PropertyGrid, StatusBadge, LogViewer
- Color system with status indicators (online/warning/error/info)
- 4px base grid spacing system
- Branding: splash screen, status bar, about dialog

Refs #177

Co-Authored-By: claude-flow <ruv@ruv.net>

* fix: rewrite ADR-053 UI design system with practical terminology

Replace sci-fi themed language (Asimov Foundation references, Prime Radiant,
Encyclopedia Galactica, Terminus, Seldon Crisis) with clear, practical
terminology that engineers and operators can immediately understand.

Co-Authored-By: claude-flow <ruv@ruv.net>

* fix: specify Three.js for mesh topology visualization in ADR-053

Use Three.js for the mesh topology view, consistent with existing
visualization patterns in ui/observatory/js/ and ui/components/.
Includes implementation details: MeshPhongMaterial for node status,
BufferGeometry for dynamic updates, OrbitControls, raycasting.

Co-Authored-By: claude-flow <ruv@ruv.net>

* feat: add Tauri v2 desktop crate with React frontend (Phase 1 skeleton)

Rust backend (wifi-densepose-desktop):
- 14 Tauri commands across 6 groups: discovery, flash, OTA, WASM, server, provision
- Domain types: Node, NodeRegistry, FlashSession, OtaSession, BatchOtaSession
- AppState with DiscoveryState and ServerState behind Mutex
- Workspace Cargo.toml updated with new member
- cargo check passes cleanly

React/TypeScript frontend:
- TypeScript types matching Rust domain model
- Hooks: useNodes (discovery polling), useServer (start/stop/status)
- Components: StatusBadge, NodeCard, Sidebar
- Pages: Dashboard, Nodes (table + expandable details), FlashFirmware
  (3-step wizard with progress bar), Settings (server/security/discovery)
- App.tsx with sidebar navigation routing
- Vite 6 + React 18 + @tauri-apps/api v2

Implements ADR-052 Phase 1 skeleton. All commands return stub data.

Co-Authored-By: claude-flow <ruv@ruv.net>

* feat: implement ADR-053 design system across all frontend components

Create design-system.css with all ADR-053 tokens:
- CSS custom properties: colors, spacing, fonts, panel dimensions
- Typography scale classes (heading-xl through data-lg)
- Form control and button base styles
- Custom scrollbar, selection highlight, animations

Update all components to use design system tokens:
- Replace hardcoded colors with var(--bg-surface), var(--border), etc.
- Replace generic monospace with var(--font-mono) (JetBrains Mono)
- Replace system font stack with var(--font-sans) (Inter)
- Replace spacing values with var(--space-N) tokens
- StatusBadge: use var(--status-online/warning/error/info)
- Dashboard: add stat cards with data-lg class, use StatusBadge
- FlashFirmware: pulse animation on progress bar during writes
- Settings: default bind_address 127.0.0.1 (matches ADR-050)

Add status bar footer with "Powered by rUv", node count, server status.
Load Inter + JetBrains Mono from Google Fonts in index.html.
Update ADR-053 status from Proposed to Accepted.

Co-Authored-By: claude-flow <ruv@ruv.net>

* fix: add missing @tauri-apps/plugin-dialog and plugin-shell dependencies

Required for firmware file picker in FlashFirmware page and
shell sidecar support. Fixes Vite build failure.

Co-Authored-By: claude-flow <ruv@ruv.net>

* fix: add defensive optional chaining for node.chip access

Rust DiscoveredNode stub doesn't include chip field yet.
Use optional chaining (node.chip?.toUpperCase()) to prevent
TypeError at runtime.

Co-Authored-By: claude-flow <ruv@ruv.net>

* feat: add OTA, Edge Modules, Sensing, Mesh View pages with enhanced design system

Implement all 4 remaining pages (OtaUpdate, EdgeModules, Sensing, MeshView)
and enhance the design system with glassmorphism cards, count-up animations,
page transitions, gradient accents, live status bar, and consistent status
dot glows across the UI.

Co-Authored-By: claude-flow <ruv@ruv.net>

* docs: add desktop crate README and link from main README

Co-Authored-By: claude-flow <ruv@ruv.net>

* docs: add download/run instructions to desktop README

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-08 23:31:18 -04:00
rUv c82c4fc4ac
Update README.md 2026-03-07 23:07:12 -05:00
rUv 0c85d9c86f
Update README.md
updated intro
2026-03-07 22:56:18 -05:00
rUv 65c6fa7a34
Update README.md
update intro
2026-03-07 22:51:17 -05:00
rUv 7659b0bbe2
feat: cross-platform WiFi collector factory (ADR-049) (#173)
feat: cross-platform WiFi collector factory (ADR-049)
2026-03-06 15:10:26 -05:00
ruv 75d4685d25 feat: cross-platform WiFi collector factory with graceful degradation (ADR-049)
- Add create_collector() factory function that auto-detects platform and never raises
- Add LinuxWifiCollector.is_available() classmethod for probe-without-exception
- Refactor ws_server.py to use create_collector(), removing ~30 lines of duplicated platform detection
- Add 10 unit tests covering all platform paths and edge cases
- Add ADR-049 documenting the cross-platform detection and fallback chain

Docker, WSL, and headless users now get SimulatedCollector automatically
with a clear WARNING log instead of a RuntimeError crash.

Closes #148
Closes #155

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-06 15:09:32 -05:00
rUv 45c15b77a5
fix: ADR-050 security hardening — HMAC, path traversal, OTA auth (#172)
fix: ADR-050 security hardening — HMAC, path traversal, OTA auth
2026-03-06 14:02:50 -05:00
ruv 47223a98be fix: security hardening — replace fake HMAC, add path traversal protection, OTA auth (ADR-050)
Sprint 1 security fixes from quality engineering analysis (issue #170):

- Replace XOR-fold fake HMAC with real HMAC-SHA256 (hmac + sha2 crates) in secure_tdm.rs
- Add path traversal sanitization on DELETE /api/v1/models/:id and /api/v1/recording/:id
- Default bind address changed from 0.0.0.0 to 127.0.0.1 (configurable via --bind-addr / SENSING_BIND_ADDR)
- Add PSK authentication to ESP32 OTA firmware upload endpoint (ota_update.c)
- Flip WASM signature verification to default-on (CONFIG_WASM_SKIP_SIGNATURE opt-out vs opt-in)
- Add 6 new security tests: HMAC key/message sensitivity, determinism, wrong-key rejection, bit-flip detection, enforcing mode
- Add clap env feature for environment variable configuration

All 106 hardware crate tests pass. Sensing server compiles clean.

Closes #170

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-06 13:11:04 -05:00
ruv c45690ed4e fix: use montserrat_14 for display_ui big label (montserrat_20 not in Kconfig)
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 11:45:59 -05:00
ruv fb782e0d71 fix: brighten ambient light color and increase multiplier for room brightness slider
The ambient light color 0x446688 (dark blue-gray) was too dim to produce
visible brightness changes. Changed to 0xccccdd (bright neutral) with 5x
multiplier. Bumped SETTINGS_VERSION to force fresh defaults.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:56:37 -05:00
ruv 944076733e fix: room brightness slider now applies 3x multiplier to ambient light
The ambient light was initialized with intensity * 3.0 but the slider
and preset callbacks set raw value without the multiplier, making the
setting appear to do nothing.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:51:41 -05:00
ruv a8f48a7897 docs: make hero image clickable, links to live demo
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:48:41 -05:00
ruv 7df316f13e docs: make README screenshot clickable, links to live demo
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:45:53 -05:00
ruv da54ea07d2 fix: reduce default bloom strength, ensure auto-cycle starts on load
- Default bloom: 0.2 → 0.08, radius 0.25 → 0.2, threshold 0.5 → 0.6
- PostProcessing constructor matches new defaults
- Bump SETTINGS_VERSION to '5' to clear stale localStorage (forces auto scenario)

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:42:37 -05:00
rUv bf4d64ad4b
docs: add live Observatory demo link to README (#145) 2026-03-05 10:39:58 -05:00
ruv 8b57a6f64c docs: update README with ADR-045–048, Observatory, adaptive classifier, AMOLED display
- Update ADR count from 44 to 48
- Add adaptive classifier (ADR-048) to Intelligence features
- Add Observatory visualization (ADR-047) and AMOLED display (ADR-045) to Deployment features
- Update screenshot to v2-screen.png
- Add ADR-045 (AMOLED), ADR-046 (Android TV), ADR-047 (Observatory), DDD deployment model
- Add AMOLED display firmware (display_hal, display_task, display_ui, LVGL config)
- Add Observatory UI (13 Three.js modules, CSS, HTML entry point)
- Add trained adaptive model JSON
- Update .gitignore for managed_components, recordings, .swarm

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:20:48 -05:00
rUv 5fa61ba7ea
feat: adaptive CSI classifier with signal smoothing pipeline (ADR-048) (#144)
Add environment-tuned activity classification that learns from labeled
ESP32 CSI recordings, replacing brittle static thresholds.

- Adaptive classifier: 15-feature logistic regression trained from JSONL
  recordings (variance, motion band, subcarrier stats: skew, kurtosis,
  entropy, IQR). Trains in <1s, persists as JSON, auto-loads on restart.
- Three-stage signal smoothing: adaptive baseline subtraction (α=0.003),
  EMA + trimmed-mean median filter (21-frame window), hysteresis debounce
  (4 frames). Motion classification now stable across seconds, not frames.
- Vital signs stabilization: outlier rejection (±8 BPM HR, ±2 BPM BR),
  trimmed mean, dead-band (±2 BPM HR), EMA α=0.02. HR holds steady for
  10+ seconds instead of jumping 50 BPM every frame.
- Observatory auto-detect: always probes /health on startup, connects
  WebSocket to live ESP32 data automatically.
- New API endpoints: POST /api/v1/adaptive/train, GET /adaptive/status,
  POST /adaptive/unload for runtime model management.
- Updated user guide with Observatory, adaptive classifier tutorial,
  signal smoothing docs, and new troubleshooting entries.
2026-03-05 10:15:18 -05:00
ruv f771cf8461 docs: add vendor README with submodule setup instructions
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 13:31:19 -05:00
ruv c257e9a215 chore: track upstream main branch for vendor submodules
- Add branch = main to each submodule in .gitmodules
- Add GitHub Actions workflow that checks every 6 hours for
  upstream updates and opens a PR automatically

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 13:30:48 -05:00
rUv 6e76578dcf
Merge pull request #137 from ruvnet/refactor/vendor-submodules
refactor: convert vendor/ to git submodules
2026-03-04 13:23:38 -05:00
ruv c6f061a191 refactor: convert vendor/ directories to git submodules
Replace 9,608 tracked vendor files (~737MB) with git submodule pointers
to their upstream repositories:

- vendor/midstream -> https://github.com/ruvnet/midstream
- vendor/ruvector -> https://github.com/ruvnet/ruvector
- vendor/sublinear-time-solver -> https://github.com/ruvnet/sublinear-time-solver

This dramatically reduces repo size and ensures vendor code stays
in sync with upstream. New clones should use:
  git clone --recurse-submodules
Existing clones should run:
  git submodule update --init --recursive

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 13:22:25 -05:00
ruv 57141ff707 Update README hero image to ruview-small-gemini
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 10:37:42 -05:00
ruv b995adea87 docs: update user guide for multi-arch Docker and RuView repo rename
- Update GitHub URLs from ruvnet/wifi-densepose to ruvnet/RuView
- Update git clone directory references to RuView
- Note multi-architecture support (amd64 + arm64) for Docker image
- Add troubleshooting entry for macOS arm64 manifest error

Fixes ruvnet/RuView#136

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 10:21:22 -05:00
ruv 6fea56c4a9 Add RuView hero image to top of README
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 10:19:41 -05:00
rUv d7a55fd646
Merge pull request #135 from ruvnet/fix/install-macos-bash3-compat
fix: install.sh macOS Bash 3.2 compatibility
2026-03-04 08:27:21 -05:00
ruv dc371a6751 fix: install.sh compatibility with macOS Bash 3.2
Replace `declare -A` (associative array, requires Bash 4+) with
a standard indexed array. macOS ships Bash 3.2 due to GPLv3
licensing, so `declare -A` fails with "invalid option".

Fixes #134

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 08:27:02 -05:00
rUv da7105d599
Update README.md 2026-03-03 21:17:37 -05:00
rUv 749007d708
Update README.md 2026-03-03 21:17:08 -05:00
rUv 26655d397e
Merge pull request #133 from ruvnet/fix/pickle-deserialization-safety
fix: safe PyTorch model loading (weights_only=True)
2026-03-03 18:11:29 -05:00
ruv aca1bbc82e fix: use weights_only=True for safe PyTorch model loading
Replace unsafe `torch.load(path)` with `torch.load(path,
map_location=self.device, weights_only=True)` to prevent
pickle deserialization RCE (trailofbits.python.pickles-in-pytorch).

weights_only=True disables pickle entirely for model loading,
which is the PyTorch-recommended mitigation (available since 1.13).
Also adds map_location for correct CPU/GPU device mapping.

Closes #106

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 18:08:31 -05:00
ruv 2ad510782e docs: add 4 DDD domain models covering all major subsystems
Create complete Domain-Driven Design specifications for:
- Signal Processing (3 contexts: CSI Preprocessing, Feature Extraction, Motion Analysis)
- Training Pipeline (4 contexts: Dataset Management, Model Architecture, Training Orchestration, Embedding & Transfer)
- Hardware Platform (5 contexts: Sensor Node, Edge Processing, WASM Runtime, Aggregation, Provisioning)
- Sensing Server (5 contexts: CSI Ingestion, Model Management, CSI Recording, Training Pipeline, Visualization)

Update DDD index (3 → 7 models) and README docs table.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 17:39:57 -05:00
ruv 8658cc3de0 docs: improve RuvSense domain model and add DDD index
- Add intro explaining DDD purpose and bounded context overview table
- Add Edge Intelligence bounded context (#7) for on-device sensing
- Add ubiquitous language terms: Edge Tier, WASM Module
- Fix frame rate 20 Hz -> 28 Hz (measured on hardware)
- Link each context to its source files and ADRs
- Add NVS configuration table and invariants for edge processing
- Create docs/ddd/README.md introducing all 3 domain models
- Update main README docs table to link to DDD index

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 17:02:39 -05:00
ruv 2e9b34ec9a docs: remove WiFi-Mat User Guide from docs table
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:58:39 -05:00
ruv 3eb8444f73 docs: link Architecture Decisions to ADR README index
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:58:12 -05:00
ruv cd7b914580 docs: add Fully Local feature to Key Features table
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:53:25 -05:00
ruv 6d799c2917 docs: move server-optional note below screenshot
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:42:54 -05:00
ruv d00b733c99 docs: link edge modules to Edge Intelligence section
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:40:03 -05:00
ruv 90b5beb1d4 docs: add "No Internet" to README tagline
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:38:07 -05:00
ruv b5af3bc528 docs: mention edge modules in README intro
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:36:11 -05:00
ruv 7e43edf26a docs: add ADR index with intro on ADRs for AI-assisted development
Explains why ADRs matter for AI-generated code (prevents drift,
provides constraints and rationale), how they work with DDD domain
models, and indexes all 44 ADRs by category.

Also fixes ADR count 43 -> 44 in main README.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:35:17 -05:00
ruv a7fe8b6799 docs: rewrite ESP32 hardware pipeline section with accurate metrics
- Fix binary size 777KB -> 947KB, frame rate 20Hz -> 28.5Hz
- Fix flash command: write_flash (not write-flash), 8MB (not 4MB)
- Add multi-node mesh provisioning with TDM examples
- Add Tier 3 WASM modules row
- Add fine-tuning provisioning flags (--vital-int, --fall-thresh, etc.)
- Plain-language descriptions throughout
- Note server is optional, ESP32 works standalone

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:28:07 -05:00
ruv c2e6546159 docs: move ESP32 independent operation note to hardware section
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:25:21 -05:00
ruv f953a309fe docs: mention ESP32 independent operation in README intro
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:24:06 -05:00
ruv f995f69622 docs: update ADRs with ENOMEM crash fix proof (Issue #127)
- ADR-018: Document rate-limiting and ENOMEM backoff safeguards in firmware
- ADR-029: Add note about rate-limiting requirement for channel hopping, mark
  lwIP pbuf exhaustion risk as resolved
- ADR-039: Add finding #5 documenting the sendto ENOMEM crash and fix
  (947 KB binary, hardware-verified 200+ callbacks with zero errors)
- CHANGELOG: Add entries for Issue #127 fix and Issue #130 provisioning fix

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:14:54 -05:00
rUv ce171696b2
fix: rate-limit CSI sends and add ENOMEM backoff to prevent crash (#132)
The CSI callback fires for every WiFi frame in promiscuous mode
(100-500+ fps). Each call invoked sendto() synchronously, exhausting
lwIP packet buffers (errno 12 = ENOMEM). The rapid-fire failures
cascaded into a LoadProhibited guru meditation crash.

Two fixes:

1. csi_collector.c: Rate-limit UDP sends to 50 Hz (20ms interval).
   CSI frames arriving between sends are dropped — the sensing
   pipeline only needs 20-50 Hz.

2. stream_sender.c: When sendto fails with ENOMEM, suppress further
   sends for 100ms to let lwIP reclaim buffers. Logs the backoff
   event and resumes automatically.

Closes #127
2026-03-03 16:00:40 -05:00
ruv b544545cb0 docs: ADR-044 provisioning tool enhancements
5-phase plan to close remaining gaps in provision.py:
- Phase 1: 7 missing NVS keys (hop_count, chan_list, dwell_ms,
  power_duty, wasm_max, wasm_verify, wasm_pubkey)
- Phase 2: JSON config file for mesh provisioning
- Phase 3: Named presets (basic, vitals, mesh-3, mesh-6-vitals)
- Phase 4: --read (dump NVS) and --verify (boot check)
- Phase 5: Auto-detect serial port

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 15:57:34 -05:00
rUv b6f7b8a74a
fix: add TDM and edge intelligence flags to provision.py (#131)
The user guide and release notes document TDM and edge intelligence
provisioning flags but provision.py only accepted --ssid, --password,
--target-ip, --target-port, and --node-id.

Add all NVS keys the firmware actually reads:
- --tdm-slot / --tdm-total: TDM mesh slot assignment
- --edge-tier: edge processing tier (0=off, 1=stats, 2=vitals)
- --pres-thresh, --fall-thresh: detection thresholds
- --vital-win, --vital-int: vitals timing parameters
- --subk-count: top-K subcarrier selection

Also validates that --tdm-slot and --tdm-total are specified together
and that slot < total.

Closes #130
2026-03-03 15:53:43 -05:00
rUv 86f08303e6
docs: update changelog, user guide, and README for ADR-043 (#128)
- CHANGELOG: add ADR-043 entries (14 new API endpoints, WebSocket fix,
  mobile WS fix, 25 real mobile tests)
- README: update ADR count from 41 to 43
- CLAUDE.md: update ADR count from 32 to 43
- User guide: add 14 new REST endpoints to API reference table, note
  that /ws/sensing is available on the HTTP port, update ADR count
2026-03-03 15:21:52 -05:00
rUv d4fb7d30d3
fix: complete sensing server API, WebSocket connectivity, and mobile tests (#125)
The web UI had persistent 404 errors on model, recording, and training
endpoints, and the sensing WebSocket never connected on Dashboard/Live
Demo tabs because sensingService.start() was only called lazily on
Sensing tab visit.

Server (main.rs):
- Add 14 fully-functional Axum handlers: model CRUD (7), recording
  lifecycle (4), training control (3)
- Scan data/models/ and data/recordings/ at startup
- Recording writes CSI frames to .jsonl via tokio background task
- Model load/unload lifecycle with state tracking

Web UI (app.js):
- Import and start sensingService early in initializeServices() so
  Dashboard and Live Demo tabs connect to /ws/sensing immediately

Mobile (ws.service.ts):
- Fix WebSocket URL builder to use same-origin port instead of
  hardcoded port 3001

Mobile (jest.config.js):
- Fix testPathIgnorePatterns that was ignoring the entire test directory

Mobile (25 test files):
- Replace all it.todo() placeholder tests with real implementations
  covering components, services, stores, hooks, screens, and utils

ADR-043 documents all changes.
2026-03-03 13:27:03 -05:00