factory-factory 0.3.7 → 0.3.9

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 (553) hide show
  1. package/dist/client/assets/{_basePickBy-BsuMuaCZ.js → _basePickBy-CoLLbaiQ.js} +1 -1
  2. package/dist/client/assets/{_baseUniq-BDd8f52s.js → _baseUniq-xRgxfXUW.js} +1 -1
  3. package/dist/client/assets/{arc-BWbaJQoA.js → arc-De4Ny3V9.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-VXUJARFQ-C_FQG3JS.js → architectureDiagram-VXUJARFQ-DM0j158z.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-VD42YOAC-CLwvH-wA.js → blockDiagram-VD42YOAC-DKBZN-sz.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-YG6GDRKO-Ba80_haP.js → c4Diagram-YG6GDRKO-CIA6AVRp.js} +1 -1
  7. package/dist/client/assets/channel-DW2o9xrZ.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-CSlDSMiy.js → chunk-4BX2VUAB-BrHsCtgI.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-Dm3keBAf.js → chunk-55IACEB6-DLwlJB2L.js} +1 -1
  10. package/dist/client/assets/{chunk-B4BG7PRW-BSrvNYuP.js → chunk-B4BG7PRW-cqTY9ldj.js} +1 -1
  11. package/dist/client/assets/{chunk-DI55MBZ5-DFQPoLQZ.js → chunk-DI55MBZ5-PAp7fYLU.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-C1KS438H.js → chunk-FMBD7UC4-CsvpScij.js} +1 -1
  13. package/dist/client/assets/{chunk-QN33PNHL-4rPPxHo4.js → chunk-QN33PNHL-DmkkCoc-.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-B_sF5IzV.js → chunk-QZHKN3VN-Ds5Tjlpo.js} +1 -1
  15. package/dist/client/assets/{chunk-TZMSLE5B-L-qbjoBp.js → chunk-TZMSLE5B-4Gu0uKkR.js} +1 -1
  16. package/dist/client/assets/classDiagram-2ON5EDUG-CUeZuC6S.js +1 -0
  17. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CUeZuC6S.js +1 -0
  18. package/dist/client/assets/clone-Df9JDgIw.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-S5V4N54A-DB7lwAnl.js → cose-bilkent-S5V4N54A-CQJ_MgcD.js} +1 -1
  20. package/dist/client/assets/{dagre-6UL2VRFP-z2fl_1iD.js → dagre-6UL2VRFP-CfyncTju.js} +1 -1
  21. package/dist/client/assets/{diagram-PSM6KHXK-BL2iv8II.js → diagram-PSM6KHXK-BL2QA0bQ.js} +1 -1
  22. package/dist/client/assets/{diagram-QEK2KX5R-DgMZW0D1.js → diagram-QEK2KX5R-BDcBrJO4.js} +1 -1
  23. package/dist/client/assets/{diagram-S2PKOQOG-Ct2QBl2c.js → diagram-S2PKOQOG-BxofoMik.js} +1 -1
  24. package/dist/client/assets/{erDiagram-Q2GNP2WA-DII-pqkb.js → erDiagram-Q2GNP2WA-CDGe-bUA.js} +1 -1
  25. package/dist/client/assets/{flowDiagram-NV44I4VS-BV4CMZAZ.js → flowDiagram-NV44I4VS-CodDw20I.js} +1 -1
  26. package/dist/client/assets/{ganttDiagram-JELNMOA3-Dfj064tE.js → ganttDiagram-JELNMOA3-BHJlNcF5.js} +1 -1
  27. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-Cg2b-j3t.js → gitGraphDiagram-V2S2FVAM-DsFPFnxn.js} +1 -1
  28. package/dist/client/assets/{graph-wzICjOO_.js → graph-DtyTGYVa.js} +1 -1
  29. package/dist/client/assets/index-BkwQogmx.css +1 -0
  30. package/dist/client/assets/index-CSanKe06.js +436 -0
  31. package/dist/client/assets/{infoDiagram-HS3SLOUP-D09mbfgG.js → infoDiagram-HS3SLOUP-CczckdeY.js} +1 -1
  32. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-BebsQbuf.js → journeyDiagram-XKPGCS4Q-CIDlGmYi.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-3W4ZIXB7-DOuawTNU.js → kanban-definition-3W4ZIXB7-Dvuu9eqr.js} +1 -1
  34. package/dist/client/assets/{layout-Bj6cMfF5.js → layout-Cth5sJm6.js} +1 -1
  35. package/dist/client/assets/{linear-B58HS9F4.js → linear-DRv-Y17x.js} +1 -1
  36. package/dist/client/assets/{mindmap-definition-VGOIOE7T-hSFgcTL2.js → mindmap-definition-VGOIOE7T-AXsc24V4.js} +1 -1
  37. package/dist/client/assets/{mobile-baseline-CmdjqYSm.js → mobile-baseline-DXBPdrir.js} +1 -1
  38. package/dist/client/assets/{pieDiagram-ADFJNKIX-D1vkoKs3.js → pieDiagram-ADFJNKIX-oIn8Bgi4.js} +1 -1
  39. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-pMQj9xcS.js → quadrantDiagram-AYHSOK5B-rGTqNh3q.js} +1 -1
  40. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-DvRtxnIi.js → requirementDiagram-UZGBJVZJ-DgE2dYES.js} +1 -1
  41. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-BWoDxXkR.js → sankeyDiagram-TZEHDZUN-BWRLa217.js} +1 -1
  42. package/dist/client/assets/{sequenceDiagram-WL72ISMW-Dz5i1ly3.js → sequenceDiagram-WL72ISMW-lYEkh9VX.js} +1 -1
  43. package/dist/client/assets/{stateDiagram-FKZM4ZOC-BFd_gXUo.js → stateDiagram-FKZM4ZOC-CV9VCuVK.js} +1 -1
  44. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DQ10FejB.js +1 -0
  45. package/dist/client/assets/{terminal-instance-BTIzq32H.js → terminal-instance-C3nwiweh.js} +1 -1
  46. package/dist/client/assets/{timeline-definition-IT6M3QCI-BFEIWW6m.js → timeline-definition-IT6M3QCI-Bzm_qoWF.js} +1 -1
  47. package/dist/client/assets/{treemap-GDKQZRPO-CC2Fh6RQ.js → treemap-GDKQZRPO-gouxKMUq.js} +1 -1
  48. package/dist/client/assets/{xychartDiagram-PRI3JC2R-DFygXQrm.js → xychartDiagram-PRI3JC2R-DqSTMw-l.js} +1 -1
  49. package/dist/client/index.html +2 -2
  50. package/dist/prisma/generated/enums.d.ts +1 -0
  51. package/dist/prisma/generated/enums.d.ts.map +1 -1
  52. package/dist/prisma/generated/enums.js +1 -0
  53. package/dist/prisma/generated/enums.js.map +1 -1
  54. package/dist/prisma/generated/internal/class.js +4 -4
  55. package/dist/prisma/generated/internal/class.js.map +1 -1
  56. package/dist/prisma/generated/internal/prismaNamespace.d.ts +1 -0
  57. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  58. package/dist/prisma/generated/internal/prismaNamespace.js +1 -0
  59. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  60. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +1 -0
  61. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  62. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +1 -0
  63. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  64. package/dist/prisma/generated/models/Workspace.d.ts +44 -1
  65. package/dist/prisma/generated/models/Workspace.d.ts.map +1 -1
  66. package/dist/src/backend/app-context.d.ts +2 -1
  67. package/dist/src/backend/app-context.d.ts.map +1 -1
  68. package/dist/src/backend/app-context.js +22 -5
  69. package/dist/src/backend/app-context.js.map +1 -1
  70. package/dist/src/backend/domains/github/github-cli/mappers.d.ts +1 -1
  71. package/dist/src/backend/domains/github/github-cli/mappers.d.ts.map +1 -1
  72. package/dist/src/backend/domains/github/github-cli/mappers.js +2 -37
  73. package/dist/src/backend/domains/github/github-cli/mappers.js.map +1 -1
  74. package/dist/src/backend/domains/github/github-cli.service.test.js +20 -0
  75. package/dist/src/backend/domains/github/github-cli.service.test.js.map +1 -1
  76. package/dist/src/backend/domains/linear/linear-state-sync.service.d.ts.map +1 -1
  77. package/dist/src/backend/domains/linear/linear-state-sync.service.js.map +1 -1
  78. package/dist/src/backend/domains/ratchet/bridges.d.ts +4 -0
  79. package/dist/src/backend/domains/ratchet/bridges.d.ts.map +1 -1
  80. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.d.ts +15 -0
  81. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.d.ts.map +1 -0
  82. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.js +126 -0
  83. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.js.map +1 -0
  84. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.d.ts +14 -0
  85. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.d.ts.map +1 -0
  86. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.js +55 -0
  87. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.js.map +1 -0
  88. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.d.ts +107 -0
  89. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.d.ts.map +1 -0
  90. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.js +246 -0
  91. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.js.map +1 -0
  92. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.d.ts +16 -0
  93. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.d.ts.map +1 -0
  94. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.js +52 -0
  95. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.js.map +1 -0
  96. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts +6 -40
  97. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts.map +1 -1
  98. package/dist/src/backend/domains/ratchet/ratchet.service.js +99 -426
  99. package/dist/src/backend/domains/ratchet/ratchet.service.js.map +1 -1
  100. package/dist/src/backend/domains/ratchet/ratchet.types.d.ts +86 -0
  101. package/dist/src/backend/domains/ratchet/ratchet.types.d.ts.map +1 -0
  102. package/dist/src/backend/domains/ratchet/ratchet.types.js +2 -0
  103. package/dist/src/backend/domains/ratchet/ratchet.types.js.map +1 -0
  104. package/dist/src/backend/domains/ratchet/reconciliation.service.d.ts.map +1 -1
  105. package/dist/src/backend/domains/ratchet/reconciliation.service.js +1 -2
  106. package/dist/src/backend/domains/ratchet/reconciliation.service.js.map +1 -1
  107. package/dist/src/backend/domains/ratchet/reconciliation.service.test.js +8 -10
  108. package/dist/src/backend/domains/ratchet/reconciliation.service.test.js.map +1 -1
  109. package/dist/src/backend/domains/run-script/index.d.ts +1 -1
  110. package/dist/src/backend/domains/run-script/index.d.ts.map +1 -1
  111. package/dist/src/backend/domains/run-script/index.js +1 -1
  112. package/dist/src/backend/domains/run-script/index.js.map +1 -1
  113. package/dist/src/backend/domains/run-script/run-script-domain-exports.test.js +5 -4
  114. package/dist/src/backend/domains/run-script/run-script-domain-exports.test.js.map +1 -1
  115. package/dist/src/backend/domains/run-script/run-script.service.d.ts +13 -1
  116. package/dist/src/backend/domains/run-script/run-script.service.d.ts.map +1 -1
  117. package/dist/src/backend/domains/run-script/run-script.service.js +175 -10
  118. package/dist/src/backend/domains/run-script/run-script.service.js.map +1 -1
  119. package/dist/src/backend/domains/run-script/run-script.service.test.js +204 -0
  120. package/dist/src/backend/domains/run-script/run-script.service.test.js.map +1 -1
  121. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts +13 -1
  122. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts.map +1 -1
  123. package/dist/src/backend/domains/session/acp/acp-event-translator.js +86 -1
  124. package/dist/src/backend/domains/session/acp/acp-event-translator.js.map +1 -1
  125. package/dist/src/backend/domains/session/acp/acp-event-translator.test.js +39 -0
  126. package/dist/src/backend/domains/session/acp/acp-event-translator.test.js.map +1 -1
  127. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts +5 -0
  128. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts.map +1 -1
  129. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js +16 -13
  130. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js.map +1 -1
  131. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js +3 -12
  132. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js.map +1 -1
  133. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.d.ts +24 -0
  134. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.d.ts.map +1 -0
  135. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.js +79 -0
  136. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.js.map +1 -0
  137. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.d.ts +97 -0
  138. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.d.ts.map +1 -0
  139. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.js +2 -0
  140. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.js.map +1 -0
  141. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +17 -39
  142. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
  143. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +109 -1694
  144. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
  145. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +0 -191
  146. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -1
  147. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts +3 -3
  148. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.d.ts +16 -0
  149. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.d.ts.map +1 -0
  150. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.js +292 -0
  151. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.js.map +1 -0
  152. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.d.ts +2 -0
  153. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.d.ts.map +1 -0
  154. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.js +56 -0
  155. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.js.map +1 -0
  156. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.d.ts +19 -0
  157. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.d.ts.map +1 -0
  158. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.js +369 -0
  159. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.js.map +1 -0
  160. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.d.ts +2 -0
  161. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.d.ts.map +1 -0
  162. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.js +91 -0
  163. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.js.map +1 -0
  164. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.d.ts +16 -0
  165. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.d.ts.map +1 -0
  166. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.js +53 -0
  167. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.js.map +1 -0
  168. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.d.ts +20 -0
  169. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.d.ts.map +1 -0
  170. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.js +341 -0
  171. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.js.map +1 -0
  172. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.d.ts +41 -0
  173. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.d.ts.map +1 -0
  174. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.js +137 -0
  175. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.js.map +1 -0
  176. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.d.ts +25 -0
  177. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.d.ts.map +1 -0
  178. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.js +47 -0
  179. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.js.map +1 -0
  180. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.d.ts +8 -0
  181. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.d.ts.map +1 -0
  182. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.js +37 -0
  183. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.js.map +1 -0
  184. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.d.ts +53 -0
  185. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.d.ts.map +1 -0
  186. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.js +419 -0
  187. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.js.map +1 -0
  188. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.d.ts +2 -0
  189. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.d.ts.map +1 -0
  190. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.js +95 -0
  191. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.js.map +1 -0
  192. package/dist/src/backend/domains/session/acp/index.d.ts +1 -1
  193. package/dist/src/backend/domains/session/acp/index.d.ts.map +1 -1
  194. package/dist/src/backend/domains/session/acp/index.js +1 -1
  195. package/dist/src/backend/domains/session/acp/index.js.map +1 -1
  196. package/dist/src/backend/domains/session/bridges.d.ts +5 -0
  197. package/dist/src/backend/domains/session/bridges.d.ts.map +1 -1
  198. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.d.ts.map +1 -1
  199. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.js +2 -2
  200. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.js.map +1 -1
  201. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.test.js +1 -1
  202. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.test.js.map +1 -1
  203. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js +2 -2
  204. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js.map +1 -1
  205. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts.map +1 -1
  206. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js +77 -24
  207. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js.map +1 -1
  208. package/dist/src/backend/domains/session/data/session-data.service.d.ts +2 -0
  209. package/dist/src/backend/domains/session/data/session-data.service.d.ts.map +1 -1
  210. package/dist/src/backend/domains/session/data/{claude-session-history-loader.service.d.ts → session-history-loader.service.d.ts} +1 -1
  211. package/dist/src/backend/domains/session/data/session-history-loader.service.d.ts.map +1 -0
  212. package/dist/src/backend/domains/session/data/{claude-session-history-loader.service.js → session-history-loader.service.js} +23 -9
  213. package/dist/src/backend/domains/session/data/session-history-loader.service.js.map +1 -0
  214. package/dist/src/backend/domains/session/data/session-history-loader.service.test.d.ts +2 -0
  215. package/dist/src/backend/domains/session/data/session-history-loader.service.test.d.ts.map +1 -0
  216. package/dist/src/backend/domains/session/data/{claude-session-history-loader.service.test.js → session-history-loader.service.test.js} +6 -3
  217. package/dist/src/backend/domains/session/data/session-history-loader.service.test.js.map +1 -0
  218. package/dist/src/backend/domains/session/index.d.ts +3 -1
  219. package/dist/src/backend/domains/session/index.d.ts.map +1 -1
  220. package/dist/src/backend/domains/session/index.js +2 -1
  221. package/dist/src/backend/domains/session/index.js.map +1 -1
  222. package/dist/src/backend/domains/session/interceptor.bridge.d.ts +8 -0
  223. package/dist/src/backend/domains/session/interceptor.bridge.d.ts.map +1 -0
  224. package/dist/src/backend/domains/session/interceptor.bridge.js +7 -0
  225. package/dist/src/backend/domains/session/interceptor.bridge.js.map +1 -0
  226. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.d.ts +71 -0
  227. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.d.ts.map +1 -0
  228. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.js +404 -0
  229. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.js.map +1 -0
  230. package/dist/src/backend/domains/session/lifecycle/session.config.service.d.ts +59 -0
  231. package/dist/src/backend/domains/session/lifecycle/session.config.service.d.ts.map +1 -0
  232. package/dist/src/backend/domains/session/lifecycle/session.config.service.js +635 -0
  233. package/dist/src/backend/domains/session/lifecycle/session.config.service.js.map +1 -0
  234. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.d.ts +2 -0
  235. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.d.ts.map +1 -0
  236. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.js +552 -0
  237. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.js.map +1 -0
  238. package/dist/src/backend/domains/session/lifecycle/session.permission.service.d.ts +17 -0
  239. package/dist/src/backend/domains/session/lifecycle/session.permission.service.d.ts.map +1 -0
  240. package/dist/src/backend/domains/session/lifecycle/session.permission.service.js +86 -0
  241. package/dist/src/backend/domains/session/lifecycle/session.permission.service.js.map +1 -0
  242. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.d.ts +2 -0
  243. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.d.ts.map +1 -0
  244. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.js +137 -0
  245. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.js.map +1 -0
  246. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts +0 -2
  247. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts.map +1 -1
  248. package/dist/src/backend/domains/session/lifecycle/session.repository.js +0 -3
  249. package/dist/src/backend/domains/session/lifecycle/session.repository.js.map +1 -1
  250. package/dist/src/backend/domains/session/lifecycle/session.repository.test.js +0 -1
  251. package/dist/src/backend/domains/session/lifecycle/session.repository.test.js.map +1 -1
  252. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts +24 -56
  253. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts.map +1 -1
  254. package/dist/src/backend/domains/session/lifecycle/session.service.js +140 -1083
  255. package/dist/src/backend/domains/session/lifecycle/session.service.js.map +1 -1
  256. package/dist/src/backend/domains/session/lifecycle/session.service.test.js +62 -689
  257. package/dist/src/backend/domains/session/lifecycle/session.service.test.js.map +1 -1
  258. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.d.ts.map +1 -1
  259. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.js +2 -13
  260. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.js.map +1 -1
  261. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.test.js +15 -3
  262. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.test.js.map +1 -1
  263. package/dist/src/backend/domains/session/logging/session-file-logger.service.js +1 -1
  264. package/dist/src/backend/domains/session/logging/session-file-logger.service.js.map +1 -1
  265. package/dist/src/backend/domains/session/logging/session-file-logger.service.test.js +3 -0
  266. package/dist/src/backend/domains/session/logging/session-file-logger.service.test.js.map +1 -1
  267. package/dist/src/backend/domains/session/session-domain.service.d.ts +1 -2
  268. package/dist/src/backend/domains/session/session-domain.service.d.ts.map +1 -1
  269. package/dist/src/backend/domains/session/session-domain.service.js +21 -2
  270. package/dist/src/backend/domains/session/session-domain.service.js.map +1 -1
  271. package/dist/src/backend/domains/session/session-domain.service.test.js +34 -0
  272. package/dist/src/backend/domains/session/session-domain.service.test.js.map +1 -1
  273. package/dist/src/backend/domains/session/store/file-lock.service.d.ts.map +1 -1
  274. package/dist/src/backend/domains/session/store/file-lock.service.js +25 -6
  275. package/dist/src/backend/domains/session/store/file-lock.service.js.map +1 -1
  276. package/dist/src/backend/domains/session/store/file-lock.service.test.js +3 -0
  277. package/dist/src/backend/domains/session/store/file-lock.service.test.js.map +1 -1
  278. package/dist/src/backend/domains/session/zod-issue-summary.d.ts +3 -0
  279. package/dist/src/backend/domains/session/zod-issue-summary.d.ts.map +1 -0
  280. package/dist/src/backend/domains/session/zod-issue-summary.js +7 -0
  281. package/dist/src/backend/domains/session/zod-issue-summary.js.map +1 -0
  282. package/dist/src/backend/domains/workspace/index.d.ts +0 -1
  283. package/dist/src/backend/domains/workspace/index.d.ts.map +1 -1
  284. package/dist/src/backend/domains/workspace/index.js +0 -1
  285. package/dist/src/backend/domains/workspace/index.js.map +1 -1
  286. package/dist/src/backend/domains/workspace/lifecycle/creation.service.d.ts +7 -0
  287. package/dist/src/backend/domains/workspace/lifecycle/creation.service.d.ts.map +1 -1
  288. package/dist/src/backend/domains/workspace/lifecycle/creation.service.js +98 -85
  289. package/dist/src/backend/domains/workspace/lifecycle/creation.service.js.map +1 -1
  290. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js +41 -1
  291. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js.map +1 -1
  292. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts +9 -1
  293. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts.map +1 -1
  294. package/dist/src/backend/domains/workspace/lifecycle/data.service.js +2 -1
  295. package/dist/src/backend/domains/workspace/lifecycle/data.service.js.map +1 -1
  296. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.d.ts +8 -0
  297. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.d.ts.map +1 -1
  298. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.js +47 -5
  299. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.js.map +1 -1
  300. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.test.js +117 -22
  301. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.test.js.map +1 -1
  302. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts +2 -0
  303. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts.map +1 -1
  304. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts +4 -1
  305. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts.map +1 -1
  306. package/dist/src/backend/domains/workspace/query/workspace-query.service.js +51 -36
  307. package/dist/src/backend/domains/workspace/query/workspace-query.service.js.map +1 -1
  308. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js +141 -44
  309. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js.map +1 -1
  310. package/dist/src/backend/domains/workspace/state/flow-state.d.ts +2 -2
  311. package/dist/src/backend/domains/workspace/state/flow-state.d.ts.map +1 -1
  312. package/dist/src/backend/domains/workspace/state/flow-state.js.map +1 -1
  313. package/dist/src/backend/domains/workspace/state/init-policy.js +1 -1
  314. package/dist/src/backend/domains/workspace/state/init-policy.js.map +1 -1
  315. package/dist/src/backend/domains/workspace/state/kanban-state.d.ts +2 -1
  316. package/dist/src/backend/domains/workspace/state/kanban-state.d.ts.map +1 -1
  317. package/dist/src/backend/domains/workspace/state/kanban-state.js +9 -5
  318. package/dist/src/backend/domains/workspace/state/kanban-state.js.map +1 -1
  319. package/dist/src/backend/domains/workspace/state/kanban-state.test.js +23 -0
  320. package/dist/src/backend/domains/workspace/state/kanban-state.test.js.map +1 -1
  321. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.d.ts +3 -6
  322. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.d.ts.map +1 -1
  323. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.js +7 -116
  324. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.js.map +1 -1
  325. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.test.js +38 -65
  326. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.test.js.map +1 -1
  327. package/dist/src/backend/interceptors/conversation-rename.interceptor.d.ts.map +1 -1
  328. package/dist/src/backend/interceptors/conversation-rename.interceptor.js +22 -6
  329. package/dist/src/backend/interceptors/conversation-rename.interceptor.js.map +1 -1
  330. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js +25 -13
  331. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js.map +1 -1
  332. package/dist/src/backend/interceptors/index.d.ts +2 -0
  333. package/dist/src/backend/interceptors/index.d.ts.map +1 -1
  334. package/dist/src/backend/interceptors/index.js +6 -0
  335. package/dist/src/backend/interceptors/index.js.map +1 -1
  336. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.d.ts.map +1 -1
  337. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.js +8 -0
  338. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.js.map +1 -1
  339. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.js +5 -1
  340. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.js.map +1 -1
  341. package/dist/src/backend/interceptors/pre-push-rename.interceptor.d.ts.map +1 -1
  342. package/dist/src/backend/interceptors/pre-push-rename.interceptor.js +3 -0
  343. package/dist/src/backend/interceptors/pre-push-rename.interceptor.js.map +1 -1
  344. package/dist/src/backend/interceptors/registry.d.ts +5 -0
  345. package/dist/src/backend/interceptors/registry.d.ts.map +1 -1
  346. package/dist/src/backend/interceptors/registry.js +51 -0
  347. package/dist/src/backend/interceptors/registry.js.map +1 -1
  348. package/dist/src/backend/interceptors/types.d.ts +2 -0
  349. package/dist/src/backend/interceptors/types.d.ts.map +1 -1
  350. package/dist/src/backend/lib/file-helpers.d.ts +2 -0
  351. package/dist/src/backend/lib/file-helpers.d.ts.map +1 -1
  352. package/dist/src/backend/lib/file-helpers.js +64 -1
  353. package/dist/src/backend/lib/file-helpers.js.map +1 -1
  354. package/dist/src/backend/lib/workspace-derived-state.d.ts +47 -0
  355. package/dist/src/backend/lib/workspace-derived-state.d.ts.map +1 -0
  356. package/dist/src/backend/lib/workspace-derived-state.js +31 -0
  357. package/dist/src/backend/lib/workspace-derived-state.js.map +1 -0
  358. package/dist/src/backend/lib/workspace-derived-state.test.d.ts +2 -0
  359. package/dist/src/backend/lib/workspace-derived-state.test.d.ts.map +1 -0
  360. package/dist/src/backend/lib/workspace-derived-state.test.js +66 -0
  361. package/dist/src/backend/lib/workspace-derived-state.test.js.map +1 -0
  362. package/dist/src/backend/middleware/cors.middleware.d.ts +1 -2
  363. package/dist/src/backend/middleware/cors.middleware.d.ts.map +1 -1
  364. package/dist/src/backend/middleware/cors.middleware.js +0 -2
  365. package/dist/src/backend/middleware/cors.middleware.js.map +1 -1
  366. package/dist/src/backend/middleware/index.d.ts +1 -1
  367. package/dist/src/backend/middleware/index.d.ts.map +1 -1
  368. package/dist/src/backend/middleware/index.js +1 -1
  369. package/dist/src/backend/middleware/index.js.map +1 -1
  370. package/dist/src/backend/orchestration/data-backup.service.test.js +1 -0
  371. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  372. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts +26 -1
  373. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
  374. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +24 -1
  375. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
  376. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js +19 -1
  377. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js.map +1 -1
  378. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts +8 -1
  379. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
  380. package/dist/src/backend/orchestration/event-collector.orchestrator.js +41 -21
  381. package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
  382. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js +19 -4
  383. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js.map +1 -1
  384. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts +6 -2
  385. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts.map +1 -1
  386. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js +8 -3
  387. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js.map +1 -1
  388. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +19 -1
  389. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  390. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +21 -13
  391. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
  392. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +103 -77
  393. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
  394. package/dist/src/backend/orchestration/workspace-init-script-pipeline.d.ts +18 -0
  395. package/dist/src/backend/orchestration/workspace-init-script-pipeline.d.ts.map +1 -0
  396. package/dist/src/backend/orchestration/workspace-init-script-pipeline.js +75 -0
  397. package/dist/src/backend/orchestration/workspace-init-script-pipeline.js.map +1 -0
  398. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  399. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +105 -106
  400. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  401. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +137 -18
  402. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js.map +1 -1
  403. package/dist/src/backend/resource_accessors/project.accessor.js +1 -1
  404. package/dist/src/backend/resource_accessors/project.accessor.js.map +1 -1
  405. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +1 -0
  406. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -1
  407. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -1
  408. package/dist/src/backend/routers/websocket/index.d.ts +1 -0
  409. package/dist/src/backend/routers/websocket/index.d.ts.map +1 -1
  410. package/dist/src/backend/routers/websocket/index.js +1 -0
  411. package/dist/src/backend/routers/websocket/index.js.map +1 -1
  412. package/dist/src/backend/routers/websocket/post-run-logs.handler.d.ts +9 -0
  413. package/dist/src/backend/routers/websocket/post-run-logs.handler.d.ts.map +1 -0
  414. package/dist/src/backend/routers/websocket/post-run-logs.handler.js +52 -0
  415. package/dist/src/backend/routers/websocket/post-run-logs.handler.js.map +1 -0
  416. package/dist/src/backend/routers/websocket/snapshots.handler.d.ts.map +1 -1
  417. package/dist/src/backend/routers/websocket/snapshots.handler.js +17 -6
  418. package/dist/src/backend/routers/websocket/snapshots.handler.js.map +1 -1
  419. package/dist/src/backend/routers/websocket/snapshots.handler.test.js +40 -5
  420. package/dist/src/backend/routers/websocket/snapshots.handler.test.js.map +1 -1
  421. package/dist/src/backend/routers/websocket/websocket.integration.test.js +1 -0
  422. package/dist/src/backend/routers/websocket/websocket.integration.test.js.map +1 -1
  423. package/dist/src/backend/server.d.ts.map +1 -1
  424. package/dist/src/backend/server.js +16 -6
  425. package/dist/src/backend/server.js.map +1 -1
  426. package/dist/src/backend/server.upgrade.test.js +4 -0
  427. package/dist/src/backend/server.upgrade.test.js.map +1 -1
  428. package/dist/src/backend/services/check-single-writer.test.d.ts +2 -0
  429. package/dist/src/backend/services/check-single-writer.test.d.ts.map +1 -0
  430. package/dist/src/backend/services/check-single-writer.test.js +132 -0
  431. package/dist/src/backend/services/check-single-writer.test.js.map +1 -0
  432. package/dist/src/backend/services/config.service.d.ts +14 -6
  433. package/dist/src/backend/services/config.service.d.ts.map +1 -1
  434. package/dist/src/backend/services/config.service.js +31 -9
  435. package/dist/src/backend/services/config.service.js.map +1 -1
  436. package/dist/src/backend/services/env-schemas.d.ts +7 -3
  437. package/dist/src/backend/services/env-schemas.d.ts.map +1 -1
  438. package/dist/src/backend/services/env-schemas.js +19 -3
  439. package/dist/src/backend/services/env-schemas.js.map +1 -1
  440. package/dist/src/backend/services/run-script-config-persistence.service.d.ts +37 -0
  441. package/dist/src/backend/services/run-script-config-persistence.service.d.ts.map +1 -0
  442. package/dist/src/backend/services/run-script-config-persistence.service.js +73 -0
  443. package/dist/src/backend/services/run-script-config-persistence.service.js.map +1 -0
  444. package/dist/src/backend/services/run-script-config-persistence.service.test.d.ts +2 -0
  445. package/dist/src/backend/services/run-script-config-persistence.service.test.d.ts.map +1 -0
  446. package/dist/src/backend/services/run-script-config-persistence.service.test.js +111 -0
  447. package/dist/src/backend/services/run-script-config-persistence.service.test.js.map +1 -0
  448. package/dist/src/backend/services/run-script-proxy.service.d.ts.map +1 -1
  449. package/dist/src/backend/services/run-script-proxy.service.js +2 -1
  450. package/dist/src/backend/services/run-script-proxy.service.js.map +1 -1
  451. package/dist/src/backend/services/run-script-proxy.service.test.js +4 -0
  452. package/dist/src/backend/services/run-script-proxy.service.test.js.map +1 -1
  453. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts +5 -3
  454. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts.map +1 -1
  455. package/dist/src/backend/services/workspace-snapshot-store.service.js +20 -15
  456. package/dist/src/backend/services/workspace-snapshot-store.service.js.map +1 -1
  457. package/dist/src/backend/services/workspace-snapshot-store.service.test.js +3 -0
  458. package/dist/src/backend/services/workspace-snapshot-store.service.test.js.map +1 -1
  459. package/dist/src/backend/trpc/admin.router.test.js +0 -2
  460. package/dist/src/backend/trpc/admin.router.test.js.map +1 -1
  461. package/dist/src/backend/trpc/admin.trpc.d.ts +2 -7
  462. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  463. package/dist/src/backend/trpc/admin.trpc.js +2 -3
  464. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  465. package/dist/src/backend/trpc/index.d.ts +49 -14
  466. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  467. package/dist/src/backend/trpc/project.trpc.d.ts +17 -3
  468. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  469. package/dist/src/backend/trpc/project.trpc.js +22 -0
  470. package/dist/src/backend/trpc/project.trpc.js.map +1 -1
  471. package/dist/src/backend/trpc/session.router.test.js +1 -0
  472. package/dist/src/backend/trpc/session.router.test.js.map +1 -1
  473. package/dist/src/backend/trpc/session.trpc.d.ts +4 -0
  474. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  475. package/dist/src/backend/trpc/session.trpc.js +2 -2
  476. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  477. package/dist/src/backend/trpc/workspace/files.trpc.d.ts.map +1 -1
  478. package/dist/src/backend/trpc/workspace/files.trpc.js +1 -64
  479. package/dist/src/backend/trpc/workspace/files.trpc.js.map +1 -1
  480. package/dist/src/backend/trpc/workspace/init.router.test.js +1 -1
  481. package/dist/src/backend/trpc/workspace/init.router.test.js.map +1 -1
  482. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +1 -0
  483. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  484. package/dist/src/backend/trpc/workspace/init.trpc.js +2 -3
  485. package/dist/src/backend/trpc/workspace/init.trpc.js.map +1 -1
  486. package/dist/src/backend/trpc/workspace/run-script.router.test.js +31 -4
  487. package/dist/src/backend/trpc/workspace/run-script.router.test.js.map +1 -1
  488. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts +2 -0
  489. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts.map +1 -1
  490. package/dist/src/backend/trpc/workspace/run-script.trpc.js +8 -8
  491. package/dist/src/backend/trpc/workspace/run-script.trpc.js.map +1 -1
  492. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +2 -0
  493. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  494. package/dist/src/backend/trpc/workspace.router.test.js +45 -1
  495. package/dist/src/backend/trpc/workspace.router.test.js.map +1 -1
  496. package/dist/src/backend/trpc/workspace.trpc.d.ts +26 -4
  497. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  498. package/dist/src/backend/trpc/workspace.trpc.js +25 -16
  499. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  500. package/dist/src/cli/index.js +17 -5
  501. package/dist/src/cli/index.js.map +1 -1
  502. package/dist/src/shared/core/ci-status.d.ts +6 -4
  503. package/dist/src/shared/core/ci-status.d.ts.map +1 -1
  504. package/dist/src/shared/core/ci-status.js +47 -13
  505. package/dist/src/shared/core/ci-status.js.map +1 -1
  506. package/dist/src/shared/core/enums.d.ts +1 -0
  507. package/dist/src/shared/core/enums.d.ts.map +1 -1
  508. package/dist/src/shared/core/enums.js +1 -0
  509. package/dist/src/shared/core/enums.js.map +1 -1
  510. package/dist/src/shared/core/index.d.ts +1 -1
  511. package/dist/src/shared/core/index.d.ts.map +1 -1
  512. package/dist/src/shared/core/index.js +1 -1
  513. package/dist/src/shared/core/index.js.map +1 -1
  514. package/dist/src/shared/schemas/export-data.schema.d.ts +2 -0
  515. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  516. package/dist/src/shared/schemas/factory-config.schema.d.ts +1 -0
  517. package/dist/src/shared/schemas/factory-config.schema.d.ts.map +1 -1
  518. package/dist/src/shared/schemas/factory-config.schema.js +1 -0
  519. package/dist/src/shared/schemas/factory-config.schema.js.map +1 -1
  520. package/dist/src/shared/schemas/issue-tracker-config.schema.d.ts +2 -2
  521. package/dist/src/shared/schemas/persisted-stores.schema.d.ts +0 -2
  522. package/dist/src/shared/schemas/persisted-stores.schema.d.ts.map +1 -1
  523. package/dist/src/shared/schemas/persisted-stores.schema.js +0 -1
  524. package/dist/src/shared/schemas/persisted-stores.schema.js.map +1 -1
  525. package/dist/src/shared/workspace-flow-state.d.ts +3 -0
  526. package/dist/src/shared/workspace-flow-state.d.ts.map +1 -0
  527. package/dist/src/shared/workspace-flow-state.js +2 -0
  528. package/dist/src/shared/workspace-flow-state.js.map +1 -0
  529. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  530. package/package.json +1 -1
  531. package/prisma/migrations/20260222120000_add_post_run_command/migration.sql +1 -0
  532. package/prisma/migrations/20260224150000_add_workspace_archiving_state/migration.sql +4 -0
  533. package/prisma/schema.prisma +2 -0
  534. package/dist/client/assets/channel-B2z94T-9.js +0 -1
  535. package/dist/client/assets/classDiagram-2ON5EDUG-B2LoFG_o.js +0 -1
  536. package/dist/client/assets/classDiagram-v2-WZHVMYZB-B2LoFG_o.js +0 -1
  537. package/dist/client/assets/clone-C8LA0zQQ.js +0 -1
  538. package/dist/client/assets/index-DvtmO7DV.css +0 -1
  539. package/dist/client/assets/index-EVrp_NXm.js +0 -429
  540. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CO6XGRkL.js +0 -1
  541. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.d.ts.map +0 -1
  542. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js.map +0 -1
  543. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.test.d.ts +0 -2
  544. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.test.d.ts.map +0 -1
  545. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.test.js.map +0 -1
  546. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.d.ts +0 -10
  547. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.d.ts.map +0 -1
  548. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.js +0 -24
  549. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.js.map +0 -1
  550. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.d.ts +0 -2
  551. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.d.ts.map +0 -1
  552. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.js +0 -17
  553. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.js.map +0 -1
