"""Executor monitoring API router (P1-9). Endpoints for local executor heartbeat, status, and task overview. """ from typing import Any, Dict, Optional from fastapi import APIRouter from pydantic import BaseModel, Field from ..services.task_manager import get_task_manager router = APIRouter(prefix="/api/executor", tags=["executor"]) class HeartbeatRequest(BaseModel): executor_id: str = Field(..., description="Unique executor identifier") status: str = Field(default="idle", description="idle / running / error") current_task: Optional[str] = Field(default=None, description="Current task_id") progress: Optional[Dict[str, Any]] = Field(default=None, description="Progress data") @router.post("/heartbeat") def executor_heartbeat(request: HeartbeatRequest): """Local executor reports heartbeat and status.""" manager = get_task_manager() result = manager.executor_heartbeat( executor_id=request.executor_id, status=request.status, current_task=request.current_task, progress=request.progress, ) return result @router.get("/status") def get_executor_status(): """Get all registered executors and their online status.""" manager = get_task_manager() return manager.get_executor_status() @router.get("/overview") def get_task_overview(): """Get task overview statistics for monitoring dashboard.""" manager = get_task_manager() return manager.get_overview()