import * as ScrollArea from '@radix-ui/react-scroll-area' import { motion } from 'framer-motion' import { Activity, BarChart3, Bot, Clock3, FileText, Layers3, MessageSquareText, Sparkles, X, } from 'lucide-react' import Button from './Button' export default function WorkspacePanel({ sidePanel, selectedFile, stats, insights, isAuthenticated, runtimeStatus, activeProvider, activeModel, onClose, onPreviewAnalytics, onAskAboutFile, }) { const isVisible = sidePanel && (sidePanel !== 'file' || selectedFile) if (!isVisible) return null return ( <>

{sidePanel === 'file' ? 'File Preview' : 'Workspace Insights'}

{sidePanel === 'file' ? 'Review extracted file context beside the conversation.' : 'Quick status for the current model, history, and workspace health.'}

{sidePanel === 'file' && selectedFile ? (

{selectedFile.filename}

{selectedFile.kind}

Extracted context

                    {selectedFile.extracted_text || 'No extracted text available.'}
                  
) : (
)}
) } function formatRuntimeLabel(status) { if (status === 'ready') return 'Ready' if (status === 'degraded') return 'Degraded' return 'Checking' } function formatRuntimeNote(runtimeStatus) { if (!runtimeStatus) return 'Backend status is still loading.' const mongo = runtimeStatus.checks?.mongo || 'unknown' const vectorMemory = runtimeStatus.checks?.vector_memory || 'unknown' const providerCount = runtimeStatus.enabled_providers?.length || 0 return `Mongo: ${mongo} / Memory: ${vectorMemory} / Providers: ${providerCount} / v${runtimeStatus.version || 'unknown'}` } function StatCard({ icon: Icon, label, value, note, tone = 'default' }) { const iconToneClass = tone === 'accent' ? 'bg-accent/10 text-accent' : tone === 'danger' ? 'bg-danger/10 text-danger' : 'bg-accent/10 text-accent' return (

{label}

{value}

{note}

) } function InsightSection({ title, items, emptyLabel, valueFormatter = (value) => value }) { const entries = Array.isArray(items) ? items.map((item) => ({ label: item, value: null })) : Object.entries(items || {}).slice(0, 5).map(([label, value]) => ({ label, value })) return (

{title}

{entries.length ? (
{entries.map((entry) => (
{entry.label} {valueFormatter && entry.value !== null ? ( {valueFormatter(entry.value)} ) : null}
))}
) : (

{emptyLabel}

)}
) }