/** * @license * Copyright 2025 Google LLC * SPDX-License-Identifier: Apache-2.0 */ import React from 'react'; import { Box, Text } from 'ink'; import { Colors } from '../colors.js'; import { formatDuration } from '../utils/formatters.js'; import { CumulativeStats } from '../contexts/SessionContext.js'; // --- Constants --- const COLUMN_WIDTH = '48%'; // --- Prop and Data Structures --- interface StatsDisplayProps { stats: CumulativeStats; lastTurnStats: CumulativeStats; duration: string; } interface FormattedStats { inputTokens: number; outputTokens: number; toolUseTokens: number; thoughtsTokens: number; cachedTokens: number; totalTokens: number; } // --- Helper Components --- /** * Renders a single row with a colored label on the left and a value on the right. */ const StatRow: React.FC<{ label: string; value: string | number; valueColor?: string; }> = ({ label, value, valueColor }) => ( {label} {value} ); /** * Renders a full column for either "Last Turn" or "Cumulative" stats. */ const StatsColumn: React.FC<{ title: string; stats: FormattedStats; isCumulative?: boolean; }> = ({ title, stats, isCumulative = false }) => { const cachedDisplay = isCumulative && stats.totalTokens > 0 ? `${stats.cachedTokens.toLocaleString()} (${((stats.cachedTokens / stats.totalTokens) * 100).toFixed(1)}%)` : stats.cachedTokens.toLocaleString(); const cachedColor = isCumulative && stats.cachedTokens > 0 ? Colors.AccentGreen : undefined; return ( {title} {/* Divider Line */} ); }; // --- Main Component --- export const StatsDisplay: React.FC = ({ stats, lastTurnStats, duration, }) => { const lastTurnFormatted: FormattedStats = { inputTokens: lastTurnStats.promptTokenCount, outputTokens: lastTurnStats.candidatesTokenCount, toolUseTokens: lastTurnStats.toolUsePromptTokenCount, thoughtsTokens: lastTurnStats.thoughtsTokenCount, cachedTokens: lastTurnStats.cachedContentTokenCount, totalTokens: lastTurnStats.totalTokenCount, }; const cumulativeFormatted: FormattedStats = { inputTokens: stats.promptTokenCount, outputTokens: stats.candidatesTokenCount, toolUseTokens: stats.toolUsePromptTokenCount, thoughtsTokens: stats.thoughtsTokenCount, cachedTokens: stats.cachedContentTokenCount, totalTokens: stats.totalTokenCount, }; return ( Stats {/* Left column for "Last Turn" duration */} {/* Right column for "Cumulative" durations */} ); };