feat(adr-124/phase4): presence.now + vitals.get_* tool family (ADR-124 §4.1)
Advances SPARC Phase 4 (Refinement) iter 5: implements ruview.presence.now
and all three ruview.vitals.* tools sharing a single fetchVitals() helper.
src/types.ts:
- Added EdgeVitalsMessage interface (mirrors Python ws.py:74-88 per ADR-124 §6):
node_id, timestamp_ms, presence, n_persons, confidence, breathing_rate_bpm,
heartrate_bpm, motion, zone_id
src/tools/vitals-fetch.ts (new):
- fetchVitals(nodeId, baseUrl, token): GET /api/v1/vitals/<node_id>/latest
- Returns VitalsFetchOk | VitalsFetchErr — all four tools project from one fetch
- resolveNodeId(): "default" fallback for optional node_id
src/tools/presence-now.ts (new):
- presenceNow(): projects {present, n_persons, confidence, timestamp_ms}
src/tools/vitals-get-breathing.ts (new):
- vitalsGetBreathing(): projects {breathing_rate_bpm|null, confidence, timestamp_ms}
src/tools/vitals-get-heart-rate.ts (new):
- vitalsGetHeartRate(): projects {heartrate_bpm|null, confidence, timestamp_ms}
src/tools/vitals-get-all.ts (new):
- vitalsGetAll(): spreads full EdgeVitalsMessage (raw never present server-side)
src/index.ts:
- 4 new TOOLS entries; all route through Phase 3 schema-validation gate
tests/vitals-tools.test.ts (new, 18 assertions):
- resolveNodeId ×2; fetchVitals soft-fail ×1
- presence.now: soft-fail, field projection, schema accept/reject ×4
- vitals.get_breathing: soft-fail, bpm projection, null bpm, window_s ×4
- vitals.get_heart_rate: soft-fail, bpm projection, schema ×3
- vitals.get_all: soft-fail, full spread + no raw field, schema ×3
Test results: 93/93 PASS (+18). Build: tsc clean.
ACs touched: ADR-124 §4.1 ruview.presence.now, ruview.vitals.get_breathing,
ruview.vitals.get_heart_rate, ruview.vitals.get_all. Phase 4 gate: all
acceptance criteria have passing tests; coverage expanding toward threshold.
Next iter target: Phase 5 (Completion) — CHANGELOG entry, package metadata
review, witness-bundle extension for npm tarball sha256, then open the PR.
(Remaining §4.1 tools — pose, primitives, node, vector — can land as post-
merge follow-up iters given Phase 5 gate criteria are otherwise met.)
Co-Authored-By: claude-flow <ruv@ruv.net>