factory-factory 0.4.6 → 0.4.7

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 (527) hide show
  1. package/dist/client/assets/{abnfDiagram-N423BO3Z-BcUuFtOj.js → abnfDiagram-N423BO3Z-BZQ2vUo6.js} +1 -1
  2. package/dist/client/assets/{arc-Cp8_E6ha.js → arc-XI8Jpfl3.js} +1 -1
  3. package/dist/client/assets/{architectureDiagram-T3A2C74G-C3_2J0tC.js → architectureDiagram-T3A2C74G-Dt7Y1pyP.js} +1 -1
  4. package/dist/client/assets/{blockDiagram-VBNYF7ZC-Dy0jc6lP.js → blockDiagram-VBNYF7ZC-DldefwGh.js} +1 -1
  5. package/dist/client/assets/{c4Diagram-5PPSVZJV-97TkD6w-.js → c4Diagram-5PPSVZJV-Ba08x7Ef.js} +1 -1
  6. package/dist/client/assets/channel-CRP5IiHm.js +1 -0
  7. package/dist/client/assets/{chunk-2GRJ4B5K-Dc0I7ume.js → chunk-2GRJ4B5K-B9S0F-4G.js} +1 -1
  8. package/dist/client/assets/{chunk-2Q5K7J3B-DbFPWZwu.js → chunk-2Q5K7J3B-CZXgC_Jx.js} +1 -1
  9. package/dist/client/assets/{chunk-5RXB4S5H-Dci_7ZDD.js → chunk-5RXB4S5H-3z0Q5lZX.js} +1 -1
  10. package/dist/client/assets/{chunk-5VM5RSS4-Ca82Rzl0.js → chunk-5VM5RSS4-D2hwZzSy.js} +1 -1
  11. package/dist/client/assets/{chunk-6Q2QTUOP-Be2f5Q2t.js → chunk-6Q2QTUOP-DhgyUVVB.js} +1 -1
  12. package/dist/client/assets/{chunk-GF5L2VYU-C4VRs6xS.js → chunk-GF5L2VYU-B9CpXn1z.js} +1 -1
  13. package/dist/client/assets/{chunk-JWPE2WC7-DVlW0c7f.js → chunk-JWPE2WC7-C3uO_aKI.js} +1 -1
  14. package/dist/client/assets/{chunk-KBJHAD2P-BKRpW89b.js → chunk-KBJHAD2P-BclkmYso.js} +1 -1
  15. package/dist/client/assets/{chunk-RYQCIY6F-BwMw9oh9.js → chunk-RYQCIY6F-D6aZFqMZ.js} +1 -1
  16. package/dist/client/assets/{chunk-XXDRQBXY-py-FQquv.js → chunk-XXDRQBXY-BQb7-SCi.js} +1 -1
  17. package/dist/client/assets/classDiagram-JCYQIIEL-CB4-8RDd.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-OCEON4UE-CB4-8RDd.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-JH36ORCC-BMCtQCZ8.js → cose-bilkent-JH36ORCC-WLzzMmoC.js} +1 -1
  20. package/dist/client/assets/{cynefin-VYW2F7L2-BTHAy6wD.js → cynefin-VYW2F7L2-D2EF0q2Q.js} +1 -1
  21. package/dist/client/assets/{cynefinDiagram-MW4NZA55-pQCQD0Ih.js → cynefinDiagram-MW4NZA55-CwoCQCrP.js} +1 -1
  22. package/dist/client/assets/{dagre-VZM6K2ZE-CZcoEFVf.js → dagre-VZM6K2ZE-Cg4AkVGB.js} +1 -1
  23. package/dist/client/assets/{diagram-7IWD3JNH-DgQv_208.js → diagram-7IWD3JNH-D9lnDmSl.js} +1 -1
  24. package/dist/client/assets/{diagram-B4RE2ZJO-DoFotcsB.js → diagram-B4RE2ZJO-AhUFMusY.js} +1 -1
  25. package/dist/client/assets/{diagram-LBJQPF4R-C5zkL1ml.js → diagram-LBJQPF4R-C81JtkuS.js} +1 -1
  26. package/dist/client/assets/{diagram-Q27KOJAE-ERKqnoHP.js → diagram-Q27KOJAE-BOzaYlQ2.js} +1 -1
  27. package/dist/client/assets/{diagram-UB23O5K3-Dyt6sy3Z.js → diagram-UB23O5K3-uXHocDB0.js} +1 -1
  28. package/dist/client/assets/{ebnfDiagram-BXEA7PRR-DqsFEAw2.js → ebnfDiagram-BXEA7PRR-Du4yOTiI.js} +1 -1
  29. package/dist/client/assets/{erDiagram-JOGREHBK-Dn8Aqkgn.js → erDiagram-JOGREHBK-BxBwtYA0.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-UKHOOZJN-DcArGyH-.js → flowDiagram-UKHOOZJN-YQc_Us9R.js} +1 -1
  31. package/dist/client/assets/{ganttDiagram-PKOTCBZU-BuHaeolc.js → ganttDiagram-PKOTCBZU-CO08NXgj.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-DS77QQ5N-iKWWNsQK.js → gitGraphDiagram-DS77QQ5N-NRBrIkNv.js} +1 -1
  33. package/dist/client/assets/{index-DY0TryY7.js → index-CrLTUCBe.js} +83 -83
  34. package/dist/client/assets/{infoDiagram-6WML65LV-C7IulVvo.js → infoDiagram-6WML65LV-CcOh5qQM.js} +1 -1
  35. package/dist/client/assets/{ishikawaDiagram-WSZJBQD7-DW4cB_Nk.js → ishikawaDiagram-WSZJBQD7-Ci4gKk1n.js} +1 -1
  36. package/dist/client/assets/{journeyDiagram-NVQOT4AX-Nzsiy4H7.js → journeyDiagram-NVQOT4AX-CpW1inrw.js} +1 -1
  37. package/dist/client/assets/{kanban-definition-27J2QSJJ-BUsK9dj9.js → kanban-definition-27J2QSJJ-jez_FwZT.js} +1 -1
  38. package/dist/client/assets/{linear-CyoW-usj.js → linear-6SNETQpS.js} +1 -1
  39. package/dist/client/assets/{mindmap-definition-FAOFIHXS-Bd9cSJjQ.js → mindmap-definition-FAOFIHXS-SmrP71Hb.js} +1 -1
  40. package/dist/client/assets/{mobile-baseline-K78aE4nt.js → mobile-baseline-8VVGaFwv.js} +1 -1
  41. package/dist/client/assets/{pegDiagram-VL7TDLO6-BrmAKdiE.js → pegDiagram-VL7TDLO6-BdZpPP9I.js} +1 -1
  42. package/dist/client/assets/{pieDiagram-7S7Q4E2Y-Ce0k6LI1.js → pieDiagram-7S7Q4E2Y-JiNW5VtU.js} +1 -1
  43. package/dist/client/assets/{quadrantDiagram-CIZ2JOQS-_9HxOOGa.js → quadrantDiagram-CIZ2JOQS-C2VhzPor.js} +1 -1
  44. package/dist/client/assets/{railroadDiagram-AXF67PYL-ChdF1CBw.js → railroadDiagram-AXF67PYL-BdfHLYrf.js} +1 -1
  45. package/dist/client/assets/{requirementDiagram-LRYGKXZP-Bm2gdYTE.js → requirementDiagram-LRYGKXZP-BRxDcjdJ.js} +1 -1
  46. package/dist/client/assets/{sankeyDiagram-W5VNT64P-Kf7zUiC-.js → sankeyDiagram-W5VNT64P-BvibpHKV.js} +1 -1
  47. package/dist/client/assets/{sequenceDiagram-SI44F4Z6-DyPqsgh1.js → sequenceDiagram-SI44F4Z6-CstrIf8Q.js} +1 -1
  48. package/dist/client/assets/{sizeCapture-X5ZJPWSS-Cgn8Hxr2.js → sizeCapture-X5ZJPWSS-fplvtb2v.js} +1 -1
  49. package/dist/client/assets/{stateDiagram-OKZ733FA-CJxSzxmg.js → stateDiagram-OKZ733FA-Cb0qJfhN.js} +1 -1
  50. package/dist/client/assets/stateDiagram-v2-UEYNNEHI-C_Uzjhvg.js +1 -0
  51. package/dist/client/assets/{swimlanes-SLNWSIFB-Ckb_izEZ.js → swimlanes-SLNWSIFB-BAqCm7Gx.js} +2 -2
  52. package/dist/client/assets/swimlanesDiagram-ULZ7WXOC-CO4t8Utk.js +8 -0
  53. package/dist/client/assets/{terminal-instance-DWySt2_t.js → terminal-instance-B0prRfF6.js} +1 -1
  54. package/dist/client/assets/{timeline-definition-Z64GVDOM-BWx_NLrK.js → timeline-definition-Z64GVDOM-BZbQ0pZK.js} +1 -1
  55. package/dist/client/assets/{vennDiagram-T6HMQDX7-BgN2-lO-.js → vennDiagram-T6HMQDX7-B3YQXfS4.js} +1 -1
  56. package/dist/client/assets/{wardleyDiagram-T6FBY63Y-C9iwoeki.js → wardleyDiagram-T6FBY63Y-Cufi2KwO.js} +1 -1
  57. package/dist/client/assets/{xychartDiagram-ELKLHX3M-B3AYy5ZN.js → xychartDiagram-ELKLHX3M-CHGxh5zQ.js} +1 -1
  58. package/dist/client/index.html +1 -1
  59. package/dist/src/backend/app-context.d.ts.map +1 -1
  60. package/dist/src/backend/app-context.js +2 -2
  61. package/dist/src/backend/app-context.js.map +1 -1
  62. package/dist/src/backend/app-context.test.js +6 -1
  63. package/dist/src/backend/app-context.test.js.map +1 -1
  64. package/dist/src/backend/clients/git.client.d.ts +0 -8
  65. package/dist/src/backend/clients/git.client.d.ts.map +1 -1
  66. package/dist/src/backend/clients/git.client.js +0 -70
  67. package/dist/src/backend/clients/git.client.js.map +1 -1
  68. package/dist/src/backend/clients/git.client.test.js +2 -178
  69. package/dist/src/backend/clients/git.client.test.js.map +1 -1
  70. package/dist/src/backend/interceptors/branch-naming.interceptor.test.js +3 -2
  71. package/dist/src/backend/interceptors/branch-naming.interceptor.test.js.map +1 -1
  72. package/dist/src/backend/lib/file-helpers.d.ts +0 -1
  73. package/dist/src/backend/lib/file-helpers.d.ts.map +1 -1
  74. package/dist/src/backend/lib/file-helpers.js +0 -27
  75. package/dist/src/backend/lib/file-helpers.js.map +1 -1
  76. package/dist/src/backend/lib/shell.d.ts +0 -4
  77. package/dist/src/backend/lib/shell.d.ts.map +1 -1
  78. package/dist/src/backend/lib/shell.js +0 -25
  79. package/dist/src/backend/lib/shell.js.map +1 -1
  80. package/dist/src/backend/routers/websocket/chat.handler.d.ts.map +1 -1
  81. package/dist/src/backend/routers/websocket/chat.handler.js +1 -17
  82. package/dist/src/backend/routers/websocket/chat.handler.js.map +1 -1
  83. package/dist/src/backend/routers/websocket/chat.handler.test.js +2 -8
  84. package/dist/src/backend/routers/websocket/chat.handler.test.js.map +1 -1
  85. package/dist/src/backend/routers/websocket/websocket.integration.test.js +0 -4
  86. package/dist/src/backend/routers/websocket/websocket.integration.test.js.map +1 -1
  87. package/dist/src/backend/server.d.ts.map +1 -1
  88. package/dist/src/backend/server.js +2 -2
  89. package/dist/src/backend/server.js.map +1 -1
  90. package/dist/src/backend/server.upgrade.test.js +10 -4
  91. package/dist/src/backend/server.upgrade.test.js.map +1 -1
  92. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.d.ts +0 -2
  93. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.d.ts.map +1 -1
  94. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.js +0 -6
  95. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.js.map +1 -1
  96. package/dist/src/backend/services/github/service/github-cli/schemas.d.ts +0 -23
  97. package/dist/src/backend/services/github/service/github-cli/schemas.d.ts.map +1 -1
  98. package/dist/src/backend/services/github/service/github-cli/schemas.js +0 -18
  99. package/dist/src/backend/services/github/service/github-cli/schemas.js.map +1 -1
  100. package/dist/src/backend/services/github/service/github-cli.service.d.ts +0 -2
  101. package/dist/src/backend/services/github/service/github-cli.service.d.ts.map +1 -1
  102. package/dist/src/backend/services/github/service/github-cli.service.js +0 -37
  103. package/dist/src/backend/services/github/service/github-cli.service.js.map +1 -1
  104. package/dist/src/backend/services/github/service/github-cli.service.test.js +3 -13
  105. package/dist/src/backend/services/github/service/github-cli.service.test.js.map +1 -1
  106. package/dist/src/backend/services/session/resources/agent-session.accessor.d.ts +0 -1
  107. package/dist/src/backend/services/session/resources/agent-session.accessor.d.ts.map +1 -1
  108. package/dist/src/backend/services/session/resources/agent-session.accessor.js +0 -8
  109. package/dist/src/backend/services/session/resources/agent-session.accessor.js.map +1 -1
  110. package/dist/src/backend/services/session/resources/agent-session.accessor.test.js +0 -10
  111. package/dist/src/backend/services/session/resources/agent-session.accessor.test.js.map +1 -1
  112. package/dist/src/backend/services/session/service/acp/acp-client-factory.d.ts +33 -0
  113. package/dist/src/backend/services/session/service/acp/acp-client-factory.d.ts.map +1 -0
  114. package/dist/src/backend/services/session/service/acp/acp-client-factory.js +274 -0
  115. package/dist/src/backend/services/session/service/acp/acp-client-factory.js.map +1 -0
  116. package/dist/src/backend/services/session/service/acp/acp-client-factory.test.d.ts +2 -0
  117. package/dist/src/backend/services/session/service/acp/acp-client-factory.test.d.ts.map +1 -0
  118. package/dist/src/backend/services/session/service/acp/acp-client-factory.test.js +454 -0
  119. package/dist/src/backend/services/session/service/acp/acp-client-factory.test.js.map +1 -0
  120. package/dist/src/backend/services/session/service/acp/acp-client-handler.d.ts.map +1 -1
  121. package/dist/src/backend/services/session/service/acp/acp-client-handler.js +17 -0
  122. package/dist/src/backend/services/session/service/acp/acp-client-handler.js.map +1 -1
  123. package/dist/src/backend/services/session/service/acp/acp-client-handler.test.js +171 -0
  124. package/dist/src/backend/services/session/service/acp/acp-client-handler.test.js.map +1 -1
  125. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.d.ts +0 -1
  126. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.d.ts.map +1 -1
  127. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.js +0 -3
  128. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.js.map +1 -1
  129. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.test.js +0 -10
  130. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.test.js.map +1 -1
  131. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.js +17 -0
  132. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.js.map +1 -1
  133. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.d.ts +17 -0
  134. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.d.ts.map +1 -0
  135. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.js +96 -0
  136. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.js.map +1 -0
  137. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.test.d.ts +2 -0
  138. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.test.d.ts.map +1 -0
  139. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.test.js +140 -0
  140. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.test.js.map +1 -0
  141. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.d.ts +8 -0
  142. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.d.ts.map +1 -0
  143. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.js +81 -0
  144. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.js.map +1 -0
  145. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.test.d.ts +2 -0
  146. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.test.d.ts.map +1 -0
  147. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.test.js +208 -0
  148. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.test.js.map +1 -0
  149. package/dist/src/backend/services/session/service/acp/acp-runtime-contracts.d.ts +25 -0
  150. package/dist/src/backend/services/session/service/acp/acp-runtime-contracts.d.ts.map +1 -0
  151. package/dist/src/backend/services/session/service/acp/acp-runtime-contracts.js +2 -0
  152. package/dist/src/backend/services/session/service/acp/acp-runtime-contracts.js.map +1 -0
  153. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.d.ts +5 -0
  154. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.d.ts.map +1 -0
  155. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.js +39 -0
  156. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.js.map +1 -0
  157. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.d.ts +20 -0
  158. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.d.ts.map +1 -0
  159. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.js +68 -0
  160. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.js.map +1 -0
  161. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.test.d.ts +2 -0
  162. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.test.d.ts.map +1 -0
  163. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.test.js +17 -0
  164. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.test.js.map +1 -0
  165. package/dist/src/backend/services/session/service/acp/acp-runtime-events.d.ts +30 -1
  166. package/dist/src/backend/services/session/service/acp/acp-runtime-events.d.ts.map +1 -1
  167. package/dist/src/backend/services/session/service/acp/acp-runtime-exit-handler.d.ts +5 -0
  168. package/dist/src/backend/services/session/service/acp/acp-runtime-exit-handler.d.ts.map +1 -0
  169. package/dist/src/backend/services/session/service/acp/acp-runtime-exit-handler.js +35 -0
  170. package/dist/src/backend/services/session/service/acp/acp-runtime-exit-handler.js.map +1 -0
  171. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.browsing.test.d.ts +2 -0
  172. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.browsing.test.d.ts.map +1 -0
  173. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.browsing.test.js +310 -0
  174. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.browsing.test.js.map +1 -0
  175. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.config.test.d.ts +2 -0
  176. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.config.test.d.ts.map +1 -0
  177. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.config.test.js +162 -0
  178. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.config.test.js.map +1 -0
  179. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.creation.test.d.ts +2 -0
  180. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.creation.test.d.ts.map +1 -0
  181. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.creation.test.js +390 -0
  182. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.creation.test.js.map +1 -0
  183. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts +18 -68
  184. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts.map +1 -1
  185. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.facade.test.d.ts +2 -0
  186. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.facade.test.d.ts.map +1 -0
  187. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.facade.test.js +59 -0
  188. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.facade.test.js.map +1 -0
  189. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.js +65 -993
  190. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.js.map +1 -1
  191. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.prompt.test.d.ts +2 -0
  192. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.prompt.test.d.ts.map +1 -0
  193. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.prompt.test.js +185 -0
  194. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.prompt.test.js.map +1 -0
  195. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.task-status.test.d.ts +2 -0
  196. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.task-status.test.d.ts.map +1 -0
  197. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.task-status.test.js +57 -0
  198. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.task-status.test.js.map +1 -0
  199. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.termination.test.d.ts +2 -0
  200. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.termination.test.d.ts.map +1 -0
  201. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.termination.test.js +392 -0
  202. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.termination.test.js.map +1 -0
  203. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.d.ts +27 -0
  204. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.d.ts.map +1 -0
  205. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.js +96 -0
  206. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.js.map +1 -0
  207. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.d.ts +59 -0
  208. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.d.ts.map +1 -0
  209. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.js +142 -0
  210. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.js.map +1 -0
  211. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.d.ts +21 -0
  212. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.d.ts.map +1 -0
  213. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.js +112 -0
  214. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.js.map +1 -0
  215. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.test.d.ts +2 -0
  216. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.test.d.ts.map +1 -0
  217. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.test.js +142 -0
  218. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.test.js.map +1 -0
  219. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.creation.test.d.ts +2 -0
  220. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.creation.test.d.ts.map +1 -0
  221. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.creation.test.js +333 -0
  222. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.creation.test.js.map +1 -0
  223. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.d.ts +85 -0
  224. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.d.ts.map +1 -0
  225. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.js +633 -0
  226. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.js.map +1 -0
  227. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.status.test.d.ts +2 -0
  228. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.status.test.d.ts.map +1 -0
  229. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.status.test.js +99 -0
  230. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.status.test.js.map +1 -0
  231. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.termination.test.d.ts +2 -0
  232. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.termination.test.d.ts.map +1 -0
  233. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.termination.test.js +490 -0
  234. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.termination.test.js.map +1 -0
  235. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.d.ts +9 -0
  236. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.d.ts.map +1 -0
  237. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.js +96 -0
  238. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.js.map +1 -0
  239. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.test.d.ts +2 -0
  240. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.test.d.ts.map +1 -0
  241. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.test.js +171 -0
  242. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.test.js.map +1 -0
  243. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +1 -1
  244. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
  245. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +14 -6
  246. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
  247. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.d.ts +2 -0
  248. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.d.ts.map +1 -0
  249. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.js +265 -0
  250. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.js.map +1 -0
  251. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +32 -14
  252. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -1
  253. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.d.ts +7 -0
  254. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.d.ts.map +1 -0
  255. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.js +98 -0
  256. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.js.map +1 -0
  257. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.d.ts +2 -0
  258. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.d.ts.map +1 -0
  259. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.js +148 -0
  260. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.js.map +1 -0
  261. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.js +10 -0
  262. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.js.map +1 -1
  263. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.d.ts +72 -0
  264. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.d.ts.map +1 -1
  265. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.js +46 -1
  266. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.js.map +1 -1
  267. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.js +39 -0
  268. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.js.map +1 -1
  269. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.d.ts +10 -1
  270. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.d.ts.map +1 -1
  271. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.js +149 -17
  272. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.js.map +1 -1
  273. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.js +348 -19
  274. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.js.map +1 -1
  275. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.d.ts +8 -0
  276. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.d.ts.map +1 -0
  277. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.js +9 -0
  278. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.js.map +1 -0
  279. package/dist/src/backend/services/session/service/acp/index.d.ts +2 -2
  280. package/dist/src/backend/services/session/service/acp/index.d.ts.map +1 -1
  281. package/dist/src/backend/services/session/service/acp/index.js +1 -0
  282. package/dist/src/backend/services/session/service/acp/index.js.map +1 -1
  283. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.d.ts.map +1 -1
  284. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.js +9 -1
  285. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.js.map +1 -1
  286. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.recovery.test.d.ts +2 -0
  287. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.recovery.test.d.ts.map +1 -0
  288. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.recovery.test.js +195 -0
  289. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.recovery.test.js.map +1 -0
  290. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.test.js +1 -23
  291. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.test.js.map +1 -1
  292. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.test.js +0 -6
  293. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.test.js.map +1 -1
  294. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-config-option.handler.js +1 -1
  295. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-config-option.handler.js.map +1 -1
  296. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-config-option.handler.test.js +1 -1
  297. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-config-option.handler.test.js.map +1 -1
  298. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-thinking-budget.handler.js +1 -1
  299. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-thinking-budget.handler.js.map +1 -1
  300. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-thinking-budget.handler.test.js +1 -1
  301. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-thinking-budget.handler.test.js.map +1 -1
  302. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.d.ts +4 -2
  303. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.d.ts.map +1 -1
  304. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.js +2 -7
  305. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.js.map +1 -1
  306. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.test.js +9 -11
  307. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.test.js.map +1 -1
  308. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.js +1 -1
  309. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.js.map +1 -1
  310. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.test.js +1 -3
  311. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.test.js.map +1 -1
  312. package/dist/src/backend/services/session/service/chat/chat-message-handlers/registry.d.ts.map +1 -1
  313. package/dist/src/backend/services/session/service/chat/chat-message-handlers/registry.js +3 -2
  314. package/dist/src/backend/services/session/service/chat/chat-message-handlers/registry.js.map +1 -1
  315. package/dist/src/backend/services/session/service/chat/chat-message-handlers/types.d.ts +24 -8
  316. package/dist/src/backend/services/session/service/chat/chat-message-handlers/types.d.ts.map +1 -1
  317. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.d.ts +14 -15
  318. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.d.ts.map +1 -1
  319. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js +56 -114
  320. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js.map +1 -1
  321. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js +49 -218
  322. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js.map +1 -1
  323. package/dist/src/backend/services/session/service/data/session-data.service.d.ts +0 -2
  324. package/dist/src/backend/services/session/service/data/session-data.service.d.ts.map +1 -1
  325. package/dist/src/backend/services/session/service/data/session-data.service.js +0 -6
  326. package/dist/src/backend/services/session/service/data/session-data.service.js.map +1 -1
  327. package/dist/src/backend/services/session/service/data/session-data.service.test.js +0 -6
  328. package/dist/src/backend/services/session/service/data/session-data.service.test.js.map +1 -1
  329. package/dist/src/backend/services/session/service/index.d.ts +3 -4
  330. package/dist/src/backend/services/session/service/index.d.ts.map +1 -1
  331. package/dist/src/backend/services/session/service/index.js +2 -2
  332. package/dist/src/backend/services/session/service/index.js.map +1 -1
  333. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.d.ts.map +1 -1
  334. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.js +9 -0
  335. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.js.map +1 -1
  336. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.js +47 -0
  337. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.js.map +1 -1
  338. package/dist/src/backend/services/session/service/lifecycle/session-context.service.d.ts +33 -0
  339. package/dist/src/backend/services/session/service/lifecycle/session-context.service.d.ts.map +1 -0
  340. package/dist/src/backend/services/session/service/lifecycle/session-context.service.js +120 -0
  341. package/dist/src/backend/services/session/service/lifecycle/session-context.service.js.map +1 -0
  342. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.d.ts +2 -0
  343. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.d.ts.map +1 -0
  344. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.js +174 -0
  345. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.js.map +1 -0
  346. package/dist/src/backend/services/session/service/lifecycle/session-core-services.d.ts +23 -0
  347. package/dist/src/backend/services/session/service/lifecycle/session-core-services.d.ts.map +1 -0
  348. package/dist/src/backend/services/session/service/lifecycle/session-core-services.js +150 -0
  349. package/dist/src/backend/services/session/service/lifecycle/session-core-services.js.map +1 -0
  350. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.d.ts +5 -0
  351. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.d.ts.map +1 -0
  352. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.js +38 -0
  353. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.js.map +1 -0
  354. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.d.ts +2 -0
  355. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.d.ts.map +1 -0
  356. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.js +52 -0
  357. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.js.map +1 -0
  358. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.d.ts +35 -0
  359. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.d.ts.map +1 -0
  360. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.js +120 -0
  361. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.js.map +1 -0
  362. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.test.d.ts +2 -0
  363. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.test.d.ts.map +1 -0
  364. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.test.js +192 -0
  365. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.test.js.map +1 -0
  366. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.d.ts +115 -0
  367. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.d.ts.map +1 -0
  368. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.js +434 -0
  369. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.js.map +1 -0
  370. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.types.d.ts +13 -0
  371. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.types.d.ts.map +1 -0
  372. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.types.js +2 -0
  373. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.types.js.map +1 -0
  374. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.d.ts +81 -0
  375. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.d.ts.map +1 -0
  376. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.js +242 -0
  377. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.js.map +1 -0
  378. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.test.d.ts +2 -0
  379. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.test.d.ts.map +1 -0
  380. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.test.js +528 -0
  381. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.test.js.map +1 -0
  382. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.d.ts +39 -0
  383. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.d.ts.map +1 -0
  384. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.js +208 -0
  385. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.js.map +1 -0
  386. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.d.ts +2 -0
  387. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.d.ts.map +1 -0
  388. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.js +274 -0
  389. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.js.map +1 -0
  390. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.d.ts +2 -0
  391. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.d.ts.map +1 -0
  392. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.js +105 -0
  393. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.js.map +1 -0
  394. package/dist/src/backend/services/session/service/lifecycle/session-services.d.ts +5 -17
  395. package/dist/src/backend/services/session/service/lifecycle/session-services.d.ts.map +1 -1
  396. package/dist/src/backend/services/session/service/lifecycle/session-services.js +14 -87
  397. package/dist/src/backend/services/session/service/lifecycle/session-services.js.map +1 -1
  398. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.d.ts +64 -0
  399. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.d.ts.map +1 -0
  400. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.js +352 -0
  401. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.js.map +1 -0
  402. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.test.d.ts +2 -0
  403. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.test.d.ts.map +1 -0
  404. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.test.js +702 -0
  405. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.test.js.map +1 -0
  406. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.d.ts +54 -0
  407. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.d.ts.map +1 -0
  408. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.js +265 -0
  409. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.js.map +1 -0
  410. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.test.d.ts +2 -0
  411. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.test.d.ts.map +1 -0
  412. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.test.js +514 -0
  413. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.test.js.map +1 -0
  414. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.d.ts +62 -0
  415. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.d.ts.map +1 -0
  416. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.js +175 -0
  417. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.js.map +1 -0
  418. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.test.d.ts +2 -0
  419. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.test.d.ts.map +1 -0
  420. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.test.js +294 -0
  421. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.test.js.map +1 -0
  422. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.d.ts +2 -0
  423. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.d.ts.map +1 -0
  424. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.js +431 -0
  425. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.js.map +1 -0
  426. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts +24 -116
  427. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts.map +1 -1
  428. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js +47 -1168
  429. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js.map +1 -1
  430. package/dist/src/backend/services/session/service/lifecycle/session.prompt.service.test.js +11 -6
  431. package/dist/src/backend/services/session/service/lifecycle/session.prompt.service.test.js.map +1 -1
  432. package/dist/src/backend/services/session/service/lifecycle/session.service.d.ts +3 -6
  433. package/dist/src/backend/services/session/service/lifecycle/session.service.d.ts.map +1 -1
  434. package/dist/src/backend/services/session/service/lifecycle/session.service.js +9 -12
  435. package/dist/src/backend/services/session/service/lifecycle/session.service.js.map +1 -1
  436. package/dist/src/backend/services/session/service/lifecycle/session.service.test.js +44 -35
  437. package/dist/src/backend/services/session/service/lifecycle/session.service.test.js.map +1 -1
  438. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.d.ts +3 -0
  439. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.d.ts.map +1 -0
  440. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.js +92 -0
  441. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.js.map +1 -0
  442. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.test.d.ts +2 -0
  443. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.test.d.ts.map +1 -0
  444. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.test.js +81 -0
  445. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.test.js.map +1 -0
  446. package/dist/src/backend/services/workspace/resources/project.accessor.d.ts +0 -1
  447. package/dist/src/backend/services/workspace/resources/project.accessor.d.ts.map +1 -1
  448. package/dist/src/backend/services/workspace/resources/project.accessor.js +0 -13
  449. package/dist/src/backend/services/workspace/resources/project.accessor.js.map +1 -1
  450. package/dist/src/backend/services/workspace/resources/workspace.accessor.d.ts +0 -1
  451. package/dist/src/backend/services/workspace/resources/workspace.accessor.d.ts.map +1 -1
  452. package/dist/src/backend/services/workspace/resources/workspace.accessor.js +0 -10
  453. package/dist/src/backend/services/workspace/resources/workspace.accessor.js.map +1 -1
  454. package/dist/src/backend/services/workspace/resources/workspace.accessor.test.js +3 -8
  455. package/dist/src/backend/services/workspace/resources/workspace.accessor.test.js.map +1 -1
  456. package/dist/src/backend/services/workspace/service/index.d.ts +9 -10
  457. package/dist/src/backend/services/workspace/service/index.d.ts.map +1 -1
  458. package/dist/src/backend/services/workspace/service/index.js +5 -5
  459. package/dist/src/backend/services/workspace/service/index.js.map +1 -1
  460. package/dist/src/backend/services/workspace/service/lifecycle/data.service.d.ts +4 -4
  461. package/dist/src/backend/services/workspace/service/workspace-domain-exports.test.js +1 -7
  462. package/dist/src/backend/services/workspace/service/workspace-domain-exports.test.js.map +1 -1
  463. package/dist/src/backend/services/workspace/service/worktree/git-ops.service.test.js +0 -1
  464. package/dist/src/backend/services/workspace/service/worktree/git-ops.service.test.js.map +1 -1
  465. package/dist/src/backend/testing/npm-publish-workflow.test.d.ts +2 -0
  466. package/dist/src/backend/testing/npm-publish-workflow.test.d.ts.map +1 -0
  467. package/dist/src/backend/testing/npm-publish-workflow.test.js +205 -0
  468. package/dist/src/backend/testing/npm-publish-workflow.test.js.map +1 -0
  469. package/dist/src/backend/trpc/index.d.ts +2 -18
  470. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  471. package/dist/src/backend/trpc/pr-review.router.test.js +1 -12
  472. package/dist/src/backend/trpc/pr-review.router.test.js.map +1 -1
  473. package/dist/src/backend/trpc/pr-review.trpc.d.ts +0 -16
  474. package/dist/src/backend/trpc/pr-review.trpc.d.ts.map +1 -1
  475. package/dist/src/backend/trpc/pr-review.trpc.js +0 -14
  476. package/dist/src/backend/trpc/pr-review.trpc.js.map +1 -1
  477. package/dist/src/backend/trpc/session.router.test.js +13 -37
  478. package/dist/src/backend/trpc/session.router.test.js.map +1 -1
  479. package/dist/src/backend/trpc/workspace.router.test.js +41 -2
  480. package/dist/src/backend/trpc/workspace.router.test.js.map +1 -1
  481. package/dist/src/backend/trpc/workspace.trpc.d.ts +4 -4
  482. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  483. package/dist/src/backend/trpc/workspace.trpc.js +12 -1
  484. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  485. package/dist/src/lib/chat-protocol.d.ts +72 -0
  486. package/dist/src/lib/chat-protocol.d.ts.map +1 -0
  487. package/dist/src/lib/chat-protocol.js +514 -0
  488. package/dist/src/lib/chat-protocol.js.map +1 -0
  489. package/dist/src/test-utils/application-graph.d.ts.map +1 -1
  490. package/dist/src/test-utils/application-graph.js +1 -0
  491. package/dist/src/test-utils/application-graph.js.map +1 -1
  492. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  493. package/package.json +6 -3
  494. package/scripts/postinstall.mjs +6 -2
  495. package/dist/client/assets/channel-DLBBfejH.js +0 -1
  496. package/dist/client/assets/classDiagram-JCYQIIEL-Ds5wVQR3.js +0 -1
  497. package/dist/client/assets/classDiagram-v2-OCEON4UE-Ds5wVQR3.js +0 -1
  498. package/dist/client/assets/stateDiagram-v2-UEYNNEHI-BwUaUW2J.js +0 -1
  499. package/dist/client/assets/swimlanesDiagram-ULZ7WXOC-D87lLmuW.js +0 -8
  500. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.d.ts +0 -2
  501. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.d.ts.map +0 -1
  502. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.js +0 -1736
  503. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.js.map +0 -1
  504. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.d.ts +0 -2
  505. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.d.ts.map +0 -1
  506. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.js +0 -1520
  507. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.js.map +0 -1
  508. package/dist/src/backend/services/session/service/runtime/index.d.ts +0 -5
  509. package/dist/src/backend/services/session/service/runtime/index.d.ts.map +0 -1
  510. package/dist/src/backend/services/session/service/runtime/index.js +0 -2
  511. package/dist/src/backend/services/session/service/runtime/index.js.map +0 -1
  512. package/dist/src/backend/services/session/service/runtime/provider-runtime-manager.d.ts +0 -21
  513. package/dist/src/backend/services/session/service/runtime/provider-runtime-manager.d.ts.map +0 -1
  514. package/dist/src/backend/services/session/service/runtime/provider-runtime-manager.js +0 -2
  515. package/dist/src/backend/services/session/service/runtime/provider-runtime-manager.js.map +0 -1
  516. package/dist/src/backend/services/session/service/store/file-lock.service.d.ts +0 -97
  517. package/dist/src/backend/services/session/service/store/file-lock.service.d.ts.map +0 -1
  518. package/dist/src/backend/services/session/service/store/file-lock.service.js +0 -429
  519. package/dist/src/backend/services/session/service/store/file-lock.service.js.map +0 -1
  520. package/dist/src/backend/services/session/service/store/file-lock.service.test.d.ts +0 -2
  521. package/dist/src/backend/services/session/service/store/file-lock.service.test.d.ts.map +0 -1
  522. package/dist/src/backend/services/session/service/store/file-lock.service.test.js +0 -672
  523. package/dist/src/backend/services/session/service/store/file-lock.service.test.js.map +0 -1
  524. package/dist/src/shared/workspace-words.d.ts +0 -5
  525. package/dist/src/shared/workspace-words.d.ts.map +0 -1
  526. package/dist/src/shared/workspace-words.js +0 -146
  527. package/dist/src/shared/workspace-words.js.map +0 -1
