@lyhue1991/pi-web 0.8.6
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 +46 -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 +143 -0
- package/.next/react-loadable-manifest.json +2258 -0
- package/.next/required-server-files.js +349 -0
- package/.next/required-server-files.json +349 -0
- package/.next/routes-manifest.json +372 -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 +20 -0
- package/.next/server/app/_not-found.segments/_full.segment.rsc +20 -0
- package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
- package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -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 +5 -0
- package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -0
- package/.next/server/app/api/agent/[id]/bash-output/route.js.nft.json +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.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/agent/running/route.js +1 -0
- package/.next/server/app/api/agent/running/route.js.nft.json +1 -0
- package/.next/server/app/api/agent/running/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/browse/route.js +1 -0
- package/.next/server/app/api/cwd/browse/route.js.nft.json +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.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 +1 -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/file-index/route.js +1 -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 +49 -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/git/diff/route.js +6 -0
- package/.next/server/app/api/git/diff/route.js.nft.json +1 -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.js.nft.json +1 -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.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/catalog/route.js +1 -0
- package/.next/server/app/api/models-config/catalog/route.js.nft.json +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.js.nft.json +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.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/project-trust/route.js +1 -0
- package/.next/server/app/api/project-trust/route.js.nft.json +1 -0
- package/.next/server/app/api/project-trust/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route.js +10 -0
- package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -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.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]/entries/[entryId]/thinking/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js.nft.json +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]/export/route.js +54 -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/[id]/state/route.js +1 -0
- package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/[id]/state/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/check/route.js +1 -0
- package/.next/server/app/api/skills/check/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/check/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/skills/update/route.js +1 -0
- package/.next/server/app/api/skills/update/route.js.nft.json +1 -0
- package/.next/server/app/api/skills/update/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/worktrees/route.js +1 -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 +21 -0
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +8 -0
- package/.next/server/app/index.segments/_full.segment.rsc +21 -0
- package/.next/server/app/index.segments/_head.segment.rsc +6 -0
- package/.next/server/app/index.segments/_index.segment.rsc +7 -0
- package/.next/server/app/index.segments/_tree.segment.rsc +6 -0
- package/.next/server/app/manifest.webmanifest/route.js +16 -0
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -0
- package/.next/server/app/manifest.webmanifest.body +1 -0
- package/.next/server/app/manifest.webmanifest.meta +1 -0
- package/.next/server/app/page.js +73 -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 +46 -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/123.js +79 -0
- package/.next/server/chunks/1309.js +14 -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/2349.js +1 -0
- package/.next/server/chunks/258.js +1 -0
- package/.next/server/chunks/2715.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/4741.js +20 -0
- package/.next/server/chunks/4768.js +80 -0
- package/.next/server/chunks/4893.js +1 -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/5582.js +3 -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/6429.js +1 -0
- package/.next/server/chunks/6900.js +90 -0
- package/.next/server/chunks/6953.js +1 -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/7424.js +4 -0
- package/.next/server/chunks/7635.js +1 -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/974.js +1 -0
- package/.next/server/chunks/9963.js +1 -0
- package/.next/server/chunks/static/media/macos-trash.6c01a2a6 +0 -0
- package/.next/server/chunks/static/media/windows-trash.2b7fe177.exe +0 -0
- package/.next/server/functions-config-manifest.json +19 -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 +18 -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 +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/JpAkqjRvCHtp3M_ChE6_B/_buildManifest.js +1 -0
- package/.next/static/JpAkqjRvCHtp3M_ChE6_B/_ssgManifest.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/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-1b03b52e3112452e.js +32 -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/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/8311-95813758da2b283c.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-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/_not-found/page-ccc1f1aeb5ecc593.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/bash-output/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/events/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/agent/[id]/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/agent/new/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/agent/running/events/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/agent/running/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/auth/all-providers/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/auth/api-key/[provider]/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/auth/login/[provider]/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/auth/logout/[provider]/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/auth/providers/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/cwd/browse/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/cwd/validate/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/default-cwd/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/file-index/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/files/[...path]/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/git/diff/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/git/status/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/home/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/models/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/models-config/catalog/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/models-config/discover/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/models-config/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/models-config/test/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/plugins/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/project-trust/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/context/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/export/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/state/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/skills/check/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/skills/install/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/skills/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/skills/search/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/skills/update/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/api/worktrees/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/layout-ca97634a96114a03.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/app/page-4be55877df86a39c.js +72 -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-a787264d62ebe041.js +5 -0
- package/.next/static/chunks/main-app-44b3ecb27de577ad.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/app-error-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/forbidden-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/global-error-0ed2693ee1341146.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/not-found-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-35860f4efe0047e5.js +1 -0
- package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/.next/static/chunks/webpack-35ab8665f48061d4.js +1 -0
- package/.next/static/css/03c139a692325b4b.css +1 -0
- package/.next/static/css/121a2cf33104c046.css +1 -0
- package/.next/static/css/88714c00e109ce28.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 +37 -0
- package/.next/trace-build +1 -0
- package/.next/types/app/api/agent/[id]/bash-output/route.ts +351 -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/agent/running/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/browse/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/file-index/route.ts +351 -0
- package/.next/types/app/api/files/[...path]/route.ts +351 -0
- package/.next/types/app/api/git/diff/route.ts +351 -0
- package/.next/types/app/api/git/status/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/catalog/route.ts +351 -0
- package/.next/types/app/api/models-config/discover/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/project-trust/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/auto-name/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/context/route.ts +351 -0
- package/.next/types/app/api/sessions/[id]/entries/[entryId]/thinking/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/[id]/state/route.ts +351 -0
- package/.next/types/app/api/sessions/route.ts +351 -0
- package/.next/types/app/api/skills/check/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/skills/update/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 +111 -0
- package/.next/types/validator.ts +421 -0
- package/LICENSE +21 -0
- package/README.ja.md +150 -0
- package/README.md +155 -0
- package/README.ru.md +155 -0
- package/README.zh-CN.md +151 -0
- package/bin/node-version.js +35 -0
- package/bin/pi-web-options.js +30 -0
- package/bin/pi-web.js +96 -0
- package/next.config.ts +50 -0
- package/package.json +79 -0
- package/public/icons/apple-touch-icon.png +0 -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/sw.js +76 -0
package/README.ja.md
ADDED
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# Pi Web
|
|
2
|
+
|
|
3
|
+
[English](./README.md) | [简体中文](./README.zh-CN.md) | [Русский](./README.ru.md)
|
|
4
|
+
|
|
5
|
+
[pi コーディングエージェント](https://github.com/badlogic/pi-mono) のローカル Web UI です。Pi Web はローカルの pi セッションファイルを読み込み、セッションの閲覧、リアルタイムチャット、モデル設定、スキル管理、プロジェクトファイルのプレビューを行えるブラウザワークスペースを提供します。
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
CLI と Pi Web で同じ pi セッションを利用できます。構造化されたツール呼び出し、読みやすい Markdown、セッション閲覧、整理された結果表示を備えています。
|
|
10
|
+
|
|
11
|
+
## クイックスタート
|
|
12
|
+
|
|
13
|
+
Pi Web には Node.js 22.19.0 以降が必要です。現在のバージョンは `node --version` で確認できます。
|
|
14
|
+
|
|
15
|
+
**インストールせずに実行:**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx @lyhue1991/pi-web@latest
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**またはグローバルにインストール:**
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install -g @lyhue1991/pi-web
|
|
25
|
+
pi-web
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
続いて [http://127.0.0.1:30141](http://127.0.0.1:30141) を開きます。サーバーの準備が整うと、CLI はブラウザを自動的に開こうとします。Pi Web はデフォルトで `127.0.0.1` のみをリッスンします。
|
|
29
|
+
|
|
30
|
+
**オプション:**
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pi-web --port 8080 # カスタムポート
|
|
34
|
+
pi-web --hostname 0.0.0.0 # 信頼できるネットワークに公開
|
|
35
|
+
pi-web -p 8080 -H 0.0.0.0 # オプションを組み合わせる
|
|
36
|
+
pi-web --no-open # ブラウザを自動的に開かない
|
|
37
|
+
|
|
38
|
+
PORT=8080 pi-web # 環境変数にも対応
|
|
39
|
+
PI_WEB_HOSTNAME=0.0.0.0 pi-web # ネットワーク公開を明示的に有効化
|
|
40
|
+
PI_WEB_ALLOWED_HOSTS=pi-web.internal pi-web # プロキシまたはカスタムホスト名を許可
|
|
41
|
+
PI_WEB_PASSWORD='十分に長いランダムなパスワード' pi-web # Basic Auth を有効化(ユーザー名: pi)
|
|
42
|
+
PI_WEB_NO_OPEN=1 pi-web # バックグラウンドサービスとして実行する場合に便利
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`PI_WEB_PASSWORD` を設定すると、Web インターフェースとすべての API エンドポイントが HTTP Basic Auth で保護されます。ユーザー名は常に `pi` です。未設定または空の場合、認証は無効です。
|
|
46
|
+
|
|
47
|
+
Pi Web は高権限のエージェントを呼び出せます。Basic Auth は転送中のパスワードを暗号化しないため、平文 HTTP をインターネットに公開しないでください。リモートアクセスには、信頼できるリバースプロキシによる HTTPS または信頼できる VPN を使用してください。
|
|
48
|
+
API リクエストでは、loopback 名、IP リテラル、選択したバインドホスト名、および `PI_WEB_ALLOWED_HOSTS` にカンマ区切りで指定した完全一致のホスト名のみを受け入れます。信頼できるリバースプロキシが異なる外部ホスト名を使用する場合は、この変数を設定してください。
|
|
49
|
+
|
|
50
|
+
## HTTP プロキシ
|
|
51
|
+
|
|
52
|
+
Pi Web は、サーバー側のモデルリクエストと API リクエストに標準の `HTTP_PROXY`、`HTTPS_PROXY`、`NO_PROXY` 環境変数を使用します。
|
|
53
|
+
|
|
54
|
+
macOS または Linux:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
HTTP_PROXY=http://127.0.0.1:7890 \
|
|
58
|
+
HTTPS_PROXY=http://127.0.0.1:7890 \
|
|
59
|
+
NO_PROXY=localhost,127.0.0.1 \
|
|
60
|
+
npx @lyhue1991/pi-web@latest
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Windows PowerShell:
|
|
64
|
+
|
|
65
|
+
```powershell
|
|
66
|
+
$env:HTTP_PROXY = "http://127.0.0.1:7890"
|
|
67
|
+
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
|
|
68
|
+
$env:NO_PROXY = "localhost,127.0.0.1"
|
|
69
|
+
npx @lyhue1991/pi-web@latest
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 機能
|
|
73
|
+
|
|
74
|
+
- **作業をすぐに再開**:セッションのパスやターミナル履歴を探さずに、プロジェクトごとに過去の pi の会話を閲覧できます。
|
|
75
|
+
- **別の方向性を安全に試す**:以前のメッセージから続けるか、セッションをフォークして別の進め方を試せます。
|
|
76
|
+
- **ブランチをまたいで作業**:サイドバーから Git worktree を切り替えると、新しいセッションと Explorer が選択したチェックアウトに追従します。
|
|
77
|
+
- **プロジェクトを見ながらチャット**:エージェントの作業中に、左側でファイルを閲覧し、右側でソース、ドキュメント、画像、音声、PDF をプレビューできます。
|
|
78
|
+
- **セッションの状態を明確に把握**:コンテキスト使用量、コスト、コンパクション状態、システムプロンプトの詳細をトップバーで確認できます。
|
|
79
|
+
- **ターミナルでの設定を削減**:モデル、ログイン/API キー、モデルテスト、スキルの切り替えを Web UI から管理できます。
|
|
80
|
+
|
|
81
|
+
## 注意事項
|
|
82
|
+
|
|
83
|
+
- **データディレクトリ**:Pi Web はデフォルトで `~/.pi/agent/sessions` を読み込みます。別の pi エージェントディレクトリを指定するには `PI_CODING_AGENT_DIR` を設定してください。
|
|
84
|
+
- **セッションファイル**:ファイルは `~/.pi/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl` に保存されます。
|
|
85
|
+
- **モデル設定**:Models パネルは pi エージェントディレクトリ内の `models.json` を読み書きします。モデルの一覧とデフォルト値は pi の設定から取得されます。
|
|
86
|
+
- **ファイルアクセス**:ファイルの閲覧とプレビューは、選択したプロジェクトディレクトリとセッションに含まれる作業ディレクトリに限定されます。
|
|
87
|
+
- **Git worktree**:切り替え機能が表示される条件、新しい worktree の作成方法、削除時の動作については、[Pi Web の Worktree](./docs/worktrees.md) を参照してください。
|
|
88
|
+
- **Fork とセッション内ブランチの違い**:Fork は新しい `.jsonl` ファイルを作成します。"Edit from here" は同じセッションファイル内に別のブランチを作成します。
|
|
89
|
+
|
|
90
|
+
## 開発
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npm install
|
|
94
|
+
npm run dev
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
ローカル開発サーバーは [http://127.0.0.1:30141](http://127.0.0.1:30141) で動作します。
|
|
98
|
+
|
|
99
|
+
よく使うチェック:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
node_modules/.bin/tsc --noEmit
|
|
103
|
+
npm run lint
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
ローカル開発中は `next build` / `npm run build` を実行しないでください。`.next/` に書き込みが行われ、開発サーバーに影響する可能性があります。ビルドはリリース作業に任せてください。
|
|
107
|
+
|
|
108
|
+
## プロジェクト構成
|
|
109
|
+
|
|
110
|
+
```text
|
|
111
|
+
app/
|
|
112
|
+
api/
|
|
113
|
+
agent/ # AgentSession を作成・操作し、SSE イベントを公開
|
|
114
|
+
auth/ # OAuth と API キーの管理
|
|
115
|
+
cwd/validate/ # カスタム作業ディレクトリの検証
|
|
116
|
+
default-cwd/ # pi のデフォルト作業ディレクトリを取得
|
|
117
|
+
files/ # ファイルの一覧、読み込み、プレビュー、監視
|
|
118
|
+
home/ # 現在のユーザーのホームディレクトリ
|
|
119
|
+
models/ # 利用可能なモデル、デフォルトモデル、思考レベル
|
|
120
|
+
models-config/ # models.json の読み書きとモデルのテスト
|
|
121
|
+
sessions/ # セッションの読み込み、名前変更、削除、コンテキスト、HTML エクスポート
|
|
122
|
+
skills/ # スキルの一覧、検索、インストール、有効化/無効化
|
|
123
|
+
components/
|
|
124
|
+
AppShell.tsx # メインレイアウト、URL 状態、上部パネル、ファイルタブ
|
|
125
|
+
SessionSidebar.tsx # プロジェクト選択、セッションツリー、Explorer
|
|
126
|
+
ChatWindow.tsx # メッセージ、SSE、画像のドラッグ&ドロップ、ミニマップ
|
|
127
|
+
ChatInput.tsx # 入力欄、モデル/ツール/思考/コンパクション/スラッシュコントロール
|
|
128
|
+
MessageView.tsx # メッセージ、思考、ツール呼び出し/結果の表示
|
|
129
|
+
ModelsConfig.tsx # モデルと認証の設定パネル
|
|
130
|
+
SkillsConfig.tsx # スキル管理パネル
|
|
131
|
+
FileExplorer.tsx # ファイルツリー
|
|
132
|
+
FileViewer.tsx # ソース、差分、画像、音声、PDF、DOCX のプレビュー
|
|
133
|
+
lib/
|
|
134
|
+
http-dispatcher.ts # サーバー側 fetch の HTTP(S) プロキシ設定
|
|
135
|
+
rpc-manager.ts # AgentSessionWrapper のライフサイクルとグローバルレジストリ
|
|
136
|
+
session-reader.ts # .jsonl セッションファイルとブランチコンテキストの解析
|
|
137
|
+
normalize.ts # toolCall フィールド名の正規化
|
|
138
|
+
file-access.ts # ファイル読み込みの安全境界
|
|
139
|
+
file-paths.ts # ファイルパスのエンコードと相対パスのヘルパー
|
|
140
|
+
markdown.ts # Markdown/Mermaid/KaTeX プラグインの設定
|
|
141
|
+
pi-types.ts # pi 関連の型
|
|
142
|
+
hooks/
|
|
143
|
+
useAgentSession.ts # セッションの読み込み、コマンド送信、SSE ステートマシン
|
|
144
|
+
useAudio.ts # 完了通知音
|
|
145
|
+
useDragDrop.ts # 画像のドラッグ&ドロップ
|
|
146
|
+
useTheme.ts # テーマの切り替え
|
|
147
|
+
bin/
|
|
148
|
+
pi-web.js # npm CLI エントリポイント
|
|
149
|
+
instrumentation.ts # サーバー HTTP ディスパッチャーの初期化
|
|
150
|
+
```
|
package/README.md
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Pi Web
|
|
2
|
+
|
|
3
|
+
[中文文档](./README.zh-CN.md) | [日本語](./README.ja.md) | [Русский](./README.ru.md)
|
|
4
|
+
|
|
5
|
+
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.
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
The same pi session in CLI and Pi Web: structured tool calls, readable Markdown, session browsing, and cleaner results.
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
Pi Web requires Node.js 22.19.0 or newer. Check your version with `node --version`.
|
|
14
|
+
|
|
15
|
+
**Run without installing:**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx @lyhue1991/pi-web@latest
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Or install globally:**
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install -g @lyhue1991/pi-web
|
|
25
|
+
pi-web
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Then open [http://127.0.0.1:30141](http://127.0.0.1:30141). The CLI will try to open the browser automatically after the server is ready. Pi Web listens on `127.0.0.1` by default.
|
|
29
|
+
|
|
30
|
+
**Options:**
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pi-web --port 8080 # custom port
|
|
34
|
+
pi-web --hostname 0.0.0.0 # expose on a trusted network
|
|
35
|
+
pi-web -p 8080 -H 0.0.0.0 # combine options
|
|
36
|
+
pi-web --no-open # do not open the browser automatically
|
|
37
|
+
|
|
38
|
+
PORT=8080 pi-web # environment variable is also supported
|
|
39
|
+
PI_WEB_HOSTNAME=0.0.0.0 pi-web # explicit network exposure
|
|
40
|
+
PI_WEB_ALLOWED_HOSTS=pi-web.internal pi-web # allow an exact proxy/custom hostname
|
|
41
|
+
PI_WEB_PASSWORD='a-long-random-password' pi-web # require Basic Auth (username: pi)
|
|
42
|
+
PI_WEB_NO_OPEN=1 pi-web # useful when running as a background service
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Set `PI_WEB_PASSWORD` to protect the web interface and every API endpoint with HTTP Basic Auth. The username is always `pi`. Leaving the variable unset or empty disables authentication.
|
|
46
|
+
|
|
47
|
+
Pi Web can invoke a high-privilege agent. Basic Auth does not encrypt the password in transit, so do not expose plain HTTP to the internet. Use HTTPS through a trusted reverse proxy or a trusted VPN for remote access.
|
|
48
|
+
API requests accept loopback names, IP literals, the selected bind hostname, and exact comma-separated names in `PI_WEB_ALLOWED_HOSTS`. Configure that variable when a trusted reverse proxy uses a different external hostname.
|
|
49
|
+
|
|
50
|
+
## HTTP Proxy
|
|
51
|
+
|
|
52
|
+
Pi Web reads the standard `HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables for server-side model and API requests.
|
|
53
|
+
|
|
54
|
+
On macOS or Linux:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
HTTP_PROXY=http://127.0.0.1:7890 \
|
|
58
|
+
HTTPS_PROXY=http://127.0.0.1:7890 \
|
|
59
|
+
NO_PROXY=localhost,127.0.0.1 \
|
|
60
|
+
npx @lyhue1991/pi-web@latest
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
On Windows PowerShell:
|
|
64
|
+
|
|
65
|
+
```powershell
|
|
66
|
+
$env:HTTP_PROXY = "http://127.0.0.1:7890"
|
|
67
|
+
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
|
|
68
|
+
$env:NO_PROXY = "localhost,127.0.0.1"
|
|
69
|
+
npx @lyhue1991/pi-web@latest
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Features
|
|
73
|
+
|
|
74
|
+
- **Pick work back up**: browse previous pi conversations by project without digging through terminal history or session paths.
|
|
75
|
+
- **Try different directions safely**: continue from an earlier message or fork a session into a separate route.
|
|
76
|
+
- **Work across branches**: switch Git worktrees from the sidebar so new sessions and the Explorer follow the checkout you choose.
|
|
77
|
+
- **Chat beside the project**: browse files on the left and preview source, docs, images, audio, and PDFs on the right while the agent works.
|
|
78
|
+
- **See session state clearly**: context usage, cost, compaction state, and system prompt details are visible from the top bar.
|
|
79
|
+
- **Configure less from the terminal**: manage models, login/API keys, model tests, and skill switches from the web UI.
|
|
80
|
+
- **Use the interface in your language**: switch between the supported UI languages from the top bar.
|
|
81
|
+
|
|
82
|
+
## Notes
|
|
83
|
+
|
|
84
|
+
- **Data directory**: Pi Web reads `~/.pi/agent/sessions` by default. Set `PI_CODING_AGENT_DIR` to point at another pi agent directory.
|
|
85
|
+
- **Session files**: files are stored as `~/.pi/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`.
|
|
86
|
+
- **Model config**: the Models panel reads and writes `models.json` in the pi agent directory. Model lists and defaults come from pi's config.
|
|
87
|
+
- **File access**: file browsing and preview are scoped to the selected project directory and working directories that appear in sessions.
|
|
88
|
+
- **Git worktrees**: see [Worktrees in Pi Web](./docs/worktrees.md) for when the switcher appears, how new worktrees are created, and what removal does.
|
|
89
|
+
- **Forks vs in-session branches**: Fork creates a new `.jsonl` file. "Edit from here" creates another branch inside the same session file.
|
|
90
|
+
- **Internationalization**: see [Internationalization](./docs/i18n.md) for using translations and adding languages or UI text.
|
|
91
|
+
|
|
92
|
+
## Development
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npm install
|
|
96
|
+
npm run dev
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The local dev server runs at [http://127.0.0.1:30141](http://127.0.0.1:30141).
|
|
100
|
+
|
|
101
|
+
Common checks:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
node_modules/.bin/tsc --noEmit
|
|
105
|
+
npm run lint
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
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.
|
|
109
|
+
|
|
110
|
+
## Project Structure
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
app/
|
|
114
|
+
api/
|
|
115
|
+
agent/ # creates/drives AgentSession and exposes SSE events
|
|
116
|
+
auth/ # OAuth and API key management
|
|
117
|
+
cwd/browse/ # browsable server directory listing
|
|
118
|
+
cwd/validate/ # custom working directory validation
|
|
119
|
+
default-cwd/ # pi default working directory lookup
|
|
120
|
+
files/ # file listing, reading, preview, and watching
|
|
121
|
+
home/ # current user home directory
|
|
122
|
+
models/ # available models, default model, thinking levels
|
|
123
|
+
models-config/ # read/write models.json and test models
|
|
124
|
+
sessions/ # session reads, rename, delete, context, HTML export
|
|
125
|
+
skills/ # skill listing, search, install, enable/disable
|
|
126
|
+
components/
|
|
127
|
+
AppShell.tsx # main layout, URL state, top panels, file tabs
|
|
128
|
+
SessionSidebar.tsx # project selector, session tree, Explorer
|
|
129
|
+
DirectoryPicker.tsx # browsable and editable working-directory picker
|
|
130
|
+
ChatWindow.tsx # messages, SSE, image drag/drop, minimap
|
|
131
|
+
ChatInput.tsx # input bar, model/tools/thinking/compact/slash controls
|
|
132
|
+
MessageView.tsx # message, thinking, tool call/result rendering
|
|
133
|
+
ModelsConfig.tsx # model and auth configuration panel
|
|
134
|
+
SkillsConfig.tsx # skill management panel
|
|
135
|
+
FileExplorer.tsx # file tree
|
|
136
|
+
FileViewer.tsx # source, diff, image, audio, PDF, DOCX preview
|
|
137
|
+
lib/
|
|
138
|
+
directory-browser.ts # directory normalization and safe listing helpers
|
|
139
|
+
http-dispatcher.ts # HTTP(S) proxy setup for server-side fetch
|
|
140
|
+
rpc-manager.ts # AgentSessionWrapper lifecycle and global registry
|
|
141
|
+
session-reader.ts # parses .jsonl session files and branch contexts
|
|
142
|
+
normalize.ts # normalizes toolCall field names
|
|
143
|
+
file-access.ts # file read safety boundary
|
|
144
|
+
file-paths.ts # path encoding and relative path helpers
|
|
145
|
+
markdown.ts # Markdown/Mermaid/KaTeX plugin configuration
|
|
146
|
+
pi-types.ts # pi-related types
|
|
147
|
+
hooks/
|
|
148
|
+
useAgentSession.ts # session loading, command sending, SSE state machine
|
|
149
|
+
useAudio.ts # completion sound
|
|
150
|
+
useDragDrop.ts # image drag/drop
|
|
151
|
+
useTheme.ts # theme switching
|
|
152
|
+
bin/
|
|
153
|
+
pi-web.js # npm CLI entrypoint
|
|
154
|
+
instrumentation.ts # initializes the server HTTP dispatcher
|
|
155
|
+
```
|
package/README.ru.md
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# Pi Web
|
|
2
|
+
|
|
3
|
+
[English](./README.md) | [中文文档](./README.zh-CN.md) | [日本語](./README.ja.md)
|
|
4
|
+
|
|
5
|
+
Локальный веб-интерфейс для [pi coding agent](https://github.com/badlogic/pi-mono). Pi Web читает локальные файлы сессий pi и предоставляет рабочее пространство в браузере для просмотра сессий, общения с агентом в реальном времени, настройки моделей, управления навыками и предварительного просмотра файлов проекта.
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
Одна и та же сессия pi в CLI и Pi Web: структурированные вызовы инструментов, удобочитаемый Markdown, просмотр сессий и наглядные результаты.
|
|
10
|
+
|
|
11
|
+
## Быстрый старт
|
|
12
|
+
|
|
13
|
+
Для работы Pi Web требуется Node.js **22.19.0** или новее. Проверьте версию командой `node --version`.
|
|
14
|
+
|
|
15
|
+
**Запуск без установки:**
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx @lyhue1991/pi-web@latest
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Или глобальная установка:**
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install -g @lyhue1991/pi-web
|
|
25
|
+
pi-web
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Затем откройте [http://127.0.0.1:30141](http://127.0.0.1:30141). После запуска сервера CLI попытается автоматически открыть браузер. По умолчанию Pi Web прослушивает только `127.0.0.1`.
|
|
29
|
+
|
|
30
|
+
**Параметры:**
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
pi-web --port 8080 # другой порт
|
|
34
|
+
pi-web --hostname 0.0.0.0 # доступ в доверенной сети
|
|
35
|
+
pi-web -p 8080 -H 0.0.0.0 # сочетание параметров
|
|
36
|
+
pi-web --no-open # не открывать браузер автоматически
|
|
37
|
+
|
|
38
|
+
PORT=8080 pi-web # порт также можно задать переменной окружения
|
|
39
|
+
PI_WEB_HOSTNAME=0.0.0.0 pi-web # явное разрешение сетевого доступа
|
|
40
|
+
PI_WEB_ALLOWED_HOSTS=pi-web.internal pi-web # точное имя прокси или другого хоста
|
|
41
|
+
PI_WEB_PASSWORD='длинный-случайный-пароль' pi-web # Basic Auth (имя пользователя: pi)
|
|
42
|
+
PI_WEB_NO_OPEN=1 pi-web # удобно для фоновой службы
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Задайте `PI_WEB_PASSWORD`, чтобы защитить веб-интерфейс и все конечные точки API с помощью HTTP Basic Auth. Имя пользователя всегда `pi`. Если переменная не задана или пуста, аутентификация отключена.
|
|
46
|
+
|
|
47
|
+
Pi Web может вызывать агента с широкими полномочиями. Basic Auth не шифрует пароль при передаче, поэтому не публикуйте обычный HTTP-сервер в интернете. Для удалённого доступа используйте HTTPS через доверенный обратный прокси или надёжное VPN-подключение.
|
|
48
|
+
API-запросы принимаются для loopback-имён, IP-адресов, выбранного имени хоста и точных имён из `PI_WEB_ALLOWED_HOSTS`, разделённых запятыми. Задайте эту переменную, если доверенный обратный прокси использует другое внешнее имя хоста.
|
|
49
|
+
|
|
50
|
+
## HTTP-прокси
|
|
51
|
+
|
|
52
|
+
Для серверных запросов к моделям и API Pi Web использует стандартные переменные окружения `HTTP_PROXY`, `HTTPS_PROXY` и `NO_PROXY`.
|
|
53
|
+
|
|
54
|
+
В macOS и Linux:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
HTTP_PROXY=http://127.0.0.1:7890 \
|
|
58
|
+
HTTPS_PROXY=http://127.0.0.1:7890 \
|
|
59
|
+
NO_PROXY=localhost,127.0.0.1 \
|
|
60
|
+
npx @lyhue1991/pi-web@latest
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
В Windows PowerShell:
|
|
64
|
+
|
|
65
|
+
```powershell
|
|
66
|
+
$env:HTTP_PROXY = "http://127.0.0.1:7890"
|
|
67
|
+
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
|
|
68
|
+
$env:NO_PROXY = "localhost,127.0.0.1"
|
|
69
|
+
npx @lyhue1991/pi-web@latest
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Возможности
|
|
73
|
+
|
|
74
|
+
- **Продолжайте работу с прежнего места**: просматривайте предыдущие разговоры с pi по проектам, не разыскивая их в истории терминала или путях к сессиям.
|
|
75
|
+
- **Безопасно пробуйте разные подходы**: продолжайте диалог с более раннего сообщения или создавайте отдельный форк сессии.
|
|
76
|
+
- **Работайте с разными ветками**: переключайте Git worktree в боковой панели, чтобы новые сессии и Explorer следовали за выбранным рабочим деревом.
|
|
77
|
+
- **Общайтесь с агентом рядом с проектом**: просматривайте файлы слева, а исходный код, документы, изображения, аудио и PDF — справа, пока агент работает.
|
|
78
|
+
- **Следите за состоянием сессии**: в верхней панели видны использование контекста, стоимость, состояние сжатия и сведения о системном промпте.
|
|
79
|
+
- **Реже обращайтесь к терминалу**: управляйте моделями, учётными данными для входа и API, тестированием моделей и переключателями навыков в веб-интерфейсе.
|
|
80
|
+
- **Используйте удобный язык интерфейса**: переключайтесь между поддерживаемыми языками в верхней панели.
|
|
81
|
+
|
|
82
|
+
## Примечания
|
|
83
|
+
|
|
84
|
+
- **Каталог данных**: по умолчанию Pi Web читает `~/.pi/agent/sessions`. Чтобы указать другой каталог агента pi, задайте `PI_CODING_AGENT_DIR`.
|
|
85
|
+
- **Файлы сессий**: файлы хранятся по пути `~/.pi/agent/sessions/<encoded-cwd>/<timestamp>_<uuid>.jsonl`.
|
|
86
|
+
- **Настройка моделей**: панель Models читает и записывает `models.json` в каталоге агента pi. Список моделей и модель по умолчанию берутся из конфигурации pi.
|
|
87
|
+
- **Доступ к файлам**: просмотр файлов ограничен выбранным каталогом проекта и рабочими каталогами, которые встречаются в сессиях.
|
|
88
|
+
- **Git worktree**: условия отображения переключателя, создание новых рабочих деревьев и их удаление описаны в документе [Worktrees in Pi Web](./docs/worktrees.md).
|
|
89
|
+
- **Форк и ветка внутри сессии**: Fork создаёт новый файл `.jsonl`, а «Edit from here» — другую ветку внутри того же файла сессии.
|
|
90
|
+
- **Интернационализация**: использование переводов и добавление языков или текстов интерфейса описаны в документе [Internationalization](./docs/i18n.md).
|
|
91
|
+
|
|
92
|
+
## Разработка
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npm install
|
|
96
|
+
npm run dev
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Локальный сервер разработки доступен по адресу [http://127.0.0.1:30141](http://127.0.0.1:30141).
|
|
100
|
+
|
|
101
|
+
Основные проверки:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
node_modules/.bin/tsc --noEmit
|
|
105
|
+
npm run lint
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Не запускайте `next build` / `npm run build` во время локальной разработки. Эта команда записывает данные в `.next/` и может помешать работе сервера разработки; выполняйте сборку только при подготовке релиза.
|
|
109
|
+
|
|
110
|
+
## Структура проекта
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
app/
|
|
114
|
+
api/
|
|
115
|
+
agent/ # создание и управление AgentSession, события SSE
|
|
116
|
+
auth/ # управление OAuth и ключами API
|
|
117
|
+
cwd/browse/ # просмотр каталогов на сервере
|
|
118
|
+
cwd/validate/ # проверка пользовательского рабочего каталога
|
|
119
|
+
default-cwd/ # рабочий каталог pi по умолчанию
|
|
120
|
+
files/ # список, чтение, просмотр и отслеживание файлов
|
|
121
|
+
home/ # домашний каталог текущего пользователя
|
|
122
|
+
models/ # доступные модели, модель по умолчанию, уровни рассуждения
|
|
123
|
+
models-config/ # чтение и запись models.json, проверка моделей
|
|
124
|
+
sessions/ # чтение, переименование, удаление, контекст и экспорт сессий в HTML
|
|
125
|
+
skills/ # список, поиск, установка, включение и отключение навыков
|
|
126
|
+
components/
|
|
127
|
+
AppShell.tsx # основной макет, состояние URL, верхние панели, вкладки файлов
|
|
128
|
+
SessionSidebar.tsx # выбор проекта, дерево сессий, Explorer
|
|
129
|
+
DirectoryPicker.tsx # просмотр и изменение рабочего каталога
|
|
130
|
+
ChatWindow.tsx # сообщения, SSE, перетаскивание изображений, мини-карта
|
|
131
|
+
ChatInput.tsx # модели, инструменты, рассуждение, сжатие и слеш-команды
|
|
132
|
+
MessageView.tsx # сообщения, рассуждения, вызовы инструментов и результаты
|
|
133
|
+
ModelsConfig.tsx # настройка моделей и аутентификации
|
|
134
|
+
SkillsConfig.tsx # управление навыками
|
|
135
|
+
FileExplorer.tsx # дерево файлов
|
|
136
|
+
FileViewer.tsx # просмотр кода, diff, изображений, аудио, PDF и DOCX
|
|
137
|
+
lib/
|
|
138
|
+
directory-browser.ts # нормализация каталогов и безопасный просмотр
|
|
139
|
+
http-dispatcher.ts # настройка HTTP(S)-прокси для серверных запросов
|
|
140
|
+
rpc-manager.ts # жизненный цикл AgentSessionWrapper и глобальный реестр
|
|
141
|
+
session-reader.ts # разбор файлов сессий .jsonl и контекста веток
|
|
142
|
+
normalize.ts # нормализация имён полей toolCall
|
|
143
|
+
file-access.ts # границы безопасного чтения файлов
|
|
144
|
+
file-paths.ts # кодирование путей и работа с относительными путями
|
|
145
|
+
markdown.ts # настройка плагинов Markdown, Mermaid и KaTeX
|
|
146
|
+
pi-types.ts # типы, связанные с pi
|
|
147
|
+
hooks/
|
|
148
|
+
useAgentSession.ts # загрузка сессии, команды и автомат состояний SSE
|
|
149
|
+
useAudio.ts # звук завершения
|
|
150
|
+
useDragDrop.ts # перетаскивание изображений
|
|
151
|
+
useTheme.ts # переключение темы
|
|
152
|
+
bin/
|
|
153
|
+
pi-web.js # точка входа npm CLI
|
|
154
|
+
instrumentation.ts # инициализация HTTP-диспетчера сервера
|
|
155
|
+
```
|
package/README.zh-CN.md
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Pi Web
|
|
2
|
+
|
|
3
|
+
[English](./README.md) | [日本語](./README.ja.md) | [Русский](./README.ru.md)
|
|
4
|
+
|
|
5
|
+
[pi 编程智能体](https://github.com/badlogic/pi-mono) 的本地网页界面。它会读取本机的 pi 会话文件,在浏览器里提供会话管理、实时对话、模型配置、技能管理和项目文件预览。
|
|
6
|
+
|
|
7
|
+
中文微信群:请查看 [GitHub Discussions 帖子](https://github.com/agegr/pi-web/discussions/271)。
|
|
8
|
+
|
|
9
|
+
## 快速开始
|
|
10
|
+
|
|
11
|
+
Pi Web 要求 Node.js 22.19.0 或更高版本。可通过 `node --version` 检查当前版本。
|
|
12
|
+
|
|
13
|
+
**无需安装,直接运行:**
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx @lyhue1991/pi-web@latest
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**或全局安装后使用:**
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install -g @lyhue1991/pi-web
|
|
23
|
+
pi-web
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
启动后打开 [http://127.0.0.1:30141](http://127.0.0.1:30141)。命令行版本会在服务就绪后尝试自动打开浏览器。Pi Web 默认仅监听 `127.0.0.1`。
|
|
27
|
+
|
|
28
|
+
**可选参数:**
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
pi-web --port 8080 # 自定义端口
|
|
32
|
+
pi-web --hostname 0.0.0.0 # 在可信网络中开放访问
|
|
33
|
+
pi-web -p 8080 -H 0.0.0.0 # 组合使用
|
|
34
|
+
pi-web --no-open # 不自动打开浏览器
|
|
35
|
+
|
|
36
|
+
PORT=8080 pi-web # 也支持环境变量
|
|
37
|
+
PI_WEB_HOSTNAME=0.0.0.0 pi-web # 显式开放网络访问
|
|
38
|
+
PI_WEB_ALLOWED_HOSTS=pi-web.internal pi-web # 允许指定的代理或自定义主机名
|
|
39
|
+
PI_WEB_PASSWORD='足够长的随机密码' pi-web # 启用 Basic Auth(用户名固定为 pi)
|
|
40
|
+
PI_WEB_NO_OPEN=1 pi-web # 适用于后台服务或开机自启
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
设置 `PI_WEB_PASSWORD` 后,网页和所有 API 端点都会启用 HTTP Basic Auth,用户名固定为 `pi`。未设置或设置为空值时不启用认证。
|
|
44
|
+
|
|
45
|
+
Pi Web 可以调用高权限智能体。Basic Auth 不会加密传输中的密码,因此不要把明文 HTTP 暴露到互联网。远程访问时应使用可信反向代理提供 HTTPS,或通过可信 VPN 访问。
|
|
46
|
+
API 请求仅接受 loopback 名称、IP 字面量、当前监听主机名,以及 `PI_WEB_ALLOWED_HOSTS` 中以逗号分隔的精确主机名。可信反向代理使用不同的外部主机名时,请配置该变量。
|
|
47
|
+
|
|
48
|
+
## HTTP 代理
|
|
49
|
+
|
|
50
|
+
Pi Web 的服务端模型请求和 API 请求会读取标准的 `HTTP_PROXY`、`HTTPS_PROXY` 和 `NO_PROXY` 环境变量。
|
|
51
|
+
|
|
52
|
+
macOS 或 Linux:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
HTTP_PROXY=http://127.0.0.1:7890 \
|
|
56
|
+
HTTPS_PROXY=http://127.0.0.1:7890 \
|
|
57
|
+
NO_PROXY=localhost,127.0.0.1 \
|
|
58
|
+
npx @lyhue1991/pi-web@latest
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Windows PowerShell:
|
|
62
|
+
|
|
63
|
+
```powershell
|
|
64
|
+
$env:HTTP_PROXY = "http://127.0.0.1:7890"
|
|
65
|
+
$env:HTTPS_PROXY = "http://127.0.0.1:7890"
|
|
66
|
+
$env:NO_PROXY = "localhost,127.0.0.1"
|
|
67
|
+
npx @lyhue1991/pi-web@latest
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 功能介绍
|
|
71
|
+
|
|
72
|
+
- **把历史工作接回来**:打开网页就能按项目找到以前的 pi 对话,不必在终端里翻文件或记住会话路径。
|
|
73
|
+
- **放心试不同方向**:可以从某条历史消息重新开始,也可以复制出一条独立的新路线,探索方案时不怕弄乱原来的对话。
|
|
74
|
+
- **跨分支工作**:在侧边栏切换 Git worktree,让新会话和 Explorer 跟随你选择的 checkout。
|
|
75
|
+
- **边聊边看项目文件**:左侧浏览项目文件,右侧打开源码、文档、图片、音频和 PDF;文件变化会自动刷新,适合边让 agent 改边检查结果。
|
|
76
|
+
- **随时掌握会话状态**:在顶部就能看到上下文占用、花费、压缩结果和系统提示,长会话不再像黑箱。
|
|
77
|
+
- **少离开当前界面**:模型、登录/API key、模型测试和技能开关都能在网页里处理,配置 agent 时不用在多个工具之间来回切换。
|
|
78
|
+
|
|
79
|
+
## 注意事项
|
|
80
|
+
|
|
81
|
+
- **数据目录**:默认读取 `~/.pi/agent/sessions` 下的会话文件。可通过环境变量 `PI_CODING_AGENT_DIR` 指定其他 pi agent 目录。
|
|
82
|
+
- **会话文件**:路径形如 `~/.pi/agent/sessions/<编码后的工作目录>/<时间戳>_<uuid>.jsonl`。
|
|
83
|
+
- **模型配置**:Models 面板读写 pi agent 目录下的 `models.json`,模型列表和默认模型由 pi 的配置解析得到。
|
|
84
|
+
- **文件访问**:文件浏览和预览面向当前选择的项目目录,以及会话中已出现过的工作目录。
|
|
85
|
+
- **Git worktree**:什么时候显示切换器、新建目录在哪里、删除会影响什么,见 [Pi Web 里的 Worktree](./docs/worktrees.zh-CN.md)。
|
|
86
|
+
- **Fork 与会话内分支不同**:Fork 会创建新的 `.jsonl` 文件;“Edit from here” 是同一会话文件里的分支。
|
|
87
|
+
|
|
88
|
+
## 开发
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npm install
|
|
92
|
+
npm run dev
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
本地开发端口为 [http://127.0.0.1:30141](http://127.0.0.1:30141)。
|
|
96
|
+
|
|
97
|
+
常用检查:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
node_modules/.bin/tsc --noEmit
|
|
101
|
+
npm run lint
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
开发时不要运行 `next build` / `npm run build`,它会写入 `.next/`,容易影响正在运行的 dev server。发布流程再执行构建。
|
|
105
|
+
|
|
106
|
+
## 项目结构
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
app/
|
|
110
|
+
api/
|
|
111
|
+
agent/ # 创建/驱动 AgentSession,提供 SSE 事件流
|
|
112
|
+
auth/ # OAuth 和 API key 管理
|
|
113
|
+
cwd/browse/ # 服务端目录浏览
|
|
114
|
+
cwd/validate/ # 自定义工作目录校验
|
|
115
|
+
default-cwd/ # 获取 pi 默认工作目录
|
|
116
|
+
files/ # 文件列表、读取、预览、watch
|
|
117
|
+
home/ # 当前用户 home 目录
|
|
118
|
+
models/ # 可用模型、默认模型、thinking levels
|
|
119
|
+
models-config/ # 读写 models.json、测试模型
|
|
120
|
+
sessions/ # 会话读取、重命名、删除、上下文、HTML 导出
|
|
121
|
+
skills/ # skills 列表、搜索、安装、启停
|
|
122
|
+
components/
|
|
123
|
+
AppShell.tsx # 主布局、URL 状态、顶部面板、文件标签
|
|
124
|
+
SessionSidebar.tsx # 项目选择、会话树、Explorer
|
|
125
|
+
DirectoryPicker.tsx # 支持浏览和路径输入的工作目录选择器
|
|
126
|
+
ChatWindow.tsx # 消息区、SSE、拖拽图片、minimap
|
|
127
|
+
ChatInput.tsx # 输入栏、模型/工具/thinking/compact/slash controls
|
|
128
|
+
MessageView.tsx # 消息、thinking、tool call/result 渲染
|
|
129
|
+
ModelsConfig.tsx # 模型和认证配置面板
|
|
130
|
+
SkillsConfig.tsx # 技能管理面板
|
|
131
|
+
FileExplorer.tsx # 文件树
|
|
132
|
+
FileViewer.tsx # 源码、diff、图片、音频、PDF、DOCX 预览
|
|
133
|
+
lib/
|
|
134
|
+
directory-browser.ts # 目录规范化和安全枚举工具
|
|
135
|
+
http-dispatcher.ts # 服务端 fetch 的 HTTP(S) 代理配置
|
|
136
|
+
rpc-manager.ts # AgentSessionWrapper 生命周期和全局 registry
|
|
137
|
+
session-reader.ts # 解析 .jsonl 会话文件和分支上下文
|
|
138
|
+
normalize.ts # 规范化 toolCall 字段名
|
|
139
|
+
file-access.ts # 文件读取安全边界
|
|
140
|
+
file-paths.ts # 文件路径编码/相对路径工具
|
|
141
|
+
markdown.ts # Markdown/Mermaid/KaTeX 插件配置
|
|
142
|
+
pi-types.ts # pi 相关类型
|
|
143
|
+
hooks/
|
|
144
|
+
useAgentSession.ts # 会话加载、发送命令、SSE 状态机
|
|
145
|
+
useAudio.ts # 完成提示音
|
|
146
|
+
useDragDrop.ts # 图片拖拽
|
|
147
|
+
useTheme.ts # 主题切换
|
|
148
|
+
bin/
|
|
149
|
+
pi-web.js # npm CLI 入口
|
|
150
|
+
instrumentation.ts # 初始化服务端 HTTP dispatcher
|
|
151
|
+
```
|
|
@@ -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
|
+
};
|