@qt4798/pi-web 0.9.15 → 0.9.16-beta.1

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 (304) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +29 -13
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/prerender-manifest.json +3 -3
  5. package/.next/react-loadable-manifest.json +4 -0
  6. package/.next/required-server-files.js +1 -1
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/routes-manifest.json +107 -0
  9. package/.next/server/app/_global-error/page.js +3 -3
  10. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_global-error.html +1 -1
  12. package/.next/server/app/_global-error.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/.next/server/app/_not-found/page.js +2 -2
  20. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/.next/server/app/_not-found.html +1 -1
  22. package/.next/server/app/_not-found.rsc +1 -1
  23. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  24. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  25. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  26. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  27. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  28. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  29. package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
  30. package/.next/server/app/api/agent/[id]/events/route.js +1 -1
  31. package/.next/server/app/api/agent/[id]/route.js +1 -1
  32. package/.next/server/app/api/agent/new/route.js +1 -1
  33. package/.next/server/app/api/agent/running/route.js +1 -1
  34. package/.next/server/app/api/auth/all-providers/route.js +1 -1
  35. package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
  36. package/.next/server/app/api/auth/login/[provider]/route.js +1 -1
  37. package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
  38. package/.next/server/app/api/auth/providers/route.js +1 -1
  39. package/.next/server/app/api/backup/export/route.js +1 -1
  40. package/.next/server/app/api/backup/import/route.js +1 -1
  41. package/.next/server/app/api/cwd/browse/route.js +1 -1
  42. package/.next/server/app/api/cwd/validate/route.js +1 -1
  43. package/.next/server/app/api/default-cwd/route.js +1 -1
  44. package/.next/server/app/api/features/route.js +1 -0
  45. package/.next/server/app/api/features/route.js.nft.json +1 -0
  46. package/.next/server/app/api/features/route_client-reference-manifest.js +1 -0
  47. package/.next/server/app/api/file-index/route.js +1 -1
  48. package/.next/server/app/api/files/[...path]/route.js +1 -1
  49. package/.next/server/app/api/git/diff/route.js +6 -1
  50. package/.next/server/app/api/git/diff/route.js.nft.json +1 -1
  51. package/.next/server/app/api/git/push/route.js +2 -0
  52. package/.next/server/app/api/git/push/route.js.nft.json +1 -0
  53. package/.next/server/app/api/git/push/route_client-reference-manifest.js +1 -0
  54. package/.next/server/app/api/git/stash/route.js +2 -0
  55. package/.next/server/app/api/git/stash/route.js.nft.json +1 -0
  56. package/.next/server/app/api/git/stash/route_client-reference-manifest.js +1 -0
  57. package/.next/server/app/api/git/status/route.js +6 -1
  58. package/.next/server/app/api/git/status/route.js.nft.json +1 -1
  59. package/.next/server/app/api/home/route.js +1 -1
  60. package/.next/server/app/api/import/discover/route.js +1 -1
  61. package/.next/server/app/api/import/execute/route.js +1 -1
  62. package/.next/server/app/api/import/status/route.js +1 -1
  63. package/.next/server/app/api/models/route.js +1 -1
  64. package/.next/server/app/api/models-config/builtin/route.js +1 -1
  65. package/.next/server/app/api/models-config/catalog/route.js +1 -1
  66. package/.next/server/app/api/models-config/discover/route.js +1 -1
  67. package/.next/server/app/api/models-config/route.js +1 -1
  68. package/.next/server/app/api/models-config/test/route.js +1 -1
  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/proxy/route.js +1 -0
  72. package/.next/server/app/api/proxy/route.js.nft.json +1 -0
  73. package/.next/server/app/api/proxy/route_client-reference-manifest.js +1 -0
  74. package/.next/server/app/api/proxy/test/route.js +1 -0
  75. package/.next/server/app/api/proxy/test/route.js.nft.json +1 -0
  76. package/.next/server/app/api/proxy/test/route_client-reference-manifest.js +1 -0
  77. package/.next/server/app/api/sessions/[id]/auto-name/route.js +2 -2
  78. package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
  79. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -1
  80. package/.next/server/app/api/sessions/[id]/export/route.js +2 -2
  81. package/.next/server/app/api/sessions/[id]/queue-recovery/route.js +1 -1
  82. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  83. package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
  84. package/.next/server/app/api/sessions/route.js +1 -1
  85. package/.next/server/app/api/settings/title-model/route.js +1 -1
  86. package/.next/server/app/api/skills/check/route.js +1 -1
  87. package/.next/server/app/api/skills/install/route.js +1 -1
  88. package/.next/server/app/api/skills/route.js +2 -2
  89. package/.next/server/app/api/skills/search/route.js +1 -1
  90. package/.next/server/app/api/skills/update/route.js +1 -1
  91. package/.next/server/app/api/tasks/[id]/[action]/route.js +1 -0
  92. package/.next/server/app/api/tasks/[id]/[action]/route.js.nft.json +1 -0
  93. package/.next/server/app/api/tasks/[id]/[action]/route_client-reference-manifest.js +1 -0
  94. package/.next/server/app/api/tasks/[id]/changed-files/route.js +6 -0
  95. package/.next/server/app/api/tasks/[id]/changed-files/route.js.nft.json +1 -0
  96. package/.next/server/app/api/tasks/[id]/changed-files/route_client-reference-manifest.js +1 -0
  97. package/.next/server/app/api/tasks/[id]/diff/route.js +6 -0
  98. package/.next/server/app/api/tasks/[id]/diff/route.js.nft.json +1 -0
  99. package/.next/server/app/api/tasks/[id]/diff/route_client-reference-manifest.js +1 -0
  100. package/.next/server/app/api/tasks/[id]/events/route.js +1 -0
  101. package/.next/server/app/api/tasks/[id]/events/route.js.nft.json +1 -0
  102. package/.next/server/app/api/tasks/[id]/events/route_client-reference-manifest.js +1 -0
  103. package/.next/server/app/api/tasks/[id]/route.js +1 -0
  104. package/.next/server/app/api/tasks/[id]/route.js.nft.json +1 -0
  105. package/.next/server/app/api/tasks/[id]/route_client-reference-manifest.js +1 -0
  106. package/.next/server/app/api/tasks/batch/route.js +1 -0
  107. package/.next/server/app/api/tasks/batch/route.js.nft.json +1 -0
  108. package/.next/server/app/api/tasks/batch/route_client-reference-manifest.js +1 -0
  109. package/.next/server/app/api/tasks/events/route.js +3 -0
  110. package/.next/server/app/api/tasks/events/route.js.nft.json +1 -0
  111. package/.next/server/app/api/tasks/events/route_client-reference-manifest.js +1 -0
  112. package/.next/server/app/api/tasks/route.js +1 -0
  113. package/.next/server/app/api/tasks/route.js.nft.json +1 -0
  114. package/.next/server/app/api/tasks/route_client-reference-manifest.js +1 -0
  115. package/.next/server/app/api/tasks/settings/route.js +1 -0
  116. package/.next/server/app/api/tasks/settings/route.js.nft.json +1 -0
  117. package/.next/server/app/api/tasks/settings/route_client-reference-manifest.js +1 -0
  118. package/.next/server/app/api/tasks/templates/route.js +1 -0
  119. package/.next/server/app/api/tasks/templates/route.js.nft.json +1 -0
  120. package/.next/server/app/api/tasks/templates/route_client-reference-manifest.js +1 -0
  121. package/.next/server/app/api/themes/[name]/route.js +1 -1
  122. package/.next/server/app/api/themes/route.js +1 -1
  123. package/.next/server/app/api/usage/route.js +1 -0
  124. package/.next/server/app/api/usage/route.js.nft.json +1 -0
  125. package/.next/server/app/api/usage/route_client-reference-manifest.js +1 -0
  126. package/.next/server/app/api/worktrees/route.js +1 -1
  127. package/.next/server/app/icon.ico/route.js +1 -1
  128. package/.next/server/app/icon.png/route.js +1 -1
  129. package/.next/server/app/icon.svg/route.js +1 -1
  130. package/.next/server/app/index.html +1 -1
  131. package/.next/server/app/index.rsc +3 -3
  132. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  133. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  134. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  135. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  136. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  137. package/.next/server/app/page.js +11 -4
  138. package/.next/server/app/page_client-reference-manifest.js +1 -1
  139. package/.next/server/app-paths-manifest.json +29 -13
  140. package/.next/server/chunks/1499.js +22 -0
  141. package/.next/server/chunks/2834.js +1 -0
  142. package/.next/server/chunks/4253.js +16 -0
  143. package/.next/server/chunks/7774.js +121 -0
  144. package/.next/server/chunks/7915.js +1 -1
  145. package/.next/server/instrumentation.js +1 -1
  146. package/.next/server/instrumentation.js.nft.json +1 -1
  147. package/.next/server/middleware-build-manifest.js +1 -1
  148. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  149. package/.next/server/pages/404.html +1 -1
  150. package/.next/server/pages/500.html +1 -1
  151. package/.next/server/server-reference-manifest.json +1 -1
  152. package/.next/static/bQwfA6rX4NaYbsubUoY4b/_buildManifest.js +1 -0
  153. package/.next/static/chunks/8898-89d80b9022b54177.js +1 -0
  154. package/.next/static/chunks/app/_global-error/page-fc8ab8f162e8d6f5.js +1 -0
  155. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-fc8ab8f162e8d6f5.js +1 -0
  156. package/.next/static/chunks/app/api/agent/[id]/events/route-fc8ab8f162e8d6f5.js +1 -0
  157. package/.next/static/chunks/app/api/agent/[id]/route-fc8ab8f162e8d6f5.js +1 -0
  158. package/.next/static/chunks/app/api/agent/new/route-fc8ab8f162e8d6f5.js +1 -0
  159. package/.next/static/chunks/app/api/agent/running/route-fc8ab8f162e8d6f5.js +1 -0
  160. package/.next/static/chunks/app/api/auth/all-providers/route-fc8ab8f162e8d6f5.js +1 -0
  161. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-fc8ab8f162e8d6f5.js +1 -0
  162. package/.next/static/chunks/app/api/auth/login/[provider]/route-fc8ab8f162e8d6f5.js +1 -0
  163. package/.next/static/chunks/app/api/auth/logout/[provider]/route-fc8ab8f162e8d6f5.js +1 -0
  164. package/.next/static/chunks/app/api/auth/providers/route-fc8ab8f162e8d6f5.js +1 -0
  165. package/.next/static/chunks/app/api/backup/export/route-fc8ab8f162e8d6f5.js +1 -0
  166. package/.next/static/chunks/app/api/backup/import/route-fc8ab8f162e8d6f5.js +1 -0
  167. package/.next/static/chunks/app/api/cwd/browse/route-fc8ab8f162e8d6f5.js +1 -0
  168. package/.next/static/chunks/app/api/cwd/validate/route-fc8ab8f162e8d6f5.js +1 -0
  169. package/.next/static/chunks/app/api/default-cwd/route-fc8ab8f162e8d6f5.js +1 -0
  170. package/.next/static/chunks/app/api/features/route-fc8ab8f162e8d6f5.js +1 -0
  171. package/.next/static/chunks/app/api/file-index/route-fc8ab8f162e8d6f5.js +1 -0
  172. package/.next/static/chunks/app/api/files/[...path]/route-fc8ab8f162e8d6f5.js +1 -0
  173. package/.next/static/chunks/app/api/git/diff/route-fc8ab8f162e8d6f5.js +1 -0
  174. package/.next/static/chunks/app/api/git/push/route-fc8ab8f162e8d6f5.js +1 -0
  175. package/.next/static/chunks/app/api/git/stash/route-fc8ab8f162e8d6f5.js +1 -0
  176. package/.next/static/chunks/app/api/git/status/route-fc8ab8f162e8d6f5.js +1 -0
  177. package/.next/static/chunks/app/api/home/route-fc8ab8f162e8d6f5.js +1 -0
  178. package/.next/static/chunks/app/api/import/discover/route-fc8ab8f162e8d6f5.js +1 -0
  179. package/.next/static/chunks/app/api/import/execute/route-fc8ab8f162e8d6f5.js +1 -0
  180. package/.next/static/chunks/app/api/import/status/route-fc8ab8f162e8d6f5.js +1 -0
  181. package/.next/static/chunks/app/api/models/route-fc8ab8f162e8d6f5.js +1 -0
  182. package/.next/static/chunks/app/api/models-config/builtin/route-fc8ab8f162e8d6f5.js +1 -0
  183. package/.next/static/chunks/app/api/models-config/catalog/route-fc8ab8f162e8d6f5.js +1 -0
  184. package/.next/static/chunks/app/api/models-config/discover/route-fc8ab8f162e8d6f5.js +1 -0
  185. package/.next/static/chunks/app/api/models-config/route-fc8ab8f162e8d6f5.js +1 -0
  186. package/.next/static/chunks/app/api/models-config/test/route-fc8ab8f162e8d6f5.js +1 -0
  187. package/.next/static/chunks/app/api/plugins/route-fc8ab8f162e8d6f5.js +1 -0
  188. package/.next/static/chunks/app/api/project-trust/route-fc8ab8f162e8d6f5.js +1 -0
  189. package/.next/static/chunks/app/api/proxy/route-fc8ab8f162e8d6f5.js +1 -0
  190. package/.next/static/chunks/app/api/proxy/test/route-fc8ab8f162e8d6f5.js +1 -0
  191. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-fc8ab8f162e8d6f5.js +1 -0
  192. package/.next/static/chunks/app/api/sessions/[id]/context/route-fc8ab8f162e8d6f5.js +1 -0
  193. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-fc8ab8f162e8d6f5.js +1 -0
  194. package/.next/static/chunks/app/api/sessions/[id]/export/route-fc8ab8f162e8d6f5.js +1 -0
  195. package/.next/static/chunks/app/api/sessions/[id]/queue-recovery/route-fc8ab8f162e8d6f5.js +1 -0
  196. package/.next/static/chunks/app/api/sessions/[id]/route-fc8ab8f162e8d6f5.js +1 -0
  197. package/.next/static/chunks/app/api/sessions/[id]/state/route-fc8ab8f162e8d6f5.js +1 -0
  198. package/.next/static/chunks/app/api/sessions/route-fc8ab8f162e8d6f5.js +1 -0
  199. package/.next/static/chunks/app/api/settings/title-model/route-fc8ab8f162e8d6f5.js +1 -0
  200. package/.next/static/chunks/app/api/skills/check/route-fc8ab8f162e8d6f5.js +1 -0
  201. package/.next/static/chunks/app/api/skills/install/route-fc8ab8f162e8d6f5.js +1 -0
  202. package/.next/static/chunks/app/api/skills/route-fc8ab8f162e8d6f5.js +1 -0
  203. package/.next/static/chunks/app/api/skills/search/route-fc8ab8f162e8d6f5.js +1 -0
  204. package/.next/static/chunks/app/api/skills/update/route-fc8ab8f162e8d6f5.js +1 -0
  205. package/.next/static/chunks/app/api/tasks/[id]/[action]/route-fc8ab8f162e8d6f5.js +1 -0
  206. package/.next/static/chunks/app/api/tasks/[id]/changed-files/route-fc8ab8f162e8d6f5.js +1 -0
  207. package/.next/static/chunks/app/api/tasks/[id]/diff/route-fc8ab8f162e8d6f5.js +1 -0
  208. package/.next/static/chunks/app/api/tasks/[id]/events/route-fc8ab8f162e8d6f5.js +1 -0
  209. package/.next/static/chunks/app/api/tasks/[id]/route-fc8ab8f162e8d6f5.js +1 -0
  210. package/.next/static/chunks/app/api/tasks/batch/route-fc8ab8f162e8d6f5.js +1 -0
  211. package/.next/static/chunks/app/api/tasks/events/route-fc8ab8f162e8d6f5.js +1 -0
  212. package/.next/static/chunks/app/api/tasks/route-fc8ab8f162e8d6f5.js +1 -0
  213. package/.next/static/chunks/app/api/tasks/settings/route-fc8ab8f162e8d6f5.js +1 -0
  214. package/.next/static/chunks/app/api/tasks/templates/route-fc8ab8f162e8d6f5.js +1 -0
  215. package/.next/static/chunks/app/api/themes/[name]/route-fc8ab8f162e8d6f5.js +1 -0
  216. package/.next/static/chunks/app/api/themes/route-fc8ab8f162e8d6f5.js +1 -0
  217. package/.next/static/chunks/app/api/usage/route-fc8ab8f162e8d6f5.js +1 -0
  218. package/.next/static/chunks/app/api/worktrees/route-fc8ab8f162e8d6f5.js +1 -0
  219. package/.next/static/chunks/app/page-3a71956f793d87f7.js +22 -0
  220. package/.next/static/chunks/next/dist/client/components/builtin/app-error-fc8ab8f162e8d6f5.js +1 -0
  221. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-fc8ab8f162e8d6f5.js +1 -0
  222. package/.next/static/chunks/next/dist/client/components/builtin/not-found-fc8ab8f162e8d6f5.js +1 -0
  223. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-fc8ab8f162e8d6f5.js +1 -0
  224. package/.next/trace +179 -7
  225. package/.next/trace-build +1 -1
  226. package/.next/types/app/api/features/route.ts +351 -0
  227. package/.next/types/app/api/git/push/route.ts +351 -0
  228. package/.next/types/app/api/git/stash/route.ts +351 -0
  229. package/.next/types/app/api/proxy/route.ts +351 -0
  230. package/.next/types/app/api/proxy/test/route.ts +351 -0
  231. package/.next/types/app/api/tasks/[id]/[action]/route.ts +351 -0
  232. package/.next/types/app/api/tasks/[id]/changed-files/route.ts +351 -0
  233. package/.next/types/app/api/tasks/[id]/diff/route.ts +351 -0
  234. package/.next/types/app/api/tasks/[id]/events/route.ts +351 -0
  235. package/.next/types/app/api/tasks/[id]/route.ts +351 -0
  236. package/.next/types/app/api/tasks/batch/route.ts +351 -0
  237. package/.next/types/app/api/tasks/events/route.ts +351 -0
  238. package/.next/types/app/api/tasks/route.ts +351 -0
  239. package/.next/types/app/api/tasks/settings/route.ts +351 -0
  240. package/.next/types/app/api/tasks/templates/route.ts +351 -0
  241. package/.next/types/app/api/usage/route.ts +351 -0
  242. package/.next/types/routes.d.ts +17 -1
  243. package/.next/types/validator.ts +144 -0
  244. package/README.en.md +47 -0
  245. package/README.md +63 -2
  246. package/package.json +1 -1
  247. package/.next/server/chunks/3961.js +0 -6
  248. package/.next/static/2u8qV5tbHVkAgCeA8TyZR/_buildManifest.js +0 -1
  249. package/.next/static/chunks/7253-7943c800c2fd7b70.js +0 -1
  250. package/.next/static/chunks/app/_global-error/page-bc5f4c047207b363.js +0 -1
  251. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-bc5f4c047207b363.js +0 -1
  252. package/.next/static/chunks/app/api/agent/[id]/events/route-bc5f4c047207b363.js +0 -1
  253. package/.next/static/chunks/app/api/agent/[id]/route-bc5f4c047207b363.js +0 -1
  254. package/.next/static/chunks/app/api/agent/new/route-bc5f4c047207b363.js +0 -1
  255. package/.next/static/chunks/app/api/agent/running/route-bc5f4c047207b363.js +0 -1
  256. package/.next/static/chunks/app/api/auth/all-providers/route-bc5f4c047207b363.js +0 -1
  257. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-bc5f4c047207b363.js +0 -1
  258. package/.next/static/chunks/app/api/auth/login/[provider]/route-bc5f4c047207b363.js +0 -1
  259. package/.next/static/chunks/app/api/auth/logout/[provider]/route-bc5f4c047207b363.js +0 -1
  260. package/.next/static/chunks/app/api/auth/providers/route-bc5f4c047207b363.js +0 -1
  261. package/.next/static/chunks/app/api/backup/export/route-bc5f4c047207b363.js +0 -1
  262. package/.next/static/chunks/app/api/backup/import/route-bc5f4c047207b363.js +0 -1
  263. package/.next/static/chunks/app/api/cwd/browse/route-bc5f4c047207b363.js +0 -1
  264. package/.next/static/chunks/app/api/cwd/validate/route-bc5f4c047207b363.js +0 -1
  265. package/.next/static/chunks/app/api/default-cwd/route-bc5f4c047207b363.js +0 -1
  266. package/.next/static/chunks/app/api/file-index/route-bc5f4c047207b363.js +0 -1
  267. package/.next/static/chunks/app/api/files/[...path]/route-bc5f4c047207b363.js +0 -1
  268. package/.next/static/chunks/app/api/git/diff/route-bc5f4c047207b363.js +0 -1
  269. package/.next/static/chunks/app/api/git/status/route-bc5f4c047207b363.js +0 -1
  270. package/.next/static/chunks/app/api/home/route-bc5f4c047207b363.js +0 -1
  271. package/.next/static/chunks/app/api/import/discover/route-bc5f4c047207b363.js +0 -1
  272. package/.next/static/chunks/app/api/import/execute/route-bc5f4c047207b363.js +0 -1
  273. package/.next/static/chunks/app/api/import/status/route-bc5f4c047207b363.js +0 -1
  274. package/.next/static/chunks/app/api/models/route-bc5f4c047207b363.js +0 -1
  275. package/.next/static/chunks/app/api/models-config/builtin/route-bc5f4c047207b363.js +0 -1
  276. package/.next/static/chunks/app/api/models-config/catalog/route-bc5f4c047207b363.js +0 -1
  277. package/.next/static/chunks/app/api/models-config/discover/route-bc5f4c047207b363.js +0 -1
  278. package/.next/static/chunks/app/api/models-config/route-bc5f4c047207b363.js +0 -1
  279. package/.next/static/chunks/app/api/models-config/test/route-bc5f4c047207b363.js +0 -1
  280. package/.next/static/chunks/app/api/plugins/route-bc5f4c047207b363.js +0 -1
  281. package/.next/static/chunks/app/api/project-trust/route-bc5f4c047207b363.js +0 -1
  282. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-bc5f4c047207b363.js +0 -1
  283. package/.next/static/chunks/app/api/sessions/[id]/context/route-bc5f4c047207b363.js +0 -1
  284. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-bc5f4c047207b363.js +0 -1
  285. package/.next/static/chunks/app/api/sessions/[id]/export/route-bc5f4c047207b363.js +0 -1
  286. package/.next/static/chunks/app/api/sessions/[id]/queue-recovery/route-bc5f4c047207b363.js +0 -1
  287. package/.next/static/chunks/app/api/sessions/[id]/route-bc5f4c047207b363.js +0 -1
  288. package/.next/static/chunks/app/api/sessions/[id]/state/route-bc5f4c047207b363.js +0 -1
  289. package/.next/static/chunks/app/api/sessions/route-bc5f4c047207b363.js +0 -1
  290. package/.next/static/chunks/app/api/settings/title-model/route-bc5f4c047207b363.js +0 -1
  291. package/.next/static/chunks/app/api/skills/check/route-bc5f4c047207b363.js +0 -1
  292. package/.next/static/chunks/app/api/skills/install/route-bc5f4c047207b363.js +0 -1
  293. package/.next/static/chunks/app/api/skills/route-bc5f4c047207b363.js +0 -1
  294. package/.next/static/chunks/app/api/skills/search/route-bc5f4c047207b363.js +0 -1
  295. package/.next/static/chunks/app/api/skills/update/route-bc5f4c047207b363.js +0 -1
  296. package/.next/static/chunks/app/api/themes/[name]/route-bc5f4c047207b363.js +0 -1
  297. package/.next/static/chunks/app/api/themes/route-bc5f4c047207b363.js +0 -1
  298. package/.next/static/chunks/app/api/worktrees/route-bc5f4c047207b363.js +0 -1
  299. package/.next/static/chunks/app/page-3e915a4cae4742de.js +0 -15
  300. package/.next/static/chunks/next/dist/client/components/builtin/app-error-bc5f4c047207b363.js +0 -1
  301. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-bc5f4c047207b363.js +0 -1
  302. package/.next/static/chunks/next/dist/client/components/builtin/not-found-bc5f4c047207b363.js +0 -1
  303. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-bc5f4c047207b363.js +0 -1
  304. /package/.next/static/{2u8qV5tbHVkAgCeA8TyZR → bQwfA6rX4NaYbsubUoY4b}/_ssgManifest.js +0 -0
