/** * ModelsSection — user model list with visibility toggle */ const { html } = window; const { useState, useEffect, useCallback } = hooks; function esc(s) { return s == null ? '' : String(s); } export function ModelsSection() { const [models, setModels] = useState(null); const [prefs, setPrefs] = useState({}); const [search, setSearch] = useState(''); const [typeFilter, setTypeFilter] = useState(''); const [provFilter, setProvFilter] = useState(''); useEffect(() => { (async () => { try { const [m, p] = await Promise.all([ sw.api.models.enabled(), sw.api.models.preferences(), ]); setModels(m?.data || m || []); // Build prefs map: model_id → { hidden } const map = {}; (p?.data || p || []).forEach(x => { map[x.model_id] = x; }); setPrefs(map); } catch (e) { console.warn('[settings/models]', e.message); setModels([]); } })(); }, []); const toggleHidden = useCallback(async (model) => { const current = prefs[model.id]?.hidden || false; try { await sw.api.models.setPref(model.id, model.provider_config_id, !current); setPrefs(p => ({ ...p, [model.id]: { ...p[model.id], hidden: !current } })); } catch (e) { sw.emit('toast', { message: e.message, variant: 'error' }); } }, [prefs]); if (models === null) { return html`
| Model | Type | Provider | Visible |
|---|