@qt4798/pi-web 0.9.17-beta.1 → 0.9.17-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +5 -4
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/required-server-files.js +1 -1
  5. package/.next/required-server-files.json +1 -1
  6. package/.next/routes-manifest.json +6 -0
  7. package/.next/server/app/_global-error/page.js +3 -3
  8. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/.next/server/app/_not-found/page.js +2 -2
  18. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/.next/server/app/_not-found.html +1 -1
  20. package/.next/server/app/_not-found.rsc +2 -2
  21. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  23. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  24. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  25. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  26. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  27. package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
  28. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  29. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
  30. package/.next/server/app/api/agent/[id]/route.js +1 -1
  31. package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
  32. package/.next/server/app/api/agent/new/route.js +1 -1
  33. package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
  34. package/.next/server/app/api/agent/running/route.js +1 -1
  35. package/.next/server/app/api/agent/running/route.js.nft.json +1 -1
  36. package/.next/server/app/api/auth/all-providers/route.js +1 -1
  37. package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
  38. package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
  39. package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
  40. package/.next/server/app/api/auth/providers/route.js +1 -1
  41. package/.next/server/app/api/backup/export/route.js +1 -1
  42. package/.next/server/app/api/backup/import/route.js +1 -1
  43. package/.next/server/app/api/cwd/browse/route.js +1 -1
  44. package/.next/server/app/api/cwd/validate/route.js +1 -1
  45. package/.next/server/app/api/default-cwd/route.js +1 -1
  46. package/.next/server/app/api/features/route.js +1 -1
  47. package/.next/server/app/api/features/route.js.nft.json +1 -1
  48. package/.next/server/app/api/file-index/route.js +1 -1
  49. package/.next/server/app/api/files/[...path]/route.js +1 -1
  50. package/.next/server/app/api/git/diff/route.js +1 -1
  51. package/.next/server/app/api/git/push/route.js +1 -1
  52. package/.next/server/app/api/git/stash/route.js +1 -1
  53. package/.next/server/app/api/git/status/route.js +2 -2
  54. package/.next/server/app/api/home/route.js +1 -1
  55. package/.next/server/app/api/import/discover/route.js +1 -1
  56. package/.next/server/app/api/import/execute/route.js +1 -1
  57. package/.next/server/app/api/import/status/route.js +1 -1
  58. package/.next/server/app/api/models/route.js +1 -1
  59. package/.next/server/app/api/models/route.js.nft.json +1 -1
  60. package/.next/server/app/api/models-config/builtin/route.js +1 -1
  61. package/.next/server/app/api/models-config/catalog/route.js +1 -1
  62. package/.next/server/app/api/models-config/discover/route.js +1 -1
  63. package/.next/server/app/api/models-config/route.js +1 -1
  64. package/.next/server/app/api/models-config/test/route.js +1 -1
  65. package/.next/server/app/api/models-config/test/route.js.nft.json +1 -1
  66. package/.next/server/app/api/modes/route.js +1 -0
  67. package/.next/server/app/api/modes/route.js.nft.json +1 -0
  68. package/.next/server/app/api/modes/route_client-reference-manifest.js +1 -0
  69. package/.next/server/app/api/plugins/route.js +1 -1
  70. package/.next/server/app/api/project-trust/route.js +1 -1
  71. package/.next/server/app/api/project-trust/route.js.nft.json +1 -1
  72. package/.next/server/app/api/proxy/route.js +1 -1
  73. package/.next/server/app/api/proxy/test/route.js +1 -1
  74. package/.next/server/app/api/sessions/[id]/auto-name/route.js +3 -3
  75. package/.next/server/app/api/sessions/[id]/auto-name/route.js.nft.json +1 -1
  76. package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
  77. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -1
  78. package/.next/server/app/api/sessions/[id]/export/route.js +2 -2
  79. package/.next/server/app/api/sessions/[id]/queue-recovery/route.js +1 -1
  80. package/.next/server/app/api/sessions/[id]/queue-recovery/route.js.nft.json +1 -1
  81. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  82. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  83. package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
  84. package/.next/server/app/api/sessions/[id]/state/route.js.nft.json +1 -1
  85. package/.next/server/app/api/sessions/route.js +1 -1
  86. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  87. package/.next/server/app/api/settings/title-model/route.js +1 -1
  88. package/.next/server/app/api/settings/title-model/route.js.nft.json +1 -1
  89. package/.next/server/app/api/skills/check/route.js +1 -1
  90. package/.next/server/app/api/skills/install/route.js +1 -1
  91. package/.next/server/app/api/skills/route.js +1 -1
  92. package/.next/server/app/api/skills/search/route.js +1 -1
  93. package/.next/server/app/api/skills/update/route.js +1 -1
  94. package/.next/server/app/api/tasks/[id]/[action]/route.js +1 -1
  95. package/.next/server/app/api/tasks/[id]/[action]/route.js.nft.json +1 -1
  96. package/.next/server/app/api/tasks/[id]/changed-files/route.js +2 -2
  97. package/.next/server/app/api/tasks/[id]/diff/route.js +2 -2
  98. package/.next/server/app/api/tasks/[id]/events/route.js +1 -1
  99. package/.next/server/app/api/tasks/[id]/route.js +1 -1
  100. package/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -1
  101. package/.next/server/app/api/tasks/batch/route.js +1 -1
  102. package/.next/server/app/api/tasks/batch/route.js.nft.json +1 -1
  103. package/.next/server/app/api/tasks/events/route.js +2 -2
  104. package/.next/server/app/api/tasks/events/route.js.nft.json +1 -1
  105. package/.next/server/app/api/tasks/route.js +1 -1
  106. package/.next/server/app/api/tasks/route.js.nft.json +1 -1
  107. package/.next/server/app/api/tasks/settings/route.js +1 -1
  108. package/.next/server/app/api/tasks/settings/route.js.nft.json +1 -1
  109. package/.next/server/app/api/tasks/templates/route.js +1 -1
  110. package/.next/server/app/api/themes/[name]/route.js +1 -1
  111. package/.next/server/app/api/themes/route.js +1 -1
  112. package/.next/server/app/api/usage/route.js +1 -1
  113. package/.next/server/app/api/worktrees/route.js +1 -1
  114. package/.next/server/app/icon.ico/route.js +1 -1
  115. package/.next/server/app/icon.png/route.js +1 -1
  116. package/.next/server/app/icon.svg/route.js +1 -1
  117. package/.next/server/app/index.html +1 -1
  118. package/.next/server/app/index.rsc +4 -4
  119. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  120. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  121. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  122. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  123. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  124. package/.next/server/app/page.js +35 -7
  125. package/.next/server/app/page_client-reference-manifest.js +1 -1
  126. package/.next/server/app-paths-manifest.json +5 -4
  127. package/.next/server/chunks/2349.js +2 -2
  128. package/.next/server/chunks/4253.js +2 -2
  129. package/.next/server/chunks/440.js +1 -1
  130. package/.next/server/chunks/4735.js +1 -0
  131. package/.next/server/chunks/5582.js +1 -1
  132. package/.next/server/chunks/6429.js +1 -1
  133. package/.next/server/chunks/7774.js +1 -1
  134. package/.next/server/chunks/7915.js +1 -1
  135. package/.next/server/instrumentation.js +1 -1
  136. package/.next/server/middleware-build-manifest.js +1 -1
  137. package/.next/server/pages/404.html +1 -1
  138. package/.next/server/pages/500.html +1 -1
  139. package/.next/static/chunks/6274-04455fad317a49e9.js +1 -0
  140. package/.next/static/chunks/app/{api/agent/[id]/route-fc8ab8f162e8d6f5.js → _global-error/page-3be1b7dbe464ad95.js} +1 -1
  141. package/.next/static/chunks/app/{_global-error/page-fc8ab8f162e8d6f5.js → api/agent/[id]/bash-output/route-3be1b7dbe464ad95.js} +1 -1
  142. package/.next/static/chunks/app/api/agent/[id]/{bash-output/route-fc8ab8f162e8d6f5.js → events/route-3be1b7dbe464ad95.js} +1 -1
  143. package/.next/static/chunks/app/api/agent/[id]/{events/route-fc8ab8f162e8d6f5.js → route-3be1b7dbe464ad95.js} +1 -1
  144. package/.next/static/chunks/app/api/agent/new/route-3be1b7dbe464ad95.js +1 -0
  145. package/.next/static/chunks/app/api/agent/running/route-3be1b7dbe464ad95.js +1 -0
  146. package/.next/static/chunks/app/api/auth/all-providers/route-3be1b7dbe464ad95.js +1 -0
  147. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-3be1b7dbe464ad95.js +1 -0
  148. package/.next/static/chunks/app/api/auth/login/[provider]/route-3be1b7dbe464ad95.js +1 -0
  149. package/.next/static/chunks/app/api/auth/logout/[provider]/route-3be1b7dbe464ad95.js +1 -0
  150. package/.next/static/chunks/app/api/auth/providers/route-3be1b7dbe464ad95.js +1 -0
  151. package/.next/static/chunks/app/api/backup/export/route-3be1b7dbe464ad95.js +1 -0
  152. package/.next/static/chunks/app/api/backup/import/route-3be1b7dbe464ad95.js +1 -0
  153. package/.next/static/chunks/app/api/cwd/browse/route-3be1b7dbe464ad95.js +1 -0
  154. package/.next/static/chunks/app/api/cwd/validate/route-3be1b7dbe464ad95.js +1 -0
  155. package/.next/static/chunks/app/api/default-cwd/route-3be1b7dbe464ad95.js +1 -0
  156. package/.next/static/chunks/app/api/features/route-3be1b7dbe464ad95.js +1 -0
  157. package/.next/static/chunks/app/api/file-index/route-3be1b7dbe464ad95.js +1 -0
  158. package/.next/static/chunks/app/api/files/[...path]/route-3be1b7dbe464ad95.js +1 -0
  159. package/.next/static/chunks/app/api/git/diff/route-3be1b7dbe464ad95.js +1 -0
  160. package/.next/static/chunks/app/api/git/push/route-3be1b7dbe464ad95.js +1 -0
  161. package/.next/static/chunks/app/api/git/stash/route-3be1b7dbe464ad95.js +1 -0
  162. package/.next/static/chunks/app/api/git/status/route-3be1b7dbe464ad95.js +1 -0
  163. package/.next/static/chunks/app/api/home/route-3be1b7dbe464ad95.js +1 -0
  164. package/.next/static/chunks/app/api/import/discover/route-3be1b7dbe464ad95.js +1 -0
  165. package/.next/static/chunks/app/api/import/execute/route-3be1b7dbe464ad95.js +1 -0
  166. package/.next/static/chunks/app/api/import/status/route-3be1b7dbe464ad95.js +1 -0
  167. package/.next/static/chunks/app/api/models/route-3be1b7dbe464ad95.js +1 -0
  168. package/.next/static/chunks/app/api/models-config/builtin/route-3be1b7dbe464ad95.js +1 -0
  169. package/.next/static/chunks/app/api/models-config/catalog/route-3be1b7dbe464ad95.js +1 -0
  170. package/.next/static/chunks/app/api/models-config/discover/route-3be1b7dbe464ad95.js +1 -0
  171. package/.next/static/chunks/app/api/models-config/route-3be1b7dbe464ad95.js +1 -0
  172. package/.next/static/chunks/app/api/models-config/test/route-3be1b7dbe464ad95.js +1 -0
  173. package/.next/static/chunks/app/api/modes/route-3be1b7dbe464ad95.js +1 -0
  174. package/.next/static/chunks/app/api/plugins/route-3be1b7dbe464ad95.js +1 -0
  175. package/.next/static/chunks/app/api/project-trust/route-3be1b7dbe464ad95.js +1 -0
  176. package/.next/static/chunks/app/api/proxy/route-3be1b7dbe464ad95.js +1 -0
  177. package/.next/static/chunks/app/api/proxy/test/route-3be1b7dbe464ad95.js +1 -0
  178. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-3be1b7dbe464ad95.js +1 -0
  179. package/.next/static/chunks/app/api/sessions/[id]/context/route-3be1b7dbe464ad95.js +1 -0
  180. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-3be1b7dbe464ad95.js +1 -0
  181. package/.next/static/chunks/app/api/sessions/[id]/export/route-3be1b7dbe464ad95.js +1 -0
  182. package/.next/static/chunks/app/api/sessions/[id]/queue-recovery/route-3be1b7dbe464ad95.js +1 -0
  183. package/.next/static/chunks/app/api/sessions/[id]/route-3be1b7dbe464ad95.js +1 -0
  184. package/.next/static/chunks/app/api/sessions/[id]/state/route-3be1b7dbe464ad95.js +1 -0
  185. package/.next/static/chunks/app/api/sessions/route-3be1b7dbe464ad95.js +1 -0
  186. package/.next/static/chunks/app/api/settings/title-model/route-3be1b7dbe464ad95.js +1 -0
  187. package/.next/static/chunks/app/api/skills/check/route-3be1b7dbe464ad95.js +1 -0
  188. package/.next/static/chunks/app/api/skills/install/route-3be1b7dbe464ad95.js +1 -0
  189. package/.next/static/chunks/app/api/skills/route-3be1b7dbe464ad95.js +1 -0
  190. package/.next/static/chunks/app/api/skills/search/route-3be1b7dbe464ad95.js +1 -0
  191. package/.next/static/chunks/app/api/skills/update/route-3be1b7dbe464ad95.js +1 -0
  192. package/.next/static/chunks/app/api/tasks/[id]/[action]/route-3be1b7dbe464ad95.js +1 -0
  193. package/.next/static/chunks/app/api/tasks/[id]/changed-files/route-3be1b7dbe464ad95.js +1 -0
  194. package/.next/static/chunks/app/api/tasks/[id]/diff/route-3be1b7dbe464ad95.js +1 -0
  195. package/.next/static/chunks/app/api/tasks/[id]/events/route-3be1b7dbe464ad95.js +1 -0
  196. package/.next/static/chunks/app/api/tasks/[id]/route-3be1b7dbe464ad95.js +1 -0
  197. package/.next/static/chunks/app/api/tasks/batch/route-3be1b7dbe464ad95.js +1 -0
  198. package/.next/static/chunks/app/api/tasks/events/route-3be1b7dbe464ad95.js +1 -0
  199. package/.next/static/chunks/app/api/tasks/route-3be1b7dbe464ad95.js +1 -0
  200. package/.next/static/chunks/app/api/tasks/settings/route-3be1b7dbe464ad95.js +1 -0
  201. package/.next/static/chunks/app/api/tasks/templates/route-3be1b7dbe464ad95.js +1 -0
  202. package/.next/static/chunks/app/api/themes/[name]/route-3be1b7dbe464ad95.js +1 -0
  203. package/.next/static/chunks/app/api/themes/route-3be1b7dbe464ad95.js +1 -0
  204. package/.next/static/chunks/app/api/usage/route-3be1b7dbe464ad95.js +1 -0
  205. package/.next/static/chunks/app/api/worktrees/route-3be1b7dbe464ad95.js +1 -0
  206. package/.next/static/chunks/app/page-35b0daa73a11f364.js +50 -0
  207. package/.next/static/chunks/next/dist/client/components/builtin/app-error-3be1b7dbe464ad95.js +1 -0
  208. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-3be1b7dbe464ad95.js +1 -0
  209. package/.next/static/chunks/next/dist/client/components/builtin/not-found-3be1b7dbe464ad95.js +1 -0
  210. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-3be1b7dbe464ad95.js +1 -0
  211. package/.next/static/css/288bff2da3ab1a4d.css +1 -0
  212. package/.next/static/lVkhyX-XEcFgvfYtDvmwH/_buildManifest.js +1 -0
  213. package/.next/trace +8 -8
  214. package/.next/trace-build +1 -1
  215. package/.next/types/app/api/modes/route.ts +351 -0
  216. package/.next/types/routes.d.ts +2 -1
  217. package/.next/types/validator.ts +9 -0
  218. package/README.en.md +46 -1
  219. package/README.md +38 -5
  220. package/bin/fix-pi-agent-undici.js +58 -43
  221. package/bin/pi-web.js +11 -0
  222. package/package.json +10 -12
  223. package/.next/static/chunks/8898-89d80b9022b54177.js +0 -1
  224. package/.next/static/chunks/app/api/agent/new/route-fc8ab8f162e8d6f5.js +0 -1
  225. package/.next/static/chunks/app/api/agent/running/route-fc8ab8f162e8d6f5.js +0 -1
  226. package/.next/static/chunks/app/api/auth/all-providers/route-fc8ab8f162e8d6f5.js +0 -1
  227. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-fc8ab8f162e8d6f5.js +0 -1
  228. package/.next/static/chunks/app/api/auth/login/[provider]/route-fc8ab8f162e8d6f5.js +0 -1
  229. package/.next/static/chunks/app/api/auth/logout/[provider]/route-fc8ab8f162e8d6f5.js +0 -1
  230. package/.next/static/chunks/app/api/auth/providers/route-fc8ab8f162e8d6f5.js +0 -1
  231. package/.next/static/chunks/app/api/backup/export/route-fc8ab8f162e8d6f5.js +0 -1
  232. package/.next/static/chunks/app/api/backup/import/route-fc8ab8f162e8d6f5.js +0 -1
  233. package/.next/static/chunks/app/api/cwd/browse/route-fc8ab8f162e8d6f5.js +0 -1
  234. package/.next/static/chunks/app/api/cwd/validate/route-fc8ab8f162e8d6f5.js +0 -1
  235. package/.next/static/chunks/app/api/default-cwd/route-fc8ab8f162e8d6f5.js +0 -1
  236. package/.next/static/chunks/app/api/features/route-fc8ab8f162e8d6f5.js +0 -1
  237. package/.next/static/chunks/app/api/file-index/route-fc8ab8f162e8d6f5.js +0 -1
  238. package/.next/static/chunks/app/api/files/[...path]/route-fc8ab8f162e8d6f5.js +0 -1
  239. package/.next/static/chunks/app/api/git/diff/route-fc8ab8f162e8d6f5.js +0 -1
  240. package/.next/static/chunks/app/api/git/push/route-fc8ab8f162e8d6f5.js +0 -1
  241. package/.next/static/chunks/app/api/git/stash/route-fc8ab8f162e8d6f5.js +0 -1
  242. package/.next/static/chunks/app/api/git/status/route-fc8ab8f162e8d6f5.js +0 -1
  243. package/.next/static/chunks/app/api/home/route-fc8ab8f162e8d6f5.js +0 -1
  244. package/.next/static/chunks/app/api/import/discover/route-fc8ab8f162e8d6f5.js +0 -1
  245. package/.next/static/chunks/app/api/import/execute/route-fc8ab8f162e8d6f5.js +0 -1
  246. package/.next/static/chunks/app/api/import/status/route-fc8ab8f162e8d6f5.js +0 -1
  247. package/.next/static/chunks/app/api/models/route-fc8ab8f162e8d6f5.js +0 -1
  248. package/.next/static/chunks/app/api/models-config/builtin/route-fc8ab8f162e8d6f5.js +0 -1
  249. package/.next/static/chunks/app/api/models-config/catalog/route-fc8ab8f162e8d6f5.js +0 -1
  250. package/.next/static/chunks/app/api/models-config/discover/route-fc8ab8f162e8d6f5.js +0 -1
  251. package/.next/static/chunks/app/api/models-config/route-fc8ab8f162e8d6f5.js +0 -1
  252. package/.next/static/chunks/app/api/models-config/test/route-fc8ab8f162e8d6f5.js +0 -1
  253. package/.next/static/chunks/app/api/plugins/route-fc8ab8f162e8d6f5.js +0 -1
  254. package/.next/static/chunks/app/api/project-trust/route-fc8ab8f162e8d6f5.js +0 -1
  255. package/.next/static/chunks/app/api/proxy/route-fc8ab8f162e8d6f5.js +0 -1
  256. package/.next/static/chunks/app/api/proxy/test/route-fc8ab8f162e8d6f5.js +0 -1
  257. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-fc8ab8f162e8d6f5.js +0 -1
  258. package/.next/static/chunks/app/api/sessions/[id]/context/route-fc8ab8f162e8d6f5.js +0 -1
  259. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-fc8ab8f162e8d6f5.js +0 -1
  260. package/.next/static/chunks/app/api/sessions/[id]/export/route-fc8ab8f162e8d6f5.js +0 -1
  261. package/.next/static/chunks/app/api/sessions/[id]/queue-recovery/route-fc8ab8f162e8d6f5.js +0 -1
  262. package/.next/static/chunks/app/api/sessions/[id]/route-fc8ab8f162e8d6f5.js +0 -1
  263. package/.next/static/chunks/app/api/sessions/[id]/state/route-fc8ab8f162e8d6f5.js +0 -1
  264. package/.next/static/chunks/app/api/sessions/route-fc8ab8f162e8d6f5.js +0 -1
  265. package/.next/static/chunks/app/api/settings/title-model/route-fc8ab8f162e8d6f5.js +0 -1
  266. package/.next/static/chunks/app/api/skills/check/route-fc8ab8f162e8d6f5.js +0 -1
  267. package/.next/static/chunks/app/api/skills/install/route-fc8ab8f162e8d6f5.js +0 -1
  268. package/.next/static/chunks/app/api/skills/route-fc8ab8f162e8d6f5.js +0 -1
  269. package/.next/static/chunks/app/api/skills/search/route-fc8ab8f162e8d6f5.js +0 -1
  270. package/.next/static/chunks/app/api/skills/update/route-fc8ab8f162e8d6f5.js +0 -1
  271. package/.next/static/chunks/app/api/tasks/[id]/[action]/route-fc8ab8f162e8d6f5.js +0 -1
  272. package/.next/static/chunks/app/api/tasks/[id]/changed-files/route-fc8ab8f162e8d6f5.js +0 -1
  273. package/.next/static/chunks/app/api/tasks/[id]/diff/route-fc8ab8f162e8d6f5.js +0 -1
  274. package/.next/static/chunks/app/api/tasks/[id]/events/route-fc8ab8f162e8d6f5.js +0 -1
  275. package/.next/static/chunks/app/api/tasks/[id]/route-fc8ab8f162e8d6f5.js +0 -1
  276. package/.next/static/chunks/app/api/tasks/batch/route-fc8ab8f162e8d6f5.js +0 -1
  277. package/.next/static/chunks/app/api/tasks/events/route-fc8ab8f162e8d6f5.js +0 -1
  278. package/.next/static/chunks/app/api/tasks/route-fc8ab8f162e8d6f5.js +0 -1
  279. package/.next/static/chunks/app/api/tasks/settings/route-fc8ab8f162e8d6f5.js +0 -1
  280. package/.next/static/chunks/app/api/tasks/templates/route-fc8ab8f162e8d6f5.js +0 -1
  281. package/.next/static/chunks/app/api/themes/[name]/route-fc8ab8f162e8d6f5.js +0 -1
  282. package/.next/static/chunks/app/api/themes/route-fc8ab8f162e8d6f5.js +0 -1
  283. package/.next/static/chunks/app/api/usage/route-fc8ab8f162e8d6f5.js +0 -1
  284. package/.next/static/chunks/app/api/worktrees/route-fc8ab8f162e8d6f5.js +0 -1
  285. package/.next/static/chunks/app/page-7fa160a50338d6b7.js +0 -22
  286. package/.next/static/chunks/next/dist/client/components/builtin/app-error-fc8ab8f162e8d6f5.js +0 -1
  287. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-fc8ab8f162e8d6f5.js +0 -1
  288. package/.next/static/chunks/next/dist/client/components/builtin/not-found-fc8ab8f162e8d6f5.js +0 -1
  289. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-fc8ab8f162e8d6f5.js +0 -1
  290. package/.next/static/css/f8b227e230256326.css +0 -1
  291. package/.next/static/dLdGlazBwRqCib28ilzT0/_buildManifest.js +0 -1
  292. /package/.next/static/{dLdGlazBwRqCib28ilzT0 → lVkhyX-XEcFgvfYtDvmwH}/_ssgManifest.js +0 -0
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-webpack","duration":33076860,"timestamp":338145833029,"id":14,"parentId":1,"tags":{},"startTime":1786012165606,"traceId":"93938e70089a0830"},{"name":"run-typescript","duration":5505452,"timestamp":338178911267,"id":883,"parentId":1,"tags":{},"startTime":1786012198682,"traceId":"93938e70089a0830"},{"name":"static-check","duration":1217383,"timestamp":338184428492,"id":886,"parentId":1,"tags":{},"startTime":1786012204199,"traceId":"93938e70089a0830"},{"name":"static-generation","duration":1622781,"timestamp":338185967891,"id":1032,"parentId":1,"tags":{},"startTime":1786012205738,"traceId":"93938e70089a0830"},{"name":"collect-build-traces","duration":14356217,"timestamp":338185647191,"id":1029,"parentId":1,"tags":{},"startTime":1786012205418,"traceId":"93938e70089a0830"},{"name":"telemetry-flush","duration":12,"timestamp":338200014926,"id":1041,"parentId":1,"tags":{},"startTime":1786012219784,"traceId":"93938e70089a0830"},{"name":"next-build","duration":54466965,"timestamp":338145547975,"id":1,"tags":{"buildMode":"default","version":"16.2.12","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1786012165321,"traceId":"93938e70089a0830"}]
1
+ [{"name":"run-webpack","duration":89174945,"timestamp":400130066892,"id":14,"parentId":1,"tags":{},"startTime":1786074151025,"traceId":"93144e710d7dc818"},{"name":"run-typescript","duration":16338980,"timestamp":400219244807,"id":926,"parentId":1,"tags":{},"startTime":1786074240205,"traceId":"93144e710d7dc818"},{"name":"static-check","duration":4724559,"timestamp":400235612204,"id":929,"parentId":1,"tags":{},"startTime":1786074256572,"traceId":"93144e710d7dc818"},{"name":"static-generation","duration":4626174,"timestamp":400241391475,"id":1077,"parentId":1,"tags":{},"startTime":1786074262352,"traceId":"93144e710d7dc818"},{"name":"collect-build-traces","duration":36861527,"timestamp":400240343225,"id":1074,"parentId":1,"tags":{},"startTime":1786074261303,"traceId":"93144e710d7dc818"},{"name":"telemetry-flush","duration":36,"timestamp":400277216062,"id":1086,"parentId":1,"tags":{},"startTime":1786074298177,"traceId":"93144e710d7dc818"},{"name":"next-build","duration":147687381,"timestamp":400129528723,"id":1,"tags":{"buildMode":"default","version":"16.2.12","bundler":"webpack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1786074150487,"traceId":"93144e710d7dc818"}]
@@ -0,0 +1,351 @@
1
+ // File: /Volumes/1T 原装/项目研发/pi-web-QT/app/api/modes/route.ts
2
+ import * as entry from '../../../../../app/api/modes/route.js'
3
+ import type { NextRequest } from 'next/server.js'
4
+
5
+ import type { InstantConfigForTypeCheckInternal } from 'next/dist/build/segment-config/app/app-segment-config.js'
6
+
7
+ type TEntry = typeof import('../../../../../app/api/modes/route.js')
8
+
9
+ type SegmentParams<T extends Object = any> = T extends Record<string, any>
10
+ ? { [K in keyof T]: T[K] extends string ? string | string[] | undefined : never }
11
+ : T
12
+
13
+ // Check that the entry is a valid entry
14
+ checkFields<Diff<{
15
+ GET?: Function
16
+ HEAD?: Function
17
+ OPTIONS?: Function
18
+ POST?: Function
19
+ PUT?: Function
20
+ DELETE?: Function
21
+ PATCH?: Function
22
+ config?: {}
23
+ generateStaticParams?: Function
24
+ unstable_instant?: InstantConfigForTypeCheckInternal
25
+ unstable_dynamicStaleTime?: number
26
+ revalidate?: RevalidateRange<TEntry> | false
27
+ dynamic?: 'auto' | 'force-dynamic' | 'error' | 'force-static'
28
+ dynamicParams?: boolean
29
+ fetchCache?: 'auto' | 'force-no-store' | 'only-no-store' | 'default-no-store' | 'default-cache' | 'only-cache' | 'force-cache'
30
+ preferredRegion?: 'auto' | 'global' | 'home' | string | string[]
31
+ runtime?: 'nodejs' | 'experimental-edge' | 'edge'
32
+ maxDuration?: number
33
+
34
+ }, TEntry, ''>>()
35
+
36
+ type RouteContext = { params: Promise<SegmentParams> }
37
+ // Check the prop type of the entry function
38
+ if ('GET' in entry) {
39
+ checkFields<
40
+ Diff<
41
+ ParamCheck<Request | NextRequest>,
42
+ {
43
+ __tag__: 'GET'
44
+ __param_position__: 'first'
45
+ __param_type__: FirstArg<MaybeField<TEntry, 'GET'>>
46
+ },
47
+ 'GET'
48
+ >
49
+ >()
50
+ checkFields<
51
+ Diff<
52
+ ParamCheck<RouteContext>,
53
+ {
54
+ __tag__: 'GET'
55
+ __param_position__: 'second'
56
+ __param_type__: SecondArg<MaybeField<TEntry, 'GET'>>
57
+ },
58
+ 'GET'
59
+ >
60
+ >()
61
+
62
+ checkFields<
63
+ Diff<
64
+ {
65
+ __tag__: 'GET',
66
+ __return_type__: Response | void | never | Promise<Response | void | never>
67
+ },
68
+ {
69
+ __tag__: 'GET',
70
+ __return_type__: ReturnType<MaybeField<TEntry, 'GET'>>
71
+ },
72
+ 'GET'
73
+ >
74
+ >()
75
+ }
76
+ // Check the prop type of the entry function
77
+ if ('HEAD' in entry) {
78
+ checkFields<
79
+ Diff<
80
+ ParamCheck<Request | NextRequest>,
81
+ {
82
+ __tag__: 'HEAD'
83
+ __param_position__: 'first'
84
+ __param_type__: FirstArg<MaybeField<TEntry, 'HEAD'>>
85
+ },
86
+ 'HEAD'
87
+ >
88
+ >()
89
+ checkFields<
90
+ Diff<
91
+ ParamCheck<RouteContext>,
92
+ {
93
+ __tag__: 'HEAD'
94
+ __param_position__: 'second'
95
+ __param_type__: SecondArg<MaybeField<TEntry, 'HEAD'>>
96
+ },
97
+ 'HEAD'
98
+ >
99
+ >()
100
+
101
+ checkFields<
102
+ Diff<
103
+ {
104
+ __tag__: 'HEAD',
105
+ __return_type__: Response | void | never | Promise<Response | void | never>
106
+ },
107
+ {
108
+ __tag__: 'HEAD',
109
+ __return_type__: ReturnType<MaybeField<TEntry, 'HEAD'>>
110
+ },
111
+ 'HEAD'
112
+ >
113
+ >()
114
+ }
115
+ // Check the prop type of the entry function
116
+ if ('OPTIONS' in entry) {
117
+ checkFields<
118
+ Diff<
119
+ ParamCheck<Request | NextRequest>,
120
+ {
121
+ __tag__: 'OPTIONS'
122
+ __param_position__: 'first'
123
+ __param_type__: FirstArg<MaybeField<TEntry, 'OPTIONS'>>
124
+ },
125
+ 'OPTIONS'
126
+ >
127
+ >()
128
+ checkFields<
129
+ Diff<
130
+ ParamCheck<RouteContext>,
131
+ {
132
+ __tag__: 'OPTIONS'
133
+ __param_position__: 'second'
134
+ __param_type__: SecondArg<MaybeField<TEntry, 'OPTIONS'>>
135
+ },
136
+ 'OPTIONS'
137
+ >
138
+ >()
139
+
140
+ checkFields<
141
+ Diff<
142
+ {
143
+ __tag__: 'OPTIONS',
144
+ __return_type__: Response | void | never | Promise<Response | void | never>
145
+ },
146
+ {
147
+ __tag__: 'OPTIONS',
148
+ __return_type__: ReturnType<MaybeField<TEntry, 'OPTIONS'>>
149
+ },
150
+ 'OPTIONS'
151
+ >
152
+ >()
153
+ }
154
+ // Check the prop type of the entry function
155
+ if ('POST' in entry) {
156
+ checkFields<
157
+ Diff<
158
+ ParamCheck<Request | NextRequest>,
159
+ {
160
+ __tag__: 'POST'
161
+ __param_position__: 'first'
162
+ __param_type__: FirstArg<MaybeField<TEntry, 'POST'>>
163
+ },
164
+ 'POST'
165
+ >
166
+ >()
167
+ checkFields<
168
+ Diff<
169
+ ParamCheck<RouteContext>,
170
+ {
171
+ __tag__: 'POST'
172
+ __param_position__: 'second'
173
+ __param_type__: SecondArg<MaybeField<TEntry, 'POST'>>
174
+ },
175
+ 'POST'
176
+ >
177
+ >()
178
+
179
+ checkFields<
180
+ Diff<
181
+ {
182
+ __tag__: 'POST',
183
+ __return_type__: Response | void | never | Promise<Response | void | never>
184
+ },
185
+ {
186
+ __tag__: 'POST',
187
+ __return_type__: ReturnType<MaybeField<TEntry, 'POST'>>
188
+ },
189
+ 'POST'
190
+ >
191
+ >()
192
+ }
193
+ // Check the prop type of the entry function
194
+ if ('PUT' in entry) {
195
+ checkFields<
196
+ Diff<
197
+ ParamCheck<Request | NextRequest>,
198
+ {
199
+ __tag__: 'PUT'
200
+ __param_position__: 'first'
201
+ __param_type__: FirstArg<MaybeField<TEntry, 'PUT'>>
202
+ },
203
+ 'PUT'
204
+ >
205
+ >()
206
+ checkFields<
207
+ Diff<
208
+ ParamCheck<RouteContext>,
209
+ {
210
+ __tag__: 'PUT'
211
+ __param_position__: 'second'
212
+ __param_type__: SecondArg<MaybeField<TEntry, 'PUT'>>
213
+ },
214
+ 'PUT'
215
+ >
216
+ >()
217
+
218
+ checkFields<
219
+ Diff<
220
+ {
221
+ __tag__: 'PUT',
222
+ __return_type__: Response | void | never | Promise<Response | void | never>
223
+ },
224
+ {
225
+ __tag__: 'PUT',
226
+ __return_type__: ReturnType<MaybeField<TEntry, 'PUT'>>
227
+ },
228
+ 'PUT'
229
+ >
230
+ >()
231
+ }
232
+ // Check the prop type of the entry function
233
+ if ('DELETE' in entry) {
234
+ checkFields<
235
+ Diff<
236
+ ParamCheck<Request | NextRequest>,
237
+ {
238
+ __tag__: 'DELETE'
239
+ __param_position__: 'first'
240
+ __param_type__: FirstArg<MaybeField<TEntry, 'DELETE'>>
241
+ },
242
+ 'DELETE'
243
+ >
244
+ >()
245
+ checkFields<
246
+ Diff<
247
+ ParamCheck<RouteContext>,
248
+ {
249
+ __tag__: 'DELETE'
250
+ __param_position__: 'second'
251
+ __param_type__: SecondArg<MaybeField<TEntry, 'DELETE'>>
252
+ },
253
+ 'DELETE'
254
+ >
255
+ >()
256
+
257
+ checkFields<
258
+ Diff<
259
+ {
260
+ __tag__: 'DELETE',
261
+ __return_type__: Response | void | never | Promise<Response | void | never>
262
+ },
263
+ {
264
+ __tag__: 'DELETE',
265
+ __return_type__: ReturnType<MaybeField<TEntry, 'DELETE'>>
266
+ },
267
+ 'DELETE'
268
+ >
269
+ >()
270
+ }
271
+ // Check the prop type of the entry function
272
+ if ('PATCH' in entry) {
273
+ checkFields<
274
+ Diff<
275
+ ParamCheck<Request | NextRequest>,
276
+ {
277
+ __tag__: 'PATCH'
278
+ __param_position__: 'first'
279
+ __param_type__: FirstArg<MaybeField<TEntry, 'PATCH'>>
280
+ },
281
+ 'PATCH'
282
+ >
283
+ >()
284
+ checkFields<
285
+ Diff<
286
+ ParamCheck<RouteContext>,
287
+ {
288
+ __tag__: 'PATCH'
289
+ __param_position__: 'second'
290
+ __param_type__: SecondArg<MaybeField<TEntry, 'PATCH'>>
291
+ },
292
+ 'PATCH'
293
+ >
294
+ >()
295
+
296
+ checkFields<
297
+ Diff<
298
+ {
299
+ __tag__: 'PATCH',
300
+ __return_type__: Response | void | never | Promise<Response | void | never>
301
+ },
302
+ {
303
+ __tag__: 'PATCH',
304
+ __return_type__: ReturnType<MaybeField<TEntry, 'PATCH'>>
305
+ },
306
+ 'PATCH'
307
+ >
308
+ >()
309
+ }
310
+
311
+ // Check the arguments and return type of the generateStaticParams function
312
+ if ('generateStaticParams' in entry) {
313
+ checkFields<Diff<{ params: SegmentParams }, FirstArg<MaybeField<TEntry, 'generateStaticParams'>>, 'generateStaticParams'>>()
314
+ checkFields<Diff<{ __tag__: 'generateStaticParams', __return_type__: any[] | Promise<any[]> }, { __tag__: 'generateStaticParams', __return_type__: ReturnType<MaybeField<TEntry, 'generateStaticParams'>> }>>()
315
+ }
316
+
317
+ export interface PageProps {
318
+ params?: Promise<SegmentParams>
319
+ searchParams?: Promise<any>
320
+ }
321
+ export interface LayoutProps {
322
+ children?: React.ReactNode
323
+
324
+ params?: Promise<SegmentParams>
325
+ }
326
+
327
+ // =============
328
+ // Utility types
329
+ type RevalidateRange<T> = T extends { revalidate: any } ? NonNegative<T['revalidate']> : never
330
+
331
+ // If T is unknown or any, it will be an empty {} type. Otherwise, it will be the same as Omit<T, keyof Base>.
332
+ type OmitWithTag<T, K extends keyof any, _M> = Omit<T, K>
333
+ type Diff<Base, T extends Base, Message extends string = ''> = 0 extends (1 & T) ? {} : OmitWithTag<T, keyof Base, Message>
334
+
335
+ type FirstArg<T extends Function> = T extends (...args: [infer T, any]) => any ? unknown extends T ? any : T : never
336
+ type SecondArg<T extends Function> = T extends (...args: [any, infer T]) => any ? unknown extends T ? any : T : never
337
+ type MaybeField<T, K extends string> = T extends { [k in K]: infer G } ? G extends Function ? G : never : never
338
+
339
+ type ParamCheck<T> = {
340
+ __tag__: string
341
+ __param_position__: string
342
+ __param_type__: T
343
+ }
344
+
345
+ function checkFields<_ extends { [k in keyof any]: never }>() {}
346
+
347
+ // https://github.com/sindresorhus/type-fest
348
+ type Numeric = number | bigint
349
+ type Zero = 0 | 0n
350
+ type Negative<T extends Numeric> = T extends Zero ? never : `${T}` extends `-${string}` ? T : never
351
+ type NonNegative<T extends Numeric> = T extends Zero ? T : Negative<T> extends never ? T : '__invalid_negative_number__'
@@ -2,7 +2,7 @@
2
2
  // Do not edit this file manually
3
3
 
4
4
  type AppRoutes = "/"
5
- type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/bash-output" | "/api/agent/[id]/events" | "/api/agent/new" | "/api/agent/running" | "/api/auth/all-providers" | "/api/auth/api-key/[provider]" | "/api/auth/login/[provider]" | "/api/auth/logout/[provider]" | "/api/auth/providers" | "/api/backup/export" | "/api/backup/import" | "/api/cwd/browse" | "/api/cwd/validate" | "/api/default-cwd" | "/api/features" | "/api/file-index" | "/api/files/[...path]" | "/api/git/diff" | "/api/git/push" | "/api/git/stash" | "/api/git/status" | "/api/home" | "/api/import/discover" | "/api/import/execute" | "/api/import/status" | "/api/models" | "/api/models-config" | "/api/models-config/builtin" | "/api/models-config/catalog" | "/api/models-config/discover" | "/api/models-config/test" | "/api/plugins" | "/api/project-trust" | "/api/proxy" | "/api/proxy/test" | "/api/sessions" | "/api/sessions/[id]" | "/api/sessions/[id]/auto-name" | "/api/sessions/[id]/context" | "/api/sessions/[id]/entries/[entryId]/thinking" | "/api/sessions/[id]/export" | "/api/sessions/[id]/queue-recovery" | "/api/sessions/[id]/state" | "/api/settings/title-model" | "/api/skills" | "/api/skills/check" | "/api/skills/install" | "/api/skills/search" | "/api/skills/update" | "/api/tasks" | "/api/tasks/[id]" | "/api/tasks/[id]/[action]" | "/api/tasks/[id]/changed-files" | "/api/tasks/[id]/diff" | "/api/tasks/[id]/events" | "/api/tasks/batch" | "/api/tasks/events" | "/api/tasks/settings" | "/api/tasks/templates" | "/api/themes" | "/api/themes/[name]" | "/api/usage" | "/api/worktrees"
5
+ type AppRouteHandlerRoutes = "/api/agent/[id]" | "/api/agent/[id]/bash-output" | "/api/agent/[id]/events" | "/api/agent/new" | "/api/agent/running" | "/api/auth/all-providers" | "/api/auth/api-key/[provider]" | "/api/auth/login/[provider]" | "/api/auth/logout/[provider]" | "/api/auth/providers" | "/api/backup/export" | "/api/backup/import" | "/api/cwd/browse" | "/api/cwd/validate" | "/api/default-cwd" | "/api/features" | "/api/file-index" | "/api/files/[...path]" | "/api/git/diff" | "/api/git/push" | "/api/git/stash" | "/api/git/status" | "/api/home" | "/api/import/discover" | "/api/import/execute" | "/api/import/status" | "/api/models" | "/api/models-config" | "/api/models-config/builtin" | "/api/models-config/catalog" | "/api/models-config/discover" | "/api/models-config/test" | "/api/modes" | "/api/plugins" | "/api/project-trust" | "/api/proxy" | "/api/proxy/test" | "/api/sessions" | "/api/sessions/[id]" | "/api/sessions/[id]/auto-name" | "/api/sessions/[id]/context" | "/api/sessions/[id]/entries/[entryId]/thinking" | "/api/sessions/[id]/export" | "/api/sessions/[id]/queue-recovery" | "/api/sessions/[id]/state" | "/api/settings/title-model" | "/api/skills" | "/api/skills/check" | "/api/skills/install" | "/api/skills/search" | "/api/skills/update" | "/api/tasks" | "/api/tasks/[id]" | "/api/tasks/[id]/[action]" | "/api/tasks/[id]/changed-files" | "/api/tasks/[id]/diff" | "/api/tasks/[id]/events" | "/api/tasks/batch" | "/api/tasks/events" | "/api/tasks/settings" | "/api/tasks/templates" | "/api/themes" | "/api/themes/[name]" | "/api/usage" | "/api/worktrees"
6
6
  type PageRoutes = never
7
7
  type LayoutRoutes = "/"
8
8
  type RedirectRoutes = never
@@ -44,6 +44,7 @@ interface ParamMap {
44
44
  "/api/models-config/catalog": {}
45
45
  "/api/models-config/discover": {}
46
46
  "/api/models-config/test": {}
47
+ "/api/modes": {}
47
48
  "/api/plugins": {}
48
49
  "/api/project-trust": {}
49
50
  "/api/proxy": {}
@@ -344,6 +344,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
344
344
  type __Unused = __Check
345
345
  }
346
346
 
347
+ // Validate ../../app/api/modes/route.ts
348
+ {
349
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/modes">> = Specific
350
+ const handler = {} as typeof import("../../app/api/modes/route.js")
351
+ type __Check = __IsExpected<typeof handler>
352
+ // @ts-ignore
353
+ type __Unused = __Check
354
+ }
355
+
347
356
  // Validate ../../app/api/plugins/route.ts
348
357
  {
349
358
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/plugins">> = Specific
package/README.en.md CHANGED
@@ -65,7 +65,27 @@ The board's own **Task settings** button configures per-project execution (separ
65
65
  - The engine is a single server process (exclusive lock); interrupted tasks are recovered on restart (marked failed/interrupted, retryable).
66
66
  - Beta: desktop only; the mobile UI does not show the board.
67
67
 
68
- ## Latest changes (2026-08-06 · v0.9.17-beta.1)
68
+ ## Latest changes (2026-08-07 · v0.9.17-beta.3)
69
+
70
+ - **Zero install-time warnings**: provider icons are now inlined components, so `@lobehub/icons` is gone and npm no longer auto-installs the `@lobehub/ui` / `antd` / `@emoji-mart/react` chain — no more `ERESOLVE overriding peer dependency` and `deprecated intersection-observer` warnings during install (see "npm 11 install notes").
71
+ - **undici fix now runs at runtime**: the `postinstall` hook is gone; `pi-web` applies the undici CVE fix at startup and `dev`/`start` scripts apply it before launching, so installing no longer requires approving install scripts.
72
+ - **Title generation no longer times out (524)**: generating a title while the session is still running waits at most 10s for idle then snapshots the current conversation; the model call timeout is tightened to 80s, keeping the total comfortably under the Cloudflare 100s gateway timeout.
73
+ - **Default mode is now Normal**: new chats default to Normal task mode instead of inheriting Plan.
74
+ - **Task board toggle takes effect immediately**: turning the task board on/off in Settings > Features syncs the toolbar entry and board view without a page refresh.
75
+ - **settings.json concurrency protection**: the modes, features, and title-model modules now share one file lock (proper-lockfile + atomic writes), so concurrent saves can no longer overwrite each other and drop config.
76
+ - **Default mode settings UI**: Settings > Features can now set the default task mode (Normal / Plan / Goal), token profile (Lite / Balanced / Delivery, default Balanced) and tool approval (Ask / Auto / Yolo); already-open chats apply the changes immediately and new chats inherit them.
77
+ - **SPA navigation robustness**: switching projects via the address bar (`?session=` ↔ `?cwd=`) is honored without a full reload; a brand-new project folder with no sessions yet stays in the project list; created sessions appear in the sidebar promptly.
78
+
79
+ ## Previous changes (2026-08-06 · v0.9.17-beta.2)
80
+
81
+ - **Chat mode system** (ported from Reasonix): the composer toolbar gains three mode controls — task mode (Normal / Plan / Goal), token profile (Lite / Balanced / Delivery) and tool approval (Ask / Auto / Yolo). Plan mode produces a read-only plan then shows a confirm card (Execute / Suggest / Exit); Goal mode auto-continues with a turn budget and stall detection; Lite narrows the toolset to save tokens; Delivery injects a verify-first instruction.
82
+ - **Tool-call approval (real interception)**: in Ask mode, write-class tool calls are suspended before execution and a shelf card appears above the composer — allow, deny, or deny with a reason; parallel batches resolve one by one; 120s timeout auto-denies. Rules (deny > ask > allow) support `ToolName` / `ToolName(glob)` / `Bash(command:*)` and persist to `~/.pi/agent/settings.json`.
83
+ - **Yolo red ring**: picking Yolo tints the composer border red as an "unrestricted" warning.
84
+ - **Long-paste folding**: pasting >2000 chars / 20 lines collapses into a `[Pasted text #N · X lines]` card (preview / remove) so the composer stays fast; the full text is expanded when sending.
85
+ - **Title-failure bubble + model picker**: failed title generation shows a floating bubble next to the session row with retry and a provider-grouped model picker.
86
+ - **Fixes**: Markdown hydration errors (rehypeRaw removed), mode-instruction blocks no longer leak into user bubbles, batch title 500 / UI stall, model-picker duplicate keys and grouping, Windows import path mapping, idempotent approval resolves, and the mobile title bar (branch icon only + tap title for full text).
87
+
88
+ ## Previous changes (2026-08-06 · v0.9.17-beta.1)
69
89
 
70
90
  - **Fix 500 when generating titles for imported sessions** — auto-naming Reasonix-imported sessions no longer fails with `Cannot read properties of undefined (reading 'length')`. The import converter could emit text blocks missing the `text` field; both the importer and the title pipeline now handle this, including previously imported files.
71
91
  - **Faster title generation** — very long sessions (thousands of tool messages) now use only the most recent portion of the conversation, avoiding timeouts; falls back to the full transcript when the tail has no user message.
@@ -91,6 +111,31 @@ The board's own **Task settings** button configures per-project execution (separ
91
111
  - The mobile composer is now 52px high. It keeps a 16px input font to prevent iOS Safari zoom, while tighter line height and letter spacing make the text read smaller.
92
112
  - Production serving no longer relies on Turbopack development chunks, and quoteable Markdown table rows render with valid table DOM.
93
113
 
114
+ ## npm 11 install notes
115
+
116
+ Since **v0.9.17-beta.3** the `ERESOLVE overriding peer dependency` and `deprecated intersection-observer` warnings are gone: provider icons are inlined (no more `@lobehub/icons`, so npm no longer auto-installs the `@lobehub/ui` / `antd` / `@emoji-mart/react` chain). Two **informational** warnings may remain — both harmless:
117
+
118
+ - `deprecated node-domexception`: pulled in transitively by `@google/genai` → `google-auth-library` → `fetch-blob`. It is a polyfill for older Node versions; Node ≥ 18 ships `DOMException` natively, so it is unused at runtime. It cannot be removed from the package side until the upstream fix lands.
119
+
120
+ - `allow-scripts`: npm ≥ 11.16's install-script approval notice (`@google/genai` / `protobufjs` / `sharp` etc. transitive lifecycle scripts). Current versions only warn (scripts still run); future versions may block by default. To clear the notice in your project:
121
+
122
+ ```bash
123
+ npm approve-scripts --allow-scripts-pending # view pending list first
124
+ npm approve-scripts @google/genai protobufjs sharp # approve and write to your package.json
125
+ ```
126
+
127
+ Or declare in your project `package.json`:
128
+
129
+ ```json
130
+ "allowScripts": {
131
+ "@google/genai@1.52.0": true,
132
+ "protobufjs@7.6.5": true,
133
+ "sharp@0.34.5": true
134
+ }
135
+ ```
136
+
137
+ Note this field matches `package@exact-version`; update it after version bumps.
138
+
94
139
  ## Requirements
95
140
 
96
141
  - Node.js **22.19.0 or newer**
package/README.md CHANGED
@@ -87,7 +87,27 @@
87
87
  - 引擎由服务器进程持有(单实例锁),重启后自动恢复中断的任务(标记为失败/中断,可重试)。
88
88
  - Beta 阶段:仅在桌面端显示入口;移动端不可用。
89
89
 
90
- ## 最新更新(2026-08-06 · v0.9.17-beta.1)
90
+ ## 最新更新(2026-08-07 · v0.9.17-beta.3)
91
+
92
+ - **生成标题不再超时(524)**:会话运行中点「生成标题」最多等待空闲 10 秒后直接用当前对话快照生成,模型调用超时收紧到 80 秒,总时长稳在 Cloudflare 100 秒网关超时内。
93
+ - **默认任务模式改为常规**:新对话默认不再继承「计划」。
94
+ - **任务看板开关实时生效**:设置-功能里关闭/打开任务看板立即同步顶部入口与看板视图,无需刷新页面。
95
+ - **settings.json 并发写保护**:模式、功能开关、标题模型共用同一文件锁(proper-lockfile + 原子写),并发保存不再互相覆盖丢配置。
96
+ - **设置-功能页新增模式默认项**:可配置默认任务模式(常规 / 计划 / 目标)、默认运行档位(轻量 / 均衡 / 交付,默认均衡)、默认工具权限(批准 / 自动 / Yolo),已打开的对话立即生效、新对话自动继承。
97
+ - **SPA 导航修复**:地址栏 `?session=` ↔ `?cwd=` 切换项目无需整页刷新;全新项目(尚无会话)仍保留在项目列表;新会话创建后立即出现在侧栏。
98
+ - **安装提示清零**:供应商图标改为内置组件,移除 `@lobehub/icons` 依赖,不再被 npm 自动安装 `@lobehub/ui` / `antd` / `@emoji-mart/react` 整条链——安装时不再出现 `ERESOLVE overriding peer dependency` 与 `deprecated intersection-observer` 警告(详情见「安装提示(npm 11)」)。
99
+ - **undici 修复改为运行时执行**:移除 `postinstall` 钩子,`pi-web` 启动与 dev/start 脚本执行前自动应用 undici CVE 修复,安装不再要求审批安装脚本。
100
+
101
+ ## 历史更新(2026-08-06 · v0.9.17-beta.2)
102
+
103
+ - **对话框模式系统**(移植自 Reasonix):输入框工具栏新增三组模式控件——任务模式(常规 / 计划 / 目标)、运行档位(轻量 / 均衡 / 交付)、工具权限(批准 / 自动 / Yolo)。计划模式只读产出计划后弹出确认卡(开始执行 / 提出建议 / 退出);目标模式输入目标后自动持续推进,带轮次预算与无进展检测;轻量档位收窄工具集省 token,交付档位强制验收指令。
104
+ - **工具调用审批(真拦截)**:权限为「批准」时,agent 的写类工具调用在真正执行前挂起,输入框上方弹出审批卡,可允许 / 拒绝 / 附理由拒绝;规则(deny > ask > allow)支持 `ToolName` / `ToolName(glob)` / `Bash(command:*)`,持久化到 settings.json。
105
+ - **Yolo 红色警示**:选择 Yolo 时输入框外圈变红,直观提醒高权限模式。
106
+ - **长粘贴自动折叠**:粘贴大段代码自动折叠为 `[已粘贴文本 #N · X 行]` 占位卡(可预览 / 删除),发送时自动展开,输入框不再卡顿。
107
+ - **标题失败气泡 + 换模型弹窗**:生成标题失败在会话行右侧弹出原因气泡,可重试或换模型(按 provider 分组的模型选择弹窗)。
108
+ - **修复**:Markdown 渲染 hydration 错误(移除 rehypeRaw)、消息气泡不再显示注入的模式提示词、批量生成主题 500 与页面卡死、模型选择弹窗 key 冲突与分组、Windows 导入路径适配、审批请求幂等、移动端标题栏(git 分支只显图标 + 点击标题看全文)。
109
+
110
+ ## 历史更新(2026-08-06 · v0.9.17-beta.1)
91
111
 
92
112
  - **修复导入会话生成标题 500**:Reasonix 导入的会话自动生成标题时不再报 `Cannot read properties of undefined (reading 'length')`。根因是导入转换产生缺失 `text` 字段的消息块,已在导入与标题生成两条链路同时修复,历史坏文件也兼容。
93
113
  - **标题生成提速**:超长会话(上千条工具消息)只取最近一段上下文生成标题,不再容易超时;尾部无用户消息时自动回退全量。
@@ -129,15 +149,28 @@
129
149
 
130
150
  ## 安装提示(npm 11)
131
151
 
132
- 使用 npm ≥ 11 安装本包时可能出现两类提示,均为**提示性警告,不影响安装与运行**:
152
+ 自 **v0.9.17-beta.3 起**,`ERESOLVE overriding peer dependency` 与 `deprecated intersection-observer` 两类提示已消除:供应商图标改为内置(不再依赖 `@lobehub/icons`,从而不再被 npm 自动安装 `@lobehub/ui` / `antd` / `@emoji-mart/react` 整条链)。新装本包时仅剩以下两类**提示性警告,均不影响安装与运行**:
153
+
154
+ - `deprecated node-domexception`:来自 `@google/genai` → `google-auth-library` 的传递依赖 `fetch-blob`。它只是旧版 Node 的 polyfill,Node ≥ 18 原生自带 `DOMException`,运行时完全用不到。上游未修复前无法从包侧移除。
155
+
156
+ - `allow-scripts`:npm ≥ 11.16 新增的安装脚本审批提示(`@google/genai` / `protobufjs` / `sharp` 等传递依赖的 preinstall/postinstall/install 脚本)。当前版本**只提示、不拦截**(脚本照常执行),未来版本可能改为默认拦截。想消除提示可在你的项目执行:
157
+
158
+ ```bash
159
+ npm approve-scripts --allow-scripts-pending # 先查看待审批清单
160
+ npm approve-scripts @google/genai protobufjs sharp # 逐个批准并写入你的 package.json
161
+ ```
133
162
 
134
- - `ERESOLVE overriding peer dependency`:上游 `@lobehub/ui` 依赖的 `@emoji-mart/react@1.1.1` 的 peer 声明仅到 React 18,而本包使用 React 19。npm 会自动 override 并继续安装(实际兼容)。如需彻底消除,可在你的项目 `package.json` 添加:
163
+ 或在项目 `package.json` 声明:
135
164
 
136
165
  ```json
137
- "overrides": { "@emoji-mart/react": { "react": "$react" } }
166
+ "allowScripts": {
167
+ "@google/genai@1.52.0": true,
168
+ "protobufjs@7.6.5": true,
169
+ "sharp@0.34.5": true
170
+ }
138
171
  ```
139
172
 
140
- - `allow-scripts`:npm 11 新增的安装脚本审批提示(sharp / protobufjs / @google/genai 等)。本项目已在包内声明 `allowScripts`,若你的 npm 仍提示,可执行 `npm approve-scripts --all` 审批,或在安装命令加 `--allow-scripts=sharp,protobufjs,@google/genai`。
173
+ 注意该字段按 `包名@精确版本` 匹配,版本升级后需同步更新。
141
174
 
142
175
  ## 历史更新(2026-08-03)
143
176
 
@@ -9,54 +9,69 @@
9
9
  // Note: npm audit will still report undici CVEs because the lockfile
10
10
  // references the old version. This is a cosmetic false positive — the
11
11
  // code loaded at runtime is undici@^8.10.0.
12
+ //
13
+ // The fix used to run as a `postinstall` hook. It now runs lazily at
14
+ // `pi-web` startup (bin/pi-web.js) and before the repo's dev/start scripts.
15
+ // Moving it out of postinstall keeps `npm install` output quiet under
16
+ // npm >= 11.16's allow-scripts policy and guarantees the fix applies even on
17
+ // installs where lifecycle scripts are blocked or skipped.
12
18
 
13
19
  const fs = require("fs");
14
20
  const path = require("path");
15
21
 
16
- const root = path.join(__dirname, "..");
17
- const agentDir = path.join(
18
- root,
19
- "node_modules",
20
- "@earendil-works",
21
- "pi-coding-agent",
22
- );
23
- const shrinkwrap = path.join(agentDir, "npm-shrinkwrap.json");
24
- const nestedUndici = path.join(agentDir, "node_modules", "undici");
25
- const topUndici = path.join(root, "node_modules", "undici");
26
-
27
- // 1. Remove shrinkwrap
28
- if (fs.existsSync(shrinkwrap)) {
29
- console.log("[pi-web] Removing pi-coding-agent shrinkwrap…");
30
- fs.rmSync(shrinkwrap);
31
- }
22
+ function applyUndiciFix(rootDir = path.join(__dirname, "..")) {
23
+ const agentDir = path.join(
24
+ rootDir,
25
+ "node_modules",
26
+ "@earendil-works",
27
+ "pi-coding-agent",
28
+ );
29
+ if (!fs.existsSync(agentDir)) return; // not installed here — nothing to fix
30
+
31
+ const shrinkwrap = path.join(agentDir, "npm-shrinkwrap.json");
32
+ const nestedUndici = path.join(agentDir, "node_modules", "undici");
33
+ const topUndici = path.join(rootDir, "node_modules", "undici");
34
+
35
+ // 1. Remove shrinkwrap
36
+ if (fs.existsSync(shrinkwrap)) {
37
+ console.log("[pi-web] Removing pi-coding-agent shrinkwrap…");
38
+ fs.rmSync(shrinkwrap);
39
+ }
32
40
 
33
- // 2. Replace nested undici@8.5.0 with symlink to top-level undici@^8.10.0
34
- if (
35
- fs.existsSync(topUndici) &&
36
- fs.existsSync(nestedUndici) &&
37
- // Only replace if it's a real directory, not already a symlink
38
- fs.lstatSync(nestedUndici).isDirectory() &&
39
- !fs.lstatSync(nestedUndici).isSymbolicLink()
40
- ) {
41
- try {
42
- const nestedVersion = require(path.join(nestedUndici, "package.json")).version;
43
- const topVersion = require(path.join(topUndici, "package.json")).version;
44
-
45
- if (nestedVersion !== topVersion) {
46
- console.log(
47
- `[pi-web] Replacing pi-coding-agent's undici@${nestedVersion} ` +
48
- `→ symlink to undici@${topVersion}`,
49
- );
50
- fs.rmSync(nestedUndici, { recursive: true, force: true });
51
-
52
- const rel = path.relative(path.dirname(nestedUndici), topUndici);
53
- fs.symlinkSync(
54
- rel,
55
- nestedUndici,
56
- process.platform === "win32" ? "junction" : "dir",
57
- );
41
+ // 2. Replace nested undici@8.5.0 with symlink to top-level undici@^8.10.0
42
+ if (
43
+ fs.existsSync(topUndici) &&
44
+ fs.existsSync(nestedUndici) &&
45
+ // Only replace if it's a real directory, not already a symlink
46
+ fs.lstatSync(nestedUndici).isDirectory() &&
47
+ !fs.lstatSync(nestedUndici).isSymbolicLink()
48
+ ) {
49
+ try {
50
+ const nestedVersion = require(path.join(nestedUndici, "package.json")).version;
51
+ const topVersion = require(path.join(topUndici, "package.json")).version;
52
+
53
+ if (nestedVersion !== topVersion) {
54
+ console.log(
55
+ `[pi-web] Replacing pi-coding-agent's undici@${nestedVersion} ` +
56
+ `→ symlink to undici@${topVersion}`,
57
+ );
58
+ fs.rmSync(nestedUndici, { recursive: true, force: true });
59
+
60
+ const rel = path.relative(path.dirname(nestedUndici), topUndici);
61
+ fs.symlinkSync(
62
+ rel,
63
+ nestedUndici,
64
+ process.platform === "win32" ? "junction" : "dir",
65
+ );
66
+ }
67
+ } catch (err) {
68
+ console.warn("[pi-web] Symlink fix skipped:", err.message);
58
69
  }
59
- } catch (err) {
60
- console.warn("[pi-web] Symlink fix skipped:", err.message);
61
70
  }
62
71
  }
72
+
73
+ module.exports = { applyUndiciFix };
74
+
75
+ if (require.main === module) {
76
+ applyUndiciFix();
77
+ }