tower-studio 0.2.42 → 0.2.44

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 (379) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/routes-manifest.json +8 -0
  6. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +3 -3
  14. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +35 -35
  15. package/.next/standalone/.next/server/app/_not-found/page.js +6 -6
  16. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/api/adapters/test/route.js +1 -1
  19. package/.next/standalone/.next/server/app/api/adapters/test/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/browse-fs/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/files/assets/[projectId]/[filename]/route.js +1 -1
  22. package/.next/standalone/.next/server/app/api/files/assets/[projectId]/[filename]/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/git/route.js +1 -1
  24. package/.next/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js +1 -1
  26. package/.next/standalone/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/internal/assets/reveal/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/internal/assistant/attachments/route.js +1 -1
  29. package/.next/standalone/.next/server/app/api/internal/assistant/attachments/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/internal/assistant/chat/route.js +3 -3
  31. package/.next/standalone/.next/server/app/api/internal/assistant/chat/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/internal/assistant/route.js +2 -2
  33. package/.next/standalone/.next/server/app/api/internal/assistant/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js +1 -1
  35. package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js +1 -1
  37. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js +1 -1
  39. package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js +3 -2
  41. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js +1 -1
  43. package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js +2 -2
  45. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js +2 -2
  47. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js +1 -1
  49. package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js +1 -1
  51. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js +1 -1
  53. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route/app-paths-manifest.json +3 -0
  55. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route/build-manifest.json +9 -0
  56. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route/server-reference-manifest.json +4 -0
  57. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js +8 -0
  58. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js.nft.json +1 -0
  59. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route_client-reference-manifest.js +3 -0
  60. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js +3 -3
  61. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js.nft.json +1 -1
  62. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js +4 -4
  63. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js.nft.json +1 -1
  64. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js +3 -3
  65. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js +1 -1
  67. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js.nft.json +1 -1
  68. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js +1 -1
  69. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js +4 -3
  71. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js.nft.json +1 -1
  72. package/.next/standalone/.next/server/app/missions/page/react-loadable-manifest.json +2 -2
  73. package/.next/standalone/.next/server/app/missions/page/server-reference-manifest.json +76 -76
  74. package/.next/standalone/.next/server/app/missions/page.js +6 -6
  75. package/.next/standalone/.next/server/app/missions/page.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/onboarding/page/react-loadable-manifest.json +3 -3
  78. package/.next/standalone/.next/server/app/onboarding/page/server-reference-manifest.json +35 -35
  79. package/.next/standalone/.next/server/app/onboarding/page.js +6 -6
  80. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +3 -3
  83. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +35 -35
  84. package/.next/standalone/.next/server/app/page.js +6 -6
  85. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +3 -3
  88. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +52 -52
  89. package/.next/standalone/.next/server/app/settings/page.js +6 -6
  90. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/react-loadable-manifest.json +3 -3
  93. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/server-reference-manifest.json +115 -115
  94. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js +6 -6
  95. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/react-loadable-manifest.json +3 -3
  98. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/server-reference-manifest.json +98 -98
  99. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js +6 -6
  100. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/react-loadable-manifest.json +3 -3
  103. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/server-reference-manifest.json +85 -85
  104. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js +6 -6
  105. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/react-loadable-manifest.json +3 -3
  108. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/server-reference-manifest.json +81 -81
  109. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js +6 -6
  110. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/react-loadable-manifest.json +3 -3
  113. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/server-reference-manifest.json +35 -35
  114. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js +7 -7
  115. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/react-loadable-manifest.json +3 -3
  118. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/server-reference-manifest.json +77 -77
  119. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js +6 -6
  120. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/react-loadable-manifest.json +4 -4
  123. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/server-reference-manifest.json +91 -91
  124. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js +6 -6
  125. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/workspaces/page/react-loadable-manifest.json +3 -3
  128. package/.next/standalone/.next/server/app/workspaces/page/server-reference-manifest.json +58 -58
  129. package/.next/standalone/.next/server/app/workspaces/page.js +6 -6
  130. package/.next/standalone/.next/server/app/workspaces/page.js.nft.json +1 -1
  131. package/.next/standalone/.next/server/app/workspaces/page_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  133. package/.next/standalone/.next/server/chunks/{_0keginv._.js → 0se9_next_0cuhhky._.js} +3 -3
  134. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0gr2wxq.js +3 -0
  135. package/.next/standalone/.next/server/chunks/0zjb_server_app_api_internal_terminal_[taskId]_paste-image_route_actions_0iegbi4.js +3 -0
  136. package/.next/standalone/.next/server/chunks/[externals]__0x_wqa7._.js +3 -0
  137. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.p6em~._.js +3 -0
  138. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.zmhk-._.js +3 -0
  139. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0042hx5._.js +3 -0
  140. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0b3m.jm._.js → [root-of-the-server]__03ufxqq._.js} +3 -3
  141. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04--bs7._.js +3 -0
  142. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04m2l8a._.js +3 -0
  143. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04r193~._.js +3 -0
  144. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0657y50._.js +3 -0
  145. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06ndn7a._.js +4 -0
  146. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08yqoti._.js +3 -0
  147. package/.next/standalone/.next/server/chunks/[root-of-the-server]__098.3z2._.js +3 -0
  148. package/.next/standalone/.next/server/chunks/[root-of-the-server]__09arklv._.js +3 -0
  149. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0obk~80._.js → [root-of-the-server]__0_d.s7s._.js} +3 -3
  150. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0askhfg._.js → [root-of-the-server]__0_zfnj0._.js} +2 -2
  151. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xswbi9._.js → [root-of-the-server]__0clptds._.js} +2 -2
  152. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0ai09na._.js → [root-of-the-server]__0g.k9o~._.js} +2 -2
  153. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i34gbs._.js +4 -0
  154. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0iggiij._.js +3 -0
  155. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i~3dwq._.js +3 -0
  156. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j1px8f._.js +3 -0
  157. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k-5ag7._.js +3 -0
  158. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l1-djp._.js +1 -1
  159. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0-~q463._.js → [root-of-the-server]__0lvlooo._.js} +2 -2
  160. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0otyifi._.js +1 -1
  161. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pl.c5.._.js +3 -0
  162. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r~9.7c._.js +4 -0
  163. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t31ba_._.js +3 -0
  164. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t_weyi._.js +3 -0
  165. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__06qz5fz._.js → [root-of-the-server]__0uptkzd._.js} +3 -3
  166. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x3kws1._.js +3 -0
  167. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xot7fu._.js +1 -1
  168. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0~6py0f._.js → [root-of-the-server]__0y8w5di._.js} +3 -3
  169. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zi3~a8._.js +3 -0
  170. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~g6-c~._.js +3 -0
  171. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10fv6tt._.js +3 -0
  172. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1189rd1._.js +4 -0
  173. package/.next/standalone/.next/server/chunks/{_06.mxka._.js → _0jmdgq~._.js} +1 -1
  174. package/.next/standalone/.next/server/chunks/{_0aflzks._.js → _0q10iet._.js} +1 -1
  175. package/.next/standalone/.next/server/chunks/_0qk_esg._.js +1 -1
  176. package/.next/standalone/.next/server/chunks/{_0b~hjvi._.js → _12537g8._.js} +1 -1
  177. package/.next/standalone/.next/server/chunks/{src_07gek7k._.js → src_0fq3zjg._.js} +2 -2
  178. package/.next/standalone/.next/server/chunks/src_0weytpz._.js +1 -1
  179. package/.next/standalone/.next/server/chunks/{src_0mqkaid._.js → src_0wlyw0g._.js} +2 -2
  180. package/.next/standalone/.next/server/chunks/{src_02ruq-1._.js → src_0~ey84y._.js} +2 -2
  181. package/.next/standalone/.next/server/chunks/src_actions_agent-actions_ts_10q9r5b._.js +2 -2
  182. package/.next/standalone/.next/server/chunks/ssr/0iu._[workspaceId]_projects_[projectId]_versions_version-timeline-client_tsx_07o_kyi._.js +1 -1
  183. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0mmypbn._.js → [root-of-the-server]__00ebsjb._.js} +1 -1
  184. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0dsaqeq._.js → [root-of-the-server]__01fmnse._.js} +2 -2
  185. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01vm_46._.js +47 -0
  186. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__025ol9g._.js +3 -0
  187. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__049n47u._.js +3 -0
  188. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__094t44p._.js → [root-of-the-server]__04ednzb._.js} +1 -1
  189. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04wbr9x._.js +1 -1
  190. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05xg05r._.js +1 -1
  191. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0pmjob9._.js → [root-of-the-server]__06dfcgo._.js} +1 -1
  192. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__038u_kv._.js → [root-of-the-server]__07xkj1s._.js} +4 -4
  193. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0h-se8t._.js → [root-of-the-server]__081e5n~._.js} +2 -2
  194. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08tzbfh._.js +3 -0
  195. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.infp2._.js → [root-of-the-server]__0_z5hke._.js} +1 -1
  196. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ce3fpq._.js → [root-of-the-server]__0ecd_1d._.js} +4 -4
  197. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__10s67lq._.js → [root-of-the-server]__0iln7n_._.js} +4 -4
  198. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__09z_ddd._.js → [root-of-the-server]__0j_-qk5._.js} +1 -1
  199. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0jymb~t._.js +1 -1
  200. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.u-t.1._.js → [root-of-the-server]__0k6oo0n._.js} +1 -1
  201. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0h589~0._.js → [root-of-the-server]__0lws68d._.js} +4 -4
  202. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0oq-j16._.js → [root-of-the-server]__0oamph.._.js} +4 -4
  203. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0pvaj~l._.js → [root-of-the-server]__0pnv7nd._.js} +1 -1
  204. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__03fujv7._.js → [root-of-the-server]__0tja~wz._.js} +1 -1
  205. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0391jsv._.js → [root-of-the-server]__0ug022w._.js} +1 -1
  206. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ugledi._.js +3 -0
  207. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0whlq2_._.js → [root-of-the-server]__0vxlsec._.js} +2 -2
  208. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w0.sdz._.js +3 -0
  209. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0l6bt9t._.js → [root-of-the-server]__0x6k.ee._.js} +1 -1
  210. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__058rbx5._.js → [root-of-the-server]__0xwzk2.._.js} +4 -4
  211. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__12w35bx._.js → [root-of-the-server]__0yby8pl._.js} +4 -4
  212. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0z7je5_._.js +1 -1
  213. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0rckee~._.js → [root-of-the-server]__0zxc81t._.js} +1 -1
  214. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__02j1enz._.js → [root-of-the-server]__0zzqn5z._.js} +1 -1
  215. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0mq0f94._.js → [root-of-the-server]__10c.a3u._.js} +1 -1
  216. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.2h0ux._.js → [root-of-the-server]__10n3vn6._.js} +1 -1
  217. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__09t~p.u._.js → [root-of-the-server]__123rmyb._.js} +1 -1
  218. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__124zb~p._.js +30 -0
  219. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0dux7x.._.js → [root-of-the-server]__127w3bm._.js} +1 -1
  220. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0odeai5._.js → [root-of-the-server]__13ce7v2._.js} +1 -1
  221. package/.next/standalone/.next/server/chunks/ssr/_0-~9em3._.js +1 -1
  222. package/.next/standalone/.next/server/chunks/ssr/{_0axcfvf._.js → _02vz78l._.js} +2 -2
  223. package/.next/standalone/.next/server/chunks/ssr/{_0c2gong._.js → _04~mjmb._.js} +2 -2
  224. package/.next/standalone/.next/server/chunks/ssr/{_03lt1_x._.js → _05a2u03._.js} +4 -4
  225. package/.next/standalone/.next/server/chunks/ssr/{_09z2zmm._.js → _060e1u.._.js} +1 -1
  226. package/.next/standalone/.next/server/chunks/ssr/_070t_mh._.js +2 -2
  227. package/.next/standalone/.next/server/chunks/ssr/{_0n4bq0m._.js → _07lq-bp._.js} +1 -1
  228. package/.next/standalone/.next/server/chunks/ssr/{_0p6p_68._.js → _07q06~v._.js} +4 -4
  229. package/.next/standalone/.next/server/chunks/ssr/{_0mm~wxj._.js → _08-x_rp._.js} +1 -1
  230. package/.next/standalone/.next/server/chunks/ssr/_08bq4g8._.js +1 -1
  231. package/.next/standalone/.next/server/chunks/ssr/{_0~oc5bl._.js → _0_nhdgs._.js} +2 -2
  232. package/.next/standalone/.next/server/chunks/ssr/{_12ca88g._.js → _0_q41~z._.js} +4 -4
  233. package/.next/standalone/.next/server/chunks/ssr/_0cj9a7y._.js +1 -1
  234. package/.next/standalone/.next/server/chunks/ssr/{_0u7c6bz._.js → _0dxbp89._.js} +4 -4
  235. package/.next/standalone/.next/server/chunks/ssr/{_0rq68d8._.js → _0foto06._.js} +2 -2
  236. package/.next/standalone/.next/server/chunks/ssr/{_0_5abui._.js → _0i4xdso._.js} +2 -2
  237. package/.next/standalone/.next/server/chunks/ssr/{_0n5do.z._.js → _0j5.ig_._.js} +1 -1
  238. package/.next/standalone/.next/server/chunks/ssr/{_0m.wslt._.js → _0kojxno._.js} +2 -2
  239. package/.next/standalone/.next/server/chunks/ssr/{_0py1s-f._.js → _0nze-e6._.js} +1 -1
  240. package/.next/standalone/.next/server/chunks/ssr/{_0u.n7v8._.js → _0r4_qn~._.js} +2 -2
  241. package/.next/standalone/.next/server/chunks/ssr/_0rdyrfd._.js +1 -1
  242. package/.next/standalone/.next/server/chunks/ssr/{_0q2mf9q._.js → _0rtydyv._.js} +1 -1
  243. package/.next/standalone/.next/server/chunks/ssr/_0rxeqmo._.js +1 -1
  244. package/.next/standalone/.next/server/chunks/ssr/{_04bt0.3._.js → _0s.h4l2._.js} +1 -1
  245. package/.next/standalone/.next/server/chunks/ssr/{_0tvm5af._.js → _0s.ik0k._.js} +1 -1
  246. package/.next/standalone/.next/server/chunks/ssr/{_0f~l8kv._.js → _0u3yt.5._.js} +3 -3
  247. package/.next/standalone/.next/server/chunks/ssr/_0wbcp88._.js +1 -1
  248. package/.next/standalone/.next/server/chunks/ssr/{_04~zqvy._.js → _0wqcz3w._.js} +4 -4
  249. package/.next/standalone/.next/server/chunks/ssr/{_0whlnt7._.js → _0ye1-r-._.js} +2 -2
  250. package/.next/standalone/.next/server/chunks/ssr/{_116-_2z._.js → _0zr81mw._.js} +2 -2
  251. package/.next/standalone/.next/server/chunks/ssr/{_0rrzd20._.js → _113957g._.js} +1 -1
  252. package/.next/standalone/.next/server/chunks/ssr/{_0o2tntr._.js → _11osha9._.js} +2 -2
  253. package/.next/standalone/.next/server/chunks/ssr/src_0djxlqx._.js +1 -1
  254. package/.next/standalone/.next/server/chunks/ssr/src_0eufeyj._.js +1 -1
  255. package/.next/standalone/.next/server/chunks/ssr/src_actions_agent-actions_ts_0~wc.sy._.js +1 -1
  256. package/.next/standalone/.next/server/chunks/ssr/src_actions_file-actions_ts_0gcvqwm._.js +1 -1
  257. package/.next/standalone/.next/server/chunks/ssr/src_app_missions_missions-client_tsx_11429lj._.js +1 -1
  258. package/.next/standalone/.next/server/chunks/ssr/src_app_onboarding_page_tsx_0xf7hpz._.js +1 -1
  259. package/.next/standalone/.next/server/chunks/ssr/src_app_settings_page_tsx_0h9v7dr._.js +1 -1
  260. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_assets_assets-page-client_tsx_0wyzpam._.js +1 -1
  261. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_board-page-client_tsx_0gips66._.js +1 -1
  262. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_notes_notes-page-client_tsx_10gyo3v._.js +1 -1
  263. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_tasks_[taskId]_task-page-client_tsx_02t7blt._.js +1 -1
  264. package/.next/standalone/.next/server/chunks/ssr/src_components_ui_select_tsx_0d2ra01._.js +1 -1
  265. package/.next/standalone/.next/server/chunks/ssr/{src_lib_0_9avpk._.js → src_lib_0.~.oo-._.js} +1 -1
  266. package/.next/standalone/.next/server/chunks/ssr/{src_lib_08wv1le._.js → src_lib_005uqbe._.js} +1 -1
  267. package/.next/standalone/.next/server/chunks/ssr/{src_lib_02~3_5t._.js → src_lib_00wjv6n._.js} +1 -1
  268. package/.next/standalone/.next/server/chunks/ssr/{src_lib_04d~c.c._.js → src_lib_01sr8_t._.js} +1 -1
  269. package/.next/standalone/.next/server/chunks/ssr/src_lib_08jql1e._.js +3 -0
  270. package/.next/standalone/.next/server/chunks/ssr/src_lib_0b~j-9d._.js +3 -0
  271. package/.next/standalone/.next/server/chunks/ssr/src_lib_0eymyjf._.js +3 -0
  272. package/.next/standalone/.next/server/chunks/ssr/src_lib_0fkv9z3._.js +3 -0
  273. package/.next/standalone/.next/server/chunks/ssr/src_lib_0n-n0.a._.js +3 -0
  274. package/.next/standalone/.next/server/chunks/ssr/src_lib_0sgt~lv._.js +3 -0
  275. package/.next/standalone/.next/server/chunks/ssr/src_lib_0x-iyl1._.js +3 -0
  276. package/.next/standalone/.next/server/chunks/ssr/src_lib_0yjmty1._.js +3 -0
  277. package/.next/standalone/.next/server/chunks/ssr/src_lib_13aevv6._.js +3 -0
  278. package/.next/standalone/.next/server/chunks/ssr/src_lib_worktree_ts_06cucy3._.js +1 -1
  279. package/.next/standalone/.next/server/functions-config-manifest.json +1 -0
  280. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  281. package/.next/standalone/.next/server/pages/500.html +1 -1
  282. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  283. package/.next/standalone/.next/server/server-reference-manifest.json +327 -327
  284. package/.next/standalone/.next/static/chunks/0-tuek2jqf0el.js +1 -0
  285. package/.next/standalone/.next/static/chunks/0.-.jc~0b~hy0.js +1 -0
  286. package/.next/standalone/.next/static/chunks/{0.onaugl2w8ci.js → 0.~03w.uxge40.js} +1 -1
  287. package/.next/standalone/.next/static/chunks/01hdj_kw4z2zq.js +2 -0
  288. package/.next/standalone/.next/static/chunks/01j9m895w64zn.js +1 -0
  289. package/.next/standalone/.next/static/chunks/{040j8d.w8mkyn.js → 0346xrw6i2bwo.js} +1 -1
  290. package/.next/standalone/.next/static/chunks/{0x-ug4iz~~qr2.js → 041o.dh2lc-k3.js} +1 -1
  291. package/.next/standalone/.next/static/chunks/07i9j5yyg4vs3.js +1 -0
  292. package/.next/standalone/.next/static/chunks/{0bdwzhoelky9-.js → 08ooaq~-.8fzu.js} +1 -1
  293. package/.next/standalone/.next/static/chunks/{13.3woq55msp..js → 0bylodlncwfpb.js} +1 -1
  294. package/.next/standalone/.next/static/chunks/0cpwtqzrjdgvs.js +1 -0
  295. package/.next/standalone/.next/static/chunks/0c~e1-nst-ze-.js +1 -0
  296. package/.next/standalone/.next/static/chunks/0ddt-snh45031.js +1 -0
  297. package/.next/standalone/.next/static/chunks/{0ypd9eqm_pj-o.js → 0dv4anj-j523o.js} +1 -1
  298. package/.next/standalone/.next/static/chunks/{0.wxa05y455w7.js → 0gvfb.b8m_i8t.js} +1 -1
  299. package/.next/standalone/.next/static/chunks/{0dewfthzwmcwb.js → 0h77-u2vvr-a1.js} +1 -1
  300. package/.next/standalone/.next/static/chunks/{0_d04kox03m72.css → 0jrje~1gt6w85.css} +1 -1
  301. package/.next/standalone/.next/static/chunks/{0m~m1~si.ot17.js → 0lqp~-dlfenad.js} +1 -1
  302. package/.next/standalone/.next/static/chunks/0qkr26yz3bocs.js +1 -0
  303. package/.next/standalone/.next/static/chunks/{035a_v6g7ioyw.js → 0rcuiuax31_uh.js} +1 -1
  304. package/.next/standalone/.next/static/chunks/0uf~7eqel0zra.js +1 -0
  305. package/.next/standalone/.next/static/chunks/{0rozlwh3y46l0.js → 0uj-3ckujwaiy.js} +1 -1
  306. package/.next/standalone/.next/static/chunks/0w71r_sj_fibx.js +1 -0
  307. package/.next/standalone/.next/static/chunks/0xejm4ge9~cn..js +1 -0
  308. package/.next/standalone/.next/static/chunks/{02f8-ju2se8qw.js → 0xg6rcq6g4bbh.js} +1 -1
  309. package/.next/standalone/.next/static/chunks/0yff8rwmrl5m4.js +1 -0
  310. package/.next/standalone/.next/static/chunks/{0wcwdbtpm0~r6.js → 0ymipmkk2uqby.js} +1 -1
  311. package/.next/standalone/.next/static/chunks/0znfclapbniaa.js +1 -0
  312. package/.next/standalone/.next/static/chunks/{17fug-zaik-v~.js → 11pe3kpxuj33f.js} +1 -1
  313. package/.next/standalone/.next/static/chunks/172s9cg35qt7i.js +1 -0
  314. package/.next/standalone/.next/static/chunks/184-zu89wwa4u.js +1 -0
  315. package/.next/standalone/package.json +9 -9
  316. package/dist/mcp-server.cjs +152 -76
  317. package/next.config.ts +4 -0
  318. package/package.json +9 -9
  319. package/skills/tower/SKILL.md +6 -0
  320. package/.next/standalone/.next/server/chunks/[externals]__0izylsq._.js +0 -3
  321. package/.next/standalone/.next/server/chunks/[externals]__0m6hc.0._.js +0 -3
  322. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.tbb~k._.js +0 -3
  323. package/.next/standalone/.next/server/chunks/[root-of-the-server]__032d9pl._.js +0 -3
  324. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04jduyo._.js +0 -3
  325. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05zlbau._.js +0 -4
  326. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05~g1fm._.js +0 -3
  327. package/.next/standalone/.next/server/chunks/[root-of-the-server]__075f7rs._.js +0 -4
  328. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08b~~wj._.js +0 -3
  329. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bo_6v~._.js +0 -3
  330. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c7z.~a._.js +0 -3
  331. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e~6fr~._.js +0 -3
  332. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fey.8j._.js +0 -3
  333. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fxmnch._.js +0 -4
  334. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gr~8aq._.js +0 -3
  335. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0hd.0to._.js +0 -3
  336. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j3l3l4._.js +0 -3
  337. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r-6wmj._.js +0 -3
  338. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rpck4h._.js +0 -3
  339. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0skk0fd._.js +0 -3
  340. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t_yyy8._.js +0 -3
  341. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0v2nkck._.js +0 -3
  342. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0z20rmt._.js +0 -3
  343. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11l3gud._.js +0 -3
  344. package/.next/standalone/.next/server/chunks/[root-of-the-server]__126b53k._.js +0 -4
  345. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.-z9ts._.js +0 -3
  346. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__045k323._.js +0 -3
  347. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__087pocz._.js +0 -3
  348. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0c2mh1c._.js +0 -47
  349. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0gt5dbj._.js +0 -3
  350. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ni-_7_._.js +0 -30
  351. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0y~ooou._.js +0 -3
  352. package/.next/standalone/.next/server/chunks/ssr/src_lib_0a60u40._.js +0 -3
  353. package/.next/standalone/.next/server/chunks/ssr/src_lib_0fu5szn._.js +0 -3
  354. package/.next/standalone/.next/server/chunks/ssr/src_lib_0gve57o._.js +0 -3
  355. package/.next/standalone/.next/server/chunks/ssr/src_lib_0koe0p0._.js +0 -3
  356. package/.next/standalone/.next/server/chunks/ssr/src_lib_0qdh-v4._.js +0 -3
  357. package/.next/standalone/.next/server/chunks/ssr/src_lib_0ramp4w._.js +0 -3
  358. package/.next/standalone/.next/server/chunks/ssr/src_lib_0sn1z-s._.js +0 -3
  359. package/.next/standalone/.next/server/chunks/ssr/src_lib_0x6grav._.js +0 -3
  360. package/.next/standalone/.next/server/chunks/ssr/src_lib_110am8v._.js +0 -3
  361. package/.next/standalone/.next/static/chunks/0-efd~h5j2ufi.js +0 -1
  362. package/.next/standalone/.next/static/chunks/0.z171pzeg-.7.js +0 -1
  363. package/.next/standalone/.next/static/chunks/01zlxs4rl~h_o.js +0 -1
  364. package/.next/standalone/.next/static/chunks/0af7afat3acfx.js +0 -1
  365. package/.next/standalone/.next/static/chunks/0ais32-8.3wlj.js +0 -1
  366. package/.next/standalone/.next/static/chunks/0f43x~jzb70f4.js +0 -1
  367. package/.next/standalone/.next/static/chunks/0i-x__600fys6.js +0 -1
  368. package/.next/standalone/.next/static/chunks/0l25d0nc5ygyd.js +0 -1
  369. package/.next/standalone/.next/static/chunks/0lyq0-a32.15m.js +0 -1
  370. package/.next/standalone/.next/static/chunks/0t8lz62rmr801.js +0 -2
  371. package/.next/standalone/.next/static/chunks/0utrquxfg25b2.js +0 -1
  372. package/.next/standalone/.next/static/chunks/0wcdxs4sl-gjf.js +0 -1
  373. package/.next/standalone/.next/static/chunks/0xj6v_80hlyv0.js +0 -1
  374. package/.next/standalone/.next/static/chunks/0xl7h5fsfc7zk.js +0 -1
  375. package/.next/standalone/.next/static/chunks/115ae91fq~slq.js +0 -1
  376. package/.next/standalone/.next/static/chunks/13rq33eiffqaz.js +0 -1
  377. /package/.next/standalone/.next/static/{LCBoYZWhXzs8PjuBmxw7g → dinNvsaC6aoPK_B7ZTeBv}/_buildManifest.js +0 -0
  378. /package/.next/standalone/.next/static/{LCBoYZWhXzs8PjuBmxw7g → dinNvsaC6aoPK_B7ZTeBv}/_clientMiddlewareManifest.js +0 -0
  379. /package/.next/standalone/.next/static/{LCBoYZWhXzs8PjuBmxw7g → dinNvsaC6aoPK_B7ZTeBv}/_ssgManifest.js +0 -0
