"""LabAgent — in-flow feedback over simulated sandbox telemetry (REQ-2-007). Scenario-driven: consumes a LabTelemetryScenario from the corpus, renders the event timeline into the conversation, streams concrete feedback. No session chat — each request is one scenario read. """ from collections.abc import AsyncIterator from ..config import Settings from ..corpus.learner_context import LearnerContext, get_learner_context from ..corpus.telemetry import LabTelemetryScenario, summarize_scenario from ..llm.base import LLMProvider from ..prompts.lab import SYSTEM_PROMPT, render_context from .base import BaseAgent class LabAgent(BaseAgent): name = "lab" def __init__(self, provider: LLMProvider, settings: Settings) -> None: super().__init__(provider, settings) def system_prompt(self, learner_context: LearnerContext | None = None) -> str: ctx = learner_context or get_learner_context() return SYSTEM_PROMPT.format_map(render_context(ctx)) async def stream_feedback( self, scenario: LabTelemetryScenario, learner_context: LearnerContext | None = None, ) -> AsyncIterator[str]: timeline = summarize_scenario(scenario) async for token in self.stream_reply( history=None, user_input=timeline, learner_context=learner_context ): yield token