diff --git a/src/Web/autopilot-monitor-web/staticwebapp.config.json b/src/Web/autopilot-monitor-web/staticwebapp.config.json index e6d54258..b465824a 100644 --- a/src/Web/autopilot-monitor-web/staticwebapp.config.json +++ b/src/Web/autopilot-monitor-web/staticwebapp.config.json @@ -21,6 +21,16 @@ { "route": "/changelog", "redirect": "https://docs.autopilotmonitor.com/changelog/platform-changelog", "statusCode": 301 }, { "route": "/roadmap", "redirect": "/", "statusCode": 302 }, + { "route": "/sessions/index.txt", "rewrite": "/sessions/index.txt" }, + { "route": "/sessions/inspector/index.txt", "rewrite": "/sessions/inspector/index.txt" }, + { "route": "/diagnosis/index.txt", "rewrite": "/diagnosis/index.txt" }, + { "route": "/apps/index.txt", "rewrite": "/apps/index.txt" }, + { "route": "/apps/detail/index.txt", "rewrite": "/apps/detail/index.txt" }, + { "route": "/admin/backups/index.txt", "rewrite": "/admin/backups/index.txt" }, + { "route": "/admin/backups/detail/index.txt", "rewrite": "/admin/backups/detail/index.txt" }, + { "route": "/admin/customs-archive/index.txt", "rewrite": "/admin/customs-archive/index.txt" }, + { "route": "/admin/customs-archive/detail/index.txt", "rewrite": "/admin/customs-archive/detail/index.txt" }, + { "route": "/sessions", "rewrite": "/sessions/index.html" }, { "route": "/sessions/inspector", "rewrite": "/sessions/inspector/index.html" }, { "route": "/sessions/*", "rewrite": "/sessions/index.html" }, diff --git a/src/Web/autopilot-monitor-web/utils/__tests__/swaConfig.guard.test.ts b/src/Web/autopilot-monitor-web/utils/__tests__/swaConfig.guard.test.ts index d0d4b603..c724e985 100644 --- a/src/Web/autopilot-monitor-web/utils/__tests__/swaConfig.guard.test.ts +++ b/src/Web/autopilot-monitor-web/utils/__tests__/swaConfig.guard.test.ts @@ -87,7 +87,21 @@ describe("staticwebapp.config.json guard", () => { // trailingSlash:auto normalizes /apps to /apps/, which the /apps/* wildcard // matches — without the exact entry the list page serves the DETAIL html // (production incident 2026-07-29: /apps rendered the app-detail view). + // The exported RSC payloads (/index.txt) equally need exact + // self-rewrites before the wildcard: client navigation fetches them, and a + // wildcard-rewritten HTML response makes the Next router fall back to a + // HARD page load (production incident 2026-07-29: sidebar state reset on + // every /admin/backups navigation). const pairs: Array<[string, string]> = [ + ["/sessions/index.txt", "/sessions/*"], + ["/sessions/inspector/index.txt", "/sessions/*"], + ["/diagnosis/index.txt", "/diagnosis/*"], + ["/apps/index.txt", "/apps/*"], + ["/apps/detail/index.txt", "/apps/*"], + ["/admin/backups/index.txt", "/admin/backups/*"], + ["/admin/backups/detail/index.txt", "/admin/backups/*"], + ["/admin/customs-archive/index.txt", "/admin/customs-archive/*"], + ["/admin/customs-archive/detail/index.txt", "/admin/customs-archive/*"], ["/sessions", "/sessions/*"], ["/sessions/inspector", "/sessions/*"], ["/diagnosis", "/diagnosis/*"],