@@ -1,368 +1,59 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { configService } from '../../../../../backend/services/config.service.js';
3
- import { createLogger } from '../../../../../backend/services/logger.service.js';
4
- import { AcpBrowseSessionUnavailableError } from '../../../../../backend/services/session/service/acp/acp-runtime-manager.js';
5
- import { getChildWorkspaceMcpServerConfig } from '../../../../../backend/services/session/service/acp/child-workspace-mcp-server.js';
6
- import { acpTraceLogger } from '../../../../../backend/services/session/service/logging/acp-trace-logger.service.js';
7
- import { sessionEventBus } from '../../../../../backend/services/session/service/session-event-bus.js';
8
- import { userSettingsService } from '../../../../../backend/services/settings/index.js';
9
- import { workspaceDataService, workspaceNotificationService } from '../../../../../backend/services/workspace/index.js';
10
- import { SessionLifecycleEventKind, SessionLifecycleEventReason, SessionStatus, } from '../../../../../shared/core/index.js';
11
1
  import { createInitialSessionRuntimeState, } from '../../../../../shared/session-runtime.js';
12
- import { buildWorkspaceNotificationMessageText, WORKSPACE_NOTIFICATION_MESSAGE_ID_PREFIX, workspaceNotificationMessageId, } from '../../../../../shared/workspace-notifications.js';
13
- import { closedSessionPersistenceService } from './closed-session-persistence.service.js';
14
- import { toErrorMessage } from './session.error-message.js';
15
- import { maybeDiscoverPROnSessionEnd as maybeDiscoverPROnSessionEndHelper } from './session-pr-discovery.service.js';
16
2
  import { isStaleLoadingRuntime } from './session-runtime-state.helpers.js';
