""" Pipeline presets - Pre-configured pipeline configurations. Provides PipelinePreset as a unified preset system that wraps the existing Preset class from animation.py for backwards compatibility. """ from dataclasses import dataclass, field from engine.animation import Preset as AnimationPreset from engine.pipeline.params import PipelineParams @dataclass class PipelinePreset: """Pre-configured pipeline with stages and animation. A PipelinePreset packages: - Initial params: Starting configuration - Stages: List of stage configurations to create - Animation: Optional animation controller This is the new unified preset that works with the Pipeline class. """ name: str description: str = "" source: str = "headlines" display: str = "terminal" camera: str = "vertical" effects: list[str] = field(default_factory=list) initial_params: PipelineParams | None = None animation_preset: AnimationPreset | None = None def to_params(self) -> PipelineParams: """Convert to PipelineParams.""" if self.initial_params: return self.initial_params.copy() params = PipelineParams() params.source = self.source params.display = self.display params.camera_mode = self.camera params.effect_order = self.effects.copy() return params @classmethod def from_animation_preset(cls, preset: AnimationPreset) -> "PipelinePreset": """Create a PipelinePreset from an existing animation Preset.""" params = preset.initial_params return cls( name=preset.name, description=preset.description, source=params.source, display=params.display, camera=params.camera_mode, effects=params.effect_order.copy(), initial_params=params, animation_preset=preset, ) def create_animation_controller(self): """Create an AnimationController from this preset.""" if self.animation_preset: return self.animation_preset.create_controller() return None # Built-in presets DEMO_PRESET = PipelinePreset( name="demo", description="Demo mode with effect cycling and camera modes", source="headlines", display="terminal", camera="vertical", effects=["noise", "fade", "glitch", "firehose", "hud"], ) POETRY_PRESET = PipelinePreset( name="poetry", description="Poetry feed with subtle effects", source="poetry", display="terminal", camera="vertical", effects=["fade", "hud"], ) PIPELINE_VIZ_PRESET = PipelinePreset( name="pipeline", description="Pipeline visualization mode", source="pipeline", display="terminal", camera="trace", effects=["hud"], ) WEBSOCKET_PRESET = PipelinePreset( name="websocket", description="WebSocket display mode", source="headlines", display="websocket", camera="vertical", effects=["noise", "fade", "glitch", "hud"], ) SIXEL_PRESET = PipelinePreset( name="sixel", description="Sixel graphics display mode", source="headlines", display="sixel", camera="vertical", effects=["noise", "fade", "glitch", "hud"], ) FIREHOSE_PRESET = PipelinePreset( name="firehose", description="High-speed firehose mode", source="headlines", display="terminal", camera="vertical", effects=["noise", "fade", "glitch", "firehose", "hud"], ) PRESETS: dict[str, PipelinePreset] = { "demo": DEMO_PRESET, "poetry": POETRY_PRESET, "pipeline": PIPELINE_VIZ_PRESET, "websocket": WEBSOCKET_PRESET, "sixel": SIXEL_PRESET, "firehose": FIREHOSE_PRESET, } def get_preset(name: str) -> PipelinePreset | None: """Get a preset by name.""" return PRESETS.get(name) def list_presets() -> list[str]: """List all available preset names.""" return list(PRESETS.keys()) def create_preset_from_params( params: PipelineParams, name: str = "custom" ) -> PipelinePreset: """Create a preset from PipelineParams.""" return PipelinePreset( name=name, source=params.source, display=params.display, camera=params.camera_mode, effects=params.effect_order.copy(), initial_params=params, )