@changliu007/pi-web 0.8.0
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 +33 -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 +114 -0
- package/.next/react-loadable-manifest.json +2270 -0
- package/.next/required-server-files.js +345 -0
- package/.next/required-server-files.json +345 -0
- package/.next/routes-manifest.json +261 -0
- package/.next/server/app/_global-error/page.js +32 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -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 +16 -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 +5 -0
- package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page.js +2 -0
- package/.next/server/app/_not-found/page.js.nft.json +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 +16 -0
- package/.next/server/app/_not-found.rsc +17 -0
- package/.next/server/app/_not-found.segments/_full.segment.rsc +17 -0
- package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
- package/.next/server/app/_not-found.segments/_index.segment.rsc +6 -0
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -0
- package/.next/server/app/api/agent/[id]/events/route.js +3 -0
- package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/[id]/events/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.js.nft.json +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.js.nft.json +1 -0
- package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/agent/running/events/route.js +3 -0
- package/.next/server/app/api/agent/running/events/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/running/events/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/auth/all-providers/route.js +1 -0
- package/.next/server/app/api/auth/all-providers/route.js.nft.json +1 -0
- package/.next/server/app/api/auth/all-providers/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.js.nft.json +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.js.nft.json +1 -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.js.nft.json +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.js.nft.json +1 -0
- package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/cwd/validate/route.js +3 -0
- package/.next/server/app/api/cwd/validate/route.js.nft.json +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 +3 -0
- package/.next/server/app/api/default-cwd/route.js.nft.json +1 -0
- package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/directories/list/route.js +3 -0
- package/.next/server/app/api/directories/list/route.js.nft.json +1 -0
- package/.next/server/app/api/directories/list/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/file-index/route.js +3 -0
- package/.next/server/app/api/file-index/route.js.nft.json +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 +51 -0
- package/.next/server/app/api/files/[...path]/route.js.nft.json +1 -0
- package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/home/route.js +1 -0
- package/.next/server/app/api/home/route.js.nft.json +1 -0
- package/.next/server/app/api/home/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/models/route.js +1 -0
- package/.next/server/app/api/models/route.js.nft.json +1 -0
- package/.next/server/app/api/models/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.js.nft.json +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.js.nft.json +1 -0
- package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/plugins/route.js +1 -0
- package/.next/server/app/api/plugins/route.js.nft.json +1 -0
- package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/context/route.js +3 -0
- package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/export/route.js +56 -0
- package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/export/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.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/route.js +1 -0
- package/.next/server/app/api/sessions/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/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.js.nft.json +1 -0
- package/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/skills/route.js +6 -0
- package/.next/server/app/api/skills/route.js.nft.json +1 -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.js.nft.json +1 -0
- package/.next/server/app/api/skills/search/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/route.js +3 -0
- package/.next/server/app/api/worktrees/route.js.nft.json +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/route.js.nft.json +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 +14 -0
- package/.next/server/app/index.rsc +16 -0
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -0
- package/.next/server/app/index.segments/_full.segment.rsc +16 -0
- package/.next/server/app/index.segments/_head.segment.rsc +6 -0
- package/.next/server/app/index.segments/_index.segment.rsc +6 -0
- package/.next/server/app/index.segments/_tree.segment.rsc +3 -0
- package/.next/server/app/page.js +76 -0
- package/.next/server/app/page.js.nft.json +1 -0
- package/.next/server/app/page_client-reference-manifest.js +1 -0
- package/.next/server/app-paths-manifest.json +33 -0
- package/.next/server/chunks/1030.js +1 -0
- package/.next/server/chunks/1048.js +1 -0
- package/.next/server/chunks/1198.js +5 -0
- package/.next/server/chunks/165.js +1 -0
- package/.next/server/chunks/1813.js +1 -0
- package/.next/server/chunks/2055.js +1 -0
- package/.next/server/chunks/2325.js +80 -0
- package/.next/server/chunks/2504.js +79 -0
- package/.next/server/chunks/258.js +1 -0
- package/.next/server/chunks/2778.js +1 -0
- package/.next/server/chunks/2943.js +1 -0
- package/.next/server/chunks/3000.js +4 -0
- package/.next/server/chunks/3052.js +1 -0
- package/.next/server/chunks/3054.js +148 -0
- package/.next/server/chunks/3181.js +1 -0
- package/.next/server/chunks/319.js +45 -0
- package/.next/server/chunks/3379.js +1 -0
- package/.next/server/chunks/3397.js +29 -0
- package/.next/server/chunks/358.js +19 -0
- package/.next/server/chunks/3672.js +1 -0
- package/.next/server/chunks/3818.js +1 -0
- package/.next/server/chunks/4120.js +148 -0
- package/.next/server/chunks/4266.js +1 -0
- package/.next/server/chunks/4365.js +43 -0
- package/.next/server/chunks/4407.js +23 -0
- package/.next/server/chunks/4616.js +1 -0
- package/.next/server/chunks/4741.js +18 -0
- package/.next/server/chunks/4768.js +80 -0
- package/.next/server/chunks/5409.js +1 -0
- package/.next/server/chunks/5414.js +1 -0
- package/.next/server/chunks/5460.js +255 -0
- package/.next/server/chunks/5737.js +24 -0
- package/.next/server/chunks/5773.js +104 -0
- package/.next/server/chunks/5985.js +24 -0
- package/.next/server/chunks/6073.js +64 -0
- package/.next/server/chunks/6346.js +1 -0
- package/.next/server/chunks/6900.js +90 -0
- package/.next/server/chunks/7058.js +166 -0
- package/.next/server/chunks/7162.js +287 -0
- package/.next/server/chunks/7287.js +141 -0
- package/.next/server/chunks/7307.js +1 -0
- package/.next/server/chunks/7601.js +3 -0
- package/.next/server/chunks/7702.js +93 -0
- package/.next/server/chunks/7960.js +1 -0
- package/.next/server/chunks/812.js +226 -0
- package/.next/server/chunks/8276.js +1 -0
- package/.next/server/chunks/8360.js +36 -0
- package/.next/server/chunks/8361.js +1 -0
- package/.next/server/chunks/8430.js +1 -0
- package/.next/server/chunks/8469.js +9 -0
- package/.next/server/chunks/8490.js +1 -0
- package/.next/server/chunks/8704.js +115 -0
- package/.next/server/chunks/9703.js +215 -0
- package/.next/server/chunks/9963.js +1 -0
- package/.next/server/functions-config-manifest.json +6 -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/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 +1 -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/chunks/122.eef9274869d2a305.js +287 -0
- package/.next/static/chunks/1407.28a7fb037c2b2f35.js +43 -0
- package/.next/static/chunks/164.ab76942aa0c3ec72.js +1 -0
- package/.next/static/chunks/1744.78ed01e4e93054c1.js +93 -0
- package/.next/static/chunks/1812.9d1e5ae0d68e6c24.js +76 -0
- package/.next/static/chunks/1921.2c58179657f0a6da.js +90 -0
- package/.next/static/chunks/1966.b8f83f7ba376c962.js +1 -0
- package/.next/static/chunks/1978.260c2b48f817965f.js +1 -0
- package/.next/static/chunks/2082.1535d602444ae4c1.js +1 -0
- package/.next/static/chunks/288.d969aeba2ab92928.js +1 -0
- package/.next/static/chunks/318.3fee3527eeabc956.js +4 -0
- package/.next/static/chunks/330.f851561e21edfbbb.js +19 -0
- package/.next/static/chunks/348d3b01.d472dd6bc52ab90c.js +148 -0
- package/.next/static/chunks/3762.d5c709991fc322ef.js +148 -0
- package/.next/static/chunks/3794-e569667691edc8f7.js +32 -0
- package/.next/static/chunks/3899.3f761f7e3a944e8c.js +1 -0
- package/.next/static/chunks/3916.0ba385e8bbb9cc14.js +1 -0
- package/.next/static/chunks/4021.cdd3c8f1def79a10.js +1 -0
- package/.next/static/chunks/4178.0212bbaaa6124460.js +115 -0
- package/.next/static/chunks/4389.18c637d4861a0624.js +215 -0
- package/.next/static/chunks/4784-3a415c7ce1a2a0c6.js +1 -0
- package/.next/static/chunks/4823.276e9524d3742f1c.js +141 -0
- package/.next/static/chunks/4829.cf1d50e43e6d9db5.js +1 -0
- package/.next/static/chunks/4bd1b696-e356ca5ba0218e27.js +1 -0
- package/.next/static/chunks/5019.b5a1a2b8daf17525.js +1 -0
- package/.next/static/chunks/5326.69460442bdcd6cd3.js +1 -0
- package/.next/static/chunks/5336.d3fa82872c826f30.js +79 -0
- package/.next/static/chunks/5590.ef62922166d308b4.js +1 -0
- package/.next/static/chunks/5627.62050808924cacee.js +23 -0
- package/.next/static/chunks/5690.9d6eb1edb1399995.js +1 -0
- package/.next/static/chunks/58bb9007.3ddd5d34c5f548be.js +80 -0
- package/.next/static/chunks/6071.e9deb627fefd3a20.js +104 -0
- package/.next/static/chunks/6600.583c88eef37aa524.js +1 -0
- package/.next/static/chunks/6710.5b0cfa12a8f68eb9.js +36 -0
- package/.next/static/chunks/744.e67714b764b7bed0.js +166 -0
- package/.next/static/chunks/7478.c2572eb272c8f7ac.js +80 -0
- package/.next/static/chunks/75.70c23d2729f4ae2c.js +9 -0
- package/.next/static/chunks/7563.d8fbeed6a250a962.js +64 -0
- package/.next/static/chunks/7704.a79a089b1c6a8099.js +5 -0
- package/.next/static/chunks/7874.8db6929b94cdf697.js +1 -0
- package/.next/static/chunks/7948.aca281219bad1ab4.js +1 -0
- package/.next/static/chunks/8538.9462238529bbdc80.js +226 -0
- package/.next/static/chunks/8568.f85d8b36fc9a9037.js +1 -0
- package/.next/static/chunks/8603.7619d9ceac35ae03.js +1 -0
- package/.next/static/chunks/8783.8586d8ca9ef1dce8.js +24 -0
- package/.next/static/chunks/8863.bd7e87f75e046db5.js +1 -0
- package/.next/static/chunks/8889.1ed3f1aa3ac49dd9.js +29 -0
- package/.next/static/chunks/895.a198d303969f1c01.js +24 -0
- package/.next/static/chunks/90542734.b75ad0df50bf68f5.js +1 -0
- package/.next/static/chunks/9242.a1894a4c754b979d.js +1 -0
- package/.next/static/chunks/9471.a7e240888c3a75bc.js +1 -0
- package/.next/static/chunks/9500.1488aec06ee78127.js +1 -0
- package/.next/static/chunks/9529.438891449b77abc7.js +1 -0
- package/.next/static/chunks/9633.155548b5fca6e580.js +1 -0
- package/.next/static/chunks/9779.673004a62d70e36a.js +1 -0
- package/.next/static/chunks/app/_global-error/page-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/_not-found/page-4129fc0773eb2a79.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/agent/running/events/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/auth/all-providers/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/auth/login/[provider]/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/auth/providers/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/cwd/validate/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/default-cwd/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/directories/list/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/file-index/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/files/[...path]/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/home/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/models/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/models-config/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/models-config/test/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/plugins/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/context/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/export/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/skills/install/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/skills/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/skills/search/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/app/layout-e01bf47927e03418.js +1 -0
- package/.next/static/chunks/app/page-dacc908aa65c55c1.js +75 -0
- package/.next/static/chunks/c9a5f755.309e1bea31640a4c.js +119 -0
- package/.next/static/chunks/d3ac728e-7964f816a1ca64e5.js +1 -0
- package/.next/static/chunks/f2098590.3d4ddddc296bb3a1.js +62 -0
- package/.next/static/chunks/framework-711ef29bc66f648c.js +1 -0
- package/.next/static/chunks/main-app-c591a2fe7a2f48a1.js +1 -0
- package/.next/static/chunks/main-fd40701e10f417d9.js +5 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-82c1d2ddfc0ee2bf.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-6c6d0771675e402f.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-00559159379c45d2.js +1 -0
- package/.next/static/css/88714c00e109ce28.css +1 -0
- package/.next/static/css/b5f3d619b27f5372.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/static/wlKjHohxndI39oHSsHTlI/_buildManifest.js +1 -0
- package/.next/static/wlKjHohxndI39oHSsHTlI/_ssgManifest.js +1 -0
- package/.next/trace +73 -0
- package/.next/trace-build +1 -0
- package/.next/types/app/api/agent/[id]/events/route.ts +351 -0
- package/.next/types/app/api/agent/[id]/route.ts +351 -0
- package/.next/types/app/api/agent/new/route.ts +351 -0
- package/.next/types/app/api/agent/running/events/route.ts +351 -0
- package/.next/types/app/api/auth/all-providers/route.ts +351 -0
- package/.next/types/app/api/auth/api-key/[provider]/route.ts +351 -0
- package/.next/types/app/api/auth/login/[provider]/route.ts +351 -0
- package/.next/types/app/api/auth/logout/[provider]/route.ts +351 -0
- package/.next/types/app/api/auth/providers/route.ts +351 -0
- package/.next/types/app/api/cwd/validate/route.ts +351 -0
- package/.next/types/app/api/default-cwd/route.ts +351 -0
- package/.next/types/app/api/directories/list/route.ts +351 -0
- package/.next/types/app/api/file-index/route.ts +351 -0
- package/.next/types/app/api/files/[...path]/route.ts +351 -0
- package/.next/types/app/api/home/route.ts +351 -0
- package/.next/types/app/api/models/route.ts +351 -0
- package/.next/types/app/api/models-config/route.ts +351 -0
- package/.next/types/app/api/models-config/test/route.ts +351 -0
- package/.next/types/app/api/plugins/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/context/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/export/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/route.ts +351 -0
- package/.next/types/app/api/sessions/route.ts +351 -0
- package/.next/types/app/api/skills/install/route.ts +351 -0
- package/.next/types/app/api/skills/route.ts +351 -0
- package/.next/types/app/api/skills/search/route.ts +351 -0
- package/.next/types/app/api/worktrees/route.ts +351 -0
- package/.next/types/app/layout.ts +87 -0
- package/.next/types/app/page.ts +87 -0
- package/.next/types/cache-life.d.ts +145 -0
- package/.next/types/package.json +1 -0
- package/.next/types/routes.d.ts +99 -0
- package/.next/types/validator.ts +313 -0
- package/LICENSE +21 -0
- package/README.md +116 -0
- package/README.zh-CN.md +112 -0
- package/bin/pi-web.js +83 -0
- package/next.config.ts +31 -0
- package/package.json +64 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// This file is generated automatically by Next.js
|
|
2
|
+
// Do not edit this file manually
|
|
3
|
+
|
|
4
|
+
type AppRoutes = "/"
|
|
5
|
+
type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/events" | "/api/agent/new" | "/api/agent/running/events" | "/api/auth/all-providers" | "/api/auth/api-key/[provider]" | "/api/auth/login/[provider]" | "/api/auth/logout/[provider]" | "/api/auth/providers" | "/api/cwd/validate" | "/api/default-cwd" | "/api/directories/list" | "/api/file-index" | "/api/files/[...path]" | "/api/home" | "/api/models" | "/api/models-config" | "/api/models-config/test" | "/api/plugins" | "/api/sessions" | "/api/sessions/[id]" | "/api/sessions/[id]/context" | "/api/sessions/[id]/export" | "/api/skills" | "/api/skills/install" | "/api/skills/search" | "/api/worktrees"
|
|
6
|
+
type PageRoutes = never
|
|
7
|
+
type LayoutRoutes = "/"
|
|
8
|
+
type RedirectRoutes = never
|
|
9
|
+
type RewriteRoutes = never
|
|
10
|
+
type Routes = AppRoutes | PageRoutes | LayoutRoutes | RedirectRoutes | RewriteRoutes | AppRouteHandlerRoutes
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
interface ParamMap {
|
|
14
|
+
"/": {}
|
|
15
|
+
"/api/agent/[id]": { "id": string; }
|
|
16
|
+
"/api/agent/[id]/events": { "id": string; }
|
|
17
|
+
"/api/agent/new": {}
|
|
18
|
+
"/api/agent/running/events": {}
|
|
19
|
+
"/api/auth/all-providers": {}
|
|
20
|
+
"/api/auth/api-key/[provider]": { "provider": string; }
|
|
21
|
+
"/api/auth/login/[provider]": { "provider": string; }
|
|
22
|
+
"/api/auth/logout/[provider]": { "provider": string; }
|
|
23
|
+
"/api/auth/providers": {}
|
|
24
|
+
"/api/cwd/validate": {}
|
|
25
|
+
"/api/default-cwd": {}
|
|
26
|
+
"/api/directories/list": {}
|
|
27
|
+
"/api/file-index": {}
|
|
28
|
+
"/api/files/[...path]": { "path": string[]; }
|
|
29
|
+
"/api/home": {}
|
|
30
|
+
"/api/models": {}
|
|
31
|
+
"/api/models-config": {}
|
|
32
|
+
"/api/models-config/test": {}
|
|
33
|
+
"/api/plugins": {}
|
|
34
|
+
"/api/sessions": {}
|
|
35
|
+
"/api/sessions/[id]": { "id": string; }
|
|
36
|
+
"/api/sessions/[id]/context": { "id": string; }
|
|
37
|
+
"/api/sessions/[id]/export": { "id": string; }
|
|
38
|
+
"/api/skills": {}
|
|
39
|
+
"/api/skills/install": {}
|
|
40
|
+
"/api/skills/search": {}
|
|
41
|
+
"/api/worktrees": {}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
export type ParamsOf<Route extends Routes> = ParamMap[Route]
|
|
46
|
+
|
|
47
|
+
interface LayoutSlotMap {
|
|
48
|
+
"/": never
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
export type { AppRoutes, PageRoutes, LayoutRoutes, RedirectRoutes, RewriteRoutes, ParamMap, AppRouteHandlerRoutes }
|
|
53
|
+
|
|
54
|
+
declare global {
|
|
55
|
+
/**
|
|
56
|
+
* Props for Next.js App Router page components
|
|
57
|
+
* @example
|
|
58
|
+
* ```tsx
|
|
59
|
+
* export default function Page(props: PageProps<'/blog/[slug]'>) {
|
|
60
|
+
* const { slug } = await props.params
|
|
61
|
+
* return <div>Blog post: {slug}</div>
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
interface PageProps<AppRoute extends AppRoutes> {
|
|
66
|
+
params: Promise<ParamMap[AppRoute]>
|
|
67
|
+
searchParams: Promise<Record<string, string | string[] | undefined>>
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Props for Next.js App Router layout components
|
|
72
|
+
* @example
|
|
73
|
+
* ```tsx
|
|
74
|
+
* export default function Layout(props: LayoutProps<'/dashboard'>) {
|
|
75
|
+
* return <div>{props.children}</div>
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
type LayoutProps<LayoutRoute extends LayoutRoutes> = {
|
|
80
|
+
params: Promise<ParamMap[LayoutRoute]>
|
|
81
|
+
children: React.ReactNode
|
|
82
|
+
} & {
|
|
83
|
+
[K in LayoutSlotMap[LayoutRoute]]: React.ReactNode
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Context for Next.js App Router route handlers
|
|
88
|
+
* @example
|
|
89
|
+
* ```tsx
|
|
90
|
+
* export async function GET(request: NextRequest, context: RouteContext<'/api/users/[id]'>) {
|
|
91
|
+
* const { id } = await context.params
|
|
92
|
+
* return Response.json({ id })
|
|
93
|
+
* }
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
interface RouteContext<AppRouteHandlerRoute extends AppRouteHandlerRoutes> {
|
|
97
|
+
params: Promise<ParamMap[AppRouteHandlerRoute]>
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
// This file is generated automatically by Next.js
|
|
2
|
+
// Do not edit this file manually
|
|
3
|
+
// This file validates that all pages and layouts export the correct types
|
|
4
|
+
|
|
5
|
+
import type { AppRoutes, LayoutRoutes, ParamMap, AppRouteHandlerRoutes } from "./routes.js"
|
|
6
|
+
import type { ResolvingMetadata, ResolvingViewport } from "next/types.js"
|
|
7
|
+
import type { NextRequest } from 'next/server.js'
|
|
8
|
+
|
|
9
|
+
type AppPageConfig<Route extends AppRoutes = AppRoutes> = {
|
|
10
|
+
default: React.ComponentType<{ params: Promise<ParamMap[Route]> } & any> | ((props: { params: Promise<ParamMap[Route]> } & any) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
|
|
11
|
+
generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
|
|
12
|
+
generateMetadata?: (
|
|
13
|
+
props: { params: Promise<ParamMap[Route]> } & any,
|
|
14
|
+
parent: ResolvingMetadata
|
|
15
|
+
) => Promise<any> | any
|
|
16
|
+
generateViewport?: (
|
|
17
|
+
props: { params: Promise<ParamMap[Route]> } & any,
|
|
18
|
+
parent: ResolvingViewport
|
|
19
|
+
) => Promise<any> | any
|
|
20
|
+
metadata?: any
|
|
21
|
+
viewport?: any
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
type LayoutConfig<Route extends LayoutRoutes = LayoutRoutes> = {
|
|
25
|
+
default: React.ComponentType<LayoutProps<Route>> | ((props: LayoutProps<Route>) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
|
|
26
|
+
generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
|
|
27
|
+
generateMetadata?: (
|
|
28
|
+
props: { params: Promise<ParamMap[Route]> } & any,
|
|
29
|
+
parent: ResolvingMetadata
|
|
30
|
+
) => Promise<any> | any
|
|
31
|
+
generateViewport?: (
|
|
32
|
+
props: { params: Promise<ParamMap[Route]> } & any,
|
|
33
|
+
parent: ResolvingViewport
|
|
34
|
+
) => Promise<any> | any
|
|
35
|
+
metadata?: any
|
|
36
|
+
viewport?: any
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRoutes> = {
|
|
40
|
+
GET?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
41
|
+
POST?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
42
|
+
PUT?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
43
|
+
PATCH?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
44
|
+
DELETE?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
45
|
+
HEAD?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
46
|
+
OPTIONS?: (request: NextRequest, context: { params: Promise<ParamMap[Route]> }) => Promise<Response | void> | Response | void
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
// Validate ../../app/page.tsx
|
|
51
|
+
{
|
|
52
|
+
type __IsExpected<Specific extends AppPageConfig<"/">> = Specific
|
|
53
|
+
const handler = {} as typeof import("../../app/page.js")
|
|
54
|
+
type __Check = __IsExpected<typeof handler>
|
|
55
|
+
// @ts-ignore
|
|
56
|
+
type __Unused = __Check
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Validate ../../app/api/agent/[id]/events/route.ts
|
|
60
|
+
{
|
|
61
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/agent/[id]/events">> = Specific
|
|
62
|
+
const handler = {} as typeof import("../../app/api/agent/[id]/events/route.js")
|
|
63
|
+
type __Check = __IsExpected<typeof handler>
|
|
64
|
+
// @ts-ignore
|
|
65
|
+
type __Unused = __Check
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Validate ../../app/api/agent/[id]/route.ts
|
|
69
|
+
{
|
|
70
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/agent/[id]">> = Specific
|
|
71
|
+
const handler = {} as typeof import("../../app/api/agent/[id]/route.js")
|
|
72
|
+
type __Check = __IsExpected<typeof handler>
|
|
73
|
+
// @ts-ignore
|
|
74
|
+
type __Unused = __Check
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Validate ../../app/api/agent/new/route.ts
|
|
78
|
+
{
|
|
79
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/agent/new">> = Specific
|
|
80
|
+
const handler = {} as typeof import("../../app/api/agent/new/route.js")
|
|
81
|
+
type __Check = __IsExpected<typeof handler>
|
|
82
|
+
// @ts-ignore
|
|
83
|
+
type __Unused = __Check
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Validate ../../app/api/agent/running/events/route.ts
|
|
87
|
+
{
|
|
88
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/agent/running/events">> = Specific
|
|
89
|
+
const handler = {} as typeof import("../../app/api/agent/running/events/route.js")
|
|
90
|
+
type __Check = __IsExpected<typeof handler>
|
|
91
|
+
// @ts-ignore
|
|
92
|
+
type __Unused = __Check
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Validate ../../app/api/auth/all-providers/route.ts
|
|
96
|
+
{
|
|
97
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/auth/all-providers">> = Specific
|
|
98
|
+
const handler = {} as typeof import("../../app/api/auth/all-providers/route.js")
|
|
99
|
+
type __Check = __IsExpected<typeof handler>
|
|
100
|
+
// @ts-ignore
|
|
101
|
+
type __Unused = __Check
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Validate ../../app/api/auth/api-key/[provider]/route.ts
|
|
105
|
+
{
|
|
106
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/auth/api-key/[provider]">> = Specific
|
|
107
|
+
const handler = {} as typeof import("../../app/api/auth/api-key/[provider]/route.js")
|
|
108
|
+
type __Check = __IsExpected<typeof handler>
|
|
109
|
+
// @ts-ignore
|
|
110
|
+
type __Unused = __Check
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Validate ../../app/api/auth/login/[provider]/route.ts
|
|
114
|
+
{
|
|
115
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/auth/login/[provider]">> = Specific
|
|
116
|
+
const handler = {} as typeof import("../../app/api/auth/login/[provider]/route.js")
|
|
117
|
+
type __Check = __IsExpected<typeof handler>
|
|
118
|
+
// @ts-ignore
|
|
119
|
+
type __Unused = __Check
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Validate ../../app/api/auth/logout/[provider]/route.ts
|
|
123
|
+
{
|
|
124
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/auth/logout/[provider]">> = Specific
|
|
125
|
+
const handler = {} as typeof import("../../app/api/auth/logout/[provider]/route.js")
|
|
126
|
+
type __Check = __IsExpected<typeof handler>
|
|
127
|
+
// @ts-ignore
|
|
128
|
+
type __Unused = __Check
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Validate ../../app/api/auth/providers/route.ts
|
|
132
|
+
{
|
|
133
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/auth/providers">> = Specific
|
|
134
|
+
const handler = {} as typeof import("../../app/api/auth/providers/route.js")
|
|
135
|
+
type __Check = __IsExpected<typeof handler>
|
|
136
|
+
// @ts-ignore
|
|
137
|
+
type __Unused = __Check
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Validate ../../app/api/cwd/validate/route.ts
|
|
141
|
+
{
|
|
142
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/cwd/validate">> = Specific
|
|
143
|
+
const handler = {} as typeof import("../../app/api/cwd/validate/route.js")
|
|
144
|
+
type __Check = __IsExpected<typeof handler>
|
|
145
|
+
// @ts-ignore
|
|
146
|
+
type __Unused = __Check
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Validate ../../app/api/default-cwd/route.ts
|
|
150
|
+
{
|
|
151
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/default-cwd">> = Specific
|
|
152
|
+
const handler = {} as typeof import("../../app/api/default-cwd/route.js")
|
|
153
|
+
type __Check = __IsExpected<typeof handler>
|
|
154
|
+
// @ts-ignore
|
|
155
|
+
type __Unused = __Check
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Validate ../../app/api/directories/list/route.ts
|
|
159
|
+
{
|
|
160
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/directories/list">> = Specific
|
|
161
|
+
const handler = {} as typeof import("../../app/api/directories/list/route.js")
|
|
162
|
+
type __Check = __IsExpected<typeof handler>
|
|
163
|
+
// @ts-ignore
|
|
164
|
+
type __Unused = __Check
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Validate ../../app/api/file-index/route.ts
|
|
168
|
+
{
|
|
169
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/file-index">> = Specific
|
|
170
|
+
const handler = {} as typeof import("../../app/api/file-index/route.js")
|
|
171
|
+
type __Check = __IsExpected<typeof handler>
|
|
172
|
+
// @ts-ignore
|
|
173
|
+
type __Unused = __Check
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Validate ../../app/api/files/[...path]/route.ts
|
|
177
|
+
{
|
|
178
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/files/[...path]">> = Specific
|
|
179
|
+
const handler = {} as typeof import("../../app/api/files/[...path]/route.js")
|
|
180
|
+
type __Check = __IsExpected<typeof handler>
|
|
181
|
+
// @ts-ignore
|
|
182
|
+
type __Unused = __Check
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Validate ../../app/api/home/route.ts
|
|
186
|
+
{
|
|
187
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/home">> = Specific
|
|
188
|
+
const handler = {} as typeof import("../../app/api/home/route.js")
|
|
189
|
+
type __Check = __IsExpected<typeof handler>
|
|
190
|
+
// @ts-ignore
|
|
191
|
+
type __Unused = __Check
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Validate ../../app/api/models-config/route.ts
|
|
195
|
+
{
|
|
196
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/models-config">> = Specific
|
|
197
|
+
const handler = {} as typeof import("../../app/api/models-config/route.js")
|
|
198
|
+
type __Check = __IsExpected<typeof handler>
|
|
199
|
+
// @ts-ignore
|
|
200
|
+
type __Unused = __Check
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Validate ../../app/api/models-config/test/route.ts
|
|
204
|
+
{
|
|
205
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/models-config/test">> = Specific
|
|
206
|
+
const handler = {} as typeof import("../../app/api/models-config/test/route.js")
|
|
207
|
+
type __Check = __IsExpected<typeof handler>
|
|
208
|
+
// @ts-ignore
|
|
209
|
+
type __Unused = __Check
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Validate ../../app/api/models/route.ts
|
|
213
|
+
{
|
|
214
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/models">> = Specific
|
|
215
|
+
const handler = {} as typeof import("../../app/api/models/route.js")
|
|
216
|
+
type __Check = __IsExpected<typeof handler>
|
|
217
|
+
// @ts-ignore
|
|
218
|
+
type __Unused = __Check
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Validate ../../app/api/plugins/route.ts
|
|
222
|
+
{
|
|
223
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/plugins">> = Specific
|
|
224
|
+
const handler = {} as typeof import("../../app/api/plugins/route.js")
|
|
225
|
+
type __Check = __IsExpected<typeof handler>
|
|
226
|
+
// @ts-ignore
|
|
227
|
+
type __Unused = __Check
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Validate ../../app/api/sessions/[id]/context/route.ts
|
|
231
|
+
{
|
|
232
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/sessions/[id]/context">> = Specific
|
|
233
|
+
const handler = {} as typeof import("../../app/api/sessions/[id]/context/route.js")
|
|
234
|
+
type __Check = __IsExpected<typeof handler>
|
|
235
|
+
// @ts-ignore
|
|
236
|
+
type __Unused = __Check
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Validate ../../app/api/sessions/[id]/export/route.ts
|
|
240
|
+
{
|
|
241
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/sessions/[id]/export">> = Specific
|
|
242
|
+
const handler = {} as typeof import("../../app/api/sessions/[id]/export/route.js")
|
|
243
|
+
type __Check = __IsExpected<typeof handler>
|
|
244
|
+
// @ts-ignore
|
|
245
|
+
type __Unused = __Check
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Validate ../../app/api/sessions/[id]/route.ts
|
|
249
|
+
{
|
|
250
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/sessions/[id]">> = Specific
|
|
251
|
+
const handler = {} as typeof import("../../app/api/sessions/[id]/route.js")
|
|
252
|
+
type __Check = __IsExpected<typeof handler>
|
|
253
|
+
// @ts-ignore
|
|
254
|
+
type __Unused = __Check
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Validate ../../app/api/sessions/route.ts
|
|
258
|
+
{
|
|
259
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/sessions">> = Specific
|
|
260
|
+
const handler = {} as typeof import("../../app/api/sessions/route.js")
|
|
261
|
+
type __Check = __IsExpected<typeof handler>
|
|
262
|
+
// @ts-ignore
|
|
263
|
+
type __Unused = __Check
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Validate ../../app/api/skills/install/route.ts
|
|
267
|
+
{
|
|
268
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/skills/install">> = Specific
|
|
269
|
+
const handler = {} as typeof import("../../app/api/skills/install/route.js")
|
|
270
|
+
type __Check = __IsExpected<typeof handler>
|
|
271
|
+
// @ts-ignore
|
|
272
|
+
type __Unused = __Check
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Validate ../../app/api/skills/route.ts
|
|
276
|
+
{
|
|
277
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/skills">> = Specific
|
|
278
|
+
const handler = {} as typeof import("../../app/api/skills/route.js")
|
|
279
|
+
type __Check = __IsExpected<typeof handler>
|
|
280
|
+
// @ts-ignore
|
|
281
|
+
type __Unused = __Check
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Validate ../../app/api/skills/search/route.ts
|
|
285
|
+
{
|
|
286
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/skills/search">> = Specific
|
|
287
|
+
const handler = {} as typeof import("../../app/api/skills/search/route.js")
|
|
288
|
+
type __Check = __IsExpected<typeof handler>
|
|
289
|
+
// @ts-ignore
|
|
290
|
+
type __Unused = __Check
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Validate ../../app/api/worktrees/route.ts
|
|
294
|
+
{
|
|
295
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/worktrees">> = Specific
|
|
296
|
+
const handler = {} as typeof import("../../app/api/worktrees/route.js")
|
|
297
|
+
type __Check = __IsExpected<typeof handler>
|
|
298
|
+
// @ts-ignore
|
|
299
|
+
type __Unused = __Check
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
// Validate ../../app/layout.tsx
|
|
307
|
+
{
|
|
308
|
+
type __IsExpected<Specific extends LayoutConfig<"/">> = Specific
|
|
309
|
+
const handler = {} as typeof import("../../app/layout.js")
|
|
310
|
+
type __Check = __IsExpected<typeof handler>
|
|
311
|
+
// @ts-ignore
|
|
312
|
+
type __Unused = __Check
|
|
313
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 agegr
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# pi-web
|
|
2
|
+
|
|
3
|
+
[中文文档](./README.zh-CN.md)
|
|
4
|
+
|
|
5
|
+
> **This is a modified fork of [agegr/pi-web](https://github.com/agegr/pi-web)**, distributed under the same MIT license. Original copyright (c) 2026 agegr is retained in the [LICENSE](./LICENSE).
|
|
6
|
+
|
|
7
|
+
Local web UI for the [pi coding agent](https://github.com/badlogic/pi-mono). pi-web reads your local pi session files and gives you a browser workspace for session browsing, real-time chat, model configuration, skill management, and project file preview.
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
The same pi session in CLI and pi-web: structured tool calls, readable Markdown, session browsing, and cleaner results.
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
**Run without installing:**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx @changliu007/pi-web@latest
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Or install globally:**
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install -g @changliu007/pi-web
|
|
25
|
+
pi-web
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Then open [http://localhost:30141](http://localhost:30141). The CLI will try to open the browser automatically after the server is ready.
|
|
29
|
+
|
|
30
|
+
**Options:**
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pi-web --port 8080 # custom port
|
|
34
|
+
pi-web --hostname 127.0.0.1 # local access only
|
|
35
|
+
pi-web -p 8080 -H 127.0.0.1 # combine options
|
|
36
|
+
|
|
37
|
+
PORT=8080 pi-web # environment variable is also supported
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Features
|
|
41
|
+
|
|
42
|
+
- **Pick work back up**: browse previous pi conversations by project without digging through terminal history or session paths.
|
|
43
|
+
- **Try different directions safely**: continue from an earlier message or fork a session into a separate route.
|
|
44
|
+
- **Work across branches**: switch Git worktrees from the sidebar so new sessions and the Explorer follow the checkout you choose.
|
|
45
|
+
- **Chat beside the project**: browse files on the left and preview source, docs, images, audio, and PDFs on the right while the agent works.
|
|
46
|
+
- **See session state clearly**: context usage, cost, compaction state, and system prompt details are visible from the top bar.
|
|
47
|
+
- **Configure less from the terminal**: manage models, login/API keys, model tests, and skill switches from the web UI.
|
|
48
|
+
|
|
49
|
+
## Notes
|
|
50
|
+
|
|
51
|
+
- **Data directory**: pi-web reads `~/.pi/agent/sessions` by default. Set `PI_CODING_AGENT_DIR` to point at another pi agent directory.
|
|
52
|
+
- **Session files**: files are stored as `~/.pi/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`.
|
|
53
|
+
- **Model config**: the Models panel reads and writes `models.json` in the pi agent directory. Model lists and defaults come from pi's config.
|
|
54
|
+
- **File access**: file browsing and preview are scoped to the selected project directory and working directories that appear in sessions.
|
|
55
|
+
- **Git worktrees**: see [Worktrees in pi-web](./docs/worktrees.md) for when the switcher appears, how new worktrees are created, and what removal does.
|
|
56
|
+
- **Forks vs in-session branches**: Fork creates a new `.jsonl` file. "Edit from here" creates another branch inside the same session file.
|
|
57
|
+
|
|
58
|
+
## Development
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npm install
|
|
62
|
+
npm run dev
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The local dev server runs at [http://localhost:30141](http://localhost:30141).
|
|
66
|
+
|
|
67
|
+
Common checks:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
node_modules/.bin/tsc --noEmit
|
|
71
|
+
npm run lint
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Avoid running `next build` / `npm run build` during local development. It writes to `.next/` and can interfere with the dev server; leave builds for release work.
|
|
75
|
+
|
|
76
|
+
## Project Structure
|
|
77
|
+
|
|
78
|
+
```text
|
|
79
|
+
app/
|
|
80
|
+
api/
|
|
81
|
+
agent/ # creates/drives AgentSession and exposes SSE events
|
|
82
|
+
auth/ # OAuth and API key management
|
|
83
|
+
cwd/validate/ # custom working directory validation
|
|
84
|
+
default-cwd/ # pi default working directory lookup
|
|
85
|
+
files/ # file listing, reading, preview, and watching
|
|
86
|
+
home/ # current user home directory
|
|
87
|
+
models/ # available models, default model, thinking levels
|
|
88
|
+
models-config/ # read/write models.json and test models
|
|
89
|
+
sessions/ # session reads, rename, delete, context, HTML export
|
|
90
|
+
skills/ # skill listing, search, install, enable/disable
|
|
91
|
+
components/
|
|
92
|
+
AppShell.tsx # main layout, URL state, top panels, file tabs
|
|
93
|
+
SessionSidebar.tsx # project selector, session tree, Explorer
|
|
94
|
+
ChatWindow.tsx # messages, SSE, image drag/drop, minimap
|
|
95
|
+
ChatInput.tsx # input bar, model/tools/thinking/compact/slash controls
|
|
96
|
+
MessageView.tsx # message, thinking, tool call/result rendering
|
|
97
|
+
ModelsConfig.tsx # model and auth configuration panel
|
|
98
|
+
SkillsConfig.tsx # skill management panel
|
|
99
|
+
FileExplorer.tsx # file tree
|
|
100
|
+
FileViewer.tsx # source, diff, image, audio, PDF, DOCX preview
|
|
101
|
+
lib/
|
|
102
|
+
rpc-manager.ts # AgentSessionWrapper lifecycle and global registry
|
|
103
|
+
session-reader.ts # parses .jsonl session files and branch contexts
|
|
104
|
+
normalize.ts # normalizes toolCall field names
|
|
105
|
+
file-access.ts # file read safety boundary
|
|
106
|
+
file-paths.ts # path encoding and relative path helpers
|
|
107
|
+
markdown.ts # Markdown/Mermaid/KaTeX plugin configuration
|
|
108
|
+
pi-types.ts # pi-related types
|
|
109
|
+
hooks/
|
|
110
|
+
useAgentSession.ts # session loading, command sending, SSE state machine
|
|
111
|
+
useAudio.ts # completion sound
|
|
112
|
+
useDragDrop.ts # image drag/drop
|
|
113
|
+
useTheme.ts # theme switching
|
|
114
|
+
bin/
|
|
115
|
+
pi-web.js # npm CLI entrypoint
|
|
116
|
+
```
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# pi-web
|
|
2
|
+
|
|
3
|
+
[English](./README.md)
|
|
4
|
+
|
|
5
|
+
> **本项目是 [agegr/pi-web](https://github.com/agegr/pi-web) 的修改分支**,沿用同一 MIT 协议;原作者版权声明 (c) 2026 agegr 保留在 [LICENSE](./LICENSE) 中。
|
|
6
|
+
|
|
7
|
+
[pi 编程智能体](https://github.com/badlogic/pi-mono) 的本地网页界面。它会读取本机的 pi 会话文件,在浏览器里提供会话管理、实时对话、模型配置、技能管理和项目文件预览。
|
|
8
|
+
|
|
9
|
+
## 快速开始
|
|
10
|
+
|
|
11
|
+
**无需安装,直接运行:**
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @changliu007/pi-web@latest
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**或全局安装后使用:**
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g @changliu007/pi-web
|
|
21
|
+
pi-web
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
启动后打开 [http://localhost:30141](http://localhost:30141)。命令行版本会在服务就绪后尝试自动打开浏览器。
|
|
25
|
+
|
|
26
|
+
**可选参数:**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pi-web --port 8080 # 自定义端口
|
|
30
|
+
pi-web --hostname 127.0.0.1 # 仅本机访问
|
|
31
|
+
pi-web -p 8080 -H 127.0.0.1 # 组合使用
|
|
32
|
+
|
|
33
|
+
PORT=8080 pi-web # 也支持环境变量
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 功能介绍
|
|
37
|
+
|
|
38
|
+
- **把历史工作接回来**:打开网页就能按项目找到以前的 pi 对话,不必在终端里翻文件或记住会话路径。
|
|
39
|
+
- **放心试不同方向**:可以从某条历史消息重新开始,也可以复制出一条独立的新路线,探索方案时不怕弄乱原来的对话。
|
|
40
|
+
- **跨分支工作**:在侧边栏切换 Git worktree,让新会话和 Explorer 跟随你选择的 checkout。
|
|
41
|
+
- **边聊边看项目文件**:左侧浏览项目文件,右侧打开源码、文档、图片、音频和 PDF;文件变化会自动刷新,适合边让 agent 改边检查结果。
|
|
42
|
+
- **随时掌握会话状态**:在顶部就能看到上下文占用、花费、压缩结果和系统提示,长会话不再像黑箱。
|
|
43
|
+
- **少离开当前界面**:模型、登录/API key、模型测试和技能开关都能在网页里处理,配置 agent 时不用在多个工具之间来回切换。
|
|
44
|
+
|
|
45
|
+
## 注意事项
|
|
46
|
+
|
|
47
|
+
- **数据目录**:默认读取 `~/.pi/agent/sessions` 下的会话文件。可通过环境变量 `PI_CODING_AGENT_DIR` 指定其他 pi agent 目录。
|
|
48
|
+
- **会话文件**:路径形如 `~/.pi/agent/sessions/<编码后的工作目录>/<时间戳>_<uuid>.jsonl`。
|
|
49
|
+
- **模型配置**:Models 面板读写 pi agent 目录下的 `models.json`,模型列表和默认模型由 pi 的配置解析得到。
|
|
50
|
+
- **文件访问**:文件浏览和预览面向当前选择的项目目录,以及会话中已出现过的工作目录。
|
|
51
|
+
- **Git worktree**:什么时候显示切换器、新建目录在哪里、删除会影响什么,见 [pi-web 里的 Worktree](./docs/worktrees.zh-CN.md)。
|
|
52
|
+
- **Fork 与会话内分支不同**:Fork 会创建新的 `.jsonl` 文件;“Edit from here” 是同一会话文件里的分支。
|
|
53
|
+
|
|
54
|
+
## 开发
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npm install
|
|
58
|
+
npm run dev
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
本地开发端口为 [http://localhost:30141](http://localhost:30141)。
|
|
62
|
+
|
|
63
|
+
常用检查:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
node_modules/.bin/tsc --noEmit
|
|
67
|
+
npm run lint
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
开发时不要运行 `next build` / `npm run build`,它会写入 `.next/`,容易影响正在运行的 dev server。发布流程再执行构建。
|
|
71
|
+
|
|
72
|
+
## 项目结构
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
app/
|
|
76
|
+
api/
|
|
77
|
+
agent/ # 创建/驱动 AgentSession,提供 SSE 事件流
|
|
78
|
+
auth/ # OAuth 和 API key 管理
|
|
79
|
+
cwd/validate/ # 自定义工作目录校验
|
|
80
|
+
default-cwd/ # 获取 pi 默认工作目录
|
|
81
|
+
files/ # 文件列表、读取、预览、watch
|
|
82
|
+
home/ # 当前用户 home 目录
|
|
83
|
+
models/ # 可用模型、默认模型、thinking levels
|
|
84
|
+
models-config/ # 读写 models.json、测试模型
|
|
85
|
+
sessions/ # 会话读取、重命名、删除、上下文、HTML 导出
|
|
86
|
+
skills/ # skills 列表、搜索、安装、启停
|
|
87
|
+
components/
|
|
88
|
+
AppShell.tsx # 主布局、URL 状态、顶部面板、文件标签
|
|
89
|
+
SessionSidebar.tsx # 项目选择、会话树、Explorer
|
|
90
|
+
ChatWindow.tsx # 消息区、SSE、拖拽图片、minimap
|
|
91
|
+
ChatInput.tsx # 输入栏、模型/工具/thinking/compact/slash controls
|
|
92
|
+
MessageView.tsx # 消息、thinking、tool call/result 渲染
|
|
93
|
+
ModelsConfig.tsx # 模型和认证配置面板
|
|
94
|
+
SkillsConfig.tsx # 技能管理面板
|
|
95
|
+
FileExplorer.tsx # 文件树
|
|
96
|
+
FileViewer.tsx # 源码、diff、图片、音频、PDF、DOCX 预览
|
|
97
|
+
lib/
|
|
98
|
+
rpc-manager.ts # AgentSessionWrapper 生命周期和全局 registry
|
|
99
|
+
session-reader.ts # 解析 .jsonl 会话文件和分支上下文
|
|
100
|
+
normalize.ts # 规范化 toolCall 字段名
|
|
101
|
+
file-access.ts # 文件读取安全边界
|
|
102
|
+
file-paths.ts # 文件路径编码/相对路径工具
|
|
103
|
+
markdown.ts # Markdown/Mermaid/KaTeX 插件配置
|
|
104
|
+
pi-types.ts # pi 相关类型
|
|
105
|
+
hooks/
|
|
106
|
+
useAgentSession.ts # 会话加载、发送命令、SSE 状态机
|
|
107
|
+
useAudio.ts # 完成提示音
|
|
108
|
+
useDragDrop.ts # 图片拖拽
|
|
109
|
+
useTheme.ts # 主题切换
|
|
110
|
+
bin/
|
|
111
|
+
pi-web.js # npm CLI 入口
|
|
112
|
+
```
|