@rexvane/piweb 0.3.7 → 0.3.8

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.
Files changed (45) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +28 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/export-marker.json +6 -0
  5. package/.next/images-manifest.json +68 -0
  6. package/.next/next-minimal-server.js.nft.json +1 -0
  7. package/.next/next-server.js.nft.json +1 -0
  8. package/.next/prerender-manifest.json +157 -0
  9. package/.next/react-loadable-manifest.json +36 -0
  10. package/.next/required-server-files.js +357 -0
  11. package/.next/required-server-files.json +357 -0
  12. package/.next/routes-manifest.json +212 -0
  13. package/.next/server/app/_global-error.html +1 -1
  14. package/.next/server/app/_global-error.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.html +1 -1
  19. package/.next/server/app/_not-found.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/server/app/api/update/route.js +2 -2
  24. package/.next/server/app/api/version/route.js +1 -1
  25. package/.next/server/app/index.html +1 -1
  26. package/.next/server/app/index.rsc +1 -1
  27. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/index.segments/_full.segment.rsc +1 -1
  29. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  30. package/.next/server/app/login.html +1 -1
  31. package/.next/server/app/login.rsc +1 -1
  32. package/.next/server/app/login.segments/_full.segment.rsc +1 -1
  33. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  34. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  35. package/.next/server/app-paths-manifest.json +10 -10
  36. package/.next/server/middleware-build-manifest.js +1 -1
  37. package/.next/server/pages/404.html +1 -1
  38. package/.next/server/pages/500.html +1 -1
  39. package/.next/server/server-reference-manifest.json +1 -1
  40. package/package.json +3 -7
  41. package/scripts/build-output.mjs +19 -1
  42. package/scripts/install-build.mjs +41 -10
  43. package/scripts/verify-package.mjs +76 -0
  44. /package/.next/static/{l0QnWCSMdaKZ9Jf-JNOXz → HEI7XSH5vSn7KCIANvzFC}/_buildManifest.js +0 -0
  45. /package/.next/static/{l0QnWCSMdaKZ9Jf-JNOXz → HEI7XSH5vSn7KCIANvzFC}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-eb6e3e22d2f9faa2.js"/><script src="/_next/static/chunks/4bd1b696-92152b0f5947070d.js" async=""></script><script src="/_next/static/chunks/794-d1a40dcf24d651d9.js" async=""></script><script src="/_next/static/chunks/main-app-1a92e20ec190a32b.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-eb6e3e22d2f9faa2.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[7121,[],\"\"]\n3:I[4581,[],\"\"]\n4:I[484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[484,[],\"ViewportBoundary\"]\na:I[484,[],\"MetadataBoundary\"]\nc:I[7123,[],\"default\",1]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"]},null,false,\"$7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"l0QnWCSMdaKZ9Jf-JNOXz\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\nb:[]\n"])</script></body></html>
