tower-studio 0.2.45 → 0.2.47

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 (495) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +1 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/routes-manifest.json +8 -0
  6. package/.next/standalone/.next/server/app/_global-error/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/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +3 -3
  17. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +149 -89
  18. package/.next/standalone/.next/server/app/_not-found/page.js +8 -8
  19. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/api/adapters/test/route.js +2 -2
  22. package/.next/standalone/.next/server/app/api/adapters/test/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/browse-fs/route.js +1 -1
  24. package/.next/standalone/.next/server/app/api/browse-fs/route.js.nft.json +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 +1 -1
  27. package/.next/standalone/.next/server/app/api/git/route.js.nft.json +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 +2 -4
  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 +2 -2
  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 +5 -4
  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.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js +3 -5
  38. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/internal/harness/ask/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/internal/harness/notify/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/internal/harness/pending/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/internal/harness/reply/route.js +4 -4
  44. package/.next/standalone/.next/server/app/api/internal/harness/reply/route.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js +1 -1
  48. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js +1 -1
  50. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js +1 -1
  53. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js +1 -1
  55. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js +4 -4
  58. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js +4 -4
  60. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js.nft.json +1 -1
  61. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js +4 -4
  62. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js +1 -1
  64. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js +1 -1
  66. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js.nft.json +1 -1
  67. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js +5 -3
  68. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js.nft.json +1 -1
  69. package/.next/standalone/.next/server/app/harness/page/react-loadable-manifest.json +3 -3
  70. package/.next/standalone/.next/server/app/harness/page/server-reference-manifest.json +172 -112
  71. package/.next/standalone/.next/server/app/harness/page.js +8 -8
  72. package/.next/standalone/.next/server/app/harness/page.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/harness/page_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/missions/page/react-loadable-manifest.json +3 -2
  75. package/.next/standalone/.next/server/app/missions/page/server-reference-manifest.json +254 -158
  76. package/.next/standalone/.next/server/app/missions/page.js +10 -9
  77. package/.next/standalone/.next/server/app/missions/page.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/onboarding/page/react-loadable-manifest.json +3 -3
  80. package/.next/standalone/.next/server/app/onboarding/page/server-reference-manifest.json +149 -89
  81. package/.next/standalone/.next/server/app/onboarding/page.js +8 -8
  82. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +3 -3
  85. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +149 -89
  86. package/.next/standalone/.next/server/app/page.js +8 -8
  87. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +3 -3
  90. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +245 -149
  91. package/.next/standalone/.next/server/app/settings/page.js +10 -11
  92. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/react-loadable-manifest.json +3 -3
  95. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/server-reference-manifest.json +286 -238
  96. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js +9 -9
  97. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/react-loadable-manifest.json +3 -3
  100. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/server-reference-manifest.json +251 -203
  101. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js +9 -9
  102. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js.nft.json +1 -1
  103. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/groups/page/app-paths-manifest.json +3 -0
  105. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/groups/page/build-manifest.json +18 -0
  106. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/groups/page/next-font-manifest.json +11 -0
  107. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/groups/page/react-loadable-manifest.json +18 -0
  108. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/groups/page/server-reference-manifest.json +413 -0
  109. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/groups/page.js +25 -0
  110. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/groups/page.js.nft.json +1 -0
  111. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/groups/page_client-reference-manifest.js +3 -0
  112. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/react-loadable-manifest.json +3 -3
  113. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/server-reference-manifest.json +228 -180
  114. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js +9 -9
  115. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/react-loadable-manifest.json +3 -3
  118. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/server-reference-manifest.json +266 -218
  119. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js +10 -11
  120. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/react-loadable-manifest.json +3 -3
  123. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/server-reference-manifest.json +149 -89
  124. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js +9 -9
  125. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/react-loadable-manifest.json +3 -3
  128. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/server-reference-manifest.json +226 -178
  129. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js +9 -9
  130. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js.nft.json +1 -1
  131. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/react-loadable-manifest.json +4 -4
  133. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/server-reference-manifest.json +293 -233
  134. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js +11 -12
  135. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/workspaces/page/react-loadable-manifest.json +3 -3
  138. package/.next/standalone/.next/server/app/workspaces/page/server-reference-manifest.json +177 -129
  139. package/.next/standalone/.next/server/app/workspaces/page.js +8 -8
  140. package/.next/standalone/.next/server/app/workspaces/page.js.nft.json +1 -1
  141. package/.next/standalone/.next/server/app/workspaces/page_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app-paths-manifest.json +1 -0
  143. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_09ikw5j.js +5 -0
  144. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0eh8dj_.js +9 -5
  145. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0gr2wxq.js +1 -1
  146. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-1~xqo._.js +3 -0
  147. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.3n3t.._.js +3 -0
  148. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.wsvr6._.js +4 -0
  149. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0y3adwk._.js → [root-of-the-server]__0.yf1mx._.js} +2 -2
  150. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0o6i1wy._.js → [root-of-the-server]__00xe-t8._.js} +2 -2
  151. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0vh3112._.js → [root-of-the-server]__02yvm55._.js} +2 -2
  152. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__09arklv._.js → [root-of-the-server]__04-ty51._.js} +2 -2
  153. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0v98a~t._.js → [root-of-the-server]__065hi6e._.js} +2 -2
  154. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0k9rz_z._.js → [root-of-the-server]__06iuq17._.js} +2 -2
  155. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06x1zwj._.js +1 -1
  156. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06~wmlx._.js +3 -0
  157. package/.next/standalone/.next/server/chunks/[root-of-the-server]__092475e._.js +3 -0
  158. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0atap--._.js +3 -0
  159. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c3je91._.js +3 -0
  160. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0dz.knv._.js +3 -0
  161. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ehwsa1._.js +4 -0
  162. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0esywxf._.js +3 -0
  163. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0fd9z.r._.js +30 -0
  164. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gcg7i.._.js +3 -0
  165. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0iyp~.k._.js +2 -2
  166. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__07xsu6m._.js → [root-of-the-server]__0j7565a._.js} +2 -2
  167. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kkrbn-._.js +4 -0
  168. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0m8t3vi._.js +3 -0
  169. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nv83.p._.js +4 -0
  170. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0squ613._.js +3 -0
  171. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0u8tl88._.js +2 -2
  172. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wugb-9._.js +3 -0
  173. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0yeg1kp._.js +4 -0
  174. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zchqv1._.js +43 -0
  175. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0_~s0z4._.js → [root-of-the-server]__0zcy11y._.js} +2 -2
  176. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~1-i5h._.js +3 -0
  177. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~ju4-d._.js +1 -1
  178. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10qclz-._.js +3 -0
  179. package/.next/standalone/.next/server/chunks/_02hac5p._.js +25 -2
  180. package/.next/standalone/.next/server/chunks/_0_w835g._.js +4 -0
  181. package/.next/standalone/.next/server/chunks/_0je3dz2._.js +25 -2
  182. package/.next/standalone/.next/server/chunks/_0tidm8l._.js +25 -2
  183. package/.next/standalone/.next/server/chunks/_0zok2an._.js +25 -2
  184. package/.next/standalone/.next/server/chunks/src_05balzk._.js +1 -1
  185. package/.next/standalone/.next/server/chunks/src_0aygchu._.js +1 -1
  186. package/.next/standalone/.next/server/chunks/src_0gif-f5._.js +1 -1
  187. package/.next/standalone/.next/server/chunks/src_0pg9w-x._.js +3 -0
  188. package/.next/standalone/.next/server/chunks/src_0vp6.co._.js +1 -1
  189. package/.next/standalone/.next/server/chunks/src_11k6i~l._.js +1 -1
  190. package/.next/standalone/.next/server/chunks/src_actions_agent-actions_ts_10q9r5b._.js +3 -3
  191. package/.next/standalone/.next/server/chunks/src_lib_0d~1~wz._.js +1 -1
  192. package/.next/standalone/.next/server/chunks/src_lib_0ylel_1._.js +1 -1
  193. package/.next/standalone/.next/server/chunks/src_lib_ai_0xx6y51._.js +1 -1
  194. package/.next/standalone/.next/server/chunks/src_lib_ai_providers_index_ts_0.y.3vp._.js +1 -1
  195. package/.next/standalone/.next/server/chunks/src_lib_config-defaults_ts_10ayktg._.js +1 -1
  196. package/.next/standalone/.next/server/chunks/ssr/0iu._[workspaceId]_projects_[projectId]_versions_version-timeline-client_tsx_07o_kyi._.js +1 -1
  197. package/.next/standalone/.next/server/chunks/ssr/0se9_next_dist_0i5qmqd._.js +1 -1
  198. package/.next/standalone/.next/server/chunks/ssr/0se9_next_dist_esm_build_templates_app-page_04~dhws.js +4 -0
  199. package/.next/standalone/.next/server/chunks/ssr/{0ws9_lucide-react_dist_esm_icons_0r~ty--._.js → 0ws9_lucide-react_dist_esm_icons_0gv_cwy._.js} +2 -2
  200. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00qdvw7._.js +3 -0
  201. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01bz3_g._.js +3 -0
  202. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__051tpij._.js → [root-of-the-server]__0282989._.js} +1 -1
  203. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0dfqa5a._.js → [root-of-the-server]__03jikql._.js} +1 -1
  204. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ixgha6._.js → [root-of-the-server]__04dod9d._.js} +1 -1
  205. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05tx27l._.js +3 -0
  206. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0fl0l82._.js → [root-of-the-server]__07ha-7q._.js} +1 -1
  207. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__07~giyb._.js +3 -0
  208. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0872sqe._.js +4 -0
  209. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__090y_.y._.js +3 -0
  210. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__096w7g2._.js → [root-of-the-server]__09qoc8v._.js} +3 -3
  211. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0b.ej5q._.js +1 -1
  212. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0dmjt7o._.js → [root-of-the-server]__0bl842b._.js} +1 -1
  213. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0lau3k_._.js → [root-of-the-server]__0c81jqz._.js} +3 -3
  214. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dh0alq._.js +3 -0
  215. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0e79g0v._.js +3 -0
  216. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0t_zq~v._.js → [root-of-the-server]__0fy8mj6._.js} +1 -1
  217. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0g2wrd2._.js → [root-of-the-server]__0gsk~9d._.js} +1 -1
  218. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0h4ltpn._.js +5 -0
  219. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0hx2p17._.js +3 -0
  220. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0iaw1ms._.js +3 -0
  221. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ie8~g5._.js +3 -0
  222. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0~s8otw._.js → [root-of-the-server]__0j1w7ro._.js} +1 -1
  223. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0i0k_zi._.js → [root-of-the-server]__0jxfeb6._.js} +1 -1
  224. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0jymb~t._.js +1 -1
  225. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0l0~scn._.js +1 -1
  226. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0tb.1li._.js → [root-of-the-server]__0mi.v4q._.js} +3 -3
  227. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0vi-5xg._.js → [root-of-the-server]__0nell0t._.js} +3 -3
  228. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0odoa97._.js +30 -0
  229. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0o9jkew._.js → [root-of-the-server]__0q8o5us._.js} +2 -2
  230. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0dv.-zu._.js → [root-of-the-server]__0qjjy1r._.js} +1 -1
  231. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rg73f.._.js +3 -0
  232. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s~4y3y._.js +1 -1
  233. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0s~ak20._.js +3 -0
  234. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t3q30a._.js +3 -0
  235. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0tpho3f._.js +3 -0
  236. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__08etd~v._.js → [root-of-the-server]__0tusyj0._.js} +1 -1
  237. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__06s-_gx._.js → [root-of-the-server]__0x6eyvj._.js} +1 -1
  238. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xftcya._.js +3 -0
  239. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xiiocg._.js +30 -0
  240. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xnuz05._.js +5 -0
  241. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0znl9us._.js +3 -0
  242. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zsnp~d._.js +5 -0
  243. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0~fdua7._.js +3 -0
  244. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11fp64w._.js +1 -1
  245. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1290yo~._.js +3 -0
  246. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12s3kky._.js +3 -0
  247. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ydiu_y._.js → [root-of-the-server]__136sh9u._.js} +1 -1
  248. package/.next/standalone/.next/server/chunks/ssr/{_0dye20y._.js → _0-wp_zu._.js} +2 -2
  249. package/.next/standalone/.next/server/chunks/ssr/_0-~9em3._.js +1 -1
  250. package/.next/standalone/.next/server/chunks/ssr/_0.-.0zk._.js +3 -0
  251. package/.next/standalone/.next/server/chunks/ssr/_0..h3hk._.js +1 -1
  252. package/.next/standalone/.next/server/chunks/ssr/{_09rq08e._.js → _0111pr2._.js} +1 -1
  253. package/.next/standalone/.next/server/chunks/ssr/{_0~6pqk.._.js → _029yl-g._.js} +1 -1
  254. package/.next/standalone/.next/server/chunks/ssr/_02mcoex._.js +3 -0
  255. package/.next/standalone/.next/server/chunks/ssr/_02p-udo._.js +3 -0
  256. package/.next/standalone/.next/server/chunks/ssr/_02t7f2_._.js +3 -0
  257. package/.next/standalone/.next/server/chunks/ssr/_04brhyt._.js +3 -0
  258. package/.next/standalone/.next/server/chunks/ssr/_08b3kyv._.js +43 -0
  259. package/.next/standalone/.next/server/chunks/ssr/_0a___34._.js +3 -0
  260. package/.next/standalone/.next/server/chunks/ssr/{_0ljrvyt._.js → _0b4v~ls._.js} +2 -2
  261. package/.next/standalone/.next/server/chunks/ssr/_0bdyusg._.js +6 -0
  262. package/.next/standalone/.next/server/chunks/ssr/_0c8-9m9._.js +3 -0
  263. package/.next/standalone/.next/server/chunks/ssr/{_0xnn~jq._.js → _0gcox_6._.js} +1 -1
  264. package/.next/standalone/.next/server/chunks/ssr/{_01fdzzv._.js → _0gte_c4._.js} +1 -1
  265. package/.next/standalone/.next/server/chunks/ssr/_0hyn4md._.js +3 -0
  266. package/.next/standalone/.next/server/chunks/ssr/{_13_b8hh._.js → _0lqjtwo._.js} +1 -1
  267. package/.next/standalone/.next/server/chunks/ssr/_0noar.v._.js +3 -0
  268. package/.next/standalone/.next/server/chunks/ssr/_0os43sb._.js +1 -1
  269. package/.next/standalone/.next/server/chunks/ssr/_0rilhs1._.js +3 -0
  270. package/.next/standalone/.next/server/chunks/ssr/{_078cdw~._.js → _0sbkase._.js} +3 -3
  271. package/.next/standalone/.next/server/chunks/ssr/{_08bq4g8._.js → _0t-0.1o._.js} +2 -2
  272. package/.next/standalone/.next/server/chunks/ssr/_0wbcp88._.js +1 -1
  273. package/.next/standalone/.next/server/chunks/ssr/_0w~~xn0._.js +3 -0
  274. package/.next/standalone/.next/server/chunks/ssr/{_12la163._.js → _0xexuoi._.js} +2 -2
  275. package/.next/standalone/.next/server/chunks/ssr/_0xu906p._.js +4 -0
  276. package/.next/standalone/.next/server/chunks/ssr/_0z-z415._.js +3 -0
  277. package/.next/standalone/.next/server/chunks/ssr/_0z5~opf._.js +3 -0
  278. package/.next/standalone/.next/server/chunks/ssr/_0zx1ubq._.js +3 -0
  279. package/.next/standalone/.next/server/chunks/ssr/_0~2k74h._.js +43 -0
  280. package/.next/standalone/.next/server/chunks/ssr/_0~rpgs_._.js +3 -0
  281. package/.next/standalone/.next/server/chunks/ssr/_10a_vqn._.js +3 -0
  282. package/.next/standalone/.next/server/chunks/ssr/{_0h0b46r._.js → _10or.ne._.js} +1 -1
  283. package/.next/standalone/.next/server/chunks/ssr/{_09z-55_._.js → _10q2mbe._.js} +2 -2
  284. package/.next/standalone/.next/server/chunks/ssr/_11.knhq._.js +3 -0
  285. package/.next/standalone/.next/server/chunks/ssr/{_0ytcm0j._.js → _124j7aj._.js} +1 -1
  286. package/.next/standalone/.next/server/chunks/ssr/_13yv8at._.js +3 -0
  287. package/.next/standalone/.next/server/chunks/ssr/src_11j0qlp._.js +3 -0
  288. package/.next/standalone/.next/server/chunks/ssr/src_actions_07_wts6._.js +47 -0
  289. package/.next/standalone/.next/server/chunks/ssr/src_actions_agent-actions_ts_0~wc.sy._.js +1 -1
  290. package/.next/standalone/.next/server/chunks/ssr/src_actions_file-actions_ts_0gcvqwm._.js +1 -1
  291. package/.next/standalone/.next/server/chunks/ssr/src_app_missions_missions-client_tsx_11429lj._.js +1 -1
  292. package/.next/standalone/.next/server/chunks/ssr/src_app_onboarding_page_tsx_0xf7hpz._.js +1 -1
  293. package/.next/standalone/.next/server/chunks/ssr/src_app_settings_page_tsx_0h9v7dr._.js +1 -1
  294. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_assets_assets-page-client_tsx_0wyzpam._.js +1 -1
  295. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_board-page-client_tsx_0gips66._.js +1 -1
  296. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_notes_notes-page-client_tsx_10gyo3v._.js +1 -1
  297. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_tasks_[taskId]_task-page-client_tsx_02t7blt._.js +1 -1
  298. package/.next/standalone/.next/server/chunks/ssr/src_components_0rowjw~._.js +2 -2
  299. package/.next/standalone/.next/server/chunks/ssr/{_0bndp1~._.js → src_components_ui_popover_tsx_0a78wqo._.js} +2 -2
  300. package/.next/standalone/.next/server/chunks/ssr/{src_lib_03xtona._.js → src_lib_0-3zx.v._.js} +2 -2
  301. package/.next/standalone/.next/server/chunks/ssr/src_lib_00ial55._.js +3 -0
  302. package/.next/standalone/.next/server/chunks/ssr/src_lib_01-0ix1._.js +3 -0
  303. package/.next/standalone/.next/server/chunks/ssr/src_lib_01d~ml9._.js +3 -0
  304. package/.next/standalone/.next/server/chunks/ssr/{src_lib_04y-65j._.js → src_lib_0278czx._.js} +1 -1
  305. package/.next/standalone/.next/server/chunks/ssr/src_lib_07o.0r6._.js +3 -0
  306. package/.next/standalone/.next/server/chunks/ssr/src_lib_09jpiip._.js +3 -0
  307. package/.next/standalone/.next/server/chunks/ssr/src_lib_0bmg7ix._.js +3 -0
  308. package/.next/standalone/.next/server/chunks/ssr/src_lib_0cb~2g1._.js +3 -0
  309. package/.next/standalone/.next/server/chunks/ssr/src_lib_0fdsvpu._.js +3 -0
  310. package/.next/standalone/.next/server/chunks/ssr/src_lib_0fyrfen._.js +3 -0
  311. package/.next/standalone/.next/server/chunks/ssr/{src_lib_0-x.wbd._.js → src_lib_0gqe-g3._.js} +1 -1
  312. package/.next/standalone/.next/server/chunks/ssr/src_lib_0ixnmd0._.js +3 -0
  313. package/.next/standalone/.next/server/chunks/ssr/src_lib_0lpxsj~._.js +3 -0
  314. package/.next/standalone/.next/server/chunks/ssr/src_lib_0pgz5n6._.js +3 -0
  315. package/.next/standalone/.next/server/chunks/ssr/{src_lib_00p-ir2._.js → src_lib_0tq69ek._.js} +1 -1
  316. package/.next/standalone/.next/server/chunks/ssr/src_lib_0y5zzg-._.js +3 -0
  317. package/.next/standalone/.next/server/chunks/ssr/src_lib_pty_11~ojr2._.js +3 -0
  318. package/.next/standalone/.next/server/chunks/ssr/src_lib_pty_orphan-reaper_ts_0a0qmlo._.js +3 -0
  319. package/.next/standalone/.next/server/chunks/ssr/{_0ng0eku._.js → src_lib_schemas_ts_0ph~1ak._.js} +3 -3
  320. package/.next/standalone/.next/server/chunks/ssr/src_lib_worktree_ts_06cucy3._.js +1 -1
  321. package/.next/standalone/.next/server/functions-config-manifest.json +1 -0
  322. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  323. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  324. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  325. package/.next/standalone/.next/server/pages/500.html +1 -1
  326. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  327. package/.next/standalone/.next/server/server-reference-manifest.json +2308 -1642
  328. package/.next/standalone/.next/static/chunks/0.2y9uc38xso-.js +1 -0
  329. package/.next/standalone/.next/static/chunks/00agq5_c-.llc.js +1 -0
  330. package/.next/standalone/.next/static/chunks/015i97g3voot2.js +2 -0
  331. package/.next/standalone/.next/static/chunks/01wvj~s3skc-5.js +1 -0
  332. package/.next/standalone/.next/static/chunks/{0c4-6qdhi645s.js → 031br6.h-zycv.js} +1 -1
  333. package/.next/standalone/.next/static/chunks/04.2m8l~ws19v.js +1 -0
  334. package/.next/standalone/.next/static/chunks/054ztat09k8d8.js +1 -0
  335. package/.next/standalone/.next/static/chunks/07c4b1kp_85qg.js +1 -0
  336. package/.next/standalone/.next/static/chunks/07f592yv~pptf.js +1 -0
  337. package/.next/standalone/.next/static/chunks/{0bvhkgitn__gl.js → 08j4ettv1zbmn.js} +1 -1
  338. package/.next/standalone/.next/static/chunks/08kc0~d-bpqxd.js +1 -0
  339. package/.next/standalone/.next/static/chunks/{0c.t.evwah_m4.js → 08s_oyki61yjf.js} +1 -1
  340. package/.next/standalone/.next/static/chunks/09bc_~h466~tj.js +1 -0
  341. package/.next/standalone/.next/static/chunks/0_hj_1l73v-on.js +1 -0
  342. package/.next/standalone/.next/static/chunks/0a54zbhpg7-ql.js +1 -0
  343. package/.next/standalone/.next/static/chunks/0c2po53wqe-op.js +1 -0
  344. package/.next/standalone/.next/static/chunks/0clhvl~13pwv2.js +1 -0
  345. package/.next/standalone/.next/static/chunks/0fi1kdxrc9m~d.js +1 -0
  346. package/.next/standalone/.next/static/chunks/0ix28r65.7o_r.js +12 -0
  347. package/.next/standalone/.next/static/chunks/0j56_.0_wup.m.js +1 -0
  348. package/.next/standalone/.next/static/chunks/0lokkque~1fox.js +1 -0
  349. package/.next/standalone/.next/static/chunks/0m5k~sgt78d8a.js +1 -0
  350. package/.next/standalone/.next/static/chunks/0mzzaly9-cwhd.js +5 -0
  351. package/.next/standalone/.next/static/chunks/0ov_akpudbv96.js +5 -0
  352. package/.next/standalone/.next/static/chunks/0pg~fc3o64-u0.js +1 -0
  353. package/.next/standalone/.next/static/chunks/0pvc93qomwhkq.js +1 -0
  354. package/.next/standalone/.next/static/chunks/0seo-lerjdkbn.js +1 -0
  355. package/.next/standalone/.next/static/chunks/0smoiulyzysrc.js +2 -0
  356. package/.next/standalone/.next/static/chunks/0ufatfbq87c84.js +1 -0
  357. package/.next/standalone/.next/static/chunks/{09bezwcb__18t.js → 0ujznvfinjpzn.js} +1 -1
  358. package/.next/standalone/.next/static/chunks/{02xqrfqu.s8-i.js → 0ux~8zee88x-j.js} +1 -1
  359. package/.next/standalone/.next/static/chunks/0vy01_a6xhhrr.js +1 -0
  360. package/.next/standalone/.next/static/chunks/0wl8cpmvyhv0l.js +1 -0
  361. package/.next/standalone/.next/static/chunks/0xd_tk4asn0qj.js +1 -0
  362. package/.next/standalone/.next/static/chunks/0~l470bpaoz9f.js +1 -0
  363. package/.next/standalone/.next/static/chunks/118j.0w2pbdea.js +1 -0
  364. package/.next/standalone/.next/static/chunks/11yhe31en~dvt.js +1 -0
  365. package/.next/standalone/.next/static/chunks/13yfli6~6o4z~.js +1 -0
  366. package/.next/standalone/.next/static/chunks/14fch6~swodjf.css +1 -0
  367. package/.next/standalone/.next/static/chunks/15rlbf5rw1dd..js +1 -0
  368. package/.next/standalone/package.json +1 -2
  369. package/dist/mcp-server.cjs +1205 -4330
  370. package/package.json +1 -2
  371. package/prisma/schema.prisma +46 -5
  372. package/scripts/migrations/0006-project-knowledge.ts +58 -0
  373. package/scripts/migrations/0007-product-group.ts +67 -0
  374. package/skills/tower/SKILL.md +22 -92
  375. package/skills/tower/references/task-source.md +80 -0
  376. package/.next/standalone/.next/server/chunks/[externals]__0x_wqa7._.js +0 -3
  377. package/.next/standalone/.next/server/chunks/[root-of-the-server]__034jopu._.js +0 -4
  378. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08-s.nv._.js +0 -4
  379. package/.next/standalone/.next/server/chunks/[root-of-the-server]__098.3z2._.js +0 -3
  380. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ehx6q.._.js +0 -3
  381. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0iggiij._.js +0 -3
  382. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pmamzv._.js +0 -3
  383. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pzyjqf._.js +0 -20
  384. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tplo5s._.js +0 -3
  385. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tpzojh._.js +0 -3
  386. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xasom7._.js +0 -4
  387. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xy1t4x._.js +0 -4
  388. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y~y6sh._.js +0 -3
  389. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10jnn26._.js +0 -3
  390. package/.next/standalone/.next/server/chunks/[root-of-the-server]__116v_bx._.js +0 -4
  391. package/.next/standalone/.next/server/chunks/[root-of-the-server]__119rbly._.js +0 -3
  392. package/.next/standalone/.next/server/chunks/_0qk_esg._.js +0 -4
  393. package/.next/standalone/.next/server/chunks/_0t31z6q._.js +0 -5
  394. package/.next/standalone/.next/server/chunks/src_0aqjfcv._.js +0 -3
  395. package/.next/standalone/.next/server/chunks/src_lib_0nw5n~t._.js +0 -3
  396. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.q~~2p._.js +0 -3
  397. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01zrinc._.js +0 -3
  398. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03x8axh._.js +0 -47
  399. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04wbr9x._.js +0 -3
  400. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05xg05r._.js +0 -3
  401. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06t.cx~._.js +0 -47
  402. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0__klx0._.js +0 -47
  403. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ccy_gg._.js +0 -3
  404. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cjmeyl._.js +0 -3
  405. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dx9sp-._.js +0 -47
  406. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f57j8r._.js +0 -47
  407. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j1dx6p._.js +0 -47
  408. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kn~asi._.js +0 -47
  409. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0m.hayd._.js +0 -47
  410. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0mpjat-._.js +0 -3
  411. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0sg4fde._.js +0 -4
  412. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w24qox._.js +0 -47
  413. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0wq~4aj._.js +0 -30
  414. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0yihqy6._.js +0 -3
  415. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0z7je5_._.js +0 -5
  416. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zouyfp._.js +0 -3
  417. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1184s~q._.js +0 -3
  418. package/.next/standalone/.next/server/chunks/ssr/_0.iq8t8._.js +0 -4
  419. package/.next/standalone/.next/server/chunks/ssr/_00.myc6._.js +0 -3
  420. package/.next/standalone/.next/server/chunks/ssr/_00eymu8._.js +0 -3
  421. package/.next/standalone/.next/server/chunks/ssr/_03-we0p._.js +0 -47
  422. package/.next/standalone/.next/server/chunks/ssr/_04szgc6._.js +0 -3
  423. package/.next/standalone/.next/server/chunks/ssr/_0kd_tda._.js +0 -47
  424. package/.next/standalone/.next/server/chunks/ssr/_0ktexki._.js +0 -47
  425. package/.next/standalone/.next/server/chunks/ssr/_0lo1nei._.js +0 -6
  426. package/.next/standalone/.next/server/chunks/ssr/_0mdd702._.js +0 -3
  427. package/.next/standalone/.next/server/chunks/ssr/_0n0q6~9._.js +0 -3
  428. package/.next/standalone/.next/server/chunks/ssr/_0pab_al._.js +0 -3
  429. package/.next/standalone/.next/server/chunks/ssr/_0pg6-.y._.js +0 -3
  430. package/.next/standalone/.next/server/chunks/ssr/_0pvp63a._.js +0 -47
  431. package/.next/standalone/.next/server/chunks/ssr/_0qi4x-5._.js +0 -3
  432. package/.next/standalone/.next/server/chunks/ssr/_0qnobd-._.js +0 -43
  433. package/.next/standalone/.next/server/chunks/ssr/_0rdyrfd._.js +0 -3
  434. package/.next/standalone/.next/server/chunks/ssr/_0ts~td3._.js +0 -3
  435. package/.next/standalone/.next/server/chunks/ssr/_0y0_4zs._.js +0 -3
  436. package/.next/standalone/.next/server/chunks/ssr/_0yva1-.._.js +0 -3
  437. package/.next/standalone/.next/server/chunks/ssr/_0yz5dmq._.js +0 -47
  438. package/.next/standalone/.next/server/chunks/ssr/_11w13--._.js +0 -3
  439. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_09eeb85._.js +0 -3
  440. package/.next/standalone/.next/server/chunks/ssr/src_0djxlqx._.js +0 -3
  441. package/.next/standalone/.next/server/chunks/ssr/src_0eufeyj._.js +0 -3
  442. package/.next/standalone/.next/server/chunks/ssr/src_0vv366l._.js +0 -3
  443. package/.next/standalone/.next/server/chunks/ssr/src_lib_03x1i~1._.js +0 -5
  444. package/.next/standalone/.next/server/chunks/ssr/src_lib_08gthaz._.js +0 -3
  445. package/.next/standalone/.next/server/chunks/ssr/src_lib_090~6pq._.js +0 -3
  446. package/.next/standalone/.next/server/chunks/ssr/src_lib_0k8dkbn._.js +0 -3
  447. package/.next/standalone/.next/server/chunks/ssr/src_lib_0knbpxk._.js +0 -3
  448. package/.next/standalone/.next/server/chunks/ssr/src_lib_0p_iehl._.js +0 -3
  449. package/.next/standalone/.next/server/chunks/ssr/src_lib_0qve1ri._.js +0 -3
  450. package/.next/standalone/.next/server/chunks/ssr/src_lib_0s35u~4._.js +0 -3
  451. package/.next/standalone/.next/server/chunks/ssr/src_lib_0x2ui80._.js +0 -3
  452. package/.next/standalone/.next/server/chunks/ssr/src_lib_0ypc5_d._.js +0 -3
  453. package/.next/standalone/.next/server/chunks/ssr/src_lib_10jh2mz._.js +0 -3
  454. package/.next/standalone/.next/static/chunks/0-nppzqp-r.9c.js +0 -1
  455. package/.next/standalone/.next/static/chunks/0-te2tg6~a23u.js +0 -1
  456. package/.next/standalone/.next/static/chunks/0.64.6c1mh7d2.js +0 -1
  457. package/.next/standalone/.next/static/chunks/0.8n1ce9lggg4.js +0 -1
  458. package/.next/standalone/.next/static/chunks/0.nsmn6shzidu.js +0 -2
  459. package/.next/standalone/.next/static/chunks/0.zgqz~m3sjej.js +0 -1
  460. package/.next/standalone/.next/static/chunks/00.eotegra08r.js +0 -1
  461. package/.next/standalone/.next/static/chunks/01j9m895w64zn.js +0 -1
  462. package/.next/standalone/.next/static/chunks/03y272e6e9o8i.js +0 -1
  463. package/.next/standalone/.next/static/chunks/08eyd7sq064r0.js +0 -1
  464. package/.next/standalone/.next/static/chunks/09b33znj4m__c.js +0 -1
  465. package/.next/standalone/.next/static/chunks/0d0zm8viq3ol4.js +0 -12
  466. package/.next/standalone/.next/static/chunks/0dktl5t_dtxu..js +0 -1
  467. package/.next/standalone/.next/static/chunks/0e5~nzt657k92.js +0 -1
  468. package/.next/standalone/.next/static/chunks/0erwxvpb9w29_.js +0 -1
  469. package/.next/standalone/.next/static/chunks/0gf~0e3xpa0fj.js +0 -5
  470. package/.next/standalone/.next/static/chunks/0gy79dfi~lnig.js +0 -1
  471. package/.next/standalone/.next/static/chunks/0gz3xwb5_8xwv.js +0 -1
  472. package/.next/standalone/.next/static/chunks/0i75~pu.bp20..js +0 -1
  473. package/.next/standalone/.next/static/chunks/0jn_w5b9r~beu.js +0 -1
  474. package/.next/standalone/.next/static/chunks/0l59z2mf1ouxu.js +0 -1
  475. package/.next/standalone/.next/static/chunks/0m4xd-ie7j.hx.js +0 -1
  476. package/.next/standalone/.next/static/chunks/0mx9ebe6we4z0.js +0 -1
  477. package/.next/standalone/.next/static/chunks/0nsggimu5je3g.js +0 -1
  478. package/.next/standalone/.next/static/chunks/0nw8nx8kafy79.js +0 -1
  479. package/.next/standalone/.next/static/chunks/0pzjryav9pm7p.js +0 -1
  480. package/.next/standalone/.next/static/chunks/0q-rl50zskr35.js +0 -1
  481. package/.next/standalone/.next/static/chunks/0qqy2x-fsmmmx.js +0 -1
  482. package/.next/standalone/.next/static/chunks/0t59wpux0g1~l.js +0 -1
  483. package/.next/standalone/.next/static/chunks/0uezq8wiwkq8d.js +0 -1
  484. package/.next/standalone/.next/static/chunks/0vrc~7m1_cuvl.js +0 -1
  485. package/.next/standalone/.next/static/chunks/0xbh24-hxrt~m.css +0 -1
  486. package/.next/standalone/.next/static/chunks/0xkkmruo8p.l_.js +0 -1
  487. package/.next/standalone/.next/static/chunks/0xx0pe_j2kmr9.js +0 -2
  488. package/.next/standalone/.next/static/chunks/0zqjqiqmorenw.js +0 -5
  489. package/.next/standalone/.next/static/chunks/136l78utn~v08.js +0 -1
  490. package/.next/standalone/.next/static/chunks/171x9kw9wcyk4.js +0 -1
  491. package/.next/standalone/.next/static/chunks/17m4o~gdsvuo3.js +0 -1
  492. package/next.config.ts +0 -18
  493. /package/.next/standalone/.next/static/{f1860bJqnbYj-1WLMj7F- → dFewkdixeBoRBY6Fvw11J}/_buildManifest.js +0 -0
  494. /package/.next/standalone/.next/static/{f1860bJqnbYj-1WLMj7F- → dFewkdixeBoRBY6Fvw11J}/_clientMiddlewareManifest.js +0 -0
  495. /package/.next/standalone/.next/static/{f1860bJqnbYj-1WLMj7F- → dFewkdixeBoRBY6Fvw11J}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[215624,e=>{"use strict";var t=e.i(921675),a=e.i(843793),n=e.i(195158),r=e.i(50377),i=e.i(86708);let s=["onboarding.completed","onboarding.lastStep","onboarding.username"];async function o(){let e=await a.db.systemConfig.findMany({where:{key:{in:[...s]}}}),t={};for(let a of e)try{t[a.key]=JSON.parse(a.value)}catch{t[a.key]=null}let n=!0===t["onboarding.completed"],r=t["onboarding.lastStep"],i=t["onboarding.username"];return{isFirstRun:!n,isCompleted:n,lastStep:"number"==typeof r?r:0,username:"string"==typeof i&&i.length>0?i:null}}async function d(e){await a.db.systemConfig.upsert({where:{key:"onboarding.lastStep"},create:{key:"onboarding.lastStep",value:JSON.stringify(e)},update:{value:JSON.stringify(e)}}),(0,n.revalidatePath)("/","layout")}async function l(e,t=4){if(await a.db.systemConfig.upsert({where:{key:"onboarding.completed"},create:{key:"onboarding.completed",value:"true"},update:{value:"true"}}),await a.db.systemConfig.upsert({where:{key:"onboarding.lastStep"},create:{key:"onboarding.lastStep",value:String(t)},update:{value:String(t)}}),void 0!==e){let t=e.trim().slice(0,64).replace(/[\r\n]/g," ");t.length>0&&await a.db.systemConfig.upsert({where:{key:"onboarding.username"},create:{key:"onboarding.username",value:JSON.stringify(t)},update:{value:JSON.stringify(t)}})}(0,n.revalidatePath)("/","layout")}async function u(e,t){await a.db.systemConfig.upsert({where:{key:"onboarding.extensions.requested"},create:{key:"onboarding.extensions.requested",value:JSON.stringify(e)},update:{value:JSON.stringify(e)}}),await a.db.systemConfig.upsert({where:{key:"onboarding.extensions.completed"},create:{key:"onboarding.extensions.completed",value:JSON.stringify(t)},update:{value:JSON.stringify(t)}}),(0,n.revalidatePath)("/","layout")}async function c(t){try{r.logger.create("task-completion").info("Task completion event dispatched",{taskId:t.taskId,taskTitle:t.taskTitle,status:t.status,executionId:t.executionId});let{broadcastNotification:a}=await e.A(590621);a({...t,type:"completion"}),(async()=>{try{let{db:a}=await e.A(989186),{recordHarnessMessage:n}=await e.A(60345),r=await a.task.findUnique({where:{id:t.taskId},select:{unattended:!0}});if(!r?.unattended)return;let i="COMPLETED"===t.status;await n({taskId:t.taskId,executionId:t.executionId,kind:i?"done":"failed",content:i?"任务已完成,进入待审阅。":"任务执行失败,请查看终端。"})}catch{}})()}catch{}}(0,i.ensureServerEntryExports)([o,d,l,u,c]),(0,t.registerServerReference)(o,"0018fbdd66aba52ffae0eea94c547cdac80082d648",null),(0,t.registerServerReference)(d,"4043130a1d362ee33ae88de0ed751aa1fbfa0fb132",null),(0,t.registerServerReference)(l,"602e0b75d87a1db34c3ffadaf61190e40e67bb0a42",null),(0,t.registerServerReference)(u,"603480184e60c27214a54381387436ff640e52b1b6",null),(0,t.registerServerReference)(c,"40a9ab396e79818e2ea0459b4f4c315855196db134",null),e.s(["dispatchTaskCompletionEvent",0,c])},590621,e=>{e.v(t=>Promise.all(["server/chunks/[root-of-the-server]__0~ju4-d._.js","server/chunks/src_lib_0d~1~wz._.js"].map(t=>e.l(t))).then(()=>t(513200)))},989186,e=>{e.v(e=>Promise.resolve().then(()=>e(843793)))},60345,e=>{e.v(e=>Promise.resolve().then(()=>e(108789)))}];
