| """ | |
| Runtime interaction engine — the layer that drives the viewer turn. | |
| Submodules: | |
| types.py ActionResult + Transition + session-scoped enums. | |
| state.py Per-session state machine (current_node_id, | |
| character mood, cumulative progress). | |
| router.py resolve_next(session, action) — the core function | |
| called on every viewer action. Applies policy, | |
| progression, character-state updates, and returns | |
| the next payload. | |
| cooldown.py Per-action cooldown tracking per session. | |
| Every function here is pure-ish: given a session snapshot + | |
| action, returns what should happen next. Persistence is done by | |
| callers (the router module in batch 7) so the runtime is easy to | |
| unit-test without SQLite writes on the hot path. | |
| """ | |
| from .cooldown import CooldownTracker, check_cooldown, mark_used | |
| from .router import ActionPayload, ResolvedTurn, resolve_next | |
| from .state import RuntimeState, build_runtime_state | |
| from .types import Transition, TransitionKind | |
| __all__ = [ | |
| "CooldownTracker", | |
| "check_cooldown", | |
| "mark_used", | |
| "ActionPayload", | |
| "ResolvedTurn", | |
| "resolve_next", | |
| "RuntimeState", | |
| "build_runtime_state", | |
| "Transition", | |
| "TransitionKind", | |
| ] | |