#!/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"""
Generated: {datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')}
| Signal | Value |
|---|---|
| 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} |
| Trace | Agent | Step | Status | Latency | Tokens | Cost |
|---|---|---|---|---|---|---|
| {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')} |