agent-tower 0.5.3 → 0.5.4-beta.1

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 (312) hide show
  1. package/README.md +6 -1
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +15 -1
  4. package/dist/app.js.map +1 -1
  5. package/dist/app.test.js +12 -0
  6. package/dist/app.test.js.map +1 -1
  7. package/dist/cli.js +18 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/core/event-bus.d.ts +3 -0
  10. package/dist/core/event-bus.d.ts.map +1 -1
  11. package/dist/core/event-bus.js.map +1 -1
  12. package/dist/executors/__tests__/base.executor.test.js +29 -1
  13. package/dist/executors/__tests__/base.executor.test.js.map +1 -1
  14. package/dist/executors/__tests__/codex.executor.test.js +13 -0
  15. package/dist/executors/__tests__/codex.executor.test.js.map +1 -1
  16. package/dist/executors/base.executor.d.ts.map +1 -1
  17. package/dist/executors/base.executor.js +4 -0
  18. package/dist/executors/base.executor.js.map +1 -1
  19. package/dist/executors/execution-env.d.ts +1 -1
  20. package/dist/executors/execution-env.d.ts.map +1 -1
  21. package/dist/executors/execution-env.js +7 -0
  22. package/dist/executors/execution-env.js.map +1 -1
  23. package/dist/index.js +2 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp/http-client.d.ts +33 -1
  26. package/dist/mcp/http-client.d.ts.map +1 -1
  27. package/dist/mcp/http-client.js +21 -2
  28. package/dist/mcp/http-client.js.map +1 -1
  29. package/dist/mcp/index.js +4 -1
  30. package/dist/mcp/index.js.map +1 -1
  31. package/dist/mcp/server.d.ts +3 -1
  32. package/dist/mcp/server.d.ts.map +1 -1
  33. package/dist/mcp/server.js +64 -9
  34. package/dist/mcp/server.js.map +1 -1
  35. package/dist/mcp/tools/__tests__/workspaces.test.d.ts +2 -0
  36. package/dist/mcp/tools/__tests__/workspaces.test.d.ts.map +1 -0
  37. package/dist/mcp/tools/__tests__/workspaces.test.js +72 -0
  38. package/dist/mcp/tools/__tests__/workspaces.test.js.map +1 -0
  39. package/dist/mcp/tools/workspaces.d.ts +9 -1
  40. package/dist/mcp/tools/workspaces.d.ts.map +1 -1
  41. package/dist/mcp/tools/workspaces.js +96 -2
  42. package/dist/mcp/tools/workspaces.js.map +1 -1
  43. package/dist/mcp/types.d.ts +46 -0
  44. package/dist/mcp/types.d.ts.map +1 -1
  45. package/dist/mcp/types.js +23 -0
  46. package/dist/mcp/types.js.map +1 -1
  47. package/dist/middleware/__tests__/access-auth.test.d.ts +2 -0
  48. package/dist/middleware/__tests__/access-auth.test.d.ts.map +1 -0
  49. package/dist/middleware/__tests__/access-auth.test.js +249 -0
  50. package/dist/middleware/__tests__/access-auth.test.js.map +1 -0
  51. package/dist/middleware/access-auth.d.ts +3 -0
  52. package/dist/middleware/access-auth.d.ts.map +1 -0
  53. package/dist/middleware/access-auth.js +110 -0
  54. package/dist/middleware/access-auth.js.map +1 -0
  55. package/dist/routes/__tests__/files.test.d.ts +2 -0
  56. package/dist/routes/__tests__/files.test.d.ts.map +1 -0
  57. package/dist/routes/__tests__/files.test.js +101 -0
  58. package/dist/routes/__tests__/files.test.js.map +1 -0
  59. package/dist/routes/__tests__/previews.integration.test.d.ts +2 -0
  60. package/dist/routes/__tests__/previews.integration.test.d.ts.map +1 -0
  61. package/dist/routes/__tests__/previews.integration.test.js +269 -0
  62. package/dist/routes/__tests__/previews.integration.test.js.map +1 -0
  63. package/dist/routes/__tests__/previews.test.js +103 -1
  64. package/dist/routes/__tests__/previews.test.js.map +1 -1
  65. package/dist/routes/__tests__/team-runs-merge.test.d.ts +2 -0
  66. package/dist/routes/__tests__/team-runs-merge.test.d.ts.map +1 -0
  67. package/dist/routes/__tests__/team-runs-merge.test.js +156 -0
  68. package/dist/routes/__tests__/team-runs-merge.test.js.map +1 -0
  69. package/dist/routes/__tests__/team-runs-private-messages.test.d.ts +2 -0
  70. package/dist/routes/__tests__/team-runs-private-messages.test.d.ts.map +1 -0
  71. package/dist/routes/__tests__/team-runs-private-messages.test.js +82 -0
  72. package/dist/routes/__tests__/team-runs-private-messages.test.js.map +1 -0
  73. package/dist/routes/access-auth.d.ts +3 -0
  74. package/dist/routes/access-auth.d.ts.map +1 -0
  75. package/dist/routes/access-auth.js +89 -0
  76. package/dist/routes/access-auth.js.map +1 -0
  77. package/dist/routes/files.d.ts.map +1 -1
  78. package/dist/routes/files.js +46 -0
  79. package/dist/routes/files.js.map +1 -1
  80. package/dist/routes/index.d.ts.map +1 -1
  81. package/dist/routes/index.js +3 -0
  82. package/dist/routes/index.js.map +1 -1
  83. package/dist/routes/previews.d.ts +7 -2
  84. package/dist/routes/previews.d.ts.map +1 -1
  85. package/dist/routes/previews.js +106 -32
  86. package/dist/routes/previews.js.map +1 -1
  87. package/dist/routes/projects.d.ts.map +1 -1
  88. package/dist/routes/projects.js +9 -0
  89. package/dist/routes/projects.js.map +1 -1
  90. package/dist/routes/team-runs.d.ts +2 -0
  91. package/dist/routes/team-runs.d.ts.map +1 -1
  92. package/dist/routes/team-runs.js +48 -1
  93. package/dist/routes/team-runs.js.map +1 -1
  94. package/dist/routes/workspaces.d.ts.map +1 -1
  95. package/dist/routes/workspaces.js +43 -4
  96. package/dist/routes/workspaces.js.map +1 -1
  97. package/dist/services/__tests__/access-auth.service.test.d.ts +2 -0
  98. package/dist/services/__tests__/access-auth.service.test.d.ts.map +1 -0
  99. package/dist/services/__tests__/access-auth.service.test.js +316 -0
  100. package/dist/services/__tests__/access-auth.service.test.js.map +1 -0
  101. package/dist/services/__tests__/member-heartbeat.test.d.ts +2 -0
  102. package/dist/services/__tests__/member-heartbeat.test.d.ts.map +1 -0
  103. package/dist/services/__tests__/member-heartbeat.test.js +344 -0
  104. package/dist/services/__tests__/member-heartbeat.test.js.map +1 -0
  105. package/dist/services/__tests__/project.service.test.js +29 -0
  106. package/dist/services/__tests__/project.service.test.js.map +1 -1
  107. package/dist/services/__tests__/session-manager.team-run.test.js +144 -0
  108. package/dist/services/__tests__/session-manager.team-run.test.js.map +1 -1
  109. package/dist/services/__tests__/task.service.test.js +34 -0
  110. package/dist/services/__tests__/task.service.test.js.map +1 -1
  111. package/dist/services/__tests__/team-reconciler.service.test.js +307 -11
  112. package/dist/services/__tests__/team-reconciler.service.test.js.map +1 -1
  113. package/dist/services/__tests__/team-run.service.test.js +368 -2
  114. package/dist/services/__tests__/team-run.service.test.js.map +1 -1
  115. package/dist/services/__tests__/team-scheduler.service.test.js +409 -5
  116. package/dist/services/__tests__/team-scheduler.service.test.js.map +1 -1
  117. package/dist/services/__tests__/workspace.service.test.js +991 -3
  118. package/dist/services/__tests__/workspace.service.test.js.map +1 -1
  119. package/dist/services/access-auth.service.d.ts +82 -0
  120. package/dist/services/access-auth.service.d.ts.map +1 -0
  121. package/dist/services/access-auth.service.js +385 -0
  122. package/dist/services/access-auth.service.js.map +1 -0
  123. package/dist/services/mcp-config.service.d.ts.map +1 -1
  124. package/dist/services/mcp-config.service.js +8 -2
  125. package/dist/services/mcp-config.service.js.map +1 -1
  126. package/dist/services/mcp-config.service.test.js +18 -3
  127. package/dist/services/mcp-config.service.test.js.map +1 -1
  128. package/dist/services/member-heartbeat-scheduler.d.ts +33 -0
  129. package/dist/services/member-heartbeat-scheduler.d.ts.map +1 -0
  130. package/dist/services/member-heartbeat-scheduler.js +83 -0
  131. package/dist/services/member-heartbeat-scheduler.js.map +1 -0
  132. package/dist/services/project-guards.d.ts +5 -0
  133. package/dist/services/project-guards.d.ts.map +1 -1
  134. package/dist/services/project-guards.js +47 -0
  135. package/dist/services/project-guards.js.map +1 -1
  136. package/dist/services/project.service.d.ts +6 -4
  137. package/dist/services/project.service.d.ts.map +1 -1
  138. package/dist/services/project.service.js +16 -7
  139. package/dist/services/project.service.js.map +1 -1
  140. package/dist/services/session-manager.d.ts +11 -0
  141. package/dist/services/session-manager.d.ts.map +1 -1
  142. package/dist/services/session-manager.js +76 -0
  143. package/dist/services/session-manager.js.map +1 -1
  144. package/dist/services/task.service.d.ts +11 -9
  145. package/dist/services/task.service.d.ts.map +1 -1
  146. package/dist/services/task.service.js +17 -12
  147. package/dist/services/task.service.js.map +1 -1
  148. package/dist/services/team-reconciler.service.d.ts +39 -0
  149. package/dist/services/team-reconciler.service.d.ts.map +1 -1
  150. package/dist/services/team-reconciler.service.js +234 -3
  151. package/dist/services/team-reconciler.service.js.map +1 -1
  152. package/dist/services/team-run.service.d.ts +7 -1
  153. package/dist/services/team-run.service.d.ts.map +1 -1
  154. package/dist/services/team-run.service.js +98 -9
  155. package/dist/services/team-run.service.js.map +1 -1
  156. package/dist/services/team-scheduler.service.d.ts +21 -1
  157. package/dist/services/team-scheduler.service.d.ts.map +1 -1
  158. package/dist/services/team-scheduler.service.js +252 -15
  159. package/dist/services/team-scheduler.service.js.map +1 -1
  160. package/dist/services/terminal-manager.d.ts.map +1 -1
  161. package/dist/services/terminal-manager.js +1 -0
  162. package/dist/services/terminal-manager.js.map +1 -1
  163. package/dist/services/workspace.service.d.ts +56 -1
  164. package/dist/services/workspace.service.d.ts.map +1 -1
  165. package/dist/services/workspace.service.js +841 -8
  166. package/dist/services/workspace.service.js.map +1 -1
  167. package/dist/socket/__tests__/socket-gateway.test.d.ts +2 -0
  168. package/dist/socket/__tests__/socket-gateway.test.d.ts.map +1 -0
  169. package/dist/socket/__tests__/socket-gateway.test.js +119 -0
  170. package/dist/socket/__tests__/socket-gateway.test.js.map +1 -0
  171. package/dist/socket/middleware/__tests__/auth.test.js +102 -2
  172. package/dist/socket/middleware/__tests__/auth.test.js.map +1 -1
  173. package/dist/socket/middleware/auth.d.ts +1 -0
  174. package/dist/socket/middleware/auth.d.ts.map +1 -1
  175. package/dist/socket/middleware/auth.js +22 -2
  176. package/dist/socket/middleware/auth.js.map +1 -1
  177. package/dist/socket/socket-gateway.d.ts +6 -2
  178. package/dist/socket/socket-gateway.d.ts.map +1 -1
  179. package/dist/socket/socket-gateway.js +78 -15
  180. package/dist/socket/socket-gateway.js.map +1 -1
  181. package/dist/utils/internal-api-token.d.ts +9 -0
  182. package/dist/utils/internal-api-token.d.ts.map +1 -0
  183. package/dist/utils/internal-api-token.js +74 -0
  184. package/dist/utils/internal-api-token.js.map +1 -0
  185. package/dist/utils/preview-path.d.ts +11 -0
  186. package/dist/utils/preview-path.d.ts.map +1 -0
  187. package/dist/utils/preview-path.js +46 -0
  188. package/dist/utils/preview-path.js.map +1 -0
  189. package/dist/utils/process-launch.test.js +14 -0
  190. package/dist/utils/process-launch.test.js.map +1 -1
  191. package/dist/web/assets/{AgentDemoPage-DMLw4xpg.js → AgentDemoPage-UmBBXiZq.js} +1 -1
  192. package/dist/web/assets/{AgentEnvironmentSettingsPage-NgRdouLu.js → AgentEnvironmentSettingsPage-DeMVC_O2.js} +1 -1
  193. package/dist/web/assets/{AgentLogo-ThhvSi7G.js → AgentLogo-sxp-yGLB.js} +1 -1
  194. package/dist/web/assets/{ConversationPage-B1ZcyF_h.js → ConversationPage-ykUuKcMG.js} +2 -2
  195. package/dist/web/assets/CreateTaskInput-WmNhRnVp.js +1 -0
  196. package/dist/web/assets/{DemoPage-CN2OBKzu.js → DemoPage-Cx-F46PV.js} +3 -3
  197. package/dist/web/assets/GeneralSettingsPage-DM4iy6dp.js +1 -0
  198. package/dist/web/assets/{Icons-DIZBOtuC.js → Icons-CO02_BMI.js} +1 -1
  199. package/dist/web/assets/{LoadingPreviewPage-CRBcypeY.js → LoadingPreviewPage-C58uR8H7.js} +1 -1
  200. package/dist/web/assets/McpSettingsPage-CTe-SNfY.js +1 -0
  201. package/dist/web/assets/{MemberAvatar-Y_pJlw-N.js → MemberAvatar-CZegYpYl.js} +1 -1
  202. package/dist/web/assets/NotificationSettingsPage-D17SAmMK.js +1 -0
  203. package/dist/web/assets/ProfileSettingsPage-B2rHV2eU.js +3 -0
  204. package/dist/web/assets/{ProjectKanbanPage-CBfocvKp.js → ProjectKanbanPage-SpCqpcZ0.js} +31 -32
  205. package/dist/web/assets/ProjectSettingsPage-2dD_ahm-.js +2 -0
  206. package/dist/web/assets/{ProviderSettingsPage-D-1Fyh5B.js → ProviderSettingsPage-D9vu3rO0.js} +6 -6
  207. package/dist/web/assets/{SettingsMasterDetail-CZfVaFo2.js → SettingsMasterDetail-CwRB1WBt.js} +1 -1
  208. package/dist/web/assets/{TeamSettingsPage-DysTmOGE.js → TeamSettingsPage-QXwc1AJE.js} +1 -1
  209. package/dist/web/assets/{arc-CgLBAHTH.js → arc-BRCC5BeU.js} +1 -1
  210. package/dist/web/assets/{architectureDiagram-3BPJPVTR-CP9eQfdk.js → architectureDiagram-3BPJPVTR-7lTGsSu5.js} +1 -1
  211. package/dist/web/assets/{arrow-left-y1LwO7sB.js → arrow-left-CNgpy5r6.js} +1 -1
  212. package/dist/web/assets/{blockDiagram-GPEHLZMM-BURZnUwn.js → blockDiagram-GPEHLZMM-CnscyQkX.js} +1 -1
  213. package/dist/web/assets/{c4Diagram-AAUBKEIU-Dzgp3z3S.js → c4Diagram-AAUBKEIU-DDhuPTLZ.js} +1 -1
  214. package/dist/web/assets/channel-S-3oxkZZ.js +1 -0
  215. package/dist/web/assets/check-DRdZLPss.js +1 -0
  216. package/dist/web/assets/{chevron-down--B7iZqBL.js → chevron-down-CqZBsPeR.js} +1 -1
  217. package/dist/web/assets/{chevron-right-7PShDIwg.js → chevron-right-YWciNkox.js} +1 -1
  218. package/dist/web/assets/{chevron-up-3n_vHdrD.js → chevron-up-BJ4i5iAn.js} +1 -1
  219. package/dist/web/assets/{chunk-2J33WTMH-CIpasa01.js → chunk-2J33WTMH-B96XJhZG.js} +1 -1
  220. package/dist/web/assets/{chunk-4BX2VUAB-DeSe2m1y.js → chunk-4BX2VUAB-IUZUHtbw.js} +1 -1
  221. package/dist/web/assets/{chunk-55IACEB6-BkJ6ogdn.js → chunk-55IACEB6-DcO4xSOO.js} +1 -1
  222. package/dist/web/assets/{chunk-727SXJPM-Bkbv-knP.js → chunk-727SXJPM-DuQwKkk-.js} +1 -1
  223. package/dist/web/assets/{chunk-AQP2D5EJ-BG9wGFIo.js → chunk-AQP2D5EJ-QotCqjAo.js} +1 -1
  224. package/dist/web/assets/{chunk-FMBD7UC4-Cvl_2za9.js → chunk-FMBD7UC4-C7hUbfZh.js} +1 -1
  225. package/dist/web/assets/{chunk-ND2GUHAM-B_zdzkWX.js → chunk-ND2GUHAM-B_C5eChQ.js} +1 -1
  226. package/dist/web/assets/{chunk-QZHKN3VN-Ch6dvKNw.js → chunk-QZHKN3VN-DRgZY4LJ.js} +1 -1
  227. package/dist/web/assets/{circle-alert-W13JkYj3.js → circle-alert-Ch4pQ3zT.js} +1 -1
  228. package/dist/web/assets/classDiagram-4FO5ZUOK-C00aPgpD.js +1 -0
  229. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-C00aPgpD.js +1 -0
  230. package/dist/web/assets/{code-block-OCS4YCEC-CYhJ9OPu.js → code-block-OCS4YCEC-h5zD4EvJ.js} +1 -1
  231. package/dist/web/assets/confirm-dialog-DG0L1v-9.js +1 -0
  232. package/dist/web/assets/{copy-bJ2sut_L.js → copy-JHS-5tjr.js} +1 -1
  233. package/dist/web/assets/{cose-bilkent-S5V4N54A-DWlnxyfH.js → cose-bilkent-S5V4N54A-6Gv8U8Cj.js} +1 -1
  234. package/dist/web/assets/{dagre-BM42HDAG-Bt3QI02a.js → dagre-BM42HDAG-Cf4rsmyS.js} +1 -1
  235. package/dist/web/assets/{diagram-2AECGRRQ-EaJBYSnS.js → diagram-2AECGRRQ-DW3DQ8NA.js} +1 -1
  236. package/dist/web/assets/{diagram-5GNKFQAL-BGyRb-_h.js → diagram-5GNKFQAL-C5cQ_MTX.js} +1 -1
  237. package/dist/web/assets/{diagram-KO2AKTUF-CZhDTMfm.js → diagram-KO2AKTUF-Dcs4NTfn.js} +1 -1
  238. package/dist/web/assets/{diagram-LMA3HP47-Be8BAxmL.js → diagram-LMA3HP47-lLI-OolH.js} +1 -1
  239. package/dist/web/assets/{diagram-OG6HWLK6-DEdQ7Cml.js → diagram-OG6HWLK6-BTdMG1u6.js} +1 -1
  240. package/dist/web/assets/{erDiagram-TEJ5UH35-CG9SNlbz.js → erDiagram-TEJ5UH35-BrKfSMWb.js} +1 -1
  241. package/dist/web/assets/{flowDiagram-I6XJVG4X-BUpx5PVX.js → flowDiagram-I6XJVG4X-BFT9EHqo.js} +1 -1
  242. package/dist/web/assets/folder-picker--V79noua.js +1 -0
  243. package/dist/web/assets/{ganttDiagram-6RSMTGT7-D7vRxMpE.js → ganttDiagram-6RSMTGT7-D_44EJ_y.js} +1 -1
  244. package/dist/web/assets/{gitGraphDiagram-PVQCEYII-3lhH-RcD.js → gitGraphDiagram-PVQCEYII-COrCr27e.js} +1 -1
  245. package/dist/web/assets/index-BC5stA77.js +122 -0
  246. package/dist/web/assets/{index-CGMjRoF7.js → index-Cjaho2ST.js} +4 -4
  247. package/dist/web/assets/index-DRJLGAPR.css +1 -0
  248. package/dist/web/assets/{infoDiagram-5YYISTIA-C5SNbJpO.js → infoDiagram-5YYISTIA-Derwhgw-.js} +1 -1
  249. package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-Ca7tX9_0.js → ishikawaDiagram-YF4QCWOH-Dv_SKfKy.js} +1 -1
  250. package/dist/web/assets/{journeyDiagram-JHISSGLW-B2oo6nxY.js → journeyDiagram-JHISSGLW-BvL0Myto.js} +1 -1
  251. package/dist/web/assets/{kanban-definition-UN3LZRKU-D1CzIzX9.js → kanban-definition-UN3LZRKU-D9iCCF7g.js} +1 -1
  252. package/dist/web/assets/{layers-BbLzQqyy.js → layers-D-OLv40U.js} +1 -1
  253. package/dist/web/assets/{linear-BWowtcGw.js → linear-DLebIyPZ.js} +1 -1
  254. package/dist/web/assets/{mermaid-NOHMQCX5-B42ziicV.js → mermaid-NOHMQCX5-CyA4Kmm7.js} +40 -40
  255. package/dist/web/assets/{message-square-Bd_m34OX.js → message-square-ByVmnBN0.js} +1 -1
  256. package/dist/web/assets/{mindmap-definition-RKZ34NQL-CYbO6QCk.js → mindmap-definition-RKZ34NQL-CJXkujXD.js} +1 -1
  257. package/dist/web/assets/{modal-CxOKWOjZ.js → modal-KKPLseLk.js} +1 -1
  258. package/dist/web/assets/{pencil-h5kxwbcu.js → pencil-B7ylaB7k.js} +1 -1
  259. package/dist/web/assets/{pieDiagram-4H26LBE5-DXQghKRy.js → pieDiagram-4H26LBE5-C8DfXjYu.js} +1 -1
  260. package/dist/web/assets/{quadrantDiagram-W4KKPZXB-C6lAMMQB.js → quadrantDiagram-W4KKPZXB-BxaUhA-J.js} +1 -1
  261. package/dist/web/assets/{requirementDiagram-4Y6WPE33-Di9Le7Wy.js → requirementDiagram-4Y6WPE33-CkP381y3.js} +1 -1
  262. package/dist/web/assets/{sankeyDiagram-5OEKKPKP-BGpnptvR.js → sankeyDiagram-5OEKKPKP-Ciot-1f1.js} +1 -1
  263. package/dist/web/assets/{select-DFuN9DX8.js → select-CLvHC1t4.js} +1 -1
  264. package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DjfkfaQL.js → sequenceDiagram-3UESZ5HK-ZrO6aulq.js} +1 -1
  265. package/dist/web/assets/{stateDiagram-AJRCARHV-DsELotm9.js → stateDiagram-AJRCARHV-BDC3J_xT.js} +1 -1
  266. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-C_4zupNH.js +1 -0
  267. package/dist/web/assets/{switch-gL7lBFj6.js → switch-DqXAu8pW.js} +1 -1
  268. package/dist/web/assets/{textarea-Lr4GZaYW.js → textarea-ByV2n54w.js} +1 -1
  269. package/dist/web/assets/{timeline-definition-PNZ67QCA-Cq1BWC0T.js → timeline-definition-PNZ67QCA-CG898aCW.js} +1 -1
  270. package/dist/web/assets/{trash-2-B7GFt5Wl.js → trash-2-D-MBxpK4.js} +1 -1
  271. package/dist/web/assets/{upload-L8hpDFoO.js → upload-CkkorsYk.js} +1 -1
  272. package/dist/web/assets/{use-profiles-zIsoigD8.js → use-profiles-B62R9Kbn.js} +1 -1
  273. package/dist/web/assets/use-projects-JMhtZFd6.js +1 -0
  274. package/dist/web/assets/{use-providers-erJ2iHLz.js → use-providers-Cg1RDnUJ.js} +1 -1
  275. package/dist/web/assets/{useNormalizedLogs-CXAn7xj_.js → useNormalizedLogs-BMa5-cCl.js} +1 -1
  276. package/dist/web/assets/{vennDiagram-CIIHVFJN-DdOfNtRo.js → vennDiagram-CIIHVFJN-CNRNbGoo.js} +1 -1
  277. package/dist/web/assets/{wardley-L42UT6IY-BeKcEIgK.js → wardley-L42UT6IY-Fm0b_w6O.js} +1 -1
  278. package/dist/web/assets/{wardleyDiagram-YWT4CUSO-DPKOxABd.js → wardleyDiagram-YWT4CUSO-C_xf1EWg.js} +1 -1
  279. package/dist/web/assets/{xychartDiagram-2RQKCTM6-olIy_aaY.js → xychartDiagram-2RQKCTM6-D9yke6dF.js} +1 -1
  280. package/dist/web/index.html +2 -2
  281. package/node_modules/@agent-tower/shared/dist/types.d.ts +198 -1
  282. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  283. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  284. package/node_modules/@prisma/client/.prisma/client/edge.js +52 -5
  285. package/node_modules/@prisma/client/.prisma/client/index-browser.js +47 -0
  286. package/node_modules/@prisma/client/.prisma/client/index.d.ts +6144 -2196
  287. package/node_modules/@prisma/client/.prisma/client/index.js +52 -5
  288. package/node_modules/@prisma/client/.prisma/client/package.json +1 -1
  289. package/node_modules/@prisma/client/.prisma/client/schema.prisma +94 -30
  290. package/node_modules/@prisma/client/.prisma/client/wasm.js +47 -0
  291. package/package.json +1 -1
  292. package/prisma/migrations/20260618010000_add_workspace_verdicts/migration.sql +27 -0
  293. package/prisma/migrations/20260701000000_add_access_auth_settings/migration.sql +9 -0
  294. package/prisma/migrations/20260702000000_add_teamrun_target_commit_fields/migration.sql +38 -0
  295. package/prisma/schema.prisma +64 -0
  296. package/dist/web/assets/CreateTaskInput-Cb3aRHr3.js +0 -1
  297. package/dist/web/assets/GeneralSettingsPage-CE7P3t_v.js +0 -1
  298. package/dist/web/assets/McpSettingsPage-gp1XDMUd.js +0 -1
  299. package/dist/web/assets/NotificationSettingsPage-BhZeHEef.js +0 -1
  300. package/dist/web/assets/ProfileSettingsPage-D_y3ePFs.js +0 -3
  301. package/dist/web/assets/ProjectSettingsPage-V38j8T61.js +0 -2
  302. package/dist/web/assets/channel-CWEYGfCJ.js +0 -1
  303. package/dist/web/assets/check-D2WWIhwV.js +0 -1
  304. package/dist/web/assets/classDiagram-4FO5ZUOK-CcU8zfK8.js +0 -1
  305. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CcU8zfK8.js +0 -1
  306. package/dist/web/assets/confirm-dialog-BAqfLDT8.js +0 -1
  307. package/dist/web/assets/folder-picker-DFB9_pv4.js +0 -1
  308. package/dist/web/assets/folder-u7fKAtz_.js +0 -1
  309. package/dist/web/assets/index-7nw4fV42.js +0 -122
  310. package/dist/web/assets/index-YCjjSSLC.css +0 -1
  311. package/dist/web/assets/input-CKwRYuUJ.js +0 -1
  312. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-CudtEyHd.js +0 -1
