factory-factory 0.4.4 → 0.4.6

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 (541) hide show
  1. package/dist/client/assets/{abnfDiagram-VRR7QNED-CtUj9J56.js → abnfDiagram-N423BO3Z-BcUuFtOj.js} +1 -1
  2. package/dist/client/assets/{arc-2QeawLbF.js → arc-Cp8_E6ha.js} +1 -1
  3. package/dist/client/assets/architectureDiagram-T3A2C74G-C3_2J0tC.js +36 -0
  4. package/dist/client/assets/{blockDiagram-677ZJIJ3-BN6MDejN.js → blockDiagram-VBNYF7ZC-Dy0jc6lP.js} +1 -1
  5. package/dist/client/assets/{c4Diagram-LMCZKHZV-ZxcmUt9u.js → c4Diagram-5PPSVZJV-97TkD6w-.js} +1 -1
  6. package/dist/client/assets/channel-DLBBfejH.js +1 -0
  7. package/dist/client/assets/{chunk-32BRIVSS-BXA35oY0.js → chunk-2GRJ4B5K-Dc0I7ume.js} +1 -1
  8. package/dist/client/assets/{chunk-2Q5K7J3B-CyvdNBvs.js → chunk-2Q5K7J3B-DbFPWZwu.js} +1 -1
  9. package/dist/client/assets/{chunk-EX3LRPZG-BRYEhwoK.js → chunk-5RXB4S5H-Dci_7ZDD.js} +1 -1
  10. package/dist/client/assets/{chunk-5VM5RSS4-6lY9D3Us.js → chunk-5VM5RSS4-Ca82Rzl0.js} +1 -1
  11. package/dist/client/assets/{chunk-MOJQB5TN-MIX8YUEz.js → chunk-6Q2QTUOP-Be2f5Q2t.js} +1 -1
  12. package/dist/client/assets/{chunk-V7JOEXUC-DpMacC1A.js → chunk-GF5L2VYU-C4VRs6xS.js} +1 -1
  13. package/dist/client/assets/{chunk-JWPE2WC7-DBeDDTf3.js → chunk-JWPE2WC7-DVlW0c7f.js} +1 -1
  14. package/dist/client/assets/{chunk-VR4S4FIN-Bd6MGh78.js → chunk-KBJHAD2P-BKRpW89b.js} +1 -1
  15. package/dist/client/assets/{chunk-RYQCIY6F-CT_f1sbt.js → chunk-RYQCIY6F-BwMw9oh9.js} +1 -1
  16. package/dist/client/assets/{chunk-XXDRQBXY-BYg-oILv.js → chunk-XXDRQBXY-py-FQquv.js} +1 -1
  17. package/dist/client/assets/classDiagram-JCYQIIEL-Ds5wVQR3.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-OCEON4UE-Ds5wVQR3.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-JH36ORCC-BGhjYi6z.js → cose-bilkent-JH36ORCC-BMCtQCZ8.js} +1 -1
  20. package/dist/client/assets/{cynefin-VYW2F7L2-BouObN4T.js → cynefin-VYW2F7L2-BTHAy6wD.js} +1 -1
  21. package/dist/client/assets/{cynefinDiagram-TSTJHNR4-DrbscNyk.js → cynefinDiagram-MW4NZA55-pQCQD0Ih.js} +1 -1
  22. package/dist/client/assets/{dagre-VKFMJZFB-CpHBhtab.js → dagre-VZM6K2ZE-CZcoEFVf.js} +1 -1
  23. package/dist/client/assets/{diagram-OA4YK3LP-C6Jnb8nm.js → diagram-7IWD3JNH-DgQv_208.js} +1 -1
  24. package/dist/client/assets/{diagram-FQU43EPY-C_pXymmj.js → diagram-B4RE2ZJO-DoFotcsB.js} +1 -1
  25. package/dist/client/assets/{diagram-NH7WQ7WH-DWHcerSm.js → diagram-LBJQPF4R-C5zkL1ml.js} +1 -1
  26. package/dist/client/assets/{diagram-G47NLZAW-DNPz9Qrh.js → diagram-Q27KOJAE-ERKqnoHP.js} +1 -1
  27. package/dist/client/assets/diagram-UB23O5K3-Dyt6sy3Z.js +41 -0
  28. package/dist/client/assets/{ebnfDiagram-CCIWWBDH-_Wt4C-Lm.js → ebnfDiagram-BXEA7PRR-DqsFEAw2.js} +1 -1
  29. package/dist/client/assets/{erDiagram-Q63AITRT-D9F9IIZ7.js → erDiagram-JOGREHBK-Dn8Aqkgn.js} +1 -1
  30. package/dist/client/assets/{flowDiagram-23GEKE2U-BzTUtnLY.js → flowDiagram-UKHOOZJN-DcArGyH-.js} +6 -6
  31. package/dist/client/assets/{ganttDiagram-NO4QXBWP-lmFnKYE5.js → ganttDiagram-PKOTCBZU-BuHaeolc.js} +1 -1
  32. package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-DiIQa_m6.js → gitGraphDiagram-DS77QQ5N-iKWWNsQK.js} +1 -1
  33. package/dist/client/assets/index-CVVo6xHd.css +1 -0
  34. package/dist/client/assets/index-DY0TryY7.js +695 -0
  35. package/dist/client/assets/{infoDiagram-FWYZ7A6U-BXtmiN5g.js → infoDiagram-6WML65LV-C7IulVvo.js} +1 -1
  36. package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-Ce8fzasD.js → ishikawaDiagram-WSZJBQD7-DW4cB_Nk.js} +1 -1
  37. package/dist/client/assets/{journeyDiagram-5HDEW3XC-CAhJE-OU.js → journeyDiagram-NVQOT4AX-Nzsiy4H7.js} +1 -1
  38. package/dist/client/assets/{kanban-definition-HUTT4EX6-B8br5xew.js → kanban-definition-27J2QSJJ-BUsK9dj9.js} +1 -1
  39. package/dist/client/assets/{linear-BPVVEns_.js → linear-CyoW-usj.js} +1 -1
  40. package/dist/client/assets/{mindmap-definition-LN4V7U3C-lX6h9H-N.js → mindmap-definition-FAOFIHXS-Bd9cSJjQ.js} +1 -1
  41. package/dist/client/assets/{mobile-baseline-C45NSkzw.js → mobile-baseline-K78aE4nt.js} +1 -1
  42. package/dist/client/assets/{pegDiagram-2B236MQR-CiFWwnk4.js → pegDiagram-VL7TDLO6-BrmAKdiE.js} +1 -1
  43. package/dist/client/assets/{pieDiagram-ENE6RG2P-CvkwWtzQ.js → pieDiagram-7S7Q4E2Y-Ce0k6LI1.js} +1 -1
  44. package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-B40anMyK.js → quadrantDiagram-CIZ2JOQS-_9HxOOGa.js} +1 -1
  45. package/dist/client/assets/{railroadDiagram-RFXS5EU6-WVYsdkDC.js → railroadDiagram-AXF67PYL-ChdF1CBw.js} +1 -1
  46. package/dist/client/assets/{requirementDiagram-TGXJPOKE-DBTIsXpA.js → requirementDiagram-LRYGKXZP-Bm2gdYTE.js} +1 -1
  47. package/dist/client/assets/{sankeyDiagram-HTMAVEWB-Dx8y47pZ.js → sankeyDiagram-W5VNT64P-Kf7zUiC-.js} +1 -1
  48. package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-C6ZZMZJm.js → sequenceDiagram-SI44F4Z6-DyPqsgh1.js} +1 -1
  49. package/dist/client/assets/{sizeCapture-X5ZJPWSS-DLy8loNR.js → sizeCapture-X5ZJPWSS-Cgn8Hxr2.js} +1 -1
  50. package/dist/client/assets/{stateDiagram-2N3HPSRC-RoTcqZkX.js → stateDiagram-OKZ733FA-CJxSzxmg.js} +1 -1
  51. package/dist/client/assets/stateDiagram-v2-UEYNNEHI-BwUaUW2J.js +1 -0
  52. package/dist/client/assets/{swimlanes-5IMT3BWC-CFmoSHiT.js → swimlanes-SLNWSIFB-Ckb_izEZ.js} +2 -2
  53. package/dist/client/assets/swimlanesDiagram-ULZ7WXOC-D87lLmuW.js +8 -0
  54. package/dist/client/assets/{terminal-instance-Br0jXsXE.js → terminal-instance-DWySt2_t.js} +1 -1
  55. package/dist/client/assets/{timeline-definition-FHXFAJF6-Bh5XA09y.js → timeline-definition-Z64GVDOM-BWx_NLrK.js} +1 -1
  56. package/dist/client/assets/{vennDiagram-L72KCM5P-BC754zGO.js → vennDiagram-T6HMQDX7-BgN2-lO-.js} +1 -1
  57. package/dist/client/assets/{wardleyDiagram-EHGQE667-xJdUzWCg.js → wardleyDiagram-T6FBY63Y-C9iwoeki.js} +1 -1
  58. package/dist/client/assets/{xychartDiagram-FW5EYKEG-wxQH1S7i.js → xychartDiagram-ELKLHX3M-B3AYy5ZN.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/browser.d.ts +1 -0
  63. package/dist/prisma/generated/browser.d.ts.map +1 -1
  64. package/dist/prisma/generated/client.d.ts +1 -0
  65. package/dist/prisma/generated/client.d.ts.map +1 -1
  66. package/dist/prisma/generated/commonInputTypes.d.ts +100 -0
  67. package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -1
  68. package/dist/prisma/generated/enums.d.ts +16 -0
  69. package/dist/prisma/generated/enums.d.ts.map +1 -1
  70. package/dist/prisma/generated/enums.js +14 -0
  71. package/dist/prisma/generated/enums.js.map +1 -1
  72. package/dist/prisma/generated/internal/class.d.ts +3 -0
  73. package/dist/prisma/generated/internal/class.d.ts.map +1 -1
  74. package/dist/prisma/generated/internal/class.js +4 -4
  75. package/dist/prisma/generated/internal/class.js.map +1 -1
  76. package/dist/prisma/generated/internal/prismaNamespace.d.ts +97 -2
  77. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  78. package/dist/prisma/generated/internal/prismaNamespace.js +17 -0
  79. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  80. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +18 -0
  81. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  82. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +17 -0
  83. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  84. package/dist/prisma/generated/models/SessionLifecycleEvent.d.ts +657 -0
  85. package/dist/prisma/generated/models/SessionLifecycleEvent.d.ts.map +1 -0
  86. package/dist/prisma/generated/models/SessionLifecycleEvent.js +2 -0
  87. package/dist/prisma/generated/models/SessionLifecycleEvent.js.map +1 -0
  88. package/dist/prisma/generated/models/UserSettings.d.ts +216 -1
  89. package/dist/prisma/generated/models/UserSettings.d.ts.map +1 -1
  90. package/dist/prisma/generated/models/Workspace.d.ts +264 -0
  91. package/dist/prisma/generated/models/Workspace.d.ts.map +1 -1
  92. package/dist/prisma/generated/models.d.ts +1 -0
  93. package/dist/prisma/generated/models.d.ts.map +1 -1
  94. package/dist/src/backend/app-context.d.ts +4 -1
  95. package/dist/src/backend/app-context.d.ts.map +1 -1
  96. package/dist/src/backend/app-context.js +6 -2
  97. package/dist/src/backend/app-context.js.map +1 -1
  98. package/dist/src/backend/interceptors/branch-naming.interceptor.d.ts.map +1 -1
  99. package/dist/src/backend/interceptors/branch-naming.interceptor.js +0 -4
  100. package/dist/src/backend/interceptors/branch-naming.interceptor.js.map +1 -1
  101. package/dist/src/backend/interceptors/branch-naming.interceptor.test.js +26 -0
  102. package/dist/src/backend/interceptors/branch-naming.interceptor.test.js.map +1 -1
  103. package/dist/src/backend/orchestration/data-backup.service.d.ts.map +1 -1
  104. package/dist/src/backend/orchestration/data-backup.service.js +10 -0
  105. package/dist/src/backend/orchestration/data-backup.service.js.map +1 -1
  106. package/dist/src/backend/orchestration/data-backup.service.test.js +23 -0
  107. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  108. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts +2 -1
  109. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
  110. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +6 -6
  111. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
  112. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js +18 -8
  113. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js.map +1 -1
  114. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
  115. package/dist/src/backend/orchestration/event-collector.orchestrator.js +3 -1
  116. package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
  117. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js +3 -1
  118. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js.map +1 -1
  119. package/dist/src/backend/orchestration/reconciliation.service.d.ts +11 -8
  120. package/dist/src/backend/orchestration/reconciliation.service.d.ts.map +1 -1
  121. package/dist/src/backend/orchestration/reconciliation.service.js +45 -33
  122. package/dist/src/backend/orchestration/reconciliation.service.js.map +1 -1
  123. package/dist/src/backend/orchestration/reconciliation.service.test.js +48 -42
  124. package/dist/src/backend/orchestration/reconciliation.service.test.js.map +1 -1
  125. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +4 -1
  126. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  127. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +4 -1
  128. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
  129. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +15 -2
  130. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
  131. package/dist/src/backend/orchestration/workspace-init-issue-prompts.d.ts.map +1 -1
  132. package/dist/src/backend/orchestration/workspace-init-issue-prompts.js +3 -1
  133. package/dist/src/backend/orchestration/workspace-init-issue-prompts.js.map +1 -1
  134. package/dist/src/backend/orchestration/workspace-init-issue-prompts.test.d.ts +2 -0
  135. package/dist/src/backend/orchestration/workspace-init-issue-prompts.test.d.ts.map +1 -0
  136. package/dist/src/backend/orchestration/workspace-init-issue-prompts.test.js +75 -0
  137. package/dist/src/backend/orchestration/workspace-init-issue-prompts.test.js.map +1 -0
  138. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts +7 -4
  139. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  140. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +36 -1
  141. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  142. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +117 -8
  143. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js.map +1 -1
  144. package/dist/src/backend/routers/websocket/index.d.ts +1 -0
  145. package/dist/src/backend/routers/websocket/index.d.ts.map +1 -1
  146. package/dist/src/backend/routers/websocket/index.js +1 -0
  147. package/dist/src/backend/routers/websocket/index.js.map +1 -1
  148. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.d.ts +11 -0
  149. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.d.ts.map +1 -0
  150. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.js +28 -0
  151. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.js.map +1 -0
  152. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.d.ts +2 -0
  153. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.d.ts.map +1 -0
  154. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.js +84 -0
  155. package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.js.map +1 -0
  156. package/dist/src/backend/routers/websocket/voice.handler.d.ts +3 -0
  157. package/dist/src/backend/routers/websocket/voice.handler.d.ts.map +1 -0
  158. package/dist/src/backend/routers/websocket/voice.handler.js +46 -0
  159. package/dist/src/backend/routers/websocket/voice.handler.js.map +1 -0
  160. package/dist/src/backend/server.d.ts.map +1 -1
  161. package/dist/src/backend/server.js +3 -1
  162. package/dist/src/backend/server.js.map +1 -1
  163. package/dist/src/backend/server.upgrade.test.js +16 -0
  164. package/dist/src/backend/server.upgrade.test.js.map +1 -1
  165. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.d.ts.map +1 -1
  166. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.js +27 -6
  167. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.js.map +1 -1
  168. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.test.js +7 -0
  169. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.test.js.map +1 -1
  170. package/dist/src/backend/services/port.service.d.ts.map +1 -1
  171. package/dist/src/backend/services/port.service.js +4 -0
  172. package/dist/src/backend/services/port.service.js.map +1 -1
  173. package/dist/src/backend/services/port.service.test.js +8 -0
  174. package/dist/src/backend/services/port.service.test.js.map +1 -1
  175. package/dist/src/backend/services/ratchet/service/ratchet.service.test.js +6 -0
  176. package/dist/src/backend/services/ratchet/service/ratchet.service.test.js.map +1 -1
  177. package/dist/src/backend/services/registry.d.ts +2 -2
  178. package/dist/src/backend/services/registry.d.ts.map +1 -1
  179. package/dist/src/backend/services/registry.js +2 -1
  180. package/dist/src/backend/services/registry.js.map +1 -1
  181. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.d.ts +23 -0
  182. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.d.ts.map +1 -0
  183. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.js +23 -0
  184. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.js.map +1 -0
  185. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.test.d.ts +2 -0
  186. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.test.d.ts.map +1 -0
  187. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.test.js +62 -0
  188. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.test.js.map +1 -0
  189. package/dist/src/backend/services/session/service/acp/acp-client-handler.d.ts +1 -0
  190. package/dist/src/backend/services/session/service/acp/acp-client-handler.d.ts.map +1 -1
  191. package/dist/src/backend/services/session/service/acp/acp-client-handler.js +30 -0
  192. package/dist/src/backend/services/session/service/acp/acp-client-handler.js.map +1 -1
  193. package/dist/src/backend/services/session/service/acp/acp-client-handler.test.js +57 -0
  194. package/dist/src/backend/services/session/service/acp/acp-client-handler.test.js.map +1 -1
  195. package/dist/src/backend/services/session/service/acp/acp-event-translator.d.ts +1 -37
  196. package/dist/src/backend/services/session/service/acp/acp-event-translator.d.ts.map +1 -1
  197. package/dist/src/backend/services/session/service/acp/acp-event-translator.js +1 -334
  198. package/dist/src/backend/services/session/service/acp/acp-event-translator.js.map +1 -1
  199. package/dist/src/backend/services/session/service/acp/acp-event-translator.test.js +5 -484
  200. package/dist/src/backend/services/session/service/acp/acp-event-translator.test.js.map +1 -1
  201. package/dist/src/backend/services/session/service/acp/acp-process-handle.d.ts +2 -0
  202. package/dist/src/backend/services/session/service/acp/acp-process-handle.d.ts.map +1 -1
  203. package/dist/src/backend/services/session/service/acp/acp-process-handle.js +12 -0
  204. package/dist/src/backend/services/session/service/acp/acp-process-handle.js.map +1 -1
  205. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.d.ts +2 -0
  206. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.d.ts.map +1 -0
  207. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.js +66 -0
  208. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.js.map +1 -0
  209. package/dist/src/backend/services/session/service/acp/acp-runtime-events.d.ts +7 -1
  210. package/dist/src/backend/services/session/service/acp/acp-runtime-events.d.ts.map +1 -1
  211. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts +21 -2
  212. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts.map +1 -1
  213. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.js +254 -61
  214. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.js.map +1 -1
  215. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.js +353 -22
  216. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.js.map +1 -1
  217. package/dist/src/backend/services/session/service/acp/acp-session-config-options.d.ts +1 -0
  218. package/dist/src/backend/services/session/service/acp/acp-session-config-options.d.ts.map +1 -1
  219. package/dist/src/backend/services/session/service/acp/acp-session-config-options.js +4 -17
  220. package/dist/src/backend/services/session/service/acp/acp-session-config-options.js.map +1 -1
  221. package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.d.ts +2 -0
  222. package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.d.ts.map +1 -0
  223. package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.js +121 -0
  224. package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.js.map +1 -0
  225. package/dist/src/backend/services/session/service/acp/acp-session-negotiation.integration.test.js +1 -1
  226. package/dist/src/backend/services/session/service/acp/acp-session-negotiation.integration.test.js.map +1 -1
  227. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.d.ts +7 -0
  228. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.d.ts.map +1 -0
  229. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.js +160 -0
  230. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.js.map +1 -0
  231. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.d.ts +2 -0
  232. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.d.ts.map +1 -0
  233. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.js +260 -0
  234. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.js.map +1 -0
  235. package/dist/src/backend/services/session/service/acp/claude-model-options.d.ts +5 -0
  236. package/dist/src/backend/services/session/service/acp/claude-model-options.d.ts.map +1 -0
  237. package/dist/src/backend/services/session/service/acp/claude-model-options.js +25 -0
  238. package/dist/src/backend/services/session/service/acp/claude-model-options.js.map +1 -0
  239. package/dist/src/backend/services/session/service/acp/claude-model-options.test.d.ts +2 -0
  240. package/dist/src/backend/services/session/service/acp/claude-model-options.test.d.ts.map +1 -0
  241. package/dist/src/backend/services/session/service/acp/claude-model-options.test.js +49 -0
  242. package/dist/src/backend/services/session/service/acp/claude-model-options.test.js.map +1 -0
  243. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/adapter-state.d.ts +2 -0
  244. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/adapter-state.d.ts.map +1 -1
  245. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +2 -0
  246. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
  247. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +64 -1
  248. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
  249. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js +169 -0
  250. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js.map +1 -1
  251. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +251 -0
  252. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -1
  253. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.d.ts +38 -0
  254. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.d.ts.map +1 -0
  255. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.js +287 -0
  256. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.js.map +1 -0
  257. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.d.ts +2 -0
  258. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.d.ts.map +1 -0
  259. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.js +648 -0
  260. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.js.map +1 -0
  261. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.d.ts +12 -0
  262. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.d.ts.map +1 -0
  263. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.js +51 -0
  264. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.js.map +1 -0
  265. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.d.ts +2 -0
  266. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.d.ts.map +1 -0
  267. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.js +85 -0
  268. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.js.map +1 -0
  269. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.d.ts +154 -19
  270. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.d.ts.map +1 -1
  271. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.js +73 -4
  272. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.js.map +1 -1
  273. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.js +86 -1
  274. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.js.map +1 -1
  275. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.d.ts +7 -0
  276. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.d.ts.map +1 -1
  277. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.js +85 -16
  278. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.js.map +1 -1
  279. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.js +356 -0
  280. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.js.map +1 -1
  281. package/dist/src/backend/services/session/service/acp/index.d.ts +2 -1
  282. package/dist/src/backend/services/session/service/acp/index.d.ts.map +1 -1
  283. package/dist/src/backend/services/session/service/acp/index.js +1 -0
  284. package/dist/src/backend/services/session/service/acp/index.js.map +1 -1
  285. package/dist/src/backend/services/session/service/acp/types.d.ts +1 -0
  286. package/dist/src/backend/services/session/service/acp/types.d.ts.map +1 -1
  287. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.d.ts +3 -0
  288. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.d.ts.map +1 -1
  289. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.js +44 -2
  290. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.js.map +1 -1
  291. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.d.ts +2 -0
  292. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.d.ts.map +1 -0
  293. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.js +108 -0
  294. package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.js.map +1 -0
  295. package/dist/src/backend/services/session/service/chat/chat-message-handlers/attachment-processing.test.js +21 -0
  296. package/dist/src/backend/services/session/service/chat/chat-message-handlers/attachment-processing.test.js.map +1 -1
  297. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.d.ts.map +1 -1
  298. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.js +3 -279
  299. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.js.map +1 -1
  300. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.test.js +154 -7
  301. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.test.js.map +1 -1
  302. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.d.ts.map +1 -1
  303. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.js +4 -0
  304. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.js.map +1 -1
  305. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.test.js +24 -0
  306. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.test.js.map +1 -1
  307. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.js +1 -1
  308. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.js.map +1 -1
  309. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.test.js +1 -1
  310. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.test.js.map +1 -1
  311. package/dist/src/backend/services/session/service/chat/chat-message-handlers/image-format-validation.js +1 -1
  312. package/dist/src/backend/services/session/service/chat/chat-message-handlers/image-format-validation.js.map +1 -1
  313. package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.d.ts.map +1 -1
  314. package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.js +1 -0
  315. package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.js.map +1 -1
  316. package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.test.js +17 -0
  317. package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.test.js.map +1 -1
  318. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.d.ts +2 -0
  319. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.d.ts.map +1 -1
  320. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js +41 -9
  321. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js.map +1 -1
  322. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js +180 -2
  323. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js.map +1 -1
  324. package/dist/src/backend/services/session/service/data/session-provider-resolver.service.test.js +6 -0
  325. package/dist/src/backend/services/session/service/data/session-provider-resolver.service.test.js.map +1 -1
  326. package/dist/src/backend/services/session/service/index.d.ts +5 -4
  327. package/dist/src/backend/services/session/service/index.d.ts.map +1 -1
  328. package/dist/src/backend/services/session/service/index.js +4 -3
  329. package/dist/src/backend/services/session/service/index.js.map +1 -1
  330. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.d.ts +6 -1
  331. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.d.ts.map +1 -1
  332. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.js +59 -30
  333. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.js.map +1 -1
  334. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.d.ts +2 -0
  335. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.d.ts.map +1 -0
  336. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.js +70 -0
  337. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.js.map +1 -0
  338. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.text-streaming.test.js +28 -0
  339. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.text-streaming.test.js.map +1 -1
  340. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.d.ts +26 -0
  341. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.d.ts.map +1 -0
  342. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.js +84 -0
  343. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.js.map +1 -0
  344. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.test.d.ts +2 -0
  345. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.test.d.ts.map +1 -0
  346. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.test.js +283 -0
  347. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.test.js.map +1 -0
  348. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.d.ts +10 -0
  349. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.d.ts.map +1 -0
  350. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.js +299 -0
  351. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.js.map +1 -0
  352. package/dist/src/backend/services/session/service/lifecycle/session-services.d.ts +2 -0
  353. package/dist/src/backend/services/session/service/lifecycle/session-services.d.ts.map +1 -1
  354. package/dist/src/backend/services/session/service/lifecycle/session-services.js +11 -0
  355. package/dist/src/backend/services/session/service/lifecycle/session-services.js.map +1 -1
  356. package/dist/src/backend/services/session/service/lifecycle/session.config.service.d.ts +1 -0
  357. package/dist/src/backend/services/session/service/lifecycle/session.config.service.d.ts.map +1 -1
  358. package/dist/src/backend/services/session/service/lifecycle/session.config.service.js +25 -4
  359. package/dist/src/backend/services/session/service/lifecycle/session.config.service.js.map +1 -1
  360. package/dist/src/backend/services/session/service/lifecycle/session.config.service.test.js +100 -5
  361. package/dist/src/backend/services/session/service/lifecycle/session.config.service.test.js.map +1 -1
  362. package/dist/src/backend/services/session/service/lifecycle/session.error-message.d.ts +2 -0
  363. package/dist/src/backend/services/session/service/lifecycle/session.error-message.d.ts.map +1 -1
  364. package/dist/src/backend/services/session/service/lifecycle/session.error-message.js +21 -0
  365. package/dist/src/backend/services/session/service/lifecycle/session.error-message.js.map +1 -1
  366. package/dist/src/backend/services/session/service/lifecycle/session.error-message.test.js +26 -1
  367. package/dist/src/backend/services/session/service/lifecycle/session.error-message.test.js.map +1 -1
  368. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts +35 -2
  369. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts.map +1 -1
  370. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js +427 -156
  371. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js.map +1 -1
  372. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.js +684 -15
  373. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.js.map +1 -1
  374. package/dist/src/backend/services/session/service/lifecycle/session.prompt.service.test.js +206 -5
  375. package/dist/src/backend/services/session/service/lifecycle/session.prompt.service.test.js.map +1 -1
  376. package/dist/src/backend/services/session/service/lifecycle/session.service.d.ts +15 -2
  377. package/dist/src/backend/services/session/service/lifecycle/session.service.d.ts.map +1 -1
  378. package/dist/src/backend/services/session/service/lifecycle/session.service.js +87 -14
  379. package/dist/src/backend/services/session/service/lifecycle/session.service.js.map +1 -1
  380. package/dist/src/backend/services/session/service/lifecycle/session.service.test.js +46 -7
  381. package/dist/src/backend/services/session/service/lifecycle/session.service.test.js.map +1 -1
  382. package/dist/src/backend/services/session/service/session-domain.service.d.ts +1 -0
  383. package/dist/src/backend/services/session/service/session-domain.service.d.ts.map +1 -1
  384. package/dist/src/backend/services/session/service/session-domain.service.js +10 -0
  385. package/dist/src/backend/services/session/service/session-domain.service.js.map +1 -1
  386. package/dist/src/backend/services/session/service/session-domain.service.test.js +58 -0
  387. package/dist/src/backend/services/session/service/session-domain.service.test.js.map +1 -1
  388. package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.d.ts +6 -0
  389. package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.d.ts.map +1 -0
  390. package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.js +114 -0
  391. package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.js.map +1 -0
  392. package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.test.d.ts +2 -0
  393. package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.test.d.ts.map +1 -0
  394. package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.test.js +129 -0
  395. package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.test.js.map +1 -0
  396. package/dist/src/backend/services/session/service/store/session-store.types.d.ts +1 -1
  397. package/dist/src/backend/services/session/service/store/session-store.types.d.ts.map +1 -1
  398. package/dist/src/backend/services/session/service/store/session-transcript.d.ts.map +1 -1
  399. package/dist/src/backend/services/session/service/store/session-transcript.js +7 -4
  400. package/dist/src/backend/services/session/service/store/session-transcript.js.map +1 -1
  401. package/dist/src/backend/services/session/service/voice/voice-mode-instructions.d.ts +2 -0
  402. package/dist/src/backend/services/session/service/voice/voice-mode-instructions.d.ts.map +1 -0
  403. package/dist/src/backend/services/session/service/voice/voice-mode-instructions.js +5 -0
  404. package/dist/src/backend/services/session/service/voice/voice-mode-instructions.js.map +1 -0
  405. package/dist/src/backend/services/session/service/voice/voice-narration.service.d.ts +28 -0
  406. package/dist/src/backend/services/session/service/voice/voice-narration.service.d.ts.map +1 -0
  407. package/dist/src/backend/services/session/service/voice/voice-narration.service.js +431 -0
  408. package/dist/src/backend/services/session/service/voice/voice-narration.service.js.map +1 -0
  409. package/dist/src/backend/services/session/service/voice/voice-narration.service.test.d.ts +2 -0
  410. package/dist/src/backend/services/session/service/voice/voice-narration.service.test.d.ts.map +1 -0
  411. package/dist/src/backend/services/session/service/voice/voice-narration.service.test.js +536 -0
  412. package/dist/src/backend/services/session/service/voice/voice-narration.service.test.js.map +1 -0
  413. package/dist/src/backend/services/settings/resources/user-settings.accessor.d.ts +6 -0
  414. package/dist/src/backend/services/settings/resources/user-settings.accessor.d.ts.map +1 -1
  415. package/dist/src/backend/services/settings/resources/user-settings.accessor.js +46 -17
  416. package/dist/src/backend/services/settings/resources/user-settings.accessor.js.map +1 -1
  417. package/dist/src/backend/services/settings/service/user-settings.service.d.ts +6 -0
  418. package/dist/src/backend/services/settings/service/user-settings.service.d.ts.map +1 -1
  419. package/dist/src/backend/services/settings/service/user-settings.service.js.map +1 -1
  420. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.d.ts.map +1 -1
  421. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.js +1 -0
  422. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.js.map +1 -1
  423. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js +24 -0
  424. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js.map +1 -1
  425. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.d.ts +1 -0
  426. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.d.ts.map +1 -1
  427. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.js +23 -12
  428. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.js.map +1 -1
  429. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.test.js +59 -4
  430. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.test.js.map +1 -1
  431. package/dist/src/backend/trpc/admin.trpc.d.ts +10 -0
  432. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  433. package/dist/src/backend/trpc/index.d.ts +631 -4
  434. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  435. package/dist/src/backend/trpc/index.js +2 -0
  436. package/dist/src/backend/trpc/index.js.map +1 -1
  437. package/dist/src/backend/trpc/project.router.test.js +19 -0
  438. package/dist/src/backend/trpc/project.router.test.js.map +1 -1
  439. package/dist/src/backend/trpc/project.trpc.js +1 -1
  440. package/dist/src/backend/trpc/project.trpc.js.map +1 -1
  441. package/dist/src/backend/trpc/session.router.test.js +204 -2
  442. package/dist/src/backend/trpc/session.router.test.js.map +1 -1
  443. package/dist/src/backend/trpc/session.trpc.d.ts +539 -0
  444. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  445. package/dist/src/backend/trpc/session.trpc.js +57 -0
  446. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  447. package/dist/src/backend/trpc/user-settings.router.test.js +117 -6
  448. package/dist/src/backend/trpc/user-settings.router.test.js.map +1 -1
  449. package/dist/src/backend/trpc/user-settings.trpc.d.ts +16 -4
  450. package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -1
  451. package/dist/src/backend/trpc/user-settings.trpc.js +25 -2
  452. package/dist/src/backend/trpc/user-settings.trpc.js.map +1 -1
  453. package/dist/src/backend/trpc/voice.trpc.d.ts +67 -0
  454. package/dist/src/backend/trpc/voice.trpc.d.ts.map +1 -0
  455. package/dist/src/backend/trpc/voice.trpc.js +156 -0
  456. package/dist/src/backend/trpc/voice.trpc.js.map +1 -0
  457. package/dist/src/backend/trpc/voice.trpc.test.d.ts +2 -0
  458. package/dist/src/backend/trpc/voice.trpc.test.d.ts.map +1 -0
  459. package/dist/src/backend/trpc/voice.trpc.test.js +259 -0
  460. package/dist/src/backend/trpc/voice.trpc.test.js.map +1 -0
  461. package/dist/src/cli/runtime-utils.d.ts.map +1 -1
  462. package/dist/src/cli/runtime-utils.js +4 -0
  463. package/dist/src/cli/runtime-utils.js.map +1 -1
  464. package/dist/src/cli/runtime-utils.test.js +7 -0
  465. package/dist/src/cli/runtime-utils.test.js.map +1 -1
  466. package/dist/src/shared/acp-protocol/index.d.ts +2 -0
  467. package/dist/src/shared/acp-protocol/index.d.ts.map +1 -1
  468. package/dist/src/shared/acp-protocol/index.js +2 -0
  469. package/dist/src/shared/acp-protocol/index.js.map +1 -1
  470. package/dist/src/shared/acp-protocol/protocol/messages.d.ts +18 -2
  471. package/dist/src/shared/acp-protocol/protocol/messages.d.ts.map +1 -1
  472. package/dist/src/shared/acp-protocol/protocol/messages.js +1 -0
  473. package/dist/src/shared/acp-protocol/protocol/messages.js.map +1 -1
  474. package/dist/src/shared/acp-protocol/protocol/queued.d.ts +1 -0
  475. package/dist/src/shared/acp-protocol/protocol/queued.d.ts.map +1 -1
  476. package/dist/src/shared/acp-protocol/protocol/renderer-window.d.ts.map +1 -1
  477. package/dist/src/shared/acp-protocol/protocol/renderer-window.js +3 -0
  478. package/dist/src/shared/acp-protocol/protocol/renderer-window.js.map +1 -1
  479. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts +7 -0
  480. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts.map +1 -1
  481. package/dist/src/shared/acp-protocol/protocol/websocket.js +1 -0
  482. package/dist/src/shared/acp-protocol/protocol/websocket.js.map +1 -1
  483. package/dist/src/shared/acp-protocol/session-update-translator.d.ts +39 -0
  484. package/dist/src/shared/acp-protocol/session-update-translator.d.ts.map +1 -0
  485. package/dist/src/shared/acp-protocol/session-update-translator.js +356 -0
  486. package/dist/src/shared/acp-protocol/session-update-translator.js.map +1 -0
  487. package/dist/src/shared/acp-protocol/subagents.d.ts +1175 -0
  488. package/dist/src/shared/acp-protocol/subagents.d.ts.map +1 -0
  489. package/dist/src/shared/acp-protocol/subagents.js +259 -0
  490. package/dist/src/shared/acp-protocol/subagents.js.map +1 -0
  491. package/dist/src/shared/core/enums.d.ts +16 -0
  492. package/dist/src/shared/core/enums.d.ts.map +1 -1
  493. package/dist/src/shared/core/enums.js +14 -0
  494. package/dist/src/shared/core/enums.js.map +1 -1
  495. package/dist/src/shared/core/index.d.ts +1 -1
  496. package/dist/src/shared/core/index.d.ts.map +1 -1
  497. package/dist/src/shared/core/index.js +1 -1
  498. package/dist/src/shared/core/index.js.map +1 -1
  499. package/dist/src/shared/deepgram-voices.d.ts +12 -0
  500. package/dist/src/shared/deepgram-voices.d.ts.map +1 -0
  501. package/dist/src/shared/deepgram-voices.js +51 -0
  502. package/dist/src/shared/deepgram-voices.js.map +1 -0
  503. package/dist/src/shared/issue-start-prompt.d.ts.map +1 -1
  504. package/dist/src/shared/issue-start-prompt.js +8 -3
  505. package/dist/src/shared/issue-start-prompt.js.map +1 -1
  506. package/dist/src/shared/schemas/export-data.schema.d.ts +10 -0
  507. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  508. package/dist/src/shared/schemas/export-data.schema.js +19 -0
  509. package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
  510. package/dist/src/shared/voice-vad.d.ts +11 -0
  511. package/dist/src/shared/voice-vad.d.ts.map +1 -0
  512. package/dist/src/shared/voice-vad.js +19 -0
  513. package/dist/src/shared/voice-vad.js.map +1 -0
  514. package/dist/src/shared/websocket/chat-message.schema.d.ts +1 -0
  515. package/dist/src/shared/websocket/chat-message.schema.d.ts.map +1 -1
  516. package/dist/src/shared/websocket/chat-message.schema.js +1 -0
  517. package/dist/src/shared/websocket/chat-message.schema.js.map +1 -1
  518. package/dist/src/shared/websocket/voice-message.schema.d.ts +25 -0
  519. package/dist/src/shared/websocket/voice-message.schema.d.ts.map +1 -0
  520. package/dist/src/shared/websocket/voice-message.schema.js +14 -0
  521. package/dist/src/shared/websocket/voice-message.schema.js.map +1 -0
  522. package/dist/src/shared/workspace-snapshot.d.ts +5 -5
  523. package/dist/src/test-utils/application-graph.d.ts.map +1 -1
  524. package/dist/src/test-utils/application-graph.js +10 -2
  525. package/dist/src/test-utils/application-graph.js.map +1 -1
  526. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  527. package/package.json +6 -6
  528. package/prisma/migrations/20260730140000_add_session_lifecycle_events/migration.sql +20 -0
  529. package/prisma/migrations/20260802152257_add_voice_mode_settings/migration.sql +34 -0
  530. package/prisma/migrations/20260802200414_add_voice_tts_model_and_speed/migration.sql +36 -0
  531. package/prisma/migrations/20260807222320_voice_vad_aggressiveness_settings/migration.sql +38 -0
  532. package/prisma/schema.prisma +41 -0
  533. package/dist/client/assets/architectureDiagram-ZJ3FMSHR-Cz-V9xRh.js +0 -36
  534. package/dist/client/assets/channel-DVMObwOq.js +0 -1
  535. package/dist/client/assets/classDiagram-OUVF2IWQ-wHGXcbfd.js +0 -1
  536. package/dist/client/assets/classDiagram-v2-EOCWNBFH-wHGXcbfd.js +0 -1
  537. package/dist/client/assets/diagram-WEI45ONY-DF667tXW.js +0 -41
  538. package/dist/client/assets/index-CpvT2M5m.js +0 -689
  539. package/dist/client/assets/index-CwfNzqG5.css +0 -1
  540. package/dist/client/assets/stateDiagram-v2-6OUMAXLB-CGxDgHho.js +0 -1
  541. package/dist/client/assets/swimlanesDiagram-G3AALYLV-1u_1g3u4.js +0 -8
@@ -1,11 +1,13 @@
1
+ import { randomUUID } from 'node:crypto';
1
2
  import { configService } from '../../../../../backend/services/config.service.js';
2
3
  import { createLogger } from '../../../../../backend/services/logger.service.js';
4
+ import { AcpBrowseSessionUnavailableError } from '../../../../../backend/services/session/service/acp/acp-runtime-manager.js';
3
5
  import { getChildWorkspaceMcpServerConfig } from '../../../../../backend/services/session/service/acp/child-workspace-mcp-server.js';
4
6
  import { acpTraceLogger } from '../../../../../backend/services/session/service/logging/acp-trace-logger.service.js';
5
7
  import { sessionEventBus } from '../../../../../backend/services/session/service/session-event-bus.js';
6
8
  import { userSettingsService } from '../../../../../backend/services/settings/index.js';
7
9
  import { workspaceDataService, workspaceNotificationService } from '../../../../../backend/services/workspace/index.js';
8
- import { SessionStatus } from '../../../../../shared/core/index.js';
10
+ import { SessionLifecycleEventKind, SessionLifecycleEventReason, SessionStatus, } from '../../../../../shared/core/index.js';
9
11
  import { createInitialSessionRuntimeState, } from '../../../../../shared/session-runtime.js';
10
12
  import { buildWorkspaceNotificationMessageText, WORKSPACE_NOTIFICATION_MESSAGE_ID_PREFIX, workspaceNotificationMessageId, } from '../../../../../shared/workspace-notifications.js';
11
13
  import { closedSessionPersistenceService } from './closed-session-persistence.service.js';
@@ -13,9 +15,22 @@ import { toErrorMessage } from './session.error-message.js';
13
15
  import { maybeDiscoverPROnSessionEnd as maybeDiscoverPROnSessionEndHelper } from './session-pr-discovery.service.js';
14
16
  import { isStaleLoadingRuntime } from './session-runtime-state.helpers.js';
15
17
  const logger = createLogger('session');
18
+ class SessionStartupCancelledError extends Error {
19
+ constructor() {
20
+ super('Session is currently being stopped');
21
+ this.name = 'SessionStartupCancelledError';
22
+ }
23
+ }
16
24
  function getPersistedStatusForExitCode(exitCode) {
17
25
  return exitCode === 0 ? SessionStatus.COMPLETED : SessionStatus.FAILED;
18
26
  }
27
+ const SESSION_STOP_MESSAGES = {
28
+ USER_STOP: 'Session stopped by you.',
29
+ SESSION_CLOSED: 'Session closed by you.',
30
+ WORKSPACE_ARCHIVED: 'Session stopped because the workspace was archived.',
31
+ SYSTEM_STOP: 'Session stopped by the system.',
32
+ };
33
+ const SHUTDOWN_LIFECYCLE_RECORD_TIMEOUT_MS = 1000;
19
34
  export class SessionLifecycleService {
20
35
  repository;
21
36
  promptBuilder;
@@ -26,11 +41,16 @@ export class SessionLifecycleService {
26
41
  acpEventProcessor;
27
42
  promptTurnCompletionService;
28
43
  retryService;
44
+ lifecycleEventService;
45
+ hydrateProviderHistory;
29
46
  sendSessionMessage;
30
47
  onBeforeStopSession;
31
48
  onSessionExit;
32
49
  stoppingSessions = new Set();
50
+ shutdownSessions = new Set();
51
+ stopGenerationCounter = 0;
33
52
  stopGenerations = new Map();
53
+ startupGenerationReferences = new Map();
34
54
  clientCreationOperations = new Map();
35
55
  workspaceBridge = null;
36
56
  messageQueueBridge = null;
@@ -45,6 +65,9 @@ export class SessionLifecycleService {
45
65
  this.acpEventProcessor = options.acpEventProcessor;
46
66
  this.promptTurnCompletionService = options.promptTurnCompletionService;
47
67
  this.retryService = options.retryService;
68
+ this.lifecycleEventService = options.lifecycleEventService;
69
+ this.hydrateProviderHistory =
70
+ options.hydrateProviderHistory ?? (async () => undefined);
48
71
  this.sendSessionMessage = options.sendSessionMessage;
49
72
  this.onBeforeStopSession = options.onBeforeStopSession;
50
73
  this.onSessionExit = options.onSessionExit;
@@ -55,32 +78,34 @@ export class SessionLifecycleService {
55
78
  this.autoIterationExitBridge = bridges.autoIterationExit ?? null;
56
79
  }
57
80
  async startSession(sessionId, options) {
58
- const stopGeneration = this.getStopGeneration(sessionId);
59
- const session = await this.repository.getSessionById(sessionId);
60
- if (!session) {
61
- throw new Error(`Session not found: ${sessionId}`);
62
- }
63
- this.assertStartupAllowed(sessionId, stopGeneration);
64
- const existingClient = this.runtimeManager.getClient(sessionId);
65
- if (existingClient) {
66
- throw new Error('Session is already running');
67
- }
68
- const startupModePreset = options?.startupModePreset;
69
- const { handle, resolvedPreset, dispatchableNotificationCount } = await this.getOrCreateAcpSessionClient(sessionId, {}, session, stopGeneration);
70
- this.assertStartupAllowed(sessionId, stopGeneration);
71
- await this.applyStartupModePreset(sessionId, handle, startupModePreset, session.workflow);
72
- this.assertStartupAllowed(sessionId, stopGeneration);
73
- await this.applyConfiguredPermissionPreset(sessionId, session, handle, resolvedPreset);
74
- this.assertStartupAllowed(sessionId, stopGeneration);
75
- await this.dispatchQueuedNotificationsIfNeeded(sessionId, dispatchableNotificationCount);
76
- this.assertStartupAllowed(sessionId, stopGeneration);
77
- const initialPrompt = options?.initialPrompt ?? 'Continue with the task.';
78
- const shouldSendInitialPrompt = dispatchableNotificationCount === 0 ||
79
- (typeof options?.initialPrompt === 'string' && !options.initialPromptIsDefault);
80
- if (shouldSendInitialPrompt && initialPrompt) {
81
- await this.sendSessionMessage(sessionId, initialPrompt);
82
- }
83
- logger.info('Session started', { sessionId, provider: session.provider });
81
+ await this.runStartupOperation(sessionId, async (stopGeneration) => {
82
+ const session = await this.repository.getSessionById(sessionId);
83
+ if (!session) {
84
+ throw new Error(`Session not found: ${sessionId}`);
85
+ }
86
+ this.assertStartupAllowed(sessionId, stopGeneration);
87
+ const existingClient = this.runtimeManager.getClient(sessionId);
88
+ if (existingClient) {
89
+ throw new Error('Session is already running');
90
+ }
91
+ const startupModePreset = options?.startupModePreset;
92
+ const { handle, resolvedPreset, dispatchableNotificationCount } = await this.getOrCreateAcpSessionClient(sessionId, {}, session, stopGeneration);
93
+ this.assertStartupAllowed(sessionId, stopGeneration);
94
+ await this.applyStartupModePreset(sessionId, handle, startupModePreset, session.workflow);
95
+ this.assertStartupAllowed(sessionId, stopGeneration);
96
+ await this.applyConfiguredPermissionPreset(sessionId, session, handle, resolvedPreset);
97
+ this.assertStartupAllowed(sessionId, stopGeneration);
98
+ await this.dispatchQueuedNotificationsIfNeeded(sessionId, dispatchableNotificationCount);
99
+ this.assertStartupAllowed(sessionId, stopGeneration);
100
+ const initialPrompt = options?.initialPrompt ?? 'Continue with the task.';
101
+ const shouldSendInitialPrompt = dispatchableNotificationCount === 0 ||
102
+ (typeof options?.initialPrompt === 'string' && !options.initialPromptIsDefault);
103
+ if (shouldSendInitialPrompt && initialPrompt) {
104
+ await this.sendSessionMessage(sessionId, initialPrompt);
105
+ }
106
+ this.assertStartupAllowed(sessionId, stopGeneration);
107
+ logger.info('Session started', { sessionId, provider: session.provider });
108
+ });
84
109
  }
85
110
  async restartSession(sessionId, options) {
86
111
  const isRunning = this.runtimeManager.isSessionRunning(sessionId);
@@ -110,24 +135,33 @@ export class SessionLifecycleService {
110
135
  logger.debug('Session stop already in progress', { sessionId });
111
136
  return;
112
137
  }
113
- this.stopGenerations.set(sessionId, this.getStopGeneration(sessionId) + 1);
138
+ this.advanceStopGeneration(sessionId);
114
139
  this.stoppingSessions.add(sessionId);
140
+ const stopInvocationId = randomUUID();
115
141
  try {
116
- await this.stopSessionWithBarrier(sessionId, options);
142
+ await this.stopSessionWithBarrier(sessionId, stopInvocationId, options);
117
143
  }
118
144
  finally {
119
145
  this.stoppingSessions.delete(sessionId);
146
+ this.stopGenerations.delete(sessionId);
120
147
  }
121
148
  }
122
- async stopSessionWithBarrier(sessionId, options) {
149
+ async stopSessionWithBarrier(sessionId, stopInvocationId, options) {
123
150
  this.promptTurnCompletionService.clearSession(sessionId);
124
151
  this.onBeforeStopSession?.(sessionId);
125
152
  this.sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: true });
126
153
  const session = await this.loadSessionForStop(sessionId);
127
154
  const workspaceId = session?.workspaceId ?? this.acpEventProcessor.getWorkspaceId(sessionId);
128
- if (this.runtimeManager.isStopInProgress(sessionId)) {
129
- logger.debug('Session stop already in progress', { sessionId });
130
- return;
155
+ const reason = options?.reason ?? 'SYSTEM_STOP';
156
+ if (workspaceId && options?.recordLifecycleEvent !== false) {
157
+ await this.lifecycleEventService.record({
158
+ workspaceId,
159
+ sessionId,
160
+ kind: SessionLifecycleEventKind.SESSION_STOPPED,
161
+ reason,
162
+ message: SESSION_STOP_MESSAGES[reason],
163
+ dedupeKey: `session-stop:${stopInvocationId}`,
164
+ });
131
165
  }
132
166
  const current = this.getRuntimeSnapshot(sessionId);
133
167
  this.sessionDomainService.setRuntimeSnapshot(sessionId, {
@@ -160,7 +194,7 @@ export class SessionLifecycleService {
160
194
  updatedAt: new Date().toISOString(),
161
195
  });
162
196
  this.markWorkspaceSessionIdleOnStop(workspaceId, sessionId);
163
- this.acpEventProcessor.clearSessionContext(sessionId);
197
+ this.acpEventProcessor.clearSessionState(sessionId);
164
198
  if (!stopClientFailed) {
165
199
  const shouldCleanupTransientRatchetSession = options?.cleanupTransientRatchetSession ?? true;
166
200
  await this.cleanupTransientRatchetOnStop(session, sessionId, shouldCleanupTransientRatchetSession);
@@ -178,35 +212,32 @@ export class SessionLifecycleService {
178
212
  }
179
213
  }
180
214
  async stopRuntimeAndPendingCreation(sessionId) {
181
- if (!this.runtimeManager.isStopInProgress(sessionId)) {
182
- await this.runtimeManager.stopClient(sessionId);
183
- }
215
+ await this.runtimeManager.stopClient(sessionId);
184
216
  const pendingCreations = this.clientCreationOperations.get(sessionId);
185
217
  if (!pendingCreations || pendingCreations.size === 0) {
186
218
  return;
187
219
  }
188
220
  await Promise.allSettled([...pendingCreations]);
189
- if (!this.runtimeManager.isStopInProgress(sessionId)) {
190
- await this.runtimeManager.stopClient(sessionId);
191
- }
221
+ await this.runtimeManager.stopClient(sessionId);
192
222
  }
193
- async stopWorkspaceSessions(workspaceId) {
223
+ async stopWorkspaceSessions(workspaceId, options) {
194
224
  const sessions = await this.repository.getSessionsByWorkspaceId(workspaceId);
195
225
  const stopErrors = [];
196
226
  for (const session of sessions) {
197
- if (session.status === SessionStatus.RUNNING ||
198
- this.runtimeManager.isSessionRunning(session.id)) {
199
- try {
200
- await this.stopSession(session.id);
201
- }
202
- catch (error) {
203
- logger.error('Failed to stop workspace session', {
204
- sessionId: session.id,
205
- workspaceId,
206
- error: error instanceof Error ? error.message : String(error),
207
- });
208
- stopErrors.push(error);
209
- }
227
+ const stopOptions = this.getWorkspaceSessionStopOptions(session, options?.reason ?? 'SYSTEM_STOP');
228
+ if (!stopOptions) {
229
+ continue;
230
+ }
231
+ try {
232
+ await this.stopSession(session.id, stopOptions);
233
+ }
234
+ catch (error) {
235
+ logger.error('Failed to stop workspace session', {
236
+ sessionId: session.id,
237
+ workspaceId,
238
+ error: error instanceof Error ? error.message : String(error),
239
+ });
240
+ stopErrors.push(error);
210
241
  }
211
242
  }
212
243
  if (stopErrors.length > 0) {
@@ -214,37 +245,113 @@ export class SessionLifecycleService {
214
245
  }
215
246
  logger.info('Stopped all workspace sessions', { workspaceId, count: sessions.length });
216
247
  }
217
- async getOrCreateSessionClient(sessionId, options) {
218
- const stopGeneration = this.getStopGeneration(sessionId);
219
- const session = await this.repository.getSessionById(sessionId);
220
- if (!session) {
221
- throw new Error(`Session not found: ${sessionId}`);
248
+ getWorkspaceSessionStopOptions(session, reason) {
249
+ const browseOnlyClient = this.runtimeManager.isBrowseOnlySession(session.id);
250
+ const activeClient = this.runtimeManager.isSessionRunning(session.id);
251
+ if (!(session.status === SessionStatus.RUNNING || activeClient || browseOnlyClient)) {
252
+ return null;
222
253
  }
223
- this.assertStartupAllowed(sessionId, stopGeneration);
224
- const hadClient = !!this.runtimeManager.getClient(sessionId);
225
- const { handle, resolvedPreset, dispatchableNotificationCount } = await this.getOrCreateAcpSessionClient(sessionId, options ?? {}, session, stopGeneration);
226
- this.assertStartupAllowed(sessionId, stopGeneration);
227
- if (!hadClient) {
228
- await this.applyConfiguredPermissionPreset(sessionId, session, handle, resolvedPreset);
254
+ return {
255
+ reason,
256
+ ...(browseOnlyClient && !activeClient ? { recordLifecycleEvent: false } : {}),
257
+ };
258
+ }
259
+ async getOrCreateSessionClient(sessionId, options) {
260
+ return await this.runStartupOperation(sessionId, async (stopGeneration) => {
261
+ const session = await this.repository.getSessionById(sessionId);
262
+ if (!session) {
263
+ throw new Error(`Session not found: ${sessionId}`);
264
+ }
229
265
  this.assertStartupAllowed(sessionId, stopGeneration);
230
- await this.dispatchQueuedNotificationsIfNeeded(sessionId, dispatchableNotificationCount);
266
+ const hadClient = !!this.runtimeManager.getClient(sessionId);
267
+ const { handle, resolvedPreset, dispatchableNotificationCount } = await this.getOrCreateAcpSessionClient(sessionId, options ?? {}, session, stopGeneration);
231
268
  this.assertStartupAllowed(sessionId, stopGeneration);
232
- }
233
- return handle;
269
+ if (!hadClient) {
270
+ await this.applyConfiguredPermissionPreset(sessionId, session, handle, resolvedPreset);
271
+ this.assertStartupAllowed(sessionId, stopGeneration);
272
+ await this.dispatchQueuedNotificationsIfNeeded(sessionId, dispatchableNotificationCount);
273
+ this.assertStartupAllowed(sessionId, stopGeneration);
274
+ }
275
+ return handle;
276
+ });
234
277
  }
235
278
  async getOrCreateSessionClientFromRecord(session, options) {
236
- const stopGeneration = this.getStopGeneration(session.id);
237
- this.assertStartupAllowed(session.id, stopGeneration);
238
- const hadClient = !!this.runtimeManager.getClient(session.id);
239
- const { handle, resolvedPreset, dispatchableNotificationCount } = await this.getOrCreateAcpSessionClient(session.id, options ?? {}, session, stopGeneration);
240
- this.assertStartupAllowed(session.id, stopGeneration);
241
- if (!hadClient) {
242
- await this.applyConfiguredPermissionPreset(session.id, session, handle, resolvedPreset);
279
+ return await this.runStartupOperation(session.id, async (stopGeneration) => {
243
280
  this.assertStartupAllowed(session.id, stopGeneration);
244
- await this.dispatchQueuedNotificationsIfNeeded(session.id, dispatchableNotificationCount);
281
+ const hadClient = !!this.runtimeManager.getClient(session.id);
282
+ const { handle, resolvedPreset, dispatchableNotificationCount } = await this.getOrCreateAcpSessionClient(session.id, options ?? {}, session, stopGeneration);
245
283
  this.assertStartupAllowed(session.id, stopGeneration);
284
+ if (!hadClient) {
285
+ await this.applyConfiguredPermissionPreset(session.id, session, handle, resolvedPreset);
286
+ this.assertStartupAllowed(session.id, stopGeneration);
287
+ await this.dispatchQueuedNotificationsIfNeeded(session.id, dispatchableNotificationCount);
288
+ this.assertStartupAllowed(session.id, stopGeneration);
289
+ }
290
+ return handle;
291
+ });
292
+ }
293
+ async ensureSubagentBrowseSession(sessionId) {
294
+ if (this.runtimeManager.getSubagentBrowseCapability(sessionId)) {
295
+ return true;
246
296
  }
247
- return handle;
297
+ const pendingClient = this.runtimeManager.getPendingClient(sessionId);
298
+ if (pendingClient) {
299
+ try {
300
+ await pendingClient;
301
+ }
302
+ catch (error) {
303
+ if (error instanceof AcpBrowseSessionUnavailableError) {
304
+ return false;
305
+ }
306
+ throw error;
307
+ }
308
+ return await this.resolveSubagentBrowseSupport(sessionId);
309
+ }
310
+ return await this.runStartupOperation(sessionId, async (stopGeneration) => {
311
+ const session = await this.repository.getSessionById(sessionId);
312
+ if (!(session?.provider === 'CODEX' && session.providerSessionId)) {
313
+ return false;
314
+ }
315
+ this.assertStartupAllowed(sessionId, stopGeneration);
316
+ const workspace = await this.repository.getWorkspaceById(session.workspaceId);
317
+ if (!workspace?.worktreePath ||
318
+ workspace.status === 'ARCHIVING' ||
319
+ workspace.status === 'ARCHIVED') {
320
+ return false;
321
+ }
322
+ this.assertStartupAllowed(sessionId, stopGeneration);
323
+ try {
324
+ await this.createAcpClient(sessionId, { purpose: 'browse' }, session, undefined, stopGeneration);
325
+ }
326
+ catch (error) {
327
+ if (error instanceof AcpBrowseSessionUnavailableError) {
328
+ return false;
329
+ }
330
+ throw error;
331
+ }
332
+ return await this.resolveSubagentBrowseSupport(sessionId);
333
+ }).catch((error) => {
334
+ if (error instanceof SessionStartupCancelledError) {
335
+ return false;
336
+ }
337
+ throw error;
338
+ });
339
+ }
340
+ async resolveSubagentBrowseSupport(sessionId) {
341
+ if (this.runtimeManager.getSubagentBrowseCapability(sessionId) !== null) {
342
+ return true;
343
+ }
344
+ if (!this.runtimeManager.isBrowseOnlySession(sessionId)) {
345
+ return false;
346
+ }
347
+ this.advanceStopGeneration(sessionId);
348
+ try {
349
+ await this.runtimeManager.stopClient(sessionId);
350
+ }
351
+ finally {
352
+ this.acpEventProcessor.clearSessionState(sessionId);
353
+ }
354
+ return false;
248
355
  }
249
356
  getSessionClient(sessionId) {
250
357
  return this.runtimeManager.getClient(sessionId);
@@ -285,11 +392,50 @@ export class SessionLifecycleService {
285
392
  return this.stoppingSessions.has(sessionId) || this.runtimeManager.isStopInProgress(sessionId);
286
393
  }
287
394
  getStopGeneration(sessionId) {
288
- return this.stopGenerations.get(sessionId) ?? 0;
395
+ return this.stopGenerations.get(sessionId) ?? this.advanceStopGeneration(sessionId);
396
+ }
397
+ async runStartupOperation(sessionId, operation) {
398
+ const stopGeneration = this.getStopGeneration(sessionId);
399
+ this.startupGenerationReferences.set(stopGeneration, (this.startupGenerationReferences.get(stopGeneration) ?? 0) + 1);
400
+ let succeeded = false;
401
+ try {
402
+ const result = await operation(stopGeneration);
403
+ succeeded = true;
404
+ return result;
405
+ }
406
+ finally {
407
+ this.releaseStartupGeneration(sessionId, stopGeneration, succeeded);
408
+ }
409
+ }
410
+ releaseStartupGeneration(sessionId, stopGeneration, succeeded) {
411
+ const referenceCount = this.startupGenerationReferences.get(stopGeneration);
412
+ if (referenceCount === undefined) {
413
+ return;
414
+ }
415
+ if (referenceCount > 1) {
416
+ this.startupGenerationReferences.set(stopGeneration, referenceCount - 1);
417
+ return;
418
+ }
419
+ this.startupGenerationReferences.delete(stopGeneration);
420
+ if (!(succeeded ||
421
+ this.isSessionStopping(sessionId) ||
422
+ this.runtimeManager.getClient(sessionId)) &&
423
+ this.isStopGenerationCurrent(sessionId, stopGeneration)) {
424
+ this.stopGenerations.delete(sessionId);
425
+ }
426
+ }
427
+ isStopGenerationCurrent(sessionId, stopGeneration) {
428
+ return this.stopGenerations.get(sessionId) === stopGeneration;
429
+ }
430
+ advanceStopGeneration(sessionId) {
431
+ this.stopGenerationCounter += 1;
432
+ this.stopGenerations.set(sessionId, this.stopGenerationCounter);
433
+ return this.stopGenerationCounter;
289
434
  }
290
435
  assertStartupAllowed(sessionId, stopGeneration) {
291
- if (this.isSessionStopping(sessionId) || this.getStopGeneration(sessionId) !== stopGeneration) {
292
- throw new Error('Session is currently being stopped');
436
+ if (this.isSessionStopping(sessionId) ||
437
+ !this.isStopGenerationCurrent(sessionId, stopGeneration)) {
438
+ throw new SessionStartupCancelledError();
293
439
  }
294
440
  }
295
441
  async getSessionOptions(sessionId) {
@@ -307,6 +453,12 @@ export class SessionLifecycleService {
307
453
  }
308
454
  async stopAllClients(timeoutMs = 5000) {
309
455
  this.promptTurnCompletionService.clearAll();
456
+ const shutdownSessionIds = this.runtimeManager.beginShutdown();
457
+ const activeShutdownSessionIds = shutdownSessionIds.filter((sessionId) => !this.runtimeManager.isBrowseOnlySession(sessionId));
458
+ for (const sessionId of activeShutdownSessionIds) {
459
+ this.shutdownSessions.add(sessionId);
460
+ }
461
+ await this.recordShutdownLifecycleEvents(activeShutdownSessionIds);
310
462
  try {
311
463
  await this.runtimeManager.stopAllClients(timeoutMs);
312
464
  }
@@ -317,83 +469,100 @@ export class SessionLifecycleService {
317
469
  throw error;
318
470
  }
319
471
  }
320
- setupAcpEventHandler(sessionId) {
472
+ async recordShutdownLifecycleEvent(sessionId) {
473
+ const session = await this.loadSessionForStop(sessionId);
474
+ const workspaceId = session?.workspaceId ?? this.acpEventProcessor.getWorkspaceId(sessionId);
475
+ if (!workspaceId) {
476
+ logger.warn('Skipped shutdown lifecycle event without workspace owner', { sessionId });
477
+ return;
478
+ }
479
+ await this.lifecycleEventService.record({
480
+ workspaceId,
481
+ sessionId,
482
+ kind: SessionLifecycleEventKind.SESSION_STOPPED,
483
+ reason: SessionLifecycleEventReason.SYSTEM_STOP,
484
+ message: SESSION_STOP_MESSAGES.SYSTEM_STOP,
485
+ dedupeKey: `session-stop:${randomUUID()}`,
486
+ });
487
+ }
488
+ async recordShutdownLifecycleEvents(sessionIds) {
489
+ const resultsPromise = Promise.allSettled(sessionIds.map((sessionId) => this.recordShutdownLifecycleEvent(sessionId)));
490
+ let timeout;
491
+ const results = await Promise.race([
492
+ resultsPromise,
493
+ new Promise((resolve) => {
494
+ timeout = setTimeout(() => resolve(null), SHUTDOWN_LIFECYCLE_RECORD_TIMEOUT_MS);
495
+ }),
496
+ ]);
497
+ if (timeout) {
498
+ clearTimeout(timeout);
499
+ }
500
+ if (results === null) {
501
+ logger.warn('Timed out recording shutdown lifecycle events; continuing shutdown', {
502
+ timeoutMs: SHUTDOWN_LIFECYCLE_RECORD_TIMEOUT_MS,
503
+ });
504
+ return;
505
+ }
506
+ for (const [index, result] of results.entries()) {
507
+ if (result.status === 'rejected') {
508
+ logger.warn('Failed recording shutdown lifecycle event; continuing shutdown', {
509
+ sessionId: sessionIds[index],
510
+ error: result.reason instanceof Error ? result.reason.message : String(result.reason),
511
+ });
512
+ }
513
+ }
514
+ }
515
+ setupAcpEventHandler(sessionId, options) {
321
516
  const runtimeEventHandler = this.acpEventProcessor.createRuntimeEventHandler(sessionId);
322
- return {
323
- ...runtimeEventHandler,
324
- onSessionId: async (sid, providerSessionId) => {
325
- try {
326
- await this.repository.updateSession(sid, { providerSessionId });
327
- acpTraceLogger.log(sid, 'runtime_metadata', {
328
- type: 'provider_session_id',
329
- providerSessionId,
330
- });
331
- logger.debug('Updated session with ACP providerSessionId', {
332
- sessionId: sid,
333
- providerSessionId,
334
- });
335
- }
336
- catch (error) {
337
- logger.warn('Failed to update session with ACP providerSessionId', {
338
- sessionId: sid,
339
- providerSessionId,
340
- error: error instanceof Error ? error.message : String(error),
341
- });
342
- }
343
- },
344
- onExit: async (sid, exitCode) => {
345
- this.promptTurnCompletionService.clearSession(sid);
346
- this.onSessionExit?.(sid);
347
- this.finalizeOrphanedToolCalls(sid, 'runtime_exit');
348
- this.acpEventProcessor.clearSessionState(sid);
349
- this.sessionPermissionService.cancelPendingRequests(sid);
350
- acpTraceLogger.log(sid, 'runtime_exit', { exitCode });
351
- try {
352
- this.sessionDomainService.markProcessExit(sid, exitCode);
353
- const persistedStatus = getPersistedStatusForExitCode(exitCode);
354
- const session = await this.repository.updateSession(sid, {
355
- status: persistedStatus,
356
- });
357
- logger.debug('Updated ACP session status on exit', {
358
- sessionId: sid,
359
- exitCode,
360
- status: persistedStatus,
361
- });
362
- await this.recordRatchetSessionEndOnExit(session.workspaceId, sid, exitCode);
363
- void this.maybeDiscoverPROnSessionEnd(session.workspaceId);
364
- if (session.workflow === 'ratchet') {
365
- await this.persistRatchetTranscript(sid, session);
366
- await this.repository.deleteSession(sid);
367
- this.sessionDomainService.clearSession(sid);
368
- logger.debug('Deleted transient ratchet ACP session', { sessionId: sid });
369
- }
370
- if (session.workflow === 'auto-iteration' && this.autoIterationExitBridge) {
371
- if (!this.runtimeManager.isStopInProgress(sid)) {
372
- this.autoIterationExitBridge.onAutoIterationSessionExit(session.workspaceId, sid);
373
- }
374
- }
375
- }
376
- catch (error) {
377
- logger.warn('Failed to update ACP session status on exit', {
378
- sessionId: sid,
379
- error: error instanceof Error ? error.message : String(error),
380
- });
381
- }
382
- finally {
517
+ const runtimeIncarnationId = randomUUID();
518
+ const providerSessionIdHandler = options?.persistProviderSessionId === false
519
+ ? {}
520
+ : {
521
+ onSessionId: async (sid, providerSessionId) => {
383
522
  try {
384
- this.clearSessionStoreIfInactive(sid, 'runtime_exit');
523
+ await this.repository.updateSession(sid, { providerSessionId });
524
+ acpTraceLogger.log(sid, 'runtime_metadata', {
525
+ type: 'provider_session_id',
526
+ providerSessionId,
527
+ });
528
+ logger.debug('Updated session with ACP providerSessionId', {
529
+ sessionId: sid,
530
+ providerSessionId,
531
+ });
385
532
  }
386
- finally {
387
- acpTraceLogger.closeSession(sid);
533
+ catch (error) {
534
+ logger.warn('Failed to update session with ACP providerSessionId', {
535
+ sessionId: sid,
536
+ providerSessionId,
537
+ error: error instanceof Error ? error.message : String(error),
538
+ });
388
539
  }
540
+ },
541
+ };
542
+ return {
543
+ ...runtimeEventHandler,
544
+ ...providerSessionIdHandler,
545
+ onExit: async (sid, exitCode) => {
546
+ this.stopGenerations.delete(sid);
547
+ if (this.runtimeManager.isBrowseOnlySession(sid)) {
548
+ this.acpEventProcessor.clearSessionState(sid);
549
+ acpTraceLogger.closeSession(sid);
550
+ return;
389
551
  }
552
+ const wasDeliberateStop = this.stoppingSessions.has(sid) ||
553
+ this.shutdownSessions.has(sid) ||
554
+ this.runtimeManager.isStopInProgress(sid);
555
+ this.prepareAcpRuntimeExit(sid, exitCode);
556
+ await this.handleAcpRuntimeExit(sid, exitCode, wasDeliberateStop, runtimeIncarnationId);
390
557
  },
391
558
  onError: (sid, error) => {
392
559
  acpTraceLogger.log(sid, 'runtime_error', {
393
560
  message: error.message,
394
561
  stack: error.stack,
395
562
  });
396
- this.sessionDomainService.markError(sid, error.message);
563
+ if (!this.runtimeManager.isBrowseOnlySession(sid)) {
564
+ this.sessionDomainService.markError(sid, error.message);
565
+ }
397
566
  logger.error('ACP client error', {
398
567
  sessionId: sid,
399
568
  error: error.message,
@@ -405,20 +574,104 @@ export class SessionLifecycleService {
405
574
  },
406
575
  };
407
576
  }
577
+ prepareAcpRuntimeExit(sessionId, exitCode) {
578
+ this.promptTurnCompletionService.clearSession(sessionId);
579
+ this.onSessionExit?.(sessionId);
580
+ this.finalizeOrphanedToolCalls(sessionId, 'runtime_exit');
581
+ this.acpEventProcessor.clearSessionState(sessionId);
582
+ this.sessionPermissionService.cancelPendingRequests(sessionId);
583
+ acpTraceLogger.log(sessionId, 'runtime_exit', { exitCode });
584
+ }
585
+ async handleAcpRuntimeExit(sessionId, exitCode, wasDeliberateStop, runtimeIncarnationId) {
586
+ try {
587
+ this.sessionDomainService.markProcessExit(sessionId, exitCode);
588
+ const session = await this.repository.getSessionById(sessionId);
589
+ if (!session) {
590
+ logger.warn('Failed to find ACP session on exit', { sessionId });
591
+ return;
592
+ }
593
+ const persistedStatus = getPersistedStatusForExitCode(exitCode);
594
+ try {
595
+ await this.repository.updateSession(sessionId, { status: persistedStatus });
596
+ logger.debug('Updated ACP session status on exit', {
597
+ sessionId,
598
+ exitCode,
599
+ status: persistedStatus,
600
+ });
601
+ }
602
+ catch (error) {
603
+ logger.warn('Failed to update ACP session status on exit', {
604
+ sessionId,
605
+ error: error instanceof Error ? error.message : String(error),
606
+ });
607
+ }
608
+ await this.recordUnexpectedExitIfNeeded(session, sessionId, exitCode, wasDeliberateStop, runtimeIncarnationId);
609
+ await this.recordRatchetSessionEndOnExit(session.workspaceId, sessionId, exitCode);
610
+ void this.maybeDiscoverPROnSessionEnd(session.workspaceId);
611
+ await this.cleanupExitedWorkflow(session, sessionId, wasDeliberateStop);
612
+ }
613
+ catch (error) {
614
+ logger.warn('Failed to process ACP session exit', {
615
+ sessionId,
616
+ error: error instanceof Error ? error.message : String(error),
617
+ });
618
+ }
619
+ finally {
620
+ try {
621
+ this.clearSessionStoreIfInactive(sessionId, 'runtime_exit');
622
+ }
623
+ finally {
624
+ acpTraceLogger.closeSession(sessionId);
625
+ }
626
+ }
627
+ }
628
+ async recordUnexpectedExitIfNeeded(session, sessionId, exitCode, wasDeliberateStop, runtimeIncarnationId) {
629
+ if (wasDeliberateStop) {
630
+ return;
631
+ }
632
+ await this.lifecycleEventService.record({
633
+ workspaceId: session.workspaceId,
634
+ sessionId,
635
+ kind: SessionLifecycleEventKind.SESSION_STOPPED,
636
+ reason: SessionLifecycleEventReason.UNEXPECTED_EXIT,
637
+ message: exitCode === null
638
+ ? 'Session stopped: agent process exited unexpectedly.'
639
+ : `Session stopped: agent process exited unexpectedly (code ${exitCode}).`,
640
+ dedupeKey: `process-exit:${runtimeIncarnationId}:${exitCode ?? 'signal'}`,
641
+ });
642
+ }
643
+ async cleanupExitedWorkflow(session, sessionId, wasDeliberateStop) {
644
+ if (session.workflow === 'ratchet') {
645
+ await this.persistRatchetTranscript(sessionId);
646
+ await this.repository.deleteSession(sessionId);
647
+ this.sessionDomainService.clearSession(sessionId);
648
+ logger.debug('Deleted transient ratchet ACP session', { sessionId });
649
+ }
650
+ if (session.workflow === 'auto-iteration' &&
651
+ this.autoIterationExitBridge &&
652
+ !wasDeliberateStop) {
653
+ this.autoIterationExitBridge.onAutoIterationSessionExit(session.workspaceId, sessionId);
654
+ }
655
+ }
408
656
  async createAcpClient(sessionId, options, session, permissionPreset, stopGeneration = this.getStopGeneration(sessionId)) {
409
657
  const sessionContext = await this.loadSessionContext(sessionId, session);
410
658
  if (!sessionContext) {
411
659
  throw new Error(`Session context not ready: ${sessionId}`);
412
660
  }
413
661
  this.assertStartupAllowed(sessionId, stopGeneration);
414
- await this.repository.markWorkspaceHasHadSessions(sessionContext.workspaceId);
415
- this.assertStartupAllowed(sessionId, stopGeneration);
662
+ const browseOnly = options?.purpose === 'browse';
663
+ if (!browseOnly) {
664
+ await this.repository.markWorkspaceHasHadSessions(sessionContext.workspaceId);
665
+ this.assertStartupAllowed(sessionId, stopGeneration);
666
+ }
416
667
  this.acpEventProcessor.registerSessionContext(sessionId, {
417
668
  workspaceId: sessionContext.workspaceId,
418
669
  workingDir: sessionContext.workingDir,
419
670
  provider: session?.provider ?? 'CLAUDE',
420
671
  });
421
- const handlers = this.setupAcpEventHandler(sessionId);
672
+ const handlers = this.setupAcpEventHandler(sessionId, {
673
+ persistProviderSessionId: !browseOnly,
674
+ });
422
675
  const shouldSuppressReplay = this.shouldSuppressReplayDuringAcpResume(sessionId, session);
423
676
  this.acpEventProcessor.setReplaySuppression(sessionId, shouldSuppressReplay);
424
677
  const apiPort = String(configService.getBackendPort());
@@ -429,6 +682,7 @@ export class SessionLifecycleService {
429
682
  });
430
683
  const clientOptions = {
431
684
  provider: session?.provider ?? 'CLAUDE',
685
+ purpose: options?.purpose,
432
686
  workingDir: sessionContext.workingDir,
433
687
  model: options?.model ?? sessionContext.model,
434
688
  systemPrompt: sessionContext.systemPrompt,
@@ -449,13 +703,16 @@ export class SessionLifecycleService {
449
703
  try {
450
704
  handle = await creationPromise;
451
705
  this.assertStartupAllowed(sessionId, stopGeneration);
706
+ if (browseOnly) {
707
+ return { handle, dispatchableNotificationCount: 0 };
708
+ }
452
709
  await this.sessionConfigService.applyConfiguredReasoningEffort(sessionId, handle, {
453
710
  persistSnapshot: false,
454
711
  emitUpdates: false,
455
712
  });
456
713
  }
457
714
  catch (error) {
458
- this.acpEventProcessor.clearSessionState(sessionId);
715
+ this.clearAcpSessionStateAfterFailedCreation(sessionId, sessionCreations);
459
716
  throw error;
460
717
  }
461
718
  finally {
@@ -485,6 +742,11 @@ export class SessionLifecycleService {
485
742
  const dispatchableNotificationCount = await this.deliverPendingChildNotifications(sessionId, sessionContext.workspaceId, stopGeneration);
486
743
  return { handle, dispatchableNotificationCount };
487
744
  }
745
+ clearAcpSessionStateAfterFailedCreation(sessionId, sessionCreations) {
746
+ if (sessionCreations.size === 1) {
747
+ this.acpEventProcessor.clearSessionState(sessionId);
748
+ }
749
+ }
488
750
  shouldSuppressReplayDuringAcpResume(sessionId, session) {
489
751
  if (!session?.providerSessionId) {
490
752
  return false;
@@ -581,7 +843,7 @@ export class SessionLifecycleService {
581
843
  return;
582
844
  }
583
845
  try {
584
- await this.persistRatchetTranscript(sessionId, session);
846
+ await this.persistRatchetTranscript(sessionId);
585
847
  await this.repository.deleteSession(sessionId);
586
848
  this.sessionDomainService.clearSession(sessionId);
587
849
  logger.debug('Deleted transient ratchet session after stop', { sessionId });
@@ -617,20 +879,26 @@ export class SessionLifecycleService {
617
879
  this.sessionDomainService.clearSession(sessionId, { preserveRejections: true });
618
880
  logger.debug('Cleared inactive in-memory session state', { sessionId, reason });
619
881
  }
620
- async persistRatchetTranscript(sessionId, session) {
621
- if (!this.workspaceBridge) {
622
- logger.warn('Cannot persist ratchet transcript: no workspace bridge', { sessionId });
882
+ async persistClosedSession(sessionId) {
883
+ const session = await this.repository.getSessionById(sessionId);
884
+ if (!session) {
885
+ logger.warn('Cannot persist closed session: session not found', { sessionId });
623
886
  return;
624
887
  }
625
- const transcript = this.sessionDomainService.getTranscriptSnapshot(sessionId);
626
888
  const workspace = await workspaceDataService.findById(session.workspaceId);
627
889
  if (!workspace?.worktreePath) {
628
- logger.warn('Cannot persist ratchet transcript: no worktree path', {
890
+ logger.warn('Cannot persist closed session: no worktree path', {
629
891
  sessionId,
630
892
  workspaceId: session.workspaceId,
631
893
  });
632
894
  return;
633
895
  }
896
+ await this.hydrateProviderHistory(sessionId, {
897
+ ...session,
898
+ workspace: { worktreePath: workspace.worktreePath },
899
+ });
900
+ await this.lifecycleEventService.hydrate(sessionId);
901
+ const transcript = this.sessionDomainService.getTranscriptSnapshot(sessionId);
634
902
  await closedSessionPersistenceService.persistClosedSession({
635
903
  sessionId,
636
904
  workspaceId: session.workspaceId,
@@ -643,6 +911,9 @@ export class SessionLifecycleService {
643
911
  messages: transcript,
644
912
  });
645
913
  }
914
+ async persistRatchetTranscript(sessionId) {
915
+ await this.persistClosedSession(sessionId);
916
+ }
646
917
  async getOrCreateAcpSessionClient(sessionId, options, session, stopGeneration) {
647
918
  this.assertStartupAllowed(sessionId, stopGeneration);
648
919
  const existingAcp = this.runtimeManager.getClient(sessionId);