#!/usr/bin/env python3 from __future__ import annotations import json import pathlib from datetime import datetime, timezone ROOT = pathlib.Path(__file__).resolve().parents[2] METRICS = ROOT / ".specify" / "logs" / "cost" / "metrics.jsonl" FALLBACK = ROOT / ".specify" / "logs" / "level5" / "fallback.jsonl" TOOL = ROOT / ".specify" / "logs" / "level5" / "tool-registry.jsonl" PROVIDER = ROOT / ".specify" / "logs" / "level5" / "provider-usage.jsonl" PROJECT_REGISTRY = ROOT / ".specify" / "level5" / "project-registry.json" DASHBOARD = ROOT / "docs" / "output" / "casan" / "central-agentops-dashboard.html" LEGACY_DASHBOARD = ROOT / "docs" / "output" / "casan" / "agentops-dashboard.html" def read_jsonl(path: pathlib.Path) -> list[dict]: if not path.exists(): return [] rows = [] for line in path.read_text(encoding="utf-8").splitlines(): if line.strip(): rows.append(json.loads(line)) return rows metrics = read_jsonl(METRICS) fallback = read_jsonl(FALLBACK) tools = read_jsonl(TOOL) provider_usage = read_jsonl(PROVIDER) project_registry = json.loads(PROJECT_REGISTRY.read_text(encoding="utf-8")) if PROJECT_REGISTRY.exists() else {"projects": []} total_cost = sum(float(row.get("cost_estimate", 0)) for row in metrics) avg_latency = round(sum(int(row.get("latency_ms", 0)) for row in metrics) / max(len(metrics), 1), 2) failures = sum(1 for row in metrics if row.get("status") == "failed") fallback_routes = sum(1 for row in fallback if row.get("route") == "fallback") tool_denies = sum(1 for row in tools if row.get("decision") == "denied") provider_tokens = sum(int(row.get("total_tokens", 0)) for row in provider_usage) provider_cost = sum(float(row.get("cost_usd", 0)) for row in provider_usage) registered_projects = len(project_registry.get("projects", [])) DASHBOARD.parent.mkdir(parents=True, exist_ok=True) DASHBOARD.write_text( f""" CASAN Central AgentOps Dashboard

CASAN Level 5 Central AgentOps Dashboard

Generated: {datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')}

Total Runs
{len(metrics)}
Average Latency
{avg_latency}ms
Estimated Cost
${total_cost:.6f}
Failures
{failures}
Fallback Routes
{fallback_routes}

Provider Usage Telemetry

Provider Runs
{len(provider_usage)}
Provider Tokens
{provider_tokens}
Provider Cost
${provider_cost:.5f}
Registered Projects
{registered_projects}
Tool Denials
{tool_denies}

Governance Signals

SignalValue
Tool registry denials{tool_denies}
Fallback records{len(fallback)}
Tool registry records{len(tools)}
Provider telemetry records{len(provider_usage)}
Registered harness projects{registered_projects}

Recent AgentOps Metrics

{''.join(f"" for m in metrics[-10:])}
TraceAgentStepStatusLatencyTokensCost
{m.get('trace_id')}{m.get('agent')}{m.get('step')}{m.get('status')}{m.get('latency_ms')}{m.get('total_tokens')}{m.get('cost_estimate')}
""", encoding="utf-8", ) LEGACY_DASHBOARD.write_text(DASHBOARD.read_text(encoding="utf-8"), encoding="utf-8") print(f"DASHBOARD_GENERATED {DASHBOARD}")