18997c2fde
* Python: Give the AG-UI Thread Snapshot lifecycle a single owner module Both the agent and workflow runners independently implemented the thread snapshot lifecycle: hydration replay, the load-once stored read, resume message seeding, the stored/request/deferred-default state overlay, and the save whose storage failures must never surface on an already-streamed run. The two copies had already drifted in small ways (one hydrate helper re-checked a store the caller had verified; the two cancelled-resume-id helpers differed on missing-id handling). Introduce ThreadSnapshotSession in _snapshot_session.py as the one owner of that lifecycle, opened once per run and inert when no store or scope is configured so callers stop branching on configuration. Rewire both runners onto it, consolidate _cancelled_resume_interrupt_ids in _run_common (defensive variant) and _event_messages_to_snapshot_dicts in the new module, and delete the superseded per-runner copies. The session interface is covered by dedicated tests; existing suites pin runner behavior. Public exports are unchanged. * Python: Narrow AG-UI event types in snapshot session tests The hydration test accessed run_id, snapshot, and messages on values typed as BaseEvent, which fails the tests/samples type checkers. Narrow each event with isinstance assertions before reading its fields.