'use client'; import { useEffect, useState } from 'react'; import { useStore } from '@/lib/store'; import { api, auth } from '@/lib/api'; import type { Status, DreamerStatus } from '@/lib/api'; export default function SettingsPanel() { const { settingsOpen, setSettingsOpen, settings, setSettings } = useStore(); const [status, setStatus] = useState(null); const [memory, setMemory] = useState(''); const [editingMemory, setEditingMemory] = useState(false); const [reindexing, setReindexing] = useState(false); const [dreamerStatus, setDreamerStatus] = useState(null); const [dreamMode, setDreamMode] = useState('nrem'); const [dreamTask, setDreamTask] = useState(''); const [dreaming, setDreaming] = useState(false); const [dreamStarted, setDreamStarted] = useState(false); useEffect(() => { if (!settingsOpen) return; api.getStatus().then(setStatus).catch(console.error); api.getDreamerStatus().then(setDreamerStatus).catch(console.error); api.getMemory().then(d => setMemory(d.content)).catch(console.error); }, [settingsOpen]); async function updateSetting(key: string, value: unknown) { const updated = { ...settings, [key]: value }; setSettings(updated); await api.updateSettings(updated); } async function saveMemory() { await api.updateMemory(memory); setEditingMemory(false); } async function triggerDream() { setDreaming(true); setDreamStarted(false); const result = await api.runDreamer(dreamMode, dreamTask || undefined); setDreaming(false); if (result.started) { setDreamStarted(true); setTimeout(() => setDreamStarted(false), 4000); setTimeout(() => api.getDreamerStatus().then(setDreamerStatus), 5000); } } async function triggerReindex() { setReindexing(true); await api.reindex(); setTimeout(() => setReindexing(false), 3000); } async function exportConversation() { const messages = useStore.getState().messages; if (!messages.length) { alert('No messages to export.'); return; } let md = `# Conversation Export\n\nExported: ${new Date().toLocaleString()}\n\n---\n\n`; messages.forEach(m => { md += `**${m.role === 'user' ? 'You' : 'Aaron AI'}**\n\n${m.content}\n\n`; if (m.sources?.length) md += `*Sources: ${m.sources.join(', ')}*\n\n`; md += '---\n\n'; }); const a = document.createElement('a'); a.href = URL.createObjectURL(new Blob([md], { type: 'text/markdown' })); a.download = `conversation-${Date.now()}.md`; a.click(); } async function logout() { await auth.logout(); window.location.href = '/login'; } async function clearAll() { if (!confirm('Delete all conversations permanently?')) return; await api.clearAllConversations(); useStore.getState().setConversations([]); useStore.getState().setCurrentId(null); useStore.getState().setMessages([]); } return ( <>
{/* Header */}

Settings

{/* Body */}
{/* Appearance */}
updateSetting('theme', v ? 'dark' : 'light')} />
{/* Corpus */}
{reindexing ? 'Starting...' : 'Re-index'} updateSetting('web_search', v)} /> updateSetting('show_sources', v)} />
{/* Memory */}
{editingMemory ? ( <>