@@ -1,15 +1,12 @@
1
- import { AcpEventTranslator, AcpPermissionBridge, acpRuntimeManager, } from '../../../../backend/domains/session/acp/index.js';
1
+ import { acpRuntimeManager } from '../../../../backend/domains/session/acp/index.js';
2
2
  import { acpTraceLogger } from '../../../../backend/domains/session/logging/acp-trace-logger.service.js';
3
- import { sessionFileLogger } from '../../../../backend/domains/session/logging/session-file-logger.service.js';
4
- import { sessionDomainService } from '../../../../backend/domains/session/session-domain.service.js';
5
- import { interceptorRegistry } from '../../../../backend/interceptors/registry.js';
6
- import { userSettingsAccessor } from '../../../../backend/resource_accessors/user-settings.accessor.js';
3
+ import { sessionDomainService, } from '../../../../backend/domains/session/session-domain.service.js';
7
4
  import { createLogger } from '../../../../backend/services/logger.service.js';
8
- import { extractPlanText } from '../../../../shared/acp-protocol/plan-content.js';
9
- import { EMPTY_CHAT_BAR_CAPABILITIES } from '../../../../shared/chat-capabilities.js';
10
5
  import { SessionStatus } from '../../../../shared/core/index.js';
11
- import { isUserQuestionRequest } from '../../../../shared/pending-request-types.js';
12
6
  import { createInitialSessionRuntimeState, } from '../../../../shared/session-runtime.js';
