tower-studio 0.2.44 → 0.2.45

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 (517) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +5 -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 +30 -0
  6. package/.next/standalone/.next/server/app/_global-error/page.js +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +2 -2
  16. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +31 -31
  17. package/.next/standalone/.next/server/app/_not-found/page.js +6 -6
  18. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/api/adapters/test/route.js +1 -1
  21. package/.next/standalone/.next/server/app/api/adapters/test/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/browse-fs/route.js +1 -1
  23. package/.next/standalone/.next/server/app/api/browse-fs/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/files/assets/[projectId]/[filename]/route.js +1 -1
  25. package/.next/standalone/.next/server/app/api/files/assets/[projectId]/[filename]/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js +1 -1
  28. package/.next/standalone/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/internal/assets/reveal/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/internal/assistant/attachments/route.js +4 -3
  31. package/.next/standalone/.next/server/app/api/internal/assistant/attachments/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/internal/assistant/chat/route.js +1 -1
  33. package/.next/standalone/.next/server/app/api/internal/assistant/chat/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/internal/assistant/route.js +1 -1
  35. package/.next/standalone/.next/server/app/api/internal/assistant/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js +1 -1
  37. package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js +3 -2
  39. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js +1 -1
  41. package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/internal/harness/ask/route/app-paths-manifest.json +3 -0
  43. package/.next/standalone/.next/server/app/api/internal/harness/ask/route/build-manifest.json +9 -0
  44. package/.next/standalone/.next/server/app/api/internal/harness/ask/route/server-reference-manifest.json +4 -0
  45. package/.next/standalone/.next/server/app/api/internal/harness/ask/route.js +7 -0
  46. package/.next/standalone/.next/server/app/api/internal/harness/ask/route.js.nft.json +1 -0
  47. package/.next/standalone/.next/server/app/api/internal/harness/ask/route_client-reference-manifest.js +3 -0
  48. package/.next/standalone/.next/server/app/api/internal/harness/notify/route/app-paths-manifest.json +3 -0
  49. package/.next/standalone/.next/server/app/api/internal/harness/notify/route/build-manifest.json +9 -0
  50. package/.next/standalone/.next/server/app/api/internal/harness/notify/route/server-reference-manifest.json +4 -0
  51. package/.next/standalone/.next/server/app/api/internal/harness/notify/route.js +7 -0
  52. package/.next/standalone/.next/server/app/api/internal/harness/notify/route.js.nft.json +1 -0
  53. package/.next/standalone/.next/server/app/api/internal/harness/notify/route_client-reference-manifest.js +3 -0
  54. package/.next/standalone/.next/server/app/api/internal/harness/pending/route/app-paths-manifest.json +3 -0
  55. package/.next/standalone/.next/server/app/api/internal/harness/pending/route/build-manifest.json +9 -0
  56. package/.next/standalone/.next/server/app/api/internal/harness/pending/route/server-reference-manifest.json +4 -0
  57. package/.next/standalone/.next/server/app/api/internal/harness/pending/route.js +7 -0
  58. package/.next/standalone/.next/server/app/api/internal/harness/pending/route.js.nft.json +1 -0
  59. package/.next/standalone/.next/server/app/api/internal/harness/pending/route_client-reference-manifest.js +3 -0
  60. package/.next/standalone/.next/server/app/api/internal/harness/reply/route/app-paths-manifest.json +3 -0
  61. package/.next/standalone/.next/server/app/api/internal/harness/reply/route/build-manifest.json +9 -0
  62. package/.next/standalone/.next/server/app/api/internal/harness/reply/route/server-reference-manifest.json +4 -0
  63. package/.next/standalone/.next/server/app/api/internal/harness/reply/route.js +12 -0
  64. package/.next/standalone/.next/server/app/api/internal/harness/reply/route.js.nft.json +1 -0
  65. package/.next/standalone/.next/server/app/api/internal/harness/reply/route_client-reference-manifest.js +3 -0
  66. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js +1 -1
  67. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js.nft.json +1 -1
  68. package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js +1 -1
  69. package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js +3 -3
  71. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js.nft.json +1 -1
  72. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js +2 -2
  73. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js.nft.json +1 -1
  74. package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js +1 -1
  75. package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js +1 -1
  77. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js +1 -1
  79. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js +1 -1
  81. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js +4 -3
  83. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js +5 -4
  85. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js +4 -3
  87. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js +2 -2
  89. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js +2 -2
  91. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js +2 -2
  93. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/harness/page/app-paths-manifest.json +3 -0
  95. package/.next/standalone/.next/server/app/harness/page/build-manifest.json +18 -0
  96. package/.next/standalone/.next/server/app/harness/page/next-font-manifest.json +11 -0
  97. package/.next/standalone/.next/server/app/harness/page/react-loadable-manifest.json +18 -0
  98. package/.next/standalone/.next/server/app/harness/page/server-reference-manifest.json +389 -0
  99. package/.next/standalone/.next/server/app/harness/page.js +25 -0
  100. package/.next/standalone/.next/server/app/harness/page.js.nft.json +1 -0
  101. package/.next/standalone/.next/server/app/harness/page_client-reference-manifest.js +3 -0
  102. package/.next/standalone/.next/server/app/missions/page/react-loadable-manifest.json +1 -1
  103. package/.next/standalone/.next/server/app/missions/page/server-reference-manifest.json +66 -66
  104. package/.next/standalone/.next/server/app/missions/page.js +8 -8
  105. package/.next/standalone/.next/server/app/missions/page.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/onboarding/page/react-loadable-manifest.json +2 -2
  108. package/.next/standalone/.next/server/app/onboarding/page/server-reference-manifest.json +31 -31
  109. package/.next/standalone/.next/server/app/onboarding/page.js +6 -6
  110. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +2 -2
  113. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +31 -31
  114. package/.next/standalone/.next/server/app/page.js +6 -6
  115. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +2 -2
  118. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +132 -96
  119. package/.next/standalone/.next/server/app/settings/page.js +9 -8
  120. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/react-loadable-manifest.json +2 -2
  123. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/server-reference-manifest.json +111 -111
  124. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js +8 -8
  125. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/react-loadable-manifest.json +2 -2
  128. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/server-reference-manifest.json +96 -96
  129. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js +7 -7
  130. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js.nft.json +1 -1
  131. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/react-loadable-manifest.json +2 -2
  133. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/server-reference-manifest.json +79 -79
  134. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js +8 -8
  135. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/react-loadable-manifest.json +2 -2
  138. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/server-reference-manifest.json +79 -79
  139. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js +8 -7
  140. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js.nft.json +1 -1
  141. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/react-loadable-manifest.json +2 -2
  143. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/server-reference-manifest.json +31 -31
  144. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js +7 -7
  145. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/react-loadable-manifest.json +2 -2
  148. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/server-reference-manifest.json +69 -69
  149. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js +7 -7
  150. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js.nft.json +1 -1
  151. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/react-loadable-manifest.json +3 -3
  153. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/server-reference-manifest.json +79 -79
  154. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js +10 -9
  155. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/workspaces/page/react-loadable-manifest.json +2 -2
  158. package/.next/standalone/.next/server/app/workspaces/page/server-reference-manifest.json +54 -54
  159. package/.next/standalone/.next/server/app/workspaces/page.js +6 -6
  160. package/.next/standalone/.next/server/app/workspaces/page.js.nft.json +1 -1
  161. package/.next/standalone/.next/server/app/workspaces/page_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app-paths-manifest.json +5 -0
  163. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0lvlooo._.js → [root-of-the-server]__0-kboke._.js} +1 -1
  164. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02r7j6y._.js +3 -0
  165. package/.next/standalone/.next/server/chunks/[root-of-the-server]__034jopu._.js +4 -0
  166. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06x1zwj._.js +28 -0
  167. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j7565a._.js → [root-of-the-server]__07xsu6m._.js} +2 -2
  168. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08-bq72._.js +3 -0
  169. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08-s.nv._.js +4 -0
  170. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08clp-r._.js +3 -0
  171. package/.next/standalone/.next/server/chunks/[root-of-the-server]__095t6ga._.js +3 -0
  172. package/.next/standalone/.next/server/chunks/[root-of-the-server]__098.3z2._.js +1 -1
  173. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_7_w.g._.js +3 -0
  174. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_~s0z4._.js +3 -0
  175. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ehx6q.._.js +3 -0
  176. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gbyryz._.js +3 -0
  177. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k9rz_z._.js +3 -0
  178. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0khq-k0._.js +3 -0
  179. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l1-djp._.js +1 -1
  180. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nt7c0f._.js +3 -0
  181. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o6i1wy._.js +3 -0
  182. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pmamzv._.js +3 -0
  183. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pr~t0y._.js +3 -0
  184. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0_zfnj0._.js → [root-of-the-server]__0pzyjqf._.js} +1 -1
  185. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qcpe0l._.js +3 -0
  186. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qfcg6k._.js +3 -0
  187. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0sq5irw._.js +3 -0
  188. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tplo5s._.js +3 -0
  189. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tpzojh._.js +3 -0
  190. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0u8tl88._.js +28 -0
  191. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0v98a~t._.js +3 -0
  192. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vh3112._.js +3 -0
  193. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wjr-72._.js +3 -0
  194. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xasom7._.js +4 -0
  195. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xy1t4x._.js +4 -0
  196. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y3adwk._.js +3 -0
  197. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y~y6sh._.js +3 -0
  198. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10aw_67._.js +3 -0
  199. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10ci~o9._.js +3 -0
  200. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10jnn26._.js +3 -0
  201. package/.next/standalone/.next/server/chunks/[root-of-the-server]__116v_bx._.js +4 -0
  202. package/.next/standalone/.next/server/chunks/[root-of-the-server]__119rbly._.js +3 -0
  203. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12fmxq0._.js +3 -0
  204. package/.next/standalone/.next/server/chunks/[root-of-the-server]__136ty69._.js +3 -0
  205. package/.next/standalone/.next/server/chunks/{_12537g8._.js → _02hac5p._.js} +1 -1
  206. package/.next/standalone/.next/server/chunks/{_0q10iet._.js → _0je3dz2._.js} +1 -1
  207. package/.next/standalone/.next/server/chunks/_0qk_esg._.js +2 -2
  208. package/.next/standalone/.next/server/chunks/{_0jmdgq~._.js → _0tidm8l._.js} +1 -1
  209. package/.next/standalone/.next/server/chunks/_0zok2an._.js +7 -0
  210. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_ask_route_actions_0_c62hg.js +3 -0
  211. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_notify_route_actions_08hof6m.js +3 -0
  212. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_pending_route_actions_0w9t_9m.js +3 -0
  213. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_reply_route_actions_0qatz~a.js +3 -0
  214. package/.next/standalone/.next/server/chunks/src_05balzk._.js +3 -0
  215. package/.next/standalone/.next/server/chunks/src_0aqjfcv._.js +3 -0
  216. package/.next/standalone/.next/server/chunks/src_0aygchu._.js +3 -0
  217. package/.next/standalone/.next/server/chunks/src_0gif-f5._.js +3 -0
  218. package/.next/standalone/.next/server/chunks/src_0vp6.co._.js +3 -0
  219. package/.next/standalone/.next/server/chunks/src_11k6i~l._.js +3 -0
  220. package/.next/standalone/.next/server/chunks/src_actions_agent-actions_ts_10q9r5b._.js +8 -2
  221. package/.next/standalone/.next/server/chunks/src_lib_02llcit._.js +1 -1
  222. package/.next/standalone/.next/server/chunks/src_lib_0aowbzy._.js +1 -1
  223. package/.next/standalone/.next/server/chunks/src_lib_0d~1~wz._.js +3 -0
  224. package/.next/standalone/.next/server/chunks/src_lib_0nw5n~t._.js +1 -1
  225. package/.next/standalone/.next/server/chunks/src_lib_0ylel_1._.js +3 -0
  226. package/.next/standalone/.next/server/chunks/src_lib_ai_0xx6y51._.js +1 -1
  227. package/.next/standalone/.next/server/chunks/src_lib_ai_providers_index_ts_0.y.3vp._.js +1 -1
  228. package/.next/standalone/.next/server/chunks/src_lib_config-defaults_ts_10ayktg._.js +3 -0
  229. package/.next/standalone/.next/server/chunks/src_lib_config-reader_ts_0e5f7vk._.js +3 -0
  230. package/.next/standalone/.next/server/chunks/ssr/0iu._[workspaceId]_projects_[projectId]_versions_version-timeline-client_tsx_07o_kyi._.js +1 -1
  231. package/.next/standalone/.next/server/chunks/ssr/0se9_next_dist_esm_build_templates_app-page_0fro4ex.js +4 -0
  232. package/.next/standalone/.next/server/chunks/ssr/0ws9_lucide-react_dist_esm_icons_0r~ty--._.js +3 -0
  233. package/.next/standalone/.next/server/chunks/ssr/12k._sonner_dist_index_mjs_0-vmpk5._.js +3 -0
  234. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.q~~2p._.js +3 -0
  235. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01zrinc._.js +3 -0
  236. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0iln7n_._.js → [root-of-the-server]__03x8axh._.js} +4 -4
  237. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04wbr9x._.js +1 -1
  238. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__051tpij._.js +30 -0
  239. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05xg05r._.js +1 -1
  240. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06s-_gx._.js +30 -0
  241. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0yby8pl._.js → [root-of-the-server]__06t.cx~._.js} +4 -4
  242. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08etd~v._.js +30 -0
  243. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0k6oo0n._.js → [root-of-the-server]__096w7g2._.js} +2 -2
  244. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ecd_1d._.js → [root-of-the-server]__0__klx0._.js} +4 -4
  245. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ccy_gg._.js +3 -0
  246. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cjmeyl._.js +3 -0
  247. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dfqa5a._.js +30 -0
  248. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dmjt7o._.js +30 -0
  249. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dv.-zu._.js +30 -0
  250. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0lws68d._.js → [root-of-the-server]__0dx9sp-._.js} +4 -4
  251. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f57j8r._.js +47 -0
  252. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0fl0l82._.js +30 -0
  253. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g2wrd2._.js +30 -0
  254. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0i0k_zi._.js +30 -0
  255. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ixgha6._.js +30 -0
  256. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j1dx6p._.js +47 -0
  257. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0jymb~t._.js +1 -1
  258. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kn~asi._.js +47 -0
  259. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__127w3bm._.js → [root-of-the-server]__0lau3k_._.js} +2 -2
  260. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0m.hayd._.js +47 -0
  261. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0mpjat-._.js +1 -1
  262. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0_z5hke._.js → [root-of-the-server]__0o9jkew._.js} +1 -1
  263. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0sg4fde._.js +4 -0
  264. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t_zq~v._.js +30 -0
  265. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__04ednzb._.js → [root-of-the-server]__0tb.1li._.js} +2 -2
  266. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0zzqn5z._.js → [root-of-the-server]__0vi-5xg._.js} +2 -2
  267. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w24qox._.js +47 -0
  268. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0wq~4aj._.js +30 -0
  269. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ydiu_y._.js +30 -0
  270. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0yihqy6._.js +3 -0
  271. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ynq8ty._.js +3 -0
  272. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0z7je5_._.js +1 -1
  273. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zouyfp._.js +3 -0
  274. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0~s8otw._.js +30 -0
  275. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1184s~q._.js +3 -0
  276. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11fp64w._.js +3 -0
  277. package/.next/standalone/.next/server/chunks/ssr/_0-~9em3._.js +1 -1
  278. package/.next/standalone/.next/server/chunks/ssr/_0..h3hk._.js +3 -0
  279. package/.next/standalone/.next/server/chunks/ssr/_0.iq8t8._.js +4 -0
  280. package/.next/standalone/.next/server/chunks/ssr/_00.myc6._.js +3 -0
  281. package/.next/standalone/.next/server/chunks/ssr/_00eymu8._.js +3 -0
  282. package/.next/standalone/.next/server/chunks/ssr/{_07lq-bp._.js → _01fdzzv._.js} +1 -1
  283. package/.next/standalone/.next/server/chunks/ssr/{_0_q41~z._.js → _03-we0p._.js} +4 -4
  284. package/.next/standalone/.next/server/chunks/ssr/{_0kojxno._.js → _04szgc6._.js} +2 -2
  285. package/.next/standalone/.next/server/chunks/ssr/{_113957g._.js → _078cdw~._.js} +1 -1
  286. package/.next/standalone/.next/server/chunks/ssr/_08bq4g8._.js +1 -1
  287. package/.next/standalone/.next/server/chunks/ssr/{_0j5.ig_._.js → _09rq08e._.js} +1 -1
  288. package/.next/standalone/.next/server/chunks/ssr/_09z-55_._.js +17 -0
  289. package/.next/standalone/.next/server/chunks/ssr/{src_components_ui_popover_tsx_0a78wqo._.js → _0bndp1~._.js} +2 -2
  290. package/.next/standalone/.next/server/chunks/ssr/{_08-x_rp._.js → _0h0b46r._.js} +1 -1
  291. package/.next/standalone/.next/server/chunks/ssr/{_0wqcz3w._.js → _0kd_tda._.js} +4 -4
  292. package/.next/standalone/.next/server/chunks/ssr/{_07q06~v._.js → _0ktexki._.js} +4 -4
  293. package/.next/standalone/.next/server/chunks/ssr/{_11osha9._.js → _0ljrvyt._.js} +2 -2
  294. package/.next/standalone/.next/server/chunks/ssr/_0lo1nei._.js +6 -0
  295. package/.next/standalone/.next/server/chunks/ssr/_0mdd702._.js +3 -0
  296. package/.next/standalone/.next/server/chunks/ssr/_0n0q6~9._.js +3 -0
  297. package/.next/standalone/.next/server/chunks/ssr/_0os43sb._.js +3 -0
  298. package/.next/standalone/.next/server/chunks/ssr/_0pab_al._.js +3 -0
  299. package/.next/standalone/.next/server/chunks/ssr/{_0foto06._.js → _0pg6-.y._.js} +2 -2
  300. package/.next/standalone/.next/server/chunks/ssr/{_05a2u03._.js → _0pvp63a._.js} +4 -4
  301. package/.next/standalone/.next/server/chunks/ssr/_0qi4x-5._.js +3 -0
  302. package/.next/standalone/.next/server/chunks/ssr/{_0s.h4l2._.js → _0qnobd-._.js} +1 -1
  303. package/.next/standalone/.next/server/chunks/ssr/_0rdyrfd._.js +1 -1
  304. package/.next/standalone/.next/server/chunks/ssr/_0ts~td3._.js +3 -0
  305. package/.next/standalone/.next/server/chunks/ssr/_0wbcp88._.js +1 -1
  306. package/.next/standalone/.next/server/chunks/ssr/{_0s.ik0k._.js → _0xnn~jq._.js} +1 -1
  307. package/.next/standalone/.next/server/chunks/ssr/_0y0_4zs._.js +3 -0
  308. package/.next/standalone/.next/server/chunks/ssr/{_0nze-e6._.js → _0ytcm0j._.js} +1 -1
  309. package/.next/standalone/.next/server/chunks/ssr/_0yva1-.._.js +3 -0
  310. package/.next/standalone/.next/server/chunks/ssr/{_0dxbp89._.js → _0yz5dmq._.js} +4 -4
  311. package/.next/standalone/.next/server/chunks/ssr/{_060e1u.._.js → _0~6pqk.._.js} +1 -1
  312. package/.next/standalone/.next/server/chunks/ssr/_11w13--._.js +3 -0
  313. package/.next/standalone/.next/server/chunks/ssr/{_0r4_qn~._.js → _12la163._.js} +2 -2
  314. package/.next/standalone/.next/server/chunks/ssr/{_0rtydyv._.js → _13_b8hh._.js} +1 -1
  315. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_09eeb85._.js +3 -0
  316. package/.next/standalone/.next/server/chunks/ssr/src_0djxlqx._.js +1 -1
  317. package/.next/standalone/.next/server/chunks/ssr/src_0eufeyj._.js +1 -1
  318. package/.next/standalone/.next/server/chunks/ssr/src_0vv366l._.js +3 -0
  319. package/.next/standalone/.next/server/chunks/ssr/src_actions_agent-actions_ts_0~wc.sy._.js +8 -2
  320. package/.next/standalone/.next/server/chunks/ssr/src_actions_file-actions_ts_0gcvqwm._.js +1 -1
  321. package/.next/standalone/.next/server/chunks/ssr/src_app_missions_missions-client_tsx_11429lj._.js +1 -1
  322. package/.next/standalone/.next/server/chunks/ssr/src_app_onboarding_page_tsx_0xf7hpz._.js +1 -1
  323. package/.next/standalone/.next/server/chunks/ssr/src_app_settings_page_tsx_0h9v7dr._.js +1 -1
  324. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_assets_assets-page-client_tsx_0wyzpam._.js +1 -1
  325. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_board-page-client_tsx_0gips66._.js +1 -1
  326. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_notes_notes-page-client_tsx_10gyo3v._.js +1 -1
  327. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_tasks_[taskId]_task-page-client_tsx_02t7blt._.js +1 -1
  328. package/.next/standalone/.next/server/chunks/ssr/src_components_0rowjw~._.js +7 -0
  329. package/.next/standalone/.next/server/chunks/ssr/{src_lib_00wjv6n._.js → src_lib_0-x.wbd._.js} +1 -1
  330. package/.next/standalone/.next/server/chunks/ssr/{src_lib_005uqbe._.js → src_lib_00p-ir2._.js} +1 -1
  331. package/.next/standalone/.next/server/chunks/ssr/src_lib_03x1i~1._.js +5 -0
  332. package/.next/standalone/.next/server/chunks/ssr/{src_lib_01sr8_t._.js → src_lib_03xtona._.js} +1 -1
  333. package/.next/standalone/.next/server/chunks/ssr/{src_lib_0.~.oo-._.js → src_lib_04y-65j._.js} +1 -1
  334. package/.next/standalone/.next/server/chunks/ssr/src_lib_08gthaz._.js +3 -0
  335. package/.next/standalone/.next/server/chunks/ssr/src_lib_090~6pq._.js +3 -0
  336. package/.next/standalone/.next/server/chunks/ssr/src_lib_0k8dkbn._.js +3 -0
  337. package/.next/standalone/.next/server/chunks/ssr/src_lib_0knbpxk._.js +3 -0
  338. package/.next/standalone/.next/server/chunks/ssr/src_lib_0p_iehl._.js +3 -0
  339. package/.next/standalone/.next/server/chunks/ssr/src_lib_0qve1ri._.js +3 -0
  340. package/.next/standalone/.next/server/chunks/ssr/src_lib_0s35u~4._.js +3 -0
  341. package/.next/standalone/.next/server/chunks/ssr/src_lib_0x2ui80._.js +3 -0
  342. package/.next/standalone/.next/server/chunks/ssr/src_lib_0ypc5_d._.js +3 -0
  343. package/.next/standalone/.next/server/chunks/ssr/src_lib_10jh2mz._.js +3 -0
  344. package/.next/standalone/.next/server/chunks/ssr/src_lib_harness_harness-message_ts_0_3ygf9._.js +3 -0
  345. package/.next/standalone/.next/server/functions-config-manifest.json +5 -0
  346. package/.next/standalone/.next/server/instrumentation.js +1 -1
  347. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  348. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  349. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  350. package/.next/standalone/.next/server/pages/500.html +1 -1
  351. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  352. package/.next/standalone/.next/server/server-reference-manifest.json +594 -342
  353. package/.next/standalone/.next/static/chunks/0-nppzqp-r.9c.js +1 -0
  354. package/.next/standalone/.next/static/chunks/{11pe3kpxuj33f.js → 0-te2tg6~a23u.js} +1 -1
  355. package/.next/standalone/.next/static/chunks/0.64.6c1mh7d2.js +1 -0
  356. package/.next/standalone/.next/static/chunks/0.8n1ce9lggg4.js +1 -0
  357. package/.next/standalone/.next/static/chunks/0.zgqz~m3sjej.js +1 -0
  358. package/.next/standalone/.next/static/chunks/{041o.dh2lc-k3.js → 00.eotegra08r.js} +1 -1
  359. package/.next/standalone/.next/static/chunks/{0rcuiuax31_uh.js → 02xqrfqu.s8-i.js} +1 -1
  360. package/.next/standalone/.next/static/chunks/03y272e6e9o8i.js +1 -0
  361. package/.next/standalone/.next/static/chunks/08eyd7sq064r0.js +1 -0
  362. package/.next/standalone/.next/static/chunks/09b33znj4m__c.js +1 -0
  363. package/.next/standalone/.next/static/chunks/{0uj-3ckujwaiy.js → 09bezwcb__18t.js} +1 -1
  364. package/.next/standalone/.next/static/chunks/0bvhkgitn__gl.js +1 -0
  365. package/.next/standalone/.next/static/chunks/0c.t.evwah_m4.js +1 -0
  366. package/.next/standalone/.next/static/chunks/{0346xrw6i2bwo.js → 0c4-6qdhi645s.js} +1 -1
  367. package/.next/standalone/.next/static/chunks/0d0zm8viq3ol4.js +12 -0
  368. package/.next/standalone/.next/static/chunks/0dktl5t_dtxu..js +1 -0
  369. package/.next/standalone/.next/static/chunks/0e5~nzt657k92.js +1 -0
  370. package/.next/standalone/.next/static/chunks/0erwxvpb9w29_.js +1 -0
  371. package/.next/standalone/.next/static/chunks/{0gvfb.b8m_i8t.js → 0gy79dfi~lnig.js} +1 -1
  372. package/.next/standalone/.next/static/chunks/{0xg6rcq6g4bbh.js → 0gz3xwb5_8xwv.js} +1 -1
  373. package/.next/standalone/.next/static/chunks/0i75~pu.bp20..js +1 -0
  374. package/.next/standalone/.next/static/chunks/0jn_w5b9r~beu.js +1 -0
  375. package/.next/standalone/.next/static/chunks/0l59z2mf1ouxu.js +1 -0
  376. package/.next/standalone/.next/static/chunks/0m4xd-ie7j.hx.js +1 -0
  377. package/.next/standalone/.next/static/chunks/0mx9ebe6we4z0.js +1 -0
  378. package/.next/standalone/.next/static/chunks/0nsggimu5je3g.js +1 -0
  379. package/.next/standalone/.next/static/chunks/{0cpwtqzrjdgvs.js → 0nw8nx8kafy79.js} +1 -1
  380. package/.next/standalone/.next/static/chunks/0pzjryav9pm7p.js +1 -0
  381. package/.next/standalone/.next/static/chunks/0q-rl50zskr35.js +1 -0
  382. package/.next/standalone/.next/static/chunks/0qqy2x-fsmmmx.js +1 -0
  383. package/.next/standalone/.next/static/chunks/0t59wpux0g1~l.js +1 -0
  384. package/.next/standalone/.next/static/chunks/0uezq8wiwkq8d.js +1 -0
  385. package/.next/standalone/.next/static/chunks/0vrc~7m1_cuvl.js +1 -0
  386. package/.next/standalone/.next/static/chunks/0xbh24-hxrt~m.css +1 -0
  387. package/.next/standalone/.next/static/chunks/0xkkmruo8p.l_.js +1 -0
  388. package/.next/standalone/.next/static/chunks/0xx0pe_j2kmr9.js +2 -0
  389. package/.next/standalone/.next/static/chunks/0zqjqiqmorenw.js +5 -0
  390. package/.next/standalone/.next/static/chunks/136l78utn~v08.js +1 -0
  391. package/.next/standalone/.next/static/chunks/171x9kw9wcyk4.js +1 -0
  392. package/.next/standalone/package.json +5 -5
  393. package/dist/mcp-server.cjs +206 -23
  394. package/package.json +5 -5
  395. package/prisma/schema.prisma +37 -0
  396. package/scripts/migrations/0005-add-parent-task-id.ts +29 -0
  397. package/scripts/{stop-hook.js → tower-stop-hook.js} +42 -3
  398. package/skills/tower/SKILL.md +31 -0
  399. package/skills/tower/references/unattended-messaging.md +95 -0
  400. package/tsconfig.json +14 -4
  401. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.p6em~._.js +0 -3
  402. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.zmhk-._.js +0 -3
  403. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0042hx5._.js +0 -3
  404. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03ufxqq._.js +0 -28
  405. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04--bs7._.js +0 -3
  406. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04m2l8a._.js +0 -3
  407. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04r193~._.js +0 -3
  408. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0657y50._.js +0 -3
  409. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06ndn7a._.js +0 -4
  410. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08yqoti._.js +0 -3
  411. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_d.s7s._.js +0 -28
  412. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0clptds._.js +0 -3
  413. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g.k9o~._.js +0 -3
  414. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i34gbs._.js +0 -4
  415. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i~3dwq._.js +0 -3
  416. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j05vlm._.js +0 -3
  417. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j1px8f._.js +0 -3
  418. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k-5ag7._.js +0 -3
  419. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0otyifi._.js +0 -3
  420. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pl.c5.._.js +0 -3
  421. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r~9.7c._.js +0 -4
  422. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t31ba_._.js +0 -3
  423. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t_weyi._.js +0 -3
  424. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uptkzd._.js +0 -4
  425. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x3kws1._.js +0 -3
  426. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y8w5di._.js +0 -4
  427. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zi3~a8._.js +0 -3
  428. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~g6-c~._.js +0 -3
  429. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10fv6tt._.js +0 -3
  430. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1189rd1._.js +0 -4
  431. package/.next/standalone/.next/server/chunks/src_0fq3zjg._.js +0 -3
  432. package/.next/standalone/.next/server/chunks/src_0weytpz._.js +0 -3
  433. package/.next/standalone/.next/server/chunks/src_0wlyw0g._.js +0 -3
  434. package/.next/standalone/.next/server/chunks/src_0~ey84y._.js +0 -3
  435. package/.next/standalone/.next/server/chunks/src_lib_0i2.v2d._.js +0 -3
  436. package/.next/standalone/.next/server/chunks/src_lib_12xey8u._.js +0 -3
  437. package/.next/standalone/.next/server/chunks/ssr/0ws9_lucide-react_dist_esm_icons_0pkla8j._.js +0 -3
  438. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00ebsjb._.js +0 -30
  439. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01fmnse._.js +0 -3
  440. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01vm_46._.js +0 -47
  441. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__025ol9g._.js +0 -3
  442. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__049n47u._.js +0 -3
  443. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06dfcgo._.js +0 -30
  444. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__07xkj1s._.js +0 -47
  445. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__081e5n~._.js +0 -3
  446. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08tzbfh._.js +0 -3
  447. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0iaw1ms._.js +0 -3
  448. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j_-qk5._.js +0 -30
  449. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oamph.._.js +0 -47
  450. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pnv7nd._.js +0 -30
  451. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0tja~wz._.js +0 -30
  452. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ug022w._.js +0 -30
  453. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ugledi._.js +0 -3
  454. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vxlsec._.js +0 -4
  455. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w0.sdz._.js +0 -3
  456. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0x6k.ee._.js +0 -30
  457. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xwzk2.._.js +0 -47
  458. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zxc81t._.js +0 -30
  459. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__10c.a3u._.js +0 -30
  460. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__10n3vn6._.js +0 -30
  461. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__123rmyb._.js +0 -30
  462. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__124zb~p._.js +0 -30
  463. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__13ce7v2._.js +0 -30
  464. package/.next/standalone/.next/server/chunks/ssr/_02vz78l._.js +0 -3
  465. package/.next/standalone/.next/server/chunks/ssr/_04~mjmb._.js +0 -3
  466. package/.next/standalone/.next/server/chunks/ssr/_070t_mh._.js +0 -6
  467. package/.next/standalone/.next/server/chunks/ssr/_0_nhdgs._.js +0 -3
  468. package/.next/standalone/.next/server/chunks/ssr/_0cj9a7y._.js +0 -7
  469. package/.next/standalone/.next/server/chunks/ssr/_0i4xdso._.js +0 -3
  470. package/.next/standalone/.next/server/chunks/ssr/_0rxeqmo._.js +0 -17
  471. package/.next/standalone/.next/server/chunks/ssr/_0u3yt.5._.js +0 -4
  472. package/.next/standalone/.next/server/chunks/ssr/_0ye1-r-._.js +0 -3
  473. package/.next/standalone/.next/server/chunks/ssr/_0zr81mw._.js +0 -3
  474. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_03r.9go._.js +0 -3
  475. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_06f0dao._.js +0 -3
  476. package/.next/standalone/.next/server/chunks/ssr/src_components_ui_select_tsx_0d2ra01._.js +0 -3
  477. package/.next/standalone/.next/server/chunks/ssr/src_lib_08jql1e._.js +0 -3
  478. package/.next/standalone/.next/server/chunks/ssr/src_lib_0b~j-9d._.js +0 -3
  479. package/.next/standalone/.next/server/chunks/ssr/src_lib_0eymyjf._.js +0 -3
  480. package/.next/standalone/.next/server/chunks/ssr/src_lib_0fkv9z3._.js +0 -3
  481. package/.next/standalone/.next/server/chunks/ssr/src_lib_0n-n0.a._.js +0 -3
  482. package/.next/standalone/.next/server/chunks/ssr/src_lib_0sgt~lv._.js +0 -3
  483. package/.next/standalone/.next/server/chunks/ssr/src_lib_0sms4xl._.js +0 -5
  484. package/.next/standalone/.next/server/chunks/ssr/src_lib_0x-iyl1._.js +0 -3
  485. package/.next/standalone/.next/server/chunks/ssr/src_lib_0yjmty1._.js +0 -3
  486. package/.next/standalone/.next/server/chunks/ssr/src_lib_13aevv6._.js +0 -3
  487. package/.next/standalone/.next/static/chunks/0-tuek2jqf0el.js +0 -1
  488. package/.next/standalone/.next/static/chunks/0.-.jc~0b~hy0.js +0 -1
  489. package/.next/standalone/.next/static/chunks/0.lqb7y9kz5z6.js +0 -1
  490. package/.next/standalone/.next/static/chunks/0.~03w.uxge40.js +0 -1
  491. package/.next/standalone/.next/static/chunks/01hdj_kw4z2zq.js +0 -2
  492. package/.next/standalone/.next/static/chunks/01yoibobkdz3x.js +0 -1
  493. package/.next/standalone/.next/static/chunks/07i9j5yyg4vs3.js +0 -1
  494. package/.next/standalone/.next/static/chunks/08ooaq~-.8fzu.js +0 -1
  495. package/.next/standalone/.next/static/chunks/0bylodlncwfpb.js +0 -5
  496. package/.next/standalone/.next/static/chunks/0clewc5ifaruu.js +0 -12
  497. package/.next/standalone/.next/static/chunks/0c~e1-nst-ze-.js +0 -1
  498. package/.next/standalone/.next/static/chunks/0ddt-snh45031.js +0 -1
  499. package/.next/standalone/.next/static/chunks/0dv4anj-j523o.js +0 -1
  500. package/.next/standalone/.next/static/chunks/0h77-u2vvr-a1.js +0 -1
  501. package/.next/standalone/.next/static/chunks/0jrje~1gt6w85.css +0 -1
  502. package/.next/standalone/.next/static/chunks/0lqp~-dlfenad.js +0 -1
  503. package/.next/standalone/.next/static/chunks/0p4w5b_p_yju8.js +0 -1
  504. package/.next/standalone/.next/static/chunks/0qkr26yz3bocs.js +0 -1
  505. package/.next/standalone/.next/static/chunks/0uf~7eqel0zra.js +0 -1
  506. package/.next/standalone/.next/static/chunks/0w71r_sj_fibx.js +0 -1
  507. package/.next/standalone/.next/static/chunks/0xejm4ge9~cn..js +0 -1
  508. package/.next/standalone/.next/static/chunks/0yff8rwmrl5m4.js +0 -1
  509. package/.next/standalone/.next/static/chunks/0ymipmkk2uqby.js +0 -1
  510. package/.next/standalone/.next/static/chunks/0znfclapbniaa.js +0 -1
  511. package/.next/standalone/.next/static/chunks/172s9cg35qt7i.js +0 -1
  512. package/.next/standalone/.next/static/chunks/184-zu89wwa4u.js +0 -1
  513. /package/.next/standalone/.next/static/{dinNvsaC6aoPK_B7ZTeBv → f1860bJqnbYj-1WLMj7F-}/_buildManifest.js +0 -0
  514. /package/.next/standalone/.next/static/{dinNvsaC6aoPK_B7ZTeBv → f1860bJqnbYj-1WLMj7F-}/_clientMiddlewareManifest.js +0 -0
  515. /package/.next/standalone/.next/static/{dinNvsaC6aoPK_B7ZTeBv → f1860bJqnbYj-1WLMj7F-}/_ssgManifest.js +0 -0
  516. /package/scripts/{post-tool-hook.js → tower-post-tool-hook.js} +0 -0
  517. /package/scripts/{session-start-hook.js → tower-session-start-hook.js} +0 -0
