# models.py from typing import List, Dict, Any, Optional, Literal from pydantic import BaseModel, Field from enum import Enum class TaskStatus(str, Enum): PENDING = "pending" CODING = "coding" REVIEW = "review" REWORK = "rework" APPROVED = "approved" REJECTED = "rejected" FAILED = "failed" class ReviewComment(BaseModel): line: Optional[int] = None file: Optional[str] = None severity: Literal["critical", "major", "minor", "suggestion", "warning", "info"] = "major" text: str class ReviewResult(BaseModel): status: Literal["approved", "changes_requested", "rejected"] comments: List[ReviewComment] = Field(default_factory=list) summary: str class CodeSolution(BaseModel): files: Dict[str, str] = Field(default_factory=dict) # filename -> content description: str tests: Dict[str, str] = Field(default_factory=dict) # test_filename -> content class IterationRecord(BaseModel): """Запись одной итерации""" iteration: int timestamp: str agent: Literal["developer", "reviewer"] action: str # "start", "complete", "error" input_summary: Optional[str] = None output_summary: Optional[str] = None details: Dict[str, Any] = Field(default_factory=dict) error: Optional[str] = None class Task(BaseModel): id: str requirement: str status: TaskStatus = TaskStatus.PENDING iteration: int = 0 solution: Optional[CodeSolution] = None last_review: Optional[ReviewResult] = None error_log: List[str] = Field(default_factory=list) history: List[IterationRecord] = Field(default_factory=list) # <-- новая история