agent-tower 0.7.2-beta.7 → 0.7.2

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 (555) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +4 -1
  3. package/dist/app.js.map +1 -1
  4. package/dist/app.test.js +80 -1
  5. package/dist/app.test.js.map +1 -1
  6. package/dist/cli.js +4 -10
  7. package/dist/cli.js.map +1 -1
  8. package/dist/core/container.d.ts +8 -0
  9. package/dist/core/container.d.ts.map +1 -1
  10. package/dist/core/container.js +42 -0
  11. package/dist/core/container.js.map +1 -1
  12. package/dist/core/event-bus.d.ts +2 -0
  13. package/dist/core/event-bus.d.ts.map +1 -1
  14. package/dist/core/event-bus.js.map +1 -1
  15. package/dist/executors/__tests__/image-utils.test.d.ts +2 -0
  16. package/dist/executors/__tests__/image-utils.test.d.ts.map +1 -0
  17. package/dist/executors/__tests__/image-utils.test.js +25 -0
  18. package/dist/executors/__tests__/image-utils.test.js.map +1 -0
  19. package/dist/executors/base.executor.d.ts +2 -0
  20. package/dist/executors/base.executor.d.ts.map +1 -1
  21. package/dist/executors/base.executor.js +6 -0
  22. package/dist/executors/base.executor.js.map +1 -1
  23. package/dist/executors/image-utils.d.ts.map +1 -1
  24. package/dist/executors/image-utils.js +10 -8
  25. package/dist/executors/image-utils.js.map +1 -1
  26. package/dist/git/git-cli.d.ts +2 -0
  27. package/dist/git/git-cli.d.ts.map +1 -1
  28. package/dist/git/git-cli.js +2 -0
  29. package/dist/git/git-cli.js.map +1 -1
  30. package/dist/git/worktree.manager.d.ts +2 -1
  31. package/dist/git/worktree.manager.d.ts.map +1 -1
  32. package/dist/git/worktree.manager.js +18 -12
  33. package/dist/git/worktree.manager.js.map +1 -1
  34. package/dist/index.js +16 -31
  35. package/dist/index.js.map +1 -1
  36. package/dist/mcp/http-client.d.ts +1 -0
  37. package/dist/mcp/http-client.d.ts.map +1 -1
  38. package/dist/mcp/http-client.js +3 -0
  39. package/dist/mcp/http-client.js.map +1 -1
  40. package/dist/mcp/server.d.ts.map +1 -1
  41. package/dist/mcp/server.js +15 -0
  42. package/dist/mcp/server.js.map +1 -1
  43. package/dist/mcp/tools/sessions.js +2 -2
  44. package/dist/mcp/tools/sessions.js.map +1 -1
  45. package/dist/mcp/tools/workspaces.d.ts.map +1 -1
  46. package/dist/mcp/tools/workspaces.js +2 -1
  47. package/dist/mcp/tools/workspaces.js.map +1 -1
  48. package/dist/middleware/access-auth.d.ts +1 -0
  49. package/dist/middleware/access-auth.d.ts.map +1 -1
  50. package/dist/middleware/access-auth.js +1 -1
  51. package/dist/middleware/access-auth.js.map +1 -1
  52. package/dist/output/__tests__/text-block-lifecycle.test.d.ts +2 -0
  53. package/dist/output/__tests__/text-block-lifecycle.test.d.ts.map +1 -0
  54. package/dist/output/__tests__/text-block-lifecycle.test.js +241 -0
  55. package/dist/output/__tests__/text-block-lifecycle.test.js.map +1 -0
  56. package/dist/output/claude-code-parser.d.ts +3 -0
  57. package/dist/output/claude-code-parser.d.ts.map +1 -1
  58. package/dist/output/claude-code-parser.js +58 -7
  59. package/dist/output/claude-code-parser.js.map +1 -1
  60. package/dist/output/codex-parser.d.ts.map +1 -1
  61. package/dist/output/codex-parser.js +4 -6
  62. package/dist/output/codex-parser.js.map +1 -1
  63. package/dist/output/cursor-agent-parser.d.ts.map +1 -1
  64. package/dist/output/cursor-agent-parser.js +4 -0
  65. package/dist/output/cursor-agent-parser.js.map +1 -1
  66. package/dist/output/gemini-parser.d.ts +18 -0
  67. package/dist/output/gemini-parser.d.ts.map +1 -0
  68. package/dist/output/gemini-parser.js +91 -0
  69. package/dist/output/gemini-parser.js.map +1 -0
  70. package/dist/output/msg-store.d.ts +6 -0
  71. package/dist/output/msg-store.d.ts.map +1 -1
  72. package/dist/output/msg-store.js +17 -0
  73. package/dist/output/msg-store.js.map +1 -1
  74. package/dist/output/text-block-tracker.d.ts +29 -0
  75. package/dist/output/text-block-tracker.d.ts.map +1 -0
  76. package/dist/output/text-block-tracker.js +149 -0
  77. package/dist/output/text-block-tracker.js.map +1 -0
  78. package/dist/output/types.d.ts +9 -0
  79. package/dist/output/types.d.ts.map +1 -1
  80. package/dist/output/types.js +0 -4
  81. package/dist/output/types.js.map +1 -1
  82. package/dist/routes/__tests__/sessions-runtime.test.js +3 -0
  83. package/dist/routes/__tests__/sessions-runtime.test.js.map +1 -1
  84. package/dist/routes/__tests__/team-run-translations.test.d.ts +2 -0
  85. package/dist/routes/__tests__/team-run-translations.test.d.ts.map +1 -0
  86. package/dist/routes/__tests__/team-run-translations.test.js +418 -0
  87. package/dist/routes/__tests__/team-run-translations.test.js.map +1 -0
  88. package/dist/routes/__tests__/translations.test.d.ts +2 -0
  89. package/dist/routes/__tests__/translations.test.d.ts.map +1 -0
  90. package/dist/routes/__tests__/translations.test.js +286 -0
  91. package/dist/routes/__tests__/translations.test.js.map +1 -0
  92. package/dist/routes/__tests__/workspaces.test.js +140 -0
  93. package/dist/routes/__tests__/workspaces.test.js.map +1 -1
  94. package/dist/routes/conversations.d.ts.map +1 -1
  95. package/dist/routes/conversations.js +19 -2
  96. package/dist/routes/conversations.js.map +1 -1
  97. package/dist/routes/index.d.ts.map +1 -1
  98. package/dist/routes/index.js +2 -0
  99. package/dist/routes/index.js.map +1 -1
  100. package/dist/routes/sessions.d.ts.map +1 -1
  101. package/dist/routes/sessions.js +32 -3
  102. package/dist/routes/sessions.js.map +1 -1
  103. package/dist/routes/team-runs.d.ts.map +1 -1
  104. package/dist/routes/team-runs.js +84 -15
  105. package/dist/routes/team-runs.js.map +1 -1
  106. package/dist/routes/translations.d.ts +4 -0
  107. package/dist/routes/translations.d.ts.map +1 -0
  108. package/dist/routes/translations.js +148 -0
  109. package/dist/routes/translations.js.map +1 -0
  110. package/dist/routes/user-input-origin.d.ts +4 -0
  111. package/dist/routes/user-input-origin.d.ts.map +1 -0
  112. package/dist/routes/user-input-origin.js +7 -0
  113. package/dist/routes/user-input-origin.js.map +1 -0
  114. package/dist/routes/workspaces.d.ts.map +1 -1
  115. package/dist/routes/workspaces.js +32 -2
  116. package/dist/routes/workspaces.js.map +1 -1
  117. package/dist/runtime/__tests__/acp-driver-lifecycle.test.js +2 -2
  118. package/dist/runtime/__tests__/acp-driver-lifecycle.test.js.map +1 -1
  119. package/dist/runtime/__tests__/acp-driver-submission.test.d.ts +2 -0
  120. package/dist/runtime/__tests__/acp-driver-submission.test.d.ts.map +1 -0
  121. package/dist/runtime/__tests__/acp-driver-submission.test.js +88 -0
  122. package/dist/runtime/__tests__/acp-driver-submission.test.js.map +1 -0
  123. package/dist/runtime/__tests__/acp-history-reconciler.test.js +244 -0
  124. package/dist/runtime/__tests__/acp-history-reconciler.test.js.map +1 -1
  125. package/dist/runtime/__tests__/acp-projector.test.js +36 -0
  126. package/dist/runtime/__tests__/acp-projector.test.js.map +1 -1
  127. package/dist/runtime/__tests__/claude-cli-control.test.js +20 -0
  128. package/dist/runtime/__tests__/claude-cli-control.test.js.map +1 -1
  129. package/dist/runtime/__tests__/cli-driver-submission.test.d.ts +2 -0
  130. package/dist/runtime/__tests__/cli-driver-submission.test.d.ts.map +1 -0
  131. package/dist/runtime/__tests__/cli-driver-submission.test.js +61 -0
  132. package/dist/runtime/__tests__/cli-driver-submission.test.js.map +1 -0
  133. package/dist/runtime/__tests__/codex-cli-control.test.js +25 -0
  134. package/dist/runtime/__tests__/codex-cli-control.test.js.map +1 -1
  135. package/dist/runtime/acp/acp-driver.js +38 -1
  136. package/dist/runtime/acp/acp-driver.js.map +1 -1
  137. package/dist/runtime/acp/history-reconciler.d.ts.map +1 -1
  138. package/dist/runtime/acp/history-reconciler.js +95 -36
  139. package/dist/runtime/acp/history-reconciler.js.map +1 -1
  140. package/dist/runtime/acp/projector.d.ts +5 -2
  141. package/dist/runtime/acp/projector.d.ts.map +1 -1
  142. package/dist/runtime/acp/projector.js +50 -23
  143. package/dist/runtime/acp/projector.js.map +1 -1
  144. package/dist/runtime/claude-cli-control.d.ts +4 -1
  145. package/dist/runtime/claude-cli-control.d.ts.map +1 -1
  146. package/dist/runtime/claude-cli-control.js +3 -1
  147. package/dist/runtime/claude-cli-control.js.map +1 -1
  148. package/dist/runtime/cli-driver.js +21 -7
  149. package/dist/runtime/cli-driver.js.map +1 -1
  150. package/dist/runtime/cli-parser.d.ts.map +1 -1
  151. package/dist/runtime/cli-parser.js +3 -0
  152. package/dist/runtime/cli-parser.js.map +1 -1
  153. package/dist/runtime/codex-cli-control.d.ts +4 -1
  154. package/dist/runtime/codex-cli-control.d.ts.map +1 -1
  155. package/dist/runtime/codex-cli-control.js +9 -6
  156. package/dist/runtime/codex-cli-control.js.map +1 -1
  157. package/dist/runtime/codex-cli-projector.d.ts +1 -1
  158. package/dist/runtime/codex-cli-projector.d.ts.map +1 -1
  159. package/dist/runtime/codex-cli-projector.js +4 -2
  160. package/dist/runtime/codex-cli-projector.js.map +1 -1
  161. package/dist/runtime/contracts.d.ts +15 -2
  162. package/dist/runtime/contracts.d.ts.map +1 -1
  163. package/dist/runtime/runtime-coordinator.d.ts.map +1 -1
  164. package/dist/runtime/runtime-coordinator.js +34 -1
  165. package/dist/runtime/runtime-coordinator.js.map +1 -1
  166. package/dist/services/__tests__/conflict-admission.test.d.ts +2 -0
  167. package/dist/services/__tests__/conflict-admission.test.d.ts.map +1 -0
  168. package/dist/services/__tests__/conflict-admission.test.js +37 -0
  169. package/dist/services/__tests__/conflict-admission.test.js.map +1 -0
  170. package/dist/services/__tests__/conflict-recovery-key.test.d.ts +2 -0
  171. package/dist/services/__tests__/conflict-recovery-key.test.d.ts.map +1 -0
  172. package/dist/services/__tests__/conflict-recovery-key.test.js +143 -0
  173. package/dist/services/__tests__/conflict-recovery-key.test.js.map +1 -0
  174. package/dist/services/__tests__/message-delivery.integration.test.d.ts +2 -0
  175. package/dist/services/__tests__/message-delivery.integration.test.d.ts.map +1 -0
  176. package/dist/services/__tests__/message-delivery.integration.test.js +1137 -0
  177. package/dist/services/__tests__/message-delivery.integration.test.js.map +1 -0
  178. package/dist/services/__tests__/review-team-user-counterexamples.test.d.ts +2 -0
  179. package/dist/services/__tests__/review-team-user-counterexamples.test.d.ts.map +1 -0
  180. package/dist/services/__tests__/review-team-user-counterexamples.test.js +200 -0
  181. package/dist/services/__tests__/review-team-user-counterexamples.test.js.map +1 -0
  182. package/dist/services/__tests__/session-manager.lifecycle.test.js +37 -0
  183. package/dist/services/__tests__/session-manager.lifecycle.test.js.map +1 -1
  184. package/dist/services/__tests__/session-manager.team-run.test.js +19 -2
  185. package/dist/services/__tests__/session-manager.team-run.test.js.map +1 -1
  186. package/dist/services/__tests__/team-initial-delivery.integration.test.d.ts +2 -0
  187. package/dist/services/__tests__/team-initial-delivery.integration.test.d.ts.map +1 -0
  188. package/dist/services/__tests__/team-initial-delivery.integration.test.js +469 -0
  189. package/dist/services/__tests__/team-initial-delivery.integration.test.js.map +1 -0
  190. package/dist/services/__tests__/team-reconciler.service.test.js +102 -101
  191. package/dist/services/__tests__/team-reconciler.service.test.js.map +1 -1
  192. package/dist/services/__tests__/team-room-delivery.test.d.ts +2 -0
  193. package/dist/services/__tests__/team-room-delivery.test.d.ts.map +1 -0
  194. package/dist/services/__tests__/team-room-delivery.test.js +670 -0
  195. package/dist/services/__tests__/team-room-delivery.test.js.map +1 -0
  196. package/dist/services/__tests__/team-user-delivery.integration.test.d.ts +2 -0
  197. package/dist/services/__tests__/team-user-delivery.integration.test.d.ts.map +1 -0
  198. package/dist/services/__tests__/team-user-delivery.integration.test.js +622 -0
  199. package/dist/services/__tests__/team-user-delivery.integration.test.js.map +1 -0
  200. package/dist/services/__tests__/translation-client.test.d.ts +2 -0
  201. package/dist/services/__tests__/translation-client.test.d.ts.map +1 -0
  202. package/dist/services/__tests__/translation-client.test.js +240 -0
  203. package/dist/services/__tests__/translation-client.test.js.map +1 -0
  204. package/dist/services/__tests__/translation-protection.test.d.ts +2 -0
  205. package/dist/services/__tests__/translation-protection.test.d.ts.map +1 -0
  206. package/dist/services/__tests__/translation-protection.test.js +156 -0
  207. package/dist/services/__tests__/translation-protection.test.js.map +1 -0
  208. package/dist/services/__tests__/translation-queue.test.d.ts +2 -0
  209. package/dist/services/__tests__/translation-queue.test.d.ts.map +1 -0
  210. package/dist/services/__tests__/translation-queue.test.js +277 -0
  211. package/dist/services/__tests__/translation-queue.test.js.map +1 -0
  212. package/dist/services/__tests__/translation-room-admission.test.d.ts +2 -0
  213. package/dist/services/__tests__/translation-room-admission.test.d.ts.map +1 -0
  214. package/dist/services/__tests__/translation-room-admission.test.js +371 -0
  215. package/dist/services/__tests__/translation-room-admission.test.js.map +1 -0
  216. package/dist/services/__tests__/translation-session-blocks.test.d.ts +2 -0
  217. package/dist/services/__tests__/translation-session-blocks.test.d.ts.map +1 -0
  218. package/dist/services/__tests__/translation-session-blocks.test.js +367 -0
  219. package/dist/services/__tests__/translation-session-blocks.test.js.map +1 -0
  220. package/dist/services/__tests__/translation-settings.service.test.d.ts +2 -0
  221. package/dist/services/__tests__/translation-settings.service.test.d.ts.map +1 -0
  222. package/dist/services/__tests__/translation-settings.service.test.js +154 -0
  223. package/dist/services/__tests__/translation-settings.service.test.js.map +1 -0
  224. package/dist/services/__tests__/translation.service.test.d.ts +2 -0
  225. package/dist/services/__tests__/translation.service.test.d.ts.map +1 -0
  226. package/dist/services/__tests__/translation.service.test.js +480 -0
  227. package/dist/services/__tests__/translation.service.test.js.map +1 -0
  228. package/dist/services/access-auth.service.d.ts +1 -0
  229. package/dist/services/access-auth.service.d.ts.map +1 -1
  230. package/dist/services/access-auth.service.js +8 -0
  231. package/dist/services/access-auth.service.js.map +1 -1
  232. package/dist/services/attachment-context.d.ts +7 -1
  233. package/dist/services/attachment-context.d.ts.map +1 -1
  234. package/dist/services/attachment-context.js +23 -2
  235. package/dist/services/attachment-context.js.map +1 -1
  236. package/dist/services/conflict-admission.d.ts +37 -0
  237. package/dist/services/conflict-admission.d.ts.map +1 -0
  238. package/dist/services/conflict-admission.js +97 -0
  239. package/dist/services/conflict-admission.js.map +1 -0
  240. package/dist/services/conflict-resolution-context.d.ts +33 -0
  241. package/dist/services/conflict-resolution-context.d.ts.map +1 -0
  242. package/dist/services/conflict-resolution-context.js +434 -0
  243. package/dist/services/conflict-resolution-context.js.map +1 -0
  244. package/dist/services/message-delivery.service.d.ts +195 -0
  245. package/dist/services/message-delivery.service.d.ts.map +1 -0
  246. package/dist/services/message-delivery.service.js +956 -0
  247. package/dist/services/message-delivery.service.js.map +1 -0
  248. package/dist/services/project.service.d.ts +1 -1
  249. package/dist/services/session-manager.d.ts +94 -74
  250. package/dist/services/session-manager.d.ts.map +1 -1
  251. package/dist/services/session-manager.js +91 -17
  252. package/dist/services/session-manager.js.map +1 -1
  253. package/dist/services/task.service.d.ts +26 -20
  254. package/dist/services/task.service.d.ts.map +1 -1
  255. package/dist/services/task.service.js +9 -26
  256. package/dist/services/task.service.js.map +1 -1
  257. package/dist/services/team-room-delivery.d.ts +541 -0
  258. package/dist/services/team-room-delivery.d.ts.map +1 -0
  259. package/dist/services/team-room-delivery.js +123 -0
  260. package/dist/services/team-room-delivery.js.map +1 -0
  261. package/dist/services/team-run.service.d.ts +83 -0
  262. package/dist/services/team-run.service.d.ts.map +1 -1
  263. package/dist/services/team-run.service.js +207 -18
  264. package/dist/services/team-run.service.js.map +1 -1
  265. package/dist/services/team-scheduler.service.d.ts +3 -0
  266. package/dist/services/team-scheduler.service.d.ts.map +1 -1
  267. package/dist/services/team-scheduler.service.js +65 -11
  268. package/dist/services/team-scheduler.service.js.map +1 -1
  269. package/dist/services/team-task-input.d.ts +37 -0
  270. package/dist/services/team-task-input.d.ts.map +1 -0
  271. package/dist/services/team-task-input.js +98 -0
  272. package/dist/services/team-task-input.js.map +1 -0
  273. package/dist/services/team-task-input.service.d.ts +72 -0
  274. package/dist/services/team-task-input.service.d.ts.map +1 -0
  275. package/dist/services/team-task-input.service.js +205 -0
  276. package/dist/services/team-task-input.service.js.map +1 -0
  277. package/dist/services/translation-client.d.ts +31 -0
  278. package/dist/services/translation-client.d.ts.map +1 -0
  279. package/dist/services/translation-client.js +169 -0
  280. package/dist/services/translation-client.js.map +1 -0
  281. package/dist/services/translation-errors.d.ts +14 -0
  282. package/dist/services/translation-errors.d.ts.map +1 -0
  283. package/dist/services/translation-errors.js +16 -0
  284. package/dist/services/translation-errors.js.map +1 -0
  285. package/dist/services/translation-protection.d.ts +27 -0
  286. package/dist/services/translation-protection.d.ts.map +1 -0
  287. package/dist/services/translation-protection.js +547 -0
  288. package/dist/services/translation-protection.js.map +1 -0
  289. package/dist/services/translation-queue.d.ts +49 -0
  290. package/dist/services/translation-queue.d.ts.map +1 -0
  291. package/dist/services/translation-queue.js +211 -0
  292. package/dist/services/translation-queue.js.map +1 -0
  293. package/dist/services/translation-settings.service.d.ts +152 -0
  294. package/dist/services/translation-settings.service.d.ts.map +1 -0
  295. package/dist/services/translation-settings.service.js +174 -0
  296. package/dist/services/translation-settings.service.js.map +1 -0
  297. package/dist/services/translation.service.d.ts +168 -0
  298. package/dist/services/translation.service.d.ts.map +1 -0
  299. package/dist/services/translation.service.js +861 -0
  300. package/dist/services/translation.service.js.map +1 -0
  301. package/dist/services/workspace.service.d.ts +84 -93
  302. package/dist/services/workspace.service.d.ts.map +1 -1
  303. package/dist/services/workspace.service.js +69 -5
  304. package/dist/services/workspace.service.js.map +1 -1
  305. package/dist/socket/__tests__/socket-gateway.test.js +131 -1
  306. package/dist/socket/__tests__/socket-gateway.test.js.map +1 -1
  307. package/dist/socket/socket-gateway.d.ts +6 -0
  308. package/dist/socket/socket-gateway.d.ts.map +1 -1
  309. package/dist/socket/socket-gateway.js +312 -6
  310. package/dist/socket/socket-gateway.js.map +1 -1
  311. package/dist/utils/database-runtime.test.js +82 -5
  312. package/dist/utils/database-runtime.test.js.map +1 -1
  313. package/dist/utils/database-schema.d.ts +9 -0
  314. package/dist/utils/database-schema.d.ts.map +1 -0
  315. package/dist/utils/database-schema.js +434 -0
  316. package/dist/utils/database-schema.js.map +1 -0
  317. package/dist/utils/database-schema.test.d.ts +2 -0
  318. package/dist/utils/database-schema.test.d.ts.map +1 -0
  319. package/dist/utils/database-schema.test.js +359 -0
  320. package/dist/utils/database-schema.test.js.map +1 -0
  321. package/dist/utils/database-team-foundation.test.d.ts +2 -0
  322. package/dist/utils/database-team-foundation.test.d.ts.map +1 -0
  323. package/dist/utils/database-team-foundation.test.js +467 -0
  324. package/dist/utils/database-team-foundation.test.js.map +1 -0
  325. package/dist/utils/index.d.ts.map +1 -1
  326. package/dist/utils/index.js +29 -1
  327. package/dist/utils/index.js.map +1 -1
  328. package/dist/utils/owned-child-process.test.js +6 -3
  329. package/dist/utils/owned-child-process.test.js.map +1 -1
  330. package/dist/utils/text-preview.d.ts +4 -0
  331. package/dist/utils/text-preview.d.ts.map +1 -0
  332. package/dist/utils/text-preview.js +21 -0
  333. package/dist/utils/text-preview.js.map +1 -0
  334. package/dist/web/assets/AgentDemoPage-BfXkNCdN.js +1 -0
  335. package/dist/web/assets/{AgentEnvironmentSettingsPage-SnxiaHvN.js → AgentEnvironmentSettingsPage-GHjKIWpb.js} +1 -1
  336. package/dist/web/assets/AttachmentPreview-CLN1lnLe.js +2 -0
  337. package/dist/web/assets/BranchSelect-Cofp8vYf.js +1 -0
  338. package/dist/web/assets/BrandLogo-BUimEX-9.js +1 -0
  339. package/dist/web/assets/ConversationPage-R7vNaOQv.js +1 -0
  340. package/dist/web/assets/CreateTaskInput-CasITF8y.js +1 -0
  341. package/dist/web/assets/{DemoPage-BHbnnZFF.js → DemoPage-DK-ikg1_.js} +3 -3
  342. package/dist/web/assets/DesignSystemPage-BhjNs2vP.js +12 -0
  343. package/dist/web/assets/EditableTaskTitle-BJ9Rxggf.js +70 -0
  344. package/dist/web/assets/{ExecutionPermissionSelector-DcC4IBOF.js → ExecutionPermissionSelector-B8befbxJ.js} +1 -1
  345. package/dist/web/assets/GeneralSettingsPage-RMN2al8I.js +1 -0
  346. package/dist/web/assets/{LoadingPreviewPage-dE_jyl19.js → LoadingPreviewPage-BDlf89rJ.js} +1 -1
  347. package/dist/web/assets/{McpSettingsPage-CIuQ4bvy.js → McpSettingsPage-CPNxFF67.js} +1 -1
  348. package/dist/web/assets/{MemberAvatar-BG0VDZKf.js → MemberAvatar-YVr_erAr.js} +1 -1
  349. package/dist/web/assets/MobileTaskDetail-QNUHMq7u.js +3 -0
  350. package/dist/web/assets/NotificationSettingsPage-BEyuyu3Z.js +1 -0
  351. package/dist/web/assets/ProfileSettingsPage-CHe4LlRp.js +3 -0
  352. package/dist/web/assets/ProjectKanbanPage-Bt_01giW.js +12 -0
  353. package/dist/web/assets/ProjectSettingsPage-cus6Ns97.js +2 -0
  354. package/dist/web/assets/{ProviderSettingsPage-DLq-GBxp.js → ProviderSettingsPage-DqA_B1Ey.js} +2 -2
  355. package/dist/web/assets/{SettingsMasterDetail-UfyoKAum.js → SettingsMasterDetail-DjWR9Sqk.js} +1 -1
  356. package/dist/web/assets/TaskDetail-rEXNe2h3.js +1 -0
  357. package/dist/web/assets/TeamSettingsPage-DwWROtW6.js +1 -0
  358. package/dist/web/assets/TranslationSettingsPage-Cod9c4Ug.js +1 -0
  359. package/dist/web/assets/arc-DEy33vTc.js +1 -0
  360. package/dist/web/assets/{architectureDiagram-3BPJPVTR-BCNj6ZWE.js → architectureDiagram-3BPJPVTR-Ky1D1LBk.js} +1 -1
  361. package/dist/web/assets/{at-sign-C4VhWike.js → at-sign-C48_y345.js} +1 -1
  362. package/dist/web/assets/{blockDiagram-GPEHLZMM-D1kmB9gz.js → blockDiagram-GPEHLZMM-BNgB7kNT.js} +1 -1
  363. package/dist/web/assets/{c4Diagram-AAUBKEIU-DbWKTkSe.js → c4Diagram-AAUBKEIU-4GMrPMgQ.js} +1 -1
  364. package/dist/web/assets/channel-DTP-syjA.js +1 -0
  365. package/dist/web/assets/check-BmiJ7qMY.js +1 -0
  366. package/dist/web/assets/chevron-down-3y5Aiolp.js +1 -0
  367. package/dist/web/assets/{chevron-up-DOkDFvIc.js → chevron-up-DqaYcjpq.js} +1 -1
  368. package/dist/web/assets/{chunk-2J33WTMH-B3TA0-LD.js → chunk-2J33WTMH-C439hRe_.js} +1 -1
  369. package/dist/web/assets/{chunk-4BX2VUAB-CvPTiBSV.js → chunk-4BX2VUAB-D8GK3M3t.js} +1 -1
  370. package/dist/web/assets/{chunk-55IACEB6-xGe9Fu9Z.js → chunk-55IACEB6-Dl4UhJ8X.js} +1 -1
  371. package/dist/web/assets/{chunk-727SXJPM-H8pz3amK.js → chunk-727SXJPM-BSEeayBq.js} +1 -1
  372. package/dist/web/assets/{chunk-AQP2D5EJ-BmYYNxcL.js → chunk-AQP2D5EJ-B6chbZfT.js} +1 -1
  373. package/dist/web/assets/{chunk-FMBD7UC4-BmOEsLTE.js → chunk-FMBD7UC4-DaLkiLdQ.js} +1 -1
  374. package/dist/web/assets/{chunk-ND2GUHAM-C5MfA0xc.js → chunk-ND2GUHAM-DeQwZAAT.js} +1 -1
  375. package/dist/web/assets/{chunk-QZHKN3VN-BcrGYZ7V.js → chunk-QZHKN3VN-CLRr4YRM.js} +1 -1
  376. package/dist/web/assets/classDiagram-4FO5ZUOK-CUKgurLa.js +1 -0
  377. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CUKgurLa.js +1 -0
  378. package/dist/web/assets/code-block-OCS4YCEC-CnoxUpOx.js +2 -0
  379. package/dist/web/assets/confirm-dialog-ltNBFYCs.js +1 -0
  380. package/dist/web/assets/content-DPQMfMae.js +2 -0
  381. package/dist/web/assets/{copy-CdzVE3kf.js → copy-HRMhTkIG.js} +1 -1
  382. package/dist/web/assets/{cose-bilkent-S5V4N54A-CLQ-m71G.js → cose-bilkent-S5V4N54A-C1UiYzfk.js} +1 -1
  383. package/dist/web/assets/cssMode-DkuSsGeg.js +1 -0
  384. package/dist/web/assets/{dagre-BM42HDAG-CmDqxOfn.js → dagre-BM42HDAG-CTJpBgye.js} +1 -1
  385. package/dist/web/assets/{diagram-2AECGRRQ-D-fSbEll.js → diagram-2AECGRRQ-Dj1_TEYp.js} +1 -1
  386. package/dist/web/assets/{diagram-5GNKFQAL-HPywThAf.js → diagram-5GNKFQAL-V-KUpwqh.js} +1 -1
  387. package/dist/web/assets/{diagram-KO2AKTUF-DAzLhllz.js → diagram-KO2AKTUF-CXG1ZIeX.js} +1 -1
  388. package/dist/web/assets/{diagram-LMA3HP47-DXYB9h8L.js → diagram-LMA3HP47-BZSJUwk9.js} +1 -1
  389. package/dist/web/assets/{diagram-OG6HWLK6-vv4kz4Zo.js → diagram-OG6HWLK6-CCr4gq4u.js} +1 -1
  390. package/dist/web/assets/dialog-CuFEdqLg.js +5 -0
  391. package/dist/web/assets/{erDiagram-TEJ5UH35-Cu6aVKAa.js → erDiagram-TEJ5UH35-Djtyzh6z.js} +1 -1
  392. package/dist/web/assets/{flowDiagram-I6XJVG4X-BKDe8WSQ.js → flowDiagram-I6XJVG4X-BmSVSiXJ.js} +1 -1
  393. package/dist/web/assets/{freemarker2-DI2giuAo.js → freemarker2-DdptX5f1.js} +2 -2
  394. package/dist/web/assets/{ganttDiagram-6RSMTGT7-DMVLzmAE.js → ganttDiagram-6RSMTGT7-r5vQX-b5.js} +1 -1
  395. package/dist/web/assets/{gitGraphDiagram-PVQCEYII-vogzYdKn.js → gitGraphDiagram-PVQCEYII-Zj9aloh9.js} +1 -1
  396. package/dist/web/assets/{globe-Rnn-nKw-.js → globe-B9I-jHBB.js} +1 -1
  397. package/dist/web/assets/handlebars-B34f-LAf.js +1 -0
  398. package/dist/web/assets/hooks-BLxb16IA.js +1 -0
  399. package/dist/web/assets/html-CnvOQ63o.js +1 -0
  400. package/dist/web/assets/htmlMode-RdxZ8Svp.js +1 -0
  401. package/dist/web/assets/{icon-button-CuSuXgr_.js → icon-button-CYiKa-7C.js} +1 -1
  402. package/dist/web/assets/index-0XPZayUU.css +1 -0
  403. package/dist/web/assets/index-B1oVmCie.js +1 -0
  404. package/dist/web/assets/index-BJObbxud.js +122 -0
  405. package/dist/web/assets/index-Bhvt-E6d.js +41 -0
  406. package/dist/web/assets/index-BtUQYU5l.js +1 -0
  407. package/dist/web/assets/index-CThFsQNP.js +1 -0
  408. package/dist/web/assets/index-DZLnTISJ.js +1 -0
  409. package/dist/web/assets/index-DcOU2m2F.js +1 -0
  410. package/dist/web/assets/{index-CMjLMilU.js → index-Dk3bRQAK.js} +1 -1
  411. package/dist/web/assets/{index-B88xAivn.js → index-DkRy6eNX.js} +5 -5
  412. package/dist/web/assets/{infoDiagram-5YYISTIA-CEfSHkNq.js → infoDiagram-5YYISTIA-BHtVaxZx.js} +1 -1
  413. package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-BXKZuWtD.js → ishikawaDiagram-YF4QCWOH-BYmwjkbC.js} +5 -5
  414. package/dist/web/assets/javascript-BhombDEO.js +1 -0
  415. package/dist/web/assets/{journeyDiagram-JHISSGLW-wsOUYlu7.js → journeyDiagram-JHISSGLW-c8BBqqRS.js} +1 -1
  416. package/dist/web/assets/jsonMode-BJGOUeaV.js +7 -0
  417. package/dist/web/assets/{kanban-definition-UN3LZRKU-DNsuvOrU.js → kanban-definition-UN3LZRKU-D4Vr-oFT.js} +1 -1
  418. package/dist/web/assets/{kbd-B3m64lRd.js → kbd-C88ut3t9.js} +1 -1
  419. package/dist/web/assets/{key-round-DpYSyeDH.js → key-round-Cjbj2qNa.js} +1 -1
  420. package/dist/web/assets/{layers-CxqMQVmH.js → layers-eaHAVcc3.js} +1 -1
  421. package/dist/web/assets/{linear-BmmCZdOQ.js → linear-opi90s0L.js} +1 -1
  422. package/dist/web/assets/{link-DbSpzB1w.js → link-BSGb85gq.js} +1 -1
  423. package/dist/web/assets/liquid-Czy1WpPz.js +1 -0
  424. package/dist/web/assets/{lspLanguageFeatures-WhdC7zdf.js → lspLanguageFeatures-DWu2Ubf0.js} +1 -1
  425. package/dist/web/assets/mdx-DhXfoSnM.js +1 -0
  426. package/dist/web/assets/menu--sjyisSg.js +1 -0
  427. package/dist/web/assets/{mermaid-NOHMQCX5-DmKVQY9m.js → mermaid-NOHMQCX5-BSNbBj78.js} +71 -71
  428. package/dist/web/assets/{message-square-CfNb-MTd.js → message-square-BLEJN6p7.js} +1 -1
  429. package/dist/web/assets/{mindmap-definition-RKZ34NQL-0RzXjZ9G.js → mindmap-definition-RKZ34NQL-BN3ZjBh-.js} +1 -1
  430. package/dist/web/assets/{modal-Kpqn-nDO.js → modal-CSGOqphK.js} +1 -1
  431. package/dist/web/assets/{monaco-I1fXAMIt.js → monaco-BkuNyOkP.js} +3 -3
  432. package/dist/web/assets/{paperclip-BBrzKZQC.js → paperclip-CTNoXpUW.js} +1 -1
  433. package/dist/web/assets/{pencil-pzVKblxj.js → pencil-Cp70ZwtG.js} +1 -1
  434. package/dist/web/assets/{people-C6b3eeLq.js → people-DT78SebR.js} +1 -1
  435. package/dist/web/assets/{pieDiagram-4H26LBE5-Bcvzb8TW.js → pieDiagram-4H26LBE5-CfmFHpPI.js} +2 -2
  436. package/dist/web/assets/popover-BiVxGGgp.js +1 -0
  437. package/dist/web/assets/python-DIcQDjcf.js +1 -0
  438. package/dist/web/assets/{quadrantDiagram-W4KKPZXB-DwNhxMxj.js → quadrantDiagram-W4KKPZXB-CeaumJAa.js} +1 -1
  439. package/dist/web/assets/razor-DYK6Rxer.js +1 -0
  440. package/dist/web/assets/{requirementDiagram-4Y6WPE33-D2wSGYn2.js → requirementDiagram-4Y6WPE33-BWWCDXCE.js} +1 -1
  441. package/dist/web/assets/{sankeyDiagram-5OEKKPKP-l3LLF--T.js → sankeyDiagram-5OEKKPKP-DAJut743.js} +1 -1
  442. package/dist/web/assets/search-DniD_AGC.js +1 -0
  443. package/dist/web/assets/search-field-CQLDXLeA.js +1 -0
  444. package/dist/web/assets/select-B5RYunTs.js +1 -0
  445. package/dist/web/assets/{select-DGwKE4l0.js → select-BPdJrr5M.js} +1 -1
  446. package/dist/web/assets/{sequenceDiagram-3UESZ5HK-BAGsbTS_.js → sequenceDiagram-3UESZ5HK-CynjRGW4.js} +1 -1
  447. package/dist/web/assets/{server-BIPZ9Ka-.js → server-xswxWpKD.js} +1 -1
  448. package/dist/web/assets/stateDiagram-AJRCARHV-amAtpx9w.js +1 -0
  449. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-V-lSceg1.js +1 -0
  450. package/dist/web/assets/{textarea-Bnfq7adW.js → textarea-BVyPl9rM.js} +1 -1
  451. package/dist/web/assets/{timeline-definition-PNZ67QCA-Dt-DcRrG.js → timeline-definition-PNZ67QCA-DZ9W7WlP.js} +1 -1
  452. package/dist/web/assets/toggles-QcIz43DP.js +1 -0
  453. package/dist/web/assets/tooltip-CPqGK_WZ.js +1 -0
  454. package/dist/web/assets/{track-B_K578io.js → track-Ckye0-tt.js} +1 -1
  455. package/dist/web/assets/{trash-2-ALAYDudv.js → trash-2-CvUJsbtT.js} +1 -1
  456. package/dist/web/assets/tsMode-c5x0d47n.js +11 -0
  457. package/dist/web/assets/typescript-i7eYblLt.js +1 -0
  458. package/dist/web/assets/{upload-D7hKT2VA.js → upload-CsXAmAun.js} +1 -1
  459. package/dist/web/assets/{use-profiles-Ncqxdw7S.js → use-profiles-DuXaBRju.js} +1 -1
  460. package/dist/web/assets/{use-projects-Dwy9AfAG.js → use-projects-Ddz0knyr.js} +1 -1
  461. package/dist/web/assets/{use-providers-BRyZjuBG.js → use-providers-Td1-gyrN.js} +1 -1
  462. package/dist/web/assets/use-translation-settings-NYM0lmBx.js +1 -0
  463. package/dist/web/assets/use-workspaces-CdJZLmGh.js +1 -0
  464. package/dist/web/assets/useNormalizedLogs--RbVywYa.js +1 -0
  465. package/dist/web/assets/useTokenUsage-DDXf7E4p.js +1 -0
  466. package/dist/web/assets/{vennDiagram-CIIHVFJN-Cr55FtiY.js → vennDiagram-CIIHVFJN-CB2Ubvy9.js} +1 -1
  467. package/dist/web/assets/{wardley-L42UT6IY-CtwMk9MJ.js → wardley-L42UT6IY-BXOkk77I.js} +1 -1
  468. package/dist/web/assets/{wardleyDiagram-YWT4CUSO-BeyHmTu3.js → wardleyDiagram-YWT4CUSO-VA6ywdQQ.js} +1 -1
  469. package/dist/web/assets/xml-D2EGActB.js +1 -0
  470. package/dist/web/assets/{xychartDiagram-2RQKCTM6-9g34Lq8E.js → xychartDiagram-2RQKCTM6-FNcvDj5G.js} +1 -1
  471. package/dist/web/assets/yaml-jeiIZSL4.js +1 -0
  472. package/dist/web/index.html +2 -2
  473. package/node_modules/@agent-tower/shared/dist/index.d.ts +1 -0
  474. package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -1
  475. package/node_modules/@agent-tower/shared/dist/index.js +1 -0
  476. package/node_modules/@agent-tower/shared/dist/index.js.map +1 -1
  477. package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts +11 -0
  478. package/node_modules/@agent-tower/shared/dist/log-adapter.d.ts.map +1 -1
  479. package/node_modules/@agent-tower/shared/dist/log-adapter.js +2 -0
  480. package/node_modules/@agent-tower/shared/dist/log-adapter.js.map +1 -1
  481. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts +5 -2
  482. package/node_modules/@agent-tower/shared/dist/socket/events.d.ts.map +1 -1
  483. package/node_modules/@agent-tower/shared/dist/socket/events.js +2 -0
  484. package/node_modules/@agent-tower/shared/dist/socket/events.js.map +1 -1
  485. package/node_modules/@agent-tower/shared/dist/translation.d.ts +306 -0
  486. package/node_modules/@agent-tower/shared/dist/translation.d.ts.map +1 -0
  487. package/node_modules/@agent-tower/shared/dist/translation.js +8 -0
  488. package/node_modules/@agent-tower/shared/dist/translation.js.map +1 -0
  489. package/node_modules/@agent-tower/shared/dist/types.d.ts +23 -0
  490. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  491. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  492. package/package.json +1 -1
  493. package/prisma/migrations/20261016000000_add_translation_foundation/migration.sql +104 -0
  494. package/prisma/migrations/20261016010000_add_message_deliveries/migration.sql +158 -0
  495. package/prisma/migrations/20261019000000_add_room_translation_eligibility/migration.sql +3 -0
  496. package/prisma/migrations/20261019100000_add_team_delivery_foundation/migration.sql +217 -0
  497. package/prisma/schema.prisma +224 -0
  498. package/dist/web/assets/AgentDemoPage-CaR_Yk9_.js +0 -1
  499. package/dist/web/assets/BranchSelect-D-kqavDG.js +0 -1
  500. package/dist/web/assets/BrandLogo-CC1alVsd.js +0 -1
  501. package/dist/web/assets/ConversationPage-RWKLxe1j.js +0 -3
  502. package/dist/web/assets/CreateTaskInput-SHJ1YpRe.js +0 -1
  503. package/dist/web/assets/DesignSystemPage-ChCrzeKT.js +0 -12
  504. package/dist/web/assets/EditableTaskTitle-CGVeZUSt.js +0 -70
  505. package/dist/web/assets/GeneralSettingsPage-C_tkwpmF.js +0 -1
  506. package/dist/web/assets/MobileTaskDetail-DxE6ZDAS.js +0 -5
  507. package/dist/web/assets/NotificationSettingsPage-B-Ot2OMg.js +0 -1
  508. package/dist/web/assets/ProfileSettingsPage-Dn1lrjJr.js +0 -3
  509. package/dist/web/assets/ProjectKanbanPage-jcW8sA7x.js +0 -12
  510. package/dist/web/assets/ProjectSettingsPage-BFPty2eA.js +0 -2
  511. package/dist/web/assets/TaskDetail-a1jalILy.js +0 -3
  512. package/dist/web/assets/TeamSettingsPage-BxGc4W7K.js +0 -1
  513. package/dist/web/assets/arc-dhk0OSs5.js +0 -1
  514. package/dist/web/assets/channel-K0AG6Tl1.js +0 -1
  515. package/dist/web/assets/check-DYlb0A_N.js +0 -1
  516. package/dist/web/assets/classDiagram-4FO5ZUOK-BTJ44hwx.js +0 -1
  517. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-BTJ44hwx.js +0 -1
  518. package/dist/web/assets/code-block-OCS4YCEC-DLPrDBDy.js +0 -2
  519. package/dist/web/assets/confirm-dialog-BRkrtULz.js +0 -1
  520. package/dist/web/assets/content-DPCGELMz.js +0 -2
  521. package/dist/web/assets/cssMode-ChMyv9Nj.js +0 -1
  522. package/dist/web/assets/dialog-B_vC5R4B.js +0 -5
  523. package/dist/web/assets/handlebars-B9tmKQPV.js +0 -1
  524. package/dist/web/assets/hooks-DK4m7-FN.js +0 -1
  525. package/dist/web/assets/html-B_E2U0g5.js +0 -1
  526. package/dist/web/assets/htmlMode-DRHM_Cwq.js +0 -1
  527. package/dist/web/assets/index-B6Lvy5Sr.js +0 -1
  528. package/dist/web/assets/index-BCV57B4O.js +0 -41
  529. package/dist/web/assets/index-CTG-4w90.js +0 -1
  530. package/dist/web/assets/index-Cz73HpYH.js +0 -122
  531. package/dist/web/assets/index-CzvAGoau.css +0 -1
  532. package/dist/web/assets/index-DENY_U7o.js +0 -1
  533. package/dist/web/assets/index-ZO2tqdha.js +0 -1
  534. package/dist/web/assets/javascript-ClWqjgn3.js +0 -1
  535. package/dist/web/assets/jsonMode-DVAoDfae.js +0 -7
  536. package/dist/web/assets/liquid-CZf3xdoq.js +0 -1
  537. package/dist/web/assets/mdx-xzVEPP01.js +0 -1
  538. package/dist/web/assets/menu-0A0v_lRV.js +0 -1
  539. package/dist/web/assets/popover-BYz89aiY.js +0 -1
  540. package/dist/web/assets/python-DL05HvW4.js +0 -1
  541. package/dist/web/assets/razor-BCZ3_uDf.js +0 -1
  542. package/dist/web/assets/search-field-B5czD2Pl.js +0 -1
  543. package/dist/web/assets/select-yem-xN9Z.js +0 -1
  544. package/dist/web/assets/stateDiagram-AJRCARHV-C0BHmXYX.js +0 -1
  545. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-Be3UCkeQ.js +0 -1
  546. package/dist/web/assets/toggles-DxNDJZsN.js +0 -1
  547. package/dist/web/assets/tooltip-CHOgkFbE.js +0 -1
  548. package/dist/web/assets/tsMode-kXxq-Lw7.js +0 -11
  549. package/dist/web/assets/typescript-E3_QcT_u.js +0 -1
  550. package/dist/web/assets/use-attachments-CK7y5KsN.js +0 -2
  551. package/dist/web/assets/use-workspaces-BBbahdwU.js +0 -1
  552. package/dist/web/assets/useNormalizedLogs-CRHRedwp.js +0 -1
  553. package/dist/web/assets/useTokenUsage-YwiF0xnT.js +0 -1
  554. package/dist/web/assets/xml-DxKND8qX.js +0 -1
  555. package/dist/web/assets/yaml-BqpCqTY6.js +0 -1
