agent-tower 0.7.4-beta.0 → 0.7.4-beta.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 (233) hide show
  1. package/dist/executors/__tests__/codex-mcp-windows.test.d.ts +2 -0
  2. package/dist/executors/__tests__/codex-mcp-windows.test.d.ts.map +1 -0
  3. package/dist/executors/__tests__/codex-mcp-windows.test.js +128 -0
  4. package/dist/executors/__tests__/codex-mcp-windows.test.js.map +1 -0
  5. package/dist/executors/__tests__/codex.executor.test.js +394 -1
  6. package/dist/executors/__tests__/codex.executor.test.js.map +1 -1
  7. package/dist/executors/codex.executor.d.ts +6 -6
  8. package/dist/executors/codex.executor.d.ts.map +1 -1
  9. package/dist/executors/codex.executor.js +118 -32
  10. package/dist/executors/codex.executor.js.map +1 -1
  11. package/dist/mcp/tools/tasks.js +3 -3
  12. package/dist/mcp/tools/tasks.js.map +1 -1
  13. package/dist/mcp/types.js +2 -2
  14. package/dist/mcp/types.js.map +1 -1
  15. package/dist/prompts/task-handoff.d.ts.map +1 -1
  16. package/dist/prompts/task-handoff.js +2 -1
  17. package/dist/prompts/task-handoff.js.map +1 -1
  18. package/dist/routes/__tests__/sessions-runtime.test.js +2 -0
  19. package/dist/routes/__tests__/sessions-runtime.test.js.map +1 -1
  20. package/dist/routes/__tests__/tasks.test.js +41 -0
  21. package/dist/routes/__tests__/tasks.test.js.map +1 -1
  22. package/dist/routes/__tests__/workspace-history.test.d.ts +2 -0
  23. package/dist/routes/__tests__/workspace-history.test.d.ts.map +1 -0
  24. package/dist/routes/__tests__/workspace-history.test.js +174 -0
  25. package/dist/routes/__tests__/workspace-history.test.js.map +1 -0
  26. package/dist/routes/sessions.d.ts.map +1 -1
  27. package/dist/routes/sessions.js +10 -0
  28. package/dist/routes/sessions.js.map +1 -1
  29. package/dist/routes/tasks.d.ts.map +1 -1
  30. package/dist/routes/tasks.js +8 -0
  31. package/dist/routes/tasks.js.map +1 -1
  32. package/dist/runtime/__tests__/acp-process-manager.test.js +65 -0
  33. package/dist/runtime/__tests__/acp-process-manager.test.js.map +1 -1
  34. package/dist/runtime/__tests__/cli-driver-lifecycle.test.js +84 -0
  35. package/dist/runtime/__tests__/cli-driver-lifecycle.test.js.map +1 -1
  36. package/dist/runtime/acp/agents/pi-coding-agent.d.ts.map +1 -1
  37. package/dist/runtime/acp/agents/pi-coding-agent.js +3 -0
  38. package/dist/runtime/acp/agents/pi-coding-agent.js.map +1 -1
  39. package/dist/runtime/cli-driver.js +11 -8
  40. package/dist/runtime/cli-driver.js.map +1 -1
  41. package/dist/services/__tests__/task.service.test.js +128 -13
  42. package/dist/services/__tests__/task.service.test.js.map +1 -1
  43. package/dist/services/__tests__/workspace.service.test.js +95 -5
  44. package/dist/services/__tests__/workspace.service.test.js.map +1 -1
  45. package/dist/services/message-delivery.service.d.ts +1 -0
  46. package/dist/services/message-delivery.service.d.ts.map +1 -1
  47. package/dist/services/session-manager.d.ts +4 -0
  48. package/dist/services/session-manager.d.ts.map +1 -1
  49. package/dist/services/session-manager.js +3 -1
  50. package/dist/services/session-manager.js.map +1 -1
  51. package/dist/services/session-resource-cleanup.d.ts +5 -0
  52. package/dist/services/session-resource-cleanup.d.ts.map +1 -1
  53. package/dist/services/session-resource-cleanup.js +7 -0
  54. package/dist/services/session-resource-cleanup.js.map +1 -1
  55. package/dist/services/task-cleanup.service.d.ts +2 -0
  56. package/dist/services/task-cleanup.service.d.ts.map +1 -1
  57. package/dist/services/task-cleanup.service.js +4 -0
  58. package/dist/services/task-cleanup.service.js.map +1 -1
  59. package/dist/services/task-display-state.d.ts +10 -0
  60. package/dist/services/task-display-state.d.ts.map +1 -0
  61. package/dist/services/task-display-state.js +45 -0
  62. package/dist/services/task-display-state.js.map +1 -0
  63. package/dist/services/task.service.d.ts +20 -1
  64. package/dist/services/task.service.d.ts.map +1 -1
  65. package/dist/services/task.service.js +134 -101
  66. package/dist/services/task.service.js.map +1 -1
  67. package/dist/services/workspace.service.d.ts +10 -7
  68. package/dist/services/workspace.service.d.ts.map +1 -1
  69. package/dist/services/workspace.service.js +162 -89
  70. package/dist/services/workspace.service.js.map +1 -1
  71. package/dist/web/assets/{AgentDemoPage-JXetlNBf.js → AgentDemoPage-CrkoVCOZ.js} +1 -1
  72. package/dist/web/assets/{AgentEnvironmentSettingsPage-CdYyUCwJ.js → AgentEnvironmentSettingsPage-BRihy3_Q.js} +1 -1
  73. package/dist/web/assets/{AttachmentPreview-DMS-PM-1.js → AttachmentPreview-B9z1Mxb-.js} +2 -2
  74. package/dist/web/assets/{BranchSelect-BAq4L2ZS.js → BranchSelect-Bo5uhKCt.js} +1 -1
  75. package/dist/web/assets/{BrandLogo--kWXXJtZ.js → BrandLogo-DEL42B23.js} +1 -1
  76. package/dist/web/assets/{ConversationPage-CvC4RyB5.js → ConversationPage-C46RuN9U.js} +1 -1
  77. package/dist/web/assets/{CreateTaskInput-DjVxCAfc.js → CreateTaskInput-4aHJpsfL.js} +1 -1
  78. package/dist/web/assets/{DemoPage-cDVTGOp8.js → DemoPage-CAZqNag-.js} +1 -1
  79. package/dist/web/assets/{DesignSystemPage-BI54IkKi.js → DesignSystemPage-CjCYC24B.js} +1 -1
  80. package/dist/web/assets/{ExecutionPermissionSelector-f1UYIm1z.js → ExecutionPermissionSelector-CJgc_EVo.js} +1 -1
  81. package/dist/web/assets/{GeneralSettingsPage-C0yto6C_.js → GeneralSettingsPage-DFT7Cubi.js} +1 -1
  82. package/dist/web/assets/{LoadingPreviewPage-BiJSaHUi.js → LoadingPreviewPage-CB4VDPAZ.js} +1 -1
  83. package/dist/web/assets/{McpSettingsPage-BbHwZtyj.js → McpSettingsPage-CgiyGvkH.js} +1 -1
  84. package/dist/web/assets/{MemberAvatar-BLezO3vS.js → MemberAvatar-Cfz8LU6k.js} +1 -1
  85. package/dist/web/assets/MobileTaskDetail-yZNyZMQt.js +3 -0
  86. package/dist/web/assets/{NotificationSettingsPage-CiKoL2Kv.js → NotificationSettingsPage-BSMJ45yx.js} +1 -1
  87. package/dist/web/assets/{ProfileSettingsPage-DCB48cPS.js → ProfileSettingsPage-BwNThOnH.js} +1 -1
  88. package/dist/web/assets/ProjectKanbanPage-DtZW0bOh.js +14 -0
  89. package/dist/web/assets/{ProjectSettingsPage-COvIVq1h.js → ProjectSettingsPage-CMBMkbgI.js} +1 -1
  90. package/dist/web/assets/{ProviderSettingsPage-CPuJcZDg.js → ProviderSettingsPage-D759BSRa.js} +2 -2
  91. package/dist/web/assets/{SettingsMasterDetail-Cv7YaRJB.js → SettingsMasterDetail-DpYUTM-Q.js} +1 -1
  92. package/dist/web/assets/TaskDetail-rRHGOvSw.js +1 -0
  93. package/dist/web/assets/{TaskHandoffPanel-CxH3Mgyd.js → TaskHandoffPanel-DBcC1xQW.js} +24 -24
  94. package/dist/web/assets/{TeamSettingsPage-D-XDefNd.js → TeamSettingsPage-BszQfKp0.js} +1 -1
  95. package/dist/web/assets/{TranslationSettingsPage-BPHI-SZW.js → TranslationSettingsPage-lLaxWCy3.js} +1 -1
  96. package/dist/web/assets/{arc-CC81aLuf.js → arc-DtgXFw4D.js} +1 -1
  97. package/dist/web/assets/{architectureDiagram-3BPJPVTR-DL08XGaN.js → architectureDiagram-3BPJPVTR-B3p3EMX1.js} +1 -1
  98. package/dist/web/assets/{at-sign-DYPIlD6D.js → at-sign-B8rXgKEE.js} +1 -1
  99. package/dist/web/assets/{blockDiagram-GPEHLZMM-B4IW5WxI.js → blockDiagram-GPEHLZMM-BmekCfr0.js} +1 -1
  100. package/dist/web/assets/{c4Diagram-AAUBKEIU-Cj4d_FqK.js → c4Diagram-AAUBKEIU-CF6hJhuL.js} +1 -1
  101. package/dist/web/assets/channel-BdK_fAel.js +1 -0
  102. package/dist/web/assets/check-DwK55QS2.js +1 -0
  103. package/dist/web/assets/{chevron-down-DNhYsNAt.js → chevron-down-Dftc5hr4.js} +1 -1
  104. package/dist/web/assets/{chevron-up-CjrLieBR.js → chevron-up-CKRxN6zX.js} +1 -1
  105. package/dist/web/assets/{chip-Cf92J-pQ.js → chip-ZTBHcXU2.js} +1 -1
  106. package/dist/web/assets/{chunk-2J33WTMH-DeCj8QSD.js → chunk-2J33WTMH-Bjelop4M.js} +1 -1
  107. package/dist/web/assets/{chunk-4BX2VUAB-k-6rzQmQ.js → chunk-4BX2VUAB-B1rJPbL6.js} +1 -1
  108. package/dist/web/assets/{chunk-55IACEB6-qMTCQ5bX.js → chunk-55IACEB6-B5qfH7Gj.js} +1 -1
  109. package/dist/web/assets/{chunk-727SXJPM-CMnu18d1.js → chunk-727SXJPM-ClFMbgrH.js} +1 -1
  110. package/dist/web/assets/{chunk-AQP2D5EJ-C0mFbUMn.js → chunk-AQP2D5EJ-BMFjTO7B.js} +1 -1
  111. package/dist/web/assets/{chunk-FMBD7UC4-u6-_M137.js → chunk-FMBD7UC4-Pr1oOFfR.js} +1 -1
  112. package/dist/web/assets/{chunk-ND2GUHAM-DHrIE_8H.js → chunk-ND2GUHAM-BPm4TRpO.js} +1 -1
  113. package/dist/web/assets/{chunk-QZHKN3VN-aTyC0wZq.js → chunk-QZHKN3VN-DCPA_U0M.js} +1 -1
  114. package/dist/web/assets/classDiagram-4FO5ZUOK-CFzCq0ml.js +1 -0
  115. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CFzCq0ml.js +1 -0
  116. package/dist/web/assets/{code-block-OCS4YCEC-CBIOQOMH.js → code-block-OCS4YCEC-Cx53F4d7.js} +1 -1
  117. package/dist/web/assets/{confirm-dialog-DWeBZLJW.js → confirm-dialog-C_j-w4TS.js} +1 -1
  118. package/dist/web/assets/{content-JM9E1MeD.js → content-DeIfej_n.js} +2 -2
  119. package/dist/web/assets/{copy-D0gl9kF8.js → copy-B-BaLIlh.js} +1 -1
  120. package/dist/web/assets/{cose-bilkent-S5V4N54A-xLyliSgU.js → cose-bilkent-S5V4N54A-gIys-0yu.js} +1 -1
  121. package/dist/web/assets/{cssMode-DO5UnQ64.js → cssMode-xF0bjbbU.js} +1 -1
  122. package/dist/web/assets/{dagre-BM42HDAG-CbNpoO2d.js → dagre-BM42HDAG-Bwc3Ntc-.js} +1 -1
  123. package/dist/web/assets/{diagram-2AECGRRQ-CG3hKxAX.js → diagram-2AECGRRQ-zkydBsMT.js} +1 -1
  124. package/dist/web/assets/{diagram-5GNKFQAL-mQu9M28s.js → diagram-5GNKFQAL-p9As3QtI.js} +1 -1
  125. package/dist/web/assets/{diagram-KO2AKTUF-BSeEp_Uw.js → diagram-KO2AKTUF-N_pUU-iU.js} +1 -1
  126. package/dist/web/assets/{diagram-LMA3HP47-D6yRdao-.js → diagram-LMA3HP47-CA2rl4Gq.js} +1 -1
  127. package/dist/web/assets/{diagram-OG6HWLK6-BUBUW9wD.js → diagram-OG6HWLK6-BoXxBlUC.js} +1 -1
  128. package/dist/web/assets/{dialog-D1lkhqVL.js → dialog-CnjWIdWp.js} +1 -1
  129. package/dist/web/assets/{erDiagram-TEJ5UH35-BQSZgRqq.js → erDiagram-TEJ5UH35-CVBHQTCN.js} +1 -1
  130. package/dist/web/assets/{file-BijjwxRR.js → file-jMLGlXos.js} +1 -1
  131. package/dist/web/assets/{flowDiagram-I6XJVG4X-D-eqyr5Y.js → flowDiagram-I6XJVG4X-kK7iKiAv.js} +1 -1
  132. package/dist/web/assets/{folder-picker-Czxm0_S9.js → folder-picker-CR8LiSQf.js} +1 -1
  133. package/dist/web/assets/{freemarker2-B4RvEa_U.js → freemarker2-CTMcTiBd.js} +1 -1
  134. package/dist/web/assets/{ganttDiagram-6RSMTGT7-BWGkCt_x.js → ganttDiagram-6RSMTGT7-CJVvLTkW.js} +1 -1
  135. package/dist/web/assets/{gitGraphDiagram-PVQCEYII-DGVc49pR.js → gitGraphDiagram-PVQCEYII-D8uj_SCw.js} +1 -1
  136. package/dist/web/assets/{globe-Ce01-45x.js → globe-FFVKce9-.js} +1 -1
  137. package/dist/web/assets/{handlebars-oyT7drqS.js → handlebars-NHxbmOs3.js} +1 -1
  138. package/dist/web/assets/{html-CxxWf2Qk.js → html-oFqzz32q.js} +1 -1
  139. package/dist/web/assets/{htmlMode-RfAHh5Jj.js → htmlMode-sgeetciK.js} +1 -1
  140. package/dist/web/assets/index-408ws6FY.css +1 -0
  141. package/dist/web/assets/index-9KNEuwGB.js +122 -0
  142. package/dist/web/assets/{index-hpHE1jXY.js → index-BzqyZD7L.js} +1 -1
  143. package/dist/web/assets/{index-DWrSDMX2.js → index-C5lNOKJb.js} +1 -1
  144. package/dist/web/assets/{index-Disv1kQS.js → index-C9vIrQ3Q.js} +1 -1
  145. package/dist/web/assets/{index-Pt4TsHjm.js → index-Cm_7q6ju.js} +1 -1
  146. package/dist/web/assets/{index-Dh-tgeaL.js → index-CwfWGzxi.js} +4 -4
  147. package/dist/web/assets/{index-DyJfPc4O.js → index-D8TNxwWk.js} +1 -1
  148. package/dist/web/assets/{index-T38iVLEb.js → index-biTPUXAe.js} +1 -1
  149. package/dist/web/assets/{index-BMZFF1UJ.js → index-gqrRO6ZJ.js} +1 -1
  150. package/dist/web/assets/{infoDiagram-5YYISTIA-DLPs3dV_.js → infoDiagram-5YYISTIA-CExRZE3Y.js} +1 -1
  151. package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-d_OrnwDY.js → ishikawaDiagram-YF4QCWOH-CsqM2X33.js} +1 -1
  152. package/dist/web/assets/javascript-COt-61wn.js +1 -0
  153. package/dist/web/assets/{journeyDiagram-JHISSGLW-EtU1st_0.js → journeyDiagram-JHISSGLW-DX9OMhPD.js} +1 -1
  154. package/dist/web/assets/{jsonMode-Bqh5vIxx.js → jsonMode-VQg5cpLV.js} +1 -1
  155. package/dist/web/assets/{kanban-definition-UN3LZRKU-ZWzUnsFK.js → kanban-definition-UN3LZRKU-CWHMx6vc.js} +1 -1
  156. package/dist/web/assets/{kbd-IjDGsZ2B.js → kbd-GGofKfKu.js} +1 -1
  157. package/dist/web/assets/{key-round-CbnAuUxp.js → key-round-p-Fpykfj.js} +1 -1
  158. package/dist/web/assets/{layers-Pdy9vZ6K.js → layers-pbPa_eZq.js} +1 -1
  159. package/dist/web/assets/{linear-D7n23wcA.js → linear-9VwGhaEA.js} +1 -1
  160. package/dist/web/assets/{link-Bl1ZbjFh.js → link-CG4UwIS1.js} +1 -1
  161. package/dist/web/assets/{liquid-Ds47iVLN.js → liquid-SJInUaiB.js} +1 -1
  162. package/dist/web/assets/{lspLanguageFeatures-Dcch3bsp.js → lspLanguageFeatures-DJOdVyBc.js} +1 -1
  163. package/dist/web/assets/{mdx-CM7ky-2B.js → mdx-CToYr-3b.js} +1 -1
  164. package/dist/web/assets/{menu-DubntFHq.js → menu-BFQ1mKU7.js} +1 -1
  165. package/dist/web/assets/{mermaid-NOHMQCX5-nBsnjgeU.js → mermaid-NOHMQCX5-BOViobLk.js} +58 -58
  166. package/dist/web/assets/{message-square-BE-pW0m_.js → message-square-BYZsUsLz.js} +1 -1
  167. package/dist/web/assets/{mindmap-definition-RKZ34NQL-ClHORNTt.js → mindmap-definition-RKZ34NQL-BTcDnn6X.js} +1 -1
  168. package/dist/web/assets/{modal-CHLtZWvx.js → modal-BT_7Lhtw.js} +1 -1
  169. package/dist/web/assets/{monaco-BbAmalE2.js → monaco-DUftz48_.js} +3 -3
  170. package/dist/web/assets/{nav-row-DH7rNq1V.js → nav-row-BjDckaPC.js} +1 -1
  171. package/dist/web/assets/{paperclip-YP3Bk1lI.js → paperclip-CFAH5neE.js} +1 -1
  172. package/dist/web/assets/{pencil-BFDuhbtW.js → pencil-Bg9TWm_-.js} +1 -1
  173. package/dist/web/assets/{people-DEeNaaLt.js → people-BIQwajM2.js} +1 -1
  174. package/dist/web/assets/{pieDiagram-4H26LBE5-BUOaKIyP.js → pieDiagram-4H26LBE5-CRjqdnP8.js} +1 -1
  175. package/dist/web/assets/{popover-CUmBEXxL.js → popover-DpYhrrCE.js} +1 -1
  176. package/dist/web/assets/{python-BODTtU6m.js → python-DbmUucgH.js} +1 -1
  177. package/dist/web/assets/{quadrantDiagram-W4KKPZXB-Caezg-U2.js → quadrantDiagram-W4KKPZXB-uvA8TYC6.js} +1 -1
  178. package/dist/web/assets/{razor-CHm8DY1p.js → razor-B0AJhw7W.js} +1 -1
  179. package/dist/web/assets/{requirementDiagram-4Y6WPE33-BtdP3Ka6.js → requirementDiagram-4Y6WPE33-BWLugaKX.js} +1 -1
  180. package/dist/web/assets/{sankeyDiagram-5OEKKPKP-Bv74oA-n.js → sankeyDiagram-5OEKKPKP-DHrbZZv8.js} +1 -1
  181. package/dist/web/assets/{search-ClmOQd4H.js → search-BH8nze-X.js} +1 -1
  182. package/dist/web/assets/{select-BB7QG08o.js → select-BegY9RkP.js} +1 -1
  183. package/dist/web/assets/{select-CYtYPr-c.js → select-EcEr5QSS.js} +1 -1
  184. package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DuNPl-dg.js → sequenceDiagram-3UESZ5HK-CKwEKcTn.js} +1 -1
  185. package/dist/web/assets/{server-bEB_DY55.js → server-BxEUjx0l.js} +1 -1
  186. package/dist/web/assets/{stateDiagram-AJRCARHV-B72HAgBJ.js → stateDiagram-AJRCARHV-vhgmSpa9.js} +1 -1
  187. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-C0z5OTY4.js +1 -0
  188. package/dist/web/assets/{textarea-BqYPvoO-.js → textarea-CvoGGROs.js} +1 -1
  189. package/dist/web/assets/{timeline-definition-PNZ67QCA-DTmHUgmQ.js → timeline-definition-PNZ67QCA-bSDKcwDZ.js} +1 -1
  190. package/dist/web/assets/{toggles-a5fkwT_D.js → toggles-CEDUD08u.js} +1 -1
  191. package/dist/web/assets/{tooltip-DuyJMci9.js → tooltip-CKaUbVZ7.js} +1 -1
  192. package/dist/web/assets/{track-DCjyrv3n.js → track-1qw2cvTy.js} +1 -1
  193. package/dist/web/assets/{trash-2-CIyBqaVy.js → trash-2-ChiXon87.js} +1 -1
  194. package/dist/web/assets/{tsMode-C1UXAkMh.js → tsMode-bnV8W2Ru.js} +1 -1
  195. package/dist/web/assets/{typescript-Biht2wHb.js → typescript-d1MHIeEx.js} +1 -1
  196. package/dist/web/assets/{upload-D05XS5-G.js → upload-CQ-cQaOz.js} +1 -1
  197. package/dist/web/assets/{use-profiles-CrWTyz1G.js → use-profiles-CJzoqarX.js} +1 -1
  198. package/dist/web/assets/{use-providers-Dv1Nk6s7.js → use-providers-S29TCag2.js} +1 -1
  199. package/dist/web/assets/{use-translation-settings-CcUnipVO.js → use-translation-settings-DifNJaCu.js} +1 -1
  200. package/dist/web/assets/{useNormalizedLogs-D9W1cT4R.js → useNormalizedLogs-BVdY8qDk.js} +1 -1
  201. package/dist/web/assets/{useTokenUsage-CZ5mDshD.js → useTokenUsage-nh_KDA3q.js} +1 -1
  202. package/dist/web/assets/{vennDiagram-CIIHVFJN-ByoNydXe.js → vennDiagram-CIIHVFJN-D7QbDYzC.js} +1 -1
  203. package/dist/web/assets/{wardley-L42UT6IY-BqdMkOLl.js → wardley-L42UT6IY-C9aHlNVa.js} +1 -1
  204. package/dist/web/assets/{wardleyDiagram-YWT4CUSO-AO22HrEF.js → wardleyDiagram-YWT4CUSO-CZhubDRC.js} +1 -1
  205. package/dist/web/assets/{xml-NLGqNFDv.js → xml-DAKKxHAr.js} +1 -1
  206. package/dist/web/assets/{xychartDiagram-2RQKCTM6-vzPgjgqW.js → xychartDiagram-2RQKCTM6-BgDlpFBh.js} +1 -1
  207. package/dist/web/assets/{yaml-AWlGS_Ig.js → yaml-D_hSVVz0.js} +1 -1
  208. package/dist/web/index.html +2 -2
  209. package/node_modules/@agent-tower/shared/dist/index.d.ts +1 -0
  210. package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -1
  211. package/node_modules/@agent-tower/shared/dist/index.js +1 -0
  212. package/node_modules/@agent-tower/shared/dist/index.js.map +1 -1
  213. package/node_modules/@agent-tower/shared/dist/task-hierarchy.d.ts +17 -0
  214. package/node_modules/@agent-tower/shared/dist/task-hierarchy.d.ts.map +1 -0
  215. package/node_modules/@agent-tower/shared/dist/task-hierarchy.js +12 -0
  216. package/node_modules/@agent-tower/shared/dist/task-hierarchy.js.map +1 -0
  217. package/node_modules/@agent-tower/shared/dist/types.d.ts +20 -4
  218. package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
  219. package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
  220. package/package.json +1 -1
  221. package/prisma/migrations/20261027000000_preserve_workspace_history/migration.sql +2 -0
  222. package/prisma/schema.prisma +2 -0
  223. package/dist/web/assets/MobileTaskDetail-M_Kke9rL.js +0 -3
  224. package/dist/web/assets/ProjectKanbanPage-soDqevjQ.js +0 -12
  225. package/dist/web/assets/TaskDetail-CqhPxvg3.js +0 -1
  226. package/dist/web/assets/channel-CUa8oyzC.js +0 -1
  227. package/dist/web/assets/check-DaZqOL8l.js +0 -1
  228. package/dist/web/assets/classDiagram-4FO5ZUOK-BAx111NO.js +0 -1
  229. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-BAx111NO.js +0 -1
  230. package/dist/web/assets/index-BN53vGxp.css +0 -1
  231. package/dist/web/assets/index-Cc3qXMhU.js +0 -122
  232. package/dist/web/assets/javascript-BNXtViSL.js +0 -1
  233. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-Bu3l_CgB.js +0 -1