17
- const logger = createLogger('session');
18
- class SessionStartupCancelledError extends Error {
19
- constructor() {
20
- super('Session is currently being stopped');
21
- this.name = 'SessionStartupCancelledError';
22
- }
23
- }
24
- function getPersistedStatusForExitCode(exitCode) {
25
- return exitCode === 0 ? SessionStatus.COMPLETED : SessionStatus.FAILED;
26
- }
27
- const SESSION_STOP_MESSAGES = {
28
- USER_STOP: 'Session stopped by you.',
29
- SESSION_CLOSED: 'Session closed by you.',
30
- WORKSPACE_ARCHIVED: 'Session stopped because the workspace was archived.',
31
- SYSTEM_STOP: 'Session stopped by the system.',
32
- };
33
- const SHUTDOWN_LIFECYCLE_RECORD_TIMEOUT_MS = 1000;
34
3
  export class SessionLifecycleService {
35
- repository;
36
- promptBuilder;
37
- runtimeManager;
38
- sessionDomainService;
39
- sessionPermissionService;
40
- sessionConfigService;
41
- acpEventProcessor;
42
- promptTurnCompletionService;
43
- retryService;
44
- lifecycleEventService;
45
- hydrateProviderHistory;
46
- sendSessionMessage;
47
- onBeforeStopSession;
48
- onSessionExit;
49
- stoppingSessions = new Set();
50
- shutdownSessions = new Set();
51
- stopGenerationCounter = 0;
52
- stopGenerations = new Map();
53
- startupGenerationReferences = new Map();
54
- clientCreationOperations = new Map();
55
- workspaceBridge = null;
56
- messageQueueBridge = null;
57
- autoIterationExitBridge = null;
58
- constructor(options) {
59
- this.repository = options.repository;
60
- this.promptBuilder = options.promptBuilder;
61
- this.runtimeManager = options.runtimeManager;
62
- this.sessionDomainService = options.sessionDomainService;
63
- this.sessionPermissionService = options.sessionPermissionService;
64
- this.sessionConfigService = options.sessionConfigService;
65
- this.acpEventProcessor = options.acpEventProcessor;
66
- this.promptTurnCompletionService = options.promptTurnCompletionService;
67
- this.retryService = options.retryService;
68
- this.lifecycleEventService = options.lifecycleEventService;
69
- this.hydrateProviderHistory =
70
- options.hydrateProviderHistory ?? (async () => undefined);
71
- this.sendSessionMessage = options.sendSessionMessage;
72
- this.onBeforeStopSession = options.onBeforeStopSession;
73
- this.onSessionExit = options.onSessionExit;
4
+ dependencies;
5
+ configured = false;
6
+ constructor(dependencies) {
7
+ this.dependencies = dependencies;
74
8
  }
75
9
  configure(bridges) {
76
- this.workspaceBridge = bridges.workspace;
77
- this.messageQueueBridge = bridges.messageQueue ?? null;
78
- this.autoIterationExitBridge = bridges.autoIterationExit ?? null;
10
+ this.configured = false;
11
+ this.dependencies.workflowFinalizer.configure({
12
+ workspace: bridges.workspace,
13
+ autoIterationExit: bridges.autoIterationExit,
14
+ });
15
+ this.dependencies.terminationCoordinator.configure({ workspace: bridges.workspace });
16
+ this.dependencies.startupCoordinator.configure({ messageQueue: bridges.messageQueue });
17
+ this.configured = true;
79
18
  }
80
19
  async startSession(sessionId, options) {
81
- await this.runStartupOperation(sessionId, async (stopGeneration) => {
82
- const session = await this.repository.getSessionById(sessionId);
83
- if (!session) {
84
- throw new Error(`Session not found: ${sessionId}`);
85
- }
86
- this.assertStartupAllowed(sessionId, stopGeneration);
87
- const existingClient = this.runtimeManager.getClient(sessionId);
88
- if (existingClient) {
89
- throw new Error('Session is already running');
90
- }
91
- const startupModePreset = options?.startupModePreset;
92
- const { handle, resolvedPreset, dispatchableNotificationCount } = await this.getOrCreateAcpSessionClient(sessionId, {}, session, stopGeneration);
93
- this.assertStartupAllowed(sessionId, stopGeneration);
94
- await this.applyStartupModePreset(sessionId, handle, startupModePreset, session.workflow);
95
- this.assertStartupAllowed(sessionId, stopGeneration);
96
- await this.applyConfiguredPermissionPreset(sessionId, session, handle, resolvedPreset);
97
- this.assertStartupAllowed(sessionId, stopGeneration);
98
- await this.dispatchQueuedNotificationsIfNeeded(sessionId, dispatchableNotificationCount);
99
- this.assertStartupAllowed(sessionId, stopGeneration);
100
- const initialPrompt = options?.initialPrompt ?? 'Continue with the task.';
101
- const shouldSendInitialPrompt = dispatchableNotificationCount === 0 ||
102
- (typeof options?.initialPrompt === 'string' && !options.initialPromptIsDefault);
103
- if (shouldSendInitialPrompt && initialPrompt) {
104
- await this.sendSessionMessage(sessionId, initialPrompt);
105
- }
106
- this.assertStartupAllowed(sessionId, stopGeneration);
107
- logger.info('Session started', { sessionId, provider: session.provider });
108
- });
20
+ this.assertConfigured();
21
+ await this.dependencies.startupCoordinator.startSession(sessionId, options);
109
22
  }
110
23
  async restartSession(sessionId, options) {
111
- const isRunning = this.runtimeManager.isSessionRunning(sessionId);
112
- const isStopInProgress = this.runtimeManager.isStopInProgress(sessionId);
113
- if (isStopInProgress) {
114
- throw new Error('Cannot restart: session is currently being stopped. Please try again shortly.');
115
- }
116
- if (isRunning) {
117
- try {
118
- await this.stopSession(sessionId, { cleanupTransientRatchetSession: false });
119
- }
120
- catch (error) {
121
- logger.warn('Error stopping session during restart; continuing with start', {
122
- sessionId,
123
- error: error instanceof Error ? error.message : String(error),
124
- });
125
- }
126
- }
127
- await this.startSession(sessionId, options ?? {
128
- initialPrompt: 'Continue with the task.',
129
- initialPromptIsDefault: true,
130
- });
131
- logger.info('Session restarted', { sessionId });
24
+ this.assertConfigured();
25
+ await this.dependencies.startupCoordinator.restartSession(sessionId, options);
132
26
  }
133
27
  async stopSession(sessionId, options) {
134
- if (this.stoppingSessions.has(sessionId)) {
135
- logger.debug('Session stop already in progress', { sessionId });
136
- return;
137
- }
138
- this.advanceStopGeneration(sessionId);
139
- this.stoppingSessions.add(sessionId);
140
- const stopInvocationId = randomUUID();
141
- try {
142
- await this.stopSessionWithBarrier(sessionId, stopInvocationId, options);
143
- }
144
- finally {
145
- this.stoppingSessions.delete(sessionId);
146
- this.stopGenerations.delete(sessionId);
147
- }
148
- }
149
- async stopSessionWithBarrier(sessionId, stopInvocationId, options) {
150
- this.promptTurnCompletionService.clearSession(sessionId);
151
- this.onBeforeStopSession?.(sessionId);
152
- this.sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: true });
153
- const session = await this.loadSessionForStop(sessionId);
154
- const workspaceId = session?.workspaceId ?? this.acpEventProcessor.getWorkspaceId(sessionId);
155
- const reason = options?.reason ?? 'SYSTEM_STOP';
156
- if (workspaceId && options?.recordLifecycleEvent !== false) {
157
- await this.lifecycleEventService.record({
158
- workspaceId,
159
- sessionId,
160
- kind: SessionLifecycleEventKind.SESSION_STOPPED,
161
- reason,
162
- message: SESSION_STOP_MESSAGES[reason],
163
- dedupeKey: `session-stop:${stopInvocationId}`,
164
- });
165
- }
166
- const current = this.getRuntimeSnapshot(sessionId);
167
- this.sessionDomainService.setRuntimeSnapshot(sessionId, {
168
- ...current,
169
- phase: 'stopping',
170
- activity: 'IDLE',
171
- updatedAt: new Date().toISOString(),
172
- });
173
- this.acpEventProcessor.clearStreamingState(sessionId);
174
- this.acpEventProcessor.clearReplaySuppression(sessionId);
175
- this.sessionPermissionService.cancelPendingRequests(sessionId);
176
- let stopClientFailed = false;
177
- try {
178
- await this.stopRuntimeAndPendingCreation(sessionId);
179
- }
180
- catch (error) {
181
- stopClientFailed = true;
182
- logger.warn('Error stopping ACP session runtime; continuing cleanup', {
183
- sessionId,
184
- error: error instanceof Error ? error.message : String(error),
185
- });
186
- }
187
- finally {
188
- this.finalizeOrphanedToolCalls(sessionId, 'session_stop');
189
- await this.updateStoppedSessionState(sessionId);
190
- this.sessionDomainService.setRuntimeSnapshot(sessionId, {
191
- phase: 'idle',
192
- processState: 'stopped',
193
- activity: 'IDLE',
194
- updatedAt: new Date().toISOString(),
195
- });
196
- this.markWorkspaceSessionIdleOnStop(workspaceId, sessionId);
197
- this.acpEventProcessor.clearSessionState(sessionId);
198
- if (!stopClientFailed) {
199
- const shouldCleanupTransientRatchetSession = options?.cleanupTransientRatchetSession ?? true;
200
- await this.cleanupTransientRatchetOnStop(session, sessionId, shouldCleanupTransientRatchetSession);
201
- }
202
- try {
203
- this.clearSessionStoreIfInactive(sessionId, 'manual_stop');
204
- logger.info('ACP session stopped', {
205
- sessionId,
206
- ...(stopClientFailed ? { runtimeStopFailed: true } : {}),
207
- });
208
- }
209
- finally {
210
- acpTraceLogger.closeSession(sessionId);
211
- }
212
- }
213
- }
214
- async stopRuntimeAndPendingCreation(sessionId) {
215
- await this.runtimeManager.stopClient(sessionId);
216
- const pendingCreations = this.clientCreationOperations.get(sessionId);
217
- if (!pendingCreations || pendingCreations.size === 0) {
218
- return;
219
- }
220
- await Promise.allSettled([...pendingCreations]);
221
- await this.runtimeManager.stopClient(sessionId);
28
+ this.assertConfigured();
29
+ await this.dependencies.terminationCoordinator.stopSession(sessionId, options);
222
30
  }
