diff --git a/haiku_rag_slim/haiku/rag/graph/agui/cli_renderer.py b/haiku_rag_slim/haiku/rag/graph/agui/cli_renderer.py index 03a60bb4..3ff21abc 100644 --- a/haiku_rag_slim/haiku/rag/graph/agui/cli_renderer.py +++ b/haiku_rag_slim/haiku/rag/graph/agui/cli_renderer.py @@ -67,11 +67,17 @@ class AGUIConsoleRenderer: return result - def _render_run_started(self, _event: AGUIEvent) -> None: + def _render_run_started(self, event: AGUIEvent) -> None: """Render run start event.""" + run_id = event.get("runId", "") + if run_id: + # Show shortened run ID (first 8 chars like our UUIDs) + short_id = run_id[:8] if len(run_id) > 8 else run_id + self.console.print(f"[bold green][RUN_STARTED][/bold green] Run {short_id}") def _render_run_finished(self) -> None: """Render run completion.""" + self.console.print("[bold green][RUN_FINISHED][/bold green] Completed") def _render_error(self, event: AGUIEvent) -> None: """Render error event.""" @@ -87,8 +93,12 @@ class AGUIConsoleRenderer: f"\n[bold cyan][STEP_STARTED][/bold cyan] {display_name}" ) - def _render_step_finished(self, _event: AGUIEvent) -> None: + def _render_step_finished(self, event: AGUIEvent) -> None: """Render step finish event.""" + step_name = event.get("stepName", "") + if step_name: + display_name = step_name.replace("_", " ").title() + self.console.print(f"[cyan][STEP_FINISHED][/cyan] {display_name}") def _render_text_message(self, event: AGUIEvent) -> None: """Render complete text message.""" diff --git a/tests/graph/agui/test_cli_renderer.py b/tests/graph/agui/test_cli_renderer.py index 2f21e904..b6552bda 100644 --- a/tests/graph/agui/test_cli_renderer.py +++ b/tests/graph/agui/test_cli_renderer.py @@ -37,9 +37,10 @@ async def test_renderer_basic_flow(): renderer = AGUIConsoleRenderer(console) events = [ - emit_run_started("t1", "r1"), + emit_run_started("t1", "r1-test-run-id"), emit_state_snapshot(SimpleState(value=1)), emit_step_started("plan"), + emit_step_finished("plan"), emit_activity("m1", "planning", "Planning research"), emit_run_finished("t1", "r1", {"status": "complete"}), ] @@ -183,3 +184,21 @@ async def test_renderer_state_delta_without_initial(): result = await renderer.render(async_gen(events)) assert result == {"ok": True} + + +@pytest.mark.asyncio +async def test_renderer_lifecycle_events(): + """Test that lifecycle events are rendered properly.""" + renderer = AGUIConsoleRenderer() + + events = [ + emit_run_started("thread-123", "run-abc-def-ghi"), # Long run ID + emit_step_started("search_one"), + emit_step_finished("search_one"), + emit_step_started("analyze_insights"), + emit_step_finished("analyze_insights"), + emit_run_finished("thread-123", "run-abc-def-ghi", {"complete": True}), + ] + + result = await renderer.render(async_gen(events)) + assert result == {"complete": True}