1
+ module.exports=[215624,e=>{"use strict";var t=e.i(921675),a=e.i(843793),n=e.i(195158),r=e.i(50377),i=e.i(86708);let s=["onboarding.completed","onboarding.lastStep","onboarding.username"];async function o(){let e=await a.db.systemConfig.findMany({where:{key:{in:[...s]}}}),t={};for(let a of e)try{t[a.key]=JSON.parse(a.value)}catch{t[a.key]=null}let n=!0===t["onboarding.completed"],r=t["onboarding.lastStep"],i=t["onboarding.username"];return{isFirstRun:!n,isCompleted:n,lastStep:"number"==typeof r?r:0,username:"string"==typeof i&&i.length>0?i:null}}async function d(e){await a.db.systemConfig.upsert({where:{key:"onboarding.lastStep"},create:{key:"onboarding.lastStep",value:JSON.stringify(e)},update:{value:JSON.stringify(e)}}),(0,n.revalidatePath)("/","layout")}async function l(e,t=4){if(await a.db.systemConfig.upsert({where:{key:"onboarding.completed"},create:{key:"onboarding.completed",value:"true"},update:{value:"true"}}),await a.db.systemConfig.upsert({where:{key:"onboarding.lastStep"},create:{key:"onboarding.lastStep",value:String(t)},update:{value:String(t)}}),void 0!==e){let t=e.trim().slice(0,64).replace(/[\r\n]/g," ");t.length>0&&await a.db.systemConfig.upsert({where:{key:"onboarding.username"},create:{key:"onboarding.username",value:JSON.stringify(t)},update:{value:JSON.stringify(t)}})}(0,n.revalidatePath)("/","layout")}async function u(e,t){await a.db.systemConfig.upsert({where:{key:"onboarding.extensions.requested"},create:{key:"onboarding.extensions.requested",value:JSON.stringify(e)},update:{value:JSON.stringify(e)}}),await a.db.systemConfig.upsert({where:{key:"onboarding.extensions.completed"},create:{key:"onboarding.extensions.completed",value:JSON.stringify(t)},update:{value:JSON.stringify(t)}}),(0,n.revalidatePath)("/","layout")}async function c(t){try{r.logger.create("task-completion").info("Task completion event dispatched",{taskId:t.taskId,taskTitle:t.taskTitle,status:t.status,executionId:t.executionId});let{broadcastNotification:a}=await e.A(590621);a({...t,type:"completion"}),(async()=>{try{let{db:a}=await e.A(989186),{recordHarnessMessage:n}=await e.A(60345),r=await a.task.findUnique({where:{id:t.taskId},select:{unattended:!0}});if(!r?.unattended)return;let i="COMPLETED"===t.status;await n({taskId:t.taskId,executionId:t.executionId,kind:i?"done":"failed",content:i?"任务已完成,进入待审阅。":"任务执行失败,请查看终端。"})}catch{}})()}catch{}}(0,i.ensureServerEntryExports)([o,d,l,u,c]),(0,t.registerServerReference)(o,"004cbab2b0471abdbcfcc5ef54e684df499d08b135",null),(0,t.registerServerReference)(d,"409514d2e6ba0203c3eef2ce4c33c92eda1ac6df5b",null),(0,t.registerServerReference)(l,"60a4ada82f71564fac6a21d2e1acd2b54d08785d4f",null),(0,t.registerServerReference)(u,"607eaa281a5072d41ad4d099e8ccafb2d5e0da2b19",null),(0,t.registerServerReference)(c,"408b0b902f8e30950bae165365050794717fcfbf4d",null),e.s(["dispatchTaskCompletionEvent",0,c])},590621,e=>{e.v(t=>Promise.all(["server/chunks/[root-of-the-server]__0~ju4-d._.js","server/chunks/src_lib_0d~1~wz._.js"].map(t=>e.l(t))).then(()=>t(513200)))},989186,e=>{e.v(e=>Promise.resolve().then(()=>e(843793)))},60345,e=>{e.v(e=>Promise.resolve().then(()=>e(108789)))}];
2
2
 