1
+ <!DOCTYPE html><html id="__next_error__"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-eb6e3e22d2f9faa2.js"/><script src="/_next/static/chunks/4bd1b696-92152b0f5947070d.js" async=""></script><script src="/_next/static/chunks/794-d1a40dcf24d651d9.js" async=""></script><script src="/_next/static/chunks/main-app-1a92e20ec190a32b.js" async=""></script><title>500: This page couldn’t load</title><style>:root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }</style><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;display:flex;align-items:center;justify-content:center"><div style="margin-top:-32px;max-width:325px;padding:32px 28px;text-align:left"><svg width="32" height="32" viewBox="-0.2 -1.5 32 32" fill="none" style="margin-bottom:24px"><path d="M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z" fill="var(--next-error-title)"></path></svg><h1 style="font-size:24px;font-weight:500;letter-spacing:-0.02em;line-height:32px;margin:0 0 12px 0;color:var(--next-error-title)">This page couldn’t load</h1><p style="font-size:14px;font-weight:400;line-height:21px;margin:0 0 20px 0;color:var(--next-error-message)">A server error occurred. Reload to try again.</p><form style="margin:0"><button type="submit" style="display:inline-flex;align-items:center;justify-content:center;height:32px;padding:0 12px;font-size:14px;font-weight:500;line-height:20px;border-radius:6px;cursor:pointer;color:var(--next-error-btn-text);background:var(--next-error-btn-bg);border:var(--next-error-btn-border)">Reload</button></form></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-eb6e3e22d2f9faa2.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[7121,[],\"\"]\n3:I[4581,[],\"\"]\n4:I[484,[],\"OutletBoundary\"]\n5:\"$Sreact.suspense\"\n8:I[484,[],\"ViewportBoundary\"]\na:I[484,[],\"MetadataBoundary\"]\nc:I[7123,[],\"default\",1]\n7:X\n0:{\"P\":null,\"c\":[\"\",\"_global-error\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"_global-error\",{\"children\":[\"__PAGE__\",{},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624]},\"$undefined\",\"$undefined\",4624],[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"html\",null,{\"id\":\"__next_error__\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"title\",null,{\"children\":\"500: This page couldn’t load\"}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\":root {--next-error-bg: #fff;--next-error-text: #171717;--next-error-title: #171717;--next-error-message: #171717;--next-error-digest: #666666;--next-error-btn-text: #fff;--next-error-btn-bg: #171717;--next-error-btn-border: none;--next-error-btn-secondary-text: #171717;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(0,0,0,0.08);}@media (prefers-color-scheme: dark) {:root {--next-error-bg: #0a0a0a;--next-error-text: #ededed;--next-error-title: #ededed;--next-error-message: #ededed;--next-error-digest: #a0a0a0;--next-error-btn-text: #0a0a0a;--next-error-btn-bg: #ededed;--next-error-btn-border: none;--next-error-btn-secondary-text: #ededed;--next-error-btn-secondary-bg: transparent;--next-error-btn-secondary-border: 1px solid rgba(255,255,255,0.14);}}body { margin: 0; color: var(--next-error-text); background: var(--next-error-bg); }\"}}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"display\":\"flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"-32px\",\"maxWidth\":\"325px\",\"padding\":\"32px 28px\",\"textAlign\":\"left\"},\"children\":[[\"$\",\"svg\",null,{\"width\":\"32\",\"height\":\"32\",\"viewBox\":\"-0.2 -1.5 32 32\",\"fill\":\"none\",\"style\":{\"marginBottom\":\"24px\"},\"children\":[\"$\",\"path\",null,{\"d\":\"M16.9328 0C18.0839 0.000116771 19.1334 0.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C0.527541 29 -0.439628 27.4588 0.201371 26.1309L11.9973 1.69531C12.4979 0.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z\",\"fill\":\"var(--next-error-title)\"}]}],[\"$\",\"h1\",null,{\"style\":{\"fontSize\":\"24px\",\"fontWeight\":500,\"letterSpacing\":\"-0.02em\",\"lineHeight\":\"32px\",\"margin\":\"0 0 12px 0\",\"color\":\"var(--next-error-title)\"},\"children\":\"This page couldn’t load\"}],[\"$\",\"p\",null,{\"style\":{\"fontSize\":\"14px\",\"fontWeight\":400,\"lineHeight\":\"21px\",\"margin\":\"0 0 20px 0\",\"color\":\"var(--next-error-message)\"},\"children\":\"A server error occurred. Reload to try again.\"}],[\"$\",\"form\",null,{\"style\":{\"margin\":0},\"children\":[\"$\",\"button\",null,{\"type\":\"submit\",\"style\":{\"display\":\"inline-flex\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"height\":\"32px\",\"padding\":\"0 12px\",\"fontSize\":\"14px\",\"fontWeight\":500,\"lineHeight\":\"20px\",\"borderRadius\":\"6px\",\"cursor\":\"pointer\",\"color\":\"var(--next-error-btn-text)\",\"background\":\"var(--next-error-btn-bg)\",\"border\":\"var(--next-error-btn-border)\"},\"children\":\"Reload\"}]}]]}]}]}]]}],null,[\"$\",\"$L4\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@6\"}]}]]}],{},null,false,null]},null,false,\"$7\"]},null,false,\"$7\"],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L8\",null,{\"children\":\"$L9\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$La\",null,{\"children\":[\"$\",\"$5\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lb\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$c\",[]],\"S\":true,\"h\":null,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"HEI7XSH5vSn7KCIANvzFC\"}\n7:C\n9:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\nb:[]\n"])</script></body></html>
@@ -1 +1 @@
1
- {"node":{},"edge":{},"encryptionKey":"Aj51QPBn3UV4dVQ16c+vWUQaWBu8tD0npmoXZNB16E0="}
1
+ {"node":{},"edge":{},"encryptionKey":"JJoV4CKbgiHlwQGZ6MboBsNZS6SAL97SMeD5VR7y4Bg="}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rexvane/piweb",
3
- "version": "0.3.7",
3
+ "version": "0.3.8",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "Modern web UI for the pi coding agent, driven by the official pi SDK without modifying pi",
@@ -32,12 +32,7 @@
32
32
  "next.config.ts",
