tower-studio 0.2.5 → 0.2.7

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 (305) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/build-manifest.json +3 -3
  3. package/.next/standalone/.next/prerender-manifest.json +3 -3
  4. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  5. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -1
  12. package/.next/standalone/.next/server/app/_not-found/page/server-reference-manifest.json +45 -45
  13. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  16. package/.next/standalone/.next/server/app/_not-found.rsc +14 -14
  17. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +14 -14
  18. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  19. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +9 -9
  20. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  21. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  22. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/standalone/.next/server/app/api/adapters/test/route.js +1 -1
  24. package/.next/standalone/.next/server/app/api/adapters/test/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/browse-fs/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/files/assets/[projectId]/[filename]/route.js.nft.json +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 +1 -2
  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 +3 -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 +1 -2
  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 +3 -2
  37. package/.next/standalone/.next/server/app/api/internal/assistant/sessions/route.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js +2 -3
  39. package/.next/standalone/.next/server/app/api/internal/backup/import/route.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/api/internal/cache/[...segments]/route.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js +3 -2
  42. package/.next/standalone/.next/server/app/api/internal/hooks/install/route.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js +2 -3
  44. package/.next/standalone/.next/server/app/api/internal/hooks/stop/route.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/api/internal/hooks/upload/route.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js +2 -3
  47. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/buffer/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js +2 -3
  49. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/input/route.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js +3 -4
  51. package/.next/standalone/.next/server/app/api/internal/terminal/[taskId]/start/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/tasks/[taskId]/diff/route.js.nft.json +1 -1
  53. package/.next/standalone/.next/server/app/api/tasks/[taskId]/merge/route.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/index.html +1 -1
  55. package/.next/standalone/.next/server/app/index.rsc +14 -14
  56. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  57. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +14 -14
  58. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
  59. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +9 -9
  60. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  61. package/.next/standalone/.next/server/app/missions/page/react-loadable-manifest.json +1 -1
  62. package/.next/standalone/.next/server/app/missions/page/server-reference-manifest.json +75 -75
  63. package/.next/standalone/.next/server/app/missions/page.js +1 -1
  64. package/.next/standalone/.next/server/app/missions/page.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/missions/page_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/onboarding/page/react-loadable-manifest.json +1 -1
  67. package/.next/standalone/.next/server/app/onboarding/page/server-reference-manifest.json +45 -45
  68. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  69. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/onboarding.html +1 -1
  71. package/.next/standalone/.next/server/app/onboarding.rsc +16 -16
  72. package/.next/standalone/.next/server/app/onboarding.segments/_full.segment.rsc +16 -16
  73. package/.next/standalone/.next/server/app/onboarding.segments/_head.segment.rsc +4 -4
  74. package/.next/standalone/.next/server/app/onboarding.segments/_index.segment.rsc +9 -9
  75. package/.next/standalone/.next/server/app/onboarding.segments/_tree.segment.rsc +1 -1
  76. package/.next/standalone/.next/server/app/onboarding.segments/onboarding/__PAGE__.segment.rsc +4 -4
  77. package/.next/standalone/.next/server/app/onboarding.segments/onboarding.segment.rsc +3 -3
  78. package/.next/standalone/.next/server/app/page/react-loadable-manifest.json +1 -1
  79. package/.next/standalone/.next/server/app/page/server-reference-manifest.json +45 -45
  80. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  81. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/settings/page/react-loadable-manifest.json +1 -1
  83. package/.next/standalone/.next/server/app/settings/page/server-reference-manifest.json +58 -58
  84. package/.next/standalone/.next/server/app/settings/page.js +1 -1
  85. package/.next/standalone/.next/server/app/settings/page.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/settings.html +1 -1
  88. package/.next/standalone/.next/server/app/settings.rsc +16 -16
  89. package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +16 -16
  90. package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  91. package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +9 -9
  92. package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +1 -1
  93. package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  94. package/.next/standalone/.next/server/app/settings.segments/settings.segment.rsc +3 -3
  95. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/react-loadable-manifest.json +1 -1
  96. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/archive/page/server-reference-manifest.json +102 -102
  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 +1 -1
  100. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page/server-reference-manifest.json +84 -84
  101. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/assets/page_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/react-loadable-manifest.json +1 -1
  104. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page/server-reference-manifest.json +77 -77
  105. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/notes/page_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/react-loadable-manifest.json +1 -1
  108. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page/server-reference-manifest.json +74 -74
  109. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js +1 -1
  110. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/page_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/react-loadable-manifest.json +1 -1
  113. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page/server-reference-manifest.json +45 -45
  114. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page.js.nft.json +1 -1
  115. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/page_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/react-loadable-manifest.json +1 -1
  117. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page/server-reference-manifest.json +84 -84
  118. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page.js.nft.json +1 -1
  119. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/projects/[projectId]/versions/page_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/react-loadable-manifest.json +2 -2
  121. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page/server-reference-manifest.json +88 -88
  122. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js +1 -1
  123. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/workspaces/[workspaceId]/tasks/[taskId]/page_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/workspaces/page/react-loadable-manifest.json +1 -1
  126. package/.next/standalone/.next/server/app/workspaces/page/server-reference-manifest.json +63 -63
  127. package/.next/standalone/.next/server/app/workspaces/page.js.nft.json +1 -1
  128. package/.next/standalone/.next/server/app/workspaces/page_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0h5yr8p.js +1 -1
  130. package/.next/standalone/.next/server/chunks/0se9_next_dist_esm_build_templates_app-route_0hrprmi.js +1 -1
  131. package/.next/standalone/.next/server/chunks/[root-of-the-server]__00mjz~7._.js +3 -0
  132. package/.next/standalone/.next/server/chunks/[root-of-the-server]__028ucbo._.js +4 -0
  133. package/.next/standalone/.next/server/chunks/[root-of-the-server]__03gi3ue._.js +4 -0
  134. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05eviiz._.js +2 -2
  135. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07f7~6u._.js +4 -0
  136. package/.next/standalone/.next/server/chunks/[root-of-the-server]__09p152b._.js +3 -0
  137. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b-ib~7._.js +3 -0
  138. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c513um._.js +1 -1
  139. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d~z6xs._.js +4 -0
  140. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e44k3f._.js +20 -0
  141. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0h.z9fm._.js +11 -0
  142. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lioghc._.js +3 -0
  143. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0mw.9lg._.js +3 -0
  144. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ogh_qu._.js +20 -0
  145. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tys9pv._.js +3 -0
  146. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0wbndoc._.js +4 -0
  147. package/.next/standalone/.next/server/chunks/[root-of-the-server]__12c9noi._.js +3 -0
  148. package/.next/standalone/.next/server/chunks/{_0u-~jqd._.js → _0_eodxe._.js} +1 -1
  149. package/.next/standalone/.next/server/chunks/{src_0o_27yu._.js → src_0bkvm8c._.js} +2 -2
  150. package/.next/standalone/.next/server/chunks/src_0weytpz._.js +1 -1
  151. package/.next/standalone/.next/server/chunks/src_lib_0ba0ntr._.js +1 -1
  152. package/.next/standalone/.next/server/chunks/src_lib_ai_0q-~me1._.js +1 -1
  153. package/.next/standalone/.next/server/chunks/src_lib_ai_0xx6y51._.js +1 -1
  154. package/.next/standalone/.next/server/chunks/src_lib_ai_providers_index_ts_0.y.3vp._.js +1 -1
  155. package/.next/standalone/.next/server/chunks/ssr/0iu._[workspaceId]_projects_[projectId]_versions_version-timeline-client_tsx_07o_kyi._.js +1 -1
  156. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.ukame._.js +30 -0
  157. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__006_qh0._.js +1 -1
  158. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__01j8ix6._.js +30 -0
  159. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__02px.0y._.js +1 -1
  160. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__03ebsif._.js +3 -3
  161. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__00wymqa._.js → [root-of-the-server]__04pq37d._.js} +2 -2
  162. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0cdz55-._.js → [root-of-the-server]__07_b6c.._.js} +2 -2
  163. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__08n5qbf._.js +1 -1
  164. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0n8jy_r._.js → [root-of-the-server]__09kc.q_._.js} +2 -2
  165. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ca_ueb._.js +30 -0
  166. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0dsdplu._.js +30 -0
  167. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0-xoiaj._.js → [root-of-the-server]__0jo1r7k._.js} +2 -2
  168. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0l43.5g._.js +1 -1
  169. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0n.cuy2._.js +30 -0
  170. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0nbj.ml._.js +30 -0
  171. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0zjarb3._.js → [root-of-the-server]__0o8k4pc._.js} +2 -2
  172. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0pm2~fu._.js +30 -0
  173. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ps55l6._.js +1 -1
  174. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ribsk4._.js +1 -1
  175. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0rjue04._.js +30 -0
  176. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0tc6uh2._.js +30 -0
  177. package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0ilem~v._.js → [root-of-the-server]__0u4gc4b._.js} +2 -2
  178. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0v2eslh._.js +30 -0
  179. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0wjg_.n._.js +1 -1
  180. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0wlmzzq._.js +30 -0
  181. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0wvyks.._.js +1 -1
  182. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zbmoit._.js +1 -1
  183. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0zujp5l._.js +3 -0
  184. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0~a-emb._.js +30 -0
  185. package/.next/standalone/.next/server/chunks/ssr/_02v3fjp._.js +7 -0
  186. package/.next/standalone/.next/server/chunks/ssr/_04b71ua._.js +1 -1
  187. package/.next/standalone/.next/server/chunks/ssr/_05h.8a~._.js +1 -1
  188. package/.next/standalone/.next/server/chunks/ssr/_07~0_w6._.js +7 -0
  189. package/.next/standalone/.next/server/chunks/ssr/_08w-r6e._.js +7 -0
  190. package/.next/standalone/.next/server/chunks/ssr/_0_l8.dg._.js +1 -1
  191. package/.next/standalone/.next/server/chunks/ssr/{_108e4..._.js → _0_q~7z7._.js} +1 -1
  192. package/.next/standalone/.next/server/chunks/ssr/{_0lcigjh._.js → _0b0.-sj._.js} +2 -2
  193. package/.next/standalone/.next/server/chunks/ssr/{_0ybhyal._.js → _0bw-tx8._.js} +2 -2
  194. package/.next/standalone/.next/server/chunks/ssr/{_13l5s-p._.js → _0c-49y3._.js} +1 -1
  195. package/.next/standalone/.next/server/chunks/ssr/{_0-t_os6._.js → _0c-jnbs._.js} +2 -2
  196. package/.next/standalone/.next/server/chunks/ssr/_0cj9a7y._.js +1 -1
  197. package/.next/standalone/.next/server/chunks/ssr/_0ds6nk2._.js +1 -1
  198. package/.next/standalone/.next/server/chunks/ssr/{_0wxd6t.._.js → _0f6u19w._.js} +2 -2
  199. package/.next/standalone/.next/server/chunks/ssr/{_0l6vadw._.js → _0fob8fc._.js} +2 -2
  200. package/.next/standalone/.next/server/chunks/ssr/_0i4__mf._.js +1 -1
  201. package/.next/standalone/.next/server/chunks/ssr/_0ihq._v._.js +1 -1
  202. package/.next/standalone/.next/server/chunks/ssr/{_0cie3rm._.js → _0niubv5._.js} +1 -1
  203. package/.next/standalone/.next/server/chunks/ssr/{_00pxhu2._.js → _0pd0.8f._.js} +2 -2
  204. package/.next/standalone/.next/server/chunks/ssr/_0r9w-k8._.js +1 -1
  205. package/.next/standalone/.next/server/chunks/ssr/{_0qu2yg4._.js → _0rbai5c._.js} +1 -1
  206. package/.next/standalone/.next/server/chunks/ssr/_0rbctq7._.js +1 -1
  207. package/.next/standalone/.next/server/chunks/ssr/_0rt8hus._.js +1 -1
  208. package/.next/standalone/.next/server/chunks/ssr/{_079ks~i._.js → _0y-7tle._.js} +1 -1
  209. package/.next/standalone/.next/server/chunks/ssr/{_0_co86q._.js → _0ysygps._.js} +2 -2
  210. package/.next/standalone/.next/server/chunks/ssr/{_13fpu~5._.js → _0ysyq9g._.js} +2 -2
  211. package/.next/standalone/.next/server/chunks/ssr/{_0a-rizg._.js → _0zgu282._.js} +1 -1
  212. package/.next/standalone/.next/server/chunks/ssr/{_07scffz._.js → _0zszi6-._.js} +1 -1
  213. package/.next/standalone/.next/server/chunks/ssr/_0~80adm._.js +3 -3
  214. package/.next/standalone/.next/server/chunks/ssr/src_095o8x6._.js +1 -1
  215. package/.next/standalone/.next/server/chunks/ssr/src_13jha60._.js +1 -1
  216. package/.next/standalone/.next/server/chunks/ssr/src_actions_agent-actions_ts_0~wc.sy._.js +1 -1
  217. package/.next/standalone/.next/server/chunks/ssr/src_actions_file-actions_ts_0gcvqwm._.js +1 -1
  218. package/.next/standalone/.next/server/chunks/ssr/src_app_missions_missions-client_tsx_11429lj._.js +1 -1
  219. package/.next/standalone/.next/server/chunks/ssr/src_app_onboarding_page_tsx_0xf7hpz._.js +1 -1
  220. package/.next/standalone/.next/server/chunks/ssr/src_app_settings_page_tsx_0h9v7dr._.js +1 -1
  221. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_assets_assets-page-client_tsx_0wyzpam._.js +1 -1
  222. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_board-page-client_tsx_0gips66._.js +1 -1
  223. package/.next/standalone/.next/server/chunks/ssr/src_app_workspaces_[workspaceId]_tasks_[taskId]_task-page-client_tsx_02t7blt._.js +1 -1
  224. package/.next/standalone/.next/server/chunks/ssr/{src_lib_0h36tj.._.js → src_lib_07rspg0._.js} +1 -1
  225. package/.next/standalone/.next/server/chunks/ssr/{src_lib_0h3ouzu._.js → src_lib_0_8frs_._.js} +1 -1
  226. package/.next/standalone/.next/server/chunks/ssr/{src_lib_0~jyveg._.js → src_lib_0fjk3hr._.js} +1 -1
  227. package/.next/standalone/.next/server/chunks/ssr/{src_lib_0~rxy~0._.js → src_lib_0g-92s-._.js} +1 -1
  228. package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
  229. package/.next/standalone/.next/server/pages/404.html +1 -1
  230. package/.next/standalone/.next/server/pages/500.html +1 -1
  231. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  232. package/.next/standalone/.next/server/server-reference-manifest.json +318 -318
  233. package/.next/standalone/.next/static/chunks/{14se8w2gb9pe0.js → 00.52653v5c~c.js} +1 -1
  234. package/.next/standalone/.next/static/chunks/00j0mdc41wa44.js +1 -0
  235. package/.next/standalone/.next/static/chunks/{15qi~69blu~3u.js → 02edbrlq~2uyx.js} +1 -1
  236. package/.next/standalone/.next/static/chunks/05-ui_o~3irq_.js +5 -0
  237. package/.next/standalone/.next/static/chunks/05hls.3r4bz.0.js +1 -0
  238. package/.next/standalone/.next/static/chunks/{00grznzz_zqq~.js → 08~e63d2q~cam.js} +1 -1
  239. package/.next/standalone/.next/static/chunks/{0z0a_hlsye7mo.js → 0bw4ahlj4~l~g.js} +1 -1
  240. package/.next/standalone/.next/static/chunks/{0.p7x9h8h-..l.js → 0ft77ybyq903..js} +1 -1
  241. package/.next/standalone/.next/static/chunks/0fxm-wv..y_a_.js +5 -0
  242. package/.next/standalone/.next/static/chunks/0i55dediewjp5.js +1 -0
  243. package/.next/standalone/.next/static/chunks/{094hp8ak7su7z.js → 0l3mmc866npw4.js} +2 -2
  244. package/.next/standalone/.next/static/chunks/0nno5if2x1mvs.js +1 -0
  245. package/.next/standalone/.next/static/chunks/0q-u-hhre1uyw.js +1 -0
  246. package/.next/standalone/.next/static/chunks/0qazzw-pr_sv7.js +1 -0
  247. package/.next/standalone/.next/static/chunks/{0~p32xa2eu79e.js → 0r1mkt5qs~s6m.js} +1 -1
  248. package/.next/standalone/.next/static/chunks/{0mijmksouoprl.js → 0v~pz9e87t99b.js} +1 -1
  249. package/.next/standalone/.next/static/chunks/{018vr5fdl426p.js → 0w3jww1m3k77x.js} +1 -1
  250. package/.next/standalone/.next/static/chunks/0z01g02xstbqe.js +1 -0
  251. package/.next/standalone/.next/static/chunks/0~27mkhc9s5k2.js +5 -0
  252. package/.next/standalone/.next/static/chunks/117qu902jput3.js +1 -0
  253. package/.next/standalone/.next/static/chunks/142w-q8.7m3kl.js +1 -0
  254. package/.next/standalone/package.json +2 -1
  255. package/bin/tower.mjs +3 -0
  256. package/dist/mcp-server.cjs +235 -34
  257. package/package.json +2 -1
  258. package/skills/tower/SKILL.md +381 -0
  259. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-eibah._.js +0 -4
  260. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.9mj3v._.js +0 -4
  261. package/.next/standalone/.next/server/chunks/[root-of-the-server]__05353yb._.js +0 -4
  262. package/.next/standalone/.next/server/chunks/[root-of-the-server]__07h7qz8._.js +0 -4
  263. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_a8-jq._.js +0 -3
  264. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_mbhor._.js +0 -3
  265. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0_q8qjf._.js +0 -20
  266. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c1g5im._.js +0 -4
  267. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0jmqy_3._.js +0 -3
  268. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ntb7n~._.js +0 -11
  269. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0nwxhai._.js +0 -3
  270. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0o4z8qp._.js +0 -3
  271. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0puw1af._.js +0 -20
  272. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0py_jdb._.js +0 -3
  273. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0qz9-me._.js +0 -3
  274. package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vasg9u._.js +0 -3
  275. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0.5rcav._.js +0 -30
  276. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__05kq890._.js +0 -30
  277. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0gaa~xc._.js +0 -30
  278. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0gcf4k3._.js +0 -30
  279. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ghfuuv._.js +0 -30
  280. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0q7ho54._.js +0 -30
  281. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qe~p-n._.js +0 -30
  282. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0tf4zp_._.js +0 -30
  283. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0y.nw7l._.js +0 -30
  284. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__102siqc._.js +0 -3
  285. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11bequ2._.js +0 -30
  286. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__11ko84j._.js +0 -30
  287. package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__12pnl8n._.js +0 -30
  288. package/.next/standalone/.next/server/chunks/ssr/_0h0r8fk._.js +0 -7
  289. package/.next/standalone/.next/server/chunks/ssr/_0j_v~sp._.js +0 -7
  290. package/.next/standalone/.next/server/chunks/ssr/_0xh9m4.._.js +0 -7
  291. package/.next/standalone/.next/static/chunks/0-wn9b_4jrs.9.js +0 -1
  292. package/.next/standalone/.next/static/chunks/00jlfmav1nk82.js +0 -1
  293. package/.next/standalone/.next/static/chunks/0a5u1~0._dmx8.js +0 -1
  294. package/.next/standalone/.next/static/chunks/0fe_jnfm0lqm..js +0 -5
  295. package/.next/standalone/.next/static/chunks/0jk6ji4j.3jod.js +0 -5
  296. package/.next/standalone/.next/static/chunks/0lq1_ynox5frw.js +0 -1
  297. package/.next/standalone/.next/static/chunks/0qy~pj-p.oh92.js +0 -1
  298. package/.next/standalone/.next/static/chunks/0y_vg.f~zs~zl.js +0 -1
  299. package/.next/standalone/.next/static/chunks/0~2v6ague-7-t.js +0 -5
  300. package/.next/standalone/.next/static/chunks/10ih_a9~empst.js +0 -1
  301. package/.next/standalone/.next/static/chunks/16.w_z6.3sf2v.js +0 -1
  302. package/.next/standalone/.next/static/chunks/17wptayhzwy6g.js +0 -1
  303. /package/.next/standalone/.next/static/{eRr9P5hixKpzabeXJ-AvA → om3SyUw4eAwMA0KLhpSGh}/_buildManifest.js +0 -0
  304. /package/.next/standalone/.next/static/{eRr9P5hixKpzabeXJ-AvA → om3SyUw4eAwMA0KLhpSGh}/_clientMiddlewareManifest.js +0 -0
  305. /package/.next/standalone/.next/static/{eRr9P5hixKpzabeXJ-AvA → om3SyUw4eAwMA0KLhpSGh}/_ssgManifest.js +0 -0
