feat: the vessel whispers in the séance (Workstream D)

DeviceWhisper: a compact live panel in the séance side column, shown only
when the seeker has paired hardware. One DeviceFeedSocket, readings folded
through the coldSpot cores, online dot with a 15s tick so a silent device
goes dark, cold-spot/pressure flags when active. Renders nothing on zero
devices or any fetch failure — the séance never errors because of this
panel. Socket closed on unmount.

Uses the real GET /api/device endpoint — the spec said /api/devices,
which does not exist; the agent verified against routes/device.py rather
than trusting the spec.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Indiana
2026-07-28 17:19:50 +00:00
6 changed files with 605 additions and 0 deletions

View File

@@ -258,6 +258,14 @@
"body": "a diagnostic pulse only — nothing risked, nothing gained."
}
},
"whisper": {
"title": "THE VESSEL WHISPERS",
"online": "the vessel is awake",
"offline": "the vessel sleeps",
"waiting": "no whisper yet…",
"coldSpot": "❄ a cold spot gathers around the vessel",
"pressureAnomaly": "◎ the air presses close — the atmosphere shifts"
},
"toast": {
"rate_limited": "the veil is thin — slow your knocking",
"veil_crowded": "too many spirits crowd the line"

View File

@@ -258,6 +258,14 @@
"body": "solo un pulso de diagnóstico — no se arriesga ni se gana nada."
}
},
"whisper": {
"title": "EL RECIPIENTE SUSURRA",
"online": "el recipiente está despierto",
"offline": "el recipiente duerme",
"waiting": "aún ningún susurro…",
"coldSpot": "❄ un punto frío se acumula en torno al recipiente",
"pressureAnomaly": "◎ el aire se cierra — la atmósfera cambia"
},
"toast": {
"rate_limited": "el velo es delgado — golpea más despacio",
"veil_crowded": "demasiados espíritus se apiñan en la línea"