223
31
  async stopWorkspaceSessions(workspaceId, options) {
224
- const sessions = await this.repository.getSessionsByWorkspaceId(workspaceId);
225
- const stopErrors = [];
226
- for (const session of sessions) {
227
- const stopOptions = this.getWorkspaceSessionStopOptions(session, options?.reason ?? 'SYSTEM_STOP');
228
- if (!stopOptions) {
229
- continue;
230
- }
231
- try {
232
- await this.stopSession(session.id, stopOptions);
233
- }
234
- catch (error) {
235
- logger.error('Failed to stop workspace session', {
236
- sessionId: session.id,
237
- workspaceId,
238
- error: error instanceof Error ? error.message : String(error),
239
- });
240
- stopErrors.push(error);
241
- }
242
- }
243
- if (stopErrors.length > 0) {
244
- throw new Error(`Failed to stop ${stopErrors.length} workspace session${stopErrors.length === 1 ? '' : 's'}`);
245
- }
246
- logger.info('Stopped all workspace sessions', { workspaceId, count: sessions.length });
247
- }
248
- getWorkspaceSessionStopOptions(session, reason) {
249
- const browseOnlyClient = this.runtimeManager.isBrowseOnlySession(session.id);
250
- const activeClient = this.runtimeManager.isSessionRunning(session.id);
251
- if (!(session.status === SessionStatus.RUNNING || activeClient || browseOnlyClient)) {
252
- return null;
253
- }
254
- return {
255
- reason,
256
- ...(browseOnlyClient && !activeClient ? { recordLifecycleEvent: false } : {}),
257
- };
32
+ this.assertConfigured();
33
+ await this.dependencies.terminationCoordinator.stopWorkspaceSessions(workspaceId, options);
258
34
  }
