diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b23b29b6..e13521776 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- **`@ruvnet/ruview` 0.9.1: live sensing views inside Claude Code (ADR-377, ADR-378).** The package now ships `ruview-live`, a Claude Code mod. Type `/ruview` and a pane opens next to the conversation showing what your sensors see right now, refreshed automatically. It has three views, switched with keys `1` `2` `3` or with `/ruview overview|waterfall|radar`: + - **Overview**: the CSI nodes streaming to your machine (rate, packet loss, signal strength) and an optional 60 GHz radar kit (presence, distance, heart and breathing rates). + - **CSI waterfall**: the Wi-Fi signal itself, the strength of every subcarrier over time, drawn in colour and scrolling as frames arrive. The new `ruview esp32 --spectrum` option supplies the data. + - **Radar**: a top-down range fan with an animated ping out to the measured distance, plus heart, breathing and distance charts. + + Every reading is labelled honestly: MEASURED or SYNTHETIC from the packets themselves; radar vitals as "device-reported, not validated"; range-only radar as "distance, not direction". The pane only reads; it never flashes or configures a device. + + Verified on real hardware: an ESP32-C6 streaming CSI and a Seeed MR60BHA2 radar kit (MEASURED; reproducer `npx @ruvnet/ruview esp32 --seconds 4 --spectrum --json`). The package's size ceiling rises from 384 KiB to 448 KiB; it still has no runtime dependencies. - **`wifi-densepose-sar` — coherent wideband RF tomography research crate (ADR-287).** New standalone leaf crate (the `nvsim` pattern; zero coupling to `wifi-densepose-hardware` or any real ingestion path) implementing the synthetic-aperture-radar reconstruction primitive a handheld through-wall RF imaging device would need — motivated by comparison against Applied Electrodynamics' "WaveSight" launch, and explicitly scoped below ADR-278's RISE/DiffRadar/GeRaF reproduction gates. Ships: (1) a stepped-frequency, multi-position complex forward measurement simulator (`y_{m,k} = Σ σ_j/R² · exp(-i·4π·f·R/c) + noise`, deterministic ChaCha20 seeding); (2) delay-and-sum backprojection reconstruction onto a 3D voxel grid, rayon-parallelized over voxels; (3) threshold + local-maximum point-cloud extraction; (4) closed-form range/cross-range resolution and antenna-pose coherence-budget formulas (`ΔR=c/2B`, `δ_CR≈λR/2L`, `Δp≤λ/8`) checked against the reconstruction's *actual* behavior in `tests/physics_validation.rs` rather than merely documented — forward-simulating two targets at controlled separations and proving they resolve or merge exactly where the formulas predict, and that reconstructed focus at a known target degrades as injected antenna-pose error grows. Every number is SYNTHETIC/L0 (ADR-282) — no real wideband RF hardware backs this crate; see the crate README and `docs/tutorials/coherent-rf-tomography-backprojection.md` for the full honesty boundary and a worked walkthrough. `focus_at_point` exploits the evenly-spaced-by-construction frequency sweep (an arithmetic progression in per-term phase) to evaluate each pose's phasor once and advance it by a fixed complex-multiply step per frequency instead of one `sin`/`cos` pair per frequency — **MEASURED ~4.4-4.5x faster** (criterion regression detection, p < 0.001) than the first-shipped direct-computation version, proven equivalent (not just faster) to an independently reimplemented reference across four sweep sizes and on-/off-target points. 25 tests (22 unit + 3 integration), 0 failed, clippy-clean; MEASURED backprojection throughput ~1.7-2.3M voxels/sec (criterion, 21 poses × 32 freq steps). - **HOMECORE platform runtime completion — secure native/Wasmtime plugins, authenticated HAP IP, expanded Home Assistant APIs, durable restoration/migration, and voice protocols.** `homecore-server` now owns deterministic compiled-in native plugin registration plus explicitly configured, path-bounded, Ed25519 publisher-verified Wasm packages executed through Wasmtime with setup/state-change/teardown lifecycle; arbitrary native dynamic libraries remain intentionally unsupported. The optional HAP server implements persisted accessory identity and controller records, SRP-6a Pair-Setup M1–M6, X25519/Ed25519 Pair-Verify M1–M4, HKDF-SHA512/ChaCha20-Poly1305 record framing, authenticated/admin endpoint gates, replay/tamper closure, live entity synchronization, and paired-state `_hap._tcp` mDNS updates (45 focused tests; external Apple certification is not claimed). Startup restores device/entity registries and deterministic latest recorder states before plugins, and migration now atomically preserves forward-compatible device/config-entry fields. The HA-compatible surface adds events, templates, config checks, components, registries, history/logbook with SQL-enforced global response bounds, calendar/camera provider routes, and modern WebSocket negotiation while retaining a machine-readable limitations matrix for integration-specific behavior. Assist adds bounded PCM16, async STT/TTS contracts, an end-to-end speech pipeline, and an authenticated satellite session protocol; real deployments still provide the speech engines. - **`ruview-unified` increment 3 — Gaussian update-loop completion, separable delay-Doppler, and property-tested boundary hardening.** (1) `GaussianMap::merge_overlapping` (ADR-275 step 5: mutual-Mahalanobis + semantic-compatibility dedup catching drift the insert-time gate misses) and lifetime-aware decay (`τ_eff = τ·(1+ln(1+lifetime/τ))` — confirmed structures outlive transients at equal nominal τ). (2) `delay_doppler_map` reimplemented separably (`O(B²S+S²B)`), proven equivalent to the direct reference to <1e-10 and **measured 8.3× faster** (520 µs vs 4.34 ms at 56×8). (3) `tests/security_boundaries.rs` — 8 `proptest` properties over the boundary surfaces (arbitrary values incl. NaN/±inf via `f64::from_bits`) that found and fixed three input-controlled defects: a BLE-CS phase-unwrap infinite loop on non-finite phases and an ~1e299-iteration loop on finite-huge phases (now O(1) modular unwrap + plausibility bound), and a subnormal Gaussian scale overflowing `1/σ²` to NaN density (now physical σ/occupancy bounds). (4) New criterion benches for all increment-2 hot paths (`to_canonical` 38 µs, `ble_cs_range` 481 ns, AoI planner 647 ns/200 regions, coherent fusion 1.5 µs/32 members, factorized pose 521 ns). ruview-unified now 98 tests (87 lib + 3 acceptance + 8 security), 0 failed, clippy-clean. diff --git a/README.md b/README.md index b2766b97b..8c81c7e25 100644 --- a/README.md +++ b/README.md @@ -54,30 +54,30 @@ Companion packages: [`homecore`](harness/homecore/README.md) (Homecore developer ```bash # Check the local setup and get source-cited guidance -npx @ruvnet/ruview@0.9.0 doctor -npx @ruvnet/ruview@0.9.0 guidance --topic sensing --query "model loading" +npx @ruvnet/ruview@0.9.1 doctor +npx @ruvnet/ruview@0.9.1 guidance --topic sensing --query "model loading" # Hardware: what is plugged in, live CSI from your nodes, a 60 GHz radar kit -npx @ruvnet/ruview@0.9.0 devices -npx @ruvnet/ruview@0.9.0 esp32 --watch # ESP32 + Realtek RAC1 nodes, live view -npx @ruvnet/ruview@0.9.0 esp32 --seconds 45 --analyze # live CSI through the vitals kernel -npx @ruvnet/ruview@0.9.0 mmwave --source esphome --host +npx @ruvnet/ruview@0.9.1 devices +npx @ruvnet/ruview@0.9.1 esp32 --watch # ESP32 + Realtek RAC1 nodes, live view +npx @ruvnet/ruview@0.9.1 esp32 --seconds 45 --analyze # live CSI through the vitals kernel +npx @ruvnet/ruview@0.9.1 mmwave --source esphome --host # Agents: MCP over stdio, or over HTTP for ChatGPT (token-protected, read tools only) -npx @ruvnet/ruview@0.9.0 mcp start -RUVIEW_MCP_GRANTS=device-access npx @ruvnet/ruview@0.9.0 mcp start --http +npx @ruvnet/ruview@0.9.1 mcp start +RUVIEW_MCP_GRANTS=device-access npx @ruvnet/ruview@0.9.1 mcp start --http # Claude Code: a live sensing pane (/ruview), shipped in the package -npx @ruvnet/ruview@0.9.0 mod +npx @ruvnet/ruview@0.9.1 mod # Run a read-only RuView agent through Codex -npx @ruvnet/ruview@0.9.0 agent run --host codex --repo . \ +npx @ruvnet/ruview@0.9.1 agent run --host codex --repo . \ --prompt "Find the nearest tests and cite the source files" # Check claims, replay the deterministic proof, search the reviewed brain -npx @ruvnet/ruview@0.9.0 claim-check --file REPORT.md -npx @ruvnet/ruview@0.9.0 verify -npx @ruvnet/ruview@0.9.0 brain search --query "calibration" +npx @ruvnet/ruview@0.9.1 claim-check --file REPORT.md +npx @ruvnet/ruview@0.9.1 verify +npx @ruvnet/ruview@0.9.1 brain search --query "calibration" ``` **Safety:** @@ -722,12 +722,12 @@ claude --plugin-dir ./plugins/ruview Verify the plugin structure: `bash plugins/ruview/scripts/smoke.sh`. Full details: [`plugins/ruview/README.md`](plugins/ruview/README.md). **Live sensing pane (Claude Code mod):** the same marketplace also lists `ruview-live`, a Claude Code mod. -- Install it with `/plugin install ruview-live@ruview`, or run `npx @ruvnet/ruview@0.9.0 mod` for its path inside the npm package. +- Install it with `/plugin install ruview-live@ruview`, or run `npx @ruvnet/ruview@0.9.1 mod` for its path inside the npm package. - `/ruview` opens a pane beside the transcript with your CSI nodes and radar, refreshed on a timer, plus a one-line status. - It is read-only. - Mods are early access; if `/ruview` is missing, start Claude Code with `CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1`. See [ADR-377](docs/adr/ADR-377-ruview-live-claude-code-mod.md). -For the portable RuView MetaHarness, use `npx @ruvnet/ruview@0.9.0`. The quick commands and a fuller explanation are in the collapsed MetaHarness section near the top of this README, in [`harness/ruview/`](harness/ruview/README.md), and in the [user guide](docs/user-guide.md#ruview-npm-toolkit-ruvnetruview). +For the portable RuView MetaHarness, use `npx @ruvnet/ruview@0.9.1`. The quick commands and a fuller explanation are in the collapsed MetaHarness section near the top of this README, in [`harness/ruview/`](harness/ruview/README.md), and in the [user guide](docs/user-guide.md#ruview-npm-toolkit-ruvnetruview). diff --git a/docs/user-guide.md b/docs/user-guide.md index e6ecbd2ce..1d79d9416 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -456,8 +456,8 @@ authority. Versioned collections are `sites`, `buildings`, `floors`, The dependency-free contributor harness exposes the same read path: ```bash -npx @ruvnet/ruview@0.9.0 spaces --resource alerts --limit 25 -npx @ruvnet/ruview@0.9.0 mcp start +npx @ruvnet/ruview@0.9.1 spaces --resource alerts --limit 25 +npx @ruvnet/ruview@0.9.1 mcp start ``` Its MCP tool is `ruview_spaces_list`. MCP reads are OAuth-only, use the fixed @@ -980,8 +980,8 @@ Every result is honest about what it is: not validated against a reference. ```bash -npx @ruvnet/ruview@0.9.0 --help -npx @ruvnet/ruview@0.9.0 doctor # what works on this machine, with fixes +npx @ruvnet/ruview@0.9.1 --help +npx @ruvnet/ruview@0.9.1 doctor # what works on this machine, with fixes ``` In a terminal, commands print a formatted view. Pipes and `--json` print JSON, @@ -993,25 +993,25 @@ Run these on the machine the hardware is plugged into. ```bash # What is plugged in (USB VID:PID → ESP32, Realtek RTL8721Dx, radar, LiDAR) -npx @ruvnet/ruview@0.9.0 devices +npx @ruvnet/ruview@0.9.1 devices # CSI nodes streaming to this machine (UDP 5005): ESP32 ADR-018 frames and # Realtek RAC1 frames, per node rate, loss, RSSI and CSI shape -npx @ruvnet/ruview@0.9.0 esp32 --seconds 10 -npx @ruvnet/ruview@0.9.0 esp32 --watch # live view, redrawn every few seconds -npx @ruvnet/ruview@0.9.0 esp32 --seconds 45 --analyze # live CSI through the vitals kernel +npx @ruvnet/ruview@0.9.1 esp32 --seconds 10 +npx @ruvnet/ruview@0.9.1 esp32 --watch # live view, redrawn every few seconds +npx @ruvnet/ruview@0.9.1 esp32 --seconds 45 --analyze # live CSI through the vitals kernel # A board's serial console, without resetting it -npx @ruvnet/ruview@0.9.0 monitor --port COM9 -npx @ruvnet/ruview@0.9.0 monitor --port COM10 --baud 1500000 # Realtek Ameba +npx @ruvnet/ruview@0.9.1 monitor --port COM9 +npx @ruvnet/ruview@0.9.1 monitor --port COM10 --baud 1500000 # Realtek Ameba # 60 GHz / 24 GHz radar: raw UART, or an ESPHome kit on your network -npx @ruvnet/ruview@0.9.0 mmwave --port COM5 --model auto -npx @ruvnet/ruview@0.9.0 mmwave --source esphome --host 192.168.1.50 +npx @ruvnet/ruview@0.9.1 mmwave --port COM5 --model auto +npx @ruvnet/ruview@0.9.1 mmwave --source esphome --host 192.168.1.50 # Flash ESP32 firmware: plan first, then write with --confirm (records boot evidence) -npx @ruvnet/ruview@0.9.0 flash-plan --port COM16 --bundle firmware/esp32-csi-node/release_bins/c6-adr110 --variant c6 -npx @ruvnet/ruview@0.9.0 flash --port COM16 --bundle firmware/esp32-csi-node/release_bins/c6-adr110 --variant c6 --confirm +npx @ruvnet/ruview@0.9.1 flash-plan --port COM16 --bundle firmware/esp32-csi-node/release_bins/c6-adr110 --variant c6 +npx @ruvnet/ruview@0.9.1 flash --port COM16 --bundle firmware/esp32-csi-node/release_bins/c6-adr110 --variant c6 --confirm ``` **What the alerts mean:** @@ -1034,11 +1034,11 @@ owns the radar, so read it over the network with `--source esphome`. ```bash # Claude Code, Codex or any MCP client (stdio) -claude mcp add ruview -- npx -y @ruvnet/ruview@0.9.0 mcp start +claude mcp add ruview -- npx -y @ruvnet/ruview@0.9.1 mcp start # HTTP, for ChatGPT and remote clients export RUVIEW_MCP_TOKEN="$(node -e "console.log(require('crypto').randomBytes(24).toString('base64url'))")" -RUVIEW_MCP_GRANTS=device-access npx @ruvnet/ruview@0.9.0 mcp start --http --port 8790 +RUVIEW_MCP_GRANTS=device-access npx @ruvnet/ruview@0.9.1 mcp start --http --port 8790 ``` **Connecting ChatGPT.** Clients that can send headers use @@ -1077,7 +1077,7 @@ Keys `1`, `2` and `3` switch between three views (ADR-378): The two live views draw in terminal cells and animate in place. ```bash -npx @ruvnet/ruview@0.9.0 mod # prints the mod's path in your install and how to load it +npx @ruvnet/ruview@0.9.1 mod # prints the mod's path in your install and how to load it claude --plugin-dir "" # try it for one session # or from the RuView marketplace, inside Claude Code: # /plugin marketplace add ruvnet/RuView diff --git a/harness/ruview-umbrella/package.json b/harness/ruview-umbrella/package.json index fb34bf1c7..6819e3b4f 100644 --- a/harness/ruview-umbrella/package.json +++ b/harness/ruview-umbrella/package.json @@ -1,6 +1,6 @@ { "name": "ruview", - "version": "0.9.0", + "version": "0.9.1", "description": "RuView in one install: the WiFi-sensing operator harness (ESP32/Realtek CSI, 60/24 GHz radar incl. ESPHome kits, LiDAR, flashing, training, doctor, MCP + ChatGPT/MCP Apps console), the Homecore developer metaharness, and the WASM vitals kernel. One CLI and one MCP server.", "type": "module", "bin": { @@ -21,7 +21,7 @@ "test": "node --test test/*.test.mjs" }, "dependencies": { - "@ruvnet/ruview": "0.9.0", + "@ruvnet/ruview": "0.9.1", "@ruvnet/ruview-kernel": "0.1.0", "homecore": "0.1.0" }, diff --git a/harness/ruview/.harness/manifest.json b/harness/ruview/.harness/manifest.json index 86b38f31c..6b30fcadf 100644 --- a/harness/ruview/.harness/manifest.json +++ b/harness/ruview/.harness/manifest.json @@ -3,7 +3,7 @@ "generator": "RuView metaharness provenance v2", "template": "vertical:ruview", "name": "@ruvnet/ruview", - "version": "0.9.0", + "version": "0.9.1", "hosts": [ "claude-code", "codex" @@ -32,7 +32,7 @@ "flywheel/genome.json": "75db44a3cab70d9459fc8c07863f640ac1214bfaa243483939e1506d63f51214", "flywheel/replay.mjs": "0670ca0b03701f4afe0b4bca8a3d58d481676b61a94a5b98c6a425aefb1159ab", "flywheel/run.mjs": "6d4f97db16900c45367b6538848cbe1915af999e663720dfc51f2bb1698f1cd0", - "package.json": "c725457bc2d96c7305dcc8f11cd61cb2ef20d3fbe0baa5c9a376bc9897eb8641", + "package.json": "01627b1b2c804c6dddfea1b366058c23c0e99111829dcd3e32967b76d0bce997", "scripts/sync-skills.mjs": "43715dab61e204dc91bbd61755810e8fdb2f66e2b0c0bd791b4bf48a2e293565", "scripts/update-manifest.mjs": "8f56764b8f70aed55da0c7e2417ae875b0d58d781d839b6db7f115f08af61e6b", "scripts/verify-manifest.mjs": "6491a221762efcfeb3e749ecab243b204f17fd5bc871f3d4025597f31b8f0f10", @@ -75,7 +75,7 @@ "src/training.js": "b8451c48db69c7d077d75f07500996213beaa52705116f64afafe084e68e3956", "src/ui/console-widget.js": "0d2f707d57b5ec54968dee1dc80f31c7db9152dcadfc48700c18379dabb55462" }, - "filesDigest": "bc257304cf899a32e83bbcf6b31617157ed03fd40a77f9a552b5c14fda53e78e", + "filesDigest": "60935843295b67f3354b4b02cc31df62bac8b5093568b11f896dfc7fc3a91545", "brainDigest": "c0fb7b079ded157059b91601361429944697dae3cc42abc00dfe1a680986b0f4", "gateFingerprint": "6e53c784eee38310188948fc75fb49e6b4ebc04e247d01b903fa8c8a92d67bdd", "developmentPins": { diff --git a/harness/ruview/.harness/manifest.sha256 b/harness/ruview/.harness/manifest.sha256 index 94fc0034a..b71ca67bf 100644 --- a/harness/ruview/.harness/manifest.sha256 +++ b/harness/ruview/.harness/manifest.sha256 @@ -1 +1 @@ -6af90c386caf06998dfe24fd291f217d0cd2f8f415406ceaf4c8db1b890c2210 manifest.json +0f73608c5acd0547ef850c0944ef76633a40e957c226ce555309832f87491a1c manifest.json diff --git a/harness/ruview/package-lock.json b/harness/ruview/package-lock.json index 8efe3aa84..1ee96b5b9 100644 --- a/harness/ruview/package-lock.json +++ b/harness/ruview/package-lock.json @@ -1,15 +1,15 @@ { "name": "@ruvnet/ruview", - "version": "0.5.1", + "version": "0.9.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ruvnet/ruview", - "version": "0.5.1", + "version": "0.9.1", "license": "MIT", "bin": { - "ruview": "bin/cli.js" + "ruview-harness": "bin/cli.js" }, "devDependencies": { "@metaharness/darwin": "0.8.0", @@ -18,6 +18,14 @@ }, "engines": { "node": ">=20.0.0" + }, + "peerDependencies": { + "@ruvnet/ruview-kernel": ">=0.1.0" + }, + "peerDependenciesMeta": { + "@ruvnet/ruview-kernel": { + "optional": true + } } }, "node_modules/@metaharness/darwin": { diff --git a/harness/ruview/package.json b/harness/ruview/package.json index 0e58d0848..6672651d5 100644 --- a/harness/ruview/package.json +++ b/harness/ruview/package.json @@ -1,6 +1,6 @@ { "name": "@ruvnet/ruview", - "version": "0.9.0", + "version": "0.9.1", "description": "RuView WiFi-sensing operator harness \u2014 CLI, MCP server, and SDK for host device access (ESP32 CSI nodes, 60/24 GHz mmWave, LiDAR), SSH remote hosts, diagnostics, verified ESP32 flashing, evidence-gated training, calibration, and Cognitum Spaces.", "type": "module", "bin": {