import { useState, useEffect } from 'react' import { motion, AnimatePresence } from 'framer-motion' import { Brain, ChevronDown, ChevronUp, Zap, History } from 'lucide-react' import { useStore } from '../store/useStore' import { fetchPromptHistory } from '../lib/api' const SEED_PROMPT = `You are a SQL expert. Given a natural language question and a SQLite database schema, write a correct SQL query. Rules: - Output ONLY the SQL query, nothing else - No markdown, no code fences, no explanation - Use SQLite syntax - Always qualify column names with table aliases when using JOINs` export function PromptEvolution() { const { currentPrompt, promptGeneration, promptHistory, setPromptData } = useStore() const [expanded, setExpanded] = useState(false) const [historyExpanded, setHistoryExpanded] = useState(false) const [loading, setLoading] = useState(false) const prompt = currentPrompt || SEED_PROMPT const generation = promptGeneration const [queryCount, setQueryCount] = useState(0) const [optimizeEvery, setOptimizeEvery] = useState(4) const [cycleProgress, setCycleProgress] = useState(0) const loadHistory = async () => { setLoading(true) try { const data = await fetchPromptHistory() setPromptData(data) const d = data as Record if (d.queryCount !== undefined) setQueryCount(d.queryCount as number) if (d.optimizeEvery !== undefined) setOptimizeEvery(d.optimizeEvery as number) if (d.cycleProgress !== undefined) setCycleProgress(d.cycleProgress as number) } catch { // noop } finally { setLoading(false) } } useEffect(() => { void loadHistory() // Poll for updates every 30s const interval = setInterval(() => void loadHistory(), 30000) return () => clearInterval(interval) // eslint-disable-next-line react-hooks/exhaustive-deps }, []) return (
{/* Header */} {/* Progress toward next optimization */} {queryCount > 0 && (
{queryCount} queries processed {cycleProgress}/{optimizeEvery} · optimizes every {optimizeEvery}
)} {expanded && ( {/* Prompt preview */}
                {prompt}
              
{/* History button */} {promptHistory.length > 0 && ( )} {/* Generation history */} {historyExpanded && promptHistory.length > 0 && (
Optimization History
{promptHistory.map((snap) => (
Generation {snap.generation} {(snap.score * 100).toFixed(0)}%

{snap.summary}

{snap.timestamp}

))}
)}
{loading && (
Loading history...
)}
)}
) }