@@ -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/file-index" | "/api/files/[...path]" | "/api/git/diff" | "/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/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/themes" | "/api/themes/[name]" | "/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/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
@@ -27,9 +27,12 @@ interface ParamMap {
27
27
  "/api/cwd/browse": {}
28
28
  "/api/cwd/validate": {}
29
29
  "/api/default-cwd": {}
30
+ "/api/features": {}
30
31
  "/api/file-index": {}
31
32
  "/api/files/[...path]": { "path": string[]; }
32
33
  "/api/git/diff": {}
34
+ "/api/git/push": {}
35
+ "/api/git/stash": {}
33
36
  "/api/git/status": {}
34
37
  "/api/home": {}
35
38
  "/api/import/discover": {}
@@ -43,6 +46,8 @@ interface ParamMap {
43
46
  "/api/models-config/test": {}
44
47
  "/api/plugins": {}
45
48
  "/api/project-trust": {}
49
+ "/api/proxy": {}
50
+ "/api/proxy/test": {}
46
51
  "/api/sessions": {}
47
52
  "/api/sessions/[id]": { "id": string; }
48
53
  "/api/sessions/[id]/auto-name": { "id": string; }
@@ -57,8 +62,19 @@ interface ParamMap {
57
62
  "/api/skills/install": {}
58
63
  "/api/skills/search": {}
59
64
  "/api/skills/update": {}
65
+ "/api/tasks": {}
66
+ "/api/tasks/[id]": { "id": string; }
67
+ "/api/tasks/[id]/[action]": { "id": string; "action": string; }
68
+ "/api/tasks/[id]/changed-files": { "id": string; }
69
+ "/api/tasks/[id]/diff": { "id": string; }
70
+ "/api/tasks/[id]/events": { "id": string; }
71
+ "/api/tasks/batch": {}
72
+ "/api/tasks/events": {}
73
+ "/api/tasks/settings": {}
74
+ "/api/tasks/templates": {}
60
75
  "/api/themes": {}
61
76
  "/api/themes/[name]": { "name": string; }
77
+ "/api/usage": {}
62
78
  "/api/worktrees": {}
63
79
  }
64
80
 
@@ -191,6 +191,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
191
191
  type __Unused = __Check
192
192
  }
193
193
 
194
+ // Validate ../../app/api/features/route.ts
195
+ {
196
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/features">> = Specific
197
+ const handler = {} as typeof import("../../app/api/features/route.js")
198
+ type __Check = __IsExpected<typeof handler>
199
+ // @ts-ignore
200
+ type __Unused = __Check
201
+ }
202
+
194
203
  // Validate ../../app/api/file-index/route.ts
195
204
  {
196
205
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/file-index">> = Specific
@@ -218,6 +227,24 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
218
227
  type __Unused = __Check
219
228
  }
220
229
 
230
+ // Validate ../../app/api/git/push/route.ts
231
+ {
232
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/git/push">> = Specific
233
+ const handler = {} as typeof import("../../app/api/git/push/route.js")
234
+ type __Check = __IsExpected<typeof handler>
235
+ // @ts-ignore
236
+ type __Unused = __Check
237
+ }
238
+
239
+ // Validate ../../app/api/git/stash/route.ts
240
+ {
241
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/git/stash">> = Specific
242
+ const handler = {} as typeof import("../../app/api/git/stash/route.js")
243
+ type __Check = __IsExpected<typeof handler>
244
+ // @ts-ignore
245
+ type __Unused = __Check
246
+ }
247
+
221
248
  // Validate ../../app/api/git/status/route.ts
222
249
  {
223
250
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/git/status">> = Specific
@@ -335,6 +362,24 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
335
362
  type __Unused = __Check
336
363
  }
337
364
 
365
+ // Validate ../../app/api/proxy/route.ts
366
+ {
367
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/proxy">> = Specific
368
+ const handler = {} as typeof import("../../app/api/proxy/route.js")
369
+ type __Check = __IsExpected<typeof handler>
370
+ // @ts-ignore
371
+ type __Unused = __Check
372
+ }
373
+
374
+ // Validate ../../app/api/proxy/test/route.ts
375
+ {
376
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/proxy/test">> = Specific
377
+ const handler = {} as typeof import("../../app/api/proxy/test/route.js")
378
+ type __Check = __IsExpected<typeof handler>
379
+ // @ts-ignore
380
+ type __Unused = __Check
381
+ }
382
+
338
383
  // Validate ../../app/api/sessions/[id]/auto-name/route.ts
339
384
  {
340
385
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/sessions/[id]/auto-name">> = Specific
@@ -461,6 +506,96 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
461
506
  type __Unused = __Check
462
507
  }
463
508
 
509
+ // Validate ../../app/api/tasks/[id]/[action]/route.ts
510
+ {
511
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/tasks/[id]/[action]">> = Specific
512
+ const handler = {} as typeof import("../../app/api/tasks/[id]/[action]/route.js")
513
+ type __Check = __IsExpected<typeof handler>
514
+ // @ts-ignore
515
+ type __Unused = __Check
516
+ }
517
+
518
+ // Validate ../../app/api/tasks/[id]/changed-files/route.ts
519
+ {
520
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/tasks/[id]/changed-files">> = Specific
521
+ const handler = {} as typeof import("../../app/api/tasks/[id]/changed-files/route.js")
522
+ type __Check = __IsExpected<typeof handler>
523
+ // @ts-ignore
524
+ type __Unused = __Check
525
+ }
526
+
527
+ // Validate ../../app/api/tasks/[id]/diff/route.ts
528
+ {
529
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/tasks/[id]/diff">> = Specific
530
+ const handler = {} as typeof import("../../app/api/tasks/[id]/diff/route.js")
531
+ type __Check = __IsExpected<typeof handler>
532
+ // @ts-ignore
533
+ type __Unused = __Check
534
+ }
535
+
536
+ // Validate ../../app/api/tasks/[id]/events/route.ts
537
+ {
538
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/tasks/[id]/events">> = Specific
539
+ const handler = {} as typeof import("../../app/api/tasks/[id]/events/route.js")
540
+ type __Check = __IsExpected<typeof handler>
541
+ // @ts-ignore
542
+ type __Unused = __Check
543
+ }
544
+
545
+ // Validate ../../app/api/tasks/[id]/route.ts
546
+ {
547
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/tasks/[id]">> = Specific
548
+ const handler = {} as typeof import("../../app/api/tasks/[id]/route.js")
549
+ type __Check = __IsExpected<typeof handler>
550
+ // @ts-ignore
551
+ type __Unused = __Check
552
+ }
553
+
554
+ // Validate ../../app/api/tasks/batch/route.ts
555
+ {
556
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/tasks/batch">> = Specific
557
+ const handler = {} as typeof import("../../app/api/tasks/batch/route.js")
558
+ type __Check = __IsExpected<typeof handler>
559
+ // @ts-ignore
560
+ type __Unused = __Check
561
+ }
562
+
563
+ // Validate ../../app/api/tasks/events/route.ts
564
+ {
565
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/tasks/events">> = Specific
566
+ const handler = {} as typeof import("../../app/api/tasks/events/route.js")
567
+ type __Check = __IsExpected<typeof handler>
568
+ // @ts-ignore
569
+ type __Unused = __Check
570
+ }
571
+
572
+ // Validate ../../app/api/tasks/route.ts
573
+ {
574
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/tasks">> = Specific
575
+ const handler = {} as typeof import("../../app/api/tasks/route.js")
576
+ type __Check = __IsExpected<typeof handler>
577
+ // @ts-ignore
578
+ type __Unused = __Check
579
+ }
580
+
581
+ // Validate ../../app/api/tasks/settings/route.ts
582
+ {
583
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/tasks/settings">> = Specific
584
+ const handler = {} as typeof import("../../app/api/tasks/settings/route.js")
585
+ type __Check = __IsExpected<typeof handler>
586
+ // @ts-ignore
587
+ type __Unused = __Check
588
+ }
589
+
590
+ // Validate ../../app/api/tasks/templates/route.ts
591
+ {
592
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/tasks/templates">> = Specific
593
+ const handler = {} as typeof import("../../app/api/tasks/templates/route.js")
594
+ type __Check = __IsExpected<typeof handler>
595
+ // @ts-ignore
596
+ type __Unused = __Check
597
+ }
598
+
464
599
  // Validate ../../app/api/themes/[name]/route.ts
465
600
  {
466
601
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/themes/[name]">> = Specific
@@ -479,6 +614,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
479
614
  type __Unused = __Check
480
615
  }
481
616
 
617
+ // Validate ../../app/api/usage/route.ts
618
+ {
619
+ type __IsExpected<Specific extends RouteHandlerConfig<"/api/usage">> = Specific
620
+ const handler = {} as typeof import("../../app/api/usage/route.js")
621
+ type __Check = __IsExpected<typeof handler>
622
+ // @ts-ignore
623
+ type __Unused = __Check
624
+ }
625
+
482
626
  // Validate ../../app/api/worktrees/route.ts
483
627
  {
484
628
  type __IsExpected<Specific extends RouteHandlerConfig<"/api/worktrees">> = Specific
package/README.en.md CHANGED
@@ -17,10 +17,57 @@
17
17
  - A browsable folder picker for loading a project without manually entering a path.
18
18
  - File explorer and preview for source, diffs, images, audio, PDF, and DOCX files.
19
19
  - Model, OAuth/API-key, skill, plugin, theme, language, and Git worktree management in the browser.
20
+ - Task board (Beta, desktop only): four-column kanban that runs each task as an agent in its own git worktree branch, with review, merge, archive and per-project settings.
20
21
  - Mobile layout keeps the selected model and send action visible, while long project and repository labels truncate instead of causing horizontal scrolling.
21
22
 
23
+ ## Task board (Beta)
24
+
25
+ On desktop, click the board button (four-square icon) in the title bar to toggle between chat and the task board. The board turns "delegate work to an agent" into a trackable pipeline: create → start → run → review → merge → done.
26
+
27
+ ### Status columns
28
+
29
+ | Column | Statuses | Meaning |
30
+ | --- | --- | --- |
31
+ | Todo | `todo` | Created, waiting to start |
32
+ | In progress | `queued` / `preparing` / `running` | Queued, setting up the worktree, agent running |
33
+ | Attention | `awaiting_input` / `review` / `merging` / `failed` | Needs you: waiting for input, review, merging, failed |
34
+ | Done | `done` / `canceled` | Finished or canceled (canceled hidden by default, toggle in Filter) |
35
+
36
+ ### Workflow
37
+
38
+ 1. **New task** — pick a project, write a title and a prompt (task description). Save recurring prompts as templates.
39
+ 2. **Start** — click **Start** on the card; the engine creates a dedicated branch (`task/<id>-<slug>`) under the project's `-worktrees` directory and runs the agent there. You can also drag a todo card onto the **In progress** column to start it, or use **Start all** to queue every todo of the project.
40
+ 3. **Running / cancel** — cancel anytime while running; tasks that need your input flip to *awaiting input*.
41
+ 4. **Review** — when the agent finishes, the task moves to **Attention** (a red badge appears in the board title; a system notification fires while the window is inactive). Open the detail drawer to inspect changed files, diffs and the full timeline; projects with a preflight command show an acceptance red/green light.
42
+ - **Merge** — accept the result (auto or manual commit message; optionally delete the worktree). The agent merges inside its session; the task then lands in **Done**.
43
+ - **Return** — send it back with feedback to keep working.
44
+ 5. **Archive** — archive finished/failed/canceled tasks (hidden by default, toggle in Filter); **Archive all** clears the Done column.
45
+ 6. **Failures** — failed tasks show the error; **Retry** relaunches on a new run generation, or **Edit** then restart; canceled tasks can be **re-queued**.
46
+
47
+ ### Task settings
48
+
49
+ The board's own **Task settings** button configures per-project execution (separate from the main Settings modal):
50
+
51
+ | Setting | Meaning |
52
+ | --- | --- |
53
+ | Auto-process queued tasks | Start tasks as soon as they are queued |
54
+ | Max concurrent tasks | Per-project execution limit (0 = unlimited) |
55
+ | Merge strategy | Merge commit or squash |
56
+ | Delete worktree after merge (default) | Auto-clean worktree + branch after merge |
57
+ | Preflight command | Command run in the worktree before review (acceptance check, e.g. `npm test`) |
58
+ | Init command | Command run in the worktree before the agent starts (e.g. `pnpm install`) |
59
+ | Stage prompts | Extra instructions per stage: work / retry / return / merge |
60
+
61
+ ### Notes & limits
62
+
63
+ - Tasks are stored under `~/.pi/agent/tasks/` (JSONL, atomic writes); task sessions live with your other sessions and are browsable from the sessions list.
64
+ - Each task runs in its own git worktree branch; task agents are explicitly constrained not to commit/push other branches or checkouts.
65
+ - The engine is a single server process (exclusive lock); interrupted tasks are recovered on restart (marked failed/interrupted, retryable).
66
+ - Beta: desktop only; the mobile UI does not show the board.
67
+
22
68
  ## Latest changes (2026-08-05)
23
69
 
70
+ - **Task board (Beta, desktop)** — a new title-bar button toggles a four-column kanban (Todo / In progress / Attention / Done) that runs each task as an agent in its own git worktree branch: drag-to-start, detail drawer (timeline / diff / changed files), review & merge, return with feedback, archive, task templates, per-project task settings (concurrency / merge strategy / preflight / init command / stage prompts), system notifications, and full i18n + theme support. Tasks are stored under `~/.pi/agent/tasks/` (JSONL).
24
71
  - **Builtin model config persistence fix** — edits to builtin provider models (context window / max output / reasoning / thinking map / name / hidden) now persist as field-level `modelOverrides` instead of whole-model replacement entries, so untouched fields are never reset. All `models.json` mutations are serialized behind a file lock with atomic writes; local saves and the global Save button can no longer overwrite each other.
25
72
  - **Draft protection** — switching providers, clicking the global Save, or closing Settings first flushes pending builtin model edits; on failure the draft is kept and an error is shown instead of silently dropping changes. Historical `models[]` configs remain supported with custom/transport fields preserved.
26
73
 
package/README.md CHANGED
@@ -34,11 +34,72 @@
34
34
  | 备份恢复 | 一键导出/导入核心配置、技能、插件、MCP 服务器与会话(可选含密钥),跨平台自动适配路径与命令。 |
35
35
  | 技能与插件 | 查询、安装、启停 Skills 与 package 插件。 |
36
36
  | Git Worktree | 在同一项目下创建、切换和移除 Worktree。 |
37
+ | 任务看板 | 桌面端四列看板:把任务交给 agent 在 worktree 分支中执行,支持验收、合并、归档、每项目设置(Beta)。 |
37
38
  | 主题与语言 | 支持 Pi TUI 主题、亮暗模式及中文/English。 |
38
39
  | 移动端 | 适配 Safari/Chrome 窄屏布局;模型选择和发送操作保持可见。 |
39
40
 
40
- ## 最新更新(2026-08-05)
41
+ ## 任务看板(Beta)
41
42
 
43
+ 桌面端(非移动端)点击标题栏的看板按钮(四宫格图标)即可在聊天与任务看板之间切换。看板把「给 agent 派活」变成了一个可跟踪、可验收、可归档的流水线。
44
+
45
+ ### 状态与四列
46
+
47
+ 任务按状态落入四列:
48
+
49
+ | 列 | 状态 | 说明 |
50
+ | --- | --- | --- |
51
+ | 待办 | `todo` | 已创建、等待启动 |
52
+ | 进行中 | `queued` / `preparing` / `running` | 排队中、创建 worktree 中、agent 执行中 |
53
+ | 待处理 | `awaiting_input` / `review` / `merging` / `failed` | 需要你处理:等待输入、待验收、合并中、失败 |
54
+ | 已完成 | `done` / `canceled` | 完成或取消(取消默认隐藏,可在筛选里打开) |
55
+
56
+ 一条任务的完整生命周期:**创建 → 启动 → 执行 → 待验收 → 合并 → 已完成**。
57
+
58
+ ### 使用流程
59
+
60
+ 1. **新建任务**:点击「新建任务」,选择项目、填写标题与任务说明(prompt)。可把常用任务存为模板复用。
61
+ 2. **启动**:点击卡片上的「开始」,引擎会自动在该项目的 `-worktrees` 目录下创建独立分支(`task/<id>-<slug>`),在其中启动 agent 执行。也可以把待办卡片**拖到「进行中」列**直接启动;「全部启动」会排队当前项目的全部待办任务。
62
+ 3. **执行与等待**:任务运行时可随时点「取消」;agent 需要你输入时会进入「等待输入」状态。
63
+ 4. **验收**:agent 完成后任务进入「待处理」列(顶部标题栏会出现红色待处理计数徽章,窗口未激活时还会收到系统通知)。点卡片打开详情抽屉:查看变更文件、Diff、完整时间线;配置了预检命令的项目会显示验收红绿灯。
64
+ - **合并**:接受产出,可选择自动/手动提交信息、是否删除 worktree。合并由 agent 在会话内完成,成功后任务进入「已完成」。
65
+ - **退回**:不满意时填写反馈退回给 agent 继续修改。
66
+ 5. **归档**:已完成/失败/取消的任务可归档(默认隐藏,筛选里可显示);「全部归档」一键清空已完成列。
67
+ 6. **失败处理**:失败任务显示错误信息,可「重试」(换新代际重新执行)或「编辑」后重新启动;取消的任务可「重新排队」回到待办。
68
+
69
+ ### 任务设置
70
+
71
+ 看板标题栏的「任务设置」按项目配置执行行为(独立于主设置弹窗):
72
+
73
+ | 设置 | 说明 |
74
+ | --- | --- |
75
+ | 自动处理排队任务 | 开启后任务一排队即自动启动 |
76
+ | 最大并发任务数 | 每项目同时执行的上限(0 = 不限) |
77
+ | 合并策略 | 合并提交(merge commit)或压缩提交(squash) |
78
+ | 合并后删除 worktree(默认) | 合并完成后自动清理 worktree 与分支 |
79
+ | 预检命令(验收检查) | 任务进入待验收前在 worktree 中运行的命令,输出红绿灯结果(如 `npm test`) |
80
+ | 初始化命令 | agent 启动前在 worktree 中执行(如 `pnpm install`) |
81
+ | 阶段提示词 | 执行 / 重试 / 退回 / 合并各阶段的附加指令 |
82
+
83
+ ### 技术说明与限制
84
+
85
+ - 任务存储于 `~/.pi/agent/tasks/`(JSONL,原子写),与会话文件同级;任务会话与其他会话一样可在会话列表查看。
86
+ - 每个任务在独立 git worktree 分支中执行,互不干扰;**任务 agent 被明确约束不得提交/推送其他分支或工作区的改动**。
87
+ - 引擎由服务器进程持有(单实例锁),重启后自动恢复中断的任务(标记为失败/中断,可重试)。
88
+ - Beta 阶段:仅在桌面端显示入口;移动端不可用。
89
+
90
+ ## 最新更新(2026-08-06 · v0.9.16-beta.1)
91
+
92
+ - **代理配置**:设置弹窗新增「代理」标签页,支持 HTTP / HTTPS / SOCKS5 代理,主机端口与用户名密码分开填写、密码脱敏;可测试连通性;保存后运行时热生效无需重启。适用于外部代理与本地代理(Clash / V2Ray 等)。
93
+ - **计划模式**:输入框左下角加号升级为三选项菜单(常规 / 计划 / 上传文件)。计划模式切到只读工具集并自动注入「只读分析、输出实现计划」指令,输入框显示「计划模式」徽章;计划完成后弹出确认框,可确认执行、提出建议继续完善、或退出计划模式。
94
+ - **用量统计**:设置弹窗新增「用量」标签页,支持当前会话(实时上下文占用环形图)与全局(总量、每日趋势、Top 会话)切换;优先使用会话中真实记录的模型用量,无记录时按文本估算。
95
+ - **任务看板增强**:取消任务可填原因;重试/重新排队可填备注(注入下次运行提示词);无文件变更的任务支持「直接完成」跳过合并;所有列按更新时间最新优先。
96
+ - **任务从消息创建**:用户消息悬浮栏新增「创建任务」按钮,自动打开看板并预填。
97
+ - **一键推送与 Stash**:会话信息栏新增推送按钮与 Stash 管理(列表 / 保存 / 恢复 / 删除)。
98
+ - **功能开关**:设置弹窗新增「功能」标签页,可整体开关任务看板(Beta)。
99
+
100
+ ## 历史更新(2026-08-05)
101
+
102
+ - **任务看板(Beta,桌面端)**:标题栏新增看板按钮,四列看板(待办/进行中/待处理/已完成)把任务交给 agent 在独立 git worktree 分支中执行;支持拖拽启动、详情抽屉(时间线/Diff/变更文件)、验收合并、退回反馈、归档、任务模板、每项目任务设置(并发/合并策略/预检/初始化命令/阶段提示词)、系统通知与中英文/主题适配。任务存于 `~/.pi/agent/tasks/`(JSONL)。
42
103
  - **内置模型配置持久化修复**:内置供应商模型编辑(上下文窗口 / 最大输出 / 思考映射 / 名称 / 隐藏)改为写入 SDK 原生 `modelOverrides` 字段级覆盖,不再整模型替换,也不会重置未修改字段;`models.json` 读写加互斥锁与原子写,局部保存和全局保存互不覆盖。
43
104
  - **草稿保护**:切换供应商、点击全局保存或关闭设置前会自动保存未提交的内置模型修改;保存失败保留草稿并提示,不再静默丢失。兼容历史 `models[]` 配置,自定义与传输字段原样保留。
44
105
  - **备份导入修复**:修复超过 10MB 的备份包导入被截断(413)的问题,上传上限与导入接口对齐(600MB);导入按钮改为标准按钮样式,不再像纯文字。
@@ -71,7 +132,7 @@
71
132
 
72
133
  - `allow-scripts`:npm 11 新增的安装脚本审批提示(sharp / protobufjs / @google/genai 等)。本项目已在包内声明 `allowScripts`,若你的 npm 仍提示,可执行 `npm approve-scripts --all` 审批,或在安装命令加 `--allow-scripts=sharp,protobufjs,@google/genai`。
73
134
 
74
- ## 最新更新(2026-08-03)
135
+ ## 历史更新(2026-08-03)
75
136
 
76
137
  - **Web-only 基线**:界面和运行代码已统一为 `pi-web-desktop` 的网页基线;Electron 主进程、桌面端打包、PWA Service Worker 与 tag 驱动的桌面 Release 工作流已移除。
77
138
  - **目录选择器**:侧栏“选择文件夹”改为可逐级浏览的目录弹窗,选择“此文件夹”后直接加载项目,不再要求手动输入路径。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qt4798/pi-web",
3
- "version": "0.9.15",
3
+ "version": "0.9.16-beta.1",
4
4
  "description": "Web workspace for the pi coding agent",
5
5
  "homepage": "https://github.com/t479842598/pi-web-QT#readme",
6
6
  "repository": {
@@ -1,6 +0,0 @@
1
- "use strict";exports.id=3961,exports.ids=[3961],exports.modules={1060:(a,b,c)=>{c.d(b,{Ac:()=>n,GO:()=>j,X:()=>l,_4:()=>d,cV:()=>k,jL:()=>f,kv:()=>e,oC:()=>m});let d=262144,e=0xa00000,f=0xa00000,g={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",bmp:"image/bmp",ico:"image/x-icon",avif:"image/avif"},h={mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",oga:"audio/ogg",opus:"audio/ogg",m4a:"audio/mp4",aac:"audio/aac",flac:"audio/flac",weba:"audio/webm",webm:"audio/webm"},i={pdf:"application/pdf",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"};function j(a){return(a.replace(/\\/g,"/").split("/").pop()??"").toLowerCase().split(".").pop()??""}function k(a){return g[j(a)]??null}function l(a){return h[j(a)]??null}function m(a){return i[j(a)]??null}function n(a){let b=j(a);return"pdf"===b||"docx"===b?b:null}},33012:(a,b,c)=>{c.d(b,{S:()=>A,$:()=>x});var d=c(79646),e=c(29021),f=c(33873),g=c.n(f),h=c(28354),i=c(1060);let j=new Set(["DD","AU","UD","UA","DU","AA","UU"]);function k(a){let b=`${a.indexStatus}${a.worktreeStatus}`;return"??"===b?{status:"untracked",code:"U"}:j.has(b)||b.includes("U")?{status:"conflict",code:"C"}:b.includes("D")?{status:"deleted",code:"D"}:b.includes("R")||b.includes("C")?{status:"renamed",code:"R"}:b.includes("A")?{status:"added",code:"A"}:{status:"modified",code:"M"}}let l=(0,h.promisify)(d.execFile);async function m(a,b,c=8388608){let{stdout:d}=await l("git",["-C",a,...b],{timeout:1e4,maxBuffer:c,env:{...process.env,LC_ALL:"C"}});return d}async function n(a){try{return(await m(a,["rev-parse","--show-toplevel"])).trim()||null}catch{return null}}function o(a,b){let c=g().relative(g().resolve(a),g().resolve(b));return""===c||!c.startsWith(`..${g().sep}`)&&".."!==c&&!g().isAbsolute(c)}function p(a){try{return(0,e.realpathSync)(a)}catch{return g().resolve(a)}}function q(a){return a.split(g().sep).join("/")}async function r(a){return function(a){let b=a.split("\0"),c=[];for(let a=0;a<b.length;a+=1){var d,e;let f=b[a];if(!f||f.length<4||" "!==f[2])continue;let g={path:f.slice(3),indexStatus:f[0],worktreeStatus:f[1]};d=g.indexStatus,e=g.worktreeStatus,("R"===d||"C"===d||"R"===e||"C"===e)&&(g.originalPath=b[a+1]||void 0,a+=1),c.push(g)}return c}(await m(a,["status","--porcelain=v1","-z","--untracked-files=all"]))}async function s(a,b){let c=q(g().relative(a,b));try{let b=await m(a,["diff","--no-color","--no-ext-diff","--numstat","HEAD","--",c||"."]),d=0,e=0;for(let a of b.split(/\r?\n/)){if(!a)continue;let[b,c]=a.split(" ",2),f=Number(b),g=Number(c);Number.isInteger(f)&&(d+=f),Number.isInteger(g)&&(e+=g)}return{additions:d,deletions:e}}catch{return{additions:0,deletions:0}}}function t(a){return a.includes(0)}function u(a){return a.split("\0").filter(Boolean)}async function v(a,b){return 0===b.length?[]:new Promise(c=>{let e=(0,d.spawn)("git",["-C",a,"check-ignore","--no-index","--stdin","-z"],{env:{...process.env,LC_ALL:"C"},stdio:["pipe","pipe","ignore"]}),f="",g=!1,h=a=>{g||(g=!0,clearTimeout(i),c(a))},i=setTimeout(()=>{e.kill(),h([])},1e4);e.stdout.on("data",a=>{f+=a.toString()}),e.once("error",()=>h([])),e.once("close",()=>h(u(f))),e.stdin.end(`${b.join("\0")}\0`)})}async function w(a){try{let[b,c]=await Promise.all([m(a,["ls-files","--cached","-z"]),m(a,["ls-files","--others","--ignored","--exclude-standard","--directory","-z"])]),d=u(b),e=new Set([...d,...function(a){let b=new Set;for(let c of a){let a=g().posix.dirname(c);for(;a&&"."!==a;)b.add(a),a=g().posix.dirname(a)}return[...b]}(d),...u(c).map(a=>a.replace(/\/+$/,""))]);return(await v(a,[...e])).map(b=>g().resolve(a,b))}catch{return[]}}async function x(a){let b=p(a),c=await n(b);if(!c)return{isGitRepository:!1,repositoryRoot:null,files:[],additions:0,deletions:0,ignoredPaths:[]};let[d,f,h]=await Promise.all([r(c),s(c,b),w(c)]),j=d.flatMap(a=>{let d=g().resolve(c,a.path);return o(b,d)?[{filePath:d,...k(a),indexStatus:a.indexStatus,worktreeStatus:a.worktreeStatus}]:[]}),l=j.reduce((a,b)=>a+("untracked"===b.status?function(a){try{let b=(0,e.lstatSync)(a);if(!b.isFile()||b.size>i._4)return 0;let c=(0,e.readFileSync)(a);if(t(c)||0===c.length)return 0;let d=c.toString("utf8");return d.endsWith("\n")?d.split("\n").length-1:d.split("\n").length}catch{return 0}}(b.filePath):0),0);return{isGitRepository:!0,repositoryRoot:c,files:j,additions:f.additions+l,deletions:f.deletions,ignoredPaths:h.filter(a=>o(b,a))}}function y(a,b){let c=b.endsWith("\n"),d=b.split("\n");c&&d.pop();let e=d.map(a=>`+${a}`).join("\n"),f=!c&&d.length>0?"\n\":"";return`diff --git a/${a} b/${a}
2
- new file mode 100644
3
- --- /dev/null
4
- +++ b/${a}
5
- @@ -0,0 +1,${d.length} @@
6
- ${e}${f}`}async function z(a,b,c){try{return await m(a,["diff","--no-color","--no-ext-diff","--unified=3","HEAD","--",...c&&c!==b?[c,b]:[b]],4*i._4)}catch{return null}}async function A(a,b){let c,d=p(a),f=await n(d),h=g().resolve(d,g().relative(g().resolve(a),g().resolve(b)));if(!f||!o(f,h))return{supported:!1};let j=q(g().relative(f,h)),l=(await r(f)).find(a=>a.path===j);if(!l)return{supported:!1};let{status:m}=k(l);if("deleted"===m){let a=await z(f,j,l.originalPath);return a?.includes("\n@@ ")?{supported:!0,status:m,patch:a}:{supported:!1}}try{c=(0,e.lstatSync)(h)}catch{return{supported:!1}}if(!c.isFile()||c.size>i._4)return{supported:!1};let s=(0,e.readFileSync)(h);if(t(s))return{supported:!1};let u=s.toString("utf8"),v="untracked"===m?y(j,u):await z(f,j,l.originalPath)??("added"===m?y(j,u):null);return v?.includes("\n@@ ")?{supported:!0,status:m,patch:v}:{supported:!1}}},66544:(a,b,c)=>{c.d(b,{E2:()=>j,EN:()=>i});var d=c(77030);function e(a){return(a.startsWith("[")&&a.endsWith("]")?a.slice(1,-1):a).toLowerCase().replace(/\.$/,"")}function f(a){if(!a||/[\s/@\\]/.test(a))return null;try{let b=new URL(`http://${a}`);if(b.username||b.password||"/"!==b.pathname||b.search||b.hash)return null;return e(b.hostname)}catch{return null}}function g(){return[process.env.PI_WEB_HOSTNAME,...process.env.PI_WEB_ALLOWED_HOSTS?.split(",")??[]].filter(a=>!!a?.trim())}function h(a){try{return new URL(a).origin}catch{return null}}function i(a,b=g()){return!!function(a,b=g()){let c=a.headers.get("host"),h=c?f(c):null;return!!h&&(!!("localhost"===h||h.endsWith(".localhost")||(0,d.isIP)(h))||b.some(a=>{let b;return((b=a?.trim())?(0,d.isIP)(b)?e(b):f(b):null)===h}))}(a,b)&&(!!function(a){if("GET"!==a.method||"navigate"!==a.headers.get("sec-fetch-mode")||"document"!==a.headers.get("sec-fetch-dest")||"?1"!==a.headers.get("sec-fetch-user"))return!1;try{return/^\/api\/sessions\/[^/]+\/export$/.test(new URL(a.url).pathname)}catch{return!1}}(a)||!(a.headers.has("origin")||a.headers.has("sec-fetch-site"))||function(a){let b,c;if("cross-site"===a.headers.get("sec-fetch-site"))return!1;let d=a.headers.get("origin");if(!d)return!0;let e=(b=new URL(a.url),(c=a.headers.get("host"))?h(`${b.protocol}//${c}`):null);return null!==e&&h(d)===e}(a))}function j(a){let b=a.headers.get("content-type")?.split(";",1)[0]?.trim().toLowerCase();return"application/json"===b||!!(b?.startsWith("application/")&&b.endsWith("+json"))}},80547:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{A$:()=>n,Nw:()=>i.Nw,mc:()=>m,uK:()=>l,wz:()=>i.wz});var e=c(29021),f=c(21820),g=c(33873),h=c.n(g),i=c(25252),j=c(40402),k=a([j]);j=(k.then?(await k)():k)[0];let o=/^[a-zA-Z]:[\\/]/;function l(a){return o.test(a)||a.startsWith("\\\\")||a.startsWith("//")}async function m(){let a=Date.now(),b=globalThis.__piAllowedRootsCache;if(b&&b.expiresAt>a)return b.roots;let c=await (0,j.dQ)(),d=new Set;for(let a of c)a.cwd&&d.add((0,i.Nw)(a.cwd)),a.projectRoot&&d.add((0,i.Nw)(a.projectRoot));try{for(let a of(0,e.readdirSync)((0,f.homedir)()))/^pi-cwd-\d{8}$/.test(a)&&d.add((0,i.Nw)(h().join((0,f.homedir)(),a)))}catch{}for(let a of(0,i.HM)())d.add(a);return globalThis.__piAllowedRootsCache={roots:d,expiresAt:a+5e3},d}function n(a,b){for(let c of b){let b=l(a)||l(c),d=b?h().win32:h(),e=b?"\\":h().sep,f=d.resolve(a),g=d.resolve(c),i=b?f.toLowerCase():f,j=b?g.toLowerCase():g,k=j.endsWith(e)?j:j+e;if(i===j||i.startsWith(k))return!0}return!1}d()}catch(a){d(a)}})}};
@@ -1 +0,0 @@
1
- self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:39,errorRate:1e-4,numBits:748,numHashes:14,bitArray:[1,0,0,1,0,1,1,1,1,1,0,1,0,1,1,0,0,0,1,0,1,1,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1,1,1,0,0,1,0,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,0,0,1,1,0,1,0,1,0,1,0,0,1,1,1,1,0,0,1,0,0,1,1,0,0,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,1,1,0,1,1,0,1,0,1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,1,1,0,0,0,1,1,1,1,1,0,1,1,0,0,1,0,0,1,0,1,0,1,1,1,1,0,1,0,1,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,0,1,0,1,0,1,0,0,1,1,0,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,0,1,0,0,1,1,0,1,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,0,1,0,1,0,1,0,1,1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,0,0,1,1,0,0,0,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0,0,0,1,1,0,0,1,0,1,0,1,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,1,1,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,1,0,0,1,1,1,1,0,0,1,0,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,1,0,0,1,1,0,1,1,1,0,1,1,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,1,0,1,0,0,0,0,1,0,1,0,1,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,1,1,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,1,1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,1,0,1,1,0,1,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,0,1,1,1,0,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,1,1,0,1,1,1,0,0,1,0,1,1,0,1,0,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,1,1,0,1,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,1,0,0,0,1,1,1,0,1,0,1,1,1,1,1,0,1,1,0,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0,0,0,0,1,0,0,1,1,0]},__routerFilterDynamic:{numItems:7,errorRate:1e-4,numBits:135,numHashes:14,bitArray:[0,1,1,0,0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,1,1,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,0,1,0,0,1,1,1,1,0,1,1,1,1,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1]},sortedPages:["/_app"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();