import React, { useState, useEffect, useCallback } from 'react'; import { useSettings } from '../hooks/useSettings'; import { useModels } from '../hooks/useModels'; import { getServiceHealth } from '../api/orchestration'; export default function SettingsView({ onNavigate, onBack, modelProps }) { const { settings, saveSetting, saving } = useSettings(); return (
Settings
onNavigate('memory')}>Open →} /> saveSetting('recentEpisodeLimit', val)} saving={saving} /> saveSetting('semanticLimit', val)} saving={saving} /> saveSetting('scoreThreshold', val)} saving={saving} /> {/* Global system prompt */} } /> v0.1.0} /> } />
); } // ── Error boundary ─────────────────────────────────────────── class SettingsSectionErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { error: null }; } static getDerivedStateFromError(error) { return { error }; } render() { if (this.state.error) { return ( this.setState({ error: null })}> Retry } /> ); } return this.props.children; } } // ── Layout components ──────────────────────────────────────── function SettingsSection({ title, children }) { return (

{title}

{children}
); } function SettingsRow({ label, description, action }) { return (
{label} {description && {description}}
{action}
); } function NumberSetting({ label, description, value, min, max, step = 1, onSave, saving }) { const [local, setLocal] = useState(value ?? ''); const isDirty = local !== '' && Number(local) !== value; useEffect(() => { if (value !== undefined) setLocal(value); }, [value]); return ( setLocal(e.target.value)} style={{ width: '64px', padding: '5px 8px', textAlign: 'center', background: 'var(--bg-elevated)', border: '1px solid var(--border)', borderRadius: 'var(--radius-md)', color: 'var(--text-primary)', fontSize: '13px', outline: 'none', }} /> {isDirty && ( )} } /> ); } function ComingSoon() { return Coming soon; } // ── System prompt setting ──────────────────────────────────── function SystemPromptSetting({ settings, saveSetting, saving }) { const [local, setLocal] = useState(settings?.systemPrompt ?? ''); const [savedPrompt, setSavedPrompt] = useState(settings?.systemPrompt ?? ''); useEffect(() => { if (settings?.systemPrompt !== undefined) { setLocal(settings.systemPrompt ?? ''); setSavedPrompt(settings.systemPrompt ?? ''); } }, [settings?.systemPrompt]); const isDirty = local !== savedPrompt; async function handleSave() { await saveSetting('systemPrompt', local.trim() || null); setSavedPrompt(local); } return (
System Prompt Default instruction given to the model on every request. Projects can override this.
{isDirty && ( )}