diff --git a/apps/desktop/package.json b/apps/desktop/package.json index d7cb0c7231..e96e21a19f 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -161,7 +161,7 @@ "dnd-core": "^16.0.1", "dotenv": "^17.3.1", "drizzle-orm": "0.45.1", - "electron-updater": "^6.7.3", + "electron-updater": "^6.8.3", "execa": "^9.6.0", "express": "^5.1.0", "fast-glob": "^3.3.3", diff --git a/apps/desktop/src/main/lib/auto-updater.ts b/apps/desktop/src/main/lib/auto-updater.ts index cad4c57f95..0171a91cdd 100644 --- a/apps/desktop/src/main/lib/auto-updater.ts +++ b/apps/desktop/src/main/lib/auto-updater.ts @@ -7,6 +7,26 @@ import { prerelease } from "semver"; import { AUTO_UPDATE_STATUS, type AutoUpdateStatus } from "shared/auto-update"; import { PLATFORM } from "shared/constants"; +// electron-updater's internal cache only self-invalidates when the remote +// sha512 differs from cached metadata, so a corrupt cached download (e.g. +// failed Squirrel install) gets retried indefinitely until the user +// manually reinstalls. Reach into the protected helper to clear it. +interface AppUpdaterInternals { + downloadedUpdateHelper: { clear(): Promise } | null; +} + +async function clearCachedUpdate(reason: string): Promise { + const helper = (autoUpdater as unknown as AppUpdaterInternals) + .downloadedUpdateHelper; + if (!helper) return; + try { + await helper.clear(); + console.info(`[auto-updater] Cleared cached update (${reason})`); + } catch (error) { + console.error("[auto-updater] Failed to clear cached update:", error); + } +} + const UPDATE_CHECK_INTERVAL_MS = 1000 * 60 * 60 * 4; // 4 hours /** @@ -231,6 +251,7 @@ export function setupAutoUpdater(): void { `[auto-updater] Error during update (currentVersion=${app.getVersion()}):`, error?.message || error, ); + void clearCachedUpdate(`error: ${error?.message ?? "unknown"}`); emitStatus(AUTO_UPDATE_STATUS.ERROR, undefined, error.message); }); diff --git a/bun.lock b/bun.lock index 4aedae6572..982bc034f8 100644 --- a/bun.lock +++ b/bun.lock @@ -238,7 +238,7 @@ "dnd-core": "^16.0.1", "dotenv": "^17.3.1", "drizzle-orm": "0.45.1", - "electron-updater": "^6.7.3", + "electron-updater": "^6.8.3", "execa": "^9.6.0", "express": "^5.1.0", "fast-glob": "^3.3.3",