import uuid from datetime import date, datetime from typing import Literal from pydantic import BaseModel, ConfigDict from api.schemas.workstream_dependency import WorkstreamDepStub WorkstreamStatus = Literal["todo", "active", "blocked", "completed", "archived"] class WorkstreamCreate(BaseModel): topic_id: uuid.UUID slug: str title: str description: str | None = None status: WorkstreamStatus = "active" owner: str | None = None due_date: date | None = None planning_priority: str | None = None planning_order: int | None = None repo_id: uuid.UUID | None = None # GEMS primary: the owning repository repo_goal_id: uuid.UUID | None = None class WorkstreamUpdate(BaseModel): title: str | None = None description: str | None = None status: WorkstreamStatus | None = None owner: str | None = None due_date: date | None = None planning_priority: str | None = None planning_order: int | None = None repo_id: uuid.UUID | None = None repo_goal_id: uuid.UUID | None = None class WorkstreamRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID topic_id: uuid.UUID repo_id: uuid.UUID | None = None repo_goal_id: uuid.UUID | None = None slug: str title: str description: str | None = None status: WorkstreamStatus owner: str | None = None due_date: date | None = None planning_priority: str | None = None planning_order: int | None = None created_at: datetime updated_at: datetime class WorkstreamWithTaskCounts(WorkstreamRead): tasks_total: int = 0 tasks_todo: int = 0 tasks_in_progress: int = 0 tasks_blocked: int = 0 tasks_done: int = 0 class WorkstreamWithDeps(WorkstreamWithTaskCounts): """WorkstreamWithTaskCounts enriched with dependency graph edges.""" depends_on: list[WorkstreamDepStub] = [] blocks: list[WorkstreamDepStub] = [] blocked_reasons: list[dict] = []