tower-studio 0.2.44 → 0.2.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (517) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +5 -0
  3. package/.next/standalone/.next/build-manifest.json +3 -3
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/routes-manifest.json +30 -0
  6. package/.next/standalone/.next/server/app/_global-error/page.js +1 -1
  7. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +2 -2
  16. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +31 -31
  17. package/.next/standalone/.next/server/app/_not-found/page.js +6 -6
  18. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/api/adapters/test/route.js +1 -1
  21. package/.next/standalone/.next/server/app/api/adapters/test/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/browse-fs/route.js +1 -1
  23. package/.next/standalone/.next/server/app/api/browse-fs/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/files/assets/[projectId]/[filename]/route.js +1 -1
  25. package/.next/standalone/.next/server/app/api/files/assets/[projectId]/[filename]/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js +1 -1
  28. package/.next/standalone/.next/server/app/api/internal/assets/[projectId]/[filename]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/internal/assets/reveal/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/api/internal/assistant/attachments/route.js +4 -3
  31. package/.next/standalone/.next/server/app/api/internal/assistant/attachments/route.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/api/internal/assistant/chat/route.js +1 -1
  33. package/.next/standalone/.next/server/app/api/internal/assistant/chat/route.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/api/internal/assistant/route.js +1 -1
  35. package/.next/standalone/.next/server/app/api/internal/assistant/route.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js +1 -1
  37. package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js +3 -2
  39. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js +1 -1
  41. package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/api/internal/harness/ask/route/app-paths-manifest.json +3 -0
  43. package/.next/standalone/.next/server/app/api/internal/harness/ask/route/build-manifest.json +9 -0
  44. package/.next/standalone/.next/server/app/api/internal/harness/ask/route/server-reference-manifest.json +4 -0
  45. package/.next/standalone/.next/server/app/api/internal/harness/ask/route.js +7 -0
  46. package/.next/standalone/.next/server/app/api/internal/harness/ask/route.js.nft.json +1 -0
  47. package/.next/standalone/.next/server/app/api/internal/harness/ask/route_client-reference-manifest.js +3 -0
  48. package/.next/standalone/.next/server/app/api/internal/harness/notify/route/app-paths-manifest.json +3 -0
  49. package/.next/standalone/.next/server/app/api/internal/harness/notify/route/build-manifest.json +9 -0
  50. package/.next/standalone/.next/server/app/api/internal/harness/notify/route/server-reference-manifest.json +4 -0
  51. package/.next/standalone/.next/server/app/api/internal/harness/notify/route.js +7 -0
  52. package/.next/standalone/.next/server/app/api/internal/harness/notify/route.js.nft.json +1 -0
  53. package/.next/standalone/.next/server/app/api/internal/harness/notify/route_client-reference-manifest.js +3 -0
  54. package/.next/standalone/.next/server/app/api/internal/harness/pending/route/app-paths-manifest.json +3 -0
  55. package/.next/standalone/.next/server/app/api/internal/harness/pending/route/build-manifest.json +9 -0
  56. package/.next/standalone/.next/server/app/api/internal/harness/pending/route/server-reference-manifest.json +4 -0
  57. package/.next/standalone/.next/server/app/api/internal/harness/pending/route.js +7 -0
  58. package/.next/standalone/.next/server/app/api/internal/harness/pending/route.js.nft.json +1 -0
  59. package/.next/standalone/.next/server/app/api/internal/harness/pending/route_client-reference-manifest.js +3 -0
  60. package/.next/standalone/.next/server/app/api/internal/harness/reply/route/app-paths-manifest.json +3 -0
  61. package/.next/standalone/.next/server/app/api/internal/harness/reply/route/build-manifest.json +9 -0
  62. package/.next/standalone/.next/server/app/api/internal/harness/reply/route/server-reference-manifest.json +4 -0
  63. package/.next/standalone/.next/server/app/api/internal/harness/reply/route.js +12 -0
  64. package/.next/standalone/.next/server/app/api/internal/harness/reply/route.js.nft.json +1 -0
  65. package/.next/standalone/.next/server/app/api/internal/harness/reply/route_client-reference-manifest.js +3 -0
  66. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js +1 -1
  67. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js.nft.json +1 -1
  68. package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js +1 -1
  69. package/.next/standalone/.next/server/app/api/internal/hooks/session/route.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js +3 -3
  71. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js.nft.json +1 -1
  72. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js +2 -2
  73. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js.nft.json +1 -1
  74. package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js +1 -1
  75. package/.next/standalone/.next/server/app/api/internal/monaco/[...path]/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js +1 -1
  77. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js +1 -1
  79. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js +1 -1
  81. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/paste-image/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js +4 -3
  83. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/resume/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js +5 -4
  85. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js +4 -3
  87. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/stop/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js +2 -2
  89. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js +2 -2
  91. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff-patch/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js +2 -2
  93. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/harness/page/app-paths-manifest.json +3 -0
  95. package/.next/standalone/.next/server/app/harness/page/build-manifest.json +18 -0
  96. package/.next/standalone/.next/server/app/harness/page/next-font-manifest.json +11 -0
  97. package/.next/standalone/.next/server/app/harness/page/react-loadable-manifest.json +18 -0
  98. package/.next/standalone/.next/server/app/harness/page/server-reference-manifest.json +389 -0
  99. package/.next/standalone/.next/server/app/harness/page.js +25 -0
  100. package/.next/standalone/.next/server/app/harness/page.js.nft.json +1 -0
  101. package/.next/standalone/.next/server/app/harness/page_client-reference-manifest.js +3 -0
  102. package/.next/standalone/.next/server/app/missions/page/react-loadable-manifest.json +1 -1
  103. package/.next/standalone/.next/server/app/missions/page/server-reference-manifest.json +66 -66
  104. package/.next/standalone/.next/server/app/missions/page.js +8 -8
  105. package/.next/standalone/.next/server/app/missions/page.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/onboarding/page/react-loadable-manifest.json +2 -2
  108. package/.next/standalone/.next/server/app/onboarding/page/server-reference-manifest.json +31 -31
  109. package/.next/standalone/.next/server/app/onboarding/page.js +6 -6
  110. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +2 -2
  113. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +31 -31
  114. package/.next/standalone/.next/server/app/page.js +6 -6
  115. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +2 -2
  118. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +132 -96
  119. package/.next/standalone/.next/server/app/settings/page.js +9 -8
  120. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/react-loadable-manifest.json +2 -2
  123. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/server-reference-manifest.json +111 -111
  124. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js +8 -8
  125. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/react-loadable-manifest.json +2 -2
  128. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/server-reference-manifest.json +96 -96
  129. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js +7 -7
  130. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js.nft.json +1 -1
  131. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/react-loadable-manifest.json +2 -2
  133. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/server-reference-manifest.json +79 -79
  134. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js +8 -8
  135. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/react-loadable-manifest.json +2 -2
  138. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/server-reference-manifest.json +79 -79
  139. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js +8 -7
  140. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js.nft.json +1 -1
  141. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/react-loadable-manifest.json +2 -2
  143. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/server-reference-manifest.json +31 -31
  144. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js +7 -7
  145. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/react-loadable-manifest.json +2 -2
  148. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/server-reference-manifest.json +69 -69
  149. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js +7 -7
  150. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js.nft.json +1 -1
  151. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/react-loadable-manifest.json +3 -3
  153. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/server-reference-manifest.json +79 -79
  154. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js +10 -9
  155. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/workspaces/page/react-loadable-manifest.json +2 -2
  158. package/.next/standalone/.next/server/app/workspaces/page/server-reference-manifest.json +54 -54
  159. package/.next/standalone/.next/server/app/workspaces/page.js +6 -6
  160. package/.next/standalone/.next/server/app/workspaces/page.js.nft.json +1 -1
  161. package/.next/standalone/.next/server/app/workspaces/page_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app-paths-manifest.json +5 -0
  163. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0lvlooo._.js → [root-of-the-server]__0-kboke._.js} +1 -1
  164. package/.next/standalone/.next/server/chunks/[root-of-the-server]__02r7j6y._.js +3 -0
  165. package/.next/standalone/.next/server/chunks/[root-of-the-server]__034jopu._.js +4 -0
  166. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06x1zwj._.js +28 -0
  167. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j7565a._.js → [root-of-the-server]__07xsu6m._.js} +2 -2
  168. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08-bq72._.js +3 -0
  169. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08-s.nv._.js +4 -0
  170. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08clp-r._.js +3 -0
  171. package/.next/standalone/.next/server/chunks/[root-of-the-server]__095t6ga._.js +3 -0
  172. package/.next/standalone/.next/server/chunks/[root-of-the-server]__098.3z2._.js +1 -1
  173. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_7_w.g._.js +3 -0
  174. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_~s0z4._.js +3 -0
  175. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ehx6q.._.js +3 -0
  176. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gbyryz._.js +3 -0
  177. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k9rz_z._.js +3 -0
  178. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0khq-k0._.js +3 -0
  179. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0l1-djp._.js +1 -1
  180. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nt7c0f._.js +3 -0
  181. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o6i1wy._.js +3 -0
  182. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pmamzv._.js +3 -0
  183. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pr~t0y._.js +3 -0
  184. package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0_zfnj0._.js → [root-of-the-server]__0pzyjqf._.js} +1 -1
  185. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qcpe0l._.js +3 -0
  186. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qfcg6k._.js +3 -0
  187. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0sq5irw._.js +3 -0
  188. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tplo5s._.js +3 -0
  189. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tpzojh._.js +3 -0
  190. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0u8tl88._.js +28 -0
  191. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0v98a~t._.js +3 -0
  192. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vh3112._.js +3 -0
  193. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wjr-72._.js +3 -0
  194. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xasom7._.js +4 -0
  195. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0xy1t4x._.js +4 -0
  196. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y3adwk._.js +3 -0
  197. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y~y6sh._.js +3 -0
  198. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10aw_67._.js +3 -0
  199. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10ci~o9._.js +3 -0
  200. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10jnn26._.js +3 -0
  201. package/.next/standalone/.next/server/chunks/[root-of-the-server]__116v_bx._.js +4 -0
  202. package/.next/standalone/.next/server/chunks/[root-of-the-server]__119rbly._.js +3 -0
  203. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12fmxq0._.js +3 -0
  204. package/.next/standalone/.next/server/chunks/[root-of-the-server]__136ty69._.js +3 -0
  205. package/.next/standalone/.next/server/chunks/{_12537g8._.js → _02hac5p._.js} +1 -1
  206. package/.next/standalone/.next/server/chunks/{_0q10iet._.js → _0je3dz2._.js} +1 -1
  207. package/.next/standalone/.next/server/chunks/_0qk_esg._.js +2 -2
  208. package/.next/standalone/.next/server/chunks/{_0jmdgq~._.js → _0tidm8l._.js} +1 -1
  209. package/.next/standalone/.next/server/chunks/_0zok2an._.js +7 -0
  210. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_ask_route_actions_0_c62hg.js +3 -0
  211. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_notify_route_actions_08hof6m.js +3 -0
  212. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_pending_route_actions_0w9t_9m.js +3 -0
  213. package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_harness_reply_route_actions_0qatz~a.js +3 -0
  214. package/.next/standalone/.next/server/chunks/src_05balzk._.js +3 -0
  215. package/.next/standalone/.next/server/chunks/src_0aqjfcv._.js +3 -0
  216. package/.next/standalone/.next/server/chunks/src_0aygchu._.js +3 -0
  217. package/.next/standalone/.next/server/chunks/src_0gif-f5._.js +3 -0
  218. package/.next/standalone/.next/server/chunks/src_0vp6.co._.js +3 -0
  219. package/.next/standalone/.next/server/chunks/src_11k6i~l._.js +3 -0
  220. package/.next/standalone/.next/server/chunks/src_actions_agent-actions_ts_10q9r5b._.js +8 -2
  221. package/.next/standalone/.next/server/chunks/src_lib_02llcit._.js +1 -1
  222. package/.next/standalone/.next/server/chunks/src_lib_0aowbzy._.js +1 -1
  223. package/.next/standalone/.next/server/chunks/src_lib_0d~1~wz._.js +3 -0
  224. package/.next/standalone/.next/server/chunks/src_lib_0nw5n~t._.js +1 -1
  225. package/.next/standalone/.next/server/chunks/src_lib_0ylel_1._.js +3 -0
  226. package/.next/standalone/.next/server/chunks/src_lib_ai_0xx6y51._.js +1 -1
  227. package/.next/standalone/.next/server/chunks/src_lib_ai_providers_index_ts_0.y.3vp._.js +1 -1
  228. package/.next/standalone/.next/server/chunks/src_lib_config-defaults_ts_10ayktg._.js +3 -0
  229. package/.next/standalone/.next/server/chunks/src_lib_config-reader_ts_0e5f7vk._.js +3 -0
  230. package/.next/standalone/.next/server/chunks/ssr/0iu._[workspaceId]_projects_[projectId]_versions_version-timeline-client_tsx_07o_kyi._.js +1 -1
  231. package/.next/standalone/.next/server/chunks/ssr/0se9_next_dist_esm_build_templates_app-page_0fro4ex.js +4 -0
  232. package/.next/standalone/.next/server/chunks/ssr/0ws9_lucide-react_dist_esm_icons_0r~ty--._.js +3 -0
  233. package/.next/standalone/.next/server/chunks/ssr/12k._sonner_dist_index_mjs_0-vmpk5._.js +3 -0
  234. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.q~~2p._.js +3 -0
  235. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01zrinc._.js +3 -0
  236. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0iln7n_._.js → [root-of-the-server]__03x8axh._.js} +4 -4
  237. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__04wbr9x._.js +1 -1
  238. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__051tpij._.js +30 -0
  239. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05xg05r._.js +1 -1
  240. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06s-_gx._.js +30 -0
  241. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0yby8pl._.js → [root-of-the-server]__06t.cx~._.js} +4 -4
  242. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08etd~v._.js +30 -0
  243. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0k6oo0n._.js → [root-of-the-server]__096w7g2._.js} +2 -2
  244. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ecd_1d._.js → [root-of-the-server]__0__klx0._.js} +4 -4
  245. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ccy_gg._.js +3 -0
  246. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0cjmeyl._.js +3 -0
  247. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dfqa5a._.js +30 -0
  248. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dmjt7o._.js +30 -0
  249. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dv.-zu._.js +30 -0
  250. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0lws68d._.js → [root-of-the-server]__0dx9sp-._.js} +4 -4
  251. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0f57j8r._.js +47 -0
  252. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0fl0l82._.js +30 -0
  253. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0g2wrd2._.js +30 -0
  254. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0i0k_zi._.js +30 -0
  255. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ixgha6._.js +30 -0
  256. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j1dx6p._.js +47 -0
  257. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0jymb~t._.js +1 -1
  258. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0kn~asi._.js +47 -0
  259. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__127w3bm._.js → [root-of-the-server]__0lau3k_._.js} +2 -2
  260. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0m.hayd._.js +47 -0
  261. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0mpjat-._.js +1 -1
  262. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0_z5hke._.js → [root-of-the-server]__0o9jkew._.js} +1 -1
  263. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0sg4fde._.js +4 -0
  264. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0t_zq~v._.js +30 -0
  265. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__04ednzb._.js → [root-of-the-server]__0tb.1li._.js} +2 -2
  266. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0zzqn5z._.js → [root-of-the-server]__0vi-5xg._.js} +2 -2
  267. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w24qox._.js +47 -0
  268. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0wq~4aj._.js +30 -0
  269. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ydiu_y._.js +30 -0
  270. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0yihqy6._.js +3 -0
  271. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ynq8ty._.js +3 -0
  272. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0z7je5_._.js +1 -1
  273. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zouyfp._.js +3 -0
  274. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0~s8otw._.js +30 -0
  275. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__1184s~q._.js +3 -0
  276. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11fp64w._.js +3 -0
  277. package/.next/standalone/.next/server/chunks/ssr/_0-~9em3._.js +1 -1
  278. package/.next/standalone/.next/server/chunks/ssr/_0..h3hk._.js +3 -0
  279. package/.next/standalone/.next/server/chunks/ssr/_0.iq8t8._.js +4 -0
  280. package/.next/standalone/.next/server/chunks/ssr/_00.myc6._.js +3 -0
  281. package/.next/standalone/.next/server/chunks/ssr/_00eymu8._.js +3 -0
  282. package/.next/standalone/.next/server/chunks/ssr/{_07lq-bp._.js → _01fdzzv._.js} +1 -1
  283. package/.next/standalone/.next/server/chunks/ssr/{_0_q41~z._.js → _03-we0p._.js} +4 -4
  284. package/.next/standalone/.next/server/chunks/ssr/{_0kojxno._.js → _04szgc6._.js} +2 -2
  285. package/.next/standalone/.next/server/chunks/ssr/{_113957g._.js → _078cdw~._.js} +1 -1
  286. package/.next/standalone/.next/server/chunks/ssr/_08bq4g8._.js +1 -1
  287. package/.next/standalone/.next/server/chunks/ssr/{_0j5.ig_._.js → _09rq08e._.js} +1 -1
  288. package/.next/standalone/.next/server/chunks/ssr/_09z-55_._.js +17 -0
  289. package/.next/standalone/.next/server/chunks/ssr/{src_components_ui_popover_tsx_0a78wqo._.js → _0bndp1~._.js} +2 -2
  290. package/.next/standalone/.next/server/chunks/ssr/{_08-x_rp._.js → _0h0b46r._.js} +1 -1
  291. package/.next/standalone/.next/server/chunks/ssr/{_0wqcz3w._.js → _0kd_tda._.js} +4 -4
  292. package/.next/standalone/.next/server/chunks/ssr/{_07q06~v._.js → _0ktexki._.js} +4 -4
  293. package/.next/standalone/.next/server/chunks/ssr/{_11osha9._.js → _0ljrvyt._.js} +2 -2
  294. package/.next/standalone/.next/server/chunks/ssr/_0lo1nei._.js +6 -0
  295. package/.next/standalone/.next/server/chunks/ssr/_0mdd702._.js +3 -0
  296. package/.next/standalone/.next/server/chunks/ssr/_0n0q6~9._.js +3 -0
  297. package/.next/standalone/.next/server/chunks/ssr/_0os43sb._.js +3 -0
  298. package/.next/standalone/.next/server/chunks/ssr/_0pab_al._.js +3 -0
  299. package/.next/standalone/.next/server/chunks/ssr/{_0foto06._.js → _0pg6-.y._.js} +2 -2
  300. package/.next/standalone/.next/server/chunks/ssr/{_05a2u03._.js → _0pvp63a._.js} +4 -4
  301. package/.next/standalone/.next/server/chunks/ssr/_0qi4x-5._.js +3 -0
  302. package/.next/standalone/.next/server/chunks/ssr/{_0s.h4l2._.js → _0qnobd-._.js} +1 -1
  303. package/.next/standalone/.next/server/chunks/ssr/_0rdyrfd._.js +1 -1
  304. package/.next/standalone/.next/server/chunks/ssr/_0ts~td3._.js +3 -0
  305. package/.next/standalone/.next/server/chunks/ssr/_0wbcp88._.js +1 -1
  306. package/.next/standalone/.next/server/chunks/ssr/{_0s.ik0k._.js → _0xnn~jq._.js} +1 -1
  307. package/.next/standalone/.next/server/chunks/ssr/_0y0_4zs._.js +3 -0
  308. package/.next/standalone/.next/server/chunks/ssr/{_0nze-e6._.js → _0ytcm0j._.js} +1 -1
  309. package/.next/standalone/.next/server/chunks/ssr/_0yva1-.._.js +3 -0
  310. package/.next/standalone/.next/server/chunks/ssr/{_0dxbp89._.js → _0yz5dmq._.js} +4 -4
  311. package/.next/standalone/.next/server/chunks/ssr/{_060e1u.._.js → _0~6pqk.._.js} +1 -1
  312. package/.next/standalone/.next/server/chunks/ssr/_11w13--._.js +3 -0
  313. package/.next/standalone/.next/server/chunks/ssr/{_0r4_qn~._.js → _12la163._.js} +2 -2
  314. package/.next/standalone/.next/server/chunks/ssr/{_0rtydyv._.js → _13_b8hh._.js} +1 -1
  315. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_09eeb85._.js +3 -0
  316. package/.next/standalone/.next/server/chunks/ssr/src_0djxlqx._.js +1 -1
  317. package/.next/standalone/.next/server/chunks/ssr/src_0eufeyj._.js +1 -1
  318. package/.next/standalone/.next/server/chunks/ssr/src_0vv366l._.js +3 -0
  319. package/.next/standalone/.next/server/chunks/ssr/src_actions_agent-actions_ts_0~wc.sy._.js +8 -2
  320. package/.next/standalone/.next/server/chunks/ssr/src_actions_file-actions_ts_0gcvqwm._.js +1 -1
  321. package/.next/standalone/.next/server/chunks/ssr/src_app_missions_missions-client_tsx_11429lj._.js +1 -1
  322. package/.next/standalone/.next/server/chunks/ssr/src_app_onboarding_page_tsx_0xf7hpz._.js +1 -1
  323. package/.next/standalone/.next/server/chunks/ssr/src_app_settings_page_tsx_0h9v7dr._.js +1 -1
  324. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_assets_assets-page-client_tsx_0wyzpam._.js +1 -1
  325. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_board-page-client_tsx_0gips66._.js +1 -1
  326. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_notes_notes-page-client_tsx_10gyo3v._.js +1 -1
  327. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_tasks_[taskId]_task-page-client_tsx_02t7blt._.js +1 -1
  328. package/.next/standalone/.next/server/chunks/ssr/src_components_0rowjw~._.js +7 -0
  329. package/.next/standalone/.next/server/chunks/ssr/{src_lib_00wjv6n._.js → src_lib_0-x.wbd._.js} +1 -1
  330. package/.next/standalone/.next/server/chunks/ssr/{src_lib_005uqbe._.js → src_lib_00p-ir2._.js} +1 -1
  331. package/.next/standalone/.next/server/chunks/ssr/src_lib_03x1i~1._.js +5 -0
  332. package/.next/standalone/.next/server/chunks/ssr/{src_lib_01sr8_t._.js → src_lib_03xtona._.js} +1 -1
  333. package/.next/standalone/.next/server/chunks/ssr/{src_lib_0.~.oo-._.js → src_lib_04y-65j._.js} +1 -1
  334. package/.next/standalone/.next/server/chunks/ssr/src_lib_08gthaz._.js +3 -0
  335. package/.next/standalone/.next/server/chunks/ssr/src_lib_090~6pq._.js +3 -0
  336. package/.next/standalone/.next/server/chunks/ssr/src_lib_0k8dkbn._.js +3 -0
  337. package/.next/standalone/.next/server/chunks/ssr/src_lib_0knbpxk._.js +3 -0
  338. package/.next/standalone/.next/server/chunks/ssr/src_lib_0p_iehl._.js +3 -0
  339. package/.next/standalone/.next/server/chunks/ssr/src_lib_0qve1ri._.js +3 -0
  340. package/.next/standalone/.next/server/chunks/ssr/src_lib_0s35u~4._.js +3 -0
  341. package/.next/standalone/.next/server/chunks/ssr/src_lib_0x2ui80._.js +3 -0
  342. package/.next/standalone/.next/server/chunks/ssr/src_lib_0ypc5_d._.js +3 -0
  343. package/.next/standalone/.next/server/chunks/ssr/src_lib_10jh2mz._.js +3 -0
  344. package/.next/standalone/.next/server/chunks/ssr/src_lib_harness_harness-message_ts_0_3ygf9._.js +3 -0
  345. package/.next/standalone/.next/server/functions-config-manifest.json +5 -0
  346. package/.next/standalone/.next/server/instrumentation.js +1 -1
  347. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  348. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  349. package/.next/standalone/.next/server/next-font-manifest.json +4 -0
  350. package/.next/standalone/.next/server/pages/500.html +1 -1
  351. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  352. package/.next/standalone/.next/server/server-reference-manifest.json +594 -342
  353. package/.next/standalone/.next/static/chunks/0-nppzqp-r.9c.js +1 -0
  354. package/.next/standalone/.next/static/chunks/{11pe3kpxuj33f.js → 0-te2tg6~a23u.js} +1 -1
  355. package/.next/standalone/.next/static/chunks/0.64.6c1mh7d2.js +1 -0
  356. package/.next/standalone/.next/static/chunks/0.8n1ce9lggg4.js +1 -0
  357. package/.next/standalone/.next/static/chunks/0.zgqz~m3sjej.js +1 -0
  358. package/.next/standalone/.next/static/chunks/{041o.dh2lc-k3.js → 00.eotegra08r.js} +1 -1
  359. package/.next/standalone/.next/static/chunks/{0rcuiuax31_uh.js → 02xqrfqu.s8-i.js} +1 -1
  360. package/.next/standalone/.next/static/chunks/03y272e6e9o8i.js +1 -0
  361. package/.next/standalone/.next/static/chunks/08eyd7sq064r0.js +1 -0
  362. package/.next/standalone/.next/static/chunks/09b33znj4m__c.js +1 -0
  363. package/.next/standalone/.next/static/chunks/{0uj-3ckujwaiy.js → 09bezwcb__18t.js} +1 -1
  364. package/.next/standalone/.next/static/chunks/0bvhkgitn__gl.js +1 -0
  365. package/.next/standalone/.next/static/chunks/0c.t.evwah_m4.js +1 -0
  366. package/.next/standalone/.next/static/chunks/{0346xrw6i2bwo.js → 0c4-6qdhi645s.js} +1 -1
  367. package/.next/standalone/.next/static/chunks/0d0zm8viq3ol4.js +12 -0
  368. package/.next/standalone/.next/static/chunks/0dktl5t_dtxu..js +1 -0
  369. package/.next/standalone/.next/static/chunks/0e5~nzt657k92.js +1 -0
  370. package/.next/standalone/.next/static/chunks/0erwxvpb9w29_.js +1 -0
  371. package/.next/standalone/.next/static/chunks/{0gvfb.b8m_i8t.js → 0gy79dfi~lnig.js} +1 -1
  372. package/.next/standalone/.next/static/chunks/{0xg6rcq6g4bbh.js → 0gz3xwb5_8xwv.js} +1 -1
  373. package/.next/standalone/.next/static/chunks/0i75~pu.bp20..js +1 -0
  374. package/.next/standalone/.next/static/chunks/0jn_w5b9r~beu.js +1 -0
  375. package/.next/standalone/.next/static/chunks/0l59z2mf1ouxu.js +1 -0
  376. package/.next/standalone/.next/static/chunks/0m4xd-ie7j.hx.js +1 -0
  377. package/.next/standalone/.next/static/chunks/0mx9ebe6we4z0.js +1 -0
  378. package/.next/standalone/.next/static/chunks/0nsggimu5je3g.js +1 -0
  379. package/.next/standalone/.next/static/chunks/{0cpwtqzrjdgvs.js → 0nw8nx8kafy79.js} +1 -1
  380. package/.next/standalone/.next/static/chunks/0pzjryav9pm7p.js +1 -0
  381. package/.next/standalone/.next/static/chunks/0q-rl50zskr35.js +1 -0
  382. package/.next/standalone/.next/static/chunks/0qqy2x-fsmmmx.js +1 -0
  383. package/.next/standalone/.next/static/chunks/0t59wpux0g1~l.js +1 -0
  384. package/.next/standalone/.next/static/chunks/0uezq8wiwkq8d.js +1 -0
  385. package/.next/standalone/.next/static/chunks/0vrc~7m1_cuvl.js +1 -0
  386. package/.next/standalone/.next/static/chunks/0xbh24-hxrt~m.css +1 -0
  387. package/.next/standalone/.next/static/chunks/0xkkmruo8p.l_.js +1 -0
  388. package/.next/standalone/.next/static/chunks/0xx0pe_j2kmr9.js +2 -0
  389. package/.next/standalone/.next/static/chunks/0zqjqiqmorenw.js +5 -0
  390. package/.next/standalone/.next/static/chunks/136l78utn~v08.js +1 -0
  391. package/.next/standalone/.next/static/chunks/171x9kw9wcyk4.js +1 -0
  392. package/.next/standalone/package.json +5 -5
  393. package/dist/mcp-server.cjs +206 -23
  394. package/package.json +5 -5
  395. package/prisma/schema.prisma +37 -0
  396. package/scripts/migrations/0005-add-parent-task-id.ts +29 -0
  397. package/scripts/{stop-hook.js → tower-stop-hook.js} +42 -3
  398. package/skills/tower/SKILL.md +31 -0
  399. package/skills/tower/references/unattended-messaging.md +95 -0
  400. package/tsconfig.json +14 -4
  401. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.p6em~._.js +0 -3
  402. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.zmhk-._.js +0 -3
  403. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0042hx5._.js +0 -3
  404. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03ufxqq._.js +0 -28
  405. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04--bs7._.js +0 -3
  406. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04m2l8a._.js +0 -3
  407. package/.next/standalone/.next/server/chunks/[root-of-the-server]__04r193~._.js +0 -3
  408. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0657y50._.js +0 -3
  409. package/.next/standalone/.next/server/chunks/[root-of-the-server]__06ndn7a._.js +0 -4
  410. package/.next/standalone/.next/server/chunks/[root-of-the-server]__08yqoti._.js +0 -3
  411. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_d.s7s._.js +0 -28
  412. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0clptds._.js +0 -3
  413. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0g.k9o~._.js +0 -3
  414. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i34gbs._.js +0 -4
  415. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0i~3dwq._.js +0 -3
  416. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j05vlm._.js +0 -3
  417. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0j1px8f._.js +0 -3
  418. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0k-5ag7._.js +0 -3
  419. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0otyifi._.js +0 -3
  420. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pl.c5.._.js +0 -3
  421. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r~9.7c._.js +0 -4
  422. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t31ba_._.js +0 -3
  423. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0t_weyi._.js +0 -3
  424. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uptkzd._.js +0 -4
  425. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0x3kws1._.js +0 -3
  426. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y8w5di._.js +0 -4
  427. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0zi3~a8._.js +0 -3
  428. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0~g6-c~._.js +0 -3
  429. package/.next/standalone/.next/server/chunks/[root-of-the-server]__10fv6tt._.js +0 -3
  430. package/.next/standalone/.next/server/chunks/[root-of-the-server]__1189rd1._.js +0 -4
  431. package/.next/standalone/.next/server/chunks/src_0fq3zjg._.js +0 -3
  432. package/.next/standalone/.next/server/chunks/src_0weytpz._.js +0 -3
  433. package/.next/standalone/.next/server/chunks/src_0wlyw0g._.js +0 -3
  434. package/.next/standalone/.next/server/chunks/src_0~ey84y._.js +0 -3
  435. package/.next/standalone/.next/server/chunks/src_lib_0i2.v2d._.js +0 -3
  436. package/.next/standalone/.next/server/chunks/src_lib_12xey8u._.js +0 -3
  437. package/.next/standalone/.next/server/chunks/ssr/0ws9_lucide-react_dist_esm_icons_0pkla8j._.js +0 -3
  438. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__00ebsjb._.js +0 -30
  439. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01fmnse._.js +0 -3
  440. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01vm_46._.js +0 -47
  441. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__025ol9g._.js +0 -3
  442. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__049n47u._.js +0 -3
  443. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__06dfcgo._.js +0 -30
  444. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__07xkj1s._.js +0 -47
  445. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__081e5n~._.js +0 -3
  446. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08tzbfh._.js +0 -3
  447. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0iaw1ms._.js +0 -3
  448. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0j_-qk5._.js +0 -30
  449. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oamph.._.js +0 -47
  450. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pnv7nd._.js +0 -30
  451. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0tja~wz._.js +0 -30
  452. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ug022w._.js +0 -30
  453. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ugledi._.js +0 -3
  454. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0vxlsec._.js +0 -4
  455. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0w0.sdz._.js +0 -3
  456. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0x6k.ee._.js +0 -30
  457. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0xwzk2.._.js +0 -47
  458. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zxc81t._.js +0 -30
  459. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__10c.a3u._.js +0 -30
  460. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__10n3vn6._.js +0 -30
  461. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__123rmyb._.js +0 -30
  462. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__124zb~p._.js +0 -30
  463. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__13ce7v2._.js +0 -30
  464. package/.next/standalone/.next/server/chunks/ssr/_02vz78l._.js +0 -3
  465. package/.next/standalone/.next/server/chunks/ssr/_04~mjmb._.js +0 -3
  466. package/.next/standalone/.next/server/chunks/ssr/_070t_mh._.js +0 -6
  467. package/.next/standalone/.next/server/chunks/ssr/_0_nhdgs._.js +0 -3
  468. package/.next/standalone/.next/server/chunks/ssr/_0cj9a7y._.js +0 -7
  469. package/.next/standalone/.next/server/chunks/ssr/_0i4xdso._.js +0 -3
  470. package/.next/standalone/.next/server/chunks/ssr/_0rxeqmo._.js +0 -17
  471. package/.next/standalone/.next/server/chunks/ssr/_0u3yt.5._.js +0 -4
  472. package/.next/standalone/.next/server/chunks/ssr/_0ye1-r-._.js +0 -3
  473. package/.next/standalone/.next/server/chunks/ssr/_0zr81mw._.js +0 -3
  474. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_03r.9go._.js +0 -3
  475. package/.next/standalone/.next/server/chunks/ssr/node_modules__pnpm_06f0dao._.js +0 -3
  476. package/.next/standalone/.next/server/chunks/ssr/src_components_ui_select_tsx_0d2ra01._.js +0 -3
  477. package/.next/standalone/.next/server/chunks/ssr/src_lib_08jql1e._.js +0 -3
  478. package/.next/standalone/.next/server/chunks/ssr/src_lib_0b~j-9d._.js +0 -3
  479. package/.next/standalone/.next/server/chunks/ssr/src_lib_0eymyjf._.js +0 -3
  480. package/.next/standalone/.next/server/chunks/ssr/src_lib_0fkv9z3._.js +0 -3
  481. package/.next/standalone/.next/server/chunks/ssr/src_lib_0n-n0.a._.js +0 -3
  482. package/.next/standalone/.next/server/chunks/ssr/src_lib_0sgt~lv._.js +0 -3
  483. package/.next/standalone/.next/server/chunks/ssr/src_lib_0sms4xl._.js +0 -5
  484. package/.next/standalone/.next/server/chunks/ssr/src_lib_0x-iyl1._.js +0 -3
  485. package/.next/standalone/.next/server/chunks/ssr/src_lib_0yjmty1._.js +0 -3
  486. package/.next/standalone/.next/server/chunks/ssr/src_lib_13aevv6._.js +0 -3
  487. package/.next/standalone/.next/static/chunks/0-tuek2jqf0el.js +0 -1
  488. package/.next/standalone/.next/static/chunks/0.-.jc~0b~hy0.js +0 -1
  489. package/.next/standalone/.next/static/chunks/0.lqb7y9kz5z6.js +0 -1
  490. package/.next/standalone/.next/static/chunks/0.~03w.uxge40.js +0 -1
  491. package/.next/standalone/.next/static/chunks/01hdj_kw4z2zq.js +0 -2
  492. package/.next/standalone/.next/static/chunks/01yoibobkdz3x.js +0 -1
  493. package/.next/standalone/.next/static/chunks/07i9j5yyg4vs3.js +0 -1
  494. package/.next/standalone/.next/static/chunks/08ooaq~-.8fzu.js +0 -1
  495. package/.next/standalone/.next/static/chunks/0bylodlncwfpb.js +0 -5
  496. package/.next/standalone/.next/static/chunks/0clewc5ifaruu.js +0 -12
  497. package/.next/standalone/.next/static/chunks/0c~e1-nst-ze-.js +0 -1
  498. package/.next/standalone/.next/static/chunks/0ddt-snh45031.js +0 -1
  499. package/.next/standalone/.next/static/chunks/0dv4anj-j523o.js +0 -1
  500. package/.next/standalone/.next/static/chunks/0h77-u2vvr-a1.js +0 -1
  501. package/.next/standalone/.next/static/chunks/0jrje~1gt6w85.css +0 -1
  502. package/.next/standalone/.next/static/chunks/0lqp~-dlfenad.js +0 -1
  503. package/.next/standalone/.next/static/chunks/0p4w5b_p_yju8.js +0 -1
  504. package/.next/standalone/.next/static/chunks/0qkr26yz3bocs.js +0 -1
  505. package/.next/standalone/.next/static/chunks/0uf~7eqel0zra.js +0 -1
  506. package/.next/standalone/.next/static/chunks/0w71r_sj_fibx.js +0 -1
  507. package/.next/standalone/.next/static/chunks/0xejm4ge9~cn..js +0 -1
  508. package/.next/standalone/.next/static/chunks/0yff8rwmrl5m4.js +0 -1
  509. package/.next/standalone/.next/static/chunks/0ymipmkk2uqby.js +0 -1
  510. package/.next/standalone/.next/static/chunks/0znfclapbniaa.js +0 -1
  511. package/.next/standalone/.next/static/chunks/172s9cg35qt7i.js +0 -1
  512. package/.next/standalone/.next/static/chunks/184-zu89wwa4u.js +0 -1
  513. /package/.next/standalone/.next/static/{dinNvsaC6aoPK_B7ZTeBv → f1860bJqnbYj-1WLMj7F-}/_buildManifest.js +0 -0
  514. /package/.next/standalone/.next/static/{dinNvsaC6aoPK_B7ZTeBv → f1860bJqnbYj-1WLMj7F-}/_clientMiddlewareManifest.js +0 -0
  515. /package/.next/standalone/.next/static/{dinNvsaC6aoPK_B7ZTeBv → f1860bJqnbYj-1WLMj7F-}/_ssgManifest.js +0 -0
  516. /package/scripts/{post-tool-hook.js → tower-post-tool-hook.js} +0 -0
  517. /package/scripts/{session-start-hook.js → tower-session-start-hook.js} +0 -0
