factory-factory 0.4.5 → 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 (766) hide show
  1. package/dist/client/assets/{abnfDiagram-VRR7QNED-DygwVN25.js → abnfDiagram-N423BO3Z-BZQ2vUo6.js} +1 -1
  2. package/dist/client/assets/{arc-CcnMw5av.js → arc-XI8Jpfl3.js} +1 -1
  3. package/dist/client/assets/architectureDiagram-T3A2C74G-Dt7Y1pyP.js +36 -0
  4. package/dist/client/assets/{blockDiagram-677ZJIJ3-DQ77xvqH.js → blockDiagram-VBNYF7ZC-DldefwGh.js} +1 -1
  5. package/dist/client/assets/{c4Diagram-LMCZKHZV-B-9QZJ1e.js → c4Diagram-5PPSVZJV-Ba08x7Ef.js} +1 -1
  6. package/dist/client/assets/channel-CRP5IiHm.js +1 -0
  7. package/dist/client/assets/{chunk-32BRIVSS-CV9UmSkI.js → chunk-2GRJ4B5K-B9S0F-4G.js} +1 -1
  8. package/dist/client/assets/{chunk-2Q5K7J3B-DhfBY-Wd.js → chunk-2Q5K7J3B-CZXgC_Jx.js} +1 -1
  9. package/dist/client/assets/{chunk-EX3LRPZG-Dj63JdET.js → chunk-5RXB4S5H-3z0Q5lZX.js} +1 -1
  10. package/dist/client/assets/{chunk-5VM5RSS4-BUNj3iDY.js → chunk-5VM5RSS4-D2hwZzSy.js} +1 -1
  11. package/dist/client/assets/{chunk-MOJQB5TN-PY5GLOxr.js → chunk-6Q2QTUOP-DhgyUVVB.js} +1 -1
  12. package/dist/client/assets/{chunk-V7JOEXUC--zp7Z0xS.js → chunk-GF5L2VYU-B9CpXn1z.js} +1 -1
  13. package/dist/client/assets/{chunk-JWPE2WC7-i6Ud3VAu.js → chunk-JWPE2WC7-C3uO_aKI.js} +1 -1
  14. package/dist/client/assets/{chunk-VR4S4FIN-JstmsazP.js → chunk-KBJHAD2P-BclkmYso.js} +1 -1
  15. package/dist/client/assets/{chunk-RYQCIY6F-pIEuQy1L.js → chunk-RYQCIY6F-D6aZFqMZ.js} +1 -1
  16. package/dist/client/assets/{chunk-XXDRQBXY-C66lsFmy.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-D3jSuAHn.js → cose-bilkent-JH36ORCC-WLzzMmoC.js} +1 -1
  20. package/dist/client/assets/{cynefin-VYW2F7L2-Dx3xfGS7.js → cynefin-VYW2F7L2-D2EF0q2Q.js} +1 -1
  21. package/dist/client/assets/{cynefinDiagram-TSTJHNR4-BcGYZcSJ.js → cynefinDiagram-MW4NZA55-CwoCQCrP.js} +1 -1
  22. package/dist/client/assets/{dagre-VKFMJZFB-CLZSDf9x.js → dagre-VZM6K2ZE-Cg4AkVGB.js} +1 -1
  23. package/dist/client/assets/{diagram-OA4YK3LP-C7WEtC2B.js → diagram-7IWD3JNH-D9lnDmSl.js} +1 -1
  24. package/dist/client/assets/{diagram-FQU43EPY-Nosv2FJf.js → diagram-B4RE2ZJO-AhUFMusY.js} +1 -1
  25. package/dist/client/assets/{diagram-NH7WQ7WH-BmRiUIAJ.js → diagram-LBJQPF4R-C81JtkuS.js} +1 -1
  26. package/dist/client/assets/{diagram-G47NLZAW-CPjqONaO.js → diagram-Q27KOJAE-BOzaYlQ2.js} +1 -1
  27. package/dist/client/assets/diagram-UB23O5K3-uXHocDB0.js +41 -0
  28. package/dist/client/assets/{ebnfDiagram-CCIWWBDH-D2Ye87k4.js → ebnfDiagram-BXEA7PRR-Du4yOTiI.js} +1 -1
  29. package/dist/client/assets/{erDiagram-Q63AITRT-CgZF8eG-.js → erDiagram-JOGREHBK-BxBwtYA0.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-23GEKE2U-bxoO3Eep.js → flowDiagram-UKHOOZJN-YQc_Us9R.js} +6 -6
  31. package/dist/client/assets/{ganttDiagram-NO4QXBWP-BAtqPw6P.js → ganttDiagram-PKOTCBZU-CO08NXgj.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-DYQqeJ8w.js → gitGraphDiagram-DS77QQ5N-NRBrIkNv.js} +1 -1
  33. package/dist/client/assets/index-CVVo6xHd.css +1 -0
  34. package/dist/client/assets/index-CrLTUCBe.js +695 -0
  35. package/dist/client/assets/{infoDiagram-FWYZ7A6U-CZQCerFQ.js → infoDiagram-6WML65LV-CcOh5qQM.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-Bc7wE25N.js → ishikawaDiagram-WSZJBQD7-Ci4gKk1n.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-5HDEW3XC-D5qqjKJz.js → journeyDiagram-NVQOT4AX-CpW1inrw.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-HUTT4EX6-42kkaHBo.js → kanban-definition-27J2QSJJ-jez_FwZT.js} +1 -1
  39. package/dist/client/assets/{linear-Dg3NQEM3.js → linear-6SNETQpS.js} +1 -1
  40. package/dist/client/assets/{mindmap-definition-LN4V7U3C-CRANKUcD.js → mindmap-definition-FAOFIHXS-SmrP71Hb.js} +1 -1
  41. package/dist/client/assets/{mobile-baseline-D6bQ8WTB.js → mobile-baseline-8VVGaFwv.js} +1 -1
  42. package/dist/client/assets/{pegDiagram-2B236MQR-qJQPOd8H.js → pegDiagram-VL7TDLO6-BdZpPP9I.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-ENE6RG2P-B5wB7Ccf.js → pieDiagram-7S7Q4E2Y-JiNW5VtU.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-CCZfXF8m.js → quadrantDiagram-CIZ2JOQS-C2VhzPor.js} +1 -1
  45. package/dist/client/assets/{railroadDiagram-RFXS5EU6-BuIrSJUW.js → railroadDiagram-AXF67PYL-BdfHLYrf.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-TGXJPOKE-DfIr0zZ3.js → requirementDiagram-LRYGKXZP-BRxDcjdJ.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-HTMAVEWB-CJoUXRWq.js → sankeyDiagram-W5VNT64P-BvibpHKV.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-Cq1lOU1b.js → sequenceDiagram-SI44F4Z6-CstrIf8Q.js} +1 -1
  49. package/dist/client/assets/{sizeCapture-X5ZJPWSS-XHOsOkor.js → sizeCapture-X5ZJPWSS-fplvtb2v.js} +1 -1
  50. package/dist/client/assets/{stateDiagram-2N3HPSRC-BLVzzete.js → stateDiagram-OKZ733FA-Cb0qJfhN.js} +1 -1
  51. package/dist/client/assets/stateDiagram-v2-UEYNNEHI-C_Uzjhvg.js +1 -0
  52. package/dist/client/assets/{swimlanes-5IMT3BWC-C20mYIPR.js → swimlanes-SLNWSIFB-BAqCm7Gx.js} +2 -2
  53. package/dist/client/assets/swimlanesDiagram-ULZ7WXOC-CO4t8Utk.js +8 -0
  54. package/dist/client/assets/{terminal-instance-Dw2gcPib.js → terminal-instance-B0prRfF6.js} +1 -1
  55. package/dist/client/assets/{timeline-definition-FHXFAJF6-DlceJAxJ.js → timeline-definition-Z64GVDOM-BZbQ0pZK.js} +1 -1
  56. package/dist/client/assets/{vennDiagram-L72KCM5P-CFl-Eo1Y.js → vennDiagram-T6HMQDX7-B3YQXfS4.js} +1 -1
  57. package/dist/client/assets/{wardleyDiagram-EHGQE667-eBpeLOoN.js → wardleyDiagram-T6FBY63Y-Cufi2KwO.js} +1 -1
  58. package/dist/client/assets/{xychartDiagram-FW5EYKEG-B8RBkKiX.js → xychartDiagram-ELKLHX3M-CHGxh5zQ.js} +4 -4
  59. package/dist/client/audio-worklets/pcm-capture-processor.js +67 -0
  60. package/dist/client/index.html +2 -2
  61. package/dist/client/sounds/voice-thinking-start.mp3 +0 -0
  62. package/dist/prisma/generated/commonInputTypes.d.ts +40 -0
  63. package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -1
  64. package/dist/prisma/generated/enums.d.ts +1 -0
  65. package/dist/prisma/generated/enums.d.ts.map +1 -1
  66. package/dist/prisma/generated/enums.js +2 -1
  67. package/dist/prisma/generated/enums.js.map +1 -1
  68. package/dist/prisma/generated/internal/class.js +4 -4
  69. package/dist/prisma/generated/internal/class.js.map +1 -1
  70. package/dist/prisma/generated/internal/prismaNamespace.d.ts +7 -1
  71. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  72. package/dist/prisma/generated/internal/prismaNamespace.js +6 -0
  73. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  74. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +6 -0
  75. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  76. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +6 -0
  77. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  78. package/dist/prisma/generated/models/UserSettings.d.ts +216 -1
  79. package/dist/prisma/generated/models/UserSettings.d.ts.map +1 -1
  80. package/dist/src/backend/app-context.d.ts +4 -1
  81. package/dist/src/backend/app-context.d.ts.map +1 -1
  82. package/dist/src/backend/app-context.js +6 -3
  83. package/dist/src/backend/app-context.js.map +1 -1
  84. package/dist/src/backend/app-context.test.js +6 -1
  85. package/dist/src/backend/app-context.test.js.map +1 -1
  86. package/dist/src/backend/clients/git.client.d.ts +0 -8
  87. package/dist/src/backend/clients/git.client.d.ts.map +1 -1
  88. package/dist/src/backend/clients/git.client.js +0 -70
  89. package/dist/src/backend/clients/git.client.js.map +1 -1
  90. package/dist/src/backend/clients/git.client.test.js +2 -178
  91. package/dist/src/backend/clients/git.client.test.js.map +1 -1
  92. package/dist/src/backend/interceptors/branch-naming.interceptor.test.js +3 -2
  93. package/dist/src/backend/interceptors/branch-naming.interceptor.test.js.map +1 -1
  94. package/dist/src/backend/lib/file-helpers.d.ts +0 -1
  95. package/dist/src/backend/lib/file-helpers.d.ts.map +1 -1
  96. package/dist/src/backend/lib/file-helpers.js +0 -27
  97. package/dist/src/backend/lib/file-helpers.js.map +1 -1
  98. package/dist/src/backend/lib/shell.d.ts +0 -4
  99. package/dist/src/backend/lib/shell.d.ts.map +1 -1
  100. package/dist/src/backend/lib/shell.js +0 -25
  101. package/dist/src/backend/lib/shell.js.map +1 -1
  102. package/dist/src/backend/orchestration/data-backup.service.d.ts.map +1 -1
  103. package/dist/src/backend/orchestration/data-backup.service.js +10 -0
  104. package/dist/src/backend/orchestration/data-backup.service.js.map +1 -1
  105. package/dist/src/backend/orchestration/data-backup.service.test.js +23 -0
  106. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  107. package/dist/src/backend/orchestration/reconciliation.service.d.ts.map +1 -1
  108. package/dist/src/backend/orchestration/reconciliation.service.js +4 -0
  109. package/dist/src/backend/orchestration/reconciliation.service.js.map +1 -1
  110. package/dist/src/backend/orchestration/reconciliation.service.test.js +39 -0
  111. package/dist/src/backend/orchestration/reconciliation.service.test.js.map +1 -1
  112. package/dist/src/backend/routers/websocket/chat.handler.d.ts.map +1 -1
  113. package/dist/src/backend/routers/websocket/chat.handler.js +1 -17
  114. package/dist/src/backend/routers/websocket/chat.handler.js.map +1 -1
  115. package/dist/src/backend/routers/websocket/chat.handler.test.js +2 -8
  116. package/dist/src/backend/routers/websocket/chat.handler.test.js.map +1 -1
  117. package/dist/src/backend/routers/websocket/index.d.ts +1 -0
  118. package/dist/src/backend/routers/websocket/index.d.ts.map +1 -1
  119. package/dist/src/backend/routers/websocket/index.js +1 -0
  120. package/dist/src/backend/routers/websocket/index.js.map +1 -1
  121. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.d.ts +11 -0
  122. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.d.ts.map +1 -0
  123. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.js +28 -0
  124. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.js.map +1 -0
  125. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.d.ts +2 -0
  126. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.d.ts.map +1 -0
  127. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.js +84 -0
  128. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.js.map +1 -0
  129. package/dist/src/backend/routers/websocket/voice.handler.d.ts +3 -0
  130. package/dist/src/backend/routers/websocket/voice.handler.d.ts.map +1 -0
  131. package/dist/src/backend/routers/websocket/voice.handler.js +46 -0
  132. package/dist/src/backend/routers/websocket/voice.handler.js.map +1 -0
  133. package/dist/src/backend/routers/websocket/websocket.integration.test.js +0 -4
  134. package/dist/src/backend/routers/websocket/websocket.integration.test.js.map +1 -1
  135. package/dist/src/backend/server.d.ts.map +1 -1
  136. package/dist/src/backend/server.js +5 -3
  137. package/dist/src/backend/server.js.map +1 -1
  138. package/dist/src/backend/server.upgrade.test.js +26 -4
  139. package/dist/src/backend/server.upgrade.test.js.map +1 -1
  140. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.d.ts +0 -2
  141. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.d.ts.map +1 -1
  142. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.js +0 -6
  143. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.js.map +1 -1
  144. package/dist/src/backend/services/github/service/github-cli/schemas.d.ts +0 -23
  145. package/dist/src/backend/services/github/service/github-cli/schemas.d.ts.map +1 -1
  146. package/dist/src/backend/services/github/service/github-cli/schemas.js +0 -18
  147. package/dist/src/backend/services/github/service/github-cli/schemas.js.map +1 -1
  148. package/dist/src/backend/services/github/service/github-cli.service.d.ts +0 -2
  149. package/dist/src/backend/services/github/service/github-cli.service.d.ts.map +1 -1
  150. package/dist/src/backend/services/github/service/github-cli.service.js +0 -37
  151. package/dist/src/backend/services/github/service/github-cli.service.js.map +1 -1
  152. package/dist/src/backend/services/github/service/github-cli.service.test.js +3 -13
  153. package/dist/src/backend/services/github/service/github-cli.service.test.js.map +1 -1
  154. package/dist/src/backend/services/ratchet/service/ratchet.service.test.js +6 -0
  155. package/dist/src/backend/services/ratchet/service/ratchet.service.test.js.map +1 -1
  156. package/dist/src/backend/services/session/resources/agent-session.accessor.d.ts +0 -1
  157. package/dist/src/backend/services/session/resources/agent-session.accessor.d.ts.map +1 -1
  158. package/dist/src/backend/services/session/resources/agent-session.accessor.js +0 -8
  159. package/dist/src/backend/services/session/resources/agent-session.accessor.js.map +1 -1
  160. package/dist/src/backend/services/session/resources/agent-session.accessor.test.js +0 -10
  161. package/dist/src/backend/services/session/resources/agent-session.accessor.test.js.map +1 -1
  162. package/dist/src/backend/services/session/service/acp/acp-client-factory.d.ts +33 -0
  163. package/dist/src/backend/services/session/service/acp/acp-client-factory.d.ts.map +1 -0
  164. package/dist/src/backend/services/session/service/acp/acp-client-factory.js +274 -0
  165. package/dist/src/backend/services/session/service/acp/acp-client-factory.js.map +1 -0
  166. package/dist/src/backend/services/session/service/acp/acp-client-factory.test.d.ts +2 -0
  167. package/dist/src/backend/services/session/service/acp/acp-client-factory.test.d.ts.map +1 -0
  168. package/dist/src/backend/services/session/service/acp/acp-client-factory.test.js +454 -0
  169. package/dist/src/backend/services/session/service/acp/acp-client-factory.test.js.map +1 -0
  170. package/dist/src/backend/services/session/service/acp/acp-client-handler.d.ts +1 -0
  171. package/dist/src/backend/services/session/service/acp/acp-client-handler.d.ts.map +1 -1
  172. package/dist/src/backend/services/session/service/acp/acp-client-handler.js +47 -0
  173. package/dist/src/backend/services/session/service/acp/acp-client-handler.js.map +1 -1
  174. package/dist/src/backend/services/session/service/acp/acp-client-handler.test.js +228 -0
  175. package/dist/src/backend/services/session/service/acp/acp-client-handler.test.js.map +1 -1
  176. package/dist/src/backend/services/session/service/acp/acp-event-translator.d.ts +1 -37
  177. package/dist/src/backend/services/session/service/acp/acp-event-translator.d.ts.map +1 -1
  178. package/dist/src/backend/services/session/service/acp/acp-event-translator.js +1 -334
  179. package/dist/src/backend/services/session/service/acp/acp-event-translator.js.map +1 -1
  180. package/dist/src/backend/services/session/service/acp/acp-event-translator.test.js +5 -484
  181. package/dist/src/backend/services/session/service/acp/acp-event-translator.test.js.map +1 -1
  182. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.d.ts +0 -1
  183. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.d.ts.map +1 -1
  184. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.js +0 -3
  185. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.js.map +1 -1
  186. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.test.js +0 -10
  187. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.test.js.map +1 -1
  188. package/dist/src/backend/services/session/service/acp/acp-process-handle.d.ts +2 -0
  189. package/dist/src/backend/services/session/service/acp/acp-process-handle.d.ts.map +1 -1
  190. package/dist/src/backend/services/session/service/acp/acp-process-handle.js +12 -0
  191. package/dist/src/backend/services/session/service/acp/acp-process-handle.js.map +1 -1
  192. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.d.ts +2 -0
  193. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.d.ts.map +1 -0
  194. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.js +83 -0
  195. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.js.map +1 -0
  196. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.d.ts +17 -0
  197. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.d.ts.map +1 -0
  198. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.js +96 -0
  199. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.js.map +1 -0
  200. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.test.d.ts +2 -0
  201. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.test.d.ts.map +1 -0
  202. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.test.js +140 -0
  203. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.test.js.map +1 -0
  204. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.d.ts +8 -0
  205. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.d.ts.map +1 -0
  206. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.js +81 -0
  207. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.js.map +1 -0
  208. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.test.d.ts +2 -0
  209. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.test.d.ts.map +1 -0
  210. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.test.js +208 -0
  211. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.test.js.map +1 -0
  212. package/dist/src/backend/services/session/service/acp/acp-runtime-contracts.d.ts +25 -0
  213. package/dist/src/backend/services/session/service/acp/acp-runtime-contracts.d.ts.map +1 -0
  214. package/dist/src/backend/services/session/service/acp/acp-runtime-contracts.js +2 -0
  215. package/dist/src/backend/services/session/service/acp/acp-runtime-contracts.js.map +1 -0
  216. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.d.ts +5 -0
  217. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.d.ts.map +1 -0
  218. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.js +39 -0
  219. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.js.map +1 -0
  220. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.d.ts +20 -0
  221. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.d.ts.map +1 -0
  222. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.js +68 -0
  223. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.js.map +1 -0
  224. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.test.d.ts +2 -0
  225. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.test.d.ts.map +1 -0
  226. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.test.js +17 -0
  227. package/dist/src/backend/services/session/service/acp/acp-runtime-errors.test.js.map +1 -0
  228. package/dist/src/backend/services/session/service/acp/acp-runtime-events.d.ts +36 -1
  229. package/dist/src/backend/services/session/service/acp/acp-runtime-events.d.ts.map +1 -1
  230. package/dist/src/backend/services/session/service/acp/acp-runtime-exit-handler.d.ts +5 -0
  231. package/dist/src/backend/services/session/service/acp/acp-runtime-exit-handler.d.ts.map +1 -0
  232. package/dist/src/backend/services/session/service/acp/acp-runtime-exit-handler.js +35 -0
  233. package/dist/src/backend/services/session/service/acp/acp-runtime-exit-handler.js.map +1 -0
  234. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.browsing.test.d.ts +2 -0
  235. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.browsing.test.d.ts.map +1 -0
  236. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.browsing.test.js +310 -0
  237. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.browsing.test.js.map +1 -0
  238. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.config.test.d.ts +2 -0
  239. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.config.test.d.ts.map +1 -0
  240. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.config.test.js +162 -0
  241. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.config.test.js.map +1 -0
  242. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.creation.test.d.ts +2 -0
  243. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.creation.test.d.ts.map +1 -0
  244. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.creation.test.js +390 -0
  245. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.creation.test.js.map +1 -0
  246. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts +24 -56
  247. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts.map +1 -1
  248. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.facade.test.d.ts +2 -0
  249. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.facade.test.d.ts.map +1 -0
  250. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.facade.test.js +59 -0
  251. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.facade.test.js.map +1 -0
  252. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.js +69 -811
  253. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.js.map +1 -1
  254. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.prompt.test.d.ts +2 -0
  255. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.prompt.test.d.ts.map +1 -0
  256. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.prompt.test.js +185 -0
  257. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.prompt.test.js.map +1 -0
  258. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.task-status.test.d.ts +2 -0
  259. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.task-status.test.d.ts.map +1 -0
  260. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.task-status.test.js +57 -0
  261. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.task-status.test.js.map +1 -0
  262. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.termination.test.d.ts +2 -0
  263. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.termination.test.d.ts.map +1 -0
  264. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.termination.test.js +392 -0
  265. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.termination.test.js.map +1 -0
  266. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.d.ts +27 -0
  267. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.d.ts.map +1 -0
  268. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.js +96 -0
  269. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.js.map +1 -0
  270. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.d.ts +59 -0
  271. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.d.ts.map +1 -0
  272. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.js +142 -0
  273. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.js.map +1 -0
  274. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.d.ts +21 -0
  275. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.d.ts.map +1 -0
  276. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.js +112 -0
  277. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.js.map +1 -0
  278. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.test.d.ts +2 -0
  279. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.test.d.ts.map +1 -0
  280. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.test.js +142 -0
  281. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.test.js.map +1 -0
  282. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.creation.test.d.ts +2 -0
  283. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.creation.test.d.ts.map +1 -0
  284. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.creation.test.js +333 -0
  285. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.creation.test.js.map +1 -0
  286. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.d.ts +85 -0
  287. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.d.ts.map +1 -0
  288. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.js +633 -0
  289. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.js.map +1 -0
  290. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.status.test.d.ts +2 -0
  291. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.status.test.d.ts.map +1 -0
  292. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.status.test.js +99 -0
  293. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.status.test.js.map +1 -0
  294. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.termination.test.d.ts +2 -0
  295. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.termination.test.d.ts.map +1 -0
  296. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.termination.test.js +490 -0
  297. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.termination.test.js.map +1 -0
  298. package/dist/src/backend/services/session/service/acp/acp-session-config-options.d.ts +1 -0
  299. package/dist/src/backend/services/session/service/acp/acp-session-config-options.d.ts.map +1 -1
  300. package/dist/src/backend/services/session/service/acp/acp-session-config-options.js +4 -17
  301. package/dist/src/backend/services/session/service/acp/acp-session-config-options.js.map +1 -1
  302. package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.d.ts +2 -0
  303. package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.d.ts.map +1 -0
  304. package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.js +121 -0
  305. package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.js.map +1 -0
  306. package/dist/src/backend/services/session/service/acp/acp-session-negotiation.integration.test.js +1 -1
  307. package/dist/src/backend/services/session/service/acp/acp-session-negotiation.integration.test.js.map +1 -1
  308. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.d.ts +9 -0
  309. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.d.ts.map +1 -0
  310. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.js +96 -0
  311. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.js.map +1 -0
  312. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.test.d.ts +2 -0
  313. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.test.d.ts.map +1 -0
  314. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.test.js +171 -0
  315. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.test.js.map +1 -0
  316. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.d.ts +7 -0
  317. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.d.ts.map +1 -0
  318. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.js +160 -0
  319. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.js.map +1 -0
  320. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.d.ts +2 -0
  321. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.d.ts.map +1 -0
  322. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.js +260 -0
  323. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.js.map +1 -0
  324. package/dist/src/backend/services/session/service/acp/claude-model-options.d.ts +5 -0
  325. package/dist/src/backend/services/session/service/acp/claude-model-options.d.ts.map +1 -0
  326. package/dist/src/backend/services/session/service/acp/claude-model-options.js +25 -0
  327. package/dist/src/backend/services/session/service/acp/claude-model-options.js.map +1 -0
  328. package/dist/src/backend/services/session/service/acp/claude-model-options.test.d.ts +2 -0
  329. package/dist/src/backend/services/session/service/acp/claude-model-options.test.d.ts.map +1 -0
  330. package/dist/src/backend/services/session/service/acp/claude-model-options.test.js +49 -0
  331. package/dist/src/backend/services/session/service/acp/claude-model-options.test.js.map +1 -0
  332. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/adapter-state.d.ts +2 -0
  333. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/adapter-state.d.ts.map +1 -1
  334. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +3 -1
  335. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
  336. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +78 -7
  337. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
  338. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js +169 -0
  339. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js.map +1 -1
  340. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.d.ts +2 -0
  341. 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
  342. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.js +265 -0
  343. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.js.map +1 -0
  344. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +283 -14
  345. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -1
  346. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.d.ts +7 -0
  347. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.d.ts.map +1 -0
  348. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.js +98 -0
  349. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.js.map +1 -0
  350. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.d.ts +2 -0
  351. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.d.ts.map +1 -0
  352. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.js +148 -0
  353. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.js.map +1 -0
  354. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.d.ts +38 -0
  355. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.d.ts.map +1 -0
  356. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.js +287 -0
  357. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.js.map +1 -0
  358. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.d.ts +2 -0
  359. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.d.ts.map +1 -0
  360. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.js +648 -0
  361. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.js.map +1 -0
  362. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.d.ts +12 -0
  363. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.d.ts.map +1 -0
  364. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.js +51 -0
  365. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.js.map +1 -0
  366. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.d.ts +2 -0
  367. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.d.ts.map +1 -0
  368. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.js +95 -0
  369. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.js.map +1 -0
  370. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.d.ts +226 -19
  371. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.d.ts.map +1 -1
  372. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.js +118 -4
  373. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.js.map +1 -1
  374. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.js +125 -1
  375. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.js.map +1 -1
  376. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.d.ts +17 -1
  377. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.d.ts.map +1 -1
  378. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.js +231 -30
  379. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.js.map +1 -1
  380. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.js +689 -4
  381. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.js.map +1 -1
  382. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.d.ts +8 -0
  383. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.d.ts.map +1 -0
  384. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.js +9 -0
  385. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.js.map +1 -0
  386. package/dist/src/backend/services/session/service/acp/index.d.ts +3 -2
  387. package/dist/src/backend/services/session/service/acp/index.d.ts.map +1 -1
  388. package/dist/src/backend/services/session/service/acp/index.js +2 -0
  389. package/dist/src/backend/services/session/service/acp/index.js.map +1 -1
  390. package/dist/src/backend/services/session/service/acp/types.d.ts +1 -0
  391. package/dist/src/backend/services/session/service/acp/types.d.ts.map +1 -1
  392. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.d.ts +3 -0
  393. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.d.ts.map +1 -1
  394. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.js +44 -2
  395. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.js.map +1 -1
  396. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.d.ts +2 -0
  397. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.d.ts.map +1 -0
  398. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.js +108 -0
  399. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.js.map +1 -0
  400. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.d.ts.map +1 -1
  401. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.js +9 -1
  402. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.js.map +1 -1
  403. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.recovery.test.d.ts +2 -0
  404. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.recovery.test.d.ts.map +1 -0
  405. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.recovery.test.js +195 -0
  406. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.recovery.test.js.map +1 -0
  407. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.test.js +1 -23
  408. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.test.js.map +1 -1
  409. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.d.ts.map +1 -1
  410. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.js +4 -0
  411. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.js.map +1 -1
  412. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.test.js +23 -5
  413. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.test.js.map +1 -1
  414. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-config-option.handler.js +1 -1
  415. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-config-option.handler.js.map +1 -1
  416. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-config-option.handler.test.js +1 -1
  417. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-config-option.handler.test.js.map +1 -1
  418. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-thinking-budget.handler.js +1 -1
  419. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-thinking-budget.handler.js.map +1 -1
  420. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-thinking-budget.handler.test.js +1 -1
  421. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/set-thinking-budget.handler.test.js.map +1 -1
  422. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.d.ts +4 -2
  423. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.d.ts.map +1 -1
  424. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.js +2 -7
  425. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.js.map +1 -1
  426. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.test.js +9 -11
  427. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.test.js.map +1 -1
  428. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.js +1 -1
  429. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.js.map +1 -1
  430. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.test.js +1 -3
  431. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.test.js.map +1 -1
  432. package/dist/src/backend/services/session/service/chat/chat-message-handlers/registry.d.ts.map +1 -1
  433. package/dist/src/backend/services/session/service/chat/chat-message-handlers/registry.js +3 -2
  434. package/dist/src/backend/services/session/service/chat/chat-message-handlers/registry.js.map +1 -1
  435. package/dist/src/backend/services/session/service/chat/chat-message-handlers/types.d.ts +24 -8
  436. package/dist/src/backend/services/session/service/chat/chat-message-handlers/types.d.ts.map +1 -1
  437. package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.d.ts.map +1 -1
  438. package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.js +1 -0
  439. package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.js.map +1 -1
  440. package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.test.js +17 -0
  441. package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.test.js.map +1 -1
  442. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.d.ts +16 -15
  443. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.d.ts.map +1 -1
  444. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js +86 -115
  445. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js.map +1 -1
  446. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js +179 -219
  447. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js.map +1 -1
  448. package/dist/src/backend/services/session/service/data/session-data.service.d.ts +0 -2
  449. package/dist/src/backend/services/session/service/data/session-data.service.d.ts.map +1 -1
  450. package/dist/src/backend/services/session/service/data/session-data.service.js +0 -6
  451. package/dist/src/backend/services/session/service/data/session-data.service.js.map +1 -1
  452. package/dist/src/backend/services/session/service/data/session-data.service.test.js +0 -6
  453. package/dist/src/backend/services/session/service/data/session-data.service.test.js.map +1 -1
  454. package/dist/src/backend/services/session/service/data/session-provider-resolver.service.test.js +6 -0
  455. package/dist/src/backend/services/session/service/data/session-provider-resolver.service.test.js.map +1 -1
  456. package/dist/src/backend/services/session/service/index.d.ts +6 -6
  457. package/dist/src/backend/services/session/service/index.d.ts.map +1 -1
  458. package/dist/src/backend/services/session/service/index.js +4 -3
  459. package/dist/src/backend/services/session/service/index.js.map +1 -1
  460. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.d.ts +1 -0
  461. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.d.ts.map +1 -1
  462. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.js +45 -26
  463. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.js.map +1 -1
  464. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.d.ts +2 -0
  465. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.d.ts.map +1 -0
  466. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.js +117 -0
  467. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.js.map +1 -0
  468. package/dist/src/backend/services/session/service/lifecycle/session-context.service.d.ts +33 -0
  469. package/dist/src/backend/services/session/service/lifecycle/session-context.service.d.ts.map +1 -0
  470. package/dist/src/backend/services/session/service/lifecycle/session-context.service.js +120 -0
  471. package/dist/src/backend/services/session/service/lifecycle/session-context.service.js.map +1 -0
  472. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.d.ts +2 -0
  473. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.d.ts.map +1 -0
  474. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.js +174 -0
  475. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.js.map +1 -0
  476. package/dist/src/backend/services/session/service/lifecycle/session-core-services.d.ts +23 -0
  477. package/dist/src/backend/services/session/service/lifecycle/session-core-services.d.ts.map +1 -0
  478. package/dist/src/backend/services/session/service/lifecycle/session-core-services.js +150 -0
  479. package/dist/src/backend/services/session/service/lifecycle/session-core-services.js.map +1 -0
  480. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.d.ts +5 -0
  481. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.d.ts.map +1 -0
  482. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.js +38 -0
  483. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.js.map +1 -0
  484. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.d.ts +2 -0
  485. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.d.ts.map +1 -0
  486. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.js +52 -0
  487. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.js.map +1 -0
  488. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.d.ts +35 -0
  489. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.d.ts.map +1 -0
  490. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.js +120 -0
  491. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.js.map +1 -0
  492. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.test.d.ts +2 -0
  493. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.test.d.ts.map +1 -0
  494. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.test.js +192 -0
  495. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.test.js.map +1 -0
  496. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.d.ts +115 -0
  497. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.d.ts.map +1 -0
  498. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.js +434 -0
  499. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.js.map +1 -0
  500. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.types.d.ts +13 -0
  501. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.types.d.ts.map +1 -0
  502. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.types.js +2 -0
  503. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.types.js.map +1 -0
  504. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.d.ts +81 -0
  505. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.d.ts.map +1 -0
  506. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.js +242 -0
  507. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.js.map +1 -0
  508. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.test.d.ts +2 -0
  509. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.test.d.ts.map +1 -0
  510. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.test.js +528 -0
  511. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.test.js.map +1 -0
  512. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.d.ts +39 -0
  513. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.d.ts.map +1 -0
  514. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.js +208 -0
  515. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.js.map +1 -0
  516. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.d.ts +2 -0
  517. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.d.ts.map +1 -0
  518. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.js +274 -0
  519. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.js.map +1 -0
  520. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.d.ts +2 -0
  521. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.d.ts.map +1 -0
  522. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.js +105 -0
  523. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.js.map +1 -0
  524. package/dist/src/backend/services/session/service/lifecycle/session-services.d.ts +5 -17
  525. package/dist/src/backend/services/session/service/lifecycle/session-services.d.ts.map +1 -1
  526. package/dist/src/backend/services/session/service/lifecycle/session-services.js +14 -87
  527. package/dist/src/backend/services/session/service/lifecycle/session-services.js.map +1 -1
  528. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.d.ts +64 -0
  529. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.d.ts.map +1 -0
  530. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.js +352 -0
  531. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.js.map +1 -0
  532. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.test.d.ts +2 -0
  533. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.test.d.ts.map +1 -0
  534. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.test.js +702 -0
  535. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.test.js.map +1 -0
  536. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.d.ts +54 -0
  537. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.d.ts.map +1 -0
  538. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.js +265 -0
  539. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.js.map +1 -0
  540. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.test.d.ts +2 -0
  541. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.test.d.ts.map +1 -0
  542. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.test.js +514 -0
  543. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.test.js.map +1 -0
  544. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.d.ts +62 -0
  545. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.d.ts.map +1 -0
  546. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.js +175 -0
  547. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.js.map +1 -0
  548. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.test.d.ts +2 -0
  549. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.test.d.ts.map +1 -0
  550. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.test.js +294 -0
  551. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.test.js.map +1 -0
  552. package/dist/src/backend/services/session/service/lifecycle/session.config.service.d.ts.map +1 -1
  553. package/dist/src/backend/services/session/service/lifecycle/session.config.service.js +8 -4
  554. package/dist/src/backend/services/session/service/lifecycle/session.config.service.js.map +1 -1
  555. package/dist/src/backend/services/session/service/lifecycle/session.config.service.test.js +58 -5
  556. package/dist/src/backend/services/session/service/lifecycle/session.config.service.test.js.map +1 -1
  557. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.d.ts +2 -0
  558. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.d.ts.map +1 -0
  559. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.js +431 -0
  560. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.js.map +1 -0
  561. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts +25 -113
  562. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts.map +1 -1
  563. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js +49 -1069
  564. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js.map +1 -1
  565. package/dist/src/backend/services/session/service/lifecycle/session.prompt.service.test.js +11 -6
  566. package/dist/src/backend/services/session/service/lifecycle/session.prompt.service.test.js.map +1 -1
  567. package/dist/src/backend/services/session/service/lifecycle/session.service.d.ts +3 -6
  568. package/dist/src/backend/services/session/service/lifecycle/session.service.d.ts.map +1 -1
  569. package/dist/src/backend/services/session/service/lifecycle/session.service.js +9 -12
  570. package/dist/src/backend/services/session/service/lifecycle/session.service.js.map +1 -1
  571. package/dist/src/backend/services/session/service/lifecycle/session.service.test.js +88 -41
  572. package/dist/src/backend/services/session/service/lifecycle/session.service.test.js.map +1 -1
  573. package/dist/src/backend/services/session/service/session-domain.service.d.ts.map +1 -1
  574. package/dist/src/backend/services/session/service/session-domain.service.js +1 -0
  575. package/dist/src/backend/services/session/service/session-domain.service.js.map +1 -1
  576. package/dist/src/backend/services/session/service/store/session-store.types.d.ts +1 -1
  577. package/dist/src/backend/services/session/service/store/session-store.types.d.ts.map +1 -1
  578. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.d.ts +3 -0
  579. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.d.ts.map +1 -0
  580. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.js +92 -0
  581. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.js.map +1 -0
  582. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.test.d.ts +2 -0
  583. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.test.d.ts.map +1 -0
  584. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.test.js +81 -0
  585. package/dist/src/backend/services/session/service/store/session-tool-call-recovery.test.js.map +1 -0
  586. package/dist/src/backend/services/session/service/voice/voice-mode-instructions.d.ts +2 -0
  587. package/dist/src/backend/services/session/service/voice/voice-mode-instructions.d.ts.map +1 -0
  588. package/dist/src/backend/services/session/service/voice/voice-mode-instructions.js +5 -0
  589. package/dist/src/backend/services/session/service/voice/voice-mode-instructions.js.map +1 -0
  590. package/dist/src/backend/services/session/service/voice/voice-narration.service.d.ts +28 -0
  591. package/dist/src/backend/services/session/service/voice/voice-narration.service.d.ts.map +1 -0
  592. package/dist/src/backend/services/session/service/voice/voice-narration.service.js +431 -0
  593. package/dist/src/backend/services/session/service/voice/voice-narration.service.js.map +1 -0
  594. package/dist/src/backend/services/session/service/voice/voice-narration.service.test.d.ts +2 -0
  595. package/dist/src/backend/services/session/service/voice/voice-narration.service.test.d.ts.map +1 -0
  596. package/dist/src/backend/services/session/service/voice/voice-narration.service.test.js +536 -0
  597. package/dist/src/backend/services/session/service/voice/voice-narration.service.test.js.map +1 -0
  598. package/dist/src/backend/services/settings/resources/user-settings.accessor.d.ts +6 -0
  599. package/dist/src/backend/services/settings/resources/user-settings.accessor.d.ts.map +1 -1
  600. package/dist/src/backend/services/settings/resources/user-settings.accessor.js +46 -17
  601. package/dist/src/backend/services/settings/resources/user-settings.accessor.js.map +1 -1
  602. package/dist/src/backend/services/settings/service/user-settings.service.d.ts +6 -0
  603. package/dist/src/backend/services/settings/service/user-settings.service.d.ts.map +1 -1
  604. package/dist/src/backend/services/settings/service/user-settings.service.js.map +1 -1
  605. package/dist/src/backend/services/workspace/resources/project.accessor.d.ts +0 -1
  606. package/dist/src/backend/services/workspace/resources/project.accessor.d.ts.map +1 -1
  607. package/dist/src/backend/services/workspace/resources/project.accessor.js +0 -13
  608. package/dist/src/backend/services/workspace/resources/project.accessor.js.map +1 -1
  609. package/dist/src/backend/services/workspace/resources/workspace.accessor.d.ts +0 -1
  610. package/dist/src/backend/services/workspace/resources/workspace.accessor.d.ts.map +1 -1
  611. package/dist/src/backend/services/workspace/resources/workspace.accessor.js +0 -10
  612. package/dist/src/backend/services/workspace/resources/workspace.accessor.js.map +1 -1
  613. package/dist/src/backend/services/workspace/resources/workspace.accessor.test.js +3 -8
  614. package/dist/src/backend/services/workspace/resources/workspace.accessor.test.js.map +1 -1
  615. package/dist/src/backend/services/workspace/service/index.d.ts +9 -10
  616. package/dist/src/backend/services/workspace/service/index.d.ts.map +1 -1
  617. package/dist/src/backend/services/workspace/service/index.js +5 -5
  618. package/dist/src/backend/services/workspace/service/index.js.map +1 -1
  619. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js +12 -0
  620. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js.map +1 -1
  621. package/dist/src/backend/services/workspace/service/lifecycle/data.service.d.ts +4 -4
  622. package/dist/src/backend/services/workspace/service/workspace-domain-exports.test.js +1 -7
  623. package/dist/src/backend/services/workspace/service/workspace-domain-exports.test.js.map +1 -1
  624. package/dist/src/backend/services/workspace/service/worktree/git-ops.service.test.js +0 -1
  625. package/dist/src/backend/services/workspace/service/worktree/git-ops.service.test.js.map +1 -1
  626. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.d.ts.map +1 -1
  627. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.js +9 -12
  628. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.js.map +1 -1
  629. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.test.js +5 -4
  630. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.test.js.map +1 -1
  631. package/dist/src/backend/testing/npm-publish-workflow.test.d.ts +2 -0
  632. package/dist/src/backend/testing/npm-publish-workflow.test.d.ts.map +1 -0
  633. package/dist/src/backend/testing/npm-publish-workflow.test.js +205 -0
  634. package/dist/src/backend/testing/npm-publish-workflow.test.js.map +1 -0
  635. package/dist/src/backend/trpc/admin.trpc.d.ts +10 -0
  636. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  637. package/dist/src/backend/trpc/index.d.ts +633 -22
  638. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  639. package/dist/src/backend/trpc/index.js +2 -0
  640. package/dist/src/backend/trpc/index.js.map +1 -1
  641. package/dist/src/backend/trpc/pr-review.router.test.js +1 -12
  642. package/dist/src/backend/trpc/pr-review.router.test.js.map +1 -1
  643. package/dist/src/backend/trpc/pr-review.trpc.d.ts +0 -16
  644. package/dist/src/backend/trpc/pr-review.trpc.d.ts.map +1 -1
  645. package/dist/src/backend/trpc/pr-review.trpc.js +0 -14
  646. package/dist/src/backend/trpc/pr-review.trpc.js.map +1 -1
  647. package/dist/src/backend/trpc/session.router.test.js +170 -3
  648. package/dist/src/backend/trpc/session.router.test.js.map +1 -1
  649. package/dist/src/backend/trpc/session.trpc.d.ts +539 -0
  650. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  651. package/dist/src/backend/trpc/session.trpc.js +53 -0
  652. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  653. package/dist/src/backend/trpc/user-settings.router.test.js +117 -6
  654. package/dist/src/backend/trpc/user-settings.router.test.js.map +1 -1
  655. package/dist/src/backend/trpc/user-settings.trpc.d.ts +16 -4
  656. package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -1
  657. package/dist/src/backend/trpc/user-settings.trpc.js +25 -2
  658. package/dist/src/backend/trpc/user-settings.trpc.js.map +1 -1
  659. package/dist/src/backend/trpc/voice.trpc.d.ts +67 -0
  660. package/dist/src/backend/trpc/voice.trpc.d.ts.map +1 -0
  661. package/dist/src/backend/trpc/voice.trpc.js +156 -0
  662. package/dist/src/backend/trpc/voice.trpc.js.map +1 -0
  663. package/dist/src/backend/trpc/voice.trpc.test.d.ts +2 -0
  664. package/dist/src/backend/trpc/voice.trpc.test.d.ts.map +1 -0
  665. package/dist/src/backend/trpc/voice.trpc.test.js +259 -0
  666. package/dist/src/backend/trpc/voice.trpc.test.js.map +1 -0
  667. package/dist/src/backend/trpc/workspace.router.test.js +41 -2
  668. package/dist/src/backend/trpc/workspace.router.test.js.map +1 -1
  669. package/dist/src/backend/trpc/workspace.trpc.d.ts +4 -4
  670. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  671. package/dist/src/backend/trpc/workspace.trpc.js +12 -1
  672. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  673. package/dist/src/lib/chat-protocol.d.ts +72 -0
  674. package/dist/src/lib/chat-protocol.d.ts.map +1 -0
  675. package/dist/src/lib/chat-protocol.js +514 -0
  676. package/dist/src/lib/chat-protocol.js.map +1 -0
  677. package/dist/src/shared/acp-protocol/index.d.ts +2 -0
  678. package/dist/src/shared/acp-protocol/index.d.ts.map +1 -1
  679. package/dist/src/shared/acp-protocol/index.js +2 -0
  680. package/dist/src/shared/acp-protocol/index.js.map +1 -1
  681. package/dist/src/shared/acp-protocol/protocol/queued.d.ts +1 -0
  682. package/dist/src/shared/acp-protocol/protocol/queued.d.ts.map +1 -1
  683. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts +7 -0
  684. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts.map +1 -1
  685. package/dist/src/shared/acp-protocol/protocol/websocket.js +1 -0
  686. package/dist/src/shared/acp-protocol/protocol/websocket.js.map +1 -1
  687. package/dist/src/shared/acp-protocol/session-update-translator.d.ts +39 -0
  688. package/dist/src/shared/acp-protocol/session-update-translator.d.ts.map +1 -0
  689. package/dist/src/shared/acp-protocol/session-update-translator.js +356 -0
  690. package/dist/src/shared/acp-protocol/session-update-translator.js.map +1 -0
  691. package/dist/src/shared/acp-protocol/subagents.d.ts +1175 -0
  692. package/dist/src/shared/acp-protocol/subagents.d.ts.map +1 -0
  693. package/dist/src/shared/acp-protocol/subagents.js +259 -0
  694. package/dist/src/shared/acp-protocol/subagents.js.map +1 -0
  695. package/dist/src/shared/core/enums.d.ts +1 -0
  696. package/dist/src/shared/core/enums.d.ts.map +1 -1
  697. package/dist/src/shared/core/enums.js +1 -0
  698. package/dist/src/shared/core/enums.js.map +1 -1
  699. package/dist/src/shared/deepgram-voices.d.ts +12 -0
  700. package/dist/src/shared/deepgram-voices.d.ts.map +1 -0
  701. package/dist/src/shared/deepgram-voices.js +51 -0
  702. package/dist/src/shared/deepgram-voices.js.map +1 -0
  703. package/dist/src/shared/schemas/export-data.schema.d.ts +10 -0
  704. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  705. package/dist/src/shared/schemas/export-data.schema.js +19 -0
  706. package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
  707. package/dist/src/shared/voice-vad.d.ts +11 -0
  708. package/dist/src/shared/voice-vad.d.ts.map +1 -0
  709. package/dist/src/shared/voice-vad.js +19 -0
  710. package/dist/src/shared/voice-vad.js.map +1 -0
  711. package/dist/src/shared/websocket/chat-message.schema.d.ts +1 -0
  712. package/dist/src/shared/websocket/chat-message.schema.d.ts.map +1 -1
  713. package/dist/src/shared/websocket/chat-message.schema.js +1 -0
  714. package/dist/src/shared/websocket/chat-message.schema.js.map +1 -1
  715. package/dist/src/shared/websocket/voice-message.schema.d.ts +25 -0
  716. package/dist/src/shared/websocket/voice-message.schema.d.ts.map +1 -0
  717. package/dist/src/shared/websocket/voice-message.schema.js +14 -0
  718. package/dist/src/shared/websocket/voice-message.schema.js.map +1 -0
  719. package/dist/src/shared/workspace-snapshot.d.ts +5 -5
  720. package/dist/src/test-utils/application-graph.d.ts.map +1 -1
  721. package/dist/src/test-utils/application-graph.js +8 -1
  722. package/dist/src/test-utils/application-graph.js.map +1 -1
  723. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  724. package/package.json +11 -8
  725. package/prisma/migrations/20260802152257_add_voice_mode_settings/migration.sql +34 -0
  726. package/prisma/migrations/20260802200414_add_voice_tts_model_and_speed/migration.sql +36 -0
  727. package/prisma/migrations/20260807222320_voice_vad_aggressiveness_settings/migration.sql +38 -0
  728. package/prisma/schema.prisma +9 -0
  729. package/scripts/postinstall.mjs +6 -2
  730. package/dist/client/assets/architectureDiagram-ZJ3FMSHR-BZgeaNrI.js +0 -36
  731. package/dist/client/assets/channel-zAL33ya-.js +0 -1
  732. package/dist/client/assets/classDiagram-OUVF2IWQ-Dksz7rAA.js +0 -1
  733. package/dist/client/assets/classDiagram-v2-EOCWNBFH-Dksz7rAA.js +0 -1
  734. package/dist/client/assets/diagram-WEI45ONY-up5rQ6My.js +0 -41
  735. package/dist/client/assets/index-BZQlu-dZ.js +0 -694
  736. package/dist/client/assets/index-CwfNzqG5.css +0 -1
  737. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DA02HYvU.js +0 -1
  738. package/dist/client/assets/swimlanesDiagram-G3AALYLV-CbfcpXpQ.js +0 -8
  739. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.d.ts +0 -2
  740. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.d.ts.map +0 -1
  741. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.js +0 -1438
  742. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.js.map +0 -1
  743. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.d.ts +0 -2
  744. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.d.ts.map +0 -1
  745. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.js +0 -1308
  746. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.js.map +0 -1
  747. package/dist/src/backend/services/session/service/runtime/index.d.ts +0 -5
  748. package/dist/src/backend/services/session/service/runtime/index.d.ts.map +0 -1
  749. package/dist/src/backend/services/session/service/runtime/index.js +0 -2
  750. package/dist/src/backend/services/session/service/runtime/index.js.map +0 -1
  751. package/dist/src/backend/services/session/service/runtime/provider-runtime-manager.d.ts +0 -21
  752. package/dist/src/backend/services/session/service/runtime/provider-runtime-manager.d.ts.map +0 -1
  753. package/dist/src/backend/services/session/service/runtime/provider-runtime-manager.js +0 -2
  754. package/dist/src/backend/services/session/service/runtime/provider-runtime-manager.js.map +0 -1
  755. package/dist/src/backend/services/session/service/store/file-lock.service.d.ts +0 -97
  756. package/dist/src/backend/services/session/service/store/file-lock.service.d.ts.map +0 -1
  757. package/dist/src/backend/services/session/service/store/file-lock.service.js +0 -429
  758. package/dist/src/backend/services/session/service/store/file-lock.service.js.map +0 -1
  759. package/dist/src/backend/services/session/service/store/file-lock.service.test.d.ts +0 -2
  760. package/dist/src/backend/services/session/service/store/file-lock.service.test.d.ts.map +0 -1
  761. package/dist/src/backend/services/session/service/store/file-lock.service.test.js +0 -672
  762. package/dist/src/backend/services/session/service/store/file-lock.service.test.js.map +0 -1
  763. package/dist/src/shared/workspace-words.d.ts +0 -5
  764. package/dist/src/shared/workspace-words.d.ts.map +0 -1
  765. package/dist/src/shared/workspace-words.js +0 -146
  766. package/dist/src/shared/workspace-words.js.map +0 -1
