import { useTranslation } from 'react-i18next'; interface ContextUsageGaugeProps { promptTokens?: number | null; limitTokens?: number | null; jobStatus?: string; /** * compact: 入力欄の直上に常時表示する低プロファイルのバー。概要タブのカード型 * (既定)と同じ色・比率ロジックを共有しつつ、薄い 1 行表示にする。 */ compact?: boolean; } function formatNumber(n: number): string { return n.toLocaleString('en-US'); } function pickColorClass(ratio: number): string { if (ratio >= 0.95) return 'bg-red-500'; if (ratio >= 0.85) return 'bg-orange-500'; if (ratio >= 0.70) return 'bg-amber-500'; return 'bg-emerald-500'; } function pickLabel(jobStatus: string | undefined): string { switch (jobStatus) { case 'succeeded': case 'failed': case 'cancelled': return 'Context usage at finish'; case 'waiting_human': case 'waiting_subtasks': return 'Context usage (paused)'; default: return 'Context usage'; } } export function ContextUsageGauge({ promptTokens, limitTokens, jobStatus, compact }: ContextUsageGaugeProps) { const { t } = useTranslation('detail'); if (!limitTokens || limitTokens <= 0) return null; const tokens = typeof promptTokens === 'number' ? promptTokens : 0; const awaiting = typeof promptTokens !== 'number'; const ratio = Math.min(1, Math.max(0, tokens / limitTokens)); const percent = Math.round(ratio * 100); const remaining = Math.max(0, limitTokens - tokens); const colorClass = pickColorClass(ratio); const label = pickLabel(jobStatus); if (compact) { return (