3
3
  //# sourceMappingURL=src_0vp6.co._.js.map
@@ -1,3 +1,3 @@
1
- module.exports=[215624,e=>{"use strict";var t=e.i(921675),a=e.i(843793),n=e.i(195158),r=e.i(50377),i=e.i(86708);let s=["onboarding.completed","onboarding.lastStep","onboarding.username"];async function o(){let e=await a.db.systemConfig.findMany({where:{key:{in:[...s]}}}),t={};for(let a of e)try{t[a.key]=JSON.parse(a.value)}catch{t[a.key]=null}let n=!0===t["onboarding.completed"],r=t["onboarding.lastStep"],i=t["onboarding.username"];return{isFirstRun:!n,isCompleted:n,lastStep:"number"==typeof r?r:0,username:"string"==typeof i&&i.length>0?i:null}}async function d(e){await a.db.systemConfig.upsert({where:{key:"onboarding.lastStep"},create:{key:"onboarding.lastStep",value:JSON.stringify(e)},update:{value:JSON.stringify(e)}}),(0,n.revalidatePath)("/","layout")}async function l(e,t=4){if(await a.db.systemConfig.upsert({where:{key:"onboarding.completed"},create:{key:"onboarding.completed",value:"true"},update:{value:"true"}}),await a.db.systemConfig.upsert({where:{key:"onboarding.lastStep"},create:{key:"onboarding.lastStep",value:String(t)},update:{value:String(t)}}),void 0!==e){let t=e.trim().slice(0,64).replace(/[\r\n]/g," ");t.length>0&&await a.db.systemConfig.upsert({where:{key:"onboarding.username"},create:{key:"onboarding.username",value:JSON.stringify(t)},update:{value:JSON.stringify(t)}})}(0,n.revalidatePath)("/","layout")}async function u(e,t){await a.db.systemConfig.upsert({where:{key:"onboarding.extensions.requested"},create:{key:"onboarding.extensions.requested",value:JSON.stringify(e)},update:{value:JSON.stringify(e)}}),await a.db.systemConfig.upsert({where:{key:"onboarding.extensions.completed"},create:{key:"onboarding.extensions.completed",value:JSON.stringify(t)},update:{value:JSON.stringify(t)}}),(0,n.revalidatePath)("/","layout")}async function c(t){try{r.logger.create("task-completion").info("Task completion event dispatched",{taskId:t.taskId,taskTitle:t.taskTitle,status:t.status,executionId:t.executionId});let{broadcastNotification:a}=await e.A(590621);a({...t,type:"completion"}),(async()=>{try{let{db:a}=await e.A(989186),{recordHarnessMessage:n}=await e.A(60345),r=await a.task.findUnique({where:{id:t.taskId},select:{unattended:!0}});if(!r?.unattended)return;let i="COMPLETED"===t.status;await n({taskId:t.taskId,executionId:t.executionId,kind:i?"done":"failed",content:i?"任务已完成,进入待审阅。":"任务执行失败,请查看终端。"})}catch{}})()}catch{}}(0,i.ensureServerEntryExports)([o,d,l,u,c]),(0,t.registerServerReference)(o,"0018fbdd66aba52ffae0eea94c547cdac80082d648",null),(0,t.registerServerReference)(d,"4043130a1d362ee33ae88de0ed751aa1fbfa0fb132",null),(0,t.registerServerReference)(l,"602e0b75d87a1db34c3ffadaf61190e40e67bb0a42",null),(0,t.registerServerReference)(u,"603480184e60c27214a54381387436ff640e52b1b6",null),(0,t.registerServerReference)(c,"40a9ab396e79818e2ea0459b4f4c315855196db134",null),e.s(["dispatchTaskCompletionEvent",0,c])},590621,e=>{e.v(t=>Promise.all(["server/chunks/[root-of-the-server]__0~ju4-d._.js","server/chunks/src_lib_0d~1~wz._.js"].map(t=>e.l(t))).then(()=>t(513200)))},989186,e=>{e.v(e=>Promise.resolve().then(()=>e(843793)))},60345,e=>{e.v(e=>Promise.resolve().then(()=>e(108789)))}];
1
+ module.exports=[215624,e=>{"use strict";var t=e.i(921675),a=e.i(843793),n=e.i(195158),r=e.i(50377),i=e.i(86708);let s=["onboarding.completed","onboarding.lastStep","onboarding.username"];async function o(){let e=await a.db.systemConfig.findMany({where:{key:{in:[...s]}}}),t={};for(let a of e)try{t[a.key]=JSON.parse(a.value)}catch{t[a.key]=null}let n=!0===t["onboarding.completed"],r=t["onboarding.lastStep"],i=t["onboarding.username"];return{isFirstRun:!n,isCompleted:n,lastStep:"number"==typeof r?r:0,username:"string"==typeof i&&i.length>0?i:null}}async function d(e){await a.db.systemConfig.upsert({where:{key:"onboarding.lastStep"},create:{key:"onboarding.lastStep",value:JSON.stringify(e)},update:{value:JSON.stringify(e)}}),(0,n.revalidatePath)("/","layout")}async function l(e,t=4){if(await a.db.systemConfig.upsert({where:{key:"onboarding.completed"},create:{key:"onboarding.completed",value:"true"},update:{value:"true"}}),await a.db.systemConfig.upsert({where:{key:"onboarding.lastStep"},create:{key:"onboarding.lastStep",value:String(t)},update:{value:String(t)}}),void 0!==e){let t=e.trim().slice(0,64).replace(/[\r\n]/g," ");t.length>0&&await a.db.systemConfig.upsert({where:{key:"onboarding.username"},create:{key:"onboarding.username",value:JSON.stringify(t)},update:{value:JSON.stringify(t)}})}(0,n.revalidatePath)("/","layout")}async function u(e,t){await a.db.systemConfig.upsert({where:{key:"onboarding.extensions.requested"},create:{key:"onboarding.extensions.requested",value:JSON.stringify(e)},update:{value:JSON.stringify(e)}}),await a.db.systemConfig.upsert({where:{key:"onboarding.extensions.completed"},create:{key:"onboarding.extensions.completed",value:JSON.stringify(t)},update:{value:JSON.stringify(t)}}),(0,n.revalidatePath)("/","layout")}async function c(t){try{r.logger.create("task-completion").info("Task completion event dispatched",{taskId:t.taskId,taskTitle:t.taskTitle,status:t.status,executionId:t.executionId});let{broadcastNotification:a}=await e.A(590621);a({...t,type:"completion"}),(async()=>{try{let{db:a}=await e.A(989186),{recordHarnessMessage:n}=await e.A(60345),r=await a.task.findUnique({where:{id:t.taskId},select:{unattended:!0}});if(!r?.unattended)return;let i="COMPLETED"===t.status;await n({taskId:t.taskId,executionId:t.executionId,kind:i?"done":"failed",content:i?"任务已完成,进入待审阅。":"任务执行失败,请查看终端。"})}catch{}})()}catch{}}(0,i.ensureServerEntryExports)([o,d,l,u,c]),(0,t.registerServerReference)(o,"004cbab2b0471abdbcfcc5ef54e684df499d08b135",null),(0,t.registerServerReference)(d,"409514d2e6ba0203c3eef2ce4c33c92eda1ac6df5b",null),(0,t.registerServerReference)(l,"60a4ada82f71564fac6a21d2e1acd2b54d08785d4f",null),(0,t.registerServerReference)(u,"607eaa281a5072d41ad4d099e8ccafb2d5e0da2b19",null),(0,t.registerServerReference)(c,"408b0b902f8e30950bae165365050794717fcfbf4d",null),e.s(["dispatchTaskCompletionEvent",0,c])},590621,e=>{e.v(t=>Promise.all(["server/chunks/[root-of-the-server]__0~ju4-d._.js","server/chunks/src_lib_0d~1~wz._.js"].map(t=>e.l(t))).then(()=>t(513200)))},989186,e=>{e.v(e=>Promise.resolve().then(()=>e(843793)))},60345,e=>{e.v(e=>Promise.resolve().then(()=>e(108789)))}];
2
2
 
