""" Live-play subsystem. Houses the real-time scene-generation loop that powers the candy.ai-style interactive player: chat arrives, the planner picks the next scene, a video job runs against the existing Animate pipeline, and the clip streams back over SSE. Modules land per batch and are imported lazily so this subpackage can be extended without touching the top-level router while intermediate batches are in flight. PLAY-1 scene_memory.py rolling context (pure, in-memory synopsis). PLAY-2 scene_planner.py chat turn → ScenePlan (heuristic phase-1). """ from .scene_memory import ( SceneMemory, TurnSnapshot, build_scene_memory, reset_session, set_synopsis, should_refresh_synopsis, ) from .scene_planner import ( ScenePlan, plan_next_scene, plan_next_scene_async, synthesize_synopsis, ) from .asset_urls import resolve_asset_url from .edit_recipes import EditRecipe, LoRAEntry, pick_recipe from .persona_assets import PersonaAssets, resolve_persona_assets from .persona_profile import load_persona_prompt_vars from .schema import ensure_playback_schema from .video_job import ( SceneJob, get_job, list_jobs, mark_failed, mark_ready, mark_rendering, render_now, render_now_async, submit_scene_job, ) __all__ = [ "SceneMemory", "TurnSnapshot", "build_scene_memory", "reset_session", "set_synopsis", "should_refresh_synopsis", "ScenePlan", "plan_next_scene", "plan_next_scene_async", "synthesize_synopsis", "EditRecipe", "LoRAEntry", "PersonaAssets", "ensure_playback_schema", "load_persona_prompt_vars", "pick_recipe", "resolve_asset_url", "resolve_persona_assets", "SceneJob", "get_job", "list_jobs", "mark_failed", "mark_ready", "mark_rendering", "render_now", "render_now_async", "submit_scene_job", ]