diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index ba59878e83f..ff0157ff154 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -15,12 +15,29 @@ try { openclawVersion = oclPkg.version ?? ""; } catch { /* openclaw not resolvable at build time */ } +const denchVersion = rootPkg.version ?? ""; + const nextConfig: NextConfig = { env: { - NEXT_PUBLIC_DENCHCLAW_VERSION: rootPkg.version ?? "", + NEXT_PUBLIC_DENCHCLAW_VERSION: denchVersion, NEXT_PUBLIC_OPENCLAW_VERSION: openclawVersion, }, + async headers() { + return [ + { + source: "/((?!_next/static|_next/image|favicon\\.ico).*)", + headers: [ + { + key: "Cache-Control", + value: "private, no-cache, no-store, max-age=0, must-revalidate", + }, + { key: "X-Denchclaw-Version", value: denchVersion }, + ], + }, + ]; + }, + // Produce a self-contained standalone build so npm global installs // can run the web app with `node server.js` — no npm install or // next build required at runtime. diff --git a/src/cli/web-runtime.ts b/src/cli/web-runtime.ts index a639bc42fa4..ff6d0b3811b 100644 --- a/src/cli/web-runtime.ts +++ b/src/cli/web-runtime.ts @@ -694,10 +694,13 @@ function ensureSeedAssets(runtimeAppDir: string, packageRoot: string): void { } /** - * Copy .next/static/ and public/ into the runtime app dir if they aren't - * already present. In production the prepack script copies these into the - * standalone app dir before publish, so cpSync already picks them up. - * In dev the prepack hasn't run, so we pull them from the source tree. + * Copy .next/static/ and public/ into the runtime app dir. Always + * force-overwrites so stale assets left by a partial prior install or an + * npx cache hit are replaced with the current build. + * + * In production the prepack script already embeds these in the standalone + * app dir, so cpSync picks them up first; this pass guarantees they match + * the source tree even when the standalone copy is incomplete. */ function ensureStaticAssets(runtimeAppDir: string, packageRoot: string): void { const pairs: Array<[src: string, dst: string]> = [ @@ -711,7 +714,7 @@ function ensureStaticAssets(runtimeAppDir: string, packageRoot: string): void { ], ]; for (const [src, dst] of pairs) { - if (existsSync(dst) || !existsSync(src)) continue; + if (!existsSync(src)) continue; try { mkdirSync(path.dirname(dst), { recursive: true }); cpSync(src, dst, { recursive: true, dereference: true, force: true });