@@ -0,0 +1,3 @@
1
+ module.exports=[340616,e=>{"use strict";let t=[/\x1b\[[<=>?]?[0-9;]*c/g,/\x1b\[\??[0-9;]*n/g,/\x1b\[\??[0-9;]*\$p/g,/\x1b\[>[0-9;]*q/g,/\x1b\[(?:1[1345689]|2[01])(?:;[0-9]+)*t/g,/\x1b\][0-9;]*;\?(?:\x07|\x1b\\)/g,/\x1bP[$+]q[\s\S]*?\x1b\\/g];e.s(["stripDeviceQueries",0,function(e){if(!e)return e;let r=e;for(let e of t)r=r.replace(e,"");return r}])},423212,e=>{"use strict";e.i(519895);let t=globalThis.__previewSessions??=new Map;function r(){for(let e of[...t.keys()])!function(e){let r=t.get(e);if(r){try{r.stop()}catch{}t.delete(e)}}(e)}globalThis.__previewSignalHandlersRegistered||(process.on("SIGTERM",r),process.on("SIGINT",r),process.on("SIGHUP",r),globalThis.__previewSignalHandlersRegistered=!0),e.s(["getPreviewSession",0,function(e){return t.get(e)}],423212)},117490,e=>{"use strict";let t="__preview__";e.s(["PREVIEW_TASK_ID",0,t,"parsePreviewWsParams",0,function(e){if(e.get("taskId")!==t)return null;let r=e.get("role"),s=e.get("previewKey");if("state"!==r&&"terminal"!==r||!s)return null;let n=e.get("connectionId")??Math.random().toString(36).slice(2);return{role:r,previewKey:decodeURIComponent(s),connectionId:n,taskId:e.get("clientTaskId")}}])},721390,e=>e.a(async(t,r)=>{try{var s=e.i(433541),n=e.i(83721),o=e.i(340616),i=e.i(572173),l=e.i(658053),a=e.i(423212),c=e.i(117490),f=t([s]);[s]=f.then?(await f)():f;let v=new Map;function u(){return w.__notificationClients||(w.__notificationClients=new Set),w.__notificationClients}function d(e){u().add(e)}function g(e){u().delete(e)}let w=globalThis;async function S(){var t;if(w.__wss){let e=w.__wss;w.__wss=void 0,await new Promise(t=>{e.close(()=>t()),setTimeout(t,1e3)})}let r=parseInt(process.env.PORT||"3000",10),o=await (0,i.readConfigValue)("terminal.wsPort",r+1),f=o;for(let r=0;r<10&&await (t=f,new Promise(r=>{let{createServer:s}=e.r(504446),n=s();n.once("error",()=>r(!0)),n.once("listening",()=>{n.close(()=>r(!1))}),n.listen(t,"127.0.0.1")}));r++){if(9===r)return void console.error(`[ws-server] No free port found after trying ${o}–${f} — skipping startup`);console.error(`[ws-server] Port ${f} in use, trying ${f+1}...`),f++}let u=new s.WebSocketServer({port:f,host:"127.0.0.1",perMessageDeflate:!1});w.__wss=u,w.__wsPort=f,f!==o?console.error(`[ws-server] WebSocket server listening on port ${f} (preferred ${o} was occupied)`):console.error(`[ws-server] WebSocket server listening on port ${f}`);let S=()=>{u.close(),w.__wss=void 0,w.__wsPort=void 0};process.once("SIGINT",S),process.once("SIGTERM",S),u.on("connection",(e,t)=>{let r,o=t.headers.origin??"";if(!(r=parseInt(process.env.PORT||"3000",10),new Set([`http://localhost:${r}`,`http://127.0.0.1:${r}`])).has(o)){console.error(`[ws-server] Rejected origin: ${o||"(none)"}`),e.close(1008,"Forbidden");return}let i=new URL(t.url??"/",`http://localhost:${f}`),u=i.searchParams.get("taskId");if(!u)return void e.close(1008,"Missing taskId");let S=(0,c.parsePreviewWsParams)(i.searchParams);if(S){let t=(0,a.getPreviewSession)(S.previewKey),r=null,n=null;function w(){if(t){if(n=t.subscribe(S.connectionId,S.taskId??"unknown",r=>{if("state"===S.role)try{e.send(JSON.stringify({type:"state",previewKey:t.key,state:r}))}catch{}},t=>{if("terminal"===S.role)try{e.send(t)}catch{}}),"terminal"===S.role){let r=t.getBuffer();if(r.length>0)try{e.send(r.join("\n")+"\n")}catch{}}if("state"===S.role)try{e.send(JSON.stringify({type:"state",previewKey:t.key,state:t.getState()}))}catch{}}}if(t)w();else{let n=0;r=setInterval(()=>{n+=500,(t=(0,a.getPreviewSession)(S.previewKey))?(clearInterval(r),r=null,w()):(n>=3e4||e.readyState!==s.WebSocket.OPEN)&&(clearInterval(r),r=null,e.readyState===s.WebSocket.OPEN&&e.close(1008,"No preview session created within timeout."))},500)}e.on("close",()=>{r&&(clearInterval(r),r=null),n&&(n(),n=null)}),e.on("error",()=>{r&&(clearInterval(r),r=null),n&&(n(),n=null)});return}if("__notifications__"===u){d(e),e.on("close",()=>g(e)),e.on("error",()=>g(e));return}console.error(`[ws-server] Connection for task ${u}`);let y=(0,n.getSession)(u),_=null;if(y)p(y,e,u),console.error(`[ws-server] Attached to existing session for task ${u}`);else{console.error(`[ws-server] No session for task ${u} — polling...`);let t=0;_=setInterval(()=>{t+=500,(y=(0,n.getSession)(u))?(clearInterval(_),_=null,p(y,e,u),console.error(`[ws-server] Session appeared for task ${u} after ${t}ms`)):(t>=3e4||e.readyState!==s.WebSocket.OPEN)&&(clearInterval(_),_=null,e.readyState===s.WebSocket.OPEN&&e.close(1008,"No PTY session created within timeout."))},500)}e.on("message",e=>{if(!y)return;let t=e.toString();if(t.startsWith("{"))try{let e=JSON.parse(t);if("resize"===e.type&&"number"==typeof e.cols&&"number"==typeof e.rows)return void y.resize(e.cols,e.rows)}catch{}y.write(t)}),e.on("close",()=>{e._batcher?.flush();let t=v.get(u);if(!t?.has(e)||(t.delete(e),console.error(`[ws-server] WS disconnected for task ${u} (${t.size} remaining)`),t.size>0))return;v.delete(u);let r=(0,n.getSession)(u);if(!r)return;if(r.setDataListener(()=>{}),u===l.ASSISTANT_SESSION_KEY){console.error("[ws-server] Assistant session disconnected — destroying immediately"),(0,n.destroySession)(u);return}let s=r.killed?3e5:72e5;r.disconnectTimer=setTimeout(()=>{console.error(`[ws-server] Keepalive expired for task ${u}`),(0,n.destroySession)(u)},s)}),e.on("error",t=>{console.error(`[ws-server] WS error for task ${u}:`,t.message),_&&(clearInterval(_),_=null);let r=v.get(u);if(!r?.has(e)||(r.delete(e),r.size>0))return;v.delete(u);let s=(0,n.getSession)(u);s&&!s.killed&&s.setDataListener(()=>{})})})}function p(e,t,r){var n;let i,l;e.disconnectTimer&&(clearTimeout(e.disconnectTimer),e.disconnectTimer=null);let a=v.get(r);a||(a=new Set,v.set(r,a)),a.add(t);let c=(n=t,i="",l=null,{send:e=>{i+=e,l||(l=setTimeout(()=>{l=null,n.readyState===s.WebSocket.OPEN&&n.bufferedAmount<65536&&n.send(i),i=""},8))},flush:()=>{l&&(clearTimeout(l),l=null),i&&n.readyState===s.WebSocket.OPEN&&n.bufferedAmount<65536&&n.send(i),i=""}});t._batcher=c;let f=a;e.setDataListener(e=>{for(let t of f){let r=t._batcher;r?r.send(e):t.readyState===s.WebSocket.OPEN&&t.send(e)}});let u=e.getBuffer();if(u&&t.readyState===s.WebSocket.OPEN){let e=(0,o.stripDeviceQueries)(u);e.length!==u.length&&console.error(`[ws-server] Stripped ${u.length-e.length} bytes of device-query sequences from replay for task ${r} (prevents phantom PTY input on reconnect)`),t.send(e)}e.setExitListener(e=>{let t=function(e){if(null==e)return 4255;let t=Number(e);if(!Number.isFinite(t))return 4255;let r=4e3+(t>=0&&t<256?0|t:t>>>0&255);return r<1e3||r>4999?4255:r}(e);for(let e of f)e.readyState===s.WebSocket.OPEN&&e.close(t,"session_end")})}e.s(["addNotificationClient",0,d,"broadcastNotification",0,function(e){let t=JSON.stringify(e);for(let e of u())e.readyState===s.WebSocket.OPEN&&e.send(t)},"getActiveWsPort",0,function(){return w.__wsPort??null},"removeNotificationClient",0,g,"startWsServer",0,S]),r()}catch(e){r(e)}},!1)];
2
+
3
+ //# sourceMappingURL=src_lib_0d~1~wz._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[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),o=e.i(660526),s=e.i(750227),r=e.i(769310),i=e.i(53674);let n=["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 o={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:o}}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??{},o=(0,i.getPackageRoot)().replace(/\\/g,"/"),r=s.join(o,"scripts","session-start-hook.js").replace(/\\/g,"/"),n=s.join(o,"scripts","post-tool-hook.js").replace(/\\/g,"/"),a=s.join(o,"scripts","stop-hook.js").replace(/\\/g,"/"),l=!1;return l=this.upsertHook(t,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${r}"`,timeout:5,type:"command"}]})||l,l=this.upsertHook(t,"PostToolUse","post-tool-hook.js",{hooks:[{command:`node "${n}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||l,(l=this.upsertHook(t,"Stop","stop-hook.js",{hooks:[{command:`node "${a}"`,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??{},o=(0,i.getPackageRoot)().replace(/\\/g,"/"),r=!1;for(let[e,i]of[["SessionStart","session-start-hook.js"],["PostToolUse","post-tool-hook.js"],["Stop","stop-hook.js"]]){let n=this.getHookArray(t,e),a=n.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(i)));if(a<0)continue;let l=s.join(o,"scripts",i).replace(/\\/g,"/"),c=`node "${l}"`,d=n[a]?.hooks?.[0];d&&d.command!==c&&(d.command=c,t[e]=n,r=!0)}r&&(e.hooks=t,this.writeSettings(e))}catch{}}upsertHook(e,t,o,s){let r=this.getHookArray(e,t),i=s?.hooks?.[0]?.command,n=r.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(o)));if(n>=0){if(r[n]?.hooks?.[0]?.command===i)return!1;r.splice(n,1)}return r.push(s),e[t]=r,!0}async uninstallHooks(){try{let e=this.readSettings(),t=e.hooks??{},o=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let e of["SessionStart","PostToolUse","Stop"]){let s=this.getHookArray(t,e);t[e]=s.filter(e=>!e.hooks?.some(e=>o.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 o=t.scope??"user",s={command:e.command,args:e.args};e.env&&Object.keys(e.env).length>0&&(s.env=e.env);let r=this.resolveCommand(),i=["mcp","add-json","-s",o,e.name,JSON.stringify(s)];try{return await this.runCli(r,["mcp","remove","-s",o,e.name],t.cwd).catch(()=>{}),await this.runCli(r,i,t.cwd),{ok:!0,method:"cli",detail:`${r} ${i.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${r} ${i.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let o=t.scope??"user",s=this.resolveCommand(),r=["mcp","remove","-s",o,e];try{return await this.runCli(s,r,t.cwd),{ok:!0,method:"cli",detail:`${s} ${r.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${s} ${r.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,t={}){let o=this.resolveCommand();try{return await this.runCli(o,["mcp","get",e],t.cwd,5e3),!0}catch{return!1}}async installSkill(e,o){let i=s.join(this.getConfigDir(),"skills",e);try{if(!t.existsSync(o))return{ok:!1,method:"symlink",detail:i,error:`Source skill dir does not exist: ${o}`};t.mkdirSync(s.dirname(i),{recursive:!0});let e=await t.promises.lstat(i).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,r.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:i,error:`Refusing to overwrite non-symlink at ${i}`};else try{let e=await t.promises.readlink(i);if(s.resolve(e)===s.resolve(o))return{ok:!0,method:"symlink",detail:`${i} → ${o} (already)`};await t.promises.unlink(i)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:i,error:`Refusing to overwrite non-symlink at ${i}`}}let n=(0,r.isWindows)()?"junction":"dir";return await t.promises.symlink(o,i,n),{ok:!0,method:"symlink",detail:`${i} → ${o}`}}catch(e){return{ok:!1,method:"symlink",detail:i,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let o=s.join(this.getConfigDir(),"skills",e);try{let e=await t.promises.lstat(o).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${o} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:o,error:`Refusing to remove non-symlink at ${o}`};return await t.promises.unlink(o),{ok:!0,method:"symlink",detail:o}}catch(e){return{ok:!1,method:"symlink",detail:o,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,o){let r=s.join(this.getConfigDir(),"skills",e);try{if(!(await t.promises.lstat(r)).isSymbolicLink())return!1;if(!o)return!0;let e=await t.promises.readlink(r),i=s.isAbsolute(e)?e:s.resolve(s.dirname(r),e);return s.resolve(i)===s.resolve(o)}catch{return!1}}async runCli(t,o,s,r=1e4){let{execFile:i}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(i),{stdout:l}=await a(t,o,{cwd:s,timeout:r});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:o}=await e.A(534777),{resolveSpawnTarget:s}=await e.A(200628),r=o(t),i=await s(this.resolveCommand(),["--version"]),{stdout:n}=await r(i.command,i.args,{timeout:5e3});return n.trim()||null}catch{return null}}async getModels(){return n}getConfigDir(){return s.join(o.homedir(),".claude")}getSettingsPath(){return s.join(this.getConfigDir(),"settings.json")}getSessionsDir(){return s.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,r.isWindows)()){let e=(0,r.resolveCommandPathSync)("claude-code");if("claude-code"!==e)return e}return(0,r.resolveCommandPathSync)("claude")}readSettings(){try{return JSON.parse(t.readFileSync(this.getSettingsPath(),"utf-8"))}catch{return{}}}writeSettings(e){let o=this.getConfigDir();t.existsSync(o)||t.mkdirSync(o,{recursive:!0}),t.writeFileSync(this.getSettingsPath(),JSON.stringify(e,null,2),"utf-8")}getHookArray(e,t){let o=e[t];return Array.isArray(o)?o:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}])},279711,e=>{"use strict";class t{providers=new Map;register(e){this.providers.set(e.name,e)}get(e){return this.providers.get(e)}getAll(){return Array.from(this.providers.values())}getCliAdapter(e){return this.providers.get(e)?.cli?.adapter??null}getQueryAdapter(e,t){let o=this.providers.get(e);return o?"api"===t?o.api?.adapter??null:o.cliQuery?.adapter??null:null}getAllowedCommands(){let e=[];for(let t of this.providers.values())t.cli?.command&&e.push(t.cli.command);return e}async getAvailableProviders(){let e=[];for(let t of this.providers.values()){let o=!!t.cli&&await t.cli.adapter.isAvailable(),s=o&&t.cli?await t.cli.adapter.getVersion():null,r=!!t.api&&!!process.env[t.api.keyEnvVar],i=!!t.api&&r;e.push({name:t.name,displayName:t.displayName,cli:{available:o,version:s},api:{available:i,keyConfigured:r}})}return e}}var o=e.i(472129),s=e.i(902157),r=e.i(660526),i=e.i(750227),n=e.i(769310),a=e.i(53674);let l=["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],c=globalThis;if(!c.__providerRegistry){let d=new t;d.register({name:"claude",displayName:"Claude Code",agentFieldValue:"CLAUDE_CODE",cli:{command:"claude",adapter:new o.ClaudeCliAdapter},models:{cli:["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"],api:[]}}),d.register({name:"codex",displayName:"Codex CLI",agentFieldValue:"CODEX_CLI",cli:{command:"codex",adapter:new class t{buildSpawnArgs(e){let t=[];e.resumeSessionId?t.push("resume",e.resumeSessionId):e.continueLatest?t.push("resume","--last"):(t.push("--full-auto"),e.extraArgs?.length&&t.push(...e.extraArgs),e.prompt&&t.push(e.prompt));let o={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:o}}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.readHooks(),t=(0,a.getPackageRoot)().replace(/\\/g,"/"),o=i.join(t,"scripts","session-start-hook.js").replace(/\\/g,"/"),s=i.join(t,"scripts","post-tool-hook.js").replace(/\\/g,"/"),r=i.join(t,"scripts","stop-hook.js").replace(/\\/g,"/"),n=!1;return n=this.upsertHook(e,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${o}"`,timeout:5,type:"command"}]})||n,n=this.upsertHook(e,"PostToolUse","post-tool-hook.js",{hooks:[{command:`node "${s}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||n,(n=this.upsertHook(e,"Stop","stop-hook.js",{hooks:[{command:`node "${r}"`,timeout:5,type:"command"}]})||n)&&(this.writeHooks(e),this.ensureHooksFeatureEnabled()),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async repairHookPaths(){try{let e=this.readHooks(),t=(0,a.getPackageRoot)().replace(/\\/g,"/"),o=!1;for(let[s,r]of[["SessionStart","session-start-hook.js"],["PostToolUse","post-tool-hook.js"],["Stop","stop-hook.js"]]){let n=this.getHookArray(e,s),a=n.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(r)));if(a<0)continue;let l=i.join(t,"scripts",r).replace(/\\/g,"/"),c=`node "${l}"`,d=n[a]?.hooks?.[0];d&&d.command!==c&&(d.command=c,e[s]=n,o=!0)}o&&(this.writeHooks(e),this.ensureHooksFeatureEnabled())}catch{}}upsertHook(e,t,o,s){let r=this.getHookArray(e,t),i=s?.hooks?.[0]?.command,n=r.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(o)));if(n>=0){if(r[n]?.hooks?.[0]?.command===i)return!1;r.splice(n,1)}return r.push(s),e[t]=r,!0}async uninstallHooks(){try{let e=this.readHooks(),t=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let o of["SessionStart","PostToolUse","Stop"]){let s=this.getHookArray(e,o);e[o]=s.filter(e=>!e.hooks?.some(e=>t.some(t=>e.command?.includes(t))))}return this.writeHooks(e),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async isHooksInstalled(){let e=this.readHooks(),t=this.getHookArray(e,"PostToolUse");return this.hasHook(t,"post-tool-hook.js")}async installMcp(e,t={}){let o=this.resolveCommand(),s=["mcp","add",e.name];if(e.env)for(let[t,o]of Object.entries(e.env))s.push("--env",`${t}=${o}`);s.push("--",e.command,...e.args);try{return await this.runCli(o,["mcp","remove",e.name],t.cwd).catch(()=>{}),await this.runCli(o,s,t.cwd),{ok:!0,method:"cli",detail:`${o} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${o} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let o=this.resolveCommand(),s=["mcp","remove",e];try{return await this.runCli(o,s,t.cwd),{ok:!0,method:"cli",detail:`${o} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${o} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,t={}){let o=this.resolveCommand();try{return await this.runCli(o,["mcp","get",e],t.cwd,5e3),!0}catch{return!1}}async installSkill(e,t){let o=i.join(this.getConfigDir(),"skills",e);try{if(!s.existsSync(t))return{ok:!1,method:"symlink",detail:o,error:`Source skill dir does not exist: ${t}`};s.mkdirSync(i.dirname(o),{recursive:!0});let e=await s.promises.lstat(o).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,n.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:o,error:`Refusing to overwrite non-symlink at ${o}`};else try{let e=await s.promises.readlink(o);if(i.resolve(e)===i.resolve(t))return{ok:!0,method:"symlink",detail:`${o} → ${t} (already)`};await s.promises.unlink(o)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:o,error:`Refusing to overwrite non-symlink at ${o}`}}let r=(0,n.isWindows)()?"junction":"dir";return await s.promises.symlink(t,o,r),{ok:!0,method:"symlink",detail:`${o} → ${t}`}}catch(e){return{ok:!1,method:"symlink",detail:o,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let t=i.join(this.getConfigDir(),"skills",e);try{let e=await s.promises.lstat(t).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${t} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:t,error:`Refusing to remove non-symlink at ${t}`};return await s.promises.unlink(t),{ok:!0,method:"symlink",detail:t}}catch(e){return{ok:!1,method:"symlink",detail:t,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,t){let o=i.join(this.getConfigDir(),"skills",e);try{if(!(await s.promises.lstat(o)).isSymbolicLink())return!1;if(!t)return!0;let e=await s.promises.readlink(o),r=i.isAbsolute(e)?e:i.resolve(i.dirname(o),e);return i.resolve(r)===i.resolve(t)}catch{return!1}}async runCli(t,o,s,r=1e4){let{execFile:i}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(i),{stdout:l}=await a(t,o,{cwd:s,timeout:r});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:o}=await e.A(534777),{resolveSpawnTarget:s}=await e.A(200628),r=o(t),i=await s(this.resolveCommand(),["--version"]),{stdout:n}=await r(i.command,i.args,{timeout:5e3});return n.trim()||null}catch{return null}}async getModels(){return l}getConfigDir(){return i.join(r.homedir(),".codex")}getSettingsPath(){return i.join(this.getConfigDir(),"config.toml")}getSessionsDir(){return i.join(this.getConfigDir(),"sessions")}getApiKeyInfo(){return{envVar:"OPENAI_API_KEY",required:!1}}buildHelloProbeArgs(e){return{command:this.resolveCommand(),args:["exec",e]}}resolveCommand(){return process.env.CODEX_CLI_PATH?process.env.CODEX_CLI_PATH:(0,n.resolveCommandPathSync)("codex")}getHooksPath(){return i.join(this.getConfigDir(),"hooks.json")}readHooks(){try{return JSON.parse(s.readFileSync(this.getHooksPath(),"utf-8")).hooks??{}}catch{return{}}}writeHooks(e){let t=this.getConfigDir();s.existsSync(t)||s.mkdirSync(t,{recursive:!0}),s.writeFileSync(this.getHooksPath(),JSON.stringify({hooks:e},null,2),"utf-8")}ensureHooksFeatureEnabled(){let e=this.getSettingsPath(),t="";try{t=s.readFileSync(e,"utf-8")}catch{}if(/codex_hooks\s*=\s*true/.test(t))return;/\[features\]/.test(t)?t=t.replace(/\[features\]/,"[features]\ncodex_hooks = true"):t+="\n[features]\ncodex_hooks = true\n";let o=this.getConfigDir();s.existsSync(o)||s.mkdirSync(o,{recursive:!0}),s.writeFileSync(e,t,"utf-8")}getHookArray(e,t){let o=e[t];return Array.isArray(o)?o:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}},models:{cli:["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],api:[]}}),c.__providerRegistry=d}let d=c.__providerRegistry;e.s(["providerRegistry",0,d],279711)}];
1
+ module.exports=[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),o=e.i(660526),s=e.i(750227),r=e.i(769310),i=e.i(53674);let n=["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 o={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:o}}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??{},o=(0,i.getPackageRoot)().replace(/\\/g,"/"),r=s.join(o,"scripts","tower-session-start-hook.js").replace(/\\/g,"/"),n=s.join(o,"scripts","tower-post-tool-hook.js").replace(/\\/g,"/"),a=s.join(o,"scripts","tower-stop-hook.js").replace(/\\/g,"/"),l=!1;return l=this.upsertHook(t,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${r}"`,timeout:5,type:"command"}]})||l,l=this.upsertHook(t,"PostToolUse","post-tool-hook.js",{hooks:[{command:`node "${n}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||l,(l=this.upsertHook(t,"Stop","stop-hook.js",{hooks:[{command:`node "${a}"`,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??{},o=(0,i.getPackageRoot)().replace(/\\/g,"/"),r=!1;for(let[e,i,n]of[["SessionStart","session-start-hook.js","tower-session-start-hook.js"],["PostToolUse","post-tool-hook.js","tower-post-tool-hook.js"],["Stop","stop-hook.js","tower-stop-hook.js"]]){let a=this.getHookArray(t,e),l=a.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(i)));if(l<0)continue;let c=s.join(o,"scripts",n).replace(/\\/g,"/"),d=`node "${c}"`,m=a[l]?.hooks?.[0];m&&m.command!==d&&(m.command=d,t[e]=a,r=!0)}r&&(e.hooks=t,this.writeSettings(e))}catch{}}upsertHook(e,t,o,s){let r=this.getHookArray(e,t),i=s?.hooks?.[0]?.command,n=r.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(o)));if(n>=0){if(r[n]?.hooks?.[0]?.command===i)return!1;r.splice(n,1)}return r.push(s),e[t]=r,!0}async uninstallHooks(){try{let e=this.readSettings(),t=e.hooks??{},o=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let e of["SessionStart","PostToolUse","Stop"]){let s=this.getHookArray(t,e);t[e]=s.filter(e=>!e.hooks?.some(e=>o.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 o=t.scope??"user",s={command:e.command,args:e.args};e.env&&Object.keys(e.env).length>0&&(s.env=e.env);let r=this.resolveCommand(),i=["mcp","add-json","-s",o,e.name,JSON.stringify(s)];try{return await this.runCli(r,["mcp","remove","-s",o,e.name],t.cwd).catch(()=>{}),await this.runCli(r,i,t.cwd),{ok:!0,method:"cli",detail:`${r} ${i.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${r} ${i.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let o=t.scope??"user",s=this.resolveCommand(),r=["mcp","remove","-s",o,e];try{return await this.runCli(s,r,t.cwd),{ok:!0,method:"cli",detail:`${s} ${r.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${s} ${r.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,t={}){let o=this.resolveCommand();try{return await this.runCli(o,["mcp","get",e],t.cwd,5e3),!0}catch{return!1}}async installSkill(e,o){let i=s.join(this.getConfigDir(),"skills",e);try{if(!t.existsSync(o))return{ok:!1,method:"symlink",detail:i,error:`Source skill dir does not exist: ${o}`};t.mkdirSync(s.dirname(i),{recursive:!0});let e=await t.promises.lstat(i).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,r.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:i,error:`Refusing to overwrite non-symlink at ${i}`};else try{let e=await t.promises.readlink(i);if(s.resolve(e)===s.resolve(o))return{ok:!0,method:"symlink",detail:`${i} → ${o} (already)`};await t.promises.unlink(i)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:i,error:`Refusing to overwrite non-symlink at ${i}`}}let n=(0,r.isWindows)()?"junction":"dir";return await t.promises.symlink(o,i,n),{ok:!0,method:"symlink",detail:`${i} → ${o}`}}catch(e){return{ok:!1,method:"symlink",detail:i,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let o=s.join(this.getConfigDir(),"skills",e);try{let e=await t.promises.lstat(o).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${o} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:o,error:`Refusing to remove non-symlink at ${o}`};return await t.promises.unlink(o),{ok:!0,method:"symlink",detail:o}}catch(e){return{ok:!1,method:"symlink",detail:o,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,o){let r=s.join(this.getConfigDir(),"skills",e);try{if(!(await t.promises.lstat(r)).isSymbolicLink())return!1;if(!o)return!0;let e=await t.promises.readlink(r),i=s.isAbsolute(e)?e:s.resolve(s.dirname(r),e);return s.resolve(i)===s.resolve(o)}catch{return!1}}async runCli(t,o,s,r=1e4){let{execFile:i}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(i),{stdout:l}=await a(t,o,{cwd:s,timeout:r});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:o}=await e.A(534777),{resolveSpawnTarget:s}=await e.A(200628),r=o(t),i=await s(this.resolveCommand(),["--version"]),{stdout:n}=await r(i.command,i.args,{timeout:5e3});return n.trim()||null}catch{return null}}async getModels(){return n}getConfigDir(){return s.join(o.homedir(),".claude")}getSettingsPath(){return s.join(this.getConfigDir(),"settings.json")}getSessionsDir(){return s.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,r.isWindows)()){let e=(0,r.resolveCommandPathSync)("claude-code");if("claude-code"!==e)return e}return(0,r.resolveCommandPathSync)("claude")}readSettings(){try{return JSON.parse(t.readFileSync(this.getSettingsPath(),"utf-8"))}catch{return{}}}writeSettings(e){let o=this.getConfigDir();t.existsSync(o)||t.mkdirSync(o,{recursive:!0}),t.writeFileSync(this.getSettingsPath(),JSON.stringify(e,null,2),"utf-8")}getHookArray(e,t){let o=e[t];return Array.isArray(o)?o:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}])},279711,e=>{"use strict";class t{providers=new Map;register(e){this.providers.set(e.name,e)}get(e){return this.providers.get(e)}getAll(){return Array.from(this.providers.values())}getCliAdapter(e){return this.providers.get(e)?.cli?.adapter??null}getQueryAdapter(e,t){let o=this.providers.get(e);return o?"api"===t?o.api?.adapter??null:o.cliQuery?.adapter??null:null}getAllowedCommands(){let e=[];for(let t of this.providers.values())t.cli?.command&&e.push(t.cli.command);return e}async getAvailableProviders(){let e=[];for(let t of this.providers.values()){let o=!!t.cli&&await t.cli.adapter.isAvailable(),s=o&&t.cli?await t.cli.adapter.getVersion():null,r=!!t.api&&!!process.env[t.api.keyEnvVar],i=!!t.api&&r;e.push({name:t.name,displayName:t.displayName,cli:{available:o,version:s},api:{available:i,keyConfigured:r}})}return e}}var o=e.i(472129),s=e.i(902157),r=e.i(660526),i=e.i(750227),n=e.i(769310),a=e.i(53674);let l=["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],c=globalThis;if(!c.__providerRegistry){let d=new t;d.register({name:"claude",displayName:"Claude Code",agentFieldValue:"CLAUDE_CODE",cli:{command:"claude",adapter:new o.ClaudeCliAdapter},models:{cli:["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"],api:[]}}),d.register({name:"codex",displayName:"Codex CLI",agentFieldValue:"CODEX_CLI",cli:{command:"codex",adapter:new class t{buildSpawnArgs(e){let t=[];e.resumeSessionId?t.push("resume",e.resumeSessionId):e.continueLatest?t.push("resume","--last"):(t.push("--full-auto"),e.extraArgs?.length&&t.push(...e.extraArgs),e.prompt&&t.push(e.prompt));let o={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:o}}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.readHooks(),t=(0,a.getPackageRoot)().replace(/\\/g,"/"),o=i.join(t,"scripts","tower-session-start-hook.js").replace(/\\/g,"/"),s=i.join(t,"scripts","tower-post-tool-hook.js").replace(/\\/g,"/"),r=i.join(t,"scripts","tower-stop-hook.js").replace(/\\/g,"/"),n=!1;return n=this.upsertHook(e,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${o}"`,timeout:5,type:"command"}]})||n,n=this.upsertHook(e,"PostToolUse","post-tool-hook.js",{hooks:[{command:`node "${s}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||n,(n=this.upsertHook(e,"Stop","stop-hook.js",{hooks:[{command:`node "${r}"`,timeout:5,type:"command"}]})||n)&&(this.writeHooks(e),this.ensureHooksFeatureEnabled()),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async repairHookPaths(){try{let e=this.readHooks(),t=(0,a.getPackageRoot)().replace(/\\/g,"/"),o=!1;for(let[s,r,n]of[["SessionStart","session-start-hook.js","tower-session-start-hook.js"],["PostToolUse","post-tool-hook.js","tower-post-tool-hook.js"],["Stop","stop-hook.js","tower-stop-hook.js"]]){let a=this.getHookArray(e,s),l=a.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(r)));if(l<0)continue;let c=i.join(t,"scripts",n).replace(/\\/g,"/"),d=`node "${c}"`,m=a[l]?.hooks?.[0];m&&m.command!==d&&(m.command=d,e[s]=a,o=!0)}o&&(this.writeHooks(e),this.ensureHooksFeatureEnabled())}catch{}}upsertHook(e,t,o,s){let r=this.getHookArray(e,t),i=s?.hooks?.[0]?.command,n=r.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(o)));if(n>=0){if(r[n]?.hooks?.[0]?.command===i)return!1;r.splice(n,1)}return r.push(s),e[t]=r,!0}async uninstallHooks(){try{let e=this.readHooks(),t=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let o of["SessionStart","PostToolUse","Stop"]){let s=this.getHookArray(e,o);e[o]=s.filter(e=>!e.hooks?.some(e=>t.some(t=>e.command?.includes(t))))}return this.writeHooks(e),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async isHooksInstalled(){let e=this.readHooks(),t=this.getHookArray(e,"PostToolUse");return this.hasHook(t,"post-tool-hook.js")}async installMcp(e,t={}){let o=this.resolveCommand(),s=["mcp","add",e.name];if(e.env)for(let[t,o]of Object.entries(e.env))s.push("--env",`${t}=${o}`);s.push("--",e.command,...e.args);try{return await this.runCli(o,["mcp","remove",e.name],t.cwd).catch(()=>{}),await this.runCli(o,s,t.cwd),{ok:!0,method:"cli",detail:`${o} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${o} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let o=this.resolveCommand(),s=["mcp","remove",e];try{return await this.runCli(o,s,t.cwd),{ok:!0,method:"cli",detail:`${o} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${o} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,t={}){let o=this.resolveCommand();try{return await this.runCli(o,["mcp","get",e],t.cwd,5e3),!0}catch{return!1}}async installSkill(e,t){let o=i.join(this.getConfigDir(),"skills",e);try{if(!s.existsSync(t))return{ok:!1,method:"symlink",detail:o,error:`Source skill dir does not exist: ${t}`};s.mkdirSync(i.dirname(o),{recursive:!0});let e=await s.promises.lstat(o).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,n.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:o,error:`Refusing to overwrite non-symlink at ${o}`};else try{let e=await s.promises.readlink(o);if(i.resolve(e)===i.resolve(t))return{ok:!0,method:"symlink",detail:`${o} → ${t} (already)`};await s.promises.unlink(o)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:o,error:`Refusing to overwrite non-symlink at ${o}`}}let r=(0,n.isWindows)()?"junction":"dir";return await s.promises.symlink(t,o,r),{ok:!0,method:"symlink",detail:`${o} → ${t}`}}catch(e){return{ok:!1,method:"symlink",detail:o,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let t=i.join(this.getConfigDir(),"skills",e);try{let e=await s.promises.lstat(t).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${t} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:t,error:`Refusing to remove non-symlink at ${t}`};return await s.promises.unlink(t),{ok:!0,method:"symlink",detail:t}}catch(e){return{ok:!1,method:"symlink",detail:t,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,t){let o=i.join(this.getConfigDir(),"skills",e);try{if(!(await s.promises.lstat(o)).isSymbolicLink())return!1;if(!t)return!0;let e=await s.promises.readlink(o),r=i.isAbsolute(e)?e:i.resolve(i.dirname(o),e);return i.resolve(r)===i.resolve(t)}catch{return!1}}async runCli(t,o,s,r=1e4){let{execFile:i}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(i),{stdout:l}=await a(t,o,{cwd:s,timeout:r});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:o}=await e.A(534777),{resolveSpawnTarget:s}=await e.A(200628),r=o(t),i=await s(this.resolveCommand(),["--version"]),{stdout:n}=await r(i.command,i.args,{timeout:5e3});return n.trim()||null}catch{return null}}async getModels(){return l}getConfigDir(){return i.join(r.homedir(),".codex")}getSettingsPath(){return i.join(this.getConfigDir(),"config.toml")}getSessionsDir(){return i.join(this.getConfigDir(),"sessions")}getApiKeyInfo(){return{envVar:"OPENAI_API_KEY",required:!1}}buildHelloProbeArgs(e){return{command:this.resolveCommand(),args:["exec",e]}}resolveCommand(){return process.env.CODEX_CLI_PATH?process.env.CODEX_CLI_PATH:(0,n.resolveCommandPathSync)("codex")}getHooksPath(){return i.join(this.getConfigDir(),"hooks.json")}readHooks(){try{return JSON.parse(s.readFileSync(this.getHooksPath(),"utf-8")).hooks??{}}catch{return{}}}writeHooks(e){let t=this.getConfigDir();s.existsSync(t)||s.mkdirSync(t,{recursive:!0}),s.writeFileSync(this.getHooksPath(),JSON.stringify({hooks:e},null,2),"utf-8")}ensureHooksFeatureEnabled(){let e=this.getSettingsPath(),t="";try{t=s.readFileSync(e,"utf-8")}catch{}if(/codex_hooks\s*=\s*true/.test(t))return;/\[features\]/.test(t)?t=t.replace(/\[features\]/,"[features]\ncodex_hooks = true"):t+="\n[features]\ncodex_hooks = true\n";let o=this.getConfigDir();s.existsSync(o)||s.mkdirSync(o,{recursive:!0}),s.writeFileSync(e,t,"utf-8")}getHookArray(e,t){let o=e[t];return Array.isArray(o)?o:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}},models:{cli:["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],api:[]}}),c.__providerRegistry=d}let d=c.__providerRegistry;e.s(["providerRegistry",0,d],279711)}];
2
2
 
3
3
  //# sourceMappingURL=src_lib_0nw5n~t._.js.map
@@ -0,0 +1,3 @@
1
+ module.exports=[682100,e=>{"use strict";var t=e.i(980738),s=e.i(603484);class r{taskId;_pty;killed=!1;disconnectTimer=null;_buffer="";static BUFFER_MAX=51200;_onData;_exitListeners=[];_idleTimer=null;_idleThresholdMs;_onIdle;_idleFired=!1;constructor(e,i,n,o,l,a,c,d,u){this.taskId=e,this._onData=l,this._onIdle=d??null,this._idleThresholdMs=Math.max(u??18e4,18e4);const f={...(0,s.stripClaudeNestingEnv)((0,s.ensurePathInEnv)(process.env)),TERM:"xterm-color",...c};try{this._pty=t.spawn(i,n,{name:"xterm-color",cols:80,rows:24,cwd:o,env:f})}catch(e){throw console.error(`[pty] spawn failed: command="${i}", cwd="${o}", PATH="${f.PATH?.slice(0,200)}"`),e}this._pty.onData(e=>{this._buffer+=e,this._buffer.length>r.BUFFER_MAX&&(this._buffer=this._buffer.slice(this._buffer.length-r.BUFFER_MAX)),this._resetIdleTimer(),this._onData(e)}),this._pty.onExit(({exitCode:e,signal:t})=>{for(let s of(this.killed=!0,this._idleTimer&&(clearTimeout(this._idleTimer),this._idleTimer=null),a(e,t),this._exitListeners))s(e)}),this._resetIdleTimer()}_resetIdleTimer(){this._idleTimer&&(clearTimeout(this._idleTimer),this._idleTimer=null),null===this._onIdle||this.killed||this._idleFired||(this._idleTimer=setTimeout(()=>{this._idleFired=!0,this._onIdle?.()},this._idleThresholdMs))}setDataListener(e){this._onData=e}setExitListener(e){this._exitListeners=[e]}write(e){this.killed||(this._resetIdleTimer(),this._pty.write(e))}resize(e,t){this.killed||this._pty.resize(e,t)}getBuffer(){return this._buffer}get isIdle(){return this._idleFired}get pid(){return this._pty.pid}kill(e){if(!this.killed){this.killed=!0,this._idleTimer&&(clearTimeout(this._idleTimer),this._idleTimer=null);try{this._pty.kill(e)}catch{}}}forceKill(){try{this._pty.kill("SIGKILL")}catch{}this.killed=!0}killTree(e=3e3){if(this.killed)return;this.killed=!0,this._idleTimer&&(clearTimeout(this._idleTimer),this._idleTimer=null);let t=this._pty.pid;try{process.kill(-t,"SIGTERM")}catch{try{this._pty.kill()}catch{}return}let s=setTimeout(()=>{try{process.kill(-t,"SIGKILL")}catch{}},e);s.unref?.()}}e.s(["PtySession",0,r])},370314,e=>{"use strict";e.i(682100),e.i(603484);var t=e.i(979755);let s=globalThis;s.__ptySessions||(s.__ptySessions=new Map);let r=s.__ptySessions;function i(e){(function(e){let t=r.get(e);if(t)return r.delete(e),t.disconnectTimer&&(clearTimeout(t.disconnectTimer),t.disconnectTimer=null),t.killTree(),t})(e)&&(0,t.clearSessionPid)(e)}function n(){for(let e of r.keys())i(e)}let o=globalThis;"phase-production-build"===process.env.NEXT_PHASE||o.__ptySignalHandlersRegistered||(o.__ptySignalHandlersRegistered=!0,process.once("SIGTERM",()=>{console.error("[session-store] SIGTERM received — cleaning up PTY sessions"),n()}),process.once("SIGINT",()=>{console.error("[session-store] SIGINT received — cleaning up PTY sessions"),n()})),e.s(["destroySession",0,i,"getSession",0,function(e){return r.get(e)}])},991980,e=>{"use strict";let t=[/\x1b\[[<=>?]?[0-9;]*c/g,/\x1b\[\??[0-9;]*n/g,/\x1b\[\??[0-9;]*\$p/g,/\x1b\[>[0-9;]*q/g,/\x1b\[(?:1[1345689]|2[01])(?:;[0-9]+)*t/g,/\x1b\][0-9;]*;\?(?:\x07|\x1b\\)/g,/\x1bP[$+]q[\s\S]*?\x1b\\/g];e.s(["stripDeviceQueries",0,function(e){if(!e)return e;let s=e;for(let e of t)s=s.replace(e,"");return s}])},351495,e=>{"use strict";e.s(["ASSISTANT_SESSION_KEY",0,"__assistant__"])},205314,e=>{"use strict";e.i(682100);let t=globalThis.__previewSessions??=new Map;function s(){for(let e of[...t.keys()])!function(e){let s=t.get(e);if(s){try{s.stop()}catch{}t.delete(e)}}(e)}globalThis.__previewSignalHandlersRegistered||(process.on("SIGTERM",s),process.on("SIGINT",s),process.on("SIGHUP",s),globalThis.__previewSignalHandlersRegistered=!0),e.s(["getPreviewSession",0,function(e){return t.get(e)}],205314)},982377,e=>{"use strict";let t="__preview__";e.s(["PREVIEW_TASK_ID",0,t,"parsePreviewWsParams",0,function(e){if(e.get("taskId")!==t)return null;let s=e.get("role"),r=e.get("previewKey");if("state"!==s&&"terminal"!==s||!r)return null;let i=e.get("connectionId")??Math.random().toString(36).slice(2);return{role:s,previewKey:decodeURIComponent(r),connectionId:i,taskId:e.get("clientTaskId")}}])},723538,e=>e.a(async(t,s)=>{try{var r=e.i(433541),i=e.i(370314),n=e.i(991980),o=e.i(746888),l=e.i(351495),a=e.i(205314),c=e.i(982377),d=t([r]);[r]=d.then?(await d)():d;let S=new Map;function u(){return g.__notificationClients||(g.__notificationClients=new Set),g.__notificationClients}function f(e){u().add(e)}function _(e){u().delete(e)}let g=globalThis;async function h(){var t;if(g.__wss){let e=g.__wss;g.__wss=void 0,await new Promise(t=>{e.close(()=>t()),setTimeout(t,1e3)})}let s=parseInt(process.env.PORT||"3000",10),n=await (0,o.readConfigValue)("terminal.wsPort",s+1),d=n;for(let s=0;s<10&&await (t=d,new Promise(s=>{let{createServer:r}=e.r(504446),i=r();i.once("error",()=>s(!0)),i.once("listening",()=>{i.close(()=>s(!1))}),i.listen(t,"127.0.0.1")}));s++){if(9===s)return void console.error(`[ws-server] No free port found after trying ${n}–${d} — skipping startup`);console.error(`[ws-server] Port ${d} in use, trying ${d+1}...`),d++}let u=new r.WebSocketServer({port:d,host:"127.0.0.1",perMessageDeflate:!1});g.__wss=u,g.__wsPort=d,d!==n?console.error(`[ws-server] WebSocket server listening on port ${d} (preferred ${n} was occupied)`):console.error(`[ws-server] WebSocket server listening on port ${d}`);let h=()=>{u.close(),g.__wss=void 0,g.__wsPort=void 0};process.once("SIGINT",h),process.once("SIGTERM",h),u.on("connection",(e,t)=>{let s,n=t.headers.origin??"";if(!(s=parseInt(process.env.PORT||"3000",10),new Set([`http://localhost:${s}`,`http://127.0.0.1:${s}`])).has(n)){console.error(`[ws-server] Rejected origin: ${n||"(none)"}`),e.close(1008,"Forbidden");return}let o=new URL(t.url??"/",`http://localhost:${d}`),u=o.searchParams.get("taskId");if(!u)return void e.close(1008,"Missing taskId");let h=(0,c.parsePreviewWsParams)(o.searchParams);if(h){let t=(0,a.getPreviewSession)(h.previewKey),s=null,i=null;function g(){if(t){if(i=t.subscribe(h.connectionId,h.taskId??"unknown",s=>{if("state"===h.role)try{e.send(JSON.stringify({type:"state",previewKey:t.key,state:s}))}catch{}},t=>{if("terminal"===h.role)try{e.send(t)}catch{}}),"terminal"===h.role){let s=t.getBuffer();if(s.length>0)try{e.send(s.join("\n")+"\n")}catch{}}if("state"===h.role)try{e.send(JSON.stringify({type:"state",previewKey:t.key,state:t.getState()}))}catch{}}}if(t)g();else{let i=0;s=setInterval(()=>{i+=500,(t=(0,a.getPreviewSession)(h.previewKey))?(clearInterval(s),s=null,g()):(i>=3e4||e.readyState!==r.WebSocket.OPEN)&&(clearInterval(s),s=null,e.readyState===r.WebSocket.OPEN&&e.close(1008,"No preview session created within timeout."))},500)}e.on("close",()=>{s&&(clearInterval(s),s=null),i&&(i(),i=null)}),e.on("error",()=>{s&&(clearInterval(s),s=null),i&&(i(),i=null)});return}if("__notifications__"===u){f(e),e.on("close",()=>_(e)),e.on("error",()=>_(e));return}console.error(`[ws-server] Connection for task ${u}`);let m=(0,i.getSession)(u),v=null;if(m)p(m,e,u),console.error(`[ws-server] Attached to existing session for task ${u}`);else{console.error(`[ws-server] No session for task ${u} — polling...`);let t=0;v=setInterval(()=>{t+=500,(m=(0,i.getSession)(u))?(clearInterval(v),v=null,p(m,e,u),console.error(`[ws-server] Session appeared for task ${u} after ${t}ms`)):(t>=3e4||e.readyState!==r.WebSocket.OPEN)&&(clearInterval(v),v=null,e.readyState===r.WebSocket.OPEN&&e.close(1008,"No PTY session created within timeout."))},500)}e.on("message",e=>{if(!m)return;let t=e.toString();if(t.startsWith("{"))try{let e=JSON.parse(t);if("resize"===e.type&&"number"==typeof e.cols&&"number"==typeof e.rows)return void m.resize(e.cols,e.rows)}catch{}m.write(t)}),e.on("close",()=>{e._batcher?.flush();let t=S.get(u);if(!t?.has(e)||(t.delete(e),console.error(`[ws-server] WS disconnected for task ${u} (${t.size} remaining)`),t.size>0))return;S.delete(u);let s=(0,i.getSession)(u);if(!s)return;if(s.setDataListener(()=>{}),u===l.ASSISTANT_SESSION_KEY){console.error("[ws-server] Assistant session disconnected — destroying immediately"),(0,i.destroySession)(u);return}let r=s.killed?3e5:72e5;s.disconnectTimer=setTimeout(()=>{console.error(`[ws-server] Keepalive expired for task ${u}`),(0,i.destroySession)(u)},r)}),e.on("error",t=>{console.error(`[ws-server] WS error for task ${u}:`,t.message),v&&(clearInterval(v),v=null);let s=S.get(u);if(!s?.has(e)||(s.delete(e),s.size>0))return;S.delete(u);let r=(0,i.getSession)(u);r&&!r.killed&&r.setDataListener(()=>{})})})}function p(e,t,s){var i;let o,l;e.disconnectTimer&&(clearTimeout(e.disconnectTimer),e.disconnectTimer=null);let a=S.get(s);a||(a=new Set,S.set(s,a)),a.add(t);let c=(i=t,o="",l=null,{send:e=>{o+=e,l||(l=setTimeout(()=>{l=null,i.readyState===r.WebSocket.OPEN&&i.bufferedAmount<65536&&i.send(o),o=""},8))},flush:()=>{l&&(clearTimeout(l),l=null),o&&i.readyState===r.WebSocket.OPEN&&i.bufferedAmount<65536&&i.send(o),o=""}});t._batcher=c;let d=a;e.setDataListener(e=>{for(let t of d){let s=t._batcher;s?s.send(e):t.readyState===r.WebSocket.OPEN&&t.send(e)}});let u=e.getBuffer();if(u&&t.readyState===r.WebSocket.OPEN){let e=(0,n.stripDeviceQueries)(u);e.length!==u.length&&console.error(`[ws-server] Stripped ${u.length-e.length} bytes of device-query sequences from replay for task ${s} (prevents phantom PTY input on reconnect)`),t.send(e)}e.setExitListener(e=>{let t=function(e){if(null==e)return 4255;let t=Number(e);if(!Number.isFinite(t))return 4255;let s=4e3+(t>=0&&t<256?0|t:t>>>0&255);return s<1e3||s>4999?4255:s}(e);for(let e of d)e.readyState===r.WebSocket.OPEN&&e.close(t,"session_end")})}e.s(["addNotificationClient",0,f,"broadcastNotification",0,function(e){let t=JSON.stringify(e);for(let e of u())e.readyState===r.WebSocket.OPEN&&e.send(t)},"getActiveWsPort",0,function(){return g.__wsPort??null},"removeNotificationClient",0,_,"startWsServer",0,h]),s()}catch(e){s(e)}},!1),336114,e=>e.a(async(t,s)=>{try{var r=e.i(723538);e.i(982377);var i=t([r]);[r]=i.then?(await i)():i,e.s(["startWsServer",()=>r.startWsServer]),s()}catch(e){s(e)}},!1)];
2
+
3
+ //# sourceMappingURL=src_lib_0ylel_1._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[279711,e=>{"use strict";class t{providers=new Map;register(e){this.providers.set(e.name,e)}get(e){return this.providers.get(e)}getAll(){return Array.from(this.providers.values())}getCliAdapter(e){return this.providers.get(e)?.cli?.adapter??null}getQueryAdapter(e,t){let r=this.providers.get(e);return r?"api"===t?r.api?.adapter??null:r.cliQuery?.adapter??null:null}getAllowedCommands(){let e=[];for(let t of this.providers.values())t.cli?.command&&e.push(t.cli.command);return e}async getAvailableProviders(){let e=[];for(let t of this.providers.values()){let r=!!t.cli&&await t.cli.adapter.isAvailable(),o=r&&t.cli?await t.cli.adapter.getVersion():null,i=!!t.api&&!!process.env[t.api.keyEnvVar],s=!!t.api&&i;e.push({name:t.name,displayName:t.displayName,cli:{available:r,version:o},api:{available:s,keyConfigured:i}})}return e}}var r=e.i(472129),o=e.i(902157),i=e.i(660526),s=e.i(750227),n=e.i(769310),a=e.i(53674);let l=["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],c=globalThis;if(!c.__providerRegistry){let d=new t;d.register({name:"claude",displayName:"Claude Code",agentFieldValue:"CLAUDE_CODE",cli:{command:"claude",adapter:new r.ClaudeCliAdapter},models:{cli:["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"],api:[]}}),d.register({name:"codex",displayName:"Codex CLI",agentFieldValue:"CODEX_CLI",cli:{command:"codex",adapter:new class t{buildSpawnArgs(e){let t=[];e.resumeSessionId?t.push("resume",e.resumeSessionId):e.continueLatest?t.push("resume","--last"):(t.push("--full-auto"),e.extraArgs?.length&&t.push(...e.extraArgs),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.readHooks(),t=(0,a.getPackageRoot)().replace(/\\/g,"/"),r=s.join(t,"scripts","session-start-hook.js").replace(/\\/g,"/"),o=s.join(t,"scripts","post-tool-hook.js").replace(/\\/g,"/"),i=s.join(t,"scripts","stop-hook.js").replace(/\\/g,"/"),n=!1;return n=this.upsertHook(e,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${r}"`,timeout:5,type:"command"}]})||n,n=this.upsertHook(e,"PostToolUse","post-tool-hook.js",{hooks:[{command:`node "${o}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||n,(n=this.upsertHook(e,"Stop","stop-hook.js",{hooks:[{command:`node "${i}"`,timeout:5,type:"command"}]})||n)&&(this.writeHooks(e),this.ensureHooksFeatureEnabled()),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async repairHookPaths(){try{let e=this.readHooks(),t=(0,a.getPackageRoot)().replace(/\\/g,"/"),r=!1;for(let[o,i]of[["SessionStart","session-start-hook.js"],["PostToolUse","post-tool-hook.js"],["Stop","stop-hook.js"]]){let n=this.getHookArray(e,o),a=n.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(i)));if(a<0)continue;let l=s.join(t,"scripts",i).replace(/\\/g,"/"),c=`node "${l}"`,d=n[a]?.hooks?.[0];d&&d.command!==c&&(d.command=c,e[o]=n,r=!0)}r&&(this.writeHooks(e),this.ensureHooksFeatureEnabled())}catch{}}upsertHook(e,t,r,o){let i=this.getHookArray(e,t),s=o?.hooks?.[0]?.command,n=i.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(r)));if(n>=0){if(i[n]?.hooks?.[0]?.command===s)return!1;i.splice(n,1)}return i.push(o),e[t]=i,!0}async uninstallHooks(){try{let e=this.readHooks(),t=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let r of["SessionStart","PostToolUse","Stop"]){let o=this.getHookArray(e,r);e[r]=o.filter(e=>!e.hooks?.some(e=>t.some(t=>e.command?.includes(t))))}return this.writeHooks(e),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async isHooksInstalled(){let e=this.readHooks(),t=this.getHookArray(e,"PostToolUse");return this.hasHook(t,"post-tool-hook.js")}async installMcp(e,t={}){let r=this.resolveCommand(),o=["mcp","add",e.name];if(e.env)for(let[t,r]of Object.entries(e.env))o.push("--env",`${t}=${r}`);o.push("--",e.command,...e.args);try{return await this.runCli(r,["mcp","remove",e.name],t.cwd).catch(()=>{}),await this.runCli(r,o,t.cwd),{ok:!0,method:"cli",detail:`${r} ${o.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${r} ${o.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let r=this.resolveCommand(),o=["mcp","remove",e];try{return await this.runCli(r,o,t.cwd),{ok:!0,method:"cli",detail:`${r} ${o.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${r} ${o.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,t){let r=s.join(this.getConfigDir(),"skills",e);try{if(!o.existsSync(t))return{ok:!1,method:"symlink",detail:r,error:`Source skill dir does not exist: ${t}`};o.mkdirSync(s.dirname(r),{recursive:!0});let e=await o.promises.lstat(r).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,n.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:r,error:`Refusing to overwrite non-symlink at ${r}`};else try{let e=await o.promises.readlink(r);if(s.resolve(e)===s.resolve(t))return{ok:!0,method:"symlink",detail:`${r} → ${t} (already)`};await o.promises.unlink(r)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:r,error:`Refusing to overwrite non-symlink at ${r}`}}let i=(0,n.isWindows)()?"junction":"dir";return await o.promises.symlink(t,r,i),{ok:!0,method:"symlink",detail:`${r} → ${t}`}}catch(e){return{ok:!1,method:"symlink",detail:r,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let t=s.join(this.getConfigDir(),"skills",e);try{let e=await o.promises.lstat(t).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${t} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:t,error:`Refusing to remove non-symlink at ${t}`};return await o.promises.unlink(t),{ok:!0,method:"symlink",detail:t}}catch(e){return{ok:!1,method:"symlink",detail:t,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,t){let r=s.join(this.getConfigDir(),"skills",e);try{if(!(await o.promises.lstat(r)).isSymbolicLink())return!1;if(!t)return!0;let e=await o.promises.readlink(r),i=s.isAbsolute(e)?e:s.resolve(s.dirname(r),e);return s.resolve(i)===s.resolve(t)}catch{return!1}}async runCli(t,r,o,i=1e4){let{execFile:s}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(s),{stdout:l}=await a(t,r,{cwd:o,timeout:i});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:o}=await e.A(200628),i=r(t),s=await o(this.resolveCommand(),["--version"]),{stdout:n}=await i(s.command,s.args,{timeout:5e3});return n.trim()||null}catch{return null}}async getModels(){return l}getConfigDir(){return s.join(i.homedir(),".codex")}getSettingsPath(){return s.join(this.getConfigDir(),"config.toml")}getSessionsDir(){return s.join(this.getConfigDir(),"sessions")}getApiKeyInfo(){return{envVar:"OPENAI_API_KEY",required:!1}}buildHelloProbeArgs(e){return{command:this.resolveCommand(),args:["exec",e]}}resolveCommand(){return process.env.CODEX_CLI_PATH?process.env.CODEX_CLI_PATH:(0,n.resolveCommandPathSync)("codex")}getHooksPath(){return s.join(this.getConfigDir(),"hooks.json")}readHooks(){try{return JSON.parse(o.readFileSync(this.getHooksPath(),"utf-8")).hooks??{}}catch{return{}}}writeHooks(e){let t=this.getConfigDir();o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),o.writeFileSync(this.getHooksPath(),JSON.stringify({hooks:e},null,2),"utf-8")}ensureHooksFeatureEnabled(){let e=this.getSettingsPath(),t="";try{t=o.readFileSync(e,"utf-8")}catch{}if(/codex_hooks\s*=\s*true/.test(t))return;/\[features\]/.test(t)?t=t.replace(/\[features\]/,"[features]\ncodex_hooks = true"):t+="\n[features]\ncodex_hooks = true\n";let r=this.getConfigDir();o.existsSync(r)||o.mkdirSync(r,{recursive:!0}),o.writeFileSync(e,t,"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)))}}},models:{cli:["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],api:[]}}),c.__providerRegistry=d}let d=c.__providerRegistry;e.s(["providerRegistry",0,d],279711)},173215,e=>{"use strict";var t=e.i(902157),r=e.i(660526),o=e.i(750227),i=e.i(279711),s=e.i(192520),n=e.i(53674);let a="tower";function l(){let e=(0,s.getTowerDir)(),t=o.join((0,r.homedir)(),".tower");if(o.resolve(e)===o.resolve(t))return"tower";let i=o.basename(e),n=i.match(/^\.?tower-(.+)$/);return n?`tower-${c(n[1])}`:`tower-${c(i)}`}function c(e){return e.replace(/[^a-z0-9_-]/gi,"-").toLowerCase().slice(0,32)}function d(){let e=(0,n.getPackageRoot)().replace(/\\/g,"/"),r={DATABASE_URL:process.env.DATABASE_URL||`file:${(0,s.getTowerDbPath)().replace(/\\/g,"/")}`,TOWER_DATA_DIR:(0,s.getTowerDir)()},o=`${e}/dist/mcp-server.cjs`,i=l();return(0,t.existsSync)(o)?{name:i,command:"node",args:[o],env:r}:{name:i,command:`${e}/node_modules/.bin/tsx`,args:[`${e}/src/mcp/index.ts`],env:r}}async function m(e,s){let l=i.providerRegistry.get(e),c=l?.cli?.adapter;if(!c||!await c.isAvailable())return{provider:e,available:!1,ok:!1};let m="claude"===e?function(e={}){let i=e.homeDir??r.homedir(),s=e.repoRoot??process.cwd(),n=[];return n.push(function(e){let r=o.join(e,".claude","settings.json");if(!t.existsSync(r))return{removed:!1,path:r};try{let e=t.readFileSync(r,"utf-8"),o=JSON.parse(e),i=o.mcpServers;if("object"!=typeof i||null===i||Array.isArray(i)||!("tower"in i))return{removed:!1,path:r};let s=i.tower;return delete i.tower,0===Object.keys(i).length?delete o.mcpServers:o.mcpServers=i,t.writeFileSync(r,JSON.stringify(o,null,2)+"\n","utf-8"),{removed:!0,path:r,removedEntry:s,reason:"wrong-file"}}catch(e){return{removed:!1,path:r,error:e instanceof Error?e.message:String(e)}}}(i)),n.push(function(e,r,i){if(!t.existsSync(e))return{removed:!1,path:e};try{let s=t.readFileSync(e,"utf-8"),n=JSON.parse(s),a=n.mcpServers;if("object"!=typeof a||null===a||Array.isArray(a))return{removed:!1,path:e};let l=a.tower;if(!l)return{removed:!1,path:e};let c=function(e,r){let i,s=e.args;if(!Array.isArray(s))return"foreign-repo";for(let e of s)if("string"==typeof e&&o.isAbsolute(e)){i=e;break}return i?t.existsSync(i)?o.resolve(i).startsWith(o.resolve(r)+o.sep)?"current-repo":"foreign-repo":"missing-path":"foreign-repo"}(l,i);if("current-repo"===c)return{removed:!1,path:e,reason:"alive-current-repo"};return delete a.tower,0===Object.keys(a).length?delete n.mcpServers:n.mcpServers=a,t.writeFileSync(e,JSON.stringify(n,null,2)+"\n","utf-8"),{removed:!0,path:e,removedEntry:l,reason:`${r}:${c}`}}catch(t){return{removed:!1,path:e,error:t instanceof Error?t.message:String(t)}}}(o.join(i,".mcp.json"),"home-mcp-json",s)),{steps:n,removedAny:n.some(e=>e.removed)}}():void 0,u=d(),h=await c.installMcp(u,{scope:"user"}),p=await c.installHooks(s),g=await c.installSkill(a,o.join((0,n.getPackageRoot)(),"skills",a));return{provider:e,available:!0,migration:m,mcp:h,hooks:p,skill:g,ok:h.ok&&p.ok&&g.ok}}e.s(["buildTowerMcpConfig",0,d,"getTowerMcpName",0,l,"installAllForProvider",0,m],173215)}];
1
+ module.exports=[279711,e=>{"use strict";class t{providers=new Map;register(e){this.providers.set(e.name,e)}get(e){return this.providers.get(e)}getAll(){return Array.from(this.providers.values())}getCliAdapter(e){return this.providers.get(e)?.cli?.adapter??null}getQueryAdapter(e,t){let r=this.providers.get(e);return r?"api"===t?r.api?.adapter??null:r.cliQuery?.adapter??null:null}getAllowedCommands(){let e=[];for(let t of this.providers.values())t.cli?.command&&e.push(t.cli.command);return e}async getAvailableProviders(){let e=[];for(let t of this.providers.values()){let r=!!t.cli&&await t.cli.adapter.isAvailable(),o=r&&t.cli?await t.cli.adapter.getVersion():null,s=!!t.api&&!!process.env[t.api.keyEnvVar],i=!!t.api&&s;e.push({name:t.name,displayName:t.displayName,cli:{available:r,version:o},api:{available:i,keyConfigured:s}})}return e}}var r=e.i(472129),o=e.i(902157),s=e.i(660526),i=e.i(750227),n=e.i(769310),a=e.i(53674);let l=["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],c=globalThis;if(!c.__providerRegistry){let d=new t;d.register({name:"claude",displayName:"Claude Code",agentFieldValue:"CLAUDE_CODE",cli:{command:"claude",adapter:new r.ClaudeCliAdapter},models:{cli:["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"],api:[]}}),d.register({name:"codex",displayName:"Codex CLI",agentFieldValue:"CODEX_CLI",cli:{command:"codex",adapter:new class t{buildSpawnArgs(e){let t=[];e.resumeSessionId?t.push("resume",e.resumeSessionId):e.continueLatest?t.push("resume","--last"):(t.push("--full-auto"),e.extraArgs?.length&&t.push(...e.extraArgs),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.readHooks(),t=(0,a.getPackageRoot)().replace(/\\/g,"/"),r=i.join(t,"scripts","tower-session-start-hook.js").replace(/\\/g,"/"),o=i.join(t,"scripts","tower-post-tool-hook.js").replace(/\\/g,"/"),s=i.join(t,"scripts","tower-stop-hook.js").replace(/\\/g,"/"),n=!1;return n=this.upsertHook(e,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${r}"`,timeout:5,type:"command"}]})||n,n=this.upsertHook(e,"PostToolUse","post-tool-hook.js",{hooks:[{command:`node "${o}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||n,(n=this.upsertHook(e,"Stop","stop-hook.js",{hooks:[{command:`node "${s}"`,timeout:5,type:"command"}]})||n)&&(this.writeHooks(e),this.ensureHooksFeatureEnabled()),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async repairHookPaths(){try{let e=this.readHooks(),t=(0,a.getPackageRoot)().replace(/\\/g,"/"),r=!1;for(let[o,s,n]of[["SessionStart","session-start-hook.js","tower-session-start-hook.js"],["PostToolUse","post-tool-hook.js","tower-post-tool-hook.js"],["Stop","stop-hook.js","tower-stop-hook.js"]]){let a=this.getHookArray(e,o),l=a.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(s)));if(l<0)continue;let c=i.join(t,"scripts",n).replace(/\\/g,"/"),d=`node "${c}"`,m=a[l]?.hooks?.[0];m&&m.command!==d&&(m.command=d,e[o]=a,r=!0)}r&&(this.writeHooks(e),this.ensureHooksFeatureEnabled())}catch{}}upsertHook(e,t,r,o){let s=this.getHookArray(e,t),i=o?.hooks?.[0]?.command,n=s.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(r)));if(n>=0){if(s[n]?.hooks?.[0]?.command===i)return!1;s.splice(n,1)}return s.push(o),e[t]=s,!0}async uninstallHooks(){try{let e=this.readHooks(),t=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let r of["SessionStart","PostToolUse","Stop"]){let o=this.getHookArray(e,r);e[r]=o.filter(e=>!e.hooks?.some(e=>t.some(t=>e.command?.includes(t))))}return this.writeHooks(e),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async isHooksInstalled(){let e=this.readHooks(),t=this.getHookArray(e,"PostToolUse");return this.hasHook(t,"post-tool-hook.js")}async installMcp(e,t={}){let r=this.resolveCommand(),o=["mcp","add",e.name];if(e.env)for(let[t,r]of Object.entries(e.env))o.push("--env",`${t}=${r}`);o.push("--",e.command,...e.args);try{return await this.runCli(r,["mcp","remove",e.name],t.cwd).catch(()=>{}),await this.runCli(r,o,t.cwd),{ok:!0,method:"cli",detail:`${r} ${o.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${r} ${o.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let r=this.resolveCommand(),o=["mcp","remove",e];try{return await this.runCli(r,o,t.cwd),{ok:!0,method:"cli",detail:`${r} ${o.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${r} ${o.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,t){let r=i.join(this.getConfigDir(),"skills",e);try{if(!o.existsSync(t))return{ok:!1,method:"symlink",detail:r,error:`Source skill dir does not exist: ${t}`};o.mkdirSync(i.dirname(r),{recursive:!0});let e=await o.promises.lstat(r).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,n.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:r,error:`Refusing to overwrite non-symlink at ${r}`};else try{let e=await o.promises.readlink(r);if(i.resolve(e)===i.resolve(t))return{ok:!0,method:"symlink",detail:`${r} → ${t} (already)`};await o.promises.unlink(r)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:r,error:`Refusing to overwrite non-symlink at ${r}`}}let s=(0,n.isWindows)()?"junction":"dir";return await o.promises.symlink(t,r,s),{ok:!0,method:"symlink",detail:`${r} → ${t}`}}catch(e){return{ok:!1,method:"symlink",detail:r,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let t=i.join(this.getConfigDir(),"skills",e);try{let e=await o.promises.lstat(t).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${t} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:t,error:`Refusing to remove non-symlink at ${t}`};return await o.promises.unlink(t),{ok:!0,method:"symlink",detail:t}}catch(e){return{ok:!1,method:"symlink",detail:t,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,t){let r=i.join(this.getConfigDir(),"skills",e);try{if(!(await o.promises.lstat(r)).isSymbolicLink())return!1;if(!t)return!0;let e=await o.promises.readlink(r),s=i.isAbsolute(e)?e:i.resolve(i.dirname(r),e);return i.resolve(s)===i.resolve(t)}catch{return!1}}async runCli(t,r,o,s=1e4){let{execFile:i}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(i),{stdout:l}=await a(t,r,{cwd:o,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:o}=await e.A(200628),s=r(t),i=await o(this.resolveCommand(),["--version"]),{stdout:n}=await s(i.command,i.args,{timeout:5e3});return n.trim()||null}catch{return null}}async getModels(){return l}getConfigDir(){return i.join(s.homedir(),".codex")}getSettingsPath(){return i.join(this.getConfigDir(),"config.toml")}getSessionsDir(){return i.join(this.getConfigDir(),"sessions")}getApiKeyInfo(){return{envVar:"OPENAI_API_KEY",required:!1}}buildHelloProbeArgs(e){return{command:this.resolveCommand(),args:["exec",e]}}resolveCommand(){return process.env.CODEX_CLI_PATH?process.env.CODEX_CLI_PATH:(0,n.resolveCommandPathSync)("codex")}getHooksPath(){return i.join(this.getConfigDir(),"hooks.json")}readHooks(){try{return JSON.parse(o.readFileSync(this.getHooksPath(),"utf-8")).hooks??{}}catch{return{}}}writeHooks(e){let t=this.getConfigDir();o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),o.writeFileSync(this.getHooksPath(),JSON.stringify({hooks:e},null,2),"utf-8")}ensureHooksFeatureEnabled(){let e=this.getSettingsPath(),t="";try{t=o.readFileSync(e,"utf-8")}catch{}if(/codex_hooks\s*=\s*true/.test(t))return;/\[features\]/.test(t)?t=t.replace(/\[features\]/,"[features]\ncodex_hooks = true"):t+="\n[features]\ncodex_hooks = true\n";let r=this.getConfigDir();o.existsSync(r)||o.mkdirSync(r,{recursive:!0}),o.writeFileSync(e,t,"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)))}}},models:{cli:["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],api:[]}}),c.__providerRegistry=d}let d=c.__providerRegistry;e.s(["providerRegistry",0,d],279711)},173215,e=>{"use strict";var t=e.i(902157),r=e.i(660526),o=e.i(750227),s=e.i(279711),i=e.i(192520),n=e.i(53674);let a="tower";function l(){let e=(0,i.getTowerDir)(),t=o.join((0,r.homedir)(),".tower");if(o.resolve(e)===o.resolve(t))return"tower";let s=o.basename(e),n=s.match(/^\.?tower-(.+)$/);return n?`tower-${c(n[1])}`:`tower-${c(s)}`}function c(e){return e.replace(/[^a-z0-9_-]/gi,"-").toLowerCase().slice(0,32)}function d(){let e=(0,n.getPackageRoot)().replace(/\\/g,"/"),r={DATABASE_URL:process.env.DATABASE_URL||`file:${(0,i.getTowerDbPath)().replace(/\\/g,"/")}`,TOWER_DATA_DIR:(0,i.getTowerDir)()},o=`${e}/dist/mcp-server.cjs`,s=l();return(0,t.existsSync)(o)?{name:s,command:"node",args:[o],env:r}:{name:s,command:`${e}/node_modules/.bin/tsx`,args:[`${e}/src/mcp/index.ts`],env:r}}async function m(e,i){let l=s.providerRegistry.get(e),c=l?.cli?.adapter;if(!c||!await c.isAvailable())return{provider:e,available:!1,ok:!1};let m="claude"===e?function(e={}){let s=e.homeDir??r.homedir(),i=e.repoRoot??process.cwd(),n=[];return n.push(function(e){let r=o.join(e,".claude","settings.json");if(!t.existsSync(r))return{removed:!1,path:r};try{let e=t.readFileSync(r,"utf-8"),o=JSON.parse(e),s=o.mcpServers;if("object"!=typeof s||null===s||Array.isArray(s)||!("tower"in s))return{removed:!1,path:r};let i=s.tower;return delete s.tower,0===Object.keys(s).length?delete o.mcpServers:o.mcpServers=s,t.writeFileSync(r,JSON.stringify(o,null,2)+"\n","utf-8"),{removed:!0,path:r,removedEntry:i,reason:"wrong-file"}}catch(e){return{removed:!1,path:r,error:e instanceof Error?e.message:String(e)}}}(s)),n.push(function(e,r,s){if(!t.existsSync(e))return{removed:!1,path:e};try{let i=t.readFileSync(e,"utf-8"),n=JSON.parse(i),a=n.mcpServers;if("object"!=typeof a||null===a||Array.isArray(a))return{removed:!1,path:e};let l=a.tower;if(!l)return{removed:!1,path:e};let c=function(e,r){let s,i=e.args;if(!Array.isArray(i))return"foreign-repo";for(let e of i)if("string"==typeof e&&o.isAbsolute(e)){s=e;break}return s?t.existsSync(s)?o.resolve(s).startsWith(o.resolve(r)+o.sep)?"current-repo":"foreign-repo":"missing-path":"foreign-repo"}(l,s);if("current-repo"===c)return{removed:!1,path:e,reason:"alive-current-repo"};return delete a.tower,0===Object.keys(a).length?delete n.mcpServers:n.mcpServers=a,t.writeFileSync(e,JSON.stringify(n,null,2)+"\n","utf-8"),{removed:!0,path:e,removedEntry:l,reason:`${r}:${c}`}}catch(t){return{removed:!1,path:e,error:t instanceof Error?t.message:String(t)}}}(o.join(s,".mcp.json"),"home-mcp-json",i)),{steps:n,removedAny:n.some(e=>e.removed)}}():void 0,u=d(),h=await c.installMcp(u,{scope:"user"}),p=await c.installHooks(i),k=await c.installSkill(a,o.join((0,n.getPackageRoot)(),"skills",a));return{provider:e,available:!0,migration:m,mcp:h,hooks:p,skill:k,ok:h.ok&&p.ok&&k.ok}}e.s(["buildTowerMcpConfig",0,d,"getTowerMcpName",0,l,"installAllForProvider",0,m],173215)}];
2
2
 
3
3
  //# sourceMappingURL=src_lib_ai_0xx6y51._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[136902,599603,e=>{"use strict";class t{providers=new Map;register(e){this.providers.set(e.name,e)}get(e){return this.providers.get(e)}getAll(){return Array.from(this.providers.values())}getCliAdapter(e){return this.providers.get(e)?.cli?.adapter??null}getQueryAdapter(e,t){let o=this.providers.get(e);return o?"api"===t?o.api?.adapter??null:o.cliQuery?.adapter??null:null}getAllowedCommands(){let e=[];for(let t of this.providers.values())t.cli?.command&&e.push(t.cli.command);return e}async getAvailableProviders(){let e=[];for(let t of this.providers.values()){let o=!!t.cli&&await t.cli.adapter.isAvailable(),s=o&&t.cli?await t.cli.adapter.getVersion():null,r=!!t.api&&!!process.env[t.api.keyEnvVar],i=!!t.api&&r;e.push({name:t.name,displayName:t.displayName,cli:{available:o,version:s},api:{available:i,keyConfigured:r}})}return e}}var o=e.i(902157),s=e.i(660526),r=e.i(750227),i=e.i(603484);function n(){return process.env.TOWER_PACKAGE_ROOT||process.cwd()}e.s(["getPackageRoot",0,n],599603);let a=["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"],l=["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],c=globalThis;if(!c.__providerRegistry){let m=new t;m.register({name:"claude",displayName:"Claude Code",agentFieldValue:"CLAUDE_CODE",cli:{command:"claude",adapter:new class t{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 o={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:o}}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??{},o=n().replace(/\\/g,"/"),s=r.join(o,"scripts","session-start-hook.js").replace(/\\/g,"/"),i=r.join(o,"scripts","post-tool-hook.js").replace(/\\/g,"/"),a=r.join(o,"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 "${i}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||l,(l=this.upsertHook(t,"Stop","stop-hook.js",{hooks:[{command:`node "${a}"`,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??{},o=n().replace(/\\/g,"/"),s=!1;for(let[e,i]of[["SessionStart","session-start-hook.js"],["PostToolUse","post-tool-hook.js"],["Stop","stop-hook.js"]]){let n=this.getHookArray(t,e),a=n.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(i)));if(a<0)continue;let l=r.join(o,"scripts",i).replace(/\\/g,"/"),c=`node "${l}"`,m=n[a]?.hooks?.[0];m&&m.command!==c&&(m.command=c,t[e]=n,s=!0)}s&&(e.hooks=t,this.writeSettings(e))}catch{}}upsertHook(e,t,o,s){let r=this.getHookArray(e,t),i=s?.hooks?.[0]?.command,n=r.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(o)));if(n>=0){if(r[n]?.hooks?.[0]?.command===i)return!1;r.splice(n,1)}return r.push(s),e[t]=r,!0}async uninstallHooks(){try{let e=this.readSettings(),t=e.hooks??{},o=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let e of["SessionStart","PostToolUse","Stop"]){let s=this.getHookArray(t,e);t[e]=s.filter(e=>!e.hooks?.some(e=>o.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 o=t.scope??"user",s={command:e.command,args:e.args};e.env&&Object.keys(e.env).length>0&&(s.env=e.env);let r=this.resolveCommand(),i=["mcp","add-json","-s",o,e.name,JSON.stringify(s)];try{return await this.runCli(r,["mcp","remove","-s",o,e.name],t.cwd).catch(()=>{}),await this.runCli(r,i,t.cwd),{ok:!0,method:"cli",detail:`${r} ${i.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${r} ${i.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let o=t.scope??"user",s=this.resolveCommand(),r=["mcp","remove","-s",o,e];try{return await this.runCli(s,r,t.cwd),{ok:!0,method:"cli",detail:`${s} ${r.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${s} ${r.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,t={}){let o=this.resolveCommand();try{return await this.runCli(o,["mcp","get",e],t.cwd,5e3),!0}catch{return!1}}async installSkill(e,t){let s=r.join(this.getConfigDir(),"skills",e);try{if(!o.existsSync(t))return{ok:!1,method:"symlink",detail:s,error:`Source skill dir does not exist: ${t}`};o.mkdirSync(r.dirname(s),{recursive:!0});let e=await o.promises.lstat(s).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,i.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:s,error:`Refusing to overwrite non-symlink at ${s}`};else try{let e=await o.promises.readlink(s);if(r.resolve(e)===r.resolve(t))return{ok:!0,method:"symlink",detail:`${s} → ${t} (already)`};await o.promises.unlink(s)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:s,error:`Refusing to overwrite non-symlink at ${s}`}}let n=(0,i.isWindows)()?"junction":"dir";return await o.promises.symlink(t,s,n),{ok:!0,method:"symlink",detail:`${s} → ${t}`}}catch(e){return{ok:!1,method:"symlink",detail:s,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let t=r.join(this.getConfigDir(),"skills",e);try{let e=await o.promises.lstat(t).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${t} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:t,error:`Refusing to remove non-symlink at ${t}`};return await o.promises.unlink(t),{ok:!0,method:"symlink",detail:t}}catch(e){return{ok:!1,method:"symlink",detail:t,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,t){let s=r.join(this.getConfigDir(),"skills",e);try{if(!(await o.promises.lstat(s)).isSymbolicLink())return!1;if(!t)return!0;let e=await o.promises.readlink(s),i=r.isAbsolute(e)?e:r.resolve(r.dirname(s),e);return r.resolve(i)===r.resolve(t)}catch{return!1}}async runCli(t,o,s,r=1e4){let{execFile:i}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(i),{stdout:l}=await a(t,o,{cwd:s,timeout:r});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:o}=await e.A(534777),{resolveSpawnTarget:s}=await e.A(998127),r=o(t),i=await s(this.resolveCommand(),["--version"]),{stdout:n}=await r(i.command,i.args,{timeout:5e3});return n.trim()||null}catch{return null}}async getModels(){return a}getConfigDir(){return r.join(s.homedir(),".claude")}getSettingsPath(){return r.join(this.getConfigDir(),"settings.json")}getSessionsDir(){return r.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,i.isWindows)()){let e=(0,i.resolveCommandPathSync)("claude-code");if("claude-code"!==e)return e}return(0,i.resolveCommandPathSync)("claude")}readSettings(){try{return JSON.parse(o.readFileSync(this.getSettingsPath(),"utf-8"))}catch{return{}}}writeSettings(e){let t=this.getConfigDir();o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),o.writeFileSync(this.getSettingsPath(),JSON.stringify(e,null,2),"utf-8")}getHookArray(e,t){let o=e[t];return Array.isArray(o)?o:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}},models:{cli:["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"],api:[]}}),m.register({name:"codex",displayName:"Codex CLI",agentFieldValue:"CODEX_CLI",cli:{command:"codex",adapter:new class t{buildSpawnArgs(e){let t=[];e.resumeSessionId?t.push("resume",e.resumeSessionId):e.continueLatest?t.push("resume","--last"):(t.push("--full-auto"),e.extraArgs?.length&&t.push(...e.extraArgs),e.prompt&&t.push(e.prompt));let o={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:o}}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.readHooks(),t=n().replace(/\\/g,"/"),o=r.join(t,"scripts","session-start-hook.js").replace(/\\/g,"/"),s=r.join(t,"scripts","post-tool-hook.js").replace(/\\/g,"/"),i=r.join(t,"scripts","stop-hook.js").replace(/\\/g,"/"),a=!1;return a=this.upsertHook(e,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${o}"`,timeout:5,type:"command"}]})||a,a=this.upsertHook(e,"PostToolUse","post-tool-hook.js",{hooks:[{command:`node "${s}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||a,(a=this.upsertHook(e,"Stop","stop-hook.js",{hooks:[{command:`node "${i}"`,timeout:5,type:"command"}]})||a)&&(this.writeHooks(e),this.ensureHooksFeatureEnabled()),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async repairHookPaths(){try{let e=this.readHooks(),t=n().replace(/\\/g,"/"),o=!1;for(let[s,i]of[["SessionStart","session-start-hook.js"],["PostToolUse","post-tool-hook.js"],["Stop","stop-hook.js"]]){let n=this.getHookArray(e,s),a=n.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(i)));if(a<0)continue;let l=r.join(t,"scripts",i).replace(/\\/g,"/"),c=`node "${l}"`,m=n[a]?.hooks?.[0];m&&m.command!==c&&(m.command=c,e[s]=n,o=!0)}o&&(this.writeHooks(e),this.ensureHooksFeatureEnabled())}catch{}}upsertHook(e,t,o,s){let r=this.getHookArray(e,t),i=s?.hooks?.[0]?.command,n=r.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(o)));if(n>=0){if(r[n]?.hooks?.[0]?.command===i)return!1;r.splice(n,1)}return r.push(s),e[t]=r,!0}async uninstallHooks(){try{let e=this.readHooks(),t=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let o of["SessionStart","PostToolUse","Stop"]){let s=this.getHookArray(e,o);e[o]=s.filter(e=>!e.hooks?.some(e=>t.some(t=>e.command?.includes(t))))}return this.writeHooks(e),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async isHooksInstalled(){let e=this.readHooks(),t=this.getHookArray(e,"PostToolUse");return this.hasHook(t,"post-tool-hook.js")}async installMcp(e,t={}){let o=this.resolveCommand(),s=["mcp","add",e.name];if(e.env)for(let[t,o]of Object.entries(e.env))s.push("--env",`${t}=${o}`);s.push("--",e.command,...e.args);try{return await this.runCli(o,["mcp","remove",e.name],t.cwd).catch(()=>{}),await this.runCli(o,s,t.cwd),{ok:!0,method:"cli",detail:`${o} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${o} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let o=this.resolveCommand(),s=["mcp","remove",e];try{return await this.runCli(o,s,t.cwd),{ok:!0,method:"cli",detail:`${o} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${o} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,t={}){let o=this.resolveCommand();try{return await this.runCli(o,["mcp","get",e],t.cwd,5e3),!0}catch{return!1}}async installSkill(e,t){let s=r.join(this.getConfigDir(),"skills",e);try{if(!o.existsSync(t))return{ok:!1,method:"symlink",detail:s,error:`Source skill dir does not exist: ${t}`};o.mkdirSync(r.dirname(s),{recursive:!0});let e=await o.promises.lstat(s).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,i.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:s,error:`Refusing to overwrite non-symlink at ${s}`};else try{let e=await o.promises.readlink(s);if(r.resolve(e)===r.resolve(t))return{ok:!0,method:"symlink",detail:`${s} → ${t} (already)`};await o.promises.unlink(s)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:s,error:`Refusing to overwrite non-symlink at ${s}`}}let n=(0,i.isWindows)()?"junction":"dir";return await o.promises.symlink(t,s,n),{ok:!0,method:"symlink",detail:`${s} → ${t}`}}catch(e){return{ok:!1,method:"symlink",detail:s,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let t=r.join(this.getConfigDir(),"skills",e);try{let e=await o.promises.lstat(t).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${t} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:t,error:`Refusing to remove non-symlink at ${t}`};return await o.promises.unlink(t),{ok:!0,method:"symlink",detail:t}}catch(e){return{ok:!1,method:"symlink",detail:t,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,t){let s=r.join(this.getConfigDir(),"skills",e);try{if(!(await o.promises.lstat(s)).isSymbolicLink())return!1;if(!t)return!0;let e=await o.promises.readlink(s),i=r.isAbsolute(e)?e:r.resolve(r.dirname(s),e);return r.resolve(i)===r.resolve(t)}catch{return!1}}async runCli(t,o,s,r=1e4){let{execFile:i}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(i),{stdout:l}=await a(t,o,{cwd:s,timeout:r});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:o}=await e.A(534777),{resolveSpawnTarget:s}=await e.A(998127),r=o(t),i=await s(this.resolveCommand(),["--version"]),{stdout:n}=await r(i.command,i.args,{timeout:5e3});return n.trim()||null}catch{return null}}async getModels(){return l}getConfigDir(){return r.join(s.homedir(),".codex")}getSettingsPath(){return r.join(this.getConfigDir(),"config.toml")}getSessionsDir(){return r.join(this.getConfigDir(),"sessions")}getApiKeyInfo(){return{envVar:"OPENAI_API_KEY",required:!1}}buildHelloProbeArgs(e){return{command:this.resolveCommand(),args:["exec",e]}}resolveCommand(){return process.env.CODEX_CLI_PATH?process.env.CODEX_CLI_PATH:(0,i.resolveCommandPathSync)("codex")}getHooksPath(){return r.join(this.getConfigDir(),"hooks.json")}readHooks(){try{return JSON.parse(o.readFileSync(this.getHooksPath(),"utf-8")).hooks??{}}catch{return{}}}writeHooks(e){let t=this.getConfigDir();o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),o.writeFileSync(this.getHooksPath(),JSON.stringify({hooks:e},null,2),"utf-8")}ensureHooksFeatureEnabled(){let e=this.getSettingsPath(),t="";try{t=o.readFileSync(e,"utf-8")}catch{}if(/codex_hooks\s*=\s*true/.test(t))return;/\[features\]/.test(t)?t=t.replace(/\[features\]/,"[features]\ncodex_hooks = true"):t+="\n[features]\ncodex_hooks = true\n";let s=this.getConfigDir();o.existsSync(s)||o.mkdirSync(s,{recursive:!0}),o.writeFileSync(e,t,"utf-8")}getHookArray(e,t){let o=e[t];return Array.isArray(o)?o:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}},models:{cli:["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],api:[]}}),c.__providerRegistry=m}let m=c.__providerRegistry;e.s(["providerRegistry",0,m],136902)}];
1
+ module.exports=[136902,599603,e=>{"use strict";class t{providers=new Map;register(e){this.providers.set(e.name,e)}get(e){return this.providers.get(e)}getAll(){return Array.from(this.providers.values())}getCliAdapter(e){return this.providers.get(e)?.cli?.adapter??null}getQueryAdapter(e,t){let o=this.providers.get(e);return o?"api"===t?o.api?.adapter??null:o.cliQuery?.adapter??null:null}getAllowedCommands(){let e=[];for(let t of this.providers.values())t.cli?.command&&e.push(t.cli.command);return e}async getAvailableProviders(){let e=[];for(let t of this.providers.values()){let o=!!t.cli&&await t.cli.adapter.isAvailable(),s=o&&t.cli?await t.cli.adapter.getVersion():null,r=!!t.api&&!!process.env[t.api.keyEnvVar],i=!!t.api&&r;e.push({name:t.name,displayName:t.displayName,cli:{available:o,version:s},api:{available:i,keyConfigured:r}})}return e}}var o=e.i(902157),s=e.i(660526),r=e.i(750227),i=e.i(603484);function n(){return process.env.TOWER_PACKAGE_ROOT||process.cwd()}e.s(["getPackageRoot",0,n],599603);let a=["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"],l=["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],c=globalThis;if(!c.__providerRegistry){let m=new t;m.register({name:"claude",displayName:"Claude Code",agentFieldValue:"CLAUDE_CODE",cli:{command:"claude",adapter:new class t{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 o={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:o}}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??{},o=n().replace(/\\/g,"/"),s=r.join(o,"scripts","tower-session-start-hook.js").replace(/\\/g,"/"),i=r.join(o,"scripts","tower-post-tool-hook.js").replace(/\\/g,"/"),a=r.join(o,"scripts","tower-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 "${i}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||l,(l=this.upsertHook(t,"Stop","stop-hook.js",{hooks:[{command:`node "${a}"`,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??{},o=n().replace(/\\/g,"/"),s=!1;for(let[e,i,n]of[["SessionStart","session-start-hook.js","tower-session-start-hook.js"],["PostToolUse","post-tool-hook.js","tower-post-tool-hook.js"],["Stop","stop-hook.js","tower-stop-hook.js"]]){let a=this.getHookArray(t,e),l=a.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(i)));if(l<0)continue;let c=r.join(o,"scripts",n).replace(/\\/g,"/"),m=`node "${c}"`,d=a[l]?.hooks?.[0];d&&d.command!==m&&(d.command=m,t[e]=a,s=!0)}s&&(e.hooks=t,this.writeSettings(e))}catch{}}upsertHook(e,t,o,s){let r=this.getHookArray(e,t),i=s?.hooks?.[0]?.command,n=r.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(o)));if(n>=0){if(r[n]?.hooks?.[0]?.command===i)return!1;r.splice(n,1)}return r.push(s),e[t]=r,!0}async uninstallHooks(){try{let e=this.readSettings(),t=e.hooks??{},o=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let e of["SessionStart","PostToolUse","Stop"]){let s=this.getHookArray(t,e);t[e]=s.filter(e=>!e.hooks?.some(e=>o.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 o=t.scope??"user",s={command:e.command,args:e.args};e.env&&Object.keys(e.env).length>0&&(s.env=e.env);let r=this.resolveCommand(),i=["mcp","add-json","-s",o,e.name,JSON.stringify(s)];try{return await this.runCli(r,["mcp","remove","-s",o,e.name],t.cwd).catch(()=>{}),await this.runCli(r,i,t.cwd),{ok:!0,method:"cli",detail:`${r} ${i.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${r} ${i.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let o=t.scope??"user",s=this.resolveCommand(),r=["mcp","remove","-s",o,e];try{return await this.runCli(s,r,t.cwd),{ok:!0,method:"cli",detail:`${s} ${r.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${s} ${r.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,t={}){let o=this.resolveCommand();try{return await this.runCli(o,["mcp","get",e],t.cwd,5e3),!0}catch{return!1}}async installSkill(e,t){let s=r.join(this.getConfigDir(),"skills",e);try{if(!o.existsSync(t))return{ok:!1,method:"symlink",detail:s,error:`Source skill dir does not exist: ${t}`};o.mkdirSync(r.dirname(s),{recursive:!0});let e=await o.promises.lstat(s).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,i.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:s,error:`Refusing to overwrite non-symlink at ${s}`};else try{let e=await o.promises.readlink(s);if(r.resolve(e)===r.resolve(t))return{ok:!0,method:"symlink",detail:`${s} → ${t} (already)`};await o.promises.unlink(s)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:s,error:`Refusing to overwrite non-symlink at ${s}`}}let n=(0,i.isWindows)()?"junction":"dir";return await o.promises.symlink(t,s,n),{ok:!0,method:"symlink",detail:`${s} → ${t}`}}catch(e){return{ok:!1,method:"symlink",detail:s,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let t=r.join(this.getConfigDir(),"skills",e);try{let e=await o.promises.lstat(t).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${t} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:t,error:`Refusing to remove non-symlink at ${t}`};return await o.promises.unlink(t),{ok:!0,method:"symlink",detail:t}}catch(e){return{ok:!1,method:"symlink",detail:t,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,t){let s=r.join(this.getConfigDir(),"skills",e);try{if(!(await o.promises.lstat(s)).isSymbolicLink())return!1;if(!t)return!0;let e=await o.promises.readlink(s),i=r.isAbsolute(e)?e:r.resolve(r.dirname(s),e);return r.resolve(i)===r.resolve(t)}catch{return!1}}async runCli(t,o,s,r=1e4){let{execFile:i}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(i),{stdout:l}=await a(t,o,{cwd:s,timeout:r});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:o}=await e.A(534777),{resolveSpawnTarget:s}=await e.A(998127),r=o(t),i=await s(this.resolveCommand(),["--version"]),{stdout:n}=await r(i.command,i.args,{timeout:5e3});return n.trim()||null}catch{return null}}async getModels(){return a}getConfigDir(){return r.join(s.homedir(),".claude")}getSettingsPath(){return r.join(this.getConfigDir(),"settings.json")}getSessionsDir(){return r.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,i.isWindows)()){let e=(0,i.resolveCommandPathSync)("claude-code");if("claude-code"!==e)return e}return(0,i.resolveCommandPathSync)("claude")}readSettings(){try{return JSON.parse(o.readFileSync(this.getSettingsPath(),"utf-8"))}catch{return{}}}writeSettings(e){let t=this.getConfigDir();o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),o.writeFileSync(this.getSettingsPath(),JSON.stringify(e,null,2),"utf-8")}getHookArray(e,t){let o=e[t];return Array.isArray(o)?o:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}},models:{cli:["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"],api:[]}}),m.register({name:"codex",displayName:"Codex CLI",agentFieldValue:"CODEX_CLI",cli:{command:"codex",adapter:new class t{buildSpawnArgs(e){let t=[];e.resumeSessionId?t.push("resume",e.resumeSessionId):e.continueLatest?t.push("resume","--last"):(t.push("--full-auto"),e.extraArgs?.length&&t.push(...e.extraArgs),e.prompt&&t.push(e.prompt));let o={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:o}}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.readHooks(),t=n().replace(/\\/g,"/"),o=r.join(t,"scripts","tower-session-start-hook.js").replace(/\\/g,"/"),s=r.join(t,"scripts","tower-post-tool-hook.js").replace(/\\/g,"/"),i=r.join(t,"scripts","tower-stop-hook.js").replace(/\\/g,"/"),a=!1;return a=this.upsertHook(e,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${o}"`,timeout:5,type:"command"}]})||a,a=this.upsertHook(e,"PostToolUse","post-tool-hook.js",{hooks:[{command:`node "${s}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"})||a,(a=this.upsertHook(e,"Stop","stop-hook.js",{hooks:[{command:`node "${i}"`,timeout:5,type:"command"}]})||a)&&(this.writeHooks(e),this.ensureHooksFeatureEnabled()),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async repairHookPaths(){try{let e=this.readHooks(),t=n().replace(/\\/g,"/"),o=!1;for(let[s,i,n]of[["SessionStart","session-start-hook.js","tower-session-start-hook.js"],["PostToolUse","post-tool-hook.js","tower-post-tool-hook.js"],["Stop","stop-hook.js","tower-stop-hook.js"]]){let a=this.getHookArray(e,s),l=a.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(i)));if(l<0)continue;let c=r.join(t,"scripts",n).replace(/\\/g,"/"),m=`node "${c}"`,d=a[l]?.hooks?.[0];d&&d.command!==m&&(d.command=m,e[s]=a,o=!0)}o&&(this.writeHooks(e),this.ensureHooksFeatureEnabled())}catch{}}upsertHook(e,t,o,s){let r=this.getHookArray(e,t),i=s?.hooks?.[0]?.command,n=r.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(o)));if(n>=0){if(r[n]?.hooks?.[0]?.command===i)return!1;r.splice(n,1)}return r.push(s),e[t]=r,!0}async uninstallHooks(){try{let e=this.readHooks(),t=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let o of["SessionStart","PostToolUse","Stop"]){let s=this.getHookArray(e,o);e[o]=s.filter(e=>!e.hooks?.some(e=>t.some(t=>e.command?.includes(t))))}return this.writeHooks(e),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async isHooksInstalled(){let e=this.readHooks(),t=this.getHookArray(e,"PostToolUse");return this.hasHook(t,"post-tool-hook.js")}async installMcp(e,t={}){let o=this.resolveCommand(),s=["mcp","add",e.name];if(e.env)for(let[t,o]of Object.entries(e.env))s.push("--env",`${t}=${o}`);s.push("--",e.command,...e.args);try{return await this.runCli(o,["mcp","remove",e.name],t.cwd).catch(()=>{}),await this.runCli(o,s,t.cwd),{ok:!0,method:"cli",detail:`${o} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${o} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,t={}){let o=this.resolveCommand(),s=["mcp","remove",e];try{return await this.runCli(o,s,t.cwd),{ok:!0,method:"cli",detail:`${o} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${o} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,t={}){let o=this.resolveCommand();try{return await this.runCli(o,["mcp","get",e],t.cwd,5e3),!0}catch{return!1}}async installSkill(e,t){let s=r.join(this.getConfigDir(),"skills",e);try{if(!o.existsSync(t))return{ok:!1,method:"symlink",detail:s,error:`Source skill dir does not exist: ${t}`};o.mkdirSync(r.dirname(s),{recursive:!0});let e=await o.promises.lstat(s).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,i.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:s,error:`Refusing to overwrite non-symlink at ${s}`};else try{let e=await o.promises.readlink(s);if(r.resolve(e)===r.resolve(t))return{ok:!0,method:"symlink",detail:`${s} → ${t} (already)`};await o.promises.unlink(s)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:s,error:`Refusing to overwrite non-symlink at ${s}`}}let n=(0,i.isWindows)()?"junction":"dir";return await o.promises.symlink(t,s,n),{ok:!0,method:"symlink",detail:`${s} → ${t}`}}catch(e){return{ok:!1,method:"symlink",detail:s,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let t=r.join(this.getConfigDir(),"skills",e);try{let e=await o.promises.lstat(t).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${t} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:t,error:`Refusing to remove non-symlink at ${t}`};return await o.promises.unlink(t),{ok:!0,method:"symlink",detail:t}}catch(e){return{ok:!1,method:"symlink",detail:t,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,t){let s=r.join(this.getConfigDir(),"skills",e);try{if(!(await o.promises.lstat(s)).isSymbolicLink())return!1;if(!t)return!0;let e=await o.promises.readlink(s),i=r.isAbsolute(e)?e:r.resolve(r.dirname(s),e);return r.resolve(i)===r.resolve(t)}catch{return!1}}async runCli(t,o,s,r=1e4){let{execFile:i}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(i),{stdout:l}=await a(t,o,{cwd:s,timeout:r});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:o}=await e.A(534777),{resolveSpawnTarget:s}=await e.A(998127),r=o(t),i=await s(this.resolveCommand(),["--version"]),{stdout:n}=await r(i.command,i.args,{timeout:5e3});return n.trim()||null}catch{return null}}async getModels(){return l}getConfigDir(){return r.join(s.homedir(),".codex")}getSettingsPath(){return r.join(this.getConfigDir(),"config.toml")}getSessionsDir(){return r.join(this.getConfigDir(),"sessions")}getApiKeyInfo(){return{envVar:"OPENAI_API_KEY",required:!1}}buildHelloProbeArgs(e){return{command:this.resolveCommand(),args:["exec",e]}}resolveCommand(){return process.env.CODEX_CLI_PATH?process.env.CODEX_CLI_PATH:(0,i.resolveCommandPathSync)("codex")}getHooksPath(){return r.join(this.getConfigDir(),"hooks.json")}readHooks(){try{return JSON.parse(o.readFileSync(this.getHooksPath(),"utf-8")).hooks??{}}catch{return{}}}writeHooks(e){let t=this.getConfigDir();o.existsSync(t)||o.mkdirSync(t,{recursive:!0}),o.writeFileSync(this.getHooksPath(),JSON.stringify({hooks:e},null,2),"utf-8")}ensureHooksFeatureEnabled(){let e=this.getSettingsPath(),t="";try{t=o.readFileSync(e,"utf-8")}catch{}if(/codex_hooks\s*=\s*true/.test(t))return;/\[features\]/.test(t)?t=t.replace(/\[features\]/,"[features]\ncodex_hooks = true"):t+="\n[features]\ncodex_hooks = true\n";let s=this.getConfigDir();o.existsSync(s)||o.mkdirSync(s,{recursive:!0}),o.writeFileSync(e,t,"utf-8")}getHookArray(e,t){let o=e[t];return Array.isArray(o)?o:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}},models:{cli:["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],api:[]}}),c.__providerRegistry=m}let m=c.__providerRegistry;e.s(["providerRegistry",0,m],136902)}];
2
2
 
3
3
  //# sourceMappingURL=src_lib_ai_providers_index_ts_0.y.3vp._.js.map
@@ -0,0 +1,3 @@
1
+ module.exports=[276534,e=>{"use strict";e.s(["CONFIG_DEFAULTS",0,{"git.pathMappingRules":{defaultValue:[],type:"object",label:"Git Path Mapping Rules"},"system.maxUploadBytes":{defaultValue:0x3200000,type:"number",label:"Max Upload Size (bytes)"},"system.maxConcurrentExecutions":{defaultValue:20,type:"number",label:"Max Concurrent Executions"},"system.maxReadableFileBytes":{defaultValue:5242880,type:"number",label:"Max Readable File Size (bytes)"},"system.backupDir":{defaultValue:"",type:"string",label:"Backup Directory"},"git.timeoutSec":{defaultValue:30,type:"number",label:"Git Operation Timeout (seconds)"},"search.resultLimit":{defaultValue:20,type:"number",label:"Search Result Limit"},"search.allModeCap":{defaultValue:5,type:"number",label:"All-Mode Per-Type Cap"},"search.debounceMs":{defaultValue:250,type:"number",label:"Search Debounce (ms)"},"search.snippetLength":{defaultValue:80,type:"number",label:"Snippet Length (characters)"},"search.codeTimeoutSec":{defaultValue:30,type:"number",label:"Code Search Timeout (seconds)"},"board.archiveDelayDays":{defaultValue:7,type:"number",label:"Archive Delay (days)"},"missions.grid.minCols":{defaultValue:1,type:"number",label:"Grid Min Columns"},"missions.grid.maxCols":{defaultValue:5,type:"number",label:"Grid Max Columns"},"missions.grid.minRows":{defaultValue:1,type:"number",label:"Grid Min Rows"},"missions.grid.maxRows":{defaultValue:5,type:"number",label:"Grid Max Rows"},"terminal.app":{defaultValue:"Terminal",type:"string",label:"Default Terminal App"},"editor.command":{defaultValue:"",type:"string",label:"Default Editor Command"},"terminal.wsPort":{defaultValue:3001,type:"number",label:"WebSocket Port"},"terminal.idleTimeoutSec":{defaultValue:180,type:"number",label:"Idle Timeout (seconds)"},"terminal.fontSize":{defaultValue:13,type:"number",label:"Terminal Font Size"},"terminal.fontFamily":{defaultValue:"Menlo, Monaco, 'Courier New', monospace",type:"string",label:"Terminal Font Family"},"assistant.systemPrompt":{defaultValue:'You are Tower Assistant — the built-in AI operator for the Tower task management platform.\n\n## Identity\n- You are a task management operator, NOT a coding assistant.\n- You can ONLY use Tower MCP tools. You CANNOT read files, edit code, run shell commands, or search the web.\n- Always respond in the same language the user uses.\n\n## Capabilities\nWhen users ask what you can do, respond with EXACTLY these 6 groups. Translate to the user\'s language.\n\n1. **Workspace & Project** — View, create, update, delete workspaces and projects. Search projects and repositories.\n2. **Task Management** — Create tasks (priority, labels, worktree branch isolation, sub-path, auto-start). Move task status (TODO → IN_PROGRESS → IN_REVIEW → DONE / CANCELLED). Update task info and labels.\n3. **Execution Monitor** — Start task execution, check execution status, get terminal output, send commands to running terminals.\n4. **Daily Report & Todo** — Generate daily work summary (completed + in-progress). View pending task list sorted by priority.\n5. **Labels & Notes & Assets** — Manage workspace labels, project notes, and file attachments.\n6. **Global Search** — Search tasks, projects, repositories, notes, and assets by keyword.\n\nDo NOT list any capabilities beyond the above. Do NOT mention code editing, debugging, testing, git operations, or any development capabilities.\n\n## Scope Boundary\nIf the user asks you to write code, explain code, debug, search the web, read/write files, or anything outside Tower task management, reply:\n"抱歉,我只能帮你管理工作区、项目和任务。编码、调试等操作请在任务终端中完成。"\n\n## 任务来源标注\n每次通过 create_task 创建任务时,在 description 末尾追加一段来源标注(与任务终端、飞书的来源规范一致):\n## 来源\nTower Assistant',type:"string",label:"Assistant System Prompt"},"assistant.displayMode":{defaultValue:"sidebar",type:"string",label:"Assistant Display Mode"},"assistant.communicationMode":{defaultValue:"chat",type:"string",label:"Assistant Communication Mode"},"task.defaultUseWorktree":{defaultValue:!0,type:"boolean",label:"Default: Use Worktree"},"task.defaultAutoStart":{defaultValue:!1,type:"boolean",label:"Default: Auto-start Execution"},"task.mcpDefaultsConfigured":{defaultValue:!1,type:"boolean",label:"MCP Task Defaults Configured"},"task.systemDirective":{defaultValue:"## Tower 系统说明\n你运行在 Tower(一个 AI 任务调度平台)的任务终端里,为某个具体任务而启动。你的产出会被 Tower 记录为「任务执行」,任务结束后进入 review 状态,可能被派生你的父任务或用户审阅。环境变量里有 TOWER_TASK_ID(当前任务 id)、TOWER_TASK_TITLE(任务标题)等,可用来识别自己。\n\n## 首要原则\n- **项目自身规则优先**:工作目录里项目的 CLAUDE.md / AGENTS.md 等约定优先级最高,与本声明冲突时以项目规则为准。本声明只规定「作为一个 Tower 任务」的通用行为,不覆盖具体项目的技术规范。\n- **只做任务范围内的事**:紧扣当前任务目标,不顺手改无关代码、不擅自扩大改动面。\n- **完成即验证**:有测试 / 构建 / lint / 类型检查就先跑一遍再宣称「做完」;失败如实报告,不确定就说不确定,别把没验证的当成功。\n- **长进程别占住终端**:dev server、watch 等需长时间前台运行的命令,用完即停或放后台,别让任务终端被永久卡住(Tower 的 Preview 有独立管理,通常不需要你手动起 dev server)。\n- **默认用中文回复**(除非项目或用户另有要求)。\n\n## Git 工作规则\n- 完成一段有意义的改动后,主动用清晰的 message 创建 commit(约定式:feat / fix / refactor / docs / chore…),不要留一堆未提交的改动。\n- 若当前任务运行在 Git worktree 隔离分支里(worktree 任务):**只 commit,不要 push** —— worktree 分支由 Tower 统一管理与合并。\n- 若当前任务直接在项目主工作区里(非 worktree 任务):可以 push。\n- 不确定自己是不是 worktree 任务时,默认只 commit、不 push。\n\n## 并发与协作(多任务可能同改一个仓库)\n- Tower 常同时跑多个任务、甚至同一仓库多个 worktree。**只 stage / commit 你这轮亲手改的文件**,一律 `git add <明确路径>`;禁止 `git add .` / `-A` / `-u` / `git commit -a`,别把别的窗口或用户手动的改动一并提交。\n- `git status` 里不认识、不是你改的文件一律不碰、不提交,需要时在小结里提一句即可。\n- 不 force-push、不改写共享分支历史;不对不属于你的改动做 `git reset --hard` / `git clean -fd`。\n\n## Worktree 纪律(务必防止改到主仓库)\n- 开工第一件事先跑 `pwd`:它就是你的工作根。之后所有 Read/Edit/Write/Bash 路径都以它为基准,优先用相对路径;用绝对路径时必须以这个根开头,**绝不**凭上下文/记忆里的主仓库路径去拼绝对路径——这正是历次「worktree 里看什么都没变」的根因。\n- 判断自己是不是 worktree 任务:`pwd` 落在 `.worktrees/task-$TOWER_TASK_ID` 下、或 `git branch --show-current` 为 `task/$TOWER_TASK_ID`,即是。是则严格走本节纪律。\n- 动任何文件 / 提交前,先核对三件事都成立:① `git rev-parse --show-toplevel` 等于当前 worktree 根(不是主仓库路径);② `git branch --show-current` 为 `task/$TOWER_TASK_ID`(不是 main / feature / 其它分支);③ 要改的文件绝对路径含 `.worktrees/task-$TOWER_TASK_ID/` 段。任一不满足,说明你操作到主仓库了,**立即停止、不要提交**,先纠正目录。\n- 绝不 `cd` 到主仓库或 worktree 之外去改文件 / 跑 git;所有 git 命令都在当前 worktree 根内执行(跨目录时用 `git -C <worktree 根>` 显式指定,别靠默认 cwd 猜)。\n- 万一已经改错到主仓库:把改动搬回 worktree(`git -C <worktree 根> cherry-pick <误提交>` 或重打一遍),主仓库工作区用 `git restore` 复原、误提交按情况处理——已被别的提交叠在上面就用 `git revert`(保历史、不动别人的提交),确认独占且未 push 才用 `git reset`;最后如实报告两边最终状态,不要隐瞒。\n\n## 汇报与交接\n- 产出会被 review,结尾给一段可速读的小结:做了什么、改了哪些关键文件、验证结果、还剩什么没做 / 被什么阻塞、有没有需要用户或父任务拍板的决策。\n- 真被外部因素阻塞(待接口、待素材、待人决策)就**明确说明并停下**,别反复空转或自行臆测硬做。\n- 危险 / 不可逆操作(删数据库、删大目录、`rm -rf`、`drop table`、对外发布 / 部署)先说明并征得确认再执行。\n\n## 无人值守(环境变量 TOWER_UNATTENDED=1 时尤其重要)\n- 你可能在无人盯守下运行。两个与人沟通的 MCP 工具:`ask_human`(阻塞:**记录**问题并挂起任务——本回合到此为止,人回复后自动唤醒、带答案续跑)和 `notify_human`(非阻塞:**记录**一条进度/FYI 后立即继续,不必等回复、不挂起)。**注意:这两个工具只在 Tower 内记录(/harness 面板可见),本身不把消息发给人**;无人值守下要真正通知到人,须按系统提示里「无人值守外推」段先经平台渠道把消息发出去,再调这两个工具留档。\n- 需要人拍板才能推进(选型、二义需求、缺关键信息、对外发布/部署等)→ 用 `ask_human` 把问题和可选项讲清楚,然后停下等待,别自行臆测硬做。\n- 危险 / 不可逆操作(删库、删大目录、`rm -rf`、`drop table`、force-push、对外发布)→ 一律先 `ask_human` 征得同意再执行,即使终端已放开权限也不例外。\n- 只是想同步进展或抛个 FYI、无需回复 → 用 `notify_human`,发完继续干。\n- 调用 `ask_human` 后立即结束本回合、不要再继续操作;它会关闭终端省资源,人回复后任务自动恢复。\n\n## 本轮 commit 回显\n- **每轮回复的最后,必须把本轮创建的 commit 列出来让用户一眼看到**。格式固定:先一行加粗小标题 `**本轮 commit**`(不要用 `---` 分隔线、不要用 emoji),换行后每条 commit 单独一行、以 `- ` 开头,形如 `` - `<短 hash>` <message 首行> ``(hash 用行内代码包住)。本轮没有创建任何 commit 时,只回一行 `本轮无 commit`。",type:"string",label:"Task System Directive (built-in)"},"harness.targets":{defaultValue:[],type:"object",label:"Harness Notify Targets (multi-platform registry)"},"harness.pendingTtlDays":{defaultValue:14,type:"number",label:"Harness Pending Ask TTL (days)"}}])}];
2
+
3
+ //# sourceMappingURL=src_lib_config-defaults_ts_10ayktg._.js.map
@@ -0,0 +1,3 @@
1
+ module.exports=[572173,e=>{"use strict";var r=e.i(843793);async function t(e,t){let n=await r.db.systemConfig.findUnique({where:{key:e}});if(!n)return t;try{return JSON.parse(n.value)}catch{return t}}e.s(["readConfigValue",0,t])}];
2
+
3
+ //# sourceMappingURL=src_lib_config-reader_ts_0e5f7vk._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[144016,a=>{"use strict";var b=a.i(728778),c=a.i(374637),d=a.i(553798),e=a.i(634910),f=a.i(774881),g=a.i(607219),h=a.i(10390),i=a.i(269280),j=a.i(711796);let k=(0,j.default)("settings-2",[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]]);var l=a.i(699570),m=a.i(269876),n=a.i(157551),o=a.i(577565),p=a.i(207339),q=a.i(881107),r=a.i(394869),s=a.i(347165),t=a.i(350739);let u=(0,j.default)("image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);var v=a.i(690251);let w=(0,j.default)("package-check",[["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m16 17 2 2 4-4",key:"uh5qu3"}],["path",{d:"M21 11.127V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.729l7 4a2 2 0 0 0 2 .001l1.32-.753",key:"kpkbpo"}],["path",{d:"M3.29 7 12 12l8.71-5",key:"19ckod"}],["path",{d:"m7.5 4.27 8.997 5.148",key:"9yrvtv"}]]),x=(0,j.default)("panel-right",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M15 3v18",key:"14nvp0"}]]);var y=a.i(785259),z=a.i(521007),A=a.i(551578),B=a.i(951192);function C(a){if(!a)return"";let b="string"==typeof a?new Date(a):a;if(isNaN(b.getTime()))return"";let c=String(b.getMonth()+1).padStart(2,"0"),d=String(b.getDate()).padStart(2,"0");return`${c}-${d}`}let D=Object.fromEntries(z.BOARD_COLUMNS.map(a=>[a.id,a.color]));function E({children:a,className:c}){return(0,b.jsx)("span",{className:`inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/40 px-2 py-0.5 text-xs text-muted-foreground ${c??""}`,children:a})}function F({task:a,onOpenDetail:d}){let{t:e}=(0,B.useI18n)(),[f,g]=(0,c.useState)(!1),i="CANCELLED"===a.status?"text-muted-foreground line-through decoration-muted-foreground/40":"DONE"===a.status?"text-muted-foreground":"text-foreground";return(0,b.jsxs)("div",{className:"rounded-[10px]",children:[(0,b.jsxs)("button",{type:"button",onClick:()=>g(a=>!a),className:"flex w-full items-center gap-2.5 rounded-[10px] px-2.5 py-2.5 text-left transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:[(0,b.jsx)(h.ChevronRight,{className:`h-3.5 w-3.5 flex-none text-muted-foreground/60 transition-transform duration-150 ${f?"rotate-90":""}`}),(0,b.jsx)("span",{className:`h-2 w-2 flex-none rounded-full ${D[a.status]??"bg-slate-400"}`}),(0,b.jsx)("span",{className:`text-[13.5px] font-medium ${i}`,children:a.title}),a.labels.map(({label:a})=>(0,b.jsx)("span",{className:"rounded-full border border-border px-1.5 py-px text-[10.5px] text-muted-foreground",style:a.color?{borderColor:a.color+"55",color:a.color}:void 0,children:a.name},a.id)),(0,b.jsx)("span",{className:"flex-1"}),(0,b.jsx)("span",{className:"flex w-16 flex-none justify-center",children:(0,b.jsx)("span",{className:`rounded-[5px] px-1.5 py-px text-[10.5px] font-bold ${z.PRIORITY_CONFIG[a.priority]?.color??z.PRIORITY_CONFIG.LOW.color}`,children:a.priority})}),(0,b.jsx)("span",{className:"h-3 w-px bg-border flex-none"}),(0,b.jsxs)("span",{className:"flex w-[72px] flex-none items-center gap-1.5",children:[(0,b.jsx)("span",{className:`h-1.5 w-1.5 flex-none rounded-full ${D[a.status]??"bg-slate-400"}`}),(0,b.jsx)("span",{className:"truncate text-[10.5px] text-muted-foreground",children:e(`version.taskStatus.${a.status}`)})]}),(0,b.jsx)("span",{className:"h-3 w-px bg-border flex-none"}),(0,b.jsx)("span",{className:"flex w-6 flex-none justify-center",children:d&&(0,b.jsxs)(y.Tooltip,{children:[(0,b.jsx)(y.TooltipTrigger,{render:(0,b.jsx)(l.Button,{variant:"ghost",size:"icon",className:"h-6 w-6 text-muted-foreground",onClick:b=>{b.stopPropagation(),d(a.id)}}),children:(0,b.jsx)(x,{className:"h-3.5 w-3.5"})}),(0,b.jsx)(y.TooltipContent,{children:e("version.detail")})]})})]}),f&&(0,b.jsxs)("div",{className:"flex flex-col gap-2.5 pb-3 pl-[30px] pr-3 pt-1",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"mb-1.5 flex items-center gap-1.5",children:[(0,b.jsx)(s.FolderOpen,{className:"h-3 w-3 text-muted-foreground/60"}),(0,b.jsx)("span",{className:"text-[11px] font-bold uppercase tracking-wide text-muted-foreground/60",children:e("version.resources")})]}),0===a.assets.length?(0,b.jsx)("p",{className:"text-[12px] italic text-muted-foreground/60",children:e("version.empty.resources")}):(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:a.assets.map(a=>{var c;let d=a.mimeType?.startsWith("image/");return(0,b.jsxs)("span",{className:"inline-flex cursor-pointer items-center gap-1.5 rounded-lg border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground shadow-sm transition-colors hover:border-primary/50",children:[d?(0,b.jsx)(u,{className:"h-3.5 w-3.5 text-muted-foreground"}):(0,b.jsx)(t.FileText,{className:"h-3.5 w-3.5 text-muted-foreground"}),(0,b.jsx)("span",{children:a.filename}),null!=a.size&&(0,b.jsx)("span",{className:"text-[11px] text-muted-foreground/60",children:(c=a.size)<1024?`${c} B`:c<1048576?`${Math.round(c/1024)} KB`:`${(c/1048576).toFixed(1)} MB`})]},a.id)})})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"mb-1.5 flex items-center gap-1.5",children:[(0,b.jsx)(t.FileText,{className:"h-3 w-3 text-muted-foreground/60"}),(0,b.jsx)("span",{className:"text-[11px] font-bold uppercase tracking-wide text-muted-foreground/60",children:e("version.notes")})]}),0===a.notes.length?(0,b.jsx)("p",{className:"text-[12px] italic text-muted-foreground/60",children:e("version.empty.notes")}):(0,b.jsx)("div",{className:"flex flex-col gap-1.5",children:a.notes.map(a=>(0,b.jsx)("div",{className:"rounded-lg border border-border border-l-violet-500/50 bg-background px-2.5 py-2 shadow-sm [border-left-width:3px]",children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"text-[12.5px] font-semibold text-foreground",children:a.title}),a.category&&(0,b.jsx)("span",{className:"rounded-[5px] border border-violet-500/30 bg-violet-500/15 px-1.5 py-px text-[10px] font-bold text-violet-300",children:a.category})]})},a.id))})]})]})]})}function G({version:a,diffStat:d,onEdit:e,onRelease:f,onViewDiff:g,onOpenTaskDetail:i}){var j;let k,{t:m}=(0,B.useI18n)(),[s,t]=(0,c.useState)(a.isCurrent),u="RELEASED"===a.status,x="ACTIVE"===a.status,z=a.tasks.length,D=a.tasks.filter(a=>"DONE"===a.status).length,H=!!(a.releaseCommit||d),I=(k=`${z} ${m("version.tasksCount")}`,D>0&&D<z?`${k} \xb7 ${D} ${m("version.doneCount")}`:D>0&&D===z?`${k} \xb7 ${m("version.allDone")}`:k);return(0,b.jsxs)("div",{className:["overflow-hidden rounded-[14px] border bg-card shadow-sm transition-shadow duration-150 hover:shadow-md",a.isCurrent?"border-border border-l-2 border-l-primary ring-1 ring-primary/20":"border-border",u?"opacity-[.96]":""].filter(Boolean).join(" "),children:[(0,b.jsx)("button",{type:"button",onClick:()=>t(a=>!a),className:"w-full text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:(0,b.jsxs)("div",{className:"px-4 py-3.5",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)(h.ChevronRight,{className:`h-4 w-4 flex-none text-muted-foreground/60 transition-transform duration-150 ${s?"rotate-90":""}`}),(0,b.jsx)("span",{className:"font-mono text-[14.5px] font-bold text-foreground",children:a.number}),(0,b.jsx)("span",{className:"text-[14.5px] font-semibold text-foreground",children:a.name}),(0,b.jsx)(A.VersionTypeBadge,{name:a.type?.name??null}),(0,b.jsx)(A.VersionStatusBadge,{status:a.status}),a.isCurrent&&(0,b.jsxs)("span",{className:"inline-flex items-center gap-1.5 rounded-full border border-primary/30 bg-primary/15 px-2.5 py-0.5 text-[11px] font-bold text-primary shadow-sm",children:[(0,b.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-primary opacity-90"}),m("version.current")]}),(0,b.jsx)("span",{className:"flex-1"}),z>0&&(0,b.jsx)("span",{className:"text-[11.5px] text-muted-foreground",children:I}),(0,b.jsxs)("span",{className:"flex items-center gap-1",onClick:a=>a.stopPropagation(),onKeyDown:a=>a.stopPropagation(),children:[e&&(0,b.jsxs)(y.Tooltip,{children:[(0,b.jsx)(y.TooltipTrigger,{render:(0,b.jsx)(l.Button,{variant:"ghost",size:"icon",className:"h-7 w-7 text-muted-foreground",onClick:()=>e(a.id)}),children:(0,b.jsx)(v.Pencil,{className:"h-3.5 w-3.5"})}),(0,b.jsx)(y.TooltipContent,{children:m("version.edit")})]}),x&&f&&(0,b.jsxs)(l.Button,{variant:"outline",className:"h-7 px-2 text-xs font-semibold",onClick:()=>f(a.id),children:[(0,b.jsx)(w,{className:"h-3.5 w-3.5"}),m("version.release")]})]})]}),(0,b.jsxs)("div",{className:"mt-2.5 flex flex-wrap items-center gap-2",children:[u&&a.releasedAt?(0,b.jsxs)(E,{children:[(0,b.jsx)(n.Calendar,{className:"h-3 w-3"}),m("version.releasedAt"),(0,b.jsx)("strong",{className:"text-foreground",children:C(a.releasedAt)})]}):a.startDate||a.targetDate?(0,b.jsxs)(E,{children:[(0,b.jsx)(n.Calendar,{className:"h-3 w-3"}),a.startDate?C(a.startDate):"—"," → ",a.targetDate?(0,b.jsx)("strong",{className:"text-foreground",children:C(a.targetDate)}):"—"]}):null,a.baseBranch&&(0,b.jsxs)(E,{children:[(0,b.jsx)(o.GitBranch,{className:"h-3 w-3"}),(0,b.jsx)("span",{className:"font-mono text-[11px] text-foreground",children:a.baseBranch})]}),a.baseCommit&&(0,b.jsxs)(E,{children:[(0,b.jsx)(p.GitCommitHorizontal,{className:"h-3 w-3"}),m("version.field.baseCommit"),(0,b.jsx)("span",{className:"font-mono text-[11px] text-foreground",children:(j=a.baseCommit)?j.slice(0,7):""})]}),u&&(0,b.jsxs)(E,{children:[(0,b.jsx)(q.Tag,{className:"h-3 w-3"}),(0,b.jsx)("span",{className:"font-mono text-[11px] text-foreground",children:a.number})]}),d&&(0,b.jsxs)(E,{children:[(0,b.jsx)(r.GitCompare,{className:"h-3 w-3"}),!u&&(0,b.jsx)("span",{className:"text-muted-foreground",children:m("version.diff.live")}),(0,b.jsxs)("span",{className:"font-bold text-emerald-400",children:["+",d.additions.toLocaleString()]}),(0,b.jsxs)("span",{className:"font-bold text-rose-400",children:["−",d.deletions.toLocaleString()]}),(0,b.jsxs)("span",{className:"text-muted-foreground",children:["· ",d.files," ",m("version.diff.files")]})]}),H&&g&&(0,b.jsxs)(l.Button,{variant:"ghost",size:"sm",className:"h-6 gap-1 px-2 text-xs text-muted-foreground",onClick:b=>{b.stopPropagation(),g(a.id)},children:[(0,b.jsx)(r.GitCompare,{className:"h-3 w-3"}),m("version.diff.view")," →"]})]}),a.description&&(0,b.jsx)("p",{className:"mt-2 text-[13px] text-muted-foreground",children:a.description})]})}),s&&z>0&&(0,b.jsx)("div",{className:"border-t border-dashed border-border bg-muted/40 px-2 pb-2 pt-1.5",children:a.tasks.map(a=>(0,b.jsx)(F,{task:a,onOpenDetail:i},a.id))})]})}var H=a.i(952313),I=a.i(668116),J=a.i(113047),K=a.i(814574),L=a.i(866718),M=a.i(412783),N=a.i(580701),O=a.i(599209),P=a.i(419622),Q=a.i(563658),R=a.i(429246),S=a.i(780410);let T=(0,S.createServerReference)("40875e8cbdeb1c6531ecd98e1a64ee30615c409c40",S.callServer,void 0,S.findSourceMapURL,"createVersion"),U=(0,S.createServerReference)("606b30b8f75f44f2116597bf593781a78472ec4eb2",S.callServer,void 0,S.findSourceMapURL,"updateVersion"),V=(0,S.createServerReference)("40238ad60822bb55adbf623dffd37ac64a88c71e03",S.callServer,void 0,S.findSourceMapURL,"getVersionTypes");var W=a.i(395582),X=a.i(402767),Y=a.i(975231);let Z=(0,S.createServerReference)("40b2d2e0d870f7ba902a016c23446379c065bd7372",S.callServer,void 0,S.findSourceMapURL,"createVersionType"),$=(0,S.createServerReference)("60eea878af94b0743388057d97aa005e606c6ca2ad",S.callServer,void 0,S.findSourceMapURL,"updateVersionType"),_=(0,S.createServerReference)("40b029149a9f74f3c83bae3ceb4716a9b9be8ee0fd",S.callServer,void 0,S.findSourceMapURL,"deleteVersionType");function aa({open:a,onOpenChange:d,workspaceId:e,onChanged:f}){let{t:g}=(0,B.useI18n)(),[h,i]=(0,c.useState)([]),[j,k]=(0,c.useState)(""),[m,n]=(0,c.useState)({}),[o,p]=(0,c.useTransition)(),q=async()=>{let a=await V(e);i(a),n(b=>{let c={};return a.forEach(a=>{c[a.id]=a.id in b?b[a.id]:a.name}),c})};(0,c.useEffect)(()=>{a&&(q(),k(""))},[a,e]);let r=()=>{let a=j.trim();a&&p(async()=>{try{await Z({workspaceId:e,name:a}),k(""),await q(),f?.(),H.toast.success(g("version.type.add"))}catch(a){H.toast.error(a instanceof Error?a.message:String(a))}})};return(0,b.jsx)(K.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(K.DialogContent,{className:"sm:max-w-md",children:[(0,b.jsx)(K.DialogHeader,{children:(0,b.jsx)(K.DialogTitle,{children:g("version.manageTypes")})}),(0,b.jsxs)("div",{className:"flex flex-col gap-4 py-2",children:[(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(L.Input,{value:j,onChange:a=>k(a.target.value),placeholder:g("version.type.namePlaceholder"),disabled:o,onKeyDown:a=>{"Enter"===a.key&&r()},className:"flex-1"}),(0,b.jsx)(l.Button,{onClick:r,disabled:o||!j.trim(),children:g("version.type.add")})]}),0===h.length?(0,b.jsx)("p",{className:"text-center text-sm text-muted-foreground py-4",children:g("version.type.empty")}):(0,b.jsx)("div",{className:"flex flex-col gap-1.5",children:h.map(a=>(0,b.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-border bg-muted/30 px-3 py-2",children:[(0,b.jsx)("span",{className:`inline-flex h-2.5 w-2.5 flex-none rounded-full ${(0,A.typeBadgeColor)(m[a.id]??a.name).split(" ").filter(a=>a.startsWith("bg-"))[0]??"bg-muted"}`}),(0,b.jsx)(L.Input,{value:m[a.id]??a.name,onChange:b=>n(c=>({...c,[a.id]:b.target.value})),onBlur:()=>(a=>{let b=(m[a]??"").trim();if(!b)return;let c=h.find(b=>b.id===a);c?.name!==b&&p(async()=>{try{await $(a,{name:b}),await q(),f?.()}catch(b){H.toast.error(b instanceof Error?b.message:String(b)),n(b=>({...b,[a]:c?.name??""}))}})})(a.id),onKeyDown:a=>{"Enter"===a.key&&a.target.blur()},disabled:o,className:"h-7 flex-1 border-transparent bg-transparent shadow-none focus-visible:border-input focus-visible:bg-background focus-visible:shadow-sm"}),(0,b.jsx)(l.Button,{variant:"ghost",size:"icon",className:"h-7 w-7 flex-none text-muted-foreground hover:text-destructive",onClick:()=>{var b;return b=a.id,void(window.confirm(g("version.type.deleteConfirm"))&&p(async()=>{try{await _(b),await q(),f?.()}catch(a){H.toast.error(a instanceof Error?a.message:String(a))}}))},disabled:o,children:(0,b.jsx)(Y.Trash2,{className:"h-3.5 w-3.5"})})]},a.id))})]})]})})}function ab(a){if(!a)return"";let b="string"==typeof a?new Date(a):a;if(isNaN(b.getTime()))return"";let c=b.getFullYear(),d=String(b.getMonth()+1).padStart(2,"0"),e=String(b.getDate()).padStart(2,"0");return`${c}-${d}-${e}`}function ac(a){if(!a)return;let b=new Date(a);return isNaN(b.getTime())?void 0:b}function ad({open:a,onOpenChange:d,projectId:e,workspaceId:f,editVersion:g,defaultBaseBranch:h,projectLocalPath:i,onSuccess:j}){let{t:k}=(0,B.useI18n)(),m=!!g,[n,p]=(0,c.useState)(""),[q,r]=(0,c.useState)(""),[s,t]=(0,c.useState)(""),[u,v]=(0,c.useState)([]),[w,x]=(0,c.useState)(!1),[y,z]=(0,c.useState)(""),[A,C]=(0,c.useState)(""),[D,E]=(0,c.useState)(""),[F,G]=(0,c.useState)(""),[S,Y]=(0,c.useState)(!1),[Z,$]=(0,c.useState)([]),[_,ae]=(0,c.useState)(!1),[af,ag]=(0,c.useState)(!1),ah=!!i,[ai,aj]=(0,c.useTransition)();return(0,c.useEffect)(()=>{a&&(g?(p(g.number),r(g.name),t(g.typeId??""),z(g.baseBranch??""),C(ab(g.startDate)),E(ab(g.targetDate)),G(g.description??"")):(p(""),r(""),t(""),z(h??""),C(""),E(""),G("")),Y(!1))},[a,g,h]),(0,c.useEffect)(()=>{a&&V(f).then(v).catch(()=>v([]))},[a,f]),(0,c.useEffect)(()=>{a&&ah?(ae(!0),(0,W.getProjectBranches)(i).then($).catch(()=>$([])).finally(()=>ae(!1)),(0,X.fetchRemoteBranches)(i).then(()=>(0,W.getProjectBranches)(i).then($)).catch(()=>{})):$([])},[a,ah,i]),(0,b.jsxs)(K.Dialog,{open:a,onOpenChange:d,children:[(0,b.jsxs)(K.DialogContent,{className:"sm:max-w-md",children:[(0,b.jsx)(K.DialogHeader,{children:(0,b.jsx)(K.DialogTitle,{children:m?k("version.edit"):k("version.new")})}),(0,b.jsxs)("div",{className:"grid gap-4 py-2",children:[(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsxs)(M.Label,{htmlFor:"version-number",children:[k("version.field.number"),(0,b.jsx)("span",{className:"text-destructive ml-0.5",children:"*"})]}),(0,b.jsx)(L.Input,{id:"version-number",value:n,onChange:a=>p(a.target.value),placeholder:k("version.placeholder.number"),disabled:ai})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsxs)(M.Label,{htmlFor:"version-name",children:[k("version.field.name"),(0,b.jsx)("span",{className:"text-destructive ml-0.5",children:"*"})]}),(0,b.jsx)(L.Input,{id:"version-name",value:q,onChange:a=>r(a.target.value),placeholder:k("version.placeholder.name"),disabled:ai})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)(M.Label,{children:k("version.field.type")}),(0,b.jsxs)(N.Select,{value:s||"__none__",onValueChange:a=>{t(a&&"__none__"!==a?a:"")},children:[(0,b.jsx)(N.SelectTrigger,{className:"w-full",disabled:ai,children:(0,b.jsx)("span",{className:"truncate",children:s?u.find(a=>a.id===s)?.name??k("version.type.uncategorized"):k("version.type.uncategorized")})}),(0,b.jsxs)(N.SelectContent,{children:[(0,b.jsx)(N.SelectItem,{value:"__none__",children:k("version.type.uncategorized")}),u.map(a=>(0,b.jsx)(N.SelectItem,{value:a.id,children:a.name},a.id))]})]}),(0,b.jsxs)(l.Button,{type:"button",variant:"ghost",size:"sm",className:"h-auto justify-start px-0 py-0.5 text-xs text-muted-foreground hover:text-foreground",onClick:()=>x(!0),disabled:ai,children:["+ ",k("version.manageTypes")]})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)(M.Label,{children:k("version.field.baseBranch")}),_?(0,b.jsx)("div",{className:"text-sm text-muted-foreground",children:k("task.branchLoading")}):ah&&Z.length>0?(0,b.jsxs)(O.Popover,{open:af,onOpenChange:ag,children:[(0,b.jsxs)(O.PopoverTrigger,{className:"flex h-8 w-full items-center gap-2 rounded-lg border border-input bg-transparent px-3 text-sm transition-colors hover:bg-accent focus:outline-none focus-visible:ring-3 focus-visible:ring-ring/50 disabled:opacity-50",disabled:ai,"data-testid":"version-branch-selector",children:[(0,b.jsx)(o.GitBranch,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}),(0,b.jsx)("span",{className:`flex-1 truncate text-left text-xs ${y?"font-mono":"text-muted-foreground"}`,title:y||void 0,children:y||k("version.field.noBranch")}),(0,b.jsx)(J.ChevronsUpDown,{className:"h-3.5 w-3.5 shrink-0 opacity-50"})]}),(0,b.jsx)(O.PopoverContent,{className:"w-[min(32rem,90vw)] p-0",align:"start",children:(0,b.jsxs)(P.Command,{children:[(0,b.jsx)(P.CommandInput,{placeholder:k("task.branchSearch")}),(0,b.jsxs)(P.CommandList,{children:[(0,b.jsx)(P.CommandEmpty,{children:k("task.branchNone")}),(0,b.jsxs)(P.CommandGroup,{children:[(0,b.jsxs)(P.CommandItem,{value:"__none__",onSelect:()=>{z(""),ag(!1)},children:[(0,b.jsx)("span",{className:"flex-1 truncate text-muted-foreground",children:k("version.field.noBranch")}),!y&&(0,b.jsx)(I.Check,{className:"ml-auto h-3 w-3 shrink-0 text-primary"})]}),Z.map(a=>(0,b.jsxs)(P.CommandItem,{value:a,onSelect:()=>{z(a),ag(!1)},children:[(0,b.jsx)(o.GitBranch,{className:"mr-2 h-3 w-3 shrink-0 text-muted-foreground"}),(0,b.jsx)("span",{className:"flex-1 truncate font-mono",title:a,children:a}),a===y&&(0,b.jsx)(I.Check,{className:"ml-auto h-3 w-3 shrink-0 text-primary"})]},a))]})]})]})})]}):(0,b.jsx)(L.Input,{id:"version-base-branch",value:y,onChange:a=>z(a.target.value),placeholder:"main",disabled:ai})]}),(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)(M.Label,{htmlFor:"version-start-date",children:k("version.field.startDate")}),(0,b.jsx)("input",{id:"version-start-date",type:"date",value:A,onChange:a=>C(a.target.value),disabled:ai,className:"h-8 w-full rounded-lg border border-input bg-transparent px-2.5 py-1 text-sm outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50"})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)(M.Label,{htmlFor:"version-target-date",children:k("version.field.targetDate")}),(0,b.jsx)("input",{id:"version-target-date",type:"date",value:D,onChange:a=>E(a.target.value),disabled:ai,className:"h-8 w-full rounded-lg border border-input bg-transparent px-2.5 py-1 text-sm outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50"})]})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)(M.Label,{htmlFor:"version-description",children:k("version.field.description")}),(0,b.jsx)(R.Textarea,{id:"version-description",value:F,onChange:a=>G(a.target.value),rows:3,disabled:ai})]}),!m&&(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)(Q.Switch,{id:"version-set-current",checked:S,onCheckedChange:Y,disabled:ai}),(0,b.jsx)(M.Label,{htmlFor:"version-set-current",className:"cursor-pointer",children:k("version.field.setCurrent")})]})]}),(0,b.jsxs)(K.DialogFooter,{children:[(0,b.jsx)(l.Button,{variant:"outline",onClick:()=>d(!1),disabled:ai,children:k("common.cancel")}),(0,b.jsx)(l.Button,{onClick:()=>{n.trim()&&q.trim()&&aj(async()=>{try{m&&g?await U(g.id,{number:n.trim(),name:q.trim(),typeId:s||null,baseBranch:y.trim()||null,startDate:ac(A)??null,targetDate:ac(D)??null,description:F.trim()||null}):await T({projectId:e,number:n.trim(),name:q.trim(),typeId:s||void 0,baseBranch:y.trim()||void 0,startDate:ac(A),targetDate:ac(D),description:F.trim()||void 0,setCurrent:S}),H.toast.success(m?k("version.edit"):k("version.new")),d(!1),j?.()}catch(a){H.toast.error(a instanceof Error?a.message:String(a))}})},disabled:ai||!n.trim()||!q.trim(),children:m?k("common.save"):k("common.create")})]})]}),(0,b.jsx)(aa,{open:w,onOpenChange:x,workspaceId:f,onChanged:()=>V(f).then(v)})]})}let ae=(0,S.createServerReference)("60f964c3b7e606c81ceb2e3c2b121bf911b77f4599",S.callServer,void 0,S.findSourceMapURL,"releaseVersion");function af({open:a,onOpenChange:d,version:e,candidates:f,onSuccess:g}){let{t:h}=(0,B.useI18n)(),[i,j]=(0,c.useState)(""),[k,m]=(0,c.useTransition)();(0,c.useEffect)(()=>{a&&j("")},[a,e]);let n=f.find(a=>a.id===i),o=f.length>0,p=o&&!!i&&!k;return(0,b.jsx)(K.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(K.DialogContent,{className:"sm:max-w-md",children:[(0,b.jsx)(K.DialogHeader,{children:(0,b.jsx)(K.DialogTitle,{children:h("version.releaseAction")})}),(0,b.jsxs)("div",{className:"grid gap-4 py-2",children:[e&&(0,b.jsxs)("p",{className:"text-sm text-muted-foreground",children:[e.number," · ",e.name]}),(0,b.jsxs)("div",{className:"text-sm",children:[(0,b.jsx)("span",{children:h("version.release.rolloverHint")}),e?.unfinishedCount!==void 0&&e.unfinishedCount>0&&(0,b.jsxs)("span",{className:"ml-1 font-medium text-foreground",children:["(",e.unfinishedCount,")"]})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)("label",{className:"text-sm font-medium",children:h("version.release.nextVersion")}),o?(0,b.jsxs)(N.Select,{value:i,onValueChange:a=>{a&&j(a)},disabled:k,children:[(0,b.jsx)(N.SelectTrigger,{className:"w-full",children:(0,b.jsx)("span",{className:"truncate",children:n?`${n.number} \xb7 ${n.name}`:""})}),(0,b.jsx)(N.SelectContent,{children:f.map(a=>(0,b.jsxs)(N.SelectItem,{value:a.id,children:[a.number," · ",a.name]},a.id))})]}):(0,b.jsx)("p",{className:"text-xs text-destructive",children:h("version.release.noCandidates")})]})]}),(0,b.jsxs)(K.DialogFooter,{children:[(0,b.jsx)(l.Button,{variant:"outline",onClick:()=>d(!1),disabled:k,children:h("common.cancel")}),(0,b.jsx)(l.Button,{onClick:()=>{e&&i&&m(async()=>{try{await ae(e.id,i),H.toast.success(h("version.release")),d(!1),g?.()}catch(a){H.toast.error(a instanceof Error?a.message:String(a))}})},disabled:!p,children:h("version.release")})]})]})})}var ag=a.i(704494);let ah=(0,S.createServerReference)("404c0a0bd0e9130e55bcf86139e302194eb58f0fa9",S.callServer,void 0,S.findSourceMapURL,"getVersionDiff");var ai=a.i(514872);function aj({file:a}){let{t:d}=(0,B.useI18n)(),[e,f]=(0,c.useState)(!0),g=a.to&&"/dev/null"!==a.to?a.to:a.from??"",i=a.additions??0,j=a.deletions??0,k=[];for(let b of a.chunks)for(let a of(k.push({type:"normal",content:b.content,chunkHeader:b.content}),b.changes))k.push({type:a.type,content:a.content});let l=k.length>500,m=l?k.slice(0,500):k;return(0,b.jsxs)("div",{className:"overflow-hidden rounded-[10px] border border-border",children:[(0,b.jsxs)("button",{type:"button",onClick:()=>f(a=>!a),className:"flex w-full items-center gap-2 bg-muted/40 px-3 py-2 text-left transition-colors hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:[(0,b.jsx)(h.ChevronRight,{className:`h-3.5 w-3.5 flex-none text-muted-foreground/60 transition-transform duration-150 ${e?"rotate-90":""}`}),(0,b.jsx)("span",{className:"flex-1 truncate font-mono text-[12px] font-medium text-foreground",children:g}),(0,b.jsxs)("span",{className:"shrink-0 font-mono text-[11px] font-bold text-emerald-400",children:["+",i]}),(0,b.jsxs)("span",{className:"shrink-0 font-mono text-[11px] font-bold text-rose-400",children:["−",j]})]}),e&&(0,b.jsxs)("div",{className:"overflow-x-auto",children:[(0,b.jsx)("pre",{className:"m-0 p-0",children:m.map((a,c)=>void 0!==a.chunkHeader?(0,b.jsx)("div",{className:"whitespace-pre px-3 py-px font-mono text-xs text-muted-foreground bg-muted/40",children:a.content},c):"add"===a.type?(0,b.jsx)("div",{className:"whitespace-pre px-3 py-px font-mono text-xs text-emerald-300 bg-emerald-500/10",children:a.content},c):"del"===a.type?(0,b.jsx)("div",{className:"whitespace-pre px-3 py-px font-mono text-xs text-rose-300 bg-rose-500/10",children:a.content},c):(0,b.jsx)("div",{className:"whitespace-pre px-3 py-px font-mono text-xs text-muted-foreground",children:a.content},c))}),l&&(0,b.jsx)("p",{className:"border-t border-border px-3 py-2 text-[11px] text-muted-foreground/70 italic",children:d("version.diff.truncated")})]})]})}function ak({open:a,onOpenChange:d,versionId:e,versionLabel:f}){let{t:g}=(0,B.useI18n)(),[h,i]=(0,c.useTransition)(),[j,k]=(0,c.useState)(null),[l,m]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{a&&e&&(k(null),m(!1),i(async()=>{let a=await ah(e);if(!a)return void m(!0);let b=(0,ai.parseUnifiedDiff)(a.patch);0===b.length||""===a.patch?m(!0):k(b)}))},[a,e]),(0,b.jsx)(K.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(K.DialogContent,{className:"sm:max-w-3xl max-h-[80vh] overflow-auto",children:[(0,b.jsx)(K.DialogHeader,{children:(0,b.jsxs)(K.DialogTitle,{children:[g("version.diff.title"),f?` — ${f}`:""]})}),h&&(0,b.jsxs)("div",{className:"flex items-center justify-center gap-2 py-12 text-muted-foreground",children:[(0,b.jsx)(ag.Loader2,{className:"h-5 w-5 animate-spin"}),(0,b.jsx)("span",{className:"text-sm",children:g("version.diff.loading")})]}),!h&&l&&(0,b.jsx)("p",{className:"py-10 text-center text-sm text-muted-foreground",children:g("version.diff.empty")}),!h&&j&&j.length>0&&(0,b.jsx)("div",{className:"flex flex-col gap-2",children:j.map((a,c)=>(0,b.jsx)(aj,{file:a},c))})]})})}var al=a.i(972420),am=a.i(258815);function an({version:a,isFirst:c,isLast:d,dashed:e=!1,diffStat:f,onEdit:g,onRelease:h,onViewDiff:i,onOpenTaskDetail:j}){return(0,b.jsxs)("div",{className:"flex gap-4",children:[(0,b.jsxs)("div",{className:"relative flex w-5 flex-none flex-col items-center",children:[(0,b.jsx)("div",{className:["w-px flex-none",c?"h-0":"h-6",e?"bg-[repeating-linear-gradient(to_bottom,var(--border)_0_4px,transparent_4px_8px)]":"bg-border"].filter(Boolean).join(" ")}),(0,b.jsx)("div",{className:["z-10 h-3.5 w-3.5 flex-none rounded-full border-2",a.isCurrent?"border-primary bg-primary ring-2 ring-primary/30":"ACTIVE"===a.status?"border-emerald-400 bg-emerald-400":"RELEASED"===a.status?"border-zinc-500 bg-zinc-500":"border-muted-foreground/40 bg-transparent border-dashed"].join(" ")}),!d&&(0,b.jsx)("div",{className:["w-px flex-1",e?"bg-[repeating-linear-gradient(to_bottom,var(--border)_0_4px,transparent_4px_8px)]":"bg-border"].join(" ")})]}),(0,b.jsx)("div",{className:"min-w-0 flex-1 pb-5",children:(0,b.jsx)(G,{version:a,diffStat:f??null,onEdit:g,onRelease:h,onViewDiff:i,onOpenTaskDetail:j})})]})}a.s(["VersionTimelineClient",0,function({project:a,workspaceId:j,versions:n,diffStats:o,backlog:p}){let q,{t:r}=(0,B.useI18n)(),s=(0,d.useRouter)();(0,c.useEffect)(()=>{(0,am.setLastProjectId)(j,a.id)},[j,a.id]);let[t,u]=(0,c.useState)(!1),[v,w]=(0,c.useState)(null),[x,y]=(0,c.useState)(!1),[z,A]=(0,c.useState)(!1),[C,D]=(0,c.useState)(null),[E,G]=(0,c.useState)(null),[H,I]=(0,c.useState)(null),[J,K]=(0,c.useState)(!1),L=[...[...n.filter(a=>"RELEASED"!==a.status)].sort((a,b)=>{if(!a.targetDate&&!b.targetDate)return 0;if(!a.targetDate)return 1;if(!b.targetDate)return -1;let c=new Date(b.targetDate).getTime()-new Date(a.targetDate).getTime();return 0!==c?c:new Date(b.createdAt).getTime()-new Date(a.createdAt).getTime()}),...[...n.filter(a=>"RELEASED"===a.status)].sort((a,b)=>a.releasedAt||b.releasedAt?a.releasedAt?b.releasedAt?new Date(b.releasedAt).getTime()-new Date(a.releasedAt).getTime():-1:1:0)],M=a=>{let b=n.find(b=>b.id===a);b&&(w({id:b.id,number:b.number,name:b.name,typeId:b.typeId??null,baseBranch:b.baseBranch,startDate:b.startDate,targetDate:b.targetDate,description:b.description}),u(!0))},N=a=>{let b=n.find(b=>b.id===a);b&&(D(b),A(!0))},O=a=>{G(a)},P=()=>{w(null),u(!0)},Q=()=>{s.refresh()},R=C?n.filter(a=>a.id!==C.id&&("PLANNED"===a.status||"ACTIVE"===a.status)).map(a=>({id:a.id,number:a.number,name:a.name})):[],S=C?C.tasks.filter(a=>"DONE"!==a.status&&"CANCELLED"!==a.status).length:void 0;return(0,b.jsxs)("div",{className:"flex h-full flex-col overflow-hidden",children:[(0,b.jsxs)("div",{className:"header-xl flex shrink-0 items-center gap-4 border-b px-6",children:[(0,b.jsxs)(e.default,{href:`/workspaces/${j}?projectId=${a.id}`,className:"flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground",children:[(0,b.jsx)(i.ArrowLeft,{className:"h-3.5 w-3.5"}),(0,b.jsx)("span",{children:r("archive.backToBoard")})]}),(0,b.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[(0,b.jsx)("span",{className:"truncate font-medium",children:a.name}),(0,b.jsx)("span",{children:"/"}),(0,b.jsx)("span",{children:r("version.timeline")})]}),(0,b.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground/70",children:r("version.historyHint")})]}),(0,b.jsxs)(l.Button,{variant:"outline",onClick:()=>y(!0),children:[(0,b.jsx)(k,{className:"h-4 w-4"}),r("version.manageTypes")]}),(0,b.jsxs)(l.Button,{onClick:P,children:[(0,b.jsx)(f.Plus,{className:"h-4 w-4"}),r("version.new")]})]}),(0,b.jsx)(m.ScrollArea,{className:"min-h-0 flex-1",children:(0,b.jsx)("div",{className:"px-6 py-6",children:(0,b.jsxs)("div",{className:"mx-auto max-w-3xl",children:[0===n.length&&0===p.length&&(0,b.jsxs)("div",{className:"flex flex-col items-center gap-4 py-20 text-center text-muted-foreground",children:[(0,b.jsx)("p",{className:"text-sm",children:r("version.empty.list")}),(0,b.jsxs)(l.Button,{variant:"outline",onClick:P,children:[(0,b.jsx)(f.Plus,{className:"h-4 w-4"}),r("version.new")]})]}),L.length>0&&(0,b.jsx)("div",{className:"relative",children:L.map((a,c)=>(0,b.jsx)(an,{version:a,isFirst:0===c,isLast:c===L.length-1&&0===p.length,diffStat:o[a.id],onEdit:M,onRelease:N,onViewDiff:O,onOpenTaskDetail:I},a.id))}),p.length>0&&(0,b.jsxs)("div",{className:"flex gap-4",children:[(0,b.jsxs)("div",{className:"relative flex w-5 flex-none flex-col items-center",children:[(0,b.jsx)("div",{className:"h-6 w-px bg-[repeating-linear-gradient(to_bottom,var(--border)_0_4px,transparent_4px_8px)]"}),(0,b.jsx)("div",{className:"z-10 h-3.5 w-3.5 flex-none rounded-full border-2 border-dashed border-muted-foreground/40 bg-transparent"})]}),(0,b.jsx)("div",{className:"min-w-0 flex-1 pb-5",children:(0,b.jsxs)("div",{className:"overflow-hidden rounded-[14px] border border-dashed bg-muted/40 shadow-sm",children:[(0,b.jsxs)("button",{type:"button",onClick:()=>K(a=>!a),className:"w-full px-4 py-3 text-left transition-colors hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,b.jsx)(h.ChevronRight,{className:`h-3.5 w-3.5 flex-none text-muted-foreground/60 transition-transform duration-150 ${J?"rotate-90":""}`}),(0,b.jsx)(g.Archive,{className:"h-4 w-4 flex-none text-muted-foreground/70"}),(0,b.jsx)("span",{className:"text-sm font-semibold text-foreground",children:r("version.history")}),(0,b.jsx)("span",{className:"text-xs text-muted-foreground",children:r("version.historySub")}),(0,b.jsx)("span",{className:"flex-1"}),(0,b.jsxs)("span",{className:"text-[11.5px] text-muted-foreground",children:[p.length," ",r("version.tasksCount")]})]}),(0,b.jsx)("p",{className:"mt-2 text-xs text-muted-foreground/70",children:r("version.historyHint")})]}),J&&(0,b.jsx)("div",{className:"border-t border-dashed border-border px-2 pb-2 pt-1.5",children:p.map(a=>(0,b.jsx)(F,{task:a,onOpenDetail:I},a.id))})]})})]})]})})}),(0,b.jsx)(ad,{open:t,onOpenChange:a=>{u(a),a||w(null)},projectId:a.id,workspaceId:j,editVersion:v,defaultBaseBranch:null,projectLocalPath:a.localPath,onSuccess:Q}),(0,b.jsx)(aa,{open:x,onOpenChange:y,workspaceId:j,onChanged:()=>s.refresh()}),(0,b.jsx)(af,{open:z,onOpenChange:a=>{A(a),a||D(null)},version:C?{id:C.id,number:C.number,name:C.name,unfinishedCount:S}:null,candidates:R,onSuccess:Q}),(0,b.jsx)(ak,{open:!!E,onOpenChange:a=>{a||G(null)},versionId:E,versionLabel:E&&(q=n.find(a=>a.id===E))?`${q.number} ${q.name}`:void 0}),(0,b.jsx)(al.TaskOverviewDrawer,{open:!!H,onOpenChange:a=>{a||I(null)},taskId:H})]})}],144016)}];
1
+ module.exports=[144016,a=>{"use strict";var b=a.i(728778),c=a.i(374637),d=a.i(553798),e=a.i(634910),f=a.i(774881),g=a.i(607219),h=a.i(10390),i=a.i(269280),j=a.i(711796);let k=(0,j.default)("settings-2",[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]]);var l=a.i(699570),m=a.i(269876),n=a.i(157551),o=a.i(577565),p=a.i(207339),q=a.i(881107),r=a.i(394869),s=a.i(347165),t=a.i(350739);let u=(0,j.default)("image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);var v=a.i(690251);let w=(0,j.default)("package-check",[["path",{d:"M12 22V12",key:"d0xqtd"}],["path",{d:"m16 17 2 2 4-4",key:"uh5qu3"}],["path",{d:"M21 11.127V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.729l7 4a2 2 0 0 0 2 .001l1.32-.753",key:"kpkbpo"}],["path",{d:"M3.29 7 12 12l8.71-5",key:"19ckod"}],["path",{d:"m7.5 4.27 8.997 5.148",key:"9yrvtv"}]]),x=(0,j.default)("panel-right",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M15 3v18",key:"14nvp0"}]]);var y=a.i(785259),z=a.i(521007),A=a.i(551578),B=a.i(951192);function C(a){if(!a)return"";let b="string"==typeof a?new Date(a):a;if(isNaN(b.getTime()))return"";let c=String(b.getMonth()+1).padStart(2,"0"),d=String(b.getDate()).padStart(2,"0");return`${c}-${d}`}let D=Object.fromEntries(z.BOARD_COLUMNS.map(a=>[a.id,a.color]));function E({children:a,className:c}){return(0,b.jsx)("span",{className:`inline-flex items-center gap-1.5 rounded-md border border-border bg-muted/40 px-2 py-0.5 text-xs text-muted-foreground ${c??""}`,children:a})}function F({task:a,onOpenDetail:d}){let{t:e}=(0,B.useI18n)(),[f,g]=(0,c.useState)(!1),i="CANCELLED"===a.status?"text-muted-foreground line-through decoration-muted-foreground/40":"DONE"===a.status?"text-muted-foreground":"text-foreground";return(0,b.jsxs)("div",{className:"rounded-[10px]",children:[(0,b.jsxs)("button",{type:"button",onClick:()=>g(a=>!a),className:"flex w-full items-center gap-2.5 rounded-[10px] px-2.5 py-2.5 text-left transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:[(0,b.jsx)(h.ChevronRight,{className:`h-3.5 w-3.5 flex-none text-muted-foreground/60 transition-transform duration-150 ${f?"rotate-90":""}`}),(0,b.jsx)("span",{className:`h-2 w-2 flex-none rounded-full ${D[a.status]??"bg-slate-400"}`}),(0,b.jsx)("span",{className:`text-[13.5px] font-medium ${i}`,children:a.title}),a.labels.map(({label:a})=>(0,b.jsx)("span",{className:"rounded-full border border-border px-1.5 py-px text-[10.5px] text-muted-foreground",style:a.color?{borderColor:a.color+"55",color:a.color}:void 0,children:a.name},a.id)),(0,b.jsx)("span",{className:"flex-1"}),(0,b.jsx)("span",{className:"flex w-16 flex-none justify-center",children:(0,b.jsx)("span",{className:`rounded-[5px] px-1.5 py-px text-[10.5px] font-bold ${z.PRIORITY_CONFIG[a.priority]?.color??z.PRIORITY_CONFIG.LOW.color}`,children:a.priority})}),(0,b.jsx)("span",{className:"h-3 w-px bg-border flex-none"}),(0,b.jsxs)("span",{className:"flex w-[72px] flex-none items-center gap-1.5",children:[(0,b.jsx)("span",{className:`h-1.5 w-1.5 flex-none rounded-full ${D[a.status]??"bg-slate-400"}`}),(0,b.jsx)("span",{className:"truncate text-[10.5px] text-muted-foreground",children:e(`version.taskStatus.${a.status}`)})]}),(0,b.jsx)("span",{className:"h-3 w-px bg-border flex-none"}),(0,b.jsx)("span",{className:"flex w-6 flex-none justify-center",children:d&&(0,b.jsxs)(y.Tooltip,{children:[(0,b.jsx)(y.TooltipTrigger,{render:(0,b.jsx)(l.Button,{variant:"ghost",size:"icon",className:"h-6 w-6 text-muted-foreground",onClick:b=>{b.stopPropagation(),d(a.id)}}),children:(0,b.jsx)(x,{className:"h-3.5 w-3.5"})}),(0,b.jsx)(y.TooltipContent,{children:e("version.detail")})]})})]}),f&&(0,b.jsxs)("div",{className:"flex flex-col gap-2.5 pb-3 pl-[30px] pr-3 pt-1",children:[(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"mb-1.5 flex items-center gap-1.5",children:[(0,b.jsx)(s.FolderOpen,{className:"h-3 w-3 text-muted-foreground/60"}),(0,b.jsx)("span",{className:"text-[11px] font-bold uppercase tracking-wide text-muted-foreground/60",children:e("version.resources")})]}),0===a.assets.length?(0,b.jsx)("p",{className:"text-[12px] italic text-muted-foreground/60",children:e("version.empty.resources")}):(0,b.jsx)("div",{className:"flex flex-wrap gap-2",children:a.assets.map(a=>{var c;let d=a.mimeType?.startsWith("image/");return(0,b.jsxs)("span",{className:"inline-flex cursor-pointer items-center gap-1.5 rounded-lg border border-border bg-background px-2.5 py-1.5 text-[12px] text-foreground shadow-sm transition-colors hover:border-primary/50",children:[d?(0,b.jsx)(u,{className:"h-3.5 w-3.5 text-muted-foreground"}):(0,b.jsx)(t.FileText,{className:"h-3.5 w-3.5 text-muted-foreground"}),(0,b.jsx)("span",{children:a.filename}),null!=a.size&&(0,b.jsx)("span",{className:"text-[11px] text-muted-foreground/60",children:(c=a.size)<1024?`${c} B`:c<1048576?`${Math.round(c/1024)} KB`:`${(c/1048576).toFixed(1)} MB`})]},a.id)})})]}),(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"mb-1.5 flex items-center gap-1.5",children:[(0,b.jsx)(t.FileText,{className:"h-3 w-3 text-muted-foreground/60"}),(0,b.jsx)("span",{className:"text-[11px] font-bold uppercase tracking-wide text-muted-foreground/60",children:e("version.notes")})]}),0===a.notes.length?(0,b.jsx)("p",{className:"text-[12px] italic text-muted-foreground/60",children:e("version.empty.notes")}):(0,b.jsx)("div",{className:"flex flex-col gap-1.5",children:a.notes.map(a=>(0,b.jsx)("div",{className:"rounded-lg border border-border border-l-violet-500/50 bg-background px-2.5 py-2 shadow-sm [border-left-width:3px]",children:(0,b.jsxs)("div",{className:"flex items-center gap-2",children:[(0,b.jsx)("span",{className:"text-[12.5px] font-semibold text-foreground",children:a.title}),a.category&&(0,b.jsx)("span",{className:"rounded-[5px] border border-violet-500/30 bg-violet-500/15 px-1.5 py-px text-[10px] font-bold text-violet-300",children:a.category})]})},a.id))})]})]})]})}function G({version:a,diffStat:d,onEdit:e,onRelease:f,onViewDiff:g,onOpenTaskDetail:i}){var j;let k,{t:m}=(0,B.useI18n)(),[s,t]=(0,c.useState)(a.isCurrent),u="RELEASED"===a.status,x="ACTIVE"===a.status,z=a.tasks.length,D=a.tasks.filter(a=>"DONE"===a.status).length,H=!!(a.releaseCommit||d),I=(k=`${z} ${m("version.tasksCount")}`,D>0&&D<z?`${k} \xb7 ${D} ${m("version.doneCount")}`:D>0&&D===z?`${k} \xb7 ${m("version.allDone")}`:k);return(0,b.jsxs)("div",{className:["overflow-hidden rounded-[14px] border bg-card shadow-sm transition-shadow duration-150 hover:shadow-md",a.isCurrent?"border-border border-l-2 border-l-primary ring-1 ring-primary/20":"border-border",u?"opacity-[.96]":""].filter(Boolean).join(" "),children:[(0,b.jsx)("button",{type:"button",onClick:()=>t(a=>!a),className:"w-full text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:(0,b.jsxs)("div",{className:"px-4 py-3.5",children:[(0,b.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,b.jsx)(h.ChevronRight,{className:`h-4 w-4 flex-none text-muted-foreground/60 transition-transform duration-150 ${s?"rotate-90":""}`}),(0,b.jsx)("span",{className:"font-mono text-[14.5px] font-bold text-foreground",children:a.number}),(0,b.jsx)("span",{className:"text-[14.5px] font-semibold text-foreground",children:a.name}),(0,b.jsx)(A.VersionTypeBadge,{name:a.type?.name??null}),(0,b.jsx)(A.VersionStatusBadge,{status:a.status}),a.isCurrent&&(0,b.jsxs)("span",{className:"inline-flex items-center gap-1.5 rounded-full border border-primary/30 bg-primary/15 px-2.5 py-0.5 text-[11px] font-bold text-primary shadow-sm",children:[(0,b.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-primary opacity-90"}),m("version.current")]}),(0,b.jsx)("span",{className:"flex-1"}),z>0&&(0,b.jsx)("span",{className:"text-[11.5px] text-muted-foreground",children:I}),(0,b.jsxs)("span",{className:"flex items-center gap-1",onClick:a=>a.stopPropagation(),onKeyDown:a=>a.stopPropagation(),children:[e&&(0,b.jsxs)(y.Tooltip,{children:[(0,b.jsx)(y.TooltipTrigger,{render:(0,b.jsx)(l.Button,{variant:"ghost",size:"icon",className:"h-7 w-7 text-muted-foreground",onClick:()=>e(a.id)}),children:(0,b.jsx)(v.Pencil,{className:"h-3.5 w-3.5"})}),(0,b.jsx)(y.TooltipContent,{children:m("version.edit")})]}),x&&f&&(0,b.jsxs)(l.Button,{variant:"outline",className:"h-7 px-2 text-xs font-semibold",onClick:()=>f(a.id),children:[(0,b.jsx)(w,{className:"h-3.5 w-3.5"}),m("version.release")]})]})]}),(0,b.jsxs)("div",{className:"mt-2.5 flex flex-wrap items-center gap-2",children:[u&&a.releasedAt?(0,b.jsxs)(E,{children:[(0,b.jsx)(n.Calendar,{className:"h-3 w-3"}),m("version.releasedAt"),(0,b.jsx)("strong",{className:"text-foreground",children:C(a.releasedAt)})]}):a.startDate||a.targetDate?(0,b.jsxs)(E,{children:[(0,b.jsx)(n.Calendar,{className:"h-3 w-3"}),a.startDate?C(a.startDate):"—"," → ",a.targetDate?(0,b.jsx)("strong",{className:"text-foreground",children:C(a.targetDate)}):"—"]}):null,a.baseBranch&&(0,b.jsxs)(E,{children:[(0,b.jsx)(o.GitBranch,{className:"h-3 w-3"}),(0,b.jsx)("span",{className:"font-mono text-[11px] text-foreground",children:a.baseBranch})]}),a.baseCommit&&(0,b.jsxs)(E,{children:[(0,b.jsx)(p.GitCommitHorizontal,{className:"h-3 w-3"}),m("version.field.baseCommit"),(0,b.jsx)("span",{className:"font-mono text-[11px] text-foreground",children:(j=a.baseCommit)?j.slice(0,7):""})]}),u&&(0,b.jsxs)(E,{children:[(0,b.jsx)(q.Tag,{className:"h-3 w-3"}),(0,b.jsx)("span",{className:"font-mono text-[11px] text-foreground",children:a.number})]}),d&&(0,b.jsxs)(E,{children:[(0,b.jsx)(r.GitCompare,{className:"h-3 w-3"}),!u&&(0,b.jsx)("span",{className:"text-muted-foreground",children:m("version.diff.live")}),(0,b.jsxs)("span",{className:"font-bold text-emerald-400",children:["+",d.additions.toLocaleString()]}),(0,b.jsxs)("span",{className:"font-bold text-rose-400",children:["−",d.deletions.toLocaleString()]}),(0,b.jsxs)("span",{className:"text-muted-foreground",children:["· ",d.files," ",m("version.diff.files")]})]}),H&&g&&(0,b.jsxs)(l.Button,{variant:"ghost",size:"sm",className:"h-6 gap-1 px-2 text-xs text-muted-foreground",onClick:b=>{b.stopPropagation(),g(a.id)},children:[(0,b.jsx)(r.GitCompare,{className:"h-3 w-3"}),m("version.diff.view")," →"]})]}),a.description&&(0,b.jsx)("p",{className:"mt-2 text-[13px] text-muted-foreground",children:a.description})]})}),s&&z>0&&(0,b.jsx)("div",{className:"border-t border-dashed border-border bg-muted/40 px-2 pb-2 pt-1.5",children:a.tasks.map(a=>(0,b.jsx)(F,{task:a,onOpenDetail:i},a.id))})]})}var H=a.i(952313),I=a.i(668116),J=a.i(113047),K=a.i(814574),L=a.i(866718),M=a.i(412783),N=a.i(580701),O=a.i(599209),P=a.i(419622),Q=a.i(563658),R=a.i(429246),S=a.i(780410);let T=(0,S.createServerReference)("4085be16448a229feaae08c7cc7c1c8e589028276f",S.callServer,void 0,S.findSourceMapURL,"createVersion"),U=(0,S.createServerReference)("60d02dc757cf50c1e91e443c7d2324feb9ac31cef0",S.callServer,void 0,S.findSourceMapURL,"updateVersion"),V=(0,S.createServerReference)("400d03ee6a9eddfa8fae9fefe1d18e9f47de306c92",S.callServer,void 0,S.findSourceMapURL,"getVersionTypes");var W=a.i(867083),X=a.i(679799),Y=a.i(975231);let Z=(0,S.createServerReference)("40d27498ad732e19257536230ee6f2509d7320091c",S.callServer,void 0,S.findSourceMapURL,"createVersionType"),$=(0,S.createServerReference)("60e9db52192c3e093444154dd025b53368f1580173",S.callServer,void 0,S.findSourceMapURL,"updateVersionType"),_=(0,S.createServerReference)("405aaa19faceea4a5b60f695de5f03aaae40f71b13",S.callServer,void 0,S.findSourceMapURL,"deleteVersionType");function aa({open:a,onOpenChange:d,workspaceId:e,onChanged:f}){let{t:g}=(0,B.useI18n)(),[h,i]=(0,c.useState)([]),[j,k]=(0,c.useState)(""),[m,n]=(0,c.useState)({}),[o,p]=(0,c.useTransition)(),q=async()=>{let a=await V(e);i(a),n(b=>{let c={};return a.forEach(a=>{c[a.id]=a.id in b?b[a.id]:a.name}),c})};(0,c.useEffect)(()=>{a&&(q(),k(""))},[a,e]);let r=()=>{let a=j.trim();a&&p(async()=>{try{await Z({workspaceId:e,name:a}),k(""),await q(),f?.(),H.toast.success(g("version.type.add"))}catch(a){H.toast.error(a instanceof Error?a.message:String(a))}})};return(0,b.jsx)(K.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(K.DialogContent,{className:"sm:max-w-md",children:[(0,b.jsx)(K.DialogHeader,{children:(0,b.jsx)(K.DialogTitle,{children:g("version.manageTypes")})}),(0,b.jsxs)("div",{className:"flex flex-col gap-4 py-2",children:[(0,b.jsxs)("div",{className:"flex gap-2",children:[(0,b.jsx)(L.Input,{value:j,onChange:a=>k(a.target.value),placeholder:g("version.type.namePlaceholder"),disabled:o,onKeyDown:a=>{"Enter"===a.key&&r()},className:"flex-1"}),(0,b.jsx)(l.Button,{onClick:r,disabled:o||!j.trim(),children:g("version.type.add")})]}),0===h.length?(0,b.jsx)("p",{className:"text-center text-sm text-muted-foreground py-4",children:g("version.type.empty")}):(0,b.jsx)("div",{className:"flex flex-col gap-1.5",children:h.map(a=>(0,b.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-border bg-muted/30 px-3 py-2",children:[(0,b.jsx)("span",{className:`inline-flex h-2.5 w-2.5 flex-none rounded-full ${(0,A.typeBadgeColor)(m[a.id]??a.name).split(" ").filter(a=>a.startsWith("bg-"))[0]??"bg-muted"}`}),(0,b.jsx)(L.Input,{value:m[a.id]??a.name,onChange:b=>n(c=>({...c,[a.id]:b.target.value})),onBlur:()=>(a=>{let b=(m[a]??"").trim();if(!b)return;let c=h.find(b=>b.id===a);c?.name!==b&&p(async()=>{try{await $(a,{name:b}),await q(),f?.()}catch(b){H.toast.error(b instanceof Error?b.message:String(b)),n(b=>({...b,[a]:c?.name??""}))}})})(a.id),onKeyDown:a=>{"Enter"===a.key&&a.target.blur()},disabled:o,className:"h-7 flex-1 border-transparent bg-transparent shadow-none focus-visible:border-input focus-visible:bg-background focus-visible:shadow-sm"}),(0,b.jsx)(l.Button,{variant:"ghost",size:"icon",className:"h-7 w-7 flex-none text-muted-foreground hover:text-destructive",onClick:()=>{var b;return b=a.id,void(window.confirm(g("version.type.deleteConfirm"))&&p(async()=>{try{await _(b),await q(),f?.()}catch(a){H.toast.error(a instanceof Error?a.message:String(a))}}))},disabled:o,children:(0,b.jsx)(Y.Trash2,{className:"h-3.5 w-3.5"})})]},a.id))})]})]})})}function ab(a){if(!a)return"";let b="string"==typeof a?new Date(a):a;if(isNaN(b.getTime()))return"";let c=b.getFullYear(),d=String(b.getMonth()+1).padStart(2,"0"),e=String(b.getDate()).padStart(2,"0");return`${c}-${d}-${e}`}function ac(a){if(!a)return;let b=new Date(a);return isNaN(b.getTime())?void 0:b}function ad({open:a,onOpenChange:d,projectId:e,workspaceId:f,editVersion:g,defaultBaseBranch:h,projectLocalPath:i,onSuccess:j}){let{t:k}=(0,B.useI18n)(),m=!!g,[n,p]=(0,c.useState)(""),[q,r]=(0,c.useState)(""),[s,t]=(0,c.useState)(""),[u,v]=(0,c.useState)([]),[w,x]=(0,c.useState)(!1),[y,z]=(0,c.useState)(""),[A,C]=(0,c.useState)(""),[D,E]=(0,c.useState)(""),[F,G]=(0,c.useState)(""),[S,Y]=(0,c.useState)(!1),[Z,$]=(0,c.useState)([]),[_,ae]=(0,c.useState)(!1),[af,ag]=(0,c.useState)(!1),ah=!!i,[ai,aj]=(0,c.useTransition)();return(0,c.useEffect)(()=>{a&&(g?(p(g.number),r(g.name),t(g.typeId??""),z(g.baseBranch??""),C(ab(g.startDate)),E(ab(g.targetDate)),G(g.description??"")):(p(""),r(""),t(""),z(h??""),C(""),E(""),G("")),Y(!1))},[a,g,h]),(0,c.useEffect)(()=>{a&&V(f).then(v).catch(()=>v([]))},[a,f]),(0,c.useEffect)(()=>{a&&ah?(ae(!0),(0,W.getProjectBranches)(i).then($).catch(()=>$([])).finally(()=>ae(!1)),(0,X.fetchRemoteBranches)(i).then(()=>(0,W.getProjectBranches)(i).then($)).catch(()=>{})):$([])},[a,ah,i]),(0,b.jsxs)(K.Dialog,{open:a,onOpenChange:d,children:[(0,b.jsxs)(K.DialogContent,{className:"sm:max-w-md",children:[(0,b.jsx)(K.DialogHeader,{children:(0,b.jsx)(K.DialogTitle,{children:m?k("version.edit"):k("version.new")})}),(0,b.jsxs)("div",{className:"grid gap-4 py-2",children:[(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsxs)(M.Label,{htmlFor:"version-number",children:[k("version.field.number"),(0,b.jsx)("span",{className:"text-destructive ml-0.5",children:"*"})]}),(0,b.jsx)(L.Input,{id:"version-number",value:n,onChange:a=>p(a.target.value),placeholder:k("version.placeholder.number"),disabled:ai})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsxs)(M.Label,{htmlFor:"version-name",children:[k("version.field.name"),(0,b.jsx)("span",{className:"text-destructive ml-0.5",children:"*"})]}),(0,b.jsx)(L.Input,{id:"version-name",value:q,onChange:a=>r(a.target.value),placeholder:k("version.placeholder.name"),disabled:ai})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)(M.Label,{children:k("version.field.type")}),(0,b.jsxs)(N.Select,{value:s||"__none__",onValueChange:a=>{t(a&&"__none__"!==a?a:"")},children:[(0,b.jsx)(N.SelectTrigger,{className:"w-full",disabled:ai,children:(0,b.jsx)("span",{className:"truncate",children:s?u.find(a=>a.id===s)?.name??k("version.type.uncategorized"):k("version.type.uncategorized")})}),(0,b.jsxs)(N.SelectContent,{children:[(0,b.jsx)(N.SelectItem,{value:"__none__",children:k("version.type.uncategorized")}),u.map(a=>(0,b.jsx)(N.SelectItem,{value:a.id,children:a.name},a.id))]})]}),(0,b.jsxs)(l.Button,{type:"button",variant:"ghost",size:"sm",className:"h-auto justify-start px-0 py-0.5 text-xs text-muted-foreground hover:text-foreground",onClick:()=>x(!0),disabled:ai,children:["+ ",k("version.manageTypes")]})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)(M.Label,{children:k("version.field.baseBranch")}),_?(0,b.jsx)("div",{className:"text-sm text-muted-foreground",children:k("task.branchLoading")}):ah&&Z.length>0?(0,b.jsxs)(O.Popover,{open:af,onOpenChange:ag,children:[(0,b.jsxs)(O.PopoverTrigger,{className:"flex h-8 w-full items-center gap-2 rounded-lg border border-input bg-transparent px-3 text-sm transition-colors hover:bg-accent focus:outline-none focus-visible:ring-3 focus-visible:ring-ring/50 disabled:opacity-50",disabled:ai,"data-testid":"version-branch-selector",children:[(0,b.jsx)(o.GitBranch,{className:"h-3.5 w-3.5 shrink-0 text-muted-foreground"}),(0,b.jsx)("span",{className:`flex-1 truncate text-left text-xs ${y?"font-mono":"text-muted-foreground"}`,title:y||void 0,children:y||k("version.field.noBranch")}),(0,b.jsx)(J.ChevronsUpDown,{className:"h-3.5 w-3.5 shrink-0 opacity-50"})]}),(0,b.jsx)(O.PopoverContent,{className:"w-[min(32rem,90vw)] p-0",align:"start",children:(0,b.jsxs)(P.Command,{children:[(0,b.jsx)(P.CommandInput,{placeholder:k("task.branchSearch")}),(0,b.jsxs)(P.CommandList,{children:[(0,b.jsx)(P.CommandEmpty,{children:k("task.branchNone")}),(0,b.jsxs)(P.CommandGroup,{children:[(0,b.jsxs)(P.CommandItem,{value:"__none__",onSelect:()=>{z(""),ag(!1)},children:[(0,b.jsx)("span",{className:"flex-1 truncate text-muted-foreground",children:k("version.field.noBranch")}),!y&&(0,b.jsx)(I.Check,{className:"ml-auto h-3 w-3 shrink-0 text-primary"})]}),Z.map(a=>(0,b.jsxs)(P.CommandItem,{value:a,onSelect:()=>{z(a),ag(!1)},children:[(0,b.jsx)(o.GitBranch,{className:"mr-2 h-3 w-3 shrink-0 text-muted-foreground"}),(0,b.jsx)("span",{className:"flex-1 truncate font-mono",title:a,children:a}),a===y&&(0,b.jsx)(I.Check,{className:"ml-auto h-3 w-3 shrink-0 text-primary"})]},a))]})]})]})})]}):(0,b.jsx)(L.Input,{id:"version-base-branch",value:y,onChange:a=>z(a.target.value),placeholder:"main",disabled:ai})]}),(0,b.jsxs)("div",{className:"grid grid-cols-2 gap-3",children:[(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)(M.Label,{htmlFor:"version-start-date",children:k("version.field.startDate")}),(0,b.jsx)("input",{id:"version-start-date",type:"date",value:A,onChange:a=>C(a.target.value),disabled:ai,className:"h-8 w-full rounded-lg border border-input bg-transparent px-2.5 py-1 text-sm outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50"})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)(M.Label,{htmlFor:"version-target-date",children:k("version.field.targetDate")}),(0,b.jsx)("input",{id:"version-target-date",type:"date",value:D,onChange:a=>E(a.target.value),disabled:ai,className:"h-8 w-full rounded-lg border border-input bg-transparent px-2.5 py-1 text-sm outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50"})]})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)(M.Label,{htmlFor:"version-description",children:k("version.field.description")}),(0,b.jsx)(R.Textarea,{id:"version-description",value:F,onChange:a=>G(a.target.value),rows:3,disabled:ai})]}),!m&&(0,b.jsxs)("div",{className:"flex items-center gap-3",children:[(0,b.jsx)(Q.Switch,{id:"version-set-current",checked:S,onCheckedChange:Y,disabled:ai}),(0,b.jsx)(M.Label,{htmlFor:"version-set-current",className:"cursor-pointer",children:k("version.field.setCurrent")})]})]}),(0,b.jsxs)(K.DialogFooter,{children:[(0,b.jsx)(l.Button,{variant:"outline",onClick:()=>d(!1),disabled:ai,children:k("common.cancel")}),(0,b.jsx)(l.Button,{onClick:()=>{n.trim()&&q.trim()&&aj(async()=>{try{m&&g?await U(g.id,{number:n.trim(),name:q.trim(),typeId:s||null,baseBranch:y.trim()||null,startDate:ac(A)??null,targetDate:ac(D)??null,description:F.trim()||null}):await T({projectId:e,number:n.trim(),name:q.trim(),typeId:s||void 0,baseBranch:y.trim()||void 0,startDate:ac(A),targetDate:ac(D),description:F.trim()||void 0,setCurrent:S}),H.toast.success(m?k("version.edit"):k("version.new")),d(!1),j?.()}catch(a){H.toast.error(a instanceof Error?a.message:String(a))}})},disabled:ai||!n.trim()||!q.trim(),children:m?k("common.save"):k("common.create")})]})]}),(0,b.jsx)(aa,{open:w,onOpenChange:x,workspaceId:f,onChanged:()=>V(f).then(v)})]})}let ae=(0,S.createServerReference)("6081960dab5f669bf35d552dd7fb0bc160acc138fb",S.callServer,void 0,S.findSourceMapURL,"releaseVersion");function af({open:a,onOpenChange:d,version:e,candidates:f,onSuccess:g}){let{t:h}=(0,B.useI18n)(),[i,j]=(0,c.useState)(""),[k,m]=(0,c.useTransition)();(0,c.useEffect)(()=>{a&&j("")},[a,e]);let n=f.find(a=>a.id===i),o=f.length>0,p=o&&!!i&&!k;return(0,b.jsx)(K.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(K.DialogContent,{className:"sm:max-w-md",children:[(0,b.jsx)(K.DialogHeader,{children:(0,b.jsx)(K.DialogTitle,{children:h("version.releaseAction")})}),(0,b.jsxs)("div",{className:"grid gap-4 py-2",children:[e&&(0,b.jsxs)("p",{className:"text-sm text-muted-foreground",children:[e.number," · ",e.name]}),(0,b.jsxs)("div",{className:"text-sm",children:[(0,b.jsx)("span",{children:h("version.release.rolloverHint")}),e?.unfinishedCount!==void 0&&e.unfinishedCount>0&&(0,b.jsxs)("span",{className:"ml-1 font-medium text-foreground",children:["(",e.unfinishedCount,")"]})]}),(0,b.jsxs)("div",{className:"grid gap-1.5",children:[(0,b.jsx)("label",{className:"text-sm font-medium",children:h("version.release.nextVersion")}),o?(0,b.jsxs)(N.Select,{value:i,onValueChange:a=>{a&&j(a)},disabled:k,children:[(0,b.jsx)(N.SelectTrigger,{className:"w-full",children:(0,b.jsx)("span",{className:"truncate",children:n?`${n.number} \xb7 ${n.name}`:""})}),(0,b.jsx)(N.SelectContent,{children:f.map(a=>(0,b.jsxs)(N.SelectItem,{value:a.id,children:[a.number," · ",a.name]},a.id))})]}):(0,b.jsx)("p",{className:"text-xs text-destructive",children:h("version.release.noCandidates")})]})]}),(0,b.jsxs)(K.DialogFooter,{children:[(0,b.jsx)(l.Button,{variant:"outline",onClick:()=>d(!1),disabled:k,children:h("common.cancel")}),(0,b.jsx)(l.Button,{onClick:()=>{e&&i&&m(async()=>{try{await ae(e.id,i),H.toast.success(h("version.release")),d(!1),g?.()}catch(a){H.toast.error(a instanceof Error?a.message:String(a))}})},disabled:!p,children:h("version.release")})]})]})})}var ag=a.i(704494);let ah=(0,S.createServerReference)("400c32c013a24f81d0dfe8dc05381bfbfd92f1805d",S.callServer,void 0,S.findSourceMapURL,"getVersionDiff");var ai=a.i(514872);function aj({file:a}){let{t:d}=(0,B.useI18n)(),[e,f]=(0,c.useState)(!0),g=a.to&&"/dev/null"!==a.to?a.to:a.from??"",i=a.additions??0,j=a.deletions??0,k=[];for(let b of a.chunks)for(let a of(k.push({type:"normal",content:b.content,chunkHeader:b.content}),b.changes))k.push({type:a.type,content:a.content});let l=k.length>500,m=l?k.slice(0,500):k;return(0,b.jsxs)("div",{className:"overflow-hidden rounded-[10px] border border-border",children:[(0,b.jsxs)("button",{type:"button",onClick:()=>f(a=>!a),className:"flex w-full items-center gap-2 bg-muted/40 px-3 py-2 text-left transition-colors hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:[(0,b.jsx)(h.ChevronRight,{className:`h-3.5 w-3.5 flex-none text-muted-foreground/60 transition-transform duration-150 ${e?"rotate-90":""}`}),(0,b.jsx)("span",{className:"flex-1 truncate font-mono text-[12px] font-medium text-foreground",children:g}),(0,b.jsxs)("span",{className:"shrink-0 font-mono text-[11px] font-bold text-emerald-400",children:["+",i]}),(0,b.jsxs)("span",{className:"shrink-0 font-mono text-[11px] font-bold text-rose-400",children:["−",j]})]}),e&&(0,b.jsxs)("div",{className:"overflow-x-auto",children:[(0,b.jsx)("pre",{className:"m-0 p-0",children:m.map((a,c)=>void 0!==a.chunkHeader?(0,b.jsx)("div",{className:"whitespace-pre px-3 py-px font-mono text-xs text-muted-foreground bg-muted/40",children:a.content},c):"add"===a.type?(0,b.jsx)("div",{className:"whitespace-pre px-3 py-px font-mono text-xs text-emerald-300 bg-emerald-500/10",children:a.content},c):"del"===a.type?(0,b.jsx)("div",{className:"whitespace-pre px-3 py-px font-mono text-xs text-rose-300 bg-rose-500/10",children:a.content},c):(0,b.jsx)("div",{className:"whitespace-pre px-3 py-px font-mono text-xs text-muted-foreground",children:a.content},c))}),l&&(0,b.jsx)("p",{className:"border-t border-border px-3 py-2 text-[11px] text-muted-foreground/70 italic",children:d("version.diff.truncated")})]})]})}function ak({open:a,onOpenChange:d,versionId:e,versionLabel:f}){let{t:g}=(0,B.useI18n)(),[h,i]=(0,c.useTransition)(),[j,k]=(0,c.useState)(null),[l,m]=(0,c.useState)(!1);return(0,c.useEffect)(()=>{a&&e&&(k(null),m(!1),i(async()=>{let a=await ah(e);if(!a)return void m(!0);let b=(0,ai.parseUnifiedDiff)(a.patch);0===b.length||""===a.patch?m(!0):k(b)}))},[a,e]),(0,b.jsx)(K.Dialog,{open:a,onOpenChange:d,children:(0,b.jsxs)(K.DialogContent,{className:"sm:max-w-3xl max-h-[80vh] overflow-auto",children:[(0,b.jsx)(K.DialogHeader,{children:(0,b.jsxs)(K.DialogTitle,{children:[g("version.diff.title"),f?` — ${f}`:""]})}),h&&(0,b.jsxs)("div",{className:"flex items-center justify-center gap-2 py-12 text-muted-foreground",children:[(0,b.jsx)(ag.Loader2,{className:"h-5 w-5 animate-spin"}),(0,b.jsx)("span",{className:"text-sm",children:g("version.diff.loading")})]}),!h&&l&&(0,b.jsx)("p",{className:"py-10 text-center text-sm text-muted-foreground",children:g("version.diff.empty")}),!h&&j&&j.length>0&&(0,b.jsx)("div",{className:"flex flex-col gap-2",children:j.map((a,c)=>(0,b.jsx)(aj,{file:a},c))})]})})}var al=a.i(972420),am=a.i(258815);function an({version:a,isFirst:c,isLast:d,dashed:e=!1,diffStat:f,onEdit:g,onRelease:h,onViewDiff:i,onOpenTaskDetail:j}){return(0,b.jsxs)("div",{className:"flex gap-4",children:[(0,b.jsxs)("div",{className:"relative flex w-5 flex-none flex-col items-center",children:[(0,b.jsx)("div",{className:["w-px flex-none",c?"h-0":"h-6",e?"bg-[repeating-linear-gradient(to_bottom,var(--border)_0_4px,transparent_4px_8px)]":"bg-border"].filter(Boolean).join(" ")}),(0,b.jsx)("div",{className:["z-10 h-3.5 w-3.5 flex-none rounded-full border-2",a.isCurrent?"border-primary bg-primary ring-2 ring-primary/30":"ACTIVE"===a.status?"border-emerald-400 bg-emerald-400":"RELEASED"===a.status?"border-zinc-500 bg-zinc-500":"border-muted-foreground/40 bg-transparent border-dashed"].join(" ")}),!d&&(0,b.jsx)("div",{className:["w-px flex-1",e?"bg-[repeating-linear-gradient(to_bottom,var(--border)_0_4px,transparent_4px_8px)]":"bg-border"].join(" ")})]}),(0,b.jsx)("div",{className:"min-w-0 flex-1 pb-5",children:(0,b.jsx)(G,{version:a,diffStat:f??null,onEdit:g,onRelease:h,onViewDiff:i,onOpenTaskDetail:j})})]})}a.s(["VersionTimelineClient",0,function({project:a,workspaceId:j,versions:n,diffStats:o,backlog:p}){let q,{t:r}=(0,B.useI18n)(),s=(0,d.useRouter)();(0,c.useEffect)(()=>{(0,am.setLastProjectId)(j,a.id)},[j,a.id]);let[t,u]=(0,c.useState)(!1),[v,w]=(0,c.useState)(null),[x,y]=(0,c.useState)(!1),[z,A]=(0,c.useState)(!1),[C,D]=(0,c.useState)(null),[E,G]=(0,c.useState)(null),[H,I]=(0,c.useState)(null),[J,K]=(0,c.useState)(!1),L=[...[...n.filter(a=>"RELEASED"!==a.status)].sort((a,b)=>{if(!a.targetDate&&!b.targetDate)return 0;if(!a.targetDate)return 1;if(!b.targetDate)return -1;let c=new Date(b.targetDate).getTime()-new Date(a.targetDate).getTime();return 0!==c?c:new Date(b.createdAt).getTime()-new Date(a.createdAt).getTime()}),...[...n.filter(a=>"RELEASED"===a.status)].sort((a,b)=>a.releasedAt||b.releasedAt?a.releasedAt?b.releasedAt?new Date(b.releasedAt).getTime()-new Date(a.releasedAt).getTime():-1:1:0)],M=a=>{let b=n.find(b=>b.id===a);b&&(w({id:b.id,number:b.number,name:b.name,typeId:b.typeId??null,baseBranch:b.baseBranch,startDate:b.startDate,targetDate:b.targetDate,description:b.description}),u(!0))},N=a=>{let b=n.find(b=>b.id===a);b&&(D(b),A(!0))},O=a=>{G(a)},P=()=>{w(null),u(!0)},Q=()=>{s.refresh()},R=C?n.filter(a=>a.id!==C.id&&("PLANNED"===a.status||"ACTIVE"===a.status)).map(a=>({id:a.id,number:a.number,name:a.name})):[],S=C?C.tasks.filter(a=>"DONE"!==a.status&&"CANCELLED"!==a.status).length:void 0;return(0,b.jsxs)("div",{className:"flex h-full flex-col overflow-hidden",children:[(0,b.jsxs)("div",{className:"header-xl flex shrink-0 items-center gap-4 border-b px-6",children:[(0,b.jsxs)(e.default,{href:`/workspaces/${j}?projectId=${a.id}`,className:"flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground",children:[(0,b.jsx)(i.ArrowLeft,{className:"h-3.5 w-3.5"}),(0,b.jsx)("span",{children:r("archive.backToBoard")})]}),(0,b.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 text-sm text-muted-foreground",children:[(0,b.jsx)("span",{className:"truncate font-medium",children:a.name}),(0,b.jsx)("span",{children:"/"}),(0,b.jsx)("span",{children:r("version.timeline")})]}),(0,b.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground/70",children:r("version.historyHint")})]}),(0,b.jsxs)(l.Button,{variant:"outline",onClick:()=>y(!0),children:[(0,b.jsx)(k,{className:"h-4 w-4"}),r("version.manageTypes")]}),(0,b.jsxs)(l.Button,{onClick:P,children:[(0,b.jsx)(f.Plus,{className:"h-4 w-4"}),r("version.new")]})]}),(0,b.jsx)(m.ScrollArea,{className:"min-h-0 flex-1",children:(0,b.jsx)("div",{className:"px-6 py-6",children:(0,b.jsxs)("div",{className:"mx-auto max-w-3xl",children:[0===n.length&&0===p.length&&(0,b.jsxs)("div",{className:"flex flex-col items-center gap-4 py-20 text-center text-muted-foreground",children:[(0,b.jsx)("p",{className:"text-sm",children:r("version.empty.list")}),(0,b.jsxs)(l.Button,{variant:"outline",onClick:P,children:[(0,b.jsx)(f.Plus,{className:"h-4 w-4"}),r("version.new")]})]}),L.length>0&&(0,b.jsx)("div",{className:"relative",children:L.map((a,c)=>(0,b.jsx)(an,{version:a,isFirst:0===c,isLast:c===L.length-1&&0===p.length,diffStat:o[a.id],onEdit:M,onRelease:N,onViewDiff:O,onOpenTaskDetail:I},a.id))}),p.length>0&&(0,b.jsxs)("div",{className:"flex gap-4",children:[(0,b.jsxs)("div",{className:"relative flex w-5 flex-none flex-col items-center",children:[(0,b.jsx)("div",{className:"h-6 w-px bg-[repeating-linear-gradient(to_bottom,var(--border)_0_4px,transparent_4px_8px)]"}),(0,b.jsx)("div",{className:"z-10 h-3.5 w-3.5 flex-none rounded-full border-2 border-dashed border-muted-foreground/40 bg-transparent"})]}),(0,b.jsx)("div",{className:"min-w-0 flex-1 pb-5",children:(0,b.jsxs)("div",{className:"overflow-hidden rounded-[14px] border border-dashed bg-muted/40 shadow-sm",children:[(0,b.jsxs)("button",{type:"button",onClick:()=>K(a=>!a),className:"w-full px-4 py-3 text-left transition-colors hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,b.jsx)(h.ChevronRight,{className:`h-3.5 w-3.5 flex-none text-muted-foreground/60 transition-transform duration-150 ${J?"rotate-90":""}`}),(0,b.jsx)(g.Archive,{className:"h-4 w-4 flex-none text-muted-foreground/70"}),(0,b.jsx)("span",{className:"text-sm font-semibold text-foreground",children:r("version.history")}),(0,b.jsx)("span",{className:"text-xs text-muted-foreground",children:r("version.historySub")}),(0,b.jsx)("span",{className:"flex-1"}),(0,b.jsxs)("span",{className:"text-[11.5px] text-muted-foreground",children:[p.length," ",r("version.tasksCount")]})]}),(0,b.jsx)("p",{className:"mt-2 text-xs text-muted-foreground/70",children:r("version.historyHint")})]}),J&&(0,b.jsx)("div",{className:"border-t border-dashed border-border px-2 pb-2 pt-1.5",children:p.map(a=>(0,b.jsx)(F,{task:a,onOpenDetail:I},a.id))})]})})]})]})})}),(0,b.jsx)(ad,{open:t,onOpenChange:a=>{u(a),a||w(null)},projectId:a.id,workspaceId:j,editVersion:v,defaultBaseBranch:null,projectLocalPath:a.localPath,onSuccess:Q}),(0,b.jsx)(aa,{open:x,onOpenChange:y,workspaceId:j,onChanged:()=>s.refresh()}),(0,b.jsx)(af,{open:z,onOpenChange:a=>{A(a),a||D(null)},version:C?{id:C.id,number:C.number,name:C.name,unfinishedCount:S}:null,candidates:R,onSuccess:Q}),(0,b.jsx)(ak,{open:!!E,onOpenChange:a=>{a||G(null)},versionId:E,versionLabel:E&&(q=n.find(a=>a.id===E))?`${q.number} ${q.name}`:void 0}),(0,b.jsx)(al.TaskOverviewDrawer,{open:!!H,onOpenChange:a=>{a||I(null)},taskId:H})]})}],144016)}];
2
2
 
3
3
  //# sourceMappingURL=0iu._%5BworkspaceId%5D_projects_%5BprojectId%5D_versions_version-timeline-client_tsx_07o_kyi._.js.map