'use client'; import { memo } from 'react'; import { Tooltip, TooltipContent, TooltipTrigger } from '@kandev/ui/tooltip'; import { cn } from '@/lib/utils'; import { useSessionContextWindow } from '@/hooks/domains/session/use-session-context-window'; type TokenUsageDisplayProps = { sessionId: string | null; className?: string; }; function formatNumber(num: number): string { if (num >= 1_000_000) { return `${(num / 1_000_000).toFixed(1)}M`; } if (num >= 1_000) { return `${(num / 1_000).toFixed(1)}K`; } return num.toLocaleString(); } function getCircleColor(efficiency: number): string { if (efficiency >= 90) return 'text-yellow-500'; if (efficiency >= 75) return 'text-yellow-300'; if (efficiency >= 50) return 'text-blue-500'; return 'text-blue-300'; } export const TokenUsageDisplay = memo(function TokenUsageDisplay({ sessionId, className }: TokenUsageDisplayProps) { const contextWindow = useSessionContextWindow(sessionId); if (!contextWindow || contextWindow.size === 0) return null; const { size, used, efficiency } = contextWindow; const usagePercent = Math.min(efficiency, 100); const progress = usagePercent / 100; // SVG circle parameters const radius = 10; const strokeWidth = 2.5; const circumference = 2 * Math.PI * radius; const strokeDashoffset = circumference * (1 - progress); return (
{efficiency.toFixed(0)}% ({formatNumber(used)} / {formatNumber(size)})
); });