agent-tower 0.6.0-beta.2 → 0.6.0-beta.4

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 (398) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +10 -2
  3. package/dist/app.js.map +1 -1
  4. package/dist/app.test.js +10 -0
  5. package/dist/app.test.js.map +1 -1
  6. package/dist/core/container.d.ts +2 -0
  7. package/dist/core/container.d.ts.map +1 -1
  8. package/dist/core/container.js +9 -1
  9. package/dist/core/container.js.map +1 -1
  10. package/dist/executors/__tests__/codex.executor.test.js +50 -0
  11. package/dist/executors/__tests__/codex.executor.test.js.map +1 -1
  12. package/dist/executors/codex.executor.d.ts +2 -0
  13. package/dist/executors/codex.executor.d.ts.map +1 -1
  14. package/dist/executors/codex.executor.js +8 -0
  15. package/dist/executors/codex.executor.js.map +1 -1
  16. package/dist/executors/execution-env.d.ts +1 -1
  17. package/dist/executors/execution-env.d.ts.map +1 -1
  18. package/dist/executors/execution-env.js +2 -0
  19. package/dist/executors/execution-env.js.map +1 -1
  20. package/dist/mcp/http-client.d.ts +24 -0
  21. package/dist/mcp/http-client.d.ts.map +1 -1
  22. package/dist/mcp/http-client.js +66 -8
  23. package/dist/mcp/http-client.js.map +1 -1
  24. package/dist/mcp/http-client.test.d.ts +2 -0
  25. package/dist/mcp/http-client.test.d.ts.map +1 -0
  26. package/dist/mcp/http-client.test.js +67 -0
  27. package/dist/mcp/http-client.test.js.map +1 -0
  28. package/dist/mcp/index.js +9 -2
  29. package/dist/mcp/index.js.map +1 -1
  30. package/dist/mcp/server.d.ts +1 -0
  31. package/dist/mcp/server.d.ts.map +1 -1
  32. package/dist/mcp/server.js +7 -0
  33. package/dist/mcp/server.js.map +1 -1
  34. package/dist/mcp/tools/__tests__/workspace-services.test.d.ts +2 -0
  35. package/dist/mcp/tools/__tests__/workspace-services.test.d.ts.map +1 -0
  36. package/dist/mcp/tools/__tests__/workspace-services.test.js +84 -0
  37. package/dist/mcp/tools/__tests__/workspace-services.test.js.map +1 -0
  38. package/dist/mcp/tools/workspace-services.d.ts +6 -0
  39. package/dist/mcp/tools/workspace-services.d.ts.map +1 -0
  40. package/dist/mcp/tools/workspace-services.js +102 -0
  41. package/dist/mcp/tools/workspace-services.js.map +1 -0
  42. package/dist/mcp/types.d.ts +53 -0
  43. package/dist/mcp/types.d.ts.map +1 -1
  44. package/dist/mcp/types.js +29 -0
  45. package/dist/mcp/types.js.map +1 -1
  46. package/dist/middleware/__tests__/access-auth.test.js +229 -2
  47. package/dist/middleware/__tests__/access-auth.test.js.map +1 -1
  48. package/dist/middleware/access-auth.d.ts +7 -0
  49. package/dist/middleware/access-auth.d.ts.map +1 -1
  50. package/dist/middleware/access-auth.js +50 -9
  51. package/dist/middleware/access-auth.js.map +1 -1
  52. package/dist/prompts/agent-output-intents.d.ts +2 -0
  53. package/dist/prompts/agent-output-intents.d.ts.map +1 -0
  54. package/dist/prompts/agent-output-intents.js +11 -0
  55. package/dist/prompts/agent-output-intents.js.map +1 -0
  56. package/dist/prompts/agent-output-intents.test.d.ts +2 -0
  57. package/dist/prompts/agent-output-intents.test.d.ts.map +1 -0
  58. package/dist/prompts/agent-output-intents.test.js +12 -0
  59. package/dist/prompts/agent-output-intents.test.js.map +1 -0
  60. package/dist/prompts/workspace-background-service-policy.d.ts +9 -0
  61. package/dist/prompts/workspace-background-service-policy.d.ts.map +1 -0
  62. package/dist/prompts/workspace-background-service-policy.js +17 -0
  63. package/dist/prompts/workspace-background-service-policy.js.map +1 -0
  64. package/dist/prompts/workspace-background-service-policy.test.d.ts +2 -0
  65. package/dist/prompts/workspace-background-service-policy.test.d.ts.map +1 -0
  66. package/dist/prompts/workspace-background-service-policy.test.js +19 -0
  67. package/dist/prompts/workspace-background-service-policy.test.js.map +1 -0
  68. package/dist/routes/__tests__/previews.integration.test.js +1 -0
  69. package/dist/routes/__tests__/previews.integration.test.js.map +1 -1
  70. package/dist/routes/__tests__/previews.test.js +6 -1
  71. package/dist/routes/__tests__/previews.test.js.map +1 -1
  72. package/dist/routes/__tests__/providers.test.js +1 -0
  73. package/dist/routes/__tests__/providers.test.js.map +1 -1
  74. package/dist/routes/__tests__/sessions-visualizations.test.d.ts +2 -0
  75. package/dist/routes/__tests__/sessions-visualizations.test.d.ts.map +1 -0
  76. package/dist/routes/__tests__/sessions-visualizations.test.js +89 -0
  77. package/dist/routes/__tests__/sessions-visualizations.test.js.map +1 -0
  78. package/dist/routes/__tests__/workspace-services.test.d.ts +2 -0
  79. package/dist/routes/__tests__/workspace-services.test.d.ts.map +1 -0
  80. package/dist/routes/__tests__/workspace-services.test.js +148 -0
  81. package/dist/routes/__tests__/workspace-services.test.js.map +1 -0
  82. package/dist/routes/access-auth.d.ts.map +1 -1
  83. package/dist/routes/access-auth.js +24 -11
  84. package/dist/routes/access-auth.js.map +1 -1
  85. package/dist/routes/index.d.ts.map +1 -1
  86. package/dist/routes/index.js +3 -0
  87. package/dist/routes/index.js.map +1 -1
  88. package/dist/routes/previews.d.ts.map +1 -1
  89. package/dist/routes/previews.js +4 -6
  90. package/dist/routes/previews.js.map +1 -1
  91. package/dist/routes/sessions.d.ts.map +1 -1
  92. package/dist/routes/sessions.js +93 -0
  93. package/dist/routes/sessions.js.map +1 -1
  94. package/dist/routes/tasks.d.ts.map +1 -1
  95. package/dist/routes/tasks.js +2 -2
  96. package/dist/routes/tasks.js.map +1 -1
  97. package/dist/routes/workspace-services.d.ts +7 -0
  98. package/dist/routes/workspace-services.d.ts.map +1 -0
  99. package/dist/routes/workspace-services.js +129 -0
  100. package/dist/routes/workspace-services.js.map +1 -0
  101. package/dist/runtime/__tests__/acp-agent-definitions.test.js +118 -0
  102. package/dist/runtime/__tests__/acp-agent-definitions.test.js.map +1 -1
  103. package/dist/runtime/__tests__/acp-driver-lifecycle.test.js +143 -1
  104. package/dist/runtime/__tests__/acp-driver-lifecycle.test.js.map +1 -1
  105. package/dist/runtime/__tests__/acp-driver.test.js +36 -0
  106. package/dist/runtime/__tests__/acp-driver.test.js.map +1 -1
  107. package/dist/runtime/__tests__/acp-process-manager.test.js +109 -1
  108. package/dist/runtime/__tests__/acp-process-manager.test.js.map +1 -1
  109. package/dist/runtime/__tests__/acp-projector.test.js +55 -0
  110. package/dist/runtime/__tests__/acp-projector.test.js.map +1 -1
  111. package/dist/runtime/__tests__/runtime-coordinator.test.js +5 -2
  112. package/dist/runtime/__tests__/runtime-coordinator.test.js.map +1 -1
  113. package/dist/runtime/acp/acp-driver.js +100 -28
  114. package/dist/runtime/acp/acp-driver.js.map +1 -1
  115. package/dist/runtime/acp/agents/codex-frame-normalizer.d.ts +4 -0
  116. package/dist/runtime/acp/agents/codex-frame-normalizer.d.ts.map +1 -0
  117. package/dist/runtime/acp/agents/codex-frame-normalizer.js +120 -0
  118. package/dist/runtime/acp/agents/codex-frame-normalizer.js.map +1 -0
  119. package/dist/runtime/acp/agents/codex.d.ts.map +1 -1
  120. package/dist/runtime/acp/agents/codex.js +35 -0
  121. package/dist/runtime/acp/agents/codex.js.map +1 -1
  122. package/dist/runtime/acp/agents/types.d.ts +7 -0
  123. package/dist/runtime/acp/agents/types.d.ts.map +1 -1
  124. package/dist/runtime/acp/codex-provider-config.d.ts +3 -0
  125. package/dist/runtime/acp/codex-provider-config.d.ts.map +1 -1
  126. package/dist/runtime/acp/codex-provider-config.js +34 -1
  127. package/dist/runtime/acp/codex-provider-config.js.map +1 -1
  128. package/dist/runtime/acp/process-manager.d.ts +3 -0
  129. package/dist/runtime/acp/process-manager.d.ts.map +1 -1
  130. package/dist/runtime/acp/process-manager.js +31 -12
  131. package/dist/runtime/acp/process-manager.js.map +1 -1
  132. package/dist/runtime/acp/projector.d.ts.map +1 -1
  133. package/dist/runtime/acp/projector.js +71 -5
  134. package/dist/runtime/acp/projector.js.map +1 -1
  135. package/dist/runtime/contracts.d.ts +1 -0
  136. package/dist/runtime/contracts.d.ts.map +1 -1
  137. package/dist/runtime/runtime-coordinator.d.ts.map +1 -1
  138. package/dist/runtime/runtime-coordinator.js +1 -0
  139. package/dist/runtime/runtime-coordinator.js.map +1 -1
  140. package/dist/services/__tests__/access-auth.service.test.js +41 -0
  141. package/dist/services/__tests__/access-auth.service.test.js.map +1 -1
  142. package/dist/services/__tests__/agent-artifact.service.test.d.ts +2 -0
  143. package/dist/services/__tests__/agent-artifact.service.test.d.ts.map +1 -0
  144. package/dist/services/__tests__/agent-artifact.service.test.js +133 -0
  145. package/dist/services/__tests__/agent-artifact.service.test.js.map +1 -0
  146. package/dist/services/__tests__/agent-visualization.service.test.d.ts +2 -0
  147. package/dist/services/__tests__/agent-visualization.service.test.d.ts.map +1 -0
  148. package/dist/services/__tests__/agent-visualization.service.test.js +57 -0
  149. package/dist/services/__tests__/agent-visualization.service.test.js.map +1 -0
  150. package/dist/services/__tests__/preview-runtime-manager.test.js +5 -0
  151. package/dist/services/__tests__/preview-runtime-manager.test.js.map +1 -1
  152. package/dist/services/__tests__/project.service.test.js +6 -2
  153. package/dist/services/__tests__/project.service.test.js.map +1 -1
  154. package/dist/services/__tests__/provider-config.service.test.js +32 -0
  155. package/dist/services/__tests__/provider-config.service.test.js.map +1 -1
  156. package/dist/services/__tests__/session-manager.lifecycle.test.js +153 -1
  157. package/dist/services/__tests__/session-manager.lifecycle.test.js.map +1 -1
  158. package/dist/services/__tests__/session-manager.team-run.test.js +18 -5
  159. package/dist/services/__tests__/session-manager.team-run.test.js.map +1 -1
  160. package/dist/services/__tests__/task.service.test.js +16 -3
  161. package/dist/services/__tests__/task.service.test.js.map +1 -1
  162. package/dist/services/__tests__/workspace-background-process-manager.test.d.ts +2 -0
  163. package/dist/services/__tests__/workspace-background-process-manager.test.d.ts.map +1 -0
  164. package/dist/services/__tests__/workspace-background-process-manager.test.js +412 -0
  165. package/dist/services/__tests__/workspace-background-process-manager.test.js.map +1 -0
  166. package/dist/services/__tests__/workspace-background-service.service.test.d.ts +2 -0
  167. package/dist/services/__tests__/workspace-background-service.service.test.d.ts.map +1 -0
  168. package/dist/services/__tests__/workspace-background-service.service.test.js +418 -0
  169. package/dist/services/__tests__/workspace-background-service.service.test.js.map +1 -0
  170. package/dist/services/__tests__/workspace.service.test.js +137 -0
  171. package/dist/services/__tests__/workspace.service.test.js.map +1 -1
  172. package/dist/services/access-auth.service.d.ts +15 -1
  173. package/dist/services/access-auth.service.d.ts.map +1 -1
  174. package/dist/services/access-auth.service.js +75 -15
  175. package/dist/services/access-auth.service.js.map +1 -1
  176. package/dist/services/agent-artifact.service.d.ts +28 -0
  177. package/dist/services/agent-artifact.service.d.ts.map +1 -0
  178. package/dist/services/agent-artifact.service.js +287 -0
  179. package/dist/services/agent-artifact.service.js.map +1 -0
  180. package/dist/services/agent-visualization.service.d.ts +12 -0
  181. package/dist/services/agent-visualization.service.d.ts.map +1 -0
  182. package/dist/services/agent-visualization.service.js +239 -0
  183. package/dist/services/agent-visualization.service.js.map +1 -0
  184. package/dist/services/mcp-config.service.d.ts.map +1 -1
  185. package/dist/services/mcp-config.service.js +8 -1
  186. package/dist/services/mcp-config.service.js.map +1 -1
  187. package/dist/services/mcp-config.service.test.js +14 -0
  188. package/dist/services/mcp-config.service.test.js.map +1 -1
  189. package/dist/services/preview-runtime-manager.d.ts.map +1 -1
  190. package/dist/services/preview-runtime-manager.js +15 -12
  191. package/dist/services/preview-runtime-manager.js.map +1 -1
  192. package/dist/services/project.service.d.ts +3 -0
  193. package/dist/services/project.service.d.ts.map +1 -1
  194. package/dist/services/project.service.js +43 -32
  195. package/dist/services/project.service.js.map +1 -1
  196. package/dist/services/provider-config.service.d.ts.map +1 -1
  197. package/dist/services/provider-config.service.js +11 -0
  198. package/dist/services/provider-config.service.js.map +1 -1
  199. package/dist/services/session-manager.d.ts +31 -29
  200. package/dist/services/session-manager.d.ts.map +1 -1
  201. package/dist/services/session-manager.js +43 -23
  202. package/dist/services/session-manager.js.map +1 -1
  203. package/dist/services/task-cleanup.service.d.ts +4 -1
  204. package/dist/services/task-cleanup.service.d.ts.map +1 -1
  205. package/dist/services/task-cleanup.service.js +13 -1
  206. package/dist/services/task-cleanup.service.js.map +1 -1
  207. package/dist/services/task.service.d.ts +15 -13
  208. package/dist/services/task.service.d.ts.map +1 -1
  209. package/dist/services/task.service.js +21 -8
  210. package/dist/services/task.service.js.map +1 -1
  211. package/dist/services/workspace-background-process-manager.d.ts +66 -0
  212. package/dist/services/workspace-background-process-manager.d.ts.map +1 -0
  213. package/dist/services/workspace-background-process-manager.js +328 -0
  214. package/dist/services/workspace-background-process-manager.js.map +1 -0
  215. package/dist/services/workspace-background-service.service.d.ts +39 -0
  216. package/dist/services/workspace-background-service.service.d.ts.map +1 -0
  217. package/dist/services/workspace-background-service.service.js +520 -0
  218. package/dist/services/workspace-background-service.service.js.map +1 -0
  219. package/dist/services/workspace-lifecycle-barrier.d.ts +10 -0
  220. package/dist/services/workspace-lifecycle-barrier.d.ts.map +1 -0
  221. package/dist/services/workspace-lifecycle-barrier.js +35 -0
  222. package/dist/services/workspace-lifecycle-barrier.js.map +1 -0
  223. package/dist/services/workspace.service.d.ts +36 -30
  224. package/dist/services/workspace.service.d.ts.map +1 -1
  225. package/dist/services/workspace.service.js +100 -39
  226. package/dist/services/workspace.service.js.map +1 -1
  227. package/dist/socket/__tests__/socket-gateway.test.js +23 -0
  228. package/dist/socket/__tests__/socket-gateway.test.js.map +1 -1
  229. package/dist/socket/middleware/__tests__/auth.test.js +3 -3
  230. package/dist/socket/middleware/__tests__/auth.test.js.map +1 -1
  231. package/dist/utils/agent-api-credential.d.ts +11 -0
  232. package/dist/utils/agent-api-credential.d.ts.map +1 -0
  233. package/dist/utils/agent-api-credential.js +40 -0
  234. package/dist/utils/agent-api-credential.js.map +1 -0
  235. package/dist/utils/internal-api-token.d.ts +2 -0
  236. package/dist/utils/internal-api-token.d.ts.map +1 -1
  237. package/dist/utils/internal-api-token.js +2 -0
  238. package/dist/utils/internal-api-token.js.map +1 -1
  239. package/dist/utils/process-launch.d.ts.map +1 -1
  240. package/dist/utils/process-launch.js +156 -22
  241. package/dist/utils/process-launch.js.map +1 -1
  242. package/dist/utils/process-launch.test.js +7 -0
  243. package/dist/utils/process-launch.test.js.map +1 -1
  244. package/dist/utils/unix-process-identity.d.ts +23 -0
  245. package/dist/utils/unix-process-identity.d.ts.map +1 -0
  246. package/dist/utils/unix-process-identity.js +165 -0
  247. package/dist/utils/unix-process-identity.js.map +1 -0
  248. package/dist/web/assets/{AgentDemoPage-XrttOpQW.js → AgentDemoPage-CLemSpf6.js} +1 -1
  249. package/dist/web/assets/{AgentEnvironmentSettingsPage-CAo0bCpZ.js → AgentEnvironmentSettingsPage-CPggaJvZ.js} +1 -1
  250. package/dist/web/assets/{AgentLogo-BCwbooTN.js → AgentLogo-DJFjaRFS.js} +1 -1
  251. package/dist/web/assets/ConversationPage-CB4PoHYi.js +3 -0
  252. package/dist/web/assets/CreateTaskInput-CXWGjX_a.js +1 -0
  253. package/dist/web/assets/{DemoPage-DHMh9-zU.js → DemoPage-djW4NeHW.js} +3 -3
  254. package/dist/web/assets/{GeneralSettingsPage-DvWaqR9O.js → GeneralSettingsPage-0a2VgV74.js} +1 -1
  255. package/dist/web/assets/{Icons-DADUmnB1.js → Icons-tvQ3lNxT.js} +1 -1
  256. package/dist/web/assets/{LoadingPreviewPage-Dk91Ua1W.js → LoadingPreviewPage-D8GpQ-Ic.js} +1 -1
  257. package/dist/web/assets/McpSettingsPage-BxPMmwHH.js +1 -0
  258. package/dist/web/assets/{MemberAvatar-l-WCdlLA.js → MemberAvatar-JbGgXa3r.js} +1 -1
  259. package/dist/web/assets/{NotificationSettingsPage-Byu8b9X3.js → NotificationSettingsPage-BtN0fYTA.js} +1 -1
  260. package/dist/web/assets/{ProfileSettingsPage-BdylqWUj.js → ProfileSettingsPage-CVSHbAtS.js} +1 -1
  261. package/dist/web/assets/ProjectKanbanPage-Dq0pufE1.js +90 -0
  262. package/dist/web/assets/ProjectSettingsPage-CChSA5A4.js +2 -0
  263. package/dist/web/assets/ProviderSettingsPage-giXaDHmU.js +95 -0
  264. package/dist/web/assets/{SettingsMasterDetail-DTGIIGdI.js → SettingsMasterDetail-D-TeBuLx.js} +1 -1
  265. package/dist/web/assets/{TeamSettingsPage-BXuG4Bou.js → TeamSettingsPage-DNLp2l2E.js} +1 -1
  266. package/dist/web/assets/{arc-DrcjdWTE.js → arc-B5sdSA9b.js} +1 -1
  267. package/dist/web/assets/{architectureDiagram-3BPJPVTR-CAoBhXSL.js → architectureDiagram-3BPJPVTR-ClsPKWjN.js} +1 -1
  268. package/dist/web/assets/{arrow-left-CCWDjOmp.js → arrow-left-B7C-fOb5.js} +1 -1
  269. package/dist/web/assets/{blockDiagram-GPEHLZMM-CcTSBbUq.js → blockDiagram-GPEHLZMM-HHViBKvL.js} +1 -1
  270. package/dist/web/assets/{c4Diagram-AAUBKEIU-BuUKdgUg.js → c4Diagram-AAUBKEIU-CRreiVUs.js} +1 -1
  271. package/dist/web/assets/channel-Bhjxgyee.js +1 -0
  272. package/dist/web/assets/check-Dtr-nHO5.js +1 -0
  273. package/dist/web/assets/{chevron-down-BQcW9sFf.js → chevron-down-BZnZAd2n.js} +1 -1
  274. package/dist/web/assets/{chevron-right-pH923eYp.js → chevron-right-nnOI2p8q.js} +1 -1
  275. package/dist/web/assets/{chevron-up-DyQW115F.js → chevron-up-Cl6FGZ8R.js} +1 -1
  276. package/dist/web/assets/{chunk-2J33WTMH-BWNSmQa8.js → chunk-2J33WTMH-_s2AOnis.js} +1 -1
  277. package/dist/web/assets/{chunk-4BX2VUAB-Blldhw0k.js → chunk-4BX2VUAB-Ds1jhNjB.js} +1 -1
  278. package/dist/web/assets/{chunk-55IACEB6-hTffyPXL.js → chunk-55IACEB6-B2SvpbB1.js} +1 -1
  279. package/dist/web/assets/{chunk-727SXJPM-Cd48r7c-.js → chunk-727SXJPM-B6qjWdxn.js} +1 -1
  280. package/dist/web/assets/{chunk-AQP2D5EJ-BdDrOIL7.js → chunk-AQP2D5EJ-myECS-o9.js} +1 -1
  281. package/dist/web/assets/{chunk-FMBD7UC4-6XIvQYVJ.js → chunk-FMBD7UC4-CFDf13jX.js} +1 -1
  282. package/dist/web/assets/{chunk-ND2GUHAM-BJlcb_pB.js → chunk-ND2GUHAM-62aJufBH.js} +1 -1
  283. package/dist/web/assets/{chunk-QZHKN3VN-3TZzFkxK.js → chunk-QZHKN3VN-DEWvzHCx.js} +1 -1
  284. package/dist/web/assets/{circle-alert-oa-BQ5e7.js → circle-alert-BSGJzTSj.js} +1 -1
  285. package/dist/web/assets/classDiagram-4FO5ZUOK-BxnIeW8e.js +1 -0
  286. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-BxnIeW8e.js +1 -0
  287. package/dist/web/assets/{code-block-OCS4YCEC-xJQWFyR7.js → code-block-OCS4YCEC-DWj3hzdw.js} +1 -1
  288. package/dist/web/assets/{confirm-dialog-CRiC3xBd.js → confirm-dialog-oStWxmjS.js} +1 -1
  289. package/dist/web/assets/{cose-bilkent-S5V4N54A-Cjcm-rW_.js → cose-bilkent-S5V4N54A-DNYqhVNu.js} +1 -1
  290. package/dist/web/assets/cssMode-Cn68yhOS.js +1 -0
  291. package/dist/web/assets/{dagre-BM42HDAG-YqubcAJi.js → dagre-BM42HDAG-gQbGUd4s.js} +1 -1
  292. package/dist/web/assets/{diagram-2AECGRRQ-Dk4ayFqg.js → diagram-2AECGRRQ-BeMaPQBR.js} +1 -1
  293. package/dist/web/assets/{diagram-5GNKFQAL-CQ0joYfB.js → diagram-5GNKFQAL-CStJaSd8.js} +1 -1
  294. package/dist/web/assets/{diagram-KO2AKTUF-DmuZzIdW.js → diagram-KO2AKTUF-BmEeaazt.js} +1 -1
  295. package/dist/web/assets/{diagram-LMA3HP47-YTPEfEZy.js → diagram-LMA3HP47-ClNnKUvt.js} +1 -1
  296. package/dist/web/assets/{diagram-OG6HWLK6-DmwRuz8-.js → diagram-OG6HWLK6-C24GKhLk.js} +1 -1
  297. package/dist/web/assets/{erDiagram-TEJ5UH35-LRL_DMXa.js → erDiagram-TEJ5UH35-6Xp8w1WL.js} +1 -1
  298. package/dist/web/assets/{flowDiagram-I6XJVG4X-ELBDyOvk.js → flowDiagram-I6XJVG4X-BCih6e9O.js} +1 -1
  299. package/dist/web/assets/folder-picker-DcY2P8zf.js +1 -0
  300. package/dist/web/assets/{freemarker2-DxJFkRz5.js → freemarker2-C6kMBtOW.js} +1 -1
  301. package/dist/web/assets/{ganttDiagram-6RSMTGT7-D0e9ILuF.js → ganttDiagram-6RSMTGT7-_9GX-BOi.js} +1 -1
  302. package/dist/web/assets/{gitGraphDiagram-PVQCEYII-Ck6OXXw0.js → gitGraphDiagram-PVQCEYII-DEe9VMLq.js} +1 -1
  303. package/dist/web/assets/handlebars-BxZgdhY8.js +1 -0
  304. package/dist/web/assets/html-bhMfD_X9.js +1 -0
  305. package/dist/web/assets/htmlMode-CC7AVUJ4.js +1 -0
  306. package/dist/web/assets/index-018g9RN4.css +1 -0
  307. package/dist/web/assets/{index-D9kBRMR0.js → index-ToY1NCNr.js} +3 -3
  308. package/dist/web/assets/{index-CjdqAcbu.js → index-cl-QFuts.js} +4 -4
  309. package/dist/web/assets/{infoDiagram-5YYISTIA-Cx8be-MV.js → infoDiagram-5YYISTIA-CU3D8SMZ.js} +1 -1
  310. package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-Dlc7akl7.js → ishikawaDiagram-YF4QCWOH-ClffgdSa.js} +1 -1
  311. package/dist/web/assets/javascript-8UIdW5Gd.js +1 -0
  312. package/dist/web/assets/{journeyDiagram-JHISSGLW-BVDSbS9-.js → journeyDiagram-JHISSGLW-Cy7Rr0_y.js} +1 -1
  313. package/dist/web/assets/{jsonMode-B5CJhoWd.js → jsonMode-JLBoaKf1.js} +1 -1
  314. package/dist/web/assets/{kanban-definition-UN3LZRKU-nFR0zB7B.js → kanban-definition-UN3LZRKU-14piuQEq.js} +1 -1
  315. package/dist/web/assets/{layers-Bo4aml98.js → layers-C93epAjs.js} +1 -1
  316. package/dist/web/assets/{linear-BCWZjcpP.js → linear-BtH62ya4.js} +1 -1
  317. package/dist/web/assets/liquid-BntTiwt7.js +1 -0
  318. package/dist/web/assets/{lspLanguageFeatures-Cbk7wEkj.js → lspLanguageFeatures-Dk65AKZD.js} +1 -1
  319. package/dist/web/assets/mdx-ToUKdFio.js +1 -0
  320. package/dist/web/assets/{mermaid-NOHMQCX5-DWQaYVL0.js → mermaid-NOHMQCX5-CPO3gPWp.js} +66 -65
  321. package/dist/web/assets/{message-square-DxbkpGqF.js → message-square-BBENHwpb.js} +1 -1
  322. package/dist/web/assets/{mindmap-definition-RKZ34NQL-LI7W1FIX.js → mindmap-definition-RKZ34NQL-gWYqFXbP.js} +1 -1
  323. package/dist/web/assets/{modal-Cymk-6Df.js → modal-D-sNOVPw.js} +1 -1
  324. package/dist/web/assets/{monaco-Bc-Z2u8N.js → monaco-B9Zd90UG.js} +3 -3
  325. package/dist/web/assets/{pencil-DOL2nlgg.js → pencil-BRPix314.js} +1 -1
  326. package/dist/web/assets/{pieDiagram-4H26LBE5-mgUzAFkk.js → pieDiagram-4H26LBE5-C3cHgEuO.js} +1 -1
  327. package/dist/web/assets/python-BeGIUwrY.js +1 -0
  328. package/dist/web/assets/{quadrantDiagram-W4KKPZXB-CaDF2kqA.js → quadrantDiagram-W4KKPZXB-DZFYp-mp.js} +1 -1
  329. package/dist/web/assets/razor-CnCuqD7W.js +1 -0
  330. package/dist/web/assets/{requirementDiagram-4Y6WPE33-DhmHdr_0.js → requirementDiagram-4Y6WPE33-DSQRXAFH.js} +1 -1
  331. package/dist/web/assets/{sankeyDiagram-5OEKKPKP-B7qnGfue.js → sankeyDiagram-5OEKKPKP-CEXk2v3C.js} +1 -1
  332. package/dist/web/assets/{select-BpKQyMvD.js → select-CGNclv1f.js} +1 -1
  333. package/dist/web/assets/{sequenceDiagram-3UESZ5HK-D2LhPgpM.js → sequenceDiagram-3UESZ5HK-CHVF_25M.js} +1 -1
  334. package/dist/web/assets/server-UA3ZvpjF.js +1 -0
  335. package/dist/web/assets/{stateDiagram-AJRCARHV-ClkO4Gu5.js → stateDiagram-AJRCARHV-TMqBR1_f.js} +1 -1
  336. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-DqCjP1u1.js +1 -0
  337. package/dist/web/assets/{switch-BJ4Ar_OA.js → switch-C7qsQ1x2.js} +1 -1
  338. package/dist/web/assets/{textarea-DjwjAAG8.js → textarea-CDdCks2T.js} +1 -1
  339. package/dist/web/assets/{timeline-definition-PNZ67QCA-DhGIG-GC.js → timeline-definition-PNZ67QCA-CxC3mFt7.js} +1 -1
  340. package/dist/web/assets/{trash-2-R46i6Uus.js → trash-2-Bye7VGcW.js} +1 -1
  341. package/dist/web/assets/{tsMode-CKaqpIrz.js → tsMode-8nvc-x2E.js} +1 -1
  342. package/dist/web/assets/typescript-P7JXXc42.js +1 -0
  343. package/dist/web/assets/{upload-CgWqsmdI.js → upload-wJO5M1ZY.js} +1 -1
  344. package/dist/web/assets/{use-profiles-BlGgvdYm.js → use-profiles-CYJIKesy.js} +1 -1
  345. package/dist/web/assets/{use-projects-Cuv0A0RC.js → use-projects-Ds_YI2En.js} +1 -1
  346. package/dist/web/assets/{use-providers-DLcAY6E1.js → use-providers-B9FaTKyw.js} +1 -1
  347. package/dist/web/assets/{useNormalizedLogs-tfxFAJOF.js → useNormalizedLogs-B8um63GF.js} +1 -1
  348. package/dist/web/assets/{vennDiagram-CIIHVFJN-BngQhsYJ.js → vennDiagram-CIIHVFJN-DX0jm9G-.js} +1 -1
  349. package/dist/web/assets/{wardley-L42UT6IY-BEY6sftT.js → wardley-L42UT6IY-Ce-rqtq2.js} +1 -1
  350. package/dist/web/assets/{wardleyDiagram-YWT4CUSO-IH_Yh-cw.js → wardleyDiagram-YWT4CUSO-Gpxnu2av.js} +1 -1
  351. package/dist/web/assets/xml-1G4iEdpK.js +1 -0
  352. package/dist/web/assets/{xychartDiagram-2RQKCTM6-BdrGFDsr.js → xychartDiagram-2RQKCTM6-COe6opx2.js} +1 -1
  353. package/dist/web/assets/yaml-HqUdsAk3.js +1 -0
  354. package/dist/web/index.html +2 -2
  355. package/node_modules/@agent-tower/shared/dist/agent-download-intent.d.ts +6 -0
  356. package/node_modules/@agent-tower/shared/dist/agent-download-intent.d.ts.map +1 -0
  357. package/node_modules/@agent-tower/shared/dist/agent-download-intent.js +46 -0
  358. package/node_modules/@agent-tower/shared/dist/agent-download-intent.js.map +1 -0
  359. package/node_modules/@agent-tower/shared/dist/index.d.ts +1 -0
  360. package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -1
  361. package/node_modules/@agent-tower/shared/dist/index.js +1 -0
  362. package/node_modules/@agent-tower/shared/dist/index.js.map +1 -1
  363. package/node_modules/@agent-tower/shared/dist/provider-capabilities.d.ts +1 -0
  364. package/node_modules/@agent-tower/shared/dist/provider-capabilities.d.ts.map +1 -1
  365. package/node_modules/@agent-tower/shared/dist/provider-capabilities.js +4 -0
  366. package/node_modules/@agent-tower/shared/dist/provider-capabilities.js.map +1 -1
  367. package/node_modules/@agent-tower/shared/dist/types.d.ts +56 -2
  368. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  369. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  370. package/package.json +1 -1
  371. package/prisma/migrations/20260728000000_add_agent_artifacts/migration.sql +23 -0
  372. package/prisma/schema.prisma +48 -0
  373. package/dist/web/assets/ConversationPage-kyHuICil.js +0 -3
  374. package/dist/web/assets/CreateTaskInput-B67vzMJD.js +0 -1
  375. package/dist/web/assets/McpSettingsPage-CH8jFyxp.js +0 -1
  376. package/dist/web/assets/ProjectKanbanPage--cx6wNDR.js +0 -90
  377. package/dist/web/assets/ProjectSettingsPage-6psG0Vfc.js +0 -2
  378. package/dist/web/assets/ProviderSettingsPage-BPEEkhtA.js +0 -93
  379. package/dist/web/assets/channel-Bh_PCZNP.js +0 -1
  380. package/dist/web/assets/check-BN_PVKzE.js +0 -1
  381. package/dist/web/assets/classDiagram-4FO5ZUOK-B0lQFDoP.js +0 -1
  382. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-B0lQFDoP.js +0 -1
  383. package/dist/web/assets/copy-DaoAUKTO.js +0 -1
  384. package/dist/web/assets/cssMode-_D6u4YDd.js +0 -1
  385. package/dist/web/assets/folder-picker-WUhXxIM5.js +0 -1
  386. package/dist/web/assets/handlebars-djdO6ZKR.js +0 -1
  387. package/dist/web/assets/html-CHeBxmFi.js +0 -1
  388. package/dist/web/assets/htmlMode-SZh8FaPi.js +0 -1
  389. package/dist/web/assets/index-CjAJoGg5.css +0 -1
  390. package/dist/web/assets/javascript-l6fV6hf7.js +0 -1
  391. package/dist/web/assets/liquid-DkFOeJ6J.js +0 -1
  392. package/dist/web/assets/mdx-BOPNdexu.js +0 -1
  393. package/dist/web/assets/python-D_wlYLCL.js +0 -1
  394. package/dist/web/assets/razor-DBFVg4JU.js +0 -1
  395. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-YnSeSD_N.js +0 -1
  396. package/dist/web/assets/typescript-DsixnGVt.js +0 -1
  397. package/dist/web/assets/xml-dEcQ1gzo.js +0 -1
  398. package/dist/web/assets/yaml-BfGVqGj4.js +0 -1