@@ -1,1308 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { SessionDomainService } from '../../../../../backend/services/session/service/session-domain.service.js';
3
- import { sessionEventBus } from '../../../../../backend/services/session/service/session-event-bus.js';
4
- import { userSettingsService } from '../../../../../backend/services/settings/index.js';
5
- import { workspaceDataService, workspaceNotificationService } from '../../../../../backend/services/workspace/index.js';
6
- import { SessionStatus } from '../../../../../shared/core/index.js';
7
- import { unsafeCoerce } from '../../../../../test-utils/unsafe-coerce.js';
8
- import { SessionLifecycleService } from './session.lifecycle.service.js';
9
- import { SessionLifecycleEventService } from './session-lifecycle-event.service.js';
10
- vi.mock('./closed-session-persistence.service', () => ({
11
- closedSessionPersistenceService: {
12
- persistClosedSession: vi.fn(async () => undefined),
13
- },
14
- }));
15
- import { closedSessionPersistenceService } from './closed-session-persistence.service.js';
16
- vi.mock('@/backend/services/logger.service', () => ({
17
- createLogger: () => ({
18
- debug: vi.fn(),
19
- info: vi.fn(),
20
- warn: vi.fn(),
21
- error: vi.fn(),
22
- }),
23
- }));
24
- vi.mock('@/backend/services/workspace', () => ({
25
- workspaceDataService: { findById: vi.fn() },
26
- workspaceNotificationService: {
27
- listPendingForDelivery: vi.fn(),
28
- markDelivered: vi.fn(),
29
- },
30
- }));
31
- vi.mock('@/backend/services/settings', () => ({
32
- userSettingsService: {
33
- get: vi.fn(async () => ({
34
- defaultWorkspacePermissions: 'STRICT',
35
- ratchetPermissions: 'YOLO',
36
- })),
37
- },
38
- }));
39
- function createLifecycleService(options) {
40
- const sessionDomainService = {
41
- appendClaudeEvent: vi.fn((_sessionId, _message) => 1),
42
- emitDelta: vi.fn(),
43
- hasQueuedMessage: vi.fn((_sessionId, _messageId) => false),
44
- enqueue: options?.enqueue ??
45
- vi.fn((_sessionId, _message) => ({ position: 0 })),
46
- getTranscriptSnapshot: vi.fn(() => options?.transcript ?? []),
47
- getHistoryHydrationSource: vi.fn(() => options?.historyHydrationSource ?? 'none'),
48
- };
49
- const tryDispatchNextMessage = options?.tryDispatchNextMessage ?? vi.fn(async () => undefined);
50
- const service = new SessionLifecycleService({
51
- repository: {},
52
- promptBuilder: {},
53
- runtimeManager: { isStopInProgress: vi.fn(() => false) },
54
- sessionDomainService: sessionDomainService,
55
- sessionPermissionService: {},
56
- sessionConfigService: {},
57
- acpEventProcessor: {},
58
- promptTurnCompletionService: {},
59
- retryService: {},
60
- sendSessionMessage: vi.fn(async () => undefined),
61
- lifecycleEventService: { hydrate: vi.fn(async () => undefined) },
62
- });
63
- service.configure({
64
- workspace: {
65
- markSessionRunning: vi.fn(),
66
- markSessionIdle: vi.fn(),
67
- recordRatchetSessionEnd: vi.fn(async () => undefined),
68
- resetPRDiscoveryBackoff: vi.fn(async () => true),
69
- },
70
- messageQueue: { tryDispatchNextMessage },
71
- });
72
- return { service, sessionDomainService, tryDispatchNextMessage };
73
- }
74
- async function deliverPendingChildNotifications(service, sessionId = 'session-1', workspaceId = 'workspace-1') {
75
- return await service.deliverPendingChildNotifications(sessionId, workspaceId);
76
- }
77
- function getStopGenerations(service) {
78
- return service.stopGenerations;
79
- }
80
- function createStoppableLifecycleService() {
81
- const repository = {
82
- getSessionsByWorkspaceId: vi.fn(async () => [
83
- { id: 'session-running', status: SessionStatus.RUNNING },
84
- { id: 'session-runtime-only', status: SessionStatus.COMPLETED },
85
- { id: 'session-idle', status: SessionStatus.IDLE },
86
- ]),
87
- };
88
- const runtimeManager = {
89
- isSessionRunning: vi.fn((sessionId) => sessionId === 'session-runtime-only'),
90
- };
91
- const service = new SessionLifecycleService({
92
- repository: repository,
93
- promptBuilder: {},
94
- runtimeManager: runtimeManager,
95
- sessionDomainService: {},
96
- sessionPermissionService: {},
97
- sessionConfigService: {},
98
- acpEventProcessor: {},
99
- promptTurnCompletionService: {},
100
- retryService: {},
101
- sendSessionMessage: vi.fn(async () => undefined),
102
- lifecycleEventService: { hydrate: vi.fn(async () => undefined) },
103
- });
104
- const stopSession = vi.fn((_sessionId, _options) => Promise.resolve());
105
- service.stopSession = stopSession;
106
- return { service, repository, runtimeManager, stopSession };
107
- }
108
- function createStopReasonLifecycleService(options) {
109
- const session = {
110
- id: 'session-1',
111
- workspaceId: 'workspace-1',
112
- workflow: 'code',
113
- providerProcessPid: options?.providerProcessPid ?? 4242,
114
- };
115
- const repository = {
116
- getSessionById: vi.fn(async () => session),
117
- updateSessionIfStatus: vi.fn(async () => session),
118
- updateSession: vi.fn(async () => session),
119
- };
120
- const runtimeManager = {
121
- isStopInProgress: vi.fn(() => false),
122
- isSessionRunning: vi.fn(() => false),
123
- isSessionWorking: vi.fn(() => false),
124
- getClient: vi.fn(() => undefined),
125
- stopClient: vi.fn(async () => undefined),
126
- };
127
- const lifecycleEventService = {
128
- record: vi.fn(async (_input) => null),
129
- hydrate: vi.fn(),
130
- };
131
- const service = new SessionLifecycleService(unsafeCoerce({
132
- repository,
133
- promptBuilder: {},
134
- runtimeManager,
135
- sessionDomainService: {
136
- clearQueuedWork: vi.fn(),
137
- getRuntimeSnapshot: vi.fn(() => ({
138
- phase: 'idle',
139
- processState: 'stopped',
140
- activity: 'IDLE',
141
- updatedAt: '2026-07-30T00:00:00.000Z',
142
- })),
143
- setRuntimeSnapshot: vi.fn(),
144
- markProcessExit: vi.fn(),
145
- clearSession: vi.fn(),
146
- },
147
- sessionPermissionService: { cancelPendingRequests: vi.fn() },
148
- sessionConfigService: {},
149
- acpEventProcessor: {
150
- createRuntimeEventHandler: vi.fn(() => ({})),
151
- clearStreamingState: vi.fn(),
152
- clearReplaySuppression: vi.fn(),
153
- clearSessionContext: vi.fn(),
154
- clearSessionState: vi.fn(),
155
- finalizeOrphanedToolCalls: vi.fn(),
156
- },
157
- promptTurnCompletionService: { clearSession: vi.fn() },
158
- retryService: { run: vi.fn(async (operation) => await operation()) },
159
- lifecycleEventService,
160
- sendSessionMessage: vi.fn(),
161
- }));
162
- const createRuntimeHandlers = () => service;
163
- const runtimeHandlers = createRuntimeHandlers().setupAcpEventHandler('session-1');
164
- return {
165
- service,
166
- repository,
167
- lifecycleEventService,
168
- runtimeManager,
169
- runtimeHandlers,
170
- createRuntimeHandlers: () => createRuntimeHandlers().setupAcpEventHandler('session-1'),
171
- };
172
- }
173
- describe('SessionLifecycleService stopWorkspaceSessions', () => {
174
- beforeEach(() => {
175
- vi.clearAllMocks();
176
- });
177
- it('stops running sessions and runtime-only sessions', async () => {
178
- const { service, repository, runtimeManager, stopSession } = createStoppableLifecycleService();
179
- await service.stopWorkspaceSessions('workspace-1');
180
- expect(repository.getSessionsByWorkspaceId).toHaveBeenCalledWith('workspace-1');
181
- expect(runtimeManager.isSessionRunning).toHaveBeenCalledWith('session-runtime-only');
182
- expect(runtimeManager.isSessionRunning).toHaveBeenCalledWith('session-idle');
183
- expect(stopSession).toHaveBeenCalledWith('session-running', { reason: 'SYSTEM_STOP' });
184
- expect(stopSession).toHaveBeenCalledWith('session-runtime-only', { reason: 'SYSTEM_STOP' });
185
- expect(stopSession).not.toHaveBeenCalledWith('session-idle');
186
- });
187
- it('attempts every running session and throws when any stop fails', async () => {
188
- const { service, stopSession } = createStoppableLifecycleService();
189
- stopSession.mockImplementation((sessionId) => {
190
- if (sessionId === 'session-running') {
191
- return Promise.reject(new Error('stop failed'));
192
- }
193
- return Promise.resolve();
194
- });
195
- await expect(service.stopWorkspaceSessions('workspace-1')).rejects.toThrow('Failed to stop 1 workspace session');
196
- expect(stopSession).toHaveBeenCalledWith('session-running', { reason: 'SYSTEM_STOP' });
197
- expect(stopSession).toHaveBeenCalledWith('session-runtime-only', { reason: 'SYSTEM_STOP' });
198
- });
199
- });
200
- describe('SessionLifecycleService stop causes', () => {
201
- beforeEach(() => {
202
- vi.clearAllMocks();
203
- });
204
- it.each([
205
- ['USER_STOP', 'Session stopped by you.'],
206
- ['SESSION_CLOSED', 'Session closed by you.'],
207
- ['WORKSPACE_ARCHIVED', 'Session stopped because the workspace was archived.'],
208
- ['SYSTEM_STOP', 'Session stopped by the system.'],
209
- ])('records %s before stopping the runtime', async (reason, message) => {
210
- const { service, lifecycleEventService, runtimeManager } = createStopReasonLifecycleService();
211
- await service.stopSession('session-1', { reason });
212
- expect(lifecycleEventService.record).toHaveBeenCalledWith(expect.objectContaining({
213
- workspaceId: 'workspace-1',
214
- sessionId: 'session-1',
215
- kind: 'SESSION_STOPPED',
216
- reason,
217
- message,
218
- dedupeKey: expect.stringMatching(/^session-stop:[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/),
219
- }));
220
- expect(lifecycleEventService.record.mock.invocationCallOrder[0]).toBeLessThan(runtimeManager.stopClient.mock.invocationCallOrder[0]);
221
- });
222
- it('uses a new durable stop identity after lifecycle-service reconstruction', async () => {
223
- const first = createStopReasonLifecycleService();
224
- const reconstructed = createStopReasonLifecycleService();
225
- await first.service.stopSession('session-1', { reason: 'USER_STOP' });
226
- await reconstructed.service.stopSession('session-1', { reason: 'USER_STOP' });
227
- const firstKey = first.lifecycleEventService.record.mock.calls[0]?.[0]?.dedupeKey;
228
- const reconstructedKey = reconstructed.lifecycleEventService.record.mock.calls[0]?.[0]?.dedupeKey;
229
- expect(firstKey).toMatch(/^session-stop:/);
230
- expect(reconstructedKey).toMatch(/^session-stop:/);
231
- expect(reconstructedKey).not.toBe(firstKey);
232
- });
233
- it('records an unexpected process exit once with its runtime incarnation and exit code', async () => {
234
- const { lifecycleEventService, runtimeHandlers } = createStopReasonLifecycleService();
235
- await runtimeHandlers.onExit?.('session-1', 1);
236
- expect(lifecycleEventService.record).toHaveBeenCalledWith(expect.objectContaining({
237
- kind: 'SESSION_STOPPED',
238
- reason: 'UNEXPECTED_EXIT',
239
- message: 'Session stopped: agent process exited unexpectedly (code 1).',
240
- dedupeKey: expect.stringMatching(/^process-exit:[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}:1$/),
241
- }));
242
- });
243
- it('records an unexpected process exit when the status update fails', async () => {
244
- const { lifecycleEventService, repository, runtimeHandlers } = createStopReasonLifecycleService();
245
- repository.updateSession.mockRejectedValueOnce(new Error('database write failed'));
246
- await runtimeHandlers.onExit?.('session-1', 1);
247
- expect(lifecycleEventService.record).toHaveBeenCalledWith(expect.objectContaining({
248
- reason: 'UNEXPECTED_EXIT',
249
- dedupeKey: expect.stringMatching(/^process-exit:.+:1$/),
250
- }));
251
- });
252
- it('does not collapse repeated null-PID exits from separate runtime incarnations', async () => {
253
- const { lifecycleEventService, createRuntimeHandlers } = createStopReasonLifecycleService({
254
- providerProcessPid: null,
255
- });
256
- await createRuntimeHandlers().onExit?.('session-1', 1);
257
- await createRuntimeHandlers().onExit?.('session-1', 1);
258
- const dedupeKeys = lifecycleEventService.record.mock.calls.map(([recordInput]) => recordInput.dedupeKey);
259
- expect(dedupeKeys).toHaveLength(2);
260
- expect(new Set(dedupeKeys).size).toBe(2);
261
- expect(dedupeKeys).toEqual([
262
- expect.stringMatching(/^process-exit:.+:1$/),
263
- expect.stringMatching(/^process-exit:.+:1$/),
264
- ]);
265
- });
266
- it('does not label a deliberate stop as an unexpected exit', async () => {
267
- const { lifecycleEventService, runtimeManager, runtimeHandlers } = createStopReasonLifecycleService();
268
- runtimeManager.isStopInProgress.mockReturnValue(true);
269
- await runtimeHandlers.onExit?.('session-1', 0);
270
- expect(lifecycleEventService.record).not.toHaveBeenCalledWith(expect.objectContaining({ reason: 'UNEXPECTED_EXIT' }));
271
- });
272
- it('can clean up a failed startup without recording a stop event', async () => {
273
- const { service, lifecycleEventService, runtimeManager } = createStopReasonLifecycleService();
274
- await service.stopSession('session-1', { recordLifecycleEvent: false });
275
- expect(lifecycleEventService.record).not.toHaveBeenCalled();
276
- expect(runtimeManager.stopClient).toHaveBeenCalledWith('session-1');
277
- });
278
- });
279
- describe('SessionLifecycleService closed transcript persistence', () => {
280
- beforeEach(() => {
281
- vi.clearAllMocks();
282
- });
283
- it('hydrates durable lifecycle rows before persisting a closed transcript', async () => {
284
- const domain = new SessionDomainService();
285
- const hydrateProviderHistory = vi.fn(() => {
286
- domain.replaceTranscript('session-1', [
287
- {
288
- id: 'provider-user-1',
289
- source: 'user',
290
- text: 'Original provider conversation',
291
- timestamp: '2026-07-30T12:00:00.000Z',
292
- order: 0,
293
- },
294
- ]);
295
- return Promise.resolve();
296
- });
297
- const lifecycleEventService = new SessionLifecycleEventService({
298
- store: {
299
- upsert: vi.fn(),
300
- findBySessionId: vi.fn(async () => [
301
- {
302
- id: 'event-1',
303
- workspaceId: 'workspace-1',
304
- sessionId: 'session-1',
305
- kind: 'TURN_INTERRUPTED',
306
- reason: 'PROMPT_TIMEOUT',
307
- message: 'Turn stopped: reached the 4-hour limit.',
308
- dedupeKey: 'prompt-timeout',
309
- createdAt: new Date('2026-07-30T12:22:23.353Z'),
310
- },
311
- ]),
312
- },
313
- sessionDomainService: domain,
314
- });
315
- const hydrateLifecycleEvents = vi.spyOn(lifecycleEventService, 'hydrate');
316
- domain.clearSession('session-1');
317
- const repository = {
318
- getSessionById: vi.fn(async () => ({
319
- id: 'session-1',
320
- workspaceId: 'workspace-1',
321
- name: 'Chat',
322
- workflow: 'user',
323
- provider: 'CLAUDE',
324
- model: 'claude-sonnet',
325
- createdAt: new Date('2026-07-30T12:00:00.000Z'),
326
- })),
327
- };
328
- vi.mocked(workspaceDataService.findById).mockResolvedValue({
329
- id: 'workspace-1',
330
- worktreePath: '/tmp/worktree',
331
- });
332
- const service = new SessionLifecycleService(unsafeCoerce({
333
- repository,
334
- promptBuilder: {},
335
- runtimeManager: {},
336
- sessionDomainService: domain,
337
- sessionPermissionService: {},
338
- sessionConfigService: {},
339
- acpEventProcessor: {},
340
- promptTurnCompletionService: {},
341
- retryService: {},
342
- sendSessionMessage: vi.fn(),
343
- lifecycleEventService,
344
- hydrateProviderHistory,
345
- }));
346
- await service.persistClosedSession('session-1');
347
- expect(closedSessionPersistenceService.persistClosedSession).toHaveBeenCalledWith(expect.objectContaining({
348
- sessionId: 'session-1',
349
- messages: expect.arrayContaining([
350
- expect.objectContaining({ id: 'provider-user-1' }),
351
- expect.objectContaining({ id: 'session-lifecycle:event-1' }),
352
- ]),
353
- }));
354
- expect(hydrateProviderHistory).toHaveBeenCalledWith('session-1', expect.objectContaining({ provider: 'CLAUDE' }));
355
- expect(hydrateProviderHistory.mock.invocationCallOrder[0]).toBeLessThan(hydrateLifecycleEvents.mock.invocationCallOrder[0]);
356
- });
357
- });
358
- describe('SessionLifecycleService graceful shutdown', () => {
359
- it('records SYSTEM_STOP for active and pending runtimes before bounded shutdown', async () => {
360
- const runtimeManager = {
361
- beginShutdown: vi.fn(() => ['session-active', 'session-pending']),
362
- stopAllClients: vi.fn(async () => undefined),
363
- isStopInProgress: vi.fn(() => false),
364
- };
365
- const repository = {
366
- getSessionById: vi.fn(async (sessionId) => ({
367
- id: sessionId,
368
- workspaceId: 'workspace-1',
369
- workflow: 'code',
370
- })),
371
- };
372
- const lifecycleEventService = {
373
- record: vi.fn(async () => null),
374
- hydrate: vi.fn(async () => undefined),
375
- };
376
- const promptTurnCompletionService = {
377
- clearAll: vi.fn(),
378
- };
379
- const service = new SessionLifecycleService(unsafeCoerce({
380
- repository,
381
- promptBuilder: {},
382
- runtimeManager,
383
- sessionDomainService: {},
384
- sessionPermissionService: {},
385
- sessionConfigService: {},
386
- acpEventProcessor: { getWorkspaceId: vi.fn() },
387
- promptTurnCompletionService,
388
- retryService: {
389
- run: vi.fn(async (operation) => await operation()),
390
- },
391
- lifecycleEventService,
392
- hydrateProviderHistory: vi.fn(),
393
- sendSessionMessage: vi.fn(),
394
- }));
395
- await service.stopAllClients(4321);
396
- expect(runtimeManager.beginShutdown).toHaveBeenCalledOnce();
397
- expect(lifecycleEventService.record).toHaveBeenCalledTimes(2);
398
- expect(lifecycleEventService.record).toHaveBeenCalledWith(expect.objectContaining({
399
- sessionId: 'session-active',
400
- reason: 'SYSTEM_STOP',
401
- }));
402
- expect(lifecycleEventService.record).toHaveBeenCalledWith(expect.objectContaining({
403
- sessionId: 'session-pending',
404
- reason: 'SYSTEM_STOP',
405
- }));
406
- expect(runtimeManager.beginShutdown.mock.invocationCallOrder[0]).toBeLessThan(lifecycleEventService.record.mock.invocationCallOrder[0]);
407
- expect(lifecycleEventService.record.mock.invocationCallOrder.at(-1)).toBeLessThan(runtimeManager.stopAllClients.mock.invocationCallOrder[0]);
408
- expect(runtimeManager.stopAllClients).toHaveBeenCalledWith(4321);
409
- });
410
- it('continues runtime shutdown when lifecycle recording stalls', async () => {
411
- vi.useFakeTimers();
412
- try {
413
- const runtimeManager = {
414
- beginShutdown: vi.fn(() => ['session-active']),
415
- stopAllClients: vi.fn(async () => undefined),
416
- isStopInProgress: vi.fn(() => false),
417
- };
418
- const service = new SessionLifecycleService(unsafeCoerce({
419
- repository: {
420
- getSessionById: vi.fn(async () => ({
421
- id: 'session-active',
422
- workspaceId: 'workspace-1',
423
- workflow: 'code',
424
- })),
425
- },
426
- promptBuilder: {},
427
- runtimeManager,
428
- sessionDomainService: {},
429
- sessionPermissionService: {},
430
- sessionConfigService: {},
431
- acpEventProcessor: { getWorkspaceId: vi.fn() },
432
- promptTurnCompletionService: { clearAll: vi.fn() },
433
- retryService: {
434
- run: vi.fn(async (operation) => await operation()),
435
- },
436
- lifecycleEventService: {
437
- record: vi.fn(() => new Promise(() => undefined)),
438
- hydrate: vi.fn(async () => undefined),
439
- },
440
- hydrateProviderHistory: vi.fn(),
441
- sendSessionMessage: vi.fn(),
442
- }));
443
- const shutdown = service.stopAllClients(4321);
444
- await vi.advanceTimersByTimeAsync(999);
445
- expect(runtimeManager.stopAllClients).not.toHaveBeenCalled();
446
- await vi.advanceTimersByTimeAsync(1);
447
- await shutdown;
448
- expect(runtimeManager.stopAllClients).toHaveBeenCalledWith(4321);
449
- }
450
- finally {
451
- vi.useRealTimers();
452
- }
453
- });
454
- });
455
- describe('SessionLifecycleService pending workspace notifications', () => {
456
- beforeEach(() => {
457
- vi.clearAllMocks();
458
- });
459
- it('adds pending workspace notifications to the UI transcript and ACP dispatch queue', async () => {
460
- const createdAt = new Date('2026-06-22T10:30:00.000Z');
461
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
462
- {
463
- id: 'notif-parent',
464
- workspaceId: 'workspace-1',
465
- sourceWorkspaceId: 'parent-workspace',
466
- sourceWorkspaceName: 'Parent Workspace',
467
- sourceProjectName: 'Parent Project',
468
- message: 'Please check the failing test.',
469
- direction: 'PARENT_TO_CHILD',
470
- deliveredAt: null,
471
- createdAt,
472
- },
473
- {
474
- id: 'notif-child',
475
- workspaceId: 'workspace-1',
476
- sourceWorkspaceId: 'child-workspace',
477
- sourceWorkspaceName: 'Child Workspace',
478
- sourceProjectName: 'Child Project',
479
- message: 'The branch is ready for review.',
480
- direction: 'CHILD_TO_PARENT',
481
- deliveredAt: null,
482
- createdAt,
483
- },
484
- ]);
485
- vi.mocked(workspaceNotificationService.markDelivered).mockResolvedValue();
486
- const { service, sessionDomainService, tryDispatchNextMessage } = createLifecycleService();
487
- const enqueuedCount = await deliverPendingChildNotifications(service);
488
- expect(sessionDomainService.appendClaudeEvent).toHaveBeenNthCalledWith(1, 'session-1', expect.objectContaining({
489
- type: 'parent_workspace_update',
490
- parentWorkspaceId: 'parent-workspace',
491
- parentWorkspaceName: 'Parent Workspace',
492
- parentProjectName: 'Parent Project',
493
- text: 'Please check the failing test.',
494
- timestamp: '2026-06-22T10:30:00.000Z',
495
- }));
496
- expect(sessionDomainService.appendClaudeEvent).toHaveBeenNthCalledWith(2, 'session-1', expect.objectContaining({
497
- type: 'child_workspace_update',
498
- childWorkspaceId: 'child-workspace',
499
- childWorkspaceName: 'Child Workspace',
500
- childProjectName: 'Child Project',
501
- text: 'The branch is ready for review.',
502
- timestamp: '2026-06-22T10:30:00.000Z',
503
- }));
504
- expect(sessionDomainService.enqueue).toHaveBeenNthCalledWith(1, 'session-1', expect.objectContaining({
505
- id: 'workspace-notification-notif-parent',
506
- text: '[Message from parent workspace "Parent Workspace"]: Please check the failing test.\n\n<!-- factory-factory-workspace-notification:notif-parent -->',
507
- timestamp: '2026-06-22T10:30:00.000Z',
508
- settings: {
509
- selectedModel: null,
510
- reasoningEffort: null,
511
- thinkingEnabled: false,
512
- planModeEnabled: false,
513
- },
514
- }));
515
- expect(sessionDomainService.enqueue).toHaveBeenNthCalledWith(2, 'session-1', expect.objectContaining({
516
- id: 'workspace-notification-notif-child',
517
- text: '[Message from child workspace "Child Workspace"]: The branch is ready for review.\n\n<!-- factory-factory-workspace-notification:notif-child -->',
518
- }));
519
- expect(enqueuedCount).toBe(2);
520
- expect(tryDispatchNextMessage).not.toHaveBeenCalled();
521
- expect(workspaceNotificationService.markDelivered).not.toHaveBeenCalled();
522
- });
523
- it('does not enqueue notifications found after the startup stop generation changes', async () => {
524
- let resolvePending;
525
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockReturnValue(new Promise((resolve) => {
526
- resolvePending = resolve;
527
- }));
528
- const { service, sessionDomainService } = createLifecycleService();
529
- const deliveryPromise = deliverPendingChildNotifications(service);
530
- await vi.waitFor(() => {
531
- expect(workspaceNotificationService.listPendingForDelivery).toHaveBeenCalledWith('workspace-1');
532
- });
533
- getStopGenerations(service).set('session-1', service.getStopGeneration('session-1') + 1);
534
- resolvePending([
535
- {
536
- id: 'notif-parent',
537
- workspaceId: 'workspace-1',
538
- sourceWorkspaceId: 'parent-workspace',
539
- sourceWorkspaceName: 'Parent Workspace',
540
- sourceProjectName: 'Parent Project',
541
- message: 'Please check the failing test.',
542
- direction: 'PARENT_TO_CHILD',
543
- deliveredAt: null,
544
- createdAt: new Date('2026-06-22T10:30:00.000Z'),
545
- },
546
- ]);
547
- await expect(deliveryPromise).resolves.toBe(0);
548
- expect(sessionDomainService.enqueue).not.toHaveBeenCalled();
549
- expect(sessionDomainService.appendClaudeEvent).not.toHaveBeenCalled();
550
- expect(sessionDomainService.emitDelta).not.toHaveBeenCalled();
551
- });
552
- it('leaves notifications pending when enqueue fails', async () => {
553
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
554
- {
555
- id: 'notif-parent',
556
- workspaceId: 'workspace-1',
557
- sourceWorkspaceId: 'parent-workspace',
558
- sourceWorkspaceName: 'Parent Workspace',
559
- sourceProjectName: 'Parent Project',
560
- message: 'Please check the failing test.',
561
- direction: 'PARENT_TO_CHILD',
562
- deliveredAt: null,
563
- createdAt: new Date('2026-06-22T10:30:00.000Z'),
564
- },
565
- ]);
566
- const { service, sessionDomainService, tryDispatchNextMessage } = createLifecycleService({
567
- enqueue: vi.fn(() => ({ error: 'Queue full' })),
568
- });
569
- const enqueuedCount = await deliverPendingChildNotifications(service);
570
- expect(enqueuedCount).toBe(0);
571
- expect(sessionDomainService.appendClaudeEvent).not.toHaveBeenCalled();
572
- expect(sessionDomainService.emitDelta).not.toHaveBeenCalled();
573
- expect(tryDispatchNextMessage).not.toHaveBeenCalled();
574
- expect(workspaceNotificationService.markDelivered).not.toHaveBeenCalled();
575
- });
576
- it('does not dispatch pending notifications ahead of an existing queued message', async () => {
577
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
578
- {
579
- id: 'notif-parent',
580
- workspaceId: 'workspace-1',
581
- sourceWorkspaceId: 'parent-workspace',
582
- sourceWorkspaceName: 'Parent Workspace',
583
- sourceProjectName: 'Parent Project',
584
- message: 'Please check the failing test.',
585
- direction: 'PARENT_TO_CHILD',
586
- deliveredAt: null,
587
- createdAt: new Date('2026-06-22T10:30:00.000Z'),
588
- },
589
- ]);
590
- vi.mocked(workspaceNotificationService.markDelivered).mockResolvedValue();
591
- const { service, sessionDomainService, tryDispatchNextMessage } = createLifecycleService();
592
- const enqueuedCount = await deliverPendingChildNotifications(service);
593
- expect(enqueuedCount).toBe(1);
594
- expect(sessionDomainService.enqueue).toHaveBeenCalledWith('session-1', expect.objectContaining({
595
- id: 'workspace-notification-notif-parent',
596
- }));
597
- expect(tryDispatchNextMessage).not.toHaveBeenCalled();
598
- expect(workspaceNotificationService.markDelivered).not.toHaveBeenCalled();
599
- });
600
- it('reports a pending workspace notification that is already queued as dispatchable', async () => {
601
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
602
- {
603
- id: 'notif-parent',
604
- workspaceId: 'workspace-1',
605
- sourceWorkspaceId: 'parent-workspace',
606
- sourceWorkspaceName: 'Parent Workspace',
607
- sourceProjectName: 'Parent Project',
608
- message: 'Please check the failing test.',
609
- direction: 'PARENT_TO_CHILD',
610
- deliveredAt: null,
611
- createdAt: new Date('2026-06-22T10:30:00.000Z'),
612
- },
613
- ]);
614
- const { service, sessionDomainService, tryDispatchNextMessage } = createLifecycleService();
615
- sessionDomainService.hasQueuedMessage.mockReturnValue(true);
616
- const enqueuedCount = await deliverPendingChildNotifications(service);
617
- expect(enqueuedCount).toBe(1);
618
- expect(sessionDomainService.enqueue).not.toHaveBeenCalled();
619
- expect(sessionDomainService.appendClaudeEvent).not.toHaveBeenCalled();
620
- expect(sessionDomainService.emitDelta).not.toHaveBeenCalled();
621
- expect(tryDispatchNextMessage).not.toHaveBeenCalled();
622
- expect(workspaceNotificationService.markDelivered).not.toHaveBeenCalled();
623
- });
624
- it('does not re-enqueue a notification queued during transcript reconciliation', async () => {
625
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
626
- {
627
- id: 'notif-parent',
628
- workspaceId: 'workspace-1',
629
- sourceWorkspaceId: 'parent-workspace',
630
- sourceWorkspaceName: 'Parent Workspace',
631
- sourceProjectName: 'Parent Project',
632
- message: 'Please check the failing test.',
633
- direction: 'PARENT_TO_CHILD',
634
- deliveredAt: null,
635
- createdAt: new Date('2026-06-22T10:30:00.000Z'),
636
- },
637
- ]);
638
- const { service, sessionDomainService } = createLifecycleService();
639
- let queuedByLiveDelivery = false;
640
- sessionDomainService.hasQueuedMessage.mockImplementation(() => queuedByLiveDelivery);
641
- sessionDomainService.getTranscriptSnapshot.mockImplementation(() => {
642
- queuedByLiveDelivery = true;
643
- return [];
644
- });
645
- const dispatchableCount = await deliverPendingChildNotifications(service);
646
- expect(dispatchableCount).toBe(1);
647
- expect(sessionDomainService.hasQueuedMessage).toHaveBeenCalledTimes(2);
648
- expect(sessionDomainService.enqueue).not.toHaveBeenCalled();
649
- expect(sessionDomainService.appendClaudeEvent).not.toHaveBeenCalled();
650
- expect(sessionDomainService.emitDelta).not.toHaveBeenCalled();
651
- });
652
- it('marks an already-committed pending notification delivered without requeueing it', async () => {
653
- const createdAt = new Date('2026-06-22T10:30:00.000Z');
654
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
655
- {
656
- id: 'notif-parent',
657
- workspaceId: 'workspace-1',
658
- sourceWorkspaceId: 'parent-workspace',
659
- sourceWorkspaceName: 'Parent Workspace',
660
- sourceProjectName: 'Parent Project',
661
- message: 'Please check the failing test.',
662
- direction: 'PARENT_TO_CHILD',
663
- deliveredAt: null,
664
- createdAt,
665
- },
666
- ]);
667
- vi.mocked(workspaceNotificationService.markDelivered).mockResolvedValue();
668
- const { service, sessionDomainService, tryDispatchNextMessage } = createLifecycleService({
669
- transcript: [
670
- {
671
- id: 'workspace-notification-notif-parent',
672
- source: 'user',
673
- text: '[Message from parent workspace "Parent Workspace"]: Please check the failing test.',
674
- timestamp: createdAt.toISOString(),
675
- order: 1,
676
- },
677
- ],
678
- });
679
- const enqueuedCount = await deliverPendingChildNotifications(service);
680
- expect(enqueuedCount).toBe(0);
681
- expect(sessionDomainService.enqueue).not.toHaveBeenCalled();
682
- expect(sessionDomainService.appendClaudeEvent).not.toHaveBeenCalled();
683
- expect(sessionDomainService.emitDelta).not.toHaveBeenCalled();
684
- expect(tryDispatchNextMessage).not.toHaveBeenCalled();
685
- expect(workspaceNotificationService.markDelivered).toHaveBeenCalledWith(['notif-parent']);
686
- });
687
- it('matches an already-committed pending notification with a provider-generated ID', async () => {
688
- const createdAt = new Date('2026-06-22T10:30:00.000Z');
689
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
690
- {
691
- id: 'notif-parent',
692
- workspaceId: 'workspace-1',
693
- sourceWorkspaceId: 'parent-workspace',
694
- sourceWorkspaceName: 'Parent Workspace',
695
- sourceProjectName: 'Parent Project',
696
- message: 'Please check the failing test.',
697
- direction: 'PARENT_TO_CHILD',
698
- deliveredAt: null,
699
- createdAt,
700
- },
701
- ]);
702
- vi.mocked(workspaceNotificationService.markDelivered).mockResolvedValue();
703
- const { service, sessionDomainService } = createLifecycleService({
704
- historyHydrationSource: 'jsonl',
705
- transcript: [
706
- {
707
- id: '550e8400-e29b-41d4-a716-446655440000-0',
708
- source: 'user',
709
- text: '[Message from parent workspace "Parent Workspace"]: Please check the failing test.\n\n<!-- factory-factory-workspace-notification:notif-parent -->',
710
- timestamp: createdAt.toISOString(),
711
- order: 0,
712
- },
713
- ],
714
- });
715
- const enqueuedCount = await deliverPendingChildNotifications(service);
716
- expect(enqueuedCount).toBe(0);
717
- expect(sessionDomainService.enqueue).not.toHaveBeenCalled();
718
- expect(sessionDomainService.appendClaudeEvent).not.toHaveBeenCalled();
719
- expect(sessionDomainService.emitDelta).not.toHaveBeenCalled();
720
- expect(workspaceNotificationService.markDelivered).toHaveBeenCalledWith(['notif-parent']);
721
- });
722
- it('does not match identical user text without a notification marker', async () => {
723
- const createdAt = new Date('2026-06-22T10:30:00.000Z');
724
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
725
- {
726
- id: 'notif-parent',
727
- workspaceId: 'workspace-1',
728
- sourceWorkspaceId: 'parent-workspace',
729
- sourceWorkspaceName: 'Parent Workspace',
730
- sourceProjectName: 'Parent Project',
731
- message: 'Please check the failing test.',
732
- direction: 'PARENT_TO_CHILD',
733
- deliveredAt: null,
734
- createdAt,
735
- },
736
- ]);
737
- const { service, sessionDomainService } = createLifecycleService({
738
- historyHydrationSource: 'jsonl',
739
- transcript: [
740
- {
741
- id: '550e8400-e29b-41d4-a716-446655440000-0',
742
- source: 'user',
743
- text: '[Message from parent workspace "Parent Workspace"]: Please check the failing test.',
744
- timestamp: createdAt.toISOString(),
745
- order: 0,
746
- },
747
- ],
748
- });
749
- const enqueuedCount = await deliverPendingChildNotifications(service);
750
- expect(enqueuedCount).toBe(1);
751
- expect(sessionDomainService.enqueue).toHaveBeenCalledOnce();
752
- expect(workspaceNotificationService.markDelivered).not.toHaveBeenCalled();
753
- });
754
- it('consumes one provider-generated transcript entry once for duplicate pending notifications', async () => {
755
- const oldestCreatedAt = new Date('2026-06-22T10:30:00.000Z');
756
- const newestCreatedAt = new Date('2026-06-22T10:31:00.000Z');
757
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
758
- {
759
- id: 'notif-parent-oldest',
760
- workspaceId: 'workspace-1',
761
- sourceWorkspaceId: 'parent-workspace',
762
- sourceWorkspaceName: 'Parent Workspace',
763
- sourceProjectName: 'Parent Project',
764
- message: 'Please check the failing test.',
765
- direction: 'PARENT_TO_CHILD',
766
- deliveredAt: null,
767
- createdAt: oldestCreatedAt,
768
- },
769
- {
770
- id: 'notif-parent-newest',
771
- workspaceId: 'workspace-1',
772
- sourceWorkspaceId: 'parent-workspace',
773
- sourceWorkspaceName: 'Parent Workspace',
774
- sourceProjectName: 'Parent Project',
775
- message: 'Please check the failing test.',
776
- direction: 'PARENT_TO_CHILD',
777
- deliveredAt: null,
778
- createdAt: newestCreatedAt,
779
- },
780
- ]);
781
- vi.mocked(workspaceNotificationService.markDelivered).mockResolvedValue();
782
- const { service, sessionDomainService } = createLifecycleService({
783
- historyHydrationSource: 'jsonl',
784
- transcript: [
785
- {
786
- id: '550e8400-e29b-41d4-a716-446655440000-0',
787
- source: 'user',
788
- text: '[Message from parent workspace "Parent Workspace"]: Please check the failing test.\n\n<!-- factory-factory-workspace-notification:notif-parent-oldest -->',
789
- timestamp: oldestCreatedAt.toISOString(),
790
- order: 0,
791
- },
792
- ],
793
- });
794
- const enqueuedCount = await deliverPendingChildNotifications(service);
795
- expect(enqueuedCount).toBe(1);
796
- expect(sessionDomainService.enqueue).toHaveBeenCalledOnce();
797
- expect(workspaceNotificationService.markDelivered).toHaveBeenCalledTimes(1);
798
- expect(workspaceNotificationService.markDelivered).toHaveBeenCalledWith([
799
- 'notif-parent-oldest',
800
- ]);
801
- });
802
- it("does not let an older duplicate consume a later notification's exact transcript entry", async () => {
803
- const oldestCreatedAt = new Date('2026-06-22T10:30:00.000Z');
804
- const newestCreatedAt = new Date('2026-06-22T10:31:00.000Z');
805
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
806
- {
807
- id: 'notif-parent-A',
808
- workspaceId: 'workspace-1',
809
- sourceWorkspaceId: 'parent-workspace',
810
- sourceWorkspaceName: 'Parent Workspace',
811
- sourceProjectName: 'Parent Project',
812
- message: 'Please check the failing test.',
813
- direction: 'PARENT_TO_CHILD',
814
- deliveredAt: null,
815
- createdAt: oldestCreatedAt,
816
- },
817
- {
818
- id: 'notif-parent-B',
819
- workspaceId: 'workspace-1',
820
- sourceWorkspaceId: 'parent-workspace',
821
- sourceWorkspaceName: 'Parent Workspace',
822
- sourceProjectName: 'Parent Project',
823
- message: 'Please check the failing test.',
824
- direction: 'PARENT_TO_CHILD',
825
- deliveredAt: null,
826
- createdAt: newestCreatedAt,
827
- },
828
- ]);
829
- vi.mocked(workspaceNotificationService.markDelivered).mockResolvedValue();
830
- const { service, sessionDomainService } = createLifecycleService({
831
- historyHydrationSource: 'jsonl',
832
- transcript: [
833
- {
834
- id: 'workspace-notification-notif-parent-B',
835
- source: 'user',
836
- text: '[Message from parent workspace "Parent Workspace"]: Please check the failing test.',
837
- timestamp: newestCreatedAt.toISOString(),
838
- order: 0,
839
- },
840
- ],
841
- });
842
- const enqueuedCount = await deliverPendingChildNotifications(service);
843
- expect(enqueuedCount).toBe(1);
844
- expect(sessionDomainService.enqueue).toHaveBeenCalledOnce();
845
- expect(sessionDomainService.enqueue).toHaveBeenCalledWith('session-1', expect.objectContaining({ id: 'workspace-notification-notif-parent-A' }));
846
- expect(workspaceNotificationService.markDelivered).toHaveBeenCalledTimes(1);
847
- expect(workspaceNotificationService.markDelivered).toHaveBeenCalledWith(['notif-parent-B']);
848
- });
849
- it('does not content-match a normal live user entry with canonical notification text', async () => {
850
- const createdAt = new Date('2026-06-22T10:30:00.000Z');
851
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
852
- {
853
- id: 'notif-parent',
854
- workspaceId: 'workspace-1',
855
- sourceWorkspaceId: 'parent-workspace',
856
- sourceWorkspaceName: 'Parent Workspace',
857
- sourceProjectName: 'Parent Project',
858
- message: 'Please check the failing test.',
859
- direction: 'PARENT_TO_CHILD',
860
- deliveredAt: null,
861
- createdAt,
862
- },
863
- ]);
864
- const { service, sessionDomainService } = createLifecycleService({
865
- transcript: [
866
- {
867
- id: 'session-1-42',
868
- source: 'user',
869
- text: '[Message from parent workspace "Parent Workspace"]: Please check the failing test.',
870
- timestamp: createdAt.toISOString(),
871
- order: 0,
872
- },
873
- ],
874
- });
875
- const enqueuedCount = await deliverPendingChildNotifications(service);
876
- expect(enqueuedCount).toBe(1);
877
- expect(sessionDomainService.enqueue).toHaveBeenCalledOnce();
878
- expect(workspaceNotificationService.markDelivered).not.toHaveBeenCalled();
879
- });
880
- it('does not requeue an already-committed pending notification when delivery retry fails', async () => {
881
- const createdAt = new Date('2026-06-22T10:30:00.000Z');
882
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
883
- {
884
- id: 'notif-parent',
885
- workspaceId: 'workspace-1',
886
- sourceWorkspaceId: 'parent-workspace',
887
- sourceWorkspaceName: 'Parent Workspace',
888
- sourceProjectName: 'Parent Project',
889
- message: 'Please check the failing test.',
890
- direction: 'PARENT_TO_CHILD',
891
- deliveredAt: null,
892
- createdAt,
893
- },
894
- ]);
895
- vi.mocked(workspaceNotificationService.markDelivered).mockRejectedValue(new Error('database unavailable'));
896
- const { service, sessionDomainService } = createLifecycleService({
897
- transcript: [
898
- {
899
- id: 'workspace-notification-notif-parent',
900
- source: 'user',
901
- text: '[Message from parent workspace "Parent Workspace"]: Please check the failing test.',
902
- timestamp: createdAt.toISOString(),
903
- order: 1,
904
- },
905
- ],
906
- });
907
- const enqueuedCount = await deliverPendingChildNotifications(service);
908
- expect(enqueuedCount).toBe(0);
909
- expect(sessionDomainService.enqueue).not.toHaveBeenCalled();
910
- expect(sessionDomainService.appendClaudeEvent).not.toHaveBeenCalled();
911
- expect(sessionDomainService.emitDelta).not.toHaveBeenCalled();
912
- expect(workspaceNotificationService.markDelivered).toHaveBeenCalledWith(['notif-parent']);
913
- });
914
- it('does not treat UI-only workspace update cards as delivered user messages', async () => {
915
- const createdAt = new Date('2026-06-22T10:30:00.000Z');
916
- vi.mocked(workspaceNotificationService.listPendingForDelivery).mockResolvedValue([
917
- {
918
- id: 'notif-parent',
919
- workspaceId: 'workspace-1',
920
- sourceWorkspaceId: 'parent-workspace',
921
- sourceWorkspaceName: 'Parent Workspace',
922
- sourceProjectName: 'Parent Project',
923
- message: 'Please check the failing test.',
924
- direction: 'PARENT_TO_CHILD',
925
- deliveredAt: null,
926
- createdAt,
927
- },
928
- ]);
929
- vi.mocked(workspaceNotificationService.markDelivered).mockResolvedValue();
930
- const { service, sessionDomainService } = createLifecycleService({
931
- transcript: [
932
- {
933
- id: 'session-1-1',
934
- source: 'agent',
935
- message: {
936
- type: 'parent_workspace_update',
937
- parentWorkspaceId: 'parent-workspace',
938
- parentWorkspaceName: 'Parent Workspace',
939
- parentProjectName: 'Parent Project',
940
- text: 'Please check the failing test.',
941
- timestamp: createdAt.toISOString(),
942
- },
943
- timestamp: createdAt.toISOString(),
944
- order: 1,
945
- },
946
- ],
947
- });
948
- const enqueuedCount = await deliverPendingChildNotifications(service);
949
- expect(enqueuedCount).toBe(1);
950
- expect(sessionDomainService.enqueue).toHaveBeenCalledWith('session-1', expect.objectContaining({
951
- id: 'workspace-notification-notif-parent',
952
- }));
953
- expect(workspaceNotificationService.markDelivered).not.toHaveBeenCalled();
954
- });
955
- });
956
- function createStartableLifecycleService(options) {
957
- const session = {
958
- id: 'session-1',
959
- workspaceId: 'workspace-1',
960
- workflow: 'code',
961
- provider: 'CLAUDE',
962
- providerSessionId: null,
963
- providerMetadata: null,
964
- model: 'claude-sonnet',
965
- };
966
- const workspace = {
967
- id: 'workspace-1',
968
- name: 'Workspace',
969
- description: null,
970
- projectId: 'project-1',
971
- worktreePath: '/tmp/workspace',
972
- branchName: 'feature/test',
973
- isAutoGeneratedBranch: false,
974
- hasHadSessions: false,
975
- runScriptPort: null,
976
- parentWorkspaceId: null,
977
- creationMetadata: null,
978
- };
979
- const handle = {
980
- provider: 'CLAUDE',
981
- providerSessionId: 'provider-session-1',
982
- configOptions: [],
983
- isPromptInFlight: false,
984
- };
985
- const repository = {
986
- getSessionById: vi.fn(async () => session),
987
- getWorkspaceById: vi.fn(async () => workspace),
988
- getProjectById: vi.fn(),
989
- markWorkspaceHasHadSessions: vi.fn(async () => undefined),
990
- updateSession: vi.fn(async () => session),
991
- updateSessionIfStatus: vi.fn(async () => null),
992
- };
993
- const promptBuilder = {
994
- shouldInjectBranchRename: vi.fn(() => false),
995
- buildSystemPrompt: vi.fn(() => ({
996
- workflowPrompt: undefined,
997
- systemPrompt: 'system prompt',
998
- injectedBranchRename: false,
999
- })),
1000
- };
1001
- const runtimeManager = {
1002
- isStopInProgress: vi.fn(() => false),
1003
- isSessionRunning: vi.fn(() => false),
1004
- getClient: vi.fn(() => undefined),
1005
- getOrCreateClient: vi.fn(async () => handle),
1006
- stopClient: vi.fn(async () => undefined),
1007
- isSessionWorking: vi.fn(() => false),
1008
- };
1009
- const sessionDomainService = {
1010
- setRuntimeSnapshot: vi.fn(),
1011
- emitDelta: vi.fn(),
1012
- isHistoryHydrated: vi.fn(() => false),
1013
- getTranscriptSnapshot: vi.fn(() => []),
1014
- getRuntimeSnapshot: vi.fn(() => ({
1015
- phase: 'idle',
1016
- processState: 'stopped',
1017
- activity: 'IDLE',
1018
- updatedAt: '2026-07-15T00:00:00.000Z',
1019
- })),
1020
- clearQueuedWork: vi.fn(),
1021
- clearSession: vi.fn(),
1022
- markProcessExit: vi.fn(),
1023
- };
1024
- const sessionConfigService = {
1025
- applyConfiguredReasoningEffort: vi.fn(async () => undefined),
1026
- applyStartupModePreset: vi.fn(async () => undefined),
1027
- applyConfiguredPermissionPreset: vi.fn(async () => undefined),
1028
- persistAcpConfigSnapshot: vi.fn(async () => undefined),
1029
- buildAcpChatBarCapabilities: vi.fn(() => ({})),
1030
- };
1031
- const acpEventProcessor = {
1032
- createRuntimeEventHandler: vi.fn(() => ({})),
1033
- registerSessionContext: vi.fn(),
1034
- setReplaySuppression: vi.fn(),
1035
- clearSessionState: vi.fn(),
1036
- clearStreamingState: vi.fn(),
1037
- clearReplaySuppression: vi.fn(),
1038
- finalizeOrphanedToolCalls: vi.fn(),
1039
- clearSessionContext: vi.fn(),
1040
- };
1041
- const tryDispatchNextMessage = vi.fn(options?.tryDispatchNextMessage ?? (async () => undefined));
1042
- const sendSessionMessage = vi.fn(async () => undefined);
1043
- const service = new SessionLifecycleService({
1044
- repository: repository,
1045
- promptBuilder: promptBuilder,
1046
- runtimeManager: runtimeManager,
1047
- sessionDomainService: sessionDomainService,
1048
- sessionPermissionService: { cancelPendingRequests: vi.fn() },
1049
- sessionConfigService: sessionConfigService,
1050
- acpEventProcessor: acpEventProcessor,
1051
- promptTurnCompletionService: { clearSession: vi.fn() },
1052
- retryService: {
1053
- run: vi.fn(async (operation) => await operation()),
1054
- },
1055
- sendSessionMessage,
1056
- lifecycleEventService: { hydrate: vi.fn(async () => undefined), record: vi.fn() },
1057
- });
1058
- service.configure({
1059
- workspace: {
1060
- markSessionRunning: vi.fn(),
1061
- markSessionIdle: vi.fn(),
1062
- recordRatchetSessionEnd: vi.fn(async () => undefined),
1063
- resetPRDiscoveryBackoff: vi.fn(async () => true),
1064
- },
1065
- messageQueue: { tryDispatchNextMessage },
1066
- });
1067
- service.deliverPendingChildNotifications = vi.fn(async () => options?.pendingNotificationCount ?? 0);
1068
- return {
1069
- service,
1070
- session,
1071
- repository,
1072
- sendSessionMessage,
1073
- tryDispatchNextMessage,
1074
- sessionConfigService,
1075
- runtimeManager,
1076
- sessionDomainService,
1077
- };
1078
- }
1079
- describe('SessionLifecycleService startSession pending workspace notifications', () => {
1080
- beforeEach(() => {
1081
- vi.clearAllMocks();
1082
- });
1083
- it('does not retain a stop generation for a missing session', async () => {
1084
- const { service, repository } = createStartableLifecycleService();
1085
- repository.getSessionById.mockResolvedValueOnce(null);
1086
- await expect(service.startSession('missing-session')).rejects.toThrow('Session not found: missing-session');
1087
- expect(getStopGenerations(service).has('missing-session')).toBe(false);
1088
- });
1089
- it('does not create a client when stop completes during the initial session lookup', async () => {
1090
- const { service, session, repository, runtimeManager } = createStartableLifecycleService();
1091
- let resolveSession;
1092
- repository.getSessionById.mockReturnValueOnce(new Promise((resolve) => {
1093
- resolveSession = resolve;
1094
- }));
1095
- const startResult = service.startSession('session-1').catch((error) => error);
1096
- await vi.waitFor(() => {
1097
- expect(repository.getSessionById).toHaveBeenCalledWith('session-1');
1098
- });
1099
- await service.stopSession('session-1');
1100
- resolveSession(session);
1101
- await expect(startResult).resolves.toEqual(expect.objectContaining({ message: 'Session is currently being stopped' }));
1102
- expect(runtimeManager.getOrCreateClient).not.toHaveBeenCalled();
1103
- expect(getStopGenerations(service).has('session-1')).toBe(false);
1104
- });
1105
- it('releases the stop generation when startup fails before creating a runtime', async () => {
1106
- const { service, runtimeManager } = createStartableLifecycleService();
1107
- runtimeManager.getOrCreateClient.mockRejectedValueOnce(new Error('spawn failed'));
1108
- await expect(service.startSession('session-1')).rejects.toThrow('spawn failed');
1109
- expect(getStopGenerations(service).has('session-1')).toBe(false);
1110
- });
1111
- it('does not retain a stop generation when client lookup cannot find the session', async () => {
1112
- const { service, repository } = createStartableLifecycleService();
1113
- repository.getSessionById.mockResolvedValueOnce(null);
1114
- await expect(service.getOrCreateSessionClient('missing-session')).rejects.toThrow('Session not found: missing-session');
1115
- expect(getStopGenerations(service).has('missing-session')).toBe(false);
1116
- });
1117
- it('releases the stop generation when record-based client creation fails', async () => {
1118
- const { service, session, runtimeManager } = createStartableLifecycleService();
1119
- runtimeManager.getOrCreateClient.mockRejectedValueOnce(new Error('spawn failed'));
1120
- await expect(service.getOrCreateSessionClientFromRecord(session)).rejects.toThrow('spawn failed');
1121
- expect(getStopGenerations(service).has('session-1')).toBe(false);
1122
- });
1123
- it('does not release a stop generation still owned by a concurrent startup', async () => {
1124
- let resolveFirstSettings;
1125
- const firstSettings = new Promise((resolve) => {
1126
- resolveFirstSettings = resolve;
1127
- });
1128
- vi.mocked(userSettingsService.get)
1129
- .mockReturnValueOnce(firstSettings)
1130
- .mockResolvedValueOnce(unsafeCoerce({
1131
- defaultWorkspacePermissions: 'STRICT',
1132
- ratchetPermissions: 'YOLO',
1133
- }));
1134
- const { service, runtimeManager } = createStartableLifecycleService();
1135
- const firstStart = service.startSession('session-1');
1136
- await vi.waitFor(() => {
1137
- expect(userSettingsService.get).toHaveBeenCalledTimes(1);
1138
- });
1139
- runtimeManager.getOrCreateClient.mockRejectedValueOnce(new Error('second spawn failed'));
1140
- await expect(service.startSession('session-1')).rejects.toThrow('second spawn failed');
1141
- resolveFirstSettings(unsafeCoerce({
1142
- defaultWorkspacePermissions: 'STRICT',
1143
- ratchetPermissions: 'YOLO',
1144
- }));
1145
- await expect(firstStart).resolves.toBeUndefined();
1146
- expect(getStopGenerations(service).has('session-1')).toBe(true);
1147
- });
1148
- it('dispatches queued notifications after startup presets and skips the default continue prompt', async () => {
1149
- const { service, sendSessionMessage, tryDispatchNextMessage, sessionConfigService } = createStartableLifecycleService({ pendingNotificationCount: 2 });
1150
- await service.startSession('session-1');
1151
- expect(tryDispatchNextMessage).toHaveBeenCalledWith('session-1');
1152
- expect(sendSessionMessage).not.toHaveBeenCalled();
1153
- const startupPresetOrder = sessionConfigService.applyStartupModePreset.mock.invocationCallOrder[0];
1154
- const permissionPresetOrder = sessionConfigService.applyConfiguredPermissionPreset.mock.invocationCallOrder[0];
1155
- const dispatchOrder = tryDispatchNextMessage.mock.invocationCallOrder[0];
1156
- expect(startupPresetOrder).toBeDefined();
1157
- expect(permissionPresetOrder).toBeDefined();
1158
- expect(dispatchOrder).toBeDefined();
1159
- expect(startupPresetOrder).toBeLessThan(dispatchOrder);
1160
- expect(permissionPresetOrder).toBeLessThan(dispatchOrder);
1161
- });
1162
- it('still sends an explicit initial prompt after queued notification dispatch starts', async () => {
1163
- const { service, sendSessionMessage, tryDispatchNextMessage } = createStartableLifecycleService({
1164
- pendingNotificationCount: 1,
1165
- });
1166
- await service.startSession('session-1', { initialPrompt: 'Follow up' });
1167
- expect(tryDispatchNextMessage).toHaveBeenCalledWith('session-1');
1168
- expect(sendSessionMessage).toHaveBeenCalledWith('session-1', 'Follow up');
1169
- const dispatchOrder = tryDispatchNextMessage.mock.invocationCallOrder[0];
1170
- const sendOrder = sendSessionMessage.mock.invocationCallOrder[0];
1171
- expect(dispatchOrder).toBeDefined();
1172
- expect(sendOrder).toBeDefined();
1173
- expect(dispatchOrder).toBeLessThan(sendOrder);
1174
- });
1175
- it('does not complete startup when stop finishes during the initial prompt', async () => {
1176
- let resolvePrompt;
1177
- const pendingPrompt = new Promise((resolve) => {
1178
- resolvePrompt = resolve;
1179
- });
1180
- const { service, sendSessionMessage } = createStartableLifecycleService();
1181
- sendSessionMessage.mockReturnValueOnce(pendingPrompt);
1182
- const startResult = service.startSession('session-1').catch((error) => error);
1183
- await vi.waitFor(() => {
1184
- expect(sendSessionMessage).toHaveBeenCalledWith('session-1', 'Continue with the task.');
1185
- });
1186
- await service.stopSession('session-1');
1187
- resolvePrompt(undefined);
1188
- await expect(startResult).resolves.toEqual(expect.objectContaining({ message: 'Session is currently being stopped' }));
1189
- expect(getStopGenerations(service).has('session-1')).toBe(false);
1190
- });
1191
- it('does not create a client after stop completes during permission resolution', async () => {
1192
- let resolveSettings;
1193
- const pendingSettings = new Promise((resolve) => {
1194
- resolveSettings = resolve;
1195
- });
1196
- vi.mocked(userSettingsService.get).mockReturnValueOnce(pendingSettings);
1197
- const { service, sendSessionMessage, runtimeManager } = createStartableLifecycleService();
1198
- const startResult = service.startSession('session-1').catch((error) => error);
1199
- await vi.waitFor(() => {
1200
- expect(userSettingsService.get).toHaveBeenCalled();
1201
- });
1202
- await service.stopSession('session-1');
1203
- expect(getStopGenerations(service).has('session-1')).toBe(false);
1204
- resolveSettings(unsafeCoerce({
1205
- defaultWorkspacePermissions: 'STRICT',
1206
- ratchetPermissions: 'YOLO',
1207
- }));
1208
- await expect(startResult).resolves.toEqual(expect.objectContaining({ message: 'Session is currently being stopped' }));
1209
- expect(runtimeManager.getOrCreateClient).not.toHaveBeenCalled();
1210
- expect(sendSessionMessage).not.toHaveBeenCalled();
1211
- expect(getStopGenerations(service).has('session-1')).toBe(false);
1212
- });
1213
- it('releases the stop generation after a session stops', async () => {
1214
- const { service } = createStartableLifecycleService();
1215
- await service.stopSession('session-1');
1216
- expect(getStopGenerations(service).has('session-1')).toBe(false);
1217
- });
1218
- it('releases the stop generation when viewers retain inactive session state', async () => {
1219
- const { service, sessionDomainService } = createStartableLifecycleService();
1220
- sessionEventBus.registerViewerCountProvider((sessionId) => (sessionId === 'session-1' ? 1 : 0));
1221
- try {
1222
- await service.stopSession('session-1');
1223
- }
1224
- finally {
1225
- sessionEventBus.registerViewerCountProvider(null);
1226
- }
1227
- expect(sessionDomainService.clearSession).not.toHaveBeenCalled();
1228
- expect(getStopGenerations(service).has('session-1')).toBe(false);
1229
- });
1230
- it('does not clear a restarted generation when an old runtime exit finishes', async () => {
1231
- const { service, session, repository } = createStartableLifecycleService();
1232
- let resolveUpdate;
1233
- repository.updateSession.mockReturnValueOnce(new Promise((resolve) => {
1234
- resolveUpdate = resolve;
1235
- }));
1236
- const oldGeneration = service.getStopGeneration('session-1');
1237
- const handlers = service.setupAcpEventHandler('session-1');
1238
- const exitPromise = handlers.onExit('session-1', 0);
1239
- expect(getStopGenerations(service).has('session-1')).toBe(false);
1240
- await service.startSession('session-1');
1241
- const restartedGeneration = service.getStopGeneration('session-1');
1242
- expect(restartedGeneration).not.toBe(oldGeneration);
1243
- resolveUpdate(session);
1244
- await exitPromise;
1245
- expect(service.isStopGenerationCurrent('session-1', restartedGeneration)).toBe(true);
1246
- expect(service.isStopGenerationCurrent('session-1', oldGeneration)).toBe(false);
1247
- });
1248
- it('waits for a registered client creation and stops the resulting runtime', async () => {
1249
- const { service, sendSessionMessage, runtimeManager } = createStartableLifecycleService();
1250
- let resolveClient;
1251
- const pendingClient = new Promise((resolve) => {
1252
- resolveClient = resolve;
1253
- });
1254
- runtimeManager.getOrCreateClient.mockReturnValueOnce(pendingClient);
1255
- const startResult = service.startSession('session-1').catch((error) => error);
1256
- await vi.waitFor(() => {
1257
- expect(runtimeManager.getOrCreateClient).toHaveBeenCalled();
1258
- });
1259
- const stopPromise = service.stopSession('session-1');
1260
- await vi.waitFor(() => {
1261
- expect(runtimeManager.stopClient).toHaveBeenCalledTimes(1);
1262
- });
1263
- resolveClient(unsafeCoerce({
1264
- provider: 'CLAUDE',
1265
- providerSessionId: 'provider-session-1',
1266
- configOptions: [],
1267
- isPromptInFlight: false,
1268
- }));
1269
- await stopPromise;
1270
- await expect(startResult).resolves.toEqual(expect.objectContaining({ message: 'Session is currently being stopped' }));
1271
- expect(runtimeManager.stopClient).toHaveBeenCalledTimes(2);
1272
- expect(sendSessionMessage).not.toHaveBeenCalled();
1273
- });
1274
- it('skips the restart default continue prompt when notifications are queued', async () => {
1275
- const { service, sendSessionMessage, tryDispatchNextMessage } = createStartableLifecycleService({
1276
- pendingNotificationCount: 1,
1277
- });
1278
- await service.restartSession('session-1');
1279
- expect(tryDispatchNextMessage).toHaveBeenCalledWith('session-1');
1280
- expect(sendSessionMessage).not.toHaveBeenCalled();
1281
- });
1282
- it('sends an explicit restart prompt after queued notification dispatch starts', async () => {
1283
- const { service, sendSessionMessage, tryDispatchNextMessage } = createStartableLifecycleService({
1284
- pendingNotificationCount: 1,
1285
- });
1286
- await service.restartSession('session-1', {
1287
- initialPrompt: 'Fix the failing checks',
1288
- startupModePreset: 'non_interactive',
1289
- });
1290
- expect(tryDispatchNextMessage).toHaveBeenCalledWith('session-1');
1291
- expect(sendSessionMessage).toHaveBeenCalledWith('session-1', 'Fix the failing checks');
1292
- const dispatchOrder = tryDispatchNextMessage.mock.invocationCallOrder[0];
1293
- const sendOrder = sendSessionMessage.mock.invocationCallOrder[0];
1294
- expect(dispatchOrder).toBeDefined();
1295
- expect(sendOrder).toBeDefined();
1296
- expect(dispatchOrder).toBeLessThan(sendOrder);
1297
- });
1298
- it('does not fail startup when queued notification dispatch fails', async () => {
1299
- const { service, sendSessionMessage, tryDispatchNextMessage } = createStartableLifecycleService({
1300
- pendingNotificationCount: 1,
1301
- tryDispatchNextMessage: () => Promise.reject(new Error('dispatch failed')),
1302
- });
1303
- await expect(service.startSession('session-1')).resolves.toBeUndefined();
1304
- expect(tryDispatchNextMessage).toHaveBeenCalledWith('session-1');
1305
- expect(sendSessionMessage).not.toHaveBeenCalled();
1306
- });
1307
- });
1308
- //# sourceMappingURL=session.lifecycle.service.test.js.map