const { useState: aUseState, useEffect: aUseEffect, useCallback: aUseCallback } = React; function AutonomyPanel({ open, onClose }) { if (!open) return null; const [data, setData] = aUseState(null); const [loading, setLoading] = aUseState(true); const [err, setErr] = aUseState(''); const [saving, setSaving] = aUseState(false); const load = aUseCallback(async () => { setLoading(true); try { const r = await fetch('/api/autonomy/status'); if (!r.ok) throw new Error(`HTTP ${r.status}`); setData(await r.json()); setErr(''); } catch (e) { setErr(String(e.message || e)); } finally { setLoading(false); } }, []); const setMode = aUseCallback(async (mode) => { if (saving) return; setSaving(true); try { const r = await fetch('/api/autonomy/mode', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ mode }), }); if (!r.ok) throw new Error(`HTTP ${r.status}`); await load(); } catch (e) { setErr(String(e.message || e)); } finally { setSaving(false); } }, [saving, load]); aUseEffect(() => { load(); }, [load]); const mode = data?.mode || 'copilot'; const modes = data?.allowed_modes || ['manual', 'copilot', 'autonomous']; return (
e.stopPropagation()} style={{ maxWidth:760, margin:'0 auto', background:'var(--bg)', border:'1px solid var(--line-2)', borderRadius:6, padding:22 }}>

Autonomy Control Center

{err &&
⚠ {err}
}
Mode
{modes.map(m => ( ))}
Queue: {data?.queues?.pending_trade_recs ?? '—'} pending recs · {data?.queues?.open_alerts ?? '—'} open alerts
Last mode change: {data?.mode_updated_at ? new Date(data.mode_updated_at).toLocaleString() : '—'}
Schedulers / Jobs
{loading &&
Loading…
} {(data?.jobs || []).map(j => (
{j.label}{j.state}
))}
); } window.AutonomyPanel = AutonomyPanel;