3
3
  //# sourceMappingURL=src_11k6i~l._.js.map
@@ -1,10 +1,10 @@
1
- module.exports=[756264,e=>{"use strict";var t=e.i(921675),a=e.i(843793),r=e.i(195158),i=e.i(248434),n=e.i(83721),s=e.i(50377),d=e.i(572173),o=e.i(89428),c=e.i(108789),l=e.i(924868),u=e.i(446786),w=e.i(814747),h=e.i(192520),k=e.i(86708);let f=s.logger.create("agent-actions"),p=(0,h.getSignalDir)();async function E(e,t){try{await (0,l.mkdir)(p,{recursive:!0,mode:448}),await (0,l.writeFile)((0,w.join)(p,`exit-${e}`),String(t),{mode:384})}catch{}}async function b(e,t){let i=await a.db.taskMessage.create({data:{role:"USER",content:t,taskId:e}});return(0,r.revalidatePath)("/workspaces"),{userMessage:i}}async function m(e){return a.db.taskMessage.findMany({where:{taskId:e},orderBy:{createdAt:"asc"}})}async function P(e,t="CLAUDE_CODE",i,n){let s=await a.db.taskExecution.create({data:{taskId:e,agent:t,status:"RUNNING",startedAt:new Date,worktreePath:i??null,worktreeBranch:n??null}});return await a.db.task.update({where:{id:e},data:{status:"IN_PROGRESS"}}),(0,r.revalidatePath)("/workspaces"),s}async function g(e,t="FAILED"){let i=await a.db.taskExecution.update({where:{id:e},data:{status:t,endedAt:new Date}});return(0,r.revalidatePath)("/workspaces"),i}async function A(t){await (0,c.cancelOpenAsks)(t).catch(()=>{});let{destroySession:i,getSession:n}=await e.A(217260),s=n(t),d=s?.getBuffer()??"",o=await a.db.taskExecution.findFirst({where:{taskId:t,status:"RUNNING"},orderBy:{createdAt:"desc"}}),l=await a.db.task.findUnique({where:{id:t},include:{project:{select:{localPath:!0}}}});if(i(t),o){await a.db.taskExecution.update({where:{id:o.id},data:{status:"COMPLETED",endedAt:new Date}}),await a.db.task.update({where:{id:t},data:{status:"IN_REVIEW"}});let r=o.worktreePath||l?.project?.localPath||null,{captureExecutionSummary:i}=await e.A(507603);await i(o.id,t,0,d,r,o.forkCommit)}(0,r.revalidatePath)("/workspaces")}async function I(e){return a.db.taskExecution.findMany({where:{taskId:e},orderBy:{createdAt:"desc"},include:{insightNote:{select:{id:!0,title:!0,content:!0}}}})}async function v(t,i){await (0,c.cancelOpenAsks)(t).catch(()=>{});let s=await a.db.task.findUnique({where:{id:t},include:{project:!0}});if(!s)throw Error("Task not found");if(!s.project?.localPath)throw Error("Project has no local path configured");await a.db.taskExecution.updateMany({where:{taskId:t,status:"RUNNING",NOT:{sessionId:i}},data:{status:"FAILED",endedAt:new Date}});let l=await a.db.taskExecution.findFirst({where:{taskId:t,sessionId:i},orderBy:{createdAt:"desc"}});if(!l)throw Error("Previous execution not found");let u=l.worktreePath??s.project.localPath,h=s.subPath?(0,w.join)(u,s.subPath):u,k=await (0,d.readConfigValue)("terminal.idleTimeoutSec",180),{adapter:p}=await (0,o.resolveCliAdapter)("terminal"),b=p.buildEnvOverrides({taskId:t,taskTitle:s.title,apiUrl:`http://localhost:${process.env.PORT||"3000"}`,callbackUrl:l.callbackUrl??void 0}),m=await a.db.taskExecution.update({where:{id:l.id},data:{status:"RUNNING",endedAt:null}});await a.db.task.update({where:{id:t},data:{status:"IN_PROGRESS"}}),(0,r.revalidatePath)("/workspaces");let P=await (0,d.readConfigValue)("onboarding.username",""),g=p.buildSpawnArgs({taskId:t,prompt:"",cwd:h,resumeSessionId:i,extraArgs:[...P?["--append-system-prompt",`The user's name is ${P}.`]:[]],envOverrides:b});s.unattended&&(g.env.TOWER_UNATTENDED="1");let A=/no conversation found with session id|unknown session|session .* not found/i;return(0,n.createSession)(t,g.command,g.args,h,()=>{},async r=>{await E(t,r);let n=await a.db.taskExecution.findUnique({where:{id:m.id}});if(n?.status!=="RUNNING")return;let{getSession:d}=await e.A(217260),o=d(t),c=o?.getBuffer()??"";if(0!==r&&A.test(c)){f.info("Session resume failed — retrying with fresh execution",{taskId:t,previousSessionId:i}),await a.db.taskExecution.update({where:{id:m.id},data:{status:"FAILED",endedAt:new Date}}).catch(()=>{});try{await x(t,s.title)}catch(e){f.error("Fresh execution retry also failed",e,{taskId:t})}return}await a.db.taskExecution.update({where:{id:m.id},data:{status:0===r?"COMPLETED":"FAILED",endedAt:new Date}}).catch(()=>{});let u=l.worktreePath||s.project.localPath,{captureExecutionSummary:w}=await e.A(507603);await w(m.id,t,r,c,u,m.forkCommit);let{dispatchTaskCompletionEvent:h}=await e.A(136565);await h({taskId:t,taskTitle:s.title,status:0===r?"COMPLETED":"FAILED",executionId:m.id,workspaceId:s.project.workspaceId}),0===r&&await a.db.task.update({where:{id:t},data:{status:"IN_REVIEW"}}).catch(()=>{})},g.env,void 0,1e3*k),{executionId:m.id,worktreePath:l.worktreePath??u??null}}async function N(t){await (0,c.cancelOpenAsks)(t).catch(()=>{});let i=await a.db.task.findUnique({where:{id:t},include:{project:!0}});if(!i)throw Error("Task not found");if(!i.project?.localPath)throw Error("Project has no local path configured");let s=await a.db.taskExecution.findFirst({where:{taskId:t},orderBy:{createdAt:"desc"}}),{destroySession:l}=await e.A(217260);l(t),await a.db.taskExecution.updateMany({where:{taskId:t,status:"RUNNING"},data:{status:"FAILED",endedAt:new Date}});let u=s?.worktreePath??i.project.localPath,h=i.subPath?(0,w.join)(u,i.subPath):u,k=await (0,d.readConfigValue)("terminal.idleTimeoutSec",180),{adapter:f,provider:p}=await (0,o.resolveCliAdapter)("terminal"),b=f.buildEnvOverrides({taskId:t,taskTitle:i.title,apiUrl:`http://localhost:${process.env.PORT||"3000"}`}),m=await a.db.taskExecution.create({data:{taskId:t,agent:p.agentFieldValue,status:"RUNNING",startedAt:new Date,worktreePath:s?.worktreePath??null,worktreeBranch:s?.worktreeBranch??null}});await a.db.task.update({where:{id:t},data:{status:"IN_PROGRESS"}}),(0,r.revalidatePath)("/workspaces");let P=await (0,d.readConfigValue)("onboarding.username",""),g=f.buildSpawnArgs({taskId:t,prompt:"",cwd:h,continueLatest:!0,extraArgs:[...P?["--append-system-prompt",`The user's name is ${P}.`]:[]],envOverrides:b});return i.unattended&&(g.env.TOWER_UNATTENDED="1"),(0,n.createSession)(t,g.command,g.args,h,()=>{},async r=>{await E(t,r);let n=await a.db.taskExecution.findUnique({where:{id:m.id}});if(n?.status!=="RUNNING")return;let{getSession:d}=await e.A(217260),o=d(t),c=o?.getBuffer()??"";await a.db.taskExecution.update({where:{id:m.id},data:{status:0===r?"COMPLETED":"FAILED",endedAt:new Date}}).catch(()=>{});let l=s?.worktreePath||i.project.localPath,{captureExecutionSummary:u}=await e.A(507603);await u(m.id,t,r,c,l,s?.forkCommit??null);let{dispatchTaskCompletionEvent:w}=await e.A(136565);await w({taskId:t,taskTitle:i.title,status:0===r?"COMPLETED":"FAILED",executionId:m.id,workspaceId:i.project.workspaceId}),0===r&&await a.db.task.update({where:{id:t},data:{status:"IN_REVIEW"}}).catch(()=>{})},g.env,void 0,1e3*k),{executionId:m.id,worktreePath:s?.worktreePath??u??null}}async function y(t){let{getSession:r}=await e.A(217260),i=r(t);if(i&&!i.killed){let e=await a.db.taskExecution.findFirst({where:{taskId:t,status:"RUNNING"},orderBy:{createdAt:"desc"}});return{mode:"already_running",executionId:e?.id??null,worktreePath:e?.worktreePath??null}}if(await a.db.taskExecution.count({where:{taskId:t}})>0){let e=await N(t);return{mode:"continued",executionId:e.executionId,worktreePath:e.worktreePath}}let n=await x(t,"");return{mode:"started",executionId:n.executionId,worktreePath:n.worktreePath}}async function x(t,s,h,k,p){let b,m;await (0,c.cancelOpenAsks)(t).catch(()=>{});let P=await a.db.task.findUnique({where:{id:t},include:{project:!0}});if(!P)throw Error("Task not found");if(!P.project?.localPath)throw Error("Project has no local path configured");let g=await (0,d.readConfigValue)("system.maxConcurrentExecutions",20);if(await a.db.taskExecution.count({where:{status:"RUNNING"}})>=g)throw Error(`已达并发上限(${g}),请等待其他任务完成后再启动`);let A=await (0,d.readConfigValue)("terminal.idleTimeoutSec",180),{adapter:I,provider:v,model:N}=await (0,o.resolveCliAdapter)("terminal");await a.db.taskExecution.updateMany({where:{taskId:t,status:"RUNNING"},data:{status:"FAILED",endedAt:new Date}}),"IN_PROGRESS"!==P.status&&(await a.db.task.update({where:{id:t},data:{status:"IN_PROGRESS"}}),(0,r.revalidatePath)("/workspaces"));let y="";if(!p){let e=await a.db.taskMessage.findMany({where:{taskId:t},orderBy:{createdAt:"desc"},take:10});y=[`Task: ${P.title}`,P.description?`Description: ${P.description}`:"",e.length>0?`Recent conversation:
2
- ${e.reverse().map(e=>`${e.role}: ${e.content}`).join("\n")}`:"",s.trim()?`User message: ${s}`:""].filter(Boolean).join("\n\n")}let x=h??P.promptId;if(x){let e=await a.db.agentPrompt.findUnique({where:{id:x}});e?.content&&(m=await (0,l.mkdtemp)((0,w.join)((0,u.tmpdir)(),"tower-pty-")),b=(0,w.join)(m,"instructions.md"),await (0,l.writeFile)(b,e.content,"utf-8"))}let R=null,D=null;if(P.baseBranch&&P.project.localPath){let{worktreePath:e,worktreeBranch:a}=await (0,i.createWorktree)(P.project.localPath,t,P.baseBranch);R=e,D=a}let j=R??P.project.localPath,S=P.subPath?(0,w.join)(j,P.subPath):j,T=await a.db.taskExecution.create({data:{taskId:t,agent:v.agentFieldValue,status:"RUNNING",startedAt:new Date,worktreePath:R??null,worktreeBranch:D??null,callbackUrl:k??null}}),U=null;if(P.project.localPath)try{let t,{execFileSync:r}=await e.A(144264);(t=R&&P.baseBranch?r("git",["merge-base",P.baseBranch,"HEAD"],{cwd:R,encoding:"utf-8",timeout:5e3}).trim():r("git",["rev-parse","HEAD"],{cwd:P.project.localPath,encoding:"utf-8",timeout:5e3}).trim())&&(U=t,await a.db.taskExecution.update({where:{id:T.id},data:{forkCommit:t}}))}catch{}let O="",{CONFIG_DEFAULTS:C}=await e.A(75010),F=await (0,d.readConfigValue)("task.systemDirective",C["task.systemDirective"].defaultValue);if(F&&(O+=F),b){let{readFile:t}=await e.A(260815),a=await t(b,"utf-8");O+=(O?"\n\n":"")+a}let _=await (0,d.readConfigValue)("onboarding.username","");if(_&&(O+=(O?"\n":"")+`The user's name is ${_}.`),P.unattended){let e=await (0,d.readConfigValue)("harness.targets",[]),t=(Array.isArray(e)?e:[]).find(e=>e?.active&&e.gateway),a=t?`## 无人值守外推(ask_human / notify_human)
1
+ module.exports=[756264,e=>{"use strict";var t=e.i(921675),a=e.i(843793),r=e.i(195158),i=e.i(248434),n=e.i(83721),s=e.i(50377),d=e.i(572173),o=e.i(89428),c=e.i(108789),l=e.i(924868),u=e.i(446786),w=e.i(814747),h=e.i(192520),f=e.i(86708);let k=s.logger.create("agent-actions"),p=(0,h.getSignalDir)();async function b(e,t){try{await (0,l.mkdir)(p,{recursive:!0,mode:448}),await (0,l.writeFile)((0,w.join)(p,`exit-${e}`),String(t),{mode:384})}catch{}}async function E(e,t){let i=await a.db.taskMessage.create({data:{role:"USER",content:t,taskId:e}});return(0,r.revalidatePath)("/workspaces"),{userMessage:i}}async function m(e){return a.db.taskMessage.findMany({where:{taskId:e},orderBy:{createdAt:"asc"}})}async function P(e,t="CLAUDE_CODE",i,n){let s=await a.db.taskExecution.create({data:{taskId:e,agent:t,status:"RUNNING",startedAt:new Date,worktreePath:i??null,worktreeBranch:n??null}});return await a.db.task.update({where:{id:e},data:{status:"IN_PROGRESS"}}),(0,r.revalidatePath)("/workspaces"),s}async function g(e,t="FAILED"){let i=await a.db.taskExecution.update({where:{id:e},data:{status:t,endedAt:new Date}});return(0,r.revalidatePath)("/workspaces"),i}async function A(t){await (0,c.cancelOpenAsks)(t).catch(()=>{});let{destroySession:i,getSession:n}=await e.A(217260),s=n(t),d=s?.getBuffer()??"",o=await a.db.taskExecution.findFirst({where:{taskId:t,status:"RUNNING"},orderBy:{createdAt:"desc"}}),l=await a.db.task.findUnique({where:{id:t},include:{project:{select:{localPath:!0}}}});if(i(t),o){await a.db.taskExecution.update({where:{id:o.id},data:{status:"COMPLETED",endedAt:new Date}}),await a.db.task.update({where:{id:t},data:{status:"IN_REVIEW"}});let r=o.worktreePath||l?.project?.localPath||null,{captureExecutionSummary:i}=await e.A(507603);await i(o.id,t,0,d,r,o.forkCommit)}(0,r.revalidatePath)("/workspaces")}async function I(e){return a.db.taskExecution.findMany({where:{taskId:e},orderBy:{createdAt:"desc"},include:{insightNote:{select:{id:!0,title:!0,content:!0}}}})}async function v(t,i){await (0,c.cancelOpenAsks)(t).catch(()=>{});let s=await a.db.task.findUnique({where:{id:t},include:{project:!0}});if(!s)throw Error("Task not found");if(!s.project?.localPath)throw Error("Project has no local path configured");await a.db.taskExecution.updateMany({where:{taskId:t,status:"RUNNING",NOT:{sessionId:i}},data:{status:"FAILED",endedAt:new Date}});let l=await a.db.taskExecution.findFirst({where:{taskId:t,sessionId:i},orderBy:{createdAt:"desc"}});if(!l)throw Error("Previous execution not found");let u=l.worktreePath??s.project.localPath,h=s.subPath?(0,w.join)(u,s.subPath):u,f=await (0,d.readConfigValue)("terminal.idleTimeoutSec",180),{adapter:p}=await (0,o.resolveCliAdapter)("terminal"),E=p.buildEnvOverrides({taskId:t,taskTitle:s.title,apiUrl:`http://localhost:${process.env.PORT||"3000"}`,callbackUrl:l.callbackUrl??void 0}),m=await a.db.taskExecution.update({where:{id:l.id},data:{status:"RUNNING",endedAt:null}});await a.db.task.update({where:{id:t},data:{status:"IN_PROGRESS"}}),(0,r.revalidatePath)("/workspaces");let P=await (0,d.readConfigValue)("onboarding.username",""),g=p.buildSpawnArgs({taskId:t,prompt:"",cwd:h,resumeSessionId:i,extraArgs:[...P?["--append-system-prompt",`The user's name is ${P}.`]:[]],envOverrides:E});s.unattended&&(g.env.TOWER_UNATTENDED="1");let A=/no conversation found with session id|unknown session|session .* not found/i;return(0,n.createSession)(t,g.command,g.args,h,()=>{},async r=>{await b(t,r);let n=await a.db.taskExecution.findUnique({where:{id:m.id}});if(n?.status!=="RUNNING")return;let{getSession:d}=await e.A(217260),o=d(t),c=o?.getBuffer()??"";if(0!==r&&A.test(c)){k.info("Session resume failed — retrying with fresh execution",{taskId:t,previousSessionId:i}),await a.db.taskExecution.update({where:{id:m.id},data:{status:"FAILED",endedAt:new Date}}).catch(()=>{});try{await x(t,s.title)}catch(e){k.error("Fresh execution retry also failed",e,{taskId:t})}return}await a.db.taskExecution.update({where:{id:m.id},data:{status:0===r?"COMPLETED":"FAILED",endedAt:new Date}}).catch(()=>{});let u=l.worktreePath||s.project.localPath,{captureExecutionSummary:w}=await e.A(507603);await w(m.id,t,r,c,u,m.forkCommit);let{dispatchTaskCompletionEvent:h}=await e.A(136565);await h({taskId:t,taskTitle:s.title,status:0===r?"COMPLETED":"FAILED",executionId:m.id,workspaceId:s.project.workspaceId}),0===r&&await a.db.task.update({where:{id:t},data:{status:"IN_REVIEW"}}).catch(()=>{})},g.env,void 0,1e3*f),{executionId:m.id,worktreePath:l.worktreePath??u??null}}async function N(t){await (0,c.cancelOpenAsks)(t).catch(()=>{});let i=await a.db.task.findUnique({where:{id:t},include:{project:!0}});if(!i)throw Error("Task not found");if(!i.project?.localPath)throw Error("Project has no local path configured");let s=await a.db.taskExecution.findFirst({where:{taskId:t},orderBy:{createdAt:"desc"}}),{destroySession:l}=await e.A(217260);l(t),await a.db.taskExecution.updateMany({where:{taskId:t,status:"RUNNING"},data:{status:"FAILED",endedAt:new Date}});let u=s?.worktreePath??i.project.localPath,h=i.subPath?(0,w.join)(u,i.subPath):u,f=await (0,d.readConfigValue)("terminal.idleTimeoutSec",180),{adapter:k,provider:p}=await (0,o.resolveCliAdapter)("terminal"),E=k.buildEnvOverrides({taskId:t,taskTitle:i.title,apiUrl:`http://localhost:${process.env.PORT||"3000"}`}),m=await a.db.taskExecution.create({data:{taskId:t,agent:p.agentFieldValue,status:"RUNNING",startedAt:new Date,worktreePath:s?.worktreePath??null,worktreeBranch:s?.worktreeBranch??null}});await a.db.task.update({where:{id:t},data:{status:"IN_PROGRESS"}}),(0,r.revalidatePath)("/workspaces");let P=await (0,d.readConfigValue)("onboarding.username",""),g=k.buildSpawnArgs({taskId:t,prompt:"",cwd:h,continueLatest:!0,extraArgs:[...P?["--append-system-prompt",`The user's name is ${P}.`]:[]],envOverrides:E});return i.unattended&&(g.env.TOWER_UNATTENDED="1"),(0,n.createSession)(t,g.command,g.args,h,()=>{},async r=>{await b(t,r);let n=await a.db.taskExecution.findUnique({where:{id:m.id}});if(n?.status!=="RUNNING")return;let{getSession:d}=await e.A(217260),o=d(t),c=o?.getBuffer()??"";await a.db.taskExecution.update({where:{id:m.id},data:{status:0===r?"COMPLETED":"FAILED",endedAt:new Date}}).catch(()=>{});let l=s?.worktreePath||i.project.localPath,{captureExecutionSummary:u}=await e.A(507603);await u(m.id,t,r,c,l,s?.forkCommit??null);let{dispatchTaskCompletionEvent:w}=await e.A(136565);await w({taskId:t,taskTitle:i.title,status:0===r?"COMPLETED":"FAILED",executionId:m.id,workspaceId:i.project.workspaceId}),0===r&&await a.db.task.update({where:{id:t},data:{status:"IN_REVIEW"}}).catch(()=>{})},g.env,void 0,1e3*f),{executionId:m.id,worktreePath:s?.worktreePath??u??null}}async function y(t){let{getSession:r}=await e.A(217260),i=r(t);if(i&&!i.killed){let e=await a.db.taskExecution.findFirst({where:{taskId:t,status:"RUNNING"},orderBy:{createdAt:"desc"}});return{mode:"already_running",executionId:e?.id??null,worktreePath:e?.worktreePath??null}}if(await a.db.taskExecution.count({where:{taskId:t}})>0){let e=await N(t);return{mode:"continued",executionId:e.executionId,worktreePath:e.worktreePath}}let n=await x(t,"");return{mode:"started",executionId:n.executionId,worktreePath:n.worktreePath}}async function x(t,s,h,f,p){let E,m;await (0,c.cancelOpenAsks)(t).catch(()=>{});let P=await a.db.task.findUnique({where:{id:t},include:{project:!0}});if(!P)throw Error("Task not found");if(!P.project?.localPath)throw Error("Project has no local path configured");let g=await (0,d.readConfigValue)("system.maxConcurrentExecutions",20);if(await a.db.taskExecution.count({where:{status:"RUNNING"}})>=g)throw Error(`已达并发上限(${g}),请等待其他任务完成后再启动`);let A=await (0,d.readConfigValue)("terminal.idleTimeoutSec",180),{adapter:I,provider:v,model:N}=await (0,o.resolveCliAdapter)("terminal");await a.db.taskExecution.updateMany({where:{taskId:t,status:"RUNNING"},data:{status:"FAILED",endedAt:new Date}}),"IN_PROGRESS"!==P.status&&(await a.db.task.update({where:{id:t},data:{status:"IN_PROGRESS"}}),(0,r.revalidatePath)("/workspaces"));let y="";if(!p){let e=await a.db.taskMessage.findMany({where:{taskId:t},orderBy:{createdAt:"desc"},take:10});y=[`Task: ${P.title}`,P.description?`Description: ${P.description}`:"",e.length>0?`Recent conversation:
2
+ ${e.reverse().map(e=>`${e.role}: ${e.content}`).join("\n")}`:"",s.trim()?`User message: ${s}`:""].filter(Boolean).join("\n\n")}let x=h??P.promptId;if(x){let e=await a.db.agentPrompt.findUnique({where:{id:x}});e?.content&&(m=await (0,l.mkdtemp)((0,w.join)((0,u.tmpdir)(),"tower-pty-")),E=(0,w.join)(m,"instructions.md"),await (0,l.writeFile)(E,e.content,"utf-8"))}let R=null,D=null;if(P.baseBranch&&P.project.localPath){let{worktreePath:e,worktreeBranch:a}=await (0,i.createWorktree)(P.project.localPath,t,P.baseBranch);R=e,D=a}let T=R??P.project.localPath,j=P.subPath?(0,w.join)(T,P.subPath):T,S=await a.db.taskExecution.create({data:{taskId:t,agent:v.agentFieldValue,status:"RUNNING",startedAt:new Date,worktreePath:R??null,worktreeBranch:D??null,callbackUrl:f??null}}),U=null;if(P.project.localPath)try{let t,{execFileSync:r}=await e.A(144264);(t=R&&P.baseBranch?r("git",["merge-base",P.baseBranch,"HEAD"],{cwd:R,encoding:"utf-8",timeout:5e3}).trim():r("git",["rev-parse","HEAD"],{cwd:P.project.localPath,encoding:"utf-8",timeout:5e3}).trim())&&(U=t,await a.db.taskExecution.update({where:{id:S.id},data:{forkCommit:t}}))}catch{}let O="",{CONFIG_DEFAULTS:C}=await e.A(75010),F=await (0,d.readConfigValue)("task.systemDirective",C["task.systemDirective"].defaultValue);if(F&&(O+=F),E){let{readFile:t}=await e.A(260815),a=await t(E,"utf-8");O+=(O?"\n\n":"")+a}let _=await (0,d.readConfigValue)("onboarding.username","");if(_&&(O+=(O?"\n":"")+`The user's name is ${_}.`),P.unattended){let e=await (0,d.readConfigValue)("harness.targets",[]),t=(Array.isArray(e)?e:[]).find(e=>e?.active&&e.gateway),a=t?`## 无人值守外推(ask_human / notify_human)
3
3
  \`ask_human\` / \`notify_human\` 工具**只在 Tower 内记录 + park**,绝不替你把消息发给人。要让人真正收到,必须你自己按两步做:
4
4
  1. **先发**:用下列生效渠道对应的平台 MCP 工具把消息发出去。正文**必须逐字带**关联口令 \`[[tower:task=<taskId>]]\`(漏了人回复就无法归属、任务永久卡死)。
5
5
  - 生效渠道:网关 ${t.gateway}${t.downstream?` → 下游 ${t.downstream}`:""}
6
6
  - 发到哪个群/人由你在正文说明;若只知道名称(群名/人名)而无平台 id,先用平台 MCP 按名称查出 id 再发。
7
7
  2. **再记录**:确认第 1 步**发送成功后**,才调 \`ask_human\`(阻塞、park)或 \`notify_human\`(不阻塞、不 park)让 Tower 留档。
8
- - 平台发送**失败**时**不要**调 ask_human(否则任务被 park 却没人知道)——重试,或把问题写进 /harness 面板后停下等人。`:"## 无人值守外推\n当前未配置任何发送渠道,你**无法**把消息外推给人(ask_human 会返回 noChannelConfigured)。**不要臆造已通知**——把问题记进 Tower(/harness 面板可见),并明确告知需去「设置 → 通知 → 无人值守发送渠道」配置一条并设为生效。";O+=(O?"\n\n":"")+a}let B=I.buildSpawnArgs({taskId:t,prompt:y,cwd:S,extraArgs:[...O?["--append-system-prompt",O]:[],...N?["--model",N]:[]],envOverrides:I.buildEnvOverrides({taskId:t,taskTitle:P.title,apiUrl:`http://localhost:${process.env.PORT||"3000"}`,callbackUrl:k??void 0})});return P.unattended&&(B.env.TOWER_UNATTENDED="1"),(0,n.createSession)(t,B.command,B.args,S,()=>{},async r=>{await E(t,r);let i=await a.db.taskExecution.findUnique({where:{id:T.id}});if(i?.status!=="RUNNING")return;let{getSession:n}=await e.A(217260),s=n(t),d=s?.getBuffer()??"";await a.db.taskExecution.update({where:{id:T.id},data:{status:0===r?"COMPLETED":"FAILED",endedAt:new Date}}).catch(e=>{f.error("Failed to update execution status",e)});let o=R||P.project.localPath,{captureExecutionSummary:c}=await e.A(507603);await c(T.id,t,r,d,o,U);let{dispatchTaskCompletionEvent:u}=await e.A(136565);await u({taskId:t,taskTitle:P.title,status:0===r?"COMPLETED":"FAILED",executionId:T.id,workspaceId:P.project.workspaceId}),0===r&&await a.db.task.update({where:{id:t},data:{status:"IN_REVIEW"}}).catch(e=>{f.error("Failed to update task status",e)}),m&&await (0,l.rm)(m,{recursive:!0,force:!0}).catch(()=>{})},B.env,void 0,1e3*A),{executionId:T.id,worktreePath:R??j??null}}async function R(e,t,a,r,i){try{let n=await x(e,t,a,r,i);return{ok:!0,...n}}catch(t){return f.error("startPtyExecution failed",{taskId:e,error:t instanceof Error?t.stack??t.message:String(t)}),{ok:!1,error:t instanceof Error&&t.message?t.message:String(t)}}}async function D(){return(await a.db.taskExecution.findMany({where:{status:"RUNNING"},orderBy:{startedAt:"asc"},include:{task:{include:{project:{include:{workspace:!0}}}}}})).map(e=>({executionId:e.id,taskId:e.taskId,taskTitle:e.task.title,projectId:e.task.project.id,projectName:e.task.project.name,projectAlias:e.task.project.alias,projectLocalPath:e.task.project.localPath,workspaceId:e.task.project.workspace.id,workspaceName:e.task.project.workspace.name,worktreePath:e.worktreePath,subPath:e.task.subPath??null,startedAt:e.startedAt?.toISOString()??null}))}(0,k.ensureServerEntryExports)([b,m,P,g,A,I,v,N,y,x,R,D]),(0,t.registerServerReference)(b,"60ae3ebfa8f1c05e65ac7b13ce214332ab8e56798c",null),(0,t.registerServerReference)(m,"405fc1518e581b03c39972f532cd57b2d3217490fd",null),(0,t.registerServerReference)(P,"785b590700763c293c4fe526387929ddfbd05030e9",null),(0,t.registerServerReference)(g,"60cb35af1a931346fdd0a76058abad4077d52ae84c",null),(0,t.registerServerReference)(A,"4002e701556efc923466db3132a1eb9dcf3ed1ef2c",null),(0,t.registerServerReference)(I,"40fa3f329236851a9a8b8ca9c1e58fc01db0cc1a7d",null),(0,t.registerServerReference)(v,"606693c21cce966ba14f407175e65a06ac7f498051",null),(0,t.registerServerReference)(N,"40ddd0314c3c22a36d679760619153e9ec0bccb69f",null),(0,t.registerServerReference)(y,"402a10b1aafae337a85f9ef61950f00bed869774d6",null),(0,t.registerServerReference)(x,"7c63afffbf71f8ba94c960c71a704c1530768065f3",null),(0,t.registerServerReference)(R,"7c2a594c06cd57cecd2ea14b792507a79a0e8762b5",null),(0,t.registerServerReference)(D,"0099ccf1abd659c635da6411eb5c05e03f2300c494",null),e.s(["continueOrStartTaskExecution",0,y,"startPtyExecution",0,x,"stopPtyExecution",0,A])}];
8
+ - 平台发送**失败**时**不要**调 ask_human(否则任务被 park 却没人知道)——重试,或把问题写进 /harness 面板后停下等人。`:"## 无人值守外推\n当前未配置任何发送渠道,你**无法**把消息外推给人(ask_human 会返回 noChannelConfigured)。**不要臆造已通知**——把问题记进 Tower(/harness 面板可见),并明确告知需去「设置 → 通知 → 无人值守发送渠道」配置一条并设为生效。";O+=(O?"\n\n":"")+a}let B=I.buildSpawnArgs({taskId:t,prompt:y,cwd:j,extraArgs:[...O?["--append-system-prompt",O]:[],...N?["--model",N]:[]],envOverrides:I.buildEnvOverrides({taskId:t,taskTitle:P.title,apiUrl:`http://localhost:${process.env.PORT||"3000"}`,callbackUrl:f??void 0})});return P.unattended&&(B.env.TOWER_UNATTENDED="1"),(0,n.createSession)(t,B.command,B.args,j,()=>{},async r=>{await b(t,r);let i=await a.db.taskExecution.findUnique({where:{id:S.id}});if(i?.status!=="RUNNING")return;let{getSession:n}=await e.A(217260),s=n(t),d=s?.getBuffer()??"";await a.db.taskExecution.update({where:{id:S.id},data:{status:0===r?"COMPLETED":"FAILED",endedAt:new Date}}).catch(e=>{k.error("Failed to update execution status",e)});let o=R||P.project.localPath,{captureExecutionSummary:c}=await e.A(507603);await c(S.id,t,r,d,o,U);let{dispatchTaskCompletionEvent:u}=await e.A(136565);if(await u({taskId:t,taskTitle:P.title,status:0===r?"COMPLETED":"FAILED",executionId:S.id,workspaceId:P.project.workspaceId}),0===r&&await a.db.task.update({where:{id:t},data:{status:"IN_REVIEW"}}).catch(e=>{k.error("Failed to update task status",e)}),m&&await (0,l.rm)(m,{recursive:!0,force:!0}).catch(()=>{}),s&&!s.disconnectTimer){let{destroySession:a}=await e.A(217260),r=setTimeout(()=>a(t),3e5);r.unref?.(),s.disconnectTimer=r}},B.env,void 0,1e3*A),{executionId:S.id,worktreePath:R??T??null}}async function R(e,t,a,r,i){try{let n=await x(e,t,a,r,i);return{ok:!0,...n}}catch(t){return k.error("startPtyExecution failed",{taskId:e,error:t instanceof Error?t.stack??t.message:String(t)}),{ok:!1,error:t instanceof Error&&t.message?t.message:String(t)}}}async function D(){return(await a.db.taskExecution.findMany({where:{status:"RUNNING"},orderBy:{startedAt:"asc"},include:{task:{include:{project:{include:{workspace:!0}}}}}})).map(e=>({executionId:e.id,taskId:e.taskId,taskTitle:e.task.title,projectId:e.task.project.id,projectName:e.task.project.name,projectAlias:e.task.project.alias,projectLocalPath:e.task.project.localPath,workspaceId:e.task.project.workspace.id,workspaceName:e.task.project.workspace.name,worktreePath:e.worktreePath,subPath:e.task.subPath??null,startedAt:e.startedAt?.toISOString()??null}))}(0,f.ensureServerEntryExports)([E,m,P,g,A,I,v,N,y,x,R,D]),(0,t.registerServerReference)(E,"60794f15674bbea0a29b39878d574c892102154e42",null),(0,t.registerServerReference)(m,"40039f7de2dffeddcb8a378507ceee92d4ace96c3c",null),(0,t.registerServerReference)(P,"780a495fb6606c9d86c9de7c66e19c08eb2d8da7c9",null),(0,t.registerServerReference)(g,"6070f8f769cfb8c4f8a60f8636c8d0095fd02c629a",null),(0,t.registerServerReference)(A,"40cc116fdbafda50a73d43dc99883a0b2575d177c1",null),(0,t.registerServerReference)(I,"40fcbdd25f7ffbf65ef1e764bec9f7555bc5224ee8",null),(0,t.registerServerReference)(v,"602c786af9fab79fbafd04b467da0b832dc9e41d15",null),(0,t.registerServerReference)(N,"40ebcb2acc9d7ae9814881df6334f2e4042bd07ff1",null),(0,t.registerServerReference)(y,"4009c3c24b582cab5f012ebcec384ecc03a8e0ce08",null),(0,t.registerServerReference)(x,"7cac708ed3bb7d685da2c7f993d03b00b9ca296045",null),(0,t.registerServerReference)(R,"7c561eb8a34485679a353d7aa9c6c93b55caf3c279",null),(0,t.registerServerReference)(D,"005d3675a84fb558c43c5e91c75319e00ce3a65f7a",null),e.s(["continueOrStartTaskExecution",0,y,"startPtyExecution",0,x,"stopPtyExecution",0,A])}];
9
9
 