@@ -381,6 +381,37 @@ describe('WorkspaceService TeamRun workspace lifecycle', () => {
381
381
  await expect(service.merge(workspace.id)).rejects.toMatchObject({ code: 'PARENT_WORKSPACE_HAS_ACTIVE_SESSION' });
382
382
  expect(mergeWorktreeMock).not.toHaveBeenCalled();
383
383
  });
384
+ it.each([undefined, true])('keeps target background services running when merging with stopActiveServices=%s', async (stopActiveServices) => {
385
+ const { project, task: parent } = await createTask('Parent with background services');
386
+ const parentWorkspace = await prisma.workspace.create({ data: {
387
+ taskId: parent.id, branchName: 'at/parent', baseBranch: 'main', worktreePath: '/parent',
388
+ } });
389
+ const child = await prisma.task.create({ data: {
390
+ projectId: project.id, title: 'Child', parentTaskId: parent.id, status: 'IN_REVIEW',
391
+ } });
392
+ const childWorkspace = await prisma.workspace.create({ data: {
393
+ taskId: child.id, branchName: 'at/child', baseBranch: 'at/parent', worktreePath: '/child',
394
+ } });
395
+ const background = await prisma.workspaceBackgroundService.create({ data: {
396
+ workspaceId: parentWorkspace.id,
397
+ name: 'web',
398
+ command: 'node',
399
+ desiredState: 'RUNNING',
400
+ runtimeState: 'RUNNING',
401
+ runtimeInstanceId: 'runtime-parent-web',
402
+ pid: 4321,
403
+ } });
404
+ const stopAllForWorkspace = vi.fn().mockRejectedValue(new Error('target service must not be stopped'));
405
+ const lifecycleService = new WorkspaceService(new TeamLockService(), { stopAllForWorkspace });
406
+ await expect(lifecycleService.merge(childWorkspace.id, { stopActiveServices }))
407
+ .resolves.toBe('root-merge-sha');
408
+ expect(mergeWorktreeMock).toHaveBeenCalledWith('/child', 'at/parent', expect.objectContaining({ targetWorktreePath: '/parent' }));
409
+ expect(stopAllForWorkspace).not.toHaveBeenCalled();
410
+ await expect(prisma.workspaceBackgroundService.findUnique({ where: { id: background.id } }))
411
+ .resolves.toEqual(background);
412
+ await expect(prisma.workspace.findUnique({ where: { id: parentWorkspace.id } }))
413
+ .resolves.toMatchObject({ status: 'ACTIVE' });
414
+ });
384
415
  it('retains a merged parent branch and its ownership until its subtasks no longer depend on it', async () => {
385
416
  const { project, task: parent } = await createTask('Retain parent branch');
386
417
  await prisma.task.update({ where: { id: parent.id }, data: { status: 'DONE' } });
@@ -393,6 +424,31 @@ describe('WorkspaceService TeamRun workspace lifecycle', () => {
393
424
  await service.cleanup();
394
425
  expect(deleteBranchIfSafeMock).toHaveBeenCalledWith('at/parent', expect.anything());
395
426
  });
427
+ it('retains an ancestor branch referenced only by a grandchild', async () => {
428
+ const { project, task: parent } = await createTask('Grandchild branch dependency');
429
+ await prisma.task.update({ where: { id: parent.id }, data: { status: 'DONE' } });
430
+ const workspace = await prisma.workspace.create({ data: { taskId: parent.id, branchName: 'at/root', baseBranch: 'main', worktreePath: '/root', status: 'MERGED' } });
431
+ const child = await prisma.task.create({ data: { projectId: project.id, title: 'Child', parentTaskId: parent.id, baseBranch: 'main' } });
432
+ const grandchild = await prisma.task.create({ data: { projectId: project.id, title: 'Grandchild', parentTaskId: child.id, baseBranch: 'at/root' } });
433
+ await service.cleanup();
434
+ expect(deleteBranchIfSafeMock).not.toHaveBeenCalled();
435
+ expect(await prisma.workspace.findUnique({ where: { id: workspace.id } })).not.toBeNull();
436
+ await prisma.task.update({ where: { id: grandchild.id }, data: { deletedAt: new Date() } });
437
+ await service.cleanup();
438
+ expect(deleteBranchIfSafeMock).toHaveBeenCalledWith('at/root', expect.anything());
439
+ });
440
+ it('merges a grandchild into its immediate parent without completing either ancestor', async () => {
441
+ const { project, task: parent } = await createTask('Grandchild merge');
442
+ const child = await prisma.task.create({ data: { projectId: project.id, title: 'Child', parentTaskId: parent.id } });
443
+ await prisma.workspace.create({ data: { taskId: child.id, branchName: 'at/child', baseBranch: 'main', worktreePath: '/child' } });
444
+ const grandchild = await prisma.task.create({ data: { projectId: project.id, title: 'Grandchild', parentTaskId: child.id, status: 'IN_REVIEW' } });
445
+ const workspace = await prisma.workspace.create({ data: { taskId: grandchild.id, branchName: 'at/grandchild', baseBranch: 'at/child', worktreePath: '/grandchild' } });
446
+ await service.merge(workspace.id);
447
+ expect(mergeWorktreeMock).toHaveBeenCalledWith('/grandchild', 'at/child', expect.objectContaining({ targetWorktreePath: '/child' }));
448
+ expect((await prisma.task.findUniqueOrThrow({ where: { id: grandchild.id } })).status).toBe('DONE');
449
+ expect((await prisma.task.findUniqueOrThrow({ where: { id: child.id } })).status).toBe('TODO');
450
+ expect((await prisma.task.findUniqueOrThrow({ where: { id: parent.id } })).status).toBe('TODO');
451
+ });
396
452
  it('creates a main-directory workspace without creating a git worktree', async () => {
397
453
  const { project, task } = await createTask('main directory workspace task');
398
454
  const workspace = await service.create(task.id, {
@@ -2281,7 +2337,7 @@ describe('WorkspaceService TeamRun workspace lifecycle', () => {
2281
2337
  await expect(lockedService.merge(workspace.id)).rejects.toThrow('git merge failed');
2282
2338
  expect(lockService.listLocks()).toEqual([]);
2283
2339
  });
2284
- it('cleans up stale managed worktree records and deletes their branches', async () => {
2340
+ it('reclaims stale managed worktrees and branches while retaining history records', async () => {
2285
2341
  const { project, task } = await createTask('cleanup stale workspace task');
2286
2342
  await prisma.task.update({
2287
2343
  where: { id: task.id },
@@ -2306,7 +2362,11 @@ describe('WorkspaceService TeamRun workspace lifecycle', () => {
2306
2362
  expect(deleteBranchIfSafeMock).toHaveBeenCalledWith(workspace.branchName, {
2307
2363
  protectedBranches: [project.mainBranch, workspace.baseBranch],
2308
2364
  });
2309
- await expect(prisma.workspace.findUnique({ where: { id: workspace.id } })).resolves.toBeNull();
2365
+ await expect(prisma.workspace.findUnique({ where: { id: workspace.id } })).resolves.toMatchObject({
2366
+ status: 'MERGED', worktreePath: '', workingDir: '', cleanedAt: expect.any(Date),
2367
+ });
2368
+ await expect(service.cleanup()).resolves.toBe(0);
2369
+ expect(removeWorktreeMock).toHaveBeenCalledTimes(1);
2310
2370
  });
2311
2371
  it('retries periodic cleanup only after completed session trees are confirmed stopped', async () => {
2312
2372
  const { task } = await createTask('periodic idle ACP cleanup');
@@ -2329,7 +2389,10 @@ describe('WorkspaceService TeamRun workspace lifecycle', () => {
2329
2389
  isRuntimeCleanupConfirmed.mockResolvedValue(true);
2330
2390
  await expect(service.cleanup()).resolves.toBe(1);
2331
2391
  expect(removeWorktreeMock).toHaveBeenCalledWith(workspace.worktreePath);
2332
- expect(await prisma.workspace.findUnique({ where: { id: workspace.id } })).toBeNull();
2392
+ expect(await prisma.workspace.findUnique({ where: { id: workspace.id } })).toMatchObject({
2393
+ cleanedAt: expect.any(Date), worktreePath: '',
2394
+ });
2395
+ expect(await prisma.session.count({ where: { workspaceId: workspace.id } })).toBe(1);
2333
2396
  });
2334
2397
  it('stops background services before cleanup removes a workspace directory', async () => {
2335
2398
  const { project, task } = await createTask('cleanup background service task');
@@ -2356,7 +2419,7 @@ describe('WorkspaceService TeamRun workspace lifecycle', () => {
2356
2419
  expect(backgroundService.releaseLogsForWorkspace).toHaveBeenCalledWith(workspace.id);
2357
2420
  expect(removeWorktreeMock).toHaveBeenCalledWith(workspace.worktreePath);
2358
2421
  });
2359
- it('cleans up stale managed TeamRun nested worktree records', async () => {
2422
+ it('reclaims stale managed TeamRun worktrees while retaining workspace identity', async () => {
2360
2423
  const { project, task, teamRun } = await createTeamRunWithMember();
2361
2424
  await prisma.task.update({
2362
2425
  where: { id: task.id },
@@ -2381,7 +2444,9 @@ describe('WorkspaceService TeamRun workspace lifecycle', () => {
2381
2444
  expect(deleteBranchIfSafeMock).toHaveBeenCalledWith(workspace.branchName, {
2382
2445
  protectedBranches: [project.mainBranch, workspace.baseBranch],
2383
2446
  });
2384
- await expect(prisma.workspace.findUnique({ where: { id: workspace.id } })).resolves.toBeNull();
2447
+ await expect(prisma.workspace.findUnique({ where: { id: workspace.id } })).resolves.toMatchObject({
2448
+ status: 'MERGED', worktreePath: '', workingDir: '', cleanedAt: expect.any(Date),
2449
+ });
2385
2450
  });
2386
2451
  it('keeps non-managed unregistered worktree records for retry', async () => {
2387
2452
  const { task } = await createTask('cleanup unmanaged workspace task');
@@ -2453,5 +2518,30 @@ describe('WorkspaceService TeamRun workspace lifecycle', () => {
2453
2518
  expect(cleaned).toBe(0);
2454
2519
  expect(removeWorktreeMock).not.toHaveBeenCalled();
2455
2520
  });
2521
+ it.each(['failed', 'checked_out'])('retries %s branch cleanup without removing history or the directory twice', async (status) => {
2522
+ const { task } = await createTask('pending branch cleanup');
2523
+ await prisma.task.update({ where: { id: task.id }, data: { status: 'DONE' } });
2524
+ const workspace = await prisma.workspace.create({ data: {
2525
+ taskId: task.id, branchName: 'at/pending-branch', worktreePath: '/pending-branch', status: 'MERGED',
2526
+ sessions: { create: { agentType: 'CODEX', prompt: 'history', status: 'COMPLETED', logSnapshot: '{"entries":[]}' } },
2527
+ }, include: { sessions: true } });
2528
+ Object.assign(service, { sessionService: { stop: vi.fn(async () => workspace.sessions[0]), isRuntimeCleanupConfirmed: vi.fn(async () => true) } });
2529
+ deleteBranchIfSafeMock.mockResolvedValueOnce({ status, branchName: workspace.branchName });
2530
+ await service.cleanup();
2531
+ expect(await prisma.workspace.findUnique({ where: { id: workspace.id } })).toMatchObject({ worktreePath: '', cleanedAt: null });
2532
+ await service.cleanup();
2533
+ expect(await prisma.workspace.findUnique({ where: { id: workspace.id } })).toMatchObject({ cleanedAt: expect.any(Date) });
2534
+ expect((await prisma.session.findUniqueOrThrow({ where: { id: workspace.sessions[0].id } })).logSnapshot).toBe('{"entries":[]}');
2535
+ expect(removeWorktreeMock).toHaveBeenCalledTimes(1);
2536
+ expect(deleteBranchIfSafeMock).toHaveBeenCalledTimes(2);
2537
+ });
2538
+ it('serializes concurrent cleanups before releasing the same workspace resources', async () => {
2539
+ const { task } = await createTask('concurrent cleanup');
2540
+ await prisma.task.update({ where: { id: task.id }, data: { status: 'DONE' } });
2541
+ await prisma.workspace.create({ data: { taskId: task.id, branchName: 'at/concurrent', worktreePath: '/concurrent', status: 'MERGED' } });
2542
+ const results = await Promise.all([service.cleanup(), service.cleanup()]);
2543
+ expect(results.reduce((sum, count) => sum + count, 0)).toBe(1);
2544
+ expect(removeWorktreeMock).toHaveBeenCalledTimes(1);
2545
+ });
2456
2546
  });
2457
2547
  //# sourceMappingURL=workspace.service.test.js.map