# [DEF:TasksRouter:Module] # @SEMANTICS: api, router, tasks, create, list, get # @PURPOSE: Defines the FastAPI router for task-related endpoints, allowing clients to create, list, and get the status of tasks. # @LAYER: UI (API) # @RELATION: Depends on the TaskManager. It is included by the main app. from typing import List, Dict, Any from fastapi import APIRouter, Depends, HTTPException, status from pydantic import BaseModel from ...core.task_manager import TaskManager, Task from ...dependencies import get_task_manager router = APIRouter() class CreateTaskRequest(BaseModel): plugin_id: str params: Dict[str, Any] class ResolveTaskRequest(BaseModel): resolution_params: Dict[str, Any] @router.post("/", response_model=Task, status_code=status.HTTP_201_CREATED) async def create_task( request: CreateTaskRequest, task_manager: TaskManager = Depends(get_task_manager) ): """ Create and start a new task for a given plugin. """ try: task = await task_manager.create_task( plugin_id=request.plugin_id, params=request.params ) return task except ValueError as e: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(e)) @router.get("/", response_model=List[Task]) async def list_tasks( task_manager: TaskManager = Depends(get_task_manager) ): """ Retrieve a list of all tasks. """ return task_manager.get_all_tasks() @router.get("/{task_id}", response_model=Task) async def get_task( task_id: str, task_manager: TaskManager = Depends(get_task_manager) ): """ Retrieve the details of a specific task. """ task = task_manager.get_task(task_id) if not task: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Task not found") return task @router.post("/{task_id}/resolve", response_model=Task) async def resolve_task( task_id: str, request: ResolveTaskRequest, task_manager: TaskManager = Depends(get_task_manager) ): """ Resolve a task that is awaiting mapping. """ try: await task_manager.resolve_task(task_id, request.resolution_params) return task_manager.get_task(task_id) except ValueError as e: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(e)) # [/DEF]