Source code for ralph.display.phase_exit_model

"""Immutable view-model for phase-close after-banner data."""

from __future__ import annotations

from dataclasses import dataclass
from typing import TYPE_CHECKING

from ralph.display.exit_context import ExitContext
from ralph.display.phase_status import PhaseIterationContext

if TYPE_CHECKING:
    from ralph.display.phase_entry_model import PhaseEntryModel


[docs] @dataclass(frozen=True) class PhaseExitModel: """Immutable view-model for phase-close after-banner data.""" phase_name: str phase_role: str | None = None agent_name: str | None = None outer_dev_iteration: int | None = None outer_dev_cap: int | None = None inner_analysis: int | None = None inner_analysis_cap: int | None = None elapsed_seconds: float = 0.0 exit_trigger: str | None = None content_blocks: int = 0 thinking_blocks: int = 0 tool_calls: int = 0 errors: int = 0 artifact_outcome: str = "" review_issues_found: bool | None = None routing_note: str | None = None waiting_status_line: str | None = None last_failure_category: str | None = None
[docs] def to_iteration_context(self) -> PhaseIterationContext: """Return a PhaseIterationContext for canonical label rendering.""" return PhaseIterationContext( outer_dev=self.outer_dev_iteration, outer_dev_cap=self.outer_dev_cap, inner_analysis=self.inner_analysis, inner_analysis_cap=self.inner_analysis_cap, )
[docs] @classmethod def from_entry_model( cls, entry: PhaseEntryModel, context: ExitContext | None = None, ) -> PhaseExitModel: """Construct a PhaseExitModel by extending a PhaseEntryModel.""" effective_context = context or ExitContext() return cls( phase_name=entry.phase_name, phase_role=entry.phase_role, agent_name=entry.agent_name, outer_dev_iteration=entry.outer_dev_iteration, outer_dev_cap=entry.outer_dev_cap, inner_analysis=entry.inner_analysis, inner_analysis_cap=entry.inner_analysis_cap, elapsed_seconds=effective_context.elapsed_seconds, exit_trigger=effective_context.exit_trigger, content_blocks=effective_context.content_blocks, thinking_blocks=effective_context.thinking_blocks, tool_calls=effective_context.tool_calls, errors=effective_context.errors, artifact_outcome=effective_context.artifact_outcome, review_issues_found=effective_context.review_issues_found, routing_note=effective_context.routing_note, waiting_status_line=effective_context.waiting_status_line, last_failure_category=effective_context.last_failure_category, )