@@ -1,4 +1,5 @@
1
1
  import { execFileSync } from 'node:child_process';
2
+ import { randomUUID } from 'node:crypto';
2
3
  import fs from 'node:fs';
3
4
  import os from 'node:os';
4
5
  import path from 'node:path';
@@ -24,6 +25,20 @@ let SessionManager;
24
25
  let TEAM_ROOM_REPLY_REMINDER;
25
26
  let createMcpServer;
26
27
  let teamRunRoutes;
28
+ let accessAuthHook;
29
+ let agentCredentials;
30
+ const credentialByInvocation = new Map();
31
+ function agentHeaders(invocationId) {
32
+ const credential = credentialByInvocation.get(invocationId);
33
+ if (!credential)
34
+ throw new Error('Fixture credential missing');
35
+ return { 'x-agent-tower-invocation-id': invocationId, 'x-agent-tower-agent-credential': credential };
36
+ }
37
+ function authenticatedApp() {
38
+ const app = Fastify({ logger: false });
39
+ app.addHook('onRequest', accessAuthHook);
40
+ return app;
41
+ }
27
42
  let workRequestSequence = 0;
28
43
  let gitRepoSequence = 0;
29
44
  const TEAM_RUN_MISMATCH_ERROR = 'team_run_id does not match the current TeamRun session.';
