tower-studio 0.2.42 → 0.2.43

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 (391) 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 +27 -27
  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 +3 -3
  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.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js +1 -1
  25. package/.next/standalone/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/internal/assets/reveal/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/internal/assistant/attachments/route.js +1 -1
  28. package/.next/standalone/.next/server/app/api/internal/assistant/attachments/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/internal/assistant/chat/route.js +3 -3
  30. package/.next/standalone/.next/server/app/api/internal/assistant/chat/route.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/api/internal/assistant/route.js +2 -2
  32. package/.next/standalone/.next/server/app/api/internal/assistant/route.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js +1 -1
  34. package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js +1 -1
  36. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js +1 -1
  38. package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js +3 -2
  40. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js +1 -1
  42. package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js +2 -2
  44. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js +2 -2
  46. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js +1 -1
  48. package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js +1 -1
  50. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js +1 -1
  52. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route/app-paths-manifest.json +3 -0
  54. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route/build-manifest.json +9 -0
  55. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route/server-reference-manifest.json +4 -0
  56. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js +8 -0
  57. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js.nft.json +1 -0
  58. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route_client-reference-manifest.js +3 -0
  59. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js +4 -3
  60. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js.nft.json +1 -1
  61. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js +6 -5
  62. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js +4 -3
  64. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js +1 -1
  66. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js.nft.json +1 -1
  67. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js +1 -1
  68. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js.nft.json +1 -1
  69. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js +3 -3
  70. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/missions/page/react-loadable-manifest.json +2 -2
  72. package/.next/standalone/.next/server/app/missions/page/server-reference-manifest.json +64 -64
  73. package/.next/standalone/.next/server/app/missions/page.js +6 -6
  74. package/.next/standalone/.next/server/app/missions/page.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/onboarding/page/react-loadable-manifest.json +3 -3
  77. package/.next/standalone/.next/server/app/onboarding/page/server-reference-manifest.json +27 -27
  78. package/.next/standalone/.next/server/app/onboarding/page.js +6 -6
  79. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +3 -3
  82. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +27 -27
  83. package/.next/standalone/.next/server/app/page.js +6 -6
  84. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +3 -3
  87. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +44 -44
  88. package/.next/standalone/.next/server/app/settings/page.js +6 -6
  89. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/react-loadable-manifest.json +3 -3
  92. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/server-reference-manifest.json +109 -109
  93. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js +6 -6
  94. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/react-loadable-manifest.json +3 -3
  97. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/server-reference-manifest.json +88 -88
  98. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js +6 -6
  99. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/react-loadable-manifest.json +3 -3
  102. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/server-reference-manifest.json +75 -75
  103. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js +6 -6
  104. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/react-loadable-manifest.json +3 -3
  107. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/server-reference-manifest.json +75 -75
  108. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js +6 -6
  109. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js.nft.json +1 -1
  110. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/react-loadable-manifest.json +3 -3
  112. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/server-reference-manifest.json +27 -27
  113. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js +7 -7
  114. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js.nft.json +1 -1
  115. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/react-loadable-manifest.json +3 -3
  117. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/server-reference-manifest.json +67 -67
  118. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js +6 -6
  119. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/react-loadable-manifest.json +4 -4
  122. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/server-reference-manifest.json +79 -79
  123. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js +6 -6
  124. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js.nft.json +1 -1
  125. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/workspaces/page/react-loadable-manifest.json +3 -3
  127. package/.next/standalone/.next/server/app/workspaces/page/server-reference-manifest.json +50 -50
  128. package/.next/standalone/.next/server/app/workspaces/page.js +6 -6
  129. package/.next/standalone/.next/server/app/workspaces/page.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/workspaces/page_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  132. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_03qwlhl.js +1 -1
  133. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_09pca3o.js +1 -1
  134. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0eh8dj_.js +1 -1
  135. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0h5yr8p.js +1 -1
  136. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0m8aavq.js +1 -1
  137. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0yp430z.js +1 -1
  138. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0yzw48x.js +1 -1
  139. package/.next/standalone/.next/server/chunks/0zjb_server_app_api_internal_terminal_[taskId]_paste-image_route_actions_0iegbi4.js +3 -0
  140. package/.next/standalone/.next/server/chunks/[externals]__0x_wqa7._.js +3 -0
  141. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-z_a1d._.js +1 -1
  142. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.p6em~._.js +3 -0
  143. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.zmhk-._.js +3 -0
  144. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0042hx5._.js +3 -0
  145. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0b3m.jm._.js → [root-of-the-server]__03ufxqq._.js} +3 -3
  146. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04--bs7._.js +3 -0
  147. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04m2l8a._.js +3 -0
  148. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04r193~._.js +3 -0
  149. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05abzth._.js +3 -0
  150. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0657y50._.js +3 -0
  151. package/.next/standalone/.next/server/chunks/[root-of-the-server]__075a0hk._.js +3 -0
  152. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08yqoti._.js +3 -0
  153. package/.next/standalone/.next/server/chunks/[root-of-the-server]__098.3z2._.js +3 -0
  154. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0obk~80._.js → [root-of-the-server]__0_d.s7s._.js} +3 -3
  155. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0askhfg._.js → [root-of-the-server]__0ajay8_._.js} +2 -2
  156. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b25v3p._.js +4 -0
  157. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xswbi9._.js → [root-of-the-server]__0clptds._.js} +2 -2
  158. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0ai09na._.js → [root-of-the-server]__0g.k9o~._.js} +2 -2
  159. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gn0ubd._.js +1 -1
  160. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gwztza._.js +1 -1
  161. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0h6bl6t._.js +3 -0
  162. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0iggiij._.js +3 -0
  163. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i~3dwq._.js +3 -0
  164. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j1px8f._.js +3 -0
  165. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k-5ag7._.js +3 -0
  166. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l1-djp._.js +1 -1
  167. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0-~q463._.js → [root-of-the-server]__0lvlooo._.js} +2 -2
  168. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0otyifi._.js +1 -1
  169. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0q~uf3u._.js +3 -0
  170. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t31ba_._.js +3 -0
  171. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t_weyi._.js +3 -0
  172. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__06qz5fz._.js → [root-of-the-server]__0uptkzd._.js} +3 -3
  173. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wkjqrd._.js +3 -0
  174. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x3kws1._.js +3 -0
  175. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xot7fu._.js +1 -1
  176. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0~6py0f._.js → [root-of-the-server]__0y8w5di._.js} +3 -3
  177. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~g6-c~._.js +3 -0
  178. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10fv6tt._.js +3 -0
  179. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1189rd1._.js +4 -0
  180. package/.next/standalone/.next/server/chunks/{_06.mxka._.js → _0jmdgq~._.js} +1 -1
  181. package/.next/standalone/.next/server/chunks/{_0aflzks._.js → _0q10iet._.js} +1 -1
  182. package/.next/standalone/.next/server/chunks/_0qk_esg._.js +2 -2
  183. package/.next/standalone/.next/server/chunks/_0t31z6q._.js +1 -1
  184. package/.next/standalone/.next/server/chunks/{_0b~hjvi._.js → _12537g8._.js} +1 -1
  185. package/.next/standalone/.next/server/chunks/src_0fq3zjg._.js +3 -0
  186. package/.next/standalone/.next/server/chunks/src_0weytpz._.js +1 -1
  187. package/.next/standalone/.next/server/chunks/src_0wlyw0g._.js +3 -0
  188. package/.next/standalone/.next/server/chunks/src_0~ey84y._.js +3 -0
  189. package/.next/standalone/.next/server/chunks/src_actions_agent-actions_ts_10q9r5b._.js +2 -2
  190. package/.next/standalone/.next/server/chunks/ssr/0iu._[workspaceId]_projects_[projectId]_versions_version-timeline-client_tsx_07o_kyi._.js +1 -1
  191. package/.next/standalone/.next/server/chunks/ssr/0se9_next_11h0sx_._.js +1 -1
  192. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00dh103._.js +3 -0
  193. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0mmypbn._.js → [root-of-the-server]__00ebsjb._.js} +1 -1
  194. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0c2mh1c._.js → [root-of-the-server]__01vm_46._.js} +4 -4
  195. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__025ol9g._.js +3 -0
  196. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__094t44p._.js → [root-of-the-server]__04ednzb._.js} +1 -1
  197. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04wbr9x._.js +1 -1
  198. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05xg05r._.js +1 -1
  199. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__065f3ii._.js +3 -0
  200. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0pmjob9._.js → [root-of-the-server]__06dfcgo._.js} +1 -1
  201. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__038u_kv._.js → [root-of-the-server]__07xkj1s._.js} +4 -4
  202. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08k-xb7._.js +3 -0
  203. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08tzbfh._.js +3 -0
  204. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.infp2._.js → [root-of-the-server]__0_z5hke._.js} +1 -1
  205. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ce3fpq._.js → [root-of-the-server]__0ecd_1d._.js} +4 -4
  206. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__10s67lq._.js → [root-of-the-server]__0iln7n_._.js} +4 -4
  207. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__09z_ddd._.js → [root-of-the-server]__0j_-qk5._.js} +1 -1
  208. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0jymb~t._.js +1 -1
  209. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.u-t.1._.js → [root-of-the-server]__0k6oo0n._.js} +1 -1
  210. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0h589~0._.js → [root-of-the-server]__0lws68d._.js} +4 -4
  211. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0oq-j16._.js → [root-of-the-server]__0oamph.._.js} +4 -4
  212. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0pvaj~l._.js → [root-of-the-server]__0pnv7nd._.js} +1 -1
  213. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0whlq2_._.js → [root-of-the-server]__0stlq2_._.js} +2 -2
  214. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__03fujv7._.js → [root-of-the-server]__0tja~wz._.js} +1 -1
  215. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0391jsv._.js → [root-of-the-server]__0ug022w._.js} +1 -1
  216. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0l6bt9t._.js → [root-of-the-server]__0x6k.ee._.js} +1 -1
  217. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0dsaqeq._.js → [root-of-the-server]__0xr45lx._.js} +2 -2
  218. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__058rbx5._.js → [root-of-the-server]__0xwzk2.._.js} +4 -4
  219. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__12w35bx._.js → [root-of-the-server]__0yby8pl._.js} +4 -4
  220. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0z7je5_._.js +1 -1
  221. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0rckee~._.js → [root-of-the-server]__0zxc81t._.js} +1 -1
  222. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0dux7x.._.js → [root-of-the-server]__0zzqn5z._.js} +1 -1
  223. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0mq0f94._.js → [root-of-the-server]__10c.a3u._.js} +1 -1
  224. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0.2h0ux._.js → [root-of-the-server]__10n3vn6._.js} +1 -1
  225. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__09t~p.u._.js → [root-of-the-server]__123rmyb._.js} +1 -1
  226. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__124zb~p._.js +30 -0
  227. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__02j1enz._.js → [root-of-the-server]__127w3bm._.js} +1 -1
  228. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0h-se8t._.js → [root-of-the-server]__12ko8p6._.js} +2 -2
  229. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0odeai5._.js → [root-of-the-server]__13ce7v2._.js} +1 -1
  230. package/.next/standalone/.next/server/chunks/ssr/_0-~9em3._.js +1 -1
  231. package/.next/standalone/.next/server/chunks/ssr/{_0f~l8kv._.js → _00l85fp._.js} +3 -3
  232. package/.next/standalone/.next/server/chunks/ssr/{_0c2gong._.js → _00odlgv._.js} +2 -2
  233. package/.next/standalone/.next/server/chunks/ssr/{_0whlnt7._.js → _0463zy~._.js} +2 -2
  234. package/.next/standalone/.next/server/chunks/ssr/{_0rq68d8._.js → _047dh-f._.js} +2 -2
  235. package/.next/standalone/.next/server/chunks/ssr/{_03lt1_x._.js → _05a2u03._.js} +4 -4
  236. package/.next/standalone/.next/server/chunks/ssr/{_0_5abui._.js → _05k76ur._.js} +2 -2
  237. package/.next/standalone/.next/server/chunks/ssr/{_0n4bq0m._.js → _060e1u.._.js} +1 -1
  238. package/.next/standalone/.next/server/chunks/ssr/_070t_mh._.js +2 -2
  239. package/.next/standalone/.next/server/chunks/ssr/{_0n5do.z._.js → _07lq-bp._.js} +1 -1
  240. package/.next/standalone/.next/server/chunks/ssr/{_0p6p_68._.js → _07q06~v._.js} +4 -4
  241. package/.next/standalone/.next/server/chunks/ssr/{_0mm~wxj._.js → _08-x_rp._.js} +1 -1
  242. package/.next/standalone/.next/server/chunks/ssr/_08bq4g8._.js +1 -1
  243. package/.next/standalone/.next/server/chunks/ssr/{_12ca88g._.js → _0_q41~z._.js} +4 -4
  244. package/.next/standalone/.next/server/chunks/ssr/{_0o2tntr._.js → _0b7smy6._.js} +2 -2
  245. package/.next/standalone/.next/server/chunks/ssr/_0cj9a7y._.js +1 -1
  246. package/.next/standalone/.next/server/chunks/ssr/{_0u7c6bz._.js → _0dxbp89._.js} +4 -4
  247. package/.next/standalone/.next/server/chunks/ssr/{_0axcfvf._.js → _0gkid_a._.js} +2 -2
  248. package/.next/standalone/.next/server/chunks/ssr/{_0tvm5af._.js → _0j5.ig_._.js} +1 -1
  249. package/.next/standalone/.next/server/chunks/ssr/{_0py1s-f._.js → _0nze-e6._.js} +1 -1
  250. package/.next/standalone/.next/server/chunks/ssr/{_0u.n7v8._.js → _0oeih09._.js} +2 -2
  251. package/.next/standalone/.next/server/chunks/ssr/_0rdyrfd._.js +1 -1
  252. package/.next/standalone/.next/server/chunks/ssr/{_0~oc5bl._.js → _0rrs.-d._.js} +2 -2
  253. package/.next/standalone/.next/server/chunks/ssr/{_0q2mf9q._.js → _0rtydyv._.js} +1 -1
  254. package/.next/standalone/.next/server/chunks/ssr/_0rxeqmo._.js +1 -1
  255. package/.next/standalone/.next/server/chunks/ssr/{_04bt0.3._.js → _0s.h4l2._.js} +1 -1
  256. package/.next/standalone/.next/server/chunks/ssr/{_09z2zmm._.js → _0s.ik0k._.js} +1 -1
  257. package/.next/standalone/.next/server/chunks/ssr/{_116-_2z._.js → _0syb503._.js} +2 -2
  258. package/.next/standalone/.next/server/chunks/ssr/{_0m.wslt._.js → _0uryq~z._.js} +2 -2
  259. package/.next/standalone/.next/server/chunks/ssr/_0wbcp88._.js +1 -1
  260. package/.next/standalone/.next/server/chunks/ssr/{_04~zqvy._.js → _0wqcz3w._.js} +4 -4
  261. package/.next/standalone/.next/server/chunks/ssr/{_0rrzd20._.js → _113957g._.js} +1 -1
  262. package/.next/standalone/.next/server/chunks/ssr/src_0djxlqx._.js +1 -1
  263. package/.next/standalone/.next/server/chunks/ssr/src_0eufeyj._.js +1 -1
  264. package/.next/standalone/.next/server/chunks/ssr/src_actions_agent-actions_ts_0~wc.sy._.js +1 -1
  265. package/.next/standalone/.next/server/chunks/ssr/src_actions_file-actions_ts_0gcvqwm._.js +1 -1
  266. package/.next/standalone/.next/server/chunks/ssr/src_app_missions_missions-client_tsx_11429lj._.js +1 -1
  267. package/.next/standalone/.next/server/chunks/ssr/src_app_onboarding_page_tsx_0xf7hpz._.js +1 -1
  268. package/.next/standalone/.next/server/chunks/ssr/src_app_settings_page_tsx_0h9v7dr._.js +1 -1
  269. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_assets_assets-page-client_tsx_0wyzpam._.js +1 -1
  270. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_board-page-client_tsx_0gips66._.js +1 -1
  271. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_notes_notes-page-client_tsx_10gyo3v._.js +1 -1
  272. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_tasks_[taskId]_task-page-client_tsx_02t7blt._.js +1 -1
  273. package/.next/standalone/.next/server/chunks/ssr/src_components_ui_select_tsx_0d2ra01._.js +1 -1
  274. package/.next/standalone/.next/server/chunks/ssr/{src_lib_0_9avpk._.js → src_lib_0.~.oo-._.js} +1 -1
  275. package/.next/standalone/.next/server/chunks/ssr/{src_lib_02~3_5t._.js → src_lib_005uqbe._.js} +1 -1
  276. package/.next/standalone/.next/server/chunks/ssr/{src_lib_04d~c.c._.js → src_lib_00wjv6n._.js} +1 -1
  277. package/.next/standalone/.next/server/chunks/ssr/{src_lib_08wv1le._.js → src_lib_01sr8_t._.js} +1 -1
  278. package/.next/standalone/.next/server/chunks/ssr/src_lib_08jql1e._.js +3 -0
  279. package/.next/standalone/.next/server/chunks/ssr/src_lib_0b~j-9d._.js +3 -0
  280. package/.next/standalone/.next/server/chunks/ssr/src_lib_0eymyjf._.js +3 -0
  281. package/.next/standalone/.next/server/chunks/ssr/src_lib_0fkv9z3._.js +3 -0
  282. package/.next/standalone/.next/server/chunks/ssr/src_lib_0n-n0.a._.js +3 -0
  283. package/.next/standalone/.next/server/chunks/ssr/src_lib_0sgt~lv._.js +3 -0
  284. package/.next/standalone/.next/server/chunks/ssr/src_lib_0x-iyl1._.js +3 -0
  285. package/.next/standalone/.next/server/chunks/ssr/src_lib_0yjmty1._.js +3 -0
  286. package/.next/standalone/.next/server/chunks/ssr/src_lib_13aevv6._.js +3 -0
  287. package/.next/standalone/.next/server/functions-config-manifest.json +1 -0
  288. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  289. package/.next/standalone/.next/server/pages/500.html +1 -1
  290. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  291. package/.next/standalone/.next/server/server-reference-manifest.json +246 -246
  292. package/.next/standalone/.next/static/chunks/{17fug-zaik-v~.js → 0-vgfstmpuwnx.js} +1 -1
  293. package/.next/standalone/.next/static/chunks/0.lyp-cx3zt9..js +2 -0
  294. package/.next/standalone/.next/static/chunks/{0clewc5ifaruu.js → 00z.kuqsfrxq5.js} +2 -2
  295. package/.next/standalone/.next/static/chunks/01j9m895w64zn.js +1 -0
  296. package/.next/standalone/.next/static/chunks/01rbl6a8z.tuw.js +1 -0
  297. package/.next/standalone/.next/static/chunks/{0.wxa05y455w7.js → 04op7bjge~n4l.js} +1 -1
  298. package/.next/standalone/.next/static/chunks/{13.3woq55msp..js → 05v-c3ir3ik_1.js} +1 -1
  299. package/.next/standalone/.next/static/chunks/{0bdwzhoelky9-.js → 070fs6rmafi.i.js} +1 -1
  300. package/.next/standalone/.next/static/chunks/07i9j5yyg4vs3.js +1 -0
  301. package/.next/standalone/.next/static/chunks/{040j8d.w8mkyn.js → 08i9.47-_mxro.js} +1 -1
  302. package/.next/standalone/.next/static/chunks/{0ypd9eqm_pj-o.js → 0_yp-y9l0upp~.js} +1 -1
  303. package/.next/standalone/.next/static/chunks/0ddt-snh45031.js +1 -0
  304. package/.next/standalone/.next/static/chunks/0evfu1ozaw5ak.js +1 -0
  305. package/.next/standalone/.next/static/chunks/{0wcwdbtpm0~r6.js → 0gq65t6au55oa.js} +1 -1
  306. package/.next/standalone/.next/static/chunks/0gz71w_~yw2iu.js +1 -0
  307. package/.next/standalone/.next/static/chunks/{0dewfthzwmcwb.js → 0hk3lmsij2x1c.js} +1 -1
  308. package/.next/standalone/.next/static/chunks/0j1hqwmeaqnn2.js +1 -0
  309. package/.next/standalone/.next/static/chunks/{0_d04kox03m72.css → 0jrje~1gt6w85.css} +1 -1
  310. package/.next/standalone/.next/static/chunks/0prrt_bws8ml6.js +1 -0
  311. package/.next/standalone/.next/static/chunks/0qgqjy.9.-qpi.js +1 -0
  312. package/.next/standalone/.next/static/chunks/{0m~m1~si.ot17.js → 0rfq8fy71hj7c.js} +1 -1
  313. package/.next/standalone/.next/static/chunks/{02f8-ju2se8qw.js → 0rjt_ddd~6t8r.js} +1 -1
  314. package/.next/standalone/.next/static/chunks/{0.onaugl2w8ci.js → 0rnitheqdpd1..js} +1 -1
  315. package/.next/standalone/.next/static/chunks/{035a_v6g7ioyw.js → 0sr-m2t6vck14.js} +1 -1
  316. package/.next/standalone/.next/static/chunks/{0rozlwh3y46l0.js → 0ts___1ygewqp.js} +1 -1
  317. package/.next/standalone/.next/static/chunks/0vmy6tsqy.xf4.js +1 -0
  318. package/.next/standalone/.next/static/chunks/0wbq-_8jyxjxm.js +1 -0
  319. package/.next/standalone/.next/static/chunks/0xejm4ge9~cn..js +1 -0
  320. package/.next/standalone/.next/static/chunks/0~prx0ure_1i6.js +1 -0
  321. package/.next/standalone/.next/static/chunks/1107zshxaajt9.js +1 -0
  322. package/.next/standalone/.next/static/chunks/{17m4o~gdsvuo3.js → 11p.r-9wyh7_2.js} +1 -1
  323. package/.next/standalone/.next/static/chunks/11x3_612u8w~9.js +1 -0
  324. package/.next/standalone/.next/static/chunks/14mk_a0k99wbg.js +1 -0
  325. package/.next/standalone/package.json +9 -9
  326. package/dist/mcp-server.cjs +131 -74
  327. package/next.config.ts +4 -0
  328. package/package.json +9 -9
  329. package/skills/tower/SKILL.md +6 -0
  330. package/.next/standalone/.next/server/chunks/[externals]__0izylsq._.js +0 -3
  331. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.tbb~k._.js +0 -3
  332. package/.next/standalone/.next/server/chunks/[root-of-the-server]__032d9pl._.js +0 -3
  333. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04jduyo._.js +0 -3
  334. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05zlbau._.js +0 -4
  335. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05~g1fm._.js +0 -3
  336. package/.next/standalone/.next/server/chunks/[root-of-the-server]__075f7rs._.js +0 -4
  337. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08b~~wj._.js +0 -3
  338. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bo_6v~._.js +0 -3
  339. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c7z.~a._.js +0 -3
  340. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e~6fr~._.js +0 -3
  341. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fey.8j._.js +0 -3
  342. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fxmnch._.js +0 -4
  343. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gr~8aq._.js +0 -3
  344. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0hd.0to._.js +0 -3
  345. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j3l3l4._.js +0 -3
  346. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r-6wmj._.js +0 -3
  347. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0rpck4h._.js +0 -3
  348. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0skk0fd._.js +0 -3
  349. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t_yyy8._.js +0 -3
  350. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0v2nkck._.js +0 -3
  351. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0z20rmt._.js +0 -3
  352. package/.next/standalone/.next/server/chunks/[root-of-the-server]__11l3gud._.js +0 -3
  353. package/.next/standalone/.next/server/chunks/[root-of-the-server]__126b53k._.js +0 -4
  354. package/.next/standalone/.next/server/chunks/src_02ruq-1._.js +0 -3
  355. package/.next/standalone/.next/server/chunks/src_07gek7k._.js +0 -3
  356. package/.next/standalone/.next/server/chunks/src_0mqkaid._.js +0 -3
  357. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.-z9ts._.js +0 -3
  358. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__045k323._.js +0 -3
  359. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__087pocz._.js +0 -3
  360. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0gt5dbj._.js +0 -3
  361. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ni-_7_._.js +0 -30
  362. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0y~ooou._.js +0 -3
  363. package/.next/standalone/.next/server/chunks/ssr/src_lib_0a60u40._.js +0 -3
  364. package/.next/standalone/.next/server/chunks/ssr/src_lib_0fu5szn._.js +0 -3
  365. package/.next/standalone/.next/server/chunks/ssr/src_lib_0gve57o._.js +0 -3
  366. package/.next/standalone/.next/server/chunks/ssr/src_lib_0koe0p0._.js +0 -3
  367. package/.next/standalone/.next/server/chunks/ssr/src_lib_0qdh-v4._.js +0 -3
  368. package/.next/standalone/.next/server/chunks/ssr/src_lib_0ramp4w._.js +0 -3
  369. package/.next/standalone/.next/server/chunks/ssr/src_lib_0sn1z-s._.js +0 -3
  370. package/.next/standalone/.next/server/chunks/ssr/src_lib_0x6grav._.js +0 -3
  371. package/.next/standalone/.next/server/chunks/ssr/src_lib_110am8v._.js +0 -3
  372. package/.next/standalone/.next/static/chunks/0-efd~h5j2ufi.js +0 -1
  373. package/.next/standalone/.next/static/chunks/0.z171pzeg-.7.js +0 -1
  374. package/.next/standalone/.next/static/chunks/01zlxs4rl~h_o.js +0 -1
  375. package/.next/standalone/.next/static/chunks/0af7afat3acfx.js +0 -1
  376. package/.next/standalone/.next/static/chunks/0ais32-8.3wlj.js +0 -1
  377. package/.next/standalone/.next/static/chunks/0f43x~jzb70f4.js +0 -1
  378. package/.next/standalone/.next/static/chunks/0i-x__600fys6.js +0 -1
  379. package/.next/standalone/.next/static/chunks/0l25d0nc5ygyd.js +0 -1
  380. package/.next/standalone/.next/static/chunks/0lyq0-a32.15m.js +0 -1
  381. package/.next/standalone/.next/static/chunks/0t8lz62rmr801.js +0 -2
  382. package/.next/standalone/.next/static/chunks/0utrquxfg25b2.js +0 -1
  383. package/.next/standalone/.next/static/chunks/0wcdxs4sl-gjf.js +0 -1
  384. package/.next/standalone/.next/static/chunks/0x-ug4iz~~qr2.js +0 -1
  385. package/.next/standalone/.next/static/chunks/0xj6v_80hlyv0.js +0 -1
  386. package/.next/standalone/.next/static/chunks/0xl7h5fsfc7zk.js +0 -1
  387. package/.next/standalone/.next/static/chunks/115ae91fq~slq.js +0 -1
  388. package/.next/standalone/.next/static/chunks/13rq33eiffqaz.js +0 -1
  389. /package/.next/standalone/.next/static/{LCBoYZWhXzs8PjuBmxw7g → d-Uhp63kgWdPkhPt7Fzyb}/_buildManifest.js +0 -0
  390. /package/.next/standalone/.next/static/{LCBoYZWhXzs8PjuBmxw7g → d-Uhp63kgWdPkhPt7Fzyb}/_clientMiddlewareManifest.js +0 -0
  391. /package/.next/standalone/.next/static/{LCBoYZWhXzs8PjuBmxw7g → d-Uhp63kgWdPkhPt7Fzyb}/_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;