10
10
  //# sourceMappingURL=src_actions_agent-actions_ts_10q9r5b._.js.map
@@ -1,3 +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)];
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(e){let r=t.get(e);if(r){try{r.stop()}catch{}t.delete(e)}}function s(){for(let e of[...t.keys()])r(e)}if(globalThis.__previewSignalHandlersRegistered||(process.on("SIGTERM",s),process.on("SIGINT",s),process.on("SIGHUP",s),globalThis.__previewSignalHandlersRegistered=!0),"phase-production-build"!==process.env.NEXT_PHASE&&!globalThis.__previewSweepStarted){globalThis.__previewSweepStarted=!0;let e=new Map,s=setInterval(()=>{let s=Date.now();for(let n of function(e,t,r){let s=[];for(let{key:n,evictable:o}of e){if(!o){t.delete(n);continue}let e=t.get(n);if(void 0===e){t.set(n,r);continue}r-e>=3e5&&s.push(n)}return s}([...t].map(([e,t])=>({key:e,evictable:t.isEvictable})),e,s))r(n),e.delete(n)},6e4);s.unref?.()}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 g=new Map;function u(){return w.__notificationClients||(w.__notificationClients=new Set),w.__notificationClients}function d(e){u().add(e)}function p(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",()=>p(e)),e.on("error",()=>p(e));return}console.error(`[ws-server] Connection for task ${u}`);let _=(0,n.getSession)(u),b=null;if(_)v(_,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;b=setInterval(()=>{t+=500,(_=(0,n.getSession)(u))?(clearInterval(b),b=null,v(_,e,u),console.error(`[ws-server] Session appeared for task ${u} after ${t}ms`)):(t>=3e4||e.readyState!==s.WebSocket.OPEN)&&(clearInterval(b),b=null,e.readyState===s.WebSocket.OPEN&&e.close(1008,"No PTY session created within timeout."))},500)}e.on("message",e=>{if(!_)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 _.resize(e.cols,e.rows)}catch{}_.write(t)}),e.on("close",()=>{e._batcher?.flush();let t=g.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;g.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),b&&(clearInterval(b),b=null);let r=g.get(u);if(!r?.has(e)||(r.delete(e),r.size>0))return;g.delete(u);let s=(0,n.getSession)(u);s&&!s.killed&&s.setDataListener(()=>{})})})}function v(e,t,r){var n;let i,l;e.disconnectTimer&&(clearTimeout(e.disconnectTimer),e.disconnectTimer=null);let a=g.get(r);a||(a=new Set,g.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,p,"startWsServer",0,S]),r()}catch(e){r(e)}},!1)];
2
2
 
3
3
  //# sourceMappingURL=src_lib_0d~1~wz._.js.map
@@ -1,3 +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)];
1
+ module.exports=[682100,e=>{"use strict";var t=e.i(980738),r=e.i(603484);class s{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,r.stripClaudeNestingEnv)((0,r.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>s.BUFFER_MAX&&(this._buffer=this._buffer.slice(this._buffer.length-s.BUFFER_MAX)),this._resetIdleTimer(),this._onData(e)}),this._pty.onExit(({exitCode:e,signal:t})=>{for(let r of(this.killed=!0,this._idleTimer&&(clearTimeout(this._idleTimer),this._idleTimer=null),a(e,t),this._exitListeners))r(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 r=setTimeout(()=>{try{process.kill(-t,"SIGKILL")}catch{}},e);r.unref?.()}}e.s(["PtySession",0,s])},370314,e=>{"use strict";e.i(682100),e.i(603484);var t=e.i(979755);let r=globalThis;r.__ptySessions||(r.__ptySessions=new Map);let s=r.__ptySessions;function i(e){(function(e){let t=s.get(e);if(t)return s.delete(e),t.disconnectTimer&&(clearTimeout(t.disconnectTimer),t.disconnectTimer=null),t.killTree(),t})(e)&&(0,t.clearSessionPid)(e)}function n(){for(let e of s.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 s.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 r=e;for(let e of t)r=r.replace(e,"");return r}])},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 r(e){let r=t.get(e);if(r){try{r.stop()}catch{}t.delete(e)}}function s(){for(let e of[...t.keys()])r(e)}if(globalThis.__previewSignalHandlersRegistered||(process.on("SIGTERM",s),process.on("SIGINT",s),process.on("SIGHUP",s),globalThis.__previewSignalHandlersRegistered=!0),"phase-production-build"!==process.env.NEXT_PHASE&&!globalThis.__previewSweepStarted){globalThis.__previewSweepStarted=!0;let e=new Map,s=setInterval(()=>{let s=Date.now();for(let i of function(e,t,r){let s=[];for(let{key:i,evictable:n}of e){if(!n){t.delete(i);continue}let e=t.get(i);if(void 0===e){t.set(i,r);continue}r-e>=3e5&&s.push(i)}return s}([...t].map(([e,t])=>({key:e,evictable:t.isEvictable})),e,s))r(i),e.delete(i)},6e4);s.unref?.()}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 r=e.get("role"),s=e.get("previewKey");if("state"!==r&&"terminal"!==r||!s)return null;let i=e.get("connectionId")??Math.random().toString(36).slice(2);return{role:r,previewKey:decodeURIComponent(s),connectionId:i,taskId:e.get("clientTaskId")}}])},723538,e=>e.a(async(t,r)=>{try{var s=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([s]);[s]=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 r=parseInt(process.env.PORT||"3000",10),n=await (0,o.readConfigValue)("terminal.wsPort",r+1),d=n;for(let r=0;r<10&&await (t=d,new Promise(r=>{let{createServer:s}=e.r(504446),i=s();i.once("error",()=>r(!0)),i.once("listening",()=>{i.close(()=>r(!1))}),i.listen(t,"127.0.0.1")}));r++){if(9===r)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 s.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 r,n=t.headers.origin??"";if(!(r=parseInt(process.env.PORT||"3000",10),new Set([`http://localhost:${r}`,`http://127.0.0.1:${r}`])).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),r=null,i=null;function g(){if(t){if(i=t.subscribe(h.connectionId,h.taskId??"unknown",r=>{if("state"===h.role)try{e.send(JSON.stringify({type:"state",previewKey:t.key,state:r}))}catch{}},t=>{if("terminal"===h.role)try{e.send(t)}catch{}}),"terminal"===h.role){let r=t.getBuffer();if(r.length>0)try{e.send(r.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;r=setInterval(()=>{i+=500,(t=(0,a.getPreviewSession)(h.previewKey))?(clearInterval(r),r=null,g()):(i>=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),i&&(i(),i=null)}),e.on("error",()=>{r&&(clearInterval(r),r=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 v=(0,i.getSession)(u),T=null;if(v)p(v,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;T=setInterval(()=>{t+=500,(v=(0,i.getSession)(u))?(clearInterval(T),T=null,p(v,e,u),console.error(`[ws-server] Session appeared for task ${u} after ${t}ms`)):(t>=3e4||e.readyState!==s.WebSocket.OPEN)&&(clearInterval(T),T=null,e.readyState===s.WebSocket.OPEN&&e.close(1008,"No PTY session created within timeout."))},500)}e.on("message",e=>{if(!v)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 v.resize(e.cols,e.rows)}catch{}v.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 r=(0,i.getSession)(u);if(!r)return;if(r.setDataListener(()=>{}),u===l.ASSISTANT_SESSION_KEY){console.error("[ws-server] Assistant session disconnected — destroying immediately"),(0,i.destroySession)(u);return}let s=r.killed?3e5:72e5;r.disconnectTimer=setTimeout(()=>{console.error(`[ws-server] Keepalive expired for task ${u}`),(0,i.destroySession)(u)},s)}),e.on("error",t=>{console.error(`[ws-server] WS error for task ${u}:`,t.message),T&&(clearInterval(T),T=null);let r=S.get(u);if(!r?.has(e)||(r.delete(e),r.size>0))return;S.delete(u);let s=(0,i.getSession)(u);s&&!s.killed&&s.setDataListener(()=>{})})})}function p(e,t,r){var i;let o,l;e.disconnectTimer&&(clearTimeout(e.disconnectTimer),e.disconnectTimer=null);let a=S.get(r);a||(a=new Set,S.set(r,a)),a.add(t);let c=(i=t,o="",l=null,{send:e=>{o+=e,l||(l=setTimeout(()=>{l=null,i.readyState===s.WebSocket.OPEN&&i.bufferedAmount<65536&&i.send(o),o=""},8))},flush:()=>{l&&(clearTimeout(l),l=null),o&&i.readyState===s.WebSocket.OPEN&&i.bufferedAmount<65536&&i.send(o),o=""}});t._batcher=c;let d=a;e.setDataListener(e=>{for(let t of d){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,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 ${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 d)e.readyState===s.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===s.WebSocket.OPEN&&e.send(t)},"getActiveWsPort",0,function(){return g.__wsPort??null},"removeNotificationClient",0,_,"startWsServer",0,h]),r()}catch(e){r(e)}},!1),336114,e=>e.a(async(t,r)=>{try{var s=e.i(723538);e.i(982377);var i=t([s]);[s]=i.then?(await i)():i,e.s(["startWsServer",()=>s.startWsServer]),r()}catch(e){r(e)}},!1)];
2
2
 
3
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,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)}];
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=[],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=["--dangerously-bypass-approvals-and-sandbox"];e.extraArgs?.length&&t.push(...e.extraArgs),e.resumeSessionId?t.push("resume",e.resumeSessionId):e.continueLatest?t.push("resume","--last"):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}"`,u=a[l]?.hooks?.[0];u&&u.command!==d&&(u.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:[],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 u(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 u="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,m=d(),h=await c.installMcp(m,{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:u,mcp:h,hooks:p,skill:k,ok:h.ok&&p.ok&&k.ok}}e.s(["buildTowerMcpConfig",0,d,"getTowerMcpName",0,l,"installAllForProvider",0,u],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","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)}];
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=[],c=globalThis;if(!c.__providerRegistry){let d=new t;d.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,"/"),d=`node "${c}"`,m=a[l]?.hooks?.[0];m&&m.command!==d&&(m.command=d,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:[]}}),d.register({name:"codex",displayName:"Codex CLI",agentFieldValue:"CODEX_CLI",cli:{command:"codex",adapter:new class t{buildSpawnArgs(e){let t=["--dangerously-bypass-approvals-and-sandbox"];e.extraArgs?.length&&t.push(...e.extraArgs),e.resumeSessionId?t.push("resume",e.resumeSessionId):e.continueLatest?t.push("resume","--last"):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,"/"),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 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:[],api:[]}}),c.__providerRegistry=d}let d=c.__providerRegistry;e.s(["providerRegistry",0,d],136902)}];
2
2
 
3
3
  //# sourceMappingURL=src_lib_ai_providers_index_ts_0.y.3vp._.js.map
@@ -1,3 +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)"}}])}];
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 `task/…` 分支到远程** —— worktree 分支由 Tower 在本地统一合并回 base 并清理(完成任务时本地 merge,不经远程 PR)。把 `task/…` 推到远程只会留下 Tower 返程流程清不掉的残留分支,需要人工 `git push origin --delete` 才能收拾。\n- 若当前任务直接在项目主工作区里(非 worktree 任务):可以 push。\n- 不确定自己是不是 worktree 任务时,默认只 commit、不 push。\n- **完成任务遇到合并冲突时可自助**:Tower 完成任务会把 `task/…` 分支合并回 base,若报「合并到 base 存在冲突」,根因通常是 base 有了新提交。此时**在当前 worktree 里**执行 `git merge <base 分支>`(如 `git merge main`)把 base 合进来、解决冲突并提交,然后重新完成任务即可——**不要去主仓库解冲突**(那违反 worktree 纪律,合并动作由 Tower 在主仓库完成)。\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
2
 
3
3
  //# sourceMappingURL=src_lib_config-defaults_ts_10ayktg._.js.map