diff --git a/package.json b/package.json
index 440db0d9..0d02744a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "theseus-navigator",
- "version": "0.3.64",
+ "version": "0.3.65",
"license": "MPL-2.0",
"description": "Theseus Navigator — a browser that follows the thread. By Silent Mode, a Deviant project.",
"author": "Silent Mode",
diff --git a/settings.html b/settings.html
index 921a7591..ce7870dd 100644
--- a/settings.html
+++ b/settings.html
@@ -1786,27 +1786,44 @@
// Fires an IPC that un-dismisses any lingering session chip and hits the
// release manifest. Renders either "you're on the latest (vN.M.O)" or
// "vX.Y.Z is available — the update chip in the toolbar will offer it".
- const updStatus = document.getElementById("updStatus");
- // Show the current version by default so the user doesn't have to
- // click "Check for updates" just to find out which Theseus they're on.
- if (C && C.appVersion) C.appVersion().then((v) => {
- if (v) updStatus.textContent = `You're on v${v}.`;
- }).catch(() => {});
- const updCheck = document.getElementById("updCheck");
- updCheck.onclick = async () => {
- const orig = updCheck.textContent;
- updCheck.disabled = true; updCheck.textContent = "Checking…";
- updStatus.textContent = "Checking…";
- try {
- const r = await C.recheckUpdate();
- if (r && r.updateAvailable && r.updateAvailable.version) {
- updStatus.innerHTML = `v${r.updateAvailable.version} is available — the update chip in the toolbar will offer it.`;
- } else {
- updStatus.textContent = `You're on the latest (v${(r && r.currentVersion) || "?"}).`;
- }
- } catch (e) { updStatus.textContent = "Check failed: " + (e?.message || e); }
- finally { updCheck.disabled = false; updCheck.textContent = orig; }
- };
+ // Wrap the Updates panel init in its own try — any earlier failure in
+ // this big C.get().then((s)=>…) block would otherwise leave the panel
+ // stuck on "Loading…" forever (silent `.catch(()=>{})` on the version
+ // fetch). We also always react to the fetch's reject, instead of
+ // swallowing it, so the user has a status line they can act on.
+ try {
+ const updStatus = document.getElementById("updStatus");
+ // Show the current version by default so the user doesn't have to
+ // click "Check for updates" just to find out which Theseus they're on.
+ if (C && C.appVersion) {
+ C.appVersion().then((v) => {
+ updStatus.textContent = v ? `You're on v${v}.` : "Version unavailable — try Check for updates.";
+ }).catch((e) => {
+ updStatus.textContent = "Could not read version: " + (e?.message || e) + " — try Check for updates.";
+ });
+ } else {
+ updStatus.textContent = "This build is missing the version IPC — restart Theseus to refresh the panel.";
+ }
+ const updCheck = document.getElementById("updCheck");
+ if (updCheck) updCheck.onclick = async () => {
+ const orig = updCheck.textContent;
+ updCheck.disabled = true; updCheck.textContent = "Checking…";
+ updStatus.textContent = "Checking…";
+ try {
+ if (!C.recheckUpdate) throw new Error("recheck-update IPC not exposed");
+ const r = await C.recheckUpdate();
+ if (r && r.updateAvailable && r.updateAvailable.version) {
+ updStatus.innerHTML = `v${r.updateAvailable.version} is available — the update chip in the toolbar will offer it.`;
+ } else {
+ updStatus.textContent = `You're on the latest (v${(r && r.currentVersion) || "?"}).`;
+ }
+ } catch (e) { updStatus.textContent = "Check failed: " + (e?.message || e); }
+ finally { updCheck.disabled = false; updCheck.textContent = orig; }
+ };
+ } catch (e) {
+ try { document.getElementById("updStatus").textContent = "Updates panel init failed: " + (e?.message || e); } catch {}
+ console.error("Updates panel init failed:", e);
+ }
// ---- Passwords section: three states (setup / locked / unlocked) ---------
// The vault lives in main.js — this UI just calls IPC. No plaintext ever