259
35
  async getOrCreateSessionClient(sessionId, options) {
260
- return await this.runStartupOperation(sessionId, async (stopGeneration) => {
261
- const session = await this.repository.getSessionById(sessionId);
262
- if (!session) {
263
- throw new Error(`Session not found: ${sessionId}`);
264
- }
265
- this.assertStartupAllowed(sessionId, stopGeneration);
266
- const hadClient = !!this.runtimeManager.getClient(sessionId);
267
- const { handle, resolvedPreset, dispatchableNotificationCount } = await this.getOrCreateAcpSessionClient(sessionId, options ?? {}, session, stopGeneration);
268
- this.assertStartupAllowed(sessionId, stopGeneration);
269
- if (!hadClient) {
270
- await this.applyConfiguredPermissionPreset(sessionId, session, handle, resolvedPreset);
271
- this.assertStartupAllowed(sessionId, stopGeneration);
272
- await this.dispatchQueuedNotificationsIfNeeded(sessionId, dispatchableNotificationCount);
273
- this.assertStartupAllowed(sessionId, stopGeneration);
274
- }
275
- return handle;
276
- });
36
+ this.assertConfigured();
37
+ return await this.dependencies.startupCoordinator.getOrCreateSessionClient(sessionId, options);
277
38
  }
278
39
  async getOrCreateSessionClientFromRecord(session, options) {
279
- return await this.runStartupOperation(session.id, async (stopGeneration) => {
280
- this.assertStartupAllowed(session.id, stopGeneration);
281
- const hadClient = !!this.runtimeManager.getClient(session.id);
282
- const { handle, resolvedPreset, dispatchableNotificationCount } = await this.getOrCreateAcpSessionClient(session.id, options ?? {}, session, stopGeneration);
283
- this.assertStartupAllowed(session.id, stopGeneration);
284
- if (!hadClient) {
285
- await this.applyConfiguredPermissionPreset(session.id, session, handle, resolvedPreset);
286
- this.assertStartupAllowed(session.id, stopGeneration);
287
- await this.dispatchQueuedNotificationsIfNeeded(session.id, dispatchableNotificationCount);
288
- this.assertStartupAllowed(session.id, stopGeneration);
289
- }
290
- return handle;
291
- });
40
+ this.assertConfigured();
41
+ return await this.dependencies.startupCoordinator.getOrCreateSessionClientFromRecord(session, options);
292
42
  }
293
43
  async ensureSubagentBrowseSession(sessionId) {
294
- if (this.runtimeManager.getSubagentBrowseCapability(sessionId)) {
295
- return true;
296
- }
297
- const pendingClient = this.runtimeManager.getPendingClient(sessionId);
298
- if (pendingClient) {
299
- try {
300
- await pendingClient;
301
- }
302
- catch (error) {
303
- if (error instanceof AcpBrowseSessionUnavailableError) {
304
- return false;
305
- }
306
- throw error;
307
- }
308
- return await this.resolveSubagentBrowseSupport(sessionId);
309
- }
310
- return await this.runStartupOperation(sessionId, async (stopGeneration) => {
311
- const session = await this.repository.getSessionById(sessionId);
312
- if (!(session?.provider === 'CODEX' && session.providerSessionId)) {
313
- return false;
314
- }
315
- this.assertStartupAllowed(sessionId, stopGeneration);
316
- const workspace = await this.repository.getWorkspaceById(session.workspaceId);
317
- if (!workspace?.worktreePath ||
318
- workspace.status === 'ARCHIVING' ||
319
- workspace.status === 'ARCHIVED') {
320
- return false;
321
- }
322
- this.assertStartupAllowed(sessionId, stopGeneration);
323
- try {
324
- await this.createAcpClient(sessionId, { purpose: 'browse' }, session, undefined, stopGeneration);
325
- }
326
- catch (error) {
327
- if (error instanceof AcpBrowseSessionUnavailableError) {
328
- return false;
329
- }
330
- throw error;
331
- }
332
- return await this.resolveSubagentBrowseSupport(sessionId);
333
- }).catch((error) => {
334
- if (error instanceof SessionStartupCancelledError) {
335
- return false;
336
- }
337
- throw error;
338
- });
339
- }
340
- async resolveSubagentBrowseSupport(sessionId) {
341
- if (this.runtimeManager.getSubagentBrowseCapability(sessionId) !== null) {
342
- return true;
343
- }
344
- if (!this.runtimeManager.isBrowseOnlySession(sessionId)) {
345
- return false;
346
- }
347
- this.advanceStopGeneration(sessionId);
348
- try {
349
- await this.runtimeManager.stopClient(sessionId);
350
- }
351
- finally {
352
- this.acpEventProcessor.clearSessionState(sessionId);
353
- }
354
- return false;
44
+ this.assertConfigured();
45
+ return await this.dependencies.startupCoordinator.ensureSubagentBrowseSession(sessionId);
355
46
  }
356
47
  getSessionClient(sessionId) {
357
- return this.runtimeManager.getClient(sessionId);
48
+ return this.dependencies.runtimeManager.getClient(sessionId);
358
49
  }