@@ -14347,14 +14347,64 @@ var init_zod = __esm({
14347
14347
  }
14348
14348
  });
14349
14349
 
14350
+ // src/lib/tower-dir.ts
14351
+ function getTowerDir() {
14352
+ if (_dir) return _dir;
14353
+ _dir = process.env.TOWER_DATA_DIR || (0, import_node_path2.join)((0, import_node_os2.homedir)(), ".tower");
14354
+ if (!(0, import_node_fs.existsSync)(_dir)) {
14355
+ (0, import_node_fs.mkdirSync)(_dir, { recursive: true });
14356
+ }
14357
+ return _dir;
14358
+ }
14359
+ function getDatabaseDir() {
14360
+ const dir = (0, import_node_path2.join)(getTowerDir(), "database");
14361
+ if (!(0, import_node_fs.existsSync)(dir)) (0, import_node_fs.mkdirSync)(dir, { recursive: true });
14362
+ return dir;
14363
+ }
14364
+ function getTowerDbFilePath() {
14365
+ const root = process.env.TOWER_DATA_DIR || (0, import_node_path2.join)((0, import_node_os2.homedir)(), ".tower");
14366
+ return (0, import_node_path2.join)(root, "database", "tower.db");
14367
+ }
14368
+ function getDefaultStorageDir() {
14369
+ return (0, import_node_path2.join)(getTowerDir(), "storage");
14370
+ }
14371
+ function getStoragePointerFile() {
14372
+ return (0, import_node_path2.join)(getTowerDir(), "storage-location");
14373
+ }
14374
+ function readStoragePointer() {
14375
+ try {
14376
+ const p2 = (0, import_node_fs.readFileSync)(getStoragePointerFile(), "utf-8").trim();
14377
+ return p2.length > 0 ? p2 : null;
14378
+ } catch {
14379
+ return null;
14380
+ }
14381
+ }
14382
+ function getStorageDir() {
14383
+ const override = process.env.TOWER_STORAGE_DIR || readStoragePointer();
14384
+ const dir = override && override.length > 0 ? override : getDefaultStorageDir();
14385
+ if (!(0, import_node_fs.existsSync)(dir)) (0, import_node_fs.mkdirSync)(dir, { recursive: true });
14386
+ return dir;
14387
+ }
14388
+ var import_node_path2, import_node_os2, import_node_fs, _dir;
14389
+ var init_tower_dir = __esm({
14390
+ "src/lib/tower-dir.ts"() {
14391
+ "use strict";
14392
+ import_node_path2 = require("node:path");
14393
+ import_node_os2 = require("node:os");
14394
+ import_node_fs = require("node:fs");
14395
+ }
14396
+ });
14397
+
14350
14398
  // src/lib/db.ts
