mirror of
https://github.com/ruvnet/RuView
synced 2026-07-19 16:53:18 +00:00
67fec45e61
* feat(edge-registry): ADR-102 — surface Cognitum cog catalog via /api/v1/edge/registry Adds a new sensing-server endpoint that fetches and caches the canonical Cognitum app registry at https://storage.googleapis.com/cognitum-apps/app-registry.json (105 cogs across 11 categories as of v2.1.0). RuView previously had no live awareness of the catalog — the README's capability table was hand- curated and went stale as Cognitum shipped new cogs (the registry was last updated 6 days ago). ADR: * docs/adr/ADR-102-edge-module-registry.md — full design, response shape, configuration flags, failure modes, and a 12-row security review covering SSRF, response inflation, ?refresh abuse, stale-serve semantics, TLS, cache poisoning, JSON-panic resistance, etc. Code: * v2/.../edge_registry.rs — EdgeRegistry struct + UreqFetcher + MockFetcher trait + 7 unit tests. RwLock<Option<CachedEntry>> with stale-on-error fallback. MAX_PAYLOAD_BYTES=8 MiB, 10s wire timeout. * v2/.../main.rs — constructs Option<Arc<EdgeRegistry>> at startup, registers GET /api/v1/edge/registry handler, wires Extension layer. Handler runs the blocking ureq fetch via tokio::task::spawn_blocking so the async runtime stays free. * v2/.../cli.rs / main.rs Args — three new flags (per user request to "allow the registry to be disabled or changed"): --edge-registry-url <URL> (env RUVIEW_EDGE_REGISTRY_URL) --edge-registry-ttl-secs <N> (env RUVIEW_EDGE_REGISTRY_TTL_SECS) --no-edge-registry (env RUVIEW_NO_EDGE_REGISTRY) When --no-edge-registry is set or the URL is empty, the endpoint returns 404. Cargo.toml: adds ureq (rustls), sha2, thiserror as direct deps. README: * New collapsed "🧩 Edge Module Catalog" section with the full 105-cog table generated from the registry, grouped by category with practical one-line descriptions (e.g. "Spots irregular heartbeats and abnormal heart rhythms", "Detects walking problems and scores fall risk"). Links to https://seed.cognitum.one/store and the local appliance /cogs page. Sits between the HF model section and How It Works. Tests (7/7 pass): first_call_hits_upstream_and_caches ttl_expiry_triggers_refetch force_refresh_bypasses_fresh_cache stale_serve_on_upstream_failure_after_cached_success no_cache_no_upstream_returns_error upstream_invalid_json_is_treated_as_error upstream_sha256_is_deterministic Security highlights (full review in ADR-102 §"Security review"): - The registry is metadata-only; per-cog binary signatures (ADR-100) remain the trust root for installs. A compromised registry can mislead a human reader but cannot ship malicious binaries. - 8 MiB cap + 10s timeout + Option<Arc<...>> via Extension layer means the endpoint can't be used to exhaust memory or pin tokio threads. - Stale-on-error responses carry an explicit `stale: true` field so upstream outages are visible to consumers rather than silently masked. - Endpoint sits behind the existing RUVIEW_API_TOKEN bearer gate when set, otherwise unauthenticated (registry contents are public anyway). * chore: refresh Cargo.lock for ureq/sha2/thiserror deps added by ADR-102
72 lines
2.6 KiB
TOML
72 lines
2.6 KiB
TOML
[package]
|
|
name = "wifi-densepose-sensing-server"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
description = "Lightweight Axum server for WiFi sensing UI with RuVector signal processing"
|
|
license.workspace = true
|
|
authors = ["rUv <ruv@ruv.net>", "WiFi-DensePose Contributors"]
|
|
repository.workspace = true
|
|
documentation = "https://docs.rs/wifi-densepose-sensing-server"
|
|
keywords = ["wifi", "sensing", "server", "websocket", "csi"]
|
|
categories = ["web-programming::http-server", "science"]
|
|
readme = "README.md"
|
|
|
|
[lib]
|
|
name = "wifi_densepose_sensing_server"
|
|
path = "src/lib.rs"
|
|
|
|
[[bin]]
|
|
name = "sensing-server"
|
|
path = "src/main.rs"
|
|
|
|
[dependencies]
|
|
# Web framework
|
|
axum = { workspace = true }
|
|
tower-http = { version = "0.6", features = ["fs", "cors", "set-header"] }
|
|
tokio = { workspace = true, features = ["full", "process"] }
|
|
futures-util = "0.3"
|
|
ruvector-mincut = { workspace = true }
|
|
|
|
# Serialization
|
|
serde = { workspace = true }
|
|
serde_json.workspace = true
|
|
|
|
# Logging
|
|
tracing.workspace = true
|
|
tracing-subscriber = { workspace = true }
|
|
|
|
# Time
|
|
chrono = { version = "0.4", features = ["serde"] }
|
|
|
|
# CLI
|
|
clap = { workspace = true }
|
|
|
|
# Multi-BSSID WiFi scanning pipeline (ADR-022 Phase 3)
|
|
wifi-densepose-wifiscan = { version = "0.3.0", path = "../wifi-densepose-wifiscan" }
|
|
|
|
# Signal processing with RuvSense pose tracker (accuracy sprint).
|
|
# default-features = false drops the optional ndarray-linalg/BLAS chain so that
|
|
# `--no-default-features` at the workspace root can produce a Windows-friendly
|
|
# build without vcpkg/openblas (issue #366, #415).
|
|
wifi-densepose-signal = { version = "0.3.0", path = "../wifi-densepose-signal", default-features = false }
|
|
|
|
# midstream — real-time introspection / low-latency tap (ADR-099 D1).
|
|
# Two crates only, on purpose: scheduler / neural-solver / strange-loop are
|
|
# explicitly out of scope of ADR-099 (D5).
|
|
midstreamer-temporal-compare = "0.2" # DTW / LCS / Edit-Distance pattern matching
|
|
midstreamer-attractor = "0.2" # Lyapunov + regime classification
|
|
|
|
# ADR-102: Edge Module Registry — fetch the canonical Cognitum cog catalog
|
|
# at `https://storage.googleapis.com/cognitum-apps/app-registry.json`,
|
|
# cache with TTL, surface via /api/v1/edge/registry. ureq is the smallest
|
|
# blocking HTTP client we can use without dragging a tokio HTTP stack in;
|
|
# rustls is enabled implicitly via the `tls` default feature.
|
|
ureq = { version = "2", default-features = false, features = ["tls", "json"] }
|
|
sha2 = "0.10"
|
|
thiserror = "1"
|
|
|
|
[dev-dependencies]
|
|
tempfile = "3.10"
|
|
# `tower::ServiceExt::oneshot` for in-process Router tests (bearer_auth).
|
|
tower = { workspace = true }
|