/** * @license * Copyright 2025 Vybestack LLC * SPDX-License-Identifier: Apache-2.0 * * Load Balancer Stats Display Component * Issue #489 Phase 8 */ /** * @plan:PLAN-20260603-ISSUE1584.P12 * @requirement:REQ-API-001 * @pseudocode consumer-migration.md lines 10-15 */ import type React from 'react'; import { Box, Text } from 'ink'; import type { ExtendedLoadBalancerStats } from '@vybestack/llxprt-code-providers'; import { Colors } from '../colors.js'; import { useRuntimeApi } from '../contexts/RuntimeContext.js'; import { getBorderStyle } from '../contexts/UnicodeRenderingContext.js'; /** * Get the color for circuit breaker state display. */ function getCircuitBreakerColor(state: string): string { if (state === 'open') return Colors.AccentRed; if (state === 'half-open') return Colors.AccentYellow; return Colors.Foreground; } 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} ); function renderNoProviderManager() { return ( Provider manager not available ); } function renderNoLoadBalancer() { return ( No load balancer profile active. Use /profile load to activate a load balancer profile. ); } function renderNoStatsSupport(activeProviderName: string) { return ( Provider "{activeProviderName}" does not support load balancer statistics. ); } function renderSummaryRows(stats: ExtendedLoadBalancerStats) { return ( <> {stats.profileName}} /> {stats.totalRequests.toLocaleString()} } /> {stats.lastSelected && ( {stats.lastSelected}} /> )} ); } interface BackendMetricsRowProps { metrics: ExtendedLoadBalancerStats['backendMetrics'][string]; cbState: { state: string }; tpm: number; } const BackendMetricsRows: React.FC = ({ metrics, cbState, tpm, }) => ( <> {metrics.requests.toLocaleString()} } isSubtle /> {metrics.successes.toLocaleString()} } isSubtle /> 0 ? Colors.AccentRed : Colors.Foreground} > {metrics.failures.toLocaleString()} } isSubtle /> 0 ? Colors.AccentRed : Colors.Foreground} > {metrics.timeouts.toLocaleString()} } isSubtle /> {metrics.tokens.toLocaleString()} } isSubtle /> {metrics.avgLatencyMs.toFixed(2)} } isSubtle /> {Math.round(tpm).toLocaleString()} } isSubtle /> {cbState.state.toUpperCase()} } isSubtle /> ); function renderBackendSection( backendName: string, metrics: ExtendedLoadBalancerStats['backendMetrics'][string], cbState: { state: string }, tpm: number, ) { return ( {backendName} ); } export const LBStatsDisplay: React.FC = () => { const { getCliProviderManager } = useRuntimeApi(); const providerManager = getCliProviderManager() as ReturnType< typeof getCliProviderManager > | null; if (!providerManager) { return renderNoProviderManager(); } const activeProvider = providerManager.getActiveProvider() as ReturnType< typeof providerManager.getActiveProvider > | null; if (!activeProvider || activeProvider.name !== 'load-balancer') { return renderNoLoadBalancer(); } const lbProvider = providerManager.getProviderByName('load-balancer') as | { getStats?: () => ExtendedLoadBalancerStats } | undefined; if ( !lbProvider || !('getStats' in lbProvider) || typeof lbProvider.getStats !== 'function' ) { return renderNoStatsSupport(activeProvider.name); } const stats = lbProvider.getStats(); const backends = Object.keys(stats.backendMetrics); return ( Load Balancer Statistics {renderSummaryRows(stats)} Backend Metrics {backends.map((backendName) => { const metrics = stats.backendMetrics[backendName]; const cbState = stats.circuitBreakerStates[backendName] ?? { state: 'closed' as const, }; const rawTpm = stats.currentTPM[backendName]; const tpm = rawTpm !== 0 && !Number.isNaN(rawTpm) ? rawTpm : 0; return renderBackendSection(backendName, metrics, cbState, tpm); })} ); };