14351
14399
  var import_client2, globalForPrisma, db2;
14352
14400
  var init_db = __esm({
14353
14401
  "src/lib/db.ts"() {
14354
14402
  "use strict";
14355
14403
  import_client2 = require("@prisma/client");
14404
+ init_tower_dir();
14356
14405
  globalForPrisma = globalThis;
14357
14406
  db2 = globalForPrisma.prisma ?? new import_client2.PrismaClient({
14407
+ datasourceUrl: `file:${getTowerDbFilePath()}`,
14358
14408
  log: []
14359
14409
  });
14360
14410
  if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = db2;
@@ -26323,7 +26373,24 @@ async function removeWorktree(localPathRaw, taskId) {
26323
26373
  );
26324
26374
  }
26325
26375
  }
26326
- var import_child_process, import_fs, import_path, import_os;
26376
+ function isTowerLinkedDir(relPath, worktreeRoot) {
26377
+ const cleaned = relPath.replace(/[/\\]+$/, "");
26378
+ const base = import_path.default.basename(cleaned);
26379
+ if (!WORKTREE_LINKED_DIRS.includes(base)) return false;
26380
+ try {
26381
+ return (0, import_fs.lstatSync)(import_path.default.join(worktreeRoot, cleaned)).isSymbolicLink();
26382
+ } catch {
26383
+ return false;
26384
+ }
26385
+ }
26386
+ function stripTowerLinkedStatus(porcelainLines, worktreeRoot) {
26387
+ return porcelainLines.filter((line) => {
26388
+ if (!line.startsWith("??")) return true;
26389
+ const relPath = line.slice(2).trim();
26390
+ return !isTowerLinkedDir(relPath, worktreeRoot);
26391
+ });
26392
+ }
26393
+ var import_child_process, import_fs, import_path, import_os, WORKTREE_LINKED_DIRS;
26327
26394
  var init_worktree = __esm({
26328
26395
  "src/lib/worktree.ts"() {
26329
26396
  "use strict";
@@ -26332,6 +26399,7 @@ var init_worktree = __esm({
26332
26399
  import_path = __toESM(require("path"));
26333
26400
  import_os = __toESM(require("os"));
26334
26401
  init_logger();
26402
+ WORKTREE_LINKED_DIRS = ["node_modules", ".next"];
26335
26403
  }
26336
26404
  });
26337
26405
 
@@ -26592,7 +26660,7 @@ function isWindows(platform = process.platform) {
26592
26660
  return platform === "win32";
26593
26661
  }
26594
26662
  function normalizePath(p2, platform = process.platform) {
26595
- const normalized = import_node_path2.default.normalize(p2);
26663
+ const normalized = import_node_path3.default.normalize(p2);
26596
26664
  if (isWindows(platform)) {
26597
26665
  return normalized.replace(/\//g, "\\");
26598
26666
  }
@@ -26643,16 +26711,16 @@ async function resolveCommandPath(command, opts = {}) {
26643
26711
  const platform = opts.platform ?? process.platform;
26644
26712
  const hasPathSeparator = command.includes("/") || command.includes("\\");
26645
26713
  if (hasPathSeparator) {
26646
- const absolute = import_node_path2.default.isAbsolute(command) ? command : import_node_path2.default.resolve(cwd, command);
26714
+ const absolute = import_node_path3.default.isAbsolute(command) ? command : import_node_path3.default.resolve(cwd, command);
26647
26715
  return await pathExists(absolute, platform) ? absolute : null;
26648
26716
  }
26649
26717
  const pathValue = env.PATH ?? env.Path ?? "";
26650
26718
  const delimiter = isWindows(platform) ? ";" : ":";
26651
26719
  const dirs = pathValue.split(delimiter).filter(Boolean);
26652
26720
  const exts = isWindows(platform) ? windowsPathExts(env) : [""];
26653
- const hasExtension = isWindows(platform) && import_node_path2.default.extname(command).length > 0;
26721
+ const hasExtension = isWindows(platform) && import_node_path3.default.extname(command).length > 0;
26654
26722
  for (const dir of dirs) {
26655
- const candidates = isWindows(platform) ? hasExtension ? [import_node_path2.default.join(dir, command)] : exts.map((ext) => import_node_path2.default.join(dir, `${command}${ext}`)) : [import_node_path2.default.join(dir, command)];
26723
+ const candidates = isWindows(platform) ? hasExtension ? [import_node_path3.default.join(dir, command)] : exts.map((ext) => import_node_path3.default.join(dir, `${command}${ext}`)) : [import_node_path3.default.join(dir, command)];
26656
26724
  for (const candidate of candidates) {
26657
26725
  if (await pathExists(candidate, platform)) return candidate;
26658
26726
  }
@@ -26660,7 +26728,7 @@ async function resolveCommandPath(command, opts = {}) {
26660
26728
  return null;
26661
26729
  }
26662
26730
  function resolveCommandPathSync(command, platform = process.platform, exec = defaultExecSync) {
26663
- if (import_node_path2.default.extname(command) || command.includes("/") || command.includes("\\")) {
26731
+ if (import_node_path3.default.extname(command) || command.includes("/") || command.includes("\\")) {
26664
26732
  return command;
26665
26733
  }
26666
26734
  if (!isWindows(platform)) {
@@ -26687,13 +26755,13 @@ function resolveCommandPathSync(command, platform = process.platform, exec = def
26687
26755
  }
26688
26756
  function resolveSdkExecutable(command, platform = process.platform, readFile2 = (p2) => (0, import_node_fs2.readFileSync)(p2, "utf-8"), fileExists = (p2) => (0, import_node_fs2.existsSync)(p2)) {
26689
26757
  if (!isWindows(platform)) return command;
26690
- const ext = import_node_path2.default.extname(command).toLowerCase();
26758
+ const ext = import_node_path3.default.extname(command).toLowerCase();
26691
26759
  if (ext !== ".cmd" && ext !== ".bat") return command;
26692
- const dir = import_node_path2.default.win32.dirname(command);
26760
+ const dir = import_node_path3.default.win32.dirname(command);
26693
26761
  let shimSnippet = "";
26694
26762
  const expand = (raw) => {
26695
26763
  const p2 = raw.replace(/%~?dp0%/gi, dir).replace(/\//g, "\\");
26696
- return import_node_path2.default.win32.isAbsolute(p2) ? import_node_path2.default.win32.normalize(p2) : import_node_path2.default.win32.resolve(dir, p2);
26764
+ return import_node_path3.default.win32.isAbsolute(p2) ? import_node_path3.default.win32.normalize(p2) : import_node_path3.default.win32.resolve(dir, p2);
26697
26765
  };
26698
26766
  try {
26699
26767
  const shim = readFile2(command);
@@ -26706,17 +26774,17 @@ function resolveSdkExecutable(command, platform = process.platform, readFile2 =
26706
26774
  }
26707
26775
  for (const m2 of shim.matchAll(/"([^"]*\.exe)"/gi)) {
26708
26776
  const resolved = expand(m2[1]);
26709
- if (import_node_path2.default.win32.basename(resolved).toLowerCase() === "node.exe") continue;
26777
+ if (import_node_path3.default.win32.basename(resolved).toLowerCase() === "node.exe") continue;
26710
26778
  if (fileExists(resolved)) return resolved;
26711
26779
  }
26712
26780
  } catch (e2) {
26713
26781
  console.error(`[resolveSdkExecutable] shim read failed: ${e2 instanceof Error ? e2.message : e2}`);
26714
26782
  }
26715
- const pkgDir = import_node_path2.default.win32.join(dir, "node_modules", "@anthropic-ai", "claude-code");
26716
- const base = import_node_path2.default.win32.basename(command, import_node_path2.default.win32.extname(command));
26783
+ const pkgDir = import_node_path3.default.win32.join(dir, "node_modules", "@anthropic-ai", "claude-code");
26784
+ const base = import_node_path3.default.win32.basename(command, import_node_path3.default.win32.extname(command));
26717
26785
  const guesses = [
26718
- import_node_path2.default.win32.join(pkgDir, "cli.js"),
26719
- import_node_path2.default.win32.join(pkgDir, "bin", `${base}.exe`)
26786
+ import_node_path3.default.win32.join(pkgDir, "cli.js"),
26787
+ import_node_path3.default.win32.join(pkgDir, "bin", `${base}.exe`)
26720
26788
  ];
26721
26789
  for (const g10 of guesses) {
26722
26790
  if (fileExists(g10)) return g10;
@@ -26748,7 +26816,7 @@ function wrapForPlatform(executable, args, env, platform) {
26748
26816
  if (!isWindows(platform)) {
26749
26817
  return { command: executable, args };
26750
26818
  }
26751
- const ext = import_node_path2.default.extname(executable).toLowerCase();
26819
+ const ext = import_node_path3.default.extname(executable).toLowerCase();
26752
26820
  if (ext === ".cmd" || ext === ".bat" || ext === ".com") {
26753
26821
  const shell = env.ComSpec || "cmd.exe";
26754
26822
  const commandLine = [quoteForCmd(executable), ...args.map(quoteForCmd)].join(" ");
@@ -26782,7 +26850,7 @@ async function detectUnixShells() {
26782
26850
  const line = raw.replace(/#.*/, "").trim();
26783
26851
  if (!line || !line.startsWith("/")) continue;
26784
26852
  if (!await pathExists(line)) continue;
26785
- let name = import_node_path2.default.basename(line);
26853
+ let name = import_node_path3.default.basename(line);
26786
26854
  const count = seen.get(name) ?? 0;
26787
26855
  seen.set(name, count + 1);
26788
26856
  if (count > 0) name = `${name} (${count + 1})`;
@@ -26793,7 +26861,7 @@ async function detectUnixShells() {
26793
26861
  const defaults = ["/bin/zsh", "/bin/bash", "/bin/sh"];
26794
26862
  const shells = [];
26795
26863
  for (const p2 of defaults) {
26796
- if (await pathExists(p2)) shells.push({ name: import_node_path2.default.basename(p2), path: p2 });
26864
+ if (await pathExists(p2)) shells.push({ name: import_node_path3.default.basename(p2), path: p2 });
26797
26865
  }
26798
26866
  return shells;
26799
26867
  }
@@ -26803,28 +26871,28 @@ async function detectWindowsShells() {
26803
26871
  const gitBashCandidates = [];
26804
26872
  const gitPath = await resolveCommandPath("git", { platform: "win32" });
26805
26873
  if (gitPath) {
26806
- const gitRoot = import_node_path2.default.resolve(import_node_path2.default.dirname(gitPath), "..", "..");
26874
+ const gitRoot = import_node_path3.default.resolve(import_node_path3.default.dirname(gitPath), "..", "..");
26807
26875
  gitBashCandidates.push(
26808
- import_node_path2.default.join(gitRoot, "bin", "bash.exe"),
26809
- import_node_path2.default.join(gitRoot, "usr", "bin", "bash.exe")
26876
+ import_node_path3.default.join(gitRoot, "bin", "bash.exe"),
26877
+ import_node_path3.default.join(gitRoot, "usr", "bin", "bash.exe")
26810
26878
  );
26811
26879
  }
26812
26880
  const programDirs = [
26813
26881
  process.env.ProgramW6432,
26814
26882
  process.env.ProgramFiles,
26815
26883
  process.env["ProgramFiles(x86)"],
26816
- process.env.LocalAppData ? import_node_path2.default.join(process.env.LocalAppData, "Programs") : null
26884
+ process.env.LocalAppData ? import_node_path3.default.join(process.env.LocalAppData, "Programs") : null
26817
26885
  ].filter(Boolean);
26818
26886
  for (const dir of programDirs) {
26819
26887
  gitBashCandidates.push(
26820
- import_node_path2.default.join(dir, "Git", "bin", "bash.exe"),
26821
- import_node_path2.default.join(dir, "Git", "usr", "bin", "bash.exe")
26888
+ import_node_path3.default.join(dir, "Git", "bin", "bash.exe"),
26889
+ import_node_path3.default.join(dir, "Git", "usr", "bin", "bash.exe")
26822
26890
  );
26823
26891
  }
26824
26892
  const home = process.env.USERPROFILE ?? "";
26825
26893
  if (home) {
26826
26894
  gitBashCandidates.push(
26827
- import_node_path2.default.join(home, "scoop", "apps", "git", "current", "bin", "bash.exe")
26895
+ import_node_path3.default.join(home, "scoop", "apps", "git", "current", "bin", "bash.exe")
26828
26896
  );
26829
26897
  }
26830
26898
  if (process.env.CLAUDE_CODE_GIT_BASH_PATH) {
@@ -26841,11 +26909,11 @@ async function detectWindowsShells() {
26841
26909
  shells.push({ name: "PowerShell", path: pwshPath });
26842
26910
  }
26843
26911
  const winDir = process.env.windir ?? "C:\\WINDOWS";
26844
- const legacyPs = import_node_path2.default.join(winDir, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
26912
+ const legacyPs = import_node_path3.default.join(winDir, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
26845
26913
  if (await pathExists(legacyPs, "win32")) {
26846
26914
  shells.push({ name: "Windows PowerShell", path: legacyPs });
26847
26915
  }
26848
- const cmd = process.env.ComSpec ?? import_node_path2.default.join(winDir, "System32", "cmd.exe");
26916
+ const cmd = process.env.ComSpec ?? import_node_path3.default.join(winDir, "System32", "cmd.exe");
26849
26917
  if (await pathExists(cmd, "win32")) {
26850
26918
  shells.push({ name: "Command Prompt", path: cmd });
26851
26919
  }
@@ -26898,13 +26966,13 @@ async function detectEditors(platform = process.platform) {
26898
26966
  }
26899
26967
  return results;
26900
26968
  }
26901
- var import_node_fs2, import_node_child_process, import_node_path2, CLAUDE_NESTING_VARS, SENSITIVE_KEY_RE, defaultExecSync, MAC_TERMINAL_APPS, KNOWN_EDITORS, EDITOR_FALLBACK_PATHS;
26969
+ var import_node_fs2, import_node_child_process, import_node_path3, CLAUDE_NESTING_VARS, SENSITIVE_KEY_RE, defaultExecSync, MAC_TERMINAL_APPS, KNOWN_EDITORS, EDITOR_FALLBACK_PATHS;
26902
26970
  var init_platform = __esm({
26903
26971
  "src/lib/platform.ts"() {
26904
26972
  "use strict";
26905
26973
  import_node_fs2 = require("node:fs");
26906
26974
  import_node_child_process = require("node:child_process");
26907
- import_node_path2 = __toESM(require("node:path"));
26975
+ import_node_path3 = __toESM(require("node:path"));
26908
26976
  CLAUDE_NESTING_VARS = [
26909
26977
  "CLAUDECODE",
26910
26978
  "CLAUDE_CODE_ENTRYPOINT",
@@ -32133,7 +32201,7 @@ var init_pty_session = __esm({
32133
32201
 
32134
32202
  // src/lib/pty/orphan-reaper.ts
32135
32203
  function pidFilePath(sessionKey) {
32136
- return (0, import_node_path3.join)(SIGNAL_DIR, `${PID_PREFIX}${sessionKey}`);
32204
+ return (0, import_node_path4.join)(SIGNAL_DIR, `${PID_PREFIX}${sessionKey}`);
32137
32205
  }
32138
32206
  async function recordSessionPid(sessionKey, pid) {
32139
32207
  try {
@@ -32148,14 +32216,14 @@ async function clearSessionPid(sessionKey) {
32148
32216
  } catch {
32149
32217
  }
32150
32218
  }
32151
- var import_promises, import_node_os2, import_node_path3, SIGNAL_DIR, PID_PREFIX;
32219
+ var import_promises, import_node_os3, import_node_path4, SIGNAL_DIR, PID_PREFIX;
32152
32220
  var init_orphan_reaper = __esm({
32153
32221
  "src/lib/pty/orphan-reaper.ts"() {
32154
32222
  "use strict";
32155
32223
  import_promises = require("node:fs/promises");
32156
- import_node_os2 = require("node:os");
32157
- import_node_path3 = require("node:path");
32158
- SIGNAL_DIR = (0, import_node_path3.join)((0, import_node_os2.tmpdir)(), "tower-signals");
32224
+ import_node_os3 = require("node:os");
32225
+ import_node_path4 = require("node:path");
32226
+ SIGNAL_DIR = (0, import_node_path4.join)((0, import_node_os3.tmpdir)(), "tower-signals");
32159
32227
  PID_PREFIX = "pid-";
32160
32228
  }
32161
32229
  });
@@ -53854,7 +53922,8 @@ async function checkWorktreeClean(taskId) {
53854
53922
  ["status", "--porcelain"],
53855
53923
  { cwd, encoding: "utf-8", timeout: 5e3 }
53856
53924
  ).trim();
53857
- const files = status ? status.split("\n").map((l) => l.trim()).filter(Boolean) : [];
53925
+ const rawFiles = status ? status.split("\n").map((l) => l.trim()).filter(Boolean) : [];
53926
+ const files = stripTowerLinkedStatus(rawFiles, cwd);
53858
53927
  const clean = files.length === 0;
53859
53928
  let hasCommits = false;
53860
53929
  let lastCommitMessage = null;
@@ -53957,6 +54026,23 @@ var init_task_actions = __esm({
53957
54026
  }
53958
54027
  });
53959
54028
 
54029
+ // src/mcp/env-guard.ts
54030
+ var import_node_path = require("node:path");
54031
+ var import_node_os = require("node:os");
54032
+ function resolveTowerDataDir(env) {
54033
+ if (env.TOWER_DATA_DIR) return env.TOWER_DATA_DIR;
54034
+ const dbUrl = env.DATABASE_URL;
54035
+ if (dbUrl && dbUrl.startsWith("file:")) {
54036
+ const dbPath = dbUrl.slice("file:".length);
54037
+ return (0, import_node_path.dirname)((0, import_node_path.dirname)(dbPath));
54038
+ }
54039
+ return (0, import_node_path.join)((0, import_node_os.homedir)(), ".tower");
54040
+ }
54041
+ process.env.TOWER_DATA_DIR = resolveTowerDataDir({
54042
+ TOWER_DATA_DIR: process.env.TOWER_DATA_DIR,
54043
+ DATABASE_URL: process.env.DATABASE_URL
54044
+ });
54045
+
53960
54046
  // src/mcp/index.ts
53961
54047
  var import_stdio = require("@modelcontextprotocol/sdk/server/stdio.js");
53962
54048
 
@@ -53968,8 +54054,10 @@ init_zod();
53968
54054
 
53969
54055
  // src/mcp/db.ts
53970
54056
  var import_client = require("@prisma/client");
53971
- var db = new import_client.PrismaClient();
54057
+ init_tower_dir();
54058
+ var db = new import_client.PrismaClient({ datasourceUrl: `file:${getTowerDbFilePath()}` });
53972
54059
  async function initDb() {
54060
+ getDatabaseDir();
53973
54061
  await db.$connect();
53974
54062
  await db.$queryRaw(import_client.Prisma.sql`PRAGMA journal_mode=WAL`);
53975
54063
  await db.$queryRaw(import_client.Prisma.sql`PRAGMA busy_timeout=5000`);
@@ -54129,42 +54217,7 @@ init_config_reader();
54129
54217
  // src/lib/file-utils.ts
54130
54218
  var fs = __toESM(require("node:fs"));
54131
54219
  var path = __toESM(require("node:path"));
54132
-
54133
- // src/lib/tower-dir.ts
54134
- var import_node_path = require("node:path");
54135
- var import_node_os = require("node:os");
54136
- var import_node_fs = require("node:fs");
54137
- var _dir;
54138
- function getTowerDir() {
54139
- if (_dir) return _dir;
54140
- _dir = process.env.TOWER_DATA_DIR || (0, import_node_path.join)((0, import_node_os.homedir)(), ".tower");
54141
- if (!(0, import_node_fs.existsSync)(_dir)) {
54142
- (0, import_node_fs.mkdirSync)(_dir, { recursive: true });
54143
- }
54144
- return _dir;
54145
- }
54146
- function getDefaultStorageDir() {
54147
- return (0, import_node_path.join)(getTowerDir(), "storage");
54148
- }
54149
- function getStoragePointerFile() {
54150
- return (0, import_node_path.join)(getTowerDir(), "storage-location");
54151
- }
54152
- function readStoragePointer() {
54153
- try {
54154
- const p2 = (0, import_node_fs.readFileSync)(getStoragePointerFile(), "utf-8").trim();
54155
- return p2.length > 0 ? p2 : null;
54156
- } catch {
54157
- return null;
54158
- }
54159
- }
54160
- function getStorageDir() {
54161
- const override = process.env.TOWER_STORAGE_DIR || readStoragePointer();
54162
- const dir = override && override.length > 0 ? override : getDefaultStorageDir();
54163
- if (!(0, import_node_fs.existsSync)(dir)) (0, import_node_fs.mkdirSync)(dir, { recursive: true });
54164
- return dir;
54165
- }
54166
-
54167
- // src/lib/file-utils.ts
54220
+ init_tower_dir();
54168
54221
  function assertWithinDataRoot(resolved) {
54169
54222
  if (!resolved.startsWith(getStorageDir() + path.sep)) {
54170
54223
  throw new Error("Path traversal detected");
@@ -54420,21 +54473,44 @@ ${refText}`;
54420
54473
  }
54421
54474
  },
54422
54475
  update_task: {
54423
- description: "Update a task's title, description, priority, labels, and/or subPath. If labelIds is provided, replaces all existing labels.",
54476
+ description: "Update a task's title, description, priority, labels, subPath, and/or version. If labelIds is provided, replaces all existing labels. Pass versionId to file the task under a project version (use list_versions to discover options); pass null or an empty string to move it back to the backlog (no version).",
54424
54477
  schema: external_exports.object({
54425
54478
  taskId: external_exports.string(),
54426
54479
  title: external_exports.string().optional(),
54427
54480
  description: external_exports.string().optional(),
54428
54481
  priority: Priority.optional(),
54429
54482
  labelIds: external_exports.array(external_exports.string()).optional(),
54430
- subPath: external_exports.string().optional()
54483
+ subPath: external_exports.string().optional(),
54484
+ versionId: external_exports.string().nullable().optional().describe('Version to assign the task to. Use list_versions to find valid IDs for the project. Pass null or "" to move the task to the backlog (no version).')
54431
54485
  }),
54432
54486
  handler: async (args) => {
54433
- const { labelIds, taskId, ...updateData } = args;
54487
+ const { labelIds, taskId, versionId, ...updateData } = args;
54488
+ const versionProvided = "versionId" in args;
54434
54489
  return db.$transaction(async (tx) => {
54490
+ let versionData = {};
54491
+ if (versionProvided) {
54492
+ let resolved = null;
54493
+ if (versionId) {
54494
+ const current = await tx.task.findUnique({
54495
+ where: { id: taskId },
54496
+ select: { projectId: true }
54497
+ });
54498
+ if (current) {
54499
+ const v2 = await tx.version.findFirst({
54500
+ where: { id: versionId, projectId: current.projectId },
54501
+ select: { id: true }
54502
+ });
54503
+ resolved = v2?.id ?? null;
54504
+ }
54505
+ }
54506
+ versionData = { versionId: resolved };
54507
+ }
54435
54508
  const task = await tx.task.update({
54436
54509
  where: { id: taskId },
54437
- data: updateData
54510
+ data: {
54511
+ ...updateData,
54512
+ ...versionData
54513
+ }
54438
54514
  });
54439
54515
  if (labelIds !== void 0) {
54440
54516
  await tx.taskLabel.deleteMany({ where: { taskId } });
@@ -54488,7 +54564,7 @@ ${refText}`;
54488
54564
  }
54489
54565
  },
54490
54566
  list_versions: {
54491
- description: "List a project's active versions (excludes RELEASED) for assigning a task via create_task's versionId. Returns id, number, name, status, isCurrent.",
54567
+ description: "List a project's active versions (excludes RELEASED) for assigning a task via create_task's or update_task's versionId. Returns id, number, name, status, isCurrent.",
54492
54568
  schema: external_exports.object({ projectId: external_exports.string() }),
54493
54569
  handler: async (args) => {
54494
54570
  return db.version.findMany({
package/next.config.ts CHANGED
@@ -4,6 +4,10 @@ const nextConfig: NextConfig = {
4
4
  // Self-contained build: traced deps land in `.next/standalone/node_modules/`,
5
5
  // so `npm i tower-studio -g` no longer re-downloads the dependency graph.
6
6
  output: "standalone",
7
+ // Dev and prod must not share a build dir, or `pnpm dev` clobbers the prod
8
+ // `.next/standalone` that `pnpm start` (bin/tower.mjs) loads. The `dev` script
9
+ // sets NEXT_DISTDIR=.next-dev; prod build/start keep the default `.next`.
10
+ distDir: process.env.NEXT_DISTDIR || ".next",
7
11
  // Pin the workspace root — without this Next.js infers it from the nearest
8
12
  // lockfile and can wrongly pick a stray ~/package-lock.json in $HOME.
9
13
  outputFileTracingRoot: __dirname,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tower-studio",
3
- "version": "0.2.42",
3
+ "version": "0.2.44",
4
4
  "description": "AI Task Orchestration Platform — Kanban + Terminal + Code Editor + MCP",
5
5
  "bin": {
6
6
  "tower": "bin/tower.mjs"
@@ -29,8 +29,8 @@
29
29
  "tsconfig.json"
30
30
  ],
31
31
  "scripts": {
32
- "predev": "node scripts/ensure-dev-db.js && pnpm db:migrate && pnpm mcp:build",
33
- "dev": "next dev --webpack -p 9022",
32
+ "predev": "TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" node scripts/ensure-dev-db.js && pnpm db:migrate && pnpm mcp:build",
33
+ "dev": "NEXT_DISTDIR=.next-dev TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" next dev --webpack -p 9022",
34
34
  "build": "pnpm mcp:build && rm -rf .next && next build && find .next -name '*.map' -delete && cp -R .next/static .next/standalone/.next/ && cp -R public .next/standalone/ && node scripts/prune-standalone-natives.js",
35
35
  "release": "pnpm build && npm pack",
36
36
  "release:smoke": "node scripts/release-smoke.js",
@@ -39,12 +39,12 @@
39
39
  "start": "node bin/tower.mjs",
40
40
  "lint": "eslint",
41
41
  "db:generate": "prisma generate",
42
- "db:push": "prisma db push",
43
- "db:seed": "tsx prisma/seed.ts",
44
- "db:studio": "prisma studio",
45
- "db:init": "tsx scripts/init-db.ts",
46
- "db:init-fts": "tsx prisma/init-fts.ts",
47
- "db:migrate": "tsx scripts/run-migrations.ts",
42
+ "db:push": "DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" prisma db push",
43
+ "db:seed": "DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" tsx prisma/seed.ts",
44
+ "db:studio": "DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" prisma studio",
45
+ "db:init": "TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" tsx scripts/init-db.ts",
46
+ "db:init-fts": "DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" tsx prisma/init-fts.ts",
47
+ "db:migrate": "TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" tsx scripts/run-migrations.ts",
48
48
  "test": "vitest",
49
49
  "test:run": "vitest run",
50
50
  "test:e2e": "NO_PROXY=localhost,127.0.0.1 no_proxy=localhost,127.0.0.1 playwright test",
@@ -103,6 +103,12 @@ it means your previous turn produced no tool call — issue the tool call now.
103
103
 
104
104
  1. Call `move_task` with taskId and the target status (DONE, CANCELLED, etc.)
105
105
 
106
+ ### "Edit a task" / "Change its title/description/priority/labels/version"
107
+
108
+ 1. Call `update_task` with `taskId` plus any of: `title`, `description`, `priority`, `labelIds`, `subPath`, `versionId`. Only the fields you pass are changed.
109
+ 2. **Labels** (`labelIds`): full replace, not a merge — pass the complete desired set (omit to leave labels untouched).
110
+ 3. **Version** (`versionId`): to move a task into a version, call `list_versions` with the task's projectId, let the user pick, then pass `versionId`. To move the task back to the **backlog** (no version), pass `versionId: null` (or an empty string). A `versionId` that doesn't belong to the task's project is ignored and the task falls back to backlog. Omit `versionId` entirely to leave the version unchanged.
111
+
106
112
  ### "Search for ..." / "Find tasks about ..."
107
113
 
108
114
  1. Call `search` with the query string
@@ -1,3 +0,0 @@
1
- module.exports=[874533,(e,o,r)=>{o.exports=e.x("node:child_process",()=>require("node:child_process"))},750227,(e,o,r)=>{o.exports=e.x("node:path",()=>require("node:path"))},902157,(e,o,r)=>{o.exports=e.x("node:fs",()=>require("node:fs"))},660526,(e,o,r)=>{o.exports=e.x("node:os",()=>require("node:os"))},912714,(e,o,r)=>{o.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},980738,(e,o,r)=>{o.exports=e.x("node-pty-c710df912a232c01",()=>require("node-pty-c710df912a232c01"))}];
2
-
3
- //# sourceMappingURL=%5Bexternals%5D__0izylsq._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[324725,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},193695,(e,r,t)=>{r.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},224361,(e,r,t)=>{r.exports=e.x("util",()=>require("util"))},522734,(e,r,t)=>{r.exports=e.x("fs",()=>require("fs"))},233405,(e,r,t)=>{r.exports=e.x("child_process",()=>require("child_process"))},750227,(e,r,t)=>{r.exports=e.x("node:path",()=>require("node:path"))},918622,(e,r,t)=>{r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},556704,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},270406,(e,r,t)=>{r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},814747,(e,r,t)=>{r.exports=e.x("path",()=>require("path"))},446786,(e,r,t)=>{r.exports=e.x("os",()=>require("os"))},687769,(e,r,t)=>{r.exports=e.x("node:events",()=>require("node:events"))}];
2
-
3
- //# sourceMappingURL=%5Bexternals%5D__0m6hc.0._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[193695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},918622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},556704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},270406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},324725,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},198840,e=>{"use strict";var t=e.i(855104);let r=["localhost","127.0.0.1","[::1]"],n=new Set(["127.0.0.1","::1","::ffff:127.0.0.1"]),s=/^c[a-z0-9]{20,30}$/;e.s(["requireLocalhost",0,function(e){let s=e.headers.get("x-forwarded-for");if(s&&!s.split(",").map(e=>e.trim()).every(e=>n.has(e)))return t.NextResponse.json({error:"Forbidden"},{status:403});let o=e.headers.get("host")??"";return r.some(e=>o.startsWith(e))?null:t.NextResponse.json({error:"Forbidden"},{status:403})},"validateProjectId",0,function(e){return s.test(e)?null:t.NextResponse.json({error:"Invalid projectId format"},{status:400})},"validateTaskId",0,function(e){return s.test(e)?null:t.NextResponse.json({error:"Invalid taskId format"},{status:400})}])},874533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},750227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},902157,(e,t,r)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},660526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},769310,e=>{"use strict";var t=e.i(902157),r=e.i(874533),n=e.i(750227);function s(e=process.platform){return"win32"===e}function o(e){let t=e.replace(/\r\n|\r|\n/g," ");if(!t.length)return'""';let r=t.replace(/"/g,'""');return/[\s"&<>|^()]/.test(r)?`"${r}"`:r}let a=["CLAUDECODE","CLAUDE_CODE_ENTRYPOINT","CLAUDE_CODE_SESSION","CLAUDE_CODE_PARENT_SESSION"];async function i(e,t={}){let r=t.cwd??process.cwd(),o=t.env??process.env,a=t.platform??process.platform;if(e.includes("/")||e.includes("\\")){let t=n.default.isAbsolute(e)?e:n.default.resolve(r,e);return await p(t,a)?t:null}let l=o.PATH??o.Path??"",c=s(a)?";":":",d=l.split(c).filter(Boolean),u=s(a)?(o.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""],m=s(a)&&n.default.extname(e).length>0;for(let t of d)for(let r of s(a)?m?[n.default.join(t,e)]:u.map(r=>n.default.join(t,`${e}${r}`)):[n.default.join(t,e)])if(await p(r,a))return r;return null}let l=e=>(0,r.execSync)(e,{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]});function c(e,t=process.platform,o=l){if(n.default.extname(e)||e.includes("/")||e.includes("\\"))return e;if(!s(t)){try{let t=(0,r.execFileSync)("which",[e],{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim();if(t)return t}catch{}return e}try{let t=o(`where ${e}`).trim().split("\n").map(e=>e.trim()).filter(Boolean),r=t.find(e=>/\.(cmd|bat|exe)$/i.test(e));if(r)return r;if(t.length>0)return t[0]}catch{}return e}async function d(e,t,r={}){let n=r.env??process.env,s=r.platform??process.platform;return u(await i(e,r)??e,t,n,s)}function u(e,t,r,a){if(!s(a))return{command:e,args:t};let i=n.default.extname(e).toLowerCase();return".cmd"===i||".bat"===i||".com"===i?{command:r.ComSpec||"cmd.exe",args:["/d","/s","/c",[o(e),...t.map(o)].join(" ")]}:{command:e,args:t}}async function p(e,r=process.platform){try{return await t.promises.access(e,s(r)?t.constants.F_OK:t.constants.X_OK),!0}catch{return!1}}async function m(e=process.platform){return s(e)?f():h()}async function h(){try{let e=await t.promises.readFile("/etc/shells","utf-8"),r=[],s=new Map;for(let t of e.split("\n")){let e=t.replace(/#.*/,"").trim();if(!e||!e.startsWith("/")||!await p(e))continue;let o=n.default.basename(e),a=s.get(o)??0;s.set(o,a+1),a>0&&(o=`${o} (${a+1})`),r.push({name:o,path:e})}return r}catch{let e=[];for(let t of["/bin/zsh","/bin/bash","/bin/sh"])await p(t)&&e.push({name:n.default.basename(t),path:t});return e}}async function f(){let e=[],t=[],r=await i("git",{platform:"win32"});if(r){let e=n.default.resolve(n.default.dirname(r),"..","..");t.push(n.default.join(e,"bin","bash.exe"),n.default.join(e,"usr","bin","bash.exe"))}for(let e of[process.env.ProgramW6432,process.env.ProgramFiles,process.env["ProgramFiles(x86)"],process.env.LocalAppData?n.default.join(process.env.LocalAppData,"Programs"):null].filter(Boolean))t.push(n.default.join(e,"Git","bin","bash.exe"),n.default.join(e,"Git","usr","bin","bash.exe"));let s=process.env.USERPROFILE??"";for(let r of(s&&t.push(n.default.join(s,"scoop","apps","git","current","bin","bash.exe")),process.env.CLAUDE_CODE_GIT_BASH_PATH&&t.unshift(process.env.CLAUDE_CODE_GIT_BASH_PATH),t))if(await p(r,"win32")){e.push({name:"Git Bash",path:r});break}let o=await i("pwsh",{platform:"win32"});o&&e.push({name:"PowerShell",path:o});let a=process.env.windir??"C:\\WINDOWS",l=n.default.join(a,"System32","WindowsPowerShell","v1.0","powershell.exe");await p(l,"win32")&&e.push({name:"Windows PowerShell",path:l});let c=process.env.ComSpec??n.default.join(a,"System32","cmd.exe");return await p(c,"win32")&&e.push({name:"Command Prompt",path:c}),e}let g=[{name:"Terminal",bundleName:"Terminal"},{name:"iTerm2",bundleName:"iTerm"},{name:"Warp",bundleName:"Warp"},{name:"Alacritty",bundleName:"Alacritty"},{name:"WezTerm",bundleName:"WezTerm"},{name:"kitty",bundleName:"kitty"},{name:"Hyper",bundleName:"Hyper"}];async function w(e=process.platform){if("darwin"===e){let t=[];for(let r of g){let n=await p(`/Applications/${r.bundleName}.app`,e);t.push({name:r.name,value:r.bundleName,installed:n})}return t}if(s(e)){let t=[],r=await i("wt",{platform:e});return r&&t.push({name:"Windows Terminal",value:r,installed:!0}),t}return[]}let y=[{name:"VS Code",command:"code"},{name:"VS Code Insiders",command:"code-insiders"},{name:"Cursor",command:"cursor"},{name:"Windsurf",command:"windsurf"},{name:"Zed",command:"zed"},{name:"Sublime Text",command:"subl"},{name:"IntelliJ IDEA",command:"idea"},{name:"WebStorm",command:"webstorm"},{name:"PyCharm",command:"pycharm"},{name:"GoLand",command:"goland"},{name:"RubyMine",command:"rubymine"},{name:"PhpStorm",command:"phpstorm"},{name:"CLion",command:"clion"},{name:"Rider",command:"rider"}],v={code:{darwin:["/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"],win32:["%LOCALAPPDATA%\\Programs\\Microsoft VS Code\\bin\\code.cmd","%ProgramFiles%\\Microsoft VS Code\\bin\\code.cmd"]},"code-insiders":{darwin:["/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders"],win32:["%LOCALAPPDATA%\\Programs\\Microsoft VS Code Insiders\\bin\\code-insiders.cmd","%ProgramFiles%\\Microsoft VS Code Insiders\\bin\\code-insiders.cmd"]},cursor:{darwin:["/Applications/Cursor.app/Contents/Resources/app/bin/cursor"],win32:["%LOCALAPPDATA%\\Programs\\cursor\\resources\\app\\bin\\cursor.cmd"]},windsurf:{darwin:["/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"],win32:["%LOCALAPPDATA%\\Programs\\Windsurf\\bin\\windsurf.cmd"]},zed:{darwin:["/Applications/Zed.app/Contents/MacOS/cli"]},subl:{darwin:["/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"],win32:["%ProgramFiles%\\Sublime Text\\subl.exe","%ProgramFiles%\\Sublime Text 3\\subl.exe"]},idea:{darwin:["/Applications/IntelliJ IDEA.app/Contents/MacOS/idea","/Applications/IntelliJ IDEA CE.app/Contents/MacOS/idea"]},webstorm:{darwin:["/Applications/WebStorm.app/Contents/MacOS/webstorm"]},pycharm:{darwin:["/Applications/PyCharm.app/Contents/MacOS/pycharm","/Applications/PyCharm CE.app/Contents/MacOS/pycharm"]},goland:{darwin:["/Applications/GoLand.app/Contents/MacOS/goland"]},rubymine:{darwin:["/Applications/RubyMine.app/Contents/MacOS/rubymine"]},phpstorm:{darwin:["/Applications/PhpStorm.app/Contents/MacOS/phpstorm"]},clion:{darwin:["/Applications/CLion.app/Contents/MacOS/clion"]},rider:{darwin:["/Applications/Rider.app/Contents/MacOS/rider"]}};async function k(e,t={}){let r=t.platform??process.platform,n=t.env??process.env,o=await i(e,t);if(o)return o;for(let t of v[e]?.[r]??[]){let e=s(r)?function(e,t){return e.replace(/%([^%]+)%/g,(e,r)=>{let n=t[r];if(void 0!==n)return n;let s=Object.keys(t).find(e=>e.toLowerCase()===r.toLowerCase());return s?t[s]??e:e})}(t,n):t;if(await p(e,r))return e}return null}async function S(e=process.platform){let t=[];for(let r of y){let n=!!await k(r.command,{platform:e});t.push({name:r.name,command:r.command,installed:n})}return t}e.s(["detectEditors",0,S,"detectShells",0,m,"detectTerminalApps",0,w,"ensurePathInEnv",0,function(e,t=process.platform){let r=s(t)?"Path":"PATH";return(e.PATH??e.Path??"").length>0?e:{...e,[r]:function(e=process.platform){return s(e)?"C:\\Windows\\System32;C:\\Windows;C:\\Windows\\System32\\Wbem":"/usr/local/bin:/opt/homebrew/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin"}(t)}},"isWindows",0,s,"resolveCommandPath",0,i,"resolveCommandPathSync",0,c,"resolveSdkExecutable",0,function(e,r=process.platform,o=e=>(0,t.readFileSync)(e,"utf-8"),a=e=>(0,t.existsSync)(e)){if(!s(r))return e;let i=n.default.extname(e).toLowerCase();if(".cmd"!==i&&".bat"!==i)return e;let l=n.default.win32.dirname(e),c="",d=e=>{let t=e.replace(/%~?dp0%/gi,l).replace(/\//g,"\\");return n.default.win32.isAbsolute(t)?n.default.win32.normalize(t):n.default.win32.resolve(l,t)};try{let t=o(e);c=t.replace(/\s+/g," ").slice(0,400);let r=t.match(/"([^"]*\.(?:c?js|mjs))"/i);if(r){let e=d(r[1]);if(a(e))return e;console.error(`[resolveSdkExecutable] parsed cli="${e}" but it doesn't exist`)}for(let e of t.matchAll(/"([^"]*\.exe)"/gi)){let t=d(e[1]);if("node.exe"!==n.default.win32.basename(t).toLowerCase()&&a(t))return t}}catch(e){console.error(`[resolveSdkExecutable] shim read failed: ${e instanceof Error?e.message:e}`)}let u=n.default.win32.join(l,"node_modules","@anthropic-ai","claude-code"),p=n.default.win32.basename(e,n.default.win32.extname(e)),m=[n.default.win32.join(u,"cli.js"),n.default.win32.join(u,"bin",`${p}.exe`)];for(let e of m)if(a(e))return e;return console.error(`[resolveSdkExecutable] could not convert ${e} → guesses=${JSON.stringify(m)} shim="${c}"`),e},"resolveSpawnTarget",0,d,"resolveSpawnTargetSync",0,function(e,t,r=process.platform,n){return u(c(e,r,n),t,process.env,r)},"stripClaudeNestingEnv",0,function(e){let t={...e};for(let e of a)delete t[e];return t}])},53674,e=>{"use strict";e.s(["getPackageRoot",0,function(){return process.env.TOWER_PACKAGE_ROOT||process.cwd()}])},472129,e=>{"use strict";var t=e.i(902157),r=e.i(660526),n=e.i(750227),s=e.i(769310),o=e.i(53674);let a=["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"];e.s(["ClaudeCliAdapter",0,class{buildSpawnArgs(e){let t=["--dangerously-skip-permissions"];e.extraArgs?.length&&t.push(...e.extraArgs),e.resumeSessionId?t.push("--resume",e.resumeSessionId):e.continueLatest?t.push("--continue"):e.prompt&&t.push(e.prompt);let r={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:r}}buildEnvOverrides(e){let t={TOWER_TASK_ID:e.taskId,TOWER_TASK_TITLE:e.taskTitle,TOWER_STARTED_AT:new Date().toISOString(),TOWER_API_URL:e.apiUrl};return e.callbackUrl&&(t.CALLBACK_URL=e.callbackUrl),t}async installHooks(e){try{let e=this.readSettings(),t=e.hooks??{},r=(0,o.getPackageRoot)().replace(/\\/g,"/"),s=n.join(r,"scripts","session-start-hook.js").replace(/\\/g,"/"),a=n.join(r,"scripts","post-tool-hook.js").replace(/\\/g,"/"),i=n.join(r,"scripts","stop-hook.js").replace(/\\/g,"/"),l=!1;return l=this.upsertHook(t,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${s}"`,timeout:5,type:"command"}]})||l,l=this.upsertHook(t,"PostToolUse","post-tool-hook.js",{hooks:[{command:`node "${a}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||l,(l=this.upsertHook(t,"Stop","stop-hook.js",{hooks:[{command:`node "${i}"`,timeout:5,type:"command"}]})||l)&&(e.hooks=t,this.writeSettings(e)),{ok:!0,method:"file",detail:this.getSettingsPath()}}catch(e){return{ok:!1,method:"file",detail:this.getSettingsPath(),error:e instanceof Error?e.message:String(e)}}}async repairHookPaths(){try{let e=this.readSettings(),t=e.hooks??{},r=(0,o.getPackageRoot)().replace(/\\/g,"/"),s=!1;for(let[e,o]of[["SessionStart","session-start-hook.js"],["PostToolUse","post-tool-hook.js"],["Stop","stop-hook.js"]]){let a=this.getHookArray(t,e),i=a.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(o)));if(i<0)continue;let l=n.join(r,"scripts",o).replace(/\\/g,"/"),c=`node "${l}"`,d=a[i]?.hooks?.[0];d&&d.command!==c&&(d.command=c,t[e]=a,s=!0)}s&&(e.hooks=t,this.writeSettings(e))}catch{}}upsertHook(e,t,r,n){let s=this.getHookArray(e,t),o=n?.hooks?.[0]?.command,a=s.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(r)));if(a>=0){if(s[a]?.hooks?.[0]?.command===o)return!1;s.splice(a,1)}return s.push(n),e[t]=s,!0}async uninstallHooks(){try{let e=this.readSettings(),t=e.hooks??{},r=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let e of["SessionStart","PostToolUse","Stop"]){let n=this.getHookArray(t,e);t[e]=n.filter(e=>!e.hooks?.some(e=>r.some(t=>e.command?.includes(t))))}return e.hooks=t,this.writeSettings(e),{ok:!0,method:"file",detail:this.getSettingsPath()}}catch(e){return{ok:!1,method:"file",detail:this.getSettingsPath(),error:e instanceof Error?e.message:String(e)}}}async isHooksInstalled(){let e=this.readSettings().hooks??{},t=this.getHookArray(e,"PostToolUse");return this.hasHook(t,"post-tool-hook.js")}async installMcp(e,t={}){let r=t.scope??"user",n={command:e.command,args:e.args};e.env&&Object.keys(e.env).length>0&&(n.env=e.env);let s=this.resolveCommand(),o=["mcp","add-json","-s",r,e.name,JSON.stringify(n)];try{return await this.runCli(s,["mcp","remove","-s",r,e.name],t.cwd).catch(()=>{}),await this.runCli(s,o,t.cwd),{ok:!0,method:"cli",detail:`${s} ${o.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${s} ${o.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let r=t.scope??"user",n=this.resolveCommand(),s=["mcp","remove","-s",r,e];try{return await this.runCli(n,s,t.cwd),{ok:!0,method:"cli",detail:`${n} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${n} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,t={}){let r=this.resolveCommand();try{return await this.runCli(r,["mcp","get",e],t.cwd,5e3),!0}catch{return!1}}async installSkill(e,r){let o=n.join(this.getConfigDir(),"skills",e);try{if(!t.existsSync(r))return{ok:!1,method:"symlink",detail:o,error:`Source skill dir does not exist: ${r}`};t.mkdirSync(n.dirname(o),{recursive:!0});let e=await t.promises.lstat(o).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,s.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:o,error:`Refusing to overwrite non-symlink at ${o}`};else try{let e=await t.promises.readlink(o);if(n.resolve(e)===n.resolve(r))return{ok:!0,method:"symlink",detail:`${o} → ${r} (already)`};await t.promises.unlink(o)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:o,error:`Refusing to overwrite non-symlink at ${o}`}}let a=(0,s.isWindows)()?"junction":"dir";return await t.promises.symlink(r,o,a),{ok:!0,method:"symlink",detail:`${o} → ${r}`}}catch(e){return{ok:!1,method:"symlink",detail:o,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let r=n.join(this.getConfigDir(),"skills",e);try{let e=await t.promises.lstat(r).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${r} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:r,error:`Refusing to remove non-symlink at ${r}`};return await t.promises.unlink(r),{ok:!0,method:"symlink",detail:r}}catch(e){return{ok:!1,method:"symlink",detail:r,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,r){let s=n.join(this.getConfigDir(),"skills",e);try{if(!(await t.promises.lstat(s)).isSymbolicLink())return!1;if(!r)return!0;let e=await t.promises.readlink(s),o=n.isAbsolute(e)?e:n.resolve(n.dirname(s),e);return n.resolve(o)===n.resolve(r)}catch{return!1}}async runCli(t,r,n,s=1e4){let{execFile:o}=await e.A(482848),{promisify:a}=await e.A(268548),i=a(o),{stdout:l}=await i(t,r,{cwd:n,timeout:s});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:r}=await e.A(534777),{resolveSpawnTarget:n}=await e.A(200628),s=r(t),o=await n(this.resolveCommand(),["--version"]),{stdout:a}=await s(o.command,o.args,{timeout:5e3});return a.trim()||null}catch{return null}}async getModels(){return a}getConfigDir(){return n.join(r.homedir(),".claude")}getSettingsPath(){return n.join(this.getConfigDir(),"settings.json")}getSessionsDir(){return n.join(this.getConfigDir(),"projects")}getApiKeyInfo(){return{envVar:"ANTHROPIC_API_KEY",required:!1}}buildHelloProbeArgs(e){return{command:this.resolveCommand(),args:["--print",e,"--output-format","stream-json","--verbose"]}}resolveCommand(){if(process.env.CLAUDE_CODE_PATH)return process.env.CLAUDE_CODE_PATH;if((0,s.isWindows)()){let e=(0,s.resolveCommandPathSync)("claude-code");if("claude-code"!==e)return e}return(0,s.resolveCommandPathSync)("claude")}readSettings(){try{return JSON.parse(t.readFileSync(this.getSettingsPath(),"utf-8"))}catch{return{}}}writeSettings(e){let r=this.getConfigDir();t.existsSync(r)||t.mkdirSync(r,{recursive:!0}),t.writeFileSync(this.getSettingsPath(),JSON.stringify(e,null,2),"utf-8")}getHookArray(e,t){let r=e[t];return Array.isArray(r)?r:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}])},212019,e=>{"use strict";var t=e.i(765876),r=e.i(675896),n=e.i(959160),s=e.i(97944),o=e.i(86757),a=e.i(204144),i=e.i(273436),l=e.i(743641),c=e.i(813766),d=e.i(840884),u=e.i(498814),p=e.i(780006),m=e.i(544432),h=e.i(772005),f=e.i(450223),g=e.i(193695);e.i(628400);var w=e.i(800071),y=e.i(855104),v=e.i(198840),k=e.i(750227),S=e.i(472129),C=e.i(53674);let A=new S.ClaudeCliAdapter;async function b(e){let t=(0,v.requireLocalhost)(e);if(t)return t;let r=await A.isHooksInstalled(),n=k.join((0,C.getPackageRoot)(),"scripts","post-tool-hook.js");return y.NextResponse.json({installed:r,hookPath:n})}async function x(e){let t=(0,v.requireLocalhost)(e);if(t)return t;let r=process.env.NEXTAUTH_URL??`http://localhost:${process.env.PORT??3e3}`;return await A.installHooks(r),y.NextResponse.json({success:!0})}async function E(e){let t=(0,v.requireLocalhost)(e);return t||(await A.uninstallHooks(),y.NextResponse.json({success:!0}))}e.s(["DELETE",0,E,"GET",0,b,"POST",0,x,"dynamic",0,"force-dynamic","runtime",0,"nodejs"],730599);var P=e.i(730599);let R=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/internal/hooks/install/route",pathname:"/api/internal/hooks/install",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/internal/hooks/install/route.ts",nextConfigOutput:"standalone",userland:P}),{workAsyncStorage:j,workUnitAsyncStorage:T,serverHooks:O}=R;async function _(e,t,n){n.requestMeta&&(0,s.setRequestMeta)(e,n.requestMeta),R.isDev&&(0,s.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let y="/api/internal/hooks/install/route";y=y.replace(/\/index$/,"")||"/";let v=await R.prepare(e,t,{srcPage:y,multiZoneDraftMode:!1});if(!v)return t.statusCode=400,t.end("Bad Request"),null==n.waitUntil||n.waitUntil.call(n,Promise.resolve()),null;let{buildId:k,params:S,nextConfig:C,parsedUrl:A,isDraftMode:b,prerenderManifest:x,routerServerContext:E,isOnDemandRevalidate:P,revalidateOnlyGenerated:j,resolvedPathname:T,clientReferenceManifest:O,serverActionsManifest:_}=v,I=(0,i.normalizeAppPath)(y),N=!!(x.dynamicRoutes[I]||x.routes[T]),D=async()=>((null==E?void 0:E.render404)?await E.render404(e,t,A,!1):t.end("This page could not be found"),null);if(N&&!b){let e=!!x.routes[T],t=x.dynamicRoutes[I];if(t&&!1===t.fallback&&!e){if(C.adapterPath)return await D();throw new g.NoFallbackError}}let H=null;!N||R.isDev||b||(H="/index"===(H=T)?"/":H);let L=!0===R.isDev||!N,$=N&&!L;_&&O&&(0,a.setManifestsSingleton)({page:y,clientReferenceManifest:O,serverActionsManifest:_});let M=e.method||"GET",U=(0,o.getTracer)(),q=U.getActiveScopeSpan(),W=!!(null==E?void 0:E.isWrappedByNextServer),F=!!(0,s.getRequestMeta)(e,"minimalMode"),K=(0,s.getRequestMeta)(e,"incrementalCache")||await R.getIncrementalCache(e,C,x,F);null==K||K.resetRequestCache(),globalThis.__incrementalCache=K;let B={params:S,previewProps:x.preview,renderOpts:{experimental:{authInterrupts:!!C.experimental.authInterrupts},cacheComponents:!!C.cacheComponents,supportsDynamicResponse:L,incrementalCache:K,cacheLifeProfiles:C.cacheLife,waitUntil:n.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,n,s)=>R.onRequestError(e,t,n,s,E)},sharedContext:{buildId:k}},V=new l.NodeNextRequest(e),G=new l.NodeNextResponse(t),z=c.NextRequestAdapter.fromNodeNextRequest(V,(0,c.signalFromNodeResponse)(t));try{let s,a=async e=>R.handle(z,B).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=U.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let n=r.get("next.route");if(n){let t=`${M} ${n}`;e.setAttributes({"next.route":n,"http.route":n,"next.span_name":t}),e.updateName(t),s&&s!==e&&(s.setAttribute("http.route",n),s.updateName(t))}else e.updateName(`${M} ${y}`)}),i=async s=>{var o,i;let l=async({previousCacheEntry:r})=>{try{if(!F&&P&&j&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let o=await a(s);e.fetchMetrics=B.renderOpts.fetchMetrics;let i=B.renderOpts.pendingWaitUntil;i&&n.waitUntil&&(n.waitUntil(i),i=void 0);let l=B.renderOpts.collectedTags;if(!N)return await (0,p.sendResponse)(V,G,o,B.renderOpts.pendingWaitUntil),null;{let e=await o.blob(),t=(0,m.toNodeOutgoingHttpHeaders)(o.headers);l&&(t[f.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==B.renderOpts.collectedRevalidate&&!(B.renderOpts.collectedRevalidate>=f.INFINITE_CACHE)&&B.renderOpts.collectedRevalidate,n=void 0===B.renderOpts.collectedExpire||B.renderOpts.collectedExpire>=f.INFINITE_CACHE?void 0:B.renderOpts.collectedExpire;return{value:{kind:w.CachedRouteKind.APP_ROUTE,status:o.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:n}}}}catch(t){throw(null==r?void 0:r.isStale)&&await R.onRequestError(e,t,{routerKind:"App Router",routePath:y,routeType:"route",revalidateReason:(0,u.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:P})},!1,E),t}},c=await R.handleResponse({req:e,nextConfig:C,cacheKey:H,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:x,isRoutePPREnabled:!1,isOnDemandRevalidate:P,revalidateOnlyGenerated:j,responseGenerator:l,waitUntil:n.waitUntil,isMinimalMode:F});if(!N)return null;if((null==c||null==(o=c.value)?void 0:o.kind)!==w.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==c||null==(i=c.value)?void 0:i.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});F||t.setHeader("x-nextjs-cache",P?"REVALIDATED":c.isMiss?"MISS":c.isStale?"STALE":"HIT"),b&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let d=(0,m.fromNodeOutgoingHttpHeaders)(c.value.headers);return F&&N||d.delete(f.NEXT_CACHE_TAGS_HEADER),!c.cacheControl||t.getHeader("Cache-Control")||d.get("Cache-Control")||d.set("Cache-Control",(0,h.getCacheControlHeader)(c.cacheControl)),await (0,p.sendResponse)(V,G,new Response(c.value.body,{headers:d,status:c.value.status||200})),null};W&&q?await i(q):(s=U.getActiveScopeSpan(),await U.withPropagatedContext(e.headers,()=>U.trace(d.BaseServerSpan.handleRequest,{spanName:`${M} ${y}`,kind:o.SpanKind.SERVER,attributes:{"http.method":M,"http.target":e.url}},i),void 0,!W))}catch(t){if(t instanceof g.NoFallbackError||await R.onRequestError(e,t,{routerKind:"App Router",routePath:I,routeType:"route",revalidateReason:(0,u.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:P})},!1,E),N)throw t;return await (0,p.sendResponse)(V,G,new Response(null,{status:500})),null}}e.s(["handler",0,_,"patchFetch",0,function(){return(0,n.patchFetch)({workAsyncStorage:j,workUnitAsyncStorage:T})},"routeModule",0,R,"serverHooks",0,O,"workAsyncStorage",0,j,"workUnitAsyncStorage",0,T],212019)},482848,e=>{e.v(e=>Promise.resolve().then(()=>e(874533)))},268548,e=>{e.v(t=>Promise.all(["server/chunks/[externals]_node_util_0xr.y7p._.js"].map(t=>e.l(t))).then(()=>t(812057)))},144264,e=>{e.v(t=>Promise.all(["server/chunks/[externals]_child_process_0pwkpv9._.js"].map(t=>e.l(t))).then(()=>t(233405)))},534777,e=>{e.v(t=>Promise.all(["server/chunks/[externals]_util_0wtvqkc._.js"].map(t=>e.l(t))).then(()=>t(224361)))},200628,e=>{e.v(e=>Promise.resolve().then(()=>e(769310)))}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__0.tbb~k._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[660526,(e,t,s)=>{t.exports=e.x("node:os",()=>require("node:os"))},933919,(e,t,s)=>{t.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},843793,e=>{"use strict";var t=e.i(933919);let s=globalThis.prisma??new t.PrismaClient({log:[]});process.on("SIGTERM",()=>{s.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{s.$disconnect().catch(()=>{})}),e.s(["db",0,s])},192520,e=>{"use strict";let t;var s=e.i(750227),r=e.i(660526),i=e.i(902157);function n(){return t||(t=process.env.TOWER_DATA_DIR||(0,s.join)((0,r.homedir)(),".tower"),(0,i.existsSync)(t)||(0,i.mkdirSync)(t,{recursive:!0})),t}e.s(["getAssistantDir",0,function(){let e=(0,s.join)(n(),"assistant");return(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e},"getBackupsDir",0,function(){let e=(0,s.join)(n(),"backups");return(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e},"getExtensionsDir",0,function(){let e=(0,s.join)(n(),"extensions");return(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e},"getStorageDir",0,function(){let e=process.env.TOWER_STORAGE_DIR||function(){try{let e=(0,i.readFileSync)((0,s.join)(n(),"storage-location"),"utf-8").trim();return e.length>0?e:null}catch{return null}}(),t=e&&e.length>0?e:(0,s.join)(n(),"storage");return(0,i.existsSync)(t)||(0,i.mkdirSync)(t,{recursive:!0}),t},"getTowerDbPath",0,function(){let e;return(0,s.join)((e=(0,s.join)(n(),"database"),(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e),"tower.db")},"getTowerDir",0,n])},540193,e=>{"use strict";var t=e.i(750227),s=e.i(902157),r=e.i(192520),i=e.i(843793);function n(e,s){let i=(0,r.getStorageDir)(),n=t.resolve(i,"assets",e,s),c=t.resolve(i,"assets")+t.sep;return n.startsWith(c)?{resolved:n,error:null}:{resolved:null,error:"Invalid path"}}async function c(e,t){let{resolved:r}=n(e,t);if(r&&(0,s.existsSync)(r))return r;let c=await i.db.projectAsset.findFirst({where:{projectId:e,filename:t},select:{path:!0},orderBy:{createdAt:"desc"}});return c?.path&&(0,s.existsSync)(c.path)?c.path:null}async function a(e){return null!==await i.db.projectAsset.findFirst({where:{path:e},select:{id:!0}})}e.s(["MIME_MAP",0,{".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".pdf":"application/pdf",".txt":"text/plain",".md":"text/markdown",".json":"application/json"},"isRegisteredAssetPath",0,a,"resolveAssetFile",0,c,"resolveAssetPath",0,n])},487083,e=>{"use strict";var t=e.i(540193);e.s(["isRegisteredAssetPath",()=>t.isRegisteredAssetPath],487083)}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__032d9pl._.js.map