From 0f1411094e97987d0b60c1f4cd1b5d6cf1042e8b Mon Sep 17 00:00:00 2001 From: Local Dev Date: Tue, 8 Sep 2026 19:34:06 +0200 Subject: [PATCH] fix(theseus/updater): --updated flag so silent install actually reinstalls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Users reported Theseus being uninstalled by the auto-updater and never coming back. Reproduced on 0.3.31: The 'Install & restart' handler was spawning the NSIS setup with just [\"/S\"]. Our config is oneClick:false + perMachine:false + allowToChangeInstallationDirectory:true, so NSIS in silent mode: 1. runs the old uninstaller (wipes install dir + registry path) 2. hits the install phase, which in wizard mode expects UI to pick the install directory 3. silent mode has no UI, registry path is gone → exits without installing anything Result: browser gone, nothing left, no error surfaced to the user. Fix: pass --updated alongside /S. electron-builder's NSIS template treats --updated as 'this is an auto-update, reuse the existing install directory from registry, don't rerun the uninstaller'. --force-run relaunches the app after install. Users stuck on 0.3.31 need to manually install 0.3.32 once (from dl.silentmode.st) — the auto-updater in 0.3.31 will not recover on its own. Their %APPDATA%\theseus-navigator profile is untouched by the uninstall so vault, addons and settings survive the reinstall. --- main.js | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/main.js b/main.js index 71bba56..f0077dc 100644 --- a/main.js +++ b/main.js @@ -3073,15 +3073,26 @@ ipcMain.handle("recheck-update", async () => { return { updateAvailable, currentVersion: app.getVersion() }; }); // One-click "Install & restart". Requires the silent pre-fetch to have -// finished (updateDownloadState === "ready"). Launches the setup with /S -// (skips the wizard; our nsis/installer.nsh's Ariadne prompt is bypassed -// too on upgrades because the Ariadne registry key is already present), -// then quits Theseus so the installer can overwrite it. When the installer -// finishes, the user re-launches Theseus and lands on the new version. +// finished (updateDownloadState === "ready"). +// +// CRITICAL — spawning the setup with just ["/S"] uninstalls Theseus but +// then FAILS to reinstall on our config (oneClick:false + perMachine:false +// + allowToChangeInstallationDirectory:true). In wizard mode NSIS expects +// UI for the install-path picker, and in silent mode with the registry +// path wiped by the just-run uninstaller, it exits without installing. +// Users hit this in 0.3.31: browser gone, nothing left. +// +// Fix: pass --updated alongside /S. electron-builder's NSIS template +// treats --updated as "this is an auto-update, reuse the existing install +// directory from registry, don't re-run the uninstaller". --force-run +// tells it to relaunch the app after install so the user isn't stranded +// even if the wizard-mode path somehow trips again. ipcMain.handle("install-update-now", () => { if (updateDownloadState !== "ready" || !updateDownloadPath) return false; try { - const p = spawn(updateDownloadPath, ["/S"], { detached: true, stdio: "ignore" }); + const p = spawn(updateDownloadPath, + ["--updated", "/S", "--force-run"], + { detached: true, stdio: "ignore" }); p.unref(); } catch (e) { console.warn("update spawn failed:", e?.message); return false; } // Give the child a moment to inherit our arguments before we exit.