""" Stats API endpoints for Archon (Refactored - Lean Controller) Hardened for Phase 4.6.59 - Ensures no 404s for Admin HUD. """ from fastapi import APIRouter, Depends from ..auth.dependencies import requires_permission from ..auth.permissions import TASK_READ_TEAM from ..config.logfire_config import get_logger from ..services.stats import StatsService from ..utils import get_supabase_client logger = get_logger(__name__) router = APIRouter(prefix="/api/stats", tags=["stats"]) stats_service = StatsService() @router.get("/commander-trends", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_commander_trends(): try: return await stats_service.get_commander_trends() except Exception as e: logger.error(f"Commander trends failed: {e}") return [] @router.get("/collab-synergy", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_collab_synergy(): try: return await stats_service.get_collab_synergy() except Exception as e: logger.error(f"API: Collab synergy fetch failed: {e}") return {"nodes": [], "matrix": [], "error": str(e)} @router.get("/sla-reliability", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_sla_reliability(): try: return await stats_service.get_sla_reliability() except Exception as e: logger.error(f"API: SLA Reliability failed: {e}") return {"current_sla": 0, "trend": [], "error": str(e)} @router.get("/force-readiness", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_force_readiness(): try: return await stats_service.get_force_readiness() except Exception as e: logger.error(f"API: Force readiness failed: {e}") return {"baseline": 0, "trend": [], "error": str(e)} @router.get("/business-risks", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_business_risks(): try: return await stats_service.get_business_risks() except Exception as e: logger.error(f"API: Business risks fetch failed: {e}") return [] @router.get("/health-trend", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_health_trend(): try: from ..services.health_service import HealthService return await HealthService().get_health_history(days=30) except Exception as e: logger.error(f"API: Health trend fetch failed: {e}") return {"trend": [], "audit": [], "error": str(e)} @router.get("/system-overview", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_system_overview(): try: return await stats_service.get_system_health_overview() except Exception as e: logger.error(f"Failed system overview: {e}") return {"status": "unknown", "error": str(e)} @router.get("/overview", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) @router.get("/ai-usage", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_ai_usage(): try: return await stats_service.get_detailed_ai_usage(days=30) except Exception as e: logger.error(f"Failed to get AI usage: {e}") return {"total_monthly_tokens": 0, "total_cost_usd": 0, "usage_percentage": 0} @router.get("/token-usage/details", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_token_usage_details(days: int = 7): try: return await stats_service.get_recent_token_usage(limit=100) except Exception: return [] @router.get("/token-usage/recent", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_recent_token_usage(limit: int = 20): try: return await stats_service.get_recent_token_usage(limit=limit) except Exception: return [] @router.get("/knowledge-roi", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_knowledge_roi(): try: res = await stats_service.get_knowledge_roi() return res if res else {"roi": 0, "active_nodes": 0} except Exception: return {"roi": 0, "active_nodes": 0} @router.get("/ethics-audit-queue", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_ethics_audit_queue(): try: return {"violations": [], "status": "clear"} except Exception: return {"violations": [], "status": "error"} @router.get("/tasks-by-status", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_tasks_by_status(): """Get the count of tasks grouped by status.""" try: supabase = get_supabase_client() response = supabase.table("archon_tasks").select("status").execute() counts: dict[str, int] = {} for row in response.data: s = row.get("status", "unknown") counts[s] = counts.get(s, 0) + 1 return [{"name": k, "value": v} for k, v in counts.items()] except Exception as e: logger.error(f"Failed to get task stats: {e}") return [] @router.get("/member-performance", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_member_performance(): """Get the count of COMPLETED tasks grouped by assignee.""" try: return await stats_service.get_member_performance() except Exception as e: logger.error(f"Failed to get performance stats: {e}") return [] @router.get("/agent-xp", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_agent_xp(): """Agent Experience (XP) & Level Ranking HUD (Phase 4.6.8).""" try: return await stats_service.get_agent_xp_stats() except Exception as e: logger.error(f"Failed to get agent xp stats: {e}") return [] @router.get("/consolidated", dependencies=[Depends(requires_permission(TASK_READ_TEAM))]) async def get_consolidated_stats(): """Consolidated Strategic Nexus dashboard state (Phase 5.5.7).""" try: from src.agents.nexus_oracle_agent import NexusDependencies, NexusOracleAgent agent = NexusOracleAgent() deps = NexusDependencies(request_id="nexus-consolidated-request") result = await agent.run( user_prompt="Analyze the gathered telemetry and operational details. Synthesize them into the ConsolidatedNexusState schema.", deps=deps ) return result except Exception as e: logger.error(f"Failed to compile consolidated stats: {e}") return { "system_status": "YELLOW", "health_score": 50, "short_term_kpis": {"error": str(e)}, "long_term_trends": {}, "main_bottleneck": "NexusOracleAgent run execution failed.", "recommended_actions": [] }