61dc1410e83a34ebab7aba972863d7526f525016
13 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
b4f22b9f48 |
feat(repl): Add REPL effect with HUD-style interactive interface
Implement a Read-Eval-Print Loop (REPL) effect that provides a HUD-style overlay for interactive pipeline control. ## New Files - engine/effects/plugins/repl.py - REPL effect plugin with command processor - engine/display/backends/terminal.py - Added raw mode and input handling - examples/repl_simple.py - Simple demonstration script - tests/test_repl_effect.py - 18 comprehensive tests ## Features ### REPL Interface - HUD-style overlay showing FPS, command history, output buffer size - Command history navigation (Up/Down arrows) - Command execution (Enter) - Character input and backspace support - Output buffer with scrolling ### Commands - help - Show available commands - status - Show pipeline status and metrics - effects - List all effects in pipeline - effect <name> <on|off> - Toggle effect - param <effect> <param> <value> - Set parameter - pipeline - Show current pipeline order - clear - Clear output buffer - quit - Show exit message ### Terminal Input Support - Added set_raw_mode() to TerminalDisplay for capturing keystrokes - Added get_input_keys() to read keyboard input - Proper terminal state restoration on cleanup ## Usage Add 'repl' to effects in your configuration: ## Testing All 18 REPL tests pass, covering: - Effect registration - Command processing - Navigation (history, editing) - Configuration - Rendering ## Integration The REPL effect integrates with the existing pipeline system: - Uses EffectPlugin interface - Supports partial updates - Reads metrics from EffectContext - Can be controlled via keyboard when terminal display is in raw mode Next steps: - Integrate REPL input handling into pipeline_runner.py - Add keyboard event processing loop - Create full demo with interactive features |
||
|
|
1f43cec8e5 |
feat(hybrid): Add hybrid preset-graph configuration system
Implement Option 5: Hybrid preset-graph system that combines preset
simplicity with graph flexibility, providing 70% reduction in config
file size compared to verbose node DSL.
## New Files
- engine/pipeline/hybrid_config.py - Core hybrid config parser
- examples/hybrid_config.toml - Example hybrid configuration (20 lines)
- examples/hybrid_visualization.py - Demo script using hybrid config
- tests/test_hybrid_config.py - Comprehensive test suite (17 tests)
- docs/hybrid-config.md - Complete documentation
## Key Features
1. **Concise Syntax** (70% smaller than verbose DSL):
2. **Automatic Connections**: Linear pipeline order is inferred
3. **Flexible Configuration**:
- Inline objects:
- Array notation:
- Shorthand:
4. **Python API**:
- - Load from TOML
- - Convert from preset
- - Convert to pipeline
- - Convert to graph for further manipulation
## Usage
Loading hybrid configuration...
======================================================================
✓ Hybrid config loaded from hybrid_config.toml
Source: headlines
Camera: scroll
Effects: 4
- noise: intensity=0.3
- fade: intensity=0.5
- glitch: intensity=0.2
- firehose: intensity=0.4
Display: terminal
[38;5;226mAuto-injected stages for missing capabilities: ['camera_update', 'render'][0m
✓ Pipeline created with 9 stages
Stages: ['source', 'camera', 'noise', 'fade', 'glitch', 'firehose', 'display', 'camera_update', 'render']
[?25l✓ Pipeline initialized
Executing pipeline...
[2;38;5;34m>[0m [2;38;5;245mMIT Tech Review [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [10][0m
[2;38;5;34m>[0m [2;38;5;245mQuanta [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [5][0m
[2;38;5;34m>[0m [2;38;5;245mPhys.org [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [30][0m
[2;38;5;34m>[0m [2;38;5;245mArs Technica [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [20][0m
[2;38;5;34m>[0m [2;38;5;245mScience Daily [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [60][0m
[2;38;5;34m>[0m [2;38;5;245mNature [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [75][0m
[2;38;5;34m>[0m [2;38;5;245mNew Scientist [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [99][0m
[2;38;5;34m>[0m [2;38;5;245mNASA [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [10][0m
[2;38;5;34m>[0m [2;38;5;245mBBC Business [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [54][0m
[2;38;5;34m>[0m [2;38;5;245mBBC Science [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [36][0m
[2;38;5;34m>[0m [2;38;5;245mMarketWatch [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [10][0m
[2;38;5;34m>[0m [2;38;5;245mNPR [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [10][0m
[2;38;5;34m>[0m [2;38;5;245mEconomist [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [299][0m
[2;38;5;34m>[0m [2;38;5;245mAl Jazeera [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [25][0m
[2;38;5;34m>[0m [2;38;5;245mFrance24 [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [24][0m
[2;38;5;34m>[0m [2;38;5;245mGuardian World [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [45][0m
[2;38;5;34m>[0m [2;38;5;245mBBC World [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [28][0m
[2;38;5;34m>[0m [2;38;5;245mABC Australia [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [23][0m
[2;38;5;34m>[0m [2;38;5;245mDW [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [124][0m
[2;38;5;34m>[0m [2;38;5;245mSmithsonian [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [10][0m
[2;38;5;34m>[0m [2;38;5;245mAeon [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [20][0m
[2;38;5;34m>[0m [2;38;5;245mWired [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [48][0m
[2;38;5;34m>[0m [2;38;5;245mThe Hindu [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [60][0m
[2;38;5;34m>[0m [2;38;5;245mJapan Times [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [29][0m
[2;38;5;34m>[0m [2;38;5;245mNautilus [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [10][0m
[2;38;5;34m>[0m [2;38;5;245mGuardian Culture [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [24][0m
[2;38;5;34m>[0m [2;38;5;245mLiterary Hub [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [10][0m
[2;38;5;34m>[0m [2;38;5;245mThe Conversation [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [48][0m
[2;38;5;34m>[0m [2;38;5;245mThe Marginalian [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [20][0m
[2;38;5;34m>[0m [2;38;5;245mLongreads [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [25][0m
[2;38;5;34m>[0m [2;38;5;245mDer Spiegel [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [19][0m
[2;38;5;34m>[0m [2;38;5;245mAtlas Obscura [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m. [38;5;34mLINKED [27][0m
[2;38;5;34m>[0m [2;38;5;245mSCMP [38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[38;5;22m.[H[JThe Download: OpenAI is building a fully automated researcher, and a psychedelic
pe e r o in e a
- n b an t l r i l
nl ad n co ut n h l h a h t e o d d t r c e
C n ua t m co e s a h a e p s o f nd
h w r o n ec le o e cl r a e
T e D w o h en a o ’s new A ns, and n x - n u a r c s
W t do ne nucl ar r tors ea f w s ?
h Penta o s l nni g or I co p nies o tr in cl s i d t def nse o
T ownl d pe I s S mi t dea , an ok’ CS M ws it
T J lies T a vol d er nt y K i e
Qu nt m y o ap Pi ee n r g rd
T e a h T a E p i y B urve Are ver er
Why u a d Stil t u le W t t ll S uff?
W e e ome ee S s, She S es S ace T e M e o F ac l
[2;38;5;34m [0m [2;38;5;37mウ[0m[2;38;5;238m┋[0m [2;38;5;238m [0m [38;5;22m [0m [2;38;5;37m [0m[2;38;5;238m [0m [2;38;5;34mウ[0m [2;38;5;37mホ[0m [2;38;5;34m [0m [2;38;5;37m [0m [38;5;22m [0m[2;38;5;37m [0m [2;38;5;238mウ[0m[2;38;5;37m [0m[38;5;22m┆[0m [38;5;22m [0m [2;38;5;238m [0m [2;38;5;238m [0m[2;38;5;37m [0m [2;38;5;34mメ[0m [2;38;5;37mキ[0m [2;38;5;238m [0m[2;38;5;34mケ[0m [2;38;5;37m┃[0m[2;38;5;37m [0m [2;38;5;238m [0m[2;38;5;238m [0m
Ligh - s d n u t s ar f cia str r a mi h s f ng o
New resea h exp r s h a ad of i ms' u q e t chnol g s
L mi e j bl k oc ob o por nit s f y ng pe in oas l n
Are hu a a ural vi l nt? ew re arc c ll o - e a s ons
a m l e e r q a s?
New cove e p o s ow stro eil m t a ter t Ge in 8 e e
o a t g 3 a g ye b r b
How DICER cuts microRNAs with single-nucleotide precision [38;5;34mLINKED [50][0m
======================================================================
Visualization Output:
======================================================================
The Download: OpenAI is building a fully automated researcher, and a psychedelic
pe e r o in e a
- n b an t l r i l
nl ad n co ut n h l h a h t e o d d t r c e
C n ua t m co e s a h a e p s o f nd
h w r o n ec le o e cl r a e
T e D w o h en a o ’s new A ns, and n x - n u a r c s
W t do ne nucl ar r tors ea f w s ?
h Penta o s l nni g or I co p nies o tr in cl s i d t def nse o
T ownl d pe I s S mi t dea , an ok’ CS M ws it
T J lies T a vol d er nt y K i e
Qu nt m y o ap Pi ee n r g rd
T e a h T a E p i y B urve Are ver er
Why u a d Stil t u le W t t ll S uff?
W e e ome ee S s, She S es S ace T e M e o F ac l
[2;38;5;34m [0m [2;38;5;37mウ[0m[2;38;5;238m┋[0m [2;38;5;238m [0m [38;5;22m [0m [2;38;5;37m [0m[2;38;5;238m [0m [2;38;5;34mウ[0m [2;38;5;37mホ[0m [2;38;5;34m [0m [2;38;5;37m [0m [38;5;22m [0m[2;38;5;37m [0m [2;38;5;238mウ[0m[2;38;5;37m [0m[38;5;22m┆[0m [38;5;22m [0m [2;38;5;238m [0m [2;38;5;238m [0m[2;38;5;37m [0m [2;38;5;34mメ[0m [2;38;5;37mキ[0m [2;38;5;238m [0m[2;38;5;34mケ[0m [2;38;5;37m┃[0m[2;38;5;37m [0m [2;38;5;238m [0m[2;38;5;238m [0m
Ligh - s d n u t s ar f cia str r a mi h s f ng o
New resea h exp r s h a ad of i ms' u q e t chnol g s
L mi e j bl k oc ob o por nit s f y ng pe in oas l n
Are hu a a ural vi l nt? ew re arc c ll o - e a s ons
a m l e e r q a s?
New cove e p o s ow stro eil m t a ter t Ge in 8 e e
o a t g 3 a g ye b r b
How DICER cuts microRNAs with single-nucleotide precision
======================================================================
✓ Successfully rendered 24 lines
## Comparison
| Format | Lines | Use Case |
|--------|-------|----------|
| Preset | 10 | Simple configs |
| **Hybrid** | **20** | **Most use cases (recommended)** |
| Verbose DSL | 39 | Complex DAGs |
All existing functionality preserved - verbose node DSL still works.
|
||
|
|
ba230d3e70 |
test(graph): Add comprehensive test suite for graph system
Add 17 tests covering all aspects of the graph-based pipeline system: - Graph creation and manipulation (7 tests) - Empty graph creation - Node addition with various formats - Connection handling with validation - Chain connection helper - Graph validation (3 tests) - Disconnected node detection - Cycle detection using DFS - Clean graph validation - Serialization/deserialization (2 tests) - to_dict() for basic graphs - from_dict() for loading from dictionaries - Pipeline conversion (5 tests) - Minimal pipeline conversion - Effect nodes with intensity - Positioning nodes - Camera nodes - Simple graph execution All tests pass successfully and verify the graph system works correctly with the existing pipeline architecture. |
||
|
|
2d28e92594 |
feature/capability-based-deps (#53)
Reviewed-on: #53 Co-authored-by: David Gwilliam <dhgwilliam@gmail.com> Co-committed-by: David Gwilliam <dhgwilliam@gmail.com> |
||
|
|
b1f2b9d2be | feat(daemon): add display abstraction and daemon mode with C&C | ||
|
|
d5a3edba97 | feat(effects): add plugin architecture with performance monitoring | ||
|
|
15de46722a |
refactor: phase 4 - event-driven architecture foundation
- Add EventBus class with pub/sub messaging (thread-safe) - Add emitter Protocol classes (EventEmitter, Startable, Stoppable) - Add event emission to NtfyPoller (NtfyMessageEvent) - Add event emission to MicMonitor (MicLevelEvent) - Update StreamController to publish stream start/end events - Add comprehensive tests for eventbus and emitters modules |
||
|
|
35e5c8d38b |
refactor: phase 3 - API efficiency improvements
Add typed dataclasses for tuple returns: - types.py: HeadlineItem, FetchResult, Block dataclasses with legacy tuple converters - fetch.py: Add type hints and HeadlineTuple type alias Add pyright for static type checking: - Add pyright to dependencies - Verify type coverage with pyright (0 errors in core modules) This enables: - Named types instead of raw tuples (better IDE support, self-documenting) - Type-safe APIs across modules - Backward compatibility via to_tuple/from_tuple methods Note: Lazy imports skipped for render.py - startup impact is minimal. |
||
|
|
cdc8094de2 |
refactor: phase 2 - modularization of scroll engine
Split monolithic scroll.py into focused modules: - viewport.py: terminal size (tw/th), ANSI positioning helpers - frame.py: FrameTimer class, scroll step calculation - layers.py: message overlay, ticker zone, firehose rendering - scroll.py: simplified orchestrator, imports from new modules Add stream controller and event types for future event-driven architecture: - controller.py: StreamController for source initialization and stream lifecycle - events.py: EventType enum and event dataclasses (HeadlineEvent, FrameTickEvent, etc.) Added tests for new modules: - test_viewport.py: 8 tests for viewport utilities - test_frame.py: 10 tests for frame timing - test_layers.py: 13 tests for layer compositing - test_events.py: 11 tests for event types - test_controller.py: 6 tests for stream controller This enables: - Testable chunks with clear responsibilities - Reusable viewport utilities across modules - Better separation of concerns in render pipeline - Foundation for future event-driven architecture Also includes Phase 1 documentation updates in code comments. |
||
|
|
f170143939 |
refactor: phase 1 - testability improvements
- Add Config dataclass with get_config()/set_config() for injection - Add Config.from_args() for CLI argument parsing (testable) - Add platform font path detection (Darwin/Linux) - Bound translate cache with @lru_cache(maxsize=500) - Add fixtures for external dependencies (network, feeds, config) - Add 15 tests for Config class, from_args, and platform detection This enables testability by: - Allowing config injection instead of global mutable state - Supporting custom argv in from_args() for testing - Providing reusable fixtures for mocking network/filesystem - Preventing unbounded memory growth in translation cache Fixes: _arg_value/_arg_int not accepting custom argv |
||
|
|
9ae4dc2b07 | fix: update ntfy tests for SSE API (reconnect_delay) | ||
|
|
4844a64203 |
style: apply ruff auto-fixes across codebase
- Fix import sorting (isort) across all engine modules - Fix SIM105 try-except-pass patterns (contextlib.suppress) - Fix nested with statements in tests - Fix unused loop variables Run 'uv run pytest' to verify tests still pass. |
||
|
|
9201117096 |
feat: modernize project with uv, add pytest test suite
- Add pyproject.toml with modern Python packaging (PEP 517/518) - Add uv-based dependency management replacing inline venv bootstrap - Add requirements.txt and requirements-dev.txt for compatibility - Add mise.toml with dev tasks (test, lint, run, sync, ci) - Add .python-version pinned to Python 3.12 - Add comprehensive pytest test suite (73 tests) for: - engine/config, filter, terminal, sources, mic, ntfy modules - Configure pytest with coverage reporting (16% total, 100% on tested modules) - Configure ruff for linting with Python 3.10+ target - Remove redundant venv bootstrap code from mainline.py - Update .gitignore for uv/venv artifacts Run 'uv sync' to install dependencies, 'uv run pytest' to test. |