"""Pydantic schemas for the Tasks plugin.""" from __future__ import annotations from datetime import datetime from typing import Any from pydantic import BaseModel, Field TASK_STATUSES = "^(open|in_progress|review|blocked|done|cancelled)$" TASK_TYPES = "^(todo|approval|follow_up|review|goal|milestone|agent_subtask)$" ASSIGNEE_TYPES = "^(user|agent|group)$" CREATOR_TYPES = "^(user|agent|workflow|system)$" class TaskCreate(BaseModel): """Schema for creating a task.""" title: str = Field(..., min_length=1, max_length=255) description: str | None = None status: str = Field(default="open", pattern=TASK_STATUSES) priority: str = Field(default="medium", pattern="^(low|medium|high|urgent)$") due_date: datetime | None = None assigned_to: str | None = None contact_id: str | None = None # F.14 polymorphic fields assignee_type: str = Field(default="user", pattern=ASSIGNEE_TYPES) assignee_id: str | None = None entity_type: str | None = None entity_id: str | None = None creator_type: str = Field(default="user", pattern=CREATOR_TYPES) creator_id: str | None = None parent_task_id: str | None = None depends_on: list[str] = Field(default_factory=list) task_type: str = Field(default="todo", pattern=TASK_TYPES) success_criteria: dict[str, Any] | None = None target_date: datetime | None = None progress: int = Field(default=0, ge=0, le=100) class TaskUpdate(BaseModel): """Schema for updating a task.""" title: str | None = Field(default=None, min_length=1, max_length=255) description: str | None = None status: str | None = Field(default=None, pattern=TASK_STATUSES) priority: str | None = Field(default=None, pattern="^(low|medium|high|urgent)$") due_date: datetime | None = None assigned_to: str | None = None contact_id: str | None = None assignee_type: str | None = Field(default=None, pattern=ASSIGNEE_TYPES) assignee_id: str | None = None entity_type: str | None = None entity_id: str | None = None creator_type: str | None = Field(default=None, pattern=CREATOR_TYPES) creator_id: str | None = None parent_task_id: str | None = None depends_on: list[str] | None = None task_type: str | None = Field(default=None, pattern=TASK_TYPES) success_criteria: dict[str, Any] | None = None target_date: datetime | None = None progress: int | None = Field(default=None, ge=0, le=100) class TaskAssignRequest(BaseModel): """Schema for assigning a task (polymorphic).""" assigned_to: str | None = None assignee_type: str = Field(default="user", pattern=ASSIGNEE_TYPES) assignee_id: str | None = None class TaskStatusRequest(BaseModel): """Schema for updating task status.""" status: str = Field(..., pattern=TASK_STATUSES) class TaskDependencyRequest(BaseModel): """Schema for adding/removing a task dependency.""" depends_on: str = Field(..., description="Task ID this task depends on") class TaskResponse(BaseModel): """Schema for task response.""" id: str title: str description: str | None = None status: str priority: str due_date: datetime | None = None assigned_to: str | None = None contact_id: str | None = None assignee_type: str = "user" assignee_id: str | None = None entity_type: str | None = None entity_id: str | None = None creator_type: str = "user" creator_id: str | None = None parent_task_id: str | None = None depends_on: list[str] = Field(default_factory=list) task_type: str = "todo" success_criteria: dict[str, Any] | None = None target_date: datetime | None = None progress: int = 0 created_by: str | None = None created_at: datetime updated_at: datetime class TaskListResponse(BaseModel): """Paginated task list response.""" items: list[TaskResponse] total: int page: int page_size: int