@@ -14365,6 +14365,11 @@ function getTowerDbFilePath() {
14365
14365
  const root = process.env.TOWER_DATA_DIR || (0, import_node_path2.join)((0, import_node_os2.homedir)(), ".tower");
14366
14366
  return (0, import_node_path2.join)(root, "database", "tower.db");
14367
14367
  }
14368
+ function getSignalDir() {
14369
+ const root = process.env.TOWER_DATA_DIR || (0, import_node_path2.join)((0, import_node_os2.homedir)(), ".tower");
14370
+ const hash2 = (0, import_node_crypto.createHash)("sha256").update(root).digest("hex").slice(0, 16);
14371
+ return (0, import_node_path2.join)((0, import_node_os2.tmpdir)(), "tower-signals", hash2);
14372
+ }
14368
14373
  function getDefaultStorageDir() {
14369
14374
  return (0, import_node_path2.join)(getTowerDir(), "storage");
14370
14375
  }
@@ -14385,12 +14390,13 @@ function getStorageDir() {
14385
14390
  if (!(0, import_node_fs.existsSync)(dir)) (0, import_node_fs.mkdirSync)(dir, { recursive: true });
14386
14391
  return dir;
14387
14392
  }
14388
- var import_node_path2, import_node_os2, import_node_fs, _dir;
14393
+ var import_node_path2, import_node_os2, import_node_crypto, import_node_fs, _dir;
14389
14394
  var init_tower_dir = __esm({
14390
14395
  "src/lib/tower-dir.ts"() {
14391
14396
  "use strict";
14392
14397
  import_node_path2 = require("node:path");
14393
14398
  import_node_os2 = require("node:os");
14399
+ import_node_crypto = require("node:crypto");
14394
14400
  import_node_fs = require("node:fs");
14395
14401
  }
14396
14402
  });
