import { Archive, Play, Square, SwitchCamera } from 'lucide-react'; import { useEffect, useState } from 'react'; import { getMounts, listCartridges, mountCartridge, switchCartridge, unmountCartridge } from '../api'; import type { CartridgeManifest, MountState } from '../types'; import { errorMessage, formatNumber, shortHash } from '../lib/format'; import { Panel, Quiet } from './ui'; export function CartridgePanel({ onChanged }: { onChanged: () => void }) { const [cartridges, setCartridges] = useState([]); const [mounts, setMounts] = useState(null); const [busy, setBusy] = useState(null); const [notice, setNotice] = useState(null); const [error, setError] = useState(null); async function load() { try { const [nextCartridges, nextMounts] = await Promise.all([listCartridges(), getMounts()]); setCartridges(nextCartridges); setMounts(nextMounts); } catch (err) { setError(errorMessage(err)); } } useEffect(() => { let cancelled = false; async function loadInitial() { try { const [nextCartridges, nextMounts] = await Promise.all([listCartridges(), getMounts()]); if (!cancelled) { setCartridges(nextCartridges); setMounts(nextMounts); } } catch (err) { if (!cancelled) { setError(errorMessage(err)); } } } void loadInitial(); return () => { cancelled = true; }; }, []); async function act(cartridgeId: string, verb: 'mount' | 'switch' | 'unmount') { setBusy(`${verb}-${cartridgeId}`); setError(null); try { if (verb === 'mount') { await mountCartridge(cartridgeId); } else if (verb === 'switch') { await switchCartridge(cartridgeId); } else { await unmountCartridge(cartridgeId); } setNotice(`${verb} ${cartridgeId}`); await load(); onChanged(); } catch (err) { setError(errorMessage(err)); } finally { setBusy(null); } } return ( }>
{mounts?.mounted.length ?? 0} mounted {mounts?.scoped ? 'search is scoped' : 'search sees the whole store'}
{cartridges.map((cartridge) => { const mounted = mounts?.mounted.includes(cartridge.cartridge_id) ?? false; return (
{cartridge.name} {mounted && mounted}
{cartridge.cartridge_id}
{formatNumber(cartridge.atom_count)} atoms {formatNumber(cartridge.source_count)} sources {formatNumber(cartridge.token_equivalent)} token eq {cartridge.model_base} {cartridge.dna ? `dna ${shortHash(cartridge.dna)}` : 'dna pending'} {cartridge.kv_fingerprint ? 'kv fingerprint pinned' : 'no kv fingerprint: mounting must re-check this machine'}
); })} {cartridges.length === 0 && No cartridge has been finalized yet.}
{notice &&
{notice}
} {error &&
{error}
}
); }