@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.
Files changed (503) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +46 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/diagnostics/build-diagnostics.json +6 -0
  5. package/.next/diagnostics/framework.json +1 -0
  6. package/.next/export-marker.json +6 -0
  7. package/.next/images-manifest.json +68 -0
  8. package/.next/next-minimal-server.js.nft.json +1 -0
  9. package/.next/next-server.js.nft.json +1 -0
  10. package/.next/package.json +1 -0
  11. package/.next/prerender-manifest.json +143 -0
  12. package/.next/react-loadable-manifest.json +2258 -0
  13. package/.next/required-server-files.js +349 -0
  14. package/.next/required-server-files.json +349 -0
  15. package/.next/routes-manifest.json +372 -0
  16. package/.next/server/app/_global-error/page.js +32 -0
  17. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  18. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  19. package/.next/server/app/_global-error.html +1 -0
  20. package/.next/server/app/_global-error.meta +16 -0
  21. package/.next/server/app/_global-error.rsc +14 -0
  22. package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
  23. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
  24. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  25. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  26. package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  27. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  28. package/.next/server/app/_not-found/page.js +2 -0
  29. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  30. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  31. package/.next/server/app/_not-found.html +1 -0
  32. package/.next/server/app/_not-found.meta +16 -0
  33. package/.next/server/app/_not-found.rsc +20 -0
  34. package/.next/server/app/_not-found.segments/_full.segment.rsc +20 -0
  35. package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  36. package/.next/server/app/_not-found.segments/_index.segment.rsc +7 -0
  37. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  38. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  39. package/.next/server/app/_not-found.segments/_tree.segment.rsc +5 -0
  40. package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -0
  41. package/.next/server/app/api/agent/[id]/bash-output/route.js.nft.json +1 -0
  42. package/.next/server/app/api/agent/[id]/bash-output/route_client-reference-manifest.js +1 -0
  43. package/.next/server/app/api/agent/[id]/events/route.js +3 -0
  44. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -0
  45. package/.next/server/app/api/agent/[id]/events/route_client-reference-manifest.js +1 -0
  46. package/.next/server/app/api/agent/[id]/route.js +1 -0
  47. package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -0
  48. package/.next/server/app/api/agent/[id]/route_client-reference-manifest.js +1 -0
  49. package/.next/server/app/api/agent/new/route.js +1 -0
  50. package/.next/server/app/api/agent/new/route.js.nft.json +1 -0
  51. package/.next/server/app/api/agent/new/route_client-reference-manifest.js +1 -0
  52. package/.next/server/app/api/agent/running/events/route.js +3 -0
  53. package/.next/server/app/api/agent/running/events/route.js.nft.json +1 -0
  54. package/.next/server/app/api/agent/running/events/route_client-reference-manifest.js +1 -0
  55. package/.next/server/app/api/agent/running/route.js +1 -0
  56. package/.next/server/app/api/agent/running/route.js.nft.json +1 -0
  57. package/.next/server/app/api/agent/running/route_client-reference-manifest.js +1 -0
  58. package/.next/server/app/api/auth/all-providers/route.js +1 -0
  59. package/.next/server/app/api/auth/all-providers/route.js.nft.json +1 -0
  60. package/.next/server/app/api/auth/all-providers/route_client-reference-manifest.js +1 -0
  61. package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -0
  62. package/.next/server/app/api/auth/api-key/[provider]/route.js.nft.json +1 -0
  63. package/.next/server/app/api/auth/api-key/[provider]/route_client-reference-manifest.js +1 -0
  64. package/.next/server/app/api/auth/login/[provider]/route.js +3 -0
  65. package/.next/server/app/api/auth/login/[provider]/route.js.nft.json +1 -0
  66. package/.next/server/app/api/auth/login/[provider]/route_client-reference-manifest.js +1 -0
  67. package/.next/server/app/api/auth/logout/[provider]/route.js +1 -0
  68. package/.next/server/app/api/auth/logout/[provider]/route.js.nft.json +1 -0
  69. package/.next/server/app/api/auth/logout/[provider]/route_client-reference-manifest.js +1 -0
  70. package/.next/server/app/api/auth/providers/route.js +1 -0
  71. package/.next/server/app/api/auth/providers/route.js.nft.json +1 -0
  72. package/.next/server/app/api/auth/providers/route_client-reference-manifest.js +1 -0
  73. package/.next/server/app/api/cwd/browse/route.js +1 -0
  74. package/.next/server/app/api/cwd/browse/route.js.nft.json +1 -0
  75. package/.next/server/app/api/cwd/browse/route_client-reference-manifest.js +1 -0
  76. package/.next/server/app/api/cwd/validate/route.js +1 -0
  77. package/.next/server/app/api/cwd/validate/route.js.nft.json +1 -0
  78. package/.next/server/app/api/cwd/validate/route_client-reference-manifest.js +1 -0
  79. package/.next/server/app/api/default-cwd/route.js +1 -0
  80. package/.next/server/app/api/default-cwd/route.js.nft.json +1 -0
  81. package/.next/server/app/api/default-cwd/route_client-reference-manifest.js +1 -0
  82. package/.next/server/app/api/file-index/route.js +1 -0
  83. package/.next/server/app/api/file-index/route.js.nft.json +1 -0
  84. package/.next/server/app/api/file-index/route_client-reference-manifest.js +1 -0
  85. package/.next/server/app/api/files/[...path]/route.js +49 -0
  86. package/.next/server/app/api/files/[...path]/route.js.nft.json +1 -0
  87. package/.next/server/app/api/files/[...path]/route_client-reference-manifest.js +1 -0
  88. package/.next/server/app/api/git/diff/route.js +6 -0
  89. package/.next/server/app/api/git/diff/route.js.nft.json +1 -0
  90. package/.next/server/app/api/git/diff/route_client-reference-manifest.js +1 -0
  91. package/.next/server/app/api/git/status/route.js +6 -0
  92. package/.next/server/app/api/git/status/route.js.nft.json +1 -0
  93. package/.next/server/app/api/git/status/route_client-reference-manifest.js +1 -0
  94. package/.next/server/app/api/home/route.js +1 -0
  95. package/.next/server/app/api/home/route.js.nft.json +1 -0
  96. package/.next/server/app/api/home/route_client-reference-manifest.js +1 -0
  97. package/.next/server/app/api/models/route.js +1 -0
  98. package/.next/server/app/api/models/route.js.nft.json +1 -0
  99. package/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
  100. package/.next/server/app/api/models-config/catalog/route.js +1 -0
  101. package/.next/server/app/api/models-config/catalog/route.js.nft.json +1 -0
  102. package/.next/server/app/api/models-config/catalog/route_client-reference-manifest.js +1 -0
  103. package/.next/server/app/api/models-config/discover/route.js +1 -0
  104. package/.next/server/app/api/models-config/discover/route.js.nft.json +1 -0
  105. package/.next/server/app/api/models-config/discover/route_client-reference-manifest.js +1 -0
  106. package/.next/server/app/api/models-config/route.js +1 -0
  107. package/.next/server/app/api/models-config/route.js.nft.json +1 -0
  108. package/.next/server/app/api/models-config/route_client-reference-manifest.js +1 -0
  109. package/.next/server/app/api/models-config/test/route.js +1 -0
  110. package/.next/server/app/api/models-config/test/route.js.nft.json +1 -0
  111. package/.next/server/app/api/models-config/test/route_client-reference-manifest.js +1 -0
  112. package/.next/server/app/api/plugins/route.js +1 -0
  113. package/.next/server/app/api/plugins/route.js.nft.json +1 -0
  114. package/.next/server/app/api/plugins/route_client-reference-manifest.js +1 -0
  115. package/.next/server/app/api/project-trust/route.js +1 -0
  116. package/.next/server/app/api/project-trust/route.js.nft.json +1 -0
  117. package/.next/server/app/api/project-trust/route_client-reference-manifest.js +1 -0
  118. package/.next/server/app/api/sessions/[id]/auto-name/route.js +10 -0
  119. package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -0
  120. package/.next/server/app/api/sessions/[id]/auto-name/route_client-reference-manifest.js +1 -0
  121. package/.next/server/app/api/sessions/[id]/context/route.js +1 -0
  122. package/.next/server/app/api/sessions/[id]/context/route.js.nft.json +1 -0
  123. package/.next/server/app/api/sessions/[id]/context/route_client-reference-manifest.js +1 -0
  124. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -0
  125. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js.nft.json +1 -0
  126. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route_client-reference-manifest.js +1 -0
  127. package/.next/server/app/api/sessions/[id]/export/route.js +54 -0
  128. package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -0
  129. package/.next/server/app/api/sessions/[id]/export/route_client-reference-manifest.js +1 -0
  130. package/.next/server/app/api/sessions/[id]/route.js +1 -0
  131. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -0
  132. package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -0
  133. package/.next/server/app/api/sessions/[id]/state/route.js +1 -0
  134. package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -0
  135. package/.next/server/app/api/sessions/[id]/state/route_client-reference-manifest.js +1 -0
  136. package/.next/server/app/api/sessions/route.js +1 -0
  137. package/.next/server/app/api/sessions/route.js.nft.json +1 -0
  138. package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -0
  139. package/.next/server/app/api/skills/check/route.js +1 -0
  140. package/.next/server/app/api/skills/check/route.js.nft.json +1 -0
  141. package/.next/server/app/api/skills/check/route_client-reference-manifest.js +1 -0
  142. package/.next/server/app/api/skills/install/route.js +1 -0
  143. package/.next/server/app/api/skills/install/route.js.nft.json +1 -0
  144. package/.next/server/app/api/skills/install/route_client-reference-manifest.js +1 -0
  145. package/.next/server/app/api/skills/route.js +6 -0
  146. package/.next/server/app/api/skills/route.js.nft.json +1 -0
  147. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -0
  148. package/.next/server/app/api/skills/search/route.js +1 -0
  149. package/.next/server/app/api/skills/search/route.js.nft.json +1 -0
  150. package/.next/server/app/api/skills/search/route_client-reference-manifest.js +1 -0
  151. package/.next/server/app/api/skills/update/route.js +1 -0
  152. package/.next/server/app/api/skills/update/route.js.nft.json +1 -0
  153. package/.next/server/app/api/skills/update/route_client-reference-manifest.js +1 -0
  154. package/.next/server/app/api/worktrees/route.js +1 -0
  155. package/.next/server/app/api/worktrees/route.js.nft.json +1 -0
  156. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -0
  157. package/.next/server/app/favicon.ico/route.js +1 -0
  158. package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  159. package/.next/server/app/favicon.ico.body +0 -0
  160. package/.next/server/app/favicon.ico.meta +1 -0
  161. package/.next/server/app/index.html +1 -0
  162. package/.next/server/app/index.meta +14 -0
  163. package/.next/server/app/index.rsc +21 -0
  164. package/.next/server/app/index.segments/__PAGE__.segment.rsc +8 -0
  165. package/.next/server/app/index.segments/_full.segment.rsc +21 -0
  166. package/.next/server/app/index.segments/_head.segment.rsc +6 -0
  167. package/.next/server/app/index.segments/_index.segment.rsc +7 -0
  168. package/.next/server/app/index.segments/_tree.segment.rsc +6 -0
  169. package/.next/server/app/manifest.webmanifest/route.js +16 -0
  170. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
  171. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -0
  172. package/.next/server/app/manifest.webmanifest.body +1 -0
  173. package/.next/server/app/manifest.webmanifest.meta +1 -0
  174. package/.next/server/app/page.js +73 -0
  175. package/.next/server/app/page.js.nft.json +1 -0
  176. package/.next/server/app/page_client-reference-manifest.js +1 -0
  177. package/.next/server/app-paths-manifest.json +46 -0
  178. package/.next/server/chunks/1030.js +1 -0
  179. package/.next/server/chunks/1048.js +1 -0
  180. package/.next/server/chunks/1198.js +5 -0
  181. package/.next/server/chunks/123.js +79 -0
  182. package/.next/server/chunks/1309.js +14 -0
  183. package/.next/server/chunks/165.js +1 -0
  184. package/.next/server/chunks/1813.js +1 -0
  185. package/.next/server/chunks/2055.js +1 -0
  186. package/.next/server/chunks/2325.js +80 -0
  187. package/.next/server/chunks/2349.js +1 -0
  188. package/.next/server/chunks/258.js +1 -0
  189. package/.next/server/chunks/2715.js +1 -0
  190. package/.next/server/chunks/2778.js +1 -0
  191. package/.next/server/chunks/2943.js +1 -0
  192. package/.next/server/chunks/3000.js +4 -0
  193. package/.next/server/chunks/3052.js +1 -0
  194. package/.next/server/chunks/3054.js +148 -0
  195. package/.next/server/chunks/3181.js +1 -0
  196. package/.next/server/chunks/319.js +45 -0
  197. package/.next/server/chunks/3379.js +1 -0
  198. package/.next/server/chunks/3397.js +29 -0
  199. package/.next/server/chunks/358.js +19 -0
  200. package/.next/server/chunks/3672.js +1 -0
  201. package/.next/server/chunks/3818.js +1 -0
  202. package/.next/server/chunks/4120.js +148 -0
  203. package/.next/server/chunks/4266.js +1 -0
  204. package/.next/server/chunks/4365.js +43 -0
  205. package/.next/server/chunks/4407.js +23 -0
  206. package/.next/server/chunks/4741.js +20 -0
  207. package/.next/server/chunks/4768.js +80 -0
  208. package/.next/server/chunks/4893.js +1 -0
  209. package/.next/server/chunks/5409.js +1 -0
  210. package/.next/server/chunks/5414.js +1 -0
  211. package/.next/server/chunks/5460.js +255 -0
  212. package/.next/server/chunks/5582.js +3 -0
  213. package/.next/server/chunks/5737.js +24 -0
  214. package/.next/server/chunks/5773.js +104 -0
  215. package/.next/server/chunks/5985.js +24 -0
  216. package/.next/server/chunks/6073.js +64 -0
  217. package/.next/server/chunks/6346.js +1 -0
  218. package/.next/server/chunks/6429.js +1 -0
  219. package/.next/server/chunks/6900.js +90 -0
  220. package/.next/server/chunks/6953.js +1 -0
  221. package/.next/server/chunks/7058.js +166 -0
  222. package/.next/server/chunks/7162.js +287 -0
  223. package/.next/server/chunks/7287.js +141 -0
  224. package/.next/server/chunks/7307.js +1 -0
  225. package/.next/server/chunks/7424.js +4 -0
  226. package/.next/server/chunks/7635.js +1 -0
  227. package/.next/server/chunks/7702.js +93 -0
  228. package/.next/server/chunks/7960.js +1 -0
  229. package/.next/server/chunks/812.js +226 -0
  230. package/.next/server/chunks/8276.js +1 -0
  231. package/.next/server/chunks/8360.js +36 -0
  232. package/.next/server/chunks/8361.js +1 -0
  233. package/.next/server/chunks/8430.js +1 -0
  234. package/.next/server/chunks/8469.js +9 -0
  235. package/.next/server/chunks/8490.js +1 -0
  236. package/.next/server/chunks/8704.js +115 -0
  237. package/.next/server/chunks/9703.js +215 -0
  238. package/.next/server/chunks/974.js +1 -0
  239. package/.next/server/chunks/9963.js +1 -0
  240. package/.next/server/chunks/static/media/macos-trash.6c01a2a6 +0 -0
  241. package/.next/server/chunks/static/media/windows-trash.2b7fe177.exe +0 -0
  242. package/.next/server/functions-config-manifest.json +19 -0
  243. package/.next/server/instrumentation.js +1 -0
  244. package/.next/server/instrumentation.js.nft.json +1 -0
  245. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  246. package/.next/server/middleware-build-manifest.js +1 -0
  247. package/.next/server/middleware-manifest.json +6 -0
  248. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  249. package/.next/server/middleware.js +18 -0
  250. package/.next/server/middleware.js.nft.json +1 -0
  251. package/.next/server/next-font-manifest.js +1 -0
  252. package/.next/server/next-font-manifest.json +1 -0
  253. package/.next/server/pages/404.html +1 -0
  254. package/.next/server/pages/500.html +1 -0
  255. package/.next/server/pages-manifest.json +4 -0
  256. package/.next/server/prefetch-hints.json +1 -0
  257. package/.next/server/server-reference-manifest.js +1 -0
  258. package/.next/server/server-reference-manifest.json +1 -0
  259. package/.next/server/webpack-runtime.js +1 -0
  260. package/.next/static/JpAkqjRvCHtp3M_ChE6_B/_buildManifest.js +1 -0
  261. package/.next/static/JpAkqjRvCHtp3M_ChE6_B/_ssgManifest.js +1 -0
  262. package/.next/static/chunks/122.eef9274869d2a305.js +287 -0
  263. package/.next/static/chunks/1407.28a7fb037c2b2f35.js +43 -0
  264. package/.next/static/chunks/164.ab76942aa0c3ec72.js +1 -0
  265. package/.next/static/chunks/1744.78ed01e4e93054c1.js +93 -0
  266. package/.next/static/chunks/1812.9d1e5ae0d68e6c24.js +76 -0
  267. package/.next/static/chunks/1921.2c58179657f0a6da.js +90 -0
  268. package/.next/static/chunks/1978.260c2b48f817965f.js +1 -0
  269. package/.next/static/chunks/2082.1535d602444ae4c1.js +1 -0
  270. package/.next/static/chunks/288.d969aeba2ab92928.js +1 -0
  271. package/.next/static/chunks/318.3fee3527eeabc956.js +4 -0
  272. package/.next/static/chunks/330.f851561e21edfbbb.js +19 -0
  273. package/.next/static/chunks/348d3b01.d472dd6bc52ab90c.js +148 -0
  274. package/.next/static/chunks/3762.d5c709991fc322ef.js +148 -0
  275. package/.next/static/chunks/3794-1b03b52e3112452e.js +32 -0
  276. package/.next/static/chunks/3916.0ba385e8bbb9cc14.js +1 -0
  277. package/.next/static/chunks/4021.cdd3c8f1def79a10.js +1 -0
  278. package/.next/static/chunks/4178.0212bbaaa6124460.js +115 -0
  279. package/.next/static/chunks/4389.18c637d4861a0624.js +215 -0
  280. package/.next/static/chunks/4823.276e9524d3742f1c.js +141 -0
  281. package/.next/static/chunks/4829.cf1d50e43e6d9db5.js +1 -0
  282. package/.next/static/chunks/4bd1b696-e356ca5ba0218e27.js +1 -0
  283. package/.next/static/chunks/5019.b5a1a2b8daf17525.js +1 -0
  284. package/.next/static/chunks/5326.69460442bdcd6cd3.js +1 -0
  285. package/.next/static/chunks/5336.d3fa82872c826f30.js +79 -0
  286. package/.next/static/chunks/5590.ef62922166d308b4.js +1 -0
  287. package/.next/static/chunks/5627.62050808924cacee.js +23 -0
  288. package/.next/static/chunks/5690.9d6eb1edb1399995.js +1 -0
  289. package/.next/static/chunks/58bb9007.3ddd5d34c5f548be.js +80 -0
  290. package/.next/static/chunks/6071.e9deb627fefd3a20.js +104 -0
  291. package/.next/static/chunks/6600.583c88eef37aa524.js +1 -0
  292. package/.next/static/chunks/6710.5b0cfa12a8f68eb9.js +36 -0
  293. package/.next/static/chunks/744.e67714b764b7bed0.js +166 -0
  294. package/.next/static/chunks/7478.c2572eb272c8f7ac.js +80 -0
  295. package/.next/static/chunks/75.70c23d2729f4ae2c.js +9 -0
  296. package/.next/static/chunks/7563.d8fbeed6a250a962.js +64 -0
  297. package/.next/static/chunks/7704.a79a089b1c6a8099.js +5 -0
  298. package/.next/static/chunks/7874.8db6929b94cdf697.js +1 -0
  299. package/.next/static/chunks/7948.aca281219bad1ab4.js +1 -0
  300. package/.next/static/chunks/8311-95813758da2b283c.js +1 -0
  301. package/.next/static/chunks/8538.9462238529bbdc80.js +226 -0
  302. package/.next/static/chunks/8568.f85d8b36fc9a9037.js +1 -0
  303. package/.next/static/chunks/8603.7619d9ceac35ae03.js +1 -0
  304. package/.next/static/chunks/8783.8586d8ca9ef1dce8.js +24 -0
  305. package/.next/static/chunks/8863.bd7e87f75e046db5.js +1 -0
  306. package/.next/static/chunks/8889.1ed3f1aa3ac49dd9.js +29 -0
  307. package/.next/static/chunks/895.a198d303969f1c01.js +24 -0
  308. package/.next/static/chunks/90542734.b75ad0df50bf68f5.js +1 -0
  309. package/.next/static/chunks/9242.a1894a4c754b979d.js +1 -0
  310. package/.next/static/chunks/9471.a7e240888c3a75bc.js +1 -0
  311. package/.next/static/chunks/9500.1488aec06ee78127.js +1 -0
  312. package/.next/static/chunks/9529.438891449b77abc7.js +1 -0
  313. package/.next/static/chunks/9633.155548b5fca6e580.js +1 -0
  314. package/.next/static/chunks/9779.673004a62d70e36a.js +1 -0
  315. package/.next/static/chunks/app/_global-error/page-35860f4efe0047e5.js +1 -0
  316. package/.next/static/chunks/app/_not-found/page-ccc1f1aeb5ecc593.js +1 -0
  317. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-35860f4efe0047e5.js +1 -0
  318. package/.next/static/chunks/app/api/agent/[id]/events/route-35860f4efe0047e5.js +1 -0
  319. package/.next/static/chunks/app/api/agent/[id]/route-35860f4efe0047e5.js +1 -0
  320. package/.next/static/chunks/app/api/agent/new/route-35860f4efe0047e5.js +1 -0
  321. package/.next/static/chunks/app/api/agent/running/events/route-35860f4efe0047e5.js +1 -0
  322. package/.next/static/chunks/app/api/agent/running/route-35860f4efe0047e5.js +1 -0
  323. package/.next/static/chunks/app/api/auth/all-providers/route-35860f4efe0047e5.js +1 -0
  324. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-35860f4efe0047e5.js +1 -0
  325. package/.next/static/chunks/app/api/auth/login/[provider]/route-35860f4efe0047e5.js +1 -0
  326. package/.next/static/chunks/app/api/auth/logout/[provider]/route-35860f4efe0047e5.js +1 -0
  327. package/.next/static/chunks/app/api/auth/providers/route-35860f4efe0047e5.js +1 -0
  328. package/.next/static/chunks/app/api/cwd/browse/route-35860f4efe0047e5.js +1 -0
  329. package/.next/static/chunks/app/api/cwd/validate/route-35860f4efe0047e5.js +1 -0
  330. package/.next/static/chunks/app/api/default-cwd/route-35860f4efe0047e5.js +1 -0
  331. package/.next/static/chunks/app/api/file-index/route-35860f4efe0047e5.js +1 -0
  332. package/.next/static/chunks/app/api/files/[...path]/route-35860f4efe0047e5.js +1 -0
  333. package/.next/static/chunks/app/api/git/diff/route-35860f4efe0047e5.js +1 -0
  334. package/.next/static/chunks/app/api/git/status/route-35860f4efe0047e5.js +1 -0
  335. package/.next/static/chunks/app/api/home/route-35860f4efe0047e5.js +1 -0
  336. package/.next/static/chunks/app/api/models/route-35860f4efe0047e5.js +1 -0
  337. package/.next/static/chunks/app/api/models-config/catalog/route-35860f4efe0047e5.js +1 -0
  338. package/.next/static/chunks/app/api/models-config/discover/route-35860f4efe0047e5.js +1 -0
  339. package/.next/static/chunks/app/api/models-config/route-35860f4efe0047e5.js +1 -0
  340. package/.next/static/chunks/app/api/models-config/test/route-35860f4efe0047e5.js +1 -0
  341. package/.next/static/chunks/app/api/plugins/route-35860f4efe0047e5.js +1 -0
  342. package/.next/static/chunks/app/api/project-trust/route-35860f4efe0047e5.js +1 -0
  343. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-35860f4efe0047e5.js +1 -0
  344. package/.next/static/chunks/app/api/sessions/[id]/context/route-35860f4efe0047e5.js +1 -0
  345. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-35860f4efe0047e5.js +1 -0
  346. package/.next/static/chunks/app/api/sessions/[id]/export/route-35860f4efe0047e5.js +1 -0
  347. package/.next/static/chunks/app/api/sessions/[id]/route-35860f4efe0047e5.js +1 -0
  348. package/.next/static/chunks/app/api/sessions/[id]/state/route-35860f4efe0047e5.js +1 -0
  349. package/.next/static/chunks/app/api/sessions/route-35860f4efe0047e5.js +1 -0
  350. package/.next/static/chunks/app/api/skills/check/route-35860f4efe0047e5.js +1 -0
  351. package/.next/static/chunks/app/api/skills/install/route-35860f4efe0047e5.js +1 -0
  352. package/.next/static/chunks/app/api/skills/route-35860f4efe0047e5.js +1 -0
  353. package/.next/static/chunks/app/api/skills/search/route-35860f4efe0047e5.js +1 -0
  354. package/.next/static/chunks/app/api/skills/update/route-35860f4efe0047e5.js +1 -0
  355. package/.next/static/chunks/app/api/worktrees/route-35860f4efe0047e5.js +1 -0
  356. package/.next/static/chunks/app/layout-ca97634a96114a03.js +1 -0
  357. package/.next/static/chunks/app/manifest.webmanifest/route-35860f4efe0047e5.js +1 -0
  358. package/.next/static/chunks/app/page-4be55877df86a39c.js +72 -0
  359. package/.next/static/chunks/c9a5f755.309e1bea31640a4c.js +119 -0
  360. package/.next/static/chunks/d3ac728e-7964f816a1ca64e5.js +1 -0
  361. package/.next/static/chunks/f2098590.3d4ddddc296bb3a1.js +62 -0
  362. package/.next/static/chunks/framework-711ef29bc66f648c.js +1 -0
  363. package/.next/static/chunks/main-a787264d62ebe041.js +5 -0
  364. package/.next/static/chunks/main-app-44b3ecb27de577ad.js +1 -0
  365. package/.next/static/chunks/next/dist/client/components/builtin/app-error-35860f4efe0047e5.js +1 -0
  366. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-35860f4efe0047e5.js +1 -0
  367. package/.next/static/chunks/next/dist/client/components/builtin/global-error-0ed2693ee1341146.js +1 -0
  368. package/.next/static/chunks/next/dist/client/components/builtin/not-found-35860f4efe0047e5.js +1 -0
  369. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-35860f4efe0047e5.js +1 -0
  370. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  371. package/.next/static/chunks/webpack-35ab8665f48061d4.js +1 -0
  372. package/.next/static/css/03c139a692325b4b.css +1 -0
  373. package/.next/static/css/121a2cf33104c046.css +1 -0
  374. package/.next/static/css/88714c00e109ce28.css +1 -0
  375. package/.next/static/media/15605e25b523335c-s.woff2 +0 -0
  376. package/.next/static/media/1a3dce5cfb5f7760-s.woff2 +0 -0
  377. package/.next/static/media/1cdd02902f937a18-s.woff2 +0 -0
  378. package/.next/static/media/4c4b3b30b6bcb2be-s.woff2 +0 -0
  379. package/.next/static/media/641a7b8a5800ee0e-s.woff2 +0 -0
  380. package/.next/static/media/7deddc85b7ffd1dc-s.p.woff2 +0 -0
  381. package/.next/static/media/KaTeX_AMS-Regular.1608a09b.woff +0 -0
  382. package/.next/static/media/KaTeX_AMS-Regular.4aafdb68.ttf +0 -0
  383. package/.next/static/media/KaTeX_AMS-Regular.a79f1c31.woff2 +0 -0
  384. package/.next/static/media/KaTeX_Caligraphic-Bold.b6770918.woff +0 -0
  385. package/.next/static/media/KaTeX_Caligraphic-Bold.cce5b8ec.ttf +0 -0
  386. package/.next/static/media/KaTeX_Caligraphic-Bold.ec17d132.woff2 +0 -0
  387. package/.next/static/media/KaTeX_Caligraphic-Regular.07ef19e7.ttf +0 -0
  388. package/.next/static/media/KaTeX_Caligraphic-Regular.55fac258.woff2 +0 -0
  389. package/.next/static/media/KaTeX_Caligraphic-Regular.dad44a7f.woff +0 -0
  390. package/.next/static/media/KaTeX_Fraktur-Bold.9f256b85.woff +0 -0
  391. package/.next/static/media/KaTeX_Fraktur-Bold.b18f59e1.ttf +0 -0
  392. package/.next/static/media/KaTeX_Fraktur-Bold.d42a5579.woff2 +0 -0
  393. package/.next/static/media/KaTeX_Fraktur-Regular.7c187121.woff +0 -0
  394. package/.next/static/media/KaTeX_Fraktur-Regular.d3c882a6.woff2 +0 -0
  395. package/.next/static/media/KaTeX_Fraktur-Regular.ed38e79f.ttf +0 -0
  396. package/.next/static/media/KaTeX_Main-Bold.b74a1a8b.ttf +0 -0
  397. package/.next/static/media/KaTeX_Main-Bold.c3fb5ac2.woff2 +0 -0
  398. package/.next/static/media/KaTeX_Main-Bold.d181c465.woff +0 -0
  399. package/.next/static/media/KaTeX_Main-BoldItalic.6f2bb1df.woff2 +0 -0
  400. package/.next/static/media/KaTeX_Main-BoldItalic.70d8b0a5.ttf +0 -0
  401. package/.next/static/media/KaTeX_Main-BoldItalic.e3f82f9d.woff +0 -0
  402. package/.next/static/media/KaTeX_Main-Italic.47373d1e.ttf +0 -0
  403. package/.next/static/media/KaTeX_Main-Italic.8916142b.woff2 +0 -0
  404. package/.next/static/media/KaTeX_Main-Italic.9024d815.woff +0 -0
  405. package/.next/static/media/KaTeX_Main-Regular.0462f03b.woff2 +0 -0
  406. package/.next/static/media/KaTeX_Main-Regular.7f51fe03.woff +0 -0
  407. package/.next/static/media/KaTeX_Main-Regular.b7f8fe9b.ttf +0 -0
  408. package/.next/static/media/KaTeX_Math-BoldItalic.572d331f.woff2 +0 -0
  409. package/.next/static/media/KaTeX_Math-BoldItalic.a879cf83.ttf +0 -0
  410. package/.next/static/media/KaTeX_Math-BoldItalic.f1035d8d.woff +0 -0
  411. package/.next/static/media/KaTeX_Math-Italic.5295ba48.woff +0 -0
  412. package/.next/static/media/KaTeX_Math-Italic.939bc644.ttf +0 -0
  413. package/.next/static/media/KaTeX_Math-Italic.f28c23ac.woff2 +0 -0
  414. package/.next/static/media/KaTeX_SansSerif-Bold.8c5b5494.woff2 +0 -0
  415. package/.next/static/media/KaTeX_SansSerif-Bold.94e1e8dc.ttf +0 -0
  416. package/.next/static/media/KaTeX_SansSerif-Bold.bf59d231.woff +0 -0
  417. package/.next/static/media/KaTeX_SansSerif-Italic.3b1e59b3.woff2 +0 -0
  418. package/.next/static/media/KaTeX_SansSerif-Italic.7c9bc82b.woff +0 -0
  419. package/.next/static/media/KaTeX_SansSerif-Italic.b4c20c84.ttf +0 -0
  420. package/.next/static/media/KaTeX_SansSerif-Regular.74048478.woff +0 -0
  421. package/.next/static/media/KaTeX_SansSerif-Regular.ba21ed5f.woff2 +0 -0
  422. package/.next/static/media/KaTeX_SansSerif-Regular.d4d7ba48.ttf +0 -0
  423. package/.next/static/media/KaTeX_Script-Regular.03e9641d.woff2 +0 -0
  424. package/.next/static/media/KaTeX_Script-Regular.07505710.woff +0 -0
  425. package/.next/static/media/KaTeX_Script-Regular.fe9cbbe1.ttf +0 -0
  426. package/.next/static/media/KaTeX_Size1-Regular.e1e279cb.woff +0 -0
  427. package/.next/static/media/KaTeX_Size1-Regular.eae34984.woff2 +0 -0
  428. package/.next/static/media/KaTeX_Size1-Regular.fabc004a.ttf +0 -0
  429. package/.next/static/media/KaTeX_Size2-Regular.57727022.woff +0 -0
  430. package/.next/static/media/KaTeX_Size2-Regular.5916a24f.woff2 +0 -0
  431. package/.next/static/media/KaTeX_Size2-Regular.d6b476ec.ttf +0 -0
  432. package/.next/static/media/KaTeX_Size3-Regular.9acaf01c.woff +0 -0
  433. package/.next/static/media/KaTeX_Size3-Regular.a144ef58.ttf +0 -0
  434. package/.next/static/media/KaTeX_Size3-Regular.b4230e7e.woff2 +0 -0
  435. package/.next/static/media/KaTeX_Size4-Regular.10d95fd3.woff2 +0 -0
  436. package/.next/static/media/KaTeX_Size4-Regular.7a996c9d.woff +0 -0
  437. package/.next/static/media/KaTeX_Size4-Regular.fbccdabe.ttf +0 -0
  438. package/.next/static/media/KaTeX_Typewriter-Regular.6258592b.woff +0 -0
  439. package/.next/static/media/KaTeX_Typewriter-Regular.a8709e36.woff2 +0 -0
  440. package/.next/static/media/KaTeX_Typewriter-Regular.d97aaf4a.ttf +0 -0
  441. package/.next/static/media/ec14413c594b3356-s.p.woff2 +0 -0
  442. package/.next/trace +37 -0
  443. package/.next/trace-build +1 -0
  444. package/.next/types/app/api/agent/[id]/bash-output/route.ts +351 -0
  445. package/.next/types/app/api/agent/[id]/events/route.ts +351 -0
  446. package/.next/types/app/api/agent/[id]/route.ts +351 -0
  447. package/.next/types/app/api/agent/new/route.ts +351 -0
  448. package/.next/types/app/api/agent/running/events/route.ts +351 -0
  449. package/.next/types/app/api/agent/running/route.ts +351 -0
  450. package/.next/types/app/api/auth/all-providers/route.ts +351 -0
  451. package/.next/types/app/api/auth/api-key/[provider]/route.ts +351 -0
  452. package/.next/types/app/api/auth/login/[provider]/route.ts +351 -0
  453. package/.next/types/app/api/auth/logout/[provider]/route.ts +351 -0
  454. package/.next/types/app/api/auth/providers/route.ts +351 -0
  455. package/.next/types/app/api/cwd/browse/route.ts +351 -0
  456. package/.next/types/app/api/cwd/validate/route.ts +351 -0
  457. package/.next/types/app/api/default-cwd/route.ts +351 -0
  458. package/.next/types/app/api/file-index/route.ts +351 -0
  459. package/.next/types/app/api/files/[...path]/route.ts +351 -0
  460. package/.next/types/app/api/git/diff/route.ts +351 -0
  461. package/.next/types/app/api/git/status/route.ts +351 -0
  462. package/.next/types/app/api/home/route.ts +351 -0
  463. package/.next/types/app/api/models/route.ts +351 -0
  464. package/.next/types/app/api/models-config/catalog/route.ts +351 -0
  465. package/.next/types/app/api/models-config/discover/route.ts +351 -0
  466. package/.next/types/app/api/models-config/route.ts +351 -0
  467. package/.next/types/app/api/models-config/test/route.ts +351 -0
  468. package/.next/types/app/api/plugins/route.ts +351 -0
  469. package/.next/types/app/api/project-trust/route.ts +351 -0
  470. package/.next/types/app/api/sessions/[id]/auto-name/route.ts +351 -0
  471. package/.next/types/app/api/sessions/[id]/context/route.ts +351 -0
  472. package/.next/types/app/api/sessions/[id]/entries/[entryId]/thinking/route.ts +351 -0
  473. package/.next/types/app/api/sessions/[id]/export/route.ts +351 -0
  474. package/.next/types/app/api/sessions/[id]/route.ts +351 -0
  475. package/.next/types/app/api/sessions/[id]/state/route.ts +351 -0
  476. package/.next/types/app/api/sessions/route.ts +351 -0
  477. package/.next/types/app/api/skills/check/route.ts +351 -0
  478. package/.next/types/app/api/skills/install/route.ts +351 -0
  479. package/.next/types/app/api/skills/route.ts +351 -0
  480. package/.next/types/app/api/skills/search/route.ts +351 -0
  481. package/.next/types/app/api/skills/update/route.ts +351 -0
  482. package/.next/types/app/api/worktrees/route.ts +351 -0
  483. package/.next/types/app/layout.ts +87 -0
  484. package/.next/types/app/page.ts +87 -0
  485. package/.next/types/cache-life.d.ts +145 -0
  486. package/.next/types/package.json +1 -0
  487. package/.next/types/routes.d.ts +111 -0
  488. package/.next/types/validator.ts +421 -0
  489. package/LICENSE +21 -0
  490. package/README.ja.md +150 -0
  491. package/README.md +155 -0
  492. package/README.ru.md +155 -0
  493. package/README.zh-CN.md +151 -0
  494. package/bin/node-version.js +35 -0
  495. package/bin/pi-web-options.js +30 -0
  496. package/bin/pi-web.js +96 -0
  497. package/next.config.ts +50 -0
  498. package/package.json +79 -0
  499. package/public/icons/apple-touch-icon.png +0 -0
  500. package/public/icons/icon-192.png +0 -0
  501. package/public/icons/icon-512.png +0 -0
  502. package/public/offline.html +83 -0
  503. 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
+ ![Pi Web では、CLI と同じ pi セッションを、構造化された Markdown、ツール呼び出し、プロジェクトナビゲーションとともに表示できます](https://raw.githubusercontent.com/agegr/pi-web/main/docs/screenshot2.png)
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
+ ![Pi Web shows the same pi session with structured Markdown, tool calls, and project navigation beside the CLI](https://raw.githubusercontent.com/agegr/pi-web/main/docs/screenshot2.png)
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
+ ![Pi Web показывает одну и ту же сессию pi рядом с CLI: структурированный Markdown, вызовы инструментов и навигация по проекту](https://raw.githubusercontent.com/agegr/pi-web/main/docs/screenshot2.png)
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
+ ```
@@ -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
+ };