from datetime import datetime from typing import Any, Optional from pydantic import BaseModel class TaskCreate(BaseModel): type: str target_scope: dict # {"type": "device", "id": 42} | {"type": "object", "id": 5} | etc. params: dict[str, Any] = {} class TaskEventRead(BaseModel): id: int message: str level: str created_at: datetime model_config = {"from_attributes": True} class TaskResultRead(BaseModel): id: int device_id: int status: str stdout: Optional[str] = None stderr: Optional[str] = None exit_code: Optional[int] = None data: Optional[dict] = None duration_ms: Optional[int] = None executed_at: Optional[datetime] = None model_config = {"from_attributes": True} class TaskRead(BaseModel): id: str type: str status: str target_scope: dict target_label: Optional[str] = None params: dict result: Optional[dict] = None error_message: Optional[str] = None created_by: Optional[int] = None created_at: datetime started_at: Optional[datetime] = None finished_at: Optional[datetime] = None model_config = {"from_attributes": True} class TaskDetail(TaskRead): events: list[TaskEventRead] = [] device_results: list[TaskResultRead] = [] class ActionInfo(BaseModel): name: str display_name: str compatible_categories: list[str] params_schema: list[dict]