@@ -0,0 +1,381 @@
1
+ ---
2
+ name: tower
3
+ description: AI task orchestration platform — use Tower MCP tools to manage workspaces, projects, tasks, and monitor agent execution
4
+ ---
5
+
6
+ # Tower
7
+
8
+ Tower is an AI task orchestration platform. This skill teaches you how to use Tower's MCP tools to manage projects and tasks.
9
+
10
+ ## MCP Setup
11
+
12
+ Before using Tower tools, check if the `tower` MCP server is available. If tools like `list_workspaces` are not found, guide the user to configure MCP:
13
+
14
+ **Claude Code** — add to `~/.claude/settings.json`:
15
+ ```json
16
+ {
17
+ "mcpServers": {
18
+ "tower": {
19
+ "command": "npx",
20
+ "args": ["tsx", "<project-root>/src/mcp/index.ts"]
21
+ }
22
+ }
23
+ }
24
+ ```
25
+
26
+ **Other AI agents** — add the same config to your MCP client settings file.
27
+
28
+ After configuration, restart the AI session. The Tower tools will then be available.
29
+
30
+ ---
31
+
32
+ ## When to Use
33
+
34
+ Use Tower tools when the user wants to:
35
+ - View, create, or manage tasks and projects
36
+ - Check task execution status or progress
37
+ - Interact with a running task's terminal
38
+ - Search across workspaces, projects, or tasks
39
+ - Organize tasks with labels or status changes
40
+ - Get daily work summary or pending todo list
41
+ - Check what was done today or what's left to do
42
+
43
+ ---
44
+
45
+ ## Scenarios
46
+
47
+ ### "Show me my workspaces" / "List projects"
48
+
49
+ 1. Call `list_workspaces`
50
+ 2. If user asks about a specific workspace, call `list_projects` with the workspaceId
51
+ 3. Present results in a clean table format
52
+
53
+ ### "Create a task" / "Add a task for ..."
54
+
55
+ 1. Call `list_workspaces` to find the target workspace
56
+ 2. Call `list_projects` with workspaceId to find the target project
57
+ 3. Ask user to confirm the project (or infer from context)
58
+ 4. **Worktree mode**: default is direct mode (no branch isolation). If user says "use worktree", "-w", or "branch isolation", set `useWorktree: true`. Optionally pass `baseBranch` to specify which branch to check out from (e.g. `baseBranch: "develop"`). If `baseBranch` is omitted, the project's current git branch is auto-detected.
59
+ 5. **SubPath detection**: check the project description for directory structure hints (e.g. "monorepo: packages/web, packages/api"). If the task clearly belongs to a subdirectory, set `subPath` (e.g. "packages/web"). If unclear, omit it — it's optional.
60
+ 6. **References (any files/images)**: ALL user-provided files — including pasted screenshots, uploaded images, and local file paths — should be passed as `references: ["/path/to/file"]` on `create_task`. The tool copies files into the project asset library automatically.
61
+ - **Local file paths**: pass directly (e.g. `references: ["/path/to/doc.md", "/path/to/design.png"]`)
62
+ - **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
63
+ - **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
64
+ - **`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)
65
+ 7. Call `create_task` with projectId, title, and optional description/priority/labelIds/subPath/useWorktree/baseBranch/references
66
+ 8. `autoStart` defaults to true — task will be created and immediately started. If user says "don't start", "just create", or "-nostart", set `autoStart: false`
67
+
68
+ ### "Start a task" / "Run this task" / "Execute task ..."
69
+
70
+ 1. Call `start_task_execution` with taskId and an optional prompt (instruction for the AI agent)
71
+ 2. If no prompt is given, use the task's title/description as context
72
+ 3. The task status changes to IN_PROGRESS automatically
73
+
74
+ ### "What's running?" / "Check task progress"
75
+
76
+ 1. Call `get_task_execution_status` with taskId
77
+ 2. If status is running, call `get_task_terminal_output` with taskId (default 50 lines)
78
+ 3. Summarize: status + recent output + duration
79
+
80
+ ### "Send a message to the task" / "Tell it to ..."
81
+
82
+ 1. Call `send_task_terminal_input` with taskId and the text (include `\n` for Enter)
83
+ 2. Wait briefly, then call `get_task_terminal_output` to see the response
84
+
85
+ ### "Move task to done" / "Cancel this task"
86
+
87
+ 1. Call `move_task` with taskId and the target status (DONE, CANCELLED, etc.)
88
+
89
+ ### "Search for ..." / "Find tasks about ..."
90
+
91
+ 1. Call `search` with the query string
92
+ 2. Optionally set category to `task`, `project`, or `repository`
93
+ 3. Results include `navigateTo` paths for UI navigation
94
+
95
+ ### "Label this task" / "Tag it as ..."
96
+
97
+ 1. Call `list_labels` with workspaceId to see available labels
98
+ 2. Call `set_task_labels` with taskId and the desired labelId array
99
+ 3. Note: this replaces all existing labels — include current ones if you want to keep them
100
+
101
+ ### "今天做了什么?" / "Daily summary" / "工作总结"
102
+
103
+ 1. Call `daily_summary` (no params for today, or pass `date: "YYYY-MM-DD"` for a specific day)
104
+ 2. Results are grouped by workspace → project, with:
105
+ - **completed**: tasks moved to DONE today
106
+ - **inProgress**: tasks with activity today but not yet done, including `progressSummary` (last AI chat excerpt)
107
+ 3. Present stats: totalCompleted, totalInProgress
108
+ 4. Format as a readable report
109
+
110
+ ### "今天有什么待办?" / "Daily todo" / "还有哪些任务没完成?"
111
+
112
+ 1. Call `daily_todo` (returns all TODO/IN_PROGRESS/IN_REVIEW tasks)
113
+ 2. Optional filters:
114
+ - `workspaceId` — narrow to one workspace
115
+ - `projectId` — narrow to one project
116
+ - `status` — e.g. `["IN_PROGRESS"]` for only active tasks
117
+ - `priority` — e.g. `["CRITICAL", "HIGH"]` for urgent only
118
+ 3. Results sorted by priority severity (CRITICAL first), grouped by workspace → project
119
+ 4. Each task includes `lastSessionId` for resuming execution
120
+ 5. Present stats: total count, breakdown by status and priority
121
+
122
+ ### "Create a project" / "Set up a new project"
123
+
124
+ 1. Call `list_workspaces` to pick the workspace
125
+ 2. Call `create_project` with workspaceId, name, and optionally:
126
+ - `gitUrl` — makes it a GIT project with worktree support
127
+ - `localPath` — path to the local repository
128
+
129
+ ---
130
+
131
+ ## Task Lifecycle
132
+
133
+ ```
134
+ TODO → IN_PROGRESS → IN_REVIEW → DONE
135
+ → CANCELLED
136
+ ```
137
+
138
+ - Tasks start as `TODO`
139
+ - `IN_PROGRESS` means an agent is actively working
140
+ - `IN_REVIEW` means execution completed, awaiting review/merge
141
+ - `DONE` means merged and completed
142
+ - `CANCELLED` means dropped
143
+
144
+ ---
145
+
146
+ ## Task Description Format
147
+
148
+ The `description` field supports Markdown. **Never copy the user's raw message as-is.** Always restructure it into a clear, actionable format:
149
+
150
+ ```markdown
151
+ ## 目标
152
+ <one sentence summary of what to achieve>
153
+
154
+ ## 需求
155
+ - <requirement 1>
156
+ - <requirement 2>
157
+ - ...
158
+
159
+ ## 参考
160
+ - <file paths, API endpoints, design references if any>
161
+
162
+ ## 备注
163
+ - <constraints, edge cases, things to watch out for>
164
+ ```
165
+
166
+ Rules:
167
+ - `title` should be short (under 30 chars), summarizing the task
168
+ - `description` should be structured Markdown that an AI agent can execute from
169
+ - Extract actionable requirements from the user's natural language
170
+ - Omit sections that have no content (e.g. skip 备注 if nothing to note)
171
+ - If user provides file paths, put them in 参考 section AND in `references` parameter
172
+
173
+ ---
174
+
175
+ ## Display Templates
176
+
177
+ All query results MUST follow these templates. Do NOT invent your own format. When results are empty, output "No {items} found." (e.g. "No tasks found.", "No workspaces found.").
178
+
179
+ ### Priority Markers
180
+
181
+ Use consistently across all templates: 🔴 CRITICAL · 🟠 HIGH · 🟡 MEDIUM · ⚪ LOW
182
+
183
+ ### Labels Format
184
+
185
+ Always render labels as comma-separated names (e.g. `bug, frontend`). Omit the column if no task has labels.
186
+
187
+ ---
188
+
189
+ ### Workspaces (`list_workspaces`)
190
+
191
+ ```
192
+ | Workspace | Projects | Description |
193
+ |-----------|----------|-------------|
194
+ | {name} | {projectCount} | {description ?? "—"} |
195
+ ```
196
+
197
+ ### Projects (`list_projects`)
198
+
199
+ Note: the response does not include workspace name. Use the workspace name from the prior `list_workspaces` call or the user's context.
200
+
201
+ ```
202
+ 📂 {workspaceName}
203
+
204
+ | Project | Type | Tasks | Path |
205
+ |---------|------|-------|------|
206
+ | {name} ({alias}) | {type} | {taskCount} | {localPath ?? "—"} |
207
+ ```
208
+
209
+ ### Tasks (`list_tasks`)
210
+
211
+ ```
212
+ 📋 {projectName}
213
+
214
+ | ID | Task | Status | Priority | Labels |
215
+ |----|------|--------|----------|--------|
216
+ | {id (first 8 chars)} | {title} | {status} | {priority} | {labels} |
217
+ ```
218
+
219
+ ### Task Creation Confirmation
220
+
221
+ After `create_task` succeeds, render based on the **response** (not the input
222
+ parameter — `autoStart: true` does NOT mean execution actually started; check
223
+ `response.execution` and `response.executionError`):
224
+
225
+ ```
226
+ ✅ Task created: **{title}**
227
+ - Project: {projectName}
228
+ - Priority: {priority}
229
+ - Status: {status}
230
+ - Worktree: {yes/no}
231
+ {response.execution ? "⚡ Execution started" : response.executionError ? "⚠️ Auto-start failed: " + response.executionError : ""}
232
+ ```
233
+
234
+ If `executionError` is present, surface it verbatim — common causes are server
235
+ not running, concurrency limit hit, or project missing localPath. Do not say
236
+ "Execution started" when the response only shows `executionError`.
237
+
238
+ ### Daily Summary (`daily_summary`)
239
+
240
+ Fields: `stats.totalCompleted`, `stats.totalInProgress`, grouped `workspaces[].projects[].completed[]` and `inProgress[]`.
241
+
242
+ ```
243
+ # 📊 Daily Summary — {date}
244
+
245
+ **Stats**: ✅ {stats.totalCompleted} completed · 🔄 {stats.totalInProgress} in progress
246
+
247
+ ## {workspace.name}
248
+
249
+ ### {project.name}
250
+
251
+ **Completed**:
252
+ | Task | Priority | Completed At |
253
+ |------|----------|-------------|
254
+ | ✅ {title} | {priority} | {completedAt (HH:mm)} |
255
+
256
+ **In Progress**:
257
+ | Task | Status | Priority | Progress |
258
+ |------|--------|----------|----------|
259
+ | 🔄 {title} | {status} | {priority} | {progressSummary ?? "—"} |
260
+ ```
261
+
262
+ If no activity: "No activity recorded for {date}."
263
+
264
+ ### Daily Todo (`daily_todo`)
265
+
266
+ Fields: `stats.total`, `stats.byPriority.{CRITICAL,HIGH,MEDIUM,LOW}`, `stats.byStatus.{TODO,IN_PROGRESS,IN_REVIEW}`.
267
+
268
+ ```
269
+ # 📝 Pending Tasks
270
+
271
+ **Stats**: {stats.total} tasks · 🔴 {stats.byPriority.CRITICAL} · 🟠 {stats.byPriority.HIGH} · 🟡 {stats.byPriority.MEDIUM} · ⚪ {stats.byPriority.LOW}
272
+
273
+ ## {workspace.name}
274
+
275
+ ### {project.name}
276
+
277
+ | # | Task | Status | Priority | Labels |
278
+ |---|------|--------|----------|--------|
279
+ | 1 | {title} {lastSessionId ? "🔁" : ""} | {status} | {priority} | {labels} |
280
+ ```
281
+
282
+ Sorted by priority (CRITICAL first). 🔁 = resumable session.
283
+
284
+ ### Search Results (`search`)
285
+
286
+ Categories: `task`, `project`, `repository`, `note`, `asset`, `all`. Result count = `results.length`.
287
+
288
+ ```
289
+ 🔍 Results for "{query}" ({results.length} found)
290
+
291
+ | Type | Name | Location | Snippet |
292
+ |------|------|----------|---------|
293
+ | {type} | {title} | {subtitle} | {snippet ?? "—"} |
294
+ ```
295
+
296
+ ### Execution Status (`get_task_execution_status`)
297
+
298
+ ```
299
+ ⚙️ **{taskTitle}**
300
+ - Execution: {executionStatus} · Terminal: {terminalStatus}
301
+ - Started: {startedAt} {endedAt ? "· Ended: " + endedAt : ""}
302
+ - ID: {executionId}
303
+ - Output (last lines):
304
+ \`\`\`
305
+ {outputSnippet ?? "No output"}
306
+ \`\`\`
307
+ ```
308
+
309
+ ### Start Execution Confirmation (`start_task_execution`)
310
+
311
+ ```
312
+ ⚡ Execution started
313
+ - Task: {taskId}
314
+ - Execution ID: {executionId}
315
+ - Worktree: {worktreePath ?? "direct mode"}
316
+ ```
317
+
318
+ ### Terminal Output (`get_task_terminal_output`)
319
+
320
+ ```
321
+ 📺 Terminal — {taskId} ({total} total lines, showing last {lines.length})
322
+
323
+ \`\`\`
324
+ {lines.join("\n")}
325
+ \`\`\`
326
+ ```
327
+
328
+ ### Labels (`list_labels`)
329
+
330
+ ```
331
+ 🏷️ Labels for {workspaceName}
332
+
333
+ | Label | Color | Type |
334
+ |-------|-------|------|
335
+ | {name} | {color} | {isBuiltin ? "Builtin" : "Custom"} |
336
+ ```
337
+
338
+ ### Project Identification (`identify_project`)
339
+
340
+ ```
341
+ 🔎 Project matches for "{query}"
342
+
343
+ | Project | Alias | Workspace | Confidence |
344
+ |---------|-------|-----------|------------|
345
+ | {name} | {alias ?? "—"} | {workspaceName} | {(confidence * 100).toFixed(0)}% |
346
+ ```
347
+
348
+ ### Notes (`manage_notes` — list/get)
349
+
350
+ ```
351
+ 📝 Notes for {projectName}
352
+
353
+ | Title | Updated | Preview |
354
+ |-------|---------|---------|
355
+ | {title} | {updatedAt (MM-DD HH:mm)} | {content (first 60 chars)}... |
356
+ ```
357
+
358
+ ### Assets (`manage_assets` — list)
359
+
360
+ ```
361
+ 📎 Assets for {projectName}
362
+
363
+ | Name | Type | Size | Linked Tasks |
364
+ |------|------|------|-------------|
365
+ | {originalName} | {mimeType} | {size} | {taskCount} |
366
+ ```
367
+
368
+ ---
369
+
370
+ ## Important Rules
371
+
372
+ - **Scope boundary**: You are a **task management operator only**. If the user asks you to write code, explain code, debug, search the web, read/write files, or anything outside Tower task management, reply: "抱歉,我只能帮你管理工作区、项目和任务。编码、调试等操作请在任务终端中完成。" Do NOT attempt to answer out-of-scope questions.
373
+ - **Display format is mandatory**: always use the templates above, never output raw JSON or invent custom formats
374
+ - **Empty results**: always output "No {items} found." — never silently return nothing
375
+ - **SubPath**: for monorepo or multi-folder projects, use `subPath` on task creation to specify the working directory (e.g. "packages/web"). The project description should document the directory structure. If not sure, omit subPath.
376
+ - **Cascade deletes**: deleting a workspace removes all its projects and tasks
377
+ - **Label replacement**: `set_task_labels` and `update_task` with labelIds do a full replace, not merge
378
+ - **Builtin labels**: cannot be deleted (isBuiltin: true)
379
+ - **One terminal per task**: each task can have at most one active PTY session
380
+ - **Search limit**: returns at most 20 results per query
381
+ - **Search categories**: `task`, `project`, `repository`, `note`, `asset`, `all`
@@ -1,4 +0,0 @@
1
- module.exports=[522734,(e,r,t)=>{r.exports=e.x("fs",()=>require("fs"))},933919,(e,r,t)=>{r.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},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"))},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"))},843793,e=>{"use strict";var r=e.i(933919);let t=globalThis.prisma??new r.PrismaClient({log:[]});process.on("SIGTERM",()=>{t.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{t.$disconnect().catch(()=>{})}),e.s(["db",0,t])},660526,(e,r,t)=>{r.exports=e.x("node:os",()=>require("node:os"))},192520,e=>{"use strict";let r;var t=e.i(750227),s=e.i(660526),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},"getStorageDir",0,function(){let e=(0,t.join)(i(),"storage");return(0,o.existsSync)(e)||(0,o.mkdirSync)(e,{recursive:!0}),e},"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])},173215,e=>{"use strict";var r=e.i(902157),t=e.i(660526),s=e.i(750227),o=e.i(279711),i=e.i(192520);let n="tower";function a(){let e=(0,i.getTowerDir)(),r=s.join((0,t.homedir)(),".tower");if(s.resolve(e)===s.resolve(r))return"tower";let o=s.basename(e),n=o.match(/^\.?tower-(.+)$/);return n?`tower-${l(n[1])}`:`tower-${l(o)}`}function l(e){return e.replace(/[^a-z0-9_-]/gi,"-").toLowerCase().slice(0,32)}async function c(e,l){let c,d,u,p,m=o.providerRegistry.get(e),h=m?.cli?.adapter;if(!h||!await h.isAvailable())return{provider:e,available:!1,ok:!1};let k="claude"===e?function(e={}){let o=e.homeDir??t.homedir(),i=e.repoRoot??process.cwd(),n=[];return n.push(function(e){let t=s.join(e,".claude","settings.json");if(!r.existsSync(t))return{removed:!1,path:t};try{let e=r.readFileSync(t,"utf-8"),s=JSON.parse(e),o=s.mcpServers;if("object"!=typeof o||null===o||Array.isArray(o)||!("tower"in o))return{removed:!1,path:t};let i=o.tower;return delete o.tower,0===Object.keys(o).length?delete s.mcpServers:s.mcpServers=o,r.writeFileSync(t,JSON.stringify(s,null,2)+"\n","utf-8"),{removed:!0,path:t,removedEntry:i,reason:"wrong-file"}}catch(e){return{removed:!1,path:t,error:e instanceof Error?e.message:String(e)}}}(o)),n.push(function(e,t,o){if(!r.existsSync(e))return{removed:!1,path:e};try{let i=r.readFileSync(e,"utf-8"),n=JSON.parse(i),a=n.mcpServers;if("object"!=typeof a||null===a||Array.isArray(a))return{removed:!1,path:e};let l=a.tower;if(!l)return{removed:!1,path:e};let c=function(e,t){let o,i=e.args;if(!Array.isArray(i))return"foreign-repo";for(let e of i)if("string"==typeof e&&s.isAbsolute(e)){o=e;break}return o?r.existsSync(o)?s.resolve(o).startsWith(s.resolve(t)+s.sep)?"current-repo":"foreign-repo":"missing-path":"foreign-repo"}(l,o);if("current-repo"===c)return{removed:!1,path:e,reason:"alive-current-repo"};return delete a.tower,0===Object.keys(a).length?delete n.mcpServers:n.mcpServers=a,r.writeFileSync(e,JSON.stringify(n,null,2)+"\n","utf-8"),{removed:!0,path:e,removedEntry:l,reason:`${t}:${c}`}}catch(r){return{removed:!1,path:e,error:r instanceof Error?r.message:String(r)}}}(s.join(o,".mcp.json"),"home-mcp-json",i)),{steps:n,removedAny:n.some(e=>e.removed)}}():void 0,v=(c=process.cwd().replace(/\\/g,"/"),d=process.env.DATABASE_URL||`file:${(0,i.getTowerDbPath)().replace(/\\/g,"/")}`,u=`${c}/dist/mcp-server.cjs`,p=a(),(0,r.existsSync)(u)?{name:p,command:"node",args:[u],env:{DATABASE_URL:d}}:{name:p,command:`${c}/node_modules/.bin/tsx`,args:[`${c}/src/mcp/index.ts`],env:{DATABASE_URL:d}}),g=await h.installMcp(v,{scope:"user"}),f=await h.installHooks(l),y=await h.installSkill(n,s.join(process.cwd(),"skills",n));return{provider:e,available:!0,migration:k,mcp:g,hooks:f,skill:y,ok:g.ok&&f.ok&&y.ok}}e.s(["getTowerMcpName",0,a,"installAllForProvider",0,c],173215)},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}})},279711,e=>{"use strict";class r{providers=new Map;register(e){this.providers.set(e.name,e)}get(e){return this.providers.get(e)}getAll(){return Array.from(this.providers.values())}getCliAdapter(e){return this.providers.get(e)?.cli?.adapter??null}getQueryAdapter(e,r){let t=this.providers.get(e);return t?"api"===r?t.api?.adapter??null:t.cliQuery?.adapter??null:null}getAllowedCommands(){let e=[];for(let r of this.providers.values())r.cli?.command&&e.push(r.cli.command);return e}async getAvailableProviders(){let e=[];for(let r of this.providers.values()){let t=!!r.cli&&await r.cli.adapter.isAvailable(),s=t&&r.cli?await r.cli.adapter.getVersion():null,o=!!r.api&&!!process.env[r.api.keyEnvVar],i=!!r.api&&o;e.push({name:r.name,displayName:r.displayName,cli:{available:t,version:s},api:{available:i,keyConfigured:o}})}return e}}var t=e.i(472129),s=e.i(902157),o=e.i(660526),i=e.i(750227),n=e.i(769310);let a=["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],l=globalThis;if(!l.__providerRegistry){let c=new r;c.register({name:"claude",displayName:"Claude Code",agentFieldValue:"CLAUDE_CODE",cli:{command:"claude",adapter:new t.ClaudeCliAdapter},models:{cli:["sonnet","opus","haiku","claude-sonnet-4-6","claude-opus-4-6","claude-haiku-4-5-20251001"],api:[]}}),c.register({name:"codex",displayName:"Codex CLI",agentFieldValue:"CODEX_CLI",cli:{command:"codex",adapter:new class r{buildSpawnArgs(e){let r=[];e.resumeSessionId?r.push("resume",e.resumeSessionId):e.continueLatest?r.push("resume","--last"):(r.push("--full-auto"),e.extraArgs?.length&&r.push(...e.extraArgs),e.prompt&&r.push(e.prompt));let t={...e.envOverrides??{}};return{command:this.resolveCommand(),args:r,env:t}}buildEnvOverrides(e){let r={TOWER_TASK_ID:e.taskId,TOWER_TASK_TITLE:e.taskTitle,TOWER_STARTED_AT:new Date().toISOString(),TOWER_API_URL:e.apiUrl};return e.callbackUrl&&(r.CALLBACK_URL=e.callbackUrl),r}async installHooks(e){try{let e=this.readHooks(),r=process.cwd().replace(/\\/g,"/"),t=!1,s=this.getHookArray(e,"SessionStart");if(!this.hasHook(s,"session-start-hook.js")){let o=i.join(r,"scripts","session-start-hook.js").replace(/\\/g,"/");s.push({hooks:[{command:`node "${o}"`,timeout:5,type:"command"}]}),e.SessionStart=s,t=!0}let o=this.getHookArray(e,"PostToolUse");if(!this.hasHook(o,"post-tool-hook.js")){let s=i.join(r,"scripts","post-tool-hook.js").replace(/\\/g,"/");o.push({hooks:[{command:`node "${s}"`,timeout:10,type:"command"}],matcher:"Write|Edit|MultiEdit"}),e.PostToolUse=o,t=!0}let n=this.getHookArray(e,"Stop");if(!this.hasHook(n,"stop-hook.js")){let s=i.join(r,"scripts","stop-hook.js").replace(/\\/g,"/");n.push({hooks:[{command:`node "${s}"`,timeout:5,type:"command"}]}),e.Stop=n,t=!0}return t&&(this.writeHooks(e),this.ensureHooksFeatureEnabled()),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async uninstallHooks(){try{let e=this.readHooks(),r=["session-start-hook.js","post-tool-hook.js","stop-hook.js"];for(let t of["SessionStart","PostToolUse","Stop"]){let s=this.getHookArray(e,t);e[t]=s.filter(e=>!e.hooks?.some(e=>r.some(r=>e.command?.includes(r))))}return this.writeHooks(e),{ok:!0,method:"file",detail:this.getHooksPath()}}catch(e){return{ok:!1,method:"file",detail:this.getHooksPath(),error:e instanceof Error?e.message:String(e)}}}async isHooksInstalled(){let e=this.readHooks(),r=this.getHookArray(e,"PostToolUse");return this.hasHook(r,"post-tool-hook.js")}async installMcp(e,r={}){let t=this.resolveCommand(),s=["mcp","add",e.name];if(e.env)for(let[r,t]of Object.entries(e.env))s.push("--env",`${r}=${t}`);s.push("--",e.command,...e.args);try{return await this.runCli(t,["mcp","remove",e.name],r.cwd).catch(()=>{}),await this.runCli(t,s,r.cwd),{ok:!0,method:"cli",detail:`${t} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${t} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async uninstallMcp(e,r={}){let t=this.resolveCommand(),s=["mcp","remove",e];try{return await this.runCli(t,s,r.cwd),{ok:!0,method:"cli",detail:`${t} ${s.join(" ")}`}}catch(e){return{ok:!1,method:"cli",detail:`${t} ${s.join(" ")}`,error:e instanceof Error?e.message:String(e)}}}async isMcpInstalled(e,r={}){let t=this.resolveCommand();try{return await this.runCli(t,["mcp","get",e],r.cwd,5e3),!0}catch{return!1}}async installSkill(e,r){let t=i.join(this.getConfigDir(),"skills",e);try{if(!s.existsSync(r))return{ok:!1,method:"symlink",detail:t,error:`Source skill dir does not exist: ${r}`};s.mkdirSync(i.dirname(t),{recursive:!0});let e=await s.promises.lstat(t).catch(()=>null);if(e)if(!e.isSymbolicLink())return{ok:!1,method:"symlink",detail:t,error:`Refusing to overwrite non-symlink at ${t}`};else{let e=await s.promises.readlink(t);if(i.resolve(e)===i.resolve(r))return{ok:!0,method:"symlink",detail:`${t} → ${r} (already)`};await s.promises.unlink(t)}return await s.promises.symlink(r,t,"dir"),{ok:!0,method:"symlink",detail:`${t} → ${r}`}}catch(e){return{ok:!1,method:"symlink",detail:t,error:e instanceof Error?e.message:String(e)}}}async uninstallSkill(e){let r=i.join(this.getConfigDir(),"skills",e);try{let e=await s.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 s.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 t=i.join(this.getConfigDir(),"skills",e);try{if(!(await s.promises.lstat(t)).isSymbolicLink())return!1;if(!r)return!0;let e=await s.promises.readlink(t),o=i.isAbsolute(e)?e:i.resolve(i.dirname(t),e);return i.resolve(o)===i.resolve(r)}catch{return!1}}async runCli(r,t,s,o=1e4){let{execFile:i}=await e.A(482848),{promisify:n}=await e.A(268548),a=n(i),{stdout:l}=await a(r,t,{cwd:s,timeout:o});return l}async isAvailable(){return null!==await this.getVersion()}async getVersion(){try{let{execFile:r}=await e.A(144264),{promisify:t}=await e.A(534777),s=t(r),o=this.resolveCommand(),{stdout:i}=await s(o,["--version"],{timeout:5e3});return i.trim()||null}catch{return null}}async getModels(){return a}getConfigDir(){return i.join(o.homedir(),".codex")}getSettingsPath(){return i.join(this.getConfigDir(),"config.toml")}getSessionsDir(){return i.join(this.getConfigDir(),"sessions")}getApiKeyInfo(){return{envVar:"OPENAI_API_KEY",required:!1}}buildHelloProbeArgs(){return{command:this.resolveCommand(),args:["exec","-"]}}resolveCommand(){return process.env.CODEX_CLI_PATH?process.env.CODEX_CLI_PATH:(0,n.resolveCommandPathSync)("codex")}getHooksPath(){return i.join(this.getConfigDir(),"hooks.json")}readHooks(){try{return JSON.parse(s.readFileSync(this.getHooksPath(),"utf-8")).hooks??{}}catch{return{}}}writeHooks(e){let r=this.getConfigDir();s.existsSync(r)||s.mkdirSync(r,{recursive:!0}),s.writeFileSync(this.getHooksPath(),JSON.stringify({hooks:e},null,2),"utf-8")}ensureHooksFeatureEnabled(){let e=this.getSettingsPath(),r="";try{r=s.readFileSync(e,"utf-8")}catch{}if(/codex_hooks\s*=\s*true/.test(r))return;/\[features\]/.test(r)?r=r.replace(/\[features\]/,"[features]\ncodex_hooks = true"):r+="\n[features]\ncodex_hooks = true\n";let t=this.getConfigDir();s.existsSync(t)||s.mkdirSync(t,{recursive:!0}),s.writeFileSync(e,r,"utf-8")}getHookArray(e,r){let t=e[r];return Array.isArray(t)?t:[]}hasHook(e,r){return e.some(e=>e.hooks?.some(e=>e.command?.includes(r)))}}},models:{cli:["o4-mini","o3","gpt-4.1","gpt-4.1-mini","gpt-4.1-nano","codex-mini-latest"],api:[]}}),l.__providerRegistry=c}let c=l.__providerRegistry;e.s(["providerRegistry",0,c],279711)},932583,e=>{"use strict";var r=e.i(921675),t=e.i(843793);async function s(e,r={}){let o=r.report,i=o?JSON.stringify(o):null;await t.db.providerConnection.upsert({where:{provider:e},create:{provider:e,lastTestedAt:new Date,testOk:!0,version:r.version??null,mcpInstalled:o?.mcp?.ok??!1,hooksInstalled:o?.hooks?.ok??!1,skillsInstalled:o?.skill?.ok??!1,installLog:i},update:{lastTestedAt:new Date,testOk:!0,version:r.version??null,mcpInstalled:o?.mcp?.ok??!1,hooksInstalled:o?.hooks?.ok??!1,skillsInstalled:o?.skill?.ok??!1,installLog:i}})}async function o(e,r={}){await t.db.providerConnection.upsert({where:{provider:e},create:{provider:e,lastTestedAt:new Date,testOk:!1,installLog:r.reason??null},update:{lastTestedAt:new Date,testOk:!1,mcpInstalled:!1,hooksInstalled:!1,skillsInstalled:!1,installLog:r.reason??null}})}async function i(e){let r=await t.db.providerConnection.findUnique({where:{provider:e}});return!!r&&r.testOk&&r.mcpInstalled&&r.hooksInstalled&&r.skillsInstalled}async function n(){return(await t.db.providerConnection.findMany({where:{testOk:!0,mcpInstalled:!0,hooksInstalled:!0,skillsInstalled:!0},select:{provider:!0},orderBy:{provider:"asc"}})).map(e=>e.provider)}async function a(){return t.db.providerConnection.findMany({select:{provider:!0,lastTestedAt:!0,testOk:!0,version:!0,mcpInstalled:!0,hooksInstalled:!0,skillsInstalled:!0,installLog:!0},orderBy:{provider:"asc"}})}(0,e.i(86708).ensureServerEntryExports)([s,o,i,n,a]),(0,r.registerServerReference)(s,"60bfac4d8a84cfc8a50aaf8f7c80e53b0829767209",null),(0,r.registerServerReference)(o,"609a813a377de3ae5efca9187c0d69ab079fb791e8",null),(0,r.registerServerReference)(i,"402122372e078d3b4d354a06d46800cea3913baa0e",null),(0,r.registerServerReference)(n,"00f1b27b42c89358c138136f95d73465a530d77838",null),(0,r.registerServerReference)(a,"00633c627f11fdcba5dff95e7d77576a38c978a1ec",null),e.s(["getConnectedProviders",0,n,"isProviderConnected",0,i,"markProviderConnected",0,s,"markProviderDisconnected",0,o])},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)))}];
3
-
4
- //# sourceMappingURL=%5Broot-of-the-server%5D__0-eibah._.js.map
@@ -1,4 +0,0 @@
1
- module.exports=[324725,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},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"))},874533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},980738,(e,t,r)=>{t.exports=e.x("node-pty-c710df912a232c01",()=>require("node-pty-c710df912a232c01"))},433541,e=>e.a(async(t,r)=>{try{let t=await e.y("ws-4df7fc762dfa9a52");e.n(t),r()}catch(e){r(e)}},!0),504446,(e,t,r)=>{t.exports=e.x("net",()=>require("net"))},933919,(e,t,r)=>{t.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},522734,(e,t,r)=>{t.exports=e.x("fs",()=>require("fs"))},814747,(e,t,r)=>{t.exports=e.x("path",()=>require("path"))},918622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},556704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},270406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},446786,(e,t,r)=>{t.exports=e.x("os",()=>require("os"))},912714,(e,t,r)=>{t.exports=e.x("node:fs/promises",()=>require("node:fs/promises"))},660526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},192520,e=>{"use strict";let t;var r=e.i(750227),n=e.i(660526),a=e.i(902157);function s(){return t||(t=process.env.TOWER_DATA_DIR||(0,r.join)((0,n.homedir)(),".tower"),(0,a.existsSync)(t)||(0,a.mkdirSync)(t,{recursive:!0})),t}e.s(["getAssistantDir",0,function(){let e=(0,r.join)(s(),"assistant");return(0,a.existsSync)(e)||(0,a.mkdirSync)(e,{recursive:!0}),e},"getBackupsDir",0,function(){let e=(0,r.join)(s(),"backups");return(0,a.existsSync)(e)||(0,a.mkdirSync)(e,{recursive:!0}),e},"getStorageDir",0,function(){let e=(0,r.join)(s(),"storage");return(0,a.existsSync)(e)||(0,a.mkdirSync)(e,{recursive:!0}),e},"getTowerDbPath",0,function(){let e;return(0,r.join)((e=(0,r.join)(s(),"database"),(0,a.existsSync)(e)||(0,a.mkdirSync)(e,{recursive:!0}),e),"tower.db")},"getTowerDir",0,s])},666680,(e,t,r)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},482819,(e,t,r)=>{"use strict";t.exports=e.r(583981).vendored["react-rsc"].ReactServerDOMTurbopackServer},921675,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"registerServerReference",{enumerable:!0,get:function(){return n.registerServerReference}});let n=e.r(482819)},86708,(e,t,r)=>{"use strict";function n(e){for(let t=0;t<e.length;t++){let r=e[t];if("function"!=typeof r)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof r}.
2
- Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ensureServerEntryExports",{enumerable:!0,get:function(){return n}})},843793,e=>{"use strict";var t=e.i(933919);let r=globalThis.prisma??new t.PrismaClient({log:[]});process.on("SIGTERM",()=>{r.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{r.$disconnect().catch(()=>{})}),e.s(["db",0,r])},572173,e=>{"use strict";var t=e.i(843793);async function r(e,r){let n=await t.db.systemConfig.findUnique({where:{key:e}});if(!n)return r;try{return JSON.parse(n.value)}catch{return r}}e.s(["readConfigValue",0,r])},658053,e=>{"use strict";e.s(["ASSISTANT_SESSION_KEY",0,"__assistant__"])},427699,(e,t,r)=>{t.exports=e.x("events",()=>require("events"))},687769,(e,t,r)=>{t.exports=e.x("node:events",()=>require("node:events"))},81111,(e,t,r)=>{t.exports=e.x("node:stream",()=>require("node:stream"))},899871,(e,t,r)=>{t.exports=e.x("node:string_decoder",()=>require("node:string_decoder"))},449719,(e,t,r)=>{t.exports=e.x("assert",()=>require("assert"))},500874,(e,t,r)=>{t.exports=e.x("buffer",()=>require("buffer"))},406461,(e,t,r)=>{t.exports=e.x("zlib",()=>require("zlib"))},57328,(e,t,r)=>{t.exports=e.x("node:assert",()=>require("node:assert"))},276534,e=>{"use strict";e.s(["CONFIG_DEFAULTS",0,{"git.pathMappingRules":{defaultValue:[],type:"object",label:"Git Path Mapping Rules"},"system.maxUploadBytes":{defaultValue:0x3200000,type:"number",label:"Max Upload Size (bytes)"},"system.maxConcurrentExecutions":{defaultValue:20,type:"number",label:"Max Concurrent Executions"},"system.maxReadableFileBytes":{defaultValue:5242880,type:"number",label:"Max Readable File Size (bytes)"},"system.backupDir":{defaultValue:"",type:"string",label:"Backup Directory"},"git.timeoutSec":{defaultValue:30,type:"number",label:"Git Operation Timeout (seconds)"},"search.resultLimit":{defaultValue:20,type:"number",label:"Search Result Limit"},"search.allModeCap":{defaultValue:5,type:"number",label:"All-Mode Per-Type Cap"},"search.debounceMs":{defaultValue:250,type:"number",label:"Search Debounce (ms)"},"search.snippetLength":{defaultValue:80,type:"number",label:"Snippet Length (characters)"},"search.codeTimeoutSec":{defaultValue:30,type:"number",label:"Code Search Timeout (seconds)"},"missions.grid.minCols":{defaultValue:1,type:"number",label:"Grid Min Columns"},"missions.grid.maxCols":{defaultValue:5,type:"number",label:"Grid Max Columns"},"missions.grid.minRows":{defaultValue:1,type:"number",label:"Grid Min Rows"},"missions.grid.maxRows":{defaultValue:5,type:"number",label:"Grid Max Rows"},"terminal.app":{defaultValue:"Terminal",type:"string",label:"Default Terminal App"},"terminal.wsPort":{defaultValue:3001,type:"number",label:"WebSocket Port"},"terminal.idleTimeoutSec":{defaultValue:180,type:"number",label:"Idle Timeout (seconds)"},"assistant.systemPrompt":{defaultValue:'You are Tower Assistant — the built-in AI operator for the Tower task management platform.\n\n## Identity\n- You are a task management operator, NOT a coding assistant.\n- You can ONLY use Tower MCP tools. You CANNOT read files, edit code, run shell commands, or search the web.\n- Always respond in the same language the user uses.\n\n## Capabilities\nWhen users ask what you can do, respond with EXACTLY these 6 groups. Translate to the user\'s language.\n\n1. **Workspace & Project** — View, create, update, delete workspaces and projects. Search projects and repositories.\n2. **Task Management** — Create tasks (priority, labels, worktree branch isolation, sub-path, auto-start). Move task status (TODO → IN_PROGRESS → IN_REVIEW → DONE / CANCELLED). Update task info and labels.\n3. **Execution Monitor** — Start task execution, check execution status, get terminal output, send commands to running terminals.\n4. **Daily Report & Todo** — Generate daily work summary (completed + in-progress). View pending task list sorted by priority.\n5. **Labels & Notes & Assets** — Manage workspace labels, project notes, and file attachments.\n6. **Global Search** — Search tasks, projects, repositories, notes, and assets by keyword.\n\nDo NOT list any capabilities beyond the above. Do NOT mention code editing, debugging, testing, git operations, or any development capabilities.\n\n## Scope Boundary\nIf the user asks you to write code, explain code, debug, search the web, read/write files, or anything outside Tower task management, reply:\n"抱歉,我只能帮你管理工作区、项目和任务。编码、调试等操作请在任务终端中完成。"',type:"string",label:"Assistant System Prompt"},"assistant.displayMode":{defaultValue:"sidebar",type:"string",label:"Assistant Display Mode"},"assistant.communicationMode":{defaultValue:"chat",type:"string",label:"Assistant Communication Mode"}}])},61920,e=>{"use strict";var t=e.i(446786),r=e.i(814747);function n(e){return e.startsWith("~/")?r.default.join(t.default.homedir(),e.slice(2)):e}function a(e){let t,r=e.match(/^git@([^:]+):(.+)$/);if(r)return{host:r[1],pathSegments:s(r[2]).split("/").filter(Boolean)};try{t=new URL(e)}catch{return null}return{host:t.hostname,pathSegments:s(decodeURIComponent(t.pathname)).split("/").filter(Boolean)}}function s(e){return e.replace(/\.git\/?$/,"")}e.s(["gitUrlToLocalPath",0,function(e){let t=e.trim();if(!t)return"";try{let e=a(t);if(!e)return"";let{host:s,pathSegments:i}=e;if("code.iflytek.com"===s){let e,t;return n((e=[...i],"osc"===e[0]&&"_source"===e[1]&&(e=e.slice(2)),((t=e.indexOf("-"))>0&&(e=e.slice(0,t)),0===e.length)?"":`~/company/${e.join("/")}`))}if("github.com"===s){var r;let e,t;return n((e=(r=i)[0],t=r[1],e&&t?`${"jp-liu"===e?"~/project/i":"~/project/f"}/${t}`:""))}let o=i[i.length-1];return o?n(`~/project/f/${o}`):""}catch{return""}},"matchGitPathRule",0,function(e,t){if(!t.length)return"";let r=e.trim();if(!r)return"";let s=a(r);if(!s)return"";let{host:i,pathSegments:o}=s,l=o[0]??"",u=o[o.length-1]??"",c=[...t].sort((e,t)=>{let r=+("*"===e.ownerMatch),n=+("*"===t.ownerMatch);return r!==n?r-n:e.priority-t.priority}),p=o.join("/");for(let e of c){if(e.host!==i||"*"!==e.ownerMatch&&e.ownerMatch!==l)continue;let t=e.localPathTemplate;if(t.includes("{path}"))return n(t.replace("{path}",p).replace("{owner}",l).replace("{repo}",u).replace(/\/+$/,""));let r=t.replace("{owner}",l).replace("{repo}","").replace(/\/+$/,"");return n(`${r}/${u}`)}return""}])},22569,e=>e.a(async(t,r)=>{try{var n=e.i(921675),a=e.i(843793),s=e.i(276534),i=e.i(61920),o=e.i(769310),l=e.i(721390),u=e.i(86708),c=t([l]);async function p(e,t){let r=await a.db.systemConfig.findUnique({where:{key:e}});if(!r)return t;try{return JSON.parse(r.value)}catch{return t}}async function d(e,t){await a.db.systemConfig.upsert({where:{key:e},create:{key:e,value:JSON.stringify(t)},update:{value:JSON.stringify(t)}})}async function f(e){let t=e.trim();if(!t)return"";try{let e=await p("git.pathMappingRules",[]),r=(0,i.matchGitPathRule)(t,e);if(r)return r;return(0,i.gitUrlToLocalPath)(t)}catch{return(0,i.gitUrlToLocalPath)(t)}}async function m(e){let t=await a.db.systemConfig.findMany({where:{key:{in:e}}}),r=Object.fromEntries(t.map(e=>{try{return[e.key,JSON.parse(e.value)]}catch{return[e.key,null]}})),n={};for(let t of e)n[t]=t in r?r[t]:s.CONFIG_DEFAULTS[t]?.defaultValue??null;return n}async function y(){return(0,o.detectShells)()}async function b(){return(0,o.detectTerminalApps)()}async function g(){return{platform:process.platform}}async function x(){let e=(0,l.getActiveWsPort)();if(null!==e)return e;let t=parseInt(process.env.PORT||"3000",10);return p("terminal.wsPort",t+1)}[l]=c.then?(await c)():c,(0,u.ensureServerEntryExports)([p,d,f,m,y,b,g,x]),(0,n.registerServerReference)(p,"604228e8167147dad385e05e214722512256091f8f",null),(0,n.registerServerReference)(d,"60c0ecfed34768b8715cd468e9abc4c6fa11d68ab5",null),(0,n.registerServerReference)(f,"40aba639dc593066ac63c8ec541ceb62bd496f2851",null),(0,n.registerServerReference)(m,"40f1971affa3738b021a5049f45140ac16887a04ce",null),(0,n.registerServerReference)(y,"00018330b9515eff599b83f6e8aee6a443832226cc",null),(0,n.registerServerReference)(b,"0013a3cd3a8e31b13f33788cc92b5aba4c68857cd2",null),(0,n.registerServerReference)(g,"00910df10bbfc4b5d291a45250d3df378d48f82ed1",null),(0,n.registerServerReference)(x,"0051ddd6448fbf2a66a65d7e1315914f3b5c11ab78",null),e.s(["getConfigValue",0,p]),r()}catch(e){r(e)}},!1)];
3
-
4
- //# sourceMappingURL=%5Broot-of-the-server%5D__0.9mj3v._.js.map
@@ -1,4 +0,0 @@
1
- module.exports=[324725,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},814747,(e,t,r)=>{t.exports=e.x("path",()=>require("path"))},918622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},556704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},270406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},446786,(e,t,r)=>{t.exports=e.x("os",()=>require("os"))},933919,(e,t,r)=>{t.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},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"))},874533,(e,t,r)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},980738,(e,t,r)=>{t.exports=e.x("node-pty-c710df912a232c01",()=>require("node-pty-c710df912a232c01"))},433541,e=>e.a(async(t,r)=>{try{let t=await e.y("ws-4df7fc762dfa9a52");e.n(t),r()}catch(e){r(e)}},!0),504446,(e,t,r)=>{t.exports=e.x("net",()=>require("net"))},660526,(e,t,r)=>{t.exports=e.x("node:os",()=>require("node:os"))},192520,e=>{"use strict";let t;var r=e.i(750227),a=e.i(660526),n=e.i(902157);function s(){return t||(t=process.env.TOWER_DATA_DIR||(0,r.join)((0,a.homedir)(),".tower"),(0,n.existsSync)(t)||(0,n.mkdirSync)(t,{recursive:!0})),t}e.s(["getAssistantDir",0,function(){let e=(0,r.join)(s(),"assistant");return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),e},"getBackupsDir",0,function(){let e=(0,r.join)(s(),"backups");return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),e},"getStorageDir",0,function(){let e=(0,r.join)(s(),"storage");return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),e},"getTowerDbPath",0,function(){let e;return(0,r.join)((e=(0,r.join)(s(),"database"),(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),e),"tower.db")},"getTowerDir",0,s])},482819,(e,t,r)=>{"use strict";t.exports=e.r(583981).vendored["react-rsc"].ReactServerDOMTurbopackServer},921675,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"registerServerReference",{enumerable:!0,get:function(){return a.registerServerReference}});let a=e.r(482819)},86708,(e,t,r)=>{"use strict";function a(e){for(let t=0;t<e.length;t++){let r=e[t];if("function"!=typeof r)throw Object.defineProperty(Error(`A "use server" file can only export async functions, found ${typeof r}.
2
- Read more: https://nextjs.org/docs/messages/invalid-use-server-value`),"__NEXT_ERROR_CODE",{value:"E352",enumerable:!1,configurable:!0})}}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ensureServerEntryExports",{enumerable:!0,get:function(){return a}})},843793,e=>{"use strict";var t=e.i(933919);let r=globalThis.prisma??new t.PrismaClient({log:[]});process.on("SIGTERM",()=>{r.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{r.$disconnect().catch(()=>{})}),e.s(["db",0,r])},572173,e=>{"use strict";var t=e.i(843793);async function r(e,r){let a=await t.db.systemConfig.findUnique({where:{key:e}});if(!a)return r;try{return JSON.parse(a.value)}catch{return r}}e.s(["readConfigValue",0,r])},658053,e=>{"use strict";e.s(["ASSISTANT_SESSION_KEY",0,"__assistant__"])},666680,(e,t,r)=>{t.exports=e.x("node:crypto",()=>require("node:crypto"))},341291,e=>{"use strict";var t=e.i(666680),r=e.i(902157),a=e.i(750227);let n=(0,e.i(192520).getStorageDir)();function s(e){if(!e.startsWith(n+a.sep))throw Error("Path traversal detected")}let i=new Set(["image","screenshot","img","photo","picture","clipboard","paste","untitled"]);e.s(["buildCacheFilename",0,function(e,r){let n=a.basename(e,a.extname(e)),s=t.randomUUID().replace(/-/g,"").slice(0,8),o=n.toLowerCase();if(!n||i.has(o)||/^screenshot[\s_\-]/i.test(n))return`tower_image-${s}${r}`;let l=n.replace(/[^\p{L}\p{N}]/gu,"_").replace(/_+/g,"_").replace(/^_+|_+$/g,"");return`${l||"file"}-${s}${r}`},"ensureAssetsDir",0,function(e){let t,i=(s(t=a.join(n,"assets",e)),t);return r.mkdirSync(i,{recursive:!0}),i},"getAssistantCacheDir",0,function(e="images"){let t=new Date,i=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}`,o=a.join(n,"cache","assistant",i,e);return s(o),r.mkdirSync(o,{recursive:!0}),o},"getAssistantCacheRoot",0,function(){let e=a.join(n,"cache","assistant");return s(e),e}])},634712,e=>{"use strict";let t=["jpg","jpeg","png","gif","webp"],r=["md","txt","json","csv"],a=[...t,...r].join("|"),n=RegExp(`^\\d{4}-\\d{2}/(images|files)/[^/]+\\.(${a})$`,"i");function s(e){let a=e.replace(/^\./,"").toLowerCase();return t.includes(a)?"image":r.includes(a)?"text":null}[...t.map(e=>`.${e}`),...r.map(e=>`.${e}`),"image/*"].join(","),e.s(["ALLOWED_TEXT_EXTS",0,r,"ATTACHMENT_SUBPATH_RE",0,n,"MAX_ATTACHMENTS",0,10,"classifyAttachmentExt",0,s,"classifyAttachmentSubPath",0,function(e){if(!n.test(e))return null;let t=e.lastIndexOf(".");return t<0?null:s(e.slice(t+1))}])},276534,e=>{"use strict";e.s(["CONFIG_DEFAULTS",0,{"git.pathMappingRules":{defaultValue:[],type:"object",label:"Git Path Mapping Rules"},"system.maxUploadBytes":{defaultValue:0x3200000,type:"number",label:"Max Upload Size (bytes)"},"system.maxConcurrentExecutions":{defaultValue:20,type:"number",label:"Max Concurrent Executions"},"system.maxReadableFileBytes":{defaultValue:5242880,type:"number",label:"Max Readable File Size (bytes)"},"system.backupDir":{defaultValue:"",type:"string",label:"Backup Directory"},"git.timeoutSec":{defaultValue:30,type:"number",label:"Git Operation Timeout (seconds)"},"search.resultLimit":{defaultValue:20,type:"number",label:"Search Result Limit"},"search.allModeCap":{defaultValue:5,type:"number",label:"All-Mode Per-Type Cap"},"search.debounceMs":{defaultValue:250,type:"number",label:"Search Debounce (ms)"},"search.snippetLength":{defaultValue:80,type:"number",label:"Snippet Length (characters)"},"search.codeTimeoutSec":{defaultValue:30,type:"number",label:"Code Search Timeout (seconds)"},"missions.grid.minCols":{defaultValue:1,type:"number",label:"Grid Min Columns"},"missions.grid.maxCols":{defaultValue:5,type:"number",label:"Grid Max Columns"},"missions.grid.minRows":{defaultValue:1,type:"number",label:"Grid Min Rows"},"missions.grid.maxRows":{defaultValue:5,type:"number",label:"Grid Max Rows"},"terminal.app":{defaultValue:"Terminal",type:"string",label:"Default Terminal App"},"terminal.wsPort":{defaultValue:3001,type:"number",label:"WebSocket Port"},"terminal.idleTimeoutSec":{defaultValue:180,type:"number",label:"Idle Timeout (seconds)"},"assistant.systemPrompt":{defaultValue:'You are Tower Assistant — the built-in AI operator for the Tower task management platform.\n\n## Identity\n- You are a task management operator, NOT a coding assistant.\n- You can ONLY use Tower MCP tools. You CANNOT read files, edit code, run shell commands, or search the web.\n- Always respond in the same language the user uses.\n\n## Capabilities\nWhen users ask what you can do, respond with EXACTLY these 6 groups. Translate to the user\'s language.\n\n1. **Workspace & Project** — View, create, update, delete workspaces and projects. Search projects and repositories.\n2. **Task Management** — Create tasks (priority, labels, worktree branch isolation, sub-path, auto-start). Move task status (TODO → IN_PROGRESS → IN_REVIEW → DONE / CANCELLED). Update task info and labels.\n3. **Execution Monitor** — Start task execution, check execution status, get terminal output, send commands to running terminals.\n4. **Daily Report & Todo** — Generate daily work summary (completed + in-progress). View pending task list sorted by priority.\n5. **Labels & Notes & Assets** — Manage workspace labels, project notes, and file attachments.\n6. **Global Search** — Search tasks, projects, repositories, notes, and assets by keyword.\n\nDo NOT list any capabilities beyond the above. Do NOT mention code editing, debugging, testing, git operations, or any development capabilities.\n\n## Scope Boundary\nIf the user asks you to write code, explain code, debug, search the web, read/write files, or anything outside Tower task management, reply:\n"抱歉,我只能帮你管理工作区、项目和任务。编码、调试等操作请在任务终端中完成。"',type:"string",label:"Assistant System Prompt"},"assistant.displayMode":{defaultValue:"sidebar",type:"string",label:"Assistant Display Mode"},"assistant.communicationMode":{defaultValue:"chat",type:"string",label:"Assistant Communication Mode"}}])},61920,e=>{"use strict";var t=e.i(446786),r=e.i(814747);function a(e){return e.startsWith("~/")?r.default.join(t.default.homedir(),e.slice(2)):e}function n(e){let t,r=e.match(/^git@([^:]+):(.+)$/);if(r)return{host:r[1],pathSegments:s(r[2]).split("/").filter(Boolean)};try{t=new URL(e)}catch{return null}return{host:t.hostname,pathSegments:s(decodeURIComponent(t.pathname)).split("/").filter(Boolean)}}function s(e){return e.replace(/\.git\/?$/,"")}e.s(["gitUrlToLocalPath",0,function(e){let t=e.trim();if(!t)return"";try{let e=n(t);if(!e)return"";let{host:s,pathSegments:i}=e;if("code.iflytek.com"===s){let e,t;return a((e=[...i],"osc"===e[0]&&"_source"===e[1]&&(e=e.slice(2)),((t=e.indexOf("-"))>0&&(e=e.slice(0,t)),0===e.length)?"":`~/company/${e.join("/")}`))}if("github.com"===s){var r;let e,t;return a((e=(r=i)[0],t=r[1],e&&t?`${"jp-liu"===e?"~/project/i":"~/project/f"}/${t}`:""))}let o=i[i.length-1];return o?a(`~/project/f/${o}`):""}catch{return""}},"matchGitPathRule",0,function(e,t){if(!t.length)return"";let r=e.trim();if(!r)return"";let s=n(r);if(!s)return"";let{host:i,pathSegments:o}=s,l=o[0]??"",u=o[o.length-1]??"",c=[...t].sort((e,t)=>{let r=+("*"===e.ownerMatch),a=+("*"===t.ownerMatch);return r!==a?r-a:e.priority-t.priority}),p=o.join("/");for(let e of c){if(e.host!==i||"*"!==e.ownerMatch&&e.ownerMatch!==l)continue;let t=e.localPathTemplate;if(t.includes("{path}"))return a(t.replace("{path}",p).replace("{owner}",l).replace("{repo}",u).replace(/\/+$/,""));let r=t.replace("{owner}",l).replace("{repo}","").replace(/\/+$/,"");return a(`${r}/${u}`)}return""}])},22569,e=>e.a(async(t,r)=>{try{var a=e.i(921675),n=e.i(843793),s=e.i(276534),i=e.i(61920),o=e.i(769310),l=e.i(721390),u=e.i(86708),c=t([l]);async function p(e,t){let r=await n.db.systemConfig.findUnique({where:{key:e}});if(!r)return t;try{return JSON.parse(r.value)}catch{return t}}async function d(e,t){await n.db.systemConfig.upsert({where:{key:e},create:{key:e,value:JSON.stringify(t)},update:{value:JSON.stringify(t)}})}async function f(e){let t=e.trim();if(!t)return"";try{let e=await p("git.pathMappingRules",[]),r=(0,i.matchGitPathRule)(t,e);if(r)return r;return(0,i.gitUrlToLocalPath)(t)}catch{return(0,i.gitUrlToLocalPath)(t)}}async function m(e){let t=await n.db.systemConfig.findMany({where:{key:{in:e}}}),r=Object.fromEntries(t.map(e=>{try{return[e.key,JSON.parse(e.value)]}catch{return[e.key,null]}})),a={};for(let t of e)a[t]=t in r?r[t]:s.CONFIG_DEFAULTS[t]?.defaultValue??null;return a}async function h(){return(0,o.detectShells)()}async function g(){return(0,o.detectTerminalApps)()}async function y(){return{platform:process.platform}}async function b(){let e=(0,l.getActiveWsPort)();if(null!==e)return e;let t=parseInt(process.env.PORT||"3000",10);return p("terminal.wsPort",t+1)}[l]=c.then?(await c)():c,(0,u.ensureServerEntryExports)([p,d,f,m,h,g,y,b]),(0,a.registerServerReference)(p,"604228e8167147dad385e05e214722512256091f8f",null),(0,a.registerServerReference)(d,"60c0ecfed34768b8715cd468e9abc4c6fa11d68ab5",null),(0,a.registerServerReference)(f,"40aba639dc593066ac63c8ec541ceb62bd496f2851",null),(0,a.registerServerReference)(m,"40f1971affa3738b021a5049f45140ac16887a04ce",null),(0,a.registerServerReference)(h,"00018330b9515eff599b83f6e8aee6a443832226cc",null),(0,a.registerServerReference)(g,"0013a3cd3a8e31b13f33788cc92b5aba4c68857cd2",null),(0,a.registerServerReference)(y,"00910df10bbfc4b5d291a45250d3df378d48f82ed1",null),(0,a.registerServerReference)(b,"0051ddd6448fbf2a66a65d7e1315914f3b5c11ab78",null),e.s(["getConfigValue",0,p]),r()}catch(e){r(e)}},!1),437513,e=>{"use strict";let t=[{mime:"image/jpeg",check:e=>255===e[0]&&216===e[1]&&255===e[2]},{mime:"image/png",check:e=>137===e[0]&&80===e[1]&&78===e[2]&&71===e[3]},{mime:"image/gif",check:e=>71===e[0]&&73===e[1]&&70===e[2]},{mime:"image/webp",check:e=>82===e[0]&&73===e[1]&&70===e[2]&&70===e[3]&&87===e[8]&&69===e[9]&&66===e[10]&&80===e[11]}];e.s(["MIME_TO_EXT",0,{"image/jpeg":".jpg","image/png":".png","image/gif":".gif","image/webp":".webp"},"TEXT_EXT_TO_MIME",0,{".md":"text/markdown",".txt":"text/plain",".json":"application/json",".csv":"text/csv"},"detectImageMime",0,function(e){if(e.length<12)return null;for(let r of t)if(r.check(e))return r.mime;return null},"isLikelyTextFile",0,function(e){if(0===e.length)return!0;let t=Math.min(e.length,8192);for(let r=0;r<t;r++)if(0===e[r])return!1;return!0}])},648834,e=>e.a(async(t,r)=>{try{var a=e.i(750227),n=e.i(902157),s=e.i(855104),i=e.i(198840),o=e.i(437513),l=e.i(341291),u=e.i(22569),c=e.i(634712),p=t([u]);async function d(e){let t,r,p,d=(0,i.requireLocalhost)(e);if(d)return d;let f=(await e.formData()).get("file");if(!f)return s.NextResponse.json({error:"Missing file field"},{status:400});let m=await (0,u.getConfigValue)("system.maxUploadBytes",0x3200000);if(f.size>m)return s.NextResponse.json({error:"File too large"},{status:400});let h=Buffer.from(await f.arrayBuffer()),g=a.extname(f.name),y=(0,c.classifyAttachmentExt)(g);if(!y)return s.NextResponse.json({error:"Unsupported file type"},{status:400});if("image"===y){let e=(0,o.detectImageMime)(h);if(!e)return s.NextResponse.json({error:"Invalid image content"},{status:400});r=e,t=o.MIME_TO_EXT[e],p=(0,l.getAssistantCacheDir)("images")}else{if(!(0,o.isLikelyTextFile)(h))return s.NextResponse.json({error:"File appears to be binary, not text"},{status:400});let e=g.toLowerCase();if(!c.ALLOWED_TEXT_EXTS.includes(e.replace(/^\./,"")))return s.NextResponse.json({error:"Unsupported text type"},{status:400});t=e,r=o.TEXT_EXT_TO_MIME[e]??"text/plain",p=(0,l.getAssistantCacheDir)("files")}let b=(0,l.buildCacheFilename)(f.name,t),x=a.join(p,b);if(!x.startsWith(p+a.sep)&&x!==p)return s.NextResponse.json({error:"Invalid path"},{status:400});await n.promises.writeFile(x,h);let v=a.relative((0,l.getAssistantCacheRoot)(),x);return s.NextResponse.json({filename:v,mimeType:r,kind:y})}[u]=p.then?(await p)():p,e.s(["POST",0,d,"dynamic",0,"force-dynamic","runtime",0,"nodejs"]),r()}catch(e){r(e)}},!1),122166,e=>e.a(async(t,r)=>{try{var a=e.i(765876),n=e.i(675896),s=e.i(959160),i=e.i(97944),o=e.i(86757),l=e.i(204144),u=e.i(273436),c=e.i(743641),p=e.i(813766),d=e.i(840884),f=e.i(498814),m=e.i(780006),h=e.i(544432),g=e.i(772005),y=e.i(450223),b=e.i(193695);e.i(628400);var x=e.i(800071),v=e.i(648834),w=t([v]);[v]=w.then?(await w)():w;let S=new a.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/internal/assistant/attachments/route",pathname:"/api/internal/assistant/attachments",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/internal/assistant/attachments/route.ts",nextConfigOutput:"standalone",userland:v}),{workAsyncStorage:T,workUnitAsyncStorage:E,serverHooks:C}=S;async function R(e,t,r){r.requestMeta&&(0,i.setRequestMeta)(e,r.requestMeta),S.isDev&&(0,i.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let a="/api/internal/assistant/attachments/route";a=a.replace(/\/index$/,"")||"/";let s=await S.prepare(e,t,{srcPage:a,multiZoneDraftMode:!1});if(!s)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:v,params:w,nextConfig:R,parsedUrl:T,isDraftMode:E,prerenderManifest:C,routerServerContext:A,isOnDemandRevalidate:_,revalidateOnlyGenerated:j,resolvedPathname:k,clientReferenceManifest:M,serverActionsManifest:O}=s,N=(0,u.normalizeAppPath)(a),P=!!(C.dynamicRoutes[N]||C.routes[k]),D=async()=>((null==A?void 0:A.render404)?await A.render404(e,t,T,!1):t.end("This page could not be found"),null);if(P&&!E){let e=!!C.routes[k],t=C.dynamicRoutes[N];if(t&&!1===t.fallback&&!e){if(R.adapterPath)return await D();throw new b.NoFallbackError}}let I=null;!P||S.isDev||E||(I=k,I="/index"===I?"/":I);let q=!0===S.isDev||!P,U=P&&!q;O&&M&&(0,l.setManifestsSingleton)({page:a,clientReferenceManifest:M,serverActionsManifest:O});let $=e.method||"GET",L=(0,o.getTracer)(),V=L.getActiveScopeSpan(),F=!!(null==A?void 0:A.isWrappedByNextServer),H=!!(0,i.getRequestMeta)(e,"minimalMode"),G=(0,i.getRequestMeta)(e,"incrementalCache")||await S.getIncrementalCache(e,R,C,H);null==G||G.resetRequestCache(),globalThis.__incrementalCache=G;let B={params:w,previewProps:C.preview,renderOpts:{experimental:{authInterrupts:!!R.experimental.authInterrupts},cacheComponents:!!R.cacheComponents,supportsDynamicResponse:q,incrementalCache:G,cacheLifeProfiles:R.cacheLife,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,a,n)=>S.onRequestError(e,t,a,n,A)},sharedContext:{buildId:v}},X=new c.NodeNextRequest(e),W=new c.NodeNextResponse(t),K=p.NextRequestAdapter.fromNodeNextRequest(X,(0,p.signalFromNodeResponse)(t));try{let s,i=async e=>S.handle(K,B).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=L.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==d.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let n=r.get("next.route");if(n){let t=`${$} ${n}`;e.setAttributes({"next.route":n,"http.route":n,"next.span_name":t}),e.updateName(t),s&&s!==e&&(s.setAttribute("http.route",n),s.updateName(t))}else e.updateName(`${$} ${a}`)}),l=async s=>{var o,l;let u=async({previousCacheEntry:n})=>{try{if(!H&&_&&j&&!n)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let a=await i(s);e.fetchMetrics=B.renderOpts.fetchMetrics;let o=B.renderOpts.pendingWaitUntil;o&&r.waitUntil&&(r.waitUntil(o),o=void 0);let l=B.renderOpts.collectedTags;if(!P)return await (0,m.sendResponse)(X,W,a,B.renderOpts.pendingWaitUntil),null;{let e=await a.blob(),t=(0,h.toNodeOutgoingHttpHeaders)(a.headers);l&&(t[y.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==B.renderOpts.collectedRevalidate&&!(B.renderOpts.collectedRevalidate>=y.INFINITE_CACHE)&&B.renderOpts.collectedRevalidate,n=void 0===B.renderOpts.collectedExpire||B.renderOpts.collectedExpire>=y.INFINITE_CACHE?void 0:B.renderOpts.collectedExpire;return{value:{kind:x.CachedRouteKind.APP_ROUTE,status:a.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:n}}}}catch(t){throw(null==n?void 0:n.isStale)&&await S.onRequestError(e,t,{routerKind:"App Router",routePath:a,routeType:"route",revalidateReason:(0,f.getRevalidateReason)({isStaticGeneration:U,isOnDemandRevalidate:_})},!1,A),t}},c=await S.handleResponse({req:e,nextConfig:R,cacheKey:I,routeKind:n.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:C,isRoutePPREnabled:!1,isOnDemandRevalidate:_,revalidateOnlyGenerated:j,responseGenerator:u,waitUntil:r.waitUntil,isMinimalMode:H});if(!P)return null;if((null==c||null==(o=c.value)?void 0:o.kind)!==x.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==c||null==(l=c.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});H||t.setHeader("x-nextjs-cache",_?"REVALIDATED":c.isMiss?"MISS":c.isStale?"STALE":"HIT"),E&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let p=(0,h.fromNodeOutgoingHttpHeaders)(c.value.headers);return H&&P||p.delete(y.NEXT_CACHE_TAGS_HEADER),!c.cacheControl||t.getHeader("Cache-Control")||p.get("Cache-Control")||p.set("Cache-Control",(0,g.getCacheControlHeader)(c.cacheControl)),await (0,m.sendResponse)(X,W,new Response(c.value.body,{headers:p,status:c.value.status||200})),null};F&&V?await l(V):(s=L.getActiveScopeSpan(),await L.withPropagatedContext(e.headers,()=>L.trace(d.BaseServerSpan.handleRequest,{spanName:`${$} ${a}`,kind:o.SpanKind.SERVER,attributes:{"http.method":$,"http.target":e.url}},l),void 0,!F))}catch(t){if(t instanceof b.NoFallbackError||await S.onRequestError(e,t,{routerKind:"App Router",routePath:N,routeType:"route",revalidateReason:(0,f.getRevalidateReason)({isStaticGeneration:U,isOnDemandRevalidate:_})},!1,A),P)throw t;return await (0,m.sendResponse)(X,W,new Response(null,{status:500})),null}}e.s(["handler",0,R,"patchFetch",0,function(){return(0,s.patchFetch)({workAsyncStorage:T,workUnitAsyncStorage:E})},"routeModule",0,S,"serverHooks",0,C,"workAsyncStorage",0,T,"workUnitAsyncStorage",0,E]),r()}catch(e){r(e)}},!1)];
3
-
4
- //# sourceMappingURL=%5Broot-of-the-server%5D__05353yb._.js.map
@@ -1,4 +0,0 @@
1
- module.exports=[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"))},660526,(e,r,t)=>{r.exports=e.x("node:os",()=>require("node:os"))},933919,(e,r,t)=>{r.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},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"))},874533,(e,r,t)=>{r.exports=e.x("node:child_process",()=>require("node:child_process"))},980738,(e,r,t)=>{r.exports=e.x("node-pty-c710df912a232c01",()=>require("node-pty-c710df912a232c01"))},522734,(e,r,t)=>{r.exports=e.x("fs",()=>require("fs"))},233405,(e,r,t)=>{r.exports=e.x("child_process",()=>require("child_process"))},924868,(e,r,t)=>{r.exports=e.x("fs/promises",()=>require("fs/promises"))},814747,(e,r,t)=>{r.exports=e.x("path",()=>require("path"))},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"))},446786,(e,r,t)=>{r.exports=e.x("os",()=>require("os"))},843793,e=>{"use strict";var r=e.i(933919);let t=globalThis.prisma??new r.PrismaClient({log:[]});process.on("SIGTERM",()=>{t.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{t.$disconnect().catch(()=>{})}),e.s(["db",0,t])},572173,e=>{"use strict";var r=e.i(843793);async function t(e,t){let n=await r.db.systemConfig.findUnique({where:{key:e}});if(!n)return t;try{return JSON.parse(n.value)}catch{return t}}e.s(["readConfigValue",0,t])},248434,e=>{"use strict";var r=e.i(233405),t=e.i(522734),n=e.i(924868),i=e.i(814747),s=e.i(446786),o=e.i(50377);function a(e){return e.startsWith("~/")||"~"===e?i.default.join(s.default.homedir(),e.slice(1)):e}async function c(e,s,c,l){let d=a(e),u=i.default.join(d,".worktrees","task-"+s),p="task/"+s;await (0,n.mkdir)(i.default.join(d,".worktrees"),{recursive:!0});let f=(0,r.execFileSync)("git",["worktree","list","--porcelain"],{cwd:d,encoding:"utf-8",timeout:1e4}),v=i.default.normalize(u).replace(/\\/g,"/");if(f.split("\n").some(e=>e.startsWith("worktree ")&&e.slice(9).replace(/\\/g,"/")===v))return{worktreePath:u,worktreeBranch:p};if((0,t.existsSync)(u)&&(o.logger.warn(`[worktree] Directory exists but not tracked by git, removing: ${u}`),(0,r.execFileSync)("git",["worktree","remove",u,"--force"],{cwd:d,encoding:"utf-8",timeout:3e4})),(0,r.execFileSync)("git",["branch","--list",p],{cwd:d,encoding:"utf-8",timeout:5e3}).trim())(0,r.execFileSync)("git",["worktree","add",u,p],{cwd:d,encoding:"utf-8",timeout:3e4});else{let e=c;try{(0,r.execFileSync)("git",["rev-parse","--verify",c],{cwd:d,encoding:"utf-8",timeout:5e3,stdio:["pipe","pipe","pipe"]})}catch{try{(0,r.execFileSync)("git",["rev-parse","--verify",`origin/${c}`],{cwd:d,encoding:"utf-8",timeout:5e3,stdio:["pipe","pipe","pipe"]}),e=`origin/${c}`}catch{throw Error(`Base branch '${c}' does not exist locally or on remote. Available branches: `+(0,r.execFileSync)("git",["branch","-a","--format=%(refname:short)"],{cwd:d,encoding:"utf-8",timeout:5e3}).trim().split("\n").join(", "))}}(0,r.execFileSync)("git",["worktree","add","-b",p,u,e],{cwd:d,encoding:"utf-8",timeout:3e4})}return function(e,r,n){let s=o.logger.create("worktree"),a=["node_modules",".next"];for(let o of n?["",n]:[""])if((0,t.existsSync)(i.default.join(e,o,"package.json")))for(let n of a){let a=o?i.default.join(o,n):n,c=i.default.join(e,a),l=i.default.join(r,a);if((0,t.existsSync)(c)){try{(0,t.lstatSync)(l);continue}catch{}try{(0,t.symlinkSync)(c,l,"junction"),s.info(`Symlinked ${a}`,{from:c,to:l})}catch(e){s.warn(`Failed to symlink ${a}`,{error:String(e)})}}}}(d,u,l),{worktreePath:u,worktreeBranch:p}}async function l(e,n){let s=a(e),o=i.default.join(s,".worktrees","task-"+n),c="task/"+n;(0,t.existsSync)(o)&&(0,r.execFileSync)("git",["worktree","remove",o,"--force"],{cwd:s,encoding:"utf-8",timeout:3e4}),(0,r.execFileSync)("git",["branch","--list",c],{cwd:s,encoding:"utf-8",timeout:5e3}).trim()&&(0,r.execFileSync)("git",["branch","-D",c],{cwd:s,encoding:"utf-8",timeout:5e3})}e.s(["createWorktree",0,c,"removeWorktree",0,l])},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 n.registerServerReference}});let n=e.r(482819)},86708,(e,r,t)=>{"use strict";function n(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 n}})},932583,e=>{"use strict";var r=e.i(921675),t=e.i(843793);async function n(e,r={}){let i=r.report,s=i?JSON.stringify(i):null;await t.db.providerConnection.upsert({where:{provider:e},create:{provider:e,lastTestedAt:new Date,testOk:!0,version:r.version??null,mcpInstalled:i?.mcp?.ok??!1,hooksInstalled:i?.hooks?.ok??!1,skillsInstalled:i?.skill?.ok??!1,installLog:s},update:{lastTestedAt:new Date,testOk:!0,version:r.version??null,mcpInstalled:i?.mcp?.ok??!1,hooksInstalled:i?.hooks?.ok??!1,skillsInstalled:i?.skill?.ok??!1,installLog:s}})}async function i(e,r={}){await t.db.providerConnection.upsert({where:{provider:e},create:{provider:e,lastTestedAt:new Date,testOk:!1,installLog:r.reason??null},update:{lastTestedAt:new Date,testOk:!1,mcpInstalled:!1,hooksInstalled:!1,skillsInstalled:!1,installLog:r.reason??null}})}async function s(e){let r=await t.db.providerConnection.findUnique({where:{provider:e}});return!!r&&r.testOk&&r.mcpInstalled&&r.hooksInstalled&&r.skillsInstalled}async function o(){return(await t.db.providerConnection.findMany({where:{testOk:!0,mcpInstalled:!0,hooksInstalled:!0,skillsInstalled:!0},select:{provider:!0},orderBy:{provider:"asc"}})).map(e=>e.provider)}async function a(){return t.db.providerConnection.findMany({select:{provider:!0,lastTestedAt:!0,testOk:!0,version:!0,mcpInstalled:!0,hooksInstalled:!0,skillsInstalled:!0,installLog:!0},orderBy:{provider:"asc"}})}(0,e.i(86708).ensureServerEntryExports)([n,i,s,o,a]),(0,r.registerServerReference)(n,"60bfac4d8a84cfc8a50aaf8f7c80e53b0829767209",null),(0,r.registerServerReference)(i,"609a813a377de3ae5efca9187c0d69ab079fb791e8",null),(0,r.registerServerReference)(s,"402122372e078d3b4d354a06d46800cea3913baa0e",null),(0,r.registerServerReference)(o,"00f1b27b42c89358c138136f95d73465a530d77838",null),(0,r.registerServerReference)(a,"00633c627f11fdcba5dff95e7d77576a38c978a1ec",null),e.s(["getConnectedProviders",0,o,"isProviderConnected",0,s,"markProviderConnected",0,n,"markProviderDisconnected",0,i])},89428,e=>{"use strict";var r=e.i(843793),t=e.i(279711);class n extends Error{code;provider;constructor(e,r,t){super(t),this.code=e,this.provider=r,this.name="AiProviderError"}}var i=e.i(932583);let s="claude",o="请到 Settings → Test Connection 测试该 Provider 后再使用(未注入的 CLI 不能被插槽选中)";async function a(e){return r.db.aiCapabilityConfig.findUnique({where:{slot:e}})}async function c(e){if(e){if(await (0,i.isProviderConnected)(e))return e;throw new n("CLI_NOT_FOUND",e,`Provider "${e}" 未连接:${o}`)}let r=await (0,i.getConnectedProviders)();if(0===r.length)throw new n("CLI_NOT_FOUND",s,`没有任何 AI Provider 已连接:${o}`);return r.includes(s)?s:r[0]}async function l(e){let r=await a(e),i=r?.model??void 0,s=await c(r?.provider??null),o=t.providerRegistry.get(s);if(!o)throw new n("CLI_NOT_FOUND",s,`Provider "${s}" 未注册`);let l=o.cli?.adapter;if(!l)throw new n("UNSUPPORTED_MODE",s,`Provider "${s}" 不支持 CLI 模式`);return{adapter:l,provider:o,model:i}}e.s(["resolveCliAdapter",0,l],89428)},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(e=>Promise.resolve().then(()=>e(233405)))},534777,e=>{e.v(r=>Promise.all(["server/chunks/[externals]_util_0wtvqkc._.js"].map(r=>e.l(r))).then(()=>r(224361)))},217260,e=>{e.v(e=>Promise.resolve().then(()=>e(83721)))},507603,e=>{e.v(r=>Promise.all(["server/chunks/_0u-~jqd._.js"].map(r=>e.l(r))).then(()=>r(283373)))},136565,e=>{e.v(r=>Promise.all(["server/chunks/src_0o_27yu._.js"].map(r=>e.l(r))).then(()=>r(215624)))},260815,e=>{e.v(e=>Promise.resolve().then(()=>e(924868)))}];
3
-
4
- //# sourceMappingURL=%5Broot-of-the-server%5D__07h7qz8._.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"))},874533,(e,r,t)=>{r.exports=e.x("node:child_process",()=>require("node:child_process"))},660526,(e,r,t)=>{r.exports=e.x("node:os",()=>require("node:os"))},603484,e=>{"use strict";e.i(902157);var r=e.i(874533),t=e.i(750227);function n(e=process.platform){return"win32"===e}let s=["CLAUDECODE","CLAUDE_CODE_ENTRYPOINT","CLAUDE_CODE_SESSION","CLAUDE_CODE_PARENT_SESSION"],o=e=>(0,r.execSync)(e,{encoding:"utf-8",timeout:5e3});e.s(["ensurePathInEnv",0,function(e,r=process.platform){let t=n(r)?"Path":"PATH";return(e.PATH??e.Path??"").length>0?e:{...e,[t]:function(e=process.platform){return n(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"}(r)}},"resolveCommandPathSync",0,function(e,s=process.platform,i=o){if(t.default.extname(e)||e.includes("/")||e.includes("\\"))return e;if(!n(s)){try{let t=(0,r.execFileSync)("which",[e],{encoding:"utf-8",timeout:5e3}).trim();if(t)return t}catch{}return e}try{let r=i(`where ${e}`).trim().split("\n").map(e=>e.trim()).filter(Boolean),t=r.find(e=>/\.(cmd|bat|exe)$/i.test(e));if(t)return t;if(r.length>0)return r[0]}catch{}return e},"stripClaudeNestingEnv",0,function(e){let r={...e};for(let e of s)delete r[e];return r}])},760138,216258,e=>{"use strict";let r;var t=e.i(902157),n=e.i(660526),s=e.i(750227),o=e.i(136902);function i(){return r||(r=process.env.TOWER_DATA_DIR||(0,s.join)((0,n.homedir)(),".tower"),(0,t.existsSync)(r)||(0,t.mkdirSync)(r,{recursive:!0})),r}function l(){let e;return(0,s.join)((e=(0,s.join)(i(),"database"),(0,t.existsSync)(e)||(0,t.mkdirSync)(e,{recursive:!0}),e),"tower.db")}e.s(["getAssistantDir",0,function(){let e=(0,s.join)(i(),"assistant");return(0,t.existsSync)(e)||(0,t.mkdirSync)(e,{recursive:!0}),e},"getTowerDbPath",0,l,"getTowerDir",0,i],216258);let c="tower";function a(){let e=i(),r=s.join((0,n.homedir)(),".tower");if(s.resolve(e)===s.resolve(r))return"tower";let t=s.basename(e),o=t.match(/^\.?tower-(.+)$/);return o?`tower-${u(o[1])}`:`tower-${u(t)}`}function u(e){return e.replace(/[^a-z0-9_-]/gi,"-").toLowerCase().slice(0,32)}async function p(e,r){let i,u,p,d,m=o.providerRegistry.get(e),f=m?.cli?.adapter;if(!f||!await f.isAvailable())return{provider:e,available:!1,ok:!1};let v="claude"===e?function(e={}){let r=e.homeDir??n.homedir(),o=e.repoRoot??process.cwd(),i=[];return i.push(function(e){let r=s.join(e,".claude","settings.json");if(!t.existsSync(r))return{removed:!1,path:r};try{let e=t.readFileSync(r,"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:r};let o=s.tower;return delete s.tower,0===Object.keys(s).length?delete n.mcpServers:n.mcpServers=s,t.writeFileSync(r,JSON.stringify(n,null,2)+"\n","utf-8"),{removed:!0,path:r,removedEntry:o,reason:"wrong-file"}}catch(e){return{removed:!1,path:r,error:e instanceof Error?e.message:String(e)}}}(r)),i.push(function(e,r,n){if(!t.existsSync(e))return{removed:!1,path:e};try{let o=t.readFileSync(e,"utf-8"),i=JSON.parse(o),l=i.mcpServers;if("object"!=typeof l||null===l||Array.isArray(l))return{removed:!1,path:e};let c=l.tower;if(!c)return{removed:!1,path:e};let a=function(e,r){let n,o=e.args;if(!Array.isArray(o))return"foreign-repo";for(let e of o)if("string"==typeof e&&s.isAbsolute(e)){n=e;break}return n?t.existsSync(n)?s.resolve(n).startsWith(s.resolve(r)+s.sep)?"current-repo":"foreign-repo":"missing-path":"foreign-repo"}(c,n);if("current-repo"===a)return{removed:!1,path:e,reason:"alive-current-repo"};return delete l.tower,0===Object.keys(l).length?delete i.mcpServers:i.mcpServers=l,t.writeFileSync(e,JSON.stringify(i,null,2)+"\n","utf-8"),{removed:!0,path:e,removedEntry:c,reason:`${r}:${a}`}}catch(r){return{removed:!1,path:e,error:r instanceof Error?r.message:String(r)}}}(s.join(r,".mcp.json"),"home-mcp-json",o)),{steps:i,removedAny:i.some(e=>e.removed)}}():void 0,h=(i=process.cwd().replace(/\\/g,"/"),u=process.env.DATABASE_URL||`file:${l().replace(/\\/g,"/")}`,p=`${i}/dist/mcp-server.cjs`,d=a(),(0,t.existsSync)(p)?{name:d,command:"node",args:[p],env:{DATABASE_URL:u}}:{name:d,command:`${i}/node_modules/.bin/tsx`,args:[`${i}/src/mcp/index.ts`],env:{DATABASE_URL:u}}),y=await f.installMcp(h,{scope:"user"}),S=await f.installHooks(r),w=await f.installSkill(c,s.join(process.cwd(),"skills",c));return{provider:e,available:!0,migration:v,mcp:y,hooks:S,skill:w,ok:y.ok&&S.ok&&w.ok}}e.s(["getTowerMcpName",0,a,"installAllForProvider",0,p],760138)},482848,e=>{e.v(r=>Promise.all(["server/chunks/[externals]_node_child_process_06l~6ej._.js"].map(r=>e.l(r))).then(()=>r(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)))}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__0_a8-jq._.js.map
@@ -1,3 +0,0 @@
1
- module.exports=[933919,(e,t,a)=>{t.exports=e.x("@prisma/client-9249dd53ac5b6a44",()=>require("@prisma/client-9249dd53ac5b6a44"))},750227,(e,t,a)=>{t.exports=e.x("node:path",()=>require("node:path"))},902157,(e,t,a)=>{t.exports=e.x("node:fs",()=>require("node:fs"))},874533,(e,t,a)=>{t.exports=e.x("node:child_process",()=>require("node:child_process"))},980738,(e,t,a)=>{t.exports=e.x("node-pty-c710df912a232c01",()=>require("node-pty-c710df912a232c01"))},433541,e=>e.a(async(t,a)=>{try{let t=await e.y("ws-4df7fc762dfa9a52");e.n(t),a()}catch(e){a(e)}},!0),504446,(e,t,a)=>{t.exports=e.x("net",()=>require("net"))},843793,e=>{"use strict";var t=e.i(933919);let a=globalThis.prisma??new t.PrismaClient({log:[]});process.on("SIGTERM",()=>{a.$disconnect().catch(()=>{})}),process.on("SIGINT",()=>{a.$disconnect().catch(()=>{})}),e.s(["db",0,a])},572173,e=>{"use strict";var t=e.i(843793);async function a(e,a){let r=await t.db.systemConfig.findUnique({where:{key:e}});if(!r)return a;try{return JSON.parse(r.value)}catch{return a}}e.s(["readConfigValue",0,a])},658053,e=>{"use strict";e.s(["ASSISTANT_SESSION_KEY",0,"__assistant__"])},395436,e=>e.a(async(t,a)=>{try{var r=e.i(855104),n=e.i(198840),s=e.i(843793),o=e.i(721390),i=t([o]);async function l(e){let t,a=(0,n.requireLocalhost)(e);if(a)return a;try{t=await e.json()}catch{return r.NextResponse.json({error:"Invalid JSON"},{status:400})}let{taskId:i,sessionId:l}=t;if(!i||"string"!=typeof i)return r.NextResponse.json({error:"taskId required"},{status:400});let d=await s.db.task.findUnique({where:{id:i},select:{id:!0,title:!0,project:{select:{workspaceId:!0}}}});if(!d)return r.NextResponse.json({error:"Task not found"},{status:404});let u={taskId:d.id,taskTitle:d.title,sessionId:l??"",workspaceId:d.project.workspaceId,type:"stop",timestamp:new Date().toISOString()};return(0,o.broadcastNotification)(u),r.NextResponse.json({ok:!0})}[o]=i.then?(await i)():i,e.s(["POST",0,l,"dynamic",0,"force-dynamic","runtime",0,"nodejs"]),a()}catch(e){a(e)}},!1),835333,e=>e.a(async(t,a)=>{try{var r=e.i(765876),n=e.i(675896),s=e.i(959160),o=e.i(97944),i=e.i(86757),l=e.i(204144),d=e.i(273436),u=e.i(743641),c=e.i(813766),p=e.i(840884),h=e.i(498814),R=e.i(780006),f=e.i(544432),v=e.i(772005),w=e.i(450223),x=e.i(193695);e.i(628400);var g=e.i(800071),m=e.i(395436),y=t([m]);[m]=y.then?(await y)():y;let C=new r.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/internal/hooks/stop/route",pathname:"/api/internal/hooks/stop",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/internal/hooks/stop/route.ts",nextConfigOutput:"standalone",userland:m}),{workAsyncStorage:N,workUnitAsyncStorage:S,serverHooks:A}=C;async function E(e,t,a){a.requestMeta&&(0,o.setRequestMeta)(e,a.requestMeta),C.isDev&&(0,o.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let r="/api/internal/hooks/stop/route";r=r.replace(/\/index$/,"")||"/";let s=await C.prepare(e,t,{srcPage:r,multiZoneDraftMode:!1});if(!s)return t.statusCode=400,t.end("Bad Request"),null==a.waitUntil||a.waitUntil.call(a,Promise.resolve()),null;let{buildId:m,params:y,nextConfig:E,parsedUrl:N,isDraftMode:S,prerenderManifest:A,routerServerContext:T,isOnDemandRevalidate:b,revalidateOnlyGenerated:_,resolvedPathname:I,clientReferenceManifest:q,serverActionsManifest:k}=s,O=(0,d.normalizeAppPath)(r),P=!!(A.dynamicRoutes[O]||A.routes[I]),U=async()=>((null==T?void 0:T.render404)?await T.render404(e,t,N,!1):t.end("This page could not be found"),null);if(P&&!S){let e=!!A.routes[I],t=A.dynamicRoutes[O];if(t&&!1===t.fallback&&!e){if(E.adapterPath)return await U();throw new x.NoFallbackError}}let H=null;!P||C.isDev||S||(H=I,H="/index"===H?"/":H);let M=!0===C.isDev||!P,j=P&&!M;k&&q&&(0,l.setManifestsSingleton)({page:r,clientReferenceManifest:q,serverActionsManifest:k});let D=e.method||"GET",$=(0,i.getTracer)(),K=$.getActiveScopeSpan(),F=!!(null==T?void 0:T.isWrappedByNextServer),B=!!(0,o.getRequestMeta)(e,"minimalMode"),L=(0,o.getRequestMeta)(e,"incrementalCache")||await C.getIncrementalCache(e,E,A,B);null==L||L.resetRequestCache(),globalThis.__incrementalCache=L;let G={params:y,previewProps:A.preview,renderOpts:{experimental:{authInterrupts:!!E.experimental.authInterrupts},cacheComponents:!!E.cacheComponents,supportsDynamicResponse:M,incrementalCache:L,cacheLifeProfiles:E.cacheLife,waitUntil:a.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,a,r,n)=>C.onRequestError(e,t,r,n,T)},sharedContext:{buildId:m}},V=new u.NodeNextRequest(e),W=new u.NodeNextResponse(t),X=c.NextRequestAdapter.fromNodeNextRequest(V,(0,c.signalFromNodeResponse)(t));try{let s,o=async e=>C.handle(X,G).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let a=$.getRootSpanAttributes();if(!a)return;if(a.get("next.span_type")!==p.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${a.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let n=a.get("next.route");if(n){let t=`${D} ${n}`;e.setAttributes({"next.route":n,"http.route":n,"next.span_name":t}),e.updateName(t),s&&s!==e&&(s.setAttribute("http.route",n),s.updateName(t))}else e.updateName(`${D} ${r}`)}),l=async s=>{var i,l;let d=async({previousCacheEntry:n})=>{try{if(!B&&b&&_&&!n)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let r=await o(s);e.fetchMetrics=G.renderOpts.fetchMetrics;let i=G.renderOpts.pendingWaitUntil;i&&a.waitUntil&&(a.waitUntil(i),i=void 0);let l=G.renderOpts.collectedTags;if(!P)return await (0,R.sendResponse)(V,W,r,G.renderOpts.pendingWaitUntil),null;{let e=await r.blob(),t=(0,f.toNodeOutgoingHttpHeaders)(r.headers);l&&(t[w.NEXT_CACHE_TAGS_HEADER]=l),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let a=void 0!==G.renderOpts.collectedRevalidate&&!(G.renderOpts.collectedRevalidate>=w.INFINITE_CACHE)&&G.renderOpts.collectedRevalidate,n=void 0===G.renderOpts.collectedExpire||G.renderOpts.collectedExpire>=w.INFINITE_CACHE?void 0:G.renderOpts.collectedExpire;return{value:{kind:g.CachedRouteKind.APP_ROUTE,status:r.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:a,expire:n}}}}catch(t){throw(null==n?void 0:n.isStale)&&await C.onRequestError(e,t,{routerKind:"App Router",routePath:r,routeType:"route",revalidateReason:(0,h.getRevalidateReason)({isStaticGeneration:j,isOnDemandRevalidate:b})},!1,T),t}},u=await C.handleResponse({req:e,nextConfig:E,cacheKey:H,routeKind:n.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:A,isRoutePPREnabled:!1,isOnDemandRevalidate:b,revalidateOnlyGenerated:_,responseGenerator:d,waitUntil:a.waitUntil,isMinimalMode:B});if(!P)return null;if((null==u||null==(i=u.value)?void 0:i.kind)!==g.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==u||null==(l=u.value)?void 0:l.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});B||t.setHeader("x-nextjs-cache",b?"REVALIDATED":u.isMiss?"MISS":u.isStale?"STALE":"HIT"),S&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let c=(0,f.fromNodeOutgoingHttpHeaders)(u.value.headers);return B&&P||c.delete(w.NEXT_CACHE_TAGS_HEADER),!u.cacheControl||t.getHeader("Cache-Control")||c.get("Cache-Control")||c.set("Cache-Control",(0,v.getCacheControlHeader)(u.cacheControl)),await (0,R.sendResponse)(V,W,new Response(u.value.body,{headers:c,status:u.value.status||200})),null};F&&K?await l(K):(s=$.getActiveScopeSpan(),await $.withPropagatedContext(e.headers,()=>$.trace(p.BaseServerSpan.handleRequest,{spanName:`${D} ${r}`,kind:i.SpanKind.SERVER,attributes:{"http.method":D,"http.target":e.url}},l),void 0,!F))}catch(t){if(t instanceof x.NoFallbackError||await C.onRequestError(e,t,{routerKind:"App Router",routePath:O,routeType:"route",revalidateReason:(0,h.getRevalidateReason)({isStaticGeneration:j,isOnDemandRevalidate:b})},!1,T),P)throw t;return await (0,R.sendResponse)(V,W,new Response(null,{status:500})),null}}e.s(["handler",0,E,"patchFetch",0,function(){return(0,s.patchFetch)({workAsyncStorage:N,workUnitAsyncStorage:S})},"routeModule",0,C,"serverHooks",0,A,"workAsyncStorage",0,N,"workUnitAsyncStorage",0,S]),a()}catch(e){a(e)}},!1)];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__0_mbhor._.js.map