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
@@ -4,6 +4,7 @@ import { SessionStatus } from '../../../../shared/core/index.js';
4
4
  import { unsafeCoerce } from '../../../../test-utils/unsafe-coerce.js';
5
5
  const mockNotifyToolStart = vi.fn();
6
6
  const mockNotifyToolComplete = vi.fn();
7
+ const mockClearRatchetActiveSessionIfMatching = vi.fn();
7
8
  vi.mock('@/backend/services/logger.service', () => ({
8
9
  createLogger: () => ({
9
10
  debug: vi.fn(),
@@ -56,7 +57,6 @@ vi.mock('./session.repository', () => ({
56
57
  getProjectById: vi.fn(),
57
58
  markWorkspaceHasHadSessions: vi.fn(),
58
59
  updateSession: vi.fn(),
59
- clearRatchetActiveSession: vi.fn(),
60
60
  deleteSession: vi.fn(),
61
61
  },
62
62
  }));
@@ -72,20 +72,25 @@ import { acpRuntimeManager } from '../../../../backend/domains/session/acp/index
72
72
  import { sessionPromptBuilder } from './session.prompt-builder.js';
73
73
  import { sessionRepository } from './session.repository.js';
74
74
  import { sessionService } from './session.service.js';
75
+ function getAcpProcessorState() {
76
+ return sessionService.acpEventProcessor;
77
+ }
75
78
  describe('SessionService', () => {
76
79
  beforeEach(() => {
77
80
  vi.clearAllMocks();
78
81
  mockNotifyToolStart.mockReset();
79
82
  mockNotifyToolComplete.mockReset();
80
- const serviceState = sessionService;
81
- serviceState.pendingAcpToolCalls.clear();
82
- serviceState.sessionToWorkspace.clear();
83
- serviceState.sessionToWorkingDir.clear();
83
+ mockClearRatchetActiveSessionIfMatching.mockReset();
84
+ const acpProcessor = getAcpProcessorState();
85
+ acpProcessor.pendingAcpToolCalls.clear();
86
+ acpProcessor.sessionToWorkspace.clear();
87
+ acpProcessor.sessionToWorkingDir.clear();
84
88
  sessionService.setPromptTurnCompleteHandler(null);
85
89
  sessionService.configure({
86
90
  workspace: {
87
91
  markSessionRunning: vi.fn(),
88
92
  markSessionIdle: vi.fn(),
93
+ clearRatchetActiveSessionIfMatching: mockClearRatchetActiveSessionIfMatching,
89
94
  },
90
95
  });
91
96
  vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
@@ -202,7 +207,7 @@ describe('SessionService', () => {
202
207
  status: SessionStatus.RUNNING,
203
208
  });
204
209
  });
205
- it('applies Claude non-interactive startup mode preset when bypassPermissions is available', async () => {
210
+ it('injects replayed user_message_chunk events while session is idle', async () => {
206
211
  const session = unsafeCoerce({
207
212
  id: 'session-1',
208
213
  workspaceId: 'workspace-1',
@@ -210,176 +215,21 @@ describe('SessionService', () => {
210
215
  workflow: 'default',
211
216
  model: 'sonnet',
212
217
  provider: 'CLAUDE',
213
- providerSessionId: null,
214
- });
215
- const workspace = unsafeCoerce({
216
- id: 'workspace-1',
217
- worktreePath: '/tmp/work',
218
- branchName: 'feature-branch',
219
- isAutoGeneratedBranch: false,
220
- hasHadSessions: true,
221
- name: 'Workspace A',
222
- description: null,
223
- projectId: 'project-1',
224
- });
225
- const modeConfig = {
226
- id: 'mode',
227
- name: 'Mode',
228
- type: 'select',
229
- category: 'mode',
230
- currentValue: 'default',
231
- options: [
232
- { value: 'default', name: 'Default' },
233
- { value: 'bypassPermissions', name: 'Bypass Permissions' },
234
- ],
235
- };
236
- const acpHandle = unsafeCoerce({
237
- getPid: vi.fn().mockReturnValue(456),
238
- provider: 'CLAUDE',
239
218
  providerSessionId: 'provider-session-1',
240
- isPromptInFlight: false,
241
- configOptions: [modeConfig],
242
- });
243
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(session);
244
- vi.mocked(sessionRepository.getWorkspaceById).mockResolvedValue(workspace);
245
- vi.mocked(sessionRepository.markWorkspaceHasHadSessions).mockResolvedValue();
246
- vi.mocked(sessionRepository.updateSession).mockResolvedValue(session);
247
- vi.mocked(sessionPromptBuilder.shouldInjectBranchRename).mockReturnValue(false);
248
- vi.mocked(sessionPromptBuilder.buildSystemPrompt).mockReturnValue({
249
- workflowPrompt: undefined,
250
- systemPrompt: undefined,
251
- injectedBranchRename: false,
252
- });
253
- vi.mocked(acpRuntimeManager.getOrCreateClient).mockResolvedValue(acpHandle);
254
- vi.mocked(acpRuntimeManager.setSessionMode).mockResolvedValue([
255
- {
256
- ...modeConfig,
257
- currentValue: 'bypassPermissions',
258
- },
259
- ]);
260
- await sessionService.startSession('session-1', {
261
- initialPrompt: '',
262
- startupModePreset: 'non_interactive',
263
- });
264
- expect(acpRuntimeManager.setSessionMode).toHaveBeenCalledWith('session-1', 'bypassPermissions');
265
- expect(acpRuntimeManager.sendPrompt).not.toHaveBeenCalled();
266
- });
267
- it('applies Codex non-interactive startup mode preset using code mode', async () => {
268
- const session = unsafeCoerce({
269
- id: 'session-codex',
270
- workspaceId: 'workspace-1',
271
- status: SessionStatus.IDLE,
272
- workflow: 'default',
273
- model: 'gpt-5-codex',
274
- provider: 'CODEX',
275
- providerSessionId: null,
276
219
  });
277
220
  const workspace = unsafeCoerce({
278
221
  id: 'workspace-1',
279
222
  worktreePath: '/tmp/work',
280
223
  branchName: 'feature-branch',
281
224
  isAutoGeneratedBranch: false,
282
- hasHadSessions: true,
283
225
  name: 'Workspace A',
284
226
  description: null,
285
227
  projectId: 'project-1',
286
228
  });
287
- const modeConfig = {
288
- id: 'mode',
289
- name: 'Mode',
290
- type: 'select',
291
- category: 'mode',
292
- currentValue: 'ask',
293
- options: [
294
- { value: 'ask', name: 'Ask' },
295
- { value: 'code', name: 'Code' },
296
- ],
297
- };
298
229
  const acpHandle = unsafeCoerce({
299
- getPid: vi.fn().mockReturnValue(457),
300
- provider: 'CODEX',
301
- providerSessionId: 'provider-codex-1',
302
- isPromptInFlight: false,
303
- configOptions: [modeConfig],
304
- });
305
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(session);
306
- vi.mocked(sessionRepository.getWorkspaceById).mockResolvedValue(workspace);
307
- vi.mocked(sessionRepository.markWorkspaceHasHadSessions).mockResolvedValue();
308
- vi.mocked(sessionRepository.updateSession).mockResolvedValue(session);
309
- vi.mocked(sessionPromptBuilder.shouldInjectBranchRename).mockReturnValue(false);
310
- vi.mocked(sessionPromptBuilder.buildSystemPrompt).mockReturnValue({
311
- workflowPrompt: undefined,
312
- systemPrompt: undefined,
313
- injectedBranchRename: false,
314
- });
315
- vi.mocked(acpRuntimeManager.getOrCreateClient).mockResolvedValue(acpHandle);
316
- vi.mocked(acpRuntimeManager.setSessionMode).mockResolvedValue([
317
- {
318
- ...modeConfig,
319
- currentValue: 'code',
320
- },
321
- ]);
322
- await sessionService.startSession('session-codex', {
323
- initialPrompt: '',
324
- startupModePreset: 'non_interactive',
325
- });
326
- expect(acpRuntimeManager.setSessionMode).toHaveBeenCalledWith('session-codex', 'code');
327
- expect(acpRuntimeManager.sendPrompt).not.toHaveBeenCalled();
328
- });
329
- it('applies Codex ratchet non-interactive startup execution mode using YOLO', async () => {
330
- const session = unsafeCoerce({
331
- id: 'session-codex-ratchet',
332
- workspaceId: 'workspace-1',
333
- status: SessionStatus.IDLE,
334
- workflow: 'ratchet',
335
- model: 'gpt-5-codex',
336
- provider: 'CODEX',
337
- providerSessionId: null,
338
- });
339
- const workspace = unsafeCoerce({
340
- id: 'workspace-1',
341
- worktreePath: '/tmp/work',
342
- branchName: 'feature-branch',
343
- isAutoGeneratedBranch: false,
344
- hasHadSessions: true,
345
- name: 'Workspace A',
346
- description: null,
347
- projectId: 'project-1',
348
- });
349
- const modeConfig = {
350
- id: 'mode',
351
- name: 'Mode',
352
- type: 'select',
353
- category: 'mode',
354
- currentValue: 'ask',
355
- options: [
356
- { value: 'ask', name: 'Ask' },
357
- { value: 'code', name: 'Code' },
358
- ],
359
- };
360
- const executionModeConfig = {
361
- id: 'execution_mode',
362
- name: 'Execution Mode',
363
- type: 'select',
364
- category: 'permission',
365
- currentValue: '["on-failure","workspace-write"]',
366
- options: [
367
- {
368
- value: '["on-failure","workspace-write"]',
369
- name: 'On Failure (Workspace Write)',
370
- },
371
- {
372
- value: '["never","danger-full-access"]',
373
- name: 'YOLO (Full Access)',
374
- },
375
- ],
376
- };
377
- const acpHandle = unsafeCoerce({
378
- getPid: vi.fn().mockReturnValue(458),
379
- provider: 'CODEX',
380
- providerSessionId: 'provider-codex-ratchet-1',
230
+ getPid: vi.fn().mockReturnValue(456),
381
231
  isPromptInFlight: false,
382
- configOptions: [modeConfig, executionModeConfig],
232
+ configOptions: [],
383
233
  });
384
234
  vi.mocked(sessionRepository.getSessionById).mockResolvedValue(session);
385
235
  vi.mocked(sessionRepository.getWorkspaceById).mockResolvedValue(workspace);
@@ -392,100 +242,19 @@ describe('SessionService', () => {
392
242
  injectedBranchRename: false,
393
243
  });
394
244
  vi.mocked(acpRuntimeManager.getOrCreateClient).mockResolvedValue(acpHandle);
395
- vi.mocked(acpRuntimeManager.setSessionMode).mockResolvedValue([
396
- {
397
- ...modeConfig,
398
- currentValue: 'code',
399
- },
400
- executionModeConfig,
401
- ]);
402
- vi.mocked(acpRuntimeManager.setConfigOption).mockResolvedValue([
403
- {
404
- ...modeConfig,
405
- currentValue: 'code',
406
- },
407
- {
408
- ...executionModeConfig,
409
- currentValue: '["never","danger-full-access"]',
245
+ const injectUserMessageSpy = vi.spyOn(sessionDomainService, 'injectCommittedUserMessage');
246
+ await sessionService.getOrCreateSessionClient('session-1');
247
+ const acpHandlers = vi.mocked(acpRuntimeManager.getOrCreateClient).mock.calls[0][2];
248
+ acpHandlers.onAcpEvent('session-1', {
249
+ type: 'acp_session_update',
250
+ update: {
251
+ sessionUpdate: 'user_message_chunk',
252
+ content: { type: 'text', text: 'ping' },
410
253
  },
411
- ]);
412
- await sessionService.startSession('session-codex-ratchet', {
413
- initialPrompt: '',
414
- startupModePreset: 'non_interactive',
415
- });
416
- expect(acpRuntimeManager.setSessionMode).toHaveBeenCalledWith('session-codex-ratchet', 'code');
417
- expect(acpRuntimeManager.setConfigOption).toHaveBeenCalledWith('session-codex-ratchet', 'execution_mode', '["never","danger-full-access"]');
418
- expect(acpRuntimeManager.sendPrompt).not.toHaveBeenCalled();
419
- });
420
- it('continues startup when persisting startup mode preset config snapshot fails', async () => {
421
- const session = unsafeCoerce({
422
- id: 'session-1',
423
- workspaceId: 'workspace-1',
424
- status: SessionStatus.IDLE,
425
- workflow: 'default',
426
- model: 'sonnet',
427
- provider: 'CLAUDE',
428
- providerSessionId: null,
429
254
  });
430
- const workspace = unsafeCoerce({
431
- id: 'workspace-1',
432
- worktreePath: '/tmp/work',
433
- branchName: 'feature-branch',
434
- isAutoGeneratedBranch: false,
435
- hasHadSessions: true,
436
- name: 'Workspace A',
437
- description: null,
438
- projectId: 'project-1',
439
- });
440
- const modeConfig = {
441
- id: 'mode',
442
- name: 'Mode',
443
- type: 'select',
444
- category: 'mode',
445
- currentValue: 'default',
446
- options: [
447
- { value: 'default', name: 'Default' },
448
- { value: 'bypassPermissions', name: 'Bypass Permissions' },
449
- ],
450
- };
451
- const acpHandle = unsafeCoerce({
452
- getPid: vi.fn().mockReturnValue(459),
453
- provider: 'CLAUDE',
454
- providerSessionId: 'provider-session-1',
455
- isPromptInFlight: false,
456
- configOptions: [modeConfig],
457
- });
458
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(session);
459
- vi.mocked(sessionRepository.getWorkspaceById).mockResolvedValue(workspace);
460
- vi.mocked(sessionRepository.markWorkspaceHasHadSessions).mockResolvedValue();
461
- vi.mocked(sessionRepository.updateSession).mockResolvedValue(session);
462
- vi.mocked(sessionPromptBuilder.shouldInjectBranchRename).mockReturnValue(false);
463
- vi.mocked(sessionPromptBuilder.buildSystemPrompt).mockReturnValue({
464
- workflowPrompt: undefined,
465
- systemPrompt: undefined,
466
- injectedBranchRename: false,
467
- });
468
- vi.mocked(acpRuntimeManager.getOrCreateClient).mockResolvedValue(acpHandle);
469
- vi.mocked(acpRuntimeManager.setSessionMode).mockResolvedValue([
470
- {
471
- ...modeConfig,
472
- currentValue: 'bypassPermissions',
473
- },
474
- ]);
475
- const persistSpy = vi
476
- .spyOn(sessionService, 'persistAcpConfigSnapshot')
477
- .mockResolvedValueOnce(undefined)
478
- .mockRejectedValueOnce(new Error('db unavailable'));
479
- await expect(sessionService.startSession('session-1', {
480
- initialPrompt: '',
481
- startupModePreset: 'non_interactive',
482
- })).resolves.toBeUndefined();
483
- expect(acpRuntimeManager.setSessionMode).toHaveBeenCalledWith('session-1', 'bypassPermissions');
484
- expect(persistSpy).toHaveBeenCalledTimes(2);
485
- expect(acpHandle.configOptions[0]?.currentValue).toBe('bypassPermissions');
486
- expect(acpRuntimeManager.sendPrompt).not.toHaveBeenCalled();
255
+ expect(injectUserMessageSpy).toHaveBeenCalledWith('session-1', 'ping');
487
256
  });
488
- it('injects replayed user_message_chunk events while session is idle', async () => {
257
+ it('ignores malformed user_message_chunk events without content', async () => {
489
258
  const session = unsafeCoerce({
490
259
  id: 'session-1',
491
260
  workspaceId: 'workspace-1',
@@ -523,14 +292,13 @@ describe('SessionService', () => {
523
292
  const injectUserMessageSpy = vi.spyOn(sessionDomainService, 'injectCommittedUserMessage');
524
293
  await sessionService.getOrCreateSessionClient('session-1');
525
294
  const acpHandlers = vi.mocked(acpRuntimeManager.getOrCreateClient).mock.calls[0][2];
526
- acpHandlers.onAcpEvent('session-1', {
295
+ expect(() => acpHandlers.onAcpEvent('session-1', {
527
296
  type: 'acp_session_update',
528
297
  update: {
529
298
  sessionUpdate: 'user_message_chunk',
530
- content: { type: 'text', text: 'ping' },
531
299
  },
532
- });
533
- expect(injectUserMessageSpy).toHaveBeenCalledWith('session-1', 'ping');
300
+ })).not.toThrow();
301
+ expect(injectUserMessageSpy).not.toHaveBeenCalled();
534
302
  });
535
303
  it('suppresses replayed user_message_chunk when transcript is already hydrated', async () => {
536
304
  const session = unsafeCoerce({
@@ -646,10 +414,10 @@ describe('SessionService', () => {
646
414
  expect(injectUserMessageSpy).not.toHaveBeenCalled();
647
415
  });
648
416
  it('notifies interceptors for ACP tool_use start and tool_result completion', () => {
649
- const serviceState = sessionService;
650
- serviceState.sessionToWorkspace.set('session-1', 'workspace-1');
651
- serviceState.sessionToWorkingDir.set('session-1', '/tmp/workspace');
652
- serviceState.handleAcpDelta('session-1', {
417
+ const acpProcessor = getAcpProcessorState();
418
+ acpProcessor.sessionToWorkspace.set('session-1', 'workspace-1');
419
+ acpProcessor.sessionToWorkingDir.set('session-1', '/tmp/workspace');
420
+ acpProcessor.handleAcpDelta('session-1', {
653
421
  type: 'agent_message',
654
422
  data: {
655
423
  type: 'stream_event',
@@ -665,14 +433,14 @@ describe('SessionService', () => {
665
433
  },
666
434
  },
667
435
  });
668
- serviceState.handleAcpDelta('session-1', {
436
+ acpProcessor.handleAcpDelta('session-1', {
669
437
  type: 'tool_progress',
670
438
  tool_use_id: 'call-1',
671
439
  tool_name: 'commandExecution',
672
440
  acpStatus: 'completed',
673
441
  elapsed_time_seconds: 1,
674
442
  });
675
- serviceState.handleAcpDelta('session-1', {
443
+ acpProcessor.handleAcpDelta('session-1', {
676
444
  type: 'agent_message',
677
445
  data: {
678
446
  type: 'user',
@@ -780,6 +548,7 @@ describe('SessionService', () => {
780
548
  workspace: {
781
549
  markSessionRunning: vi.fn(),
782
550
  markSessionIdle,
551
+ clearRatchetActiveSessionIfMatching: mockClearRatchetActiveSessionIfMatching,
783
552
  },
784
553
  });
785
554
  vi.mocked(acpRuntimeManager.isStopInProgress).mockReturnValue(false);
@@ -807,11 +576,11 @@ describe('SessionService', () => {
807
576
  status: SessionStatus.IDLE,
808
577
  });
809
578
  expect(clearQueuedWorkSpy).toHaveBeenCalledWith('session-1', { emitSnapshot: true });
810
- expect(sessionRepository.clearRatchetActiveSession).not.toHaveBeenCalled();
579
+ expect(mockClearRatchetActiveSessionIfMatching).not.toHaveBeenCalled();
811
580
  expect(sessionRepository.deleteSession).not.toHaveBeenCalled();
812
581
  });
813
582
  it('finalizes orphaned ACP tool calls during manual stop', async () => {
814
- const pendingToolCalls = sessionService.pendingAcpToolCalls;
583
+ const pendingToolCalls = getAcpProcessorState().pendingAcpToolCalls;
815
584
  pendingToolCalls.set('session-1', new Map([
816
585
  [
817
586
  'call-1',
@@ -861,9 +630,10 @@ describe('SessionService', () => {
861
630
  workspace: {
862
631
  markSessionRunning: vi.fn(),
863
632
  markSessionIdle,
633
+ clearRatchetActiveSessionIfMatching: mockClearRatchetActiveSessionIfMatching,
864
634
  },
865
635
  });
866
- const pendingToolCalls = sessionService.pendingAcpToolCalls;
636
+ const pendingToolCalls = getAcpProcessorState().pendingAcpToolCalls;
867
637
  pendingToolCalls.set('session-1', new Map([
868
638
  [
869
639
  'call-1',
@@ -900,10 +670,9 @@ describe('SessionService', () => {
900
670
  workflow: 'ratchet',
901
671
  }));
902
672
  vi.mocked(sessionRepository.updateSession).mockResolvedValue({});
903
- vi.mocked(sessionRepository.clearRatchetActiveSession).mockResolvedValue();
904
673
  vi.mocked(sessionRepository.deleteSession).mockResolvedValue({});
905
674
  await sessionService.stopSession('session-1');
906
- expect(sessionRepository.clearRatchetActiveSession).toHaveBeenCalledWith('workspace-1', 'session-1');
675
+ expect(mockClearRatchetActiveSessionIfMatching).toHaveBeenCalledWith('workspace-1', 'session-1');
907
676
  expect(sessionRepository.deleteSession).toHaveBeenCalledWith('session-1');
908
677
  });
909
678
  it('does not delete non-ratchet session during manual stop', async () => {
@@ -930,7 +699,7 @@ describe('SessionService', () => {
930
699
  await sessionService.stopSession('session-3', {
931
700
  cleanupTransientRatchetSession: false,
932
701
  });
933
- expect(sessionRepository.clearRatchetActiveSession).toHaveBeenCalledWith('workspace-1', 'session-3');
702
+ expect(mockClearRatchetActiveSessionIfMatching).toHaveBeenCalledWith('workspace-1', 'session-3');
934
703
  expect(sessionRepository.deleteSession).not.toHaveBeenCalled();
935
704
  });
936
705
  it('marks process as stopped when ACP client creation fails', async () => {
@@ -1028,7 +797,6 @@ describe('SessionService', () => {
1028
797
  vi.mocked(sessionRepository.getProjectById).mockResolvedValue(project);
1029
798
  vi.mocked(sessionRepository.markWorkspaceHasHadSessions).mockResolvedValue();
1030
799
  vi.mocked(sessionRepository.updateSession).mockResolvedValue(session);
1031
- vi.mocked(sessionRepository.clearRatchetActiveSession).mockResolvedValue();
1032
800
  vi.mocked(sessionRepository.deleteSession).mockResolvedValue(session);
1033
801
  vi.mocked(sessionPromptBuilder.shouldInjectBranchRename).mockReturnValue(false);
1034
802
  vi.mocked(sessionPromptBuilder.buildSystemPrompt).mockReturnValue({
@@ -1044,7 +812,7 @@ describe('SessionService', () => {
1044
812
  expect(sessionRepository.updateSession).toHaveBeenCalledWith('session-1', {
1045
813
  status: SessionStatus.COMPLETED,
1046
814
  });
1047
- expect(sessionRepository.clearRatchetActiveSession).toHaveBeenCalledWith('workspace-1', 'session-1');
815
+ expect(mockClearRatchetActiveSessionIfMatching).toHaveBeenCalledWith('workspace-1', 'session-1');
1048
816
  expect(sessionRepository.deleteSession).toHaveBeenCalledWith('session-1');
1049
817
  });
1050
818
  it('does not delete session on ACP exit for non-ratchet workflows', async () => {
@@ -1075,7 +843,6 @@ describe('SessionService', () => {
1075
843
  vi.mocked(sessionRepository.getWorkspaceById).mockResolvedValue(workspace);
1076
844
  vi.mocked(sessionRepository.markWorkspaceHasHadSessions).mockResolvedValue();
1077
845
  vi.mocked(sessionRepository.updateSession).mockResolvedValue(session);
1078
- vi.mocked(sessionRepository.clearRatchetActiveSession).mockResolvedValue();
1079
846
  vi.mocked(sessionPromptBuilder.shouldInjectBranchRename).mockReturnValue(false);
1080
847
  vi.mocked(sessionPromptBuilder.buildSystemPrompt).mockReturnValue({
1081
848
  workflowPrompt: undefined,
@@ -1133,423 +900,8 @@ describe('SessionService', () => {
1133
900
  status: SessionStatus.RUNNING,
1134
901
  });
1135
902
  });
1136
- it('returns ACP config options for active session handles', () => {
1137
- const configOptions = [
1138
- {
1139
- id: 'model',
1140
- name: 'Model',
1141
- type: 'string',
1142
- category: 'model',
1143
- currentValue: 'sonnet',
1144
- options: [{ value: 'sonnet', name: 'Sonnet' }],
1145
- },
1146
- ];
1147
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1148
- configOptions,
1149
- }));
1150
- expect(sessionService.getSessionConfigOptions('session-1')).toEqual(configOptions);
1151
- });
1152
- it('returns empty config options when no ACP handle is active', () => {
1153
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1154
- expect(sessionService.getSessionConfigOptions('session-1')).toEqual([]);
1155
- });
1156
- it('returns cached config options when no ACP handle is active', async () => {
1157
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1158
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1159
- id: 'session-1',
1160
- provider: 'CLAUDE',
1161
- providerMetadata: {
1162
- acpConfigSnapshot: {
1163
- provider: 'CLAUDE',
1164
- providerSessionId: 'provider-session-1',
1165
- capturedAt: '2026-02-14T00:00:00.000Z',
1166
- configOptions: [
1167
- {
1168
- id: 'model',
1169
- name: 'Model',
1170
- type: 'select',
1171
- category: 'model',
1172
- currentValue: 'claude-sonnet-4-5',
1173
- options: [{ value: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' }],
1174
- },
1175
- ],
1176
- },
1177
- },
1178
- }));
1179
- await expect(sessionService.getSessionConfigOptionsWithFallback('session-1')).resolves.toEqual([
1180
- {
1181
- id: 'model',
1182
- name: 'Model',
1183
- type: 'select',
1184
- category: 'model',
1185
- currentValue: 'claude-sonnet-4-5',
1186
- options: [{ value: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' }],
1187
- },
1188
- ]);
1189
- });
1190
- it('returns empty Claude capabilities when no ACP handle or cached snapshot exists', async () => {
1191
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1192
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1193
- id: 'session-claude',
1194
- provider: 'CLAUDE',
1195
- model: 'claude-sonnet-4-5',
1196
- providerMetadata: null,
1197
- }));
1198
- const capabilities = await sessionService.getChatBarCapabilities('session-claude');
1199
- expect(capabilities.provider).toBe('CLAUDE');
1200
- expect(capabilities.model.enabled).toBe(false);
1201
- expect(capabilities.model.selected).toBeUndefined();
1202
- expect(capabilities.model.options).toEqual([]);
1203
- });
1204
- it('retries persisting ACP config snapshot metadata once when first write fails', async () => {
1205
- const configOptions = unsafeCoerce([
1206
- {
1207
- id: 'model',
1208
- name: 'Model',
1209
- type: 'select',
1210
- category: 'model',
1211
- currentValue: 'claude-sonnet-4-5',
1212
- options: [{ value: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' }],
1213
- },
1214
- ]);
1215
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1216
- provider: 'CLAUDE',
1217
- providerSessionId: 'provider-session-1',
1218
- configOptions,
1219
- }));
1220
- vi.mocked(acpRuntimeManager.setSessionModel).mockResolvedValue(configOptions);
1221
- vi.mocked(sessionRepository.updateSession)
1222
- .mockRejectedValueOnce(new Error('primary metadata write failed'))
1223
- .mockResolvedValueOnce(unsafeCoerce({ id: 'session-1' }));
1224
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1225
- id: 'session-1',
1226
- providerMetadata: { existing: 'metadata' },
1227
- }));
1228
- await sessionService.setSessionConfigOption('session-1', 'model', 'claude-sonnet-4-5');
1229
- const metadataUpdates = vi
1230
- .mocked(sessionRepository.updateSession)
1231
- .mock.calls.filter(([, update]) => Object.hasOwn(update, 'providerMetadata'));
1232
- expect(metadataUpdates).toHaveLength(2);
1233
- expect(metadataUpdates[1]?.[1]).toMatchObject({
1234
- model: 'claude-sonnet-4-5',
1235
- providerMetadata: expect.objectContaining({
1236
- existing: 'metadata',
1237
- acpConfigSnapshot: expect.any(Object),
1238
- }),
1239
- });
1240
- });
1241
- it('returns CODEX provider fallback capabilities when no ACP handle is active', async () => {
1242
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1243
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1244
- id: 'session-codex',
1245
- provider: 'CODEX',
1246
- }));
1247
- const capabilities = await sessionService.getChatBarCapabilities('session-codex');
1248
- expect(capabilities.provider).toBe('CODEX');
1249
- expect(capabilities.model.enabled).toBe(false);
1250
- });
1251
- it('derives CODEX model/reasoning/plan-mode capabilities from cached ACP config options', async () => {
1252
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1253
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1254
- id: 'session-codex',
1255
- provider: 'CODEX',
1256
- providerMetadata: {
1257
- acpConfigSnapshot: {
1258
- provider: 'CODEX',
1259
- providerSessionId: 'sess_123',
1260
- capturedAt: '2026-02-15T00:00:00.000Z',
1261
- configOptions: [
1262
- {
1263
- id: 'model',
1264
- name: 'Model',
1265
- type: 'select',
1266
- category: 'model',
1267
- currentValue: 'gpt-5-codex',
1268
- options: [
1269
- { value: 'gpt-5-codex', name: 'GPT-5 Codex' },
1270
- { value: 'gpt-5-mini', name: 'GPT-5 Mini' },
1271
- ],
1272
- },
1273
- {
1274
- id: 'mode',
1275
- name: 'Mode',
1276
- type: 'select',
1277
- category: 'mode',
1278
- currentValue: 'plan',
1279
- options: [
1280
- { value: 'ask', name: 'Ask' },
1281
- { value: 'plan', name: 'Plan' },
1282
- ],
1283
- },
1284
- {
1285
- id: 'reasoning_effort',
1286
- name: 'Reasoning Effort',
1287
- type: 'select',
1288
- category: 'thought_level',
1289
- currentValue: 'high',
1290
- options: [
1291
- { value: 'medium', name: 'Medium', description: 'Balanced' },
1292
- { value: 'high', name: 'High', description: 'Thorough' },
1293
- ],
1294
- },
1295
- ],
1296
- },
1297
- },
1298
- }));
1299
- const capabilities = await sessionService.getChatBarCapabilities('session-codex');
1300
- expect(capabilities.provider).toBe('CODEX');
1301
- expect(capabilities.model.options).toEqual([
1302
- { value: 'gpt-5-codex', label: 'GPT-5 Codex' },
1303
- { value: 'gpt-5-mini', label: 'GPT-5 Mini' },
1304
- ]);
1305
- expect(capabilities.reasoning.enabled).toBe(true);
1306
- expect(capabilities.reasoning.options).toEqual([
1307
- { value: 'medium', label: 'Medium', description: 'Balanced' },
1308
- { value: 'high', label: 'High', description: 'Thorough' },
1309
- ]);
1310
- expect(capabilities.reasoning.selected).toBe('high');
1311
- expect(capabilities.planMode.enabled).toBe(true);
1312
- expect(capabilities.thinking.enabled).toBe(false);
1313
- });
1314
- it('disables plan mode when ACP config options do not advertise a plan variant', async () => {
1315
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1316
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1317
- id: 'session-codex',
1318
- provider: 'CODEX',
1319
- providerMetadata: {
1320
- acpConfigSnapshot: {
1321
- provider: 'CODEX',
1322
- providerSessionId: 'sess_124',
1323
- capturedAt: '2026-02-15T00:00:00.000Z',
1324
- configOptions: [
1325
- {
1326
- id: 'mode',
1327
- name: 'Approval Policy',
1328
- type: 'select',
1329
- category: 'mode',
1330
- currentValue: 'on-failure',
1331
- options: [{ value: 'on-failure', name: 'On Failure' }],
1332
- },
1333
- ],
1334
- },
1335
- },
1336
- }));
1337
- const capabilities = await sessionService.getChatBarCapabilities('session-codex');
1338
- expect(capabilities.planMode.enabled).toBe(false);
1339
- });
1340
- it('skips setSessionModel when requested model is not in ACP model options', async () => {
1341
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1342
- provider: 'CODEX',
1343
- configOptions: [
1344
- {
1345
- id: 'model',
1346
- name: 'Model',
1347
- type: 'select',
1348
- category: 'model',
1349
- currentValue: 'gpt-5.3-codex',
1350
- options: [
1351
- { value: 'gpt-5.3-codex', name: 'GPT-5.3 Codex' },
1352
- { value: 'gpt-5.2-codex', name: 'GPT-5.2 Codex' },
1353
- ],
1354
- },
1355
- ],
1356
- }));
1357
- await sessionService.setSessionModel('session-codex', 'opus');
1358
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1359
- });
1360
- it('applies setSessionModel when requested model is supported by ACP options', async () => {
1361
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1362
- provider: 'CODEX',
1363
- configOptions: [
1364
- {
1365
- id: 'model',
1366
- name: 'Model',
1367
- type: 'select',
1368
- category: 'model',
1369
- currentValue: 'gpt-5.3-codex',
1370
- options: [
1371
- { value: 'gpt-5.3-codex', name: 'GPT-5.3 Codex' },
1372
- { value: 'gpt-5.2-codex', name: 'GPT-5.2 Codex' },
1373
- ],
1374
- },
1375
- ],
1376
- }));
1377
- vi.mocked(acpRuntimeManager.setSessionModel).mockResolvedValue([
1378
- {
1379
- id: 'model',
1380
- name: 'Model',
1381
- type: 'select',
1382
- category: 'model',
1383
- currentValue: 'gpt-5.2-codex',
1384
- options: [{ value: 'gpt-5.2-codex', name: 'GPT-5.2 Codex' }],
1385
- },
1386
- ]);
1387
- await sessionService.setSessionModel('session-codex', 'gpt-5.2-codex');
1388
- expect(acpRuntimeManager.setSessionModel).toHaveBeenCalledWith('session-codex', 'gpt-5.2-codex');
1389
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1390
- });
1391
- it('routes mode config updates through ACP setSessionMode', async () => {
1392
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1393
- provider: 'CLAUDE',
1394
- configOptions: [
1395
- {
1396
- id: 'mode',
1397
- name: 'Mode',
1398
- type: 'select',
1399
- category: 'mode',
1400
- currentValue: 'default',
1401
- options: [
1402
- { value: 'default', name: 'Default' },
1403
- { value: 'acceptEdits', name: 'Accept Edits' },
1404
- ],
1405
- },
1406
- ],
1407
- }));
1408
- vi.mocked(acpRuntimeManager.setSessionMode).mockResolvedValue([
1409
- {
1410
- id: 'mode',
1411
- name: 'Mode',
1412
- type: 'select',
1413
- category: 'mode',
1414
- currentValue: 'acceptEdits',
1415
- options: [
1416
- { value: 'default', name: 'Default' },
1417
- { value: 'acceptEdits', name: 'Accept Edits' },
1418
- ],
1419
- },
1420
- ]);
1421
- await sessionService.setSessionConfigOption('session-1', 'mode', 'acceptEdits');
1422
- expect(acpRuntimeManager.setSessionMode).toHaveBeenCalledWith('session-1', 'acceptEdits');
1423
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1424
- });
1425
- it('routes model config updates through ACP setSessionModel', async () => {
1426
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1427
- provider: 'CLAUDE',
1428
- configOptions: [
1429
- {
1430
- id: 'model',
1431
- name: 'Model',
1432
- type: 'select',
1433
- category: 'model',
1434
- currentValue: 'default',
1435
- options: [
1436
- { value: 'default', name: 'Default' },
1437
- { value: 'claude-sonnet-4-5', name: 'Sonnet 4.5' },
1438
- ],
1439
- },
1440
- ],
1441
- }));
1442
- vi.mocked(acpRuntimeManager.setSessionModel).mockResolvedValue([
1443
- {
1444
- id: 'model',
1445
- name: 'Model',
1446
- type: 'select',
1447
- category: 'model',
1448
- currentValue: 'claude-sonnet-4-5',
1449
- options: [
1450
- { value: 'default', name: 'Default' },
1451
- { value: 'claude-sonnet-4-5', name: 'Sonnet 4.5' },
1452
- ],
1453
- },
1454
- ]);
1455
- await sessionService.setSessionConfigOption('session-1', 'model', 'claude-sonnet-4-5');
1456
- expect(acpRuntimeManager.setSessionModel).toHaveBeenCalledWith('session-1', 'claude-sonnet-4-5');
1457
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1458
- });
1459
- it('updates cached config snapshot when setting config on inactive session', async () => {
1460
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1461
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1462
- id: 'session-1',
1463
- provider: 'CODEX',
1464
- providerMetadata: {
1465
- acpConfigSnapshot: {
1466
- provider: 'CODEX',
1467
- providerSessionId: 'thread_123',
1468
- capturedAt: '2026-02-15T00:00:00.000Z',
1469
- configOptions: [
1470
- {
1471
- id: 'execution_mode',
1472
- name: 'Execution Mode',
1473
- type: 'select',
1474
- category: 'permission',
1475
- currentValue: '["on-request","workspace-write"]',
1476
- options: [
1477
- {
1478
- value: '["on-request","workspace-write"]',
1479
- name: 'on-request + workspace-write',
1480
- },
1481
- {
1482
- value: '["on-failure","workspace-write"]',
1483
- name: 'on-failure + workspace-write',
1484
- },
1485
- ],
1486
- },
1487
- ],
1488
- },
1489
- },
1490
- }));
1491
- vi.mocked(sessionRepository.updateSession).mockResolvedValue(unsafeCoerce({ id: 'session-1' }));
1492
- const emitDeltaSpy = vi.spyOn(sessionDomainService, 'emitDelta');
1493
- await sessionService.setSessionConfigOption('session-1', 'execution_mode', '["on-failure","workspace-write"]');
1494
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1495
- expect(acpRuntimeManager.setSessionMode).not.toHaveBeenCalled();
1496
- expect(acpRuntimeManager.setSessionModel).not.toHaveBeenCalled();
1497
- expect(sessionRepository.updateSession).toHaveBeenCalledWith('session-1', expect.objectContaining({
1498
- providerMetadata: expect.objectContaining({
1499
- acpConfigSnapshot: expect.objectContaining({
1500
- configOptions: expect.arrayContaining([
1501
- expect.objectContaining({
1502
- id: 'execution_mode',
1503
- currentValue: '["on-failure","workspace-write"]',
1504
- }),
1505
- ]),
1506
- }),
1507
- }),
1508
- }));
1509
- expect(emitDeltaSpy).toHaveBeenCalledWith('session-1', expect.objectContaining({
1510
- type: 'config_options_update',
1511
- configOptions: expect.arrayContaining([
1512
- expect.objectContaining({
1513
- id: 'execution_mode',
1514
- currentValue: '["on-failure","workspace-write"]',
1515
- }),
1516
- ]),
1517
- }));
1518
- });
1519
- it('rejects unsupported cached config values on inactive session', async () => {
1520
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1521
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1522
- id: 'session-1',
1523
- provider: 'CODEX',
1524
- providerMetadata: {
1525
- acpConfigSnapshot: {
1526
- provider: 'CODEX',
1527
- providerSessionId: 'thread_123',
1528
- capturedAt: '2026-02-15T00:00:00.000Z',
1529
- configOptions: [
1530
- {
1531
- id: 'execution_mode',
1532
- name: 'Execution Mode',
1533
- type: 'select',
1534
- category: 'permission',
1535
- currentValue: '["on-request","workspace-write"]',
1536
- options: [
1537
- {
1538
- value: '["on-request","workspace-write"]',
1539
- name: 'on-request + workspace-write',
1540
- },
1541
- ],
1542
- },
1543
- ],
1544
- },
1545
- },
1546
- }));
1547
- await expect(sessionService.setSessionConfigOption('session-1', 'execution_mode', '["never","danger-full-access"]')).rejects.toThrow('Unsupported value');
1548
- expect(sessionRepository.updateSession).not.toHaveBeenCalled();
1549
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1550
- });
1551
903
  it('finalizes orphaned ACP tool calls when prompt ends without terminal updates', async () => {
1552
- const pendingToolCalls = sessionService.pendingAcpToolCalls;
904
+ const pendingToolCalls = getAcpProcessorState().pendingAcpToolCalls;
1553
905
  vi.mocked(acpRuntimeManager.sendPrompt).mockImplementation(() => {
1554
906
  pendingToolCalls.set('session-1', new Map([
1555
907
  [
@@ -1611,6 +963,25 @@ describe('SessionService', () => {
1611
963
  vi.useRealTimers();
1612
964
  }
1613
965
  });
966
+ it('cancels scheduled prompt-turn completion callback when session stops first', async () => {
967
+ vi.useFakeTimers();
968
+ try {
969
+ const onPromptTurnComplete = vi.fn().mockResolvedValue(undefined);
970
+ sessionService.setPromptTurnCompleteHandler(onPromptTurnComplete);
971
+ vi.mocked(acpRuntimeManager.sendPrompt).mockResolvedValue({
972
+ stopReason: 'end_turn',
973
+ });
974
+ vi.mocked(acpRuntimeManager.stopClient).mockResolvedValue();
975
+ vi.mocked(sessionRepository.updateSession).mockResolvedValue({});
976
+ await sessionService.sendAcpMessage('session-1', 'hello');
977
+ await sessionService.stopSession('session-1');
978
+ await vi.runOnlyPendingTimersAsync();
979
+ expect(onPromptTurnComplete).not.toHaveBeenCalled();
980
+ }
981
+ finally {
982
+ vi.useRealTimers();
983
+ }
984
+ });
1614
985
  it('swallows prompt-turn completion callback failures', async () => {
1615
986
  vi.useFakeTimers();
1616
987
  try {
@@ -1720,10 +1091,12 @@ describe('SessionService', () => {
1720
1091
  vi.mocked(acpRuntimeManager.stopAllClients).mockResolvedValue(undefined);
1721
1092
  await sessionService.stopAllClients(4321);
1722
1093
  expect(acpRuntimeManager.stopAllClients).toHaveBeenCalledTimes(1);
1094
+ expect(acpRuntimeManager.stopAllClients).toHaveBeenCalledWith(4321);
1723
1095
  });
1724
1096
  it('propagates ACP shutdown failure', async () => {
1725
1097
  vi.mocked(acpRuntimeManager.stopAllClients).mockRejectedValueOnce(new Error('acp shutdown failed'));
1726
1098
  await expect(sessionService.stopAllClients()).rejects.toThrow('acp shutdown failed');
1099
+ expect(acpRuntimeManager.stopAllClients).toHaveBeenCalledWith(5000);
1727
1100
  });
1728
1101
  });
1729
1102
  //# sourceMappingURL=session.service.test.js.map