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.
- package/dist/executors/__tests__/codex-mcp-windows.test.d.ts +2 -0
- package/dist/executors/__tests__/codex-mcp-windows.test.d.ts.map +1 -0
- package/dist/executors/__tests__/codex-mcp-windows.test.js +128 -0
- package/dist/executors/__tests__/codex-mcp-windows.test.js.map +1 -0
- package/dist/executors/__tests__/codex.executor.test.js +394 -1
- package/dist/executors/__tests__/codex.executor.test.js.map +1 -1
- package/dist/executors/codex.executor.d.ts +6 -6
- package/dist/executors/codex.executor.d.ts.map +1 -1
- package/dist/executors/codex.executor.js +118 -32
- package/dist/executors/codex.executor.js.map +1 -1
- package/dist/mcp/tools/tasks.js +3 -3
- package/dist/mcp/tools/tasks.js.map +1 -1
- package/dist/mcp/types.js +2 -2
- package/dist/mcp/types.js.map +1 -1
- package/dist/prompts/task-handoff.d.ts.map +1 -1
- package/dist/prompts/task-handoff.js +2 -1
- package/dist/prompts/task-handoff.js.map +1 -1
- package/dist/routes/__tests__/sessions-runtime.test.js +2 -0
- package/dist/routes/__tests__/sessions-runtime.test.js.map +1 -1
- package/dist/routes/__tests__/tasks.test.js +41 -0
- package/dist/routes/__tests__/tasks.test.js.map +1 -1
- package/dist/routes/__tests__/workspace-history.test.d.ts +2 -0
- package/dist/routes/__tests__/workspace-history.test.d.ts.map +1 -0
- package/dist/routes/__tests__/workspace-history.test.js +174 -0
- package/dist/routes/__tests__/workspace-history.test.js.map +1 -0
- package/dist/routes/sessions.d.ts.map +1 -1
- package/dist/routes/sessions.js +10 -0
- package/dist/routes/sessions.js.map +1 -1
- package/dist/routes/tasks.d.ts.map +1 -1
- package/dist/routes/tasks.js +8 -0
- package/dist/routes/tasks.js.map +1 -1
- package/dist/runtime/__tests__/acp-process-manager.test.js +65 -0
- package/dist/runtime/__tests__/acp-process-manager.test.js.map +1 -1
- package/dist/runtime/__tests__/cli-driver-lifecycle.test.js +84 -0
- package/dist/runtime/__tests__/cli-driver-lifecycle.test.js.map +1 -1
- package/dist/runtime/acp/agents/pi-coding-agent.d.ts.map +1 -1
- package/dist/runtime/acp/agents/pi-coding-agent.js +3 -0
- package/dist/runtime/acp/agents/pi-coding-agent.js.map +1 -1
- package/dist/runtime/cli-driver.js +11 -8
- package/dist/runtime/cli-driver.js.map +1 -1
- package/dist/services/__tests__/task.service.test.js +128 -13
- package/dist/services/__tests__/task.service.test.js.map +1 -1
- package/dist/services/__tests__/workspace.service.test.js +95 -5
- package/dist/services/__tests__/workspace.service.test.js.map +1 -1
- package/dist/services/message-delivery.service.d.ts +1 -0
- package/dist/services/message-delivery.service.d.ts.map +1 -1
- package/dist/services/session-manager.d.ts +4 -0
- package/dist/services/session-manager.d.ts.map +1 -1
- package/dist/services/session-manager.js +3 -1
- package/dist/services/session-manager.js.map +1 -1
- package/dist/services/session-resource-cleanup.d.ts +5 -0
- package/dist/services/session-resource-cleanup.d.ts.map +1 -1
- package/dist/services/session-resource-cleanup.js +7 -0
- package/dist/services/session-resource-cleanup.js.map +1 -1
- package/dist/services/task-cleanup.service.d.ts +2 -0
- package/dist/services/task-cleanup.service.d.ts.map +1 -1
- package/dist/services/task-cleanup.service.js +4 -0
- package/dist/services/task-cleanup.service.js.map +1 -1
- package/dist/services/task-display-state.d.ts +10 -0
- package/dist/services/task-display-state.d.ts.map +1 -0
- package/dist/services/task-display-state.js +45 -0
- package/dist/services/task-display-state.js.map +1 -0
- package/dist/services/task.service.d.ts +20 -1
- package/dist/services/task.service.d.ts.map +1 -1
- package/dist/services/task.service.js +134 -101
- package/dist/services/task.service.js.map +1 -1
- package/dist/services/workspace.service.d.ts +10 -7
- package/dist/services/workspace.service.d.ts.map +1 -1
- package/dist/services/workspace.service.js +162 -89
- package/dist/services/workspace.service.js.map +1 -1
- package/dist/web/assets/{AgentDemoPage-JXetlNBf.js → AgentDemoPage-CrkoVCOZ.js} +1 -1
- package/dist/web/assets/{AgentEnvironmentSettingsPage-CdYyUCwJ.js → AgentEnvironmentSettingsPage-BRihy3_Q.js} +1 -1
- package/dist/web/assets/{AttachmentPreview-DMS-PM-1.js → AttachmentPreview-B9z1Mxb-.js} +2 -2
- package/dist/web/assets/{BranchSelect-BAq4L2ZS.js → BranchSelect-Bo5uhKCt.js} +1 -1
- package/dist/web/assets/{BrandLogo--kWXXJtZ.js → BrandLogo-DEL42B23.js} +1 -1
- package/dist/web/assets/{ConversationPage-CvC4RyB5.js → ConversationPage-C46RuN9U.js} +1 -1
- package/dist/web/assets/{CreateTaskInput-DjVxCAfc.js → CreateTaskInput-4aHJpsfL.js} +1 -1
- package/dist/web/assets/{DemoPage-cDVTGOp8.js → DemoPage-CAZqNag-.js} +1 -1
- package/dist/web/assets/{DesignSystemPage-BI54IkKi.js → DesignSystemPage-CjCYC24B.js} +1 -1
- package/dist/web/assets/{ExecutionPermissionSelector-f1UYIm1z.js → ExecutionPermissionSelector-CJgc_EVo.js} +1 -1
- package/dist/web/assets/{GeneralSettingsPage-C0yto6C_.js → GeneralSettingsPage-DFT7Cubi.js} +1 -1
- package/dist/web/assets/{LoadingPreviewPage-BiJSaHUi.js → LoadingPreviewPage-CB4VDPAZ.js} +1 -1
- package/dist/web/assets/{McpSettingsPage-BbHwZtyj.js → McpSettingsPage-CgiyGvkH.js} +1 -1
- package/dist/web/assets/{MemberAvatar-BLezO3vS.js → MemberAvatar-Cfz8LU6k.js} +1 -1
- package/dist/web/assets/MobileTaskDetail-yZNyZMQt.js +3 -0
- package/dist/web/assets/{NotificationSettingsPage-CiKoL2Kv.js → NotificationSettingsPage-BSMJ45yx.js} +1 -1
- package/dist/web/assets/{ProfileSettingsPage-DCB48cPS.js → ProfileSettingsPage-BwNThOnH.js} +1 -1
- package/dist/web/assets/ProjectKanbanPage-DtZW0bOh.js +14 -0
- package/dist/web/assets/{ProjectSettingsPage-COvIVq1h.js → ProjectSettingsPage-CMBMkbgI.js} +1 -1
- package/dist/web/assets/{ProviderSettingsPage-CPuJcZDg.js → ProviderSettingsPage-D759BSRa.js} +2 -2
- package/dist/web/assets/{SettingsMasterDetail-Cv7YaRJB.js → SettingsMasterDetail-DpYUTM-Q.js} +1 -1
- package/dist/web/assets/TaskDetail-rRHGOvSw.js +1 -0
- package/dist/web/assets/{TaskHandoffPanel-CxH3Mgyd.js → TaskHandoffPanel-DBcC1xQW.js} +24 -24
- package/dist/web/assets/{TeamSettingsPage-D-XDefNd.js → TeamSettingsPage-BszQfKp0.js} +1 -1
- package/dist/web/assets/{TranslationSettingsPage-BPHI-SZW.js → TranslationSettingsPage-lLaxWCy3.js} +1 -1
- package/dist/web/assets/{arc-CC81aLuf.js → arc-DtgXFw4D.js} +1 -1
- package/dist/web/assets/{architectureDiagram-3BPJPVTR-DL08XGaN.js → architectureDiagram-3BPJPVTR-B3p3EMX1.js} +1 -1
- package/dist/web/assets/{at-sign-DYPIlD6D.js → at-sign-B8rXgKEE.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-B4IW5WxI.js → blockDiagram-GPEHLZMM-BmekCfr0.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-Cj4d_FqK.js → c4Diagram-AAUBKEIU-CF6hJhuL.js} +1 -1
- package/dist/web/assets/channel-BdK_fAel.js +1 -0
- package/dist/web/assets/check-DwK55QS2.js +1 -0
- package/dist/web/assets/{chevron-down-DNhYsNAt.js → chevron-down-Dftc5hr4.js} +1 -1
- package/dist/web/assets/{chevron-up-CjrLieBR.js → chevron-up-CKRxN6zX.js} +1 -1
- package/dist/web/assets/{chip-Cf92J-pQ.js → chip-ZTBHcXU2.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-DeCj8QSD.js → chunk-2J33WTMH-Bjelop4M.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-k-6rzQmQ.js → chunk-4BX2VUAB-B1rJPbL6.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-qMTCQ5bX.js → chunk-55IACEB6-B5qfH7Gj.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-CMnu18d1.js → chunk-727SXJPM-ClFMbgrH.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-C0mFbUMn.js → chunk-AQP2D5EJ-BMFjTO7B.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-u6-_M137.js → chunk-FMBD7UC4-Pr1oOFfR.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-DHrIE_8H.js → chunk-ND2GUHAM-BPm4TRpO.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-aTyC0wZq.js → chunk-QZHKN3VN-DCPA_U0M.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-CFzCq0ml.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-CFzCq0ml.js +1 -0
- package/dist/web/assets/{code-block-OCS4YCEC-CBIOQOMH.js → code-block-OCS4YCEC-Cx53F4d7.js} +1 -1
- package/dist/web/assets/{confirm-dialog-DWeBZLJW.js → confirm-dialog-C_j-w4TS.js} +1 -1
- package/dist/web/assets/{content-JM9E1MeD.js → content-DeIfej_n.js} +2 -2
- package/dist/web/assets/{copy-D0gl9kF8.js → copy-B-BaLIlh.js} +1 -1
- package/dist/web/assets/{cose-bilkent-S5V4N54A-xLyliSgU.js → cose-bilkent-S5V4N54A-gIys-0yu.js} +1 -1
- package/dist/web/assets/{cssMode-DO5UnQ64.js → cssMode-xF0bjbbU.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-CbNpoO2d.js → dagre-BM42HDAG-Bwc3Ntc-.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-CG3hKxAX.js → diagram-2AECGRRQ-zkydBsMT.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-mQu9M28s.js → diagram-5GNKFQAL-p9As3QtI.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-BSeEp_Uw.js → diagram-KO2AKTUF-N_pUU-iU.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-D6yRdao-.js → diagram-LMA3HP47-CA2rl4Gq.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-BUBUW9wD.js → diagram-OG6HWLK6-BoXxBlUC.js} +1 -1
- package/dist/web/assets/{dialog-D1lkhqVL.js → dialog-CnjWIdWp.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-BQSZgRqq.js → erDiagram-TEJ5UH35-CVBHQTCN.js} +1 -1
- package/dist/web/assets/{file-BijjwxRR.js → file-jMLGlXos.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-D-eqyr5Y.js → flowDiagram-I6XJVG4X-kK7iKiAv.js} +1 -1
- package/dist/web/assets/{folder-picker-Czxm0_S9.js → folder-picker-CR8LiSQf.js} +1 -1
- package/dist/web/assets/{freemarker2-B4RvEa_U.js → freemarker2-CTMcTiBd.js} +1 -1
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-BWGkCt_x.js → ganttDiagram-6RSMTGT7-CJVvLTkW.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-DGVc49pR.js → gitGraphDiagram-PVQCEYII-D8uj_SCw.js} +1 -1
- package/dist/web/assets/{globe-Ce01-45x.js → globe-FFVKce9-.js} +1 -1
- package/dist/web/assets/{handlebars-oyT7drqS.js → handlebars-NHxbmOs3.js} +1 -1
- package/dist/web/assets/{html-CxxWf2Qk.js → html-oFqzz32q.js} +1 -1
- package/dist/web/assets/{htmlMode-RfAHh5Jj.js → htmlMode-sgeetciK.js} +1 -1
- package/dist/web/assets/index-408ws6FY.css +1 -0
- package/dist/web/assets/index-9KNEuwGB.js +122 -0
- package/dist/web/assets/{index-hpHE1jXY.js → index-BzqyZD7L.js} +1 -1
- package/dist/web/assets/{index-DWrSDMX2.js → index-C5lNOKJb.js} +1 -1
- package/dist/web/assets/{index-Disv1kQS.js → index-C9vIrQ3Q.js} +1 -1
- package/dist/web/assets/{index-Pt4TsHjm.js → index-Cm_7q6ju.js} +1 -1
- package/dist/web/assets/{index-Dh-tgeaL.js → index-CwfWGzxi.js} +4 -4
- package/dist/web/assets/{index-DyJfPc4O.js → index-D8TNxwWk.js} +1 -1
- package/dist/web/assets/{index-T38iVLEb.js → index-biTPUXAe.js} +1 -1
- package/dist/web/assets/{index-BMZFF1UJ.js → index-gqrRO6ZJ.js} +1 -1
- package/dist/web/assets/{infoDiagram-5YYISTIA-DLPs3dV_.js → infoDiagram-5YYISTIA-CExRZE3Y.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-d_OrnwDY.js → ishikawaDiagram-YF4QCWOH-CsqM2X33.js} +1 -1
- package/dist/web/assets/javascript-COt-61wn.js +1 -0
- package/dist/web/assets/{journeyDiagram-JHISSGLW-EtU1st_0.js → journeyDiagram-JHISSGLW-DX9OMhPD.js} +1 -1
- package/dist/web/assets/{jsonMode-Bqh5vIxx.js → jsonMode-VQg5cpLV.js} +1 -1
- package/dist/web/assets/{kanban-definition-UN3LZRKU-ZWzUnsFK.js → kanban-definition-UN3LZRKU-CWHMx6vc.js} +1 -1
- package/dist/web/assets/{kbd-IjDGsZ2B.js → kbd-GGofKfKu.js} +1 -1
- package/dist/web/assets/{key-round-CbnAuUxp.js → key-round-p-Fpykfj.js} +1 -1
- package/dist/web/assets/{layers-Pdy9vZ6K.js → layers-pbPa_eZq.js} +1 -1
- package/dist/web/assets/{linear-D7n23wcA.js → linear-9VwGhaEA.js} +1 -1
- package/dist/web/assets/{link-Bl1ZbjFh.js → link-CG4UwIS1.js} +1 -1
- package/dist/web/assets/{liquid-Ds47iVLN.js → liquid-SJInUaiB.js} +1 -1
- package/dist/web/assets/{lspLanguageFeatures-Dcch3bsp.js → lspLanguageFeatures-DJOdVyBc.js} +1 -1
- package/dist/web/assets/{mdx-CM7ky-2B.js → mdx-CToYr-3b.js} +1 -1
- package/dist/web/assets/{menu-DubntFHq.js → menu-BFQ1mKU7.js} +1 -1
- package/dist/web/assets/{mermaid-NOHMQCX5-nBsnjgeU.js → mermaid-NOHMQCX5-BOViobLk.js} +58 -58
- package/dist/web/assets/{message-square-BE-pW0m_.js → message-square-BYZsUsLz.js} +1 -1
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-ClHORNTt.js → mindmap-definition-RKZ34NQL-BTcDnn6X.js} +1 -1
- package/dist/web/assets/{modal-CHLtZWvx.js → modal-BT_7Lhtw.js} +1 -1
- package/dist/web/assets/{monaco-BbAmalE2.js → monaco-DUftz48_.js} +3 -3
- package/dist/web/assets/{nav-row-DH7rNq1V.js → nav-row-BjDckaPC.js} +1 -1
- package/dist/web/assets/{paperclip-YP3Bk1lI.js → paperclip-CFAH5neE.js} +1 -1
- package/dist/web/assets/{pencil-BFDuhbtW.js → pencil-Bg9TWm_-.js} +1 -1
- package/dist/web/assets/{people-DEeNaaLt.js → people-BIQwajM2.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-BUOaKIyP.js → pieDiagram-4H26LBE5-CRjqdnP8.js} +1 -1
- package/dist/web/assets/{popover-CUmBEXxL.js → popover-DpYhrrCE.js} +1 -1
- package/dist/web/assets/{python-BODTtU6m.js → python-DbmUucgH.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-Caezg-U2.js → quadrantDiagram-W4KKPZXB-uvA8TYC6.js} +1 -1
- package/dist/web/assets/{razor-CHm8DY1p.js → razor-B0AJhw7W.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-BtdP3Ka6.js → requirementDiagram-4Y6WPE33-BWLugaKX.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-Bv74oA-n.js → sankeyDiagram-5OEKKPKP-DHrbZZv8.js} +1 -1
- package/dist/web/assets/{search-ClmOQd4H.js → search-BH8nze-X.js} +1 -1
- package/dist/web/assets/{select-BB7QG08o.js → select-BegY9RkP.js} +1 -1
- package/dist/web/assets/{select-CYtYPr-c.js → select-EcEr5QSS.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DuNPl-dg.js → sequenceDiagram-3UESZ5HK-CKwEKcTn.js} +1 -1
- package/dist/web/assets/{server-bEB_DY55.js → server-BxEUjx0l.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-B72HAgBJ.js → stateDiagram-AJRCARHV-vhgmSpa9.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-C0z5OTY4.js +1 -0
- package/dist/web/assets/{textarea-BqYPvoO-.js → textarea-CvoGGROs.js} +1 -1
- package/dist/web/assets/{timeline-definition-PNZ67QCA-DTmHUgmQ.js → timeline-definition-PNZ67QCA-bSDKcwDZ.js} +1 -1
- package/dist/web/assets/{toggles-a5fkwT_D.js → toggles-CEDUD08u.js} +1 -1
- package/dist/web/assets/{tooltip-DuyJMci9.js → tooltip-CKaUbVZ7.js} +1 -1
- package/dist/web/assets/{track-DCjyrv3n.js → track-1qw2cvTy.js} +1 -1
- package/dist/web/assets/{trash-2-CIyBqaVy.js → trash-2-ChiXon87.js} +1 -1
- package/dist/web/assets/{tsMode-C1UXAkMh.js → tsMode-bnV8W2Ru.js} +1 -1
- package/dist/web/assets/{typescript-Biht2wHb.js → typescript-d1MHIeEx.js} +1 -1
- package/dist/web/assets/{upload-D05XS5-G.js → upload-CQ-cQaOz.js} +1 -1
- package/dist/web/assets/{use-profiles-CrWTyz1G.js → use-profiles-CJzoqarX.js} +1 -1
- package/dist/web/assets/{use-providers-Dv1Nk6s7.js → use-providers-S29TCag2.js} +1 -1
- package/dist/web/assets/{use-translation-settings-CcUnipVO.js → use-translation-settings-DifNJaCu.js} +1 -1
- package/dist/web/assets/{useNormalizedLogs-D9W1cT4R.js → useNormalizedLogs-BVdY8qDk.js} +1 -1
- package/dist/web/assets/{useTokenUsage-CZ5mDshD.js → useTokenUsage-nh_KDA3q.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-ByoNydXe.js → vennDiagram-CIIHVFJN-D7QbDYzC.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-BqdMkOLl.js → wardley-L42UT6IY-C9aHlNVa.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-AO22HrEF.js → wardleyDiagram-YWT4CUSO-CZhubDRC.js} +1 -1
- package/dist/web/assets/{xml-NLGqNFDv.js → xml-DAKKxHAr.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-vzPgjgqW.js → xychartDiagram-2RQKCTM6-BgDlpFBh.js} +1 -1
- package/dist/web/assets/{yaml-AWlGS_Ig.js → yaml-D_hSVVz0.js} +1 -1
- package/dist/web/index.html +2 -2
- package/node_modules/@agent-tower/shared/dist/index.d.ts +1 -0
- package/node_modules/@agent-tower/shared/dist/index.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/index.js +1 -0
- package/node_modules/@agent-tower/shared/dist/index.js.map +1 -1
- package/node_modules/@agent-tower/shared/dist/task-hierarchy.d.ts +17 -0
- package/node_modules/@agent-tower/shared/dist/task-hierarchy.d.ts.map +1 -0
- package/node_modules/@agent-tower/shared/dist/task-hierarchy.js +12 -0
- package/node_modules/@agent-tower/shared/dist/task-hierarchy.js.map +1 -0
- package/node_modules/@agent-tower/shared/dist/types.d.ts +20 -4
- package/node_modules/@agent-tower/shared/dist/types.d.ts.map +1 -1
- package/node_modules/@agent-tower/shared/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/prisma/migrations/20261027000000_preserve_workspace_history/migration.sql +2 -0
- package/prisma/schema.prisma +2 -0
- package/dist/web/assets/MobileTaskDetail-M_Kke9rL.js +0 -3
- package/dist/web/assets/ProjectKanbanPage-soDqevjQ.js +0 -12
- package/dist/web/assets/TaskDetail-CqhPxvg3.js +0 -1
- package/dist/web/assets/channel-CUa8oyzC.js +0 -1
- package/dist/web/assets/check-DaZqOL8l.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-BAx111NO.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-BAx111NO.js +0 -1
- package/dist/web/assets/index-BN53vGxp.css +0 -1
- package/dist/web/assets/index-Cc3qXMhU.js +0 -122
- package/dist/web/assets/javascript-BNXtViSL.js +0 -1
- 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('
|
|
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.
|
|
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 } })).
|
|
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('
|
|
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.
|
|
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
|