feat(orchestrator): authoritative failure-count badge endpoint (DEBT-042)
New GET /api/v1/orchestrator/events/stats?since=1h&success=false&kind=... backed by repo.count_orchestrator_failures(since_ts, kind), which counts failed rows across both orchestrator_events and orchestrator_emails since the cutoff. Window parser accepts ^\d+[smhd]$, capped at 7d. Today only success=false is accepted on this surface so the endpoint isn't accidentally repurposed before the next consumer is properly designed. Orchestrator.tsx polls the endpoint on mount + every 30 s and renders the authoritative DB-derived count instead of deriving from the in-memory SSE buffer + one paginated page (which silently excluded failures older than the local window).
This commit is contained in:
@@ -1131,6 +1131,17 @@ class BaseRepository(ABC):
|
||||
"""Total orchestrator-event rows, optionally filtered by kind."""
|
||||
raise NotImplementedError
|
||||
|
||||
async def count_orchestrator_failures(
|
||||
self,
|
||||
*,
|
||||
since_ts: Any,
|
||||
kind: Optional[str] = None,
|
||||
) -> int:
|
||||
"""Count failed orchestrator activity since *since_ts*, across
|
||||
both event + email tables. Backs the dashboard's failure-count
|
||||
badge (DEBT-042)."""
|
||||
raise NotImplementedError
|
||||
|
||||
async def prune_orchestrator_events(self, per_dst_cap: int = 10000) -> int:
|
||||
"""Trim per-``dst_decky_uuid`` rows to a cap. Returns deleted count.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user