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}
)}
))}
);
}