import { useState, useEffect, useCallback } from 'react' interface ProviderStatus { name: string key: string modelCount: number lastUpdated: string | null hasScript: boolean refreshing: boolean } interface BenchmarkSourceStatus { key: string refreshing: boolean } interface BenchmarkStatus { entryCount: number lastUpdated: string | null refreshing: boolean sources?: BenchmarkSourceStatus[] } const BENCHMARK_SOURCE_NAMES: Record = { llmstats: 'LLMStats', hf: 'HF Leaderboard', livebench: 'LiveBench', arena: 'Chatbot Arena', aider: 'Aider', } interface FetchResult { provider: string success: boolean error?: string } function formatAge(iso: string | null): string { if (!iso) return 'never' const diff = Date.now() - new Date(iso).getTime() const mins = Math.floor(diff / 60000) const hours = Math.floor(mins / 60) const days = Math.floor(hours / 24) if (days > 0) return `${days}d ago` if (hours > 0) return `${hours}h ago` if (mins > 0) return `${mins}m ago` return 'just now' } interface Props { onClose: () => void onDataUpdated: () => void } export function ManagementPanel({ onClose, onDataUpdated }: Props) { const [providers, setProviders] = useState([]) const [benchmarks, setBenchmarks] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [results, setResults] = useState>({}) const [bmResult, setBmResult] = useState<{ success: boolean; error?: string } | null>(null) const [bmSourceResults, setBmSourceResults] = useState>({}) const [refreshingBmSource, setRefreshingBmSource] = useState>({}) const [refreshingAll, setRefreshingAll] = useState(false) const [serverAvailable, setServerAvailable] = useState(true) const fetchStatus = useCallback(async () => { try { const res = await fetch('/api/status') if (!res.ok) throw new Error(`HTTP ${res.status}`) const data = await res.json() setProviders(data.providers) if (data.benchmarks) setBenchmarks(data.benchmarks) setServerAvailable(true) setError(null) } catch (e: any) { setServerAvailable(false) setError('Management server not running. Start it with: node server.js') } finally { setLoading(false) } }, []) useEffect(() => { fetchStatus() }, [fetchStatus]) const refreshProvider = async (key: string, name: string) => { setProviders((prev) => prev.map((p) => (p.name === name ? { ...p, refreshing: true } : p)) ) setResults((r) => ({ ...r, [name]: { success: false } })) try { const res = await fetch(`/api/fetch/${key}`, { method: 'POST' }) const data: FetchResult = await res.json() setResults((r) => ({ ...r, [name]: { success: data.success, error: data.error } })) if (data.success) onDataUpdated() } catch { setResults((r) => ({ ...r, [name]: { success: false, error: 'Request failed' } })) } await fetchStatus() } const refreshBenchmarks = async () => { setBenchmarks((b) => b ? { ...b, refreshing: true } : null) setBmResult(null) try { const res = await fetch('/api/fetch/benchmarks', { method: 'POST' }) const data = await res.json() setBmResult({ success: data.success, error: data.error }) if (data.success) onDataUpdated() } catch { setBmResult({ success: false, error: 'Request failed' }) } await fetchStatus() } const refreshBenchmarkSource = async (source: string) => { setRefreshingBmSource((s) => ({ ...s, [source]: true })) setBmSourceResults((r) => ({ ...r, [source]: { success: false } })) try { const res = await fetch(`/api/fetch/benchmarks/${source}`, { method: 'POST' }) const data = await res.json() setBmSourceResults((r) => ({ ...r, [source]: { success: data.success, error: data.error } })) if (data.success) onDataUpdated() } catch { setBmSourceResults((r) => ({ ...r, [source]: { success: false, error: 'Request failed' } })) } setRefreshingBmSource((s) => ({ ...s, [source]: false })) await fetchStatus() } const refreshAll = async () => { setRefreshingAll(true) setResults({}) try { const res = await fetch('/api/fetch', { method: 'POST' }) const data = await res.json() const resultMap: Record = {} for (const r of data.results ?? []) { resultMap[r.provider] = { success: r.success, error: r.error } } setResults(resultMap) onDataUpdated() } catch { setError('Refresh all failed') } setRefreshingAll(false) await fetchStatus() } const scriptCount = providers.filter((p) => p.hasScript).length return (
e.stopPropagation()}>

Data Management

{!serverAvailable && (
Management server offline. Run node server.js in the project root to enable live updates.
)} {loading &&
Loading status…
} {!loading && serverAvailable && ( <>
{providers.map((p) => { const result = results[p.name] const isRefreshing = p.refreshing || refreshingAll return ( ) })}
Provider Models Last updated Status
{p.name} {p.modelCount} {formatAge(p.lastUpdated)} {result ? ( result.success ? ( ✓ updated ) : ( ✗ failed ) ) : ( {p.hasScript ? 'auto' : 'manual'} )} {p.hasScript && ( )}
{benchmarks && ( <>

Benchmark Data

{/* All-sources row */} {/* Per-source rows */} {(benchmarks.sources ?? []).map((src) => { const result = bmSourceResults[src.key] const isRefreshing = src.refreshing || refreshingBmSource[src.key] return ( ) })}
Source Entries Last updated Status
All sources {benchmarks.entryCount.toLocaleString()} {formatAge(benchmarks.lastUpdated)} {bmResult ? ( bmResult.success ? ( ✓ updated ) : ( ✗ failed ) ) : ( auto )}
{BENCHMARK_SOURCE_NAMES[src.key] ?? src.key} {result ? ( result.success ? ( ✓ updated ) : ( ✗ failed ) ) : null}
)} )} {error && !loading &&
{error}
}
) }