tower-studio 0.1.2 → 0.1.5

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 (1138) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +41 -0
  3. package/.next/build/chunks/0kjx__pnpm_05m.mc_._.js +6681 -0
  4. package/.next/build/chunks/[root-of-the-server]__0a5dngl._.js +206 -0
  5. package/.next/build/chunks/[root-of-the-server]__13e2v6w._.js +500 -0
  6. package/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_0y_r.ay._.js +13 -0
  7. package/.next/build/chunks/[turbopack]_runtime.js +890 -0
  8. package/.next/build/package.json +1 -0
  9. package/.next/build/postcss.js +6 -0
  10. package/.next/build-manifest.json +22 -0
  11. package/.next/cache/.previewinfo +1 -0
  12. package/.next/cache/.rscinfo +1 -0
  13. package/.next/cache/.tsbuildinfo +1 -0
  14. package/.next/diagnostics/build-diagnostics.json +6 -0
  15. package/.next/diagnostics/framework.json +1 -0
  16. package/.next/diagnostics/route-bundle-stats.json +299 -0
  17. package/.next/export-marker.json +6 -0
  18. package/.next/fallback-build-manifest.json +13 -0
  19. package/.next/images-manifest.json +68 -0
  20. package/.next/next-minimal-server.js.nft.json +1 -0
  21. package/.next/next-server.js.nft.json +1 -0
  22. package/.next/package.json +1 -0
  23. package/.next/prerender-manifest.json +278 -0
  24. package/.next/required-server-files.js +339 -0
  25. package/.next/required-server-files.json +339 -0
  26. package/.next/routes-manifest.json +312 -0
  27. package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  28. package/.next/server/app/_global-error/page/build-manifest.json +18 -0
  29. package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  30. package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  31. package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  32. package/.next/server/app/_global-error/page.js +12 -0
  33. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  34. package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
  35. package/.next/server/app/_global-error.html +1 -0
  36. package/.next/server/app/_global-error.meta +15 -0
  37. package/.next/server/app/_global-error.rsc +15 -0
  38. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  39. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  40. package/.next/server/app/_global-error.segments/_head.segment.rsc +6 -0
  41. package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  42. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  43. package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  44. package/.next/server/app/_not-found/page/build-manifest.json +18 -0
  45. package/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
  46. package/.next/server/app/_not-found/page/react-loadable-manifest.json +16 -0
  47. package/.next/server/app/_not-found/page/server-reference-manifest.json +233 -0
  48. package/.next/server/app/_not-found/page.js +20 -0
  49. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  50. package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
  51. package/.next/server/app/_not-found.html +1 -0
  52. package/.next/server/app/_not-found.meta +16 -0
  53. package/.next/server/app/_not-found.rsc +24 -0
  54. package/.next/server/app/_not-found.segments/_full.segment.rsc +24 -0
  55. package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  56. package/.next/server/app/_not-found.segments/_index.segment.rsc +12 -0
  57. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  58. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  59. package/.next/server/app/_not-found.segments/_tree.segment.rsc +4 -0
  60. package/.next/server/app/api/adapters/test/route/app-paths-manifest.json +3 -0
  61. package/.next/server/app/api/adapters/test/route/build-manifest.json +9 -0
  62. package/.next/server/app/api/adapters/test/route/server-reference-manifest.json +4 -0
  63. package/.next/server/app/api/adapters/test/route.js +9 -0
  64. package/.next/server/app/api/adapters/test/route.js.nft.json +1 -0
  65. package/.next/server/app/api/adapters/test/route_client-reference-manifest.js +3 -0
  66. package/.next/server/app/api/browse-fs/route/app-paths-manifest.json +3 -0
  67. package/.next/server/app/api/browse-fs/route/build-manifest.json +9 -0
  68. package/.next/server/app/api/browse-fs/route/server-reference-manifest.json +4 -0
  69. package/.next/server/app/api/browse-fs/route.js +7 -0
  70. package/.next/server/app/api/browse-fs/route.js.nft.json +1 -0
  71. package/.next/server/app/api/browse-fs/route_client-reference-manifest.js +3 -0
  72. package/.next/server/app/api/files/assets/[projectId]/[filename]/route/app-paths-manifest.json +3 -0
  73. package/.next/server/app/api/files/assets/[projectId]/[filename]/route/build-manifest.json +9 -0
  74. package/.next/server/app/api/files/assets/[projectId]/[filename]/route/server-reference-manifest.json +4 -0
  75. package/.next/server/app/api/files/assets/[projectId]/[filename]/route.js +7 -0
  76. package/.next/server/app/api/files/assets/[projectId]/[filename]/route.js.nft.json +1 -0
  77. package/.next/server/app/api/files/assets/[projectId]/[filename]/route_client-reference-manifest.js +3 -0
  78. package/.next/server/app/api/git/route/app-paths-manifest.json +3 -0
  79. package/.next/server/app/api/git/route/build-manifest.json +9 -0
  80. package/.next/server/app/api/git/route/server-reference-manifest.json +4 -0
  81. package/.next/server/app/api/git/route.js +8 -0
  82. package/.next/server/app/api/git/route.js.nft.json +1 -0
  83. package/.next/server/app/api/git/route_client-reference-manifest.js +3 -0
  84. package/.next/server/app/api/internal/assets/[projectId]/[filename]/route/app-paths-manifest.json +3 -0
  85. package/.next/server/app/api/internal/assets/[projectId]/[filename]/route/build-manifest.json +9 -0
  86. package/.next/server/app/api/internal/assets/[projectId]/[filename]/route/server-reference-manifest.json +4 -0
  87. package/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js +7 -0
  88. package/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js.nft.json +1 -0
  89. package/.next/server/app/api/internal/assets/[projectId]/[filename]/route_client-reference-manifest.js +3 -0
  90. package/.next/server/app/api/internal/assets/reveal/route/app-paths-manifest.json +3 -0
  91. package/.next/server/app/api/internal/assets/reveal/route/build-manifest.json +9 -0
  92. package/.next/server/app/api/internal/assets/reveal/route/server-reference-manifest.json +4 -0
  93. package/.next/server/app/api/internal/assets/reveal/route.js +7 -0
  94. package/.next/server/app/api/internal/assets/reveal/route.js.nft.json +1 -0
  95. package/.next/server/app/api/internal/assets/reveal/route_client-reference-manifest.js +3 -0
  96. package/.next/server/app/api/internal/assistant/chat/route/app-paths-manifest.json +3 -0
  97. package/.next/server/app/api/internal/assistant/chat/route/build-manifest.json +9 -0
  98. package/.next/server/app/api/internal/assistant/chat/route/server-reference-manifest.json +4 -0
  99. package/.next/server/app/api/internal/assistant/chat/route.js +7 -0
  100. package/.next/server/app/api/internal/assistant/chat/route.js.nft.json +1 -0
  101. package/.next/server/app/api/internal/assistant/chat/route_client-reference-manifest.js +3 -0
  102. package/.next/server/app/api/internal/assistant/images/route/app-paths-manifest.json +3 -0
  103. package/.next/server/app/api/internal/assistant/images/route/build-manifest.json +9 -0
  104. package/.next/server/app/api/internal/assistant/images/route/server-reference-manifest.json +4 -0
  105. package/.next/server/app/api/internal/assistant/images/route.js +9 -0
  106. package/.next/server/app/api/internal/assistant/images/route.js.nft.json +1 -0
  107. package/.next/server/app/api/internal/assistant/images/route_client-reference-manifest.js +3 -0
  108. package/.next/server/app/api/internal/assistant/route/app-paths-manifest.json +3 -0
  109. package/.next/server/app/api/internal/assistant/route/build-manifest.json +9 -0
  110. package/.next/server/app/api/internal/assistant/route/server-reference-manifest.json +4 -0
  111. package/.next/server/app/api/internal/assistant/route.js +7 -0
  112. package/.next/server/app/api/internal/assistant/route.js.nft.json +1 -0
  113. package/.next/server/app/api/internal/assistant/route_client-reference-manifest.js +3 -0
  114. package/.next/server/app/api/internal/assistant/sessions/route/app-paths-manifest.json +3 -0
  115. package/.next/server/app/api/internal/assistant/sessions/route/build-manifest.json +9 -0
  116. package/.next/server/app/api/internal/assistant/sessions/route/server-reference-manifest.json +4 -0
  117. package/.next/server/app/api/internal/assistant/sessions/route.js +7 -0
  118. package/.next/server/app/api/internal/assistant/sessions/route.js.nft.json +1 -0
  119. package/.next/server/app/api/internal/assistant/sessions/route_client-reference-manifest.js +3 -0
  120. package/.next/server/app/api/internal/cache/[...segments]/route/app-paths-manifest.json +3 -0
  121. package/.next/server/app/api/internal/cache/[...segments]/route/build-manifest.json +9 -0
  122. package/.next/server/app/api/internal/cache/[...segments]/route/server-reference-manifest.json +4 -0
  123. package/.next/server/app/api/internal/cache/[...segments]/route.js +7 -0
  124. package/.next/server/app/api/internal/cache/[...segments]/route.js.nft.json +1 -0
  125. package/.next/server/app/api/internal/cache/[...segments]/route_client-reference-manifest.js +3 -0
  126. package/.next/server/app/api/internal/hooks/install/route/app-paths-manifest.json +3 -0
  127. package/.next/server/app/api/internal/hooks/install/route/build-manifest.json +9 -0
  128. package/.next/server/app/api/internal/hooks/install/route/server-reference-manifest.json +4 -0
  129. package/.next/server/app/api/internal/hooks/install/route.js +7 -0
  130. package/.next/server/app/api/internal/hooks/install/route.js.nft.json +1 -0
  131. package/.next/server/app/api/internal/hooks/install/route_client-reference-manifest.js +3 -0
  132. package/.next/server/app/api/internal/hooks/session/route/app-paths-manifest.json +3 -0
  133. package/.next/server/app/api/internal/hooks/session/route/build-manifest.json +9 -0
  134. package/.next/server/app/api/internal/hooks/session/route/server-reference-manifest.json +4 -0
  135. package/.next/server/app/api/internal/hooks/session/route.js +7 -0
  136. package/.next/server/app/api/internal/hooks/session/route.js.nft.json +1 -0
  137. package/.next/server/app/api/internal/hooks/session/route_client-reference-manifest.js +3 -0
  138. package/.next/server/app/api/internal/hooks/stop/route/app-paths-manifest.json +3 -0
  139. package/.next/server/app/api/internal/hooks/stop/route/build-manifest.json +9 -0
  140. package/.next/server/app/api/internal/hooks/stop/route/server-reference-manifest.json +4 -0
  141. package/.next/server/app/api/internal/hooks/stop/route.js +8 -0
  142. package/.next/server/app/api/internal/hooks/stop/route.js.nft.json +1 -0
  143. package/.next/server/app/api/internal/hooks/stop/route_client-reference-manifest.js +3 -0
  144. package/.next/server/app/api/internal/hooks/upload/route/app-paths-manifest.json +3 -0
  145. package/.next/server/app/api/internal/hooks/upload/route/build-manifest.json +9 -0
  146. package/.next/server/app/api/internal/hooks/upload/route/server-reference-manifest.json +4 -0
  147. package/.next/server/app/api/internal/hooks/upload/route.js +7 -0
  148. package/.next/server/app/api/internal/hooks/upload/route.js.nft.json +1 -0
  149. package/.next/server/app/api/internal/hooks/upload/route_client-reference-manifest.js +3 -0
  150. package/.next/server/app/api/internal/notifications/pending/route/app-paths-manifest.json +3 -0
  151. package/.next/server/app/api/internal/notifications/pending/route/build-manifest.json +9 -0
  152. package/.next/server/app/api/internal/notifications/pending/route/server-reference-manifest.json +4 -0
  153. package/.next/server/app/api/internal/notifications/pending/route.js +7 -0
  154. package/.next/server/app/api/internal/notifications/pending/route.js.nft.json +1 -0
  155. package/.next/server/app/api/internal/notifications/pending/route_client-reference-manifest.js +3 -0
  156. package/.next/server/app/api/internal/terminal/[taskId]/buffer/route/app-paths-manifest.json +3 -0
  157. package/.next/server/app/api/internal/terminal/[taskId]/buffer/route/build-manifest.json +9 -0
  158. package/.next/server/app/api/internal/terminal/[taskId]/buffer/route/server-reference-manifest.json +4 -0
  159. package/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js +8 -0
  160. package/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js.nft.json +1 -0
  161. package/.next/server/app/api/internal/terminal/[taskId]/buffer/route_client-reference-manifest.js +3 -0
  162. package/.next/server/app/api/internal/terminal/[taskId]/input/route/app-paths-manifest.json +3 -0
  163. package/.next/server/app/api/internal/terminal/[taskId]/input/route/build-manifest.json +9 -0
  164. package/.next/server/app/api/internal/terminal/[taskId]/input/route/server-reference-manifest.json +4 -0
  165. package/.next/server/app/api/internal/terminal/[taskId]/input/route.js +8 -0
  166. package/.next/server/app/api/internal/terminal/[taskId]/input/route.js.nft.json +1 -0
  167. package/.next/server/app/api/internal/terminal/[taskId]/input/route_client-reference-manifest.js +3 -0
  168. package/.next/server/app/api/internal/terminal/[taskId]/start/route/app-paths-manifest.json +3 -0
  169. package/.next/server/app/api/internal/terminal/[taskId]/start/route/build-manifest.json +9 -0
  170. package/.next/server/app/api/internal/terminal/[taskId]/start/route/server-reference-manifest.json +4 -0
  171. package/.next/server/app/api/internal/terminal/[taskId]/start/route.js +10 -0
  172. package/.next/server/app/api/internal/terminal/[taskId]/start/route.js.nft.json +1 -0
  173. package/.next/server/app/api/internal/terminal/[taskId]/start/route_client-reference-manifest.js +3 -0
  174. package/.next/server/app/api/tasks/[taskId]/diff/route/app-paths-manifest.json +3 -0
  175. package/.next/server/app/api/tasks/[taskId]/diff/route/build-manifest.json +9 -0
  176. package/.next/server/app/api/tasks/[taskId]/diff/route/server-reference-manifest.json +4 -0
  177. package/.next/server/app/api/tasks/[taskId]/diff/route.js +8 -0
  178. package/.next/server/app/api/tasks/[taskId]/diff/route.js.nft.json +1 -0
  179. package/.next/server/app/api/tasks/[taskId]/diff/route_client-reference-manifest.js +3 -0
  180. package/.next/server/app/api/tasks/[taskId]/merge/route/app-paths-manifest.json +3 -0
  181. package/.next/server/app/api/tasks/[taskId]/merge/route/build-manifest.json +9 -0
  182. package/.next/server/app/api/tasks/[taskId]/merge/route/server-reference-manifest.json +4 -0
  183. package/.next/server/app/api/tasks/[taskId]/merge/route.js +9 -0
  184. package/.next/server/app/api/tasks/[taskId]/merge/route.js.nft.json +1 -0
  185. package/.next/server/app/api/tasks/[taskId]/merge/route_client-reference-manifest.js +3 -0
  186. package/.next/server/app/apple-icon.png/route/app-paths-manifest.json +3 -0
  187. package/.next/server/app/apple-icon.png/route/build-manifest.json +9 -0
  188. package/.next/server/app/apple-icon.png/route.js +8 -0
  189. package/.next/server/app/apple-icon.png/route.js.nft.json +1 -0
  190. package/.next/server/app/apple-icon.png.meta +1 -0
  191. package/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
  192. package/.next/server/app/favicon.ico/route/build-manifest.json +9 -0
  193. package/.next/server/app/favicon.ico/route.js +8 -0
  194. package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  195. package/.next/server/app/favicon.ico.meta +1 -0
  196. package/.next/server/app/icon0.svg/route/app-paths-manifest.json +3 -0
  197. package/.next/server/app/icon0.svg/route/build-manifest.json +9 -0
  198. package/.next/server/app/icon0.svg/route.js +8 -0
  199. package/.next/server/app/icon0.svg/route.js.nft.json +1 -0
  200. package/.next/server/app/icon0.svg.meta +1 -0
  201. package/.next/server/app/icon1.png/route/app-paths-manifest.json +3 -0
  202. package/.next/server/app/icon1.png/route/build-manifest.json +9 -0
  203. package/.next/server/app/icon1.png/route.js +8 -0
  204. package/.next/server/app/icon1.png/route.js.nft.json +1 -0
  205. package/.next/server/app/icon1.png.meta +1 -0
  206. package/.next/server/app/index.html +1 -0
  207. package/.next/server/app/index.meta +16 -0
  208. package/.next/server/app/index.rsc +25 -0
  209. package/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -0
  210. package/.next/server/app/index.segments/_full.segment.rsc +25 -0
  211. package/.next/server/app/index.segments/_head.segment.rsc +6 -0
  212. package/.next/server/app/index.segments/_index.segment.rsc +12 -0
  213. package/.next/server/app/index.segments/_tree.segment.rsc +6 -0
  214. package/.next/server/app/manifest.json/route/app-paths-manifest.json +3 -0
  215. package/.next/server/app/manifest.json/route/build-manifest.json +9 -0
  216. package/.next/server/app/manifest.json/route.js +7 -0
  217. package/.next/server/app/manifest.json/route.js.nft.json +1 -0
  218. package/.next/server/app/manifest.json.meta +1 -0
  219. package/.next/server/app/missions/page/app-paths-manifest.json +3 -0
  220. package/.next/server/app/missions/page/build-manifest.json +18 -0
  221. package/.next/server/app/missions/page/next-font-manifest.json +11 -0
  222. package/.next/server/app/missions/page/react-loadable-manifest.json +16 -0
  223. package/.next/server/app/missions/page/server-reference-manifest.json +401 -0
  224. package/.next/server/app/missions/page.js +22 -0
  225. package/.next/server/app/missions/page.js.nft.json +1 -0
  226. package/.next/server/app/missions/page_client-reference-manifest.js +3 -0
  227. package/.next/server/app/onboarding/page/app-paths-manifest.json +3 -0
  228. package/.next/server/app/onboarding/page/build-manifest.json +18 -0
  229. package/.next/server/app/onboarding/page/next-font-manifest.json +11 -0
  230. package/.next/server/app/onboarding/page/react-loadable-manifest.json +16 -0
  231. package/.next/server/app/onboarding/page/server-reference-manifest.json +233 -0
  232. package/.next/server/app/onboarding/page.js +21 -0
  233. package/.next/server/app/onboarding/page.js.nft.json +1 -0
  234. package/.next/server/app/onboarding/page_client-reference-manifest.js +3 -0
  235. package/.next/server/app/onboarding.html +1 -0
  236. package/.next/server/app/onboarding.meta +15 -0
  237. package/.next/server/app/onboarding.rsc +30 -0
  238. package/.next/server/app/onboarding.segments/_full.segment.rsc +30 -0
  239. package/.next/server/app/onboarding.segments/_head.segment.rsc +6 -0
  240. package/.next/server/app/onboarding.segments/_index.segment.rsc +12 -0
  241. package/.next/server/app/onboarding.segments/_tree.segment.rsc +6 -0
  242. package/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +9 -0
  243. package/.next/server/app/onboarding.segments/onboarding.segment.rsc +5 -0
  244. package/.next/server/app/page/app-paths-manifest.json +3 -0
  245. package/.next/server/app/page/build-manifest.json +18 -0
  246. package/.next/server/app/page/next-font-manifest.json +11 -0
  247. package/.next/server/app/page/react-loadable-manifest.json +16 -0
  248. package/.next/server/app/page/server-reference-manifest.json +233 -0
  249. package/.next/server/app/page.js +21 -0
  250. package/.next/server/app/page.js.nft.json +1 -0
  251. package/.next/server/app/page_client-reference-manifest.js +3 -0
  252. package/.next/server/app/settings/page/app-paths-manifest.json +3 -0
  253. package/.next/server/app/settings/page/build-manifest.json +18 -0
  254. package/.next/server/app/settings/page/next-font-manifest.json +11 -0
  255. package/.next/server/app/settings/page/react-loadable-manifest.json +16 -0
  256. package/.next/server/app/settings/page/server-reference-manifest.json +341 -0
  257. package/.next/server/app/settings/page.js +21 -0
  258. package/.next/server/app/settings/page.js.nft.json +1 -0
  259. package/.next/server/app/settings/page_client-reference-manifest.js +3 -0
  260. package/.next/server/app/settings.html +1 -0
  261. package/.next/server/app/settings.meta +15 -0
  262. package/.next/server/app/settings.rsc +30 -0
  263. package/.next/server/app/settings.segments/_full.segment.rsc +30 -0
  264. package/.next/server/app/settings.segments/_head.segment.rsc +6 -0
  265. package/.next/server/app/settings.segments/_index.segment.rsc +12 -0
  266. package/.next/server/app/settings.segments/_tree.segment.rsc +6 -0
  267. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +9 -0
  268. package/.next/server/app/settings.segments/settings.segment.rsc +5 -0
  269. package/.next/server/app/workspaces/[workspaceId]/archive/page/app-paths-manifest.json +3 -0
  270. package/.next/server/app/workspaces/[workspaceId]/archive/page/build-manifest.json +18 -0
  271. package/.next/server/app/workspaces/[workspaceId]/archive/page/next-font-manifest.json +11 -0
  272. package/.next/server/app/workspaces/[workspaceId]/archive/page/react-loadable-manifest.json +16 -0
  273. package/.next/server/app/workspaces/[workspaceId]/archive/page/server-reference-manifest.json +497 -0
  274. package/.next/server/app/workspaces/[workspaceId]/archive/page.js +21 -0
  275. package/.next/server/app/workspaces/[workspaceId]/archive/page.js.nft.json +1 -0
  276. package/.next/server/app/workspaces/[workspaceId]/archive/page_client-reference-manifest.js +3 -0
  277. package/.next/server/app/workspaces/[workspaceId]/assets/page/app-paths-manifest.json +3 -0
  278. package/.next/server/app/workspaces/[workspaceId]/assets/page/build-manifest.json +18 -0
  279. package/.next/server/app/workspaces/[workspaceId]/assets/page/next-font-manifest.json +11 -0
  280. package/.next/server/app/workspaces/[workspaceId]/assets/page/react-loadable-manifest.json +16 -0
  281. package/.next/server/app/workspaces/[workspaceId]/assets/page/server-reference-manifest.json +461 -0
  282. package/.next/server/app/workspaces/[workspaceId]/assets/page.js +21 -0
  283. package/.next/server/app/workspaces/[workspaceId]/assets/page.js.nft.json +1 -0
  284. package/.next/server/app/workspaces/[workspaceId]/assets/page_client-reference-manifest.js +3 -0
  285. package/.next/server/app/workspaces/[workspaceId]/notes/page/app-paths-manifest.json +3 -0
  286. package/.next/server/app/workspaces/[workspaceId]/notes/page/build-manifest.json +18 -0
  287. package/.next/server/app/workspaces/[workspaceId]/notes/page/next-font-manifest.json +11 -0
  288. package/.next/server/app/workspaces/[workspaceId]/notes/page/react-loadable-manifest.json +16 -0
  289. package/.next/server/app/workspaces/[workspaceId]/notes/page/server-reference-manifest.json +401 -0
  290. package/.next/server/app/workspaces/[workspaceId]/notes/page.js +21 -0
  291. package/.next/server/app/workspaces/[workspaceId]/notes/page.js.nft.json +1 -0
  292. package/.next/server/app/workspaces/[workspaceId]/notes/page_client-reference-manifest.js +3 -0
  293. package/.next/server/app/workspaces/[workspaceId]/page/app-paths-manifest.json +3 -0
  294. package/.next/server/app/workspaces/[workspaceId]/page/build-manifest.json +18 -0
  295. package/.next/server/app/workspaces/[workspaceId]/page/next-font-manifest.json +11 -0
  296. package/.next/server/app/workspaces/[workspaceId]/page/react-loadable-manifest.json +16 -0
  297. package/.next/server/app/workspaces/[workspaceId]/page/server-reference-manifest.json +569 -0
  298. package/.next/server/app/workspaces/[workspaceId]/page.js +22 -0
  299. package/.next/server/app/workspaces/[workspaceId]/page.js.nft.json +1 -0
  300. package/.next/server/app/workspaces/[workspaceId]/page_client-reference-manifest.js +3 -0
  301. package/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/app-paths-manifest.json +3 -0
  302. package/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/build-manifest.json +18 -0
  303. package/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/next-font-manifest.json +11 -0
  304. package/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/react-loadable-manifest.json +16 -0
  305. package/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/server-reference-manifest.json +233 -0
  306. package/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js +21 -0
  307. package/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js.nft.json +1 -0
  308. package/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page_client-reference-manifest.js +3 -0
  309. package/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/app-paths-manifest.json +3 -0
  310. package/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/build-manifest.json +18 -0
  311. package/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/next-font-manifest.json +11 -0
  312. package/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/react-loadable-manifest.json +22 -0
  313. package/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/server-reference-manifest.json +581 -0
  314. package/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js +23 -0
  315. package/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js.nft.json +1 -0
  316. package/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page_client-reference-manifest.js +3 -0
  317. package/.next/server/app/workspaces/page/app-paths-manifest.json +3 -0
  318. package/.next/server/app/workspaces/page/build-manifest.json +18 -0
  319. package/.next/server/app/workspaces/page/next-font-manifest.json +11 -0
  320. package/.next/server/app/workspaces/page/react-loadable-manifest.json +16 -0
  321. package/.next/server/app/workspaces/page/server-reference-manifest.json +329 -0
  322. package/.next/server/app/workspaces/page.js +21 -0
  323. package/.next/server/app/workspaces/page.js.nft.json +1 -0
  324. package/.next/server/app/workspaces/page_client-reference-manifest.js +3 -0
  325. package/.next/server/app-paths-manifest.json +41 -0
  326. package/.next/server/chunks/03j-_@anthropic-ai_claude-agent-sdk_sdk_mjs_04597t~._.js +85 -0
  327. package/.next/server/chunks/0cve_next-internal_server_app_api_internal_cache_[___segments]_route_actions_09n1sa3.js +3 -0
  328. package/.next/server/chunks/0tp-_server_app_api_files_assets_[projectId]_[filename]_route_actions_02i2urs.js +3 -0
  329. package/.next/server/chunks/0tp-_server_app_api_internal_assets_[projectId]_[filename]_route_actions_0kjz576.js +3 -0
  330. package/.next/server/chunks/0tp-_server_app_api_internal_notifications_pending_route_actions_08bx38r.js +3 -0
  331. package/.next/server/chunks/0tp-_server_app_api_internal_terminal_[taskId]_buffer_route_actions_0bpyf5x.js +3 -0
  332. package/.next/server/chunks/0tp-_server_app_api_internal_terminal_[taskId]_input_route_actions_0alu32r.js +3 -0
  333. package/.next/server/chunks/0tp-_server_app_api_internal_terminal_[taskId]_start_route_actions_0swqog2.js +3 -0
  334. package/.next/server/chunks/0w1v_zod_v4_classic_external_0m-7hz_.js +39 -0
  335. package/.next/server/chunks/0~.g__next-internal_server_app_api_internal_assistant_chat_route_actions_0x-qbrh.js +3 -0
  336. package/.next/server/chunks/0~.g__next-internal_server_app_api_internal_assistant_images_route_actions_0vws40t.js +3 -0
  337. package/.next/server/chunks/0~.g__next-internal_server_app_api_internal_assistant_sessions_route_actions_0p09rcp.js +3 -0
  338. package/.next/server/chunks/10ge_next_dist_08.3req._.js +13 -0
  339. package/.next/server/chunks/10ge_next_dist_esm_build_templates_app-route_00gmiw_.js +3 -0
  340. package/.next/server/chunks/10ge_next_dist_esm_build_templates_app-route_0jwpolf.js +3 -0
  341. package/.next/server/chunks/10ge_next_dist_esm_build_templates_app-route_0liabcf.js +3 -0
  342. package/.next/server/chunks/10ge_next_dist_esm_build_templates_app-route_0z9_0_i.js +3 -0
  343. package/.next/server/chunks/10ge_next_dist_esm_build_templates_app-route_13w3ubu.js +3 -0
  344. package/.next/server/chunks/10ge_next_dist_esm_build_templates_app-route_13~vb_i.js +4 -0
  345. package/.next/server/chunks/[externals]__02xkqim._.js +3 -0
  346. package/.next/server/chunks/[externals]__09oeovy._.js +3 -0
  347. package/.next/server/chunks/[externals]__0~rg.xo._.js +3 -0
  348. package/.next/server/chunks/[externals]__11rejr-._.js +3 -0
  349. package/.next/server/chunks/[externals]_child_process_0pwkpv9._.js +3 -0
  350. package/.next/server/chunks/[externals]_next_dist_0g2nsos._.js +3 -0
  351. package/.next/server/chunks/[externals]_util_0wtvqkc._.js +3 -0
  352. package/.next/server/chunks/[root-of-the-server]__02p-gd5._.js +3 -0
  353. package/.next/server/chunks/[root-of-the-server]__0319djr._.js +3 -0
  354. package/.next/server/chunks/[root-of-the-server]__043lk8~._.js +4 -0
  355. package/.next/server/chunks/[root-of-the-server]__053y9tf._.js +3 -0
  356. package/.next/server/chunks/[root-of-the-server]__05pxb~w._.js +20 -0
  357. package/.next/server/chunks/[root-of-the-server]__07-am_7._.js +20 -0
  358. package/.next/server/chunks/[root-of-the-server]__09gjz6h._.js +3 -0
  359. package/.next/server/chunks/[root-of-the-server]__0_irb2s._.js +3 -0
  360. package/.next/server/chunks/[root-of-the-server]__0c4edwt._.js +3 -0
  361. package/.next/server/chunks/[root-of-the-server]__0c7y1r0._.js +3 -0
  362. package/.next/server/chunks/[root-of-the-server]__0dj34zn._.js +3 -0
  363. package/.next/server/chunks/[root-of-the-server]__0dqta7g._.js +3 -0
  364. package/.next/server/chunks/[root-of-the-server]__0j3gbp7._.js +3 -0
  365. package/.next/server/chunks/[root-of-the-server]__0ko_rm_._.js +3 -0
  366. package/.next/server/chunks/[root-of-the-server]__0miy2g.._.js +3 -0
  367. package/.next/server/chunks/[root-of-the-server]__0mt-eeb._.js +3 -0
  368. package/.next/server/chunks/[root-of-the-server]__0n-6-hc._.js +3 -0
  369. package/.next/server/chunks/[root-of-the-server]__0nur_ir._.js +3 -0
  370. package/.next/server/chunks/[root-of-the-server]__0pz60q-._.js +20 -0
  371. package/.next/server/chunks/[root-of-the-server]__0q~5ya5._.js +3 -0
  372. package/.next/server/chunks/[root-of-the-server]__0rpqx55._.js +3 -0
  373. package/.next/server/chunks/[root-of-the-server]__0sjsc63._.js +4 -0
  374. package/.next/server/chunks/[root-of-the-server]__0th.w7w._.js +3 -0
  375. package/.next/server/chunks/[root-of-the-server]__0u..agy._.js +11 -0
  376. package/.next/server/chunks/[root-of-the-server]__0umzekq._.js +3 -0
  377. package/.next/server/chunks/[root-of-the-server]__0wu61w.._.js +3 -0
  378. package/.next/server/chunks/[root-of-the-server]__11v.yk_._.js +4 -0
  379. package/.next/server/chunks/[root-of-the-server]__12._zd-._.js +3 -0
  380. package/.next/server/chunks/[root-of-the-server]__130shf~._.js +3 -0
  381. package/.next/server/chunks/[turbopack]_runtime.js +903 -0
  382. package/.next/server/chunks/ssr/03j-_@anthropic-ai_claude-agent-sdk_sdk_mjs_0kr2_y.._.js +84 -0
  383. package/.next/server/chunks/ssr/040e_@monaco-editor_react_dist_index_mjs_0t4i-ho._.js +3 -0
  384. package/.next/server/chunks/ssr/040e_@monaco-editor_react_dist_index_mjs_0z6t1fr._.js +3 -0
  385. package/.next/server/chunks/ssr/0kjx__pnpm_0g9g8h6._.js +3 -0
  386. package/.next/server/chunks/ssr/0kjx__pnpm_0l.5ii.._.js +3 -0
  387. package/.next/server/chunks/ssr/0kjx__pnpm_0wrn.h9._.js +14 -0
  388. package/.next/server/chunks/ssr/0rik_@dnd-kit_core_dist_core_esm_11giptg.js +3 -0
  389. package/.next/server/chunks/ssr/0~.g_src_app_workspaces_[workspaceId]_tasks_[taskId]_task-page-client_tsx_0bbseig._.js +3 -0
  390. package/.next/server/chunks/ssr/10ge_next_00.-vj.._.js +18 -0
  391. package/.next/server/chunks/ssr/10ge_next_dist_01n~t8z._.js +6 -0
  392. package/.next/server/chunks/ssr/10ge_next_dist_06_-w96._.js +19 -0
  393. package/.next/server/chunks/ssr/10ge_next_dist_0pw4my6._.js +6 -0
  394. package/.next/server/chunks/ssr/10ge_next_dist_0wjbiu9._.js +3 -0
  395. package/.next/server/chunks/ssr/10ge_next_dist_0~ti7jc._.js +3 -0
  396. package/.next/server/chunks/ssr/10ge_next_dist_10.ihny._.js +3 -0
  397. package/.next/server/chunks/ssr/10ge_next_dist_client_components_0--gzcy._.js +3 -0
  398. package/.next/server/chunks/ssr/10ge_next_dist_client_components_0eil7-a._.js +33 -0
  399. package/.next/server/chunks/ssr/10ge_next_dist_client_components_builtin_forbidden_0nzsnb2.js +3 -0
  400. package/.next/server/chunks/ssr/10ge_next_dist_client_components_builtin_global-error_125sopd.js +3 -0
  401. package/.next/server/chunks/ssr/10ge_next_dist_client_components_builtin_unauthorized_0z93cpe.js +3 -0
  402. package/.next/server/chunks/ssr/10ge_next_dist_compiled_0g45ze2._.js +3 -0
  403. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_080g02v.js +4 -0
  404. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_08khzah.js +4 -0
  405. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_09~o5q0.js +4 -0
  406. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_0_rj_f4.js +4 -0
  407. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_0c-wmj1.js +4 -0
  408. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_0fjd2ua.js +4 -0
  409. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_0hpuyf0.js +4 -0
  410. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_0knnyic.js +4 -0
  411. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_0oi86k6.js +4 -0
  412. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_0rmwdra.js +4 -0
  413. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_0zgisbd.js +4 -0
  414. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_11pz1fw.js +4 -0
  415. package/.next/server/chunks/ssr/10ge_next_dist_esm_build_templates_app-page_12reczc.js +4 -0
  416. package/.next/server/chunks/ssr/119e_lucide-react_dist_esm_icons_0636jyq._.js +3 -0
  417. package/.next/server/chunks/ssr/[externals]__0of4r_r._.js +3 -0
  418. package/.next/server/chunks/ssr/[externals]__0z1ffhu._.js +3 -0
  419. package/.next/server/chunks/ssr/[externals]_child_process_0pwkpv9._.js +3 -0
  420. package/.next/server/chunks/ssr/[root-of-the-server]__0-0j_z3._.js +3 -0
  421. package/.next/server/chunks/ssr/[root-of-the-server]__0.8y0n9._.js +3 -0
  422. package/.next/server/chunks/ssr/[root-of-the-server]__0.uoh7q._.js +3 -0
  423. package/.next/server/chunks/ssr/[root-of-the-server]__01ws4-7._.js +3 -0
  424. package/.next/server/chunks/ssr/[root-of-the-server]__024-5kd._.js +3 -0
  425. package/.next/server/chunks/ssr/[root-of-the-server]__02ipahf._.js +3 -0
  426. package/.next/server/chunks/ssr/[root-of-the-server]__03.14vw._.js +3 -0
  427. package/.next/server/chunks/ssr/[root-of-the-server]__04xn50b._.js +30 -0
  428. package/.next/server/chunks/ssr/[root-of-the-server]__05452ke._.js +30 -0
  429. package/.next/server/chunks/ssr/[root-of-the-server]__06o5v8i._.js +30 -0
  430. package/.next/server/chunks/ssr/[root-of-the-server]__06sm5cw._.js +3 -0
  431. package/.next/server/chunks/ssr/[root-of-the-server]__09m32ch._.js +3 -0
  432. package/.next/server/chunks/ssr/[root-of-the-server]__0_0kxz4._.js +3 -0
  433. package/.next/server/chunks/ssr/[root-of-the-server]__0adx8p4._.js +30 -0
  434. package/.next/server/chunks/ssr/[root-of-the-server]__0bk3s4l._.js +3 -0
  435. package/.next/server/chunks/ssr/[root-of-the-server]__0d5p5d.._.js +30 -0
  436. package/.next/server/chunks/ssr/[root-of-the-server]__0d7u1lw._.js +3 -0
  437. package/.next/server/chunks/ssr/[root-of-the-server]__0fg8.hp._.js +3 -0
  438. package/.next/server/chunks/ssr/[root-of-the-server]__0gsj3~.._.js +30 -0
  439. package/.next/server/chunks/ssr/[root-of-the-server]__0hvz_0c._.js +3 -0
  440. package/.next/server/chunks/ssr/[root-of-the-server]__0i6glcp._.js +30 -0
  441. package/.next/server/chunks/ssr/[root-of-the-server]__0ibsor_._.js +3 -0
  442. package/.next/server/chunks/ssr/[root-of-the-server]__0j5~a_o._.js +3 -0
  443. package/.next/server/chunks/ssr/[root-of-the-server]__0jgbj6l._.js +3 -0
  444. package/.next/server/chunks/ssr/[root-of-the-server]__0jux8~h._.js +33 -0
  445. package/.next/server/chunks/ssr/[root-of-the-server]__0l~dc3x._.js +3 -0
  446. package/.next/server/chunks/ssr/[root-of-the-server]__0mab0km._.js +3 -0
  447. package/.next/server/chunks/ssr/[root-of-the-server]__0n32nv5._.js +30 -0
  448. package/.next/server/chunks/ssr/[root-of-the-server]__0n8qufu._.js +3 -0
  449. package/.next/server/chunks/ssr/[root-of-the-server]__0ndt9h3._.js +3 -0
  450. package/.next/server/chunks/ssr/[root-of-the-server]__0p~u4y6._.js +3 -0
  451. package/.next/server/chunks/ssr/[root-of-the-server]__0q.du4s._.js +3 -0
  452. package/.next/server/chunks/ssr/[root-of-the-server]__0rs7pkn._.js +3 -0
  453. package/.next/server/chunks/ssr/[root-of-the-server]__0sysz2q._.js +47 -0
  454. package/.next/server/chunks/ssr/[root-of-the-server]__0t25~v8._.js +3 -0
  455. package/.next/server/chunks/ssr/[root-of-the-server]__0ti70do._.js +3 -0
  456. package/.next/server/chunks/ssr/[root-of-the-server]__0uevudp._.js +30 -0
  457. package/.next/server/chunks/ssr/[root-of-the-server]__0wwqzmm._.js +3 -0
  458. package/.next/server/chunks/ssr/[root-of-the-server]__0xt3-qb._.js +3 -0
  459. package/.next/server/chunks/ssr/[root-of-the-server]__0y-lkvf._.js +3 -0
  460. package/.next/server/chunks/ssr/[root-of-the-server]__0zvf.ro._.js +3 -0
  461. package/.next/server/chunks/ssr/[root-of-the-server]__0~jc3l5._.js +3 -0
  462. package/.next/server/chunks/ssr/[root-of-the-server]__11m7m-q._.js +3 -0
  463. package/.next/server/chunks/ssr/[root-of-the-server]__1223b0_._.js +30 -0
  464. package/.next/server/chunks/ssr/[root-of-the-server]__12f810l._.js +3 -0
  465. package/.next/server/chunks/ssr/[root-of-the-server]__13-by9r._.js +33 -0
  466. package/.next/server/chunks/ssr/[root-of-the-server]__13-egel._.js +3 -0
  467. package/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
  468. package/.next/server/chunks/ssr/tower_0-nwtka._.js +3 -0
  469. package/.next/server/chunks/ssr/tower_0-omr_b._.js +30 -0
  470. package/.next/server/chunks/ssr/tower_00.hg6u._.js +3 -0
  471. package/.next/server/chunks/ssr/tower_01szasw._.js +3 -0
  472. package/.next/server/chunks/ssr/tower_02he7d6._.js +3 -0
  473. package/.next/server/chunks/ssr/tower_035l~qv._.js +3 -0
  474. package/.next/server/chunks/ssr/tower_03jazku._.js +3 -0
  475. package/.next/server/chunks/ssr/tower_09~lpto._.js +3 -0
  476. package/.next/server/chunks/ssr/tower_0d.car1._.js +30 -0
  477. package/.next/server/chunks/ssr/tower_0egtw-7._.js +30 -0
  478. package/.next/server/chunks/ssr/tower_0gzwyem._.js +3 -0
  479. package/.next/server/chunks/ssr/tower_0h3r32m._.js +30 -0
  480. package/.next/server/chunks/ssr/tower_0kl_bfy._.js +7 -0
  481. package/.next/server/chunks/ssr/tower_0mz4ut.._.js +3 -0
  482. package/.next/server/chunks/ssr/tower_0nuj.0p._.js +39 -0
  483. package/.next/server/chunks/ssr/tower_0pcqezm._.js +3 -0
  484. package/.next/server/chunks/ssr/tower_0r7uuim._.js +30 -0
  485. package/.next/server/chunks/ssr/tower_0sojjnu._.js +3 -0
  486. package/.next/server/chunks/ssr/tower_0tc~.xl._.js +30 -0
  487. package/.next/server/chunks/ssr/tower_0tuq2iz._.js +30 -0
  488. package/.next/server/chunks/ssr/tower_0vo6u9i._.js +3 -0
  489. package/.next/server/chunks/ssr/tower_0wvk~r.._.js +3 -0
  490. package/.next/server/chunks/ssr/tower_10p15te._.js +3 -0
  491. package/.next/server/chunks/ssr/tower_10t13p4._.js +6 -0
  492. package/.next/server/chunks/ssr/tower_117pzh8._.js +3 -0
  493. package/.next/server/chunks/ssr/tower_11q5_.m._.js +3 -0
  494. package/.next/server/chunks/ssr/tower_12sld1c._.js +3 -0
  495. package/.next/server/chunks/ssr/tower_138qlx5._.js +3 -0
  496. package/.next/server/chunks/ssr/tower__next-internal_server_app__global-error_page_actions_13t5~qk.js +3 -0
  497. package/.next/server/chunks/ssr/tower_src_08t.wy-._.js +3 -0
  498. package/.next/server/chunks/ssr/tower_src_actions_agent-actions_ts_0j.e1tn._.js +4 -0
  499. package/.next/server/chunks/ssr/tower_src_actions_file-actions_ts_0424lna._.js +3 -0
  500. package/.next/server/chunks/ssr/tower_src_app_missions_missions-client_tsx_0a9vjyr._.js +3 -0
  501. package/.next/server/chunks/ssr/tower_src_app_onboarding_page_tsx_0_3krz1._.js +3 -0
  502. package/.next/server/chunks/ssr/tower_src_app_settings_page_tsx_0vo5e-o._.js +3 -0
  503. package/.next/server/chunks/ssr/tower_src_app_workspaces_[workspaceId]_assets_assets-page-client_tsx_0zfgzhi._.js +3 -0
  504. package/.next/server/chunks/ssr/tower_src_app_workspaces_[workspaceId]_board-page-client_tsx_0kjp1u0._.js +7 -0
  505. package/.next/server/chunks/ssr/tower_src_components_ui_select_tsx_10ajx~2._.js +3 -0
  506. package/.next/server/chunks/ssr/tower_src_lib_01420_4._.js +3 -0
  507. package/.next/server/chunks/ssr/tower_src_lib_0i-zjpa._.js +3 -0
  508. package/.next/server/chunks/ssr/tower_src_lib_0ja~kdb._.js +3 -0
  509. package/.next/server/chunks/ssr/tower_src_lib_0obw2r8._.js +3 -0
  510. package/.next/server/chunks/ssr/tower_src_lib_0rgfsuf._.js +3 -0
  511. package/.next/server/chunks/ssr/tower_src_lib_constants_ts_0o218_c._.js +3 -0
  512. package/.next/server/chunks/tower_03g~ktv._.js +7 -0
  513. package/.next/server/chunks/tower_05du07.._.js +10 -0
  514. package/.next/server/chunks/tower_0a-x6m.._.js +3 -0
  515. package/.next/server/chunks/tower__next-internal_server_app_api_adapters_test_route_actions_13jw~9b.js +3 -0
  516. package/.next/server/chunks/tower__next-internal_server_app_api_browse-fs_route_actions_0k5p2xy.js +3 -0
  517. package/.next/server/chunks/tower__next-internal_server_app_api_git_route_actions_0rvpodb.js +3 -0
  518. package/.next/server/chunks/tower__next-internal_server_app_api_internal_assets_reveal_route_actions_0idwm6j.js +3 -0
  519. package/.next/server/chunks/tower__next-internal_server_app_api_internal_assistant_route_actions_0rdz1d..js +3 -0
  520. package/.next/server/chunks/tower__next-internal_server_app_api_internal_hooks_install_route_actions_06dxleu.js +3 -0
  521. package/.next/server/chunks/tower__next-internal_server_app_api_internal_hooks_session_route_actions_0wlv4lf.js +3 -0
  522. package/.next/server/chunks/tower__next-internal_server_app_api_internal_hooks_stop_route_actions_101_oub.js +3 -0
  523. package/.next/server/chunks/tower__next-internal_server_app_api_internal_hooks_upload_route_actions_0439qz_.js +3 -0
  524. package/.next/server/chunks/tower__next-internal_server_app_api_tasks_[taskId]_diff_route_actions_0nthc84.js +3 -0
  525. package/.next/server/chunks/tower__next-internal_server_app_api_tasks_[taskId]_merge_route_actions_0g.x0nb.js +3 -0
  526. package/.next/server/chunks/tower__next-internal_server_app_apple-icon_png_route_actions_0bni-sb.js +3 -0
  527. package/.next/server/chunks/tower__next-internal_server_app_favicon_ico_route_actions_0kw~xj2.js +3 -0
  528. package/.next/server/chunks/tower__next-internal_server_app_icon0_svg_route_actions_0nww9-e.js +3 -0
  529. package/.next/server/chunks/tower__next-internal_server_app_icon1_png_route_actions_09h.ywu.js +3 -0
  530. package/.next/server/chunks/tower__next-internal_server_app_manifest_json_route_actions_080ob~r.js +3 -0
  531. package/.next/server/chunks/tower_src_0..vg-t._.js +3 -0
  532. package/.next/server/chunks/tower_src_05rqj.1._.js +3 -0
  533. package/.next/server/chunks/tower_src_lib_0uok6j3._.js +3 -0
  534. package/.next/server/chunks/tower_src_lib_0w8qt4s._.js +3 -0
  535. package/.next/server/chunks/tower_src_lib_constants_ts_0cxd4.p._.js +3 -0
  536. package/.next/server/edge/chunks/0y9m_next_dist_esm_build_templates_edge-wrapper_0cx_eo..js +3 -0
  537. package/.next/server/edge/chunks/tower_0wvfs38._.js +3 -0
  538. package/.next/server/functions-config-manifest.json +22 -0
  539. package/.next/server/instrumentation/middleware-manifest.json +12 -0
  540. package/.next/server/instrumentation.js +4 -0
  541. package/.next/server/instrumentation.js.nft.json +1 -0
  542. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  543. package/.next/server/middleware-build-manifest.js +22 -0
  544. package/.next/server/middleware-manifest.json +6 -0
  545. package/.next/server/next-font-manifest.js +1 -0
  546. package/.next/server/next-font-manifest.json +55 -0
  547. package/.next/server/pages/404.html +1 -0
  548. package/.next/server/pages/500.html +1 -0
  549. package/.next/server/pages-manifest.json +4 -0
  550. package/.next/server/prefetch-hints.json +1 -0
  551. package/.next/server/server-reference-manifest.js +1 -0
  552. package/.next/server/server-reference-manifest.json +2778 -0
  553. package/.next/static/chunks/0-64z7pmj57~d.js +1 -0
  554. package/.next/static/chunks/00xbbu.nlx92z.js +1 -0
  555. package/.next/static/chunks/049.9ha2n6os5.js +1 -0
  556. package/.next/static/chunks/05j6t69jmpqju.js +1 -0
  557. package/.next/static/chunks/07a_xadb-3w1a.js +1 -0
  558. package/.next/static/chunks/0_.pyr2jhdqa2.js +5 -0
  559. package/.next/static/chunks/0_c8duf92i~xg.js +1 -0
  560. package/.next/static/chunks/0a2blrvqw8t5y.js +5 -0
  561. package/.next/static/chunks/0kc-95qs2~eid.js +1 -0
  562. package/.next/static/chunks/0kojsk~4uroqj.js +1 -0
  563. package/.next/static/chunks/0kt2vohpgb7h6.js +1 -0
  564. package/.next/static/chunks/0kubr70r_r2f2.js +1 -0
  565. package/.next/static/chunks/0ttrpz.l-v-yv.js +1 -0
  566. package/.next/static/chunks/0z-ecklemrfx-.js +1 -0
  567. package/.next/static/chunks/0z61ts2ro9_k3.js +83 -0
  568. package/.next/trace +2 -0
  569. package/.next/trace-build +1 -0
  570. package/.next/turbopack +0 -0
  571. package/.next/types/routes.d.ts +103 -0
  572. package/.next/types/validator.ts +349 -0
  573. package/bin/tower.mjs +5 -15
  574. package/next.config.ts +1 -8
  575. package/package.json +8 -6
  576. package/public/vs/_commonjsHelpers-CT9FvmAN.js +1 -0
  577. package/public/vs/abap-D-t0cyap.js +1 -0
  578. package/public/vs/apex-CcIm7xu6.js +1 -0
  579. package/public/vs/assets/css.worker-HnVq6Ewq.js +93 -0
  580. package/public/vs/assets/editor.worker-Be8ye1pW.js +26 -0
  581. package/public/vs/assets/html.worker-B51mlPHg.js +470 -0
  582. package/public/vs/assets/json.worker-DKiEKt88.js +58 -0
  583. package/public/vs/assets/ts.worker-CMbG-7ft.js +67731 -0
  584. package/public/vs/azcli-BA0tQDCg.js +1 -0
  585. package/public/vs/basic-languages/monaco.contribution.js +1 -0
  586. package/public/vs/bat-C397hTD6.js +1 -0
  587. package/public/vs/bicep-DF5aW17k.js +2 -0
  588. package/public/vs/cameligo-plsz8qhj.js +1 -0
  589. package/public/vs/clojure-Y2auQMzK.js +1 -0
  590. package/public/vs/coffee-Bu45yuWE.js +1 -0
  591. package/public/vs/cpp-CkKPQIni.js +1 -0
  592. package/public/vs/csharp-CX28MZyh.js +1 -0
  593. package/public/vs/csp-D8uWnyxW.js +1 -0
  594. package/public/vs/css-CaeNmE3S.js +3 -0
  595. package/public/vs/cssMode-CjiAH6dQ.js +1 -0
  596. package/public/vs/cypher-DVThT8BS.js +1 -0
  597. package/public/vs/dart-CmGfCvrO.js +1 -0
  598. package/public/vs/dockerfile-CZqqYdch.js +1 -0
  599. package/public/vs/ecl-30fUercY.js +1 -0
  600. package/public/vs/editor/editor.main.css +1 -0
  601. package/public/vs/editor/editor.main.js +5 -0
  602. package/public/vs/editor.api-CalNCsUg.js +903 -0
  603. package/public/vs/elixir-xjPaIfzF.js +1 -0
  604. package/public/vs/flow9-DqtmStfK.js +1 -0
  605. package/public/vs/freemarker2-Cz_sV6Md.js +3 -0
  606. package/public/vs/fsharp-BOMdg4U1.js +1 -0
  607. package/public/vs/go-D_hbi-Jt.js +1 -0
  608. package/public/vs/graphql-CKUU4kLG.js +1 -0
  609. package/public/vs/handlebars-OwglfO-1.js +1 -0
  610. package/public/vs/hcl-DTaboeZW.js +1 -0
  611. package/public/vs/html-Pa1xEWsY.js +1 -0
  612. package/public/vs/htmlMode-Bz67EXwp.js +1 -0
  613. package/public/vs/ini-CsNwO04R.js +1 -0
  614. package/public/vs/java-CI4ZMsH9.js +1 -0
  615. package/public/vs/javascript-PczUCGdz.js +1 -0
  616. package/public/vs/jsonMode-DULH5oaX.js +7 -0
  617. package/public/vs/julia-BwzEvaQw.js +1 -0
  618. package/public/vs/kotlin-IUYPiTV8.js +1 -0
  619. package/public/vs/language/css/monaco.contribution.js +1 -0
  620. package/public/vs/language/html/monaco.contribution.js +1 -0
  621. package/public/vs/language/json/monaco.contribution.js +1 -0
  622. package/public/vs/language/typescript/monaco.contribution.js +1 -0
  623. package/public/vs/less-C0eDYdqa.js +2 -0
  624. package/public/vs/lexon-iON-Kj97.js +1 -0
  625. package/public/vs/liquid-DqKjdPGy.js +1 -0
  626. package/public/vs/loader.js +1368 -0
  627. package/public/vs/lspLanguageFeatures-kM9O9rjY.js +4 -0
  628. package/public/vs/lua-DtygF91M.js +1 -0
  629. package/public/vs/m3-CsR4AuFi.js +1 -0
  630. package/public/vs/markdown-C_rD0bIw.js +1 -0
  631. package/public/vs/mdx-DEWtB1K5.js +1 -0
  632. package/public/vs/mips-CiYP61RB.js +1 -0
  633. package/public/vs/monaco.contribution-D2OdxNBt.js +1 -0
  634. package/public/vs/monaco.contribution-DO3azKX8.js +1 -0
  635. package/public/vs/monaco.contribution-EcChJV6a.js +1 -0
  636. package/public/vs/monaco.contribution-qLAYrEOP.js +1 -0
  637. package/public/vs/msdax-C38-sJlp.js +1 -0
  638. package/public/vs/mysql-CdtbpvbG.js +1 -0
  639. package/public/vs/nls.messages-loader.js +1 -0
  640. package/public/vs/nls.messages.cs.js.js +17 -0
  641. package/public/vs/nls.messages.de.js.js +17 -0
  642. package/public/vs/nls.messages.es.js.js +17 -0
  643. package/public/vs/nls.messages.fr.js.js +15 -0
  644. package/public/vs/nls.messages.it.js.js +15 -0
  645. package/public/vs/nls.messages.ja.js.js +17 -0
  646. package/public/vs/nls.messages.js.js +10 -0
  647. package/public/vs/nls.messages.ko.js.js +25 -0
  648. package/public/vs/nls.messages.pl.js.js +17 -0
  649. package/public/vs/nls.messages.pt-br.js.js +6 -0
  650. package/public/vs/nls.messages.ru.js.js +17 -0
  651. package/public/vs/nls.messages.tr.js.js +15 -0
  652. package/public/vs/nls.messages.zh-cn.js.js +17 -0
  653. package/public/vs/nls.messages.zh-tw.js.js +15 -0
  654. package/public/vs/objective-c-CntZFaHX.js +1 -0
  655. package/public/vs/pascal-r6kuqfl_.js +1 -0
  656. package/public/vs/pascaligo-BiXoTmXh.js +1 -0
  657. package/public/vs/perl-DABw_TcH.js +1 -0
  658. package/public/vs/pgsql-me_jFXeX.js +1 -0
  659. package/public/vs/php-D_kh-9LK.js +1 -0
  660. package/public/vs/pla-VfZjczW0.js +1 -0
  661. package/public/vs/postiats-BBSzz8Pk.js +1 -0
  662. package/public/vs/powerquery-Dt-g_2cc.js +1 -0
  663. package/public/vs/powershell-B-7ap1zc.js +1 -0
  664. package/public/vs/protobuf-BmtuEB1A.js +2 -0
  665. package/public/vs/pug-BRpRNeEb.js +1 -0
  666. package/public/vs/python-Cr0UkIbn.js +1 -0
  667. package/public/vs/qsharp-BzsFaUU9.js +1 -0
  668. package/public/vs/r-f8dDdrp4.js +1 -0
  669. package/public/vs/razor-BYAHOTkz.js +1 -0
  670. package/public/vs/redis-fvZQY4PI.js +1 -0
  671. package/public/vs/redshift-45Et0LQi.js +1 -0
  672. package/public/vs/restructuredtext-C7UUFKFD.js +1 -0
  673. package/public/vs/ruby-CZO8zYTz.js +1 -0
  674. package/public/vs/rust-Bfetafyc.js +1 -0
  675. package/public/vs/sb-3GYllVck.js +1 -0
  676. package/public/vs/scala-foMgrKo1.js +1 -0
  677. package/public/vs/scheme-CHdMtr7p.js +1 -0
  678. package/public/vs/scss-C1cmLt9V.js +3 -0
  679. package/public/vs/shell-ClXCKCEW.js +1 -0
  680. package/public/vs/solidity-MZ6ExpPy.js +1 -0
  681. package/public/vs/sophia-DWkuSsPQ.js +1 -0
  682. package/public/vs/sparql-AUGFYSyk.js +1 -0
  683. package/public/vs/sql-32GpJSV2.js +1 -0
  684. package/public/vs/st-CuDFIVZ_.js +1 -0
  685. package/public/vs/swift-n-2HociN.js +3 -0
  686. package/public/vs/systemverilog-Ch4vA8Yt.js +1 -0
  687. package/public/vs/tcl-D74tq1nH.js +1 -0
  688. package/public/vs/tsMode-CZz1Umrk.js +11 -0
  689. package/public/vs/twig-C6taOxMV.js +1 -0
  690. package/public/vs/typescript-DfOrAzoV.js +1 -0
  691. package/public/vs/typespec-D-PIh9Xw.js +1 -0
  692. package/public/vs/vb-Dyb2648j.js +1 -0
  693. package/public/vs/wgsl-BhLXMOR0.js +298 -0
  694. package/public/vs/workers-DcJshg-q.js +1 -0
  695. package/public/vs/xml-CdsdnY8S.js +1 -0
  696. package/public/vs/yaml-DYGvmE88.js +1 -0
  697. package/.next/standalone/tower/.claude/rules/process-lifecycle.md +0 -31
  698. package/.next/standalone/tower/.claude/rules/security.md +0 -29
  699. package/.next/standalone/tower/.claude/rules/ui.md +0 -105
  700. package/.next/standalone/tower/AGENTS.md +0 -325
  701. package/.next/standalone/tower/CHANGELOG.md +0 -63
  702. package/.next/standalone/tower/CLAUDE.md +0 -33
  703. package/.next/standalone/tower/LICENSE +0 -21
  704. package/.next/standalone/tower/README.md +0 -214
  705. package/.next/standalone/tower/README.zh.md +0 -212
  706. package/.next/standalone/tower/bin/tower.mjs +0 -180
  707. package/.next/standalone/tower/components.json +0 -25
  708. package/.next/standalone/tower/docs/README.md +0 -51
  709. package/.next/standalone/tower/docs/ai/README.md +0 -91
  710. package/.next/standalone/tower/docs/ai/cli-abstraction-design.md +0 -398
  711. package/.next/standalone/tower/docs/ai/cli-abstraction-plan.md +0 -1345
  712. package/.next/standalone/tower/docs/assets-notes/README.md +0 -41
  713. package/.next/standalone/tower/docs/assistant/README.md +0 -48
  714. package/.next/standalone/tower/docs/board/README.md +0 -36
  715. package/.next/standalone/tower/docs/diagrams/tower-ai-architecture-en.html +0 -259
  716. package/.next/standalone/tower/docs/diagrams/tower-ai-architecture.html +0 -259
  717. package/.next/standalone/tower/docs/diagrams/tower-data-model-en.html +0 -344
  718. package/.next/standalone/tower/docs/diagrams/tower-data-model.html +0 -344
  719. package/.next/standalone/tower/docs/diagrams/tower-module-map-en.html +0 -176
  720. package/.next/standalone/tower/docs/diagrams/tower-module-map.html +0 -176
  721. package/.next/standalone/tower/docs/diagrams/tower-system-architecture-en.html +0 -336
  722. package/.next/standalone/tower/docs/diagrams/tower-system-architecture.html +0 -336
  723. package/.next/standalone/tower/docs/diagrams/tower-task-lifecycle-en.html +0 -251
  724. package/.next/standalone/tower/docs/diagrams/tower-task-lifecycle.html +0 -251
  725. package/.next/standalone/tower/docs/en/guide/architecture.md +0 -79
  726. package/.next/standalone/tower/docs/en/guide/diagrams.md +0 -24
  727. package/.next/standalone/tower/docs/en/guide/getting-started.md +0 -80
  728. package/.next/standalone/tower/docs/en/guide/introduction.md +0 -84
  729. package/.next/standalone/tower/docs/en/index.md +0 -36
  730. package/.next/standalone/tower/docs/en/modules/ai.md +0 -110
  731. package/.next/standalone/tower/docs/en/modules/assets-notes.md +0 -56
  732. package/.next/standalone/tower/docs/en/modules/assistant.md +0 -63
  733. package/.next/standalone/tower/docs/en/modules/board.md +0 -44
  734. package/.next/standalone/tower/docs/en/modules/git.md +0 -55
  735. package/.next/standalone/tower/docs/en/modules/i18n.md +0 -35
  736. package/.next/standalone/tower/docs/en/modules/mcp.md +0 -62
  737. package/.next/standalone/tower/docs/en/modules/missions.md +0 -47
  738. package/.next/standalone/tower/docs/en/modules/project.md +0 -57
  739. package/.next/standalone/tower/docs/en/modules/search.md +0 -49
  740. package/.next/standalone/tower/docs/en/modules/settings.md +0 -63
  741. package/.next/standalone/tower/docs/en/modules/task.md +0 -82
  742. package/.next/standalone/tower/docs/en/modules/terminal.md +0 -73
  743. package/.next/standalone/tower/docs/en/modules/workspace.md +0 -61
  744. package/.next/standalone/tower/docs/git/README.md +0 -42
  745. package/.next/standalone/tower/docs/guide/architecture.md +0 -29
  746. package/.next/standalone/tower/docs/guide/diagrams.md +0 -24
  747. package/.next/standalone/tower/docs/guide/getting-started.md +0 -80
  748. package/.next/standalone/tower/docs/guide/introduction.md +0 -84
  749. package/.next/standalone/tower/docs/i18n/README.md +0 -23
  750. package/.next/standalone/tower/docs/index.md +0 -36
  751. package/.next/standalone/tower/docs/mcp/README.md +0 -50
  752. package/.next/standalone/tower/docs/missions/README.md +0 -40
  753. package/.next/standalone/tower/docs/modules/ai.md +0 -104
  754. package/.next/standalone/tower/docs/modules/assets-notes.md +0 -68
  755. package/.next/standalone/tower/docs/modules/assistant.md +0 -74
  756. package/.next/standalone/tower/docs/modules/board.md +0 -56
  757. package/.next/standalone/tower/docs/modules/git.md +0 -61
  758. package/.next/standalone/tower/docs/modules/i18n.md +0 -38
  759. package/.next/standalone/tower/docs/modules/mcp.md +0 -68
  760. package/.next/standalone/tower/docs/modules/missions.md +0 -54
  761. package/.next/standalone/tower/docs/modules/project.md +0 -65
  762. package/.next/standalone/tower/docs/modules/search.md +0 -57
  763. package/.next/standalone/tower/docs/modules/settings.md +0 -72
  764. package/.next/standalone/tower/docs/modules/task.md +0 -82
  765. package/.next/standalone/tower/docs/modules/terminal.md +0 -70
  766. package/.next/standalone/tower/docs/modules/workspace.md +0 -68
  767. package/.next/standalone/tower/docs/package.json +0 -11
  768. package/.next/standalone/tower/docs/pnpm-lock.yaml +0 -1620
  769. package/.next/standalone/tower/docs/postcss.config.mjs +0 -2
  770. package/.next/standalone/tower/docs/project/README.md +0 -45
  771. package/.next/standalone/tower/docs/public/banner.png +0 -0
  772. package/.next/standalone/tower/docs/public/diagrams/tower-ai-architecture-en.html +0 -259
  773. package/.next/standalone/tower/docs/public/diagrams/tower-ai-architecture.html +0 -259
  774. package/.next/standalone/tower/docs/public/diagrams/tower-data-model-en.html +0 -344
  775. package/.next/standalone/tower/docs/public/diagrams/tower-data-model.html +0 -344
  776. package/.next/standalone/tower/docs/public/diagrams/tower-module-map-en.html +0 -176
  777. package/.next/standalone/tower/docs/public/diagrams/tower-module-map.html +0 -176
  778. package/.next/standalone/tower/docs/public/diagrams/tower-system-architecture-en.html +0 -336
  779. package/.next/standalone/tower/docs/public/diagrams/tower-system-architecture.html +0 -336
  780. package/.next/standalone/tower/docs/public/diagrams/tower-task-lifecycle-en.html +0 -251
  781. package/.next/standalone/tower/docs/public/diagrams/tower-task-lifecycle.html +0 -251
  782. package/.next/standalone/tower/docs/search/README.md +0 -37
  783. package/.next/standalone/tower/docs/settings/README.md +0 -43
  784. package/.next/standalone/tower/docs/task/README.md +0 -67
  785. package/.next/standalone/tower/docs/terminal/README.md +0 -58
  786. package/.next/standalone/tower/docs/workspace/README.md +0 -50
  787. package/.next/standalone/tower/docs/zh/guide/architecture.md +0 -29
  788. package/.next/standalone/tower/docs/zh/guide/diagrams.md +0 -24
  789. package/.next/standalone/tower/docs/zh/guide/getting-started.md +0 -80
  790. package/.next/standalone/tower/docs/zh/guide/introduction.md +0 -66
  791. package/.next/standalone/tower/docs/zh/index.md +0 -23
  792. package/.next/standalone/tower/docs/zh/modules/ai.md +0 -104
  793. package/.next/standalone/tower/docs/zh/modules/assets-notes.md +0 -68
  794. package/.next/standalone/tower/docs/zh/modules/assistant.md +0 -74
  795. package/.next/standalone/tower/docs/zh/modules/board.md +0 -56
  796. package/.next/standalone/tower/docs/zh/modules/git.md +0 -61
  797. package/.next/standalone/tower/docs/zh/modules/i18n.md +0 -38
  798. package/.next/standalone/tower/docs/zh/modules/mcp.md +0 -68
  799. package/.next/standalone/tower/docs/zh/modules/missions.md +0 -54
  800. package/.next/standalone/tower/docs/zh/modules/project.md +0 -65
  801. package/.next/standalone/tower/docs/zh/modules/search.md +0 -57
  802. package/.next/standalone/tower/docs/zh/modules/settings.md +0 -72
  803. package/.next/standalone/tower/docs/zh/modules/task.md +0 -82
  804. package/.next/standalone/tower/docs/zh/modules/terminal.md +0 -70
  805. package/.next/standalone/tower/docs/zh/modules/workspace.md +0 -68
  806. package/.next/standalone/tower/eslint.config.mjs +0 -18
  807. package/.next/standalone/tower/next.config.ts +0 -15
  808. package/.next/standalone/tower/package.json +0 -117
  809. package/.next/standalone/tower/playwright.config.ts +0 -28
  810. package/.next/standalone/tower/pnpm-lock.yaml +0 -10524
  811. package/.next/standalone/tower/pnpm-workspace.yaml +0 -6
  812. package/.next/standalone/tower/postcss.config.mjs +0 -7
  813. package/.next/standalone/tower/prisma/init-fts.ts +0 -23
  814. package/.next/standalone/tower/prisma/prisma/dev.db +0 -0
  815. package/.next/standalone/tower/prisma/schema.prisma +0 -290
  816. package/.next/standalone/tower/prisma/seed.ts +0 -50
  817. package/.next/standalone/tower/prompts/backend-developer.md +0 -20
  818. package/.next/standalone/tower/prompts/code-reviewer.md +0 -19
  819. package/.next/standalone/tower/prompts/frontend-developer.md +0 -20
  820. package/.next/standalone/tower/prompts/product-manager.md +0 -16
  821. package/.next/standalone/tower/public/banner.jpg +0 -0
  822. package/.next/standalone/tower/public/logo.png +0 -0
  823. package/.next/standalone/tower/scripts/copy-monaco.js +0 -27
  824. package/.next/standalone/tower/scripts/init-db.ts +0 -74
  825. package/.next/standalone/tower/scripts/init-tower.ts +0 -10
  826. package/.next/standalone/tower/scripts/migrate-data.ts +0 -102
  827. package/.next/standalone/tower/scripts/post-tool-hook.js +0 -188
  828. package/.next/standalone/tower/scripts/session-start-hook.js +0 -79
  829. package/.next/standalone/tower/scripts/stop-hook.js +0 -78
  830. package/.next/standalone/tower/server.js +0 -38
  831. package/.next/standalone/tower/skills/tower/SKILL.md +0 -375
  832. package/.next/standalone/tower/src/actions/agent-actions.ts +0 -741
  833. package/.next/standalone/tower/src/actions/agent-config-actions.ts +0 -44
  834. package/.next/standalone/tower/src/actions/ai-config-actions.ts +0 -51
  835. package/.next/standalone/tower/src/actions/asset-actions.ts +0 -131
  836. package/.next/standalone/tower/src/actions/assistant-actions.ts +0 -107
  837. package/.next/standalone/tower/src/actions/cli-profile-actions.ts +0 -98
  838. package/.next/standalone/tower/src/actions/config-actions.ts +0 -84
  839. package/.next/standalone/tower/src/actions/file-actions.ts +0 -262
  840. package/.next/standalone/tower/src/actions/git-actions.ts +0 -90
  841. package/.next/standalone/tower/src/actions/label-actions.ts +0 -67
  842. package/.next/standalone/tower/src/actions/note-actions.ts +0 -87
  843. package/.next/standalone/tower/src/actions/onboarding-actions.ts +0 -103
  844. package/.next/standalone/tower/src/actions/preview-actions.ts +0 -76
  845. package/.next/standalone/tower/src/actions/project-actions.ts +0 -222
  846. package/.next/standalone/tower/src/actions/prompt-actions.ts +0 -73
  847. package/.next/standalone/tower/src/actions/report-actions.ts +0 -141
  848. package/.next/standalone/tower/src/actions/search-actions.ts +0 -21
  849. package/.next/standalone/tower/src/actions/search-code-actions.ts +0 -185
  850. package/.next/standalone/tower/src/actions/task-actions.ts +0 -350
  851. package/.next/standalone/tower/src/actions/workspace-actions.ts +0 -224
  852. package/.next/standalone/tower/src/app/api/adapters/test/route.ts +0 -52
  853. package/.next/standalone/tower/src/app/api/browse-fs/route.ts +0 -90
  854. package/.next/standalone/tower/src/app/api/files/assets/[projectId]/[filename]/route.ts +0 -38
  855. package/.next/standalone/tower/src/app/api/git/route.ts +0 -367
  856. package/.next/standalone/tower/src/app/api/internal/assets/[projectId]/[filename]/route.ts +0 -51
  857. package/.next/standalone/tower/src/app/api/internal/assets/reveal/route.ts +0 -71
  858. package/.next/standalone/tower/src/app/api/internal/assistant/chat/route.ts +0 -217
  859. package/.next/standalone/tower/src/app/api/internal/assistant/images/route.ts +0 -51
  860. package/.next/standalone/tower/src/app/api/internal/assistant/route.ts +0 -50
  861. package/.next/standalone/tower/src/app/api/internal/assistant/sessions/route.ts +0 -44
  862. package/.next/standalone/tower/src/app/api/internal/cache/[...segments]/route.ts +0 -59
  863. package/.next/standalone/tower/src/app/api/internal/hooks/install/route.ts +0 -41
  864. package/.next/standalone/tower/src/app/api/internal/hooks/session/route.ts +0 -60
  865. package/.next/standalone/tower/src/app/api/internal/hooks/stop/route.ts +0 -61
  866. package/.next/standalone/tower/src/app/api/internal/hooks/upload/route.ts +0 -173
  867. package/.next/standalone/tower/src/app/api/internal/notifications/pending/route.ts +0 -20
  868. package/.next/standalone/tower/src/app/api/internal/terminal/[taskId]/buffer/route.ts +0 -48
  869. package/.next/standalone/tower/src/app/api/internal/terminal/[taskId]/input/route.ts +0 -64
  870. package/.next/standalone/tower/src/app/api/internal/terminal/[taskId]/start/route.ts +0 -37
  871. package/.next/standalone/tower/src/app/api/tasks/[taskId]/diff/route.ts +0 -224
  872. package/.next/standalone/tower/src/app/api/tasks/[taskId]/merge/route.ts +0 -159
  873. package/.next/standalone/tower/src/app/favicon.ico +0 -0
  874. package/.next/standalone/tower/src/app/globals.css +0 -247
  875. package/.next/standalone/tower/src/app/layout.tsx +0 -63
  876. package/.next/standalone/tower/src/app/missions/missions-client.tsx +0 -338
  877. package/.next/standalone/tower/src/app/missions/page.tsx +0 -10
  878. package/.next/standalone/tower/src/app/onboarding/page.tsx +0 -619
  879. package/.next/standalone/tower/src/app/page.tsx +0 -5
  880. package/.next/standalone/tower/src/app/settings/page.tsx +0 -7
  881. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/archive/archive-page-client.tsx +0 -258
  882. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/archive/page.tsx +0 -36
  883. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/assets/assets-page-client.tsx +0 -232
  884. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/assets/page.tsx +0 -36
  885. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/board-page-client.tsx +0 -257
  886. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/notes/notes-page-client.tsx +0 -337
  887. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/notes/page.tsx +0 -39
  888. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/page.tsx +0 -81
  889. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/projects/[projectId]/page.tsx +0 -30
  890. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/tasks/[taskId]/page.tsx +0 -97
  891. package/.next/standalone/tower/src/app/workspaces/[workspaceId]/tasks/[taskId]/task-page-client.tsx +0 -601
  892. package/.next/standalone/tower/src/app/workspaces/page.tsx +0 -13
  893. package/.next/standalone/tower/src/components/assets/asset-item.tsx +0 -128
  894. package/.next/standalone/tower/src/components/assets/asset-list.tsx +0 -31
  895. package/.next/standalone/tower/src/components/assets/asset-upload.tsx +0 -216
  896. package/.next/standalone/tower/src/components/assets/image-lightbox.tsx +0 -72
  897. package/.next/standalone/tower/src/components/assets/text-preview-dialog.tsx +0 -135
  898. package/.next/standalone/tower/src/components/assistant/assistant-chat-bubble.tsx +0 -308
  899. package/.next/standalone/tower/src/components/assistant/assistant-chat.tsx +0 -215
  900. package/.next/standalone/tower/src/components/assistant/assistant-panel.tsx +0 -149
  901. package/.next/standalone/tower/src/components/assistant/assistant-provider.tsx +0 -512
  902. package/.next/standalone/tower/src/components/assistant/image-preview-modal.tsx +0 -60
  903. package/.next/standalone/tower/src/components/assistant/image-thumbnail-strip.tsx +0 -94
  904. package/.next/standalone/tower/src/components/board/board-column.tsx +0 -115
  905. package/.next/standalone/tower/src/components/board/board-filters.tsx +0 -42
  906. package/.next/standalone/tower/src/components/board/board-stats.tsx +0 -52
  907. package/.next/standalone/tower/src/components/board/column-tasks-dialog.tsx +0 -100
  908. package/.next/standalone/tower/src/components/board/create-task-dialog.tsx +0 -362
  909. package/.next/standalone/tower/src/components/board/kanban-board.tsx +0 -169
  910. package/.next/standalone/tower/src/components/board/project-tabs.tsx +0 -93
  911. package/.next/standalone/tower/src/components/board/task-card-context-menu.tsx +0 -121
  912. package/.next/standalone/tower/src/components/board/task-card.tsx +0 -135
  913. package/.next/standalone/tower/src/components/layout/app-sidebar.tsx +0 -662
  914. package/.next/standalone/tower/src/components/layout/folder-browser-dialog.tsx +0 -273
  915. package/.next/standalone/tower/src/components/layout/layout-client.tsx +0 -198
  916. package/.next/standalone/tower/src/components/layout/search-dialog.tsx +0 -196
  917. package/.next/standalone/tower/src/components/layout/sub-page-nav.tsx +0 -54
  918. package/.next/standalone/tower/src/components/layout/top-bar.tsx +0 -265
  919. package/.next/standalone/tower/src/components/missions/grid-layout-presets.ts +0 -19
  920. package/.next/standalone/tower/src/components/missions/grid-preset-picker.tsx +0 -209
  921. package/.next/standalone/tower/src/components/missions/merge-missions.ts +0 -30
  922. package/.next/standalone/tower/src/components/missions/mission-card.tsx +0 -203
  923. package/.next/standalone/tower/src/components/missions/task-picker-dialog.tsx +0 -415
  924. package/.next/standalone/tower/src/components/notes/category-filter.tsx +0 -44
  925. package/.next/standalone/tower/src/components/notes/note-card.tsx +0 -67
  926. package/.next/standalone/tower/src/components/notes/note-editor.tsx +0 -28
  927. package/.next/standalone/tower/src/components/notes/note-list.tsx +0 -30
  928. package/.next/standalone/tower/src/components/notifications/notification-permission-banner.tsx +0 -49
  929. package/.next/standalone/tower/src/components/notifications/use-notification-listener.ts +0 -114
  930. package/.next/standalone/tower/src/components/onboarding/guided-tour.tsx +0 -255
  931. package/.next/standalone/tower/src/components/onboarding/onboarding-wizard.tsx +0 -84
  932. package/.next/standalone/tower/src/components/onboarding/wizard-step-cli.tsx +0 -53
  933. package/.next/standalone/tower/src/components/onboarding/wizard-step-username.tsx +0 -59
  934. package/.next/standalone/tower/src/components/project/create-project-dialog.tsx +0 -310
  935. package/.next/standalone/tower/src/components/project/import-project-dialog.tsx +0 -414
  936. package/.next/standalone/tower/src/components/providers/theme-provider.tsx +0 -8
  937. package/.next/standalone/tower/src/components/repository/create-branch-dialog.tsx +0 -165
  938. package/.next/standalone/tower/src/components/repository/git-changes-panel.tsx +0 -294
  939. package/.next/standalone/tower/src/components/repository/git-log-panel.tsx +0 -83
  940. package/.next/standalone/tower/src/components/repository/git-stash-panel.tsx +0 -158
  941. package/.next/standalone/tower/src/components/repository/repo-sidebar.tsx +0 -855
  942. package/.next/standalone/tower/src/components/settings/cli-adapter-tester.tsx +0 -144
  943. package/.next/standalone/tower/src/components/settings/settings-page.tsx +0 -2111
  944. package/.next/standalone/tower/src/components/task/code-editor.tsx +0 -376
  945. package/.next/standalone/tower/src/components/task/code-search.tsx +0 -219
  946. package/.next/standalone/tower/src/components/task/diff-editor.tsx +0 -97
  947. package/.next/standalone/tower/src/components/task/editor-git-panel.tsx +0 -792
  948. package/.next/standalone/tower/src/components/task/editor-tabs.tsx +0 -68
  949. package/.next/standalone/tower/src/components/task/execution-timeline.tsx +0 -258
  950. package/.next/standalone/tower/src/components/task/file-tree-context-menu.tsx +0 -113
  951. package/.next/standalone/tower/src/components/task/file-tree-node.tsx +0 -269
  952. package/.next/standalone/tower/src/components/task/file-tree.tsx +0 -575
  953. package/.next/standalone/tower/src/components/task/preview-panel.tsx +0 -281
  954. package/.next/standalone/tower/src/components/task/task-detail-panel.tsx +0 -455
  955. package/.next/standalone/tower/src/components/task/task-diff-view.tsx +0 -207
  956. package/.next/standalone/tower/src/components/task/task-file-changes.tsx +0 -19
  957. package/.next/standalone/tower/src/components/task/task-merge-confirm-dialog.tsx +0 -152
  958. package/.next/standalone/tower/src/components/task/task-metadata.tsx +0 -74
  959. package/.next/standalone/tower/src/components/task/task-notes-panel.tsx +0 -219
  960. package/.next/standalone/tower/src/components/task/task-overview-drawer.tsx +0 -172
  961. package/.next/standalone/tower/src/components/task/task-terminal.tsx +0 -294
  962. package/.next/standalone/tower/src/components/task/terminal-portal.tsx +0 -156
  963. package/.next/standalone/tower/src/components/task/types.ts +0 -6
  964. package/.next/standalone/tower/src/components/ui/avatar.tsx +0 -109
  965. package/.next/standalone/tower/src/components/ui/badge.tsx +0 -52
  966. package/.next/standalone/tower/src/components/ui/button.tsx +0 -58
  967. package/.next/standalone/tower/src/components/ui/card.tsx +0 -103
  968. package/.next/standalone/tower/src/components/ui/command.tsx +0 -196
  969. package/.next/standalone/tower/src/components/ui/dialog.tsx +0 -160
  970. package/.next/standalone/tower/src/components/ui/dropdown-menu.tsx +0 -268
  971. package/.next/standalone/tower/src/components/ui/empty-state.tsx +0 -26
  972. package/.next/standalone/tower/src/components/ui/error-boundary.tsx +0 -58
  973. package/.next/standalone/tower/src/components/ui/input-group.tsx +0 -158
  974. package/.next/standalone/tower/src/components/ui/input.tsx +0 -20
  975. package/.next/standalone/tower/src/components/ui/label.tsx +0 -20
  976. package/.next/standalone/tower/src/components/ui/popover.tsx +0 -90
  977. package/.next/standalone/tower/src/components/ui/scroll-area.tsx +0 -55
  978. package/.next/standalone/tower/src/components/ui/segmented-control.tsx +0 -42
  979. package/.next/standalone/tower/src/components/ui/select.tsx +0 -207
  980. package/.next/standalone/tower/src/components/ui/separator.tsx +0 -25
  981. package/.next/standalone/tower/src/components/ui/sheet.tsx +0 -138
  982. package/.next/standalone/tower/src/components/ui/sonner.tsx +0 -49
  983. package/.next/standalone/tower/src/components/ui/switch.tsx +0 -32
  984. package/.next/standalone/tower/src/components/ui/tabs.tsx +0 -82
  985. package/.next/standalone/tower/src/components/ui/textarea.tsx +0 -18
  986. package/.next/standalone/tower/src/components/ui/toast.tsx +0 -86
  987. package/.next/standalone/tower/src/components/ui/tooltip.tsx +0 -66
  988. package/.next/standalone/tower/src/hooks/sse-event-reducer.ts +0 -144
  989. package/.next/standalone/tower/src/hooks/use-assistant-chat.ts +0 -190
  990. package/.next/standalone/tower/src/hooks/use-image-upload.ts +0 -140
  991. package/.next/standalone/tower/src/instrumentation.ts +0 -18
  992. package/.next/standalone/tower/src/lib/ai/adapters/cli/claude-cli-adapter.ts +0 -166
  993. package/.next/standalone/tower/src/lib/ai/capability-resolver.ts +0 -81
  994. package/.next/standalone/tower/src/lib/ai/provider-registry.ts +0 -54
  995. package/.next/standalone/tower/src/lib/ai/providers/claude.ts +0 -19
  996. package/.next/standalone/tower/src/lib/ai/providers/index.ts +0 -12
  997. package/.next/standalone/tower/src/lib/ai/types.ts +0 -151
  998. package/.next/standalone/tower/src/lib/assistant-constants.ts +0 -2
  999. package/.next/standalone/tower/src/lib/assistant-message-converter.ts +0 -131
  1000. package/.next/standalone/tower/src/lib/assistant-sessions.ts +0 -75
  1001. package/.next/standalone/tower/src/lib/build-multimodal-prompt.ts +0 -53
  1002. package/.next/standalone/tower/src/lib/claude-session.ts +0 -156
  1003. package/.next/standalone/tower/src/lib/cli-test.ts +0 -476
  1004. package/.next/standalone/tower/src/lib/config-defaults.ts +0 -121
  1005. package/.next/standalone/tower/src/lib/config-reader.ts +0 -16
  1006. package/.next/standalone/tower/src/lib/constants.ts +0 -26
  1007. package/.next/standalone/tower/src/lib/db.ts +0 -28
  1008. package/.next/standalone/tower/src/lib/diff-parser.ts +0 -132
  1009. package/.next/standalone/tower/src/lib/execution-summary.ts +0 -287
  1010. package/.next/standalone/tower/src/lib/file-serve-client.ts +0 -13
  1011. package/.next/standalone/tower/src/lib/file-serve.ts +0 -32
  1012. package/.next/standalone/tower/src/lib/file-utils.ts +0 -108
  1013. package/.next/standalone/tower/src/lib/fs-security.ts +0 -22
  1014. package/.next/standalone/tower/src/lib/fts.ts +0 -83
  1015. package/.next/standalone/tower/src/lib/git-api.ts +0 -19
  1016. package/.next/standalone/tower/src/lib/git-url.ts +0 -244
  1017. package/.next/standalone/tower/src/lib/i18n/en.ts +0 -754
  1018. package/.next/standalone/tower/src/lib/i18n/types.ts +0 -4
  1019. package/.next/standalone/tower/src/lib/i18n/zh.ts +0 -769
  1020. package/.next/standalone/tower/src/lib/i18n.tsx +0 -64
  1021. package/.next/standalone/tower/src/lib/init-tower.ts +0 -129
  1022. package/.next/standalone/tower/src/lib/instrumentation-tasks.ts +0 -116
  1023. package/.next/standalone/tower/src/lib/internal-api-guard.ts +0 -63
  1024. package/.next/standalone/tower/src/lib/logger.ts +0 -46
  1025. package/.next/standalone/tower/src/lib/mime-magic.ts +0 -67
  1026. package/.next/standalone/tower/src/lib/platform.ts +0 -518
  1027. package/.next/standalone/tower/src/lib/preview-process.ts +0 -40
  1028. package/.next/standalone/tower/src/lib/pty/pty-session.ts +0 -157
  1029. package/.next/standalone/tower/src/lib/pty/session-store.ts +0 -67
  1030. package/.next/standalone/tower/src/lib/pty/ws-server.ts +0 -335
  1031. package/.next/standalone/tower/src/lib/schemas.ts +0 -67
  1032. package/.next/standalone/tower/src/lib/search.ts +0 -225
  1033. package/.next/standalone/tower/src/lib/terminal-link-provider.ts +0 -90
  1034. package/.next/standalone/tower/src/lib/tower-dir.ts +0 -69
  1035. package/.next/standalone/tower/src/lib/utils.ts +0 -20
  1036. package/.next/standalone/tower/src/lib/worktree.ts +0 -184
  1037. package/.next/standalone/tower/src/mcp/db.ts +0 -11
  1038. package/.next/standalone/tower/src/mcp/index.ts +0 -15
  1039. package/.next/standalone/tower/src/mcp/server.ts +0 -52
  1040. package/.next/standalone/tower/src/mcp/tools/knowledge-tools.ts +0 -100
  1041. package/.next/standalone/tower/src/mcp/tools/label-tools.ts +0 -70
  1042. package/.next/standalone/tower/src/mcp/tools/note-asset-tools.ts +0 -271
  1043. package/.next/standalone/tower/src/mcp/tools/project-tools.ts +0 -79
  1044. package/.next/standalone/tower/src/mcp/tools/report-tools.ts +0 -214
  1045. package/.next/standalone/tower/src/mcp/tools/search-tools.ts +0 -32
  1046. package/.next/standalone/tower/src/mcp/tools/task-tools.ts +0 -250
  1047. package/.next/standalone/tower/src/mcp/tools/terminal-tools.ts +0 -154
  1048. package/.next/standalone/tower/src/mcp/tools/workspace-tools.ts +0 -73
  1049. package/.next/standalone/tower/src/stores/board-store.ts +0 -46
  1050. package/.next/standalone/tower/src/stores/task-execution-store.ts +0 -41
  1051. package/.next/standalone/tower/src/types/index.ts +0 -36
  1052. package/.next/standalone/tower/tests/e2e/chat-flow.spec.ts +0 -249
  1053. package/.next/standalone/tower/tests/e2e/notes-assets.spec.ts +0 -287
  1054. package/.next/standalone/tower/tests/e2e/search.spec.ts +0 -186
  1055. package/.next/standalone/tower/tests/e2e/settings-flow.spec.ts +0 -250
  1056. package/.next/standalone/tower/tests/e2e/settings.spec.ts +0 -261
  1057. package/.next/standalone/tower/tests/e2e/smoke.spec.ts +0 -317
  1058. package/.next/standalone/tower/tests/e2e/task-flow.spec.ts +0 -287
  1059. package/.next/standalone/tower/tests/e2e/workbench.spec.ts +0 -307
  1060. package/.next/standalone/tower/tests/setup.ts +0 -15
  1061. package/.next/standalone/tower/tests/unit/actions/agent-actions.test.ts +0 -157
  1062. package/.next/standalone/tower/tests/unit/actions/config-actions.test.ts +0 -170
  1063. package/.next/standalone/tower/tests/unit/actions/file-actions.test.ts +0 -283
  1064. package/.next/standalone/tower/tests/unit/actions/git-actions.test.ts +0 -34
  1065. package/.next/standalone/tower/tests/unit/actions/preview-actions.test.ts +0 -177
  1066. package/.next/standalone/tower/tests/unit/actions/search-actions.test.ts +0 -358
  1067. package/.next/standalone/tower/tests/unit/actions/task-actions.test.ts +0 -173
  1068. package/.next/standalone/tower/tests/unit/api/diff-route.test.ts +0 -9
  1069. package/.next/standalone/tower/tests/unit/api/file-serving.test.ts +0 -88
  1070. package/.next/standalone/tower/tests/unit/api/merge-route.test.ts +0 -9
  1071. package/.next/standalone/tower/tests/unit/api/stream-persist-result.test.ts +0 -7
  1072. package/.next/standalone/tower/tests/unit/api/stream-send-back.test.ts +0 -7
  1073. package/.next/standalone/tower/tests/unit/components/asset-item.test.tsx +0 -105
  1074. package/.next/standalone/tower/tests/unit/components/asset-list.test.tsx +0 -51
  1075. package/.next/standalone/tower/tests/unit/components/assets/asset-upload.test.tsx +0 -70
  1076. package/.next/standalone/tower/tests/unit/components/board-stats.test.tsx +0 -32
  1077. package/.next/standalone/tower/tests/unit/components/category-filter.test.tsx +0 -58
  1078. package/.next/standalone/tower/tests/unit/components/cli-adapter-tester.test.tsx +0 -160
  1079. package/.next/standalone/tower/tests/unit/components/create-task-dialog.test.tsx +0 -162
  1080. package/.next/standalone/tower/tests/unit/components/file-tree.test.tsx +0 -172
  1081. package/.next/standalone/tower/tests/unit/components/note-card.test.tsx +0 -71
  1082. package/.next/standalone/tower/tests/unit/components/note-editor.test.tsx +0 -39
  1083. package/.next/standalone/tower/tests/unit/components/prompts-config.test.tsx +0 -200
  1084. package/.next/standalone/tower/tests/unit/components/search-dialog.test.tsx +0 -223
  1085. package/.next/standalone/tower/tests/unit/components/system-config.test.tsx +0 -32
  1086. package/.next/standalone/tower/tests/unit/hooks/hook-registration.test.ts +0 -89
  1087. package/.next/standalone/tower/tests/unit/hooks/stop-hook.test.ts +0 -108
  1088. package/.next/standalone/tower/tests/unit/lib/asset-actions.test.ts +0 -257
  1089. package/.next/standalone/tower/tests/unit/lib/file-utils.test.ts +0 -102
  1090. package/.next/standalone/tower/tests/unit/lib/fs-security.test.ts +0 -34
  1091. package/.next/standalone/tower/tests/unit/lib/fts.test.ts +0 -214
  1092. package/.next/standalone/tower/tests/unit/lib/git-url.test.ts +0 -258
  1093. package/.next/standalone/tower/tests/unit/lib/instrumentation.test.ts +0 -86
  1094. package/.next/standalone/tower/tests/unit/lib/local-path-to-api-url.test.ts +0 -40
  1095. package/.next/standalone/tower/tests/unit/lib/mime-magic.test.ts +0 -95
  1096. package/.next/standalone/tower/tests/unit/lib/note-actions.test.ts +0 -296
  1097. package/.next/standalone/tower/tests/unit/lib/preview-process-manager.test.ts +0 -107
  1098. package/.next/standalone/tower/tests/unit/lib/process-manager.test.ts +0 -10
  1099. package/.next/standalone/tower/tests/unit/lib/pty-session.test.ts +0 -171
  1100. package/.next/standalone/tower/tests/unit/lib/search.test.ts +0 -289
  1101. package/.next/standalone/tower/tests/unit/lib/session-store.test.ts +0 -111
  1102. package/.next/standalone/tower/tests/unit/lib/utils.test.ts +0 -33
  1103. package/.next/standalone/tower/tests/unit/lib/worktree.test.ts +0 -190
  1104. package/.next/standalone/tower/tests/unit/mcp/identify-project.test.ts +0 -217
  1105. package/.next/standalone/tower/tests/unit/mcp/manage-assets.test.ts +0 -199
  1106. package/.next/standalone/tower/tests/unit/mcp/manage-notes.test.ts +0 -304
  1107. package/.next/standalone/tower/tests/unit/mcp/search-tools.test.ts +0 -186
  1108. package/.next/standalone/tower/tests/unit/missions-merge.test.ts +0 -43
  1109. package/.next/standalone/tower/tower-studio-0.1.1.tgz +0 -0
  1110. package/.next/standalone/tower/tsconfig.json +0 -34
  1111. package/.next/standalone/tower/vitest.config.ts +0 -17
  1112. package/.next/static/chunks/024pdsc27tjdd.js +0 -5
  1113. package/.next/static/chunks/02dd83gbiv778.js +0 -1
  1114. package/.next/static/chunks/0b6us7uq72u-d.js +0 -1
  1115. package/.next/static/chunks/0gb82g.6g90mn.js +0 -1
  1116. package/.next/static/chunks/0gnm22yv~f54b.js +0 -1
  1117. package/.next/static/chunks/0lnhjf2a~jaco.js +0 -83
  1118. package/.next/static/chunks/0t16ai99uv4j3.js +0 -1
  1119. package/.next/static/chunks/0xzdu87n_for1.js +0 -5
  1120. package/.next/static/chunks/0y0tdl.rl6v1u.js +0 -1
  1121. package/.next/static/chunks/0z4y0x1ifgy.e.js +0 -1
  1122. package/.next/static/chunks/102ijqpvi0z-d.js +0 -1
  1123. package/.next/static/chunks/11_e3-j5gzbj4.js +0 -1
  1124. package/.next/static/chunks/14.ims4y7osot.js +0 -1
  1125. package/.next/static/chunks/169po6_~f3-d5.js +0 -1
  1126. package/.next/static/chunks/176n7f13ve~a9.js +0 -1
  1127. /package/.next/{standalone/tower/src/app/apple-icon.png → server/app/apple-icon.png.body} +0 -0
  1128. /package/.next/{standalone/tower/docs/public/favicon.ico → server/app/favicon.ico.body} +0 -0
  1129. /package/.next/{standalone/tower/src/app/icon0.svg → server/app/icon0.svg.body} +0 -0
  1130. /package/.next/{standalone/tower/src/app/icon1.png → server/app/icon1.png.body} +0 -0
  1131. /package/.next/{standalone/tower/src/app/manifest.json → server/app/manifest.json.body} +0 -0
  1132. /package/.next/static/{a6HR9cTK7s4aKfE5dWzjz → 6AW1vTU7iJEkEhqIH0txT}/_buildManifest.js +0 -0
  1133. /package/.next/static/{a6HR9cTK7s4aKfE5dWzjz → 6AW1vTU7iJEkEhqIH0txT}/_clientMiddlewareManifest.js +0 -0
  1134. /package/.next/static/{a6HR9cTK7s4aKfE5dWzjz → 6AW1vTU7iJEkEhqIH0txT}/_ssgManifest.js +0 -0
  1135. /package/{.next/standalone/tower/docs/public → public}/banner.jpg +0 -0
  1136. /package/{.next/standalone/tower/docs/public → public}/logo.png +0 -0
  1137. /package/{.next/standalone/tower/public → public}/web-app-manifest-192x192.png +0 -0
  1138. /package/{.next/standalone/tower/public → public}/web-app-manifest-512x512.png +0 -0
