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,1438 +0,0 @@
1
- import { EventEmitter } from 'node:events';
2
- import { tmpdir } from 'node:os';
3
- import { PassThrough } from 'node:stream';
4
- import { beforeEach, describe, expect, it, vi } from 'vitest';
5
- const { mockSpawn, mockInitialize, mockNewSession, mockPrompt, mockCancel, mockSetSessionConfigOption, mockSetSessionMode, mockSetSessionModel, mockNdJsonStream, } = vi.hoisted(() => ({
6
- mockSpawn: vi.fn(),
7
- mockInitialize: vi.fn(),
8
- mockNewSession: vi.fn(),
9
- mockPrompt: vi.fn(),
10
- mockCancel: vi.fn(),
11
- mockSetSessionConfigOption: vi.fn(),
12
- mockSetSessionMode: vi.fn(),
13
- mockSetSessionModel: vi.fn(),
14
- mockNdJsonStream: vi
15
- .fn()
16
- .mockReturnValue({ writable: {}, readable: { pipeThrough: () => ({}) } }),
17
- }));
18
- vi.mock('node:child_process', () => ({
19
- spawn: (...args) => mockSpawn(...args),
20
- }));
21
- vi.mock('@agentclientprotocol/sdk', () => {
22
- class MockCSC {
23
- toClient;
24
- initialize = mockInitialize;
25
- newSession = mockNewSession;
26
- prompt = mockPrompt;
27
- cancel = mockCancel;
28
- setSessionConfigOption = mockSetSessionConfigOption;
29
- setSessionMode = mockSetSessionMode;
30
- unstable_setSessionModel = mockSetSessionModel;
31
- constructor(toClient, _stream) {
32
- this.toClient = toClient;
33
- }
34
- }
35
- return {
36
- ClientSideConnection: MockCSC,
37
- ndJsonStream: (...args) => mockNdJsonStream(...args),
38
- PROTOCOL_VERSION: 1,
39
- };
40
- });
41
- vi.mock('@/backend/services/logger.service', () => ({
42
- createLogger: () => ({
43
- info: vi.fn(),
44
- debug: vi.fn(),
45
- warn: vi.fn(),
46
- error: vi.fn(),
47
- }),
48
- getCurrentProcessEnv: () => ({ ...process.env }),
49
- }));
50
- import { AcpClientHandler } from './acp-client-handler.js';
51
- import { AcpRuntimeManager, PromptTimeoutError } from './acp-runtime-manager.js';
52
- describe('PromptTimeoutError', () => {
53
- it('retains the caller-specified timeout for durable classification', () => {
54
- const error = new PromptTimeoutError('session-1', 300_000);
55
- expect(error.timeoutMs).toBe(300_000);
56
- });
57
- });
58
- function createMockChildProcess() {
59
- const child = new EventEmitter();
60
- child.pid = 12_345;
61
- child.exitCode = null;
62
- child.signalCode = null;
63
- child.killed = false;
64
- child.kill = vi.fn((signal) => {
65
- if (signal) {
66
- child.killed = true;
67
- }
68
- if (signal === 'SIGKILL') {
69
- child.exitCode = 137;
70
- child.emit('exit', 137, 'SIGKILL');
71
- }
72
- return true;
73
- });
74
- child.stdout = new PassThrough();
75
- child.stderr = new PassThrough();
76
- child.stdin = new PassThrough();
77
- return child;
78
- }
79
- function exitChildAfterSigterm(child) {
80
- child.kill = vi.fn((signal) => {
81
- if (signal === 'SIGTERM') {
82
- queueMicrotask(() => {
83
- child.signalCode = 'SIGTERM';
84
- child.emit('exit', null, 'SIGTERM');
85
- });
86
- }
87
- return true;
88
- });
89
- }
90
- function defaultOptions() {
91
- return {
92
- provider: 'CLAUDE',
93
- workingDir: '/tmp/workspace',
94
- sessionId: 'test-session-1',
95
- };
96
- }
97
- function codexOptions() {
98
- return {
99
- provider: 'CODEX',
100
- workingDir: '/tmp/workspace',
101
- sessionId: 'test-session-1',
102
- };
103
- }
104
- function defaultHandlers() {
105
- return {
106
- onSessionId: vi.fn().mockResolvedValue(undefined),
107
- onExit: vi.fn().mockResolvedValue(undefined),
108
- onError: vi.fn(),
109
- onAcpEvent: vi.fn(),
110
- };
111
- }
112
- function defaultContext() {
113
- return { workspaceId: 'w1', workingDir: '/tmp/workspace' };
114
- }
115
- function defaultConfigOptions() {
116
- return [
117
- {
118
- id: 'model',
119
- name: 'Model',
120
- type: 'select',
121
- category: 'model',
122
- currentValue: 'sonnet',
123
- options: [
124
- { value: 'sonnet', name: 'Sonnet' },
125
- { value: 'opus', name: 'Opus' },
126
- ],
127
- },
128
- {
129
- id: 'mode',
130
- name: 'Mode',
131
- type: 'select',
132
- category: 'mode',
133
- currentValue: 'default',
134
- options: [
135
- { value: 'default', name: 'Default' },
136
- { value: 'plan', name: 'Plan' },
137
- ],
138
- },
139
- ];
140
- }
141
- function setupSuccessfulSpawn() {
142
- const child = createMockChildProcess();
143
- mockSpawn.mockReturnValue(child);
144
- mockInitialize.mockResolvedValue({
145
- protocolVersion: 1,
146
- agentCapabilities: { loadSession: {} },
147
- agentInfo: { name: 'claude-agent-acp' },
148
- });
149
- mockNewSession.mockResolvedValue({
150
- sessionId: 'provider-session-123',
151
- configOptions: defaultConfigOptions(),
152
- });
153
- mockSetSessionConfigOption.mockResolvedValue({
154
- configOptions: defaultConfigOptions(),
155
- });
156
- mockSetSessionMode.mockResolvedValue({});
157
- mockSetSessionModel.mockResolvedValue({});
158
- return child;
159
- }
160
- function createDeferred() {
161
- let resolvePromise;
162
- let rejectPromise;
163
- const promise = new Promise((resolve, reject) => {
164
- resolvePromise = resolve;
165
- rejectPromise = reject;
166
- });
167
- return { promise, resolve: resolvePromise, reject: rejectPromise };
168
- }
169
- describe('AcpRuntimeManager', () => {
170
- let manager;
171
- beforeEach(() => {
172
- manager = new AcpRuntimeManager();
173
- });
174
- describe('getOrCreateClient', () => {
175
- it('rejects before spawn when workingDir is empty', async () => {
176
- await expect(manager.getOrCreateClient('session-empty-cwd', { ...defaultOptions(), workingDir: '' }, defaultHandlers(), defaultContext())).rejects.toThrow('ACP working directory is required before spawning adapter process');
177
- expect(mockSpawn).not.toHaveBeenCalled();
178
- });
179
- it('rejects before spawn when workingDir is whitespace only', async () => {
180
- await expect(manager.getOrCreateClient('session-whitespace-cwd', { ...defaultOptions(), workingDir: ' ' }, defaultHandlers(), defaultContext())).rejects.toThrow('ACP working directory is required before spawning adapter process');
181
- expect(mockSpawn).not.toHaveBeenCalled();
182
- });
183
- it('spawns subprocess with detached:false, wires streams, initializes, creates session, returns handle', async () => {
184
- setupSuccessfulSpawn();
185
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
186
- expect(mockSpawn).toHaveBeenCalledTimes(1);
187
- const spawnArgs = mockSpawn.mock.calls[0];
188
- expect(spawnArgs[1]).toEqual([]);
189
- expect(spawnArgs[2]).toMatchObject({
190
- cwd: '/tmp/workspace',
191
- stdio: ['pipe', 'pipe', 'pipe'],
192
- detached: false,
193
- });
194
- expect(mockInitialize).toHaveBeenCalledTimes(1);
195
- expect(mockInitialize).toHaveBeenCalledWith(expect.objectContaining({
196
- protocolVersion: 1,
197
- clientCapabilities: {},
198
- clientInfo: expect.objectContaining({
199
- name: 'factory-factory',
200
- }),
201
- }));
202
- expect(mockNewSession).toHaveBeenCalledTimes(1);
203
- expect(mockNewSession).toHaveBeenCalledWith(expect.objectContaining({
204
- cwd: '/tmp/workspace',
205
- mcpServers: [],
206
- }));
207
- expect(handle.providerSessionId).toBe('provider-session-123');
208
- expect(handle.agentCapabilities).toEqual({ loadSession: {} });
209
- expect(handle.isPromptInFlight).toBe(false);
210
- expect(handle.isRunning()).toBe(true);
211
- expect(handle.getPid()).toBe(12_345);
212
- });
213
- it('spawns CODEX provider using internal CLI adapter command', async () => {
214
- setupSuccessfulSpawn();
215
- await manager.getOrCreateClient('session-1', codexOptions(), defaultHandlers(), defaultContext());
216
- expect(mockSpawn).toHaveBeenCalledTimes(1);
217
- const spawnArgs = mockSpawn.mock.calls[0];
218
- expect(spawnArgs[1]).toContain('internal');
219
- expect(spawnArgs[1]).toContain('codex-app-server-acp');
220
- expect(spawnArgs[1].some((arg) => arg.endsWith('src/cli/index.ts') || arg.endsWith('dist/src/cli/index.js'))).toBe(true);
221
- expect(typeof spawnArgs[0]).toBe('string');
222
- expect(spawnArgs[0].length).toBeGreaterThan(0);
223
- expect(spawnArgs[2].env?.DOTENV_CONFIG_QUIET).toBe('true');
224
- if (spawnArgs[0].endsWith('tsx') ||
225
- spawnArgs[0].endsWith('tsx.cmd')) {
226
- expect(spawnArgs[1]).toContain('--tsconfig');
227
- expect(spawnArgs[1].some((arg) => arg.endsWith('tsconfig.json'))).toBe(true);
228
- }
229
- expect(spawnArgs[2]).toMatchObject({
230
- cwd: '/tmp/workspace',
231
- stdio: ['pipe', 'pipe', 'pipe'],
232
- detached: false,
233
- });
234
- });
235
- it('resolves CODEX internal adapter from module location when cwd is outside repo', async () => {
236
- setupSuccessfulSpawn();
237
- const originalCwd = process.cwd();
238
- process.chdir(tmpdir());
239
- try {
240
- await manager.getOrCreateClient('session-1', codexOptions(), defaultHandlers(), defaultContext());
241
- }
242
- finally {
243
- process.chdir(originalCwd);
244
- }
245
- expect(mockSpawn).toHaveBeenCalledTimes(1);
246
- const spawnArgs = mockSpawn.mock.calls[0];
247
- const command = spawnArgs[0];
248
- const args = spawnArgs[1];
249
- expect(command.length).toBeGreaterThan(0);
250
- expect(args).toContain('internal');
251
- expect(args).toContain('codex-app-server-acp');
252
- if (command.endsWith('tsx') || command.endsWith('tsx.cmd')) {
253
- expect(args).toContain('--tsconfig');
254
- expect(args.some((arg) => arg.endsWith('tsconfig.json'))).toBe(true);
255
- }
256
- expect(args.some((arg) => arg.endsWith('src/cli/index.ts') || arg.endsWith('dist/src/cli/index.js'))).toBe(true);
257
- });
258
- it('rejects cleanly when ACP binary spawn fails (ENOENT)', async () => {
259
- const child = createMockChildProcess();
260
- mockSpawn.mockReturnValue(child);
261
- mockInitialize.mockImplementation(() => new Promise(() => {
262
- }));
263
- vi.useFakeTimers();
264
- try {
265
- const handlers = defaultHandlers();
266
- const createResult = manager
267
- .getOrCreateClient('session-1', defaultOptions(), handlers, defaultContext())
268
- .then((handle) => ({ handle }), (error) => ({ error }));
269
- let creationSettled = false;
270
- void createResult.then(() => {
271
- creationSettled = true;
272
- });
273
- await vi.advanceTimersByTimeAsync(0);
274
- expect(mockSpawn).toHaveBeenCalledTimes(1);
275
- const spawnError = Object.assign(new Error('spawn claude-agent-acp ENOENT'), {
276
- code: 'ENOENT',
277
- });
278
- child.emit('error', spawnError);
279
- await vi.advanceTimersByTimeAsync(0);
280
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
281
- child.emit('close', -2, null);
282
- await vi.advanceTimersByTimeAsync(0);
283
- expect(creationSettled).toBe(true);
284
- await expect(createResult).resolves.toMatchObject({
285
- error: {
286
- message: expect.stringMatching(/Failed to spawn ACP adapter ".*": spawn claude-agent-acp ENOENT/),
287
- },
288
- });
289
- expect(child.kill).not.toHaveBeenCalledWith('SIGKILL');
290
- expect(handlers.onError).toHaveBeenCalledWith('session-1', expect.any(Error));
291
- }
292
- finally {
293
- await vi.advanceTimersByTimeAsync(5000);
294
- vi.useRealTimers();
295
- }
296
- });
297
- it('allows the subprocess to exit during the SIGTERM grace period after initialization fails', async () => {
298
- const child = createMockChildProcess();
299
- exitChildAfterSigterm(child);
300
- mockSpawn.mockReturnValue(child);
301
- mockInitialize.mockRejectedValue(new Error('handshake failed'));
302
- await expect(manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext())).rejects.toThrow('handshake failed');
303
- expect(child.kill).toHaveBeenCalledTimes(1);
304
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
305
- expect(child.kill).not.toHaveBeenCalledWith('SIGKILL');
306
- expect(mockNewSession).not.toHaveBeenCalled();
307
- });
308
- it('does not signal a subprocess that already terminated from a signal', async () => {
309
- const child = createMockChildProcess();
310
- child.signalCode = 'SIGTERM';
311
- mockSpawn.mockReturnValue(child);
312
- mockInitialize.mockRejectedValue(new Error('handshake failed'));
313
- vi.useFakeTimers();
314
- try {
315
- const creationPromise = manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
316
- const creationRejection = creationPromise.catch((error) => error);
317
- await vi.advanceTimersByTimeAsync(5000);
318
- await expect(creationRejection).resolves.toMatchObject({ message: 'handshake failed' });
319
- expect(child.kill).not.toHaveBeenCalled();
320
- }
321
- finally {
322
- vi.useRealTimers();
323
- }
324
- });
325
- it('escalates failed initialization cleanup to SIGKILL after the grace period', async () => {
326
- const child = createMockChildProcess();
327
- mockSpawn.mockReturnValue(child);
328
- mockInitialize.mockRejectedValue(new Error('handshake failed'));
329
- vi.useFakeTimers();
330
- try {
331
- const creationPromise = manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
332
- const creationRejection = creationPromise.catch((error) => error);
333
- await vi.advanceTimersByTimeAsync(0);
334
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
335
- expect(child.kill).not.toHaveBeenCalledWith('SIGKILL');
336
- await vi.advanceTimersByTimeAsync(4999);
337
- expect(child.kill).not.toHaveBeenCalledWith('SIGKILL');
338
- await vi.advanceTimersByTimeAsync(1);
339
- await expect(creationRejection).resolves.toMatchObject({ message: 'handshake failed' });
340
- expect(child.kill).toHaveBeenCalledWith('SIGKILL');
341
- }
342
- finally {
343
- vi.useRealTimers();
344
- }
345
- });
346
- it('times out when ACP initialize handshake never resolves', async () => {
347
- manager.setAcpStartupTimeoutMs(20);
348
- const child = createMockChildProcess();
349
- exitChildAfterSigterm(child);
350
- mockSpawn.mockReturnValue(child);
351
- mockInitialize.mockImplementation(() => new Promise(() => {
352
- }));
353
- await expect(manager.getOrCreateClient('session-timeout-init', defaultOptions(), defaultHandlers(), defaultContext())).rejects.toThrow('ACP initialize handshake timed out');
354
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
355
- expect(child.kill).not.toHaveBeenCalledWith('SIGKILL');
356
- });
357
- it('times out when ACP session creation never resolves', async () => {
358
- manager.setAcpStartupTimeoutMs(20);
359
- const child = createMockChildProcess();
360
- exitChildAfterSigterm(child);
361
- mockSpawn.mockReturnValue(child);
362
- mockInitialize.mockResolvedValue({
363
- protocolVersion: 1,
364
- agentCapabilities: { loadSession: {} },
365
- agentInfo: { name: 'claude-agent-acp' },
366
- });
367
- mockNewSession.mockImplementation(() => new Promise(() => {
368
- }));
369
- await expect(manager.getOrCreateClient('session-timeout-new-session', defaultOptions(), defaultHandlers(), defaultContext())).rejects.toThrow('ACP session creation timed out');
370
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
371
- expect(child.kill).not.toHaveBeenCalledWith('SIGKILL');
372
- });
373
- it('returns existing handle if session already exists and is running', async () => {
374
- setupSuccessfulSpawn();
375
- const handle1 = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
376
- const handle2 = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
377
- expect(handle1).toBe(handle2);
378
- expect(mockSpawn).toHaveBeenCalledTimes(1);
379
- });
380
- it('deduplicates concurrent creation for same sessionId', async () => {
381
- const child = createMockChildProcess();
382
- mockSpawn.mockReturnValue(child);
383
- let resolveInit;
384
- mockInitialize.mockReturnValue(new Promise((resolve) => {
385
- resolveInit = resolve;
386
- }));
387
- mockNewSession.mockResolvedValue({
388
- sessionId: 'provider-session-123',
389
- configOptions: defaultConfigOptions(),
390
- });
391
- const first = manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
392
- const second = manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
393
- await new Promise((r) => setTimeout(r, 10));
394
- resolveInit({
395
- protocolVersion: 1,
396
- agentCapabilities: {},
397
- agentInfo: { name: 'test' },
398
- });
399
- const [h1, h2] = await Promise.all([first, second]);
400
- expect(h1).toBe(h2);
401
- expect(mockSpawn).toHaveBeenCalledTimes(1);
402
- });
403
- it('calls onSessionId handler with provider session ID', async () => {
404
- setupSuccessfulSpawn();
405
- const handlers = defaultHandlers();
406
- await manager.getOrCreateClient('session-1', defaultOptions(), handlers, defaultContext());
407
- expect(handlers.onSessionId).toHaveBeenCalledWith('session-1', 'provider-session-123');
408
- });
409
- it('calls onClientCreated callback when set', async () => {
410
- setupSuccessfulSpawn();
411
- const callback = vi.fn();
412
- manager.setOnClientCreated(callback);
413
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
414
- expect(callback).toHaveBeenCalledWith('session-1', handle, defaultContext());
415
- });
416
- it('stores config options returned by ACP newSession', async () => {
417
- setupSuccessfulSpawn();
418
- const expectedConfigOptions = [
419
- {
420
- id: 'model',
421
- name: 'Model',
422
- type: 'select',
423
- category: 'model',
424
- currentValue: 'sonnet',
425
- options: [
426
- { value: 'sonnet', name: 'Sonnet' },
427
- { value: 'opus', name: 'Opus' },
428
- ],
429
- },
430
- {
431
- id: 'mode',
432
- name: 'Mode',
433
- type: 'select',
434
- category: 'mode',
435
- currentValue: 'default',
436
- options: [
437
- { value: 'default', name: 'Default' },
438
- { value: 'plan', name: 'Plan' },
439
- ],
440
- },
441
- ];
442
- mockNewSession.mockResolvedValueOnce({
443
- sessionId: 'provider-session-123',
444
- configOptions: expectedConfigOptions,
445
- });
446
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
447
- expect(handle.configOptions).toEqual(expectedConfigOptions);
448
- });
449
- it('fails fast when ACP newSession omits configOptions', async () => {
450
- const child = setupSuccessfulSpawn();
451
- exitChildAfterSigterm(child);
452
- mockNewSession.mockResolvedValueOnce({
453
- sessionId: 'provider-session-123',
454
- });
455
- await expect(manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext())).rejects.toThrow('did not include required configOptions');
456
- });
457
- it('derives required config options from models/modes when newSession omits configOptions', async () => {
458
- setupSuccessfulSpawn();
459
- mockNewSession.mockResolvedValueOnce({
460
- sessionId: 'provider-session-123',
461
- models: {
462
- availableModels: [
463
- { modelId: 'claude-opus-4-6', name: 'Claude Opus 4.6' },
464
- { modelId: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' },
465
- ],
466
- currentModelId: 'claude-opus-4-6',
467
- },
468
- modes: {
469
- availableModes: [
470
- { id: 'default', name: 'Default' },
471
- { id: 'plan', name: 'Plan' },
472
- ],
473
- currentModeId: 'default',
474
- },
475
- });
476
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
477
- const modelOption = handle.configOptions.find((option) => option.category === 'model');
478
- const modeOption = handle.configOptions.find((option) => option.category === 'mode');
479
- expect(modelOption).toMatchObject({
480
- id: 'model',
481
- currentValue: 'claude-opus-4-6',
482
- });
483
- expect(modelOption?.options).toEqual(expect.arrayContaining([
484
- expect.objectContaining({ value: 'claude-opus-4-6', name: 'Claude Opus 4.6' }),
485
- expect.objectContaining({ value: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' }),
486
- ]));
487
- expect(modeOption).toMatchObject({
488
- id: 'mode',
489
- currentValue: 'default',
490
- });
491
- expect(modeOption?.options).toEqual(expect.arrayContaining([
492
- expect.objectContaining({ value: 'default', name: 'Default' }),
493
- expect.objectContaining({ value: 'plan', name: 'Plan' }),
494
- ]));
495
- });
496
- it('fails fast when ACP newSession omits required model/mode categories', async () => {
497
- const child = setupSuccessfulSpawn();
498
- exitChildAfterSigterm(child);
499
- mockNewSession.mockResolvedValueOnce({
500
- sessionId: 'provider-session-123',
501
- configOptions: [
502
- {
503
- id: 'reasoning_effort',
504
- name: 'Reasoning Effort',
505
- type: 'select',
506
- category: 'thought_level',
507
- currentValue: 'medium',
508
- options: [{ value: 'medium', name: 'Medium' }],
509
- },
510
- ],
511
- });
512
- await expect(manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext())).rejects.toThrow('missing required config option categories: model, mode');
513
- });
514
- it('uses model family name for Claude default model labels in configOptions', async () => {
515
- setupSuccessfulSpawn();
516
- mockNewSession.mockResolvedValueOnce({
517
- sessionId: 'provider-session-123',
518
- configOptions: [
519
- {
520
- id: 'model',
521
- name: 'Model',
522
- type: 'select',
523
- category: 'model',
524
- currentValue: 'default',
525
- options: [
526
- {
527
- value: 'default',
528
- name: 'Default (recommended)',
529
- description: 'Opus 4.6 · best for complex tasks',
530
- },
531
- { value: 'sonnet', name: 'Sonnet 4.5' },
532
- ],
533
- },
534
- {
535
- id: 'mode',
536
- name: 'Mode',
537
- type: 'select',
538
- category: 'mode',
539
- currentValue: 'default',
540
- options: [
541
- { value: 'default', name: 'Default' },
542
- { value: 'plan', name: 'Plan' },
543
- ],
544
- },
545
- ],
546
- });
547
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
548
- const modelOption = handle.configOptions.find((option) => option.id === 'model');
549
- const defaultEntry = modelOption?.options.find((option) => 'value' in option && option.value === 'default');
550
- expect(defaultEntry).toMatchObject({ value: 'default', name: 'Opus 4.6' });
551
- });
552
- });
553
- describe('stopClient', () => {
554
- it('keeps creation lock bookkeeping when stop is already in progress', async () => {
555
- const child = setupSuccessfulSpawn();
556
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
557
- const internalManager = manager;
558
- internalManager.creationLocks.set('session-1', vi.fn());
559
- internalManager.lockRefCounts.set('session-1', 3);
560
- child.kill = vi.fn(() => {
561
- setTimeout(() => {
562
- child.exitCode = 0;
563
- child.emit('exit', 0, null);
564
- }, 10);
565
- return true;
566
- });
567
- const stopPromise = manager.stopClient('session-1');
568
- await vi.waitFor(() => {
569
- expect(manager.isStopInProgress('session-1')).toBe(true);
570
- });
571
- await manager.stopClient('session-1');
572
- expect(internalManager.creationLocks.has('session-1')).toBe(true);
573
- expect(internalManager.lockRefCounts.has('session-1')).toBe(true);
574
- await stopPromise;
575
- });
576
- it('sends SIGTERM, waits grace period, cleans up references', async () => {
577
- const child = setupSuccessfulSpawn();
578
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
579
- child.kill = vi.fn(() => {
580
- child.exitCode = 0;
581
- child.emit('exit', 0, null);
582
- return true;
583
- });
584
- await manager.stopClient('session-1');
585
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
586
- expect(manager.getClient('session-1')).toBeUndefined();
587
- });
588
- it('clears the SIGTERM grace-period timeout when the child exits quickly', async () => {
589
- const child = setupSuccessfulSpawn();
590
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
591
- child.kill = vi.fn(() => {
592
- child.exitCode = 0;
593
- child.emit('exit', 0, null);
594
- return true;
595
- });
596
- vi.useFakeTimers();
597
- try {
598
- await manager.stopClient('session-1');
599
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
600
- expect(vi.getTimerCount()).toBe(0);
601
- }
602
- finally {
603
- vi.useRealTimers();
604
- }
605
- });
606
- it('escalates to SIGKILL after timeout', async () => {
607
- const child = setupSuccessfulSpawn();
608
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
609
- const killCalls = [];
610
- child.kill = vi.fn((signal) => {
611
- killCalls.push(signal ?? 'default');
612
- if (signal === 'SIGKILL') {
613
- child.killed = true;
614
- child.exitCode = 137;
615
- child.emit('exit', 137, 'SIGKILL');
616
- }
617
- return true;
618
- });
619
- vi.useFakeTimers();
620
- const stopPromise = manager.stopClient('session-1');
621
- await vi.advanceTimersByTimeAsync(5100);
622
- await stopPromise;
623
- expect(killCalls).toContain('SIGTERM');
624
- expect(killCalls).toContain('SIGKILL');
625
- expect(manager.getClient('session-1')).toBeUndefined();
626
- vi.useRealTimers();
627
- });
628
- it('cancels prompt if isPromptInFlight before SIGTERM', async () => {
629
- const child = setupSuccessfulSpawn();
630
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
631
- handle.isPromptInFlight = true;
632
- mockCancel.mockResolvedValue(undefined);
633
- child.kill = vi.fn(() => {
634
- child.exitCode = 0;
635
- child.emit('exit', 0, null);
636
- return true;
637
- });
638
- await manager.stopClient('session-1');
639
- expect(mockCancel).toHaveBeenCalledWith({
640
- sessionId: 'provider-session-123',
641
- });
642
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
643
- });
644
- it('is idempotent - double stop is no-op', async () => {
645
- const child = setupSuccessfulSpawn();
646
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
647
- child.kill = vi.fn(() => {
648
- setTimeout(() => {
649
- child.exitCode = 0;
650
- child.emit('exit', 0, null);
651
- }, 10);
652
- return true;
653
- });
654
- const [, result2] = await Promise.all([
655
- manager.stopClient('session-1'),
656
- manager.stopClient('session-1'),
657
- ]);
658
- expect(result2).toBeUndefined();
659
- });
660
- it('aborts in-flight client creation and cleans up the spawned subprocess', async () => {
661
- const child = createMockChildProcess();
662
- exitChildAfterSigterm(child);
663
- mockSpawn.mockReturnValue(child);
664
- mockInitialize.mockImplementation(() => new Promise(() => {
665
- }));
666
- const createPromise = manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
667
- const createRejection = createPromise.catch((error) => error);
668
- await vi.waitFor(() => {
669
- expect(mockSpawn).toHaveBeenCalledTimes(1);
670
- expect(manager.getPendingClient('session-1')).toBeDefined();
671
- });
672
- await manager.stopClient('session-1');
673
- await expect(createRejection).resolves.toMatchObject({
674
- message: expect.stringContaining('ACP session stop requested'),
675
- });
676
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
677
- expect(child.kill).not.toHaveBeenCalledWith('SIGKILL');
678
- expect(manager.isStopInProgress('session-1')).toBe(false);
679
- expect(manager.getClient('session-1')).toBeUndefined();
680
- expect(manager.getPendingClient('session-1')).toBeUndefined();
681
- });
682
- it('skips exit handler when stop is in progress', async () => {
683
- const child = setupSuccessfulSpawn();
684
- const handlers = defaultHandlers();
685
- await manager.getOrCreateClient('session-1', defaultOptions(), handlers, defaultContext());
686
- handlers.onExit.mockClear();
687
- child.kill = vi.fn(() => {
688
- child.exitCode = 0;
689
- child.emit('exit', 0, null);
690
- return true;
691
- });
692
- await manager.stopClient('session-1');
693
- expect(handlers.onExit).not.toHaveBeenCalled();
694
- });
695
- it('skips exit handler when a stopped process exits after stop timeout', async () => {
696
- const child = setupSuccessfulSpawn();
697
- const handlers = defaultHandlers();
698
- await manager.getOrCreateClient('session-1', defaultOptions(), handlers, defaultContext());
699
- child.kill = vi.fn((signal) => {
700
- if (signal) {
701
- child.killed = true;
702
- }
703
- return true;
704
- });
705
- vi.useFakeTimers();
706
- const stopPromise = manager.stopClient('session-1');
707
- await vi.advanceTimersByTimeAsync(5100);
708
- await stopPromise;
709
- vi.useRealTimers();
710
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
711
- expect(child.kill).toHaveBeenCalledWith('SIGKILL');
712
- expect(manager.isStopInProgress('session-1')).toBe(false);
713
- handlers.onExit.mockClear();
714
- child.exitCode = 137;
715
- child.emit('exit', 137, 'SIGKILL');
716
- await new Promise((resolve) => setTimeout(resolve, 0));
717
- expect(handlers.onExit).not.toHaveBeenCalled();
718
- });
719
- it('does not let a late stopped-process exit affect a replacement client', async () => {
720
- const firstChild = setupSuccessfulSpawn();
721
- const firstHandlers = defaultHandlers();
722
- await manager.getOrCreateClient('session-1', defaultOptions(), firstHandlers, defaultContext());
723
- firstChild.kill = vi.fn((signal) => {
724
- if (signal) {
725
- firstChild.killed = true;
726
- }
727
- return true;
728
- });
729
- vi.useFakeTimers();
730
- const stopPromise = manager.stopClient('session-1');
731
- await vi.advanceTimersByTimeAsync(5100);
732
- await stopPromise;
733
- vi.useRealTimers();
734
- const secondChild = createMockChildProcess();
735
- const secondHandlers = defaultHandlers();
736
- mockSpawn.mockReturnValueOnce(secondChild);
737
- const restartedHandle = await manager.getOrCreateClient('session-1', defaultOptions(), secondHandlers, defaultContext());
738
- firstHandlers.onExit.mockClear();
739
- firstChild.exitCode = 137;
740
- firstChild.emit('exit', 137, 'SIGKILL');
741
- await new Promise((resolve) => setTimeout(resolve, 0));
742
- expect(firstHandlers.onExit).not.toHaveBeenCalled();
743
- expect(manager.getClient('session-1')).toBe(restartedHandle);
744
- });
745
- it('does not call onExit for stale SIGKILL exit after stop completes and session restarts', async () => {
746
- const firstChild = setupSuccessfulSpawn();
747
- const handlers = defaultHandlers();
748
- await manager.getOrCreateClient('session-1', defaultOptions(), handlers, defaultContext());
749
- firstChild.kill = vi.fn((signal) => {
750
- if (signal) {
751
- firstChild.killed = true;
752
- }
753
- if (signal === 'SIGKILL') {
754
- firstChild.exitCode = 137;
755
- }
756
- return true;
757
- });
758
- vi.useFakeTimers();
759
- const stopPromise = manager.stopClient('session-1');
760
- await vi.advanceTimersByTimeAsync(5100);
761
- await stopPromise;
762
- vi.useRealTimers();
763
- const secondChild = createMockChildProcess();
764
- mockSpawn.mockReturnValueOnce(secondChild);
765
- const newHandle = await manager.getOrCreateClient('session-1', defaultOptions(), handlers, defaultContext());
766
- expect(newHandle.child).toBe(secondChild);
767
- handlers.onExit.mockClear();
768
- firstChild.emit('exit', 137, 'SIGKILL');
769
- await new Promise((resolve) => setTimeout(resolve, 0));
770
- expect(handlers.onExit).not.toHaveBeenCalled();
771
- expect(manager.getClient('session-1')).toBe(newHandle);
772
- });
773
- it('rejects client creation while a stop is in progress', async () => {
774
- const firstChild = setupSuccessfulSpawn();
775
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
776
- firstChild.kill = vi.fn((signal) => {
777
- if (signal) {
778
- firstChild.killed = true;
779
- }
780
- return true;
781
- });
782
- const stopPromise = manager.stopClient('session-1');
783
- await vi.waitFor(() => {
784
- expect(firstChild.kill).toHaveBeenCalledWith('SIGTERM');
785
- });
786
- const secondChild = createMockChildProcess();
787
- exitChildAfterSigterm(secondChild);
788
- mockSpawn.mockReturnValueOnce(secondChild);
789
- await expect(manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext())).rejects.toThrow('ACP session stop requested');
790
- expect(secondChild.kill).toHaveBeenCalledWith('SIGTERM');
791
- expect(secondChild.kill).not.toHaveBeenCalledWith('SIGKILL');
792
- firstChild.exitCode = 0;
793
- firstChild.emit('exit', 0, null);
794
- await stopPromise;
795
- expect(manager.getClient('session-1')).toBeUndefined();
796
- });
797
- it('wires child error handlers before aborting creation during stop', async () => {
798
- const firstChild = setupSuccessfulSpawn();
799
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
800
- firstChild.kill = vi.fn((signal) => {
801
- if (signal) {
802
- firstChild.killed = true;
803
- }
804
- return true;
805
- });
806
- const stopPromise = manager.stopClient('session-1');
807
- await vi.waitFor(() => {
808
- expect(firstChild.kill).toHaveBeenCalledWith('SIGTERM');
809
- });
810
- const secondChild = createMockChildProcess();
811
- secondChild.kill = vi.fn((signal) => {
812
- if (signal === 'SIGTERM') {
813
- secondChild.emit('error', new Error('cleanup child error'));
814
- queueMicrotask(() => {
815
- secondChild.exitCode = 0;
816
- secondChild.emit('exit', 0, null);
817
- });
818
- }
819
- return true;
820
- });
821
- mockSpawn.mockReturnValueOnce(secondChild);
822
- const handlers = defaultHandlers();
823
- await expect(manager.getOrCreateClient('session-1', defaultOptions(), handlers, defaultContext())).rejects.toThrow('ACP session stop requested');
824
- expect(secondChild.kill).toHaveBeenCalledWith('SIGTERM');
825
- expect(secondChild.kill).not.toHaveBeenCalledWith('SIGKILL');
826
- await vi.waitFor(() => {
827
- expect(handlers.onError).toHaveBeenCalledWith('session-1', expect.any(Error));
828
- });
829
- firstChild.exitCode = 0;
830
- firstChild.emit('exit', 0, null);
831
- await stopPromise;
832
- });
833
- it('clears creation lock bookkeeping when stop rejects a concurrent create', async () => {
834
- const firstChild = setupSuccessfulSpawn();
835
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
836
- firstChild.kill = vi.fn((signal) => {
837
- if (signal) {
838
- firstChild.killed = true;
839
- }
840
- return true;
841
- });
842
- const stopPromise = manager.stopClient('session-1');
843
- await vi.waitFor(() => {
844
- expect(firstChild.kill).toHaveBeenCalledWith('SIGTERM');
845
- });
846
- const secondChild = createMockChildProcess();
847
- exitChildAfterSigterm(secondChild);
848
- mockSpawn.mockReturnValueOnce(secondChild);
849
- await expect(manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext())).rejects.toThrow('ACP session stop requested');
850
- const internalManager = manager;
851
- expect(internalManager.creationLocks.has('session-1')).toBe(false);
852
- expect(internalManager.lockRefCounts.has('session-1')).toBe(false);
853
- firstChild.exitCode = 0;
854
- firstChild.emit('exit', 0, null);
855
- await stopPromise;
856
- });
857
- });
858
- describe('stopAllClients', () => {
859
- it('atomically closes admission and reports active and pending session ids', async () => {
860
- const activeChild = setupSuccessfulSpawn();
861
- await manager.getOrCreateClient('session-active', defaultOptions(), defaultHandlers(), defaultContext());
862
- const pendingChild = createMockChildProcess();
863
- exitChildAfterSigterm(pendingChild);
864
- mockSpawn.mockReturnValueOnce(pendingChild);
865
- mockInitialize.mockImplementationOnce(() => new Promise(() => {
866
- }));
867
- const pendingCreation = manager
868
- .getOrCreateClient('session-pending', { ...defaultOptions(), sessionId: 'session-pending' }, defaultHandlers(), defaultContext())
869
- .catch((error) => error);
870
- await vi.waitFor(() => {
871
- expect(manager.getPendingClient('session-pending')).toBeDefined();
872
- });
873
- const shutdownSessionIds = manager.beginShutdown();
874
- expect(new Set(shutdownSessionIds)).toEqual(new Set(['session-active', 'session-pending']));
875
- await expect(manager.getOrCreateClient('session-too-late', { ...defaultOptions(), sessionId: 'session-too-late' }, defaultHandlers(), defaultContext())).rejects.toThrow('ACP runtime manager is shutting down');
876
- activeChild.kill = vi.fn(() => {
877
- activeChild.exitCode = 0;
878
- activeChild.emit('exit', 0, null);
879
- return true;
880
- });
881
- await manager.stopAllClients(50);
882
- await expect(pendingCreation).resolves.toMatchObject({
883
- message: expect.stringContaining('ACP runtime manager is shutting down'),
884
- });
885
- });
886
- it('clears per-client shutdown timeouts when clients stop quickly', async () => {
887
- const firstChild = setupSuccessfulSpawn();
888
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
889
- const secondChild = createMockChildProcess();
890
- mockSpawn.mockReturnValueOnce(secondChild);
891
- await manager.getOrCreateClient('session-2', { ...defaultOptions(), sessionId: 'session-2' }, defaultHandlers(), defaultContext());
892
- firstChild.kill = vi.fn(() => {
893
- firstChild.exitCode = 0;
894
- firstChild.emit('exit', 0, null);
895
- return true;
896
- });
897
- secondChild.kill = vi.fn(() => {
898
- secondChild.exitCode = 0;
899
- secondChild.emit('exit', 0, null);
900
- return true;
901
- });
902
- vi.useFakeTimers();
903
- try {
904
- await manager.stopAllClients(10_000);
905
- expect(firstChild.kill).toHaveBeenCalledWith('SIGTERM');
906
- expect(secondChild.kill).toHaveBeenCalledWith('SIGTERM');
907
- expect(vi.getTimerCount()).toBe(0);
908
- expect([...manager.getAllClients()]).toEqual([]);
909
- }
910
- finally {
911
- vi.useRealTimers();
912
- }
913
- });
914
- it('rejects new client creation after shutdown begins', async () => {
915
- await manager.stopAllClients();
916
- await expect(manager.getOrCreateClient('session-after-shutdown', defaultOptions(), defaultHandlers(), defaultContext())).rejects.toThrow('ACP runtime manager is shutting down');
917
- expect(mockSpawn).not.toHaveBeenCalled();
918
- });
919
- it('aborts in-flight client creation and cleans up the spawned subprocess', async () => {
920
- const child = createMockChildProcess();
921
- exitChildAfterSigterm(child);
922
- mockSpawn.mockReturnValue(child);
923
- mockInitialize.mockImplementation(() => new Promise(() => {
924
- }));
925
- const createPromise = manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
926
- const createRejection = createPromise.catch((error) => error);
927
- await vi.waitFor(() => {
928
- expect(mockSpawn).toHaveBeenCalledTimes(1);
929
- });
930
- await manager.stopAllClients(50);
931
- await expect(createRejection).resolves.toMatchObject({
932
- message: expect.stringContaining('ACP runtime manager is shutting down'),
933
- });
934
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
935
- expect(child.kill).not.toHaveBeenCalledWith('SIGKILL');
936
- expect(manager.getClient('session-1')).toBeUndefined();
937
- expect(manager.getPendingClient('session-1')).toBeUndefined();
938
- });
939
- it('rejects queued creation requests after an in-flight creation is aborted', async () => {
940
- const child = createMockChildProcess();
941
- exitChildAfterSigterm(child);
942
- mockSpawn.mockReturnValue(child);
943
- mockInitialize.mockImplementation(() => new Promise(() => {
944
- }));
945
- const firstCreate = manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
946
- const firstRejection = firstCreate.catch((error) => error);
947
- await vi.waitFor(() => {
948
- expect(mockSpawn).toHaveBeenCalledTimes(1);
949
- });
950
- const secondCreate = manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
951
- const secondRejection = secondCreate.catch((error) => error);
952
- await manager.stopAllClients(50);
953
- await expect(firstRejection).resolves.toMatchObject({
954
- message: expect.stringContaining('ACP runtime manager is shutting down'),
955
- });
956
- await expect(secondRejection).resolves.toMatchObject({
957
- message: expect.stringContaining('ACP runtime manager is shutting down'),
958
- });
959
- expect(mockSpawn).toHaveBeenCalledTimes(1);
960
- expect(manager.getClient('session-1')).toBeUndefined();
961
- });
962
- });
963
- describe('sendPrompt', () => {
964
- it('sets isPromptInFlight, calls connection.prompt, clears flag on resolve', async () => {
965
- setupSuccessfulSpawn();
966
- mockPrompt.mockResolvedValue({ stopReason: 'end_turn' });
967
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
968
- expect(handle.isPromptInFlight).toBe(false);
969
- const result = await manager.sendPrompt('session-1', [{ type: 'text', text: 'Hello world' }]);
970
- expect(mockPrompt).toHaveBeenCalledWith({
971
- sessionId: 'provider-session-123',
972
- prompt: [{ type: 'text', text: 'Hello world' }],
973
- });
974
- expect(result.stopReason).toBe('end_turn');
975
- expect(handle.isPromptInFlight).toBe(false);
976
- });
977
- it('clears isPromptInFlight on error', async () => {
978
- setupSuccessfulSpawn();
979
- mockPrompt.mockRejectedValue(new Error('prompt failed'));
980
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
981
- await expect(manager.sendPrompt('session-1', [{ type: 'text', text: 'Hello' }])).rejects.toThrow('prompt failed');
982
- expect(handle.isPromptInFlight).toBe(false);
983
- });
984
- it('keeps prompt marked in flight while cancelling after prompt timeout', async () => {
985
- setupSuccessfulSpawn();
986
- mockPrompt.mockReturnValue(new Promise(() => undefined));
987
- mockCancel.mockResolvedValue(undefined);
988
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
989
- vi.useFakeTimers();
990
- try {
991
- const promptPromise = manager.sendPrompt('session-1', [{ type: 'text', text: 'Hello' }], 100);
992
- const promptRejection = promptPromise.catch((error) => error);
993
- await vi.advanceTimersByTimeAsync(100);
994
- await expect(promptRejection).resolves.toBeInstanceOf(PromptTimeoutError);
995
- expect(mockCancel).toHaveBeenCalledWith({
996
- sessionId: 'provider-session-123',
997
- });
998
- expect(handle.isPromptInFlight).toBe(false);
999
- }
1000
- finally {
1001
- vi.useRealTimers();
1002
- }
1003
- });
1004
- it('stops the client when prompt timeout cancellation hangs', async () => {
1005
- const child = setupSuccessfulSpawn();
1006
- mockPrompt.mockReturnValue(new Promise(() => undefined));
1007
- mockCancel.mockReturnValue(new Promise(() => undefined));
1008
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1009
- child.kill = vi.fn((signal) => {
1010
- if (signal === 'SIGTERM') {
1011
- child.killed = true;
1012
- child.exitCode = 0;
1013
- child.emit('exit', 0, null);
1014
- }
1015
- return true;
1016
- });
1017
- vi.useFakeTimers();
1018
- try {
1019
- const promptPromise = manager.sendPrompt('session-1', [{ type: 'text', text: 'Hello' }], 100);
1020
- const promptRejection = promptPromise.catch((error) => error);
1021
- await vi.advanceTimersByTimeAsync(100);
1022
- expect(mockCancel).toHaveBeenCalledTimes(1);
1023
- await vi.advanceTimersByTimeAsync(5000);
1024
- await expect(promptRejection).resolves.toBeInstanceOf(PromptTimeoutError);
1025
- expect(child.kill).toHaveBeenCalledWith('SIGTERM');
1026
- expect(manager.getClient('session-1')).toBeUndefined();
1027
- expect(handle.isPromptInFlight).toBe(false);
1028
- }
1029
- finally {
1030
- vi.useRealTimers();
1031
- }
1032
- });
1033
- it('does not clear or stop a replacement session when timeout cancel hangs', async () => {
1034
- setupSuccessfulSpawn();
1035
- mockPrompt.mockReturnValue(new Promise(() => undefined));
1036
- mockCancel.mockReturnValue(new Promise(() => undefined));
1037
- const firstHandle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1038
- vi.useFakeTimers();
1039
- try {
1040
- const stalePrompt = manager.sendPrompt('session-1', [{ type: 'text', text: 'old prompt' }], 100);
1041
- const staleRejection = stalePrompt.catch((error) => error);
1042
- await vi.advanceTimersByTimeAsync(100);
1043
- expect(mockCancel).toHaveBeenCalledTimes(1);
1044
- const internalManager = manager;
1045
- internalManager.sessions.delete('session-1');
1046
- const replacementChild = setupSuccessfulSpawn();
1047
- const replacementHandle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1048
- replacementHandle.isPromptInFlight = true;
1049
- await vi.advanceTimersByTimeAsync(5000);
1050
- await expect(staleRejection).resolves.toBeInstanceOf(PromptTimeoutError);
1051
- expect(replacementHandle.isPromptInFlight).toBe(true);
1052
- expect(replacementChild.kill).not.toHaveBeenCalled();
1053
- expect(manager.getClient('session-1')).toBe(replacementHandle);
1054
- expect(firstHandle.isPromptInFlight).toBe(false);
1055
- }
1056
- finally {
1057
- vi.useRealTimers();
1058
- }
1059
- });
1060
- it('does not cancel a replacement session when an old prompt timeout fires', async () => {
1061
- const firstChild = setupSuccessfulSpawn();
1062
- mockPrompt.mockReturnValueOnce(new Promise(() => undefined));
1063
- mockCancel.mockResolvedValue(undefined);
1064
- const firstHandle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1065
- firstChild.kill = vi.fn((signal) => {
1066
- if (signal === 'SIGTERM') {
1067
- firstChild.killed = true;
1068
- firstChild.exitCode = 0;
1069
- firstChild.emit('exit', 0, null);
1070
- }
1071
- return true;
1072
- });
1073
- vi.useFakeTimers();
1074
- try {
1075
- const stalePrompt = manager.sendPrompt('session-1', [{ type: 'text', text: 'old prompt' }], 100);
1076
- const staleRejection = stalePrompt.catch((error) => error);
1077
- await manager.stopClient('session-1');
1078
- expect(manager.getClient('session-1')).toBeUndefined();
1079
- const replacementPrompt = createDeferred();
1080
- setupSuccessfulSpawn();
1081
- mockPrompt.mockReturnValueOnce(replacementPrompt.promise);
1082
- const replacementHandle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1083
- const replacementSend = manager.sendPrompt('session-1', [
1084
- { type: 'text', text: 'new prompt' },
1085
- ]);
1086
- await Promise.resolve();
1087
- expect(replacementHandle.isPromptInFlight).toBe(true);
1088
- const cancelCallsBeforeStaleTimeout = mockCancel.mock.calls.length;
1089
- await vi.advanceTimersByTimeAsync(100);
1090
- await expect(staleRejection).resolves.toBeInstanceOf(PromptTimeoutError);
1091
- expect(mockCancel).toHaveBeenCalledTimes(cancelCallsBeforeStaleTimeout);
1092
- expect(replacementHandle.isPromptInFlight).toBe(true);
1093
- expect(firstHandle.isPromptInFlight).toBe(false);
1094
- replacementPrompt.resolve({ stopReason: 'end_turn' });
1095
- await expect(replacementSend).resolves.toEqual({ stopReason: 'end_turn' });
1096
- expect(replacementHandle.isPromptInFlight).toBe(false);
1097
- }
1098
- finally {
1099
- vi.useRealTimers();
1100
- }
1101
- });
1102
- it('throws if no session found', async () => {
1103
- await expect(manager.sendPrompt('nonexistent', [{ type: 'text', text: 'Hello' }])).rejects.toThrow('No ACP session found');
1104
- });
1105
- });
1106
- describe('cancelPrompt', () => {
1107
- it('calls connection.cancel when prompt is in flight', async () => {
1108
- setupSuccessfulSpawn();
1109
- mockCancel.mockResolvedValue(undefined);
1110
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1111
- handle.isPromptInFlight = true;
1112
- await manager.cancelPrompt('session-1');
1113
- expect(mockCancel).toHaveBeenCalledWith({
1114
- sessionId: 'provider-session-123',
1115
- });
1116
- });
1117
- it('does nothing when no prompt is in flight', async () => {
1118
- setupSuccessfulSpawn();
1119
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1120
- await manager.cancelPrompt('session-1');
1121
- expect(mockCancel).not.toHaveBeenCalled();
1122
- });
1123
- it('does nothing for nonexistent session', async () => {
1124
- await manager.cancelPrompt('nonexistent');
1125
- expect(mockCancel).not.toHaveBeenCalled();
1126
- });
1127
- });
1128
- describe('setConfigOption', () => {
1129
- it('updates cached config options from setSessionConfigOption response', async () => {
1130
- setupSuccessfulSpawn();
1131
- mockSetSessionConfigOption.mockResolvedValueOnce({
1132
- configOptions: [
1133
- {
1134
- id: 'model',
1135
- name: 'Model',
1136
- type: 'select',
1137
- category: 'model',
1138
- currentValue: 'opus',
1139
- options: [
1140
- { value: 'default', name: 'Default (recommended)', description: 'Opus 4.6 · best' },
1141
- { value: 'opus', name: 'Opus' },
1142
- ],
1143
- },
1144
- {
1145
- id: 'mode',
1146
- name: 'Mode',
1147
- type: 'select',
1148
- category: 'mode',
1149
- currentValue: 'plan',
1150
- options: [
1151
- { value: 'default', name: 'Default' },
1152
- { value: 'plan', name: 'Plan' },
1153
- ],
1154
- },
1155
- ],
1156
- });
1157
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1158
- await manager.setConfigOption('session-1', 'mode', 'plan');
1159
- const defaultModelOption = handle.configOptions
1160
- .find((option) => option.id === 'model')
1161
- ?.options.find((option) => 'value' in option && option.value === 'default');
1162
- expect(defaultModelOption).toMatchObject({
1163
- value: 'default',
1164
- name: 'Opus 4.6',
1165
- });
1166
- expect(handle.configOptions.find((option) => option.id === 'mode')?.currentValue).toBe('plan');
1167
- });
1168
- it('throws when setSessionConfigOption call fails', async () => {
1169
- setupSuccessfulSpawn();
1170
- mockSetSessionConfigOption.mockRejectedValueOnce(new Error('Method not found'));
1171
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1172
- await expect(manager.setConfigOption('session-1', 'model', 'opus')).rejects.toThrow('Method not found');
1173
- });
1174
- it('fails fast when setSessionConfigOption response omits required categories', async () => {
1175
- setupSuccessfulSpawn();
1176
- mockSetSessionConfigOption.mockResolvedValueOnce({
1177
- configOptions: [
1178
- {
1179
- id: 'reasoning_effort',
1180
- name: 'Reasoning Effort',
1181
- type: 'select',
1182
- category: 'thought_level',
1183
- currentValue: 'medium',
1184
- options: [{ value: 'medium', name: 'Medium' }],
1185
- },
1186
- ],
1187
- });
1188
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1189
- await expect(manager.setConfigOption('session-1', 'mode', 'plan')).rejects.toThrow('missing required config option categories: model, mode');
1190
- });
1191
- });
1192
- describe('setSessionMode', () => {
1193
- it('calls ACP setSessionMode and updates cached mode currentValue', async () => {
1194
- setupSuccessfulSpawn();
1195
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1196
- await manager.setSessionMode('session-1', 'plan');
1197
- expect(mockSetSessionMode).toHaveBeenCalledWith({
1198
- sessionId: 'provider-session-123',
1199
- modeId: 'plan',
1200
- });
1201
- expect(handle.configOptions.find((option) => option.id === 'mode')?.currentValue).toBe('plan');
1202
- });
1203
- it('throws when setSessionMode call fails', async () => {
1204
- setupSuccessfulSpawn();
1205
- mockSetSessionMode.mockRejectedValueOnce(new Error('Invalid mode'));
1206
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1207
- await expect(manager.setSessionMode('session-1', 'acceptEdits')).rejects.toThrow('Invalid mode');
1208
- });
1209
- });
1210
- describe('setSessionModel', () => {
1211
- it('uses unstable_setSessionModel for CLAUDE and updates cached model currentValue', async () => {
1212
- setupSuccessfulSpawn();
1213
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1214
- await manager.setSessionModel('session-1', 'opus');
1215
- expect(mockSetSessionModel).toHaveBeenCalledWith({
1216
- sessionId: 'provider-session-123',
1217
- modelId: 'opus',
1218
- });
1219
- expect(mockSetSessionConfigOption).not.toHaveBeenCalled();
1220
- expect(handle.configOptions.find((option) => option.id === 'model')?.currentValue).toBe('opus');
1221
- });
1222
- it('falls back to setSessionConfigOption when unstable_setSessionModel is unavailable', async () => {
1223
- setupSuccessfulSpawn();
1224
- mockSetSessionModel.mockRejectedValueOnce({ code: -32_601, message: 'Method not found' });
1225
- mockSetSessionConfigOption.mockResolvedValueOnce({
1226
- configOptions: [
1227
- {
1228
- id: 'model',
1229
- name: 'Model',
1230
- type: 'select',
1231
- category: 'model',
1232
- currentValue: 'opus',
1233
- options: [
1234
- { value: 'sonnet', name: 'Sonnet' },
1235
- { value: 'opus', name: 'Opus' },
1236
- ],
1237
- },
1238
- {
1239
- id: 'mode',
1240
- name: 'Mode',
1241
- type: 'select',
1242
- category: 'mode',
1243
- currentValue: 'default',
1244
- options: [{ value: 'default', name: 'Default' }],
1245
- },
1246
- ],
1247
- });
1248
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1249
- await manager.setSessionModel('session-1', 'opus');
1250
- expect(mockSetSessionModel).toHaveBeenCalledWith({
1251
- sessionId: 'provider-session-123',
1252
- modelId: 'opus',
1253
- });
1254
- expect(mockSetSessionConfigOption).toHaveBeenCalledWith({
1255
- sessionId: 'provider-session-123',
1256
- configId: 'model',
1257
- value: 'opus',
1258
- });
1259
- expect(handle.configOptions.find((option) => option.id === 'model')?.currentValue).toBe('opus');
1260
- });
1261
- it('uses setSessionConfigOption path for CODEX model updates', async () => {
1262
- setupSuccessfulSpawn();
1263
- await manager.getOrCreateClient('session-1', { ...defaultOptions(), provider: 'CODEX' }, defaultHandlers(), defaultContext());
1264
- await manager.setSessionModel('session-1', 'gpt-5.2-codex');
1265
- expect(mockSetSessionModel).not.toHaveBeenCalled();
1266
- expect(mockSetSessionConfigOption).toHaveBeenCalledWith({
1267
- sessionId: 'provider-session-123',
1268
- configId: 'model',
1269
- value: 'gpt-5.2-codex',
1270
- });
1271
- });
1272
- });
1273
- describe('session status methods', () => {
1274
- it('isSessionRunning returns true for active session', async () => {
1275
- setupSuccessfulSpawn();
1276
- await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1277
- expect(manager.isSessionRunning('session-1')).toBe(true);
1278
- expect(manager.isSessionRunning('nonexistent')).toBe(false);
1279
- });
1280
- it('isSessionWorking returns true when prompt is in flight', async () => {
1281
- setupSuccessfulSpawn();
1282
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1283
- expect(manager.isSessionWorking('session-1')).toBe(false);
1284
- handle.isPromptInFlight = true;
1285
- expect(manager.isSessionWorking('session-1')).toBe(true);
1286
- });
1287
- it('isAnySessionWorking checks multiple sessions', async () => {
1288
- setupSuccessfulSpawn();
1289
- const handle = await manager.getOrCreateClient('session-1', defaultOptions(), defaultHandlers(), defaultContext());
1290
- expect(manager.isAnySessionWorking(['session-1', 'session-2'])).toBe(false);
1291
- handle.isPromptInFlight = true;
1292
- expect(manager.isAnySessionWorking(['session-1', 'session-2'])).toBe(true);
1293
- });
1294
- });
1295
- });
1296
- describe('AcpClientHandler', () => {
1297
- it('AcpEventCallback is a discriminated ACP runtime event union', () => {
1298
- const onEvent = (_sessionId, event) => {
1299
- if (event.type === 'acp_session_update') {
1300
- expect(event.update.sessionUpdate).toBe('agent_message_chunk');
1301
- return;
1302
- }
1303
- expect(event.type).toBe('acp_permission_request');
1304
- expect(event.params.toolCall.toolCallId).toBe('tc-1');
1305
- };
1306
- onEvent('test-session', {
1307
- type: 'acp_session_update',
1308
- update: {
1309
- sessionUpdate: 'agent_message_chunk',
1310
- content: { type: 'text', text: 'Hello' },
1311
- },
1312
- });
1313
- onEvent('test-session', {
1314
- type: 'acp_permission_request',
1315
- requestId: 'req-1',
1316
- params: {
1317
- sessionId: 'provider-session-1',
1318
- toolCall: { toolCallId: 'tc-1', title: 'Write file' },
1319
- options: [{ optionId: 'allow-1', kind: 'allow_once', name: 'Allow once' }],
1320
- },
1321
- });
1322
- });
1323
- it('sessionUpdate emits logs through onLog callback', async () => {
1324
- const onEvent = vi.fn();
1325
- const onLog = vi.fn();
1326
- const handler = new AcpClientHandler('test-session', onEvent, undefined, onLog);
1327
- await handler.sessionUpdate({
1328
- sessionId: 'provider-session-1',
1329
- update: {
1330
- sessionUpdate: 'agent_message_chunk',
1331
- content: { type: 'text', text: 'Hello' },
1332
- },
1333
- });
1334
- expect(onLog).toHaveBeenCalledWith('test-session', {
1335
- eventType: 'acp_session_update',
1336
- sessionUpdate: 'agent_message_chunk',
1337
- data: expect.objectContaining({ sessionUpdate: 'agent_message_chunk' }),
1338
- });
1339
- });
1340
- it('sessionUpdate forwards all events as acp_session_update wrapper', async () => {
1341
- const onEvent = vi.fn();
1342
- const handler = new AcpClientHandler('test-session', onEvent);
1343
- await handler.sessionUpdate({
1344
- sessionId: 'provider-session-1',
1345
- update: {
1346
- sessionUpdate: 'agent_message_chunk',
1347
- content: { type: 'text', text: 'Hello' },
1348
- },
1349
- });
1350
- expect(onEvent).toHaveBeenCalledWith('test-session', {
1351
- type: 'acp_session_update',
1352
- update: {
1353
- sessionUpdate: 'agent_message_chunk',
1354
- content: { type: 'text', text: 'Hello' },
1355
- },
1356
- });
1357
- });
1358
- it('sessionUpdate forwards tool_call events as acp_session_update wrapper', async () => {
1359
- const onEvent = vi.fn();
1360
- const handler = new AcpClientHandler('test-session', onEvent);
1361
- await handler.sessionUpdate({
1362
- sessionId: 'provider-session-1',
1363
- update: {
1364
- sessionUpdate: 'tool_call',
1365
- toolCallId: 'tc-1',
1366
- title: 'Read file',
1367
- kind: 'read',
1368
- status: 'in_progress',
1369
- },
1370
- });
1371
- expect(onEvent).toHaveBeenCalledWith('test-session', {
1372
- type: 'acp_session_update',
1373
- update: {
1374
- sessionUpdate: 'tool_call',
1375
- toolCallId: 'tc-1',
1376
- title: 'Read file',
1377
- kind: 'read',
1378
- status: 'in_progress',
1379
- },
1380
- });
1381
- });
1382
- it('sessionUpdate forwards all event types including previously deferred ones', async () => {
1383
- const onEvent = vi.fn();
1384
- const handler = new AcpClientHandler('test-session', onEvent);
1385
- await handler.sessionUpdate({
1386
- sessionId: 'provider-session-1',
1387
- update: {
1388
- sessionUpdate: 'agent_thought_chunk',
1389
- content: { type: 'text', text: 'thinking...' },
1390
- },
1391
- });
1392
- expect(onEvent).toHaveBeenCalledWith('test-session', {
1393
- type: 'acp_session_update',
1394
- update: {
1395
- sessionUpdate: 'agent_thought_chunk',
1396
- content: { type: 'text', text: 'thinking...' },
1397
- },
1398
- });
1399
- });
1400
- it('requestPermission fails closed by default when no bridge exists', async () => {
1401
- const onEvent = vi.fn();
1402
- const handler = new AcpClientHandler('test-session', onEvent);
1403
- const result = await handler.requestPermission({
1404
- sessionId: 'provider-session-1',
1405
- toolCall: { toolCallId: 'tc-1', title: 'Write file' },
1406
- options: [
1407
- { optionId: 'reject-1', kind: 'reject_once', name: 'Deny' },
1408
- { optionId: 'allow-1', kind: 'allow_always', name: 'Allow Always' },
1409
- { optionId: 'allow-2', kind: 'allow_once', name: 'Allow Once' },
1410
- ],
1411
- });
1412
- expect(result).toEqual({
1413
- outcome: {
1414
- outcome: 'selected',
1415
- optionId: 'reject-1',
1416
- },
1417
- });
1418
- });
1419
- it('requestPermission selects a reject option when no bridge exists', async () => {
1420
- const onEvent = vi.fn();
1421
- const handler = new AcpClientHandler('test-session', onEvent);
1422
- const result = await handler.requestPermission({
1423
- sessionId: 'provider-session-1',
1424
- toolCall: { toolCallId: 'tc-1', title: 'Write file' },
1425
- options: [
1426
- { optionId: 'reject-1', kind: 'reject_once', name: 'Deny' },
1427
- { optionId: 'reject-2', kind: 'reject_always', name: 'Deny Always' },
1428
- ],
1429
- });
1430
- expect(result).toEqual({
1431
- outcome: {
1432
- outcome: 'selected',
1433
- optionId: 'reject-1',
1434
- },
1435
- });
1436
- });
1437
- });
1438
- //# sourceMappingURL=acp-runtime-manager.test.js.map