@@ -26592,7 +26642,7 @@ function isWindows(platform = process.platform) {
26592
26642
  return platform === "win32";
26593
26643
  }
26594
26644
  function normalizePath(p2, platform = process.platform) {
26595
- const normalized = import_node_path2.default.normalize(p2);
26645
+ const normalized = import_node_path3.default.normalize(p2);
26596
26646
  if (isWindows(platform)) {
26597
26647
  return normalized.replace(/\//g, "\\");
26598
26648
  }
@@ -26643,16 +26693,16 @@ async function resolveCommandPath(command, opts = {}) {
26643
26693
  const platform = opts.platform ?? process.platform;
26644
26694
  const hasPathSeparator = command.includes("/") || command.includes("\\");
26645
26695
  if (hasPathSeparator) {
26646
- const absolute = import_node_path2.default.isAbsolute(command) ? command : import_node_path2.default.resolve(cwd, command);
26696
+ const absolute = import_node_path3.default.isAbsolute(command) ? command : import_node_path3.default.resolve(cwd, command);
26647
26697
  return await pathExists(absolute, platform) ? absolute : null;
26648
26698
  }
26649
26699
  const pathValue = env.PATH ?? env.Path ?? "";
26650
26700
  const delimiter = isWindows(platform) ? ";" : ":";
26651
26701
  const dirs = pathValue.split(delimiter).filter(Boolean);
26652
26702
  const exts = isWindows(platform) ? windowsPathExts(env) : [""];
26653
- const hasExtension = isWindows(platform) && import_node_path2.default.extname(command).length > 0;
26703
+ const hasExtension = isWindows(platform) && import_node_path3.default.extname(command).length > 0;
26654
26704
  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)];
26705
+ 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
26706
  for (const candidate of candidates) {
26657
26707
  if (await pathExists(candidate, platform)) return candidate;
26658
26708
  }
@@ -26660,7 +26710,7 @@ async function resolveCommandPath(command, opts = {}) {
26660
26710
  return null;
26661
26711
  }
26662
26712
  function resolveCommandPathSync(command, platform = process.platform, exec = defaultExecSync) {
26663
- if (import_node_path2.default.extname(command) || command.includes("/") || command.includes("\\")) {
26713
+ if (import_node_path3.default.extname(command) || command.includes("/") || command.includes("\\")) {
26664
26714
  return command;
26665
26715
  }
26666
26716
  if (!isWindows(platform)) {
@@ -26687,13 +26737,13 @@ function resolveCommandPathSync(command, platform = process.platform, exec = def
26687
26737
  }
26688
26738
  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
26739
  if (!isWindows(platform)) return command;
26690
- const ext = import_node_path2.default.extname(command).toLowerCase();
26740
+ const ext = import_node_path3.default.extname(command).toLowerCase();
26691
26741
  if (ext !== ".cmd" && ext !== ".bat") return command;
26692
- const dir = import_node_path2.default.win32.dirname(command);
26742
+ const dir = import_node_path3.default.win32.dirname(command);
26693
26743
  let shimSnippet = "";
26694
26744
  const expand = (raw) => {
26695
26745
  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);
26746
+ return import_node_path3.default.win32.isAbsolute(p2) ? import_node_path3.default.win32.normalize(p2) : import_node_path3.default.win32.resolve(dir, p2);
26697
26747
  };
26698
26748
  try {
26699
26749
  const shim = readFile2(command);
@@ -26706,17 +26756,17 @@ function resolveSdkExecutable(command, platform = process.platform, readFile2 =
26706
26756
  }
26707
26757
  for (const m2 of shim.matchAll(/"([^"]*\.exe)"/gi)) {
26708
26758
  const resolved = expand(m2[1]);
26709
- if (import_node_path2.default.win32.basename(resolved).toLowerCase() === "node.exe") continue;
26759
+ if (import_node_path3.default.win32.basename(resolved).toLowerCase() === "node.exe") continue;
26710
26760
  if (fileExists(resolved)) return resolved;
26711
26761
  }
26712
26762
  } catch (e2) {
26713
26763
  console.error(`[resolveSdkExecutable] shim read failed: ${e2 instanceof Error ? e2.message : e2}`);
26714
26764
  }
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));
26765
+ const pkgDir = import_node_path3.default.win32.join(dir, "node_modules", "@anthropic-ai", "claude-code");
26766
+ const base = import_node_path3.default.win32.basename(command, import_node_path3.default.win32.extname(command));
26717
26767
  const guesses = [
26718
- import_node_path2.default.win32.join(pkgDir, "cli.js"),
26719
- import_node_path2.default.win32.join(pkgDir, "bin", `${base}.exe`)
26768
+ import_node_path3.default.win32.join(pkgDir, "cli.js"),
26769
+ import_node_path3.default.win32.join(pkgDir, "bin", `${base}.exe`)
26720
26770
  ];
