dev3000 0.0.126 → 0.0.128
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js +18 -0
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/dev-environment.d.ts +0 -4
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +1 -236
- package/dist/dev-environment.js.map +1 -1
- package/dist/screencast-manager.d.ts +2 -1
- package/dist/screencast-manager.d.ts.map +1 -1
- package/dist/screencast-manager.js +85 -36
- package/dist/screencast-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +3 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +13 -1
- package/dist/utils/version-check.js.map +1 -1
- package/mcp-server/.next/BUILD_ID +1 -1
- package/mcp-server/.next/app-path-routes-manifest.json +2 -0
- package/mcp-server/.next/build/chunks/[turbopack]_runtime.js +32 -7
- package/mcp-server/.next/build/chunks/[turbopack]_runtime.js.map +5 -5
- package/mcp-server/.next/build/postcss.js +1 -1
- package/mcp-server/.next/build/webpack-loaders.js +1 -1
- package/mcp-server/.next/build-manifest.json +7 -7
- package/mcp-server/.next/fallback-build-manifest.json +2 -2
- package/mcp-server/.next/next-minimal-server.js.nft.json +1 -1
- package/mcp-server/.next/next-server.js.nft.json +1 -1
- package/mcp-server/.next/prerender-manifest.json +3 -6
- package/mcp-server/.next/required-server-files.js +164 -0
- package/mcp-server/.next/required-server-files.json +39 -192
- package/mcp-server/.next/routes-manifest.json +13 -1
- package/mcp-server/.next/server/app/_global-error/page/build-manifest.json +5 -5
- package/mcp-server/.next/server/app/_global-error/page.js +8 -8
- package/mcp-server/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/_global-error.html +2 -2
- package/mcp-server/.next/server/app/_global-error.rsc +8 -8
- package/mcp-server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/mcp-server/.next/server/app/_global-error.segments/_full.segment.rsc +8 -8
- package/mcp-server/.next/server/app/_global-error.segments/_head.segment.rsc +4 -6
- package/mcp-server/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
- package/mcp-server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found/page/build-manifest.json +5 -5
- package/mcp-server/.next/server/app/_not-found/page.js +10 -10
- package/mcp-server/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/_not-found.html +1 -1
- package/mcp-server/.next/server/app/_not-found.rsc +9 -9
- package/mcp-server/.next/server/app/_not-found.segments/_full.segment.rsc +9 -9
- package/mcp-server/.next/server/app/_not-found.segments/_head.segment.rsc +4 -6
- package/mcp-server/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/mcp-server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/mcp-server/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/mcp-server/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/mcp-server/.next/server/app/api/jank/[session]/route.js +8 -8
- package/mcp-server/.next/server/app/api/jank/[session]/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/append/route.js +4 -4
- package/mcp-server/.next/server/app/api/logs/append/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/head/route.js +4 -4
- package/mcp-server/.next/server/app/api/logs/head/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/list/route.js +4 -4
- package/mcp-server/.next/server/app/api/logs/list/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/rotate/route.js +6 -6
- package/mcp-server/.next/server/app/api/logs/rotate/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/stream/route.js +4 -4
- package/mcp-server/.next/server/app/api/logs/stream/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/logs/tail/route.js +4 -4
- package/mcp-server/.next/server/app/api/logs/tail/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/orchestrator/route.js +6 -6
- package/mcp-server/.next/server/app/api/orchestrator/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js +6 -6
- package/mcp-server/.next/server/app/api/screenshots/[filename]/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/screenshots/capture/route/app-paths-manifest.json +3 -0
- package/mcp-server/.next/server/app/api/screenshots/capture/route/build-manifest.json +11 -0
- package/mcp-server/.next/server/app/api/screenshots/capture/route/server-reference-manifest.json +4 -0
- package/mcp-server/.next/server/app/api/screenshots/capture/route.js +9 -0
- package/mcp-server/.next/server/app/api/screenshots/capture/route.js.map +5 -0
- package/mcp-server/.next/server/app/api/screenshots/capture/route.js.nft.json +1 -0
- package/mcp-server/.next/server/app/api/screenshots/capture/route_client-reference-manifest.js +2 -0
- package/mcp-server/.next/server/app/api/screenshots/clear/route/app-paths-manifest.json +3 -0
- package/mcp-server/.next/server/app/api/screenshots/clear/route/build-manifest.json +11 -0
- package/mcp-server/.next/server/app/api/screenshots/clear/route/server-reference-manifest.json +4 -0
- package/mcp-server/.next/server/app/api/screenshots/clear/route.js +8 -0
- package/mcp-server/.next/server/app/api/screenshots/clear/route.js.map +5 -0
- package/mcp-server/.next/server/app/api/screenshots/clear/route.js.nft.json +1 -0
- package/mcp-server/.next/server/app/api/screenshots/clear/route_client-reference-manifest.js +2 -0
- package/mcp-server/.next/server/app/api/screenshots/list/route.js +6 -6
- package/mcp-server/.next/server/app/api/screenshots/list/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/teams/route.js +6 -6
- package/mcp-server/.next/server/app/api/teams/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/api/tools/route.js +6 -6
- package/mcp-server/.next/server/app/api/tools/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/index.html +1 -1
- package/mcp-server/.next/server/app/index.rsc +11 -11
- package/mcp-server/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/mcp-server/.next/server/app/index.segments/_full.segment.rsc +11 -11
- package/mcp-server/.next/server/app/index.segments/_head.segment.rsc +4 -6
- package/mcp-server/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/mcp-server/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/mcp-server/.next/server/app/logs/page/build-manifest.json +5 -5
- package/mcp-server/.next/server/app/logs/page.js +13 -13
- package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/mcp/route.js +8 -7
- package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page/build-manifest.json +5 -5
- package/mcp-server/.next/server/app/page.js +12 -12
- package/mcp-server/.next/server/app/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app/video/[session]/page/build-manifest.json +5 -5
- package/mcp-server/.next/server/app/video/[session]/page.js +12 -12
- package/mcp-server/.next/server/app/video/[session]/page.js.nft.json +1 -1
- package/mcp-server/.next/server/app/video/[session]/page_client-reference-manifest.js +1 -1
- package/mcp-server/.next/server/app-paths-manifest.json +2 -0
- package/mcp-server/.next/server/chunks/250ae__next-internal_server_app_api_screenshots_capture_route_actions_4034f26c.js +3 -0
- package/mcp-server/.next/server/chunks/250ae__next-internal_server_app_api_screenshots_clear_route_actions_e26206f4.js +3 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__86eb7852._.js → [externals]__eb460e97._.js} +2 -2
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__2a398dc7._.js → [externals]_next_dist_2a398dc7._.js} +1 -1
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__880af90b._.js → [root-of-the-server]__141a5bc7._.js} +6 -6
- package/mcp-server/.next/server/chunks/[root-of-the-server]__141a5bc7._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__1ca296d3._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__1ca296d3._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__21bdfd19._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__21bdfd19._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__31a16876._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__31a16876._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__340a77dc._.js +3 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__9a45c8f9._.js.map → [root-of-the-server]__340a77dc._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__4aa77621._.js +7 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__4aa77621._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__52809b10._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__52809b10._.js.map +1 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__72f849fd._.js → [root-of-the-server]__532c5da6._.js} +2 -2
- package/mcp-server/.next/server/chunks/[root-of-the-server]__714e8bcf._.js +3 -0
- package/mcp-server/.next/server/chunks/{[root-of-the-server]__e1a64519._.js.map → [root-of-the-server]__714e8bcf._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__81270bcf._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__81270bcf._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__8589759c._.js +4 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__8589759c._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__90514e85._.js +4 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__90514e85._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__90569352._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__90569352._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__945b2b7b._.js +11 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__945b2b7b._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ad4d66b0._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ad4d66b0._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__b4ecebbe._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__b4ecebbe._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e7efb7fe._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e7efb7fe._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__fa4b0e38._.js +4 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__fa4b0e38._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__fd2bf649._.js +3 -0
- package/mcp-server/.next/server/chunks/[root-of-the-server]__fd2bf649._.js.map +1 -0
- package/mcp-server/.next/server/chunks/[turbopack]_runtime.js +32 -7
- package/mcp-server/.next/server/chunks/[turbopack]_runtime.js.map +5 -5
- package/mcp-server/.next/server/chunks/{8b111_next_70882466._.js → c80b1_next_d479b5fa._.js} +3 -3
- package/mcp-server/.next/server/chunks/c80b1_next_d479b5fa._.js.map +1 -0
- package/mcp-server/.next/server/chunks/c80b1_next_dist_579c473d._.js +6 -0
- package/mcp-server/.next/server/chunks/c80b1_next_dist_579c473d._.js.map +1 -0
- package/mcp-server/.next/server/chunks/c80b1_next_dist_esm_build_templates_app-route_ea10d5ad.js +3 -0
- package/mcp-server/.next/server/chunks/c80b1_next_dist_esm_build_templates_app-route_ea10d5ad.js.map +1 -0
- package/mcp-server/.next/server/chunks/c80b1_next_f225a77d._.js +3 -0
- package/mcp-server/.next/server/chunks/c80b1_next_f225a77d._.js.map +1 -0
- package/mcp-server/.next/server/chunks/{mcp-server_50ca1d40._.js → mcp-server_70405c2f._.js} +1 -1
- package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js +216 -0
- package/mcp-server/.next/server/chunks/mcp-server_app_mcp_tools_ts_faf6d7df._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__1d6b73d5._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__baf72617._.js.map → [root-of-the-server]__1d6b73d5._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__27ae22d6._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__ad363fb6._.js.map → [root-of-the-server]__27ae22d6._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__324715a4._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__d9257d07._.js.map → [root-of-the-server]__324715a4._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__3c6c75a6._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__0aa14b12._.js.map → [root-of-the-server]__3c6c75a6._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__5ba89445._.js → [root-of-the-server]__50b48a29._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__5ba89445._.js.map → [root-of-the-server]__50b48a29._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__64e0f342._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__0e5de3ed._.js.map → [root-of-the-server]__64e0f342._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__75b45b88._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__75b45b88._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__90e175f7._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__23b471c0._.js.map → [root-of-the-server]__90e175f7._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__ab72cb3d._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__f9ee1284._.js.map → [root-of-the-server]__ab72cb3d._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__c73c0147._.js → [root-of-the-server]__bbed00c8._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__c73c0147._.js.map → [root-of-the-server]__bbed00c8._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__bc51e8b7._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{[root-of-the-server]__016aaaae._.js.map → [root-of-the-server]__bc51e8b7._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/[turbopack]_runtime.js +32 -7
- package/mcp-server/.next/server/chunks/ssr/[turbopack]_runtime.js.map +5 -5
- package/mcp-server/.next/server/chunks/ssr/_262bbdcd._.js +4 -0
- package/mcp-server/.next/server/chunks/ssr/_262bbdcd._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{_5ba67898._.js → _9a178862._.js} +4 -4
- package/mcp-server/.next/server/chunks/ssr/_9a178862._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_aabc0f14._.js +8 -0
- package/mcp-server/.next/server/chunks/ssr/_aabc0f14._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_be1b41b5._.js +4 -0
- package/mcp-server/.next/server/chunks/ssr/_be1b41b5._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/_e92c871d._.js +4 -0
- package/mcp-server/.next/server/chunks/ssr/_e92c871d._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_0d37e039._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_0d37e039._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_5f2de86d._.js +4 -0
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_5f2de86d._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_81d07c6e._.js +10 -0
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_81d07c6e._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_889a708f._.js +6 -0
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_889a708f._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_69dfdf5e._.js → c80b1_next_dist_client_components_43abb007._.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_69dfdf5e._.js.map → c80b1_next_dist_client_components_43abb007._.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_builtin_forbidden_5a705cc6.js → c80b1_next_dist_client_components_builtin_forbidden_462fb25e.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_builtin_forbidden_5a705cc6.js.map → c80b1_next_dist_client_components_builtin_forbidden_462fb25e.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_client_components_builtin_global-error_f3bf1365.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_builtin_global-error_d996306b.js.map → c80b1_next_dist_client_components_builtin_global-error_f3bf1365.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_builtin_unauthorized_0df11997.js → c80b1_next_dist_client_components_builtin_unauthorized_9a1b3d4d.js} +2 -2
- package/mcp-server/.next/server/chunks/ssr/{8b111_next_dist_client_components_builtin_unauthorized_0df11997.js.map → c80b1_next_dist_client_components_builtin_unauthorized_9a1b3d4d.js.map} +1 -1
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_esm_build_templates_app-page_9b0ce51c.js +4 -0
- package/mcp-server/.next/server/chunks/ssr/c80b1_next_dist_esm_build_templates_app-page_9b0ce51c.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js +1 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server_app_page_tsx_9fc46577._.js +1 -1
- package/mcp-server/.next/server/chunks/ssr/mcp-server_components_dark-mode-toggle_tsx_f31dd15d._.js +1 -1
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_98754805._.js +5 -0
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_98754805._.js.map +1 -0
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_b801224a._.js +3 -0
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_b801224a._.js.map +1 -0
- package/mcp-server/.next/server/functions-config-manifest.json +1 -11
- package/mcp-server/.next/server/instrumentation.js +1 -1
- package/mcp-server/.next/server/instrumentation.js.nft.json +1 -1
- package/mcp-server/.next/server/middleware-build-manifest.js +5 -5
- package/mcp-server/.next/server/pages/404.html +1 -1
- package/mcp-server/.next/server/pages/500.html +2 -2
- package/mcp-server/.next/server/server-reference-manifest.js +1 -1
- package/mcp-server/.next/server/server-reference-manifest.json +1 -1
- package/mcp-server/.next/static/1tSGEmFktuD3B97MIF49Q/_clientMiddlewareManifest.json +1 -0
- package/mcp-server/.next/static/chunks/0ceacd9ff62ffa24.js +1 -0
- package/mcp-server/.next/static/chunks/{5171d9a831cc2de4.js → 41c5312e59752fb5.js} +1 -1
- package/mcp-server/.next/static/chunks/47219b9a153e0530.js +3 -0
- package/mcp-server/.next/static/chunks/4b70aaeeb4b78390.js +1 -0
- package/mcp-server/.next/static/chunks/59cdeaf92a780e96.css +1 -0
- package/mcp-server/.next/static/chunks/5c8ff2f81b2fec4d.js +3 -0
- package/mcp-server/.next/static/chunks/6bd8e9b9ad938cba.js +1 -0
- package/mcp-server/.next/static/chunks/{3d612a0a5e49885d.js → 86092b19e32d6ddb.js} +1 -1
- package/mcp-server/.next/static/chunks/a6dad97d9634a72d.js.map +1 -0
- package/mcp-server/.next/static/chunks/a782bd48b8755eeb.js +1 -0
- package/mcp-server/.next/static/chunks/{95b89db5d1d54841.js → ba2f63419c181083.js} +1 -1
- package/mcp-server/.next/static/chunks/f09e07f5359ffb6b.js +4 -0
- package/mcp-server/.next/static/chunks/f5ae99caea655ac1.js +2 -0
- package/mcp-server/.next/static/chunks/turbopack-2c2bdfdb92058782.js +4 -0
- package/mcp-server/app/api/screenshots/capture/route.ts +137 -0
- package/mcp-server/app/api/screenshots/clear/route.ts +44 -0
- package/mcp-server/app/mcp/route.ts +80 -45
- package/mcp-server/app/mcp/tools.ts +6 -2
- package/mcp-server/package.json +1 -1
- package/package.json +2 -2
- package/mcp-server/.next/server/chunks/8b111_next_1353f498._.js +0 -3
- package/mcp-server/.next/server/chunks/8b111_next_1353f498._.js.map +0 -1
- package/mcp-server/.next/server/chunks/8b111_next_70882466._.js.map +0 -1
- package/mcp-server/.next/server/chunks/8b111_next_dist_b45da2c0._.js +0 -6
- package/mcp-server/.next/server/chunks/8b111_next_dist_b45da2c0._.js.map +0 -1
- package/mcp-server/.next/server/chunks/8b111_next_dist_esm_build_templates_app-route_61845054.js +0 -3
- package/mcp-server/.next/server/chunks/8b111_next_dist_esm_build_templates_app-route_61845054.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__11cde0db._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__11cde0db._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__3ac957e6._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__45cf400e._.js +0 -7
- package/mcp-server/.next/server/chunks/[root-of-the-server]__45cf400e._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__5e1331cc._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__5e1331cc._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__7a6a57a4._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__7a6a57a4._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__8173a02b._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__8173a02b._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__880af90b._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__92444e87._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__92444e87._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__97925d45._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__97925d45._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__9a45c8f9._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__9be3321c._.js +0 -4
- package/mcp-server/.next/server/chunks/[root-of-the-server]__9be3321c._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ae49815f._.js +0 -217
- package/mcp-server/.next/server/chunks/[root-of-the-server]__ae49815f._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__d4d47e5f._.js +0 -28
- package/mcp-server/.next/server/chunks/[root-of-the-server]__d4d47e5f._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__e1a64519._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__f2de2bac._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__f2de2bac._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__f449fffa._.js +0 -11
- package/mcp-server/.next/server/chunks/[root-of-the-server]__f449fffa._.js.map +0 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__f9975293._.js +0 -3
- package/mcp-server/.next/server/chunks/[root-of-the-server]__f9975293._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_2d5fda8a._.js +0 -6
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_2d5fda8a._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_416feb3b._.js +0 -6
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_416feb3b._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_a0631e8f._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_a0631e8f._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_bc5bff92._.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_bc5bff92._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_client_components_builtin_global-error_d996306b.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_esm_build_templates_app-page_4117d230.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/8b111_next_dist_esm_build_templates_app-page_4117d230.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__016aaaae._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0aa14b12._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__0e5de3ed._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__23b471c0._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__ad363fb6._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__baf72617._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__bf7cd8c6._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__d9257d07._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/[root-of-the-server]__f9ee1284._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/_2eb35278._.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/_2eb35278._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_3b1c49b6._.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/_3b1c49b6._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_5ba67898._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_af685f91._.js +0 -8
- package/mcp-server/.next/server/chunks/ssr/_af685f91._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/_ba028667._.js +0 -4
- package/mcp-server/.next/server/chunks/ssr/_ba028667._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_3bd414fc._.js +0 -5
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_3bd414fc._.js.map +0 -1
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_9d64b6f5._.js +0 -3
- package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_9d64b6f5._.js.map +0 -1
- package/mcp-server/.next/server/middleware.js +0 -5
- package/mcp-server/.next/server/middleware.js.nft.json +0 -1
- package/mcp-server/.next/static/chunks/37739dbbbff41860.js +0 -2
- package/mcp-server/.next/static/chunks/45ba9786ab8c2e44.js +0 -1
- package/mcp-server/.next/static/chunks/9af9038936981171.js +0 -3
- package/mcp-server/.next/static/chunks/9d9ea52745b7cee8.css +0 -1
- package/mcp-server/.next/static/chunks/a3771e169e1ff356.js +0 -1
- package/mcp-server/.next/static/chunks/a92901311ade94f3.js +0 -4
- package/mcp-server/.next/static/chunks/b3811fb9af254076.js +0 -1
- package/mcp-server/.next/static/chunks/eb96b27d3b73ef3b.js +0 -3
- package/mcp-server/.next/static/chunks/f9a2399752a0a1fa.js +0 -1
- package/mcp-server/.next/static/chunks/turbopack-39686e05867003be.js +0 -3
- package/mcp-server/.next/static/lSzvvkjD4ab_1CtchfQYo/_clientMiddlewareManifest.json +0 -6
- /package/mcp-server/.next/build/chunks/{[turbopack-node]_transforms_postcss_ts_80bff36f._.js → [turbopack-node]_transforms_postcss_ts_7988927e._.js} +0 -0
- /package/mcp-server/.next/build/chunks/{[turbopack-node]_transforms_postcss_ts_80bff36f._.js.map → [turbopack-node]_transforms_postcss_ts_7988927e._.js.map} +0 -0
- /package/mcp-server/.next/build/chunks/{[turbopack-node]_transforms_webpack-loaders_ts_c84aa21a._.js → [turbopack-node]_transforms_webpack-loaders_ts_1efa112f._.js} +0 -0
- /package/mcp-server/.next/build/chunks/{[turbopack-node]_transforms_webpack-loaders_ts_c84aa21a._.js.map → [turbopack-node]_transforms_webpack-loaders_ts_1efa112f._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__2a398dc7._.js.map → 250ae__next-internal_server_app_api_screenshots_capture_route_actions_4034f26c.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__3ac957e6._.js.map → 250ae__next-internal_server_app_api_screenshots_clear_route_actions_e26206f4.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__72f849fd._.js.map → [externals]__eb460e97._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{[root-of-the-server]__86eb7852._.js.map → [externals]_next_dist_2a398dc7._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{ssr/[root-of-the-server]__bf7cd8c6._.js.map → [root-of-the-server]__532c5da6._.js.map} +0 -0
- /package/mcp-server/.next/server/chunks/{mcp-server_50ca1d40._.js.map → mcp-server_70405c2f._.js.map} +0 -0
- /package/mcp-server/.next/static/{lSzvvkjD4ab_1CtchfQYo → 1tSGEmFktuD3B97MIF49Q}/_buildManifest.js +0 -0
- /package/mcp-server/.next/static/{lSzvvkjD4ab_1CtchfQYo → 1tSGEmFktuD3B97MIF49Q}/_ssgManifest.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/shared/lib/segment.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/readonly-url-search-params.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/unrecognized-action-error.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/redirect-status-code.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/redirect-error.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/redirect.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/http-access-fallback/http-access-fallback.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/not-found.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/forbidden.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/unauthorized.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/server/dynamic-rendering-utils.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/server/lib/router-utils/is-postpone.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/shared/lib/lazy-dynamic/bailout-to-csr.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/is-next-router-error.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/hooks-server-context.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/static-generation-bailout.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/lib/framework/boundary-constants.tsx","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/lib/scheduler.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/shared/lib/invariant-error.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/shared/lib/promise-with-resolvers.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/server/app-render/staged-rendering.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/server/app-render/dynamic-rendering.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/unstable-rethrow.server.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/unstable-rethrow.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/navigation.react-server.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/src/client/components/navigation.ts","../../../../../node_modules/.pnpm/next%4016.0.7_%40opentelemetry%2Bapi%401.9.0_babel-plugin-react-compiler%401.0.0_react-dom%4019.3.0_a20848594014cb183ab624f2be88a203/node_modules/next/navigation.js","../../../../../mcp-server/app/logs/LogsClient.tsx","../../../../../src/constants/log-colors.ts","../../../../../mcp-server/app/logs/utils.ts"],"sourcesContent":["import type { FlightRouterState, Segment } from './app-router-types'\n\nexport function getSegmentValue(segment: Segment) {\n return Array.isArray(segment) ? segment[1] : segment\n}\n\nexport function isGroupSegment(segment: string) {\n // Use array[0] for performant purpose\n return segment[0] === '(' && segment.endsWith(')')\n}\n\nexport function isParallelRouteSegment(segment: string) {\n return segment.startsWith('@') && segment !== '@children'\n}\n\nexport function addSearchParamsIfPageSegment(\n segment: Segment,\n searchParams: Record<string, string | string[] | undefined>\n) {\n const isPageSegment = segment.includes(PAGE_SEGMENT_KEY)\n\n if (isPageSegment) {\n const stringifiedQuery = JSON.stringify(searchParams)\n return stringifiedQuery !== '{}'\n ? PAGE_SEGMENT_KEY + '?' + stringifiedQuery\n : PAGE_SEGMENT_KEY\n }\n\n return segment\n}\n\nexport function computeSelectedLayoutSegment(\n segments: string[] | null,\n parallelRouteKey: string\n): string | null {\n if (!segments || segments.length === 0) {\n return null\n }\n\n // For 'children', use first segment; for other parallel routes, use last segment\n const rawSegment =\n parallelRouteKey === 'children'\n ? segments[0]\n : segments[segments.length - 1]\n\n // If the default slot is showing, return null since it's not technically \"selected\" (it's a fallback)\n // Returning an internal value like `__DEFAULT__` would be confusing\n return rawSegment === DEFAULT_SEGMENT_KEY ? null : rawSegment\n}\n\n/** Get the canonical parameters from the current level to the leaf node. */\nexport function getSelectedLayoutSegmentPath(\n tree: FlightRouterState,\n parallelRouteKey: string,\n first = true,\n segmentPath: string[] = []\n): string[] {\n let node: FlightRouterState\n if (first) {\n // Use the provided parallel route key on the first parallel route\n node = tree[1][parallelRouteKey]\n } else {\n // After first parallel route prefer children, if there's no children pick the first parallel route.\n const parallelRoutes = tree[1]\n node = parallelRoutes.children ?? Object.values(parallelRoutes)[0]\n }\n\n if (!node) return segmentPath\n const segment = node[0]\n\n let segmentValue = getSegmentValue(segment)\n\n if (!segmentValue || segmentValue.startsWith(PAGE_SEGMENT_KEY)) {\n return segmentPath\n }\n\n segmentPath.push(segmentValue)\n\n return getSelectedLayoutSegmentPath(\n node,\n parallelRouteKey,\n false,\n segmentPath\n )\n}\n\nexport const PAGE_SEGMENT_KEY = '__PAGE__'\nexport const DEFAULT_SEGMENT_KEY = '__DEFAULT__'\n","/**\n * ReadonlyURLSearchParams implementation shared between client and server.\n * This file is intentionally not marked as 'use client' or 'use server'\n * so it can be imported by both environments.\n */\n\n/** @internal */\nclass ReadonlyURLSearchParamsError extends Error {\n constructor() {\n super(\n 'Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams'\n )\n }\n}\n\n/**\n * A read-only version of URLSearchParams that throws errors when mutation methods are called.\n * This ensures that the URLSearchParams returned by useSearchParams() cannot be mutated.\n */\nexport class ReadonlyURLSearchParams extends URLSearchParams {\n /** @deprecated Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams */\n append() {\n throw new ReadonlyURLSearchParamsError()\n }\n /** @deprecated Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams */\n delete() {\n throw new ReadonlyURLSearchParamsError()\n }\n /** @deprecated Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams */\n set() {\n throw new ReadonlyURLSearchParamsError()\n }\n /** @deprecated Method unavailable on `ReadonlyURLSearchParams`. Read more: https://nextjs.org/docs/app/api-reference/functions/use-search-params#updating-searchparams */\n sort() {\n throw new ReadonlyURLSearchParamsError()\n }\n}\n","export class UnrecognizedActionError extends Error {\n constructor(...args: ConstructorParameters<typeof Error>) {\n super(...args)\n this.name = 'UnrecognizedActionError'\n }\n}\n\n/**\n * Check whether a server action call failed because the server action was not recognized by the server.\n * This can happen if the client and the server are not from the same deployment.\n *\n * Example usage:\n * ```ts\n * try {\n * await myServerAction();\n * } catch (err) {\n * if (unstable_isUnrecognizedActionError(err)) {\n * // The client is from a different deployment than the server.\n * // Reloading the page will fix this mismatch.\n * window.alert(\"Please refresh the page and try again\");\n * return;\n * }\n * }\n * ```\n * */\nexport function unstable_isUnrecognizedActionError(\n error: unknown\n): error is UnrecognizedActionError {\n return !!(\n error &&\n typeof error === 'object' &&\n error instanceof UnrecognizedActionError\n )\n}\n","export enum RedirectStatusCode {\n SeeOther = 303,\n TemporaryRedirect = 307,\n PermanentRedirect = 308,\n}\n","import { RedirectStatusCode } from './redirect-status-code'\n\nexport const REDIRECT_ERROR_CODE = 'NEXT_REDIRECT'\n\nexport enum RedirectType {\n push = 'push',\n replace = 'replace',\n}\n\nexport type RedirectError = Error & {\n digest: `${typeof REDIRECT_ERROR_CODE};${RedirectType};${string};${RedirectStatusCode};`\n}\n\n/**\n * Checks an error to determine if it's an error generated by the\n * `redirect(url)` helper.\n *\n * @param error the error that may reference a redirect error\n * @returns true if the error is a redirect error\n */\nexport function isRedirectError(error: unknown): error is RedirectError {\n if (\n typeof error !== 'object' ||\n error === null ||\n !('digest' in error) ||\n typeof error.digest !== 'string'\n ) {\n return false\n }\n\n const digest = error.digest.split(';')\n const [errorCode, type] = digest\n const destination = digest.slice(2, -2).join(';')\n const status = digest.at(-2)\n\n const statusCode = Number(status)\n\n return (\n errorCode === REDIRECT_ERROR_CODE &&\n (type === 'replace' || type === 'push') &&\n typeof destination === 'string' &&\n !isNaN(statusCode) &&\n statusCode in RedirectStatusCode\n )\n}\n","import { RedirectStatusCode } from './redirect-status-code'\nimport {\n RedirectType,\n type RedirectError,\n isRedirectError,\n REDIRECT_ERROR_CODE,\n} from './redirect-error'\n\nconst actionAsyncStorage =\n typeof window === 'undefined'\n ? (\n require('../../server/app-render/action-async-storage.external') as typeof import('../../server/app-render/action-async-storage.external')\n ).actionAsyncStorage\n : undefined\n\nexport function getRedirectError(\n url: string,\n type: RedirectType,\n statusCode: RedirectStatusCode = RedirectStatusCode.TemporaryRedirect\n): RedirectError {\n const error = new Error(REDIRECT_ERROR_CODE) as RedirectError\n error.digest = `${REDIRECT_ERROR_CODE};${type};${url};${statusCode};`\n return error\n}\n\n/**\n * This function allows you to redirect the user to another URL. It can be used in\n * [Server Components](https://nextjs.org/docs/app/building-your-application/rendering/server-components),\n * [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers), and\n * [Server Actions](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations).\n *\n * - In a Server Component, this will insert a meta tag to redirect the user to the target page.\n * - In a Route Handler or Server Action, it will serve a 307/303 to the caller.\n * - In a Server Action, type defaults to 'push' and 'replace' elsewhere.\n *\n * Read more: [Next.js Docs: `redirect`](https://nextjs.org/docs/app/api-reference/functions/redirect)\n */\nexport function redirect(\n /** The URL to redirect to */\n url: string,\n type?: RedirectType\n): never {\n type ??= actionAsyncStorage?.getStore()?.isAction\n ? RedirectType.push\n : RedirectType.replace\n\n throw getRedirectError(url, type, RedirectStatusCode.TemporaryRedirect)\n}\n\n/**\n * This function allows you to redirect the user to another URL. It can be used in\n * [Server Components](https://nextjs.org/docs/app/building-your-application/rendering/server-components),\n * [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers), and\n * [Server Actions](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations).\n *\n * - In a Server Component, this will insert a meta tag to redirect the user to the target page.\n * - In a Route Handler or Server Action, it will serve a 308/303 to the caller.\n *\n * Read more: [Next.js Docs: `redirect`](https://nextjs.org/docs/app/api-reference/functions/redirect)\n */\nexport function permanentRedirect(\n /** The URL to redirect to */\n url: string,\n type: RedirectType = RedirectType.replace\n): never {\n throw getRedirectError(url, type, RedirectStatusCode.PermanentRedirect)\n}\n\n/**\n * Returns the encoded URL from the error if it's a RedirectError, null\n * otherwise. Note that this does not validate the URL returned.\n *\n * @param error the error that may be a redirect error\n * @return the url if the error was a redirect error\n */\nexport function getURLFromRedirectError(error: RedirectError): string\nexport function getURLFromRedirectError(error: unknown): string | null {\n if (!isRedirectError(error)) return null\n\n // Slices off the beginning of the digest that contains the code and the\n // separating ';'.\n return error.digest.split(';').slice(2, -2).join(';')\n}\n\nexport function getRedirectTypeFromError(error: RedirectError): RedirectType {\n if (!isRedirectError(error)) {\n throw new Error('Not a redirect error')\n }\n\n return error.digest.split(';', 2)[1] as RedirectType\n}\n\nexport function getRedirectStatusCodeFromError(error: RedirectError): number {\n if (!isRedirectError(error)) {\n throw new Error('Not a redirect error')\n }\n\n return Number(error.digest.split(';').at(-2))\n}\n","export const HTTPAccessErrorStatus = {\n NOT_FOUND: 404,\n FORBIDDEN: 403,\n UNAUTHORIZED: 401,\n}\n\nconst ALLOWED_CODES = new Set(Object.values(HTTPAccessErrorStatus))\n\nexport const HTTP_ERROR_FALLBACK_ERROR_CODE = 'NEXT_HTTP_ERROR_FALLBACK'\n\nexport type HTTPAccessFallbackError = Error & {\n digest: `${typeof HTTP_ERROR_FALLBACK_ERROR_CODE};${string}`\n}\n\n/**\n * Checks an error to determine if it's an error generated by\n * the HTTP navigation APIs `notFound()`, `forbidden()` or `unauthorized()`.\n *\n * @param error the error that may reference a HTTP access error\n * @returns true if the error is a HTTP access error\n */\nexport function isHTTPAccessFallbackError(\n error: unknown\n): error is HTTPAccessFallbackError {\n if (\n typeof error !== 'object' ||\n error === null ||\n !('digest' in error) ||\n typeof error.digest !== 'string'\n ) {\n return false\n }\n const [prefix, httpStatus] = error.digest.split(';')\n\n return (\n prefix === HTTP_ERROR_FALLBACK_ERROR_CODE &&\n ALLOWED_CODES.has(Number(httpStatus))\n )\n}\n\nexport function getAccessFallbackHTTPStatus(\n error: HTTPAccessFallbackError\n): number {\n const httpStatus = error.digest.split(';')[1]\n return Number(httpStatus)\n}\n\nexport function getAccessFallbackErrorTypeByStatus(\n status: number\n): 'not-found' | 'forbidden' | 'unauthorized' | undefined {\n switch (status) {\n case 401:\n return 'unauthorized'\n case 403:\n return 'forbidden'\n case 404:\n return 'not-found'\n default:\n return\n }\n}\n","import {\n HTTP_ERROR_FALLBACK_ERROR_CODE,\n type HTTPAccessFallbackError,\n} from './http-access-fallback/http-access-fallback'\n\n/**\n * This function allows you to render the [not-found.js file](https://nextjs.org/docs/app/api-reference/file-conventions/not-found)\n * within a route segment as well as inject a tag.\n *\n * `notFound()` can be used in\n * [Server Components](https://nextjs.org/docs/app/building-your-application/rendering/server-components),\n * [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers), and\n * [Server Actions](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations).\n *\n * - In a Server Component, this will insert a `<meta name=\"robots\" content=\"noindex\" />` meta tag and set the status code to 404.\n * - In a Route Handler or Server Action, it will serve a 404 to the caller.\n *\n * Read more: [Next.js Docs: `notFound`](https://nextjs.org/docs/app/api-reference/functions/not-found)\n */\n\nconst DIGEST = `${HTTP_ERROR_FALLBACK_ERROR_CODE};404`\n\nexport function notFound(): never {\n const error = new Error(DIGEST) as HTTPAccessFallbackError\n ;(error as HTTPAccessFallbackError).digest = DIGEST\n\n throw error\n}\n","import {\n HTTP_ERROR_FALLBACK_ERROR_CODE,\n type HTTPAccessFallbackError,\n} from './http-access-fallback/http-access-fallback'\n\n// TODO: Add `forbidden` docs\n/**\n * @experimental\n * This function allows you to render the [forbidden.js file](https://nextjs.org/docs/app/api-reference/file-conventions/forbidden)\n * within a route segment as well as inject a tag.\n *\n * `forbidden()` can be used in\n * [Server Components](https://nextjs.org/docs/app/building-your-application/rendering/server-components),\n * [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers), and\n * [Server Actions](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations).\n *\n * Read more: [Next.js Docs: `forbidden`](https://nextjs.org/docs/app/api-reference/functions/forbidden)\n */\n\nconst DIGEST = `${HTTP_ERROR_FALLBACK_ERROR_CODE};403`\n\nexport function forbidden(): never {\n if (!process.env.__NEXT_EXPERIMENTAL_AUTH_INTERRUPTS) {\n throw new Error(\n `\\`forbidden()\\` is experimental and only allowed to be enabled when \\`experimental.authInterrupts\\` is enabled.`\n )\n }\n\n const error = new Error(DIGEST) as HTTPAccessFallbackError\n ;(error as HTTPAccessFallbackError).digest = DIGEST\n throw error\n}\n","import {\n HTTP_ERROR_FALLBACK_ERROR_CODE,\n type HTTPAccessFallbackError,\n} from './http-access-fallback/http-access-fallback'\n\n// TODO: Add `unauthorized` docs\n/**\n * @experimental\n * This function allows you to render the [unauthorized.js file](https://nextjs.org/docs/app/api-reference/file-conventions/unauthorized)\n * within a route segment as well as inject a tag.\n *\n * `unauthorized()` can be used in\n * [Server Components](https://nextjs.org/docs/app/building-your-application/rendering/server-components),\n * [Route Handlers](https://nextjs.org/docs/app/building-your-application/routing/route-handlers), and\n * [Server Actions](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations).\n *\n *\n * Read more: [Next.js Docs: `unauthorized`](https://nextjs.org/docs/app/api-reference/functions/unauthorized)\n */\n\nconst DIGEST = `${HTTP_ERROR_FALLBACK_ERROR_CODE};401`\n\nexport function unauthorized(): never {\n if (!process.env.__NEXT_EXPERIMENTAL_AUTH_INTERRUPTS) {\n throw new Error(\n `\\`unauthorized()\\` is experimental and only allowed to be used when \\`experimental.authInterrupts\\` is enabled.`\n )\n }\n\n const error = new Error(DIGEST) as HTTPAccessFallbackError\n ;(error as HTTPAccessFallbackError).digest = DIGEST\n throw error\n}\n","import type { NonStaticRenderStage } from './app-render/staged-rendering'\nimport type { RequestStore } from './app-render/work-unit-async-storage.external'\n\nexport function isHangingPromiseRejectionError(\n err: unknown\n): err is HangingPromiseRejectionError {\n if (typeof err !== 'object' || err === null || !('digest' in err)) {\n return false\n }\n\n return err.digest === HANGING_PROMISE_REJECTION\n}\n\nconst HANGING_PROMISE_REJECTION = 'HANGING_PROMISE_REJECTION'\n\nclass HangingPromiseRejectionError extends Error {\n public readonly digest = HANGING_PROMISE_REJECTION\n\n constructor(\n public readonly route: string,\n public readonly expression: string\n ) {\n super(\n `During prerendering, ${expression} rejects when the prerender is complete. Typically these errors are handled by React but if you move ${expression} to a different context by using \\`setTimeout\\`, \\`after\\`, or similar functions you may observe this error and you should handle it in that context. This occurred at route \"${route}\".`\n )\n }\n}\n\ntype AbortListeners = Array<(err: unknown) => void>\nconst abortListenersBySignal = new WeakMap<AbortSignal, AbortListeners>()\n\n/**\n * This function constructs a promise that will never resolve. This is primarily\n * useful for cacheComponents where we use promise resolution timing to determine which\n * parts of a render can be included in a prerender.\n *\n * @internal\n */\nexport function makeHangingPromise<T>(\n signal: AbortSignal,\n route: string,\n expression: string\n): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(new HangingPromiseRejectionError(route, expression))\n } else {\n const hangingPromise = new Promise<T>((_, reject) => {\n const boundRejection = reject.bind(\n null,\n new HangingPromiseRejectionError(route, expression)\n )\n let currentListeners = abortListenersBySignal.get(signal)\n if (currentListeners) {\n currentListeners.push(boundRejection)\n } else {\n const listeners = [boundRejection]\n abortListenersBySignal.set(signal, listeners)\n signal.addEventListener(\n 'abort',\n () => {\n for (let i = 0; i < listeners.length; i++) {\n listeners[i]()\n }\n },\n { once: true }\n )\n }\n })\n // We are fine if no one actually awaits this promise. We shouldn't consider this an unhandled rejection so\n // we attach a noop catch handler here to suppress this warning. If you actually await somewhere or construct\n // your own promise out of it you'll need to ensure you handle the error when it rejects.\n hangingPromise.catch(ignoreReject)\n return hangingPromise\n }\n}\n\nfunction ignoreReject() {}\n\nexport function makeDevtoolsIOAwarePromise<T>(\n underlying: T,\n requestStore: RequestStore,\n stage: NonStaticRenderStage\n): Promise<T> {\n if (requestStore.stagedRendering) {\n // We resolve each stage in a timeout, so React DevTools will pick this up as IO.\n return requestStore.stagedRendering.delayUntilStage(\n stage,\n undefined,\n underlying\n )\n }\n // in React DevTools if we resolve in a setTimeout we will observe\n // the promise resolution as something that can suspend a boundary or root.\n return new Promise<T>((resolve) => {\n // Must use setTimeout to be considered IO React DevTools. setImmediate will not work.\n setTimeout(() => {\n resolve(underlying)\n }, 0)\n })\n}\n","const REACT_POSTPONE_TYPE: symbol = Symbol.for('react.postpone')\n\nexport function isPostpone(error: any): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n error.$$typeof === REACT_POSTPONE_TYPE\n )\n}\n","// This has to be a shared module which is shared between client component error boundary and dynamic component\nconst BAILOUT_TO_CSR = 'BAILOUT_TO_CLIENT_SIDE_RENDERING'\n\n/** An error that should be thrown when we want to bail out to client-side rendering. */\nexport class BailoutToCSRError extends Error {\n public readonly digest = BAILOUT_TO_CSR\n\n constructor(public readonly reason: string) {\n super(`Bail out to client-side rendering: ${reason}`)\n }\n}\n\n/** Checks if a passed argument is an error that is thrown if we want to bail out to client-side rendering. */\nexport function isBailoutToCSRError(err: unknown): err is BailoutToCSRError {\n if (typeof err !== 'object' || err === null || !('digest' in err)) {\n return false\n }\n\n return err.digest === BAILOUT_TO_CSR\n}\n","import {\n isHTTPAccessFallbackError,\n type HTTPAccessFallbackError,\n} from './http-access-fallback/http-access-fallback'\nimport { isRedirectError, type RedirectError } from './redirect-error'\n\n/**\n * Returns true if the error is a navigation signal error. These errors are\n * thrown by user code to perform navigation operations and interrupt the React\n * render.\n */\nexport function isNextRouterError(\n error: unknown\n): error is RedirectError | HTTPAccessFallbackError {\n return isRedirectError(error) || isHTTPAccessFallbackError(error)\n}\n","const DYNAMIC_ERROR_CODE = 'DYNAMIC_SERVER_USAGE'\n\nexport class DynamicServerError extends Error {\n digest: typeof DYNAMIC_ERROR_CODE = DYNAMIC_ERROR_CODE\n\n constructor(public readonly description: string) {\n super(`Dynamic server usage: ${description}`)\n }\n}\n\nexport function isDynamicServerError(err: unknown): err is DynamicServerError {\n if (\n typeof err !== 'object' ||\n err === null ||\n !('digest' in err) ||\n typeof err.digest !== 'string'\n ) {\n return false\n }\n\n return err.digest === DYNAMIC_ERROR_CODE\n}\n","const NEXT_STATIC_GEN_BAILOUT = 'NEXT_STATIC_GEN_BAILOUT'\n\nexport class StaticGenBailoutError extends Error {\n public readonly code = NEXT_STATIC_GEN_BAILOUT\n}\n\nexport function isStaticGenBailoutError(\n error: unknown\n): error is StaticGenBailoutError {\n if (typeof error !== 'object' || error === null || !('code' in error)) {\n return false\n }\n\n return error.code === NEXT_STATIC_GEN_BAILOUT\n}\n","export const METADATA_BOUNDARY_NAME = '__next_metadata_boundary__'\nexport const VIEWPORT_BOUNDARY_NAME = '__next_viewport_boundary__'\nexport const OUTLET_BOUNDARY_NAME = '__next_outlet_boundary__'\nexport const ROOT_LAYOUT_BOUNDARY_NAME = '__next_root_layout_boundary__'\n","export type ScheduledFn<T = void> = () => T | PromiseLike<T>\nexport type SchedulerFn<T = void> = (cb: ScheduledFn<T>) => void\n\n/**\n * Schedules a function to be called on the next tick after the other promises\n * have been resolved.\n *\n * @param cb the function to schedule\n */\nexport const scheduleOnNextTick = (cb: ScheduledFn<void>) => {\n // We use Promise.resolve().then() here so that the operation is scheduled at\n // the end of the promise job queue, we then add it to the next process tick\n // to ensure it's evaluated afterwards.\n //\n // This was inspired by the implementation of the DataLoader interface: https://github.com/graphql/dataloader/blob/d336bd15282664e0be4b4a657cb796f09bafbc6b/src/index.js#L213-L255\n //\n Promise.resolve().then(() => {\n if (process.env.NEXT_RUNTIME === 'edge') {\n setTimeout(cb, 0)\n } else {\n process.nextTick(cb)\n }\n })\n}\n\n/**\n * Schedules a function to be called using `setImmediate` or `setTimeout` if\n * `setImmediate` is not available (like in the Edge runtime).\n *\n * @param cb the function to schedule\n */\nexport const scheduleImmediate = (cb: ScheduledFn<void>): void => {\n if (process.env.NEXT_RUNTIME === 'edge') {\n setTimeout(cb, 0)\n } else {\n setImmediate(cb)\n }\n}\n\n/**\n * returns a promise than resolves in a future task. There is no guarantee that the task it resolves in\n * will be the next task but if you await it you can at least be sure that the current task is over and\n * most usefully that the entire microtask queue of the current task has been emptied.\n */\nexport function atLeastOneTask() {\n return new Promise<void>((resolve) => scheduleImmediate(resolve))\n}\n\n/**\n * This utility function is extracted to make it easier to find places where we are doing\n * specific timing tricks to try to schedule work after React has rendered. This is especially\n * important at the moment because Next.js uses the edge builds of React which use setTimeout to\n * schedule work when you might expect that something like setImmediate would do the trick.\n *\n * Long term we should switch to the node versions of React rendering when possible and then\n * update this to use setImmediate rather than setTimeout\n */\nexport function waitAtLeastOneReactRenderTask(): Promise<void> {\n if (process.env.NEXT_RUNTIME === 'edge') {\n return new Promise((r) => setTimeout(r, 0))\n } else {\n return new Promise((r) => setImmediate(r))\n }\n}\n","export class InvariantError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(\n `Invariant: ${message.endsWith('.') ? message : message + '.'} This is a bug in Next.js.`,\n options\n )\n this.name = 'InvariantError'\n }\n}\n","export function createPromiseWithResolvers<T>(): PromiseWithResolvers<T> {\n // Shim of Stage 4 Promise.withResolvers proposal\n let resolve: (value: T | PromiseLike<T>) => void\n let reject: (reason: any) => void\n const promise = new Promise<T>((res, rej) => {\n resolve = res\n reject = rej\n })\n return { resolve: resolve!, reject: reject!, promise }\n}\n","import { InvariantError } from '../../shared/lib/invariant-error'\nimport { createPromiseWithResolvers } from '../../shared/lib/promise-with-resolvers'\n\nexport enum RenderStage {\n Static = 1,\n Runtime = 2,\n Dynamic = 3,\n}\n\nexport type NonStaticRenderStage = RenderStage.Runtime | RenderStage.Dynamic\n\nexport class StagedRenderingController {\n currentStage: RenderStage = RenderStage.Static\n\n private runtimeStagePromise = createPromiseWithResolvers<void>()\n private dynamicStagePromise = createPromiseWithResolvers<void>()\n\n constructor(private abortSignal: AbortSignal | null = null) {\n if (abortSignal) {\n abortSignal.addEventListener(\n 'abort',\n () => {\n const { reason } = abortSignal\n if (this.currentStage < RenderStage.Runtime) {\n this.runtimeStagePromise.promise.catch(ignoreReject) // avoid unhandled rejections\n this.runtimeStagePromise.reject(reason)\n }\n if (this.currentStage < RenderStage.Dynamic) {\n this.dynamicStagePromise.promise.catch(ignoreReject) // avoid unhandled rejections\n this.dynamicStagePromise.reject(reason)\n }\n },\n { once: true }\n )\n }\n }\n\n advanceStage(stage: NonStaticRenderStage) {\n // If we're already at the target stage or beyond, do nothing.\n // (this can happen e.g. if sync IO advanced us to the dynamic stage)\n if (this.currentStage >= stage) {\n return\n }\n this.currentStage = stage\n // Note that we might be going directly from Static to Dynamic,\n // so we need to resolve the runtime stage as well.\n if (stage >= RenderStage.Runtime) {\n this.runtimeStagePromise.resolve()\n }\n if (stage >= RenderStage.Dynamic) {\n this.dynamicStagePromise.resolve()\n }\n }\n\n private getStagePromise(stage: NonStaticRenderStage): Promise<void> {\n switch (stage) {\n case RenderStage.Runtime: {\n return this.runtimeStagePromise.promise\n }\n case RenderStage.Dynamic: {\n return this.dynamicStagePromise.promise\n }\n default: {\n stage satisfies never\n throw new InvariantError(`Invalid render stage: ${stage}`)\n }\n }\n }\n\n waitForStage(stage: NonStaticRenderStage) {\n return this.getStagePromise(stage)\n }\n\n delayUntilStage<T>(\n stage: NonStaticRenderStage,\n displayName: string | undefined,\n resolvedValue: T\n ) {\n const ioTriggerPromise = this.getStagePromise(stage)\n\n const promise = makeDevtoolsIOPromiseFromIOTrigger(\n ioTriggerPromise,\n displayName,\n resolvedValue\n )\n\n // Analogously to `makeHangingPromise`, we might reject this promise if the signal is invoked.\n // (e.g. in the case where we don't want want the render to proceed to the dynamic stage and abort it).\n // We shouldn't consider this an unhandled rejection, so we attach a noop catch handler here to suppress this warning.\n if (this.abortSignal) {\n promise.catch(ignoreReject)\n }\n return promise\n }\n}\n\nfunction ignoreReject() {}\n\n// TODO(restart-on-cache-miss): the layering of `delayUntilStage`,\n// `makeDevtoolsIOPromiseFromIOTrigger` and and `makeDevtoolsIOAwarePromise`\n// is confusing, we should clean it up.\nfunction makeDevtoolsIOPromiseFromIOTrigger<T>(\n ioTrigger: Promise<any>,\n displayName: string | undefined,\n resolvedValue: T\n): Promise<T> {\n // If we create a `new Promise` and give it a displayName\n // (with no userspace code above us in the stack)\n // React Devtools will use it as the IO cause when determining \"suspended by\".\n // In particular, it should shadow any inner IO that resolved/rejected the promise\n // (in case of staged rendering, this will be the `setTimeout` that triggers the relevant stage)\n const promise = new Promise<T>((resolve, reject) => {\n ioTrigger.then(resolve.bind(null, resolvedValue), reject)\n })\n if (displayName !== undefined) {\n // @ts-expect-error\n promise.displayName = displayName\n }\n return promise\n}\n","/**\n * The functions provided by this module are used to communicate certain properties\n * about the currently running code so that Next.js can make decisions on how to handle\n * the current execution in different rendering modes such as pre-rendering, resuming, and SSR.\n *\n * Today Next.js treats all code as potentially static. Certain APIs may only make sense when dynamically rendering.\n * Traditionally this meant deopting the entire render to dynamic however with PPR we can now deopt parts\n * of a React tree as dynamic while still keeping other parts static. There are really two different kinds of\n * Dynamic indications.\n *\n * The first is simply an intention to be dynamic. unstable_noStore is an example of this where\n * the currently executing code simply declares that the current scope is dynamic but if you use it\n * inside unstable_cache it can still be cached. This type of indication can be removed if we ever\n * make the default dynamic to begin with because the only way you would ever be static is inside\n * a cache scope which this indication does not affect.\n *\n * The second is an indication that a dynamic data source was read. This is a stronger form of dynamic\n * because it means that it is inappropriate to cache this at all. using a dynamic data source inside\n * unstable_cache should error. If you want to use some dynamic data inside unstable_cache you should\n * read that data outside the cache and pass it in as an argument to the cached function.\n */\n\nimport type { WorkStore } from '../app-render/work-async-storage.external'\nimport type {\n WorkUnitStore,\n RequestStore,\n PrerenderStoreLegacy,\n PrerenderStoreModern,\n PrerenderStoreModernRuntime,\n} from '../app-render/work-unit-async-storage.external'\n\n// Once postpone is in stable we should switch to importing the postpone export directly\nimport React from 'react'\n\nimport { DynamicServerError } from '../../client/components/hooks-server-context'\nimport { StaticGenBailoutError } from '../../client/components/static-generation-bailout'\nimport {\n getRuntimeStagePromise,\n throwForMissingRequestStore,\n workUnitAsyncStorage,\n} from './work-unit-async-storage.external'\nimport { workAsyncStorage } from '../app-render/work-async-storage.external'\nimport { makeHangingPromise } from '../dynamic-rendering-utils'\nimport {\n METADATA_BOUNDARY_NAME,\n VIEWPORT_BOUNDARY_NAME,\n OUTLET_BOUNDARY_NAME,\n ROOT_LAYOUT_BOUNDARY_NAME,\n} from '../../lib/framework/boundary-constants'\nimport { scheduleOnNextTick } from '../../lib/scheduler'\nimport { BailoutToCSRError } from '../../shared/lib/lazy-dynamic/bailout-to-csr'\nimport { InvariantError } from '../../shared/lib/invariant-error'\nimport { RenderStage } from './staged-rendering'\n\nconst hasPostpone = typeof React.unstable_postpone === 'function'\n\nexport type DynamicAccess = {\n /**\n * If debugging, this will contain the stack trace of where the dynamic access\n * occurred. This is used to provide more information to the user about why\n * their page is being rendered dynamically.\n */\n stack?: string\n\n /**\n * The expression that was accessed dynamically.\n */\n expression: string\n}\n\n// Stores dynamic reasons used during an RSC render.\nexport type DynamicTrackingState = {\n /**\n * When true, stack information will also be tracked during dynamic access.\n */\n readonly isDebugDynamicAccesses: boolean | undefined\n\n /**\n * The dynamic accesses that occurred during the render.\n */\n readonly dynamicAccesses: Array<DynamicAccess>\n\n syncDynamicErrorWithStack: null | Error\n}\n\n// Stores dynamic reasons used during an SSR render.\nexport type DynamicValidationState = {\n hasSuspenseAboveBody: boolean\n hasDynamicMetadata: boolean\n hasDynamicViewport: boolean\n hasAllowedDynamic: boolean\n dynamicErrors: Array<Error>\n}\n\nexport function createDynamicTrackingState(\n isDebugDynamicAccesses: boolean | undefined\n): DynamicTrackingState {\n return {\n isDebugDynamicAccesses,\n dynamicAccesses: [],\n syncDynamicErrorWithStack: null,\n }\n}\n\nexport function createDynamicValidationState(): DynamicValidationState {\n return {\n hasSuspenseAboveBody: false,\n hasDynamicMetadata: false,\n hasDynamicViewport: false,\n hasAllowedDynamic: false,\n dynamicErrors: [],\n }\n}\n\nexport function getFirstDynamicReason(\n trackingState: DynamicTrackingState\n): undefined | string {\n return trackingState.dynamicAccesses[0]?.expression\n}\n\n/**\n * This function communicates that the current scope should be treated as dynamic.\n *\n * In most cases this function is a no-op but if called during\n * a PPR prerender it will postpone the current sub-tree and calling\n * it during a normal prerender will cause the entire prerender to abort\n */\nexport function markCurrentScopeAsDynamic(\n store: WorkStore,\n workUnitStore: undefined | Exclude<WorkUnitStore, PrerenderStoreModern>,\n expression: string\n): void {\n if (workUnitStore) {\n switch (workUnitStore.type) {\n case 'cache':\n case 'unstable-cache':\n // Inside cache scopes, marking a scope as dynamic has no effect,\n // because the outer cache scope creates a cache boundary. This is\n // subtly different from reading a dynamic data source, which is\n // forbidden inside a cache scope.\n return\n case 'private-cache':\n // A private cache scope is already dynamic by definition.\n return\n case 'prerender-legacy':\n case 'prerender-ppr':\n case 'request':\n break\n default:\n workUnitStore satisfies never\n }\n }\n\n // If we're forcing dynamic rendering or we're forcing static rendering, we\n // don't need to do anything here because the entire page is already dynamic\n // or it's static and it should not throw or postpone here.\n if (store.forceDynamic || store.forceStatic) return\n\n if (store.dynamicShouldError) {\n throw new StaticGenBailoutError(\n `Route ${store.route} with \\`dynamic = \"error\"\\` couldn't be rendered statically because it used \\`${expression}\\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering`\n )\n }\n\n if (workUnitStore) {\n switch (workUnitStore.type) {\n case 'prerender-ppr':\n return postponeWithTracking(\n store.route,\n expression,\n workUnitStore.dynamicTracking\n )\n case 'prerender-legacy':\n workUnitStore.revalidate = 0\n\n // We aren't prerendering, but we are generating a static page. We need\n // to bail out of static generation.\n const err = new DynamicServerError(\n `Route ${store.route} couldn't be rendered statically because it used ${expression}. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`\n )\n store.dynamicUsageDescription = expression\n store.dynamicUsageStack = err.stack\n\n throw err\n case 'request':\n if (process.env.NODE_ENV !== 'production') {\n workUnitStore.usedDynamic = true\n }\n break\n default:\n workUnitStore satisfies never\n }\n }\n}\n\n/**\n * This function is meant to be used when prerendering without cacheComponents or PPR.\n * When called during a build it will cause Next.js to consider the route as dynamic.\n *\n * @internal\n */\nexport function throwToInterruptStaticGeneration(\n expression: string,\n store: WorkStore,\n prerenderStore: PrerenderStoreLegacy\n): never {\n // We aren't prerendering but we are generating a static page. We need to bail out of static generation\n const err = new DynamicServerError(\n `Route ${store.route} couldn't be rendered statically because it used \\`${expression}\\`. See more info here: https://nextjs.org/docs/messages/dynamic-server-error`\n )\n\n prerenderStore.revalidate = 0\n\n store.dynamicUsageDescription = expression\n store.dynamicUsageStack = err.stack\n\n throw err\n}\n\n/**\n * This function should be used to track whether something dynamic happened even when\n * we are in a dynamic render. This is useful for Dev where all renders are dynamic but\n * we still track whether dynamic APIs were accessed for helpful messaging\n *\n * @internal\n */\nexport function trackDynamicDataInDynamicRender(workUnitStore: WorkUnitStore) {\n switch (workUnitStore.type) {\n case 'cache':\n case 'unstable-cache':\n // Inside cache scopes, marking a scope as dynamic has no effect,\n // because the outer cache scope creates a cache boundary. This is\n // subtly different from reading a dynamic data source, which is\n // forbidden inside a cache scope.\n return\n case 'private-cache':\n // A private cache scope is already dynamic by definition.\n return\n case 'prerender':\n case 'prerender-runtime':\n case 'prerender-legacy':\n case 'prerender-ppr':\n case 'prerender-client':\n break\n case 'request':\n if (process.env.NODE_ENV !== 'production') {\n workUnitStore.usedDynamic = true\n }\n break\n default:\n workUnitStore satisfies never\n }\n}\n\nfunction abortOnSynchronousDynamicDataAccess(\n route: string,\n expression: string,\n prerenderStore: PrerenderStoreModern\n): void {\n const reason = `Route ${route} needs to bail out of prerendering at this point because it used ${expression}.`\n\n const error = createPrerenderInterruptedError(reason)\n\n prerenderStore.controller.abort(error)\n\n const dynamicTracking = prerenderStore.dynamicTracking\n if (dynamicTracking) {\n dynamicTracking.dynamicAccesses.push({\n // When we aren't debugging, we don't need to create another error for the\n // stack trace.\n stack: dynamicTracking.isDebugDynamicAccesses\n ? new Error().stack\n : undefined,\n expression,\n })\n }\n}\n\nexport function abortOnSynchronousPlatformIOAccess(\n route: string,\n expression: string,\n errorWithStack: Error,\n prerenderStore: PrerenderStoreModern\n): void {\n const dynamicTracking = prerenderStore.dynamicTracking\n abortOnSynchronousDynamicDataAccess(route, expression, prerenderStore)\n // It is important that we set this tracking value after aborting. Aborts are executed\n // synchronously except for the case where you abort during render itself. By setting this\n // value late we can use it to determine if any of the aborted tasks are the task that\n // called the sync IO expression in the first place.\n if (dynamicTracking) {\n if (dynamicTracking.syncDynamicErrorWithStack === null) {\n dynamicTracking.syncDynamicErrorWithStack = errorWithStack\n }\n }\n}\n\nexport function trackSynchronousPlatformIOAccessInDev(\n requestStore: RequestStore\n): void {\n // We don't actually have a controller to abort but we do the semantic equivalent by\n // advancing the request store out of the prerender stage\n if (requestStore.stagedRendering) {\n // TODO: error for sync IO in the runtime stage\n // (which is not currently covered by the validation render in `spawnDynamicValidationInDev`)\n requestStore.stagedRendering.advanceStage(RenderStage.Dynamic)\n }\n}\n\n/**\n * use this function when prerendering with cacheComponents. If we are doing a\n * prospective prerender we don't actually abort because we want to discover\n * all caches for the shell. If this is the actual prerender we do abort.\n *\n * This function accepts a prerenderStore but the caller should ensure we're\n * actually running in cacheComponents mode.\n *\n * @internal\n */\nexport function abortAndThrowOnSynchronousRequestDataAccess(\n route: string,\n expression: string,\n errorWithStack: Error,\n prerenderStore: PrerenderStoreModern\n): never {\n const prerenderSignal = prerenderStore.controller.signal\n if (prerenderSignal.aborted === false) {\n // TODO it would be better to move this aborted check into the callsite so we can avoid making\n // the error object when it isn't relevant to the aborting of the prerender however\n // since we need the throw semantics regardless of whether we abort it is easier to land\n // this way. See how this was handled with `abortOnSynchronousPlatformIOAccess` for a closer\n // to ideal implementation\n abortOnSynchronousDynamicDataAccess(route, expression, prerenderStore)\n // It is important that we set this tracking value after aborting. Aborts are executed\n // synchronously except for the case where you abort during render itself. By setting this\n // value late we can use it to determine if any of the aborted tasks are the task that\n // called the sync IO expression in the first place.\n const dynamicTracking = prerenderStore.dynamicTracking\n if (dynamicTracking) {\n if (dynamicTracking.syncDynamicErrorWithStack === null) {\n dynamicTracking.syncDynamicErrorWithStack = errorWithStack\n }\n }\n }\n throw createPrerenderInterruptedError(\n `Route ${route} needs to bail out of prerendering at this point because it used ${expression}.`\n )\n}\n\n/**\n * This component will call `React.postpone` that throws the postponed error.\n */\ntype PostponeProps = {\n reason: string\n route: string\n}\nexport function Postpone({ reason, route }: PostponeProps): never {\n const prerenderStore = workUnitAsyncStorage.getStore()\n const dynamicTracking =\n prerenderStore && prerenderStore.type === 'prerender-ppr'\n ? prerenderStore.dynamicTracking\n : null\n postponeWithTracking(route, reason, dynamicTracking)\n}\n\nexport function postponeWithTracking(\n route: string,\n expression: string,\n dynamicTracking: null | DynamicTrackingState\n): never {\n assertPostpone()\n if (dynamicTracking) {\n dynamicTracking.dynamicAccesses.push({\n // When we aren't debugging, we don't need to create another error for the\n // stack trace.\n stack: dynamicTracking.isDebugDynamicAccesses\n ? new Error().stack\n : undefined,\n expression,\n })\n }\n\n React.unstable_postpone(createPostponeReason(route, expression))\n}\n\nfunction createPostponeReason(route: string, expression: string) {\n return (\n `Route ${route} needs to bail out of prerendering at this point because it used ${expression}. ` +\n `React throws this special object to indicate where. It should not be caught by ` +\n `your own try/catch. Learn more: https://nextjs.org/docs/messages/ppr-caught-error`\n )\n}\n\nexport function isDynamicPostpone(err: unknown) {\n if (\n typeof err === 'object' &&\n err !== null &&\n typeof (err as any).message === 'string'\n ) {\n return isDynamicPostponeReason((err as any).message)\n }\n return false\n}\n\nfunction isDynamicPostponeReason(reason: string) {\n return (\n reason.includes(\n 'needs to bail out of prerendering at this point because it used'\n ) &&\n reason.includes(\n 'Learn more: https://nextjs.org/docs/messages/ppr-caught-error'\n )\n )\n}\n\nif (isDynamicPostponeReason(createPostponeReason('%%%', '^^^')) === false) {\n throw new Error(\n 'Invariant: isDynamicPostpone misidentified a postpone reason. This is a bug in Next.js'\n )\n}\n\nconst NEXT_PRERENDER_INTERRUPTED = 'NEXT_PRERENDER_INTERRUPTED'\n\nfunction createPrerenderInterruptedError(message: string): Error {\n const error = new Error(message)\n ;(error as any).digest = NEXT_PRERENDER_INTERRUPTED\n return error\n}\n\ntype DigestError = Error & {\n digest: string\n}\n\nexport function isPrerenderInterruptedError(\n error: unknown\n): error is DigestError {\n return (\n typeof error === 'object' &&\n error !== null &&\n (error as any).digest === NEXT_PRERENDER_INTERRUPTED &&\n 'name' in error &&\n 'message' in error &&\n error instanceof Error\n )\n}\n\nexport function accessedDynamicData(\n dynamicAccesses: Array<DynamicAccess>\n): boolean {\n return dynamicAccesses.length > 0\n}\n\nexport function consumeDynamicAccess(\n serverDynamic: DynamicTrackingState,\n clientDynamic: DynamicTrackingState\n): DynamicTrackingState['dynamicAccesses'] {\n // We mutate because we only call this once we are no longer writing\n // to the dynamicTrackingState and it's more efficient than creating a new\n // array.\n serverDynamic.dynamicAccesses.push(...clientDynamic.dynamicAccesses)\n return serverDynamic.dynamicAccesses\n}\n\nexport function formatDynamicAPIAccesses(\n dynamicAccesses: Array<DynamicAccess>\n): string[] {\n return dynamicAccesses\n .filter(\n (access): access is Required<DynamicAccess> =>\n typeof access.stack === 'string' && access.stack.length > 0\n )\n .map(({ expression, stack }) => {\n stack = stack\n .split('\\n')\n // Remove the \"Error: \" prefix from the first line of the stack trace as\n // well as the first 4 lines of the stack trace which is the distance\n // from the user code and the `new Error().stack` call.\n .slice(4)\n .filter((line) => {\n // Exclude Next.js internals from the stack trace.\n if (line.includes('node_modules/next/')) {\n return false\n }\n\n // Exclude anonymous functions from the stack trace.\n if (line.includes(' (<anonymous>)')) {\n return false\n }\n\n // Exclude Node.js internals from the stack trace.\n if (line.includes(' (node:')) {\n return false\n }\n\n return true\n })\n .join('\\n')\n return `Dynamic API Usage Debug - ${expression}:\\n${stack}`\n })\n}\n\nfunction assertPostpone() {\n if (!hasPostpone) {\n throw new Error(\n `Invariant: React.unstable_postpone is not defined. This suggests the wrong version of React was loaded. This is a bug in Next.js`\n )\n }\n}\n\n/**\n * This is a bit of a hack to allow us to abort a render using a Postpone instance instead of an Error which changes React's\n * abort semantics slightly.\n */\nexport function createRenderInBrowserAbortSignal(): AbortSignal {\n const controller = new AbortController()\n controller.abort(new BailoutToCSRError('Render in Browser'))\n return controller.signal\n}\n\n/**\n * In a prerender, we may end up with hanging Promises as inputs due them\n * stalling on connection() or because they're loading dynamic data. In that\n * case we need to abort the encoding of arguments since they'll never complete.\n */\nexport function createHangingInputAbortSignal(\n workUnitStore: WorkUnitStore\n): AbortSignal | undefined {\n switch (workUnitStore.type) {\n case 'prerender':\n case 'prerender-runtime':\n const controller = new AbortController()\n\n if (workUnitStore.cacheSignal) {\n // If we have a cacheSignal it means we're in a prospective render. If\n // the input we're waiting on is coming from another cache, we do want\n // to wait for it so that we can resolve this cache entry too.\n workUnitStore.cacheSignal.inputReady().then(() => {\n controller.abort()\n })\n } else {\n // Otherwise we're in the final render and we should already have all\n // our caches filled.\n // If the prerender uses stages, we have wait until the runtime stage,\n // at which point all runtime inputs will be resolved.\n // (otherwise, a runtime prerender might consider `cookies()` hanging\n // even though they'd resolve in the next task.)\n //\n // We might still be waiting on some microtasks so we\n // wait one tick before giving up. When we give up, we still want to\n // render the content of this cache as deeply as we can so that we can\n // suspend as deeply as possible in the tree or not at all if we don't\n // end up waiting for the input.\n const runtimeStagePromise = getRuntimeStagePromise(workUnitStore)\n if (runtimeStagePromise) {\n runtimeStagePromise.then(() =>\n scheduleOnNextTick(() => controller.abort())\n )\n } else {\n scheduleOnNextTick(() => controller.abort())\n }\n }\n\n return controller.signal\n case 'prerender-client':\n case 'prerender-ppr':\n case 'prerender-legacy':\n case 'request':\n case 'cache':\n case 'private-cache':\n case 'unstable-cache':\n return undefined\n default:\n workUnitStore satisfies never\n }\n}\n\nexport function annotateDynamicAccess(\n expression: string,\n prerenderStore: PrerenderStoreModern\n) {\n const dynamicTracking = prerenderStore.dynamicTracking\n if (dynamicTracking) {\n dynamicTracking.dynamicAccesses.push({\n stack: dynamicTracking.isDebugDynamicAccesses\n ? new Error().stack\n : undefined,\n expression,\n })\n }\n}\n\nexport function useDynamicRouteParams(expression: string) {\n const workStore = workAsyncStorage.getStore()\n const workUnitStore = workUnitAsyncStorage.getStore()\n if (workStore && workUnitStore) {\n switch (workUnitStore.type) {\n case 'prerender-client':\n case 'prerender': {\n const fallbackParams = workUnitStore.fallbackRouteParams\n\n if (fallbackParams && fallbackParams.size > 0) {\n // We are in a prerender with cacheComponents semantics. We are going to\n // hang here and never resolve. This will cause the currently\n // rendering component to effectively be a dynamic hole.\n React.use(\n makeHangingPromise(\n workUnitStore.renderSignal,\n workStore.route,\n expression\n )\n )\n }\n break\n }\n case 'prerender-ppr': {\n const fallbackParams = workUnitStore.fallbackRouteParams\n if (fallbackParams && fallbackParams.size > 0) {\n return postponeWithTracking(\n workStore.route,\n expression,\n workUnitStore.dynamicTracking\n )\n }\n break\n }\n case 'prerender-runtime':\n throw new InvariantError(\n `\\`${expression}\\` was called during a runtime prerender. Next.js should be preventing ${expression} from being included in server components statically, but did not in this case.`\n )\n case 'cache':\n case 'private-cache':\n throw new InvariantError(\n `\\`${expression}\\` was called inside a cache scope. Next.js should be preventing ${expression} from being included in server components statically, but did not in this case.`\n )\n case 'prerender-legacy':\n case 'request':\n case 'unstable-cache':\n break\n default:\n workUnitStore satisfies never\n }\n }\n}\n\nexport function useDynamicSearchParams(expression: string) {\n const workStore = workAsyncStorage.getStore()\n const workUnitStore = workUnitAsyncStorage.getStore()\n\n if (!workStore) {\n // We assume pages router context and just return\n return\n }\n\n if (!workUnitStore) {\n throwForMissingRequestStore(expression)\n }\n\n switch (workUnitStore.type) {\n case 'prerender-client': {\n React.use(\n makeHangingPromise(\n workUnitStore.renderSignal,\n workStore.route,\n expression\n )\n )\n break\n }\n case 'prerender-legacy':\n case 'prerender-ppr': {\n if (workStore.forceStatic) {\n return\n }\n throw new BailoutToCSRError(expression)\n }\n case 'prerender':\n case 'prerender-runtime':\n throw new InvariantError(\n `\\`${expression}\\` was called from a Server Component. Next.js should be preventing ${expression} from being included in server components statically, but did not in this case.`\n )\n case 'cache':\n case 'unstable-cache':\n case 'private-cache':\n throw new InvariantError(\n `\\`${expression}\\` was called inside a cache scope. Next.js should be preventing ${expression} from being included in server components statically, but did not in this case.`\n )\n case 'request':\n return\n default:\n workUnitStore satisfies never\n }\n}\n\nconst hasSuspenseRegex = /\\n\\s+at Suspense \\(<anonymous>\\)/\n\n// Common implicit body tags that React will treat as body when placed directly in html\nconst bodyAndImplicitTags =\n 'body|div|main|section|article|aside|header|footer|nav|form|p|span|h1|h2|h3|h4|h5|h6'\n\n// Detects when RootLayoutBoundary (our framework marker component) appears\n// after Suspense in the component stack, indicating the root layout is wrapped\n// within a Suspense boundary. Ensures no body/html/implicit-body components are in between.\n//\n// Example matches:\n// at Suspense (<anonymous>)\n// at __next_root_layout_boundary__ (<anonymous>)\n//\n// Or with other components in between (but not body/html/implicit-body):\n// at Suspense (<anonymous>)\n// at SomeComponent (<anonymous>)\n// at __next_root_layout_boundary__ (<anonymous>)\nconst hasSuspenseBeforeRootLayoutWithoutBodyOrImplicitBodyRegex = new RegExp(\n `\\\\n\\\\s+at Suspense \\\\(<anonymous>\\\\)(?:(?!\\\\n\\\\s+at (?:${bodyAndImplicitTags}) \\\\(<anonymous>\\\\))[\\\\s\\\\S])*?\\\\n\\\\s+at ${ROOT_LAYOUT_BOUNDARY_NAME} \\\\([^\\\\n]*\\\\)`\n)\n\nconst hasMetadataRegex = new RegExp(\n `\\\\n\\\\s+at ${METADATA_BOUNDARY_NAME}[\\\\n\\\\s]`\n)\nconst hasViewportRegex = new RegExp(\n `\\\\n\\\\s+at ${VIEWPORT_BOUNDARY_NAME}[\\\\n\\\\s]`\n)\nconst hasOutletRegex = new RegExp(`\\\\n\\\\s+at ${OUTLET_BOUNDARY_NAME}[\\\\n\\\\s]`)\n\nexport function trackAllowedDynamicAccess(\n workStore: WorkStore,\n componentStack: string,\n dynamicValidation: DynamicValidationState,\n clientDynamic: DynamicTrackingState\n) {\n if (hasOutletRegex.test(componentStack)) {\n // We don't need to track that this is dynamic. It is only so when something else is also dynamic.\n return\n } else if (hasMetadataRegex.test(componentStack)) {\n dynamicValidation.hasDynamicMetadata = true\n return\n } else if (hasViewportRegex.test(componentStack)) {\n dynamicValidation.hasDynamicViewport = true\n return\n } else if (\n hasSuspenseBeforeRootLayoutWithoutBodyOrImplicitBodyRegex.test(\n componentStack\n )\n ) {\n // For Suspense within body, the prelude wouldn't be empty so it wouldn't violate the empty static shells rule.\n // But if you have Suspense above body, the prelude is empty but we allow that because having Suspense\n // is an explicit signal from the user that they acknowledge the empty shell and want dynamic rendering.\n dynamicValidation.hasAllowedDynamic = true\n dynamicValidation.hasSuspenseAboveBody = true\n return\n } else if (hasSuspenseRegex.test(componentStack)) {\n // this error had a Suspense boundary above it so we don't need to report it as a source\n // of disallowed\n dynamicValidation.hasAllowedDynamic = true\n return\n } else if (clientDynamic.syncDynamicErrorWithStack) {\n // This task was the task that called the sync error.\n dynamicValidation.dynamicErrors.push(\n clientDynamic.syncDynamicErrorWithStack\n )\n return\n } else {\n const message =\n `Route \"${workStore.route}\": Uncached data was accessed outside of ` +\n '<Suspense>. This delays the entire page from rendering, resulting in a ' +\n 'slow user experience. Learn more: ' +\n 'https://nextjs.org/docs/messages/blocking-route'\n const error = createErrorWithComponentOrOwnerStack(message, componentStack)\n dynamicValidation.dynamicErrors.push(error)\n return\n }\n}\n\n/**\n * In dev mode, we prefer using the owner stack, otherwise the provided\n * component stack is used.\n */\nfunction createErrorWithComponentOrOwnerStack(\n message: string,\n componentStack: string\n) {\n const ownerStack =\n process.env.NODE_ENV !== 'production' && React.captureOwnerStack\n ? React.captureOwnerStack()\n : null\n\n const error = new Error(message)\n error.stack = error.name + ': ' + message + (ownerStack ?? componentStack)\n return error\n}\n\nexport enum PreludeState {\n Full = 0,\n Empty = 1,\n Errored = 2,\n}\n\nexport function logDisallowedDynamicError(\n workStore: WorkStore,\n error: Error\n): void {\n console.error(error)\n\n if (!workStore.dev) {\n if (workStore.hasReadableErrorStacks) {\n console.error(\n `To get a more detailed stack trace and pinpoint the issue, start the app in development mode by running \\`next dev\\`, then open \"${workStore.route}\" in your browser to investigate the error.`\n )\n } else {\n console.error(`To get a more detailed stack trace and pinpoint the issue, try one of the following:\n - Start the app in development mode by running \\`next dev\\`, then open \"${workStore.route}\" in your browser to investigate the error.\n - Rerun the production build with \\`next build --debug-prerender\\` to generate better stack traces.`)\n }\n }\n}\n\nexport function throwIfDisallowedDynamic(\n workStore: WorkStore,\n prelude: PreludeState,\n dynamicValidation: DynamicValidationState,\n serverDynamic: DynamicTrackingState\n): void {\n if (serverDynamic.syncDynamicErrorWithStack) {\n logDisallowedDynamicError(\n workStore,\n serverDynamic.syncDynamicErrorWithStack\n )\n throw new StaticGenBailoutError()\n }\n\n if (prelude !== PreludeState.Full) {\n if (dynamicValidation.hasSuspenseAboveBody) {\n // This route has opted into allowing fully dynamic rendering\n // by including a Suspense boundary above the body. In this case\n // a lack of a shell is not considered disallowed so we simply return\n return\n }\n\n // We didn't have any sync bailouts but there may be user code which\n // blocked the root. We would have captured these during the prerender\n // and can log them here and then terminate the build/validating render\n const dynamicErrors = dynamicValidation.dynamicErrors\n if (dynamicErrors.length > 0) {\n for (let i = 0; i < dynamicErrors.length; i++) {\n logDisallowedDynamicError(workStore, dynamicErrors[i])\n }\n\n throw new StaticGenBailoutError()\n }\n\n // If we got this far then the only other thing that could be blocking\n // the root is dynamic Viewport. If this is dynamic then\n // you need to opt into that by adding a Suspense boundary above the body\n // to indicate your are ok with fully dynamic rendering.\n if (dynamicValidation.hasDynamicViewport) {\n console.error(\n `Route \"${workStore.route}\" has a \\`generateViewport\\` that depends on Request data (\\`cookies()\\`, etc...) or uncached external data (\\`fetch(...)\\`, etc...) without explicitly allowing fully dynamic rendering. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-viewport`\n )\n throw new StaticGenBailoutError()\n }\n\n if (prelude === PreludeState.Empty) {\n // If we ever get this far then we messed up the tracking of invalid dynamic.\n // We still adhere to the constraint that you must produce a shell but invite the\n // user to report this as a bug in Next.js.\n console.error(\n `Route \"${workStore.route}\" did not produce a static shell and Next.js was unable to determine a reason. This is a bug in Next.js.`\n )\n throw new StaticGenBailoutError()\n }\n } else {\n if (\n dynamicValidation.hasAllowedDynamic === false &&\n dynamicValidation.hasDynamicMetadata\n ) {\n console.error(\n `Route \"${workStore.route}\" has a \\`generateMetadata\\` that depends on Request data (\\`cookies()\\`, etc...) or uncached external data (\\`fetch(...)\\`, etc...) when the rest of the route does not. See more info here: https://nextjs.org/docs/messages/next-prerender-dynamic-metadata`\n )\n throw new StaticGenBailoutError()\n }\n }\n}\n\nexport function delayUntilRuntimeStage<T>(\n prerenderStore: PrerenderStoreModernRuntime,\n result: Promise<T>\n): Promise<T> {\n if (prerenderStore.runtimeStagePromise) {\n return prerenderStore.runtimeStagePromise.then(() => result)\n }\n return result\n}\n","import { isHangingPromiseRejectionError } from '../../server/dynamic-rendering-utils'\nimport { isPostpone } from '../../server/lib/router-utils/is-postpone'\nimport { isBailoutToCSRError } from '../../shared/lib/lazy-dynamic/bailout-to-csr'\nimport { isNextRouterError } from './is-next-router-error'\nimport {\n isDynamicPostpone,\n isPrerenderInterruptedError,\n} from '../../server/app-render/dynamic-rendering'\nimport { isDynamicServerError } from './hooks-server-context'\n\nexport function unstable_rethrow(error: unknown): void {\n if (\n isNextRouterError(error) ||\n isBailoutToCSRError(error) ||\n isDynamicServerError(error) ||\n isDynamicPostpone(error) ||\n isPostpone(error) ||\n isHangingPromiseRejectionError(error) ||\n isPrerenderInterruptedError(error)\n ) {\n throw error\n }\n\n if (error instanceof Error && 'cause' in error) {\n unstable_rethrow(error.cause)\n }\n}\n","/**\n * This function should be used to rethrow internal Next.js errors so that they can be handled by the framework.\n * When wrapping an API that uses errors to interrupt control flow, you should use this function before you do any error handling.\n * This function will rethrow the error if it is a Next.js error so it can be handled, otherwise it will do nothing.\n *\n * Read more: [Next.js Docs: `unstable_rethrow`](https://nextjs.org/docs/app/api-reference/functions/unstable_rethrow)\n */\nexport const unstable_rethrow =\n typeof window === 'undefined'\n ? (\n require('./unstable-rethrow.server') as typeof import('./unstable-rethrow.server')\n ).unstable_rethrow\n : (\n require('./unstable-rethrow.browser') as typeof import('./unstable-rethrow.browser')\n ).unstable_rethrow\n","import { ReadonlyURLSearchParams } from './readonly-url-search-params'\n\nexport function unstable_isUnrecognizedActionError(): boolean {\n throw new Error(\n '`unstable_isUnrecognizedActionError` can only be used on the client.'\n )\n}\n\nexport { redirect, permanentRedirect } from './redirect'\nexport { RedirectType } from './redirect-error'\nexport { notFound } from './not-found'\nexport { forbidden } from './forbidden'\nexport { unauthorized } from './unauthorized'\nexport { unstable_rethrow } from './unstable-rethrow'\nexport { ReadonlyURLSearchParams }\n","import type { Params } from '../../server/request/params'\n\nimport React, { useContext, useMemo, use } from 'react'\nimport {\n AppRouterContext,\n LayoutRouterContext,\n type AppRouterInstance,\n} from '../../shared/lib/app-router-context.shared-runtime'\nimport {\n SearchParamsContext,\n PathnameContext,\n PathParamsContext,\n NavigationPromisesContext,\n} from '../../shared/lib/hooks-client-context.shared-runtime'\nimport {\n computeSelectedLayoutSegment,\n getSelectedLayoutSegmentPath,\n} from '../../shared/lib/segment'\nimport { ReadonlyURLSearchParams } from './readonly-url-search-params'\n\nconst useDynamicRouteParams =\n typeof window === 'undefined'\n ? (\n require('../../server/app-render/dynamic-rendering') as typeof import('../../server/app-render/dynamic-rendering')\n ).useDynamicRouteParams\n : undefined\n\nconst useDynamicSearchParams =\n typeof window === 'undefined'\n ? (\n require('../../server/app-render/dynamic-rendering') as typeof import('../../server/app-render/dynamic-rendering')\n ).useDynamicSearchParams\n : undefined\n\n/**\n * A [Client Component](https://nextjs.org/docs/app/building-your-application/rendering/client-components) hook\n * that lets you *read* the current URL's search parameters.\n *\n * Learn more about [`URLSearchParams` on MDN](https://developer.mozilla.org/docs/Web/API/URLSearchParams)\n *\n * @example\n * ```ts\n * \"use client\"\n * import { useSearchParams } from 'next/navigation'\n *\n * export default function Page() {\n * const searchParams = useSearchParams()\n * searchParams.get('foo') // returns 'bar' when ?foo=bar\n * // ...\n * }\n * ```\n *\n * Read more: [Next.js Docs: `useSearchParams`](https://nextjs.org/docs/app/api-reference/functions/use-search-params)\n */\n// Client components API\nexport function useSearchParams(): ReadonlyURLSearchParams {\n useDynamicSearchParams?.('useSearchParams()')\n\n const searchParams = useContext(SearchParamsContext)\n\n // In the case where this is `null`, the compat types added in\n // `next-env.d.ts` will add a new overload that changes the return type to\n // include `null`.\n const readonlySearchParams = useMemo(() => {\n if (!searchParams) {\n // When the router is not ready in pages, we won't have the search params\n // available.\n return null\n }\n\n return new ReadonlyURLSearchParams(searchParams)\n }, [searchParams]) as ReadonlyURLSearchParams\n\n // Instrument with Suspense DevTools (dev-only)\n if (process.env.NODE_ENV !== 'production' && 'use' in React) {\n const navigationPromises = use(NavigationPromisesContext)\n if (navigationPromises) {\n return use(navigationPromises.searchParams)\n }\n }\n\n return readonlySearchParams\n}\n\n/**\n * A [Client Component](https://nextjs.org/docs/app/building-your-application/rendering/client-components) hook\n * that lets you read the current URL's pathname.\n *\n * @example\n * ```ts\n * \"use client\"\n * import { usePathname } from 'next/navigation'\n *\n * export default function Page() {\n * const pathname = usePathname() // returns \"/dashboard\" on /dashboard?foo=bar\n * // ...\n * }\n * ```\n *\n * Read more: [Next.js Docs: `usePathname`](https://nextjs.org/docs/app/api-reference/functions/use-pathname)\n */\n// Client components API\nexport function usePathname(): string {\n useDynamicRouteParams?.('usePathname()')\n\n // In the case where this is `null`, the compat types added in `next-env.d.ts`\n // will add a new overload that changes the return type to include `null`.\n const pathname = useContext(PathnameContext) as string\n\n // Instrument with Suspense DevTools (dev-only)\n if (process.env.NODE_ENV !== 'production' && 'use' in React) {\n const navigationPromises = use(NavigationPromisesContext)\n if (navigationPromises) {\n return use(navigationPromises.pathname)\n }\n }\n\n return pathname\n}\n\n// Client components API\nexport {\n ServerInsertedHTMLContext,\n useServerInsertedHTML,\n} from '../../shared/lib/server-inserted-html.shared-runtime'\n\n/**\n *\n * This hook allows you to programmatically change routes inside [Client Component](https://nextjs.org/docs/app/building-your-application/rendering/client-components).\n *\n * @example\n * ```ts\n * \"use client\"\n * import { useRouter } from 'next/navigation'\n *\n * export default function Page() {\n * const router = useRouter()\n * // ...\n * router.push('/dashboard') // Navigate to /dashboard\n * }\n * ```\n *\n * Read more: [Next.js Docs: `useRouter`](https://nextjs.org/docs/app/api-reference/functions/use-router)\n */\n// Client components API\nexport function useRouter(): AppRouterInstance {\n const router = useContext(AppRouterContext)\n if (router === null) {\n throw new Error('invariant expected app router to be mounted')\n }\n\n return router\n}\n\n/**\n * A [Client Component](https://nextjs.org/docs/app/building-your-application/rendering/client-components) hook\n * that lets you read a route's dynamic params filled in by the current URL.\n *\n * @example\n * ```ts\n * \"use client\"\n * import { useParams } from 'next/navigation'\n *\n * export default function Page() {\n * // on /dashboard/[team] where pathname is /dashboard/nextjs\n * const { team } = useParams() // team === \"nextjs\"\n * }\n * ```\n *\n * Read more: [Next.js Docs: `useParams`](https://nextjs.org/docs/app/api-reference/functions/use-params)\n */\n// Client components API\nexport function useParams<T extends Params = Params>(): T {\n useDynamicRouteParams?.('useParams()')\n\n const params = useContext(PathParamsContext) as T\n\n // Instrument with Suspense DevTools (dev-only)\n if (process.env.NODE_ENV !== 'production' && 'use' in React) {\n const navigationPromises = use(NavigationPromisesContext)\n if (navigationPromises) {\n return use(navigationPromises.params) as T\n }\n }\n\n return params\n}\n\n/**\n * A [Client Component](https://nextjs.org/docs/app/building-your-application/rendering/client-components) hook\n * that lets you read the active route segments **below** the Layout it is called from.\n *\n * @example\n * ```ts\n * 'use client'\n *\n * import { useSelectedLayoutSegments } from 'next/navigation'\n *\n * export default function ExampleClientComponent() {\n * const segments = useSelectedLayoutSegments()\n *\n * return (\n * <ul>\n * {segments.map((segment, index) => (\n * <li key={index}>{segment}</li>\n * ))}\n * </ul>\n * )\n * }\n * ```\n *\n * Read more: [Next.js Docs: `useSelectedLayoutSegments`](https://nextjs.org/docs/app/api-reference/functions/use-selected-layout-segments)\n */\n// Client components API\nexport function useSelectedLayoutSegments(\n parallelRouteKey: string = 'children'\n): string[] {\n useDynamicRouteParams?.('useSelectedLayoutSegments()')\n\n const context = useContext(LayoutRouterContext)\n // @ts-expect-error This only happens in `pages`. Type is overwritten in navigation.d.ts\n if (!context) return null\n\n // Instrument with Suspense DevTools (dev-only)\n if (process.env.NODE_ENV !== 'production' && 'use' in React) {\n const navigationPromises = use(NavigationPromisesContext)\n if (navigationPromises) {\n const promise =\n navigationPromises.selectedLayoutSegmentsPromises?.get(parallelRouteKey)\n if (promise) {\n // We should always have a promise here, but if we don't, it's not worth erroring over.\n // We just won't be able to instrument it, but can still provide the value.\n return use(promise)\n }\n }\n }\n\n return getSelectedLayoutSegmentPath(context.parentTree, parallelRouteKey)\n}\n\n/**\n * A [Client Component](https://nextjs.org/docs/app/building-your-application/rendering/client-components) hook\n * that lets you read the active route segment **one level below** the Layout it is called from.\n *\n * @example\n * ```ts\n * 'use client'\n * import { useSelectedLayoutSegment } from 'next/navigation'\n *\n * export default function ExampleClientComponent() {\n * const segment = useSelectedLayoutSegment()\n *\n * return <p>Active segment: {segment}</p>\n * }\n * ```\n *\n * Read more: [Next.js Docs: `useSelectedLayoutSegment`](https://nextjs.org/docs/app/api-reference/functions/use-selected-layout-segment)\n */\n// Client components API\nexport function useSelectedLayoutSegment(\n parallelRouteKey: string = 'children'\n): string | null {\n useDynamicRouteParams?.('useSelectedLayoutSegment()')\n const navigationPromises = useContext(NavigationPromisesContext)\n const selectedLayoutSegments = useSelectedLayoutSegments(parallelRouteKey)\n\n // Instrument with Suspense DevTools (dev-only)\n if (\n process.env.NODE_ENV !== 'production' &&\n navigationPromises &&\n 'use' in React\n ) {\n const promise =\n navigationPromises.selectedLayoutSegmentPromises?.get(parallelRouteKey)\n if (promise) {\n // We should always have a promise here, but if we don't, it's not worth erroring over.\n // We just won't be able to instrument it, but can still provide the value.\n return use(promise)\n }\n }\n\n return computeSelectedLayoutSegment(selectedLayoutSegments, parallelRouteKey)\n}\n\nexport { unstable_isUnrecognizedActionError } from './unrecognized-action-error'\n\n// Shared components APIs\nexport {\n notFound,\n forbidden,\n unauthorized,\n redirect,\n permanentRedirect,\n RedirectType,\n ReadonlyURLSearchParams,\n unstable_rethrow,\n} from './navigation.react-server'\n","module.exports = require('./dist/client/components/navigation')\n","\"use client\"\n\nimport Image from \"next/image\"\nimport { useRouter, useSearchParams } from \"next/navigation\"\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\"\nimport { DarkModeToggle } from \"@/components/dark-mode-toggle\"\nimport { useDarkMode } from \"@/hooks/use-dark-mode\"\nimport type { LogEntry, LogFile, LogListResponse, LogsApiResponse } from \"@/types\"\nimport { getTextColor, LOG_COLORS } from \"../../../src/constants/log-colors\"\n\n// Define interfaces for object property rendering\ninterface PropertyData {\n name: string\n value: string | number | boolean | null\n type: string\n subtype?: string\n}\n\ninterface ReplayEvent {\n timestamp: string\n event: string\n details: string\n type?: string\n x?: number\n y?: number\n target?: string\n direction?: string\n distance?: number\n key?: string\n}\n\nimport { parseLogEntries } from \"./utils\"\n\n// Keep this for backwards compatibility, but it's not used anymore\nfunction _parseLogLine(line: string): LogEntry | null {\n const match = line.match(/^\\[([^\\]]+)\\] \\[([^\\]]+)\\] (.*)$/s)\n if (!match) return null\n\n const [, timestamp, source, message] = match\n const screenshot = message.match(/\\[SCREENSHOT\\] (.+)/)?.[1]\n\n return {\n timestamp,\n source,\n message,\n screenshot,\n original: line\n }\n}\n\n// Component to render truncated URLs with click-to-expand\nfunction URLRenderer({ url, maxLength = 60 }: { url: string; maxLength?: number }) {\n const [isExpanded, setIsExpanded] = useState(false)\n\n if (url.length <= maxLength) {\n return (\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 underline\"\n >\n {url}\n </a>\n )\n }\n\n const truncated = `${url.substring(0, maxLength)}...`\n\n return (\n <span className=\"inline-block\">\n {isExpanded ? (\n <span>\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 underline\"\n >\n {url}\n </a>\n <button\n type=\"button\"\n onClick={() => setIsExpanded(false)}\n className=\"ml-2 text-xs text-muted-foreground hover:text-foreground px-1 py-0.5 rounded hover:bg-muted\"\n >\n [collapse]\n </button>\n </span>\n ) : (\n <span>\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 underline\"\n >\n {truncated}\n </a>\n <button\n type=\"button\"\n onClick={() => setIsExpanded(true)}\n className=\"ml-1 text-xs text-muted-foreground hover:text-foreground px-1 py-0.5 rounded hover:bg-muted\"\n >\n [expand]\n </button>\n </span>\n )}\n </span>\n )\n}\n\n// Component to render Chrome DevTools-style collapsible objects\nfunction ObjectRenderer({ content }: { content: string }) {\n const [isExpanded, setIsExpanded] = useState(false)\n\n try {\n const obj = JSON.parse(content)\n\n // Check if it's a Chrome DevTools object representation\n if (obj && typeof obj === \"object\" && obj.type === \"object\" && obj.properties) {\n const properties = obj.properties\n const description = obj.description || \"Object\"\n const overflow = obj.overflow\n\n return (\n <div className=\"inline-block\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"inline-flex items-center gap-1 text-blue-600 hover:text-blue-800 font-mono text-sm\"\n >\n <svg\n className={`w-3 h-3 transition-transform ${isExpanded ? \"rotate-90\" : \"\"}`}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 111.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"text-purple-600\">{description}</span>\n {!isExpanded && (\n <span className=\"text-gray-500\">\n {overflow ? \"...\" : \"\"} {\"{\"}\n {properties.slice(0, 3).map((prop: PropertyData, idx: number) => (\n <span key={`${prop.name}-${idx}`}>\n {idx > 0 && \", \"}\n <span className=\"text-red-600\">{prop.name}</span>:\n <span className=\"text-blue-600\">\n {prop.type === \"string\"\n ? `\"${prop.value}\"`\n : prop.type === \"number\"\n ? prop.value\n : prop.type === \"object\"\n ? prop.subtype === \"array\"\n ? prop.value\n : \"{...}\"\n : prop.value}\n </span>\n </span>\n ))}\n {properties.length > 3 && \", ...\"}\n {\"}\"}\n </span>\n )}\n </button>\n\n {isExpanded && (\n <div className=\"mt-1 ml-4 border-l-2 border-gray-200 pl-3\">\n <div className=\"font-mono text-sm\">\n <div className=\"text-gray-600\">\n {description} {\"{\"}\n <div className=\"ml-4\">\n {properties.map((prop: PropertyData, idx: number) => (\n <div key={`${prop.name}-${idx}`} className=\"py-0.5\">\n <span className=\"text-red-600\">{prop.name}</span>\n <span className=\"text-gray-500\">: </span>\n <span\n className={\n prop.type === \"string\"\n ? \"text-green-600\"\n : prop.type === \"number\"\n ? \"text-blue-600\"\n : prop.type === \"object\"\n ? \"text-purple-600\"\n : \"text-orange-600\"\n }\n >\n {prop.type === \"string\"\n ? `\"${String(prop.value)}\"`\n : prop.type === \"number\"\n ? String(prop.value)\n : prop.type === \"object\"\n ? prop.subtype === \"array\"\n ? String(prop.value)\n : \"{...}\"\n : String(prop.value)}\n </span>\n {idx < properties.length - 1 && <span className=\"text-gray-500\">,</span>}\n </div>\n ))}\n {overflow && <div className=\"text-gray-500 italic\">... and more properties</div>}\n </div>\n <div className=\"text-gray-600\">{\"}\"}</div>\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n\n // For regular JSON objects, render them nicely too\n return (\n <div className=\"inline-block\">\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n className=\"inline-flex items-center gap-1 text-blue-600 hover:text-blue-800 font-mono text-sm\"\n >\n <svg\n className={`w-3 h-3 transition-transform ${isExpanded ? \"rotate-90\" : \"\"}`}\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 111.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"text-purple-600\">Object</span>\n {!isExpanded && (\n <span className=\"text-gray-500\">\n {\"{\"}...{\"}\"}\n </span>\n )}\n </button>\n\n {isExpanded && (\n <div className=\"mt-1 ml-4 border-l-2 border-gray-200 pl-3\">\n <pre className=\"font-mono text-sm text-foreground whitespace-pre-wrap\">{JSON.stringify(obj, null, 2)}</pre>\n </div>\n )}\n </div>\n )\n } catch (_e) {\n // If it's not valid JSON, just return the original content\n return <span>{content}</span>\n }\n}\n\nfunction LogEntryComponent({ entry, darkMode }: { entry: LogEntry; darkMode: boolean }) {\n // Parse log type from message patterns - using shared TUI colors\n const parseLogType = (message: string) => {\n if (message.includes(\"[INTERACTION]\"))\n return {\n type: \"INTERACTION\",\n backgroundColor: LOG_COLORS.INTERACTION,\n textColor: getTextColor(LOG_COLORS.INTERACTION)\n }\n if (message.includes(\"[ERROR]\"))\n return {\n type: \"ERROR\",\n backgroundColor: LOG_COLORS.ERROR,\n textColor: getTextColor(LOG_COLORS.ERROR)\n }\n if (message.includes(\"[WARNING]\"))\n return {\n type: \"WARNING\",\n backgroundColor: LOG_COLORS.WARNING,\n textColor: getTextColor(LOG_COLORS.WARNING)\n }\n if (message.includes(\"[INFO]\"))\n return {\n type: \"INFO\",\n backgroundColor: LOG_COLORS.INFO,\n textColor: getTextColor(LOG_COLORS.INFO)\n }\n if (message.includes(\"[LOG]\"))\n return {\n type: \"LOG\",\n backgroundColor: LOG_COLORS.LOG,\n textColor: getTextColor(LOG_COLORS.LOG)\n }\n if (message.includes(\"[DEBUG]\"))\n return {\n type: \"DEBUG\",\n backgroundColor: LOG_COLORS.DEBUG,\n textColor: getTextColor(LOG_COLORS.DEBUG)\n }\n if (message.includes(\"[SCREENSHOT]\"))\n return {\n type: \"SCREENSHOT\",\n backgroundColor: LOG_COLORS.SCREENSHOT,\n textColor: getTextColor(LOG_COLORS.SCREENSHOT)\n }\n if (message.includes(\"[NAVIGATION]\") || message.includes(\"[PAGE]\") || message.includes(\"[DOM]\"))\n return {\n type: \"DOM\",\n backgroundColor: LOG_COLORS.DOM,\n textColor: getTextColor(LOG_COLORS.DOM)\n }\n if (message.includes(\"[CDP]\"))\n return {\n type: \"CDP\",\n backgroundColor: LOG_COLORS.CDP,\n textColor: getTextColor(LOG_COLORS.CDP)\n }\n if (message.includes(\"[NETWORK]\"))\n return {\n type: \"NETWORK\",\n backgroundColor: LOG_COLORS.NETWORK,\n textColor: getTextColor(LOG_COLORS.NETWORK)\n }\n if (message.includes(\"[CRASH]\"))\n return {\n type: \"CRASH\",\n backgroundColor: LOG_COLORS.CRASH,\n textColor: getTextColor(LOG_COLORS.CRASH)\n }\n if (message.includes(\"[CHROME]\"))\n return {\n type: \"CHROME\",\n backgroundColor: LOG_COLORS.CHROME,\n textColor: getTextColor(LOG_COLORS.CHROME)\n }\n if (message.includes(\"[REPLAY]\"))\n return {\n type: \"REPLAY\",\n backgroundColor: LOG_COLORS.REPLAY,\n textColor: getTextColor(LOG_COLORS.REPLAY)\n }\n return {\n type: \"DEFAULT\",\n color: \"bg-gray-50 dark:bg-gray-800/50 border-gray-200 dark:border-gray-700\",\n backgroundColor: LOG_COLORS.DEFAULT,\n textColor: getTextColor(LOG_COLORS.DEFAULT)\n }\n }\n\n const logTypeInfo = parseLogType(entry.message)\n\n // Extract and highlight type tags, detect JSON objects and URLs\n const renderMessage = (message: string) => {\n const typeTagRegex = /\\[([A-Z\\s]+)\\]/g\n const jsonRegex = /\\{[^{}]*(?:\\{[^{}]*\\}[^{}]*)*\\}/g\n const urlRegex = /(https?:\\/\\/[^\\s]+)/g\n\n const parts = []\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n // First, handle type tags\n match = typeTagRegex.exec(message)\n while (match !== null) {\n // Add text before the tag\n if (match.index > lastIndex) {\n parts.push(message.slice(lastIndex, match.index))\n }\n\n // Add the tag with styling using TUI colors\n parts.push(\n <span\n key={match.index}\n className=\"inline-block px-1.5 py-0.5 rounded text-xs font-medium mr-1\"\n style={{\n backgroundColor: logTypeInfo.backgroundColor,\n color: logTypeInfo.textColor\n }}\n >\n {match[1]}\n </span>\n )\n\n lastIndex = match.index + match[0].length\n match = typeTagRegex.exec(message)\n }\n\n // Add remaining text\n const remainingText = message.slice(lastIndex)\n\n // Process remaining text for JSON objects and URLs\n const processTextForObjects = (text: string, keyPrefix: string) => {\n const jsonMatches = [...text.matchAll(jsonRegex)]\n const urlMatches = [...text.matchAll(urlRegex)]\n const allMatches = [\n ...jsonMatches.map((m) => ({ ...m, type: \"json\" })),\n ...urlMatches.map((m) => ({ ...m, type: \"url\" }))\n ]\n\n // Sort matches by index\n allMatches.sort((a, b) => (a.index ?? 0) - (b.index ?? 0))\n\n if (allMatches.length === 0) {\n return [text]\n }\n\n const finalParts = []\n let textLastIndex = 0\n\n allMatches.forEach((objMatch, _idx) => {\n // Add text before match\n if ((objMatch.index ?? 0) > textLastIndex) {\n finalParts.push(text.slice(textLastIndex, objMatch.index ?? 0))\n }\n\n // Add appropriate renderer\n if (objMatch.type === \"json\") {\n finalParts.push(\n <ObjectRenderer\n key={`${keyPrefix}-json-${objMatch.index}-${objMatch[0].slice(0, 20)}`}\n content={objMatch[0]}\n />\n )\n } else if (objMatch.type === \"url\") {\n finalParts.push(<URLRenderer key={`${keyPrefix}-url-${objMatch.index}-${objMatch[0]}`} url={objMatch[0]} />)\n }\n\n textLastIndex = (objMatch.index ?? 0) + objMatch[0].length\n })\n\n // Add any text after the last match\n if (textLastIndex < text.length) {\n finalParts.push(text.slice(textLastIndex))\n }\n\n return finalParts\n }\n\n const processedRemaining = processTextForObjects(remainingText, \"main\")\n parts.push(...processedRemaining)\n\n return parts.length > 0 ? parts : message\n }\n\n // Determine the background color based on log type and dark mode\n const getBackgroundStyle = () => {\n const type = logTypeInfo.type\n if (darkMode) {\n // Dark mode colors\n switch (type) {\n case \"INTERACTION\":\n case \"CONSOLE DEBUG\":\n case \"DOM\":\n return { backgroundColor: \"rgba(88, 28, 135, 0.3)\" } // purple-950/30\n case \"CONSOLE ERROR\":\n case \"ERROR\":\n case \"CRITICAL ERROR\":\n return { backgroundColor: \"rgba(127, 29, 29, 0.3)\" } // red-950/30\n case \"CONSOLE WARN\":\n case \"CDP\":\n case \"NETWORK\":\n return { backgroundColor: \"rgba(133, 77, 14, 0.3)\" } // yellow-950/30\n case \"CONSOLE INFO\":\n case \"SCREENSHOT\":\n return { backgroundColor: \"rgba(30, 58, 138, 0.3)\" } // blue-950/30\n case \"PAGE\":\n return { backgroundColor: \"rgba(20, 83, 45, 0.3)\" } // green-950/30\n default:\n return { backgroundColor: \"rgba(17, 24, 39, 0.3)\" } // gray-900/30\n }\n } else {\n // Light mode colors\n switch (type) {\n case \"INTERACTION\":\n case \"CONSOLE DEBUG\":\n case \"DOM\":\n return { backgroundColor: \"rgba(250, 245, 255, 0.5)\" } // purple-50/50\n case \"CONSOLE ERROR\":\n case \"ERROR\":\n case \"CRITICAL ERROR\":\n return { backgroundColor: \"rgba(254, 242, 242, 0.5)\" } // red-50/50\n case \"CONSOLE WARN\":\n case \"CDP\":\n case \"NETWORK\":\n return { backgroundColor: \"rgba(254, 252, 232, 0.5)\" } // yellow-50/50\n case \"CONSOLE INFO\":\n case \"SCREENSHOT\":\n return { backgroundColor: \"rgba(239, 246, 255, 0.5)\" } // blue-50/50\n case \"PAGE\":\n return { backgroundColor: \"rgba(240, 253, 244, 0.5)\" } // green-50/50\n default:\n return { backgroundColor: \"transparent\" }\n }\n }\n }\n\n // Determine the border class based on log type\n const getBorderClass = () => {\n const type = logTypeInfo.type\n switch (type) {\n case \"INTERACTION\":\n case \"CONSOLE DEBUG\":\n case \"DOM\":\n return \"border-purple-200 dark:border-purple-800\"\n case \"CONSOLE ERROR\":\n case \"ERROR\":\n case \"CRITICAL ERROR\":\n return \"border-red-200 dark:border-red-800\"\n case \"CONSOLE WARN\":\n case \"CDP\":\n case \"NETWORK\":\n return \"border-yellow-200 dark:border-yellow-800\"\n case \"CONSOLE INFO\":\n case \"SCREENSHOT\":\n return \"border-blue-200 dark:border-blue-800\"\n case \"PAGE\":\n return \"border-green-200 dark:border-green-800\"\n default:\n return \"border-gray-200 dark:border-gray-700\"\n }\n }\n\n return (\n <div className={`border-l-4 ${getBorderClass()} pl-4 py-2`} style={getBackgroundStyle()}>\n {/* Table-like layout using CSS Grid */}\n <div className=\"grid grid-cols-[auto_auto_1fr] gap-3 items-start\">\n {/* Column 1: Timestamp */}\n <div className=\"text-xs text-muted-foreground font-mono whitespace-nowrap pt-1\">\n {new Date(entry.timestamp).toLocaleTimeString()}\n </div>\n\n {/* Column 2: Source */}\n <div\n className=\"px-2 py-1 rounded text-xs font-medium whitespace-nowrap\"\n style={{\n backgroundColor: entry.source === \"SERVER\" ? LOG_COLORS.SERVER : LOG_COLORS.BROWSER,\n color: \"#000\"\n }}\n >\n {entry.source}\n </div>\n\n {/* Column 3: Message content with user agent info */}\n <div className=\"font-mono text-sm min-w-0 text-foreground\">\n <div className=\"flex flex-wrap items-start gap-2\">\n <div className=\"flex-1 min-w-0\">{renderMessage(entry.message)}</div>\n {/* User Agent and Tab Identifier Pills */}\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {entry.tabIdentifier && (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-muted text-muted-foreground\">\n {entry.tabIdentifier}\n </span>\n )}\n {entry.userAgent && (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-100 dark:bg-green-800 text-green-700 dark:text-green-200\">\n {entry.userAgent.includes(\"Chrome\")\n ? \"Chrome\"\n : entry.userAgent.includes(\"Firefox\")\n ? \"Firefox\"\n : entry.userAgent.includes(\"Safari\")\n ? \"Safari\"\n : entry.userAgent.includes(\"Edge\")\n ? \"Edge\"\n : \"Browser\"}\n </span>\n )}\n {/* Browser Type Pill (Chrome Extension vs Playwright) - only show if browser source */}\n {entry.source === \"BROWSER\" &&\n (() => {\n const isPlaywright = entry.message.includes(\"[PLAYWRIGHT]\")\n const isChromeExtension = entry.message.includes(\"[CHROME_EXTENSION]\") || entry.tabIdentifier // Tab identifier indicates Chrome Extension\n\n if (isPlaywright) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-purple-100 dark:bg-purple-800 text-purple-700 dark:text-purple-200\">\n 🎭 Playwright\n </span>\n )\n } else if (isChromeExtension) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-100 dark:bg-blue-800 text-blue-700 dark:text-blue-200\">\n 🧩 Extension\n </span>\n )\n }\n return null\n })()}\n {/* Server Framework Pill - only show if server source */}\n {entry.source === \"SERVER\" &&\n (() => {\n const message = entry.message.toLowerCase()\n\n // Next.js - look for Next.js specific patterns\n if (\n message.includes(\"ready on http://localhost\") ||\n message.includes(\"ready in \") ||\n message.includes(\"next.js\") ||\n message.includes(\"compiled client and server\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-black text-white\">\n ▲ Next.js\n </span>\n )\n }\n\n // Nuxt.js - look for Nuxt specific patterns\n else if (\n message.includes(\"nuxt\") ||\n (message.includes(\"nitro\") && message.includes(\"http://localhost\")) ||\n message.includes(\"universal mode\") ||\n message.includes(\"spa mode\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-500 text-white\">\n 💚 Nuxt\n </span>\n )\n }\n\n // Vue CLI/Vite + Vue - look for Vue specific patterns\n else if (\n message.includes(\"vue-cli-service\") ||\n (message.includes(\"vue\") && (message.includes(\"dev server\") || message.includes(\"local:\"))) ||\n message.includes(\"@vue/cli-service\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-600 text-white\">\n 🟢 Vue\n </span>\n )\n }\n\n // Vite (generic) - look for Vite patterns\n else if (\n (message.includes(\"local:\") && message.includes(\"vite\")) ||\n message.includes(\"dev server running\") ||\n message.includes(\"vite v\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-500 text-white\">\n ⚡ Vite\n </span>\n )\n }\n\n // Ruby on Rails - look for Rails patterns\n else if (\n message.includes(\"rails server\") ||\n message.includes(\"puma starting\") ||\n message.includes(\"use ctrl-c to stop\") ||\n (message.includes(\"listening on tcp://\") && message.includes(\"3000\"))\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-red-600 text-white\">\n 💎 Rails\n </span>\n )\n }\n\n // Laravel - look for Laravel/Artisan patterns\n else if (\n message.includes(\"laravel development server\") ||\n message.includes(\"artisan serve\") ||\n (message.includes(\"laravel\") && message.includes(\"127.0.0.1:8000\"))\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-red-500 text-white\">\n 🅻 Laravel\n </span>\n )\n }\n\n // Express.js/Node.js - look for Express patterns\n else if (\n message.includes(\"express server\") ||\n message.includes(\"server listening on\") ||\n message.includes(\"app listening on port\") ||\n message.includes(\"node server\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-700 text-white\">\n 🟩 Express\n </span>\n )\n }\n\n // Django - look for Django patterns\n else if (\n message.includes(\"django\") ||\n (message.includes(\"development server\") && message.includes(\"127.0.0.1:8000\")) ||\n message.includes(\"runserver\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-800 text-white\">\n 🐍 Django\n </span>\n )\n }\n\n // Flask - look for Flask patterns\n else if (\n message.includes(\"flask\") ||\n message.includes(\"running on http://127.0.0.1:5000\") ||\n message.includes(\"debug mode: on\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-800 text-white\">\n 🌶️ Flask\n </span>\n )\n }\n\n // Svelte/SvelteKit - look for Svelte patterns\n else if (\n message.includes(\"sveltekit\") ||\n (message.includes(\"svelte\") && message.includes(\"dev\")) ||\n message.includes(\"@sveltejs\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-orange-500 text-white\">\n 🔥 Svelte\n </span>\n )\n }\n\n // Remix - look for Remix patterns\n else if (message.includes(\"remix\") || message.includes(\"@remix-run\")) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-400 text-white\">\n 💿 Remix\n </span>\n )\n }\n\n // Astro - look for Astro patterns\n else if (message.includes(\"astro\") || message.includes(\"@astrojs\")) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-purple-600 text-white\">\n 🚀 Astro\n </span>\n )\n }\n\n // Spring Boot - look for Spring patterns\n else if (\n message.includes(\"spring boot\") ||\n message.includes(\"tomcat started on port\") ||\n (message.includes(\"started application\") && message.includes(\"seconds\"))\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-green-500 text-white\">\n 🍃 Spring\n </span>\n )\n }\n\n // Generic React (CRA, webpack-dev-server) - fallback for React patterns\n else if (\n message.includes(\"webpack compiled\") ||\n message.includes(\"compiled successfully\") ||\n message.includes(\"webpack-dev-server\")\n ) {\n return (\n <span className=\"inline-flex items-center px-1.5 py-0.5 rounded text-xs font-medium bg-blue-600 text-white\">\n ⚛️ React\n </span>\n )\n }\n\n return null\n })()}\n </div>\n </div>\n </div>\n </div>\n\n {entry.screenshot && (\n <div className=\"mt-2\">\n <Image\n src={entry.screenshot.startsWith(\"http\") ? entry.screenshot : `/api/screenshots/${entry.screenshot}`}\n alt=\"Screenshot\"\n width={800}\n height={600}\n className=\"w-full h-auto max-w-2xl border rounded shadow-sm\"\n style={{ maxHeight: \"600px\", objectFit: \"contain\" }}\n unoptimized\n />\n </div>\n )}\n\n {entry.screencast && (\n <div className=\"mt-2\">\n <a\n href={entry.screencast}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-2 px-4 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg font-medium transition-colors\"\n >\n <svg\n className=\"w-5 h-5\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.752 11.168l-3.197-2.132A1 1 0 0010 9.87v4.263a1 1 0 001.555.832l3.197-2.132a1 1 0 000-1.664z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n View Jank Analysis Video\n </a>\n </div>\n )}\n </div>\n )\n}\n\ninterface LogsClientProps {\n version: string\n initialData?: {\n logs: LogEntry[]\n logFiles: LogFile[]\n currentLogFile: string\n mode: \"head\" | \"tail\"\n }\n}\n\nexport default function LogsClient({ version, initialData }: LogsClientProps) {\n const router = useRouter()\n const searchParams = useSearchParams()\n const [darkMode, setDarkMode] = useDarkMode()\n const [logs, setLogs] = useState<LogEntry[]>(initialData?.logs || [])\n const [mode, setMode] = useState<\"head\" | \"tail\">(initialData?.mode || \"tail\")\n\n // Update mode when URL parameters change\n useEffect(() => {\n const urlMode = searchParams.get(\"mode\") as \"head\" | \"tail\" | null\n if (urlMode && urlMode !== mode) {\n setMode(urlMode)\n }\n }, [searchParams, mode])\n const [isAtBottom, setIsAtBottom] = useState(true)\n const [isInitialLoading, setIsInitialLoading] = useState(!initialData)\n const [lastLogCount, setLastLogCount] = useState(initialData?.logs.length || 0)\n const [lastFetched, setLastFetched] = useState<Date | null>(null)\n const [availableLogs, setAvailableLogs] = useState<LogFile[]>(initialData?.logFiles || [])\n const [currentLogFile, setCurrentLogFile] = useState<string>(initialData?.currentLogFile || \"\")\n const [projectName, setProjectName] = useState<string>(\"\")\n const [showLogSelector, setShowLogSelector] = useState(false)\n const [isReplaying, setIsReplaying] = useState(false)\n const [showFilters, setShowFilters] = useState(false)\n const [showReplayPreview, setShowReplayPreview] = useState(false)\n const [replayEvents, setReplayEvents] = useState<ReplayEvent[]>([])\n const [isRotatingLog, setIsRotatingLog] = useState(false)\n const [retryCount, setRetryCount] = useState(0)\n const [maxRetries] = useState(5)\n const [lastFailedUrl, setLastFailedUrl] = useState<string | null>(null)\n const [hasLoadedInitial, setHasLoadedInitial] = useState(false)\n const [filters, setFilters] = useState({\n browser: true,\n server: true,\n interaction: true,\n screenshot: true\n })\n const [userAgentFilters, setUserAgentFilters] = useState<Record<string, boolean>>({})\n const [logBuffer, setLogBuffer] = useState<LogEntry[]>([]) // Buffer logs when not in live mode\n const bottomRef = useRef<HTMLDivElement>(null)\n const containerRef = useRef<HTMLDivElement>(null)\n const pollIntervalRef = useRef<NodeJS.Timeout | null>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const filterDropdownRef = useRef<HTMLDivElement>(null)\n const userScrolledManually = useRef<boolean>(false) // Track if user manually scrolled away from live mode\n\n const loadAvailableLogs = useCallback(async () => {\n try {\n const response = await fetch(\"/api/logs/list\")\n if (response.ok) {\n const data: LogListResponse = await response.json()\n setAvailableLogs(data.files)\n setCurrentLogFile(data.currentFile)\n setProjectName(data.projectName)\n return true\n }\n return false\n } catch (error) {\n console.error(\"Error loading available logs:\", error)\n return false\n }\n }, [])\n\n const pollForNewLogs = useCallback(async () => {\n if (mode !== \"tail\") return\n\n try {\n // Determine which log file to poll\n const requestedFile = searchParams.get(\"file\")\n let logPath = \"\"\n let isCurrentFile = true\n\n if (requestedFile && availableLogs.length > 0) {\n // Find the specific log file requested\n const foundFile = availableLogs.find((f) => f.name === requestedFile)\n logPath = foundFile?.path || currentLogFile\n isCurrentFile = foundFile?.isCurrent !== false\n } else {\n // Use current log file\n logPath = currentLogFile\n isCurrentFile = true\n }\n\n // Only poll for new logs if viewing the current (active) log file\n if (!isCurrentFile) return\n\n // Build API URL with logPath parameter if needed\n // For polling, only fetch a small number of new lines to reduce server load\n const apiUrl = logPath\n ? `/api/logs/tail?lines=50&logPath=${encodeURIComponent(logPath)}`\n : `/api/logs/tail?lines=50`\n\n // Check if we've exceeded retry limit for this specific URL\n if (lastFailedUrl === apiUrl && retryCount >= maxRetries) {\n console.error(`Maximum retry attempts (${maxRetries}) reached for ${apiUrl}. Stopping polling.`)\n // Clear the polling interval to stop further attempts\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current)\n pollIntervalRef.current = null\n }\n return\n }\n\n const response = await fetch(apiUrl)\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n // Reset retry count on successful fetch\n if (lastFailedUrl === apiUrl || retryCount > 0) {\n setRetryCount(0)\n setLastFailedUrl(null)\n }\n\n const data: LogsApiResponse = await response.json()\n\n if (!data.logs) {\n console.warn(\"No logs data in response\")\n return\n }\n\n const entries = parseLogEntries(data.logs)\n\n if (entries.length > lastLogCount) {\n if (isAtBottom) {\n // In live mode - apply logs immediately and flush buffer\n setLastFetched(new Date()) // Only update \"Last updated\" when actually showing new logs\n\n if (logBuffer.length > 0) {\n // Merge buffer with latest entries\n setLogs([...logs, ...logBuffer, ...entries.slice(lastLogCount)])\n setLogBuffer([]) // Clear buffer\n } else {\n setLogs(entries)\n }\n setLastLogCount(entries.length)\n\n // Auto-scroll to bottom - but only if user hasn't manually scrolled away\n if (!userScrolledManually.current) {\n setTimeout(() => {\n bottomRef.current?.scrollIntoView({ behavior: \"smooth\" })\n }, 50)\n }\n } else {\n // Not in live mode - buffer the new entries (don't update \"Last updated\")\n const newEntries = entries.slice(lastLogCount)\n if (newEntries.length > 0) {\n setLogBuffer((prev) => [...prev, ...newEntries])\n setLastLogCount(entries.length)\n }\n }\n }\n } catch (error) {\n console.error(\"Error polling logs:\", error)\n\n // Build the failed URL for tracking\n const requestedFile = searchParams.get(\"file\")\n let logPath = \"\"\n if (requestedFile && availableLogs.length > 0) {\n const foundFile = availableLogs.find((f) => f.name === requestedFile)\n logPath = foundFile?.path || currentLogFile\n } else {\n logPath = currentLogFile\n }\n const failedUrl = logPath\n ? `/api/logs/tail?lines=50&logPath=${encodeURIComponent(logPath)}`\n : `/api/logs/tail?lines=50`\n\n // Increment retry count if it's the same URL, otherwise reset\n if (lastFailedUrl === failedUrl) {\n const newRetryCount = retryCount + 1\n setRetryCount(newRetryCount)\n\n if (newRetryCount >= maxRetries) {\n console.error(`Maximum retry attempts (${maxRetries}) reached for ${failedUrl}. Stopping polling.`)\n // Clear the polling interval to stop further attempts\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current)\n pollIntervalRef.current = null\n }\n }\n } else {\n setLastFailedUrl(failedUrl)\n setRetryCount(1)\n }\n }\n }, [\n mode,\n isAtBottom,\n searchParams,\n availableLogs,\n currentLogFile,\n lastLogCount,\n logBuffer,\n logs,\n retryCount,\n lastFailedUrl,\n maxRetries\n ])\n\n // Start/stop polling based on mode (always poll in tail mode, but buffer when not at bottom)\n useEffect(() => {\n if (mode === \"tail\" && retryCount < maxRetries) {\n pollIntervalRef.current = setInterval(pollForNewLogs, 3000) // Poll every 3 seconds\n return () => {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current)\n }\n }\n } else {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current)\n }\n }\n }, [mode, pollForNewLogs, retryCount, maxRetries]) // Removed isAtBottom - now always poll in tail mode\n\n // Handle returning to live mode - ONLY flush buffer when user explicitly clicks \"Live\" button\n // This effect is removed to prevent race conditions - buffer flushing now happens only on explicit user action\n\n const loadInitialLogs = useCallback(async () => {\n if (retryCount >= maxRetries) {\n console.log(\"Max retries reached, not attempting to load\")\n return\n }\n\n setIsInitialLoading(true)\n\n // Load available logs list first\n const logsListLoaded = await loadAvailableLogs()\n if (!logsListLoaded) {\n setIsInitialLoading(false)\n return\n }\n\n try {\n // Determine which log file to load\n const requestedFile = searchParams.get(\"file\")\n let logPath = \"\"\n\n if (requestedFile && availableLogs.length > 0) {\n // Find the specific log file requested\n const foundFile = availableLogs.find((f) => f.name === requestedFile)\n logPath = foundFile?.path || currentLogFile\n } else {\n // Use current log file\n logPath = currentLogFile\n }\n\n // Build API URL with logPath parameter if needed\n const apiUrl = logPath\n ? `/api/logs/${mode}?lines=1000&logPath=${encodeURIComponent(logPath)}`\n : `/api/logs/${mode}?lines=1000`\n\n // Check if we've exceeded retry limit for this specific URL\n if (lastFailedUrl === apiUrl && retryCount >= maxRetries) {\n console.error(`Maximum retry attempts (${maxRetries}) reached for ${apiUrl}. Not attempting to load.`)\n setLogs([])\n setIsInitialLoading(false)\n return\n }\n\n const response = await fetch(apiUrl)\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n // Reset retry count on successful fetch\n if (lastFailedUrl === apiUrl || retryCount > 0) {\n setRetryCount(0)\n setLastFailedUrl(null)\n }\n\n const data: LogsApiResponse = await response.json()\n\n if (!data.logs) {\n console.warn(\"No logs data in response\")\n setLogs([])\n setIsInitialLoading(false)\n return\n }\n\n const entries = parseLogEntries(data.logs)\n\n setLogs(entries)\n setLastLogCount(entries.length)\n setLastFetched(new Date())\n setIsInitialLoading(false)\n\n // Auto-scroll to bottom for tail mode - only if user hasn't manually scrolled away\n if (mode === \"tail\" && !userScrolledManually.current) {\n setIsAtBottom(true)\n const scrollToBottom = () => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"auto\" })\n } else if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight\n }\n }\n // Try multiple times to ensure it works\n setTimeout(scrollToBottom, 0)\n setTimeout(scrollToBottom, 100)\n }\n } catch (error) {\n console.error(\"Error loading logs:\", error)\n\n // Build the failed URL for tracking\n const requestedFile = searchParams.get(\"file\")\n let logPath = \"\"\n if (requestedFile && availableLogs.length > 0) {\n const foundFile = availableLogs.find((f) => f.name === requestedFile)\n logPath = foundFile?.path || currentLogFile\n } else {\n logPath = currentLogFile\n }\n const failedUrl = logPath\n ? `/api/logs/${mode}?lines=1000&logPath=${encodeURIComponent(logPath)}`\n : `/api/logs/${mode}?lines=1000`\n\n // Track retry attempts\n if (lastFailedUrl === failedUrl) {\n const newRetryCount = retryCount + 1\n setRetryCount(newRetryCount)\n\n if (newRetryCount >= maxRetries) {\n console.error(`Maximum retry attempts (${maxRetries}) reached for initial load of ${failedUrl}.`)\n }\n } else {\n setLastFailedUrl(failedUrl)\n setRetryCount(1)\n }\n\n setLogs([])\n } finally {\n setIsInitialLoading(false)\n }\n }, [loadAvailableLogs, searchParams, availableLogs, currentLogFile, mode, retryCount, lastFailedUrl, maxRetries])\n\n useEffect(() => {\n // Only load logs if we don't have initial data and haven't tried loading yet\n const hasInitialData = initialData?.logs && initialData?.logs.length > 0\n\n if (!hasLoadedInitial && !hasInitialData && !logs.length) {\n // No server-side data and no client data - load fresh\n setHasLoadedInitial(true)\n loadInitialLogs()\n } else if (hasInitialData && logs.length === 0) {\n // We have server-side data but client state is empty - use server data\n setLogs(initialData.logs)\n setIsInitialLoading(false)\n if (mode === \"tail\" && !userScrolledManually.current) {\n // Scroll to bottom for tail mode with server data - only if user hasn't manually scrolled away\n setIsAtBottom(true)\n const scrollToBottom = () => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"auto\" })\n } else if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight\n }\n }\n // Try multiple times to ensure it works\n setTimeout(scrollToBottom, 0)\n setTimeout(scrollToBottom, 100)\n setTimeout(scrollToBottom, 300)\n }\n }\n }, [mode, initialData, logs.length, hasLoadedInitial, loadInitialLogs]) // eslint-disable-line react-hooks/exhaustive-deps\n // CRITICAL: loadInitialLogs must NEVER be added to dependencies - it will cause infinite loops\n // The linter will complain but this is intentional. DO NOT \"FIX\" THIS.\n\n // Separate effect to handle scrolling after logs are rendered\n useEffect(() => {\n if (logs.length > 0 && mode === \"tail\" && isAtBottom && !userScrolledManually.current) {\n const scrollToBottom = () => {\n if (bottomRef.current) {\n bottomRef.current.scrollIntoView({ behavior: \"auto\" })\n } else if (containerRef.current) {\n containerRef.current.scrollTop = containerRef.current.scrollHeight\n }\n }\n // Scroll after DOM updates\n setTimeout(scrollToBottom, 0)\n }\n }, [logs.length, mode, isAtBottom]) // Trigger when logs are actually rendered\n\n useEffect(() => {\n return () => {\n if (pollIntervalRef.current) {\n clearInterval(pollIntervalRef.current)\n }\n }\n }, [])\n\n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setShowLogSelector(false)\n }\n if (filterDropdownRef.current && !filterDropdownRef.current.contains(event.target as Node)) {\n setShowFilters(false)\n }\n }\n\n if (showLogSelector || showFilters) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [showLogSelector, showFilters])\n\n const handleScroll = () => {\n if (containerRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = containerRef.current\n const atBottom = scrollTop + clientHeight >= scrollHeight - 10\n\n // If user scrolled up from the bottom, mark as manual scroll\n if (isAtBottom && !atBottom) {\n userScrolledManually.current = true\n }\n\n // If user scrolled back to bottom, clear manual scroll flag only via explicit action\n // (not automatically - they need to click the \"Live\" button)\n\n setIsAtBottom(atBottom)\n }\n }\n\n const handleReplay = async () => {\n if (isReplaying) return\n\n setIsReplaying(true)\n\n try {\n // Get replay data from logs\n const response = await fetch(\"/api/replay?action=parse\")\n if (!response.ok) {\n throw new Error(\"Failed to parse replay data\")\n }\n\n const replayData = await response.json()\n\n if (replayData.interactions.length === 0) {\n alert(\"No user interactions found in logs to replay\")\n return\n }\n\n // Generate CDP commands for replay\n const response2 = await fetch(\"/api/replay\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n action: \"execute\",\n replayData: replayData,\n speed: 2\n })\n })\n\n const result = await response2.json()\n\n if (result.success) {\n console.log(\"Replay executed successfully:\", result)\n alert(`Replay completed! Executed ${result.totalCommands} commands.`)\n } else {\n console.log(\"CDP execution failed, showing commands:\", result)\n alert(\n `CDP execution not available. Generated ${result.commands?.length || 0} commands. Check console for details.`\n )\n }\n } catch (error) {\n console.error(\"Replay error:\", error)\n alert(`Failed to start replay: ${error instanceof Error ? error.message : \"Unknown error\"}`)\n } finally {\n setIsReplaying(false)\n }\n }\n\n const loadReplayPreview = () => {\n // Extract interactions from current logs instead of making API call\n const interactions = logs\n .filter((log) => log.message.includes(\"[INTERACTION]\"))\n .map((log) => {\n const match = log.message.match(/\\[INTERACTION\\] (.+)/)\n if (match) {\n try {\n // Try parsing as JSON (new format)\n const data = JSON.parse(match[1])\n return {\n timestamp: log.timestamp,\n event: data.type || \"unknown\",\n details: JSON.stringify(data),\n type: data.type,\n x: data.x,\n y: data.y,\n target: data.target,\n direction: data.direction,\n distance: data.distance,\n key: data.key\n } as ReplayEvent\n } catch {\n // Fallback to old format parsing\n const oldMatch = match[1].match(/(CLICK|TAP|SCROLL|KEY) (.+)/)\n if (oldMatch) {\n return {\n timestamp: log.timestamp,\n event: oldMatch[1],\n details: oldMatch[2],\n type: oldMatch[1]\n } as ReplayEvent\n }\n }\n }\n return null\n })\n .filter((item): item is ReplayEvent => item !== null)\n\n setReplayEvents(interactions)\n }\n\n const handleRotateLog = async () => {\n if (!currentLogFile || isRotatingLog) return\n\n const confirmed = window.confirm(\n \"Clear logs and start fresh?\\n\\n\" +\n \"This will:\\n\" +\n \"• Archive the current log file\\n\" +\n \"• Start a new empty log file\\n\" +\n \"• Clear the current view\\n\\n\" +\n \"The archived logs will still be available in the dropdown.\"\n )\n\n if (!confirmed) return\n\n setIsRotatingLog(true)\n try {\n const response = await fetch(\"/api/logs/rotate\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify({ currentLogPath: currentLogFile })\n })\n\n if (response.ok) {\n // Clear current logs from UI\n setLogs([])\n setLastLogCount(0)\n setLastFetched(null)\n\n // Reload available logs to show the new archived file\n await loadAvailableLogs()\n\n // Start fresh polling\n await loadInitialLogs()\n } else {\n const error = await response.json()\n console.error(\"Failed to rotate log:\", error)\n alert(`Failed to rotate log: ${error.error}`)\n }\n } catch (error) {\n console.error(\"Error rotating log:\", error)\n alert(\"Error rotating log\")\n } finally {\n setIsRotatingLog(false)\n }\n }\n\n // Compute available user agents from browser logs\n const availableUserAgents = useMemo(() => {\n const userAgents = new Set<string>()\n logs.forEach((entry) => {\n if (entry.source === \"BROWSER\" && entry.userAgent) {\n userAgents.add(entry.userAgent)\n }\n })\n return Array.from(userAgents).sort()\n }, [logs])\n\n // Update user agent filters when available user agents change\n useEffect(() => {\n if (availableUserAgents.length > 0) {\n setUserAgentFilters((prev) => {\n const newFilters = { ...prev }\n // Enable all user agents by default if not already set\n availableUserAgents.forEach((ua) => {\n if (!(ua in newFilters)) {\n newFilters[ua] = true\n }\n })\n return newFilters\n })\n }\n }, [availableUserAgents])\n\n const filteredLogs = useMemo(() => {\n return logs.filter((entry) => {\n // Check specific message types first (these override source filtering)\n const isInteraction = entry.message.includes(\"[INTERACTION]\")\n const isScreenshot = entry.message.includes(\"[SCREENSHOT]\")\n\n if (isInteraction) return filters.interaction\n if (isScreenshot) return filters.screenshot\n\n // For other logs, filter by source\n if (entry.source === \"SERVER\") return filters.server\n if (entry.source === \"BROWSER\") {\n // First check if browser logs are enabled at all\n if (!filters.browser) return false\n\n // If there are user agent filters and this entry has a user agent, apply UA filtering\n if (availableUserAgents.length > 0 && entry.userAgent) {\n return userAgentFilters[entry.userAgent] !== false\n }\n\n // Otherwise, just show if browser is enabled\n return true\n }\n\n return true\n })\n }, [logs, filters, userAgentFilters, availableUserAgents])\n\n return (\n <div className=\"h-screen bg-background text-foreground flex flex-col transition-colors\">\n {/* Header - Fixed */}\n <div className=\"bg-card shadow-sm border-b border-border flex-none z-10\">\n <div className=\"max-w-7xl mx-auto px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 sm:gap-4\">\n <div className=\"flex items-center gap-1\">\n <h1 className=\"text-xl sm:text-2xl font-bold whitespace-nowrap\">dev3000</h1>\n <span className=\"text-xs text-muted-foreground whitespace-nowrap\">(v{version})</span>\n </div>\n {/* Log File Selector */}\n {availableLogs.length > 1 ? (\n <div className=\"relative\" ref={dropdownRef}>\n <button\n type=\"button\"\n onClick={() => setShowLogSelector(!showLogSelector)}\n className=\"flex items-center gap-2 px-3 py-1 text-sm text-muted-foreground hover:text-foreground hover:bg-accent rounded-md transition-colors\"\n >\n <span className=\"font-mono text-xs whitespace-nowrap\">\n {isInitialLoading && !currentLogFile ? (\n <div className=\"h-4 bg-muted rounded animate-pulse\" style={{ width: \"220px\" }} />\n ) : currentLogFile ? (\n \"Current\"\n ) : (\n \"No log file\"\n )}\n </span>\n <svg\n className={`w-4 h-4 transition-transform ${showLogSelector ? \"rotate-180\" : \"\"}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {/* Dropdown */}\n {showLogSelector && availableLogs.length > 1 && (\n <div className=\"absolute top-full left-0 mt-1 bg-card border border-border rounded-md shadow-lg z-20 min-w-80\">\n <div className=\"py-1 max-h-60 overflow-y-auto\">\n <div className=\"px-3 py-2 text-xs font-medium text-muted-foreground border-b border-border\">\n {projectName} logs ({availableLogs.length})\n </div>\n {availableLogs.map((logFile) => (\n <button\n type=\"button\"\n key={logFile.path}\n onClick={() => {\n setShowLogSelector(false)\n router.push(`/logs?file=${encodeURIComponent(logFile.name)}&mode=${mode}`)\n }}\n className={`w-full text-left px-3 py-2 text-sm hover:bg-accent flex items-center justify-between ${\n logFile.isCurrent ? \"bg-primary/10 text-primary\" : \"text-foreground\"\n }`}\n >\n <div className=\"flex flex-col\">\n <span className=\"font-mono text-xs\">{logFile.name}</span>\n <span className=\"text-xs text-muted-foreground\">\n {new Date(logFile.mtime).toLocaleString()} • {Math.round(logFile.size / 1024)}KB\n </span>\n </div>\n {logFile.isCurrent && <span className=\"text-xs text-blue-600 font-medium\">current</span>}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-xs text-gray-600 px-3 py-1 whitespace-nowrap\">\n {isInitialLoading && !currentLogFile ? (\n <div className=\"h-4 bg-gray-200 rounded animate-pulse\" style={{ width: \"220px\" }} />\n ) : currentLogFile ? (\n // Show basename for all files\n currentLogFile\n .split(\"/\")\n .pop()\n ) : (\n \"No log file\"\n )}\n </span>\n </div>\n )}\n\n {/* Entries count with clear button */}\n {logs.length > 0 && (\n <div className=\"flex items-center gap-1 hidden sm:flex\">\n <span className=\"text-sm text-muted-foreground\">{logs.length} entries</span>\n {currentLogFile && !isInitialLoading && (\n <button\n type=\"button\"\n onClick={handleRotateLog}\n disabled={isRotatingLog}\n className=\"p-0.5 text-muted-foreground hover:text-foreground hover:bg-accent rounded transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\n title=\"Clear logs (rotate current log to archive and start fresh)\"\n >\n {isRotatingLog ? (\n <div className=\"w-3 h-3 border border-current border-t-transparent rounded-full animate-spin\" />\n ) : (\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n </button>\n )}\n </div>\n )}\n\n {/* Buffered logs indicator */}\n {logBuffer.length > 0 && !isAtBottom && (\n <span className=\"text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded-full\">\n +{logBuffer.length} buffered\n </span>\n )}\n </div>\n\n {/* Mode Toggle */}\n <div className=\"flex items-center gap-2\">\n {/* Replay Button - Hidden until functionality is complete */}\n {false && (\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={handleReplay}\n disabled={isReplaying}\n onMouseEnter={() => {\n if (!isReplaying) {\n loadReplayPreview()\n setShowReplayPreview(true)\n }\n }}\n onMouseLeave={() => setShowReplayPreview(false)}\n className={`flex items-center gap-1 px-3 py-1 rounded text-sm font-medium transition-colors whitespace-nowrap ${\n isReplaying\n ? \"bg-gray-100 text-gray-400 cursor-not-allowed\"\n : \"bg-purple-100 text-purple-800 hover:bg-purple-200\"\n }`}\n >\n {isReplaying ? (\n <>\n <div className=\"w-3 h-3 border border-purple-300 border-t-purple-600 rounded-full animate-spin\"></div>\n Replaying...\n </>\n ) : (\n <>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M14.828 14.828a4 4 0 01-5.656 0M9 10h1m4 0h1m-6 4h1m4 0h1m6-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M7 7V4a1 1 0 011-1h4a1 1 0 011 1v3m-9 4h16m-5 4v1a1 1 0 01-1 1H8a1 1 0 01-1-1v-1m8 0V9a1 1 0 00-1-1H8a1 1 0 00-1 1v8.001\"\n />\n </svg>\n Replay\n </>\n )}\n </button>\n {/* Replay Preview Dropdown */}\n {showReplayPreview && !isReplaying && (\n <div className=\"absolute top-full left-0 mt-1 bg-white border border-gray-200 rounded-md shadow-lg z-30 w-80\">\n <div className=\"py-2\">\n <div className=\"px-3 py-2 text-xs font-medium text-gray-500 border-b\">\n Replay Events ({replayEvents.length})\n </div>\n <div className=\"max-h-60 overflow-y-auto\">\n {replayEvents.length === 0 ? (\n <div className=\"px-3 py-4 text-sm text-gray-500 text-center\">No interactions to replay</div>\n ) : (\n replayEvents.map((event, index) => (\n <div\n key={`${event.timestamp}-${index}`}\n className=\"px-3 py-2 text-sm hover:bg-gray-50 border-b border-gray-100 last:border-b-0\"\n >\n <div className=\"flex items-center gap-2\">\n <span\n className={`px-1.5 py-0.5 rounded text-xs font-medium ${\n event.type === \"CLICK\"\n ? \"bg-blue-100 text-blue-800\"\n : event.type === \"SCROLL\"\n ? \"bg-green-100 text-green-800\"\n : \"bg-muted text-muted-foreground\"\n }`}\n >\n {event.type}\n </span>\n <span className=\"text-xs text-gray-500 font-mono\">\n {new Date(event.timestamp).toLocaleTimeString()}\n </span>\n </div>\n <div className=\"mt-1 text-xs text-gray-600 font-mono truncate\">\n {event.type === \"CLICK\" && `(${event.x}, ${event.y}) on ${event.target}`}\n {event.type === \"SCROLL\" &&\n `${event.direction} ${event.distance}px to (${event.x}, ${event.y})`}\n {event.type === \"KEY\" && `${event.key} in ${event.target}`}\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n )}\n </div>\n )}\n {/* Filter Button */}\n <div className=\"relative\" ref={filterDropdownRef}>\n <button\n type=\"button\"\n onClick={() => setShowFilters(!showFilters)}\n className=\"flex items-center gap-1 px-3 py-1 rounded text-sm font-medium transition-colors whitespace-nowrap bg-muted text-muted-foreground hover:bg-muted/80\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n Filter\n </button>\n {/* Filter Dropdown */}\n {showFilters && (\n <div className=\"absolute top-full right-0 mt-1 bg-card border border-border rounded-md shadow-lg z-20 min-w-48\">\n <div className=\"py-2\">\n <div className=\"px-3 py-2 text-xs font-medium text-muted-foreground border-b border-border\">\n Log Types\n </div>\n\n {/* Server Logs */}\n <label className=\"flex items-center justify-between px-3 py-2 text-sm hover:bg-accent cursor-pointer\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={filters.server}\n onChange={(e) =>\n setFilters((prev) => ({\n ...prev,\n server: e.target.checked\n }))\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n />\n <span className=\"text-foreground\">Server</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {logs.filter((l) => l.source === \"SERVER\").length}\n </span>\n </label>\n\n {/* Browser Logs */}\n <label className=\"flex items-center justify-between px-3 py-2 text-sm hover:bg-accent cursor-pointer\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={filters.browser}\n onChange={(e) =>\n setFilters((prev) => ({\n ...prev,\n browser: e.target.checked\n }))\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n />\n <span className=\"text-foreground\">Browser</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {logs.filter((l) => l.source === \"BROWSER\").length}\n </span>\n </label>\n\n {/* User Agent Sub-filters */}\n {availableUserAgents.length > 1 && filters.browser && (\n <div className=\"ml-6 border-l border-border pl-2\">\n {availableUserAgents.map((ua) => {\n const shortUA = ua.includes(\"Chrome\")\n ? \"Chrome\"\n : ua.includes(\"Firefox\")\n ? \"Firefox\"\n : ua.includes(\"Safari\")\n ? \"Safari\"\n : ua.includes(\"Edge\")\n ? \"Edge\"\n : \"Browser\"\n return (\n <label\n key={ua}\n className=\"flex items-center justify-between px-2 py-1 text-xs hover:bg-accent cursor-pointer\"\n >\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={userAgentFilters[ua] !== false}\n onChange={(e) =>\n setUserAgentFilters((prev) => ({\n ...prev,\n [ua]: e.target.checked\n }))\n }\n className=\"rounded border-input text-primary focus:ring-ring w-3 h-3\"\n />\n <span className=\"text-foreground\">{shortUA}</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {logs.filter((l) => l.source === \"BROWSER\" && l.userAgent === ua).length}\n </span>\n </label>\n )\n })}\n </div>\n )}\n\n {/* Interaction Logs */}\n <label className=\"flex items-center justify-between px-3 py-2 text-sm hover:bg-accent cursor-pointer\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={filters.interaction}\n onChange={(e) =>\n setFilters((prev) => ({\n ...prev,\n interaction: e.target.checked\n }))\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n />\n <span className=\"text-foreground\">Interaction</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {logs.filter((l) => l.message.includes(\"[INTERACTION]\")).length}\n </span>\n </label>\n\n {/* Screenshot Logs */}\n <label className=\"flex items-center justify-between px-3 py-2 text-sm hover:bg-accent cursor-pointer\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={filters.screenshot}\n onChange={(e) =>\n setFilters((prev) => ({\n ...prev,\n screenshot: e.target.checked\n }))\n }\n className=\"rounded border-input text-primary focus:ring-ring\"\n />\n <span className=\"text-foreground\">Screenshot</span>\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {logs.filter((l) => l.message.includes(\"[SCREENSHOT]\")).length}\n </span>\n </label>\n </div>\n </div>\n )}\n </div>\n {/* Head/Tail toggle - commented out for now as it's too noisy */}\n {/* <div className=\"flex items-center bg-muted rounded-md p-1\">\n <button\n type=\"button\"\n onClick={() => {\n const currentFile = searchParams.get(\"file\")\n if (currentFile) {\n router.push(`/logs?file=${encodeURIComponent(currentFile)}&mode=head`)\n } else {\n router.push(\"/logs?mode=head\")\n }\n }}\n className={`px-2 sm:px-3 py-1 rounded text-xs sm:text-sm font-medium transition-colors whitespace-nowrap ${\n mode === \"head\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Head\n </button>\n <button\n type=\"button\"\n onClick={() => {\n const currentFile = searchParams.get(\"file\")\n if (currentFile) {\n router.push(`/logs?file=${encodeURIComponent(currentFile)}&mode=tail`)\n } else {\n router.push(\"/logs?mode=tail\")\n }\n }}\n className={`px-2 sm:px-3 py-1 rounded text-xs sm:text-sm font-medium transition-colors whitespace-nowrap ${\n mode === \"tail\"\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground hover:text-foreground\"\n }`}\n >\n Tail\n </button>\n </div> */}\n {/* Dark Mode Toggle - moved to last item */}\n <DarkModeToggle darkMode={darkMode} setDarkMode={setDarkMode} className=\"ml-2\" />\n </div>\n </div>\n </div>\n </div>\n\n {/* Content Area - Fills remaining space */}\n <div className=\"flex-1 overflow-hidden\">\n <div ref={containerRef} className=\"max-w-7xl mx-auto px-4 py-6 h-full overflow-y-auto\" onScroll={handleScroll}>\n {isInitialLoading ? (\n <div className=\"text-center py-12\">\n <div className=\"inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-primary\"></div>\n <div className=\"text-muted-foreground text-sm mt-4\">Loading logs...</div>\n </div>\n ) : logs.length === 0 ? (\n <div className=\"text-center py-12\">\n <div className=\"text-muted-foreground text-lg\">📝 No logs yet</div>\n <div className=\"text-muted-foreground text-sm mt-2\">\n {retryCount >= maxRetries ? (\n <>\n <p className=\"text-red-500 mb-2\">Failed to load logs after {maxRetries} attempts.</p>\n <button\n type=\"button\"\n onClick={() => {\n setRetryCount(0)\n setLastFailedUrl(null)\n setHasLoadedInitial(false)\n loadInitialLogs()\n }}\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n >\n Retry\n </button>\n </>\n ) : (\n \"Logs will appear here as your development server runs\"\n )}\n </div>\n </div>\n ) : filteredLogs.length === 0 ? (\n <div className=\"text-center py-12\">\n <div className=\"text-muted-foreground text-lg\">🔍 No logs match current filters</div>\n <div className=\"text-muted-foreground text-sm mt-2\">\n Try adjusting your filter settings to see more logs\n </div>\n </div>\n ) : (\n <div className=\"space-y-1 pb-4\">\n {filteredLogs.map((entry, index) => (\n <LogEntryComponent key={`${entry.timestamp}-${index}`} entry={entry} darkMode={darkMode} />\n ))}\n <div ref={bottomRef} />\n </div>\n )}\n </div>\n </div>\n\n {/* Footer - Fixed */}\n <div className=\"border-t border-border bg-muted/50 flex-none\">\n <div className=\"max-w-7xl mx-auto px-4 py-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n {lastFetched && (\n <span className=\"text-xs text-muted-foreground font-mono\">\n Last updated {lastFetched.toLocaleTimeString()}\n </span>\n )}\n {currentLogFile && (\n <span className=\"text-xs text-muted-foreground font-mono break-all\">{currentLogFile}</span>\n )}\n </div>\n\n {/* Live indicator or scroll to bottom button - positioned on the right */}\n <div className=\"relative\">\n {/* Live indicator when at bottom */}\n <div\n className={`flex items-center gap-1 text-green-600 ${\n mode === \"tail\" && isAtBottom ? \"visible\" : \"invisible\"\n }`}\n >\n <div className=\"w-2 h-2 bg-green-500 rounded-full animate-pulse\"></div>\n <span className=\"text-xs\">Live</span>\n </div>\n\n {/* Scroll to bottom button when not at bottom */}\n <button\n type=\"button\"\n onClick={() => {\n userScrolledManually.current = false // Clear manual scroll flag\n\n // Flush any buffered logs when explicitly returning to live mode\n if (logBuffer.length > 0) {\n setLogs((prevLogs) => [...prevLogs, ...logBuffer])\n setLogBuffer([])\n setLastFetched(new Date()) // Update \"Last updated\" when showing buffered logs\n }\n\n bottomRef.current?.scrollIntoView({ behavior: \"smooth\" })\n }}\n className={`absolute top-0 right-0 flex items-center gap-1 px-2 py-0.5 bg-blue-600 text-white rounded text-xs hover:bg-blue-700 whitespace-nowrap ${\n mode === \"tail\" && !isAtBottom ? \"visible\" : \"invisible\"\n }`}\n >\n ↓ Live\n </button>\n </div>\n </div>\n </div>\n </div>\n )\n}\n","/**\n * Shared color constants for log entries\n * Used by both TUI and web logs viewer to ensure consistency\n */\n\nexport const LOG_COLORS = {\n // Source colors\n BROWSER: \"#00CED1\", // Cyan\n SERVER: \"#32CD32\", // Lime green\n\n // Log type colors\n NETWORK: \"#4A7C7E\", // Soft teal\n ERROR: \"#FF6B6B\", // Red\n WARNING: \"#FFA500\", // Orange\n INFO: \"#87CEEB\", // Sky blue\n LOG: \"#B0B0B0\", // Gray\n DEBUG: \"#9370DB\", // Purple\n SCREENSHOT: \"#FF69B4\", // Hot pink\n DOM: \"#DDA0DD\", // Plum\n CDP: \"#F0E68C\", // Khaki\n CHROME: \"#F0E68C\", // Khaki (same as CDP)\n CRASH: \"#DC143C\", // Crimson\n REPLAY: \"#9370DB\", // Purple\n NAVIGATION: \"#DDA0DD\", // Plum (same as DOM)\n INTERACTION: \"#DDA0DD\", // Plum (same as DOM)\n DEFAULT: \"#A0A0A0\" // Dark gray\n} as const\n\n// Helper to determine text color based on background\nexport function getTextColor(bgColor: string): string {\n // Light backgrounds need dark text\n const lightColors: string[] = [\n LOG_COLORS.INFO,\n LOG_COLORS.SCREENSHOT,\n LOG_COLORS.DOM,\n LOG_COLORS.CDP,\n LOG_COLORS.CHROME,\n LOG_COLORS.NAVIGATION,\n LOG_COLORS.INTERACTION\n ]\n return lightColors.includes(bgColor) ? \"#000\" : \"#FFF\"\n}\n\n// Map log type names to color keys\nexport const TYPE_COLOR_MAP = {\n NETWORK: \"NETWORK\",\n ERROR: \"ERROR\",\n WARNING: \"WARNING\",\n INFO: \"INFO\",\n LOG: \"LOG\",\n DEBUG: \"DEBUG\",\n SCREENSHOT: \"SCREENSHOT\",\n DOM: \"DOM\",\n CDP: \"CDP\",\n CHROME: \"CHROME\",\n CRASH: \"CRASH\",\n REPLAY: \"REPLAY\",\n NAVIGATION: \"NAVIGATION\",\n INTERACTION: \"INTERACTION\"\n} as const\n","import type { LogEntry } from \"@/types\"\n\n/**\n * Cleans up console log messages that contain CSS formatting directives\n * Example: \"%c[Vercel Web Analytics]%c Debug mode... color: rgb(120, 120, 120) color: inherit\"\n * Becomes: \"[Vercel Web Analytics] Debug mode...\"\n */\nfunction cleanConsoleFormatting(message: string): string {\n // Pattern to match console log entries with CSS formatting\n const consoleLogPattern = /^\\[CONSOLE LOG\\] (.+)$/\n const match = message.match(consoleLogPattern)\n\n if (!match) {\n return message\n }\n\n const consoleMessage = match[1]\n\n // Check if this message has %c CSS formatting directives\n if (!consoleMessage.includes(\"%c\")) {\n return message // No formatting to clean\n }\n\n // Remove CSS formatting directives step by step\n let cleaned = consoleMessage\n\n // Remove %c markers\n cleaned = cleaned.replace(/%c/g, \"\")\n\n // Remove trailing CSS color declarations - look for CSS patterns before JSON or at end of string\n // Match CSS color declarations that appear after %c removal\n cleaned = cleaned.replace(/\\s+color:\\s*[^{}\\n]*?(?=\\s*[{[]|$)/g, \"\")\n\n // Clean up any extra whitespace\n cleaned = cleaned.replace(/\\s+/g, \" \").trim()\n\n return `[CONSOLE LOG] ${cleaned}`\n}\n\nexport function parseLogEntries(logContent: string): LogEntry[] {\n // Enhanced pattern to handle multiple timestamp formats:\n // Format 1 (CDP): [timestamp] [SOURCE] message\n // Format 2 (Extension): [timestamp] [TAB-id] [SOURCE] [event] message\n // Format 3 (Short): [HH:MM:SS.mmm] [SOURCE] message\n const timestampPattern = /\\[(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z|\\d{2}:\\d{2}:\\d{2}\\.\\d{3})\\] \\[([^\\]]+)\\] /\n\n const entries: LogEntry[] = []\n const lines = logContent.split(\"\\n\")\n let currentEntry: LogEntry | null = null\n\n for (const line of lines) {\n if (!line.trim()) continue\n\n const match = line.match(timestampPattern)\n if (match) {\n // Save previous entry if exists\n if (currentEntry) {\n entries.push(currentEntry)\n }\n\n const [fullMatch, timestamp, firstBracket] = match\n const remainingLine = line.substring(fullMatch.length)\n\n // Check if this is a Chrome extension format with tab identifier\n const isTabIdentifier = /^TAB-\\d+\\.\\d+$/.test(firstBracket)\n let source = firstBracket\n let message = remainingLine\n let tabIdentifier: string | undefined\n let userAgent: string | undefined\n\n if (isTabIdentifier) {\n // Chrome extension format: [TAB-id] [SOURCE] [event] message\n tabIdentifier = firstBracket\n\n // Look for the next bracketed section which should be the actual source\n const sourceMatch = remainingLine.match(/^\\[([^\\]]+)\\] /)\n if (sourceMatch) {\n source = sourceMatch[1] // This should be \"BROWSER\"\n message = remainingLine.substring(sourceMatch[0].length)\n\n // Extract user agent from INFO entries if present\n if (message.includes(\"User-Agent:\")) {\n const uaMatch = message.match(/User-Agent: ([^,\\n]+)/)\n if (uaMatch) {\n userAgent = uaMatch[1]\n }\n }\n }\n }\n\n const screenshot = message.match(/\\[SCREENSHOT\\] ([^\\s[]+)/)?.[1]\n const screencast = message.match(/\\[SCREENCAST\\] View jank analysis: ([^\\s]+)/)?.[1]\n\n // Clean up CSS formatting directives in console log messages\n let cleanedMessage = cleanConsoleFormatting(message)\n\n // Remove browser type markers from displayed message (they'll show as pills instead)\n // cleanedMessage = cleanedMessage.replace(/ \\[PLAYWRIGHT\\]$/, \"\").replace(/ \\[CHROME_EXTENSION\\]$/, \"\")\n cleanedMessage = cleanedMessage.replace(/ \\[CHROME_EXTENSION\\]$/, \"\") // Only remove Chrome Extension tag\n\n // Filter out noisy WebSocket logs from Next.js dev server\n const isNoisyWebSocketLog =\n cleanedMessage.includes(\"[Network.webSocketFrameSent]\") ||\n cleanedMessage.includes(\"[Network.webSocketFrameReceived]\") ||\n cleanedMessage.includes(\"[Network.webSocketFrame\") ||\n (cleanedMessage.includes(\"webSocketDebuggerUrl\") && cleanedMessage.includes(\"localhost\")) ||\n (cleanedMessage.includes(\"[NETWORK\") &&\n cleanedMessage.includes(\"__PAGE__\") &&\n cleanedMessage.includes(\"refresh\"))\n\n // Skip noisy WebSocket logs unless user specifically wants to see them\n if (isNoisyWebSocketLog) {\n currentEntry = null // Skip this entry\n continue\n }\n\n // Normalize timestamp to full ISO format if it's just time\n let normalizedTimestamp = timestamp\n if (/^\\d{2}:\\d{2}:\\d{2}\\.\\d{3}$/.test(timestamp)) {\n // It's just HH:MM:SS.mmm, convert to today's date with this time\n const today = new Date()\n const [hours, minutes, secondsMs] = timestamp.split(\":\")\n const [seconds, ms] = secondsMs.split(\".\")\n today.setHours(parseInt(hours, 10), parseInt(minutes, 10), parseInt(seconds, 10), parseInt(ms, 10))\n normalizedTimestamp = today.toISOString()\n }\n\n currentEntry = {\n timestamp: normalizedTimestamp,\n source,\n message: cleanedMessage,\n screenshot,\n screencast,\n original: line,\n tabIdentifier,\n userAgent\n }\n } else if (currentEntry) {\n // Append to current entry's message\n currentEntry.message += `\\n${line}`\n currentEntry.original += `\\n${line}`\n }\n }\n\n // Don't forget the last entry\n if (currentEntry) {\n entries.push(currentEntry)\n }\n\n return entries\n}\n"],"names":["DEFAULT_SEGMENT_KEY","PAGE_SEGMENT_KEY","addSearchParamsIfPageSegment","computeSelectedLayoutSegment","getSegmentValue","getSelectedLayoutSegmentPath","isGroupSegment","isParallelRouteSegment","segment","Array","isArray","endsWith","startsWith","searchParams","isPageSegment","includes","stringifiedQuery","JSON","stringify","segments","parallelRouteKey","length","rawSegment","tree","first","segmentPath","node","parallelRoutes","children","Object","values","segmentValue","push","ReadonlyURLSearchParams","ReadonlyURLSearchParamsError","Error","constructor","URLSearchParams","append","delete","set","sort","UnrecognizedActionError","unstable_isUnrecognizedActionError","args","name","error","RedirectStatusCode","REDIRECT_ERROR_CODE","RedirectType","isRedirectError","digest","split","errorCode","type","destination","slice","join","status","at","statusCode","Number","isNaN","getRedirectError","getRedirectStatusCodeFromError","getRedirectTypeFromError","getURLFromRedirectError","permanentRedirect","redirect","actionAsyncStorage","window","require","undefined","url","TemporaryRedirect","getStore","isAction","replace","PermanentRedirect","HTTPAccessErrorStatus","HTTP_ERROR_FALLBACK_ERROR_CODE","getAccessFallbackErrorTypeByStatus","getAccessFallbackHTTPStatus","isHTTPAccessFallbackError","NOT_FOUND","FORBIDDEN","UNAUTHORIZED","ALLOWED_CODES","Set","prefix","httpStatus","has","notFound","DIGEST","forbidden","process","env","__NEXT_EXPERIMENTAL_AUTH_INTERRUPTS","unauthorized","isHangingPromiseRejectionError","makeDevtoolsIOAwarePromise","makeHangingPromise","err","HANGING_PROMISE_REJECTION","HangingPromiseRejectionError","route","expression","abortListenersBySignal","WeakMap","signal","aborted","Promise","reject","hangingPromise","_","boundRejection","bind","currentListeners","get","listeners","addEventListener","i","once","catch","ignoreReject","underlying","requestStore","stage","stagedRendering","delayUntilStage","resolve","setTimeout","isPostpone","REACT_POSTPONE_TYPE","Symbol","for","$$typeof","BailoutToCSRError","isBailoutToCSRError","BAILOUT_TO_CSR","reason","isNextRouterError","DynamicServerError","isDynamicServerError","DYNAMIC_ERROR_CODE","description","StaticGenBailoutError","isStaticGenBailoutError","NEXT_STATIC_GEN_BAILOUT","code","METADATA_BOUNDARY_NAME","OUTLET_BOUNDARY_NAME","ROOT_LAYOUT_BOUNDARY_NAME","VIEWPORT_BOUNDARY_NAME","atLeastOneTask","scheduleImmediate","scheduleOnNextTick","waitAtLeastOneReactRenderTask","cb","then","NEXT_RUNTIME","nextTick","setImmediate","r","InvariantError","message","options","createPromiseWithResolvers","promise","res","rej","RenderStage","StagedRenderingController","abortSignal","currentStage","runtimeStagePromise","dynamicStagePromise","advanceStage","getStagePromise","waitForStage","displayName","resolvedValue","ioTriggerPromise","makeDevtoolsIOPromiseFromIOTrigger","ioTrigger","Postpone","PreludeState","abortAndThrowOnSynchronousRequestDataAccess","abortOnSynchronousPlatformIOAccess","accessedDynamicData","annotateDynamicAccess","consumeDynamicAccess","createDynamicTrackingState","createDynamicValidationState","createHangingInputAbortSignal","createRenderInBrowserAbortSignal","delayUntilRuntimeStage","formatDynamicAPIAccesses","getFirstDynamicReason","isDynamicPostpone","isPrerenderInterruptedError","logDisallowedDynamicError","markCurrentScopeAsDynamic","postponeWithTracking","throwIfDisallowedDynamic","throwToInterruptStaticGeneration","trackAllowedDynamicAccess","trackDynamicDataInDynamicRender","trackSynchronousPlatformIOAccessInDev","useDynamicRouteParams","useDynamicSearchParams","hasPostpone","React","unstable_postpone","isDebugDynamicAccesses","dynamicAccesses","syncDynamicErrorWithStack","hasSuspenseAboveBody","hasDynamicMetadata","hasDynamicViewport","hasAllowedDynamic","dynamicErrors","trackingState","store","workUnitStore","forceDynamic","forceStatic","dynamicShouldError","dynamicTracking","revalidate","dynamicUsageDescription","dynamicUsageStack","stack","NODE_ENV","usedDynamic","prerenderStore","abortOnSynchronousDynamicDataAccess","createPrerenderInterruptedError","controller","abort","errorWithStack","Dynamic","prerenderSignal","workUnitAsyncStorage","assertPostpone","createPostponeReason","isDynamicPostponeReason","NEXT_PRERENDER_INTERRUPTED","serverDynamic","clientDynamic","filter","access","map","line","AbortController","cacheSignal","inputReady","getRuntimeStagePromise","workStore","workAsyncStorage","fallbackParams","fallbackRouteParams","size","use","renderSignal","throwForMissingRequestStore","hasSuspenseRegex","bodyAndImplicitTags","hasSuspenseBeforeRootLayoutWithoutBodyOrImplicitBodyRegex","RegExp","hasMetadataRegex","hasViewportRegex","hasOutletRegex","componentStack","dynamicValidation","test","createErrorWithComponentOrOwnerStack","ownerStack","captureOwnerStack","console","dev","hasReadableErrorStacks","prelude","result","unstable_rethrow","cause","ServerInsertedHTMLContext","useParams","usePathname","useRouter","useSearchParams","useSelectedLayoutSegment","useSelectedLayoutSegments","useServerInsertedHTML","useContext","SearchParamsContext","readonlySearchParams","useMemo","navigationPromises","NavigationPromisesContext","pathname","PathnameContext","router","AppRouterContext","params","PathParamsContext","context","LayoutRouterContext","selectedLayoutSegmentsPromises","parentTree","selectedLayoutSegments","selectedLayoutSegmentPromises"],"mappings":"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","ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}
|