"""Task schemas for API validation.""" import uuid from datetime import datetime from typing import Any from pydantic import BaseModel, ConfigDict, Field from app.models.task import TaskStatus class TaskCreate(BaseModel): """ Schema for creating a new task. Supported task types and their expected payloads: **FILE_WRITE** - Write content to a file payload: {"path": "/absolute/path", "content": "file content"} **ENV_UPDATE** - Update key/value pairs in a .env file payload: {"path": "/path/to/.env", "updates": {"KEY": "value"}} **DOCKER_RELOAD** - Reload a Docker Compose stack payload: {"compose_dir": "/path/to/compose/dir"} **COMPOSITE** - Execute a sequence of sub-tasks payload: {"sequence": [{"task": "FILE_WRITE", "payload": {...}}, ...]} Legacy types (still supported): - provision_server, configure_keycloak, configure_minio, etc. Note: Payload validation is performed agent-side. The orchestrator accepts any dict payload to allow flexibility and forward compatibility. """ tenant_id: uuid.UUID type: str = Field( ..., min_length=1, max_length=100, description="Task type (FILE_WRITE, ENV_UPDATE, DOCKER_RELOAD, COMPOSITE, etc.)", ) payload: dict[str, Any] = Field( default_factory=dict, description="Task-specific payload (see docstring for formats)", ) class TaskUpdate(BaseModel): """Schema for updating a task (status and result only).""" status: TaskStatus | None = None result: dict[str, Any] | None = None class TaskResponse(BaseModel): """Schema for task response.""" model_config = ConfigDict(from_attributes=True) id: uuid.UUID tenant_id: uuid.UUID agent_id: uuid.UUID | None type: str payload: dict[str, Any] status: str result: dict[str, Any] | None created_at: datetime updated_at: datetime