@@ -252,7 +267,7 @@ async function createRunningInvocation(options) {
252
267
  status: 'COMPLETED',
253
268
  },
254
269
  });
255
- return prisma.agentInvocation.create({
270
+ const invocation = await prisma.agentInvocation.create({
256
271
  data: {
257
272
  teamRunId: options.teamRunId,
258
273
  workRequestId: options.workRequestId,
@@ -263,6 +278,8 @@ async function createRunningInvocation(options) {
263
278
  roomReplyReminderCount: options.roomReplyReminderCount ?? 0,
264
279
  },
265
280
  });
281
+ credentialByInvocation.set(invocation.id, agentCredentials.createAgentApiCredential({ sessionId: session.id, invocationId: invocation.id }));
282
+ return invocation;
266
283
  }
267
284
  describe('TeamReconcilerService', () => {
268
285
  let lockService;
@@ -285,12 +302,18 @@ describe('TeamReconcilerService', () => {
285
302
  TeamReconcilerService = reconcilerModule.TeamReconcilerService;
286
303
  SessionManager = sessionManagerModule.SessionManager;
287
304
  TEAM_ROOM_REPLY_REMINDER = reconcilerModule.TEAM_ROOM_REPLY_REMINDER;
288
- createMcpServer = mcpServerModule.createMcpServer;
305
+ accessAuthHook = (await import('../../middleware/access-auth.js')).accessAuthHook;
306
+ agentCredentials = await import('../../utils/agent-api-credential.js');
307
+ createMcpServer = (baseUrl, options = {}) => mcpServerModule.createMcpServer(baseUrl, {
308
+ ...options, agentApiCredential: options.agentApiCredential ?? credentialByInvocation.get(process.env.AGENT_TOWER_INVOCATION_ID ?? ''),
309
+ });
289
310
  teamRunRoutes = teamRunRoutesModule.teamRunRoutes;
290
311
  });
291
312
  beforeEach(async () => {
292
313
  vi.restoreAllMocks();
293
314
  workRequestSequence = 0;
315
+ credentialByInvocation.clear();
316
+ agentCredentials.clearAgentApiCredentials();
294
317
  lockService = new TeamLockService();
295
318
  scheduler = createSchedulerMock(lockService);
296
319
  messenger = createMessengerMock();
@@ -2154,7 +2177,7 @@ describe('TeamReconcilerService', () => {
2154
2177
  memberId: members[0].id,
2155
2178
  workspaceId: workspace.id,
2156
2179
  });
2157
- const app = Fastify({ logger: false });
2180
+ const app = authenticatedApp();
2158
2181
  try {
2159
2182
  process.env.AGENT_TOWER_TEAM_RUN_ID = teamRun.id;
2160
2183
  process.env.AGENT_TOWER_MEMBER_ID = members[0].id;
@@ -2312,7 +2335,7 @@ describe('TeamReconcilerService', () => {
2312
2335
  where: { id: agentMessage.id },
2313
2336
  data: { createdAt: new Date('2026-01-01T00:00:02.000Z') },
2314
2337
  });
2315
- const app = Fastify({ logger: false });
2338
+ const app = authenticatedApp();
2316
2339
  try {
2317
2340
  setTeamRunEnv({
2318
2341
  AGENT_TOWER_TEAM_RUN_ID: teamRun.id,
@@ -2329,7 +2352,7 @@ describe('TeamReconcilerService', () => {
2329
2352
  const restListResponse = await app.inject({
2330
2353
  method: 'GET',
2331
2354
  url: `/api/team-runs/${teamRun.id}/messages`,
2332
- headers: { 'x-agent-tower-invocation-id': invocation.id },
2355
+ headers: agentHeaders(invocation.id),
2333
2356
  });
2334
2357
  expect(restListResponse.statusCode).toBe(200);
2335
2358
  const restList = restListResponse.json();
@@ -2350,7 +2373,7 @@ describe('TeamReconcilerService', () => {
2350
2373
  const limitedRestListResponse = await app.inject({
2351
2374
  method: 'GET',
2352
2375
  url: `/api/team-runs/${teamRun.id}/messages?limit=1`,
2353
- headers: { 'x-agent-tower-invocation-id': invocation.id },
2376
+ headers: agentHeaders(invocation.id),
2354
2377
  });
2355
2378
  expect(limitedRestListResponse.statusCode).toBe(200);
2356
2379
  expect(limitedRestListResponse.json().map((message) => message.id)).toEqual([
@@ -2359,7 +2382,7 @@ describe('TeamReconcilerService', () => {
2359
2382
  const restDetailResponse = await app.inject({
2360
2383
  method: 'GET',
2361
2384
  url: `/api/team-runs/${teamRun.id}/messages/${roomMessage.id}`,
2362
- headers: { 'x-agent-tower-invocation-id': invocation.id },
2385
+ headers: agentHeaders(invocation.id),
2363
2386
  });
2364
2387
  expect(restDetailResponse.statusCode).toBe(200);
2365
2388
  expect(restDetailResponse.json()).toMatchObject({
@@ -2486,7 +2509,7 @@ describe('TeamReconcilerService', () => {
2486
2509
  where: { id: workspace.id },
2487
2510
  data: { worktreePath: contextWorktreePath },
2488
2511
  });
2489
- const app = Fastify({ logger: false });
2512
+ const app = authenticatedApp();
2490
2513
  try {
2491
2514
  delete process.env.AGENT_TOWER_TEAM_RUN_ID;
2492
2515
  delete process.env.AGENT_TOWER_MEMBER_ID;
@@ -2503,7 +2526,7 @@ describe('TeamReconcilerService', () => {
2503
2526
  let server;
2504
2527
  try {
2505
2528
  process.chdir(contextWorktreePath);
2506
- server = await createMcpServer(`http://127.0.0.1:${address.port}`);
2529
+ server = await createMcpServer(`http://127.0.0.1:${address.port}`, { agentApiCredential: credentialByInvocation.get(invocation.id) });
2507
2530
  }
2508
2531
  finally {
2509
2532
  process.chdir(previousCwd);
@@ -2603,7 +2626,7 @@ describe('TeamReconcilerService', () => {
2603
2626
  workspaceId: workspace.id,
2604
2627
  status: 'RUNNING',
2605
2628
  });
2606
- const app = Fastify({ logger: false });
2629
+ const app = authenticatedApp();
2607
2630
  try {
2608
2631
  setTeamRunEnv({
2609
2632
  AGENT_TOWER_TEAM_RUN_ID: teamRun.id,
@@ -2679,7 +2702,7 @@ describe('TeamReconcilerService', () => {
2679
2702
  workspaceId: workspace.id,
2680
2703
  });
2681
2704
  const routeScheduler = createRouteSchedulerMock();
2682
- const app = Fastify({ logger: false });
2705
+ const app = authenticatedApp();
2683
2706
  try {
2684
2707
  setTeamRunEnv({
2685
2708
  AGENT_TOWER_TEAM_RUN_ID: teamRun.id,
@@ -2777,7 +2800,7 @@ describe('TeamReconcilerService', () => {
2777
2800
  memberId: observer.id,
2778
2801
  workspaceId: workspace.id,
2779
2802
  });
2780
- const app = Fastify({ logger: false });
2803
+ const app = authenticatedApp();
2781
2804
  try {
2782
2805
  await app.register(teamRunRoutes, { prefix: '/api' });
2783
2806
  const privateMessageResponse = await app.inject({
@@ -2799,7 +2822,7 @@ describe('TeamReconcilerService', () => {
2799
2822
  method: 'GET',
2800
2823
  url: `/api/team-runs/${teamRun.id}/members/${recipient.id}/work-requests`,
2801
2824
  headers: {
2802
- 'x-agent-tower-invocation-id': observerInvocation.id,
2825
+ ...agentHeaders(observerInvocation.id),
2803
2826
  },
2804
2827
  });
2805
2828
  expect(spoofedQueueResponse.statusCode).toBe(403);
@@ -2809,7 +2832,7 @@ describe('TeamReconcilerService', () => {
2809
2832
  method: 'GET',
2810
2833
  url: `/api/team-runs/${teamRun.id}/members/${observer.id}/work-requests`,
2811
2834
  headers: {
2812
- 'x-agent-tower-invocation-id': observerInvocation.id,
2835
+ ...agentHeaders(observerInvocation.id),
2813
2836
  },
2814
2837
  });
2815
2838
  expect(ownQueueResponse.statusCode).toBe(200);
@@ -2837,14 +2860,14 @@ describe('TeamReconcilerService', () => {
2837
2860
  memberId: actualSender.id,
2838
2861
  workspaceId: workspace.id,
2839
2862
  });
2840
- const app = Fastify({ logger: false });
2863
+ const app = authenticatedApp();
2841
2864
  try {
2842
2865
  await app.register(teamRunRoutes, { prefix: '/api' });
2843
2866
  const forgedAgentResponse = await app.inject({
2844
2867
  method: 'POST',
2845
2868
  url: `/api/team-runs/${teamRun.id}/private-messages`,
2846
2869
  headers: {
2847
- 'x-agent-tower-invocation-id': senderInvocation.id,
2870
+ ...agentHeaders(senderInvocation.id),
2848
2871
  },
2849
2872
  payload: {
2850
2873
  content: 'Forged sender should be ignored',
@@ -2906,13 +2929,13 @@ describe('TeamReconcilerService', () => {
2906
2929
  workspaceId: workspace.id,
2907
2930
  status: 'COMPLETED',
2908
2931
  });
2909
- const app = Fastify({ logger: false });
2932
+ const app = authenticatedApp();
2910
2933
  try {
2911
2934
  await app.register(teamRunRoutes, { prefix: '/api' });
2912
2935
  const response = await app.inject({
2913
2936
  method: 'POST',
2914
2937
  url: `/api/team-runs/${teamRun.id}/private-messages`,
2915
- headers: { 'x-agent-tower-invocation-id': senderInvocation.id },
2938
+ headers: agentHeaders(senderInvocation.id),
2916
2939
  payload: {
2917
2940
  content: 'Late terminal private result',
2918
2941
  recipientMemberIds: [members[1].id],
@@ -2967,7 +2990,7 @@ describe('TeamReconcilerService', () => {
2967
2990
  memberId: observer.id,
2968
2991
  workspaceId: workspace.id,
2969
2992
  });
2970
- const app = Fastify({ logger: false });
2993
+ const app = authenticatedApp();
2971
2994
  try {
2972
2995
  await app.register(teamRunRoutes, { prefix: '/api' });
2973
2996
  const response = await app.inject({
@@ -2999,7 +3022,7 @@ describe('TeamReconcilerService', () => {
2999
3022
  method: 'GET',
3000
3023
  url: `/api/team-runs/${teamRun.id}/messages`,
3001
3024
  headers: {
3002
- 'x-agent-tower-invocation-id': senderInvocation.id,
3025
+ ...agentHeaders(senderInvocation.id),
3003
3026
  },
3004
3027
  });
3005
3028
  expect(senderMessagesResponse.statusCode).toBe(200);
@@ -3008,7 +3031,7 @@ describe('TeamReconcilerService', () => {
3008
3031
  method: 'GET',
3009
3032
  url: `/api/team-runs/${teamRun.id}/messages`,
3010
3033
  headers: {
3011
- 'x-agent-tower-invocation-id': recipientInvocation.id,
3034
+ ...agentHeaders(recipientInvocation.id),
3012
3035
  },
3013
3036
  });
3014
3037
  expect(recipientMessagesResponse.statusCode).toBe(200);
@@ -3017,7 +3040,7 @@ describe('TeamReconcilerService', () => {
3017
3040
  method: 'GET',
3018
3041
  url: `/api/team-runs/${teamRun.id}/messages`,
3019
3042
  headers: {
3020
- 'x-agent-tower-invocation-id': observerInvocation.id,
3043
+ ...agentHeaders(observerInvocation.id),
3021
3044
  },
3022
3045
  });
3023
3046
  expect(observerMessagesResponse.statusCode).toBe(200);
@@ -3026,7 +3049,7 @@ describe('TeamReconcilerService', () => {
3026
3049
  method: 'GET',
3027
3050
  url: `/api/team-runs/${teamRun.id}/members/${observer.id}/work-requests`,
3028
3051
  headers: {
3029
- 'x-agent-tower-invocation-id': observerInvocation.id,
3052
+ ...agentHeaders(observerInvocation.id),
3030
3053
  },
3031
3054
  });
3032
3055
  expect(observerQueueResponse.statusCode).toBe(200);
@@ -3085,7 +3108,7 @@ describe('TeamReconcilerService', () => {
3085
3108
  memberId: observer.id,
3086
3109
  workspaceId: workspace.id,
3087
3110
  });
3088
- const app = Fastify({ logger: false });
3111
+ const app = authenticatedApp();
3089
3112
  try {
3090
3113
  await app.register(teamRunRoutes, { prefix: '/api' });
3091
3114
  const response = await app.inject({
@@ -3132,7 +3155,7 @@ describe('TeamReconcilerService', () => {
3132
3155
  method: 'GET',
3133
3156
  url: `/api/team-runs/${teamRun.id}/messages`,
3134
3157
  headers: {
3135
- 'x-agent-tower-invocation-id': senderInvocation.id,
3158
+ ...agentHeaders(senderInvocation.id),
3136
3159
  },
3137
3160
  });
3138
3161
  expect(senderMessagesResponse.statusCode).toBe(200);
@@ -3141,7 +3164,7 @@ describe('TeamReconcilerService', () => {
3141
3164
  method: 'GET',
3142
3165
  url: `/api/team-runs/${teamRun.id}/messages`,
3143
3166
  headers: {
3144
- 'x-agent-tower-invocation-id': recipientInvocation.id,
3167
+ ...agentHeaders(recipientInvocation.id),
3145
3168
  },
3146
3169
  });
3147
3170
  expect(recipientMessagesResponse.statusCode).toBe(200);
@@ -3150,7 +3173,7 @@ describe('TeamReconcilerService', () => {
3150
3173
  method: 'GET',
3151
3174
  url: `/api/team-runs/${teamRun.id}/messages`,
3152
3175
  headers: {
3153
- 'x-agent-tower-invocation-id': observerInvocation.id,
3176
+ ...agentHeaders(observerInvocation.id),
3154
3177
  },
3155
3178
  });
3156
3179
  expect(observerMessagesResponse.statusCode).toBe(200);
@@ -3231,7 +3254,7 @@ describe('TeamReconcilerService', () => {
3231
3254
  where: { id: revokedInvocation.id },
3232
3255
  data: { dispatchRevokedAt: new Date() },
3233
3256
  });
3234
- const app = Fastify({ logger: false });
3257
+ const app = authenticatedApp();
3235
3258
  try {
3236
3259
  await app.register(teamRunRoutes, { prefix: '/api' });
3237
3260
  await app.listen({ port: 0, host: '127.0.0.1' });
@@ -3386,7 +3409,7 @@ describe('TeamReconcilerService', () => {
3386
3409
  status: 'PENDING_APPROVAL',
3387
3410
  instruction: 'Other pending approval',
3388
3411
  });
3389
- const app = Fastify({ logger: false });
3412
+ const app = authenticatedApp();
3390
3413
  try {
3391
3414
  setTeamRunEnv({
3392
3415
  AGENT_TOWER_TEAM_RUN_ID: teamRun.id,
@@ -3493,10 +3516,10 @@ describe('TeamReconcilerService', () => {
3493
3516
  await app.close();
3494
3517
  }
3495
3518
  });
3496
- it('posts MCP room messages as user when bound TeamRun identity is partial', async () => {
3519
+ it('rejects MCP room messages when bound TeamRun identity is partial', async () => {
3497
3520
  const previousEnv = captureTeamRunEnv();
3498
3521
  const { teamRun, members } = await createFixture({ memberCount: 2 });
3499
- const app = Fastify({ logger: false });
3522
+ const app = authenticatedApp();
3500
3523
  try {
3501
3524
  setTeamRunEnv({
3502
3525
  AGENT_TOWER_TEAM_RUN_ID: teamRun.id,
@@ -3515,32 +3538,16 @@ describe('TeamReconcilerService', () => {
3515
3538
  const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
3516
3539
  await server.connect(serverTransport);
3517
3540
  await client.connect(clientTransport);
3518
- let messageId;
3519
3541
  try {
3520
- const result = await client.callTool({
3521
- name: 'post_room_message',
3522
- arguments: {
3523
- content: 'Partial identity should not be sent as agent',
3524
- },
3525
- });
3526
- expect(result.isError, getMcpToolText(result)).not.toBe(true);
3527
- const message = JSON.parse(getMcpToolText(result));
3528
- messageId = message.id;
3529
- expect(message).toMatchObject({
3530
- senderType: 'user',
3531
- senderId: null,
3532
- senderInvocationId: null,
3533
- });
3542
+ const result = await client.callTool({ name: 'post_room_message', arguments: { content: 'Partial identity cannot fall back to user' } });
3543
+ expect(result.isError).toBe(true);
3544
+ expect(getMcpToolText(result)).toContain('Current TeamRun invocation identity is required');
3545
+ expect(await prisma.roomMessage.count({ where: { teamRunId: teamRun.id } })).toBe(0);
3534
3546
  }
3535
3547
  finally {
3536
3548
  await client.close();
3537
3549
  await server.close();
3538
3550
  }
3539
- await expect(prisma.roomMessage.findUnique({ where: { id: messageId } })).resolves.toMatchObject({
3540
- senderType: 'user',
3541
- senderId: null,
3542
- senderInvocationId: null,
3543
- });
3544
3551
  }
3545
3552
  finally {
3546
3553
  restoreTeamRunEnv(previousEnv);
@@ -3571,7 +3578,7 @@ describe('TeamReconcilerService', () => {
3571
3578
  status: 'QUEUED',
3572
3579
  instruction: 'Manager cancellable request',
3573
3580
  });
3574
- const app = Fastify({ logger: false });
3581
+ const app = authenticatedApp();
3575
3582
  try {
3576
3583
  await app.register(teamRunRoutes, { prefix: '/api' });
3577
3584
  const anonymousCancel = await app.inject({
@@ -3634,7 +3641,7 @@ describe('TeamReconcilerService', () => {
3634
3641
  instruction: 'Other rejection',
3635
3642
  });
3636
3643
  const routeScheduler = createRouteSchedulerMock();
3637
- const app = Fastify({ logger: false });
3644
+ const app = authenticatedApp();
3638
3645
  try {
3639
3646
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });
3640
3647
  const approve = await app.inject({
@@ -3693,7 +3700,7 @@ describe('TeamReconcilerService', () => {
3693
3700
  routeScheduler.stopMemberWork = vi.fn(async () => {
3694
3701
  throw new Error('stop failed');
3695
3702
  });
3696
- const app = Fastify({ logger: false });
3703
+ const app = authenticatedApp();
3697
3704
  try {
3698
3705
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });
3699
3706
  const response = await app.inject({
@@ -3727,51 +3734,45 @@ describe('TeamReconcilerService', () => {
3727
3734
  await app.close();
3728
3735
  }
3729
3736
  });
3730
- it('auto-starts USER_MESSAGES work when a user posts an unmentioned room message', async () => {
3731
- const { teamRun, members } = await createFixture({
3732
- memberCount: 2,
3733
- teamRunMode: 'AUTO',
3734
- triggerPolicies: ['USER_MESSAGES', 'MENTION_ONLY'],
3735
- });
3737
+ it('accepts user input before publication and starts USER_MESSAGES work only after atomic publication', async () => {
3738
+ const { teamRun, members } = await createFixture({ memberCount: 2, teamRunMode: 'AUTO', triggerPolicies: ['USER_MESSAGES', 'MENTION_ONLY'] });
3736
3739
  const routeScheduler = createRouteSchedulerMock();
3737
- const startedTeamRunIds = [];
3738
- routeScheduler.startNextSessions = vi.fn(async (teamRunId) => {
3739
- startedTeamRunIds.push(teamRunId);
3740
- return await new Promise(() => { });
3741
- });
3742
- const app = Fastify({ logger: false });
3740
+ // The controlled scheduler never creates a real Session or starts a provider.
3741
+ routeScheduler.startNextSessions = vi.fn(async () => []);
3742
+ const container = await import('../../core/container.js');
3743
+ const { TranslationSettingsService } = await import('../translation-settings.service.js');
3744
+ const { TranslationService } = await import('../translation.service.js');
3745
+ const { TeamTaskInputService } = await import('../team-task-input.service.js');
3746
+ const { MessageDeliveryService } = await import('../message-delivery.service.js');
3747
+ const { TeamRunService } = await import('../team-run.service.js');
3748
+ const settings = new TranslationSettingsService(prisma);
3749
+ const translation = new TranslationService(prisma, settings);
3750
+ const inputs = new TeamTaskInputService(prisma, translation);
3751
+ const delivery = new MessageDeliveryService(prisma, settings, translation, { setMessageDeliveryService: vi.fn() }, {
3752
+ taskInputs: inputs, teamRuns: new TeamRunService(),
3753
+ roomPublished: async (id) => { await routeScheduler.startNextSessions(id); },
3754
+ });
3755
+ vi.spyOn(container, 'getMessageDeliveryService').mockReturnValue(delivery);
3756
+ const app = authenticatedApp();
3743
3757
  try {
3744
3758
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });
3745
- const response = await app.inject({
3746
- method: 'POST',
3747
- url: `/api/team-runs/${teamRun.id}/messages`,
3748
- payload: {
3749
- content: '普通用户消息',
3750
- senderType: 'user',
3751
- },
3752
- });
3753
- expect(response.statusCode).toBe(201);
3754
- const message = response.json();
3755
- expect(message.mentions).toEqual([]);
3756
- expect(message.workRequestIds).toHaveLength(1);
3759
+ const response = await app.inject({ method: 'POST', url: `/api/team-runs/${teamRun.id}/messages`, payload: { clientSubmissionId: randomUUID(), content: '普通用户消息' } });
3760
+ expect(response.statusCode, response.body).toBe(202);
3761
+ expect(await prisma.roomMessage.count()).toBe(0);
3757
3762
  expect(routeScheduler.startNextSessions).not.toHaveBeenCalled();
3758
- await expect(prisma.workRequest.findUnique({ where: { id: message.workRequestIds[0] } })).resolves.toMatchObject({
3759
- targetMemberId: members[0].id,
3760
- instruction: '普通用户消息',
3761
- status: 'QUEUED',
3762
- });
3763
- await expect(prisma.agentInvocation.count({
3764
- where: {
3765
- teamRunId: teamRun.id,
3766
- memberId: members[0].id,
3767
- },
3768
- })).resolves.toBe(0);
3769
- await vi.waitFor(() => {
3770
- expect(routeScheduler.startNextSessions).toHaveBeenCalledWith(teamRun.id);
3771
- expect(startedTeamRunIds).toEqual([teamRun.id]);
3772
- });
3763
+ await delivery.start();
3764
+ await vi.waitFor(async () => { expect((await delivery.get(response.json().operationId)).state).toBe('SENT'); });
3765
+ const message = await prisma.roomMessage.findUniqueOrThrow({ where: { deliveryId: response.json().operationId } });
3766
+ expect(JSON.parse(message.mentions)).toEqual([]);
3767
+ const requests = await prisma.workRequest.findMany({ where: { triggerMessageId: message.id } });
3768
+ expect(requests).toHaveLength(1);
3769
+ expect(requests[0]).toMatchObject({ targetMemberId: members[0].id, instruction: '普通用户消息', status: 'QUEUED' });
3770
+ expect(await prisma.agentInvocation.count()).toBe(0);
3771
+ await vi.waitFor(() => { expect(routeScheduler.startNextSessions).toHaveBeenCalledExactlyOnceWith(teamRun.id); });
3773
3772
  }
3774
3773
  finally {
3774
+ await delivery.shutdown();
3775
+ await translation.shutdown();
3775
3776
  await app.close();
3776
3777
  }
3777
3778
  });
@@ -3792,7 +3793,7 @@ describe('TeamReconcilerService', () => {
3792
3793
  const implementerPreset = await createMemberPreset({ name: 'Implementer', triggerPolicy: 'MENTION_ONLY' });
3793
3794
  const reviewerPreset = await createMemberPreset({ name: 'Reviewer', triggerPolicy: 'MENTION_ONLY' });
3794
3795
  const routeScheduler = createRouteSchedulerMock();
3795
- const app = Fastify({ logger: false });
3796
+ const app = authenticatedApp();
3796
3797
  try {
3797
3798
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });
3798
3799
  const response = await app.inject({
@@ -3860,7 +3861,7 @@ describe('TeamReconcilerService', () => {
3860
3861
  });
3861
3862
  const preset = await createMemberPreset({ name: 'Leader', triggerPolicy: 'USER_MESSAGES' });
3862
3863
  const routeScheduler = createRouteSchedulerMock();
3863
- const app = Fastify({ logger: false });
3864
+ const app = authenticatedApp();
3864
3865
  try {
3865
3866
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });
3866
3867
  const response = await app.inject({
@@ -3907,7 +3908,7 @@ describe('TeamReconcilerService', () => {
3907
3908
  const implementerPreset = await createMemberPreset({ name: 'Implementer', triggerPolicy: 'MENTION_ONLY' });
3908
3909
  const reviewerPreset = await createMemberPreset({ name: 'Reviewer', triggerPolicy: 'MENTION_ONLY' });
3909
3910
  const routeScheduler = createRouteSchedulerMock();
3910
- const app = Fastify({ logger: false });
3911
+ const app = authenticatedApp();
3911
3912
  try {
3912
3913
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });
3913
3914
  const response = await app.inject({
@@ -3965,7 +3966,7 @@ describe('TeamReconcilerService', () => {
3965
3966
  const qaPreset = await createMemberPreset({ name: 'QA', triggerPolicy: 'MENTION_ONLY' });
3966
3967
  const qaLeadPreset = await createMemberPreset({ name: 'QA-Lead', triggerPolicy: 'MENTION_ONLY' });
3967
3968
  const routeScheduler = createRouteSchedulerMock();
3968
- const app = Fastify({ logger: false });
3969
+ const app = authenticatedApp();
3969
3970
  try {
3970
3971
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });
3971
3972
  const response = await app.inject({
@@ -4016,7 +4017,7 @@ describe('TeamReconcilerService', () => {
4016
4017
  data: { aliases: stringifyJson(['reviewer']) },
4017
4018
  });
4018
4019
  const routeScheduler = createRouteSchedulerMock();
4019
- const app = Fastify({ logger: false });
4020
+ const app = authenticatedApp();
4020
4021
  try {
4021
4022
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });
4022
4023
  const response = await app.inject({
@@ -4063,7 +4064,7 @@ describe('TeamReconcilerService', () => {
4063
4064
  data: { aliases: stringifyJson(['reviewer']) },
4064
4065
  });
4065
4066
  const routeScheduler = createRouteSchedulerMock();
4066
- const app = Fastify({ logger: false });
4067
+ const app = authenticatedApp();
4067
4068
  try {
4068
4069
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });
4069
4070
  const response = await app.inject({
@@ -4103,7 +4104,7 @@ describe('TeamReconcilerService', () => {
4103
4104
  });
4104
4105
  const preset = await createMemberPreset({ name: 'Leader', triggerPolicy: 'USER_MESSAGES' });
4105
4106
  const routeScheduler = createRouteSchedulerMock();
4106
- const app = Fastify({ logger: false });
4107
+ const app = authenticatedApp();
4107
4108
  try {
4108
4109
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });
4109
4110
  const response = await app.inject({
@@ -4168,7 +4169,7 @@ describe('TeamReconcilerService', () => {
4168
4169
  return arg(failingTx);
4169
4170
  }, ...rest);
4170
4171
  });
4171
- const app = Fastify({ logger: false });
4172
+ const app = authenticatedApp();
4172
4173
  const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => undefined);
4173
4174
  try {
4174
4175
  await app.register(teamRunRoutes, { prefix: '/api', scheduler: routeScheduler });