26721
26771
  for (const g10 of guesses) {
26722
26772
  if (fileExists(g10)) return g10;
@@ -26748,7 +26798,7 @@ function wrapForPlatform(executable, args, env, platform) {
26748
26798
  if (!isWindows(platform)) {
26749
26799
  return { command: executable, args };
26750
26800
  }
26751
- const ext = import_node_path2.default.extname(executable).toLowerCase();
26801
+ const ext = import_node_path3.default.extname(executable).toLowerCase();
26752
26802
  if (ext === ".cmd" || ext === ".bat" || ext === ".com") {
26753
26803
  const shell = env.ComSpec || "cmd.exe";
26754
26804
  const commandLine = [quoteForCmd(executable), ...args.map(quoteForCmd)].join(" ");
@@ -26782,7 +26832,7 @@ async function detectUnixShells() {
26782
26832
  const line = raw.replace(/#.*/, "").trim();
26783
26833
  if (!line || !line.startsWith("/")) continue;
26784
26834
  if (!await pathExists(line)) continue;
26785
- let name = import_node_path2.default.basename(line);
26835
+ let name = import_node_path3.default.basename(line);
26786
26836
  const count = seen.get(name) ?? 0;
26787
26837
  seen.set(name, count + 1);
26788
26838
  if (count > 0) name = `${name} (${count + 1})`;
@@ -26793,7 +26843,7 @@ async function detectUnixShells() {
26793
26843
  const defaults = ["/bin/zsh", "/bin/bash", "/bin/sh"];
26794
26844
  const shells = [];
26795
26845
  for (const p2 of defaults) {
26796
- if (await pathExists(p2)) shells.push({ name: import_node_path2.default.basename(p2), path: p2 });
26846
+ if (await pathExists(p2)) shells.push({ name: import_node_path3.default.basename(p2), path: p2 });
26797
26847
  }
26798
26848
  return shells;
26799
26849
  }
@@ -26803,28 +26853,28 @@ async function detectWindowsShells() {
26803
26853
  const gitBashCandidates = [];
26804
26854
  const gitPath = await resolveCommandPath("git", { platform: "win32" });
26805
26855
  if (gitPath) {
26806
- const gitRoot = import_node_path2.default.resolve(import_node_path2.default.dirname(gitPath), "..", "..");
26856
+ const gitRoot = import_node_path3.default.resolve(import_node_path3.default.dirname(gitPath), "..", "..");
26807
26857
  gitBashCandidates.push(
26808
- import_node_path2.default.join(gitRoot, "bin", "bash.exe"),
26809
- import_node_path2.default.join(gitRoot, "usr", "bin", "bash.exe")
26858
+ import_node_path3.default.join(gitRoot, "bin", "bash.exe"),
26859
+ import_node_path3.default.join(gitRoot, "usr", "bin", "bash.exe")
26810
26860
  );
26811
26861
  }
26812
26862
  const programDirs = [
26813
26863
  process.env.ProgramW6432,
26814
26864
  process.env.ProgramFiles,
26815
26865
  process.env["ProgramFiles(x86)"],
26816
- process.env.LocalAppData ? import_node_path2.default.join(process.env.LocalAppData, "Programs") : null
26866
+ process.env.LocalAppData ? import_node_path3.default.join(process.env.LocalAppData, "Programs") : null
26817
26867
  ].filter(Boolean);
26818
26868
  for (const dir of programDirs) {
26819
26869
  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")
26870
+ import_node_path3.default.join(dir, "Git", "bin", "bash.exe"),
26871
+ import_node_path3.default.join(dir, "Git", "usr", "bin", "bash.exe")
26822
26872
  );
26823
26873
  }
26824
26874
  const home = process.env.USERPROFILE ?? "";
26825
26875
  if (home) {
26826
26876
  gitBashCandidates.push(
26827
- import_node_path2.default.join(home, "scoop", "apps", "git", "current", "bin", "bash.exe")
26877
+ import_node_path3.default.join(home, "scoop", "apps", "git", "current", "bin", "bash.exe")
26828
26878
  );
26829
26879
  }
26830
26880
  if (process.env.CLAUDE_CODE_GIT_BASH_PATH) {
@@ -26841,11 +26891,11 @@ async function detectWindowsShells() {
26841
26891
  shells.push({ name: "PowerShell", path: pwshPath });
26842
26892
  }
26843
26893
  const winDir = process.env.windir ?? "C:\\WINDOWS";
26844
- const legacyPs = import_node_path2.default.join(winDir, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
26894
+ const legacyPs = import_node_path3.default.join(winDir, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
26845
26895
  if (await pathExists(legacyPs, "win32")) {
26846
26896
  shells.push({ name: "Windows PowerShell", path: legacyPs });
26847
26897
  }
26848
- const cmd = process.env.ComSpec ?? import_node_path2.default.join(winDir, "System32", "cmd.exe");
26898
+ const cmd = process.env.ComSpec ?? import_node_path3.default.join(winDir, "System32", "cmd.exe");
26849
26899
  if (await pathExists(cmd, "win32")) {
26850
26900
  shells.push({ name: "Command Prompt", path: cmd });
26851
26901
  }
@@ -26898,13 +26948,13 @@ async function detectEditors(platform = process.platform) {
26898
26948
  }
26899
26949
  return results;
26900
26950
  }
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;
26951
+ 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
26952
  var init_platform = __esm({
26903
26953
  "src/lib/platform.ts"() {
26904
26954
  "use strict";
26905
26955
  import_node_fs2 = require("node:fs");
26906
26956
  import_node_child_process = require("node:child_process");
26907
- import_node_path2 = __toESM(require("node:path"));
26957
+ import_node_path3 = __toESM(require("node:path"));
26908
26958
  CLAUDE_NESTING_VARS = [
26909
26959
  "CLAUDECODE",
26910
26960
  "CLAUDE_CODE_ENTRYPOINT",
@@ -32133,7 +32183,7 @@ var init_pty_session = __esm({
32133
32183
 
32134
32184
  // src/lib/pty/orphan-reaper.ts
32135
32185
  function pidFilePath(sessionKey) {
32136
- return (0, import_node_path3.join)(SIGNAL_DIR, `${PID_PREFIX}${sessionKey}`);
32186
+ return (0, import_node_path4.join)(SIGNAL_DIR, `${PID_PREFIX}${sessionKey}`);
32137
32187
  }
32138
32188
  async function recordSessionPid(sessionKey, pid) {
32139
32189
  try {
@@ -32148,14 +32198,14 @@ async function clearSessionPid(sessionKey) {
32148
32198
  } catch {
32149
32199
  }
32150
32200
  }
32151
- var import_promises, import_node_os2, import_node_path3, SIGNAL_DIR, PID_PREFIX;
32201
+ var import_promises, import_node_os3, import_node_path4, SIGNAL_DIR, PID_PREFIX;
32152
32202
  var init_orphan_reaper = __esm({
32153
32203
  "src/lib/pty/orphan-reaper.ts"() {
32154
32204
  "use strict";
32155
32205
  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");
32206
+ import_node_os3 = require("node:os");
32207
+ import_node_path4 = require("node:path");
32208
+ SIGNAL_DIR = (0, import_node_path4.join)((0, import_node_os3.tmpdir)(), "tower-signals");
32159
32209
  PID_PREFIX = "pid-";
32160
32210
  }
32161
32211
  });
@@ -53957,6 +54007,23 @@ var init_task_actions = __esm({
53957
54007
  }
53958
54008
  });
53959
54009
 
54010
+ // src/mcp/env-guard.ts
54011
+ var import_node_path = require("node:path");
54012
+ var import_node_os = require("node:os");
54013
+ function resolveTowerDataDir(env) {
54014
+ if (env.TOWER_DATA_DIR) return env.TOWER_DATA_DIR;
54015
+ const dbUrl = env.DATABASE_URL;
54016
+ if (dbUrl && dbUrl.startsWith("file:")) {
54017
+ const dbPath = dbUrl.slice("file:".length);
54018
+ return (0, import_node_path.dirname)((0, import_node_path.dirname)(dbPath));
54019
+ }
54020
+ return (0, import_node_path.join)((0, import_node_os.homedir)(), ".tower");
54021
+ }
54022
+ process.env.TOWER_DATA_DIR = resolveTowerDataDir({
54023
+ TOWER_DATA_DIR: process.env.TOWER_DATA_DIR,
54024
+ DATABASE_URL: process.env.DATABASE_URL
54025
+ });
54026
+
53960
54027
  // src/mcp/index.ts
53961
54028
  var import_stdio = require("@modelcontextprotocol/sdk/server/stdio.js");
53962
54029
 
@@ -53968,8 +54035,10 @@ init_zod();
53968
54035
 
53969
54036
  // src/mcp/db.ts
53970
54037
  var import_client = require("@prisma/client");
53971
- var db = new import_client.PrismaClient();
54038
+ init_tower_dir();
54039
+ var db = new import_client.PrismaClient({ datasourceUrl: `file:${getTowerDbFilePath()}` });
53972
54040
  async function initDb() {
54041
+ getDatabaseDir();
53973
54042
  await db.$connect();
53974
54043
  await db.$queryRaw(import_client.Prisma.sql`PRAGMA journal_mode=WAL`);
53975
54044
  await db.$queryRaw(import_client.Prisma.sql`PRAGMA busy_timeout=5000`);
@@ -54129,42 +54198,7 @@ init_config_reader();
54129
54198
  // src/lib/file-utils.ts
54130
54199
  var fs = __toESM(require("node:fs"));
54131
54200
  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
54201
+ init_tower_dir();
54168
54202
  function assertWithinDataRoot(resolved) {
54169
54203
  if (!resolved.startsWith(getStorageDir() + path.sep)) {
54170
54204
  throw new Error("Path traversal detected");
@@ -54420,21 +54454,44 @@ ${refText}`;
54420
54454
  }
54421
54455
  },
54422
54456
  update_task: {
54423
- description: "Update a task's title, description, priority, labels, and/or subPath. If labelIds is provided, replaces all existing labels.",
54457
+ 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
54458
  schema: external_exports.object({
54425
54459
  taskId: external_exports.string(),
54426
54460
  title: external_exports.string().optional(),
54427
54461
  description: external_exports.string().optional(),
54428
54462
  priority: Priority.optional(),
54429
54463
  labelIds: external_exports.array(external_exports.string()).optional(),
54430
- subPath: external_exports.string().optional()
54464
+ subPath: external_exports.string().optional(),
54465
+ 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
54466
  }),
54432
54467
  handler: async (args) => {
54433
- const { labelIds, taskId, ...updateData } = args;
54468
+ const { labelIds, taskId, versionId, ...updateData } = args;
54469
+ const versionProvided = "versionId" in args;
54434
54470
  return db.$transaction(async (tx) => {
54471
+ let versionData = {};
54472
+ if (versionProvided) {
54473
+ let resolved = null;
54474
+ if (versionId) {
54475
+ const current = await tx.task.findUnique({
54476
+ where: { id: taskId },
54477
+ select: { projectId: true }
54478
+ });
54479
+ if (current) {
54480
+ const v2 = await tx.version.findFirst({
54481
+ where: { id: versionId, projectId: current.projectId },
54482
+ select: { id: true }
54483
+ });
54484
+ resolved = v2?.id ?? null;
54485
+ }
54486
+ }
54487
+ versionData = { versionId: resolved };
54488
+ }
54435
54489
  const task = await tx.task.update({
54436
54490
  where: { id: taskId },
54437
- data: updateData
54491
+ data: {
54492
+ ...updateData,
54493
+ ...versionData
54494
+ }
54438
54495
  });
54439
54496
  if (labelIds !== void 0) {
54440
54497
  await tx.taskLabel.deleteMany({ where: { taskId } });
@@ -54488,7 +54545,7 @@ ${refText}`;
54488
54545
  }
54489
54546
  },
54490
54547
  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.",
54548
+ 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
54549
  schema: external_exports.object({ projectId: external_exports.string() }),
54493
54550
  handler: async (args) => {
54494
54551
  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.43",
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=[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
@@ -1,3 +0,0 @@
1
- module.exports=[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"))},933919,(e,t,r)=>{t.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},666680,(e,t,r)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},843793,e=>{"use strict";var t=e.i(933919);let r=globalThis.prisma??new t.PrismaClient({log:[]});process.on("SIGTERM",()=>{r.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{r.$disconnect().catch(()=>{})}),e.s(["db",0,r])},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 a=e.headers.get("host")??"";return r.some(e=>a.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})}])},192520,e=>{"use strict";let t;var r=e.i(750227),n=e.i(660526),s=e.i(902157);function a(){return t||(t=process.env.TOWER_DATA_DIR||(0,r.join)((0,n.homedir)(),".tower"),(0,s.existsSync)(t)||(0,s.mkdirSync)(t,{recursive:!0})),t}e.s(["getAssistantDir",0,function(){let e=(0,r.join)(a(),"assistant");return(0,s.existsSync)(e)||(0,s.mkdirSync)(e,{recursive:!0}),e},"getBackupsDir",0,function(){let e=(0,r.join)(a(),"backups");return(0,s.existsSync)(e)||(0,s.mkdirSync)(e,{recursive:!0}),e},"getExtensionsDir",0,function(){let e=(0,r.join)(a(),"extensions");return(0,s.existsSync)(e)||(0,s.mkdirSync)(e,{recursive:!0}),e},"getStorageDir",0,function(){let e=process.env.TOWER_STORAGE_DIR||function(){try{let e=(0,s.readFileSync)((0,r.join)(a(),"storage-location"),"utf-8").trim();return e.length>0?e:null}catch{return null}}(),t=e&&e.length>0?e:(0,r.join)(a(),"storage");return(0,s.existsSync)(t)||(0,s.mkdirSync)(t,{recursive:!0}),t},"getTowerDbPath",0,function(){let e;return(0,r.join)((e=(0,r.join)(a(),"database"),(0,s.existsSync)(e)||(0,s.mkdirSync)(e,{recursive:!0}),e),"tower.db")},"getTowerDir",0,a])},540193,e=>{"use strict";var t=e.i(750227),r=e.i(902157),n=e.i(192520),s=e.i(843793);function a(e,r){let s=(0,n.getStorageDir)(),a=t.resolve(s,"assets",e,r),i=t.resolve(s,"assets")+t.sep;return a.startsWith(i)?{resolved:a,error:null}:{resolved:null,error:"Invalid path"}}async function i(e,t){let{resolved:n}=a(e,t);if(n&&(0,r.existsSync)(n))return n;let i=await s.db.projectAsset.findFirst({where:{projectId:e,filename:t},select:{path:!0},orderBy:{createdAt:"desc"}});return i?.path&&(0,r.existsSync)(i.path)?i.path:null}async function o(e){return null!==await s.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,o,"resolveAssetFile",0,i,"resolveAssetPath",0,a])},341291,e=>{"use strict";var t=e.i(666680),r=e.i(902157),n=e.i(750227),s=e.i(192520);function a(e){if(!e.startsWith((0,s.getStorageDir)()+n.sep))throw Error("Path traversal detected")}let i=new Set(["image","screenshot","img","photo","picture","clipboard","paste","untitled"]);e.s(["buildCacheFilename",0,function(e,r){let s=n.basename(e,n.extname(e)),a=t.randomUUID().replace(/-/g,"").slice(0,8),o=s.toLowerCase();if(!s||i.has(o)||/^screenshot[\s_\-]/i.test(s))return`tower_image-${a}${r}`;let l=s.replace(/[^\p{L}\p{N}]/gu,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"");return`${l||"file"}-${a}${r}`},"ensureAssetsDir",0,function(e){let t,i=(a(t=n.join((0,s.getStorageDir)(),"assets",e)),t);return r.mkdirSync(i,{recursive:!0}),i},"getAssistantCacheDir",0,function(e="images"){let t=new Date,i=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}`,o=n.join((0,s.getStorageDir)(),"cache","assistant",i,e);return a(o),r.mkdirSync(o,{recursive:!0}),o},"getAssistantCacheRoot",0,function(){let e=n.join((0,s.getStorageDir)(),"cache","assistant");return a(e),e}])},634712,e=>{"use strict";let t=["jpg","jpeg","png","gif","webp"],r=["md","txt","json","csv"],n=[...t,...r].join("|"),s=RegExp(`^\\d{4}-\\d{2}/(images|files)/[^/]+\\.(${n})$`,"i");function a(e){let n=e.replace(/^\./,"").toLowerCase();return t.includes(n)?"image":r.includes(n)?"text":null}[...t.map(e=>`.${e}`),...r.map(e=>`.${e}`),"image/*"].join(","),e.s(["ALLOWED_TEXT_EXTS",0,r,"ATTACHMENT_SUBPATH_RE",0,s,"MAX_ATTACHMENTS",0,10,"classifyAttachmentExt",0,a,"classifyAttachmentSubPath",0,function(e){if(!s.test(e))return null;let t=e.lastIndexOf(".");return t<0?null:a(e.slice(t+1))}])},118951,e=>{"use strict";var t=e.i(765876),r=e.i(675896),n=e.i(959160),s=e.i(97944),a=e.i(86757),i=e.i(204144),o=e.i(273436),l=e.i(743641),c=e.i(813766),u=e.i(840884),d=e.i(498814),p=e.i(780006),h=e.i(544432),g=e.i(772005),x=e.i(450223),f=e.i(193695);e.i(628400);var m=e.i(800071),v=e.i(902157),R=e.i(750227),w=e.i(855104),y=e.i(198840),E=e.i(540193),A=e.i(341291);let S=e.i(634712).ATTACHMENT_SUBPATH_RE;async function j(e,{params:t}){let r,n=(0,y.requireLocalhost)(e);if(n)return n;let{segments:s}=await t,a=s.join("/");if(!S.test(a))return w.NextResponse.json({error:"Invalid path"},{status:400});let i=(0,A.getAssistantCacheRoot)(),o=R.resolve(i,a);if(!o.startsWith(i+R.sep))return w.NextResponse.json({error:"Invalid path"},{status:400});try{r=await v.promises.readFile(o)}catch(e){if("ENOENT"===e.code)return w.NextResponse.json({error:"Not found"},{status:404});return w.NextResponse.json({error:"Read error"},{status:500})}let l=R.extname(a).toLowerCase(),c=E.MIME_MAP[l]??"application/octet-stream";return new Response(new Uint8Array(r),{status:200,headers:{"Content-Type":c,"Cache-Control":"private, max-age=3600"}})}e.s(["GET",0,j,"dynamic",0,"force-dynamic","runtime",0,"nodejs"],141140);var T=e.i(141140);let C=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/internal/cache/[...segments]/route",pathname:"/api/internal/cache/[...segments]",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/internal/cache/[...segments]/route.ts",nextConfigOutput:"standalone",userland:T}),{workAsyncStorage:b,workUnitAsyncStorage:_,serverHooks:N}=C;async function P(e,t,n){n.requestMeta&&(0,s.setRequestMeta)(e,n.requestMeta),C.isDev&&(0,s.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let v="/api/internal/cache/[...segments]/route";v=v.replace(/\/index$/,"")||"/";let R=await C.prepare(e,t,{srcPage:v,multiZoneDraftMode:!1});if(!R)return t.statusCode=400,t.end("Bad Request"),null==n.waitUntil||n.waitUntil.call(n,Promise.resolve()),null;let{buildId:w,params:y,nextConfig:E,parsedUrl:A,isDraftMode:S,prerenderManifest:j,routerServerContext:T,isOnDemandRevalidate:b,revalidateOnlyGenerated:_,resolvedPathname:N,clientReferenceManifest:P,serverActionsManifest:k}=R,I=(0,o.normalizeAppPath)(v),D=!!(j.dynamicRoutes[I]||j.routes[N]),q=async()=>((null==T?void 0:T.render404)?await T.render404(e,t,A,!1):t.end("This page could not be found"),null);if(D&&!S){let e=!!j.routes[N],t=j.dynamicRoutes[I];if(t&&!1===t.fallback&&!e){if(E.adapterPath)return await q();throw new f.NoFallbackError}}let M=null;!D||C.isDev||S||(M="/index"===(M=N)?"/":M);let O=!0===C.isDev||!D,$=D&&!O;k&&P&&(0,i.setManifestsSingleton)({page:v,clientReferenceManifest:P,serverActionsManifest:k});let H=e.method||"GET",U=(0,a.getTracer)(),F=U.getActiveScopeSpan(),L=!!(null==T?void 0:T.isWrappedByNextServer),B=!!(0,s.getRequestMeta)(e,"minimalMode"),W=(0,s.getRequestMeta)(e,"incrementalCache")||await C.getIncrementalCache(e,E,j,B);null==W||W.resetRequestCache(),globalThis.__incrementalCache=W;let K={params:y,previewProps:j.preview,renderOpts:{experimental:{authInterrupts:!!E.experimental.authInterrupts},cacheComponents:!!E.cacheComponents,supportsDynamicResponse:O,incrementalCache:W,cacheLifeProfiles:E.cacheLife,waitUntil:n.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,n,s)=>C.onRequestError(e,t,n,s,T)},sharedContext:{buildId:w}},G=new l.NodeNextRequest(e),X=new l.NodeNextResponse(t),V=c.NextRequestAdapter.fromNodeNextRequest(G,(0,c.signalFromNodeResponse)(t));try{let s,i=async e=>C.handle(V,K).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")!==u.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=`${H} ${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(`${H} ${v}`)}),o=async s=>{var a,o;let l=async({previousCacheEntry:r})=>{try{if(!B&&b&&_&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let a=await i(s);e.fetchMetrics=K.renderOpts.fetchMetrics;let o=K.renderOpts.pendingWaitUntil;o&&n.waitUntil&&(n.waitUntil(o),o=void 0);let l=K.renderOpts.collectedTags;if(!D)return await (0,p.sendResponse)(G,X,a,K.renderOpts.pendingWaitUntil),null;{let e=await a.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(a.headers);l&&(t[x.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==K.renderOpts.collectedRevalidate&&!(K.renderOpts.collectedRevalidate>=x.INFINITE_CACHE)&&K.renderOpts.collectedRevalidate,n=void 0===K.renderOpts.collectedExpire||K.renderOpts.collectedExpire>=x.INFINITE_CACHE?void 0:K.renderOpts.collectedExpire;return{value:{kind:m.CachedRouteKind.APP_ROUTE,status:a.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:n}}}}catch(t){throw(null==r?void 0:r.isStale)&&await C.onRequestError(e,t,{routerKind:"App Router",routePath:v,routeType:"route",revalidateReason:(0,d.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:b})},!1,T),t}},c=await C.handleResponse({req:e,nextConfig:E,cacheKey:M,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:j,isRoutePPREnabled:!1,isOnDemandRevalidate:b,revalidateOnlyGenerated:_,responseGenerator:l,waitUntil:n.waitUntil,isMinimalMode:B});if(!D)return null;if((null==c||null==(a=c.value)?void 0:a.kind)!==m.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==c||null==(o=c.value)?void 0:o.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",b?"REVALIDATED":c.isMiss?"MISS":c.isStale?"STALE":"HIT"),S&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let u=(0,h.fromNodeOutgoingHttpHeaders)(c.value.headers);return B&&D||u.delete(x.NEXT_CACHE_TAGS_HEADER),!c.cacheControl||t.getHeader("Cache-Control")||u.get("Cache-Control")||u.set("Cache-Control",(0,g.getCacheControlHeader)(c.cacheControl)),await (0,p.sendResponse)(G,X,new Response(c.value.body,{headers:u,status:c.value.status||200})),null};L&&F?await o(F):(s=U.getActiveScopeSpan(),await U.withPropagatedContext(e.headers,()=>U.trace(u.BaseServerSpan.handleRequest,{spanName:`${H} ${v}`,kind:a.SpanKind.SERVER,attributes:{"http.method":H,"http.target":e.url}},o),void 0,!L))}catch(t){if(t instanceof f.NoFallbackError||await C.onRequestError(e,t,{routerKind:"App Router",routePath:I,routeType:"route",revalidateReason:(0,d.getRevalidateReason)({isStaticGeneration:$,isOnDemandRevalidate:b})},!1,T),D)throw t;return await (0,p.sendResponse)(G,X,new Response(null,{status:500})),null}}e.s(["handler",0,P,"patchFetch",0,function(){return(0,n.patchFetch)({workAsyncStorage:b,workUnitAsyncStorage:_})},"routeModule",0,C,"serverHooks",0,N,"workAsyncStorage",0,b,"workUnitAsyncStorage",0,_],118951)}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__04jduyo._.js.map