diff --git a/settings.html b/settings.html index 7c19306..d0616cb 100644 --- a/settings.html +++ b/settings.html @@ -606,14 +606,12 @@

Installed

Loading…
-

Community

-

Extensions anyone can publish from theseus.x/extensions - by signing the package with the wallet that holds a BCDN name. Before installing, Theseus checks that signature - against the name's current owner in its own chain index — the relay can't substitute code under a trusted name.

-
-
Loading…
-
Extensions run with full app access — treat installing one like installing an unsigned executable. - Only load extensions whose source you trust.
+
To install a new extension, browse the catalogue at + theseus.x/extensions + and use the Install button there. Theseus checks each publisher's signature against the name's current + owner on chain before installing — the relay can't substitute code under a trusted name. Extensions run + with full app access — treat installing one like installing an unsigned executable, and only load + extensions whose source you trust.
@@ -1349,44 +1347,10 @@ btn.addEventListener("click", () => C.revealAddon(btn.dataset.reveal)); }); } - // ---- community catalog (theseus.x/extensions) ---- - const communityList = document.getElementById("communityList"); - async function loadCommunity() { - communityList.innerHTML = '
Loading…
'; - let r; - try { r = await C.communityCatalog(); } catch (e) { r = { ok: false, error: e?.message || String(e), extensions: [] }; } - if (!r.ok) { communityList.innerHTML = '
Catalog unavailable: ' + escapeHtml(r.error) + '
'; return; } - // Hide extensions already shown in the Installed list above — the - // Community list's job is to surface things you DON'T have. Updates to - // installed extensions come through the poll + "Check for updates" flow - // in the Installed list, not through a second card for the same id here. - const catalog = r.extensions.filter((e) => !e.installedVersion); - if (!catalog.length) { communityList.innerHTML = '
' + (r.extensions.length ? "All catalog extensions are already installed." : "Nothing published yet. Be the first — see theseus.x/extensions.") + '
'; return; } - communityList.innerHTML = catalog.map((e) => { - const state = e.installedVersion - ? (e.canUpdate ? '' - : 'Installed v' + escapeHtml(e.installedVersion) + '') - : ''; - return '
' + escapeHtml(e.icon || "🧩") + ' ' + escapeHtml(e.name) - + ' v' + escapeHtml(e.latest) + '
' - + '
' + escapeHtml(e.description || "") + '
' - + '
Published by ' + escapeHtml(e.publisher) + ' · ' + escapeHtml(String(e.versions || 1)) + ' version' + (e.versions === 1 ? "" : "s") - + (e.capabilities && e.capabilities.length ? ' · ' + escapeHtml(e.capabilities.join(", ")) : "") + '
' - + '
' + state + '
'; - }).join(""); - communityList.querySelectorAll("button[data-install]").forEach((btn) => { - btn.addEventListener("click", async () => { - const id = btn.dataset.install; - const status = communityList.querySelector('[data-status="' + CSS.escape(id) + '"]'); - btn.disabled = true; const orig = btn.textContent; btn.textContent = "Verifying…"; - let res; - try { res = await C.installCommunity(id); } catch (e) { res = { ok: false, error: e?.message || String(e) }; } - if (res && res.ok) { status.style.color = "var(--acid)"; status.textContent = "✓ Installed v" + res.version + " (signed by " + res.publisher + ")"; loadAddons(); loadCommunity(); } - else { status.style.color = "#f6768a"; status.textContent = "✗ " + (res?.error || "install failed"); btn.disabled = false; btn.textContent = orig; } - }); - }); - } - document.getElementById("communityRefresh").addEventListener("click", loadCommunity); + // Discovery of new community extensions happens at theseus.x/extensions — + // Settings only shows what's installed on this machine. The install button + // on that page invokes the same "addons-install-community" IPC and Theseus + // refreshes the installed list on its own. function escapeHtml(s) { return String(s || "").replace(/[&<>"']/g, (c) => ({ "&":"&","<":"<",">":">",'"':""","'":"'" })[c]); } function escapeAttr(s) { return escapeHtml(s); } async function loadAddons() { @@ -1407,7 +1371,7 @@ }); document.getElementById("addonsOpenDir").addEventListener("click", () => C.openAddonsDir()); document.querySelector('.side a[data-sec="addons"]').addEventListener("click", async () => { - await loadAddonUpdates(); loadAddons(); loadCommunity(); + await loadAddonUpdates(); loadAddons(); }); // Plug-ins tab: refresh Ariadne's live daemon state on every visit so it // doesn't display stale "checking…" text if the background poll finished @@ -1463,7 +1427,7 @@ } }); // Populate on first paint so the tab is ready when the user clicks in. - (async () => { await loadAddonUpdates(); loadAddons(); loadCommunity(); })(); + (async () => { await loadAddonUpdates(); loadAddons(); })();