"""Dashboard metrics schemas for KPI and time-series API responses.""" from __future__ import annotations from datetime import datetime from typing import Literal from sqlmodel import SQLModel RUNTIME_ANNOTATION_TYPES = (datetime,) class DashboardSeriesPoint(SQLModel): """Single numeric time-series point.""" period: datetime value: float class DashboardWipPoint(SQLModel): """Work-in-progress point split by task status buckets.""" period: datetime inbox: int in_progress: int review: int class DashboardRangeSeries(SQLModel): """Series payload for a single range/bucket combination.""" range: Literal["24h", "7d"] bucket: Literal["hour", "day"] points: list[DashboardSeriesPoint] class DashboardWipRangeSeries(SQLModel): """WIP series payload for a single range/bucket combination.""" range: Literal["24h", "7d"] bucket: Literal["hour", "day"] points: list[DashboardWipPoint] class DashboardSeriesSet(SQLModel): """Primary vs comparison pair for generic series metrics.""" primary: DashboardRangeSeries comparison: DashboardRangeSeries class DashboardWipSeriesSet(SQLModel): """Primary vs comparison pair for WIP status series metrics.""" primary: DashboardWipRangeSeries comparison: DashboardWipRangeSeries class DashboardKpis(SQLModel): """Topline dashboard KPI summary values.""" active_agents: int tasks_in_progress: int error_rate_pct: float median_cycle_time_hours_7d: float | None class DashboardMetrics(SQLModel): """Complete dashboard metrics response payload.""" range: Literal["24h", "7d"] generated_at: datetime kpis: DashboardKpis throughput: DashboardSeriesSet cycle_time: DashboardSeriesSet error_rate: DashboardSeriesSet wip: DashboardWipSeriesSet