from datetime import datetime from typing import Any, Literal from uuid import UUID from pydantic import BaseModel, ConfigDict, Field Status = Literal["queued", "dispatched", "in_progress", "blocked", "failed", "completed", "cancelled"] Outcome = Literal["success", "failed", "cancelled"] class ProjectCreate(BaseModel): name: str external_ref: str | None = None class ProjectUpdate(BaseModel): name: str | None = None external_ref: str | None = None class Project(BaseModel): model_config = ConfigDict(from_attributes=True) id: UUID name: str external_ref: str | None = None created_at: datetime updated_at: datetime class WorkCreate(BaseModel): project_id: UUID | None = None type: str description: str payload: dict[str, Any] | None = None priority: int = Field(default=3, ge=1, le=5) assigned_agent: str | None = None created_by: str | None = None class WorkUpdate(BaseModel): status: Status | None = None outcome: Outcome | None = None notes: str | None = None assigned_agent: str | None = None class DispatchLog(BaseModel): model_config = ConfigDict(from_attributes=True) id: UUID work_item_id: UUID dispatched_at: datetime agent: str completed_at: datetime | None = None outcome: Outcome | None = None class WorkItem(BaseModel): model_config = ConfigDict(from_attributes=True) id: UUID project_id: UUID | None = None type: str description: str payload: dict[str, Any] | None = None priority: int status: Status assigned_agent: str | None = None created_by: str | None = None created_at: datetime updated_at: datetime completed_at: datetime | None = None outcome: Outcome | None = None notes: str | None = None dispatch_log: list[DispatchLog] = []