359
50
  getRuntimeSnapshot(sessionId) {
360
51
  const fallback = createInitialSessionRuntimeState();
361
- const persisted = this.sessionDomainService.getRuntimeSnapshot(sessionId);
52
+ const persisted = this.dependencies.sessionDomainService.getRuntimeSnapshot(sessionId);
362
53
  const base = persisted ?? fallback;
363
- const acpClient = this.runtimeManager.getClient(sessionId);
54
+ const acpClient = this.dependencies.runtimeManager.getClient(sessionId);
364
55
  if (acpClient) {
365
- const isWorking = this.runtimeManager.isSessionWorking(sessionId);
56
+ const isWorking = this.dependencies.runtimeManager.isSessionWorking(sessionId);
366
57
  return {
367
58
  phase: isWorking ? 'running' : 'idle',
368
59
  processState: 'alive',
@@ -370,7 +61,7 @@ export class SessionLifecycleService {
370
61
  updatedAt: base.updatedAt,
371
62
  };
372
63
  }
373
- if (this.runtimeManager.isStopInProgress(sessionId)) {
64
+ if (this.dependencies.runtimeManager.isStopInProgress(sessionId)) {
374
65
  return {
375
66
  ...base,
376
67
  phase: 'stopping',
@@ -389,844 +80,32 @@ export class SessionLifecycleService {
389
80
  return base;
390
81
  }
391
82
  isSessionStopping(sessionId) {
392
- return this.stoppingSessions.has(sessionId) || this.runtimeManager.isStopInProgress(sessionId);
83
+ return this.dependencies.lifecycleGate.isSessionStopping(sessionId);
393
84
  }
394
85
  getStopGeneration(sessionId) {
395
- return this.stopGenerations.get(sessionId) ?? this.advanceStopGeneration(sessionId);
396
- }
397
- async runStartupOperation(sessionId, operation) {
398
- const stopGeneration = this.getStopGeneration(sessionId);
399
- this.startupGenerationReferences.set(stopGeneration, (this.startupGenerationReferences.get(stopGeneration) ?? 0) + 1);
400
- let succeeded = false;
401
- try {
402
- const result = await operation(stopGeneration);
403
- succeeded = true;
404
- return result;
405
- }
406
- finally {
407
- this.releaseStartupGeneration(sessionId, stopGeneration, succeeded);
408
- }
409
- }
410
- releaseStartupGeneration(sessionId, stopGeneration, succeeded) {
411
- const referenceCount = this.startupGenerationReferences.get(stopGeneration);
412
- if (referenceCount === undefined) {
413
- return;
414
- }
415
- if (referenceCount > 1) {
416
- this.startupGenerationReferences.set(stopGeneration, referenceCount - 1);
417
- return;
418
- }
419
- this.startupGenerationReferences.delete(stopGeneration);
420
- if (!(succeeded ||
421
- this.isSessionStopping(sessionId) ||
422
- this.runtimeManager.getClient(sessionId)) &&
423
- this.isStopGenerationCurrent(sessionId, stopGeneration)) {
424
- this.stopGenerations.delete(sessionId);
425
- }
86
+ return this.dependencies.lifecycleGate.getGeneration(sessionId);
426
87
  }
427
88
  isStopGenerationCurrent(sessionId, stopGeneration) {
428
- return this.stopGenerations.get(sessionId) === stopGeneration;
429
- }
430
- advanceStopGeneration(sessionId) {
431
- this.stopGenerationCounter += 1;
432
- this.stopGenerations.set(sessionId, this.stopGenerationCounter);
433
- return this.stopGenerationCounter;
89
+ return this.dependencies.lifecycleGate.isGenerationCurrent(sessionId, stopGeneration);
434
90
  }
435
- assertStartupAllowed(sessionId, stopGeneration) {
436
- if (this.isSessionStopping(sessionId) ||
437
- !this.isStopGenerationCurrent(sessionId, stopGeneration)) {
438
- throw new SessionStartupCancelledError();
439
- }
440
- }
441
- async getSessionOptions(sessionId) {
442
- const sessionContext = await this.loadSessionContext(sessionId);
443
- if (!sessionContext) {
444
- return null;
445
- }
446
- return {
447
- workingDir: sessionContext.workingDir,
448
- resumeProviderSessionId: sessionContext.resumeProviderSessionId,
449
- systemPrompt: sessionContext.systemPrompt,
450
- model: sessionContext.model,
451
- workspaceStatus: sessionContext.workspaceStatus,
452
- };
91
+ getSessionOptions(sessionId) {
92
+ return this.dependencies.contextService.getOptions(sessionId);
453
93
  }
454
94
  async stopAllClients(timeoutMs = 5000) {
455
- this.promptTurnCompletionService.clearAll();
456
- const shutdownSessionIds = this.runtimeManager.beginShutdown();
457
- const activeShutdownSessionIds = shutdownSessionIds.filter((sessionId) => !this.runtimeManager.isBrowseOnlySession(sessionId));
458
- for (const sessionId of activeShutdownSessionIds) {
459
- this.shutdownSessions.add(sessionId);
460
- }
461
- await this.recordShutdownLifecycleEvents(activeShutdownSessionIds);
462
- try {
463
- await this.runtimeManager.stopAllClients(timeoutMs);
464
- }
465
- catch (error) {
466
- logger.error('Failed to stop ACP clients during shutdown', {
467
- error: error instanceof Error ? error.message : String(error),
468
- });
469
- throw error;
470
- }
95
+ this.assertConfigured();
96
+ await this.dependencies.terminationCoordinator.stopAllClients(timeoutMs);
471
97
  }
472
- async recordShutdownLifecycleEvent(sessionId) {
473
- const session = await this.loadSessionForStop(sessionId);
474
- const workspaceId = session?.workspaceId ?? this.acpEventProcessor.getWorkspaceId(sessionId);
475
- if (!workspaceId) {
476
- logger.warn('Skipped shutdown lifecycle event without workspace owner', { sessionId });
477
- return;
478
- }
479
- await this.lifecycleEventService.record({
480
- workspaceId,
481
- sessionId,
482
- kind: SessionLifecycleEventKind.SESSION_STOPPED,
483
- reason: SessionLifecycleEventReason.SYSTEM_STOP,
484
- message: SESSION_STOP_MESSAGES.SYSTEM_STOP,
485
- dedupeKey: `session-stop:${randomUUID()}`,
486
- });
98
+ persistClosedSession(sessionId) {
99
+ this.assertConfigured();
100
+ return this.dependencies.workflowFinalizer.persistClosedSession(sessionId);
487
101
  }
488
- async recordShutdownLifecycleEvents(sessionIds) {
489
- const resultsPromise = Promise.allSettled(sessionIds.map((sessionId) => this.recordShutdownLifecycleEvent(sessionId)));
490
- let timeout;
491
- const results = await Promise.race([
492
- resultsPromise,
493
- new Promise((resolve) => {
494
- timeout = setTimeout(() => resolve(null), SHUTDOWN_LIFECYCLE_RECORD_TIMEOUT_MS);
495
- }),
496
- ]);
497
- if (timeout) {
498
- clearTimeout(timeout);
499
- }
500
- if (results === null) {
501
- logger.warn('Timed out recording shutdown lifecycle events; continuing shutdown', {
502
- timeoutMs: SHUTDOWN_LIFECYCLE_RECORD_TIMEOUT_MS,
503
- });
504
- return;
505
- }
506
- for (const [index, result] of results.entries()) {
507
- if (result.status === 'rejected') {
508
- logger.warn('Failed recording shutdown lifecycle event; continuing shutdown', {
509
- sessionId: sessionIds[index],
510
- error: result.reason instanceof Error ? result.reason.message : String(result.reason),
511
- });
512
- }
513
- }
514
- }
515
- setupAcpEventHandler(sessionId, options) {
516
- const runtimeEventHandler = this.acpEventProcessor.createRuntimeEventHandler(sessionId);
517
- const runtimeIncarnationId = randomUUID();
518
- const providerSessionIdHandler = options?.persistProviderSessionId === false
519
- ? {}
520
- : {
521
- onSessionId: async (sid, providerSessionId) => {
522
- try {
523
- await this.repository.updateSession(sid, { providerSessionId });
524
- acpTraceLogger.log(sid, 'runtime_metadata', {
525
- type: 'provider_session_id',
526
- providerSessionId,
527
- });
528
- logger.debug('Updated session with ACP providerSessionId', {
529
- sessionId: sid,
530
- providerSessionId,
531
- });
532
- }
533
- catch (error) {
534
- logger.warn('Failed to update session with ACP providerSessionId', {
535
- sessionId: sid,
536
- providerSessionId,
537
- error: error instanceof Error ? error.message : String(error),
538
- });
539
- }
540
- },
541
- };
542
- return {
543
- ...runtimeEventHandler,
544
- ...providerSessionIdHandler,
545
- onExit: async (sid, exitCode) => {
546
- this.stopGenerations.delete(sid);
547
- if (this.runtimeManager.isBrowseOnlySession(sid)) {
548
- this.acpEventProcessor.clearSessionState(sid);
549
- acpTraceLogger.closeSession(sid);
550
- return;
551
- }
552
- const wasDeliberateStop = this.stoppingSessions.has(sid) ||
553
- this.shutdownSessions.has(sid) ||
554
- this.runtimeManager.isStopInProgress(sid);
555
- this.prepareAcpRuntimeExit(sid, exitCode);
556
- await this.handleAcpRuntimeExit(sid, exitCode, wasDeliberateStop, runtimeIncarnationId);
557
- },
558
- onError: (sid, error) => {
559
- acpTraceLogger.log(sid, 'runtime_error', {
560
- message: error.message,
561
- stack: error.stack,
562
- });
563
- if (!this.runtimeManager.isBrowseOnlySession(sid)) {
564
- this.sessionDomainService.markError(sid, error.message);
565
- }
566
- logger.error('ACP client error', {
567
- sessionId: sid,
568
- error: error.message,
569
- stack: error.stack,
570
- });
571
- },
572
- onAcpLog: (sid, payload) => {
573
- this.acpEventProcessor.handleAcpLog(sid, payload);
574
- },
575
- };
576
- }
577
- prepareAcpRuntimeExit(sessionId, exitCode) {
578
- this.promptTurnCompletionService.clearSession(sessionId);
579
- this.onSessionExit?.(sessionId);
580
- this.finalizeOrphanedToolCalls(sessionId, 'runtime_exit');
581
- this.acpEventProcessor.clearSessionState(sessionId);
582
- this.sessionPermissionService.cancelPendingRequests(sessionId);
583
- acpTraceLogger.log(sessionId, 'runtime_exit', { exitCode });
584
- }
585
- async handleAcpRuntimeExit(sessionId, exitCode, wasDeliberateStop, runtimeIncarnationId) {
586
- try {
587
- this.sessionDomainService.markProcessExit(sessionId, exitCode);
588
- const session = await this.repository.getSessionById(sessionId);
589
- if (!session) {
590
- logger.warn('Failed to find ACP session on exit', { sessionId });
591
- return;
592
- }
593
- const persistedStatus = getPersistedStatusForExitCode(exitCode);
594
- try {
595
- await this.repository.updateSession(sessionId, { status: persistedStatus });
596
- logger.debug('Updated ACP session status on exit', {
597
- sessionId,
598
- exitCode,
599
- status: persistedStatus,
600
- });
601
- }
602
- catch (error) {
603
- logger.warn('Failed to update ACP session status on exit', {
604
- sessionId,
605
- error: error instanceof Error ? error.message : String(error),
606
- });
607
- }
608
- await this.recordUnexpectedExitIfNeeded(session, sessionId, exitCode, wasDeliberateStop, runtimeIncarnationId);
609
- await this.recordRatchetSessionEndOnExit(session.workspaceId, sessionId, exitCode);
610
- void this.maybeDiscoverPROnSessionEnd(session.workspaceId);
611
- await this.cleanupExitedWorkflow(session, sessionId, wasDeliberateStop);
612
- }
613
- catch (error) {
614
- logger.warn('Failed to process ACP session exit', {
615
- sessionId,
616
- error: error instanceof Error ? error.message : String(error),
617
- });
618
- }
619
- finally {
620
- try {
621
- this.clearSessionStoreIfInactive(sessionId, 'runtime_exit');
622
- }
623
- finally {
624
- acpTraceLogger.closeSession(sessionId);
625
- }
626
- }
102
+ recoverStaleRunningSessions() {
103
+ this.assertConfigured();
104
+ return this.dependencies.workflowFinalizer.recoverStaleRunningSessions();
627
105
  }
628
- async recordUnexpectedExitIfNeeded(session, sessionId, exitCode, wasDeliberateStop, runtimeIncarnationId) {
629
- if (wasDeliberateStop) {
630
- return;
631
- }
632
- await this.lifecycleEventService.record({
633
- workspaceId: session.workspaceId,
634
- sessionId,
635
- kind: SessionLifecycleEventKind.SESSION_STOPPED,
636
- reason: SessionLifecycleEventReason.UNEXPECTED_EXIT,
637
- message: exitCode === null
638
- ? 'Session stopped: agent process exited unexpectedly.'
639
- : `Session stopped: agent process exited unexpectedly (code ${exitCode}).`,
640
- dedupeKey: `process-exit:${runtimeIncarnationId}:${exitCode ?? 'signal'}`,
641
- });
642
- }
643
- async cleanupExitedWorkflow(session, sessionId, wasDeliberateStop) {
644
- if (session.workflow === 'ratchet') {
645
- await this.persistRatchetTranscript(sessionId);
646
- await this.repository.deleteSession(sessionId);
647
- this.sessionDomainService.clearSession(sessionId);
648
- logger.debug('Deleted transient ratchet ACP session', { sessionId });
649
- }
650
- if (session.workflow === 'auto-iteration' &&
651
- this.autoIterationExitBridge &&
652
- !wasDeliberateStop) {
653
- this.autoIterationExitBridge.onAutoIterationSessionExit(session.workspaceId, sessionId);
654
- }
655
- }
656
- async createAcpClient(sessionId, options, session, permissionPreset, stopGeneration = this.getStopGeneration(sessionId)) {
657
- const sessionContext = await this.loadSessionContext(sessionId, session);
658
- if (!sessionContext) {
659
- throw new Error(`Session context not ready: ${sessionId}`);
660
- }
661
- this.assertStartupAllowed(sessionId, stopGeneration);
662
- const browseOnly = options?.purpose === 'browse';
663
- if (!browseOnly) {
664
- await this.repository.markWorkspaceHasHadSessions(sessionContext.workspaceId);
665
- this.assertStartupAllowed(sessionId, stopGeneration);
666
- }
667
- this.acpEventProcessor.registerSessionContext(sessionId, {
668
- workspaceId: sessionContext.workspaceId,
669
- workingDir: sessionContext.workingDir,
670
- provider: session?.provider ?? 'CLAUDE',
671
- });
672
- const handlers = this.setupAcpEventHandler(sessionId, {
673
- persistProviderSessionId: !browseOnly,
674
- });
675
- const shouldSuppressReplay = this.shouldSuppressReplayDuringAcpResume(sessionId, session);
676
- this.acpEventProcessor.setReplaySuppression(sessionId, shouldSuppressReplay);
677
- const apiPort = String(configService.getBackendPort());
678
- const mcpServerConfig = getChildWorkspaceMcpServerConfig({
679
- workspaceId: sessionContext.workspaceId,
680
- parentWorkspaceId: sessionContext.parentWorkspaceId ?? null,
681
- apiBaseUrl: `http://localhost:${apiPort}`,
682
- });
683
- const clientOptions = {
684
- provider: session?.provider ?? 'CLAUDE',
685
- purpose: options?.purpose,
686
- workingDir: sessionContext.workingDir,
687
- model: options?.model ?? sessionContext.model,
688
- systemPrompt: sessionContext.systemPrompt,
689
- permissionPreset,
690
- sessionId,
691
- resumeProviderSessionId: session?.providerSessionId ?? undefined,
692
- mcpServers: [mcpServerConfig],
693
- };
694
- let handle;
695
- this.assertStartupAllowed(sessionId, stopGeneration);
696
- const creationPromise = this.runtimeManager.getOrCreateClient(sessionId, clientOptions, handlers, {
697
- workspaceId: sessionContext.workspaceId,
698
- workingDir: sessionContext.workingDir,
699
- });
700
- const sessionCreations = this.clientCreationOperations.get(sessionId) ?? new Set();
701
- sessionCreations.add(creationPromise);
702
- this.clientCreationOperations.set(sessionId, sessionCreations);
703
- try {
704
- handle = await creationPromise;
705
- this.assertStartupAllowed(sessionId, stopGeneration);
706
- if (browseOnly) {
707
- return { handle, dispatchableNotificationCount: 0 };
708
- }
709
- await this.sessionConfigService.applyConfiguredReasoningEffort(sessionId, handle, {
710
- persistSnapshot: false,
711
- emitUpdates: false,
712
- });
713
- }
714
- catch (error) {
715
- this.clearAcpSessionStateAfterFailedCreation(sessionId, sessionCreations);
716
- throw error;
717
- }
718
- finally {
719
- sessionCreations.delete(creationPromise);
720
- if (sessionCreations.size === 0) {
721
- this.clientCreationOperations.delete(sessionId);
722
- }
723
- }
724
- this.assertStartupAllowed(sessionId, stopGeneration);
725
- await this.persistAcpConfigSnapshot(sessionId, {
726
- provider: handle.provider,
727
- providerSessionId: handle.providerSessionId,
728
- configOptions: handle.configOptions,
729
- existingMetadata: session?.providerMetadata ?? undefined,
730
- });
731
- if (handle.configOptions.length > 0) {
732
- this.sessionDomainService.emitDelta(sessionId, {
733
- type: 'config_options_update',
734
- configOptions: handle.configOptions,
735
- });
736
- }
737
- this.sessionDomainService.emitDelta(sessionId, {
738
- type: 'chat_capabilities',
739
- capabilities: this.buildAcpChatBarCapabilities(handle),
740
- });
741
- this.assertStartupAllowed(sessionId, stopGeneration);
742
- const dispatchableNotificationCount = await this.deliverPendingChildNotifications(sessionId, sessionContext.workspaceId, stopGeneration);
743
- return { handle, dispatchableNotificationCount };
744
- }
745
- clearAcpSessionStateAfterFailedCreation(sessionId, sessionCreations) {
746
- if (sessionCreations.size === 1) {
747
- this.acpEventProcessor.clearSessionState(sessionId);
748
- }
749
- }
750
- shouldSuppressReplayDuringAcpResume(sessionId, session) {
751
- if (!session?.providerSessionId) {
752
- return false;
753
- }
754
- if (!this.sessionDomainService.isHistoryHydrated(sessionId)) {
755
- return false;
756
- }
757
- return this.sessionDomainService.getTranscriptSnapshot(sessionId).length > 0;
758
- }
759
- async applyStartupModePreset(sessionId, handle, startupModePreset, workflow) {
760
- await this.sessionConfigService.applyStartupModePreset(sessionId, handle, startupModePreset, workflow, {
761
- persistSnapshot: this.persistAcpConfigSnapshot.bind(this),
762
- });
763
- }
764
- async applyConfiguredPermissionPreset(sessionId, session, handle, permissionPreset) {
765
- await this.sessionConfigService.applyConfiguredPermissionPreset(sessionId, session, handle, permissionPreset);
766
- }
767
- finalizeOrphanedToolCalls(sessionId, reason) {
768
- try {
769
- this.acpEventProcessor.finalizeOrphanedToolCalls(sessionId, reason);
770
- }
771
- catch (error) {
772
- logger.warn('Failed finalizing orphaned ACP tool calls', {
773
- sessionId,
774
- reason,
775
- error: error instanceof Error ? error.message : String(error),
776
- });
777
- this.acpEventProcessor.clearPendingToolCalls(sessionId);
778
- }
779
- }
780
- markWorkspaceSessionIdleOnStop(workspaceId, sessionId) {
781
- if (!(workspaceId && this.workspaceBridge)) {
782
- return;
783
- }
784
- try {
785
- this.workspaceBridge.markSessionIdle(workspaceId, sessionId);
786
- }
787
- catch (error) {
788
- logger.warn('Failed to mark workspace session idle during stop', {
789
- sessionId,
790
- workspaceId,
791
- error: error instanceof Error ? error.message : String(error),
792
- });
793
- }
794
- }
795
- async loadSessionForStop(sessionId) {
796
- try {
797
- return await this.retryService.run(() => this.repository.getSessionById(sessionId), {
798
- attempts: 2,
799
- operationName: 'loadSessionForStop',
800
- context: { sessionId },
801
- });
802
- }
803
- catch (error) {
804
- logger.warn('Failed to load session before stop; continuing with process shutdown', {
805
- sessionId,
806
- error: error instanceof Error ? error.message : String(error),
807
- });
808
- return null;
809
- }
810
- }
811
- async updateStoppedSessionState(sessionId) {
812
- try {
813
- await this.retryService.run(() => this.repository.updateSessionIfStatus(sessionId, {
814
- status: SessionStatus.IDLE,
815
- }, [SessionStatus.RUNNING]), {
816
- attempts: 2,
817
- operationName: 'updateStoppedSessionState',
818
- context: { sessionId },
819
- });
820
- }
821
- catch (error) {
822
- logger.warn('Failed to update session state during stop; continuing cleanup', {
823
- sessionId,
824
- error: error instanceof Error ? error.message : String(error),
825
- });
826
- }
827
- }
828
- async cleanupTransientRatchetOnStop(session, sessionId, shouldCleanupTransientRatchetSession) {
829
- if (session?.workflow !== 'ratchet') {
830
- return;
831
- }
832
- try {
833
- await this.recordRatchetSessionEnd(session.workspaceId, sessionId, 'COMPLETED');
834
- }
835
- catch (error) {
836
- logger.warn('Failed settling ratchet dispatch record during stop', {
837
- sessionId,
838
- workspaceId: session.workspaceId,
839
- error: error instanceof Error ? error.message : String(error),
840
- });
841
- }
842
- if (!shouldCleanupTransientRatchetSession) {
843
- return;
844
- }
845
- try {
846
- await this.persistRatchetTranscript(sessionId);
847
- await this.repository.deleteSession(sessionId);
848
- this.sessionDomainService.clearSession(sessionId);
849
- logger.debug('Deleted transient ratchet session after stop', { sessionId });
850
- }
851
- catch (error) {
852
- logger.warn('Failed persisting or deleting transient ratchet session during stop', {
853
- sessionId,
854
- error: error instanceof Error ? error.message : String(error),
855
- });
856
- }
857
- }
858
- async recordRatchetSessionEnd(workspaceId, sessionId, outcome) {
859
- if (!this.workspaceBridge) {
860
- return;
861
- }
862
- await this.workspaceBridge.recordRatchetSessionEnd(workspaceId, sessionId, outcome);
863
- }
864
- async recordRatchetSessionEndOnExit(workspaceId, sessionId, exitCode) {
865
- const outcome = exitCode === 0 || this.runtimeManager.isStopInProgress(sessionId) ? 'COMPLETED' : 'DIED';
866
- await this.recordRatchetSessionEnd(workspaceId, sessionId, outcome);
867
- }
868
- async maybeDiscoverPROnSessionEnd(workspaceId) {
869
- if (!this.workspaceBridge) {
870
- return;
871
- }
872
- await maybeDiscoverPROnSessionEndHelper(workspaceId, logger, this.workspaceBridge);
873
- }
874
- clearSessionStoreIfInactive(sessionId, reason) {
875
- if (this.runtimeManager.isSessionRunning(sessionId) ||
876
- sessionEventBus.countViewers(sessionId) > 0) {
877
- return;
878
- }
879
- this.sessionDomainService.clearSession(sessionId, { preserveRejections: true });
880
- logger.debug('Cleared inactive in-memory session state', { sessionId, reason });
881
- }
882
- async persistClosedSession(sessionId) {
883
- const session = await this.repository.getSessionById(sessionId);
884
- if (!session) {
885
- logger.warn('Cannot persist closed session: session not found', { sessionId });
886
- return;
887
- }
888
- const workspace = await workspaceDataService.findById(session.workspaceId);
889
- if (!workspace?.worktreePath) {
890
- logger.warn('Cannot persist closed session: no worktree path', {
891
- sessionId,
892
- workspaceId: session.workspaceId,
893
- });
894
- return;
895
- }
896
- await this.hydrateProviderHistory(sessionId, {
897
- ...session,
898
- workspace: { worktreePath: workspace.worktreePath },
899
- });
900
- await this.lifecycleEventService.hydrate(sessionId);
901
- const transcript = this.sessionDomainService.getTranscriptSnapshot(sessionId);
902
- await closedSessionPersistenceService.persistClosedSession({
903
- sessionId,
904
- workspaceId: session.workspaceId,
905
- worktreePath: workspace.worktreePath,
906
- name: session.name,
907
- workflow: session.workflow,
908
- provider: session.provider,
909
- model: session.model,
910
- startedAt: session.createdAt,
911
- messages: transcript,
912
- });
913
- }
914
- async persistRatchetTranscript(sessionId) {
915
- await this.persistClosedSession(sessionId);
916
- }
917
- async getOrCreateAcpSessionClient(sessionId, options, session, stopGeneration) {
918
- this.assertStartupAllowed(sessionId, stopGeneration);
919
- const existingAcp = this.runtimeManager.getClient(sessionId);
920
- if (existingAcp) {
921
- this.sessionDomainService.setRuntimeSnapshot(sessionId, {
922
- phase: existingAcp.isPromptInFlight ? 'running' : 'idle',
923
- processState: 'alive',
924
- activity: existingAcp.isPromptInFlight ? 'WORKING' : 'IDLE',
925
- updatedAt: new Date().toISOString(),
926
- });
927
- return { handle: existingAcp, dispatchableNotificationCount: 0 };
928
- }
929
- this.sessionDomainService.setRuntimeSnapshot(sessionId, {
930
- phase: 'starting',
931
- processState: 'alive',
932
- activity: 'IDLE',
933
- updatedAt: new Date().toISOString(),
934
- });
935
- const resolvedPreset = await this.resolvePermissionPreset(session);
936
- this.assertStartupAllowed(sessionId, stopGeneration);
937
- let handle;
938
- let dispatchableNotificationCount = 0;
939
- try {
940
- const created = await this.createAcpClient(sessionId, options, session, resolvedPreset, stopGeneration);
941
- handle = created.handle;
942
- dispatchableNotificationCount = created.dispatchableNotificationCount;
943
- }
944
- catch (error) {
945
- this.sessionDomainService.setRuntimeSnapshot(sessionId, {
946
- phase: 'error',
947
- processState: 'stopped',
948
- activity: 'IDLE',
949
- errorMessage: `Failed to start agent: ${toErrorMessage(error)}`,
950
- updatedAt: new Date().toISOString(),
951
- });
952
- throw error;
953
- }
954
- this.assertStartupAllowed(sessionId, stopGeneration);
955
- await this.repository.updateSession(sessionId, {
956
- status: SessionStatus.RUNNING,
957
- });
958
- this.sessionDomainService.setRuntimeSnapshot(sessionId, {
959
- phase: handle.isPromptInFlight ? 'running' : 'idle',
960
- processState: 'alive',
961
- activity: handle.isPromptInFlight ? 'WORKING' : 'IDLE',
962
- updatedAt: new Date().toISOString(),
963
- });
964
- return { handle, resolvedPreset, dispatchableNotificationCount };
965
- }
966
- async dispatchQueuedNotificationsIfNeeded(sessionId, dispatchableNotificationCount) {
967
- if (dispatchableNotificationCount === 0 || !this.messageQueueBridge) {
968
- return;
969
- }
970
- try {
971
- await this.messageQueueBridge.tryDispatchNextMessage(sessionId);
972
- }
973
- catch (error) {
974
- logger.warn('Failed to dispatch queued workspace notifications', {
975
- sessionId,
976
- error: error instanceof Error ? error.message : String(error),
977
- });
978
- }
979
- }
980
- async persistAcpConfigSnapshot(sessionId, params) {
981
- await this.sessionConfigService.persistAcpConfigSnapshot(sessionId, params);
982
- }
983
- buildAcpChatBarCapabilities(handle) {
984
- return this.sessionConfigService.buildAcpChatBarCapabilities(handle);
985
- }
986
- async loadSessionContext(sessionId, preloadedSession) {
987
- const session = preloadedSession ?? (await this.repository.getSessionById(sessionId));
988
- if (!session) {
989
- logger.warn('Session not found when getting options', { sessionId });
990
- return null;
991
- }
992
- const workspace = await this.repository.getWorkspaceById(session.workspaceId);
993
- if (!workspace?.worktreePath) {
994
- logger.warn('Workspace or worktree not found', {
995
- sessionId,
996
- workspaceId: session.workspaceId,
997
- });
998
- return null;
999
- }
1000
- const shouldInjectBranchRename = this.promptBuilder.shouldInjectBranchRename({
1001
- branchName: workspace.branchName,
1002
- isAutoGeneratedBranch: workspace.isAutoGeneratedBranch,
1003
- hasHadSessions: workspace.hasHadSessions,
1004
- });
1005
- const project = shouldInjectBranchRename
1006
- ? await this.repository.getProjectById(workspace.projectId)
1007
- : null;
1008
- if (shouldInjectBranchRename && !project) {
1009
- logger.warn('Project not found when building branch rename instruction', {
1010
- sessionId,
1011
- projectId: workspace.projectId,
1012
- });
1013
- }
1014
- const parentCtx = await this.resolveParentWorkspaceContext(workspace);
1015
- const { workflowPrompt, systemPrompt, injectedBranchRename } = this.promptBuilder.buildSystemPrompt({
1016
- workflow: session.workflow,
1017
- workspace: {
1018
- branchName: workspace.branchName,
1019
- isAutoGeneratedBranch: workspace.isAutoGeneratedBranch,
1020
- hasHadSessions: workspace.hasHadSessions,
1021
- name: workspace.name,
1022
- description: workspace.description ?? undefined,
1023
- runScriptPort: workspace.runScriptPort,
1024
- parentWorkspaceId: workspace.parentWorkspaceId,
1025
- parentWorkspaceName: parentCtx.parentWorkspaceName,
1026
- parentProjectName: parentCtx.parentProjectName,
1027
- reportBackOn: parentCtx.reportBackOn,
1028
- },
1029
- project,
1030
- });
1031
- logger.info('Loaded workflow prompt for session options', {
1032
- sessionId,
1033
- workflow: session.workflow,
1034
- hasPrompt: !!workflowPrompt,
1035
- promptLength: workflowPrompt?.length ?? 0,
1036
- });
1037
- if (injectedBranchRename) {
1038
- logger.info('Injected branch rename instruction', {
1039
- sessionId,
1040
- branchName: workspace.branchName,
1041
- branchPrefix: project?.githubOwner,
1042
- });
1043
- }
1044
- return {
1045
- workingDir: workspace.worktreePath,
1046
- resumeProviderSessionId: session.providerSessionId ?? undefined,
1047
- systemPrompt,
1048
- model: session.model,
1049
- workspaceId: workspace.id,
1050
- workspaceStatus: workspace.status,
1051
- parentWorkspaceId: workspace.parentWorkspaceId,
1052
- };
1053
- }
1054
- async deliverPendingChildNotifications(sessionId, workspaceId, stopGeneration = this.getStopGeneration(sessionId)) {
1055
- try {
1056
- const pending = await workspaceNotificationService.listPendingForDelivery(workspaceId);
1057
- this.assertStartupAllowed(sessionId, stopGeneration);
1058
- if (pending.length === 0) {
1059
- return 0;
1060
- }
1061
- if (!this.messageQueueBridge) {
1062
- logger.warn('Cannot deliver pending workspace notifications: message queue bridge missing', {
1063
- sessionId,
1064
- workspaceId,
1065
- count: pending.length,
1066
- });
1067
- return 0;
1068
- }
1069
- let enqueuedCount = 0;
1070
- let dispatchableCount = 0;
1071
- const consumedContentMatchIds = new Set();
1072
- for (const notification of pending) {
1073
- this.assertStartupAllowed(sessionId, stopGeneration);
1074
- const timestamp = notification.createdAt.toISOString();
1075
- const messageId = workspaceNotificationMessageId(notification.id);
1076
- if (this.sessionDomainService.hasQueuedMessage(sessionId, messageId)) {
1077
- dispatchableCount += 1;
1078
- continue;
1079
- }
1080
- let claudeMessage;
1081
- if (notification.direction === 'PARENT_TO_CHILD') {
1082
- claudeMessage = {
1083
- type: 'parent_workspace_update',
1084
- parentWorkspaceId: notification.sourceWorkspaceId,
1085
- parentWorkspaceName: notification.sourceWorkspaceName,
1086
- parentProjectName: notification.sourceProjectName,
1087
- text: notification.message,
1088
- timestamp,
1089
- };
1090
- }
1091
- else {
1092
- claudeMessage = {
1093
- type: 'child_workspace_update',
1094
- childWorkspaceId: notification.sourceWorkspaceId,
1095
- childWorkspaceName: notification.sourceWorkspaceName,
1096
- childProjectName: notification.sourceProjectName,
1097
- text: notification.message,
1098
- timestamp,
1099
- };
1100
- }
1101
- const enqueueText = buildWorkspaceNotificationMessageText(notification);
1102
- const alreadyDelivered = await this.markDeliveredIfTranscriptMatch(sessionId, workspaceId, notification.id, messageId, enqueueText, consumedContentMatchIds);
1103
- this.assertStartupAllowed(sessionId, stopGeneration);
1104
- if (alreadyDelivered) {
1105
- continue;
1106
- }
1107
- if (this.sessionDomainService.hasQueuedMessage(sessionId, messageId)) {
1108
- dispatchableCount += 1;
1109
- continue;
1110
- }
1111
- const enqueueResult = this.sessionDomainService.enqueue(sessionId, {
1112
- id: messageId,
1113
- text: enqueueText,
1114
- timestamp,
1115
- settings: {
1116
- selectedModel: null,
1117
- reasoningEffort: null,
1118
- thinkingEnabled: false,
1119
- planModeEnabled: false,
1120
- },
1121
- });
1122
- if ('error' in enqueueResult) {
1123
- logger.warn('Failed to enqueue pending workspace notification', {
1124
- sessionId,
1125
- workspaceId,
1126
- notificationId: notification.id,
1127
- error: enqueueResult.error,
1128
- });
1129
- continue;
1130
- }
1131
- enqueuedCount += 1;
1132
- dispatchableCount += 1;
1133
- const order = this.sessionDomainService.appendClaudeEvent(sessionId, claudeMessage);
1134
- this.sessionDomainService.emitDelta(sessionId, {
1135
- type: 'agent_message',
1136
- data: claudeMessage,
1137
- order,
1138
- });
1139
- }
1140
- logger.info('Queued pending workspace notifications', {
1141
- sessionId,
1142
- workspaceId,
1143
- count: enqueuedCount,
1144
- dispatchableCount,
1145
- });
1146
- return dispatchableCount;
1147
- }
1148
- catch (error) {
1149
- logger.warn('Failed to deliver pending workspace notifications', {
1150
- sessionId,
1151
- workspaceId,
1152
- error: error instanceof Error ? error.message : String(error),
1153
- });
1154
- return 0;
1155
- }
1156
- }
1157
- findCommittedQueuedWorkspaceNotificationMessage(sessionId, messageId, messageText, consumedContentMatchIds) {
1158
- const userEntries = this.sessionDomainService
1159
- .getTranscriptSnapshot(sessionId)
1160
- .filter((entry) => entry.source === 'user');
1161
- const exactIdMatch = userEntries.find((entry) => entry.id === messageId);
1162
- if (exactIdMatch) {
1163
- return { id: exactIdMatch.id, matchedByContent: false };
1164
- }
1165
- if (this.sessionDomainService.getHistoryHydrationSource(sessionId) !== 'jsonl') {
1166
- return undefined;
1167
- }
1168
- const contentMatch = userEntries.find((entry) => !entry.id.startsWith(WORKSPACE_NOTIFICATION_MESSAGE_ID_PREFIX) &&
1169
- entry.text === messageText &&
1170
- !consumedContentMatchIds.has(entry.id));
1171
- if (contentMatch) {
1172
- return { id: contentMatch.id, matchedByContent: true };
1173
- }
1174
- return undefined;
1175
- }
1176
- async markDeliveredIfTranscriptMatch(sessionId, workspaceId, notificationId, messageId, messageText, consumedContentMatchIds) {
1177
- const committedMessage = this.findCommittedQueuedWorkspaceNotificationMessage(sessionId, messageId, messageText, consumedContentMatchIds);
1178
- if (!committedMessage) {
1179
- return false;
1180
- }
1181
- if (committedMessage.matchedByContent) {
1182
- consumedContentMatchIds.add(committedMessage.id);
1183
- }
1184
- await this.markDeliveredAfterTranscriptMatch(sessionId, workspaceId, notificationId);
1185
- return true;
1186
- }
1187
- async markDeliveredAfterTranscriptMatch(sessionId, workspaceId, notificationId) {
1188
- try {
1189
- await workspaceNotificationService.markDelivered([notificationId]);
1190
- }
1191
- catch (error) {
1192
- logger.warn('Failed to mark already-transcripted workspace notification delivered', {
1193
- sessionId,
1194
- workspaceId,
1195
- notificationId,
1196
- error: error instanceof Error ? error.message : String(error),
1197
- });
1198
- }
1199
- }
1200
- async resolveParentWorkspaceContext(workspace) {
1201
- if (!workspace.parentWorkspaceId) {
1202
- return {};
1203
- }
1204
- let parentWorkspaceName;
1205
- let parentProjectName;
1206
- const parentWorkspace = await this.repository.getWorkspaceById(workspace.parentWorkspaceId);
1207
- if (parentWorkspace) {
1208
- parentWorkspaceName = parentWorkspace.name;
1209
- const parentProject = await this.repository.getProjectById(parentWorkspace.projectId);
1210
- parentProjectName = parentProject?.name;
1211
- }
1212
- const metadata = workspace.creationMetadata;
1213
- const reportBackOn = typeof metadata?.reportBackOn === 'string' ? metadata.reportBackOn : undefined;
1214
- return { parentWorkspaceName, parentProjectName, reportBackOn };
1215
- }
1216
- async resolvePermissionPreset(session) {
1217
- const fallback = session?.workflow === 'ratchet' ? 'YOLO' : 'STRICT';
1218
- try {
1219
- const settings = await userSettingsService.get();
1220
- return session?.workflow === 'ratchet'
1221
- ? settings.ratchetPermissions
1222
- : settings.defaultWorkspacePermissions;
1223
- }
1224
- catch (error) {
1225
- logger.warn('Failed loading user permission preset; using default', {
1226
- workflow: session?.workflow,
1227
- error: error instanceof Error ? error.message : String(error),
1228
- });
1229
- return fallback;
106
+ assertConfigured() {
107
+ if (!this.configured) {
108
+ throw new Error('SessionLifecycleService not configured: lifecycle bridges missing');
1230
109
  }
1231
110
  }
1232
111
  }