from pydantic import BaseModel, Field from typing import Optional class NotificationDecision(BaseModel): """Structured decision returned by NotificationReaderAgent.""" action: str = Field(..., description="Action to take: 'PROCESS_ISSUE', 'PROCESS_PR', or 'SKIP'") owner: str = Field(default="", description="Repository owner") repo: str = Field(default="", description="Repository name") number: int = Field(default=0, description="Issue or PR number") reason: str = Field(..., description="Reason for the routing decision") class CoordinatorDecision(BaseModel): """Structured decision returned by CoordinatorAgent.""" action: str = Field(..., description="Action to take: 'PROPOSE_PLAN', 'EXECUTE_PLAN', 'ANSWER_QUESTION', 'CLOSE_ISSUE', 'NO_ACTION'") issue_number: int = Field(default=0, description="Issue number") plan: Optional[str] = Field(default=None, description="Proposed or approved implementation plan") answer: Optional[str] = Field(default=None, description="Answer to question") comment: Optional[str] = Field(default=None, description="Closing comment") class ExecutionPlan(BaseModel): """Structured implementation plan generated by PlanningAgent.""" issue_number: int = Field(..., description="Target issue number") title: str = Field(..., description="Plan title") steps: list[str] = Field(default_factory=list, description="Step-by-step implementation tasks") summary: str = Field(default="", description="Summary of proposed changes") class CodingTaskResult(BaseModel): """Structured execution result returned by CodingAgent.""" status: str = Field(..., description="Execution status: 'SUCCESS', 'FAILED', or 'PARTIAL'") summary: str = Field(default="", description="Summary of completed coding work") modified_files: list[str] = Field(default_factory=list, description="List of modified or created files") error_message: Optional[str] = Field(default=None, description="Error message if execution failed")