from dataclasses import dataclass, field from typing import List, Dict, Any, Optional from domain.training.run import Run from domain.training.weekly_snapshot import WeeklySnapshot from domain.training.weekly_trend import WeeklyTrend from domain.runner.profile import RunnerProfile from domain.training.training_recommendation import TrainingRecommendation from domain.goals.goal_trajectory import GoalTrajectory from core.intelligence.runner_intelligence_snapshot import RunnerIntelligenceSnapshot from application.positioning_service import WeeklyPositioning @dataclass class PipelineContext: """ Explicit, typed data contract for the Runner pipeline. Eliminates dynamic field attachments and implicit state. """ # Inputs runs: List[Any] = field(default_factory=list) language: str = "en" runner_profile: Optional[RunnerProfile] = None active_goal: Optional[Any] = None # Session state sessions: Dict[Any, WeeklySnapshot] = field(default_factory=dict) # Computed training data weekly_snapshot: Optional[WeeklySnapshot] = None weekly_trend: Optional[WeeklyTrend] = None # Positioning layer positioning: Optional[WeeklyPositioning] = None recommendation: Optional[TrainingRecommendation] = None goal_trajectory: Optional[GoalTrajectory] = None # Intelligence outputs insights: Dict[str, Any] = field(default_factory=dict) plan: Optional[str] = None summary: Optional[Dict[str, Any]] = None trends: Optional[Any] = None risk_assessment: Optional[Any] = None intelligence_snapshot: Optional[RunnerIntelligenceSnapshot] = None # Intelligence Cache (for reuse) last_positioning: Optional[Any] = None last_insights: Dict[str, Any] = field(default_factory=dict) last_plan: Optional[str] = None last_brief: Optional[str] = None last_focus: Optional[str] = None # Visualization charts: Dict[str, Any] = field(default_factory=dict) # Comparison period_comparison: Optional[Any] = None