import { useMemo } from "react"; import type { Agent } from "../api"; import "./AgentTokenStatsPanel.css"; interface AgentTokenStatsPanelProps { agents: Agent[]; } interface AgentTokenRow { id: string; name: string; inputTokens: number; outputTokens: number; totalTokens: number; } function normalizeTokenCount(value: number | undefined): number { return typeof value === "number" && Number.isFinite(value) ? value : 0; } function formatTokenCount(value: number): string { return value.toLocaleString(); } export function AgentTokenStatsPanel({ agents }: AgentTokenStatsPanelProps) { const { rows, totalInputTokens, totalOutputTokens, totalTokens } = useMemo(() => { const computedRows = agents .map((agent): AgentTokenRow => { const inputTokens = normalizeTokenCount(agent.totalInputTokens); const outputTokens = normalizeTokenCount(agent.totalOutputTokens); return { id: agent.id, name: agent.name, inputTokens, outputTokens, totalTokens: inputTokens + outputTokens, }; }) .sort((a, b) => b.totalTokens - a.totalTokens || a.name.localeCompare(b.name) || a.id.localeCompare(b.id)); return { rows: computedRows, totalInputTokens: computedRows.reduce((sum, row) => sum + row.inputTokens, 0), totalOutputTokens: computedRows.reduce((sum, row) => sum + row.outputTokens, 0), totalTokens: computedRows.reduce((sum, row) => sum + row.totalTokens, 0), }; }, [agents]); const hasUsageData = totalTokens > 0; return (

Token Usage by Agent

Input Tokens {formatTokenCount(totalInputTokens)}
Output Tokens {formatTokenCount(totalOutputTokens)}
Combined Tokens {formatTokenCount(totalTokens)}
{hasUsageData ? (
{rows.map((row) => ( ))}
Agent Input Output Total
{row.name} {row.id} {formatTokenCount(row.inputTokens)} {formatTokenCount(row.outputTokens)} {formatTokenCount(row.totalTokens)}
) : (
No token usage recorded yet. Token totals appear here once agents run.
)}
); }