@@ -26590,7 +26596,12 @@ var init_config_defaults = __esm({
26590
26596
  "",
26591
26597
  "## Scope Boundary",
26592
26598
  "If the user asks you to write code, explain code, debug, search the web, read/write files, or anything outside Tower task management, reply:",
26593
- '"\u62B1\u6B49\uFF0C\u6211\u53EA\u80FD\u5E2E\u4F60\u7BA1\u7406\u5DE5\u4F5C\u533A\u3001\u9879\u76EE\u548C\u4EFB\u52A1\u3002\u7F16\u7801\u3001\u8C03\u8BD5\u7B49\u64CD\u4F5C\u8BF7\u5728\u4EFB\u52A1\u7EC8\u7AEF\u4E2D\u5B8C\u6210\u3002"'
26599
+ '"\u62B1\u6B49\uFF0C\u6211\u53EA\u80FD\u5E2E\u4F60\u7BA1\u7406\u5DE5\u4F5C\u533A\u3001\u9879\u76EE\u548C\u4EFB\u52A1\u3002\u7F16\u7801\u3001\u8C03\u8BD5\u7B49\u64CD\u4F5C\u8BF7\u5728\u4EFB\u52A1\u7EC8\u7AEF\u4E2D\u5B8C\u6210\u3002"',
26600
+ "",
26601
+ "## \u4EFB\u52A1\u6765\u6E90\u6807\u6CE8",
26602
+ "\u6BCF\u6B21\u901A\u8FC7 create_task \u521B\u5EFA\u4EFB\u52A1\u65F6\uFF0C\u5728 description \u672B\u5C3E\u8FFD\u52A0\u4E00\u6BB5\u6765\u6E90\u6807\u6CE8\uFF08\u4E0E\u4EFB\u52A1\u7EC8\u7AEF\u3001\u98DE\u4E66\u7684\u6765\u6E90\u89C4\u8303\u4E00\u81F4\uFF09\uFF1A",
26603
+ "## \u6765\u6E90",
26604
+ "Tower Assistant"
26594
26605
  ].join("\n"),
26595
26606
  type: "string",
26596
26607
  label: "Assistant System Prompt"
@@ -26622,6 +26633,74 @@ var init_config_defaults = __esm({
26622
26633
  defaultValue: false,
26623
26634
  type: "boolean",
26624
26635
  label: "MCP Task Defaults Configured"
26636
+ },
26637
+ // 内置系统声明:所有任务启动时作为 --append-system-prompt 注入(与任务自选的
26638
+ // AgentPrompt merge,内置在前)。built-in:默认值在代码里删不掉(不可删),但可经
26639
+ // SystemConfig 覆盖(可修改)。
26640
+ "task.systemDirective": {
26641
+ defaultValue: [
26642
+ "## Tower \u7CFB\u7EDF\u8BF4\u660E",
26643
+ "\u4F60\u8FD0\u884C\u5728 Tower\uFF08\u4E00\u4E2A AI \u4EFB\u52A1\u8C03\u5EA6\u5E73\u53F0\uFF09\u7684\u4EFB\u52A1\u7EC8\u7AEF\u91CC\uFF0C\u4E3A\u67D0\u4E2A\u5177\u4F53\u4EFB\u52A1\u800C\u542F\u52A8\u3002\u4F60\u7684\u4EA7\u51FA\u4F1A\u88AB Tower \u8BB0\u5F55\u4E3A\u300C\u4EFB\u52A1\u6267\u884C\u300D\uFF0C\u4EFB\u52A1\u7ED3\u675F\u540E\u8FDB\u5165 review \u72B6\u6001\uFF0C\u53EF\u80FD\u88AB\u6D3E\u751F\u4F60\u7684\u7236\u4EFB\u52A1\u6216\u7528\u6237\u5BA1\u9605\u3002\u73AF\u5883\u53D8\u91CF\u91CC\u6709 TOWER_TASK_ID\uFF08\u5F53\u524D\u4EFB\u52A1 id\uFF09\u3001TOWER_TASK_TITLE\uFF08\u4EFB\u52A1\u6807\u9898\uFF09\u7B49\uFF0C\u53EF\u7528\u6765\u8BC6\u522B\u81EA\u5DF1\u3002",
26644
+ "",
26645
+ "## \u9996\u8981\u539F\u5219",
26646
+ "- **\u9879\u76EE\u81EA\u8EAB\u89C4\u5219\u4F18\u5148**\uFF1A\u5DE5\u4F5C\u76EE\u5F55\u91CC\u9879\u76EE\u7684 CLAUDE.md / AGENTS.md \u7B49\u7EA6\u5B9A\u4F18\u5148\u7EA7\u6700\u9AD8\uFF0C\u4E0E\u672C\u58F0\u660E\u51B2\u7A81\u65F6\u4EE5\u9879\u76EE\u89C4\u5219\u4E3A\u51C6\u3002\u672C\u58F0\u660E\u53EA\u89C4\u5B9A\u300C\u4F5C\u4E3A\u4E00\u4E2A Tower \u4EFB\u52A1\u300D\u7684\u901A\u7528\u884C\u4E3A\uFF0C\u4E0D\u8986\u76D6\u5177\u4F53\u9879\u76EE\u7684\u6280\u672F\u89C4\u8303\u3002",
26647
+ "- **\u53EA\u505A\u4EFB\u52A1\u8303\u56F4\u5185\u7684\u4E8B**\uFF1A\u7D27\u6263\u5F53\u524D\u4EFB\u52A1\u76EE\u6807\uFF0C\u4E0D\u987A\u624B\u6539\u65E0\u5173\u4EE3\u7801\u3001\u4E0D\u64C5\u81EA\u6269\u5927\u6539\u52A8\u9762\u3002",
26648
+ "- **\u5B8C\u6210\u5373\u9A8C\u8BC1**\uFF1A\u6709\u6D4B\u8BD5 / \u6784\u5EFA / lint / \u7C7B\u578B\u68C0\u67E5\u5C31\u5148\u8DD1\u4E00\u904D\u518D\u5BA3\u79F0\u300C\u505A\u5B8C\u300D\uFF1B\u5931\u8D25\u5982\u5B9E\u62A5\u544A\uFF0C\u4E0D\u786E\u5B9A\u5C31\u8BF4\u4E0D\u786E\u5B9A\uFF0C\u522B\u628A\u6CA1\u9A8C\u8BC1\u7684\u5F53\u6210\u529F\u3002",
26649
+ "- **\u957F\u8FDB\u7A0B\u522B\u5360\u4F4F\u7EC8\u7AEF**\uFF1Adev server\u3001watch \u7B49\u9700\u957F\u65F6\u95F4\u524D\u53F0\u8FD0\u884C\u7684\u547D\u4EE4\uFF0C\u7528\u5B8C\u5373\u505C\u6216\u653E\u540E\u53F0\uFF0C\u522B\u8BA9\u4EFB\u52A1\u7EC8\u7AEF\u88AB\u6C38\u4E45\u5361\u4F4F\uFF08Tower \u7684 Preview \u6709\u72EC\u7ACB\u7BA1\u7406\uFF0C\u901A\u5E38\u4E0D\u9700\u8981\u4F60\u624B\u52A8\u8D77 dev server\uFF09\u3002",
26650
+ "- **\u9ED8\u8BA4\u7528\u4E2D\u6587\u56DE\u590D**\uFF08\u9664\u975E\u9879\u76EE\u6216\u7528\u6237\u53E6\u6709\u8981\u6C42\uFF09\u3002",
26651
+ "",
26652
+ "## Git \u5DE5\u4F5C\u89C4\u5219",
26653
+ "- \u5B8C\u6210\u4E00\u6BB5\u6709\u610F\u4E49\u7684\u6539\u52A8\u540E\uFF0C\u4E3B\u52A8\u7528\u6E05\u6670\u7684 message \u521B\u5EFA commit\uFF08\u7EA6\u5B9A\u5F0F\uFF1Afeat / fix / refactor / docs / chore\u2026\uFF09\uFF0C\u4E0D\u8981\u7559\u4E00\u5806\u672A\u63D0\u4EA4\u7684\u6539\u52A8\u3002",
26654
+ "- \u82E5\u5F53\u524D\u4EFB\u52A1\u8FD0\u884C\u5728 Git worktree \u9694\u79BB\u5206\u652F\u91CC\uFF08worktree \u4EFB\u52A1\uFF09\uFF1A**\u53EA commit\uFF0C\u4E0D\u8981 push** \u2014\u2014 worktree \u5206\u652F\u7531 Tower \u7EDF\u4E00\u7BA1\u7406\u4E0E\u5408\u5E76\u3002",
26655
+ "- \u82E5\u5F53\u524D\u4EFB\u52A1\u76F4\u63A5\u5728\u9879\u76EE\u4E3B\u5DE5\u4F5C\u533A\u91CC\uFF08\u975E worktree \u4EFB\u52A1\uFF09\uFF1A\u53EF\u4EE5 push\u3002",
26656
+ "- \u4E0D\u786E\u5B9A\u81EA\u5DF1\u662F\u4E0D\u662F worktree \u4EFB\u52A1\u65F6\uFF0C\u9ED8\u8BA4\u53EA commit\u3001\u4E0D push\u3002",
26657
+ "",
26658
+ "## \u5E76\u53D1\u4E0E\u534F\u4F5C\uFF08\u591A\u4EFB\u52A1\u53EF\u80FD\u540C\u6539\u4E00\u4E2A\u4ED3\u5E93\uFF09",
26659
+ "- Tower \u5E38\u540C\u65F6\u8DD1\u591A\u4E2A\u4EFB\u52A1\u3001\u751A\u81F3\u540C\u4E00\u4ED3\u5E93\u591A\u4E2A worktree\u3002**\u53EA stage / commit \u4F60\u8FD9\u8F6E\u4EB2\u624B\u6539\u7684\u6587\u4EF6**\uFF0C\u4E00\u5F8B `git add <\u660E\u786E\u8DEF\u5F84>`\uFF1B\u7981\u6B62 `git add .` / `-A` / `-u` / `git commit -a`\uFF0C\u522B\u628A\u522B\u7684\u7A97\u53E3\u6216\u7528\u6237\u624B\u52A8\u7684\u6539\u52A8\u4E00\u5E76\u63D0\u4EA4\u3002",
26660
+ "- `git status` \u91CC\u4E0D\u8BA4\u8BC6\u3001\u4E0D\u662F\u4F60\u6539\u7684\u6587\u4EF6\u4E00\u5F8B\u4E0D\u78B0\u3001\u4E0D\u63D0\u4EA4\uFF0C\u9700\u8981\u65F6\u5728\u5C0F\u7ED3\u91CC\u63D0\u4E00\u53E5\u5373\u53EF\u3002",
26661
+ "- \u4E0D force-push\u3001\u4E0D\u6539\u5199\u5171\u4EAB\u5206\u652F\u5386\u53F2\uFF1B\u4E0D\u5BF9\u4E0D\u5C5E\u4E8E\u4F60\u7684\u6539\u52A8\u505A `git reset --hard` / `git clean -fd`\u3002",
26662
+ "",
26663
+ "## Worktree \u7EAA\u5F8B\uFF08\u52A1\u5FC5\u9632\u6B62\u6539\u5230\u4E3B\u4ED3\u5E93\uFF09",
26664
+ "- \u5F00\u5DE5\u7B2C\u4E00\u4EF6\u4E8B\u5148\u8DD1 `pwd`\uFF1A\u5B83\u5C31\u662F\u4F60\u7684\u5DE5\u4F5C\u6839\u3002\u4E4B\u540E\u6240\u6709 Read/Edit/Write/Bash \u8DEF\u5F84\u90FD\u4EE5\u5B83\u4E3A\u57FA\u51C6\uFF0C\u4F18\u5148\u7528\u76F8\u5BF9\u8DEF\u5F84\uFF1B\u7528\u7EDD\u5BF9\u8DEF\u5F84\u65F6\u5FC5\u987B\u4EE5\u8FD9\u4E2A\u6839\u5F00\u5934\uFF0C**\u7EDD\u4E0D**\u51ED\u4E0A\u4E0B\u6587/\u8BB0\u5FC6\u91CC\u7684\u4E3B\u4ED3\u5E93\u8DEF\u5F84\u53BB\u62FC\u7EDD\u5BF9\u8DEF\u5F84\u2014\u2014\u8FD9\u6B63\u662F\u5386\u6B21\u300Cworktree \u91CC\u770B\u4EC0\u4E48\u90FD\u6CA1\u53D8\u300D\u7684\u6839\u56E0\u3002",
26665
+ "- \u5224\u65AD\u81EA\u5DF1\u662F\u4E0D\u662F worktree \u4EFB\u52A1\uFF1A`pwd` \u843D\u5728 `.worktrees/task-$TOWER_TASK_ID` \u4E0B\u3001\u6216 `git branch --show-current` \u4E3A `task/$TOWER_TASK_ID`\uFF0C\u5373\u662F\u3002\u662F\u5219\u4E25\u683C\u8D70\u672C\u8282\u7EAA\u5F8B\u3002",
26666
+ "- \u52A8\u4EFB\u4F55\u6587\u4EF6 / \u63D0\u4EA4\u524D\uFF0C\u5148\u6838\u5BF9\u4E09\u4EF6\u4E8B\u90FD\u6210\u7ACB\uFF1A\u2460 `git rev-parse --show-toplevel` \u7B49\u4E8E\u5F53\u524D worktree \u6839\uFF08\u4E0D\u662F\u4E3B\u4ED3\u5E93\u8DEF\u5F84\uFF09\uFF1B\u2461 `git branch --show-current` \u4E3A `task/$TOWER_TASK_ID`\uFF08\u4E0D\u662F main / feature / \u5176\u5B83\u5206\u652F\uFF09\uFF1B\u2462 \u8981\u6539\u7684\u6587\u4EF6\u7EDD\u5BF9\u8DEF\u5F84\u542B `.worktrees/task-$TOWER_TASK_ID/` \u6BB5\u3002\u4EFB\u4E00\u4E0D\u6EE1\u8DB3\uFF0C\u8BF4\u660E\u4F60\u64CD\u4F5C\u5230\u4E3B\u4ED3\u5E93\u4E86\uFF0C**\u7ACB\u5373\u505C\u6B62\u3001\u4E0D\u8981\u63D0\u4EA4**\uFF0C\u5148\u7EA0\u6B63\u76EE\u5F55\u3002",
26667
+ "- \u7EDD\u4E0D `cd` \u5230\u4E3B\u4ED3\u5E93\u6216 worktree \u4E4B\u5916\u53BB\u6539\u6587\u4EF6 / \u8DD1 git\uFF1B\u6240\u6709 git \u547D\u4EE4\u90FD\u5728\u5F53\u524D worktree \u6839\u5185\u6267\u884C\uFF08\u8DE8\u76EE\u5F55\u65F6\u7528 `git -C <worktree \u6839>` \u663E\u5F0F\u6307\u5B9A\uFF0C\u522B\u9760\u9ED8\u8BA4 cwd \u731C\uFF09\u3002",
26668
+ "- \u4E07\u4E00\u5DF2\u7ECF\u6539\u9519\u5230\u4E3B\u4ED3\u5E93\uFF1A\u628A\u6539\u52A8\u642C\u56DE worktree\uFF08`git -C <worktree \u6839> cherry-pick <\u8BEF\u63D0\u4EA4>` \u6216\u91CD\u6253\u4E00\u904D\uFF09\uFF0C\u4E3B\u4ED3\u5E93\u5DE5\u4F5C\u533A\u7528 `git restore` \u590D\u539F\u3001\u8BEF\u63D0\u4EA4\u6309\u60C5\u51B5\u5904\u7406\u2014\u2014\u5DF2\u88AB\u522B\u7684\u63D0\u4EA4\u53E0\u5728\u4E0A\u9762\u5C31\u7528 `git revert`\uFF08\u4FDD\u5386\u53F2\u3001\u4E0D\u52A8\u522B\u4EBA\u7684\u63D0\u4EA4\uFF09\uFF0C\u786E\u8BA4\u72EC\u5360\u4E14\u672A push \u624D\u7528 `git reset`\uFF1B\u6700\u540E\u5982\u5B9E\u62A5\u544A\u4E24\u8FB9\u6700\u7EC8\u72B6\u6001\uFF0C\u4E0D\u8981\u9690\u7792\u3002",
26669
+ "",
26670
+ "## \u6C47\u62A5\u4E0E\u4EA4\u63A5",
26671
+ "- \u4EA7\u51FA\u4F1A\u88AB review\uFF0C\u7ED3\u5C3E\u7ED9\u4E00\u6BB5\u53EF\u901F\u8BFB\u7684\u5C0F\u7ED3\uFF1A\u505A\u4E86\u4EC0\u4E48\u3001\u6539\u4E86\u54EA\u4E9B\u5173\u952E\u6587\u4EF6\u3001\u9A8C\u8BC1\u7ED3\u679C\u3001\u8FD8\u5269\u4EC0\u4E48\u6CA1\u505A / \u88AB\u4EC0\u4E48\u963B\u585E\u3001\u6709\u6CA1\u6709\u9700\u8981\u7528\u6237\u6216\u7236\u4EFB\u52A1\u62CD\u677F\u7684\u51B3\u7B56\u3002",
26672
+ "- \u771F\u88AB\u5916\u90E8\u56E0\u7D20\u963B\u585E\uFF08\u5F85\u63A5\u53E3\u3001\u5F85\u7D20\u6750\u3001\u5F85\u4EBA\u51B3\u7B56\uFF09\u5C31**\u660E\u786E\u8BF4\u660E\u5E76\u505C\u4E0B**\uFF0C\u522B\u53CD\u590D\u7A7A\u8F6C\u6216\u81EA\u884C\u81C6\u6D4B\u786C\u505A\u3002",
26673
+ "- \u5371\u9669 / \u4E0D\u53EF\u9006\u64CD\u4F5C\uFF08\u5220\u6570\u636E\u5E93\u3001\u5220\u5927\u76EE\u5F55\u3001`rm -rf`\u3001`drop table`\u3001\u5BF9\u5916\u53D1\u5E03 / \u90E8\u7F72\uFF09\u5148\u8BF4\u660E\u5E76\u5F81\u5F97\u786E\u8BA4\u518D\u6267\u884C\u3002",
26674
+ "",
26675
+ "## \u65E0\u4EBA\u503C\u5B88\uFF08\u73AF\u5883\u53D8\u91CF TOWER_UNATTENDED=1 \u65F6\u5C24\u5176\u91CD\u8981\uFF09",
26676
+ "- \u4F60\u53EF\u80FD\u5728\u65E0\u4EBA\u76EF\u5B88\u4E0B\u8FD0\u884C\u3002\u4E24\u4E2A\u4E0E\u4EBA\u6C9F\u901A\u7684 MCP \u5DE5\u5177\uFF1A`ask_human`\uFF08\u963B\u585E\uFF1A**\u8BB0\u5F55**\u95EE\u9898\u5E76\u6302\u8D77\u4EFB\u52A1\u2014\u2014\u672C\u56DE\u5408\u5230\u6B64\u4E3A\u6B62\uFF0C\u4EBA\u56DE\u590D\u540E\u81EA\u52A8\u5524\u9192\u3001\u5E26\u7B54\u6848\u7EED\u8DD1\uFF09\u548C `notify_human`\uFF08\u975E\u963B\u585E\uFF1A**\u8BB0\u5F55**\u4E00\u6761\u8FDB\u5EA6/FYI \u540E\u7ACB\u5373\u7EE7\u7EED\uFF0C\u4E0D\u5FC5\u7B49\u56DE\u590D\u3001\u4E0D\u6302\u8D77\uFF09\u3002**\u6CE8\u610F\uFF1A\u8FD9\u4E24\u4E2A\u5DE5\u5177\u53EA\u5728 Tower \u5185\u8BB0\u5F55\uFF08/harness \u9762\u677F\u53EF\u89C1\uFF09\uFF0C\u672C\u8EAB\u4E0D\u628A\u6D88\u606F\u53D1\u7ED9\u4EBA**\uFF1B\u65E0\u4EBA\u503C\u5B88\u4E0B\u8981\u771F\u6B63\u901A\u77E5\u5230\u4EBA\uFF0C\u987B\u6309\u7CFB\u7EDF\u63D0\u793A\u91CC\u300C\u65E0\u4EBA\u503C\u5B88\u5916\u63A8\u300D\u6BB5\u5148\u7ECF\u5E73\u53F0\u6E20\u9053\u628A\u6D88\u606F\u53D1\u51FA\u53BB\uFF0C\u518D\u8C03\u8FD9\u4E24\u4E2A\u5DE5\u5177\u7559\u6863\u3002",
26677
+ "- \u9700\u8981\u4EBA\u62CD\u677F\u624D\u80FD\u63A8\u8FDB\uFF08\u9009\u578B\u3001\u4E8C\u4E49\u9700\u6C42\u3001\u7F3A\u5173\u952E\u4FE1\u606F\u3001\u5BF9\u5916\u53D1\u5E03/\u90E8\u7F72\u7B49\uFF09\u2192 \u7528 `ask_human` \u628A\u95EE\u9898\u548C\u53EF\u9009\u9879\u8BB2\u6E05\u695A\uFF0C\u7136\u540E\u505C\u4E0B\u7B49\u5F85\uFF0C\u522B\u81EA\u884C\u81C6\u6D4B\u786C\u505A\u3002",
26678
+ "- \u5371\u9669 / \u4E0D\u53EF\u9006\u64CD\u4F5C\uFF08\u5220\u5E93\u3001\u5220\u5927\u76EE\u5F55\u3001`rm -rf`\u3001`drop table`\u3001force-push\u3001\u5BF9\u5916\u53D1\u5E03\uFF09\u2192 \u4E00\u5F8B\u5148 `ask_human` \u5F81\u5F97\u540C\u610F\u518D\u6267\u884C\uFF0C\u5373\u4F7F\u7EC8\u7AEF\u5DF2\u653E\u5F00\u6743\u9650\u4E5F\u4E0D\u4F8B\u5916\u3002",
26679
+ "- \u53EA\u662F\u60F3\u540C\u6B65\u8FDB\u5C55\u6216\u629B\u4E2A FYI\u3001\u65E0\u9700\u56DE\u590D \u2192 \u7528 `notify_human`\uFF0C\u53D1\u5B8C\u7EE7\u7EED\u5E72\u3002",
26680
+ "- \u8C03\u7528 `ask_human` \u540E\u7ACB\u5373\u7ED3\u675F\u672C\u56DE\u5408\u3001\u4E0D\u8981\u518D\u7EE7\u7EED\u64CD\u4F5C\uFF1B\u5B83\u4F1A\u5173\u95ED\u7EC8\u7AEF\u7701\u8D44\u6E90\uFF0C\u4EBA\u56DE\u590D\u540E\u4EFB\u52A1\u81EA\u52A8\u6062\u590D\u3002",
26681
+ "",
26682
+ "## \u672C\u8F6E commit \u56DE\u663E",
26683
+ "- **\u6BCF\u8F6E\u56DE\u590D\u7684\u6700\u540E\uFF0C\u5FC5\u987B\u628A\u672C\u8F6E\u521B\u5EFA\u7684 commit \u5217\u51FA\u6765\u8BA9\u7528\u6237\u4E00\u773C\u770B\u5230**\u3002\u683C\u5F0F\u56FA\u5B9A\uFF1A\u5148\u4E00\u884C\u52A0\u7C97\u5C0F\u6807\u9898 `**\u672C\u8F6E commit**`\uFF08\u4E0D\u8981\u7528 `---` \u5206\u9694\u7EBF\u3001\u4E0D\u8981\u7528 emoji\uFF09\uFF0C\u6362\u884C\u540E\u6BCF\u6761 commit \u5355\u72EC\u4E00\u884C\u3001\u4EE5 `- ` \u5F00\u5934\uFF0C\u5F62\u5982 `` - `<\u77ED hash>` <message \u9996\u884C> ``\uFF08hash \u7528\u884C\u5185\u4EE3\u7801\u5305\u4F4F\uFF09\u3002\u672C\u8F6E\u6CA1\u6709\u521B\u5EFA\u4EFB\u4F55 commit \u65F6\uFF0C\u53EA\u56DE\u4E00\u884C `\u672C\u8F6E\u65E0 commit`\u3002"
26684
+ ].join("\n"),
26685
+ type: "string",
26686
+ label: "Task System Directive (built-in)"
26687
+ },
26688
+ // ── 无人值守 harness ──────────────────────────────────────────────
26689
+ // Tower 只记录 ask/notify/done/failed(/harness 面板可见),**不发送消息**:外推给人由 agent
26690
+ // 按注入的「无人值守外推」协议用平台 MCP(飞书/微信/…)完成。故这里不再有平台凭据/渠道绑定配置。
26691
+ // 无人值守发送渠道注册表:agent 据「生效」的那条决定走哪条「网关→下游」把消息发出去。
26692
+ // 每项形如 { id, label, gateway: "feishu"|"openclaw"|"hermes", downstream: "wechat"|"feishu"|... }
26693
+ // (downstream 也可是自定义文本)。目的地(群/人)在发送时由消息说明,不在此预设。Tower 只存不发。
26694
+ "harness.targets": {
26695
+ defaultValue: [],
26696
+ type: "object",
26697
+ label: "Harness Notify Targets (multi-platform registry)"
26698
+ },
26699
+ // 待回复 ask 的 TTL 兜底:超过这么多天仍 OPEN 的 ask 被周期 sweep 转 EXPIRED。
26700
+ "harness.pendingTtlDays": {
26701
+ defaultValue: 14,
26702
+ type: "number",
26703
+ label: "Harness Pending Ask TTL (days)"
26625
26704
  }
26626
26705
  };
26627
26706
  }