33
33
  "tsconfig.json",
34
34
  "postcss.config.mjs",
35
- ".next/BUILD_ID",
36
- ".next/package.json",
37
- ".next/app",
38
- ".next/server",
39
- ".next/static",
40
- ".next/types"
35
+ ".next"
41
36
  ],
42
37
  "scripts": {
43
38
  "dev": "node scripts/dev.mjs",
@@ -48,6 +43,7 @@
48
43
  "start": "node bin/piweb.js",
49
44
  "web": "node bin/pi.js web",
50
45
  "typecheck": "tsc --noEmit",
46
+ "verify:package": "node scripts/verify-package.mjs",
51
47
  "test": "vitest run",
52
48
  "check": "npm run typecheck && npm run test && npm run build",
53
49
  "sync:provider-icons": "node scripts/sync-provider-icons.mjs",
@@ -67,12 +67,30 @@ function readLocalFile(root, relative, maxBytes = 1024 * 1024) {
67
67
  return fs.readFileSync(file, "utf8");
68
68
  }
69
69
 
70
+ /**
71
+ * A truncated .next (package built without the runtime manifests, or an interrupted
72
+ * build) leaves BUILD_ID behind, so the raw ENOENT names a file the user cannot act on.
73
+ */
74
+ export function incompleteBuildMessage(buildDir, missing = "required-server-files.json") {
75
+ return `incomplete production build in ${buildDir}: ${missing} is missing. `
76
+ + "Reinstall with `npm install -g @rexvane/piweb@latest`, or rebuild this installation with `npm rebuild -g piweb`.";
77
+ }
78
+
79
+ function readRequiredServerFiles(root, buildDir) {
80
+ try {
81
+ return readLocalFile(root, `${buildDir}/required-server-files.json`);
82
+ } catch (error) {
83
+ if (error.code === "ENOENT") throw new Error(incompleteBuildMessage(buildDir));
84
+ throw error;
85
+ }
86
+ }
87
+
70
88
  /** Verify a finished Next production build, not just a leftover BUILD_ID. */
71
89
  export function readProductionBuild(root, value) {
72
90
  const buildDir = resolveBuildOutput(root, value);
73
91
  const buildId = readLocalFile(root, `${buildDir}/BUILD_ID`, 1024).trim();
74
92
  if (!buildId || /\s/.test(buildId)) throw new Error(`invalid BUILD_ID in ${buildDir}`);
75
- const required = JSON.parse(readLocalFile(root, `${buildDir}/required-server-files.json`));
93
+ const required = JSON.parse(readRequiredServerFiles(root, buildDir));
76
94
  if (required?.version !== 1 || required.config?.distDir?.replaceAll("\\", "/") !== buildDir) {
77
95
  throw new Error(`build output does not match ${buildDir}`);
78
96
  }
@@ -13,12 +13,22 @@ import os from "node:os";
13
13
  import path from "node:path";
14
14
  import { createRequire } from "node:module";
15
15
  import { spawnSync } from "node:child_process";
16
+ import { readProductionBuild } from "./build-output.mjs";
16
17
 
18
+ /**
19
+ * A leftover BUILD_ID is not a usable build: a package that shipped .next without
20
+ * its runtime manifests starts and then dies on a missing manifest. Only a build
21
+ * that passes the same validation the launcher applies counts as prepared, so a
22
+ * truncated install falls through to the one-time build instead of crashing.
23
+ */
17
24
  export function hasProductionBuild(root) {
18
- return (
19
- fs.existsSync(path.join(root, ".next", "BUILD_ID")) ||
20
- fs.existsSync(path.join(root, ".next-releases", "active.json"))
21
- );
25
+ if (fs.existsSync(path.join(root, ".next-releases", "active.json"))) return true;
26
+ try {
27
+ readProductionBuild(root, ".next");
28
+ return true;
29
+ } catch {
30
+ return false;
31
+ }
22
32
  }
23
33
 
24
34
  /**
@@ -70,8 +80,8 @@ export function resolveNextBin(root) {
70
80
  * The staging directory must NOT sit inside any `node_modules`: for a global
71
81
  * install like ~/.local/lib/node_modules/@rexvane/piweb, the grandparent IS
72
82
  * node_modules, and Next would exclude the staged sources exactly the same way.
73
- * Walk up until we are outside every node_modules segment; give up and use the
74
- * system temp dir (cross-device copy is still correct, just slower).
83
+ * It must also stay on the package's own volume: a node_modules link that crosses
84
+ * volumes makes webpack resolve dependencies as "./D:/..." and the build fails.
75
85
  */
76
86
  function stagingParent(root) {
77
87
  // Split on BOTH separators: a win32 Node can see POSIX paths (and vice versa)
@@ -82,13 +92,34 @@ function stagingParent(root) {
82
92
  while (segments.length > 1 && segments.includes("node_modules")) {
83
93
  segments.pop();
84
94
  }
85
- const candidate = segments.length ? path.resolve(`/${segments.join(path.sep)}`) : path.sep;
95
+ // Same-volume candidates first; only a broken layout falls back to the temp dir.
96
+ const outside = segments.length ? pathFromSegments(segments) : undefined;
97
+ const candidates = [outside, outside && path.parse(outside).root, os.tmpdir()];
98
+ for (const candidate of candidates) {
99
+ if (candidate && isWritableDirectory(candidate)) return candidate;
100
+ }
101
+ return outside ?? os.tmpdir();
102
+ }
103
+
104
+ /**
105
+ * Rebuild a path from already-split segments. Only a Windows drive segment is a
106
+ * prefix; on POSIX the first segment is a real directory and must survive.
107
+ */
108
+ function pathFromSegments(segments) {
109
+ if (/^[A-Za-z]:$/.test(segments[0])) return path.join(`${segments[0]}${path.sep}`, ...segments.slice(1));
110
+ return path.join(path.sep, ...segments);
111
+ }
112
+
113
+ function isWritableDirectory(candidate) {
114
+ // Never create anything here: the popped prefix of an installed package always
115
+ // exists, and a simulated/foreign layout must not litter the filesystem. The
116
+ // caller falls back to the temp dir when mkdtemp cannot use this parent.
86
117
  try {
87
- fs.mkdirSync(candidate, { recursive: true });
118
+ if (!fs.statSync(candidate).isDirectory()) return false;
88
119
  fs.accessSync(candidate, fs.constants.W_OK);
89
- return candidate;
120
+ return true;
90
121
  } catch {
91
- return os.tmpdir();
122
+ return false;
92
123
  }
93
124
  }
94
125
 
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Release gate for the prebuilt artifact: pack the package exactly as
4
+ * `npm publish` would, unpack it somewhere else, and validate the copy with the
5
+ * same check the launcher runs before starting.
6
+ *
7
+ * `files` is a whitelist, so enumerating Next internals by hand ships a package
8
+ * that installs cleanly and then dies on first start with a missing manifest
9
+ * (required-server-files.json, routes-manifest.json, ...). Unpacking the real
10
+ * tarball is the only way to catch that before users do.
11
+ */
12
+ import fs from "node:fs";
13
+ import os from "node:os";
14
+ import path from "node:path";
15
+ import { spawnSync } from "node:child_process";
16
+ import { fileURLToPath } from "node:url";
17
+ import { readProductionBuild } from "./build-output.mjs";
18
+ import { isMainModule } from "./entrypoint.mjs";
19
+
20
+ const DEFAULT_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
21
+
22
+ function run(command, args, options = {}) {
23
+ const result = spawnSync(command, args, { encoding: "utf8", stdio: "pipe", ...options });
24
+ if (result.error) throw new Error(`cannot run ${command}: ${result.error.message}`);
25
+ if (result.status !== 0) throw new Error(`${command} ${args.join(" ")} failed:\n${result.stderr || result.stdout}`);
26
+ return result.stdout;
27
+ }
28
+
29
+ /**
30
+ * npm is a .cmd shim on Windows, which needs a shell — and shell + args is deprecated
31
+ * as well as unsafe with paths containing spaces. Whenever npm invoked us (npm test,
32
+ * npm run verify:package, CI) it hands us its own CLI entry, so run that with node.
33
+ */
34
+ function runNpm(args, { cwd }) {
35
+ const cli = process.env.npm_execpath;
36
+ if (cli && cli.endsWith(".js") && fs.existsSync(cli)) return run(process.execPath, [cli, ...args], { cwd });
37
+ return run("npm", args, { cwd, shell: process.platform === "win32" });
38
+ }
39
+
40
+ /**
41
+ * @param {string} root
42
+ * @returns {{filename: string, files: string[], buildId: string, bytes: number}}
43
+ */
44
+ export function verifyPackedPackage(root, { log = console.log } = {}) {
45
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "piweb-verify-"));
46
+ try {
47
+ const packed = JSON.parse(runNpm(["pack", "--json", "--pack-destination", tmp], { cwd: root }));
48
+ const entry = Array.isArray(packed) ? packed[0] : packed;
49
+ if (!entry?.filename) throw new Error("npm pack produced no tarball");
50
+ const files = (entry.files ?? []).map((file) => String(file.path).replaceAll("\\", "/").replace(/^package\//, ""));
51
+ const cached = files.find((file) => file.startsWith(".next/cache/"));
52
+ if (cached) throw new Error(`the packaged .next must not include the build cache (${cached}); remove .next/cache before packing`);
53
+ if (!files.includes("package.json")) throw new Error("the tarball has no package.json");
54
+ const unpacked = path.join(tmp, "unpacked");
55
+ fs.mkdirSync(unpacked, { recursive: true });
56
+ // Run from tmp with relative names: GNU tar (Git for Windows) reads "C:\..." as a
57
+ // remote host and tries to connect to it, so no absolute path may reach the args.
58
+ run("tar", ["-xzf", entry.filename, "-C", "unpacked"], { cwd: tmp });
59
+ // Same validation the launcher applies to an installed package.
60
+ const build = readProductionBuild(path.join(unpacked, "package"), ".next");
61
+ const bytes = fs.statSync(path.join(tmp, entry.filename)).size;
62
+ log(`[piweb] ${entry.filename}: ${files.length} files, ${(bytes / 1024 / 1024).toFixed(1)} MB, build ${build.buildId}`);
63
+ return { filename: entry.filename, files, buildId: build.buildId, bytes };
64
+ } finally {
65
+ fs.rmSync(tmp, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
66
+ }
67
+ }
68
+
69
+ if (isMainModule(import.meta.url)) {
70
+ try {
71
+ verifyPackedPackage(DEFAULT_ROOT);
72
+ } catch (error) {
73
+ console.error(`[piweb] ${error instanceof Error ? error.message : error}`);
74
+ process.exitCode = 1;
75
+ }
76
+ }