import type { ReactNode } from "react";
import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover.js";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "../ui/tooltip.js";
import { cn } from "../utils.js";
import { formatContextTokens } from "./format.js";
import {
fallbackContextTranslate,
type ContextManifestViewData,
type ContextTranslate,
} from "./types.js";
function ContextDonut({ pct, advisory }: { pct: number; advisory: boolean }) {
const radius = 7.5;
const circumference = 2 * Math.PI * radius;
const displayPct = Math.max(3, Math.min(100, pct));
const dashOffset = circumference - (displayPct / 100) * circumference;
return (
);
}
export function ContextMeterView({
manifest,
contextWindow,
open,
onOpenChange,
children,
translate = fallbackContextTranslate,
}: {
manifest: ContextManifestViewData;
contextWindow: number;
open: boolean;
onOpenChange: (open: boolean) => void;
children: ReactNode;
translate?: ContextTranslate;
}) {
const pct = Math.min(
100,
Math.round((manifest.totalTokens / contextWindow) * 100),
);
const { conversationTokens, systemTokens } = manifest;
return (
{translate("agentChat.contextMeter.summary", {
defaultValue: "Context {{percent}}% ยท {{totalTokens}}",
percent: pct,
totalTokens: formatContextTokens(manifest.totalTokens),
})}
{systemTokens > 0
? translate("agentChat.contextMeter.summaryBreakdown", {
defaultValue:
" ({{systemTokens}} system + {{conversationTokens}} conversation)",
systemTokens: formatContextTokens(systemTokens),
conversationTokens: formatContextTokens(conversationTokens),
})
: ""}
{children}
);
}