@colinxu/pi-web-classic 0.0.0-stage → 0.12.3
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/.next/BUILD_ID +1 -0
- package/.next/app-path-routes-manifest.json +75 -0
- package/.next/build-manifest.json +20 -0
- package/.next/diagnostics/build-diagnostics.json +6 -0
- package/.next/diagnostics/framework.json +1 -0
- package/.next/export-marker.json +6 -0
- package/.next/images-manifest.json +68 -0
- package/.next/next-minimal-server.js.nft.json +1 -0
- package/.next/next-server.js.nft.json +1 -0
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +157 -0
- package/.next/react-loadable-manifest.json +401 -0
- package/.next/required-server-files.js +398 -0
- package/.next/required-server-files.json +398 -0
- package/.next/routes-manifest.json +561 -0
- package/.next/server/app/_global-error/page.js +31 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_global-error.html +1 -0
- package/.next/server/app/_global-error.meta +35 -0
- package/.next/server/app/_global-error.rsc +14 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +20 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page.js +1 -0
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
- package/.next/server/app/_not-found.html +1 -0
- package/.next/server/app/_not-found.meta +35 -0
- package/.next/server/app/_not-found.rsc +22 -0
- package/.next/server/app/_not-found.segments/_full.segment.rsc +22 -0
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +28 -0
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +7 -0
- package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -0
- package/.next/server/app/api/agent/[id]/bash-output/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/events/route.js +3 -0
- package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/lease/route.js +1 -0
- package/.next/server/app/api/agent/[id]/lease/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/[id]/route.js +1 -0
- package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/new/route.js +1 -0
- package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/running/route.js +1 -0
- package/.next/server/app/api/agent/running/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/app-update/route.js +1 -0
- package/.next/server/app/api/app-update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -0
- package/.next/server/app/api/auth/api-key/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/login/[provider]/route.js +3 -0
- package/.next/server/app/api/auth/login/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/logout/[provider]/route.js +1 -0
- package/.next/server/app/api/auth/logout/[provider]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/providers/route.js +1 -0
- package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cache-miss-notices/route.js +1 -0
- package/.next/server/app/api/cache-miss-notices/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cwd/browse/route.js +1 -0
- package/.next/server/app/api/cwd/browse/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cwd/validate/route.js +1 -0
- package/.next/server/app/api/cwd/validate/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/default-cwd/route.js +1 -0
- package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/file-index/route.js +1 -0
- package/.next/server/app/api/file-index/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/files/[...path]/route.js +49 -0
- package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/git/diff/route.js +6 -0
- package/.next/server/app/api/git/diff/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/git/status/route.js +6 -0
- package/.next/server/app/api/git/status/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/home/route.js +1 -0
- package/.next/server/app/api/home/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/mcp/route.js +2 -0
- package/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/mcp/sign-in/[flowId]/route.js +1 -0
- package/.next/server/app/api/mcp/sign-in/[flowId]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/mcp/sign-in/route.js +1 -0
- package/.next/server/app/api/mcp/sign-in/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/mcp/test/route.js +1 -0
- package/.next/server/app/api/mcp/test/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/default/route.js +1 -0
- package/.next/server/app/api/models/default/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/enabled/route.js +1 -0
- package/.next/server/app/api/models/enabled/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/refresh/route.js +1 -0
- package/.next/server/app/api/models/refresh/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/route.js +1 -0
- package/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/catalog/route.js +1 -0
- package/.next/server/app/api/models-config/catalog/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/discover/route.js +1 -0
- package/.next/server/app/api/models-config/discover/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/route.js +1 -0
- package/.next/server/app/api/models-config/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models-config/test/route.js +1 -0
- package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/open-in-explorer/route.js +1 -0
- package/.next/server/app/api/open-in-explorer/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/plugins/check/route.js +1 -0
- package/.next/server/app/api/plugins/check/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/plugins/route.js +1 -0
- package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/project-trust/route.js +1 -0
- package/.next/server/app/api/project-trust/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/provider-usage/query/route.js +1 -0
- package/.next/server/app/api/provider-usage/query/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/push/config/route.js +1 -0
- package/.next/server/app/api/push/config/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/push/subscribe/route.js +1 -0
- package/.next/server/app/api/push/subscribe/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route.js +11 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/context/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/tool-result-image/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/tool-result-image/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/export/route.js +54 -0
- package/.next/server/app/api/sessions/[id]/export/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/fork/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/fork/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/state/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/state/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/delete/route.js +1 -0
- package/.next/server/app/api/sessions/delete/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/route.js +1 -0
- package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/search/route.js +1 -0
- package/.next/server/app/api/sessions/search/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/stats/route.js +1 -0
- package/.next/server/app/api/sessions/stats/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/ui-state/route.js +1 -0
- package/.next/server/app/api/sessions/ui-state/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/check/route.js +1 -0
- package/.next/server/app/api/skills/check/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/content/route.js +1 -0
- package/.next/server/app/api/skills/content/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/install/route.js +1 -0
- package/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/route.js +4 -0
- package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/search/route.js +1 -0
- package/.next/server/app/api/skills/search/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/update/route.js +1 -0
- package/.next/server/app/api/skills/update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/subagents/[id]/route.js +1 -0
- package/.next/server/app/api/subagents/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/subagents/profiles/route.js +1 -0
- package/.next/server/app/api/subagents/profiles/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/subagents/settings/route.js +1 -0
- package/.next/server/app/api/subagents/settings/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/terminal/[id]/events/route.js +4 -0
- package/.next/server/app/api/terminal/[id]/events/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/terminal/[id]/route.js +1 -0
- package/.next/server/app/api/terminal/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/terminal/route.js +1 -0
- package/.next/server/app/api/terminal/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/tools/settings/route.js +1 -0
- package/.next/server/app/api/tools/settings/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/web-auth/route.js +1 -0
- package/.next/server/app/api/web-auth/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/route.js +1 -0
- package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -0
- package/.next/server/app/favicon.ico/route.js +1 -0
- package/.next/server/app/favicon.ico.body +0 -0
- package/.next/server/app/favicon.ico.meta +1 -0
- package/.next/server/app/index.html +1 -0
- package/.next/server/app/index.meta +29 -0
- package/.next/server/app/index.rsc +23 -0
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +27 -0
- package/.next/server/app/index.segments/_full.segment.rsc +23 -0
- package/.next/server/app/index.segments/_tree.segment.rsc +8 -0
- package/.next/server/app/login/page.js +1 -0
- package/.next/server/app/login/page_client-reference-manifest.js +1 -0
- package/.next/server/app/login.html +1 -0
- package/.next/server/app/login.meta +34 -0
- package/.next/server/app/login.rsc +26 -0
- package/.next/server/app/login.segments/_full.segment.rsc +26 -0
- package/.next/server/app/login.segments/_tree.segment.rsc +7 -0
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +32 -0
- package/.next/server/app/manifest.webmanifest/route.js +17 -0
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -0
- package/.next/server/app/page.js +309 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +75 -0
- package/.next/server/chunks/11.js +1 -0
- package/.next/server/chunks/1207.js +1 -0
- package/.next/server/chunks/1286.js +1 -0
- package/.next/server/chunks/1412.js +38 -0
- package/.next/server/chunks/1605.js +1 -0
- package/.next/server/chunks/169.js +1 -0
- package/.next/server/chunks/18.js +86 -0
- package/.next/server/chunks/1813.js +1 -0
- package/.next/server/chunks/1906.js +1 -0
- package/.next/server/chunks/2022.js +1 -0
- package/.next/server/chunks/2069.js +1 -0
- package/.next/server/chunks/2156.js +1 -0
- package/.next/server/chunks/2157.js +1 -0
- package/.next/server/chunks/2243.js +1 -0
- package/.next/server/chunks/2325.js +82 -0
- package/.next/server/chunks/2430.js +193 -0
- package/.next/server/chunks/2498.js +1 -0
- package/.next/server/chunks/27.js +1 -0
- package/.next/server/chunks/2838.js +1 -0
- package/.next/server/chunks/2897.js +79 -0
- package/.next/server/chunks/2970.js +165 -0
- package/.next/server/chunks/3227.js +1 -0
- package/.next/server/chunks/3266.js +1 -0
- package/.next/server/chunks/3379.js +1 -0
- package/.next/server/chunks/3428.js +32 -0
- package/.next/server/chunks/3479.js +1 -0
- package/.next/server/chunks/3618.js +1 -0
- package/.next/server/chunks/367.js +115 -0
- package/.next/server/chunks/3698.js +93 -0
- package/.next/server/chunks/3709.js +148 -0
- package/.next/server/chunks/3757.js +1 -0
- package/.next/server/chunks/3824.js +1 -0
- package/.next/server/chunks/4107.js +62 -0
- package/.next/server/chunks/426.js +14 -0
- package/.next/server/chunks/4569.js +34 -0
- package/.next/server/chunks/4698.js +1 -0
- package/.next/server/chunks/4755.js +153 -0
- package/.next/server/chunks/4815.js +3 -0
- package/.next/server/chunks/5002.js +1 -0
- package/.next/server/chunks/5112.js +1 -0
- package/.next/server/chunks/5289.js +8 -0
- package/.next/server/chunks/5318.js +1 -0
- package/.next/server/chunks/5452.js +23 -0
- package/.next/server/chunks/5453.js +1 -0
- package/.next/server/chunks/5582.js +8 -0
- package/.next/server/chunks/5749.js +27 -0
- package/.next/server/chunks/5782.js +36 -0
- package/.next/server/chunks/6163.js +104 -0
- package/.next/server/chunks/6169.js +64 -0
- package/.next/server/chunks/6208.js +172 -0
- package/.next/server/chunks/6399.js +24 -0
- package/.next/server/chunks/6429.js +32 -0
- package/.next/server/chunks/6496.js +1 -0
- package/.next/server/chunks/6686.js +1 -0
- package/.next/server/chunks/6823.js +215 -0
- package/.next/server/chunks/6888.js +1 -0
- package/.next/server/chunks/6953.js +1 -0
- package/.next/server/chunks/7245.js +77 -0
- package/.next/server/chunks/7307.js +1 -0
- package/.next/server/chunks/7372.js +287 -0
- package/.next/server/chunks/7384.js +226 -0
- package/.next/server/chunks/7492.js +1 -0
- package/.next/server/chunks/7516.js +1 -0
- package/.next/server/chunks/7531.js +24 -0
- package/.next/server/chunks/7591.js +1 -0
- package/.next/server/chunks/7755.js +138 -0
- package/.next/server/chunks/7916.js +1 -0
- package/.next/server/chunks/8078.js +94 -0
- package/.next/server/chunks/8253.js +41 -0
- package/.next/server/chunks/8635.js +1 -0
- package/.next/server/chunks/8637.js +1 -0
- package/.next/server/chunks/8688.js +1 -0
- package/.next/server/chunks/8872.js +1 -0
- package/.next/server/chunks/9006.js +1 -0
- package/.next/server/chunks/9018.js +1 -0
- package/.next/server/chunks/9047.js +1 -0
- package/.next/server/chunks/9108.js +1 -0
- package/.next/server/chunks/9165.js +1 -0
- package/.next/server/chunks/9280.js +256 -0
- package/.next/server/chunks/9419.js +1 -0
- package/.next/server/chunks/9430.js +1 -0
- package/.next/server/chunks/9586.js +1 -0
- package/.next/server/chunks/9690.js +90 -0
- package/.next/server/chunks/974.js +1 -0
- package/.next/server/chunks/9775.js +1 -0
- package/.next/server/chunks/992.js +1 -0
- package/.next/server/chunks/9926.js +1 -0
- package/.next/server/functions-config-manifest.json +27 -0
- package/.next/server/instrumentation.js +1 -0
- package/.next/server/instrumentation.js.nft.json +1 -0
- package/.next/server/interception-route-rewrite-manifest.js +1 -0
- package/.next/server/middleware-build-manifest.js +1 -0
- package/.next/server/middleware-manifest.json +6 -0
- package/.next/server/middleware-react-loadable-manifest.js +1 -0
- package/.next/server/middleware.js +163 -0
- package/.next/server/middleware.js.nft.json +1 -0
- package/.next/server/next-font-manifest.js +1 -0
- package/.next/server/next-font-manifest.json +1 -0
- package/.next/server/pages/404.html +1 -0
- package/.next/server/pages/500.html +1 -0
- package/.next/server/pages-manifest.json +4 -0
- package/.next/server/prefetch-hints.json +53 -0
- package/.next/server/server-reference-manifest.js +1 -0
- package/.next/server/server-reference-manifest.json +1 -0
- package/.next/server/webpack-runtime.js +1 -0
- package/.next/static/2ftfKxA2Tk6WrtjeFq3pC/_buildManifest.js +1 -0
- package/.next/static/2ftfKxA2Tk6WrtjeFq3pC/_ssgManifest.js +1 -0
- package/.next/static/chunks/1213.4848a5579bece837.js +24 -0
- package/.next/static/chunks/1278-902e48c12cf60065.js +1 -0
- package/.next/static/chunks/1326.72decfb808c97abe.js +1 -0
- package/.next/static/chunks/1519.2f596e5f5af9ef57.js +62 -0
- package/.next/static/chunks/2280.e03ab3748922284c.js +1 -0
- package/.next/static/chunks/2521.2ba812532f472610.js +77 -0
- package/.next/static/chunks/2585.4d6aa847c780c666.js +1 -0
- package/.next/static/chunks/2589.e456c324416f9615.js +1 -0
- package/.next/static/chunks/2600.45ba17a0f756fc31.js +1 -0
- package/.next/static/chunks/2619.9431a3f48da8eef4.js +1 -0
- package/.next/static/chunks/26d302b2.cd19dc0940cb3e75.js +122 -0
- package/.next/static/chunks/2768.1a75ba9e2be767cf.js +1 -0
- package/.next/static/chunks/2931.c5527c92f7264e9a.js +41 -0
- package/.next/static/chunks/3016.406e568aa95ff867.js +1 -0
- package/.next/static/chunks/3052.5da5bde6a131930a.js +90 -0
- package/.next/static/chunks/3064.3a2a1e7cd4fdca5f.js +1 -0
- package/.next/static/chunks/3174.03fbed7b7d7a8256.js +1 -0
- package/.next/static/chunks/3189.b048866768087750.js +1 -0
- package/.next/static/chunks/3217.457eee26edea225c.js +24 -0
- package/.next/static/chunks/3308.935f7625e681e15a.js +74 -0
- package/.next/static/chunks/331.fc5d78e1e91daf43.js +1 -0
- package/.next/static/chunks/3510.5d4d1c79533e080c.js +1 -0
- package/.next/static/chunks/364.ce5400a9dd70b9dc.js +1 -0
- package/.next/static/chunks/370.a485dd5092c76362.js +1 -0
- package/.next/static/chunks/3789.c418b69121761983.js +1 -0
- package/.next/static/chunks/3794-6f271a1eb27dfa20.js +52 -0
- package/.next/static/chunks/3831.25ae62d10dccc27a.js +1 -0
- package/.next/static/chunks/3a7aa434.9780f397da64eb81.js +82 -0
- package/.next/static/chunks/4020.3cc19c463c49f969.js +23 -0
- package/.next/static/chunks/4035.f5bcc2e4f0beee2b.js +1 -0
- package/.next/static/chunks/405.7027b68fbb48582a.js +215 -0
- package/.next/static/chunks/4159.8f53338a07b26845.js +138 -0
- package/.next/static/chunks/4208.e3c7f2d5c26dcf2e.js +287 -0
- package/.next/static/chunks/4263.ffa8d9bd8a0faaae.js +1 -0
- package/.next/static/chunks/4561.70303588b0cd3621.js +34 -0
- package/.next/static/chunks/4592.507c41f345e21bee.js +93 -0
- package/.next/static/chunks/4799.1d3f2e30954503b8.js +1 -0
- package/.next/static/chunks/4bd1b696-8a4ab4fdf0ae305a.js +1 -0
- package/.next/static/chunks/514.b804c51b26f5e126.js +1 -0
- package/.next/static/chunks/5270.2b9a21b6ce8fd8d2.js +1 -0
- package/.next/static/chunks/52733464.74fafefbfa340fc8.js +1 -0
- package/.next/static/chunks/5354.b559c717a607dc5c.js +1 -0
- package/.next/static/chunks/5448.23a76c3983fec0f6.js +38 -0
- package/.next/static/chunks/5772-c8175d2fabf63b95.js +3 -0
- package/.next/static/chunks/587.d52737d7288c11b4.js +1 -0
- package/.next/static/chunks/5909.172aa3edf289b590.js +115 -0
- package/.next/static/chunks/5949.54e8a766895688d7.js +104 -0
- package/.next/static/chunks/60c48509.2ba44b5cbe52c6e7.js +158 -0
- package/.next/static/chunks/6361.4b1fa56fca9b6356.js +148 -0
- package/.next/static/chunks/6774.07517a60a602aadd.js +86 -0
- package/.next/static/chunks/6968.b80277c724dbc96e.js +1 -0
- package/.next/static/chunks/7236.55a9728d35f5b8a6.js +1 -0
- package/.next/static/chunks/7390.bc7f4ed9f76fe9e1.js +1 -0
- package/.next/static/chunks/7806.a903780fcfa3a30e.js +1 -0
- package/.next/static/chunks/790.45f73b5eb2e089eb.js +1 -0
- package/.next/static/chunks/8216.64a72d4d35ea7be0.js +1 -0
- package/.next/static/chunks/830.a6da04c322e3204a.js +1 -0
- package/.next/static/chunks/8378.6acf715f56997572.js +226 -0
- package/.next/static/chunks/8501.3b0a97ac3e782a0f.js +79 -0
- package/.next/static/chunks/8663.7deb45d41d190483.js +27 -0
- package/.next/static/chunks/872.96937e758ddce860.js +1 -0
- package/.next/static/chunks/8803.75bde095fe3613f5.js +1 -0
- package/.next/static/chunks/8863.582d77dad0e1cc29.js +1 -0
- package/.next/static/chunks/90542734.90283a0c0c838d51.js +1 -0
- package/.next/static/chunks/9379.979bec4531e0611a.js +64 -0
- package/.next/static/chunks/9389.906fe7aa9cd6a170.js +1 -0
- package/.next/static/chunks/9472.08db7006e4a030a4.js +94 -0
- package/.next/static/chunks/9647.29c5a9819b36fcda.js +15 -0
- package/.next/static/chunks/966.7ab226a15142fae2.js +1 -0
- package/.next/static/chunks/975.710b5962d34d4598.js +22 -0
- package/.next/static/chunks/9884.fca67f18c0fb2808.js +36 -0
- package/.next/static/chunks/9932-60e21347ba9f8664.js +7 -0
- package/.next/static/chunks/a339c874.7657a67d1b0d46c1.js +32 -0
- package/.next/static/chunks/app/_global-error/page-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/_not-found/page-1e1cf8cba5576cd4.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/bash-output/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/lease/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/agent/running/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/app-update/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/auth/login/[provider]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/auth/providers/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/cache-miss-notices/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/cwd/browse/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/cwd/validate/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/default-cwd/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/file-index/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/files/[...path]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/git/diff/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/git/status/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/home/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/mcp/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/mcp/sign-in/[flowId]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/mcp/sign-in/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/mcp/test/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models/default/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models/enabled/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models/refresh/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models-config/catalog/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models-config/discover/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models-config/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/models-config/test/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/open-in-explorer/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/plugins/check/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/plugins/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/project-trust/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/provider-usage/query/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/push/config/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/push/subscribe/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/context/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/tool-result-image/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/export/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/fork/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/state/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/delete/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/search/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/stats/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/sessions/ui-state/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/check/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/content/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/install/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/search/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/skills/update/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/subagents/[id]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/subagents/profiles/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/subagents/settings/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/terminal/[id]/events/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/terminal/[id]/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/terminal/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/tools/settings/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/web-auth/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/layout-3339966738755d72.js +1 -0
- package/.next/static/chunks/app/login/page-3a355df23c47aa56.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/app/page-c6eefaf480702550.js +287 -0
- package/.next/static/chunks/d3ac728e-7964f816a1ca64e5.js +1 -0
- package/.next/static/chunks/e413bedd.1332b3d1558778d6.js +153 -0
- package/.next/static/chunks/e868780c-1584512c612787d7.js +18 -0
- package/.next/static/chunks/ea233666.528d9a11a2c6fe2f.js +62 -0
- package/.next/static/chunks/framework-b33a8f5d57cd8d87.js +1 -0
- package/.next/static/chunks/main-63ddef04e98b28f4.js +5 -0
- package/.next/static/chunks/main-app-a98576891fdd8f60.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-30078bc26a2476fc.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-cbe4231fb889bdce.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-b6c37de25f933bc6.js +1 -0
- package/.next/static/css/49692dbfa6f26eeb.css +1 -0
- package/.next/static/css/6d897e2692233627.css +1 -0
- package/.next/static/css/9bcd6051db4f8890.css +1 -0
- package/.next/static/css/b944d46e6fd6c54d.css +1 -0
- package/.next/static/css/c82f0c18392f486f.css +1 -0
- package/.next/static/media/15605e25b523335c-s.woff2 +0 -0
- package/.next/static/media/1a3dce5cfb5f7760-s.woff2 +0 -0
- package/.next/static/media/1cdd02902f937a18-s.woff2 +0 -0
- package/.next/static/media/4c4b3b30b6bcb2be-s.woff2 +0 -0
- package/.next/static/media/641a7b8a5800ee0e-s.woff2 +0 -0
- package/.next/static/media/7deddc85b7ffd1dc-s.p.woff2 +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
- package/.next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
- package/.next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
- package/.next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
- package/.next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
- package/.next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
- package/.next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
- package/.next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
- package/.next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
- package/.next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
- package/.next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
- package/.next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
- package/.next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
- package/.next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
- package/.next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
- package/.next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
- package/.next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
- package/.next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
- package/.next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
- package/.next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
- package/.next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
- package/.next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
- package/.next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
- package/.next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
- package/.next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
- package/.next/static/media/ec14413c594b3356-s.p.woff2 +0 -0
- package/.next/trace +83 -0
- package/.next/trace-build +1 -0
- package/.next/types/app/api/agent/[id]/bash-output/route.ts +353 -0
- package/.next/types/app/api/agent/[id]/events/route.ts +353 -0
- package/.next/types/app/api/agent/[id]/lease/route.ts +353 -0
- package/.next/types/app/api/agent/[id]/route.ts +353 -0
- package/.next/types/app/api/agent/new/route.ts +353 -0
- package/.next/types/app/api/agent/running/route.ts +353 -0
- package/.next/types/app/api/app-update/route.ts +353 -0
- package/.next/types/app/api/auth/api-key/[provider]/route.ts +353 -0
- package/.next/types/app/api/auth/login/[provider]/route.ts +353 -0
- package/.next/types/app/api/auth/logout/[provider]/route.ts +353 -0
- package/.next/types/app/api/auth/providers/route.ts +353 -0
- package/.next/types/app/api/cache-miss-notices/route.ts +353 -0
- package/.next/types/app/api/cwd/browse/route.ts +353 -0
- package/.next/types/app/api/cwd/validate/route.ts +353 -0
- package/.next/types/app/api/default-cwd/route.ts +353 -0
- package/.next/types/app/api/file-index/route.ts +353 -0
- package/.next/types/app/api/files/[...path]/route.ts +353 -0
- package/.next/types/app/api/git/diff/route.ts +353 -0
- package/.next/types/app/api/git/status/route.ts +353 -0
- package/.next/types/app/api/home/route.ts +353 -0
- package/.next/types/app/api/mcp/route.ts +353 -0
- package/.next/types/app/api/mcp/sign-in/[flowId]/route.ts +353 -0
- package/.next/types/app/api/mcp/sign-in/route.ts +353 -0
- package/.next/types/app/api/mcp/test/route.ts +353 -0
- package/.next/types/app/api/models/default/route.ts +353 -0
- package/.next/types/app/api/models/enabled/route.ts +353 -0
- package/.next/types/app/api/models/refresh/route.ts +353 -0
- package/.next/types/app/api/models/route.ts +353 -0
- package/.next/types/app/api/models-config/catalog/route.ts +353 -0
- package/.next/types/app/api/models-config/discover/route.ts +353 -0
- package/.next/types/app/api/models-config/route.ts +353 -0
- package/.next/types/app/api/models-config/test/route.ts +353 -0
- package/.next/types/app/api/open-in-explorer/route.ts +353 -0
- package/.next/types/app/api/plugins/check/route.ts +353 -0
- package/.next/types/app/api/plugins/route.ts +353 -0
- package/.next/types/app/api/project-trust/route.ts +353 -0
- package/.next/types/app/api/provider-usage/query/route.ts +353 -0
- package/.next/types/app/api/push/config/route.ts +353 -0
- package/.next/types/app/api/push/subscribe/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/auto-name/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/context/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/entries/[entryId]/thinking/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/entries/[entryId]/tool-result-image/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/export/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/fork/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/route.ts +353 -0
- package/.next/types/app/api/sessions/[id]/state/route.ts +353 -0
- package/.next/types/app/api/sessions/delete/route.ts +353 -0
- package/.next/types/app/api/sessions/route.ts +353 -0
- package/.next/types/app/api/sessions/search/route.ts +353 -0
- package/.next/types/app/api/sessions/stats/route.ts +353 -0
- package/.next/types/app/api/sessions/ui-state/route.ts +353 -0
- package/.next/types/app/api/skills/check/route.ts +353 -0
- package/.next/types/app/api/skills/content/route.ts +353 -0
- package/.next/types/app/api/skills/install/route.ts +353 -0
- package/.next/types/app/api/skills/route.ts +353 -0
- package/.next/types/app/api/skills/search/route.ts +353 -0
- package/.next/types/app/api/skills/update/route.ts +353 -0
- package/.next/types/app/api/subagents/[id]/route.ts +353 -0
- package/.next/types/app/api/subagents/profiles/route.ts +353 -0
- package/.next/types/app/api/subagents/settings/route.ts +353 -0
- package/.next/types/app/api/terminal/[id]/events/route.ts +353 -0
- package/.next/types/app/api/terminal/[id]/route.ts +353 -0
- package/.next/types/app/api/terminal/route.ts +353 -0
- package/.next/types/app/api/tools/settings/route.ts +353 -0
- package/.next/types/app/api/web-auth/route.ts +353 -0
- package/.next/types/app/api/worktrees/route.ts +353 -0
- package/.next/types/app/layout.ts +89 -0
- package/.next/types/app/login/page.ts +89 -0
- package/.next/types/app/page.ts +89 -0
- package/.next/types/cache-life.d.ts +146 -0
- package/.next/types/package.json +1 -0
- package/.next/types/root-params.d.ts +3 -0
- package/.next/types/routes.d.ts +140 -0
- package/.next/types/validator.ts +682 -0
- package/LICENSE +22 -0
- package/README.md +208 -2
- package/bin/browser-opener.js +34 -0
- package/bin/node-version.js +35 -0
- package/bin/pi-web-commands.js +118 -0
- package/bin/pi-web-node-args.js +11 -0
- package/bin/pi-web-options.js +141 -0
- package/bin/pi-web-update.js +148 -0
- package/bin/pi-web.js +157 -0
- package/bin/prepare-terminal.js +14 -0
- package/bin/process-lifecycle.js +81 -0
- package/bin/rotate-preview-secrets.js +105 -0
- package/bin/run-records.js +212 -0
- package/next.config.ts +110 -0
- package/package.json +105 -4
- package/public/icons/apple-touch-icon.png +0 -0
- package/public/icons/catppuccin/LICENSE +22 -0
- package/public/icons/catppuccin/README.md +10 -0
- package/public/icons/catppuccin/latte/_file.svg +3 -0
- package/public/icons/catppuccin/latte/_folder.svg +3 -0
- package/public/icons/catppuccin/latte/_folder_open.svg +3 -0
- package/public/icons/catppuccin/latte/bash.svg +7 -0
- package/public/icons/catppuccin/latte/bun-lock.svg +8 -0
- package/public/icons/catppuccin/latte/config.svg +3 -0
- package/public/icons/catppuccin/latte/css.svg +6 -0
- package/public/icons/catppuccin/latte/database.svg +3 -0
- package/public/icons/catppuccin/latte/docker.svg +3 -0
- package/public/icons/catppuccin/latte/env.svg +3 -0
- package/public/icons/catppuccin/latte/eslint.svg +6 -0
- package/public/icons/catppuccin/latte/git.svg +6 -0
- package/public/icons/catppuccin/latte/go.svg +3 -0
- package/public/icons/catppuccin/latte/graphql.svg +3 -0
- package/public/icons/catppuccin/latte/html.svg +6 -0
- package/public/icons/catppuccin/latte/javascript-react.svg +8 -0
- package/public/icons/catppuccin/latte/javascript.svg +6 -0
- package/public/icons/catppuccin/latte/json.svg +3 -0
- package/public/icons/catppuccin/latte/lock.svg +3 -0
- package/public/icons/catppuccin/latte/markdown.svg +3 -0
- package/public/icons/catppuccin/latte/ms-word.svg +6 -0
- package/public/icons/catppuccin/latte/next.svg +6 -0
- package/public/icons/catppuccin/latte/npm-lock.svg +7 -0
- package/public/icons/catppuccin/latte/pdf.svg +3 -0
- package/public/icons/catppuccin/latte/python.svg +8 -0
- package/public/icons/catppuccin/latte/rust.svg +6 -0
- package/public/icons/catppuccin/latte/sass.svg +3 -0
- package/public/icons/catppuccin/latte/terraform.svg +3 -0
- package/public/icons/catppuccin/latte/toml.svg +3 -0
- package/public/icons/catppuccin/latte/typescript-react.svg +8 -0
- package/public/icons/catppuccin/latte/typescript.svg +6 -0
- package/public/icons/catppuccin/latte/yaml.svg +3 -0
- package/public/icons/catppuccin/mocha/_file.svg +3 -0
- package/public/icons/catppuccin/mocha/_folder.svg +3 -0
- package/public/icons/catppuccin/mocha/_folder_open.svg +3 -0
- package/public/icons/catppuccin/mocha/bash.svg +7 -0
- package/public/icons/catppuccin/mocha/bun-lock.svg +8 -0
- package/public/icons/catppuccin/mocha/config.svg +3 -0
- package/public/icons/catppuccin/mocha/css.svg +6 -0
- package/public/icons/catppuccin/mocha/database.svg +3 -0
- package/public/icons/catppuccin/mocha/docker.svg +3 -0
- package/public/icons/catppuccin/mocha/env.svg +3 -0
- package/public/icons/catppuccin/mocha/eslint.svg +6 -0
- package/public/icons/catppuccin/mocha/git.svg +6 -0
- package/public/icons/catppuccin/mocha/go.svg +3 -0
- package/public/icons/catppuccin/mocha/graphql.svg +3 -0
- package/public/icons/catppuccin/mocha/html.svg +6 -0
- package/public/icons/catppuccin/mocha/javascript-react.svg +8 -0
- package/public/icons/catppuccin/mocha/javascript.svg +6 -0
- package/public/icons/catppuccin/mocha/json.svg +3 -0
- package/public/icons/catppuccin/mocha/lock.svg +3 -0
- package/public/icons/catppuccin/mocha/markdown.svg +3 -0
- package/public/icons/catppuccin/mocha/ms-word.svg +6 -0
- package/public/icons/catppuccin/mocha/next.svg +6 -0
- package/public/icons/catppuccin/mocha/npm-lock.svg +7 -0
- package/public/icons/catppuccin/mocha/pdf.svg +3 -0
- package/public/icons/catppuccin/mocha/python.svg +8 -0
- package/public/icons/catppuccin/mocha/rust.svg +6 -0
- package/public/icons/catppuccin/mocha/sass.svg +3 -0
- package/public/icons/catppuccin/mocha/terraform.svg +3 -0
- package/public/icons/catppuccin/mocha/toml.svg +3 -0
- package/public/icons/catppuccin/mocha/typescript-react.svg +8 -0
- package/public/icons/catppuccin/mocha/typescript.svg +6 -0
- package/public/icons/catppuccin/mocha/yaml.svg +3 -0
- package/public/icons/icon-192.png +0 -0
- package/public/icons/icon-512.png +0 -0
- package/public/offline.html +83 -0
- package/public/provider-icons.svg +54 -0
- package/public/sw.js +183 -0
- package/public/sw.test.mjs +339 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 agegr
|
|
4
|
+
Copyright (c) 2026 colinxu (fork: @colinxu/pi-web)
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,209 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Pi Web
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[中文文档](./docs/README.zh-CN.md) | [日本語](./docs/README.ja.md) | [Русский](./docs/README.ru.md)
|
|
4
|
+
|
|
5
|
+
Local browser UI for the [pi coding agent](https://github.com/earendil-works/pi). Pi Web uses the same local configuration and session files as pi, so you can browse and resume conversations, run agent turns, configure models and resources, and inspect project files from a browser.
|
|
6
|
+
|
|
7
|
+
> **Fork notice.** This is `@colinxu/pi-web-classic`, a fork of [agegr/pi-web](https://github.com/agegr/pi-web). The global command is `pwc`, so it can be installed alongside the original. MIT licensed; see [LICENSE](./LICENSE).
|
|
8
|
+
|
|
9
|
+
**[Try the interactive demo →](https://agegr.github.io/pi-web/)** The real Pi Web UI runs entirely in your browser, with sample sessions, files and models. There is nothing to install; replies are pre-written and no model is called.
|
|
10
|
+
|
|
11
|
+

|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- **Session workspace**: browse, resume, rename, export, and delete conversations grouped by project, with running state, context usage, cost, and compaction details.
|
|
16
|
+
- **Two ways to branch**: **New session** creates an independent session file from an earlier message; **Edit from here** creates a branch inside the current session.
|
|
17
|
+
- **Project file tools**: browse and upload files, inspect Git diffs, and preview source, Markdown, images, audio, PDFs, and DOCX files with automatic refresh.
|
|
18
|
+
- **Git worktrees**: switch checkouts from the sidebar while keeping sessions from the same repository grouped together.
|
|
19
|
+
- **Web-based configuration**: manage provider login and API keys, models, model tests, plugin packages, and skills without leaving Pi Web.
|
|
20
|
+
- **English, Simplified Chinese, and Traditional Chinese UI**: Pi Web follows the browser language initially and provides a language switcher in the top bar.
|
|
21
|
+
|
|
22
|
+
## Quick Start
|
|
23
|
+
|
|
24
|
+
Pi Web requires Node.js 22.19.0 or newer. Check your version with `node --version`, then run:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npx @colinxu/pi-web-classic@latest
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
The CLI opens a browser after the server is ready. If it does not, open [http://127.0.0.1:30141](http://127.0.0.1:30141). Pi Web listens only on `127.0.0.1` by default.
|
|
31
|
+
|
|
32
|
+
If no model provider is configured yet, open the **Models** panel to sign in or add an API key.
|
|
33
|
+
|
|
34
|
+
To install the `pwc` command globally:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install -g @colinxu/pi-web-classic@latest
|
|
38
|
+
pwc
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Commands:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pwc version # print the installed version
|
|
45
|
+
pwc status # list running servers
|
|
46
|
+
pwc stop [--port N] # stop a running server
|
|
47
|
+
pwc open [--port N] # open a running server in the browser
|
|
48
|
+
pwc update [--check] # update a global npm install
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
To update, run `pwc stop`, then `pwc update` (or run the same install command again). To uninstall, run `npm uninstall -g @colinxu/pi-web-classic`.
|
|
52
|
+
|
|
53
|
+
## Configuration
|
|
54
|
+
|
|
55
|
+
For port and hostname, command-line options override the corresponding environment variables. Either `--no-open` or `PI_WEB_NO_OPEN=1` disables automatic browser opening. Run `pwc --help` (or `-h`) to print startup options and exit without starting the server. Unknown options exit with an error.
|
|
56
|
+
|
|
57
|
+
| Option or environment variable | Purpose | Default |
|
|
58
|
+
| --- | --- | --- |
|
|
59
|
+
| `--help`, `-h` | Print startup options and exit | — |
|
|
60
|
+
| `--port <port>`, `-p <port>`, or `PORT` | Server port | `30141` |
|
|
61
|
+
| `--hostname <host>`, `-H <host>`, or `PI_WEB_HOSTNAME` | Bind hostname | `127.0.0.1` |
|
|
62
|
+
| `--no-open` or `PI_WEB_NO_OPEN=1` | Do not open a browser automatically | Browser opens |
|
|
63
|
+
| `PI_WEB_APP_NAME` | PWA manifest `name` and `short_name`; surrounding whitespace is trimmed, empty values use the default | `Pi Web` |
|
|
64
|
+
| `PI_WEB_SKIP_VERSION_CHECK=1` | Disable Pi Web update checks | Unset |
|
|
65
|
+
| `PI_WEB_ALLOWED_HOSTS` | Additional exact proxy or custom hostnames, comma-separated | Unset |
|
|
66
|
+
| `PI_WEB_PASSWORD` | Enable browser password login; API clients may use Basic Auth with username `pi` | Authentication disabled |
|
|
67
|
+
| `PI_WEB_IDLE_TIMEOUT_MS` | Session idle timeout in milliseconds, up to `2147483647`; `0` disables idle shutdown; invalid or out-of-range values use the default | `600000` (10 min) |
|
|
68
|
+
| `PI_WEB_SHUTDOWN_DEADLINE_MS` | How long extensions get to handle `session_shutdown` before a closing session is disposed anyway, in milliseconds up to `2147483647`; `0`, invalid or out-of-range values use the default | `5000` (5 s) |
|
|
69
|
+
|
|
70
|
+
Set `PI_WEB_APP_NAME` before starting the server (for example, `PI_WEB_APP_NAME='Work Pi' pwc`). After changing it, restart the server to serve the new manifest; no rebuild is required. Updates to the name of an already installed PWA are managed by the browser and are not guaranteed to appear immediately. This does not change the page title or icons.
|
|
71
|
+
|
|
72
|
+
For example:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
pwc --help
|
|
76
|
+
pwc -p 8080 -H 0.0.0.0 --no-open
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Remote Access
|
|
80
|
+
|
|
81
|
+
Binding to a non-loopback address exposes an agent that can execute high-privilege actions. On a trusted LAN, require a long random password:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
PI_WEB_PASSWORD='a-long-random-password' pwc --hostname 0.0.0.0
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Password authentication does not encrypt the connection. Do not expose Pi Web over plain HTTP to the internet; use HTTPS through a trusted reverse proxy or a trusted VPN. If a reverse proxy sends an external hostname, add that exact name to `PI_WEB_ALLOWED_HOSTS`. This allow-list does not change the address Pi Web binds to.
|
|
88
|
+
|
|
89
|
+
### HTTP Proxy
|
|
90
|
+
|
|
91
|
+
Server-side model and API requests honor the standard `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables.
|
|
92
|
+
|
|
93
|
+
On macOS or Linux:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
HTTP_PROXY=http://127.0.0.1:7890 \
|
|
97
|
+
HTTPS_PROXY=http://127.0.0.1:7890 \
|
|
98
|
+
NO_PROXY=localhost,127.0.0.1 \
|
|
99
|
+
npx @colinxu/pi-web-classic@latest
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
On Windows PowerShell:
|
|
103
|
+
|
|
104
|
+
```powershell
|
|
105
|
+
$env:HTTP_PROXY = "http://127.0.0.1:7890"
|
|
106
|
+
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
|
|
107
|
+
$env:NO_PROXY = "localhost,127.0.0.1"
|
|
108
|
+
npx @colinxu/pi-web-classic@latest
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Notes
|
|
112
|
+
|
|
113
|
+
- **Agent data**: Pi Web reads pi data from `~/.pi/agent` by default, including session files under `sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`. Set `PI_CODING_AGENT_DIR` to use another pi agent directory.
|
|
114
|
+
- **Filesystem access**: Pi Web must be able to read the agent data directory and the working directories recorded by its sessions. Run Pi Web in the same filesystem environment as pi when sharing existing sessions.
|
|
115
|
+
- **Shared configuration**: the Models panel uses pi's model, settings, and credential storage, so changes are visible to both interfaces.
|
|
116
|
+
- **File access boundary**: the file browser is limited to working directories selected in Pi Web and project or session roots it already knows about; it is not a general filesystem browser.
|
|
117
|
+
- **Git worktrees**: see [Worktrees in Pi Web](./docs/worktrees.md) for switcher visibility, worktree creation, and removal behavior.
|
|
118
|
+
|
|
119
|
+
### Downstream Session Context Menu
|
|
120
|
+
|
|
121
|
+
Electron wrappers and other downstream integrations can provide a session-row
|
|
122
|
+
context menu without patching `SessionSidebar`. Listen for the cancelable
|
|
123
|
+
`pi-web:session-row-contextmenu` browser event and call `preventDefault()`
|
|
124
|
+
synchronously when the integration will handle it:
|
|
125
|
+
|
|
126
|
+
```js
|
|
127
|
+
window.addEventListener("pi-web:session-row-contextmenu", (event) => {
|
|
128
|
+
event.preventDefault();
|
|
129
|
+
const { id, path, cwd, name, clientX, clientY, refresh } = event.detail;
|
|
130
|
+
|
|
131
|
+
void openSessionMenu({ id, path, cwd, name, clientX, clientY }).then((changed) => {
|
|
132
|
+
if (changed) refresh();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
The detail object contains `id`, `path`, `cwd`, optional `name`, pointer
|
|
138
|
+
coordinates, and a `refresh()` callback for actions that change the session
|
|
139
|
+
list. If no listener cancels the extension event, Pi Web opens its built-in
|
|
140
|
+
session menu (pin, rename, fork, mark read or unread, archive, open in new
|
|
141
|
+
tab, delete) at the pointer instead of the browser's native context menu.
|
|
142
|
+
The row's `⋯` button always opens the built-in menu and does not dispatch the
|
|
143
|
+
event. Sessions not yet saved to disk get no built-in menu, so the native one
|
|
144
|
+
still appears for them. This hook is browser-side and independent of Pi agent
|
|
145
|
+
extensions.
|
|
146
|
+
|
|
147
|
+
### Extension Session Liveness
|
|
148
|
+
|
|
149
|
+
Server-side Pi extensions with detached work can prevent automatic idle
|
|
150
|
+
session eviction through the versioned global registry:
|
|
151
|
+
|
|
152
|
+
```js
|
|
153
|
+
const liveness = globalThis[Symbol.for("@colinxu/pi-web-classic/session-liveness/v1")];
|
|
154
|
+
const release = liveness?.version === 1
|
|
155
|
+
? liveness.register({
|
|
156
|
+
name: "my-extension",
|
|
157
|
+
sessionId,
|
|
158
|
+
sessionFile: sessionFile || undefined,
|
|
159
|
+
isActive: () => detachedJobs.size > 0,
|
|
160
|
+
})
|
|
161
|
+
: () => {};
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Register once per active extension session and call the returned idempotent
|
|
165
|
+
`release` function on session shutdown, replacement, or reload. `isActive`
|
|
166
|
+
must be synchronous, cheap, and scoped to the supplied exact session id or
|
|
167
|
+
file. Provider errors fail safe by preserving that session. This lease only
|
|
168
|
+
affects automatic idle eviction; explicit shutdown and Stop fallback cleanup
|
|
169
|
+
still take precedence.
|
|
170
|
+
|
|
171
|
+
## Development
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
npm install
|
|
175
|
+
npm run dev
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
The development server runs at [http://127.0.0.1:30141](http://127.0.0.1:30141). Run the common checks with:
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
npm test
|
|
182
|
+
node_modules/.bin/tsc --noEmit
|
|
183
|
+
npm run lint
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Do not run `next build` or `npm run build` during normal development. It writes to `.next/` and can interfere with the development server; leave builds for release work.
|
|
187
|
+
|
|
188
|
+
Before starting on a feature, read [Contributing](./CONTRIBUTING.md) for what is in scope and the pull request checklist.
|
|
189
|
+
|
|
190
|
+
Contributor guides: [Internationalization](./docs/i18n.md) and [Release process](./docs/release.md).
|
|
191
|
+
|
|
192
|
+
## Repository Layout
|
|
193
|
+
|
|
194
|
+
```text
|
|
195
|
+
app/ Next.js UI and API routes
|
|
196
|
+
components/ React UI components
|
|
197
|
+
hooks/ Client state and interaction hooks
|
|
198
|
+
lib/ Session, agent, model, file, Git, and security logic
|
|
199
|
+
public/ Static assets and PWA files
|
|
200
|
+
bin/ npm CLI entrypoint and launch option parsing
|
|
201
|
+
docs/ Focused user and contributor guides
|
|
202
|
+
demo/ Static browser demo published to GitHub Pages (see demo/README.md)
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
See [AGENTS.md](./AGENTS.md) for the architecture notes and detailed file map.
|
|
206
|
+
|
|
207
|
+
## License
|
|
208
|
+
|
|
209
|
+
[MIT](./LICENSE)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
4
|
+
const { spawn } = require("child_process");
|
|
5
|
+
|
|
6
|
+
function openInBrowser(url, platform = process.platform) {
|
|
7
|
+
// Avoid `shell: true` to suppress Node.js DEP0190 deprecation
|
|
8
|
+
// ("Passing args to a child process with shell option true can lead to
|
|
9
|
+
// security vulnerabilities, as the arguments are not escaped").
|
|
10
|
+
// Pass a structured argv so Node.js handles escaping instead of
|
|
11
|
+
// concatenating the args into a shell command string.
|
|
12
|
+
let opener;
|
|
13
|
+
if (platform === "win32") {
|
|
14
|
+
// `start` is a cmd.exe built-in, so invoke cmd directly. The empty
|
|
15
|
+
// title argument is required by `start` before the target URL.
|
|
16
|
+
opener = spawn(process.env.ComSpec || "cmd.exe", ["/c", "start", "", url], {
|
|
17
|
+
stdio: "ignore",
|
|
18
|
+
detached: true,
|
|
19
|
+
});
|
|
20
|
+
} else {
|
|
21
|
+
opener = spawn(platform === "darwin" ? "open" : "xdg-open", [url], {
|
|
22
|
+
stdio: "ignore",
|
|
23
|
+
detached: true,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
opener.on("error", (error) => {
|
|
28
|
+
console.warn(`Could not open browser automatically: ${error.message}`);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
opener.unref();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { openInBrowser };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const MIN_NODE_VERSION = "22.19.0";
|
|
4
|
+
|
|
5
|
+
function parseNodeVersion(version) {
|
|
6
|
+
const match = /^v?(\d+)\.(\d+)\.(\d+)/.exec(version);
|
|
7
|
+
if (!match) return null;
|
|
8
|
+
return match.slice(1).map(Number);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function isNodeVersionSupported(version) {
|
|
12
|
+
const current = parseNodeVersion(version);
|
|
13
|
+
const minimum = parseNodeVersion(MIN_NODE_VERSION);
|
|
14
|
+
if (!current || !minimum) return false;
|
|
15
|
+
|
|
16
|
+
for (let index = 0; index < minimum.length; index += 1) {
|
|
17
|
+
if (current[index] > minimum[index]) return true;
|
|
18
|
+
if (current[index] < minimum[index]) return false;
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function getUnsupportedNodeVersionMessage(version) {
|
|
24
|
+
return [
|
|
25
|
+
`Pi Web requires Node.js ${MIN_NODE_VERSION} or newer.`,
|
|
26
|
+
`Current Node.js version: ${version}.`,
|
|
27
|
+
"Upgrade Node.js and try again: https://nodejs.org/",
|
|
28
|
+
].join("\n");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
module.exports = {
|
|
32
|
+
MIN_NODE_VERSION,
|
|
33
|
+
getUnsupportedNodeVersionMessage,
|
|
34
|
+
isNodeVersionSupported,
|
|
35
|
+
};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
4
|
+
const { spawnSync } = require("child_process");
|
|
5
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
6
|
+
const path = require("path");
|
|
7
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
8
|
+
const { openInBrowser } = require("./browser-opener");
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
10
|
+
const { runUpdate } = require("./pi-web-update");
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
12
|
+
const records = require("./run-records");
|
|
13
|
+
|
|
14
|
+
const STOP_TIMEOUT_MS = 10_000;
|
|
15
|
+
const STOP_POLL_MS = 200;
|
|
16
|
+
|
|
17
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
18
|
+
|
|
19
|
+
function getPackageVersion(pkgDir = path.join(__dirname, "..")) {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
21
|
+
return require(path.join(pkgDir, "package.json")).version;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function killWindowsProcessTree(pid) {
|
|
25
|
+
const result = spawnSync("taskkill", ["/pid", String(pid), "/T", "/F"], { encoding: "utf8" });
|
|
26
|
+
if (result.error) throw result.error;
|
|
27
|
+
if (result.status !== 0) throw new Error((result.stderr || result.stdout || `taskkill exited ${result.status}`).trim());
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function stopServer(record, {
|
|
31
|
+
kill = process.kill,
|
|
32
|
+
killTree = killWindowsProcessTree,
|
|
33
|
+
platform = process.platform,
|
|
34
|
+
isAlive = records.isProcessAlive,
|
|
35
|
+
wait = sleep,
|
|
36
|
+
timeoutMs = STOP_TIMEOUT_MS,
|
|
37
|
+
log = console.log,
|
|
38
|
+
error = console.error,
|
|
39
|
+
} = {}) {
|
|
40
|
+
// The launcher, or the Next.js server a killed launcher left serving.
|
|
41
|
+
const pid = record.stopPid ?? record.pid;
|
|
42
|
+
try {
|
|
43
|
+
// The launcher forwards SIGTERM to Next.js and exits after it. Windows has
|
|
44
|
+
// no SIGTERM: process.kill() would end the launcher alone and leave Next.js
|
|
45
|
+
// serving the port, so end the whole process tree there.
|
|
46
|
+
if (platform === "win32") killTree(pid);
|
|
47
|
+
else kill(pid, "SIGTERM");
|
|
48
|
+
} catch (killError) {
|
|
49
|
+
if (killError.code !== "ESRCH") {
|
|
50
|
+
error(`Could not stop pi-web (pid ${pid}): ${killError.message}`);
|
|
51
|
+
return 1;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
for (let waited = 0; isAlive(pid); waited += STOP_POLL_MS) {
|
|
55
|
+
if (waited >= timeoutMs) {
|
|
56
|
+
error(`pi-web on ${record.url} (pid ${pid}) is still running after ${timeoutMs / 1000} s.`);
|
|
57
|
+
return 1;
|
|
58
|
+
}
|
|
59
|
+
await wait(STOP_POLL_MS);
|
|
60
|
+
}
|
|
61
|
+
log(`Stopped pi-web on ${record.url} (pid ${pid}).`);
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function runCommand(options, {
|
|
66
|
+
runDir = records.getRunDir(),
|
|
67
|
+
pkgDir = path.join(__dirname, ".."),
|
|
68
|
+
open = openInBrowser,
|
|
69
|
+
isAnswering = records.isServerAnswering,
|
|
70
|
+
isOurs = records.isRecordProcess,
|
|
71
|
+
log = console.log,
|
|
72
|
+
error = console.error,
|
|
73
|
+
} = {}) {
|
|
74
|
+
const list = () => records.listRunRecords(runDir, { isAnswering, isOurs });
|
|
75
|
+
switch (options.command) {
|
|
76
|
+
case "version":
|
|
77
|
+
log(getPackageVersion(pkgDir));
|
|
78
|
+
return 0;
|
|
79
|
+
case "status": {
|
|
80
|
+
const running = await list();
|
|
81
|
+
log(running.length === 0
|
|
82
|
+
? "No pi-web server is running."
|
|
83
|
+
: `Running pi-web servers:\n${running.map(records.formatRunRecord).join("\n")}`);
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
case "stop":
|
|
87
|
+
case "open": {
|
|
88
|
+
const selected = records.selectRunRecord(await list(), options.port);
|
|
89
|
+
if (!selected.record) {
|
|
90
|
+
error(selected.error);
|
|
91
|
+
return 1;
|
|
92
|
+
}
|
|
93
|
+
if (options.command === "stop") {
|
|
94
|
+
const code = await stopServer(selected.record, { log, error });
|
|
95
|
+
if (code === 0) records.removeRunRecord(runDir, selected.record.pid);
|
|
96
|
+
return code;
|
|
97
|
+
}
|
|
98
|
+
log(`Opening ${selected.record.url}`);
|
|
99
|
+
open(selected.record.url);
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
case "update":
|
|
103
|
+
return runUpdate({
|
|
104
|
+
check: options.check,
|
|
105
|
+
currentVersion: getPackageVersion(pkgDir),
|
|
106
|
+
pkgDir,
|
|
107
|
+
listRecords: list,
|
|
108
|
+
formatRecord: records.formatRunRecord,
|
|
109
|
+
log,
|
|
110
|
+
error,
|
|
111
|
+
});
|
|
112
|
+
default:
|
|
113
|
+
error(`Unknown command: ${options.command}`);
|
|
114
|
+
return 1;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
module.exports = { getPackageVersion, runCommand, stopServer };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function getNextNodeArgs(nextBin, nextArgs, arch = process.arch) {
|
|
4
|
+
if (arch === "riscv64") {
|
|
5
|
+
return ["--no-wasm-lazy-compilation", nextBin, ...nextArgs];
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
return [nextBin, ...nextArgs];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
module.exports = { getNextNodeArgs };
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
4
|
+
const { parseArgs } = require("util");
|
|
5
|
+
|
|
6
|
+
const TRUE_VALUES = new Set(["1", "true", "yes", "on"]);
|
|
7
|
+
|
|
8
|
+
const CLI_OPTIONS = {
|
|
9
|
+
port: { type: "string", short: "p" },
|
|
10
|
+
hostname: { type: "string", short: "H" },
|
|
11
|
+
"no-open": { type: "boolean" },
|
|
12
|
+
help: { type: "boolean", short: "h" },
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function isEnabled(value) {
|
|
16
|
+
return typeof value === "string" && TRUE_VALUES.has(value.trim().toLowerCase());
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function normalizePort(value) {
|
|
20
|
+
if (typeof value !== "string" || !/^\d+$/.test(value)) {
|
|
21
|
+
throw new Error("Port must be a non-negative integer.");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const port = Number(value);
|
|
25
|
+
if (!Number.isSafeInteger(port) || port > 65535) {
|
|
26
|
+
throw new Error("Port must be between 0 and 65535.");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return String(port);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Subcommands and their own options. Matched only as the first argument, so a
|
|
33
|
+
// bare `pwc [options]` still starts the server.
|
|
34
|
+
const COMMAND_OPTIONS = {
|
|
35
|
+
version: {},
|
|
36
|
+
status: {},
|
|
37
|
+
stop: { port: { type: "string", short: "p" } },
|
|
38
|
+
open: { port: { type: "string", short: "p" } },
|
|
39
|
+
update: { check: { type: "boolean" } },
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
function getHelpText() {
|
|
43
|
+
return `Usage: pwc [command] [options]
|
|
44
|
+
|
|
45
|
+
Start the Pi Web UI server, or run one of the commands below.
|
|
46
|
+
|
|
47
|
+
Commands:
|
|
48
|
+
version Print the installed Pi Web version (also -v, --version)
|
|
49
|
+
status List running Pi Web servers
|
|
50
|
+
stop [--port <port>] Stop a running server
|
|
51
|
+
open [--port <port>] Open a running server in the browser
|
|
52
|
+
update [--check] Update a global npm install to the latest version
|
|
53
|
+
|
|
54
|
+
Options:
|
|
55
|
+
-p, --port <port> Server port (default: 30141, or PORT)
|
|
56
|
+
-H, --hostname <host> Bind hostname (default: 127.0.0.1, or PI_WEB_HOSTNAME)
|
|
57
|
+
--no-open Do not open a browser automatically
|
|
58
|
+
-h, --help Show this help message and exit
|
|
59
|
+
|
|
60
|
+
Environment:
|
|
61
|
+
PORT Default port when --port is omitted
|
|
62
|
+
PI_WEB_HOSTNAME Default hostname when --hostname is omitted
|
|
63
|
+
PI_WEB_NO_OPEN Set to 1/true/yes/on to disable browser open
|
|
64
|
+
PI_WEB_APP_NAME PWA manifest name (trimmed; default Pi Web)
|
|
65
|
+
PI_WEB_PASSWORD Enable browser password login and API Basic Auth
|
|
66
|
+
PI_WEB_ALLOWED_HOSTS Extra exact proxy/custom hostnames, comma-separated
|
|
67
|
+
PI_WEB_SKIP_VERSION_CHECK Set to 1 to disable Pi Web update checks
|
|
68
|
+
PI_WEB_IDLE_TIMEOUT_MS Session idle timeout in ms (0 disables; default 600000)
|
|
69
|
+
PI_WEB_SHUTDOWN_DEADLINE_MS Shutdown wait for extensions in ms (default 5000)
|
|
70
|
+
`;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function toParseError(error) {
|
|
74
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
75
|
+
const err = new Error(`${message}\nUse --help to see available options.`);
|
|
76
|
+
err.code = "ERR_PARSE_ARGS_UNKNOWN_OPTION";
|
|
77
|
+
return err;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Returns { command: "start", ...launch options } for a bare launch, or
|
|
81
|
+
// { command, help, port?, check? } for a subcommand.
|
|
82
|
+
function parseCommandLine(args = process.argv.slice(2), env = process.env) {
|
|
83
|
+
const first = args[0];
|
|
84
|
+
const command = first === "-v" || first === "--version" ? "version" : first;
|
|
85
|
+
if (!Object.hasOwn(COMMAND_OPTIONS, command)) {
|
|
86
|
+
return { command: "start", ...parseLaunchOptions(args, env) };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
let values;
|
|
90
|
+
try {
|
|
91
|
+
({ values } = parseArgs({
|
|
92
|
+
args: args.slice(1),
|
|
93
|
+
options: { ...COMMAND_OPTIONS[command], help: { type: "boolean", short: "h" } },
|
|
94
|
+
strict: true,
|
|
95
|
+
allowPositionals: false,
|
|
96
|
+
}));
|
|
97
|
+
} catch (error) {
|
|
98
|
+
throw toParseError(error);
|
|
99
|
+
}
|
|
100
|
+
if (values.help) return { command, help: true };
|
|
101
|
+
return {
|
|
102
|
+
command,
|
|
103
|
+
help: false,
|
|
104
|
+
port: values.port === undefined ? undefined : normalizePort(values.port),
|
|
105
|
+
check: values.check === true,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function parseLaunchOptions(args = process.argv.slice(2), env = process.env) {
|
|
110
|
+
let values;
|
|
111
|
+
let positionals;
|
|
112
|
+
try {
|
|
113
|
+
({ values, positionals } = parseArgs({
|
|
114
|
+
args,
|
|
115
|
+
options: CLI_OPTIONS,
|
|
116
|
+
strict: true,
|
|
117
|
+
allowPositionals: true,
|
|
118
|
+
}));
|
|
119
|
+
} catch (error) {
|
|
120
|
+
throw toParseError(error);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (values.help) {
|
|
124
|
+
return { help: true };
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (positionals.length > 0) {
|
|
128
|
+
throw new Error(
|
|
129
|
+
`Unexpected argument(s): ${positionals.join(" ")}\nUse --help to see available options.`,
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return {
|
|
134
|
+
help: false,
|
|
135
|
+
port: normalizePort(values.port ?? env.PORT ?? "30141"),
|
|
136
|
+
hostname: values.hostname ?? env.PI_WEB_HOSTNAME ?? "127.0.0.1",
|
|
137
|
+
openBrowser: !values["no-open"] && !isEnabled(env.PI_WEB_NO_OPEN),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
module.exports = { parseCommandLine, parseLaunchOptions, getHelpText };
|