@@ -327,6 +327,14 @@ describe('TeamReconcilerService', () => {
327
327
  workRequestId: request.id,
328
328
  memberId: members[0].id,
329
329
  workspaceId: workspace.id,
330
+ roomReplyReminderCount: 3,
331
+ });
332
+ await prisma.agentInvocation.update({
333
+ where: { id: invocation.id },
334
+ data: {
335
+ nextRoomReplyReminderAt: new Date(Date.UTC(2026, 0, 1, 0, 5, 0)),
336
+ firstNudgeAt: new Date(Date.UTC(2026, 0, 1, 0, 0, 0)),
337
+ },
330
338
  });
331
339
  expect(lockService.acquire(invocation.id, ['workspace:task:write'])).toBe(true);
332
340
  await prisma.roomMessage.create({
@@ -346,7 +354,12 @@ describe('TeamReconcilerService', () => {
346
354
  await service.handleSessionExit(invocation.sessionId);
347
355
  await expect(prisma.agentInvocation.findUnique({ where: { id: invocation.id } })).resolves.toMatchObject({
348
356
  status: 'COMPLETED',
357
+ roomReplyReminderCount: 0,
349
358
  nextRoomReplyReminderAt: null,
359
+ firstNudgeAt: null,
360
+ });
361
+ await expect(prisma.workRequest.findUnique({ where: { id: request.id } })).resolves.toMatchObject({
362
+ status: 'COMPLETED',
350
363
  });
351
364
  expect(scheduler.releaseInvocationLocks).toHaveBeenCalledWith(invocation.id);
352
365
  expect(lockService.listLocks()).toEqual([]);
@@ -369,6 +382,117 @@ describe('TeamReconcilerService', () => {
369
382
  expect(messenger.sendMessage).toHaveBeenCalledWith(invocation.sessionId, TEAM_ROOM_REPLY_REMINDER);
370
383
  expect(scheduler.releaseInvocationLocks).not.toHaveBeenCalled();
371
384
  });
385
+ it('ignores forged non-agent RoomMessages with senderInvocationId during reconcile', async () => {
386
+ const { workspace, teamRun, members } = await createFixture();
387
+ const request = await createWorkRequest({ teamRunId: teamRun.id, targetMemberId: members[0].id });
388
+ const invocation = await createRunningInvocation({
389
+ teamRunId: teamRun.id,
390
+ workRequestId: request.id,
391
+ memberId: members[0].id,
392
+ workspaceId: workspace.id,
393
+ status: 'WAITING_ROOM_REPLY',
394
+ roomReplyReminderCount: 1,
395
+ });
396
+ await prisma.agentInvocation.update({
397
+ where: { id: invocation.id },
398
+ data: { nextRoomReplyReminderAt: new Date(Date.UTC(2026, 0, 1, 0, 1, 0)) },
399
+ });
400
+ await prisma.roomMessage.createMany({
401
+ data: [
402
+ {
403
+ teamRunId: teamRun.id,
404
+ senderType: 'user',
405
+ senderId: null,
406
+ senderInvocationId: invocation.id,
407
+ kind: 'chat',
408
+ content: 'Host note should not count as result',
409
+ mentions: '[]',
410
+ workRequestIds: '[]',
411
+ artifactRefs: '[]',
412
+ attachmentIds: '[]',
413
+ },
414
+ {
415
+ teamRunId: teamRun.id,
416
+ senderType: 'system',
417
+ senderId: null,
418
+ senderInvocationId: invocation.id,
419
+ kind: 'system',
420
+ content: 'System note should not count as result',
421
+ mentions: '[]',
422
+ workRequestIds: '[]',
423
+ artifactRefs: '[]',
424
+ attachmentIds: '[]',
425
+ },
426
+ ],
427
+ });
428
+ await service.reconcileInvocation(invocation.id);
429
+ await expect(prisma.agentInvocation.findUnique({ where: { id: invocation.id } })).resolves.toMatchObject({
430
+ status: 'WAITING_ROOM_REPLY',
431
+ roomReplyReminderCount: 1,
432
+ });
433
+ await expect(prisma.workRequest.findUnique({ where: { id: request.id } })).resolves.toMatchObject({
434
+ status: 'STARTED',
435
+ });
436
+ expect(scheduler.releaseInvocationLocks).not.toHaveBeenCalled();
437
+ expect(scheduler.startNextSessions).not.toHaveBeenCalled();
438
+ });
439
+ it('ignores private agent RoomMessages with senderInvocationId during reconcile', async () => {
440
+ const { workspace, teamRun, members } = await createFixture({ memberCount: 2 });
441
+ const request = await createWorkRequest({ teamRunId: teamRun.id, targetMemberId: members[0].id });
442
+ const invocation = await createRunningInvocation({
443
+ teamRunId: teamRun.id,
444
+ workRequestId: request.id,
445
+ memberId: members[0].id,
446
+ workspaceId: workspace.id,
447
+ status: 'WAITING_ROOM_REPLY',
448
+ roomReplyReminderCount: 1,
449
+ });
450
+ await prisma.agentInvocation.update({
451
+ where: { id: invocation.id },
452
+ data: { nextRoomReplyReminderAt: new Date(Date.UTC(2026, 0, 1, 0, 1, 0)) },
453
+ });
454
+ const privateMessage = await prisma.roomMessage.create({
455
+ data: {
456
+ teamRunId: teamRun.id,
457
+ senderType: 'agent',
458
+ senderId: members[0].id,
459
+ senderInvocationId: invocation.id,
460
+ kind: 'work_request',
461
+ visibility: 'PRIVATE',
462
+ content: 'Private handoff should not count as a public result',
463
+ mentions: stringifyJson([]),
464
+ workRequestIds: stringifyJson([]),
465
+ artifactRefs: stringifyJson([]),
466
+ attachmentIds: stringifyJson([]),
467
+ },
468
+ });
469
+ await prisma.roomMessageParticipant.createMany({
470
+ data: [
471
+ {
472
+ teamRunId: teamRun.id,
473
+ roomMessageId: privateMessage.id,
474
+ memberId: members[0].id,
475
+ role: 'sender',
476
+ },
477
+ {
478
+ teamRunId: teamRun.id,
479
+ roomMessageId: privateMessage.id,
480
+ memberId: members[1].id,
481
+ role: 'recipient',
482
+ },
483
+ ],
484
+ });
485
+ await service.reconcileInvocation(invocation.id);
486
+ await expect(prisma.agentInvocation.findUnique({ where: { id: invocation.id } })).resolves.toMatchObject({
487
+ status: 'WAITING_ROOM_REPLY',
488
+ roomReplyReminderCount: 1,
489
+ });
490
+ await expect(prisma.workRequest.findUnique({ where: { id: request.id } })).resolves.toMatchObject({
491
+ status: 'STARTED',
492
+ });
493
+ expect(scheduler.releaseInvocationLocks).not.toHaveBeenCalled();
494
+ expect(scheduler.startNextSessions).not.toHaveBeenCalled();
495
+ });
372
496
  it('does not send another reminder before the backoff time is due', async () => {
373
497
  const { workspace, teamRun, members } = await createFixture();
374
498
  const request = await createWorkRequest({ teamRunId: teamRun.id, targetMemberId: members[0].id });
@@ -421,11 +545,55 @@ describe('TeamReconcilerService', () => {
421
545
  await expect(service.reconcileDueRoomReplyReminders()).resolves.toBe(1);
422
546
  await expect(prisma.agentInvocation.findUnique({ where: { id: invocation.id } })).resolves.toMatchObject({
423
547
  status: 'FAILED',
548
+ roomReplyReminderCount: 0,
424
549
  nextRoomReplyReminderAt: null,
550
+ firstNudgeAt: null,
551
+ });
552
+ await expect(prisma.workRequest.findUnique({ where: { id: request.id } })).resolves.toMatchObject({
553
+ status: 'FAILED',
425
554
  });
426
555
  expect(scheduler.releaseInvocationLocks).toHaveBeenCalledWith(invocation.id);
427
556
  expect(lockService.listLocks()).toEqual([]);
428
557
  });
558
+ it('does not complete due reminders from forged non-agent RoomMessages with senderInvocationId', async () => {
559
+ const { workspace, teamRun, members } = await createFixture();
560
+ const request = await createWorkRequest({ teamRunId: teamRun.id, targetMemberId: members[0].id });
561
+ const invocation = await createRunningInvocation({
562
+ teamRunId: teamRun.id,
563
+ workRequestId: request.id,
564
+ memberId: members[0].id,
565
+ workspaceId: workspace.id,
566
+ status: 'WAITING_ROOM_REPLY',
567
+ roomReplyReminderCount: 1,
568
+ });
569
+ await prisma.agentInvocation.update({
570
+ where: { id: invocation.id },
571
+ data: { nextRoomReplyReminderAt: new Date(Date.UTC(2025, 11, 31, 23, 59, 59)) },
572
+ });
573
+ await prisma.roomMessage.create({
574
+ data: {
575
+ teamRunId: teamRun.id,
576
+ senderType: 'user',
577
+ senderId: null,
578
+ senderInvocationId: invocation.id,
579
+ kind: 'chat',
580
+ content: 'Forged result',
581
+ mentions: '[]',
582
+ workRequestIds: '[]',
583
+ artifactRefs: '[]',
584
+ attachmentIds: '[]',
585
+ },
586
+ });
587
+ await expect(service.reconcileDueRoomReplyReminders()).resolves.toBe(1);
588
+ await expect(prisma.agentInvocation.findUnique({ where: { id: invocation.id } })).resolves.toMatchObject({
589
+ status: 'WAITING_ROOM_REPLY',
590
+ roomReplyReminderCount: 2,
591
+ });
592
+ await expect(prisma.workRequest.findUnique({ where: { id: request.id } })).resolves.toMatchObject({
593
+ status: 'STARTED',
594
+ });
595
+ expect(scheduler.releaseInvocationLocks).not.toHaveBeenCalled();
596
+ });
429
597
  it('moves an idle TeamRun task from IN_PROGRESS to IN_REVIEW and writes reviewReason', async () => {
430
598
  const { workspace, task, teamRun, members } = await createFixture({ taskStatus: TaskStatus.IN_PROGRESS });
431
599
  const request = await createWorkRequest({ teamRunId: teamRun.id, targetMemberId: members[0].id });
@@ -482,6 +650,9 @@ describe('TeamReconcilerService', () => {
482
650
  status: 'CANCELLED',
483
651
  nextRoomReplyReminderAt: null,
484
652
  });
653
+ await expect(prisma.workRequest.findUnique({ where: { id: request.id } })).resolves.toMatchObject({
654
+ status: 'CANCELLED',
655
+ });
485
656
  expect(scheduler.releaseInvocationLocks).toHaveBeenCalledWith(invocation.id);
486
657
  expect(lockService.listLocks()).toEqual([]);
487
658
  expect(scheduler.startNextSessions).toHaveBeenCalledWith(teamRun.id);
@@ -514,6 +685,9 @@ describe('TeamReconcilerService', () => {
514
685
  await expect(prisma.agentInvocation.findUnique({ where: { id: invocation.id } })).resolves.toMatchObject({
515
686
  status: 'CANCELLED',
516
687
  });
688
+ await expect(prisma.workRequest.findUnique({ where: { id: request.id } })).resolves.toMatchObject({
689
+ status: 'CANCELLED',
690
+ });
517
691
  await expect(prisma.task.findUnique({ where: { id: task.id } })).resolves.toMatchObject({
518
692
  status: TaskStatus.IN_PROGRESS,
519
693
  });
@@ -544,6 +718,9 @@ describe('TeamReconcilerService', () => {
544
718
  status: 'CANCELLED',
545
719
  nextRoomReplyReminderAt: null,
546
720
  });
721
+ await expect(prisma.workRequest.findUnique({ where: { id: request.id } })).resolves.toMatchObject({
722
+ status: 'CANCELLED',
723
+ });
547
724
  expect(scheduler.releaseInvocationLocks).toHaveBeenCalledWith(invocation.id);
548
725
  expect(lockService.listLocks()).toEqual([]);
549
726
  expect(scheduler.startNextSessions).not.toHaveBeenCalled();
@@ -662,7 +839,7 @@ describe('TeamReconcilerService', () => {
662
839
  expect(createdRequest).toMatchObject({
663
840
  requesterType: 'agent',
664
841
  requesterMemberId: members[0].id,
665
- status: 'STARTED',
842
+ status: 'FAILED',
666
843
  });
667
844
  createdRequestId = createdRequest.id;
668
845
  });
@@ -713,6 +890,21 @@ describe('TeamReconcilerService', () => {
713
890
  workspaceId: workspace.id,
714
891
  });
715
892
  const longContent = `Long Team Room detail\n${'visible detail '.repeat(80)}`;
893
+ const earlierMessage = await prisma.roomMessage.create({
894
+ data: {
895
+ teamRunId: teamRun.id,
896
+ senderType: 'user',
897
+ senderId: members[0].id,
898
+ senderInvocationId: null,
899
+ kind: 'chat',
900
+ visibility: 'PUBLIC',
901
+ content: 'Earlier visible message',
902
+ mentions: stringifyJson([]),
903
+ artifactRefs: stringifyJson([]),
904
+ attachmentIds: stringifyJson([]),
905
+ workRequestIds: stringifyJson([]),
906
+ },
907
+ });
716
908
  const roomMessage = await prisma.roomMessage.create({
717
909
  data: {
718
910
  teamRunId: teamRun.id,
@@ -728,6 +920,33 @@ describe('TeamReconcilerService', () => {
728
920
  workRequestIds: stringifyJson([]),
729
921
  },
730
922
  });
923
+ await prisma.roomMessage.update({
924
+ where: { id: earlierMessage.id },
925
+ data: { createdAt: new Date('2026-01-01T00:00:00.000Z') },
926
+ });
927
+ await prisma.roomMessage.update({
928
+ where: { id: roomMessage.id },
929
+ data: { createdAt: new Date('2026-01-01T00:00:01.000Z') },
930
+ });
931
+ const agentMessage = await prisma.roomMessage.create({
932
+ data: {
933
+ teamRunId: teamRun.id,
934
+ senderType: 'agent',
935
+ senderId: members[0].id,
936
+ senderInvocationId: invocation.id,
937
+ kind: 'review',
938
+ visibility: 'PUBLIC',
939
+ content: 'Agent review summary',
940
+ mentions: stringifyJson([]),
941
+ artifactRefs: stringifyJson([]),
942
+ attachmentIds: stringifyJson([]),
943
+ workRequestIds: stringifyJson(['work-request-from-agent-message']),
944
+ },
945
+ });
946
+ await prisma.roomMessage.update({
947
+ where: { id: agentMessage.id },
948
+ data: { createdAt: new Date('2026-01-01T00:00:02.000Z') },
949
+ });
731
950
  const app = Fastify({ logger: false });
732
951
  try {
733
952
  setTeamRunEnv({
@@ -750,11 +969,28 @@ describe('TeamReconcilerService', () => {
750
969
  expect(restListResponse.statusCode).toBe(200);
751
970
  const restList = restListResponse.json();
752
971
  expect(restList[0]).toMatchObject({
972
+ id: earlierMessage.id,
973
+ contentMode: 'full',
974
+ fullContentAvailable: false,
975
+ isTruncated: false,
976
+ });
977
+ expect(restList[1]).toMatchObject({
753
978
  id: roomMessage.id,
979
+ contentMode: 'preview',
980
+ fullContentAvailable: true,
754
981
  isTruncated: true,
755
982
  });
756
- expect(restList[0].content).toBe(restList[0].contentPreview);
757
- expect(restList[0].content).not.toBe(longContent);
983
+ expect(restList[1].content).toBe(restList[1].contentPreview);
984
+ expect(restList[1].content).not.toBe(longContent);
985
+ const limitedRestListResponse = await app.inject({
986
+ method: 'GET',
987
+ url: `/api/team-runs/${teamRun.id}/messages?limit=1`,
988
+ headers: { 'x-agent-tower-invocation-id': invocation.id },
989
+ });
990
+ expect(limitedRestListResponse.statusCode).toBe(200);
991
+ expect(limitedRestListResponse.json().map((message) => message.id)).toEqual([
992
+ agentMessage.id,
993
+ ]);
758
994
  const restDetailResponse = await app.inject({
759
995
  method: 'GET',
760
996
  url: `/api/team-runs/${teamRun.id}/messages/${roomMessage.id}`,
@@ -764,7 +1000,9 @@ describe('TeamReconcilerService', () => {
764
1000
  expect(restDetailResponse.json()).toMatchObject({
765
1001
  id: roomMessage.id,
766
1002
  content: longContent,
767
- contentPreview: restList[0].contentPreview,
1003
+ contentPreview: restList[1].contentPreview,
1004
+ contentMode: 'full',
1005
+ fullContentAvailable: false,
768
1006
  isTruncated: true,
769
1007
  });
770
1008
  const server = await createMcpServer(`http://127.0.0.1:${address.port}`);
@@ -780,12 +1018,60 @@ describe('TeamReconcilerService', () => {
780
1018
  expect(listResult.isError).not.toBe(true);
781
1019
  const mcpList = JSON.parse(getMcpToolText(listResult));
782
1020
  expect(mcpList[0]).toMatchObject({
1021
+ id: earlierMessage.id,
1022
+ kind: 'chat',
1023
+ sender: {
1024
+ type: 'user',
1025
+ memberId: members[0].id,
1026
+ name: members[0].name,
1027
+ },
1028
+ content: 'Earlier visible message',
1029
+ fullContentAvailable: false,
1030
+ mentions: [],
1031
+ });
1032
+ expect(mcpList[0]).not.toHaveProperty('teamRunId');
1033
+ expect(mcpList[0]).not.toHaveProperty('senderId');
1034
+ expect(mcpList[0]).not.toHaveProperty('senderInvocationId');
1035
+ expect(mcpList[0]).not.toHaveProperty('visibility');
1036
+ expect(mcpList[0]).not.toHaveProperty('contentPreview');
1037
+ expect(mcpList[0]).not.toHaveProperty('contentMode');
1038
+ expect(mcpList[0]).not.toHaveProperty('isTruncated');
1039
+ expect(mcpList[0]).not.toHaveProperty('participants');
1040
+ expect(mcpList[0]).not.toHaveProperty('recipientMemberIds');
1041
+ expect(mcpList[0]).not.toHaveProperty('participantMemberIds');
1042
+ expect(mcpList[1]).toMatchObject({
783
1043
  id: roomMessage.id,
784
- isTruncated: true,
1044
+ kind: 'chat',
1045
+ sender: { type: 'user' },
1046
+ fullContentAvailable: true,
1047
+ mentions: [],
1048
+ });
1049
+ expect(mcpList[1].content).toBe(restList[1].contentPreview);
1050
+ expect(mcpList[1].content).not.toBe(longContent);
1051
+ expect(mcpList[2]).toMatchObject({
1052
+ id: agentMessage.id,
1053
+ kind: 'review',
1054
+ sender: {
1055
+ type: 'agent',
1056
+ memberId: members[0].id,
1057
+ name: members[0].name,
1058
+ },
1059
+ content: 'Agent review summary',
1060
+ fullContentAvailable: false,
1061
+ mentions: [],
1062
+ workRequestIds: ['work-request-from-agent-message'],
785
1063
  });
786
- expect(mcpList[0].contentPreview).toBeUndefined();
787
- expect(mcpList[0].content).toBe(restList[0].contentPreview);
788
- expect(mcpList[0].content).not.toBe(longContent);
1064
+ expect(mcpList[2]).not.toHaveProperty('senderInvocationId');
1065
+ const limitedListResult = await client.callTool({
1066
+ name: 'list_room_messages',
1067
+ arguments: {
1068
+ limit: 1,
1069
+ },
1070
+ });
1071
+ expect(limitedListResult.isError).not.toBe(true);
1072
+ expect(JSON.parse(getMcpToolText(limitedListResult)).map((message) => message.id)).toEqual([
1073
+ agentMessage.id,
1074
+ ]);
789
1075
  const detailResult = await client.callTool({
790
1076
  name: 'get_room_message',
791
1077
  arguments: {
@@ -796,7 +1082,9 @@ describe('TeamReconcilerService', () => {
796
1082
  expect(JSON.parse(getMcpToolText(detailResult))).toMatchObject({
797
1083
  id: roomMessage.id,
798
1084
  content: longContent,
799
- contentPreview: restList[0].contentPreview,
1085
+ contentPreview: restList[1].contentPreview,
1086
+ contentMode: 'full',
1087
+ fullContentAvailable: false,
800
1088
  isTruncated: true,
801
1089
  });
802
1090
  }
@@ -893,7 +1181,7 @@ describe('TeamReconcilerService', () => {
893
1181
  expect(createdRequest).toMatchObject({
894
1182
  requesterType: 'agent',
895
1183
  requesterMemberId: members[0].id,
896
- status: 'STARTED',
1184
+ status: 'FAILED',
897
1185
  });
898
1186
  createdRequestId = createdRequest.id;
899
1187
  });
@@ -1598,6 +1886,14 @@ describe('TeamReconcilerService', () => {
1598
1886
  });
1599
1887
  expect(noStopResult.isError).toBe(true);
1600
1888
  expect(getMcpToolText(noStopResult)).toContain('stopMemberWork');
1889
+ const noMergeResult = await callToolForCurrentMember(noRead, noReadInvocation.id, {
1890
+ name: 'merge_workspace',
1891
+ arguments: {
1892
+ workspace_id: noRead.workspace.id,
1893
+ },
1894
+ });
1895
+ expect(noMergeResult.isError).toBe(true);
1896
+ expect(getMcpToolText(noMergeResult)).toContain('mergeWorkspace');
1601
1897
  await expect(prisma.roomMessage.count({
1602
1898
  where: {
1603
1899
  content: {
@@ -1758,7 +2054,7 @@ describe('TeamReconcilerService', () => {
1758
2054
  status: 'CANCELLED',
1759
2055
  });
1760
2056
  await expect(prisma.workRequest.findUnique({ where: { id: otherRequest.id } })).resolves.toMatchObject({
1761
- status: 'STARTED',
2057
+ status: 'FAILED',
1762
2058
  });
1763
2059
  await expect(prisma.workRequest.findUnique({ where: { id: ownPendingRejection.id } })).resolves.toMatchObject({
1764
2060
  status: 'REJECTED',