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