@@ -29270,7 +29349,7 @@ var require_websocket = __commonJS({
29270
29349
  var http = require("http");
29271
29350
  var net = require("net");
29272
29351
  var tls = require("tls");
29273
- var { randomBytes, createHash } = require("crypto");
29352
+ var { randomBytes, createHash: createHash2 } = require("crypto");
29274
29353
  var { Duplex, Readable } = require("stream");
29275
29354
  var { URL: URL2 } = require("url");
29276
29355
  var PerMessageDeflate2 = require_permessage_deflate();
@@ -29930,7 +30009,7 @@ var require_websocket = __commonJS({
29930
30009
  abortHandshake(websocket, socket, "Invalid Upgrade header");
29931
30010
  return;
29932
30011
  }
29933
- const digest = createHash("sha1").update(key + GUID).digest("base64");
30012
+ const digest = createHash2("sha1").update(key + GUID).digest("base64");
29934
30013
  if (res.headers["sec-websocket-accept"] !== digest) {
29935
30014
  abortHandshake(websocket, socket, "Invalid Sec-WebSocket-Accept header");
29936
30015
  return;
@@ -30297,7 +30376,7 @@ var require_websocket_server = __commonJS({
30297
30376
  var EventEmitter = require("events");
30298
30377
  var http = require("http");
30299
30378
  var { Duplex } = require("stream");
30300
- var { createHash } = require("crypto");
30379
+ var { createHash: createHash2 } = require("crypto");
30301
30380
  var extension2 = require_extension();
30302
30381
  var PerMessageDeflate2 = require_permessage_deflate();
30303
30382
  var subprotocol2 = require_subprotocol();
@@ -30598,7 +30677,7 @@ var require_websocket_server = __commonJS({
30598
30677
  );
30599
30678
  }
30600
30679
  if (this._state > RUNNING) return abortHandshake(socket, 503);
30601
- const digest = createHash("sha1").update(key + GUID).digest("base64");
30680
+ const digest = createHash2("sha1").update(key + GUID).digest("base64");
30602
30681
  const headers = [
30603
30682
  "HTTP/1.1 101 Switching Protocols",
30604
30683
  "Upgrade: websocket",
@@ -32216,14 +32295,14 @@ async function clearSessionPid(sessionKey) {
32216
32295
  } catch {
32217
32296
  }
32218
32297
  }
32219
- var import_promises, import_node_os3, import_node_path4, SIGNAL_DIR, PID_PREFIX;
32298
+ var import_promises, import_node_path4, SIGNAL_DIR, PID_PREFIX;
32220
32299
  var init_orphan_reaper = __esm({
32221
32300
  "src/lib/pty/orphan-reaper.ts"() {
32222
32301
  "use strict";
32223
32302
  import_promises = require("node:fs/promises");
32224
- import_node_os3 = require("node:os");
32225
32303
  import_node_path4 = require("node:path");
32226
- SIGNAL_DIR = (0, import_node_path4.join)((0, import_node_os3.tmpdir)(), "tower-signals");
32304
+ init_tower_dir();
32305
+ SIGNAL_DIR = getSignalDir();
32227
32306
  PID_PREFIX = "pid-";
32228
32307
  }
32229
32308
  });
@@ -32295,6 +32374,13 @@ var init_session_store = __esm({
32295
32374
  }
32296
32375
  });
32297
32376
 
32377
+ // src/lib/pty/strip-device-queries.ts
32378
+ var init_strip_device_queries = __esm({
32379
+ "src/lib/pty/strip-device-queries.ts"() {
32380
+ "use strict";
32381
+ }
32382
+ });
32383
+
32298
32384
  // src/lib/assistant-constants.ts
32299
32385
  var init_assistant_constants = __esm({
32300
32386
  "src/lib/assistant-constants.ts"() {
@@ -32370,6 +32456,7 @@ var init_ws_server = __esm({
32370
32456
  "use strict";
32371
32457
  init_wrapper();
32372
32458
  init_session_store();
32459
+ init_strip_device_queries();
32373
32460
  init_config_reader();
32374
32461
  init_assistant_constants();
32375
32462
  init_session_store2();
@@ -32483,9 +32570,9 @@ var init_claude_cli_adapter = __esm({
32483
32570
  const settings = this.readSettings();
32484
32571
  const hooks = settings["hooks"] ?? {};
32485
32572
  const root = getPackageRoot().replace(/\\/g, "/");
32486
- const sessionStart = path4.join(root, "scripts", "session-start-hook.js").replace(/\\/g, "/");
32487
- const postTool = path4.join(root, "scripts", "post-tool-hook.js").replace(/\\/g, "/");
32488
- const stop = path4.join(root, "scripts", "stop-hook.js").replace(/\\/g, "/");
32573
+ const sessionStart = path4.join(root, "scripts", "tower-session-start-hook.js").replace(/\\/g, "/");
32574
+ const postTool = path4.join(root, "scripts", "tower-post-tool-hook.js").replace(/\\/g, "/");
32575
+ const stop = path4.join(root, "scripts", "tower-stop-hook.js").replace(/\\/g, "/");
32489
32576
  let changed = false;
32490
32577
  changed = this.upsertHook(hooks, "SessionStart", "session-start-hook.js", {
32491
32578
  hooks: [{ command: `node "${sessionStart}"`, timeout: 5, type: "command" }]
@@ -32524,18 +32611,18 @@ var init_claude_cli_adapter = __esm({
32524
32611
  const hooks = settings["hooks"] ?? {};
32525
32612
  const root = getPackageRoot().replace(/\\/g, "/");
32526
32613
  const map2 = [
32527
- ["SessionStart", "session-start-hook.js"],
32528
- ["PostToolUse", "post-tool-hook.js"],
32529
- ["Stop", "stop-hook.js"]
32614
+ ["SessionStart", "session-start-hook.js", "tower-session-start-hook.js"],
32615
+ ["PostToolUse", "post-tool-hook.js", "tower-post-tool-hook.js"],
32616
+ ["Stop", "stop-hook.js", "tower-stop-hook.js"]
32530
32617
  ];
32531
32618
  let changed = false;
32532
- for (const [event, filename] of map2) {
32619
+ for (const [event, matchName, wantedName] of map2) {
32533
32620
  const entries = this.getHookArray(hooks, event);
32534
32621
  const idx = entries.findIndex(
32535
- (e2) => e2?.hooks?.some?.((h10) => h10.command?.includes(filename))
32622
+ (e2) => e2?.hooks?.some?.((h10) => h10.command?.includes(matchName))
32536
32623
  );
32537
32624
  if (idx < 0) continue;
32538
- const wantedPath = path4.join(root, "scripts", filename).replace(/\\/g, "/");
32625
+ const wantedPath = path4.join(root, "scripts", wantedName).replace(/\\/g, "/");
32539
32626
  const wantedCmd = `node "${wantedPath}"`;
32540
32627
  const hookCmd = entries[idx]?.hooks?.[0];
32541
32628
  if (!hookCmd || hookCmd.command === wantedCmd) continue;
@@ -54309,7 +54396,8 @@ var taskTools = {
54309
54396
  useWorktree: external_exports.boolean().optional().describe("Use a Git worktree for branch isolation. Omit to use the user's saved default; pass explicitly to override this task."),
54310
54397
  baseBranch: external_exports.string().optional().describe("Base branch for worktree checkout. Only used when useWorktree resolves to true. If omitted, auto-detects the project's current branch."),
54311
54398
  autoStart: external_exports.boolean().optional().describe("Start execution immediately after creating. Omit to use the user's saved default; pass explicitly to override this task."),
54312
- references: external_exports.array(external_exports.string()).max(20).optional()
54399
+ references: external_exports.array(external_exports.string()).max(20).optional(),
54400
+ unattended: external_exports.boolean().optional().describe("Run in unattended mode \u2014 the task's agent uses tower-ask to push ask_human / notify_human / done-failed to a configured channel (Settings \u2192 Notifications). Defaults false.")
54313
54401
  }),
54314
54402
  handler: async (args) => {
54315
54403
  const explicitWorktree = args.useWorktree !== void 0;
@@ -54350,6 +54438,15 @@ var taskTools = {
54350
54438
  }
54351
54439
  }
54352
54440
  }
54441
+ const envParentTaskId = process.env.TOWER_TASK_ID || null;
54442
+ let resolvedParentId = null;
54443
+ if (envParentTaskId) {
54444
+ const parent = await db.task.findUnique({
54445
+ where: { id: envParentTaskId },
54446
+ select: { id: true }
54447
+ });
54448
+ if (parent) resolvedParentId = envParentTaskId;
54449
+ }
54353
54450
  const task = await db.task.create({
54354
54451
  data: {
54355
54452
  title: args.title,
@@ -54359,7 +54456,9 @@ var taskTools = {
54359
54456
  status: args.status ?? "TODO",
54360
54457
  baseBranch,
54361
54458
  versionId,
54362
- subPath: args.subPath ?? null
54459
+ subPath: args.subPath ?? null,
54460
+ parentTaskId: resolvedParentId,
54461
+ unattended: args.unattended ?? false
54363
54462
  }
54364
54463
  });
54365
54464
  if (args.labelIds && args.labelIds.length > 0) {
@@ -54441,10 +54540,10 @@ ${refText}`;
54441
54540
  }
54442
54541
  const attachmentInfo = attachmentFailures.length > 0 ? { attachmentFailures } : {};
54443
54542
  if (autoStart) {
54444
- const PORT2 = process.env.PORT ?? "3000";
54543
+ const PORT3 = process.env.PORT ?? "3000";
54445
54544
  const prompt = args.title;
54446
54545
  try {
54447
- const res = await fetch(`http://localhost:${PORT2}/api/internal/terminal/${task.id}/start`, {
54546
+ const res = await fetch(`http://localhost:${PORT3}/api/internal/terminal/${task.id}/start`, {
54448
54547
  method: "POST",
54449
54548
  headers: { "Content-Type": "application/json" },
54450
54549
  body: JSON.stringify({ prompt })
@@ -55581,6 +55680,89 @@ var reportTools = {
55581
55680
  }
55582
55681
  };
55583
55682
 
55683
+ // src/mcp/tools/harness-tools.ts
55684
+ init_zod();
55685
+ var PORT2 = process.env.PORT ?? "3000";
55686
+ var BRIDGE = `http://localhost:${PORT2}/api/internal/harness`;
55687
+ var CUID_RE2 = /^c[a-z0-9]{20,30}$/;
55688
+ function validateMcpTaskId2(taskId) {
55689
+ if (!CUID_RE2.test(taskId)) return "Invalid taskId format \u2014 expected CUID";
55690
+ return null;
55691
+ }
55692
+ var harnessTools = {
55693
+ ask_human: {
55694
+ description: "Ask the human operator a question and PARK the task until they reply. Call this ONLY when you are blocked on a decision you cannot make yourself, or before a dangerous/irreversible action that needs sign-off. This ENDS your turn \u2014 do NOT keep working after calling it. The task is suspended (its terminal is closed to save resources) and later resumed with the human's answer as your next message. In unattended mode the question is pushed to the operator's channel (e.g. Feishu); otherwise it waits visibly in the Tower UI.",
55695
+ schema: external_exports.object({
55696
+ taskId: external_exports.string().describe("The current task id (TOWER_TASK_ID)"),
55697
+ question: external_exports.string().min(1).max(4e3).describe("The question / options for the human")
55698
+ }),
55699
+ handler: async (args) => {
55700
+ const err = validateMcpTaskId2(args.taskId);
55701
+ if (err) return { error: err, taskId: args.taskId };
55702
+ const res = await fetch(`${BRIDGE}/ask`, {
55703
+ method: "POST",
55704
+ headers: { "content-type": "application/json" },
55705
+ body: JSON.stringify({ taskId: args.taskId, question: args.question })
55706
+ });
55707
+ const data = await res.json().catch(() => ({}));
55708
+ if (!res.ok) return { error: data?.error ?? "ask failed", status: res.status };
55709
+ const base = {
55710
+ parked: true,
55711
+ requestId: data.requestId,
55712
+ message: "Question recorded and task parked. Your turn is over \u2014 stop now and wait. You will be resumed with the human's answer as your next message."
55713
+ };
55714
+ if (data.noChannelConfigured) {
55715
+ return {
55716
+ ...base,
55717
+ noChannelConfigured: true,
55718
+ message: "Question recorded (visible in Tower's /harness panel) and task parked, but NO notify channel is configured, so it cannot be pushed to any external channel. Before stopping, tell the user: \u8BF7\u5230\u300C\u8BBE\u7F6E \u2192 \u901A\u77E5 \u2192 \u65E0\u4EBA\u503C\u5B88\u53D1\u9001\u6E20\u9053\u300D\u914D\u7F6E\u4E00\u4E2A\u6E20\u9053\uFF0C\u5426\u5219\u65E0\u6CD5\u5916\u53D1\u3002"
55719
+ };
55720
+ }
55721
+ return base;
55722
+ }
55723
+ },
55724
+ notify_human: {
55725
+ description: "Send a NON-BLOCKING progress update / heads-up to the human operator, then KEEP WORKING. Unlike ask_human this does not park the task or end your turn \u2014 use it for milestones, status reports, or FYI notes that need no reply. In unattended mode it is pushed to the operator's channel (no @mention); otherwise it is a no-op.",
55726
+ schema: external_exports.object({
55727
+ taskId: external_exports.string().describe("The current task id (TOWER_TASK_ID)"),
55728
+ message: external_exports.string().min(1).max(4e3).describe("The progress update for the human")
55729
+ }),
55730
+ handler: async (args) => {
55731
+ const err = validateMcpTaskId2(args.taskId);
55732
+ if (err) return { error: err, taskId: args.taskId };
55733
+ const res = await fetch(`${BRIDGE}/notify`, {
55734
+ method: "POST",
55735
+ headers: { "content-type": "application/json" },
55736
+ body: JSON.stringify({ taskId: args.taskId, message: args.message })
55737
+ });
55738
+ const data = await res.json().catch(() => ({}));
55739
+ if (!res.ok) return { error: data?.error ?? "notify failed", status: res.status };
55740
+ return { ok: true, messageId: data.messageId };
55741
+ }
55742
+ },
55743
+ reply_to_ask: {
55744
+ description: "Deliver a human's reply back to a task that is PARKED waiting on ask_human, then RESUME it. Use this (not send_task_terminal_input) when relaying an operator's answer from a channel (Feishu/WeChat/etc.) so Tower records what was replied and shows the full round-trip in its log. It marks the open question as answered, resumes the task's session, and injects the reply as the task's next message. If the task has NO pending question, it does nothing and returns { no_pending: true } \u2014 in that case treat the message as an ordinary request and handle it normally (create_task / search / etc.).",
55745
+ schema: external_exports.object({
55746
+ taskId: external_exports.string().describe("The task that is parked waiting for a reply (its TOWER_TASK_ID)"),
55747
+ text: external_exports.string().min(1).max(8e3).describe("The human's reply to inject into the task")
55748
+ }),
55749
+ handler: async (args) => {
55750
+ const err = validateMcpTaskId2(args.taskId);
55751
+ if (err) return { error: err, taskId: args.taskId };
55752
+ const res = await fetch(`${BRIDGE}/reply`, {
55753
+ method: "POST",
55754
+ headers: { "content-type": "application/json" },
55755
+ // allowRetry:false —— 只应答仍 OPEN 的问题;答后的新消息返回 no_pending 交 bridge 按普通消息处理。
55756
+ body: JSON.stringify({ taskId: args.taskId, text: args.text, allowRetry: false })
55757
+ });
55758
+ const data = await res.json().catch(() => ({}));
55759
+ if (res.status === 409) return { no_pending: true, taskId: args.taskId };
55760
+ if (!res.ok) return { error: data?.error ?? "reply failed", status: res.status };
55761
+ return { ok: true, taskId: args.taskId, mode: data.mode, injected: data.injected, deduped: data.deduped };
55762
+ }
55763
+ }
55764
+ };
55765
+
55584
55766
  // src/mcp/server.ts
55585
55767
  function createServer() {
55586
55768
  const server = new import_mcp.McpServer({ name: "tower", version: "0.1.0" });
@@ -55593,7 +55775,8 @@ function createServer() {
55593
55775
  ...knowledgeTools,
55594
55776
  ...noteAssetTools,
55595
55777
  ...terminalTools,
55596
- ...reportTools
55778
+ ...reportTools,
55779
+ ...harnessTools
55597
55780
  };
55598
55781
  for (const [name, tool] of Object.entries(allTools)) {
55599
55782
  server.tool(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tower-studio",
3
- "version": "0.2.44",
3
+ "version": "0.2.45",
4
4
  "description": "AI Task Orchestration Platform — Kanban + Terminal + Code Editor + MCP",
5
5
  "bin": {
6
6
  "tower": "bin/tower.mjs"
@@ -20,9 +20,9 @@
20
20
  "scripts/migrate-data.ts",
21
21
  "scripts/run-migrations.ts",
22
22
  "scripts/migrations/",
23
- "scripts/post-tool-hook.js",
24
- "scripts/session-start-hook.js",
25
- "scripts/stop-hook.js",
23
+ "scripts/tower-post-tool-hook.js",
24
+ "scripts/tower-session-start-hook.js",
25
+ "scripts/tower-stop-hook.js",
26
26
  "dist/mcp-server.cjs",
27
27
  "skills/",
28
28
  "next.config.ts",
@@ -30,7 +30,7 @@
30
30
  ],
31
31
  "scripts": {
32
32
  "predev": "TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" node scripts/ensure-dev-db.js && pnpm db:migrate && pnpm mcp:build",
33
- "dev": "NEXT_DISTDIR=.next-dev TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" next dev --webpack -p 9022",
33
+ "dev": "NEXT_DISTDIR=.next-dev TOWER_DATA_DIR=\"$HOME/.tower-dev\" DATABASE_URL=\"file:$HOME/.tower-dev/database/tower.db\" env -u TURBOPACK next dev --webpack -p 9022",
34
34
  "build": "pnpm mcp:build && rm -rf .next && next build && find .next -name '*.map' -delete && cp -R .next/static .next/standalone/.next/ && cp -R public .next/standalone/ && node scripts/prune-standalone-natives.js",
35
35
  "release": "pnpm build && npm pack",
36
36
  "release:smoke": "node scripts/release-smoke.js",
@@ -83,6 +83,7 @@ model Task {
83
83
  promptId String?
84
84
  baseBranch String?
85
85
  subPath String?
86
+ parentTaskId String? // 派生来源:派生此任务的父任务 id(父任务终端注入的 TOWER_TASK_ID)。裸字符串无 relation,与 promptId 同惯例
86
87
  previewCommandOverride String?
87
88
  previewPortOverride Int?
88
89
  projectId String
@@ -91,17 +92,23 @@ model Task {
91
92
  updatedAt DateTime @updatedAt
92
93
  doneAt DateTime? // 进入 DONE 的时间戳,用于「归档期限」判定(离开 DONE 时清空)
93
94
 
95
+ // 无人值守:开启后 agent 遇阻塞主动 ask_human/notify_human(经 tower-ask 技能用平台 MCP 外推);
96
+ // 关闭则只在 /harness 面板内显示等待。Tower 只记录+park/resume,不发消息、不存平台绑定。
97
+ unattended Boolean @default(false)
98
+
94
99
  project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
95
100
  executions TaskExecution[]
96
101
  messages TaskMessage[]
97
102
  labels TaskLabel[]
98
103
  notes ProjectNote[]
99
104
  assets ProjectAsset[]
105
+ harnessMessages HarnessMessage[]
100
106
  version Version? @relation(fields: [versionId], references: [id], onDelete: SetNull)
101
107
 
102
108
  @@index([projectId])
103
109
  @@index([status])
104
110
  @@index([versionId])
111
+ @@index([parentTaskId])
105
112
  }
106
113
 
107
114
  model TaskExecution {
@@ -137,6 +144,36 @@ model TaskExecution {
137
144
  @@index([insightNoteId])
138
145
  }
139
146
 
147
+ // 无人值守:一张表记所有 harness→人 的消息(ask/notify/done/failed)—— 纯记录/日志,Tower 不发送。
148
+ // - kind='ask' 是 park/resume 闭环载体,带生命周期 state:OPEN→ANSWERED|CANCELLED|IGNORED|EXPIRED。
149
+ // - notify/done/failed 是日志行,出生即 CLOSED,不参与「待回复」过滤。
150
+ // - 不变量:待回复 = kind='ask' AND state='OPEN'。回复内容记在 replyText(reply_to_ask 写入)。
151
+ model HarnessMessage {
152
+ id String @id @default(cuid())
153
+ taskId String
154
+ executionId String?
155
+ kind String // "ask" | "notify" | "done" | "failed"(映射 OutboundKind)
156
+ content String
157
+ replyText String?
158
+ repliedAt DateTime?
159
+ state HarnessState @default(OPEN)
160
+ createdAt DateTime @default(now())
161
+
162
+ task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
163
+
164
+ @@index([taskId, kind, state])
165
+ @@index([state])
166
+ }
167
+
168
+ enum HarnessState {
169
+ OPEN
170
+ ANSWERED
171
+ CANCELLED
172
+ IGNORED
173
+ EXPIRED
174
+ CLOSED
175
+ }
176
+
140
177
  model TaskMessage {
141
178
  id String @id @default(cuid())
142
179
  role MessageRole
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Add Task.parentTaskId — 派生中枢的父任务链。
3
+ *
4
+ * 子任务由父任务终端的 claude 调 create_task 创建时,写入派生它的父任务 id
5
+ * (父任务 PTY 注入的 TOWER_TASK_ID)。用于完成回推(子任务 stop → 通知父任务
6
+ * review)及将来的派生子任务展示。裸字符串列、无 FK relation(与 promptId 同惯例)。
7
+ *
8
+ * 加性 raw SQL —— 绝不碰 notes_fts 虚表(prisma db push 会卡死)。
9
+ * 幂等:SQLite 无 ADD COLUMN IF NOT EXISTS,先 PRAGMA 检查列是否存在。
10
+ *
11
+ * Table/column names hardcoded on purpose — a migration is a point-in-time
12
+ * snapshot and must keep doing exactly what it did the day it shipped.
13
+ */
14
+
15
+ import type { PrismaClient } from "@prisma/client";
16
+
17
+ export async function up(prisma: PrismaClient): Promise<void> {
18
+ const cols = await prisma.$queryRawUnsafe<Array<{ name: string }>>(
19
+ `PRAGMA table_info("Task")`
20
+ );
21
+ const hasCol = Array.isArray(cols) && cols.some((c) => c.name === "parentTaskId");
22
+ if (!hasCol) {
23
+ await prisma.$executeRawUnsafe(`ALTER TABLE "Task" ADD COLUMN "parentTaskId" TEXT`);
24
+ console.log(" added Task.parentTaskId");
25
+ }
26
+ await prisma.$executeRawUnsafe(
27
+ `CREATE INDEX IF NOT EXISTS "Task_parentTaskId_idx" ON "Task"("parentTaskId")`
28
+ );
29
+ }
@@ -3,13 +3,14 @@
3
3
  * Tower Stop Hook
4
4
  *
5
5
  * Claude Code Stop hook that fires when Claude finishes responding.
6
- * Notifies Tower so the UI can show a "response complete" indicator.
6
+ * Notifies Tower so the UI can show a "response complete" indicator, and so a
7
+ * derived child task can hand its turn back to the parent task for review.
7
8
  *
8
9
  * Environment:
9
10
  * TOWER_TASK_ID - Required. Skip if absent (not a Tower session).
10
11
  * TOWER_API_URL - Required. Base URL of the Tower server.
11
12
  *
12
- * Stdin: JSON object from Claude Code with { session_id, cwd, ... }
13
+ * Stdin: JSON object from Claude Code with { session_id, transcript_path, cwd, ... }
13
14
  */
14
15
 
15
16
  "use strict";
@@ -17,6 +18,43 @@
17
18
  const http = require("http");
18
19
  const https = require("https");
19
20
 
21
+ /**
22
+ * 从 Claude Code 的 transcript 提取最后一条 assistant 回复(截断 2000 字)。
23
+ * 用于完成回推:父任务据此 review,不必读整个终端缓冲。best-effort,失败返回空串。
24
+ * transcript 是 jsonl,行格式随 CC 版本略有差异,这里兼容 obj.message.content / obj.content。
25
+ */
26
+ function extractLastAssistantText(transcriptPath) {
27
+ if (!transcriptPath) return "";
28
+ try {
29
+ const fs = require("fs");
30
+ const raw = fs.readFileSync(transcriptPath, "utf8");
31
+ const lines = raw.split("\n");
32
+ for (let i = lines.length - 1; i >= 0; i--) {
33
+ const line = lines[i].trim();
34
+ if (!line) continue;
35
+ let obj;
36
+ try { obj = JSON.parse(line); } catch { continue; }
37
+ const msg = obj.message || obj;
38
+ const role = msg.role || obj.type;
39
+ if (role !== "assistant" || !msg.content) continue;
40
+ let text = "";
41
+ if (Array.isArray(msg.content)) {
42
+ text = msg.content
43
+ .filter((c) => c && c.type === "text" && typeof c.text === "string")
44
+ .map((c) => c.text)
45
+ .join("\n")
46
+ .trim();
47
+ } else if (typeof msg.content === "string") {
48
+ text = msg.content.trim();
49
+ }
50
+ if (text) return text.slice(0, 2000);
51
+ }
52
+ } catch {
53
+ /* best effort — transcript unreadable */
54
+ }
55
+ return "";
56
+ }
57
+
20
58
  function main() {
21
59
  // Always drain stdin first — Claude Code writes the hook payload there
22
60
  // and if we exit before reading it, Windows libuv can crash the parent
@@ -52,10 +90,11 @@ function main() {
52
90
  try { data = JSON.parse(input); } catch { process.exit(0); }
53
91
 
54
92
  const sessionId = data.session_id || "";
93
+ const lastReply = extractLastAssistantText(data.transcript_path);
55
94
 
56
95
  // POST to Tower
57
96
  const url = new URL("/api/internal/hooks/stop", apiUrl);
58
- const payload = JSON.stringify({ taskId, sessionId });
97
+ const payload = JSON.stringify({ taskId, sessionId, lastReply });
59
98
  const mod = url.protocol === "https:" ? https : http;
60
99
 
61
100
  const req = mod.request({
@@ -39,6 +39,7 @@ Use Tower tools when the user wants to:
39
39
  - Organize tasks with labels or status changes
40
40
  - Get daily work summary or pending todo list
41
41
  - Check what was done today or what's left to do
42
+ - **Run or relay unattended tasks** — when `TOWER_UNATTENDED=1`, or you need to push an `ask_human` / `notify_human` to a person, or relay a human's reply back into a parked task (`reply_to_ask`): read [`references/unattended-messaging.md`](references/unattended-messaging.md) for the send/receive contract.
42
43
 
43
44
  ---
44
45
 
@@ -255,6 +256,23 @@ section so we can always trace **why** a task exists and **who** asked for it.
255
256
  hard locators (chat id / message id / link) verbatim — they are what makes the
256
257
  task traceable later.
257
258
 
259
+ #### Parent task derivation (派生子任务)
260
+
261
+ If `TOWER_TASK_ID` is set in your environment (run `echo $TOWER_TASK_ID` to check),
262
+ you are operating **inside a Tower task terminal** — so any task you create here is
263
+ a **child task derived from the current (parent) task**. Render its source as:
264
+
265
+ ```
266
+ ## 来源
267
+
268
+ - 渠道:父任务派生
269
+ - 父任务:{当前任务标题,知道就填}(id: $TOWER_TASK_ID)
270
+ ```
271
+
272
+ Tower also records this link structurally on the new task's `parentTaskId`
273
+ automatically (used for parent→child completion notifications) — this `## 来源`
274
+ is just the human-readable mirror. The id alone is enough if you don't know the title.
275
+
258
276
  #### Bridge metadata contract (`<task-source>` block)
259
277
 
260
278
  External bridges (Feishu/Lark, etc.) inject a machine-readable block into the
@@ -468,6 +486,19 @@ Categories: `task`, `project`, `repository`, `note`, `asset`, `all`. Result coun
468
486
 
469
487
  ---
470
488
 
489
+ ## 无人值守收发消息(Unattended messaging)
490
+
491
+ When operating in unattended mode (`TOWER_UNATTENDED=1`) or acting as the bridge that relays a
492
+ human's reply back to a parked task, follow the send/receive contract in
493
+ [`references/unattended-messaging.md`](references/unattended-messaging.md). Key points:
494
+
495
+ - Tower **only records + parks/resumes** — it never sends platform messages. You (the agent/bridge)
496
+ send via the platform's own MCP (Feishu/WeChat/OpenClaw…).
497
+ - Every outbound ask/notify **must** carry the correlation token `[[tower:task=<taskId>]]`.
498
+ - Relay a human's reply with the **`reply_to_ask(taskId, text)`** MCP tool (not raw
499
+ `send_task_terminal_input`) so Tower records the reply. If it returns `{ no_pending: true }`,
500
+ handle the message as an ordinary request.
501
+
471
502
  ## Important Rules
472
503
 
473
504
  - **Scope boundary**: You are a **task management operator only**. If the user asks you to write code, explain code, debug, search the web, read/write files, or anything outside Tower task management, reply: "抱歉,我只能帮你管理工作区、项目和任务。编码、调试等操作请在任务终端中完成。" Do NOT attempt to answer out-of-scope questions.