import { Badge, Tooltip } from "@cloudflare/kumo"; import type { ReactNode } from "react"; import type { Brand, TokenBudgetState, Usage, UsageSources } from "./contracts.ts"; import { relativeTime } from "./time.ts"; import { tokenNumber, totalTokens, usageTooltip, usageValues } from "./usage.ts"; function SourceFigure({ value, agent, brand, split = false, compact = false, focusable = true, budget, children, }: { value: Usage; agent: string; brand: Brand; split?: boolean; compact?: boolean; focusable?: boolean; budget?: number | null; children?: ReactNode; }) { const fullDetails = `${totalTokens(value).toLocaleString("en-US")} tokens: ${value.inputTokens.toLocaleString("en-US")} in · ${value.outputTokens.toLocaleString("en-US")} out · ${value.source}${value.model ? ` · ${value.model} (reported)` : ""} · as of ${relativeTime(value.at)}. ${usageTooltip(value, agent, brand)}`; return ( }> {compact ? `${tokenNumber(totalTokens(value))} ${value.source}` : ( <> {split ? <> {tokenNumber(value.inputTokens)} in ·{" "} {tokenNumber(value.outputTokens)} out ·{" "} {value.source} by {agent} : <> {budget != null ? `${tokenNumber(totalTokens(value))} / ${tokenNumber(budget)} tokens` : `${tokenNumber(totalTokens(value))} tokens`} {` · ${value.source}`} } )} {!compact && <> {children} as of {relativeTime(value.at)} {split && value.model && {value.model} (reported)} } ); } export function UsageFigures({ usage, agent, brand, split = false, compact = false, focusable = true, }: { usage?: UsageSources; agent: string; brand: Brand; split?: boolean; compact?: boolean; focusable?: boolean; }) { const values = usageValues(usage); if (!values.length) return Not reported; return ( {values.map((value) => )} ); } export function BudgetUsage({ usage, budget, status, agent, brand, }: { usage?: UsageSources; budget?: number | null; status?: TokenBudgetState; agent: string; brand: Brand; }) { if (budget == null) return ; // Core chooses metered first and owns the boundary state; never combine the sources. const value = usage?.metered ?? usage?.reported; const unchecked = !value || status === "unchecked" || status === undefined; const warning = ( }> Budget unchecked ); const label = status === "over" ? "Over budget" : status === "near" ? "Near budget" : "Within budget"; return (
{!value ? <>{warning} : usageValues(usage).map((source) => ( {source === value && (unchecked ? warning : {status !== "within" && }{label} )} ))}
); }