@@ -1,6 +1,7 @@
1
1
  import { WorkspaceKind } from '../types/index.js';
2
2
  import { type TeamLockService } from './team-lock.service.js';
3
3
  import type { GitOperationStatus, MergeableWorkspacesResponse, MergeTeamRunMembersInput, MergeTeamRunMembersResponse, WorkspaceVerdict, WorkspaceVerdictKind, WorkspaceVerdictValue } from '@agent-tower/shared';
4
+ import type { WorkspaceBackgroundService } from './workspace-background-service.service.js';
4
5
  export interface CreateWorkspaceOptions {
5
6
  branchName?: string;
6
7
  branchNamePrefix?: string;
@@ -52,11 +53,12 @@ export interface MergeTeamRunMembersOptions extends MergeTeamRunMembersInput {
52
53
  }
53
54
  export declare class WorkspaceService {
54
55
  private readonly lockService;
56
+ private readonly backgroundService;
55
57
  private static readonly mainWorkspaceClaims;
56
58
  private static readonly dedicatedWorkspaceClaims;
57
59
  private sessionService;
58
60
  private eventBus;
59
- constructor(lockService?: TeamLockService);
61
+ constructor(lockService?: TeamLockService, backgroundService?: Pick<WorkspaceBackgroundService, 'stopAllForWorkspace'> & Partial<Pick<WorkspaceBackgroundService, 'releaseLogsForWorkspace'>>);
60
62
  private getBaseBranch;
61
63
  findById(id: string): Promise<({
62
64
  task: {
@@ -95,9 +97,9 @@ export declare class WorkspaceService {
95
97
  id: string;
96
98
  createdAt: Date;
97
99
  updatedAt: Date;
100
+ agentType: string;
98
101
  status: string;
99
102
  workspaceId: string | null;
100
- agentType: string;
101
103
  variant: string;
102
104
  providerId: string | null;
103
105
  purpose: string;
@@ -107,15 +109,15 @@ export declare class WorkspaceService {
107
109
  id: string;
108
110
  createdAt: Date;
109
111
  updatedAt: Date;
112
+ workingDir: string;
110
113
  status: string;
111
114
  taskId: string;
115
+ branchName: string;
116
+ worktreePath: string;
112
117
  parentWorkspaceId: string | null;
113
118
  ownerMemberId: string | null;
114
- branchName: string;
115
119
  baseBranch: string | null;
116
- worktreePath: string;
117
120
  workspaceKind: string;
118
- workingDir: string;
119
121
  commitMessage: string | null;
120
122
  previewTarget: string | null;
121
123
  hibernatedAt: Date | null;
@@ -128,9 +130,9 @@ export declare class WorkspaceService {
128
130
  id: string;
129
131
  createdAt: Date;
130
132
  updatedAt: Date;
133
+ agentType: string;
131
134
  status: string;
132
135
  workspaceId: string | null;
133
- agentType: string;
134
136
  variant: string;
135
137
  providerId: string | null;
136
138
  purpose: string;
@@ -140,15 +142,15 @@ export declare class WorkspaceService {
140
142
  id: string;
141
143
  createdAt: Date;
142
144
  updatedAt: Date;
145
+ workingDir: string;
143
146
  status: string;
144
147
  taskId: string;
148
+ branchName: string;
149
+ worktreePath: string;
145
150
  parentWorkspaceId: string | null;
146
151
  ownerMemberId: string | null;
147
- branchName: string;
148
152
  baseBranch: string | null;
149
- worktreePath: string;
150
153
  workspaceKind: string;
151
- workingDir: string;
152
154
  commitMessage: string | null;
153
155
  previewTarget: string | null;
154
156
  hibernatedAt: Date | null;
@@ -214,9 +216,9 @@ export declare class WorkspaceService {
214
216
  id: string;
215
217
  createdAt: Date;
216
218
  updatedAt: Date;
219
+ agentType: string;
217
220
  status: string;
218
221
  workspaceId: string | null;
219
- agentType: string;
220
222
  variant: string;
221
223
  providerId: string | null;
222
224
  purpose: string;
@@ -226,15 +228,15 @@ export declare class WorkspaceService {
226
228
  id: string;
227
229
  createdAt: Date;
228
230
  updatedAt: Date;
231
+ workingDir: string;
229
232
  status: string;
230
233
  taskId: string;
234
+ branchName: string;
235
+ worktreePath: string;
231
236
  parentWorkspaceId: string | null;
232
237
  ownerMemberId: string | null;
233
- branchName: string;
234
238
  baseBranch: string | null;
235
- worktreePath: string;
236
239
  workspaceKind: string;
237
- workingDir: string;
238
240
  commitMessage: string | null;
239
241
  previewTarget: string | null;
240
242
  hibernatedAt: Date | null;
@@ -277,9 +279,9 @@ export declare class WorkspaceService {
277
279
  id: string;
278
280
  createdAt: Date;
279
281
  updatedAt: Date;
282
+ agentType: string;
280
283
  status: string;
281
284
  workspaceId: string | null;
282
- agentType: string;
283
285
  variant: string;
284
286
  providerId: string | null;
285
287
  purpose: string;
@@ -289,15 +291,15 @@ export declare class WorkspaceService {
289
291
  id: string;
290
292
  createdAt: Date;
291
293
  updatedAt: Date;
294
+ workingDir: string;
292
295
  status: string;
293
296
  taskId: string;
297
+ branchName: string;
298
+ worktreePath: string;
294
299
  parentWorkspaceId: string | null;
295
300
  ownerMemberId: string | null;
296
- branchName: string;
297
301
  baseBranch: string | null;
298
- worktreePath: string;
299
302
  workspaceKind: string;
300
- workingDir: string;
301
303
  commitMessage: string | null;
302
304
  previewTarget: string | null;
303
305
  hibernatedAt: Date | null;
@@ -339,9 +341,9 @@ export declare class WorkspaceService {
339
341
  id: string;
340
342
  createdAt: Date;
341
343
  updatedAt: Date;
344
+ agentType: string;
342
345
  status: string;
343
346
  workspaceId: string | null;
344
- agentType: string;
345
347
  variant: string;
346
348
  providerId: string | null;
347
349
  purpose: string;
@@ -351,15 +353,15 @@ export declare class WorkspaceService {
351
353
  id: string;
352
354
  createdAt: Date;
353
355
  updatedAt: Date;
356
+ workingDir: string;
354
357
  status: string;
355
358
  taskId: string;
359
+ branchName: string;
360
+ worktreePath: string;
356
361
  parentWorkspaceId: string | null;
357
362
  ownerMemberId: string | null;
358
- branchName: string;
359
363
  baseBranch: string | null;
360
- worktreePath: string;
361
364
  workspaceKind: string;
362
- workingDir: string;
363
365
  commitMessage: string | null;
364
366
  previewTarget: string | null;
365
367
  hibernatedAt: Date | null;
@@ -382,6 +384,7 @@ export declare class WorkspaceService {
382
384
  * - worktree 清理失败时仍然删除数据库记录(记录警告日志)
383
385
  */
384
386
  delete(id: string): Promise<boolean>;
387
+ private deleteWithLifecycle;
385
388
  getDiff(id: string): Promise<string>;
386
389
  /**
387
390
  * Rebase 工作空间分支到最新的基础分支
@@ -405,6 +408,7 @@ export declare class WorkspaceService {
405
408
  private mergeRootWorkspaceToMain;
406
409
  private assertTeamRunFinalMergeAllowed;
407
410
  private assertNoActiveWriteSessions;
411
+ private assertNoActiveBackgroundServices;
408
412
  private getMergeLockTarget;
409
413
  private getParentWorkspaceMergeLockTarget;
410
414
  private withMergeTargetLock;
@@ -448,12 +452,12 @@ export declare class WorkspaceService {
448
452
  id: string;
449
453
  createdAt: Date;
450
454
  updatedAt: Date;
455
+ agentType: string;
456
+ runtimeType: string;
451
457
  status: string;
452
458
  workspaceId: string | null;
453
459
  conversationId: string | null;
454
460
  context: string;
455
- agentType: string;
456
- runtimeType: string;
457
461
  externalSessionId: string | null;
458
462
  variant: string;
459
463
  providerId: string | null;
@@ -466,24 +470,26 @@ export declare class WorkspaceService {
466
470
  id: string;
467
471
  createdAt: Date;
468
472
  updatedAt: Date;
473
+ workingDir: string;
469
474
  status: string;
470
475
  taskId: string;
476
+ branchName: string;
477
+ worktreePath: string;
471
478
  parentWorkspaceId: string | null;
472
479
  ownerMemberId: string | null;
473
- branchName: string;
474
480
  baseBranch: string | null;
475
- worktreePath: string;
476
481
  workspaceKind: string;
477
- workingDir: string;
478
482
  commitMessage: string | null;
479
483
  previewTarget: string | null;
480
484
  hibernatedAt: Date | null;
481
485
  }>;
486
+ private archiveWithLifecycle;
482
487
  /**
483
488
  * 休眠单个 workspace:auto-commit dirty changes → 删除 worktree 目录 → 标记 HIBERNATED
484
489
  * Branch 保留,可随时通过 reactivate() 恢复。
485
490
  */
486
491
  hibernate(id: string): Promise<void>;
492
+ private hibernateWithLifecycle;
487
493
  /**
488
494
  * 唤醒休眠的 workspace:从 branch 重建 worktree → 复制文件 → 执行 setup → 恢复 ACTIVE
489
495
  */
@@ -524,9 +530,9 @@ export declare class WorkspaceService {
524
530
  id: string;
525
531
  createdAt: Date;
526
532
  updatedAt: Date;
533
+ agentType: string;
527
534
  status: string;
528
535
  workspaceId: string | null;
529
- agentType: string;
530
536
  variant: string;
531
537
  providerId: string | null;
532
538
  purpose: string;
@@ -536,15 +542,15 @@ export declare class WorkspaceService {
536
542
  id: string;
537
543
  createdAt: Date;
538
544
  updatedAt: Date;
545
+ workingDir: string;
539
546
  status: string;
540
547
  taskId: string;
548
+ branchName: string;
549
+ worktreePath: string;
541
550
  parentWorkspaceId: string | null;
542
551
  ownerMemberId: string | null;
543
- branchName: string;
544
552
  baseBranch: string | null;
545
- worktreePath: string;
546
553
  workspaceKind: string;
547
- workingDir: string;
548
554
  commitMessage: string | null;
549
555
  previewTarget: string | null;
550
556
  hibernatedAt: Date | null;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.service.d.ts","sourceRoot":"","sources":["../../src/services/workspace.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace.service.d.ts","sourceRoot":"","sources":["../../src/services/workspace.service.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { WorkspaceKind, WorkspaceStatus, TaskStatus, SessionStatus, SessionPurpo
3
3
  import { WorktreeManager } from '../git/worktree.manager.js';
4
4
  import { execGit, MergeConflictError } from '../git/git-cli.js';
5
5
  import { NotFoundError, ServiceError } from '../errors.js';
6
- import { getSessionManager, getEventBus } from '../core/container.js';
6
+ import { getSessionManager, getEventBus, getWorkspaceBackgroundService } from '../core/container.js';
7
7
  import { copyProjectFiles } from './copy-files.service.js';
8
8
  import { defaultTeamLockService } from './team-lock.service.js';
9
9
  import { exec } from 'node:child_process';
@@ -14,6 +14,7 @@ import path from 'node:path';
14
14
  import { ensureProjectIsMutable, ensureProjectSupportsWorktrees, hasGitMetadata, } from './project-guards.js';
15
15
  import { ensureTaskNotDeleted } from './deleted-task-guard.js';
16
16
  import { isMainDirectoryWorkspace, isWorktreeWorkspace, } from './workspace-kind.js';
17
+ import { defaultWorkspaceLifecycleBarrier } from './workspace-lifecycle-barrier.js';
17
18
  const DEFAULT_IDLE_THRESHOLD_HOURS = 24;
18
19
  const WORKSPACE_READY_RETRY_COUNT = 20;
19
20
  const WORKSPACE_READY_RETRY_DELAY_MS = 50;
@@ -48,6 +49,13 @@ const visibleSessionsFilter = {
48
49
  };
49
50
  const activeSessionStatuses = [SessionStatus.PENDING, SessionStatus.RUNNING];
50
51
  const activeInvocationStatuses = ['QUEUED', 'RUNNING', 'SESSION_ENDED', 'WAITING_ROOM_REPLY'];
52
+ const activeBackgroundServiceStates = ['STARTING', 'RUNNING', 'STOPPING'];
53
+ const activeBackgroundServiceWhere = {
54
+ OR: [
55
+ { runtimeState: { in: activeBackgroundServiceStates } },
56
+ { runtimeInstanceId: { not: null } },
57
+ ],
58
+ };
51
59
  const finalChildWorkspaceStatuses = [WorkspaceStatus.MERGED, WorkspaceStatus.ABANDONED];
52
60
  function normalizeCreateOptions(input) {
53
61
  if (typeof input === 'string') {
@@ -178,12 +186,14 @@ function resultSummary(results, requested = results.length) {
178
186
  }
179
187
  export class WorkspaceService {
180
188
  lockService;
189
+ backgroundService;
181
190
  static mainWorkspaceClaims = new Map();
182
191
  static dedicatedWorkspaceClaims = new Map();
183
192
  sessionService = getSessionManager();
184
193
  eventBus = getEventBus();
185
- constructor(lockService = defaultTeamLockService) {
194
+ constructor(lockService = defaultTeamLockService, backgroundService = getWorkspaceBackgroundService()) {
186
195
  this.lockService = lockService;
196
+ this.backgroundService = backgroundService;
187
197
  }
188
198
  getBaseBranch(workspace) {
189
199
  return workspace.baseBranch || workspace.task.project.mainBranch;
@@ -544,7 +554,7 @@ export class WorkspaceService {
544
554
  });
545
555
  const workspaceIds = dedicatedWorkspaces.map((workspace) => workspace.id);
546
556
  const ownerMemberIds = dedicatedWorkspaces.map((workspace) => workspace.ownerMemberId);
547
- const [verdicts, ownerInvocations, parentActiveWriteSession, mainHeadSha] = await Promise.all([
557
+ const [verdicts, ownerInvocations, activeServices, parentActiveWriteSession, mainHeadSha] = await Promise.all([
548
558
  workspaceIds.length > 0
549
559
  ? prisma.workspaceVerdict.findMany({
550
560
  where: {
@@ -571,6 +581,15 @@ export class WorkspaceService {
571
581
  select: { memberId: true },
572
582
  })
573
583
  : Promise.resolve([]),
584
+ workspaceIds.length > 0
585
+ ? prisma.workspaceBackgroundService.findMany({
586
+ where: {
587
+ workspaceId: { in: workspaceIds },
588
+ ...activeBackgroundServiceWhere,
589
+ },
590
+ select: { workspaceId: true },
591
+ })
592
+ : Promise.resolve([]),
574
593
  mainWorkspace
575
594
  ? prisma.session.findFirst({
576
595
  where: {
@@ -620,6 +639,7 @@ export class WorkspaceService {
620
639
  latestReviews,
621
640
  latestTests,
622
641
  ownerActiveMemberIds: new Set(ownerInvocations.map((invocation) => invocation.memberId)),
642
+ activeServiceWorkspaceIds: new Set(activeServices.map((service) => service.workspaceId)),
623
643
  };
624
644
  }
625
645
  async buildMergeableWorkspacesResponse(context) {
@@ -718,6 +738,9 @@ export class WorkspaceService {
718
738
  if (ownerHasActiveInvocation) {
719
739
  blockers.push(blocker('OWNER_HAS_ACTIVE_INVOCATION', 'BLOCKING', 'Cannot merge while the workspace owner has active work'));
720
740
  }
741
+ if (context.activeServiceWorkspaceIds.has(workspace.id)) {
742
+ blockers.push(blocker('WORKSPACE_HAS_ACTIVE_SERVICE', 'BLOCKING', 'Cannot merge a workspace while one of its background services is active'));
743
+ }
721
744
  if (context.mainWorkspace.hasActiveWriteSession) {
722
745
  blockers.push(blocker('PARENT_WORKSPACE_HAS_ACTIVE_SESSION', 'BLOCKING', 'Cannot merge into parent workspace while it has an active write session'));
723
746
  }
@@ -1288,6 +1311,9 @@ export class WorkspaceService {
1288
1311
  * - worktree 清理失败时仍然删除数据库记录(记录警告日志)
1289
1312
  */
1290
1313
  async delete(id) {
1314
+ return defaultWorkspaceLifecycleBarrier.withWorkspace(id, () => this.deleteWithLifecycle(id));
1315
+ }
1316
+ async deleteWithLifecycle(id) {
1291
1317
  const workspace = await prisma.workspace.findUnique({
1292
1318
  where: { id },
1293
1319
  include: {
@@ -1309,6 +1335,7 @@ export class WorkspaceService {
1309
1335
  // 忽略停止失败
1310
1336
  }
1311
1337
  }
1338
+ await this.backgroundService.stopAllForWorkspace(id);
1312
1339
  if (isWorktreeWorkspace(workspace) && workspace.worktreePath) {
1313
1340
  // 清理 worktree
1314
1341
  try {
@@ -1320,7 +1347,8 @@ export class WorkspaceService {
1320
1347
  console.warn(`[WorkspaceService] Failed to remove worktree for workspace ${id}: ${err instanceof Error ? err.message : err}`);
1321
1348
  }
1322
1349
  }
1323
- // 删除数据库记录(级联删除 sessions)
1350
+ // 删除数据库记录(级联删除 sessions/services)
1351
+ await this.backgroundService.releaseLogsForWorkspace?.(id);
1324
1352
  await prisma.workspace.delete({ where: { id } });
1325
1353
  return true;
1326
1354
  }
@@ -1392,19 +1420,22 @@ export class WorkspaceService {
1392
1420
  await worktreeManager.abortOperation(workspace.worktreePath);
1393
1421
  }
1394
1422
  async merge(id, commitMessageOrOptions) {
1395
- const options = typeof commitMessageOrOptions === 'string'
1396
- ? { commitMessage: commitMessageOrOptions }
1397
- : (commitMessageOrOptions ?? {});
1398
- const workspace = await prisma.workspace.findUnique({
1399
- where: { id },
1400
- include: { task: { include: { project: true, teamRun: true } } },
1423
+ return defaultWorkspaceLifecycleBarrier.withWorkspace(id, async () => {
1424
+ const options = typeof commitMessageOrOptions === 'string'
1425
+ ? { commitMessage: commitMessageOrOptions }
1426
+ : (commitMessageOrOptions ?? {});
1427
+ const workspace = await prisma.workspace.findUnique({
1428
+ where: { id },
1429
+ include: { task: { include: { project: true, teamRun: true } } },
1430
+ });
1431
+ if (!workspace) {
1432
+ throw new NotFoundError('Workspace', id);
1433
+ }
1434
+ ensureProjectIsMutable(workspace.task.project, 'merge workspaces');
1435
+ this.assertWorktreeWorkspace(workspace);
1436
+ await this.assertNoActiveBackgroundServices(workspace.id);
1437
+ return this.withMergeTargetLock(this.getMergeLockTarget(workspace), options.lockOwnerId, () => this.mergeWithLock(workspace, options));
1401
1438
  });
1402
- if (!workspace) {
1403
- throw new NotFoundError('Workspace', id);
1404
- }
1405
- ensureProjectIsMutable(workspace.task.project, 'merge workspaces');
1406
- this.assertWorktreeWorkspace(workspace);
1407
- return this.withMergeTargetLock(this.getMergeLockTarget(workspace), options.lockOwnerId, () => this.mergeWithLock(workspace, options));
1408
1439
  }
1409
1440
  async mergeWithLock(workspace, options) {
1410
1441
  if (this.isTeamRunDedicatedChildWorkspace(workspace) && workspace.status === WorkspaceStatus.MERGED) {
@@ -1421,6 +1452,9 @@ export class WorkspaceService {
1421
1452
  if (workspace.status !== WorkspaceStatus.ACTIVE) {
1422
1453
  throw new ServiceError(`Cannot merge workspace in ${workspace.status} status`, 'INVALID_WORKSPACE_STATE', 400);
1423
1454
  }
1455
+ // The preflight/readiness result can become stale while waiting for the
1456
+ // merge target lock, so the process-writing invariant is checked again.
1457
+ await this.assertNoActiveBackgroundServices(workspace.id);
1424
1458
  if (workspace.parentWorkspaceId) {
1425
1459
  if (this.isTeamRunDedicatedChildWorkspace(workspace)) {
1426
1460
  await this.assertTeamRunChildMergeGate(workspace, options);
@@ -1619,6 +1653,18 @@ export class WorkspaceService {
1619
1653
  throw new ServiceError('Cannot merge into parent workspace while it has an active write session', 'PARENT_WORKSPACE_HAS_ACTIVE_SESSION', 409);
1620
1654
  }
1621
1655
  }
1656
+ async assertNoActiveBackgroundServices(workspaceId) {
1657
+ const activeService = await prisma.workspaceBackgroundService.findFirst({
1658
+ where: {
1659
+ workspaceId,
1660
+ ...activeBackgroundServiceWhere,
1661
+ },
1662
+ select: { id: true },
1663
+ });
1664
+ if (activeService) {
1665
+ throw new ServiceError('Cannot merge a workspace while one of its background services is active', 'WORKSPACE_HAS_ACTIVE_SERVICE', 409);
1666
+ }
1667
+ }
1622
1668
  getMergeLockTarget(workspace) {
1623
1669
  if (workspace.parentWorkspaceId) {
1624
1670
  return this.getParentWorkspaceMergeLockTarget(workspace.parentWorkspaceId);
@@ -1656,6 +1702,9 @@ export class WorkspaceService {
1656
1702
  * 归档 Workspace(标记状态为 ABANDONED)
1657
1703
  */
1658
1704
  async archive(id) {
1705
+ return defaultWorkspaceLifecycleBarrier.withWorkspace(id, () => this.archiveWithLifecycle(id));
1706
+ }
1707
+ async archiveWithLifecycle(id) {
1659
1708
  const workspace = await prisma.workspace.findUnique({
1660
1709
  where: { id },
1661
1710
  include: { sessions: true, task: { include: { project: true } } },
@@ -1677,6 +1726,7 @@ export class WorkspaceService {
1677
1726
  // 忽略停止失败
1678
1727
  }
1679
1728
  }
1729
+ await this.backgroundService.stopAllForWorkspace(id);
1680
1730
  const archived = await prisma.workspace.update({
1681
1731
  where: { id },
1682
1732
  data: { status: WorkspaceStatus.ABANDONED },
@@ -1690,6 +1740,9 @@ export class WorkspaceService {
1690
1740
  * Branch 保留,可随时通过 reactivate() 恢复。
1691
1741
  */
1692
1742
  async hibernate(id) {
1743
+ return defaultWorkspaceLifecycleBarrier.withWorkspace(id, () => this.hibernateWithLifecycle(id));
1744
+ }
1745
+ async hibernateWithLifecycle(id) {
1693
1746
  const workspace = await prisma.workspace.findUnique({
1694
1747
  where: { id },
1695
1748
  include: {
@@ -1708,6 +1761,9 @@ export class WorkspaceService {
1708
1761
  if (hasActiveSessions) {
1709
1762
  throw new ServiceError('Cannot hibernate workspace with active sessions', 'WORKSPACE_HAS_ACTIVE_SESSIONS', 409);
1710
1763
  }
1764
+ // Hibernation removes the worktree. Long-running services must stop first
1765
+ // and remain stopped after reactivation.
1766
+ await this.backgroundService.stopAllForWorkspace(id);
1711
1767
  // Auto-commit any dirty changes before removing worktree
1712
1768
  if (workspace.worktreePath) {
1713
1769
  const worktreeExists = await fs.access(workspace.worktreePath).then(() => true).catch(() => false);
@@ -1880,32 +1936,37 @@ export class WorkspaceService {
1880
1936
  let cleaned = 0;
1881
1937
  for (const workspace of workspaces) {
1882
1938
  try {
1883
- if (isMainDirectoryWorkspace(workspace)) {
1939
+ await defaultWorkspaceLifecycleBarrier.withWorkspace(workspace.id, async () => {
1940
+ await this.backgroundService.stopAllForWorkspace(workspace.id);
1941
+ if (isMainDirectoryWorkspace(workspace)) {
1942
+ await this.backgroundService.releaseLogsForWorkspace?.(workspace.id);
1943
+ await prisma.workspace.delete({ where: { id: workspace.id } });
1944
+ cleaned++;
1945
+ return;
1946
+ }
1947
+ const worktreeManager = new WorktreeManager(workspace.task.project.repoPath);
1948
+ // 清理残留 worktree(如果还存在)
1949
+ if (workspace.worktreePath) {
1950
+ const removeResult = await worktreeManager.remove(workspace.worktreePath);
1951
+ if (removeResult.status === 'unregistered') {
1952
+ console.warn(`[WorkspaceService] cleanup: workspace ${workspace.id} path is unregistered or unsafe to remove: ${removeResult.path}`);
1953
+ return;
1954
+ }
1955
+ }
1956
+ // Task 已 DONE,branch 不再需要,删除。安全 helper 会跳过 base/main/master/current/missing。
1957
+ const branchDeleteResult = await worktreeManager.deleteBranchIfSafe(workspace.branchName, {
1958
+ protectedBranches: [workspace.task.project.mainBranch, workspace.baseBranch],
1959
+ });
1960
+ if (branchDeleteResult.status === 'failed') {
1961
+ console.warn(`[WorkspaceService] cleanup: failed to delete branch ${branchDeleteResult.branchName} for workspace ${workspace.id}: ${branchDeleteResult.reason}`);
1962
+ }
1963
+ else if (branchDeleteResult.status === 'checked_out') {
1964
+ console.warn(`[WorkspaceService] cleanup: skipped checked-out branch ${branchDeleteResult.branchName} for workspace ${workspace.id}: ${branchDeleteResult.reason}`);
1965
+ }
1966
+ await this.backgroundService.releaseLogsForWorkspace?.(workspace.id);
1884
1967
  await prisma.workspace.delete({ where: { id: workspace.id } });
1885
1968
  cleaned++;
1886
- continue;
1887
- }
1888
- const worktreeManager = new WorktreeManager(workspace.task.project.repoPath);
1889
- // 清理残留 worktree(如果还存在)
1890
- if (workspace.worktreePath) {
1891
- const removeResult = await worktreeManager.remove(workspace.worktreePath);
1892
- if (removeResult.status === 'unregistered') {
1893
- console.warn(`[WorkspaceService] cleanup: workspace ${workspace.id} path is unregistered or unsafe to remove: ${removeResult.path}`);
1894
- continue;
1895
- }
1896
- }
1897
- // Task 已 DONE,branch 不再需要,删除。安全 helper 会跳过 base/main/master/current/missing。
1898
- const branchDeleteResult = await worktreeManager.deleteBranchIfSafe(workspace.branchName, {
1899
- protectedBranches: [workspace.task.project.mainBranch, workspace.baseBranch],
1900
1969
  });
1901
- if (branchDeleteResult.status === 'failed') {
1902
- console.warn(`[WorkspaceService] cleanup: failed to delete branch ${branchDeleteResult.branchName} for workspace ${workspace.id}: ${branchDeleteResult.reason}`);
1903
- }
1904
- else if (branchDeleteResult.status === 'checked_out') {
1905
- console.warn(`[WorkspaceService] cleanup: skipped checked-out branch ${branchDeleteResult.branchName} for workspace ${workspace.id}: ${branchDeleteResult.reason}`);
1906
- }
1907
- await prisma.workspace.delete({ where: { id: workspace.id } });
1908
- cleaned++;
1909
1970
  }
1910
1971
  catch (err) {
1911
1972
  // worktree 删除失败时保留 DB 记录,下次 scan 重试