7
+ import { AcpEventProcessor } from './acp-event-processor.js';
8
+ import { SessionConfigService, } from './session.config.service.js';
9
+ import { SessionPermissionService } from './session.permission.service.js';
13
10
  import { sessionPromptBuilder } from './session.prompt-builder.js';
14
11
  import { sessionRepository } from './session.repository.js';
15
12
  const logger = createLogger('session');
@@ -23,23 +20,25 @@ function toErrorMessage(error) {
23
20
  }
24
21
  return String(error);
25
22
  }
26
- class SessionService {
23
+ export class SessionService {
27
24
  repository;
28
25
  promptBuilder;
29
- acpEventTranslator = new AcpEventTranslator(logger);
30
- acpPermissionBridges = new Map();
31
- acpStreamState = new Map();
32
- pendingAcpToolCalls = new Map();
33
- suppressAcpReplayForSession = new Set();
26
+ runtimeManager;
27
+ sessionDomainService;
28
+ sessionPermissionService;
29
+ sessionConfigService;
30
+ acpEventProcessor;
34
31
  workspaceBridge = null;
35
- sessionToWorkspace = new Map();
36
- sessionToWorkingDir = new Map();
37
32
  promptTurnCompleteHandler = null;
33
+ promptTurnCompleteTimeouts = new Map();
38
34
  configure(bridges) {
39
35
  this.workspaceBridge = bridges.workspace;
40
36
  }
41
37
  setPromptTurnCompleteHandler(handler) {
42
38
  this.promptTurnCompleteHandler = handler;
39
+ if (!handler) {
40
+ this.clearAllScheduledPromptTurnCompletions();
41
+ }
43
42
  }
44
43
  isStaleLoadingRuntime(runtime) {
45
44
  if (runtime.phase !== 'loading' || runtime.processState === 'alive') {
@@ -52,40 +51,9 @@ class SessionService {
52
51
  return Date.now() - updatedAtMs > STALE_LOADING_RUNTIME_MAX_AGE_MS;
53
52
  }
54
53
  setupAcpEventHandler(sessionId) {
55
- const bridge = new AcpPermissionBridge();
56
- this.acpPermissionBridges.set(sessionId, bridge);
54
+ const runtimeEventHandler = this.acpEventProcessor.createRuntimeEventHandler(sessionId);
57
55
  return {
58
- permissionBridge: bridge,
59
- onAcpEvent: (sid, event) => {
60
- const typed = event;
61
- if (typed.type === 'acp_session_update') {
62
- const { update } = event;
63
- if (update.sessionUpdate === 'user_message_chunk' && update.content.type === 'text') {
64
- this.handleAcpUserMessageChunk(sid, update.content.text);
65
- return;
66
- }
67
- const deltas = this.acpEventTranslator.translateSessionUpdate(update);
68
- if (deltas.length === 0) {
69
- acpTraceLogger.log(sid, 'translated_delta', {
70
- sessionUpdate: update.sessionUpdate,
71
- deltaCount: 0,
72
- });
73
- }
74
- for (const [index, delta] of deltas.entries()) {
75
- acpTraceLogger.log(sid, 'translated_delta', {
76
- sessionUpdate: update.sessionUpdate,
77
- deltaIndex: index,
78
- delta,
79
- });
80
- this.handleAcpDelta(sid, delta);
81
- }
82
- return;
83
- }
84
- if (typed.type === 'acp_permission_request') {
85
- this.handleAcpPermissionRequest(sid, event);
86
- return;
87
- }
88
- },
56
+ ...runtimeEventHandler,
89
57
  onSessionId: async (sid, providerSessionId) => {
90
58
  try {
91
59
  await this.repository.updateSession(sid, { providerSessionId });
@@ -107,24 +75,17 @@ class SessionService {
107
75
  }
108
76
  },
109
77
  onExit: async (sid, exitCode) => {
110
- this.acpStreamState.delete(sid);
111
- this.pendingAcpToolCalls.delete(sid);
112
- this.suppressAcpReplayForSession.delete(sid);
113
- this.sessionToWorkspace.delete(sid);
114
- this.sessionToWorkingDir.delete(sid);
115
- const b = this.acpPermissionBridges.get(sid);
116
- if (b) {
117
- b.cancelAll();
118
- this.acpPermissionBridges.delete(sid);
119
- }
78
+ this.clearScheduledPromptTurnCompletion(sid);
79
+ this.acpEventProcessor.clearSessionState(sid);
80
+ this.sessionPermissionService.cancelPendingRequests(sid);
120
81
  acpTraceLogger.log(sid, 'runtime_exit', { exitCode });
121
82
  try {
122
- sessionDomainService.markProcessExit(sid, exitCode);
83
+ this.sessionDomainService.markProcessExit(sid, exitCode);
123
84
  const session = await this.repository.updateSession(sid, {
124
85
  status: SessionStatus.COMPLETED,
125
86
  });
126
87
  logger.debug('Updated ACP session status to COMPLETED on exit', { sessionId: sid });
127
- await this.repository.clearRatchetActiveSession(session.workspaceId, sid);
88
+ await this.clearRatchetActiveSessionIfMatching(session.workspaceId, sid);
128
89
  if (session.workflow === 'ratchet') {
129
90
  await this.repository.deleteSession(sid);
130
91
  logger.debug('Deleted transient ratchet ACP session', { sessionId: sid });
@@ -145,7 +106,7 @@ class SessionService {
145
106
  message: error.message,
146
107
  stack: error.stack,
147
108
  });
148
- sessionDomainService.markError(sid, error.message);
109
+ this.sessionDomainService.markError(sid, error.message);
149
110
  logger.error('ACP client error', {
150
111
  sessionId: sid,
151
112
  error: error.message,
@@ -153,366 +114,9 @@ class SessionService {
153
114
  });
154
115
  },
155
116
  onAcpLog: (sid, payload) => {
156
- acpTraceLogger.log(sid, 'raw_acp_event', payload);
157
- sessionFileLogger.log(sid, 'FROM_CLAUDE_CLI', payload);
158
- },
159
- };
160
- }
161
- handleAcpDelta(sid, delta) {
162
- this.maybeLiftReplaySuppression(sid);
163
- if (this.suppressAcpReplayForSession.has(sid) &&
164
- delta.type !== 'config_options_update' &&
165
- delta.type !== 'slash_commands') {
166
- return;
167
- }
168
- this.trackPendingAcpToolCalls(sid, delta);
169
- if (delta.type === 'config_options_update') {
170
- const acpHandle = acpRuntimeManager.getClient(sid);
171
- if (acpHandle) {
172
- const { configOptions } = delta;
173
- acpHandle.configOptions = configOptions;
174
- void this.persistAcpConfigSnapshot(sid, {
175
- provider: acpHandle.provider,
176
- providerSessionId: acpHandle.providerSessionId,
177
- configOptions: acpHandle.configOptions,
178
- });
179
- sessionDomainService.emitDelta(sid, delta);
180
- sessionDomainService.emitDelta(sid, {
181
- type: 'chat_capabilities',
182
- capabilities: this.buildAcpChatBarCapabilities(acpHandle),
183
- });
184
- return;
185
- }
186
- }
187
- if (delta.type !== 'agent_message') {
188
- sessionDomainService.emitDelta(sid, delta);
189
- return;
190
- }
191
- const data = delta.data;
192
- if (data.type === 'assistant') {
193
- this.accumulateAcpText(sid, data);
194
- return;
195
- }
196
- this.acpStreamState.delete(sid);
197
- const order = sessionDomainService.appendClaudeEvent(sid, data);
198
- sessionDomainService.emitDelta(sid, { ...delta, order });
199
- }
200
- trackPendingAcpToolCalls(sid, delta) {
201
- if (delta.type === 'agent_message') {
202
- this.trackPendingFromAgentMessage(sid, delta.data);
203
- return;
204
- }
205
- if (delta.type === 'tool_progress') {
206
- this.trackPendingFromToolProgress(sid, delta);
207
- }
208
- }
209
- trackPendingFromAgentMessage(sid, data) {
210
- if (data.type === 'stream_event') {
211
- this.trackPendingFromToolUseStreamEvent(sid, data);
212
- }
213
- if (data.type !== 'user') {
214
- return;
215
- }
216
- this.clearPendingFromToolResultMessage(sid, data);
217
- }
218
- trackPendingFromToolUseStreamEvent(sid, data) {
219
- const streamEvent = data.event;
220
- const contentBlock = streamEvent?.content_block;
221
- const isToolUse = streamEvent?.type === 'content_block_start' && contentBlock?.type === 'tool_use';
222
- if (!isToolUse) {
223
- return;
224
- }
225
- const toolUseId = typeof contentBlock?.id === 'string' ? contentBlock.id : null;
226
- if (!toolUseId) {
227
- return;
228
- }
229
- const toolName = typeof contentBlock?.name === 'string' ? contentBlock.name : 'ACP Tool';
230
- const toolInput = this.normalizeToolInput(contentBlock?.input);
231
- const existing = this.getPendingToolCall(sid, toolUseId);
232
- this.upsertPendingToolCall(sid, toolUseId, { toolName, toolInput });
233
- if (!existing) {
234
- this.notifyInterceptorToolStart(sid, {
235
- toolUseId,
236
- toolName,
237
- toolInput: toolInput ?? {},
238
- });
239
- }
240
- }
241
- clearPendingFromToolResultMessage(sid, data) {
242
- if (data.type !== 'user') {
243
- return;
244
- }
245
- const content = data.message?.content;
246
- if (!Array.isArray(content)) {
247
- return;
248
- }
249
- for (const item of content) {
250
- if (item.type === 'tool_result') {
251
- const pending = this.getPendingToolCall(sid, item.tool_use_id);
252
- this.notifyInterceptorToolComplete(sid, item.tool_use_id, item.content, item.is_error === true, pending);
253
- this.removePendingToolCall(sid, item.tool_use_id);
254
- }
255
- }
256
- }
257
- trackPendingFromToolProgress(sid, progress) {
258
- if (!progress.tool_use_id) {
259
- return;
260
- }
261
- const existing = this.getPendingToolCall(sid, progress.tool_use_id);
262
- this.upsertPendingToolCall(sid, progress.tool_use_id, {
263
- toolName: progress.tool_name ?? 'ACP Tool',
264
- acpKind: progress.acpKind,
265
- acpLocations: progress.acpLocations,
266
- });
267
- if (!existing) {
268
- this.notifyInterceptorToolStart(sid, {
269
- toolUseId: progress.tool_use_id,
270
- toolName: progress.tool_name ?? 'ACP Tool',
271
- toolInput: {},
272
- });
273
- }
274
- }
275
- upsertPendingToolCall(sid, toolUseId, update) {
276
- const pendingById = this.pendingAcpToolCalls.get(sid) ?? new Map();
277
- const existing = pendingById.get(toolUseId);
278
- pendingById.set(toolUseId, {
279
- toolUseId,
280
- toolName: update.toolName || existing?.toolName || 'ACP Tool',
281
- toolInput: update.toolInput ?? existing?.toolInput,
282
- acpKind: update.acpKind ?? existing?.acpKind,
283
- acpLocations: update.acpLocations ?? existing?.acpLocations,
284
- });
285
- this.pendingAcpToolCalls.set(sid, pendingById);
286
- }
287
- getPendingToolCall(sid, toolUseId) {
288
- return this.pendingAcpToolCalls.get(sid)?.get(toolUseId);
289
- }
290
- removePendingToolCall(sid, toolUseId) {
291
- const pendingById = this.pendingAcpToolCalls.get(sid);
292
- if (!pendingById) {
293
- return;
294
- }
295
- pendingById.delete(toolUseId);
296
- if (pendingById.size === 0) {
297
- this.pendingAcpToolCalls.delete(sid);
298
- }
299
- }
300
- normalizeToolInput(input) {
301
- if (typeof input !== 'object' || input === null || Array.isArray(input)) {
302
- return undefined;
303
- }
304
- return input;
305
- }
306
- extractToolResultText(content) {
307
- if (typeof content === 'string') {
308
- return content;
309
- }
310
- if (Array.isArray(content)) {
311
- return content
312
- .flatMap((item) => {
313
- if (typeof item === 'object' &&
314
- item !== null &&
315
- item.type === 'text' &&
316
- typeof item.text === 'string') {
317
- return [item.text];
318
- }
319
- return [];
320
- })
321
- .join('\n');
322
- }
323
- if (content === undefined || content === null) {
324
- return '';
325
- }
326
- try {
327
- return JSON.stringify(content);
328
- }
329
- catch {
330
- return String(content);
331
- }
332
- }
333
- getInterceptorContext(sessionId) {
334
- const workspaceId = this.sessionToWorkspace.get(sessionId);
335
- const workingDir = this.sessionToWorkingDir.get(sessionId);
336
- if (!(workspaceId && workingDir)) {
337
- return null;
338
- }
339
- return {
340
- sessionId,
341
- workspaceId,
342
- workingDir,
343
- timestamp: new Date(),
344
- };
345
- }
346
- notifyInterceptorToolStart(sessionId, tool) {
347
- const context = this.getInterceptorContext(sessionId);
348
- if (!context) {
349
- return;
350
- }
351
- const event = {
352
- toolUseId: tool.toolUseId,
353
- toolName: tool.toolName,
354
- input: tool.toolInput,
355
- };
356
- interceptorRegistry.notifyToolStart(event, context);
357
- }
358
- notifyInterceptorToolComplete(sessionId, toolUseId, content, isError, pending) {
359
- const context = this.getInterceptorContext(sessionId);
360
- if (!context) {
361
- return;
362
- }
363
- const event = {
364
- toolUseId,
365
- toolName: pending?.toolName ?? 'ACP Tool',
366
- input: pending?.toolInput ?? {},
367
- output: {
368
- content: this.extractToolResultText(content),
369
- isError,
117
+ this.acpEventProcessor.handleAcpLog(sid, payload);
370
118
  },
371
119
  };
372
- interceptorRegistry.notifyToolComplete(event, context);
373
- }
374
- finalizeOrphanedToolCalls(sid, reason) {
375
- const pendingById = this.pendingAcpToolCalls.get(sid);
376
- if (!pendingById || pendingById.size === 0) {
377
- this.pendingAcpToolCalls.delete(sid);
378
- return;
379
- }
380
- const toolUseIds = [...pendingById.keys()];
381
- logger.warn('Finalizing orphaned ACP tool calls without terminal status', {
382
- sessionId: sid,
383
- reason,
384
- count: toolUseIds.length,
385
- toolUseIds,
386
- });
387
- for (const pending of pendingById.values()) {
388
- const syntheticProgress = {
389
- type: 'tool_progress',
390
- tool_use_id: pending.toolUseId,
391
- tool_name: pending.toolName,
392
- acpStatus: 'failed',
393
- elapsed_time_seconds: 0,
394
- ...(pending.acpKind ? { acpKind: pending.acpKind } : {}),
395
- ...(pending.acpLocations ? { acpLocations: pending.acpLocations } : {}),
396
- };
397
- this.handleAcpDelta(sid, syntheticProgress);
398
- const syntheticResult = {
399
- type: 'agent_message',
400
- data: {
401
- type: 'user',
402
- message: {
403
- role: 'user',
404
- content: [
405
- {
406
- type: 'tool_result',
407
- tool_use_id: pending.toolUseId,
408
- content: `Tool call did not receive a terminal ACP update (${reason}). Marked as failed locally.`,
409
- is_error: true,
410
- },
411
- ],
412
- },
413
- },
414
- };
415
- this.handleAcpDelta(sid, syntheticResult);
416
- acpTraceLogger.log(sid, 'translated_delta', {
417
- sessionUpdate: 'synthetic_orphan_tool_call',
418
- delta: syntheticProgress,
419
- });
420
- acpTraceLogger.log(sid, 'translated_delta', {
421
- sessionUpdate: 'synthetic_orphan_tool_call',
422
- delta: syntheticResult,
423
- });
424
- }
425
- this.pendingAcpToolCalls.delete(sid);
426
- }
427
- handleAcpUserMessageChunk(sid, text) {
428
- this.maybeLiftReplaySuppression(sid);
429
- if (this.suppressAcpReplayForSession.has(sid)) {
430
- return;
431
- }
432
- if (acpRuntimeManager.isSessionWorking(sid)) {
433
- return;
434
- }
435
- const normalized = text.trim();
436
- if (normalized.length === 0) {
437
- return;
438
- }
439
- sessionDomainService.injectCommittedUserMessage(sid, normalized);
440
- }
441
- accumulateAcpText(sid, data) {
442
- const content = data.message?.content;
443
- const chunkText = Array.isArray(content) && content[0]?.type === 'text'
444
- ? content[0].text
445
- : '';
446
- let ss = this.acpStreamState.get(sid);
447
- if (!ss) {
448
- ss = { textOrder: sessionDomainService.allocateOrder(sid), accText: '' };
449
- this.acpStreamState.set(sid, ss);
450
- }
451
- ss.accText += chunkText;
452
- const accMsg = {
453
- type: 'assistant',
454
- message: { role: 'assistant', content: [{ type: 'text', text: ss.accText }] },
455
- };
456
- sessionDomainService.upsertClaudeEvent(sid, accMsg, ss.textOrder);
457
- sessionDomainService.emitDelta(sid, {
458
- type: 'agent_message',
459
- data: accMsg,
460
- order: ss.textOrder,
461
- });
462
- }
463
- handleAcpPermissionRequest(sid, event) {
464
- const { requestId, params } = event;
465
- const toolName = params.toolCall.title ?? 'ACP Tool';
466
- const toolInput = params.toolCall.rawInput ?? {};
467
- const acpOptions = params.options.map((o) => ({
468
- optionId: o.optionId,
469
- name: o.name,
470
- kind: o.kind,
471
- }));
472
- const planContent = this.extractPlanContent(toolName, toolInput);
473
- if (isUserQuestionRequest({ toolName, input: toolInput })) {
474
- const questions = this.extractAskUserQuestions(toolInput);
475
- sessionDomainService.emitDelta(sid, {
476
- type: 'user_question',
477
- requestId,
478
- toolName,
479
- questions,
480
- acpOptions,
481
- });
482
- }
483
- else {
484
- sessionDomainService.emitDelta(sid, {
485
- type: 'permission_request',
486
- requestId,
487
- toolName,
488
- toolUseId: params.toolCall.toolCallId,
489
- toolInput,
490
- planContent,
491
- acpOptions,
492
- });
493
- }
494
- sessionDomainService.setPendingInteractiveRequest(sid, {
495
- requestId,
496
- toolName,
497
- toolUseId: params.toolCall.toolCallId,
498
- input: toolInput,
499
- planContent,
500
- acpOptions,
501
- timestamp: new Date().toISOString(),
502
- });
503
- }
504
- extractAskUserQuestions(input) {
505
- const questions = input.questions;
506
- if (!Array.isArray(questions)) {
507
- return [];
508
- }
509
- return questions;
510
- }
511
- extractPlanContent(toolName, input) {
512
- if (toolName !== 'ExitPlanMode') {
513
- return null;
514
- }
515
- return extractPlanText(input.plan);
516
120
  }
517
121
  async createAcpClient(sessionId, options, session) {
518
122
  const sessionContext = await this.loadSessionContext(sessionId, session);
@@ -520,16 +124,13 @@ class SessionService {
520
124
  throw new Error(`Session context not ready: ${sessionId}`);
521
125
  }
522
126
  await this.repository.markWorkspaceHasHadSessions(sessionContext.workspaceId);
523
- this.sessionToWorkspace.set(sessionId, sessionContext.workspaceId);
524
- this.sessionToWorkingDir.set(sessionId, sessionContext.workingDir);
127
+ this.acpEventProcessor.registerSessionContext(sessionId, {
128
+ workspaceId: sessionContext.workspaceId,
129
+ workingDir: sessionContext.workingDir,
130
+ });
525
131
  const handlers = this.setupAcpEventHandler(sessionId);
526
132
  const shouldSuppressReplay = this.shouldSuppressReplayDuringAcpResume(sessionId, session);
527
- if (shouldSuppressReplay) {
528
- this.suppressAcpReplayForSession.add(sessionId);
529
- }
530
- else {
531
- this.suppressAcpReplayForSession.delete(sessionId);
532
- }
133
+ this.acpEventProcessor.setReplaySuppression(sessionId, shouldSuppressReplay);
533
134
  const clientOptions = {
534
135
  provider: session?.provider ?? 'CLAUDE',
535
136
  workingDir: sessionContext.workingDir,
@@ -541,15 +142,13 @@ class SessionService {
541
142
  };
542
143
  let handle;
543
144
  try {
544
- handle = await acpRuntimeManager.getOrCreateClient(sessionId, clientOptions, handlers, {
145
+ handle = await this.runtimeManager.getOrCreateClient(sessionId, clientOptions, handlers, {
545
146
  workspaceId: sessionContext.workspaceId,
546
147
  workingDir: sessionContext.workingDir,
547
148
  });
548
149
  }
549
150
  catch (error) {
550
- this.suppressAcpReplayForSession.delete(sessionId);
551
- this.sessionToWorkspace.delete(sessionId);
552
- this.sessionToWorkingDir.delete(sessionId);
151
+ this.acpEventProcessor.clearSessionState(sessionId);
553
152
  throw error;
554
153
  }
555
154
  await this.persistAcpConfigSnapshot(sessionId, {
@@ -559,12 +158,12 @@ class SessionService {
559
158
  existingMetadata: session?.providerMetadata ?? undefined,
560
159
  });
561
160
  if (handle.configOptions.length > 0) {
562
- sessionDomainService.emitDelta(sessionId, {
161
+ this.sessionDomainService.emitDelta(sessionId, {
563
162
  type: 'config_options_update',
564
163
  configOptions: handle.configOptions,
565
164
  });
566
165
  }
567
- sessionDomainService.emitDelta(sessionId, {
166
+ this.sessionDomainService.emitDelta(sessionId, {
568
167
  type: 'chat_capabilities',
569
168
  capabilities: this.buildAcpChatBarCapabilities(handle),
570
169
  });
@@ -574,33 +173,40 @@ class SessionService {
574
173
  if (!session?.providerSessionId) {
575
174
  return false;
576
175
  }
577
- if (!sessionDomainService.isHistoryHydrated(sessionId)) {
176
+ if (!this.sessionDomainService.isHistoryHydrated(sessionId)) {
578
177
  return false;
579
178
  }
580
- return sessionDomainService.getTranscriptSnapshot(sessionId).length > 0;
581
- }
582
- maybeLiftReplaySuppression(sessionId) {
583
- if (!this.suppressAcpReplayForSession.has(sessionId)) {
584
- return;
585
- }
586
- if (!acpRuntimeManager.isSessionWorking(sessionId)) {
587
- return;
588
- }
589
- this.suppressAcpReplayForSession.delete(sessionId);
179
+ return this.sessionDomainService.getTranscriptSnapshot(sessionId).length > 0;
590
180
  }
591
181
  constructor(options) {
592
182
  this.repository = options?.repository ?? sessionRepository;
593
183
  this.promptBuilder = options?.promptBuilder ?? sessionPromptBuilder;
184
+ this.runtimeManager = options?.runtimeManager ?? acpRuntimeManager;
185
+ this.sessionDomainService = options?.sessionDomainService ?? sessionDomainService;
186
+ this.sessionPermissionService = new SessionPermissionService({
187
+ sessionDomainService: this.sessionDomainService,
188
+ });
189
+ this.sessionConfigService = new SessionConfigService({
190
+ repository: this.repository,
191
+ runtimeManager: this.runtimeManager,
192
+ sessionDomainService: this.sessionDomainService,
193
+ });
194
+ this.acpEventProcessor = new AcpEventProcessor({
195
+ runtimeManager: this.runtimeManager,
196
+ sessionDomainService: this.sessionDomainService,
197
+ sessionPermissionService: this.sessionPermissionService,
198
+ sessionConfigService: this.sessionConfigService,
199
+ });
594
200
  }
595
201
  async startSession(sessionId, options) {
596
202
  const session = await this.repository.getSessionById(sessionId);
597
203
  if (!session) {
598
204
  throw new Error(`Session not found: ${sessionId}`);
599
205
  }
600
- if (acpRuntimeManager.isStopInProgress(sessionId)) {
206
+ if (this.runtimeManager.isStopInProgress(sessionId)) {
601
207
  throw new Error('Session is currently being stopped');
602
208
  }
603
- const existingClient = acpRuntimeManager.getClient(sessionId);
209
+ const existingClient = this.runtimeManager.getClient(sessionId);
604
210
  if (existingClient) {
605
211
  throw new Error('Session is already running');
606
212
  }
@@ -618,295 +224,35 @@ class SessionService {
618
224
  logger.info('Session started', { sessionId, provider: session.provider });
619
225
  }
620
226
  async applyStartupModePreset(sessionId, handle, startupModePreset, workflow) {
621
- if (!startupModePreset) {
622
- return;
623
- }
624
- const modeResult = await this.applyStartupCollaborationModePreset({
625
- sessionId,
626
- handle,
627
- startupModePreset,
628
- workflow,
629
- configOptions: handle.configOptions,
227
+ await this.sessionConfigService.applyStartupModePreset(sessionId, handle, startupModePreset, workflow, {
228
+ persistSnapshot: this.persistAcpConfigSnapshot.bind(this),
630
229
  });
631
- const executionResult = await this.applyStartupExecutionModePreset({
632
- sessionId,
633
- handle,
634
- startupModePreset,
635
- workflow,
636
- configOptions: modeResult.configOptions,
637
- });
638
- const didUpdate = modeResult.didUpdate || executionResult.didUpdate;
639
- if (!didUpdate) {
640
- return;
641
- }
642
- handle.configOptions = executionResult.configOptions;
643
- try {
644
- await this.persistAcpConfigSnapshot(sessionId, {
645
- provider: handle.provider,
646
- providerSessionId: handle.providerSessionId,
647
- configOptions: executionResult.configOptions,
648
- });
649
- sessionDomainService.emitDelta(sessionId, {
650
- type: 'config_options_update',
651
- configOptions: executionResult.configOptions,
652
- });
653
- sessionDomainService.emitDelta(sessionId, {
654
- type: 'chat_capabilities',
655
- capabilities: this.buildAcpChatBarCapabilities(handle),
656
- });
657
- }
658
- catch (error) {
659
- logger.warn('Failed persisting startup mode preset configuration snapshot', {
660
- sessionId,
661
- provider: handle.provider,
662
- workflow,
663
- startupModePreset,
664
- error: error instanceof Error ? error.message : String(error),
665
- });
666
- }
667
- }
668
- async applyStartupCollaborationModePreset(params) {
669
- const modeOption = params.configOptions.find((option) => option.category === 'mode');
670
- if (!modeOption) {
671
- return { configOptions: params.configOptions, didUpdate: false };
672
- }
673
- const availableModeValues = this.getConfigOptionValues(modeOption);
674
- const targetMode = this.resolveStartupModeTarget(params.handle.provider, params.startupModePreset, availableModeValues);
675
- if (!targetMode) {
676
- logger.debug('Startup mode preset not available in ACP mode options', {
677
- sessionId: params.sessionId,
678
- provider: params.handle.provider,
679
- workflow: params.workflow,
680
- startupModePreset: params.startupModePreset,
681
- availableModeValues,
682
- });
683
- return { configOptions: params.configOptions, didUpdate: false };
684
- }
685
- const currentMode = modeOption.currentValue ? String(modeOption.currentValue) : null;
686
- if (currentMode === targetMode) {
687
- return { configOptions: params.configOptions, didUpdate: false };
688
- }
689
- try {
690
- const configOptions = await acpRuntimeManager.setSessionMode(params.sessionId, targetMode);
691
- return { configOptions, didUpdate: true };
692
- }
693
- catch (error) {
694
- logger.warn('Failed applying startup mode preset', {
695
- sessionId: params.sessionId,
696
- provider: params.handle.provider,
697
- workflow: params.workflow,
698
- startupModePreset: params.startupModePreset,
699
- targetMode,
700
- error: error instanceof Error ? error.message : String(error),
701
- });
702
- return { configOptions: params.configOptions, didUpdate: false };
703
- }
704
- }
705
- async applyStartupExecutionModePreset(params) {
706
- const executionModeOption = params.configOptions.find((option) => option.id === 'execution_mode' || option.category === 'permission');
707
- const targetExecutionMode = this.resolveStartupExecutionModeTarget(params.handle.provider, params.workflow, params.startupModePreset, executionModeOption);
708
- if (!(executionModeOption && targetExecutionMode)) {
709
- return { configOptions: params.configOptions, didUpdate: false };
710
- }
711
- const currentExecutionMode = executionModeOption.currentValue
712
- ? String(executionModeOption.currentValue)
713
- : null;
714
- if (currentExecutionMode === targetExecutionMode) {
715
- return { configOptions: params.configOptions, didUpdate: false };
716
- }
717
- try {
718
- const configOptions = await acpRuntimeManager.setConfigOption(params.sessionId, executionModeOption.id, targetExecutionMode);
719
- return { configOptions, didUpdate: true };
720
- }
721
- catch (error) {
722
- logger.warn('Failed applying startup execution-mode preset', {
723
- sessionId: params.sessionId,
724
- provider: params.handle.provider,
725
- workflow: params.workflow,
726
- startupModePreset: params.startupModePreset,
727
- targetExecutionMode,
728
- error: error instanceof Error ? error.message : String(error),
729
- });
730
- return { configOptions: params.configOptions, didUpdate: false };
731
- }
732
- }
733
- resolveStartupModeTarget(provider, startupModePreset, availableModeValues) {
734
- if (availableModeValues.length === 0) {
735
- return null;
736
- }
737
- if (startupModePreset === 'plan') {
738
- return this.findModeValue(availableModeValues, ['plan']);
739
- }
740
- if (provider === 'CLAUDE') {
741
- return this.findModeValue(availableModeValues, [
742
- 'bypassPermissions',
743
- 'dangerouslySkipPermissions',
744
- 'dangerousSkipPermissions',
745
- 'acceptEdits',
746
- ]);
747
- }
748
- return this.findModeValue(availableModeValues, [
749
- 'fullAccess',
750
- 'full_access',
751
- 'full-access',
752
- 'code',
753
- ]);
754
- }
755
- resolveStartupExecutionModeTarget(provider, workflow, startupModePreset, executionModeOption) {
756
- if (provider !== 'CODEX' ||
757
- workflow !== 'ratchet' ||
758
- startupModePreset !== 'non_interactive' ||
759
- !executionModeOption) {
760
- return null;
761
- }
762
- const availableValues = this.getConfigOptionValues(executionModeOption);
763
- const yoloByValue = this.findModeValue(availableValues, ['["never","danger-full-access"]']);
764
- if (yoloByValue) {
765
- return yoloByValue;
766
- }
767
- const yoloByName = this.getSelectOptions(executionModeOption).find((option) => /yolo/i.test(option.name ?? ''));
768
- return yoloByName?.value ?? null;
769
230
  }
770
231
  async applyConfiguredPermissionPreset(sessionId, session, handle) {
771
- if (handle.provider !== 'CODEX') {
772
- return;
773
- }
774
- const executionModeOption = handle.configOptions.find((option) => option.id === 'execution_mode' || option.category === 'permission');
775
- if (!executionModeOption) {
776
- return;
777
- }
778
- let permissionPreset = session.workflow === 'ratchet' ? 'YOLO' : 'STRICT';
779
- try {
780
- const settings = await userSettingsAccessor.get();
781
- permissionPreset =
782
- session.workflow === 'ratchet'
783
- ? settings.ratchetPermissions
784
- : settings.defaultWorkspacePermissions;
785
- }
786
- catch (error) {
787
- logger.warn('Failed loading user permission presets; using defaults', {
788
- sessionId,
789
- workflow: session.workflow,
790
- error: error instanceof Error ? error.message : String(error),
791
- });
792
- }
793
- const targetExecutionMode = this.resolveConfiguredExecutionModeTarget(executionModeOption, permissionPreset);
794
- if (!targetExecutionMode) {
795
- return;
796
- }
797
- const currentExecutionMode = executionModeOption.currentValue
798
- ? String(executionModeOption.currentValue)
799
- : null;
800
- if (currentExecutionMode === targetExecutionMode) {
801
- return;
802
- }
803
- try {
804
- const configOptions = await acpRuntimeManager.setConfigOption(sessionId, executionModeOption.id, targetExecutionMode);
805
- handle.configOptions = configOptions;
806
- await this.persistAcpConfigSnapshot(sessionId, {
807
- provider: handle.provider,
808
- providerSessionId: handle.providerSessionId,
809
- configOptions,
810
- });
811
- sessionDomainService.emitDelta(sessionId, {
812
- type: 'config_options_update',
813
- configOptions,
814
- });
815
- sessionDomainService.emitDelta(sessionId, {
816
- type: 'chat_capabilities',
817
- capabilities: this.buildAcpChatBarCapabilities(handle),
818
- });
819
- }
820
- catch (error) {
821
- logger.warn('Failed applying configured session permission preset', {
822
- sessionId,
823
- workflow: session.workflow,
824
- permissionPreset,
825
- targetExecutionMode,
826
- error: error instanceof Error ? error.message : String(error),
827
- });
828
- }
829
- }
830
- resolveConfiguredExecutionModeTarget(executionModeOption, permissionPreset) {
831
- const availableValues = this.getConfigOptionValues(executionModeOption);
832
- const preferredValuesByPreset = {
833
- STRICT: [
834
- '["on-request","workspace-write"]',
835
- '["on-request","read-only"]',
836
- '["on-request","danger-full-access"]',
837
- ],
838
- RELAXED: [
839
- '["on-failure","workspace-write"]',
840
- '["on-failure","read-only"]',
841
- '["on-failure","danger-full-access"]',
842
- ],
843
- YOLO: [
844
- '["never","danger-full-access"]',
845
- '["never","workspace-write"]',
846
- '["never","read-only"]',
847
- ],
848
- };
849
- const preferredValues = preferredValuesByPreset[permissionPreset];
850
- const byValue = this.findModeValue(availableValues, preferredValues);
851
- if (byValue) {
852
- return byValue;
853
- }
854
- const byName = this.getSelectOptions(executionModeOption).find((option) => {
855
- const name = option.name ?? '';
856
- if (permissionPreset === 'STRICT') {
857
- return /on request/i.test(name);
858
- }
859
- if (permissionPreset === 'RELAXED') {
860
- return /on failure/i.test(name);
861
- }
862
- return /yolo|never ask/i.test(name);
863
- });
864
- return byName?.value ?? null;
865
- }
866
- findModeValue(availableModeValues, preferredModeValues) {
867
- if (availableModeValues.length === 0 || preferredModeValues.length === 0) {
868
- return null;
869
- }
870
- const availableByNormalized = new Map();
871
- for (const value of availableModeValues) {
872
- availableByNormalized.set(this.normalizeModeValue(value), value);
873
- }
874
- for (const preferredValue of preferredModeValues) {
875
- const match = availableByNormalized.get(this.normalizeModeValue(preferredValue));
876
- if (match) {
877
- return match;
878
- }
879
- }
880
- return null;
881
- }
882
- normalizeModeValue(value) {
883
- return value.replace(/[^a-z0-9]/gi, '').toLowerCase();
232
+ await this.sessionConfigService.applyConfiguredPermissionPreset(sessionId, session, handle);
884
233
  }
885
234
  async stopSession(sessionId, options) {
235
+ this.clearScheduledPromptTurnCompletion(sessionId);
886
236
  const session = await this.loadSessionForStop(sessionId);
887
- const workspaceId = session?.workspaceId ?? this.sessionToWorkspace.get(sessionId);
888
- if (acpRuntimeManager.isStopInProgress(sessionId)) {
237
+ const workspaceId = session?.workspaceId ?? this.acpEventProcessor.getWorkspaceId(sessionId);
238
+ if (this.runtimeManager.isStopInProgress(sessionId)) {
889
239
  logger.debug('Session stop already in progress', { sessionId });
890
240
  return;
891
241
  }
892
242
  const current = this.getRuntimeSnapshot(sessionId);
893
- sessionDomainService.setRuntimeSnapshot(sessionId, {
243
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
894
244
  ...current,
895
245
  phase: 'stopping',
896
246
  activity: 'IDLE',
897
247
  updatedAt: new Date().toISOString(),
898
248
  });
899
- this.acpStreamState.delete(sessionId);
900
- this.suppressAcpReplayForSession.delete(sessionId);
901
- const acpBridge = this.acpPermissionBridges.get(sessionId);
902
- if (acpBridge) {
903
- acpBridge.cancelAll();
904
- this.acpPermissionBridges.delete(sessionId);
905
- }
249
+ this.acpEventProcessor.clearStreamingState(sessionId);
250
+ this.acpEventProcessor.clearReplaySuppression(sessionId);
251
+ this.sessionPermissionService.cancelPendingRequests(sessionId);
906
252
  let stopClientFailed = false;
907
253
  try {
908
- if (!acpRuntimeManager.isStopInProgress(sessionId)) {
909
- await acpRuntimeManager.stopClient(sessionId);
254
+ if (!this.runtimeManager.isStopInProgress(sessionId)) {
255
+ await this.runtimeManager.stopClient(sessionId);
910
256
  }
911
257
  }
912
258
  catch (error) {
@@ -919,16 +265,15 @@ class SessionService {
919
265
  finally {
920
266
  this.finalizeOrphanedToolCallsOnStop(sessionId);
921
267
  await this.updateStoppedSessionState(sessionId);
922
- sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: true });
923
- sessionDomainService.setRuntimeSnapshot(sessionId, {
268
+ this.sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: true });
269
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
924
270
  phase: 'idle',
925
271
  processState: 'stopped',
926
272
  activity: 'IDLE',
927
273
  updatedAt: new Date().toISOString(),
928
274
  });
929
275
  this.markWorkspaceSessionIdleOnStop(workspaceId, sessionId);
930
- this.sessionToWorkspace.delete(sessionId);
931
- this.sessionToWorkingDir.delete(sessionId);
276
+ this.acpEventProcessor.clearSessionContext(sessionId);
932
277
  if (!stopClientFailed) {
933
278
  const shouldCleanupTransientRatchetSession = options?.cleanupTransientRatchetSession ?? true;
934
279
  await this.cleanupTransientRatchetOnStop(session, sessionId, shouldCleanupTransientRatchetSession);
@@ -942,14 +287,14 @@ class SessionService {
942
287
  }
943
288
  finalizeOrphanedToolCallsOnStop(sessionId) {
944
289
  try {
945
- this.finalizeOrphanedToolCalls(sessionId, 'session_stop');
290
+ this.acpEventProcessor.finalizeOrphanedToolCalls(sessionId, 'session_stop');
946
291
  }
947
292
  catch (error) {
948
293
  logger.warn('Failed finalizing orphaned ACP tool calls during stop', {
949
294
  sessionId,
950
295
  error: error instanceof Error ? error.message : String(error),
951
296
  });
952
- this.pendingAcpToolCalls.delete(sessionId);
297
+ this.acpEventProcessor.clearPendingToolCalls(sessionId);
953
298
  }
954
299
  }
955
300
  markWorkspaceSessionIdleOnStop(workspaceId, sessionId) {
@@ -997,7 +342,7 @@ class SessionService {
997
342
  return;
998
343
  }
999
344
  try {
1000
- await this.repository.clearRatchetActiveSession(session.workspaceId, sessionId);
345
+ await this.clearRatchetActiveSessionIfMatching(session.workspaceId, sessionId);
1001
346
  }
1002
347
  catch (error) {
1003
348
  logger.warn('Failed clearing ratchet active session pointer during stop', {
@@ -1020,11 +365,17 @@ class SessionService {
1020
365
  });
1021
366
  }
1022
367
  }
368
+ async clearRatchetActiveSessionIfMatching(workspaceId, sessionId) {
369
+ if (!this.workspaceBridge) {
370
+ return;
371
+ }
372
+ await this.workspaceBridge.clearRatchetActiveSessionIfMatching(workspaceId, sessionId);
373
+ }
1023
374
  async stopWorkspaceSessions(workspaceId) {
1024
375
  const sessions = await this.repository.getSessionsByWorkspaceId(workspaceId);
1025
376
  for (const session of sessions) {
1026
377
  if (session.status === SessionStatus.RUNNING ||
1027
- acpRuntimeManager.isSessionRunning(session.id)) {
378
+ this.runtimeManager.isSessionRunning(session.id)) {
1028
379
  try {
1029
380
  await this.stopSession(session.id);
1030
381
  }
@@ -1044,7 +395,7 @@ class SessionService {
1044
395
  if (!session) {
1045
396
  throw new Error(`Session not found: ${sessionId}`);
1046
397
  }
1047
- const hadClient = !!acpRuntimeManager.getClient(sessionId);
398
+ const hadClient = !!this.runtimeManager.getClient(sessionId);
1048
399
  const handle = await this.getOrCreateAcpSessionClient(sessionId, options ?? {}, session);
1049
400
  if (!(hadClient || session.providerSessionId)) {
1050
401
  await this.applyConfiguredPermissionPreset(sessionId, session, handle);
@@ -1052,7 +403,7 @@ class SessionService {
1052
403
  return handle;
1053
404
  }
1054
405
  async getOrCreateSessionClientFromRecord(session, options) {
1055
- const hadClient = !!acpRuntimeManager.getClient(session.id);
406
+ const hadClient = !!this.runtimeManager.getClient(session.id);
1056
407
  const handle = await this.getOrCreateAcpSessionClient(session.id, options ?? {}, session);
1057
408
  if (!(hadClient || session.providerSessionId)) {
1058
409
  await this.applyConfiguredPermissionPreset(session.id, session, handle);
@@ -1060,135 +411,28 @@ class SessionService {
1060
411
  return handle;
1061
412
  }
1062
413
  getSessionClient(sessionId) {
1063
- return acpRuntimeManager.getClient(sessionId);
414
+ return this.runtimeManager.getClient(sessionId);
1064
415
  }
1065
416
  getSessionConfigOptions(sessionId) {
1066
- const acpHandle = acpRuntimeManager.getClient(sessionId);
1067
- return acpHandle ? [...acpHandle.configOptions] : [];
417
+ return this.sessionConfigService.getSessionConfigOptions(sessionId);
1068
418
  }
1069
- async getSessionConfigOptionsWithFallback(sessionId) {
1070
- const liveConfigOptions = this.getSessionConfigOptions(sessionId);
1071
- if (liveConfigOptions.length > 0) {
1072
- return liveConfigOptions;
1073
- }
1074
- const session = await this.repository.getSessionById(sessionId);
1075
- if (!session) {
1076
- return [];
1077
- }
1078
- const cachedSnapshot = this.extractAcpConfigSnapshot(session.providerMetadata);
1079
- if (cachedSnapshot && cachedSnapshot.provider === session.provider) {
1080
- return [...cachedSnapshot.configOptions];
1081
- }
1082
- return [];
419
+ getSessionConfigOptionsWithFallback(sessionId) {
420
+ return this.sessionConfigService.getSessionConfigOptionsWithFallback(sessionId);
1083
421
  }
1084
422
  async setSessionModel(sessionId, model) {
1085
- const acpHandle = acpRuntimeManager.getClient(sessionId);
1086
- if (acpHandle) {
1087
- const modelOption = acpHandle.configOptions.find((o) => o.category === 'model');
1088
- if (modelOption && model) {
1089
- const availableValues = this.getConfigOptionValues(modelOption);
1090
- if (availableValues.length > 0 && !availableValues.includes(model)) {
1091
- logger.debug('Skipping unsupported model for ACP session', {
1092
- sessionId,
1093
- provider: acpHandle.provider,
1094
- model,
1095
- availableValues,
1096
- });
1097
- return;
1098
- }
1099
- await this.setSessionConfigOption(sessionId, modelOption.id, model);
1100
- }
1101
- return;
1102
- }
1103
- logger.debug('No ACP handle for setSessionModel', { sessionId, model });
423
+ await this.sessionConfigService.setSessionModel(sessionId, model);
1104
424
  }
1105
425
  setSessionReasoningEffort(sessionId, _effort) {
1106
426
  logger.debug('setSessionReasoningEffort is a no-op for ACP sessions', { sessionId });
1107
427
  }
1108
428
  async setSessionThinkingBudget(sessionId, maxTokens) {
1109
- const acpHandle = acpRuntimeManager.getClient(sessionId);
1110
- if (acpHandle) {
1111
- const thoughtOption = acpHandle.configOptions.find((o) => o.category === 'thought_level');
1112
- if (thoughtOption && maxTokens != null) {
1113
- await this.setSessionConfigOption(sessionId, thoughtOption.id, String(maxTokens));
1114
- }
1115
- return;
1116
- }
1117
- logger.debug('No ACP handle for setSessionThinkingBudget', { sessionId, maxTokens });
429
+ await this.sessionConfigService.setSessionThinkingBudget(sessionId, maxTokens);
1118
430
  }
1119
431
  async setSessionConfigOption(sessionId, configId, value) {
1120
- const acpHandle = acpRuntimeManager.getClient(sessionId);
1121
- if (!acpHandle) {
1122
- const configOptions = await this.setCachedSessionConfigOption(sessionId, configId, value);
1123
- sessionDomainService.emitDelta(sessionId, {
1124
- type: 'config_options_update',
1125
- configOptions,
1126
- });
1127
- return;
1128
- }
1129
- const selectedOption = acpHandle.configOptions.find((option) => option.id === configId);
1130
- const isModeOption = configId === 'mode' || selectedOption?.category === 'mode';
1131
- const isModelOption = configId === 'model' || selectedOption?.category === 'model';
1132
- const configOptions = isModeOption
1133
- ? await acpRuntimeManager.setSessionMode(sessionId, value)
1134
- : isModelOption
1135
- ? await acpRuntimeManager.setSessionModel(sessionId, value)
1136
- : await acpRuntimeManager.setConfigOption(sessionId, configId, value);
1137
- sessionDomainService.emitDelta(sessionId, {
1138
- type: 'config_options_update',
1139
- configOptions,
1140
- });
1141
- const acpHandleAfterUpdate = acpRuntimeManager.getClient(sessionId);
1142
- if (acpHandleAfterUpdate) {
1143
- await this.persistAcpConfigSnapshot(sessionId, {
1144
- provider: acpHandleAfterUpdate.provider,
1145
- providerSessionId: acpHandleAfterUpdate.providerSessionId,
1146
- configOptions: configOptions,
1147
- });
1148
- }
1149
- }
1150
- async setCachedSessionConfigOption(sessionId, configId, value) {
1151
- const session = await this.repository.getSessionById(sessionId);
1152
- if (!session) {
1153
- throw new Error(`Session not found: ${sessionId}`);
1154
- }
1155
- const snapshot = this.extractAcpConfigSnapshot(session.providerMetadata);
1156
- if (!snapshot || snapshot.provider !== session.provider) {
1157
- throw new Error(`Cannot set config option for inactive session ${sessionId}: no cached ACP config available`);
1158
- }
1159
- const configOptions = this.updateCachedConfigOptions(snapshot.configOptions, configId, value);
1160
- await this.persistAcpConfigSnapshot(sessionId, {
1161
- provider: snapshot.provider,
1162
- providerSessionId: snapshot.providerSessionId,
1163
- configOptions,
1164
- existingMetadata: session.providerMetadata,
1165
- });
1166
- return configOptions;
1167
- }
1168
- updateCachedConfigOptions(configOptions, configId, value) {
1169
- let didUpdate = false;
1170
- const nextConfigOptions = configOptions.map((option) => {
1171
- if (option.id !== configId) {
1172
- return option;
1173
- }
1174
- const allowedValues = this.getConfigOptionValues(option);
1175
- if (allowedValues.length > 0 && !allowedValues.includes(value)) {
1176
- throw new Error(`Unsupported value "${value}" for config option "${configId}"` +
1177
- ` (allowed: ${allowedValues.join(', ')})`);
1178
- }
1179
- didUpdate = true;
1180
- return {
1181
- ...option,
1182
- currentValue: value,
1183
- };
1184
- });
1185
- if (!didUpdate) {
1186
- throw new Error(`Unknown config option: ${configId}`);
1187
- }
1188
- return nextConfigOptions;
432
+ await this.sessionConfigService.setSessionConfigOption(sessionId, configId, value);
1189
433
  }
1190
434
  sendSessionMessage(sessionId, content) {
1191
- const acpClient = acpRuntimeManager.getClient(sessionId);
435
+ const acpClient = this.runtimeManager.getClient(sessionId);
1192
436
  if (acpClient) {
1193
437
  const normalizedText = typeof content === 'string' ? content : this.normalizeContentToText(content);
1194
438
  return this.sendAcpMessage(sessionId, normalizedText).then(() => {
@@ -1230,9 +474,9 @@ class SessionService {
1230
474
  return chunks.join('\n\n');
1231
475
  }
1232
476
  async sendAcpMessage(sessionId, content) {
1233
- const workspaceId = this.sessionToWorkspace.get(sessionId);
1234
- this.pendingAcpToolCalls.set(sessionId, new Map());
1235
- sessionDomainService.setRuntimeSnapshot(sessionId, {
477
+ const workspaceId = this.acpEventProcessor.getWorkspaceId(sessionId);
478
+ this.acpEventProcessor.beginPromptTurn(sessionId);
479
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1236
480
  phase: 'running',
1237
481
  processState: 'alive',
1238
482
  activity: 'WORKING',
@@ -1242,9 +486,9 @@ class SessionService {
1242
486
  this.workspaceBridge.markSessionRunning(workspaceId, sessionId);
1243
487
  }
1244
488
  try {
1245
- const result = await acpRuntimeManager.sendPrompt(sessionId, content);
1246
- this.finalizeOrphanedToolCalls(sessionId, `stop_reason:${result.stopReason}`);
1247
- sessionDomainService.setRuntimeSnapshot(sessionId, {
489
+ const result = await this.runtimeManager.sendPrompt(sessionId, content);
490
+ this.acpEventProcessor.finalizeOrphanedToolCalls(sessionId, `stop_reason:${result.stopReason}`);
491
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1248
492
  phase: 'idle',
1249
493
  processState: 'alive',
1250
494
  activity: 'IDLE',
@@ -1253,8 +497,8 @@ class SessionService {
1253
497
  return result.stopReason;
1254
498
  }
1255
499
  catch (error) {
1256
- this.finalizeOrphanedToolCalls(sessionId, 'prompt_error');
1257
- sessionDomainService.setRuntimeSnapshot(sessionId, {
500
+ this.acpEventProcessor.finalizeOrphanedToolCalls(sessionId, 'prompt_error');
501
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1258
502
  phase: 'error',
1259
503
  processState: 'alive',
1260
504
  activity: 'IDLE',
@@ -1274,9 +518,12 @@ class SessionService {
1274
518
  if (!this.promptTurnCompleteHandler) {
1275
519
  return;
1276
520
  }
1277
- setTimeout(() => {
521
+ this.clearScheduledPromptTurnCompletion(sessionId);
522
+ const timeout = setTimeout(() => {
523
+ this.promptTurnCompleteTimeouts.delete(sessionId);
1278
524
  void this.notifyPromptTurnComplete(sessionId);
1279
525
  }, 0);
526
+ this.promptTurnCompleteTimeouts.set(sessionId, timeout);
1280
527
  }
1281
528
  async notifyPromptTurnComplete(sessionId) {
1282
529
  if (!this.promptTurnCompleteHandler) {
@@ -1292,11 +539,25 @@ class SessionService {
1292
539
  });
1293
540
  }
1294
541
  }
542
+ clearScheduledPromptTurnCompletion(sessionId) {
543
+ const timeout = this.promptTurnCompleteTimeouts.get(sessionId);
544
+ if (!timeout) {
545
+ return;
546
+ }
547
+ clearTimeout(timeout);
548
+ this.promptTurnCompleteTimeouts.delete(sessionId);
549
+ }
550
+ clearAllScheduledPromptTurnCompletions() {
551
+ for (const timeout of this.promptTurnCompleteTimeouts.values()) {
552
+ clearTimeout(timeout);
553
+ }
554
+ this.promptTurnCompleteTimeouts.clear();
555
+ }
1295
556
  async cancelAcpPrompt(sessionId) {
1296
- await acpRuntimeManager.cancelPrompt(sessionId);
557
+ await this.runtimeManager.cancelPrompt(sessionId);
1297
558
  }
1298
559
  getSessionConversationHistory(sessionId, _workingDir) {
1299
- const transcript = sessionDomainService.getTranscriptSnapshot(sessionId);
560
+ const transcript = this.sessionDomainService.getTranscriptSnapshot(sessionId);
1300
561
  return transcript.flatMap((entry) => this.mapTranscriptEntryToHistory(entry));
1301
562
  }
1302
563
  mapTranscriptEntryToHistory(entry) {
@@ -1342,19 +603,15 @@ class SessionService {
1342
603
  .trim();
1343
604
  }
1344
605
  respondToAcpPermission(sessionId, requestId, optionId, answers) {
1345
- const bridge = this.acpPermissionBridges.get(sessionId);
1346
- if (!bridge) {
1347
- return false;
1348
- }
1349
- return bridge.resolvePermission(requestId, optionId, answers);
606
+ return this.sessionPermissionService.respondToPermission(sessionId, requestId, optionId, answers);
1350
607
  }
1351
608
  getRuntimeSnapshot(sessionId) {
1352
609
  const fallback = createInitialSessionRuntimeState();
1353
- const persisted = sessionDomainService.getRuntimeSnapshot(sessionId);
610
+ const persisted = this.sessionDomainService.getRuntimeSnapshot(sessionId);
1354
611
  const base = persisted ?? fallback;
1355
- const acpClient = acpRuntimeManager.getClient(sessionId);
612
+ const acpClient = this.runtimeManager.getClient(sessionId);
1356
613
  if (acpClient) {
1357
- const isWorking = acpRuntimeManager.isSessionWorking(sessionId);
614
+ const isWorking = this.runtimeManager.isSessionWorking(sessionId);
1358
615
  return {
1359
616
  phase: isWorking ? 'running' : 'idle',
1360
617
  processState: 'alive',
@@ -1362,7 +619,7 @@ class SessionService {
1362
619
  updatedAt: base.updatedAt,
1363
620
  };
1364
621
  }
1365
- if (acpRuntimeManager.isStopInProgress(sessionId)) {
622
+ if (this.runtimeManager.isStopInProgress(sessionId)) {
1366
623
  return {
1367
624
  ...base,
1368
625
  phase: 'stopping',
@@ -1381,9 +638,9 @@ class SessionService {
1381
638
  return base;
1382
639
  }
1383
640
  async getOrCreateAcpSessionClient(sessionId, options, session) {
1384
- const existingAcp = acpRuntimeManager.getClient(sessionId);
641
+ const existingAcp = this.runtimeManager.getClient(sessionId);
1385
642
  if (existingAcp) {
1386
- sessionDomainService.setRuntimeSnapshot(sessionId, {
643
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1387
644
  phase: existingAcp.isPromptInFlight ? 'running' : 'idle',
1388
645
  processState: 'alive',
1389
646
  activity: existingAcp.isPromptInFlight ? 'WORKING' : 'IDLE',
@@ -1391,7 +648,7 @@ class SessionService {
1391
648
  });
1392
649
  return existingAcp;
1393
650
  }
1394
- sessionDomainService.setRuntimeSnapshot(sessionId, {
651
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1395
652
  phase: 'starting',
1396
653
  processState: 'alive',
1397
654
  activity: 'IDLE',
@@ -1402,7 +659,7 @@ class SessionService {
1402
659
  handle = await this.createAcpClient(sessionId, options, session);
1403
660
  }
1404
661
  catch (error) {
1405
- sessionDomainService.setRuntimeSnapshot(sessionId, {
662
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1406
663
  phase: 'error',
1407
664
  processState: 'stopped',
1408
665
  activity: 'IDLE',
@@ -1414,7 +671,7 @@ class SessionService {
1414
671
  await this.repository.updateSession(sessionId, {
1415
672
  status: SessionStatus.RUNNING,
1416
673
  });
1417
- sessionDomainService.setRuntimeSnapshot(sessionId, {
674
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1418
675
  phase: handle.isPromptInFlight ? 'running' : 'idle',
1419
676
  processState: 'alive',
1420
677
  activity: handle.isPromptInFlight ? 'WORKING' : 'IDLE',
@@ -1423,13 +680,13 @@ class SessionService {
1423
680
  return handle;
1424
681
  }
1425
682
  isSessionRunning(sessionId) {
1426
- return acpRuntimeManager.isSessionRunning(sessionId);
683
+ return this.runtimeManager.isSessionRunning(sessionId);
1427
684
  }
1428
685
  isSessionWorking(sessionId) {
1429
- return acpRuntimeManager.isSessionWorking(sessionId);
686
+ return this.runtimeManager.isSessionWorking(sessionId);
1430
687
  }
1431
688
  isAnySessionWorking(sessionIds) {
1432
- return acpRuntimeManager.isAnySessionWorking(sessionIds);
689
+ return this.runtimeManager.isAnySessionWorking(sessionIds);
1433
690
  }
1434
691
  async getSessionOptions(sessionId) {
1435
692
  const sessionContext = await this.loadSessionContext(sessionId);
@@ -1443,121 +700,16 @@ class SessionService {
1443
700
  model: sessionContext.model,
1444
701
  };
1445
702
  }
1446
- async getChatBarCapabilities(sessionId) {
1447
- const acpHandle = acpRuntimeManager.getClient(sessionId);
1448
- if (acpHandle) {
1449
- return this.buildAcpChatBarCapabilities(acpHandle);
1450
- }
1451
- const session = await this.repository.getSessionById(sessionId);
1452
- if (!session) {
1453
- return EMPTY_CHAT_BAR_CAPABILITIES;
1454
- }
1455
- const cachedSnapshot = this.extractAcpConfigSnapshot(session.providerMetadata);
1456
- if (cachedSnapshot && cachedSnapshot.provider === session.provider) {
1457
- return this.buildCapabilitiesFromConfigOptions(session.provider, cachedSnapshot.configOptions, cachedSnapshot.observedModelId);
1458
- }
1459
- if (session.provider === 'CODEX') {
1460
- return {
1461
- ...EMPTY_CHAT_BAR_CAPABILITIES,
1462
- provider: 'CODEX',
1463
- };
1464
- }
1465
- return EMPTY_CHAT_BAR_CAPABILITIES;
703
+ getChatBarCapabilities(sessionId) {
704
+ return this.sessionConfigService.getChatBarCapabilities(sessionId);
1466
705
  }
1467
706
  buildAcpChatBarCapabilities(handle) {
1468
- return this.buildCapabilitiesFromConfigOptions(handle.provider, handle.configOptions);
1469
- }
1470
- buildCapabilitiesFromConfigOptions(provider, configOptions, fallbackModel) {
1471
- const modelOption = configOptions.find((o) => o.category === 'model');
1472
- const modeOption = configOptions.find((o) => o.category === 'mode');
1473
- const thoughtOption = configOptions.find((o) => o.category === 'thought_level' || o.id === 'reasoning_effort' || o.category === 'reasoning');
1474
- const selectedModel = modelOption?.currentValue
1475
- ? String(modelOption.currentValue)
1476
- : (fallbackModel ?? undefined);
1477
- const modelOptions = this.buildModelOptions(modelOption, selectedModel);
1478
- const isCodexProvider = provider === 'CODEX';
1479
- const reasoningOptions = isCodexProvider && thoughtOption
1480
- ? this.getSelectOptions(thoughtOption).map((option) => ({
1481
- value: option.value,
1482
- label: option.name ?? option.value,
1483
- ...(option.description ? { description: option.description } : {}),
1484
- }))
1485
- : [];
1486
- const reasoningValues = new Set(reasoningOptions.map((option) => option.value));
1487
- const selectedReasoning = isCodexProvider &&
1488
- thoughtOption?.currentValue &&
1489
- typeof thoughtOption.currentValue === 'string' &&
1490
- reasoningValues.has(thoughtOption.currentValue)
1491
- ? thoughtOption.currentValue
1492
- : undefined;
1493
- const modeDescriptors = modeOption
1494
- ? [
1495
- ...this.getConfigOptionValues(modeOption),
1496
- ...this.getSelectOptions(modeOption)
1497
- .map((entry) => entry.name ?? '')
1498
- .filter((value) => value.trim().length > 0),
1499
- ]
1500
- : [];
1501
- const planModeEnabled = modeDescriptors.some((entry) => /plan/i.test(entry));
1502
- return {
1503
- provider,
1504
- model: {
1505
- enabled: modelOptions.length > 0,
1506
- options: modelOptions,
1507
- ...(selectedModel ? { selected: selectedModel } : {}),
1508
- },
1509
- reasoning: {
1510
- enabled: reasoningOptions.length > 0,
1511
- options: reasoningOptions,
1512
- ...(selectedReasoning ? { selected: selectedReasoning } : {}),
1513
- },
1514
- thinking: {
1515
- enabled: !isCodexProvider && !!thoughtOption,
1516
- },
1517
- planMode: { enabled: planModeEnabled },
1518
- attachments: isCodexProvider
1519
- ? { enabled: false, kinds: [] }
1520
- : { enabled: true, kinds: ['image', 'text'] },
1521
- slashCommands: { enabled: false },
1522
- usageStats: { enabled: false, contextWindow: false },
1523
- rewind: { enabled: false },
1524
- };
1525
- }
1526
- buildModelOptions(modelOption, selectedModel) {
1527
- if (!modelOption) {
1528
- return selectedModel ? [{ value: selectedModel, label: selectedModel }] : [];
1529
- }
1530
- const byValue = new Map();
1531
- for (const option of this.getSelectOptions(modelOption)) {
1532
- if (!byValue.has(option.value)) {
1533
- byValue.set(option.value, option.name ?? option.value);
1534
- }
1535
- }
1536
- if (selectedModel && !byValue.has(selectedModel)) {
1537
- byValue.set(selectedModel, selectedModel);
1538
- }
1539
- return Array.from(byValue.entries()).map(([value, label]) => ({ value, label }));
1540
- }
1541
- getSelectOptions(option) {
1542
- return option.options.flatMap((entry) => {
1543
- if (typeof entry !== 'object' || entry === null) {
1544
- return [];
1545
- }
1546
- if ('value' in entry && typeof entry.value === 'string') {
1547
- return [entry];
1548
- }
1549
- if ('options' in entry && Array.isArray(entry.options)) {
1550
- return entry.options.filter((grouped) => typeof grouped === 'object' && grouped !== null && typeof grouped.value === 'string');
1551
- }
1552
- return [];
1553
- });
1554
- }
1555
- getConfigOptionValues(option) {
1556
- return this.getSelectOptions(option).map((entry) => entry.value);
707
+ return this.sessionConfigService.buildAcpChatBarCapabilities(handle);
1557
708
  }
1558
- async stopAllClients(_timeoutMs = 5000) {
709
+ async stopAllClients(timeoutMs = 5000) {
710
+ this.clearAllScheduledPromptTurnCompletions();
1559
711
  try {
1560
- await acpRuntimeManager.stopAllClients();
712
+ await this.runtimeManager.stopAllClients(timeoutMs);
1561
713
  }
1562
714
  catch (error) {
1563
715
  logger.error('Failed to stop ACP clients during shutdown', {
@@ -1567,105 +719,7 @@ class SessionService {
1567
719
  }
1568
720
  }
1569
721
  async persistAcpConfigSnapshot(sessionId, params) {
1570
- if (params.configOptions.length === 0) {
1571
- return;
1572
- }
1573
- const configOptionsForStorage = this.cloneConfigOptionsForStorage(params.configOptions);
1574
- const observedModelId = this.resolveObservedModel(configOptionsForStorage);
1575
- const metadataSource = params.existingMetadata ??
1576
- (await this.repository.getSessionById(sessionId))?.providerMetadata ??
1577
- null;
1578
- const snapshot = {
1579
- provider: params.provider,
1580
- providerSessionId: params.providerSessionId,
1581
- capturedAt: new Date().toISOString(),
1582
- configOptions: configOptionsForStorage,
1583
- ...(observedModelId ? { observedModelId } : {}),
1584
- };
1585
- const persistedUpdate = this.buildSnapshotPersistUpdate(metadataSource, snapshot, observedModelId);
1586
- try {
1587
- await this.repository.updateSession(sessionId, persistedUpdate);
1588
- }
1589
- catch (error) {
1590
- logger.warn('Failed persisting ACP config snapshot to session metadata; retrying once', {
1591
- sessionId,
1592
- error: error instanceof Error ? error.message : String(error),
1593
- });
1594
- await this.retryPersistAcpConfigSnapshot(sessionId, snapshot, observedModelId);
1595
- }
1596
- }
1597
- buildSnapshotPersistUpdate(metadataSource, snapshot, observedModelId) {
1598
- const nextMetadata = {
1599
- ...this.toMetadataRecord(metadataSource),
1600
- acpConfigSnapshot: snapshot,
1601
- };
1602
- if (observedModelId) {
1603
- nextMetadata.observedModelId = observedModelId;
1604
- }
1605
- return {
1606
- providerMetadata: nextMetadata,
1607
- ...(observedModelId ? { model: observedModelId } : {}),
1608
- };
1609
- }
1610
- async retryPersistAcpConfigSnapshot(sessionId, snapshot, observedModelId) {
1611
- try {
1612
- const latestMetadataSource = (await this.repository.getSessionById(sessionId))
1613
- ?.providerMetadata;
1614
- await this.repository.updateSession(sessionId, this.buildSnapshotPersistUpdate(latestMetadataSource, snapshot, observedModelId));
1615
- }
1616
- catch (retryError) {
1617
- logger.warn('Retry failed persisting ACP config snapshot to session metadata', {
1618
- sessionId,
1619
- error: retryError instanceof Error ? retryError.message : String(retryError),
1620
- });
1621
- }
1622
- }
1623
- cloneConfigOptionsForStorage(configOptions) {
1624
- try {
1625
- return structuredClone(configOptions);
1626
- }
1627
- catch {
1628
- return configOptions;
1629
- }
1630
- }
1631
- toMetadataRecord(metadata) {
1632
- if (typeof metadata !== 'object' || metadata === null || Array.isArray(metadata)) {
1633
- return {};
1634
- }
1635
- return { ...metadata };
1636
- }
1637
- extractAcpConfigSnapshot(metadata) {
1638
- const record = this.toMetadataRecord(metadata);
1639
- const snapshot = record.acpConfigSnapshot;
1640
- if (typeof snapshot !== 'object' || snapshot === null || Array.isArray(snapshot)) {
1641
- return null;
1642
- }
1643
- const candidate = snapshot;
1644
- const provider = candidate.provider;
1645
- const providerSessionId = candidate.providerSessionId;
1646
- const configOptions = candidate.configOptions;
1647
- const observedModelId = candidate.observedModelId;
1648
- if (provider !== 'CLAUDE' && provider !== 'CODEX') {
1649
- return null;
1650
- }
1651
- if (typeof providerSessionId !== 'string' || providerSessionId.length === 0) {
1652
- return null;
1653
- }
1654
- if (!Array.isArray(configOptions)) {
1655
- return null;
1656
- }
1657
- return {
1658
- provider,
1659
- providerSessionId,
1660
- capturedAt: typeof candidate.capturedAt === 'string' ? candidate.capturedAt : new Date(0).toISOString(),
1661
- configOptions: configOptions,
1662
- ...(typeof observedModelId === 'string' ? { observedModelId } : {}),
1663
- };
1664
- }
1665
- resolveObservedModel(configOptions) {
1666
- const modelOption = configOptions.find((option) => option.category === 'model');
1667
- const currentValue = modelOption?.currentValue;
1668
- return currentValue ? String(currentValue) : undefined;
722
+ await this.sessionConfigService.persistAcpConfigSnapshot(sessionId, params);
1669
723
  }
1670
724
  async loadSessionContext(sessionId, preloadedSession) {
1671
725
  const session = preloadedSession ?? (await this.repository.getSessionById(sessionId));
@@ -1728,5 +782,8 @@ class SessionService {
1728
782
  };
1729
783
  }
1730
784
  }
1731
- export const sessionService = new SessionService();
785
+ export function createSessionService(options) {
786
+ return new SessionService(options);
787
+ }
788
+ export const sessionService = createSessionService();
1732
789
  //# sourceMappingURL=session.service.js.map