async function renderPlugins() { const content = document.getElementById('pageContent'); content.innerHTML = `
Loading...
`; try { const data = await api.getPlugins(); const plugins = data.plugins || []; const container = document.getElementById('pluginList'); if (plugins.length === 0) { container.innerHTML = '
🔌

No plugins installed

'; return; } container.innerHTML = `
${plugins.map(p => ` `).join('')}
PluginVersionTypeInstalled
${p.name} ${p.version} ${p.type || 'unknown'} ${formatDate(p.installed)}
${plugins.length} plugins
`; } catch (err) { document.getElementById('pluginList').innerHTML = `
âš 

${escapeHtml(err.message)}

`; } } function showInstallPlugin() { document.getElementById('installPluginForm').style.display = 'block'; document.getElementById('installPluginForm').innerHTML = `
Install Plugin
`; } async function installPlugin() { const name = document.getElementById('pluginName').value.trim(); if (!name) { showToast('Plugin name required', 'error'); return; } try { const r = await api.installPlugin(name); showToast(r.status === 'already_installed' ? 'Already installed' : 'Plugin installed', 'success'); renderPlugins(); } catch (err) { showToast(`Error: ${err.message}`, 'error'); } } function cancelInstallPlugin() { document.getElementById('installPluginForm').style.display = 'none'; }