From 2335ac59c075a5b9fe614221e6946817cd82c17d Mon Sep 17 00:00:00 2001 From: "seahaven-openswe[bot]" <296972425+seahaven-openswe[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 14:25:26 -0400 Subject: [PATCH] fix: switch PWA service worker to autoUpdate to avoid stale bundles after deploy (#94) * Standardize remaining Node pins on Node 24 Refs: #40 - Bump sandbox Dockerfile to Node 24.18.0-1nodesource1 + setup_24.x - Move Playwright E2E job to node-version: "24" (quoted) - Update INSTALLATION.md to recommend Node 24 * Switch PWA service worker to autoUpdate to avoid stale bundles after deploy VitePWA's registerType: 'prompt' kept the new service worker waiting indefinitely because no update-prompt UX was wired. Returning visitors kept receiving the old precached app shell and hashed chunks. 'autoUpdate' uses skipWaiting + clientsClaim so a deploy takes over on the next navigation. Refs: #86 * Update PWA registration comment to match autoUpdate behavior The previous comment described prompt-mode behavior, but the SW is now configured with autoUpdate. Document the reload tradeoff explicitly so the comment no longer contradicts the VitePWA setting. Refs: #86 --------- Co-authored-by: amoussa1229 <166072409+amoussa1229@users.noreply.github.com> --- ui/src/client.tsx | 9 ++++++--- ui/vite.config.ts | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ui/src/client.tsx b/ui/src/client.tsx index da232592..4bdeadd3 100644 --- a/ui/src/client.tsx +++ b/ui/src/client.tsx @@ -3,9 +3,12 @@ import { StrictMode } from "react" import { hydrateRoot } from "react-dom/client" import { registerSW } from "virtual:pwa-register" -// prompt mode: a new SW installs in the background and takes over on the next -// load, so deploys never reload a tab mid-agent-run. Skip in dev — the SW -// precaches production-only build artifacts that 404 against the dev server. +// autoUpdate: vite-plugin-pwa generates a SW that calls skipWaiting and +// clientsClaim, so a new deploy activates for existing tabs. Open dashboard +// tabs may reload when the service worker takes over; this is acceptable for +// a dev/internal dashboard where silent updates are preferred over stale +// bundles. Skip in dev — the SW precaches production-only build artifacts that +// 404 against the dev server. if (import.meta.env.PROD) { registerSW() } diff --git a/ui/vite.config.ts b/ui/vite.config.ts index 7b377067..4e2ea978 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -173,7 +173,7 @@ const config = defineConfig({ tanstackStart({ spa: { enabled: true } }), VitePWA({ injectRegister: false, - registerType: "prompt", + registerType: "autoUpdate", outDir: ".output/public", devOptions: { enabled: true,