@@ -1,1345 +0,0 @@
1
- # CLI 抽象层 Implementation Plan
2
-
3
- > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
-
5
- **Goal:** Extract Claude Code CLI hardcoded logic into a provider-agnostic adapter layer, preserving all existing functionality.
6
-
7
- **Architecture:** Strategy pattern for CLI adapters (PTY execution) + generic adapters for AI queries. A ProviderRegistry maps provider names to adapters. A capability-resolver reads DB config to route each AI slot to the correct adapter.
8
-
9
- **Tech Stack:** TypeScript, Prisma (SQLite), Next.js 16 server actions, node-pty, @anthropic-ai/claude-agent-sdk
10
-
11
- **Spec:** `docs/ai/cli-abstraction-design.md`
12
-
13
- ---
14
-
15
- ### Task 1: Define types and error classes
16
-
17
- **Files:**
18
- - Create: `src/lib/ai/types.ts`
19
-
20
- - [ ] **Step 1: Create the types file with all interfaces**
21
-
22
- ```typescript
23
- // src/lib/ai/types.ts
24
-
25
- // ---------------------------------------------------------------------------
26
- // CLI Adapter — PTY execution layer
27
- // ---------------------------------------------------------------------------
28
-
29
- export interface CliSpawnOptions {
30
- taskId: string;
31
- prompt: string;
32
- cwd: string;
33
- envOverrides?: Record<string, string>;
34
- resumeSessionId?: string;
35
- continueLatest?: boolean;
36
- worktreePath?: string;
37
- profileArgs?: string[];
38
- profileEnvVars?: Record<string, string>;
39
- }
40
-
41
- export interface CliSpawnResult {
42
- command: string;
43
- args: string[];
44
- env: Record<string, string>;
45
- /** Gemini: spawn 后通过 PTY write 发送初始 prompt */
46
- initialInput?: string;
47
- }
48
-
49
- export interface CliAdapter {
50
- buildSpawnArgs(opts: CliSpawnOptions): CliSpawnResult;
51
-
52
- buildEnvOverrides(opts: {
53
- taskId: string;
54
- taskTitle: string;
55
- apiUrl: string;
56
- callbackUrl?: string;
57
- }): Record<string, string>;
58
-
59
- installHooks(apiUrl: string): Promise<void>;
60
- uninstallHooks(): Promise<void>;
61
- isHooksInstalled(): Promise<boolean>;
62
-
63
- isAvailable(): Promise<boolean>;
64
- getVersion(): Promise<string | null>;
65
- getModels(): Promise<string[]>;
66
-
67
- getConfigDir(): string;
68
- getSettingsPath(): string;
69
- getSessionsDir(): string;
70
- }
71
-
72
- // ---------------------------------------------------------------------------
73
- // AI Query Adapter — single-turn and streaming queries
74
- // ---------------------------------------------------------------------------
75
-
76
- export interface AiQueryOptions {
77
- prompt: string;
78
- cwd?: string;
79
- systemPrompt?: string;
80
- model?: string;
81
- maxTurns?: number;
82
- tools?: string[];
83
- allowedTools?: string[];
84
- }
85
-
86
- export interface AiQueryResult {
87
- content: string | null;
88
- usage?: { inputTokens: number; outputTokens: number };
89
- }
90
-
91
- export interface AiQueryChunk {
92
- type: "text" | "tool_use" | "tool_result" | "error";
93
- content: string;
94
- }
95
-
96
- export interface AiQueryAdapter {
97
- query(opts: AiQueryOptions): Promise<AiQueryResult>;
98
- queryStream?(opts: AiQueryOptions): AsyncIterable<AiQueryChunk>;
99
-
100
- isAvailable(): Promise<boolean>;
101
- getModels(): Promise<string[]>;
102
- }
103
-
104
- // ---------------------------------------------------------------------------
105
- // Provider definition & registry types
106
- // ---------------------------------------------------------------------------
107
-
108
- export interface ProviderDefinition {
109
- name: string;
110
- displayName: string;
111
- agentFieldValue: string;
112
-
113
- cli?: {
114
- command: string;
115
- adapter: CliAdapter;
116
- };
117
- api?: {
118
- keyEnvVar: string;
119
- adapter: AiQueryAdapter;
120
- };
121
- cliQuery?: {
122
- adapter: AiQueryAdapter;
123
- };
124
-
125
- models: {
126
- cli: string[];
127
- api: string[];
128
- };
129
- }
130
-
131
- export interface ProviderAvailability {
132
- name: string;
133
- displayName: string;
134
- cli: { available: boolean; version: string | null };
135
- api: { available: boolean; keyConfigured: boolean };
136
- }
137
-
138
- // ---------------------------------------------------------------------------
139
- // Capability slot config (mirrors Prisma model)
140
- // ---------------------------------------------------------------------------
141
-
142
- export type AiSlot = "terminal" | "summary" | "dreaming" | "analysis" | "assistant";
143
-
144
- export interface AiSlotConfig {
145
- slot: AiSlot;
146
- provider: string;
147
- mode: "cli" | "api";
148
- model?: string;
149
- }
150
-
151
- // ---------------------------------------------------------------------------
152
- // Errors
153
- // ---------------------------------------------------------------------------
154
-
155
- export type AiProviderErrorCode =
156
- | "CLI_NOT_FOUND"
157
- | "API_KEY_MISSING"
158
- | "MODEL_NOT_AVAILABLE"
159
- | "RATE_LIMITED"
160
- | "NETWORK_ERROR"
161
- | "UNSUPPORTED_MODE"
162
- | "SPAWN_FAILED";
163
-
164
- export class AiProviderError extends Error {
165
- constructor(
166
- public code: AiProviderErrorCode,
167
- public provider: string,
168
- message: string,
169
- ) {
170
- super(message);
171
- this.name = "AiProviderError";
172
- }
173
- }
174
- ```
175
-
176
- - [ ] **Step 2: Verify TypeScript compiles**
177
-
178
- Run: `cd /Users/liujunping/project/f/tower && npx tsc --noEmit src/lib/ai/types.ts 2>&1 | head -20`
179
- Expected: No errors (file is self-contained, no imports needed)
180
-
181
- - [ ] **Step 3: Commit**
182
-
183
- ```bash
184
- git add src/lib/ai/types.ts
185
- git commit -m "feat(ai): define CLI adapter and AI query adapter interfaces"
186
- ```
187
-
188
- ---
189
-
190
- ### Task 2: Implement ClaudeCliAdapter
191
-
192
- **Files:**
193
- - Create: `src/lib/ai/adapters/cli/claude-cli-adapter.ts`
194
- - Reference: `src/actions/agent-actions.ts:194-236` (resume args), `src/actions/agent-actions.ts:598-620` (env + args), `src/app/api/internal/hooks/install/route.ts` (hook install)
195
-
196
- - [ ] **Step 1: Write the failing test**
197
-
198
- Create: `src/lib/ai/__tests__/claude-cli-adapter.test.ts`
199
-
200
- ```typescript
201
- import { describe, it, expect, vi, beforeEach } from "vitest";
202
- import { ClaudeCliAdapter } from "../adapters/cli/claude-cli-adapter";
203
- import type { CliSpawnOptions } from "../types";
204
-
205
- describe("ClaudeCliAdapter", () => {
206
- let adapter: ClaudeCliAdapter;
207
-
208
- beforeEach(() => {
209
- adapter = new ClaudeCliAdapter();
210
- });
211
-
212
- describe("buildSpawnArgs", () => {
213
- const baseOpts: CliSpawnOptions = {
214
- taskId: "ctask123456789012345678",
215
- prompt: "Fix the bug",
216
- cwd: "/project",
217
- };
218
-
219
- it("builds fresh start args with prompt as last argument", () => {
220
- const result = adapter.buildSpawnArgs(baseOpts);
221
- expect(result.command).toBe("claude");
222
- expect(result.args[result.args.length - 1]).toBe("Fix the bug");
223
- expect(result.initialInput).toBeUndefined();
224
- });
225
-
226
- it("builds resume args with --resume flag", () => {
227
- const result = adapter.buildSpawnArgs({
228
- ...baseOpts,
229
- resumeSessionId: "session-abc-123",
230
- });
231
- expect(result.args).toContain("--resume");
232
- expect(result.args).toContain("session-abc-123");
233
- // resume mode should NOT include prompt as argument
234
- expect(result.args[result.args.length - 1]).not.toBe("Fix the bug");
235
- });
236
-
237
- it("builds continue args with --continue flag and no prompt", () => {
238
- const result = adapter.buildSpawnArgs({
239
- ...baseOpts,
240
- continueLatest: true,
241
- });
242
- expect(result.args).toContain("--continue");
243
- // continue mode should NOT include prompt as argument
244
- expect(result.args).not.toContain("Fix the bug");
245
- });
246
-
247
- it("merges profileArgs into args", () => {
248
- const result = adapter.buildSpawnArgs({
249
- ...baseOpts,
250
- profileArgs: ["--model", "opus"],
251
- });
252
- expect(result.args).toContain("--model");
253
- expect(result.args).toContain("opus");
254
- });
255
-
256
- it("merges profileEnvVars into env", () => {
257
- const result = adapter.buildSpawnArgs({
258
- ...baseOpts,
259
- profileEnvVars: { CUSTOM_VAR: "value" },
260
- });
261
- expect(result.env.CUSTOM_VAR).toBe("value");
262
- });
263
- });
264
-
265
- describe("buildEnvOverrides", () => {
266
- it("returns TOWER_* env vars", () => {
267
- const env = adapter.buildEnvOverrides({
268
- taskId: "ctask123",
269
- taskTitle: "Test task",
270
- apiUrl: "http://localhost:3000",
271
- });
272
- expect(env.TOWER_TASK_ID).toBe("ctask123");
273
- expect(env.TOWER_TASK_TITLE).toBe("Test task");
274
- expect(env.TOWER_API_URL).toBe("http://localhost:3000");
275
- expect(env.TOWER_STARTED_AT).toBeDefined();
276
- });
277
-
278
- it("includes CALLBACK_URL when provided", () => {
279
- const env = adapter.buildEnvOverrides({
280
- taskId: "ctask123",
281
- taskTitle: "Test",
282
- apiUrl: "http://localhost:3000",
283
- callbackUrl: "http://external/callback",
284
- });
285
- expect(env.CALLBACK_URL).toBe("http://external/callback");
286
- });
287
-
288
- it("omits CALLBACK_URL when not provided", () => {
289
- const env = adapter.buildEnvOverrides({
290
- taskId: "ctask123",
291
- taskTitle: "Test",
292
- apiUrl: "http://localhost:3000",
293
- });
294
- expect(env.CALLBACK_URL).toBeUndefined();
295
- });
296
- });
297
-
298
- describe("metadata", () => {
299
- it("returns correct config paths", () => {
300
- expect(adapter.getConfigDir()).toContain(".claude");
301
- expect(adapter.getSettingsPath()).toContain("settings.json");
302
- expect(adapter.getSessionsDir()).toContain("projects");
303
- });
304
- });
305
- });
306
- ```
307
-
308
- - [ ] **Step 2: Run test to verify it fails**
309
-
310
- Run: `cd /Users/liujunping/project/f/tower && pnpm vitest run src/lib/ai/__tests__/claude-cli-adapter.test.ts 2>&1 | tail -20`
311
- Expected: FAIL — module not found
312
-
313
- - [ ] **Step 3: Implement ClaudeCliAdapter**
314
-
315
- ```typescript
316
- // src/lib/ai/adapters/cli/claude-cli-adapter.ts
317
-
318
- import * as fs from "node:fs";
319
- import * as os from "node:os";
320
- import * as path from "node:path";
321
- import { resolveCommandPathSync } from "@/lib/platform";
322
- import type { CliAdapter, CliSpawnOptions, CliSpawnResult } from "../../types";
323
-
324
- /** Known Claude Code model aliases (static — CLI has no list command) */
325
- const CLAUDE_MODELS = ["sonnet", "opus", "haiku", "claude-sonnet-4-6", "claude-opus-4-6", "claude-haiku-4-5-20251001"];
326
-
327
- export class ClaudeCliAdapter implements CliAdapter {
328
-
329
- // -- spawn args ----------------------------------------------------------
330
-
331
- buildSpawnArgs(opts: CliSpawnOptions): CliSpawnResult {
332
- const args: string[] = [];
333
-
334
- // Profile args first (e.g. --model, --dangerously-skip-permissions)
335
- if (opts.profileArgs?.length) {
336
- args.push(...opts.profileArgs);
337
- }
338
-
339
- // Mode: resume / continue / fresh
340
- if (opts.resumeSessionId) {
341
- args.push("--resume", opts.resumeSessionId);
342
- } else if (opts.continueLatest) {
343
- args.push("--continue");
344
- } else {
345
- // Fresh start: prompt as last argument
346
- if (opts.prompt) {
347
- args.push(opts.prompt);
348
- }
349
- }
350
-
351
- // Env: merge profile vars (adapter env built separately via buildEnvOverrides)
352
- const env: Record<string, string> = {
353
- ...(opts.profileEnvVars ?? {}),
354
- ...(opts.envOverrides ?? {}),
355
- };
356
-
357
- return {
358
- command: this.resolveCommand(),
359
- args,
360
- env,
361
- };
362
- }
363
-
364
- // -- env overrides -------------------------------------------------------
365
-
366
- buildEnvOverrides(opts: {
367
- taskId: string;
368
- taskTitle: string;
369
- apiUrl: string;
370
- callbackUrl?: string;
371
- }): Record<string, string> {
372
- const env: Record<string, string> = {
373
- TOWER_TASK_ID: opts.taskId,
374
- TOWER_TASK_TITLE: opts.taskTitle,
375
- TOWER_STARTED_AT: new Date().toISOString(),
376
- TOWER_API_URL: opts.apiUrl,
377
- };
378
- if (opts.callbackUrl) {
379
- env.CALLBACK_URL = opts.callbackUrl;
380
- }
381
- return env;
382
- }
383
-
384
- // -- hooks ---------------------------------------------------------------
385
-
386
- async installHooks(apiUrl: string): Promise<void> {
387
- const settings = this.readSettings();
388
- const hooks = (settings["hooks"] as Record<string, unknown>) ?? {};
389
- const entries = this.getPostToolUseArray(settings);
390
-
391
- if (this.findTowerHookIndex(entries) >= 0) return; // already installed
392
-
393
- const hookPath = path.join(process.cwd(), "scripts", "post-tool-hook.js");
394
- const newEntry = {
395
- hooks: [{ command: `node "${hookPath}"`, timeout: 10, type: "command" }],
396
- matcher: "Write|Edit|MultiEdit",
397
- };
398
-
399
- settings["hooks"] = { ...hooks, PostToolUse: [...entries, newEntry] };
400
- this.writeSettings(settings);
401
- }
402
-
403
- async uninstallHooks(): Promise<void> {
404
- const settings = this.readSettings();
405
- const hooks = (settings["hooks"] as Record<string, unknown>) ?? {};
406
- const entries = this.getPostToolUseArray(settings);
407
- const filtered = entries.filter(
408
- (e) => !e.hooks?.some((h: { command?: string }) => h.command?.includes("post-tool-hook.js"))
409
- );
410
- settings["hooks"] = { ...hooks, PostToolUse: filtered };
411
- this.writeSettings(settings);
412
- }
413
-
414
- async isHooksInstalled(): Promise<boolean> {
415
- const settings = this.readSettings();
416
- const entries = this.getPostToolUseArray(settings);
417
- return this.findTowerHookIndex(entries) >= 0;
418
- }
419
-
420
- // -- capability detection ------------------------------------------------
421
-
422
- async isAvailable(): Promise<boolean> {
423
- const version = await this.getVersion();
424
- return version !== null;
425
- }
426
-
427
- async getVersion(): Promise<string | null> {
428
- try {
429
- const { execFile } = await import("child_process");
430
- const { promisify } = await import("util");
431
- const execFileAsync = promisify(execFile);
432
- const cmd = this.resolveCommand();
433
- const { stdout } = await execFileAsync(cmd, ["--version"], { timeout: 5000 });
434
- return stdout.trim() || null;
435
- } catch {
436
- return null;
437
- }
438
- }
439
-
440
- async getModels(): Promise<string[]> {
441
- return CLAUDE_MODELS;
442
- }
443
-
444
- // -- paths ---------------------------------------------------------------
445
-
446
- getConfigDir(): string {
447
- return path.join(os.homedir(), ".claude");
448
- }
449
-
450
- getSettingsPath(): string {
451
- return path.join(this.getConfigDir(), "settings.json");
452
- }
453
-
454
- getSessionsDir(): string {
455
- return path.join(this.getConfigDir(), "projects");
456
- }
457
-
458
- // -- private helpers -----------------------------------------------------
459
-
460
- /** Resolve claude binary — env var > platform-aware resolution.
461
- * Consolidates duplicate findClaudeBinary() from claude-session.ts + assistant route. */
462
- /** Resolve claude binary — env var > platform-aware resolution.
463
- * Public so claude-session.ts can reuse instead of duplicating findClaudeBinary(). */
464
- resolveCommand(): string {
465
- if (process.env.CLAUDE_CODE_PATH) return process.env.CLAUDE_CODE_PATH;
466
- if (process.platform === "win32") {
467
- const native = resolveCommandPathSync("claude-code");
468
- if (native !== "claude-code") return native;
469
- }
470
- return resolveCommandPathSync("claude");
471
- }
472
-
473
- private readSettings(): Record<string, unknown> {
474
- try {
475
- return JSON.parse(fs.readFileSync(this.getSettingsPath(), "utf-8")) as Record<string, unknown>;
476
- } catch {
477
- return {};
478
- }
479
- }
480
-
481
- private writeSettings(data: Record<string, unknown>): void {
482
- const dir = this.getConfigDir();
483
- if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
484
- fs.writeFileSync(this.getSettingsPath(), JSON.stringify(data, null, 2), "utf-8");
485
- }
486
-
487
- private getPostToolUseArray(settings: Record<string, unknown>): Array<{
488
- hooks: Array<{ command: string; timeout: number; type: string }>;
489
- matcher: string;
490
- }> {
491
- const hooks = settings["hooks"] as Record<string, unknown> | undefined;
492
- if (!hooks) return [];
493
- const arr = hooks["PostToolUse"];
494
- return Array.isArray(arr) ? arr : [];
495
- }
496
-
497
- private findTowerHookIndex(entries: Array<{ hooks: Array<{ command?: string }> }>): number {
498
- return entries.findIndex((e) =>
499
- e.hooks?.some((h) => h.command?.includes("post-tool-hook.js"))
500
- );
501
- }
502
- }
503
- ```
504
-
505
- - [ ] **Step 4: Run test to verify it passes**
506
-
507
- Run: `cd /Users/liujunping/project/f/tower && pnpm vitest run src/lib/ai/__tests__/claude-cli-adapter.test.ts 2>&1 | tail -20`
508
- Expected: All tests PASS
509
-
510
- - [ ] **Step 5: Commit**
511
-
512
- ```bash
513
- git add src/lib/ai/adapters/cli/claude-cli-adapter.ts src/lib/ai/__tests__/claude-cli-adapter.test.ts
514
- git commit -m "feat(ai): implement ClaudeCliAdapter with tests"
515
- ```
516
-
517
- ---
518
-
519
- ### Task 3: Implement ProviderRegistry
520
-
521
- **Files:**
522
- - Create: `src/lib/ai/provider-registry.ts`
523
- - Create: `src/lib/ai/providers/claude.ts`
524
- - Create: `src/lib/ai/providers/index.ts`
525
-
526
- - [ ] **Step 1: Write the failing test**
527
-
528
- Create: `src/lib/ai/__tests__/provider-registry.test.ts`
529
-
530
- ```typescript
531
- import { describe, it, expect, beforeEach } from "vitest";
532
- import { ProviderRegistry } from "../provider-registry";
533
- import type { ProviderDefinition } from "../types";
534
- import { ClaudeCliAdapter } from "../adapters/cli/claude-cli-adapter";
535
-
536
- function makeClaudeProvider(): ProviderDefinition {
537
- return {
538
- name: "claude",
539
- displayName: "Claude Code",
540
- agentFieldValue: "CLAUDE_CODE",
541
- cli: {
542
- command: "claude",
543
- adapter: new ClaudeCliAdapter(),
544
- },
545
- models: {
546
- cli: ["sonnet", "opus", "haiku"],
547
- api: [],
548
- },
549
- };
550
- }
551
-
552
- describe("ProviderRegistry", () => {
553
- let registry: ProviderRegistry;
554
-
555
- beforeEach(() => {
556
- registry = new ProviderRegistry();
557
- });
558
-
559
- it("registers and retrieves a provider", () => {
560
- registry.register(makeClaudeProvider());
561
- const provider = registry.get("claude");
562
- expect(provider).toBeDefined();
563
- expect(provider!.displayName).toBe("Claude Code");
564
- });
565
-
566
- it("returns undefined for unknown provider", () => {
567
- expect(registry.get("unknown")).toBeUndefined();
568
- });
569
-
570
- it("returns CLI adapter for registered provider", () => {
571
- registry.register(makeClaudeProvider());
572
- const adapter = registry.getCliAdapter("claude");
573
- expect(adapter).toBeDefined();
574
- });
575
-
576
- it("returns null CLI adapter for provider without CLI", () => {
577
- registry.register({
578
- ...makeClaudeProvider(),
579
- name: "api-only",
580
- cli: undefined,
581
- });
582
- expect(registry.getCliAdapter("api-only")).toBeNull();
583
- });
584
-
585
- it("returns all allowed commands from registered CLI providers", () => {
586
- registry.register(makeClaudeProvider());
587
- expect(registry.getAllowedCommands()).toContain("claude");
588
- });
589
-
590
- it("lists all providers", () => {
591
- registry.register(makeClaudeProvider());
592
- expect(registry.getAll()).toHaveLength(1);
593
- });
594
- });
595
- ```
596
-
597
- - [ ] **Step 2: Run test to verify it fails**
598
-
599
- Run: `cd /Users/liujunping/project/f/tower && pnpm vitest run src/lib/ai/__tests__/provider-registry.test.ts 2>&1 | tail -20`
600
- Expected: FAIL
601
-
602
- - [ ] **Step 3: Implement ProviderRegistry**
603
-
604
- ```typescript
605
- // src/lib/ai/provider-registry.ts
606
-
607
- import type { CliAdapter, AiQueryAdapter, ProviderDefinition, ProviderAvailability } from "./types";
608
-
609
- export class ProviderRegistry {
610
- private providers = new Map<string, ProviderDefinition>();
611
-
612
- register(provider: ProviderDefinition): void {
613
- this.providers.set(provider.name, provider);
614
- }
615
-
616
- get(name: string): ProviderDefinition | undefined {
617
- return this.providers.get(name);
618
- }
619
-
620
- getAll(): ProviderDefinition[] {
621
- return Array.from(this.providers.values());
622
- }
623
-
624
- getCliAdapter(name: string): CliAdapter | null {
625
- return this.providers.get(name)?.cli?.adapter ?? null;
626
- }
627
-
628
- getQueryAdapter(name: string, mode: "api" | "cli"): AiQueryAdapter | null {
629
- const provider = this.providers.get(name);
630
- if (!provider) return null;
631
- if (mode === "api") return provider.api?.adapter ?? null;
632
- return provider.cliQuery?.adapter ?? null;
633
- }
634
-
635
- /** Returns all CLI command names from registered providers (for security allowlist). */
636
- getAllowedCommands(): string[] {
637
- const commands: string[] = [];
638
- for (const p of this.providers.values()) {
639
- if (p.cli?.command) commands.push(p.cli.command);
640
- }
641
- return commands;
642
- }
643
-
644
- async getAvailableProviders(): Promise<ProviderAvailability[]> {
645
- const results: ProviderAvailability[] = [];
646
- for (const p of this.providers.values()) {
647
- const cliAvailable = p.cli ? await p.cli.adapter.isAvailable() : false;
648
- const cliVersion = cliAvailable && p.cli ? await p.cli.adapter.getVersion() : null;
649
- const apiKeyConfigured = p.api ? !!process.env[p.api.keyEnvVar] : false;
650
- const apiAvailable = p.api ? apiKeyConfigured : false;
651
-
652
- results.push({
653
- name: p.name,
654
- displayName: p.displayName,
655
- cli: { available: cliAvailable, version: cliVersion },
656
- api: { available: apiAvailable, keyConfigured: apiKeyConfigured },
657
- });
658
- }
659
- return results;
660
- }
661
- }
662
- ```
663
-
664
- - [ ] **Step 4: Implement Claude provider definition + registration**
665
-
666
- ```typescript
667
- // src/lib/ai/providers/claude.ts
668
-
669
- import type { ProviderDefinition } from "../types";
670
- import { ClaudeCliAdapter } from "../adapters/cli/claude-cli-adapter";
671
-
672
- export function createClaudeProvider(): ProviderDefinition {
673
- return {
674
- name: "claude",
675
- displayName: "Claude Code",
676
- agentFieldValue: "CLAUDE_CODE",
677
- cli: {
678
- command: "claude",
679
- adapter: new ClaudeCliAdapter(),
680
- },
681
- // api and cliQuery adapters will be added in Phase 2
682
- models: {
683
- cli: ["sonnet", "opus", "haiku", "claude-sonnet-4-6", "claude-opus-4-6", "claude-haiku-4-5-20251001"],
684
- api: [],
685
- },
686
- };
687
- }
688
- ```
689
-
690
- ```typescript
691
- // src/lib/ai/providers/index.ts
692
-
693
- import { ProviderRegistry } from "../provider-registry";
694
- import { createClaudeProvider } from "./claude";
695
-
696
- // Singleton registry — survives HMR via globalThis
697
- const g = globalThis as typeof globalThis & { __providerRegistry?: ProviderRegistry };
698
- if (!g.__providerRegistry) {
699
- const registry = new ProviderRegistry();
700
- registry.register(createClaudeProvider());
701
- g.__providerRegistry = registry;
702
- }
703
-
704
- export const providerRegistry = g.__providerRegistry;
705
- ```
706
-
707
- - [ ] **Step 5: Run test to verify it passes**
708
-
709
- Run: `cd /Users/liujunping/project/f/tower && pnpm vitest run src/lib/ai/__tests__/provider-registry.test.ts 2>&1 | tail -20`
710
- Expected: All tests PASS
711
-
712
- - [ ] **Step 6: Commit**
713
-
714
- ```bash
715
- git add src/lib/ai/provider-registry.ts src/lib/ai/providers/claude.ts src/lib/ai/providers/index.ts src/lib/ai/__tests__/provider-registry.test.ts
716
- git commit -m "feat(ai): implement ProviderRegistry with Claude provider"
717
- ```
718
-
719
- ---
720
-
721
- ### Task 4: Add AiCapabilityConfig Prisma model
722
-
723
- **Files:**
724
- - Modify: `prisma/schema.prisma`
725
-
726
- - [ ] **Step 1: Add AiCapabilityConfig model to schema**
727
-
728
- Add after the `CliProfile` model block (after line 218 of `prisma/schema.prisma`):
729
-
730
- ```prisma
731
- model AiCapabilityConfig {
732
- id String @id @default(cuid())
733
- slot String @unique
734
- provider String @default("claude")
735
- mode String @default("cli")
736
- model String?
737
- createdAt DateTime @default(now())
738
- updatedAt DateTime @updatedAt
739
- }
740
- ```
741
-
742
- - [ ] **Step 2: Push schema to DB**
743
-
744
- Run: `cd /Users/liujunping/project/f/tower && pnpm db:push 2>&1 | tail -10`
745
- Expected: "Your database is now in sync with your Prisma schema"
746
-
747
- - [ ] **Step 3: Verify Prisma client generated**
748
-
749
- Run: `cd /Users/liujunping/project/f/tower && npx prisma generate 2>&1 | tail -5`
750
- Expected: "Generated Prisma Client"
751
-
752
- - [ ] **Step 4: Commit**
753
-
754
- ```bash
755
- git add prisma/schema.prisma
756
- git commit -m "feat(ai): add AiCapabilityConfig model for capability slot routing"
757
- ```
758
-
759
- ---
760
-
761
- ### Task 5: Implement capability-resolver
762
-
763
- **Files:**
764
- - Create: `src/lib/ai/capability-resolver.ts`
765
- - Create: `src/actions/ai-config-actions.ts`
766
-
767
- - [ ] **Step 1: Write the failing test**
768
-
769
- Create: `src/lib/ai/__tests__/capability-resolver.test.ts`
770
-
771
- ```typescript
772
- import { describe, it, expect, vi, beforeEach } from "vitest";
773
-
774
- // Mock DB before importing
775
- vi.mock("@/lib/db", () => ({
776
- db: {
777
- aiCapabilityConfig: {
778
- findUnique: vi.fn(),
779
- },
780
- },
781
- }));
782
-
783
- import { resolveCliAdapter, resolveQueryAdapter } from "../capability-resolver";
784
- import { providerRegistry } from "../providers";
785
- import { db } from "@/lib/db";
786
- import { AiProviderError } from "../types";
787
-
788
- describe("capability-resolver", () => {
789
- beforeEach(() => {
790
- vi.clearAllMocks();
791
- });
792
-
793
- describe("resolveCliAdapter", () => {
794
- it("returns Claude adapter when no config exists (default)", async () => {
795
- vi.mocked(db.aiCapabilityConfig.findUnique).mockResolvedValue(null);
796
- const result = await resolveCliAdapter("terminal");
797
- expect(result.provider.name).toBe("claude");
798
- expect(result.adapter).toBeDefined();
799
- });
800
-
801
- it("returns configured provider adapter", async () => {
802
- vi.mocked(db.aiCapabilityConfig.findUnique).mockResolvedValue({
803
- id: "1", slot: "terminal", provider: "claude", mode: "cli", model: "opus",
804
- createdAt: new Date(), updatedAt: new Date(),
805
- });
806
- const result = await resolveCliAdapter("terminal");
807
- expect(result.provider.name).toBe("claude");
808
- expect(result.model).toBe("opus");
809
- });
810
-
811
- it("throws AiProviderError for unknown provider", async () => {
812
- vi.mocked(db.aiCapabilityConfig.findUnique).mockResolvedValue({
813
- id: "1", slot: "terminal", provider: "nonexistent", mode: "cli", model: null,
814
- createdAt: new Date(), updatedAt: new Date(),
815
- });
816
- await expect(resolveCliAdapter("terminal")).rejects.toThrow(AiProviderError);
817
- });
818
- });
819
- });
820
- ```
821
-
822
- - [ ] **Step 2: Run test to verify it fails**
823
-
824
- Run: `cd /Users/liujunping/project/f/tower && pnpm vitest run src/lib/ai/__tests__/capability-resolver.test.ts 2>&1 | tail -20`
825
- Expected: FAIL
826
-
827
- - [ ] **Step 3: Implement capability-resolver**
828
-
829
- ```typescript
830
- // src/lib/ai/capability-resolver.ts
831
-
832
- import { db } from "@/lib/db";
833
- import { providerRegistry } from "./providers";
834
- import { AiProviderError } from "./types";
835
- import type { CliAdapter, AiQueryAdapter, ProviderDefinition, AiSlot } from "./types";
836
-
837
- const DEFAULT_PROVIDER = "claude";
838
- const DEFAULT_MODE = "cli";
839
-
840
- interface ResolvedCliAdapter {
841
- adapter: CliAdapter;
842
- provider: ProviderDefinition;
843
- model?: string;
844
- }
845
-
846
- interface ResolvedQueryAdapter {
847
- adapter: AiQueryAdapter;
848
- provider: ProviderDefinition;
849
- model?: string;
850
- }
851
-
852
- async function loadSlotConfig(slot: AiSlot) {
853
- return db.aiCapabilityConfig.findUnique({ where: { slot } });
854
- }
855
-
856
- export async function resolveCliAdapter(slot: "terminal"): Promise<ResolvedCliAdapter> {
857
- const config = await loadSlotConfig(slot);
858
- const providerName = config?.provider ?? DEFAULT_PROVIDER;
859
- const model = config?.model ?? undefined;
860
-
861
- const providerDef = providerRegistry.get(providerName);
862
- if (!providerDef) {
863
- throw new AiProviderError("CLI_NOT_FOUND", providerName, `Provider "${providerName}" 未注册`);
864
- }
865
-
866
- const adapter = providerDef.cli?.adapter;
867
- if (!adapter) {
868
- throw new AiProviderError("UNSUPPORTED_MODE", providerName, `Provider "${providerName}" 不支持 CLI 模式`);
869
- }
870
-
871
- return { adapter, provider: providerDef, model };
872
- }
873
-
874
- export async function resolveQueryAdapter(
875
- slot: "summary" | "dreaming" | "analysis" | "assistant"
876
- ): Promise<ResolvedQueryAdapter> {
877
- const config = await loadSlotConfig(slot);
878
- const providerName = config?.provider ?? DEFAULT_PROVIDER;
879
- const mode = config?.mode ?? DEFAULT_MODE;
880
- const model = config?.model ?? undefined;
881
-
882
- const providerDef = providerRegistry.get(providerName);
883
- if (!providerDef) {
884
- throw new AiProviderError("CLI_NOT_FOUND", providerName, `Provider "${providerName}" 未注册`);
885
- }
886
-
887
- const adapter = providerRegistry.getQueryAdapter(providerName, mode as "api" | "cli");
888
- if (!adapter) {
889
- throw new AiProviderError(
890
- "UNSUPPORTED_MODE",
891
- providerName,
892
- `Provider "${providerName}" 不支持 ${mode} 查询模式`
893
- );
894
- }
895
-
896
- // Validate model against provider's model list for this mode
897
- if (model) {
898
- const availableModels = providerDef.models[mode as "cli" | "api"] ?? [];
899
- if (availableModels.length > 0 && !availableModels.includes(model)) {
900
- throw new AiProviderError(
901
- "MODEL_NOT_AVAILABLE",
902
- providerName,
903
- `模型 "${model}" 在 ${providerName} ${mode} 模式下不可用`
904
- );
905
- }
906
- }
907
-
908
- return { adapter, provider: providerDef, model };
909
- }
910
- ```
911
-
912
- - [ ] **Step 4: Implement ai-config-actions (server actions for Settings UI)**
913
-
914
- ```typescript
915
- // src/actions/ai-config-actions.ts
916
- "use server";
917
-
918
- import { db } from "@/lib/db";
919
- import { revalidatePath } from "next/cache";
920
- import { providerRegistry } from "@/lib/ai/providers";
921
- import type { AiSlot } from "@/lib/ai/types";
922
-
923
- const VALID_SLOTS: AiSlot[] = ["terminal", "summary", "dreaming", "analysis", "assistant"];
924
-
925
- export async function getAiCapabilityConfigs() {
926
- return db.aiCapabilityConfig.findMany({ orderBy: { slot: "asc" } });
927
- }
928
-
929
- export async function updateAiCapabilityConfig(
930
- slot: string,
931
- data: { provider: string; mode: string; model?: string | null }
932
- ) {
933
- if (!VALID_SLOTS.includes(slot as AiSlot)) {
934
- throw new Error(`无效的插槽: ${slot}`);
935
- }
936
-
937
- // Validate provider exists
938
- const providerDef = providerRegistry.get(data.provider);
939
- if (!providerDef) {
940
- throw new Error(`未知的 Provider: ${data.provider}`);
941
- }
942
-
943
- // Terminal slot must be CLI mode
944
- if (slot === "terminal" && data.mode !== "cli") {
945
- throw new Error("终端执行只支持 CLI 模式");
946
- }
947
-
948
- await db.aiCapabilityConfig.upsert({
949
- where: { slot },
950
- create: {
951
- slot,
952
- provider: data.provider,
953
- mode: data.mode,
954
- model: data.model ?? null,
955
- },
956
- update: {
957
- provider: data.provider,
958
- mode: data.mode,
959
- model: data.model ?? null,
960
- },
961
- });
962
-
963
- revalidatePath("/settings");
964
- }
965
-
966
- export async function getAvailableProviders() {
967
- return providerRegistry.getAvailableProviders();
968
- }
969
- ```
970
-
971
- - [ ] **Step 5: Run test to verify it passes**
972
-
973
- Run: `cd /Users/liujunping/project/f/tower && pnpm vitest run src/lib/ai/__tests__/capability-resolver.test.ts 2>&1 | tail -20`
974
- Expected: All tests PASS
975
-
976
- - [ ] **Step 6: Commit**
977
-
978
- ```bash
979
- git add src/lib/ai/capability-resolver.ts src/actions/ai-config-actions.ts src/lib/ai/__tests__/capability-resolver.test.ts
980
- git commit -m "feat(ai): implement capability-resolver and ai-config actions"
981
- ```
982
-
983
- ---
984
-
985
- ### Task 6: Migrate agent-actions.ts to use CliAdapter
986
-
987
- This is the critical task — rewire the existing PTY execution functions to use the adapter layer while preserving exact behavior.
988
-
989
- **Files:**
990
- - Modify: `src/actions/agent-actions.ts`
991
- - Reference: `src/lib/ai/adapters/cli/claude-cli-adapter.ts`, `src/lib/ai/capability-resolver.ts`
992
-
993
- - [ ] **Step 1: Add imports at top of agent-actions.ts**
994
-
995
- Replace lines 6-8 of `src/actions/agent-actions.ts`:
996
-
997
- ```typescript
998
- // Before:
999
- import { createSession } from "@/lib/pty/session-store";
1000
- import { logger } from "@/lib/logger";
1001
- import { readConfigValue } from "@/lib/config-reader";
1002
-
1003
- // After:
1004
- import { createSession } from "@/lib/pty/session-store";
1005
- import { logger } from "@/lib/logger";
1006
- import { readConfigValue } from "@/lib/config-reader";
1007
- import { resolveCliAdapter } from "@/lib/ai/capability-resolver";
1008
- ```
1009
-
1010
- - [ ] **Step 2: Resolve adapter + build spawn result (replaces lines 597-620)**
1011
-
1012
- Replace the hardcoded env + args blocks with a single adapter flow. The adapter owns both args and env construction — the caller passes `spawnResult.env` directly to `createSession`.
1013
-
1014
- ```typescript
1015
- // ---- Replace lines 597-620 with: ----
1016
-
1017
- const { adapter: cliAdapter, provider: providerDef, model: configuredModel } = await resolveCliAdapter("terminal");
1018
-
1019
- // Build system prompt additions (instructions file + username)
1020
- let appendSystemPrompt = "";
1021
- if (instructionsFile) {
1022
- const { readFile } = await import("fs/promises");
1023
- appendSystemPrompt += await readFile(instructionsFile, "utf-8");
1024
- }
1025
- const usernameVal = await readConfigValue<string>("onboarding.username", "");
1026
- if (usernameVal) {
1027
- appendSystemPrompt += (appendSystemPrompt ? "\n" : "") + `The user's name is ${usernameVal}.`;
1028
- }
1029
-
1030
- // Adapter produces COMPLETE command + args + env
1031
- const spawnResult = cliAdapter.buildSpawnArgs({
1032
- taskId,
1033
- prompt: fullPrompt,
1034
- cwd,
1035
- profileArgs: [
1036
- ...profileBaseArgs,
1037
- ...(appendSystemPrompt ? ["--append-system-prompt", appendSystemPrompt] : []),
1038
- ...(configuredModel ? ["--model", configuredModel] : []),
1039
- ],
1040
- profileEnvVars,
1041
- envOverrides: cliAdapter.buildEnvOverrides({
1042
- taskId,
1043
- taskTitle: task.title,
1044
- apiUrl: `http://localhost:${process.env.PORT || "3000"}`,
1045
- callbackUrl: callbackUrl ?? undefined,
1046
- }),
1047
- });
1048
- ```
1049
-
1050
- - [ ] **Step 3: Update createSession call to use spawnResult (line 624)**
1051
-
1052
- ```typescript
1053
- // Before:
1054
- createSession(
1055
- taskId,
1056
- profileCommand,
1057
- claudeArgs,
1058
- cwd,
1059
- () => {},
1060
- async (exitCode) => { ... },
1061
- envOverrides,
1062
- ...
1063
-
1064
- // After — spawnResult.env replaces the separate envOverrides variable:
1065
- createSession(
1066
- taskId,
1067
- spawnResult.command,
1068
- spawnResult.args,
1069
- cwd,
1070
- () => {},
1071
- async (exitCode) => { ... },
1072
- spawnResult.env,
1073
- ...
1074
- ```
1075
-
1076
- - [ ] **Step 4: Update TaskExecution agent field (line 559)**
1077
-
1078
- ```typescript
1079
- // Before:
1080
- agent: "CLAUDE_CODE",
1081
-
1082
- // After:
1083
- agent: providerDef.agentFieldValue,
1084
- ```
1085
-
1086
- - [ ] **Step 6: Apply same pattern to resumePtyExecution**
1087
-
1088
- Apply the same adapter-based refactor to `resumePtyExecution` (lines 164-306):
1089
- - Add `resolveCliAdapter("terminal")` at the top
1090
- - Replace env overrides (lines 204-213) with `cliAdapter.buildEnvOverrides()`
1091
- - Replace Claude args (lines 229-236) with `cliAdapter.buildSpawnArgs({ resumeSessionId })`
1092
- - Replace `createSession(taskId, profileCommand, claudeArgs, ..., envOverrides, ...)` with `createSession(taskId, spawnResult.command, spawnResult.args, ..., spawnResult.env, ...)`
1093
- - `spawnResult.env` is the single source of truth — no separate `envOverrides`
1094
-
1095
- - [ ] **Step 7: Apply same pattern to continueLatestPtyExecution**
1096
-
1097
- Apply the same adapter-based refactor to `continueLatestPtyExecution` (lines 313-437):
1098
- - Same approach: `resolveCliAdapter` → `buildEnvOverrides` → `buildSpawnArgs({ continueLatest: true })` → pass `spawnResult.env` to `createSession`
1099
-
1100
- - [ ] **Step 8: Run existing tests**
1101
-
1102
- Run: `cd /Users/liujunping/project/f/tower && pnpm test:run 2>&1 | tail -30`
1103
- Expected: All existing tests PASS
1104
-
1105
- - [ ] **Step 9: Manual smoke test**
1106
-
1107
- Run: `cd /Users/liujunping/project/f/tower && pnpm dev`
1108
- Test: Create a task, start execution, verify Claude CLI spawns correctly, verify terminal works, verify stop/resume works.
1109
-
1110
- - [ ] **Step 10: Commit**
1111
-
1112
- ```bash
1113
- git add src/actions/agent-actions.ts
1114
- git commit -m "refactor(ai): migrate agent-actions to use CliAdapter"
1115
- ```
1116
-
1117
- ---
1118
-
1119
- ### Task 7: Update ALLOWED_COMMANDS to use registry
1120
-
1121
- **Files:**
1122
- - Modify: `src/actions/cli-profile-actions.ts`
1123
-
1124
- - [ ] **Step 1: Replace hardcoded ALLOWED_COMMANDS**
1125
-
1126
- ```typescript
1127
- // Before (line 7):
1128
- const ALLOWED_COMMANDS = ["claude", "claude-code"];
1129
-
1130
- // After:
1131
- import { providerRegistry } from "@/lib/ai/providers";
1132
-
1133
- function getAllowedCommands(): string[] {
1134
- const fromRegistry = providerRegistry.getAllowedCommands();
1135
- // Always include claude-code as alias
1136
- return [...new Set([...fromRegistry, "claude-code"])];
1137
- }
1138
- ```
1139
-
1140
- - [ ] **Step 2: Update validation to use function**
1141
-
1142
- ```typescript
1143
- // Before (line 34):
1144
- if (!ALLOWED_COMMANDS.includes(basename)) {
1145
- throw new Error(
1146
- `command must be one of: ${ALLOWED_COMMANDS.join(", ")} (got: ${basename})`
1147
- );
1148
- }
1149
-
1150
- // After:
1151
- const allowed = getAllowedCommands();
1152
- if (!allowed.includes(basename)) {
1153
- throw new Error(
1154
- `command must be one of: ${allowed.join(", ")} (got: ${basename})`
1155
- );
1156
- }
1157
- ```
1158
-
1159
- - [ ] **Step 3: Run existing cli-profile tests**
1160
-
1161
- Run: `cd /Users/liujunping/project/f/tower && pnpm vitest run src/actions/__tests__/cli-profile-actions.test.ts 2>&1 | tail -20`
1162
- Expected: PASS
1163
-
1164
- - [ ] **Step 4: Commit**
1165
-
1166
- ```bash
1167
- git add src/actions/cli-profile-actions.ts
1168
- git commit -m "refactor(ai): derive ALLOWED_COMMANDS from ProviderRegistry"
1169
- ```
1170
-
1171
- ---
1172
-
1173
- ### Task 8: Consolidate findClaudeBinary + migrate hooks route to adapter
1174
-
1175
- **Files:**
1176
- - Modify: `src/lib/claude-session.ts`
1177
- - Modify: `src/app/api/internal/assistant/chat/route.ts` (has duplicate findClaudeBinary)
1178
- - Modify: `src/app/api/internal/hooks/install/route.ts` (delegate to adapter)
1179
-
1180
- - [ ] **Step 1: Check for duplicate findClaudeBinary**
1181
-
1182
- Run: `cd /Users/liujunping/project/f/tower && grep -rn "findClaudeBinary\|resolveCommandPathSync.*claude" src/ --include="*.ts" | grep -v node_modules | grep -v __tests__`
1183
-
1184
- - [ ] **Step 2: Replace findClaudeBinary in claude-session.ts**
1185
-
1186
- ```typescript
1187
- // Before (lines 1-21):
1188
- import { resolveCommandPathSync } from "@/lib/platform";
1189
- // ...
1190
- function findClaudeBinary(): string { ... }
1191
-
1192
- // After:
1193
- import { ClaudeCliAdapter } from "@/lib/ai/adapters/cli/claude-cli-adapter";
1194
-
1195
- // Adapter resolves binary — single source of truth
1196
- const claudeAdapter = new ClaudeCliAdapter();
1197
- ```
1198
-
1199
- Then in `aiQuery()` (line 51), replace:
1200
- ```typescript
1201
- // Before:
1202
- pathToClaudeCodeExecutable: claudePath,
1203
-
1204
- // After (use adapter method — expose via public getter):
1205
- pathToClaudeCodeExecutable: claudeAdapter.resolveCommand(),
1206
- ```
1207
-
1208
- Note: `resolveCommand()` was already defined as public in Task 2.
1209
-
1210
- - [ ] **Step 3: Migrate assistant/chat/route.ts findClaudeBinary**
1211
-
1212
- Replace the duplicate `findClaudeBinary()` in `src/app/api/internal/assistant/chat/route.ts` with:
1213
- ```typescript
1214
- import { ClaudeCliAdapter } from "@/lib/ai/adapters/cli/claude-cli-adapter";
1215
- const claudeAdapter = new ClaudeCliAdapter();
1216
- // Replace findClaudeBinary() calls with claudeAdapter.resolveCommand()
1217
- ```
1218
-
1219
- - [ ] **Step 4: Migrate hooks/install/route.ts to delegate to adapter**
1220
-
1221
- Refactor `src/app/api/internal/hooks/install/route.ts` to use `ClaudeCliAdapter` for hook management:
1222
- ```typescript
1223
- import { ClaudeCliAdapter } from "@/lib/ai/adapters/cli/claude-cli-adapter";
1224
- const claudeAdapter = new ClaudeCliAdapter();
1225
-
1226
- // GET: return claudeAdapter.isHooksInstalled()
1227
- // POST: call claudeAdapter.installHooks(apiUrl)
1228
- // DELETE: call claudeAdapter.uninstallHooks()
1229
- ```
1230
-
1231
- This eliminates duplicate readSettings/writeSettings/getPostToolUseArray logic — adapter is single source of truth.
1232
-
1233
- - [ ] **Step 5: Run tests**
1234
-
1235
- Run: `cd /Users/liujunping/project/f/tower && pnpm test:run 2>&1 | tail -20`
1236
- Expected: PASS
1237
-
1238
- - [ ] **Step 6: Commit**
1239
-
1240
- ```bash
1241
- git add src/lib/claude-session.ts src/lib/ai/adapters/cli/claude-cli-adapter.ts src/app/api/internal/assistant/chat/route.ts src/app/api/internal/hooks/install/route.ts
1242
- git commit -m "refactor(ai): consolidate findClaudeBinary and hooks into ClaudeCliAdapter"
1243
- ```
1244
-
1245
- ---
1246
-
1247
- ### Task 9: Add i18n keys for AI capability config
1248
-
1249
- **Files:**
1250
- - Modify: `src/lib/i18n/zh.ts`
1251
- - Modify: `src/lib/i18n/en.ts`
1252
-
1253
- Note: i18n uses flat key format (`"section.key": "value"`), not nested JSON.
1254
-
1255
- - [ ] **Step 1: Check existing i18n structure for settings**
1256
-
1257
- Run: `cd /Users/liujunping/project/f/tower && grep "settings\." src/lib/i18n/zh.ts | head -10`
1258
-
1259
- - [ ] **Step 2: Add zh keys**
1260
-
1261
- Add to the flat export object in `src/lib/i18n/zh.ts`:
1262
-
1263
- ```typescript
1264
- "aiConfig.title": "AI 能力配置",
1265
- "aiConfig.description": "为每个 AI 功能场景独立配置 Provider 和模型",
1266
- "aiConfig.terminal": "终端执行",
1267
- "aiConfig.summary": "会话总结",
1268
- "aiConfig.dreaming": "知识沉淀",
1269
- "aiConfig.analysis": "项目分析",
1270
- "aiConfig.assistant": "助手聊天",
1271
- "aiConfig.provider": "Provider",
1272
- "aiConfig.mode": "模式",
1273
- "aiConfig.model": "模型",
1274
- "aiConfig.cli": "CLI(订阅)",
1275
- "aiConfig.api": "API(按量)",
1276
- "aiConfig.default": "默认",
1277
- "aiConfig.notConfigured": "未配置",
1278
- "aiConfig.cliNotFound": "CLI 未安装",
1279
- "aiConfig.apiKeyMissing": "API Key 未配置",
1280
- "aiConfig.saved": "已保存",
1281
- ```
1282
-
1283
- - [ ] **Step 3: Add en keys**
1284
-
1285
- Add to the flat export object in `src/lib/i18n/en.ts`:
1286
-
1287
- ```typescript
1288
- "aiConfig.title": "AI Capability Config",
1289
- "aiConfig.description": "Configure provider and model for each AI feature independently",
1290
- "aiConfig.terminal": "Terminal Execution",
1291
- "aiConfig.summary": "Session Summary",
1292
- "aiConfig.dreaming": "Knowledge Distillation",
1293
- "aiConfig.analysis": "Project Analysis",
1294
- "aiConfig.assistant": "Assistant Chat",
1295
- "aiConfig.provider": "Provider",
1296
- "aiConfig.mode": "Mode",
1297
- "aiConfig.model": "Model",
1298
- "aiConfig.cli": "CLI (Subscription)",
1299
- "aiConfig.api": "API (Pay-per-use)",
1300
- "aiConfig.default": "Default",
1301
- "aiConfig.notConfigured": "Not configured",
1302
- "aiConfig.cliNotFound": "CLI not installed",
1303
- "aiConfig.apiKeyMissing": "API key not configured",
1304
- "aiConfig.saved": "Saved",
1305
- ```
1306
-
1307
- - [ ] **Step 4: Commit**
1308
-
1309
- ```bash
1310
- git add src/i18n/locales/zh.json src/i18n/locales/en.json
1311
- git commit -m "feat(i18n): add AI capability config translation keys"
1312
- ```
1313
-
1314
- ---
1315
-
1316
- ### Task 10: Full regression test
1317
-
1318
- - [ ] **Step 1: Run all unit tests**
1319
-
1320
- Run: `cd /Users/liujunping/project/f/tower && pnpm test:run 2>&1 | tail -30`
1321
- Expected: All PASS
1322
-
1323
- - [ ] **Step 2: TypeScript type check**
1324
-
1325
- Run: `cd /Users/liujunping/project/f/tower && npx tsc --noEmit 2>&1 | tail -20`
1326
- Expected: No errors
1327
-
1328
- - [ ] **Step 3: Start dev server and smoke test**
1329
-
1330
- Run: `cd /Users/liujunping/project/f/tower && pnpm dev`
1331
-
1332
- Manual checks:
1333
- 1. Create task → Start execution → Claude CLI spawns in terminal ✓
1334
- 2. Stop execution → Summary generates ✓
1335
- 3. Resume execution → `--resume` works ✓
1336
- 4. Continue execution → `--continue` works ✓
1337
- 5. Settings page → CLI Profile still editable ✓
1338
- 6. Hook install/uninstall still works ✓
1339
-
1340
- - [ ] **Step 4: Final commit with all clean-up**
1341
-
1342
- ```bash
1343
- git add -A
1344
- git commit -m "chore(ai): Phase 1 complete — CLI adapter layer with Claude migration"
1345
- ```