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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tower-studio",
3
- "version": "0.2.45",
3
+ "version": "0.2.47",
4
4
  "description": "AI Task Orchestration Platform — Kanban + Terminal + Code Editor + MCP",
5
5
  "bin": {
6
6
  "tower": "bin/tower.mjs"
@@ -25,7 +25,6 @@
25
25
  "scripts/tower-stop-hook.js",
26
26
  "dist/mcp-server.cjs",
27
27
  "skills/",
28
- "next.config.ts",
29
28
  "tsconfig.json"
30
29
  ],
31
30
  "scripts": {
@@ -15,10 +15,11 @@ model Workspace {
15
15
  createdAt DateTime @default(now())
16
16
  updatedAt DateTime @updatedAt
17
17
 
18
- projects Project[]
19
- labels Label[]
20
- prompts AgentPrompt[]
21
- versionTypes VersionType[]
18
+ projects Project[]
19
+ labels Label[]
20
+ prompts AgentPrompt[]
21
+ versionTypes VersionType[]
22
+ productGroups ProductGroup[]
22
23
  }
23
24
 
24
25
  model Project {
@@ -34,18 +35,58 @@ model Project {
34
35
  previewPort Int?
35
36
  previewPreset String?
36
37
  previewInstallCommand String?
38
+ // 知识库:groupId 把同一产品的多个仓库(前后端/trace/需求)归入一个 ProductGroup,
39
+ // 问答时自动把同组兄弟项目一起纳入检索。knowledgeDir 是 repo 内知识库目录(相对 localPath),
40
+ // 留空则用约定默认(见 src/lib/knowledge.ts DEFAULT_KNOWLEDGE_DIR)。
41
+ groupId String?
42
+ knowledgeDir String?
37
43
  workspaceId String
38
44
  createdAt DateTime @default(now())
39
45
  updatedAt DateTime @updatedAt
40
46
 
41
- workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
47
+ workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
48
+ group ProductGroup? @relation(fields: [groupId], references: [id], onDelete: SetNull)
42
49
  tasks Task[]
43
50
  repositories Repository[]
44
51
  notes ProjectNote[]
45
52
  assets ProjectAsset[]
46
53
  versions Version[]
54
+ facts ProjectFact[]
47
55
 
48
56
  @@index([workspaceId])
57
+ @@index([groupId])
58
+ }
59
+
60
+ /// 产品组:把同一产品的多个仓库(前后端 / trace 静态知识库 / 需求)归为一组。
61
+ /// 组内成员的知识(repo 知识目录 + 事实卡 + 版本/commit + 笔记)在问答时一起检索。
62
+ model ProductGroup {
63
+ id String @id @default(cuid())
64
+ name String
65
+ description String?
66
+ workspaceId String
67
+ createdAt DateTime @default(now())
68
+ updatedAt DateTime @updatedAt
69
+
70
+ workspace Workspace @relation(fields: [workspaceId], references: [id], onDelete: Cascade)
71
+ projects Project[]
72
+
73
+ @@unique([workspaceId, name])
74
+ @@index([workspaceId])
75
+ }
76
+
77
+ // 结构化「事实卡」:机器拿不到、需人工/AI 填的项目级 key-value(生产环境路径、
78
+ // CICD 路径、域名等)。知识库问答的精确命中源之一。key 在项目内唯一(upsert)。
79
+ model ProjectFact {
80
+ id String @id @default(cuid())
81
+ projectId String
82
+ key String
83
+ value String
84
+ updatedAt DateTime @updatedAt
85
+
86
+ project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
87
+
88
+ @@unique([projectId, key])
89
+ @@index([projectId])
49
90
  }
50
91
 
51
92
  model Label {
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 项目知识库地基:Project.productKey / Project.knowledgeDir + ProjectFact 表。
3
+ *
4
+ * - productKey: 产品组归一(前后端 a/b 填同值即成组),问答时兄弟项目一起检索。
5
+ * - knowledgeDir: repo 内知识库目录(相对 localPath),留空走约定默认。
6
+ * - ProjectFact: 机器拿不到的项目级事实卡(生产/CICD 路径等),key 项目内唯一。
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
+ async function addColumnIfMissing(
18
+ prisma: PrismaClient,
19
+ table: string,
20
+ column: string,
21
+ ddlType: string
22
+ ): Promise<void> {
23
+ const cols = await prisma.$queryRawUnsafe<Array<{ name: string }>>(
24
+ `PRAGMA table_info("${table}")`
25
+ );
26
+ const hasCol = Array.isArray(cols) && cols.some((c) => c.name === column);
27
+ if (!hasCol) {
28
+ await prisma.$executeRawUnsafe(
29
+ `ALTER TABLE "${table}" ADD COLUMN "${column}" ${ddlType}`
30
+ );
31
+ console.log(` added ${table}.${column}`);
32
+ }
33
+ }
34
+
35
+ export async function up(prisma: PrismaClient): Promise<void> {
36
+ await addColumnIfMissing(prisma, "Project", "productKey", "TEXT");
37
+ await addColumnIfMissing(prisma, "Project", "knowledgeDir", "TEXT");
38
+ await prisma.$executeRawUnsafe(
39
+ `CREATE INDEX IF NOT EXISTS "Project_productKey_idx" ON "Project"("productKey")`
40
+ );
41
+
42
+ await prisma.$executeRawUnsafe(
43
+ `CREATE TABLE IF NOT EXISTS "ProjectFact" (` +
44
+ `"id" TEXT NOT NULL PRIMARY KEY, ` +
45
+ `"projectId" TEXT NOT NULL, ` +
46
+ `"key" TEXT NOT NULL, ` +
47
+ `"value" TEXT NOT NULL, ` +
48
+ `"updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, ` +
49
+ `CONSTRAINT "ProjectFact_projectId_fkey" FOREIGN KEY ("projectId") ` +
50
+ `REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE)`
51
+ );
52
+ await prisma.$executeRawUnsafe(
53
+ `CREATE UNIQUE INDEX IF NOT EXISTS "ProjectFact_projectId_key_key" ON "ProjectFact"("projectId", "key")`
54
+ );
55
+ await prisma.$executeRawUnsafe(
56
+ `CREATE INDEX IF NOT EXISTS "ProjectFact_projectId_idx" ON "ProjectFact"("projectId")`
57
+ );
58
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * 产品组一等实体:ProductGroup 表 + Project.groupId,取代平级字符串 Project.productKey。
3
+ *
4
+ * 加性 raw SQL —— 绝不碰 notes_fts 虚表。幂等:建表/建索引用 IF NOT EXISTS,加列先 PRAGMA 查。
5
+ *
6
+ * 为什么没有 productKey→组的数据回填:
7
+ * 1. productKey 从未发布(无真实数据)。
8
+ * 2. Tower 升级生命周期(bin/tower.mjs preStart)**先** `db push --accept-data-loss`
9
+ * 按新 schema 同步、**再**跑本迁移。新 schema 已删 productKey,故 db push 会先
10
+ * 把该列连数据一起丢掉——等本迁移执行时 productKey 早已不存在,回填必成死代码。
11
+ * 迁移只负责把 groupId/ProductGroup 幂等建出来(供不走 db push 的 dev/迁移路径),
12
+ * 并清掉遗留的 productKey 列。删组时的「成员解绑」由 group-actions 在应用层做
13
+ * (ADD COLUMN 不带外键,不能靠 DB 级 onDelete: SetNull)。
14
+ *
15
+ * Table/column names hardcoded on purpose — a migration is a point-in-time snapshot.
16
+ */
17
+
18
+ import type { PrismaClient } from "@prisma/client";
19
+
20
+ async function hasColumn(prisma: PrismaClient, table: string, column: string): Promise<boolean> {
21
+ const cols = await prisma.$queryRawUnsafe<Array<{ name: string }>>(
22
+ `PRAGMA table_info("${table}")`
23
+ );
24
+ return Array.isArray(cols) && cols.some((c) => c.name === column);
25
+ }
26
+
27
+ export async function up(prisma: PrismaClient): Promise<void> {
28
+ // 1. ProductGroup 表
29
+ await prisma.$executeRawUnsafe(
30
+ `CREATE TABLE IF NOT EXISTS "ProductGroup" (` +
31
+ `"id" TEXT NOT NULL PRIMARY KEY, ` +
32
+ `"name" TEXT NOT NULL, ` +
33
+ `"description" TEXT, ` +
34
+ `"workspaceId" TEXT NOT NULL, ` +
35
+ `"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, ` +
36
+ `"updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, ` +
37
+ `CONSTRAINT "ProductGroup_workspaceId_fkey" FOREIGN KEY ("workspaceId") ` +
38
+ `REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE)`
39
+ );
40
+ await prisma.$executeRawUnsafe(
41
+ `CREATE UNIQUE INDEX IF NOT EXISTS "ProductGroup_workspaceId_name_key" ON "ProductGroup"("workspaceId", "name")`
42
+ );
43
+ await prisma.$executeRawUnsafe(
44
+ `CREATE INDEX IF NOT EXISTS "ProductGroup_workspaceId_idx" ON "ProductGroup"("workspaceId")`
45
+ );
46
+
47
+ // 2. Project.groupId 列 + 索引
48
+ if (!(await hasColumn(prisma, "Project", "groupId"))) {
49
+ await prisma.$executeRawUnsafe(`ALTER TABLE "Project" ADD COLUMN "groupId" TEXT`);
50
+ console.log(" added Project.groupId");
51
+ }
52
+ await prisma.$executeRawUnsafe(
53
+ `CREATE INDEX IF NOT EXISTS "Project_groupId_idx" ON "Project"("groupId")`
54
+ );
55
+
56
+ // 3. 清掉遗留 productKey 列(先删其索引)。无回填——见文件头说明。
57
+ // SQLite <3.35 不支持 DROP COLUMN → 留孤儿列,Prisma 忽略,无害。
58
+ await prisma.$executeRawUnsafe(`DROP INDEX IF EXISTS "Project_productKey_idx"`);
59
+ if (await hasColumn(prisma, "Project", "productKey")) {
60
+ try {
61
+ await prisma.$executeRawUnsafe(`ALTER TABLE "Project" DROP COLUMN "productKey"`);
62
+ console.log(" dropped Project.productKey");
63
+ } catch {
64
+ console.log(" DROP COLUMN productKey unsupported (old SQLite) — left orphaned, harmless");
65
+ }
66
+ }
67
+ }
@@ -52,6 +52,16 @@ to keep asking. If information is missing, ask a **specific** question instead o
52
52
  vaguely promising to act. If the user prods you ("did you create it?", "创建了吗"),
53
53
  it means your previous turn produced no tool call — issue the tool call now.
54
54
 
55
+ ## Session default scope
56
+
57
+ If a turn opens with `[当前会话默认范围:…]`, the user has bound this chat to a
58
+ workspace/project. Treat it as the **default scope**: for scope-needing actions
59
+ (create/list/search within a project, label, version…) use those ids directly
60
+ and skip resolving with `identify_project`/`search`. No binding present → resolve
61
+ scope the usual way. It's a soft default, **not a hard filter** — global requests
62
+ (daily summary, cross-workspace search, list all workspaces) ignore it. The user
63
+ switching workspace/project mid-chat overrides it; the latest prefix always wins.
64
+
55
65
  ## Scenarios
56
66
 
57
67
  ### "Show me my workspaces" / "List projects"
@@ -79,7 +89,7 @@ it means your previous turn produced no tool call — issue the tool call now.
79
89
  - **Pasted images with known paths**: if the platform provides file paths for pasted media (e.g. OpenClaw's `{{MediaPaths}}`, Claude Code temp files), pass those paths directly — they are local files
80
90
  - **Base64 only (no file path)**: if you only have base64 data with no local path, upload first via `manage_assets` with `action: "upload"`, `projectId`, `base64`, `mimeType`. Get back `{ id: assetId, path }`. Then pass the returned `path` in `references` — `create_task` will automatically copy and link the asset, no separate `link_task` needed
81
91
  - **`link_task` only for retroactive linking**: use `manage_assets` with `action: "link_task"` only when you need to associate existing assets with an already-created task (e.g. user wants to add references after task creation)
82
- 8. **Source (`## 来源`)** — ALWAYS append a `## 来源` section to the task `description` (see **Task Source** below for the full spec). If the incoming prompt carries no source info, it is literally `## 来源\n无`. If it does (especially a `<task-source>` block injected by a bridge like Feishu), standardize it into a detailed, traceable record.
92
+ 8. **Source (`## 来源`)** — ALWAYS end the `description` with a `## 来源` section (it's the last section of the description format — see **Task Description Format** for the rule and [references/task-source.md](references/task-source.md) for the full rendering). No source info literally `## 来源\n无`. Source present (a `<task-source>` bridge block or `TOWER_TASK_ID`) standardize into a detailed, traceable record.
83
93
  9. Call `create_task` with projectId, title, and optional description/priority/labelIds/subPath/versionId/useWorktree/baseBranch/references
84
94
  10. After creating: if `autoStart` resolved to true the task starts immediately (check the response's `execution` field — `autoStart` intent does not guarantee it actually started); otherwise the task stays TODO.
85
95
 
@@ -185,6 +195,9 @@ The `description` field supports Markdown. **Never copy the user's raw message a
185
195
 
186
196
  ## 备注
187
197
  - <constraints, edge cases, things to watch out for>
198
+
199
+ ## 来源
200
+
188
201
  ```
189
202
 
190
203
  Rules:
@@ -193,6 +206,14 @@ Rules:
193
206
  - Extract actionable requirements from the user's natural language
194
207
  - Omit sections that have no content (e.g. skip 备注 if nothing to note)
195
208
  - If user provides file paths, put them in 参考 section AND in `references` parameter
209
+ - **`## 来源` is mandatory and always the LAST section** — it traces *why* the task
210
+ exists and *who* asked. Every creation path (助手 / 飞书 / 父子派生 / 终端) ends here:
211
+ - **No source info** → write exactly `## 来源` + `无` (as shown above).
212
+ - **Source present** → standardize into a human-readable record, then read
213
+ [references/task-source.md](references/task-source.md) for the exact rendering.
214
+ Two triggers: `TOWER_TASK_ID` set (parent-derived child) or a `<task-source>`
215
+ block (bridge like Feishu). Keep hard locators (chat/msg id, link) verbatim; if
216
+ a `<task-source>` block is present, DROP the raw block from the description.
196
217
 
197
218
  ---
198
219
 
@@ -240,97 +261,6 @@ Note: the response does not include workspace name. Use the workspace name from
240
261
  | {id (first 8 chars)} | {title} | {status} | {priority} | {labels} |
241
262
  ```
242
263
 
243
- ### Task Source (`## 来源`)
244
-
245
- Every task created through this skill MUST end its `description` with a `## 来源`
246
- section so we can always trace **why** a task exists and **who** asked for it.
247
-
248
- **No source info in the prompt** → write exactly:
249
-
250
- ```
251
- ## 来源
252
-
253
- ```
254
-
255
- **Source info present** → standardize it into a human-readable record. Keep the
256
- hard locators (chat id / message id / link) verbatim — they are what makes the
257
- task traceable later.
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
-
276
- #### Bridge metadata contract (`<task-source>` block)
277
-
278
- External bridges (Feishu/Lark, etc.) inject a machine-readable block into the
279
- message. When you see it, parse it, render the standardized `## 来源`, and then
280
- DROP the raw block from the description (don't store the tags):
281
-
282
- ```
283
- <task-source>
284
- channel: feishu # 渠道 (feishu | openclaw | manual | ...)
285
- chat_name: 南京招生报名讨论群 # 群显示名
286
- chat_id: oc_xxxxxxxx # 群 ID(硬定位符,必带)
287
- occurred_at: 2026-06-16 17:49 +08:00 # 讨论/触发时间,带时区(用于进群后定位到具体那条)
288
- chat_link: https://applink.feishu.cn/client/chat/open?openChatId=oc_xxxxxxxx # 打开「群」的链接(群级,飞书无法精确到单条消息)
289
- trigger_message_id: om_xxxxxxxx # 触发那条消息的 ID(不可点,但唯一绑定该消息,必带;用于程序回读/去重/兜底)
290
- thread_root_id: om_yyyyyyyy # (可选)话题根消息 ID
291
- participants: # 参与者:显示名 + open_id + 角色
292
- - name: 张斯佳, open_id: ou_aaa, role: 讨论
293
- - name: 张瑶, open_id: ou_bbb, role: 讨论
294
- - name: 刘俊平, open_id: ou_ccc, role: 确认
295
- transcript: | # 相关消息原文(按时间)—— 人真正要看的内容,必带
296
- 17:49 张斯佳:有线下核验点,但无可预约时间,这里需要加提示么?
297
- 17:5x 张瑶:建议合并提示语「目前暂无线下审核点或没有可预约的时间…」
298
- 17:5x 刘俊平:可以处理
299
- summary: 线下核验点无可预约时间,确认合并提示语后处理 # (可选)一句话结论;缺省时由模型从 transcript 推
300
- </task-source>
301
- ```
302
-
303
- Roles are not required to be pre-computed by the bridge — if `role` is missing,
304
- infer it from the `transcript` (谁提出 / 谁讨论 / 谁拍板"可以处理"). If a
305
- `summary` is absent, derive it from the `transcript`.
306
-
307
- **Feishu reality** — `chat_link` only opens the **group**, not a single message.
308
- So the practical "go back and find it" combo is **群链接 + occurred_at + transcript**:
309
- open the group, jump to that time, the transcript is the actual content. Label the
310
- link line **打开群** (never "原始消息") so nobody expects a one-click jump to the
311
- exact message. `trigger_message_id` is kept as the only hard anchor to that
312
- message (not clickable — for programmatic re-read / dedup / fallback).
313
-
314
- #### Rendered `## 来源` format
315
-
316
- ```
317
- ## 来源
318
-
319
- - 渠道:飞书群「{chat_name}」
320
- - 时间:{occurred_at}
321
- - 参与者:{讨论者们}(讨论),{确认者}(确认可处理)
322
- - 讨论要点:{summary}
323
- - 打开群:{chat_link}
324
- - 溯源 ID:chat={chat_id} · msg={trigger_message_id}{ thread_root_id 时追加 · thread={thread_root_id}}
325
-
326
- 讨论摘录(按时间):
327
- {transcript}
328
- ```
329
-
330
- Only render lines whose data is present (e.g. omit `打开群` if there is no
331
- `chat_link`). Always keep `chat_id` + `trigger_message_id` (hard anchors) and the
332
- `讨论摘录`/`transcript` (the content humans actually read).
333
-
334
264
  ### Task Creation Confirmation
335
265
 
336
266
  After `create_task` succeeds, render based on the **response** (not the input
@@ -0,0 +1,80 @@
1
+ # Task Source (`## 来源`) — detailed rendering
2
+
3
+ Read this when the incoming prompt carries real source info — a parent-task
4
+ derivation (`TOWER_TASK_ID` set) or a `<task-source>` bridge block. For the
5
+ common "no source" case you don't need this file: just write `## 来源\n无`.
6
+
7
+ ## Parent task derivation (派生子任务)
8
+
9
+ If `TOWER_TASK_ID` is set in your environment (run `echo $TOWER_TASK_ID` to check),
10
+ you are operating **inside a Tower task terminal** — so any task you create here is
11
+ a **child task derived from the current (parent) task**. Render its source as:
12
+
13
+ ```
14
+ ## 来源
15
+
16
+ - 渠道:父任务派生
17
+ - 父任务:{当前任务标题,知道就填}(id: $TOWER_TASK_ID)
18
+ ```
19
+
20
+ Tower also records this link structurally on the new task's `parentTaskId`
21
+ automatically (used for parent→child completion notifications) — this `## 来源`
22
+ is just the human-readable mirror. The id alone is enough if you don't know the title.
23
+
24
+ ## Bridge metadata contract (`<task-source>` block)
25
+
26
+ External bridges (Feishu/Lark, etc.) inject a machine-readable block into the
27
+ message. When you see it, parse it, render the standardized `## 来源`, and then
28
+ DROP the raw block from the description (don't store the tags):
29
+
30
+ ```
31
+ <task-source>
32
+ channel: feishu # 渠道 (feishu | openclaw | manual | ...)
33
+ chat_name: 南京招生报名讨论群 # 群显示名
34
+ chat_id: oc_xxxxxxxx # 群 ID(硬定位符,必带)
35
+ occurred_at: 2026-06-16 17:49 +08:00 # 讨论/触发时间,带时区(用于进群后定位到具体那条)
36
+ chat_link: https://applink.feishu.cn/client/chat/open?openChatId=oc_xxxxxxxx # 打开「群」的链接(群级,飞书无法精确到单条消息)
37
+ trigger_message_id: om_xxxxxxxx # 触发那条消息的 ID(不可点,但唯一绑定该消息,必带;用于程序回读/去重/兜底)
38
+ thread_root_id: om_yyyyyyyy # (可选)话题根消息 ID
39
+ participants: # 参与者:显示名 + open_id + 角色
40
+ - name: 张斯佳, open_id: ou_aaa, role: 讨论
41
+ - name: 张瑶, open_id: ou_bbb, role: 讨论
42
+ - name: 刘俊平, open_id: ou_ccc, role: 确认
43
+ transcript: | # 相关消息原文(按时间)—— 人真正要看的内容,必带
44
+ 17:49 张斯佳:有线下核验点,但无可预约时间,这里需要加提示么?
45
+ 17:5x 张瑶:建议合并提示语「目前暂无线下审核点或没有可预约的时间…」
46
+ 17:5x 刘俊平:可以处理
47
+ summary: 线下核验点无可预约时间,确认合并提示语后处理 # (可选)一句话结论;缺省时由模型从 transcript 推
48
+ </task-source>
49
+ ```
50
+
51
+ Roles are not required to be pre-computed by the bridge — if `role` is missing,
52
+ infer it from the `transcript` (谁提出 / 谁讨论 / 谁拍板"可以处理"). If a
53
+ `summary` is absent, derive it from the `transcript`.
54
+
55
+ **Feishu reality** — `chat_link` only opens the **group**, not a single message.
56
+ So the practical "go back and find it" combo is **群链接 + occurred_at + transcript**:
57
+ open the group, jump to that time, the transcript is the actual content. Label the
58
+ link line **打开群** (never "原始消息") so nobody expects a one-click jump to the
59
+ exact message. `trigger_message_id` is kept as the only hard anchor to that
60
+ message (not clickable — for programmatic re-read / dedup / fallback).
61
+
62
+ ## Rendered `## 来源` format
63
+
64
+ ```
65
+ ## 来源
66
+
67
+ - 渠道:飞书群「{chat_name}」
68
+ - 时间:{occurred_at}
69
+ - 参与者:{讨论者们}(讨论),{确认者}(确认可处理)
70
+ - 讨论要点:{summary}
71
+ - 打开群:{chat_link}
72
+ - 溯源 ID:chat={chat_id} · msg={trigger_message_id}{ thread_root_id 时追加 · thread={thread_root_id}}
73
+
74
+ 讨论摘录(按时间):
75
+ {transcript}
76
+ ```
77
+
78
+ Only render lines whose data is present (e.g. omit `打开群` if there is no
79
+ `chat_link`). Always keep `chat_id` + `trigger_message_id` (hard anchors) and the
80
+ `讨论摘录`/`transcript` (the content humans actually read).
@@ -1,3 +0,0 @@
1
- module.exports=[874533,(e,o,r)=>{o.exports=e.x("node:child_process",()=>require("node:child_process"))},912714,(e,o,r)=>{o.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},980738,(e,o,r)=>{o.exports=e.x("node-pty-c710df912a232c01",()=>require("node-pty-c710df912a232c01"))}];
2
-
3
- //# sourceMappingURL=%5Bexternals%5D__0x_wqa7._.js.map
@@ -1,4 +0,0 @@
1
- module.exports=[427699,(e,r,t)=>{r.exports=e.x("events",()=>require("events"))},687769,(e,r,t)=>{r.exports=e.x("node:events",()=>require("node:events"))},81111,(e,r,t)=>{r.exports=e.x("node:stream",()=>require("node:stream"))},899871,(e,r,t)=>{r.exports=e.x("node:string_decoder",()=>require("node:string_decoder"))},449719,(e,r,t)=>{r.exports=e.x("assert",()=>require("assert"))},500874,(e,r,t)=>{r.exports=e.x("buffer",()=>require("buffer"))},406461,(e,r,t)=>{r.exports=e.x("zlib",()=>require("zlib"))},57328,(e,r,t)=>{r.exports=e.x("node:assert",()=>require("node:assert"))},433541,e=>e.a(async(r,t)=>{try{let r=await e.y("ws-4df7fc762dfa9a52");e.n(r),t()}catch(e){t(e)}},!0),504446,(e,r,t)=>{r.exports=e.x("net",()=>require("net"))},750227,(e,r,t)=>{r.exports=e.x("node:path",()=>require("node:path"))},902157,(e,r,t)=>{r.exports=e.x("node:fs",()=>require("node:fs"))},660526,(e,r,t)=>{r.exports=e.x("node:os",()=>require("node:os"))},666680,(e,r,t)=>{r.exports=e.x("node:crypto",()=>require("node:crypto"))},933919,(e,r,t)=>{r.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},522734,(e,r,t)=>{r.exports=e.x("fs",()=>require("fs"))},814747,(e,r,t)=>{r.exports=e.x("path",()=>require("path"))},446786,(e,r,t)=>{r.exports=e.x("os",()=>require("os"))},874533,(e,r,t)=>{r.exports=e.x("node:child_process",()=>require("node:child_process"))},912714,(e,r,t)=>{r.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},980738,(e,r,t)=>{r.exports=e.x("node-pty-c710df912a232c01",()=>require("node-pty-c710df912a232c01"))},192520,e=>{"use strict";let r;var t=e.i(750227),s=e.i(660526),n=e.i(666680),o=e.i(902157);function i(){return r||(r=process.env.TOWER_DATA_DIR||(0,t.join)((0,s.homedir)(),".tower"),(0,o.existsSync)(r)||(0,o.mkdirSync)(r,{recursive:!0})),r}e.s(["getAssistantDir",0,function(){let e=(0,t.join)(i(),"assistant");return(0,o.existsSync)(e)||(0,o.mkdirSync)(e,{recursive:!0}),e},"getBackupsDir",0,function(){let e=(0,t.join)(i(),"backups");return(0,o.existsSync)(e)||(0,o.mkdirSync)(e,{recursive:!0}),e},"getExtensionsDir",0,function(){let e=(0,t.join)(i(),"extensions");return(0,o.existsSync)(e)||(0,o.mkdirSync)(e,{recursive:!0}),e},"getSignalDir",0,function(){let e=process.env.TOWER_DATA_DIR||(0,t.join)((0,s.homedir)(),".tower"),r=(0,n.createHash)("sha256").update(e).digest("hex").slice(0,16);return(0,t.join)((0,s.tmpdir)(),"tower-signals",r)},"getStorageDir",0,function(){let e=process.env.TOWER_STORAGE_DIR||function(){try{let e=(0,o.readFileSync)((0,t.join)(i(),"storage-location"),"utf-8").trim();return e.length>0?e:null}catch{return null}}(),r=e&&e.length>0?e:(0,t.join)(i(),"storage");return(0,o.existsSync)(r)||(0,o.mkdirSync)(r,{recursive:!0}),r},"getTowerDbFilePath",0,function(){let e=process.env.TOWER_DATA_DIR||(0,t.join)((0,s.homedir)(),".tower");return(0,t.join)(e,"database","tower.db")},"getTowerDbPath",0,function(){let e;return(0,t.join)((e=(0,t.join)(i(),"database"),(0,o.existsSync)(e)||(0,o.mkdirSync)(e,{recursive:!0}),e),"tower.db")},"getTowerDir",0,i])},843793,e=>{"use strict";var r=e.i(933919),t=e.i(192520);let s=globalThis.prisma??new r.PrismaClient({datasourceUrl:`file:${(0,t.getTowerDbFilePath)()}`,log:[]});process.on("SIGTERM",()=>{s.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{s.$disconnect().catch(()=>{})}),e.s(["db",0,s])},193695,(e,r,t)=>{r.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},918622,(e,r,t)=>{r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},556704,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},270406,(e,r,t)=>{r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},324725,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},198840,e=>{"use strict";var r=e.i(855104);let t=["localhost","127.0.0.1","[::1]"],s=new Set(["127.0.0.1","::1","::ffff:127.0.0.1"]),n=/^c[a-z0-9]{20,30}$/;e.s(["requireLocalhost",0,function(e){let n=e.headers.get("x-forwarded-for");if(n&&!n.split(",").map(e=>e.trim()).every(e=>s.has(e)))return r.NextResponse.json({error:"Forbidden"},{status:403});let o=e.headers.get("host")??"";return t.some(e=>o.startsWith(e))?null:r.NextResponse.json({error:"Forbidden"},{status:403})},"validateProjectId",0,function(e){return n.test(e)?null:r.NextResponse.json({error:"Invalid projectId format"},{status:400})},"validateTaskId",0,function(e){return n.test(e)?null:r.NextResponse.json({error:"Invalid taskId format"},{status:400})}])},572173,e=>{"use strict";var r=e.i(843793);async function t(e,t){let s=await r.db.systemConfig.findUnique({where:{key:e}});if(!s)return t;try{return JSON.parse(s.value)}catch{return t}}e.s(["readConfigValue",0,t])},482819,(e,r,t)=>{"use strict";r.exports=e.r(583981).vendored["react-rsc"].ReactServerDOMTurbopackServer},921675,(e,r,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"registerServerReference",{enumerable:!0,get:function(){return s.registerServerReference}});let s=e.r(482819)},86708,(e,r,t)=>{"use strict";function s(e){for(let r=0;r<e.length;r++){let t=e[r];if("function"!=typeof t)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof t}.
2
- Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(t,"__esModule",{value:!0}),Object.defineProperty(t,"ensureServerEntryExports",{enumerable:!0,get:function(){return s}})},658053,e=>{"use strict";e.s(["ASSISTANT_SESSION_KEY",0,"__assistant__"])}];
3
-
4
- //# sourceMappingURL=%5Broot-of-the-server%5D__034jopu._.js.map
@@ -1,4 +0,0 @@
1
- module.exports=[750227,(e,t,r)=>{t.exports=e.x("node:path",()=>require("node:path"))},902157,(e,t,r)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},660526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},666680,(e,t,r)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},933919,(e,t,r)=>{t.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},874533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},912714,(e,t,r)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},980738,(e,t,r)=>{t.exports=e.x("node-pty-c710df912a232c01",()=>require("node-pty-c710df912a232c01"))},522734,(e,t,r)=>{t.exports=e.x("fs",()=>require("fs"))},233405,(e,t,r)=>{t.exports=e.x("child_process",()=>require("child_process"))},814747,(e,t,r)=>{t.exports=e.x("path",()=>require("path"))},446786,(e,t,r)=>{t.exports=e.x("os",()=>require("os"))},924868,(e,t,r)=>{t.exports=e.x("fs/promises",()=>require("fs/promises"))},483832,e=>{"use strict";var t=e.i(765876),r=e.i(675896),a=e.i(959160),n=e.i(97944),s=e.i(86757),o=e.i(204144),i=e.i(273436),l=e.i(743641),u=e.i(813766),d=e.i(840884),p=e.i(498814),c=e.i(780006),h=e.i(544432),v=e.i(772005),f=e.i(450223),R=e.i(193695);e.i(628400);var m=e.i(800071),x=e.i(855104),w=e.i(198840),y=e.i(843793),g=e.i(108789),E=e.i(756264);let _=e.i(50377).logger.create("harness-reply"),N=process.env.PORT??"3000";async function P(e){let t,r,a=(0,w.requireLocalhost)(e);if(a)return a;try{t=await e.json()}catch{return x.NextResponse.json({error:"Invalid JSON"},{status:400})}let n=!1!==t.allowRetry,{text:s}=t;if(!s||"string"!=typeof s)return x.NextResponse.json({error:"text required"},{status:400});if(!t.taskId)return x.NextResponse.json({error:"taskId required"},{status:400});let o=(0,w.validateTaskId)(t.taskId);if(o)return o;let i=t.taskId,l=null,u=await (0,g.getOpenAsk)(i);if(u){if(!await (0,g.answerOpenAsk)(i,s))return x.NextResponse.json({ok:!0,deduped:!0});l=u.content}else{let e=await (0,g.getLatestAsk)(i);if(!n||!e||"ANSWERED"!==e.state)return x.NextResponse.json({error:"No open ask for this task"},{status:409});l=e.content}await y.db.taskExecution.updateMany({where:{taskId:i,status:"PAUSED"},data:{status:"RUNNING",endedAt:null}});try{r=(await (0,E.continueOrStartTaskExecution)(i)).mode}catch(e){return _.error("resume failed on reply — ask kept ANSWERED for retry",e,{taskId:i}),x.NextResponse.json({error:"resume failed"},{status:500})}let d="started"===r&&l?`[针对你之前的提问:${l}]
2
- ${s}`:s,p=await A(i,d);return x.NextResponse.json({ok:!0,taskId:i,mode:r,injected:p})}async function A(e,t){let r=encodeURIComponent(e);await new Promise(e=>setTimeout(e,2500));for(let e=0;e<20;e++){try{if((await fetch(`http://localhost:${N}/api/internal/terminal/${r}/input`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({text:t,submit:!0})})).ok)return!0}catch{}await new Promise(e=>setTimeout(e,800))}return!1}e.s(["POST",0,P,"dynamic",0,"force-dynamic","runtime",0,"nodejs"],491789);var C=e.i(491789);let k=new t.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/internal/harness/reply/route",pathname:"/api/internal/harness/reply",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/internal/harness/reply/route.ts",nextConfigOutput:"standalone",userland:C}),{workAsyncStorage:q,workUnitAsyncStorage:T,serverHooks:S}=k;async function b(e,t,a){a.requestMeta&&(0,n.setRequestMeta)(e,a.requestMeta),k.isDev&&(0,n.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let x="/api/internal/harness/reply/route";x=x.replace(/\/index$/,"")||"/";let w=await k.prepare(e,t,{srcPage:x,multiZoneDraftMode:!1});if(!w)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:y,params:g,nextConfig:E,parsedUrl:_,isDraftMode:N,prerenderManifest:P,routerServerContext:A,isOnDemandRevalidate:C,revalidateOnlyGenerated:q,resolvedPathname:T,clientReferenceManifest:S,serverActionsManifest:b}=w,O=(0,i.normalizeAppPath)(x),I=!!(P.dynamicRoutes[O]||P.routes[T]),j=async()=>((null==A?void 0:A.render404)?await A.render404(e,t,_,!1):t.end("This page could not be found"),null);if(I&&!N){let e=!!P.routes[T],t=P.dynamicRoutes[O];if(t&&!1===t.fallback&&!e){if(E.adapterPath)return await j();throw new R.NoFallbackError}}let U=null;!I||k.isDev||N||(U="/index"===(U=T)?"/":U);let H=!0===k.isDev||!I,D=I&&!H;b&&S&&(0,o.setManifestsSingleton)({page:x,clientReferenceManifest:S,serverActionsManifest:b});let M=e.method||"GET",$=(0,s.getTracer)(),F=$.getActiveScopeSpan(),K=!!(null==A?void 0:A.isWrappedByNextServer),L=!!(0,n.getRequestMeta)(e,"minimalMode"),B=(0,n.getRequestMeta)(e,"incrementalCache")||await k.getIncrementalCache(e,E,P,L);null==B||B.resetRequestCache(),globalThis.__incrementalCache=B;let W={params:g,previewProps:P.preview,renderOpts:{experimental:{authInterrupts:!!E.experimental.authInterrupts},cacheComponents:!!E.cacheComponents,supportsDynamicResponse:H,incrementalCache:B,cacheLifeProfiles:E.cacheLife,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>k.onRequestError(e,t,a,n,A)},sharedContext:{buildId:y}},G=new l.NodeNextRequest(e),V=new l.NodeNextResponse(t),X=u.NextRequestAdapter.fromNodeNextRequest(G,(0,u.signalFromNodeResponse)(t));try{let n,o=async e=>k.handle(X,W).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=$.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let a=r.get("next.route");if(a){let t=`${M} ${a}`;e.setAttributes({"next.route":a,"http.route":a,"next.span_name":t}),e.updateName(t),n&&n!==e&&(n.setAttribute("http.route",a),n.updateName(t))}else e.updateName(`${M} ${x}`)}),i=async n=>{var s,i;let l=async({previousCacheEntry:r})=>{try{if(!L&&C&&q&&!r)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let s=await o(n);e.fetchMetrics=W.renderOpts.fetchMetrics;let i=W.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let l=W.renderOpts.collectedTags;if(!I)return await (0,c.sendResponse)(G,V,s,W.renderOpts.pendingWaitUntil),null;{let e=await s.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(s.headers);l&&(t[f.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==W.renderOpts.collectedRevalidate&&!(W.renderOpts.collectedRevalidate>=f.INFINITE_CACHE)&&W.renderOpts.collectedRevalidate,a=void 0===W.renderOpts.collectedExpire||W.renderOpts.collectedExpire>=f.INFINITE_CACHE?void 0:W.renderOpts.collectedExpire;return{value:{kind:m.CachedRouteKind.APP_ROUTE,status:s.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:a}}}}catch(t){throw(null==r?void 0:r.isStale)&&await k.onRequestError(e,t,{routerKind:"App Router",routePath:x,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:C})},!1,A),t}},u=await k.handleResponse({req:e,nextConfig:E,cacheKey:U,routeKind:r.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:P,isRoutePPREnabled:!1,isOnDemandRevalidate:C,revalidateOnlyGenerated:q,responseGenerator:l,waitUntil:a.waitUntil,isMinimalMode:L});if(!I)return null;if((null==u||null==(s=u.value)?void 0:s.kind)!==m.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==u||null==(i=u.value)?void 0:i.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});L||t.setHeader("x-nextjs-cache",C?"REVALIDATED":u.isMiss?"MISS":u.isStale?"STALE":"HIT"),N&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let d=(0,h.fromNodeOutgoingHttpHeaders)(u.value.headers);return L&&I||d.delete(f.NEXT_CACHE_TAGS_HEADER),!u.cacheControl||t.getHeader("Cache-Control")||d.get("Cache-Control")||d.set("Cache-Control",(0,v.getCacheControlHeader)(u.cacheControl)),await (0,c.sendResponse)(G,V,new Response(u.value.body,{headers:d,status:u.value.status||200})),null};K&&F?await i(F):(n=$.getActiveScopeSpan(),await $.withPropagatedContext(e.headers,()=>$.trace(d.BaseServerSpan.handleRequest,{spanName:`${M} ${x}`,kind:s.SpanKind.SERVER,attributes:{"http.method":M,"http.target":e.url}},i),void 0,!K))}catch(t){if(t instanceof R.NoFallbackError||await k.onRequestError(e,t,{routerKind:"App Router",routePath:O,routeType:"route",revalidateReason:(0,p.getRevalidateReason)({isStaticGeneration:D,isOnDemandRevalidate:C})},!1,A),I)throw t;return await (0,c.sendResponse)(G,V,new Response(null,{status:500})),null}}e.s(["handler",0,b,"patchFetch",0,function(){return(0,a.patchFetch)({workAsyncStorage:q,workUnitAsyncStorage:T})},"routeModule",0,k,"serverHooks",0,S,"workAsyncStorage",0,q,"workUnitAsyncStorage",0,T],483832)},482848,e=>{e.v(e=>Promise.resolve().then(()=>e(874533)))},268548,e=>{e.v(t=>Promise.all(["server/chunks/[externals]_node_util_0xr.y7p._.js"].map(t=>e.l(t))).then(()=>t(812057)))},144264,e=>{e.v(e=>Promise.resolve().then(()=>e(233405)))},534777,e=>{e.v(t=>Promise.all(["server/chunks/[externals]_util_0wtvqkc._.js"].map(t=>e.l(t))).then(()=>t(224361)))},200628,e=>{e.v(e=>Promise.resolve().then(()=>e(769310)))},217260,e=>{e.v(e=>Promise.resolve().then(()=>e(83721)))},507603,e=>{e.v(t=>Promise.all(["server/chunks/_0tidm8l._.js"].map(t=>e.l(t))).then(()=>t(283373)))},136565,e=>{e.v(t=>Promise.all(["server/chunks/src_0gif-f5._.js"].map(t=>e.l(t))).then(()=>t(215624)))},75010,e=>{e.v(t=>Promise.all(["server/chunks/src_lib_config-defaults_ts_10ayktg._.js"].map(t=>e.l(t))).then(()=>t(276534)))},260815,e=>{e.v(e=>Promise.resolve().then(()=>e(924868)))}];
3
-
4
- //# sourceMappingURL=%5Broot-of-the-server%5D__08-s.nv._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[874533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},769310,e=>{"use strict";var t=e.i(902157),r=e.i(874533),n=e.i(750227);function o(e=process.platform){return"win32"===e}function s(e){let t=e.replace(/\r\n|\r|\n/g," ");if(!t.length)return'""';let r=t.replace(/"/g,'""');return/[\s"&<>|^()]/.test(r)?`"${r}"`:r}let i=["CLAUDECODE","CLAUDE_CODE_ENTRYPOINT","CLAUDE_CODE_SESSION","CLAUDE_CODE_PARENT_SESSION"];async function a(e,t={}){let r=t.cwd??process.cwd(),s=t.env??process.env,i=t.platform??process.platform;if(e.includes("/")||e.includes("\\")){let t=n.default.isAbsolute(e)?e:n.default.resolve(r,e);return await u(t,i)?t:null}let l=s.PATH??s.Path??"",c=o(i)?";":":",m=l.split(c).filter(Boolean),d=o(i)?(s.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""],p=o(i)&&n.default.extname(e).length>0;for(let t of m)for(let r of o(i)?p?[n.default.join(t,e)]:d.map(r=>n.default.join(t,`${e}${r}`)):[n.default.join(t,e)])if(await u(r,i))return r;return null}let l=e=>(0,r.execSync)(e,{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]});function c(e,t=process.platform,s=l){if(n.default.extname(e)||e.includes("/")||e.includes("\\"))return e;if(!o(t)){try{let t=(0,r.execFileSync)("which",[e],{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim();if(t)return t}catch{}return e}try{let t=s(`where ${e}`).trim().split("\n").map(e=>e.trim()).filter(Boolean),r=t.find(e=>/\.(cmd|bat|exe)$/i.test(e));if(r)return r;if(t.length>0)return t[0]}catch{}return e}async function m(e,t,r={}){let n=r.env??process.env,o=r.platform??process.platform;return d(await a(e,r)??e,t,n,o)}function d(e,t,r,i){if(!o(i))return{command:e,args:t};let a=n.default.extname(e).toLowerCase();return".cmd"===a||".bat"===a||".com"===a?{command:r.ComSpec||"cmd.exe",args:["/d","/s","/c",[s(e),...t.map(s)].join(" ")]}:{command:e,args:t}}async function u(e,r=process.platform){try{return await t.promises.access(e,o(r)?t.constants.F_OK:t.constants.X_OK),!0}catch{return!1}}async function p(e=process.platform){return o(e)?f():h()}async function h(){try{let e=await t.promises.readFile("/etc/shells","utf-8"),r=[],o=new Map;for(let t of e.split("\n")){let e=t.replace(/#.*/,"").trim();if(!e||!e.startsWith("/")||!await u(e))continue;let s=n.default.basename(e),i=o.get(s)??0;o.set(s,i+1),i>0&&(s=`${s} (${i+1})`),r.push({name:s,path:e})}return r}catch{let e=[];for(let t of["/bin/zsh","/bin/bash","/bin/sh"])await u(t)&&e.push({name:n.default.basename(t),path:t});return e}}async function f(){let e=[],t=[],r=await a("git",{platform:"win32"});if(r){let e=n.default.resolve(n.default.dirname(r),"..","..");t.push(n.default.join(e,"bin","bash.exe"),n.default.join(e,"usr","bin","bash.exe"))}for(let e of[process.env.ProgramW6432,process.env.ProgramFiles,process.env["ProgramFiles(x86)"],process.env.LocalAppData?n.default.join(process.env.LocalAppData,"Programs"):null].filter(Boolean))t.push(n.default.join(e,"Git","bin","bash.exe"),n.default.join(e,"Git","usr","bin","bash.exe"));let o=process.env.USERPROFILE??"";for(let r of(o&&t.push(n.default.join(o,"scoop","apps","git","current","bin","bash.exe")),process.env.CLAUDE_CODE_GIT_BASH_PATH&&t.unshift(process.env.CLAUDE_CODE_GIT_BASH_PATH),t))if(await u(r,"win32")){e.push({name:"Git Bash",path:r});break}let s=await a("pwsh",{platform:"win32"});s&&e.push({name:"PowerShell",path:s});let i=process.env.windir??"C:\\WINDOWS",l=n.default.join(i,"System32","WindowsPowerShell","v1.0","powershell.exe");await u(l,"win32")&&e.push({name:"Windows PowerShell",path:l});let c=process.env.ComSpec??n.default.join(i,"System32","cmd.exe");return await u(c,"win32")&&e.push({name:"Command Prompt",path:c}),e}let g=[{name:"Terminal",bundleName:"Terminal"},{name:"iTerm2",bundleName:"iTerm"},{name:"Warp",bundleName:"Warp"},{name:"Alacritty",bundleName:"Alacritty"},{name:"WezTerm",bundleName:"WezTerm"},{name:"kitty",bundleName:"kitty"},{name:"Hyper",bundleName:"Hyper"}];async function w(e=process.platform){if("darwin"===e){let t=[];for(let r of g){let n=await u(`/Applications/${r.bundleName}.app`,e);t.push({name:r.name,value:r.bundleName,installed:n})}return t}if(o(e)){let t=[],r=await a("wt",{platform:e});return r&&t.push({name:"Windows Terminal",value:r,installed:!0}),t}return[]}let S=[{name:"VS Code",command:"code"},{name:"VS Code Insiders",command:"code-insiders"},{name:"Cursor",command:"cursor"},{name:"Windsurf",command:"windsurf"},{name:"Zed",command:"zed"},{name:"Sublime Text",command:"subl"},{name:"IntelliJ IDEA",command:"idea"},{name:"WebStorm",command:"webstorm"},{name:"PyCharm",command:"pycharm"},{name:"GoLand",command:"goland"},{name:"RubyMine",command:"rubymine"},{name:"PhpStorm",command:"phpstorm"},{name:"CLion",command:"clion"},{name:"Rider",command:"rider"}],k={code:{darwin:["/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"],win32:["%LOCALAPPDATA%\\Programs\\Microsoft VS Code\\bin\\code.cmd","%ProgramFiles%\\Microsoft VS Code\\bin\\code.cmd"]},"code-insiders":{darwin:["/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders"],win32:["%LOCALAPPDATA%\\Programs\\Microsoft VS Code Insiders\\bin\\code-insiders.cmd","%ProgramFiles%\\Microsoft VS Code Insiders\\bin\\code-insiders.cmd"]},cursor:{darwin:["/Applications/Cursor.app/Contents/Resources/app/bin/cursor"],win32:["%LOCALAPPDATA%\\Programs\\cursor\\resources\\app\\bin\\cursor.cmd"]},windsurf:{darwin:["/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"],win32:["%LOCALAPPDATA%\\Programs\\Windsurf\\bin\\windsurf.cmd"]},zed:{darwin:["/Applications/Zed.app/Contents/MacOS/cli"]},subl:{darwin:["/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"],win32:["%ProgramFiles%\\Sublime Text\\subl.exe","%ProgramFiles%\\Sublime Text 3\\subl.exe"]},idea:{darwin:["/Applications/IntelliJ IDEA.app/Contents/MacOS/idea","/Applications/IntelliJ IDEA CE.app/Contents/MacOS/idea"]},webstorm:{darwin:["/Applications/WebStorm.app/Contents/MacOS/webstorm"]},pycharm:{darwin:["/Applications/PyCharm.app/Contents/MacOS/pycharm","/Applications/PyCharm CE.app/Contents/MacOS/pycharm"]},goland:{darwin:["/Applications/GoLand.app/Contents/MacOS/goland"]},rubymine:{darwin:["/Applications/RubyMine.app/Contents/MacOS/rubymine"]},phpstorm:{darwin:["/Applications/PhpStorm.app/Contents/MacOS/phpstorm"]},clion:{darwin:["/Applications/CLion.app/Contents/MacOS/clion"]},rider:{darwin:["/Applications/Rider.app/Contents/MacOS/rider"]}};async function y(e,t={}){let r=t.platform??process.platform,n=t.env??process.env,s=await a(e,t);if(s)return s;for(let t of k[e]?.[r]??[]){let e=o(r)?function(e,t){return e.replace(/%([^%]+)%/g,(e,r)=>{let n=t[r];if(void 0!==n)return n;let o=Object.keys(t).find(e=>e.toLowerCase()===r.toLowerCase());return o?t[o]??e:e})}(t,n):t;if(await u(e,r))return e}return null}async function C(e=process.platform){let t=[];for(let r of S){let n=!!await y(r.command,{platform:e});t.push({name:r.name,command:r.command,installed:n})}return t}e.s(["detectEditors",0,C,"detectShells",0,p,"detectTerminalApps",0,w,"ensurePathInEnv",0,function(e,t=process.platform){let r=o(t)?"Path":"PATH";return(e.PATH??e.Path??"").length>0?e:{...e,[r]:function(e=process.platform){return o(e)?"C:\\Windows\\System32;C:\\Windows;C:\\Windows\\System32\\Wbem":"/usr/local/bin:/opt/homebrew/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin"}(t)}},"isWindows",0,o,"resolveCommandPath",0,a,"resolveCommandPathSync",0,c,"resolveSdkExecutable",0,function(e,r=process.platform,s=e=>(0,t.readFileSync)(e,"utf-8"),i=e=>(0,t.existsSync)(e)){if(!o(r))return e;let a=n.default.extname(e).toLowerCase();if(".cmd"!==a&&".bat"!==a)return e;let l=n.default.win32.dirname(e),c="",m=e=>{let t=e.replace(/%~?dp0%/gi,l).replace(/\//g,"\\");return n.default.win32.isAbsolute(t)?n.default.win32.normalize(t):n.default.win32.resolve(l,t)};try{let t=s(e);c=t.replace(/\s+/g," ").slice(0,400);let r=t.match(/"([^"]*\.(?:c?js|mjs))"/i);if(r){let e=m(r[1]);if(i(e))return e;console.error(`[resolveSdkExecutable] parsed cli="${e}" but it doesn't exist`)}for(let e of t.matchAll(/"([^"]*\.exe)"/gi)){let t=m(e[1]);if("node.exe"!==n.default.win32.basename(t).toLowerCase()&&i(t))return t}}catch(e){console.error(`[resolveSdkExecutable] shim read failed: ${e instanceof Error?e.message:e}`)}let d=n.default.win32.join(l,"node_modules","@anthropic-ai","claude-code"),u=n.default.win32.basename(e,n.default.win32.extname(e)),p=[n.default.win32.join(d,"cli.js"),n.default.win32.join(d,"bin",`${u}.exe`)];for(let e of p)if(i(e))return e;return console.error(`[resolveSdkExecutable] could not convert ${e} → guesses=${JSON.stringify(p)} shim="${c}"`),e},"resolveSpawnTarget",0,m,"resolveSpawnTargetSync",0,function(e,t,r=process.platform,n){return d(c(e,r,n),t,process.env,r)},"stripClaudeNestingEnv",0,function(e){let t={...e};for(let e of i)delete t[e];return t}])},53674,e=>{"use strict";e.s(["getPackageRoot",0,function(){return process.env.TOWER_PACKAGE_ROOT||process.cwd()}])},472129,e=>{"use strict";var t=e.i(902157),r=e.i(660526),n=e.i(750227),o=e.i(769310),s=e.i(53674);let i=["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"];e.s(["ClaudeCliAdapter",0,class{buildSpawnArgs(e){let t=["--dangerously-skip-permissions"];e.extraArgs?.length&&t.push(...e.extraArgs),e.resumeSessionId?t.push("--resume",e.resumeSessionId):e.continueLatest?t.push("--continue"):e.prompt&&t.push(e.prompt);let r={...e.envOverrides??{}};return{command:this.resolveCommand(),args:t,env:r}}buildEnvOverrides(e){let t={TOWER_TASK_ID:e.taskId,TOWER_TASK_TITLE:e.taskTitle,TOWER_STARTED_AT:new Date().toISOString(),TOWER_API_URL:e.apiUrl};return e.callbackUrl&&(t.CALLBACK_URL=e.callbackUrl),t}async installHooks(e){try{let e=this.readSettings(),t=e.hooks??{},r=(0,s.getPackageRoot)().replace(/\\/g,"/"),o=n.join(r,"scripts","tower-session-start-hook.js").replace(/\\/g,"/"),i=n.join(r,"scripts","tower-post-tool-hook.js").replace(/\\/g,"/"),a=n.join(r,"scripts","tower-stop-hook.js").replace(/\\/g,"/"),l=!1;return l=this.upsertHook(t,"SessionStart","session-start-hook.js",{hooks:[{command:`node "${o}"`,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??{},r=(0,s.getPackageRoot)().replace(/\\/g,"/"),o=!1;for(let[e,s,i]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(s)));if(l<0)continue;let c=n.join(r,"scripts",i).replace(/\\/g,"/"),m=`node "${c}"`,d=a[l]?.hooks?.[0];d&&d.command!==m&&(d.command=m,t[e]=a,o=!0)}o&&(e.hooks=t,this.writeSettings(e))}catch{}}upsertHook(e,t,r,n){let o=this.getHookArray(e,t),s=n?.hooks?.[0]?.command,i=o.findIndex(e=>e?.hooks?.some?.(e=>e.command?.includes(r)));if(i>=0){if(o[i]?.hooks?.[0]?.command===s)return!1;o.splice(i,1)}return o.push(n),e[t]=o,!0}async uninstallHooks(){try{let e=this.readSettings(),t=e.hooks??{},r=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let e of["SessionStart","PostToolUse","Stop"]){let n=this.getHookArray(t,e);t[e]=n.filter(e=>!e.hooks?.some(e=>r.some(t=>e.command?.includes(t))))}return e.hooks=t,this.writeSettings(e),{ok:!0,method:"file",detail:this.getSettingsPath()}}catch(e){return{ok:!1,method:"file",detail:this.getSettingsPath(),error:e instanceof Error?e.message:String(e)}}}async isHooksInstalled(){let e=this.readSettings().hooks??{},t=this.getHookArray(e,"PostToolUse");return this.hasHook(t,"post-tool-hook.js")}async installMcp(e,t={}){let r=t.scope??"user",n={command:e.command,args:e.args};e.env&&Object.keys(e.env).length>0&&(n.env=e.env);let o=this.resolveCommand(),s=["mcp","add-json","-s",r,e.name,JSON.stringify(n)];try{return await this.runCli(o,["mcp","remove","-s",r,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 r=t.scope??"user",n=this.resolveCommand(),o=["mcp","remove","-s",r,e];try{return await this.runCli(n,o,t.cwd),{ok:!0,method:"cli",detail:`${n} ${o.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${n} ${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,r){let s=n.join(this.getConfigDir(),"skills",e);try{if(!t.existsSync(r))return{ok:!1,method:"symlink",detail:s,error:`Source skill dir does not exist: ${r}`};t.mkdirSync(n.dirname(s),{recursive:!0});let e=await t.promises.lstat(s).catch(()=>null);if(e)if(!(e.isSymbolicLink()||(0,o.isWindows)()&&e.isDirectory()))return{ok:!1,method:"symlink",detail:s,error:`Refusing to overwrite non-symlink at ${s}`};else try{let e=await t.promises.readlink(s);if(n.resolve(e)===n.resolve(r))return{ok:!0,method:"symlink",detail:`${s} → ${r} (already)`};await t.promises.unlink(s)}catch{if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:s,error:`Refusing to overwrite non-symlink at ${s}`}}let i=(0,o.isWindows)()?"junction":"dir";return await t.promises.symlink(r,s,i),{ok:!0,method:"symlink",detail:`${s} → ${r}`}}catch(e){return{ok:!1,method:"symlink",detail:s,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let r=n.join(this.getConfigDir(),"skills",e);try{let e=await t.promises.lstat(r).catch(()=>null);if(!e)return{ok:!0,method:"symlink",detail:`${r} (already absent)`};if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:r,error:`Refusing to remove non-symlink at ${r}`};return await t.promises.unlink(r),{ok:!0,method:"symlink",detail:r}}catch(e){return{ok:!1,method:"symlink",detail:r,error:e instanceof Error?e.message:String(e)}}}async isSkillInstalled(e,r){let o=n.join(this.getConfigDir(),"skills",e);try{if(!(await t.promises.lstat(o)).isSymbolicLink())return!1;if(!r)return!0;let e=await t.promises.readlink(o),s=n.isAbsolute(e)?e:n.resolve(n.dirname(o),e);return n.resolve(s)===n.resolve(r)}catch{return!1}}async runCli(t,r,n,o=1e4){let{execFile:s}=await e.A(482848),{promisify:i}=await e.A(268548),a=i(s),{stdout:l}=await a(t,r,{cwd:n,timeout:o});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:t}=await e.A(144264),{promisify:r}=await e.A(534777),{resolveSpawnTarget:n}=await e.A(200628),o=r(t),s=await n(this.resolveCommand(),["--version"]),{stdout:i}=await o(s.command,s.args,{timeout:5e3});return i.trim()||null}catch{return null}}async getModels(){return i}getConfigDir(){return n.join(r.homedir(),".claude")}getSettingsPath(){return n.join(this.getConfigDir(),"settings.json")}getSessionsDir(){return n.join(this.getConfigDir(),"projects")}getApiKeyInfo(){return{envVar:"ANTHROPIC_API_KEY",required:!1}}buildHelloProbeArgs(e){return{command:this.resolveCommand(),args:["--print",e,"--output-format","stream-json","--verbose"]}}resolveCommand(){if(process.env.CLAUDE_CODE_PATH)return process.env.CLAUDE_CODE_PATH;if((0,o.isWindows)()){let e=(0,o.resolveCommandPathSync)("claude-code");if("claude-code"!==e)return e}return(0,o.resolveCommandPathSync)("claude")}readSettings(){try{return JSON.parse(t.readFileSync(this.getSettingsPath(),"utf-8"))}catch{return{}}}writeSettings(e){let r=this.getConfigDir();t.existsSync(r)||t.mkdirSync(r,{recursive:!0}),t.writeFileSync(this.getSettingsPath(),JSON.stringify(e,null,2),"utf-8")}getHookArray(e,t){let r=e[t];return Array.isArray(r)?r:[]}hasHook(e,t){return e.some(e=>e.hooks?.some(e=>e.command?.includes(t)))}}])}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__098.3z2._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[750227,(e,r,t)=>{r.exports=e.x("node:path",()=>require("node:path"))},902157,(e,r,t)=>{r.exports=e.x("node:fs",()=>require("node:fs"))},660526,(e,r,t)=>{r.exports=e.x("node:os",()=>require("node:os"))},666680,(e,r,t)=>{r.exports=e.x("node:crypto",()=>require("node:crypto"))},933919,(e,r,t)=>{r.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},874533,(e,r,t)=>{r.exports=e.x("node:child_process",()=>require("node:child_process"))},192520,e=>{"use strict";let r;var t=e.i(750227),s=e.i(660526),n=e.i(666680),i=e.i(902157);function a(){return r||(r=process.env.TOWER_DATA_DIR||(0,t.join)((0,s.homedir)(),".tower"),(0,i.existsSync)(r)||(0,i.mkdirSync)(r,{recursive:!0})),r}e.s(["getAssistantDir",0,function(){let e=(0,t.join)(a(),"assistant");return(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e},"getBackupsDir",0,function(){let e=(0,t.join)(a(),"backups");return(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e},"getExtensionsDir",0,function(){let e=(0,t.join)(a(),"extensions");return(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e},"getSignalDir",0,function(){let e=process.env.TOWER_DATA_DIR||(0,t.join)((0,s.homedir)(),".tower"),r=(0,n.createHash)("sha256").update(e).digest("hex").slice(0,16);return(0,t.join)((0,s.tmpdir)(),"tower-signals",r)},"getStorageDir",0,function(){let e=process.env.TOWER_STORAGE_DIR||function(){try{let e=(0,i.readFileSync)((0,t.join)(a(),"storage-location"),"utf-8").trim();return e.length>0?e:null}catch{return null}}(),r=e&&e.length>0?e:(0,t.join)(a(),"storage");return(0,i.existsSync)(r)||(0,i.mkdirSync)(r,{recursive:!0}),r},"getTowerDbFilePath",0,function(){let e=process.env.TOWER_DATA_DIR||(0,t.join)((0,s.homedir)(),".tower");return(0,t.join)(e,"database","tower.db")},"getTowerDbPath",0,function(){let e;return(0,t.join)((e=(0,t.join)(a(),"database"),(0,i.existsSync)(e)||(0,i.mkdirSync)(e,{recursive:!0}),e),"tower.db")},"getTowerDir",0,a])},843793,e=>{"use strict";var r=e.i(933919),t=e.i(192520);let s=globalThis.prisma??new r.PrismaClient({datasourceUrl:`file:${(0,t.getTowerDbFilePath)()}`,log:[]});process.on("SIGTERM",()=>{s.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{s.$disconnect().catch(()=>{})}),e.s(["db",0,s])},193695,(e,r,t)=>{r.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},918622,(e,r,t)=>{r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},556704,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},270406,(e,r,t)=>{r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},324725,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},198840,e=>{"use strict";var r=e.i(855104);let t=["localhost","127.0.0.1","[::1]"],s=new Set(["127.0.0.1","::1","::ffff:127.0.0.1"]),n=/^c[a-z0-9]{20,30}$/;e.s(["requireLocalhost",0,function(e){let n=e.headers.get("x-forwarded-for");if(n&&!n.split(",").map(e=>e.trim()).every(e=>s.has(e)))return r.NextResponse.json({error:"Forbidden"},{status:403});let i=e.headers.get("host")??"";return t.some(e=>i.startsWith(e))?null:r.NextResponse.json({error:"Forbidden"},{status:403})},"validateProjectId",0,function(e){return n.test(e)?null:r.NextResponse.json({error:"Invalid projectId format"},{status:400})},"validateTaskId",0,function(e){return n.test(e)?null:r.NextResponse.json({error:"Invalid taskId format"},{status:400})}])},572173,e=>{"use strict";var r=e.i(843793);async function t(e,t){let s=await r.db.systemConfig.findUnique({where:{key:e}});if(!s)return t;try{return JSON.parse(s.value)}catch{return t}}e.s(["readConfigValue",0,t])},341291,e=>{"use strict";var r=e.i(666680),t=e.i(902157),s=e.i(750227),n=e.i(192520);function i(e){if(!e.startsWith((0,n.getStorageDir)()+s.sep))throw Error("Path traversal detected")}let a=new Set(["image","screenshot","img","photo","picture","clipboard","paste","untitled"]);e.s(["buildCacheFilename",0,function(e,t){let n=s.basename(e,s.extname(e)),i=r.randomUUID().replace(/-/g,"").slice(0,8),o=n.toLowerCase();if(!n||a.has(o)||/^screenshot[\s_\-]/i.test(n))return`tower_image-${i}${t}`;let c=n.replace(/[^\p{L}\p{N}]/gu,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"");return`${c||"file"}-${i}${t}`},"ensureAssetsDir",0,function(e){let r,a=(i(r=s.join((0,n.getStorageDir)(),"assets",e)),r);return t.mkdirSync(a,{recursive:!0}),a},"ensureCacheDir",0,function(e){let r,a=(i(r=s.join((0,n.getStorageDir)(),"cache",e)),r);return t.mkdirSync(a,{recursive:!0}),a},"getAssistantCacheDir",0,function(e="images"){let r=new Date,a=`${r.getFullYear()}-${String(r.getMonth()+1).padStart(2,"0")}`,o=s.join((0,n.getStorageDir)(),"cache","assistant",a,e);return i(o),t.mkdirSync(o,{recursive:!0}),o},"getAssistantCacheRoot",0,function(){let e=s.join((0,n.getStorageDir)(),"cache","assistant");return i(e),e}])},634712,e=>{"use strict";let r=["jpg","jpeg","png","gif","webp"],t=["md","txt","json","csv"],s=[...r,...t].join("|"),n=RegExp(`^\\d{4}-\\d{2}/(images|files)/[^/]+\\.(${s})$`,"i");function i(e){let s=e.replace(/^\./,"").toLowerCase();return r.includes(s)?"image":t.includes(s)?"text":null}[...r.map(e=>`.${e}`),...t.map(e=>`.${e}`),"image/*"].join(","),e.s(["ALLOWED_TEXT_EXTS",0,t,"ATTACHMENT_SUBPATH_RE",0,n,"MAX_ATTACHMENTS",0,10,"classifyAttachmentExt",0,i,"classifyAttachmentSubPath",0,function(e){if(!n.test(e))return null;let r=e.lastIndexOf(".");return r<0?null:i(e.slice(r+1))}])},482848,e=>{e.v(e=>Promise.resolve().then(()=>e(874533)))},268548,e=>{e.v(r=>Promise.all(["server/chunks/[externals]_node_util_0xr.y7p._.js"].map(r=>e.l(r))).then(()=>r(812057)))},144264,e=>{e.v(r=>Promise.all(["server/chunks/[externals]_child_process_0pwkpv9._.js"].map(r=>e.l(r))).then(()=>r(233405)))},534777,e=>{e.v(r=>Promise.all(["server/chunks/[externals]_util_0wtvqkc._.js"].map(r=>e.l(r))).then(()=>r(224361)))},200628,e=>{e.v(e=>Promise.resolve().then(()=>e(769310)))},145135,e=>{e.v(r=>Promise.all(["server/chunks/[externals]__0o6dym7._.js","server/chunks/07-d_@anthropic-ai_claude-agent-sdk_sdk_mjs_0.721uk._.js"].map(r=>e.l(r))).then(()=>r(217040)))},979764,e=>{e.v(r=>Promise.all(["server/chunks/[root-of-the-server]__0iyp~.k._.js"].map(r=>e.l(r))).then(()=>r(471552)))}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__0ehx6q.._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[874533,(e,n,t)=>{n.exports=e.x("node:child_process",()=>require("node:child_process"))},769310,e=>{"use strict";var n=e.i(902157),t=e.i(874533),r=e.i(750227);function a(e=process.platform){return"win32"===e}function i(e){let n=e.replace(/\r\n|\r|\n/g," ");if(!n.length)return'""';let t=n.replace(/"/g,'""');return/[\s"&<>|^()]/.test(t)?`"${t}"`:t}let o=["CLAUDECODE","CLAUDE_CODE_ENTRYPOINT","CLAUDE_CODE_SESSION","CLAUDE_CODE_PARENT_SESSION"];async function s(e,n={}){let t=n.cwd??process.cwd(),i=n.env??process.env,o=n.platform??process.platform;if(e.includes("/")||e.includes("\\")){let n=r.default.isAbsolute(e)?e:r.default.resolve(t,e);return await d(n,o)?n:null}let l=i.PATH??i.Path??"",c=a(o)?";":":",p=l.split(c).filter(Boolean),m=a(o)?(i.PATHEXT??".EXE;.CMD;.BAT;.COM").split(";").filter(Boolean):[""],u=a(o)&&r.default.extname(e).length>0;for(let n of p)for(let t of a(o)?u?[r.default.join(n,e)]:m.map(t=>r.default.join(n,`${e}${t}`)):[r.default.join(n,e)])if(await d(t,o))return t;return null}let l=e=>(0,t.execSync)(e,{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]});function c(e,n=process.platform,i=l){if(r.default.extname(e)||e.includes("/")||e.includes("\\"))return e;if(!a(n)){try{let n=(0,t.execFileSync)("which",[e],{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]}).trim();if(n)return n}catch{}return e}try{let n=i(`where ${e}`).trim().split("\n").map(e=>e.trim()).filter(Boolean),t=n.find(e=>/\.(cmd|bat|exe)$/i.test(e));if(t)return t;if(n.length>0)return n[0]}catch{}return e}async function p(e,n,t={}){let r=t.env??process.env,a=t.platform??process.platform;return m(await s(e,t)??e,n,r,a)}function m(e,n,t,o){if(!a(o))return{command:e,args:n};let s=r.default.extname(e).toLowerCase();return".cmd"===s||".bat"===s||".com"===s?{command:t.ComSpec||"cmd.exe",args:["/d","/s","/c",[i(e),...n.map(i)].join(" ")]}:{command:e,args:n}}async function d(e,t=process.platform){try{return await n.promises.access(e,a(t)?n.constants.F_OK:n.constants.X_OK),!0}catch{return!1}}async function u(e=process.platform){return a(e)?w():f()}async function f(){try{let e=await n.promises.readFile("/etc/shells","utf-8"),t=[],a=new Map;for(let n of e.split("\n")){let e=n.replace(/#.*/,"").trim();if(!e||!e.startsWith("/")||!await d(e))continue;let i=r.default.basename(e),o=a.get(i)??0;a.set(i,o+1),o>0&&(i=`${i} (${o+1})`),t.push({name:i,path:e})}return t}catch{let e=[];for(let n of["/bin/zsh","/bin/bash","/bin/sh"])await d(n)&&e.push({name:r.default.basename(n),path:n});return e}}async function w(){let e=[],n=[],t=await s("git",{platform:"win32"});if(t){let e=r.default.resolve(r.default.dirname(t),"..","..");n.push(r.default.join(e,"bin","bash.exe"),r.default.join(e,"usr","bin","bash.exe"))}for(let e of[process.env.ProgramW6432,process.env.ProgramFiles,process.env["ProgramFiles(x86)"],process.env.LocalAppData?r.default.join(process.env.LocalAppData,"Programs"):null].filter(Boolean))n.push(r.default.join(e,"Git","bin","bash.exe"),r.default.join(e,"Git","usr","bin","bash.exe"));let a=process.env.USERPROFILE??"";for(let t of(a&&n.push(r.default.join(a,"scoop","apps","git","current","bin","bash.exe")),process.env.CLAUDE_CODE_GIT_BASH_PATH&&n.unshift(process.env.CLAUDE_CODE_GIT_BASH_PATH),n))if(await d(t,"win32")){e.push({name:"Git Bash",path:t});break}let i=await s("pwsh",{platform:"win32"});i&&e.push({name:"PowerShell",path:i});let o=process.env.windir??"C:\\WINDOWS",l=r.default.join(o,"System32","WindowsPowerShell","v1.0","powershell.exe");await d(l,"win32")&&e.push({name:"Windows PowerShell",path:l});let c=process.env.ComSpec??r.default.join(o,"System32","cmd.exe");return await d(c,"win32")&&e.push({name:"Command Prompt",path:c}),e}let b=[{name:"Terminal",bundleName:"Terminal"},{name:"iTerm2",bundleName:"iTerm"},{name:"Warp",bundleName:"Warp"},{name:"Alacritty",bundleName:"Alacritty"},{name:"WezTerm",bundleName:"WezTerm"},{name:"kitty",bundleName:"kitty"},{name:"Hyper",bundleName:"Hyper"}];async function h(e=process.platform){if("darwin"===e){let n=[];for(let t of b){let r=await d(`/Applications/${t.bundleName}.app`,e);n.push({name:t.name,value:t.bundleName,installed:r})}return n}if(a(e)){let n=[],t=await s("wt",{platform:e});return t&&n.push({name:"Windows Terminal",value:t,installed:!0}),n}return[]}let C=[{name:"VS Code",command:"code"},{name:"VS Code Insiders",command:"code-insiders"},{name:"Cursor",command:"cursor"},{name:"Windsurf",command:"windsurf"},{name:"Zed",command:"zed"},{name:"Sublime Text",command:"subl"},{name:"IntelliJ IDEA",command:"idea"},{name:"WebStorm",command:"webstorm"},{name:"PyCharm",command:"pycharm"},{name:"GoLand",command:"goland"},{name:"RubyMine",command:"rubymine"},{name:"PhpStorm",command:"phpstorm"},{name:"CLion",command:"clion"},{name:"Rider",command:"rider"}],S={code:{darwin:["/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"],win32:["%LOCALAPPDATA%\\Programs\\Microsoft VS Code\\bin\\code.cmd","%ProgramFiles%\\Microsoft VS Code\\bin\\code.cmd"]},"code-insiders":{darwin:["/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders"],win32:["%LOCALAPPDATA%\\Programs\\Microsoft VS Code Insiders\\bin\\code-insiders.cmd","%ProgramFiles%\\Microsoft VS Code Insiders\\bin\\code-insiders.cmd"]},cursor:{darwin:["/Applications/Cursor.app/Contents/Resources/app/bin/cursor"],win32:["%LOCALAPPDATA%\\Programs\\cursor\\resources\\app\\bin\\cursor.cmd"]},windsurf:{darwin:["/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"],win32:["%LOCALAPPDATA%\\Programs\\Windsurf\\bin\\windsurf.cmd"]},zed:{darwin:["/Applications/Zed.app/Contents/MacOS/cli"]},subl:{darwin:["/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"],win32:["%ProgramFiles%\\Sublime Text\\subl.exe","%ProgramFiles%\\Sublime Text 3\\subl.exe"]},idea:{darwin:["/Applications/IntelliJ IDEA.app/Contents/MacOS/idea","/Applications/IntelliJ IDEA CE.app/Contents/MacOS/idea"]},webstorm:{darwin:["/Applications/WebStorm.app/Contents/MacOS/webstorm"]},pycharm:{darwin:["/Applications/PyCharm.app/Contents/MacOS/pycharm","/Applications/PyCharm CE.app/Contents/MacOS/pycharm"]},goland:{darwin:["/Applications/GoLand.app/Contents/MacOS/goland"]},rubymine:{darwin:["/Applications/RubyMine.app/Contents/MacOS/rubymine"]},phpstorm:{darwin:["/Applications/PhpStorm.app/Contents/MacOS/phpstorm"]},clion:{darwin:["/Applications/CLion.app/Contents/MacOS/clion"]},rider:{darwin:["/Applications/Rider.app/Contents/MacOS/rider"]}};async function A(e,n={}){let t=n.platform??process.platform,r=n.env??process.env,i=await s(e,n);if(i)return i;for(let n of S[e]?.[t]??[]){let e=a(t)?function(e,n){return e.replace(/%([^%]+)%/g,(e,t)=>{let r=n[t];if(void 0!==r)return r;let a=Object.keys(n).find(e=>e.toLowerCase()===t.toLowerCase());return a?n[a]??e:e})}(n,r):n;if(await d(e,t))return e}return null}async function y(e=process.platform){let n=[];for(let t of C){let r=!!await A(t.command,{platform:e});n.push({name:t.name,command:t.command,installed:r})}return n}e.s(["detectEditors",0,y,"detectShells",0,u,"detectTerminalApps",0,h,"ensurePathInEnv",0,function(e,n=process.platform){let t=a(n)?"Path":"PATH";return(e.PATH??e.Path??"").length>0?e:{...e,[t]:function(e=process.platform){return a(e)?"C:\\Windows\\System32;C:\\Windows;C:\\Windows\\System32\\Wbem":"/usr/local/bin:/opt/homebrew/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin"}(n)}},"isWindows",0,a,"resolveCommandPath",0,s,"resolveCommandPathSync",0,c,"resolveSdkExecutable",0,function(e,t=process.platform,i=e=>(0,n.readFileSync)(e,"utf-8"),o=e=>(0,n.existsSync)(e)){if(!a(t))return e;let s=r.default.extname(e).toLowerCase();if(".cmd"!==s&&".bat"!==s)return e;let l=r.default.win32.dirname(e),c="",p=e=>{let n=e.replace(/%~?dp0%/gi,l).replace(/\//g,"\\");return r.default.win32.isAbsolute(n)?r.default.win32.normalize(n):r.default.win32.resolve(l,n)};try{let n=i(e);c=n.replace(/\s+/g," ").slice(0,400);let t=n.match(/"([^"]*\.(?:c?js|mjs))"/i);if(t){let e=p(t[1]);if(o(e))return e;console.error(`[resolveSdkExecutable] parsed cli="${e}" but it doesn't exist`)}for(let e of n.matchAll(/"([^"]*\.exe)"/gi)){let n=p(e[1]);if("node.exe"!==r.default.win32.basename(n).toLowerCase()&&o(n))return n}}catch(e){console.error(`[resolveSdkExecutable] shim read failed: ${e instanceof Error?e.message:e}`)}let m=r.default.win32.join(l,"node_modules","@anthropic-ai","claude-code"),d=r.default.win32.basename(e,r.default.win32.extname(e)),u=[r.default.win32.join(m,"cli.js"),r.default.win32.join(m,"bin",`${d}.exe`)];for(let e of u)if(o(e))return e;return console.error(`[resolveSdkExecutable] could not convert ${e} → guesses=${JSON.stringify(u)} shim="${c}"`),e},"resolveSpawnTarget",0,p,"resolveSpawnTargetSync",0,function(e,n,t=process.platform,r){return m(c(e,t,r),n,process.env,t)},"stripClaudeNestingEnv",0,function(e){let n={...e};for(let e of o)delete n[e];return n}])}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__0iggiij._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[522734,(e,r,t)=>{r.exports=e.x("fs",()=>require("fs"))},750227,(e,r,t)=>{r.exports=e.x("node:path",()=>require("node:path"))},902157,(e,r,t)=>{r.exports=e.x("node:fs",()=>require("node:fs"))},660526,(e,r,t)=>{r.exports=e.x("node:os",()=>require("node:os"))},666680,(e,r,t)=>{r.exports=e.x("node:crypto",()=>require("node:crypto"))},933919,(e,r,t)=>{r.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},874533,(e,r,t)=>{r.exports=e.x("node:child_process",()=>require("node:child_process"))},193695,(e,r,t)=>{r.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},918622,(e,r,t)=>{r.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},556704,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},270406,(e,r,t)=>{r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},324725,(e,r,t)=>{r.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},192520,e=>{"use strict";let r;var t=e.i(750227),n=e.i(660526),s=e.i(666680),o=e.i(902157);function i(){return r||(r=process.env.TOWER_DATA_DIR||(0,t.join)((0,n.homedir)(),".tower"),(0,o.existsSync)(r)||(0,o.mkdirSync)(r,{recursive:!0})),r}e.s(["getAssistantDir",0,function(){let e=(0,t.join)(i(),"assistant");return(0,o.existsSync)(e)||(0,o.mkdirSync)(e,{recursive:!0}),e},"getBackupsDir",0,function(){let e=(0,t.join)(i(),"backups");return(0,o.existsSync)(e)||(0,o.mkdirSync)(e,{recursive:!0}),e},"getExtensionsDir",0,function(){let e=(0,t.join)(i(),"extensions");return(0,o.existsSync)(e)||(0,o.mkdirSync)(e,{recursive:!0}),e},"getSignalDir",0,function(){let e=process.env.TOWER_DATA_DIR||(0,t.join)((0,n.homedir)(),".tower"),r=(0,s.createHash)("sha256").update(e).digest("hex").slice(0,16);return(0,t.join)((0,n.tmpdir)(),"tower-signals",r)},"getStorageDir",0,function(){let e=process.env.TOWER_STORAGE_DIR||function(){try{let e=(0,o.readFileSync)((0,t.join)(i(),"storage-location"),"utf-8").trim();return e.length>0?e:null}catch{return null}}(),r=e&&e.length>0?e:(0,t.join)(i(),"storage");return(0,o.existsSync)(r)||(0,o.mkdirSync)(r,{recursive:!0}),r},"getTowerDbFilePath",0,function(){let e=process.env.TOWER_DATA_DIR||(0,t.join)((0,n.homedir)(),".tower");return(0,t.join)(e,"database","tower.db")},"getTowerDbPath",0,function(){let e;return(0,t.join)((e=(0,t.join)(i(),"database"),(0,o.existsSync)(e)||(0,o.mkdirSync)(e,{recursive:!0}),e),"tower.db")},"getTowerDir",0,i])},843793,e=>{"use strict";var r=e.i(933919),t=e.i(192520);let n=globalThis.prisma??new r.PrismaClient({datasourceUrl:`file:${(0,t.getTowerDbFilePath)()}`,log:[]});process.on("SIGTERM",()=>{n.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{n.$disconnect().catch(()=>{})}),e.s(["db",0,n])},173215,e=>{"use strict";var r=e.i(902157),t=e.i(660526),n=e.i(750227),s=e.i(279711),o=e.i(192520),i=e.i(53674);let a="tower";function c(){let e=(0,o.getTowerDir)(),r=n.join((0,t.homedir)(),".tower");if(n.resolve(e)===n.resolve(r))return"tower";let s=n.basename(e),i=s.match(/^\.?tower-(.+)$/);return i?`tower-${l(i[1])}`:`tower-${l(s)}`}function l(e){return e.replace(/[^a-z0-9_-]/gi,"-").toLowerCase().slice(0,32)}function p(){let e=(0,i.getPackageRoot)().replace(/\\/g,"/"),t={DATABASE_URL:process.env.DATABASE_URL||`file:${(0,o.getTowerDbPath)().replace(/\\/g,"/")}`,TOWER_DATA_DIR:(0,o.getTowerDir)()},n=`${e}/dist/mcp-server.cjs`,s=c();return(0,r.existsSync)(n)?{name:s,command:"node",args:[n],env:t}:{name:s,command:`${e}/node_modules/.bin/tsx`,args:[`${e}/src/mcp/index.ts`],env:t}}async function u(e,o){let c=s.providerRegistry.get(e),l=c?.cli?.adapter;if(!l||!await l.isAvailable())return{provider:e,available:!1,ok:!1};let u="claude"===e?function(e={}){let s=e.homeDir??t.homedir(),o=e.repoRoot??process.cwd(),i=[];return i.push(function(e){let t=n.join(e,".claude","settings.json");if(!r.existsSync(t))return{removed:!1,path:t};try{let e=r.readFileSync(t,"utf-8"),n=JSON.parse(e),s=n.mcpServers;if("object"!=typeof s||null===s||Array.isArray(s)||!("tower"in s))return{removed:!1,path:t};let o=s.tower;return delete s.tower,0===Object.keys(s).length?delete n.mcpServers:n.mcpServers=s,r.writeFileSync(t,JSON.stringify(n,null,2)+"\n","utf-8"),{removed:!0,path:t,removedEntry:o,reason:"wrong-file"}}catch(e){return{removed:!1,path:t,error:e instanceof Error?e.message:String(e)}}}(s)),i.push(function(e,t,s){if(!r.existsSync(e))return{removed:!1,path:e};try{let o=r.readFileSync(e,"utf-8"),i=JSON.parse(o),a=i.mcpServers;if("object"!=typeof a||null===a||Array.isArray(a))return{removed:!1,path:e};let c=a.tower;if(!c)return{removed:!1,path:e};let l=function(e,t){let s,o=e.args;if(!Array.isArray(o))return"foreign-repo";for(let e of o)if("string"==typeof e&&n.isAbsolute(e)){s=e;break}return s?r.existsSync(s)?n.resolve(s).startsWith(n.resolve(t)+n.sep)?"current-repo":"foreign-repo":"missing-path":"foreign-repo"}(c,s);if("current-repo"===l)return{removed:!1,path:e,reason:"alive-current-repo"};return delete a.tower,0===Object.keys(a).length?delete i.mcpServers:i.mcpServers=a,r.writeFileSync(e,JSON.stringify(i,null,2)+"\n","utf-8"),{removed:!0,path:e,removedEntry:c,reason:`${t}:${l}`}}catch(r){return{removed:!1,path:e,error:r instanceof Error?r.message:String(r)}}}(n.join(s,".mcp.json"),"home-mcp-json",o)),{steps:i,removedAny:i.some(e=>e.removed)}}():void 0,d=p(),m=await l.installMcp(d,{scope:"user"}),v=await l.installHooks(o),x=await l.installSkill(a,n.join((0,i.getPackageRoot)(),"skills",a));return{provider:e,available:!0,migration:u,mcp:m,hooks:v,skill:x,ok:m.ok&&v.ok&&x.ok}}e.s(["buildTowerMcpConfig",0,p,"getTowerMcpName",0,c,"installAllForProvider",0,u],173215)},482848,e=>{e.v(e=>Promise.resolve().then(()=>e(874533)))},268548,e=>{e.v(r=>Promise.all(["server/chunks/[externals]_node_util_0xr.y7p._.js"].map(r=>e.l(r))).then(()=>r(812057)))},144264,e=>{e.v(r=>Promise.all(["server/chunks/[externals]_child_process_0pwkpv9._.js"].map(r=>e.l(r))).then(()=>r(233405)))},534777,e=>{e.v(r=>Promise.all(["server/chunks/[externals]_util_0wtvqkc._.js"].map(r=>e.l(r))).then(()=>r(224361)))},200628,e=>{e.v(e=>Promise.resolve().then(()=>e(769310)))}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__0pmamzv._.js.map