/** * @license * Copyright 2025 Vybestack LLC * SPDX-License-Identifier: Apache-2.0 */ /** * Reads cache statistics from the canonical session snapshot * (SessionMetricsAggregator via uiTelemetryService.getSessionSnapshot()). * This is the single source of truth — not the provider tracker. */ import type React from 'react'; import { Box, Text } from 'ink'; import { uiTelemetryService } from '@vybestack/llxprt-code-telemetry'; import { useSessionStats } from '../contexts/SessionContext.js'; import { theme } from '../semantic-colors.js'; import { computeCachedTokenRatio } from '../utils/computeStats.js'; import { getBorderStyle } from '../contexts/UnicodeRenderingContext.js'; const METRIC_COL_WIDTH = 35; const VALUE_COL_WIDTH = 20; interface StatRowProps { title: string; value: string | React.ReactElement; isSubtle?: boolean; } const StatRow: React.FC = ({ title, value, isSubtle = false, }) => ( {isSubtle ? ` ↳ ${title}` : title} {value} ); interface NoStatsBoxProps { message: string; } const NoStatsBox: React.FC = ({ message }) => ( {message} ); const CacheStatsHeader: React.FC = () => ( <> Cache Stats ); export const CacheStatsDisplay: React.FC = () => { useSessionStats(); const snap = uiTelemetryService.getSessionSnapshot(); if (!snap.hasReliableCacheReads && !snap.hasReliableCacheWrites) { return ( ); } const cacheReads = snap.totalCacheReads; const cacheWrites = snap.totalCacheWrites; const requestsWithReads = snap.requestsWithCacheReads; const requestsWithWrites = snap.requestsWithCacheWrites; const cachedTokenRatio = computeCachedTokenRatio( snap.totalCachedTokens, snap.totalInputTokens, ); return ( {snap.hasReliableCacheReads && ( )} {snap.hasReliableCacheWrites && cacheWrites !== null && ( )} {snap.hasReliableCacheReads && ( 0 ? theme.status.success : theme.text.primary } > {cachedTokenRatio.toFixed(1)}% } /> )} {snap.hasReliableCacheReads && ( {requestsWithReads.toLocaleString()} } /> )} {snap.hasReliableCacheWrites && ( {requestsWithWrites.toLocaleString()} } /> )} ); };