43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
"""Presence state serializer — transforms ADR-023 presence dicts for consumers.
|
|
|
|
Converts the raw presence schema (version, liveness, mood, energy, etc.)
|
|
into the camelCase world-state payload consumed by the Workshop 3D renderer
|
|
and WebSocket gateway.
|
|
"""
|
|
|
|
from datetime import UTC, datetime
|
|
|
|
|
|
def serialize_presence(presence: dict) -> dict:
|
|
"""Transform an ADR-023 presence dict into the world-state API shape.
|
|
|
|
Parameters
|
|
----------
|
|
presence:
|
|
Raw presence dict as written by
|
|
:func:`~timmy.workshop_state.get_state_dict` or read from
|
|
``~/.timmy/presence.json``.
|
|
|
|
Returns
|
|
-------
|
|
dict
|
|
CamelCase world-state payload with ``timmyState``, ``familiar``,
|
|
``activeThreads``, ``recentEvents``, ``concerns``, ``visitorPresent``,
|
|
``updatedAt``, and ``version`` keys.
|
|
"""
|
|
return {
|
|
"timmyState": {
|
|
"mood": presence.get("mood", "calm"),
|
|
"activity": presence.get("current_focus", "idle"),
|
|
"energy": presence.get("energy", 0.5),
|
|
"confidence": presence.get("confidence", 0.7),
|
|
},
|
|
"familiar": presence.get("familiar"),
|
|
"activeThreads": presence.get("active_threads", []),
|
|
"recentEvents": presence.get("recent_events", []),
|
|
"concerns": presence.get("concerns", []),
|
|
"visitorPresent": False,
|
|
"updatedAt": presence.get("liveness", datetime.now(UTC).strftime("%Y-%m-%dT%H:%M:%SZ")),
|
|
"version": presence.get("version", 1),
|
|
}
|