'use client'; import { useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { motion, AnimatePresence } from 'framer-motion'; import { Zap, Target, ListOrdered, Share2, RefreshCw } from 'lucide-react'; import { apiClient } from '@/lib/api'; interface SimulationSummary { simulation_id: string; user_input: string; status: string; scenarios: number; elapsed_seconds: number; created_at: number; } export default function SimulationPage() { const router = useRouter(); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [simulations, setSimulations] = useState([]); const [refreshing, setRefreshing] = useState(false); const [form, setForm] = useState({ title: '', seedText: '', predictionGoal: '' }); const loadSimulations = useCallback(async () => { setRefreshing(true); try { const data = await apiClient.getSimulations(); const summaries: SimulationSummary[] = (Array.isArray(data) ? data : []).map((sim: any) => ({ simulation_id: sim.simulation_id, user_input: sim.user_input || sim.title || '', status: sim.status, scenarios: sim.scenarios || 0, elapsed_seconds: sim.elapsed_seconds || 0, created_at: sim.created_at || 0, })); setSimulations(summaries); } catch { setSimulations([]); } finally { setRefreshing(false); } }, []); useEffect(() => { loadSimulations(); }, [loadSimulations]); const handleSubmit = async () => { if (!form.title || !form.seedText || !form.predictionGoal) { setError('All simulation parameters are required.'); return; } setLoading(true); setError(null); try { const userInput = `${form.title}. ${form.seedText}. Goal: ${form.predictionGoal}`; const result = await apiClient.runNativeSimulation(userInput, { title: form.title, seed_text: form.seedText, prediction_goal: form.predictionGoal, }); if (result.simulation_id) { router.push(`/simulation/${result.simulation_id}`); } else { setError('Simulation completed but no ID returned.'); setLoading(false); } } catch (err) { setError(err instanceof Error ? err.message : 'Failed to run simulation.'); setLoading(false); } }; return (
{/* Header */}
{loading &&
}

Simulation Lab

Scenario modeling and prediction engine

{/* Content */}
{/* Form */}

New Simulation

{error && (
{error}
)}
setForm({ ...form, title: e.target.value })} disabled={loading} placeholder="e.g. US Debt Default Simulation" className="w-full py-2.5 pl-9 pr-4 text-[13px] text-gray-200 rounded-xl border border-white/[0.06] focus:border-amber-500/30 focus:outline-none transition-colors placeholder:text-gray-700" style={{ background: 'rgba(0,0,0,0.3)' }} />