from datetime import datetime from typing import Optional, Dict from sqlmodel import SQLModel, Field, Column, JSON from enum import Enum class LogStatus(str, Enum): NEW = "NEW" VERIFYING = "VERIFYING" CANNOT_REPRODUCE = "CANNOT_REPRODUCE" PENDING_FIX = "PENDING_FIX" FIXING = "FIXING" FIXED = "FIXED" VERIFIED = "VERIFIED" DEPLOYED = "DEPLOYED" FIX_FAILED = "FIX_FAILED" class ErrorLog(SQLModel, table=True): id: Optional[int] = Field(default=None, primary_key=True) project_id: str = Field(index=True) environment: str level: str # Error Details error_type: str error_message: str file_path: str line_number: int stack_trace: str = Field(sa_column=Column(JSON)) # Store full stack trace # Context context: Dict = Field(default={}, sa_column=Column(JSON)) # Versioning version: Optional[str] = None commit_hash: Optional[str] = None # Meta timestamp: datetime = Field(default_factory=datetime.utcnow) fingerprint: str = Field(unique=True, index=True) # project_id + error_type + file_path + line_number # Status Tracking status: LogStatus = Field(default=LogStatus.NEW) retry_count: int = Field(default=0) # Relationships could be added here (e.g., to a RepairTask table if 1:N) # For simplicity, we track status on the Log itself for now. # Pydantic Models for API class ErrorLogCreate(SQLModel): project_id: str environment: str level: str timestamp: Optional[datetime] = None version: Optional[str] = None commit_hash: Optional[str] = None error: Dict # {type, message, file_path, line_number, stack_trace} context: Optional[Dict] = {}