"""Session lifecycle. A session is one sitting (a poker session, or any chat). For now a session is just an id and a start time; later the poker domain pack will hang structured data (hands, stacks, villains) off the same id. """ from __future__ import annotations import secrets from dataclasses import dataclass, field from datetime import datetime, timezone def _new_id() -> str: return "sess-" + secrets.token_hex(4) @dataclass class Session: id: str = field(default_factory=_new_id) started_at: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())