factory-factory 0.3.8 → 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 (377) hide show
  1. package/dist/client/assets/{_basePickBy-BzH_iru3.js → _basePickBy-CoLLbaiQ.js} +1 -1
  2. package/dist/client/assets/{_baseUniq-D6ny9r_u.js → _baseUniq-xRgxfXUW.js} +1 -1
  3. package/dist/client/assets/{arc-CRVgibiy.js → arc-De4Ny3V9.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-VXUJARFQ-1aDFSaTZ.js → architectureDiagram-VXUJARFQ-DM0j158z.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-VD42YOAC-m3mDHY-k.js → blockDiagram-VD42YOAC-DKBZN-sz.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-YG6GDRKO-B7ZlkfXz.js → c4Diagram-YG6GDRKO-CIA6AVRp.js} +1 -1
  7. package/dist/client/assets/channel-DW2o9xrZ.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-zLj9eiFf.js → chunk-4BX2VUAB-BrHsCtgI.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-D6KQTgyD.js → chunk-55IACEB6-DLwlJB2L.js} +1 -1
  10. package/dist/client/assets/{chunk-B4BG7PRW-BQbzvx8l.js → chunk-B4BG7PRW-cqTY9ldj.js} +1 -1
  11. package/dist/client/assets/{chunk-DI55MBZ5-CPxKCw_e.js → chunk-DI55MBZ5-PAp7fYLU.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-nFaeGtHP.js → chunk-FMBD7UC4-CsvpScij.js} +1 -1
  13. package/dist/client/assets/{chunk-QN33PNHL-DhrGqSLY.js → chunk-QN33PNHL-DmkkCoc-.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-CZWrGmvf.js → chunk-QZHKN3VN-Ds5Tjlpo.js} +1 -1
  15. package/dist/client/assets/{chunk-TZMSLE5B-xhHdVO37.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-Cr0HX6ro.js → cose-bilkent-S5V4N54A-CQJ_MgcD.js} +1 -1
  20. package/dist/client/assets/{dagre-6UL2VRFP-s6RRMHqY.js → dagre-6UL2VRFP-CfyncTju.js} +1 -1
  21. package/dist/client/assets/{diagram-PSM6KHXK-BhdZNVs7.js → diagram-PSM6KHXK-BL2QA0bQ.js} +1 -1
  22. package/dist/client/assets/{diagram-QEK2KX5R-Dgwc4sx_.js → diagram-QEK2KX5R-BDcBrJO4.js} +1 -1
  23. package/dist/client/assets/{diagram-S2PKOQOG-BlcMpYrQ.js → diagram-S2PKOQOG-BxofoMik.js} +1 -1
  24. package/dist/client/assets/{erDiagram-Q2GNP2WA-BQQjswcC.js → erDiagram-Q2GNP2WA-CDGe-bUA.js} +1 -1
  25. package/dist/client/assets/{flowDiagram-NV44I4VS-_cBTH43Q.js → flowDiagram-NV44I4VS-CodDw20I.js} +1 -1
  26. package/dist/client/assets/{ganttDiagram-JELNMOA3-BxuyB7Oz.js → ganttDiagram-JELNMOA3-BHJlNcF5.js} +1 -1
  27. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-D0GjSYQi.js → gitGraphDiagram-V2S2FVAM-DsFPFnxn.js} +1 -1
  28. package/dist/client/assets/{graph-DNCXrik3.js → graph-DtyTGYVa.js} +1 -1
  29. package/dist/client/assets/index-BkwQogmx.css +1 -0
  30. package/dist/client/assets/{index-CCnMDzRJ.js → index-CSanKe06.js} +175 -175
  31. package/dist/client/assets/{infoDiagram-HS3SLOUP-BsUKtNMj.js → infoDiagram-HS3SLOUP-CczckdeY.js} +1 -1
  32. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-sScoNj-6.js → journeyDiagram-XKPGCS4Q-CIDlGmYi.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-3W4ZIXB7-CycFvltk.js → kanban-definition-3W4ZIXB7-Dvuu9eqr.js} +1 -1
  34. package/dist/client/assets/{layout-LTiJ8avf.js → layout-Cth5sJm6.js} +1 -1
  35. package/dist/client/assets/{linear-CnQEAniJ.js → linear-DRv-Y17x.js} +1 -1
  36. package/dist/client/assets/{mindmap-definition-VGOIOE7T-Du5mb-g5.js → mindmap-definition-VGOIOE7T-AXsc24V4.js} +1 -1
  37. package/dist/client/assets/{mobile-baseline-necQV4Mu.js → mobile-baseline-DXBPdrir.js} +1 -1
  38. package/dist/client/assets/{pieDiagram-ADFJNKIX-CUAEo70K.js → pieDiagram-ADFJNKIX-oIn8Bgi4.js} +1 -1
  39. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-1MjtTI_Y.js → quadrantDiagram-AYHSOK5B-rGTqNh3q.js} +1 -1
  40. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-zgmi2Sjr.js → requirementDiagram-UZGBJVZJ-DgE2dYES.js} +1 -1
  41. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-Datw0Rj8.js → sankeyDiagram-TZEHDZUN-BWRLa217.js} +1 -1
  42. package/dist/client/assets/{sequenceDiagram-WL72ISMW-DopxoRon.js → sequenceDiagram-WL72ISMW-lYEkh9VX.js} +1 -1
  43. package/dist/client/assets/{stateDiagram-FKZM4ZOC-ZqoVSvsu.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-gybkMDHu.js → terminal-instance-C3nwiweh.js} +1 -1
  46. package/dist/client/assets/{timeline-definition-IT6M3QCI-DQwpSE-n.js → timeline-definition-IT6M3QCI-Bzm_qoWF.js} +1 -1
  47. package/dist/client/assets/{treemap-GDKQZRPO-DK4UuMc6.js → treemap-GDKQZRPO-gouxKMUq.js} +1 -1
  48. package/dist/client/assets/{xychartDiagram-PRI3JC2R-CJP1ULwR.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 +1 -1
  55. package/dist/prisma/generated/internal/class.js.map +1 -1
  56. package/dist/src/backend/app-context.d.ts.map +1 -1
  57. package/dist/src/backend/app-context.js +3 -0
  58. package/dist/src/backend/app-context.js.map +1 -1
  59. package/dist/src/backend/domains/github/github-cli/mappers.d.ts +1 -1
  60. package/dist/src/backend/domains/github/github-cli/mappers.d.ts.map +1 -1
  61. package/dist/src/backend/domains/github/github-cli/mappers.js +2 -37
  62. package/dist/src/backend/domains/github/github-cli/mappers.js.map +1 -1
  63. package/dist/src/backend/domains/github/github-cli.service.test.js +20 -0
  64. package/dist/src/backend/domains/github/github-cli.service.test.js.map +1 -1
  65. package/dist/src/backend/domains/linear/linear-state-sync.service.d.ts.map +1 -1
  66. package/dist/src/backend/domains/linear/linear-state-sync.service.js.map +1 -1
  67. package/dist/src/backend/domains/ratchet/bridges.d.ts +4 -0
  68. package/dist/src/backend/domains/ratchet/bridges.d.ts.map +1 -1
  69. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.d.ts +15 -0
  70. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.d.ts.map +1 -0
  71. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.js +126 -0
  72. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.js.map +1 -0
  73. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.d.ts +14 -0
  74. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.d.ts.map +1 -0
  75. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.js +55 -0
  76. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.js.map +1 -0
  77. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.d.ts +107 -0
  78. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.d.ts.map +1 -0
  79. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.js +246 -0
  80. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.js.map +1 -0
  81. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.d.ts +16 -0
  82. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.d.ts.map +1 -0
  83. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.js +52 -0
  84. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.js.map +1 -0
  85. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts +6 -40
  86. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts.map +1 -1
  87. package/dist/src/backend/domains/ratchet/ratchet.service.js +99 -426
  88. package/dist/src/backend/domains/ratchet/ratchet.service.js.map +1 -1
  89. package/dist/src/backend/domains/ratchet/ratchet.types.d.ts +86 -0
  90. package/dist/src/backend/domains/ratchet/ratchet.types.d.ts.map +1 -0
  91. package/dist/src/backend/domains/ratchet/ratchet.types.js +2 -0
  92. package/dist/src/backend/domains/ratchet/ratchet.types.js.map +1 -0
  93. package/dist/src/backend/domains/ratchet/reconciliation.service.d.ts.map +1 -1
  94. package/dist/src/backend/domains/ratchet/reconciliation.service.js +1 -2
  95. package/dist/src/backend/domains/ratchet/reconciliation.service.js.map +1 -1
  96. package/dist/src/backend/domains/ratchet/reconciliation.service.test.js +8 -10
  97. package/dist/src/backend/domains/ratchet/reconciliation.service.test.js.map +1 -1
  98. package/dist/src/backend/domains/run-script/run-script.service.d.ts +1 -0
  99. package/dist/src/backend/domains/run-script/run-script.service.d.ts.map +1 -1
  100. package/dist/src/backend/domains/run-script/run-script.service.js +46 -19
  101. package/dist/src/backend/domains/run-script/run-script.service.js.map +1 -1
  102. package/dist/src/backend/domains/run-script/run-script.service.test.js +118 -0
  103. package/dist/src/backend/domains/run-script/run-script.service.test.js.map +1 -1
  104. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts +13 -1
  105. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts.map +1 -1
  106. package/dist/src/backend/domains/session/acp/acp-event-translator.js +86 -1
  107. package/dist/src/backend/domains/session/acp/acp-event-translator.js.map +1 -1
  108. package/dist/src/backend/domains/session/acp/acp-event-translator.test.js +39 -0
  109. package/dist/src/backend/domains/session/acp/acp-event-translator.test.js.map +1 -1
  110. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts +5 -0
  111. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts.map +1 -1
  112. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js +12 -12
  113. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js.map +1 -1
  114. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js +3 -12
  115. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js.map +1 -1
  116. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.d.ts +1 -0
  117. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.d.ts.map +1 -1
  118. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.js +3 -0
  119. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.js.map +1 -1
  120. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +14 -15
  121. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
  122. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +74 -568
  123. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
  124. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.d.ts +16 -0
  125. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.d.ts.map +1 -0
  126. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.js +53 -0
  127. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.js.map +1 -0
  128. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.d.ts +20 -0
  129. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.d.ts.map +1 -0
  130. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.js +341 -0
  131. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.js.map +1 -0
  132. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.d.ts +41 -0
  133. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.d.ts.map +1 -0
  134. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.js +137 -0
  135. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.js.map +1 -0
  136. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.d.ts +25 -0
  137. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.d.ts.map +1 -0
  138. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.js +47 -0
  139. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.js.map +1 -0
  140. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.d.ts +8 -0
  141. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.d.ts.map +1 -0
  142. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.js +37 -0
  143. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.js.map +1 -0
  144. package/dist/src/backend/domains/session/bridges.d.ts +5 -0
  145. package/dist/src/backend/domains/session/bridges.d.ts.map +1 -1
  146. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.d.ts.map +1 -1
  147. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.js +2 -2
  148. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.js.map +1 -1
  149. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.test.js +1 -1
  150. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.test.js.map +1 -1
  151. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js +2 -2
  152. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js.map +1 -1
  153. package/dist/src/backend/domains/session/data/{claude-session-history-loader.service.d.ts → session-history-loader.service.d.ts} +1 -1
  154. package/dist/src/backend/domains/session/data/session-history-loader.service.d.ts.map +1 -0
  155. package/dist/src/backend/domains/session/data/{claude-session-history-loader.service.js → session-history-loader.service.js} +4 -4
  156. package/dist/src/backend/domains/session/data/session-history-loader.service.js.map +1 -0
  157. package/dist/src/backend/domains/session/data/session-history-loader.service.test.d.ts +2 -0
  158. package/dist/src/backend/domains/session/data/session-history-loader.service.test.d.ts.map +1 -0
  159. package/dist/src/backend/domains/session/data/{claude-session-history-loader.service.test.js → session-history-loader.service.test.js} +6 -3
  160. package/dist/src/backend/domains/session/data/session-history-loader.service.test.js.map +1 -0
  161. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.d.ts +71 -0
  162. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.d.ts.map +1 -0
  163. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.js +404 -0
  164. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.js.map +1 -0
  165. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts +0 -2
  166. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts.map +1 -1
  167. package/dist/src/backend/domains/session/lifecycle/session.repository.js +0 -3
  168. package/dist/src/backend/domains/session/lifecycle/session.repository.js.map +1 -1
  169. package/dist/src/backend/domains/session/lifecycle/session.repository.test.js +0 -1
  170. package/dist/src/backend/domains/session/lifecycle/session.repository.test.js.map +1 -1
  171. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts +8 -27
  172. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts.map +1 -1
  173. package/dist/src/backend/domains/session/lifecycle/session.service.js +64 -376
  174. package/dist/src/backend/domains/session/lifecycle/session.service.js.map +1 -1
  175. package/dist/src/backend/domains/session/lifecycle/session.service.test.js +92 -21
  176. package/dist/src/backend/domains/session/lifecycle/session.service.test.js.map +1 -1
  177. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.d.ts.map +1 -1
  178. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.js +2 -13
  179. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.js.map +1 -1
  180. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.test.js +15 -3
  181. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.test.js.map +1 -1
  182. package/dist/src/backend/domains/session/logging/session-file-logger.service.js +1 -1
  183. package/dist/src/backend/domains/session/logging/session-file-logger.service.js.map +1 -1
  184. package/dist/src/backend/domains/session/logging/session-file-logger.service.test.js +3 -0
  185. package/dist/src/backend/domains/session/logging/session-file-logger.service.test.js.map +1 -1
  186. package/dist/src/backend/domains/session/session-domain.service.d.ts.map +1 -1
  187. package/dist/src/backend/domains/session/session-domain.service.js +16 -0
  188. package/dist/src/backend/domains/session/session-domain.service.js.map +1 -1
  189. package/dist/src/backend/domains/session/session-domain.service.test.js +34 -0
  190. package/dist/src/backend/domains/session/session-domain.service.test.js.map +1 -1
  191. package/dist/src/backend/domains/session/store/file-lock.service.d.ts.map +1 -1
  192. package/dist/src/backend/domains/session/store/file-lock.service.js +2 -4
  193. package/dist/src/backend/domains/session/store/file-lock.service.js.map +1 -1
  194. package/dist/src/backend/domains/session/store/file-lock.service.test.js +3 -0
  195. package/dist/src/backend/domains/session/store/file-lock.service.test.js.map +1 -1
  196. package/dist/src/backend/domains/workspace/index.d.ts +0 -1
  197. package/dist/src/backend/domains/workspace/index.d.ts.map +1 -1
  198. package/dist/src/backend/domains/workspace/index.js +0 -1
  199. package/dist/src/backend/domains/workspace/index.js.map +1 -1
  200. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.d.ts +8 -0
  201. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.d.ts.map +1 -1
  202. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.js +47 -5
  203. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.js.map +1 -1
  204. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.test.js +117 -22
  205. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.test.js.map +1 -1
  206. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts.map +1 -1
  207. package/dist/src/backend/domains/workspace/query/workspace-query.service.js +48 -44
  208. package/dist/src/backend/domains/workspace/query/workspace-query.service.js.map +1 -1
  209. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js +137 -97
  210. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js.map +1 -1
  211. package/dist/src/backend/domains/workspace/state/flow-state.d.ts +2 -2
  212. package/dist/src/backend/domains/workspace/state/flow-state.d.ts.map +1 -1
  213. package/dist/src/backend/domains/workspace/state/flow-state.js.map +1 -1
  214. package/dist/src/backend/domains/workspace/state/init-policy.js +1 -1
  215. package/dist/src/backend/domains/workspace/state/init-policy.js.map +1 -1
  216. package/dist/src/backend/domains/workspace/state/kanban-state.d.ts.map +1 -1
  217. package/dist/src/backend/domains/workspace/state/kanban-state.js +3 -2
  218. package/dist/src/backend/domains/workspace/state/kanban-state.js.map +1 -1
  219. package/dist/src/backend/interceptors/conversation-rename.interceptor.d.ts.map +1 -1
  220. package/dist/src/backend/interceptors/conversation-rename.interceptor.js +16 -2
  221. package/dist/src/backend/interceptors/conversation-rename.interceptor.js.map +1 -1
  222. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js +15 -3
  223. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js.map +1 -1
  224. package/dist/src/backend/interceptors/index.d.ts +2 -0
  225. package/dist/src/backend/interceptors/index.d.ts.map +1 -1
  226. package/dist/src/backend/interceptors/index.js +6 -0
  227. package/dist/src/backend/interceptors/index.js.map +1 -1
  228. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.d.ts.map +1 -1
  229. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.js +8 -0
  230. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.js.map +1 -1
  231. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.js +5 -1
  232. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.js.map +1 -1
  233. package/dist/src/backend/interceptors/pre-push-rename.interceptor.d.ts.map +1 -1
  234. package/dist/src/backend/interceptors/pre-push-rename.interceptor.js +3 -0
  235. package/dist/src/backend/interceptors/pre-push-rename.interceptor.js.map +1 -1
  236. package/dist/src/backend/interceptors/registry.d.ts +5 -0
  237. package/dist/src/backend/interceptors/registry.d.ts.map +1 -1
  238. package/dist/src/backend/interceptors/registry.js +51 -0
  239. package/dist/src/backend/interceptors/registry.js.map +1 -1
  240. package/dist/src/backend/interceptors/types.d.ts +2 -0
  241. package/dist/src/backend/interceptors/types.d.ts.map +1 -1
  242. package/dist/src/backend/lib/workspace-derived-state.d.ts +47 -0
  243. package/dist/src/backend/lib/workspace-derived-state.d.ts.map +1 -0
  244. package/dist/src/backend/lib/workspace-derived-state.js +31 -0
  245. package/dist/src/backend/lib/workspace-derived-state.js.map +1 -0
  246. package/dist/src/backend/lib/workspace-derived-state.test.d.ts +2 -0
  247. package/dist/src/backend/lib/workspace-derived-state.test.d.ts.map +1 -0
  248. package/dist/src/backend/lib/workspace-derived-state.test.js +66 -0
  249. package/dist/src/backend/lib/workspace-derived-state.test.js.map +1 -0
  250. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
  251. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +3 -0
  252. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
  253. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js +19 -1
  254. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js.map +1 -1
  255. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  256. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +16 -6
  257. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
  258. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +63 -30
  259. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
  260. package/dist/src/backend/orchestration/workspace-init-script-pipeline.d.ts +18 -0
  261. package/dist/src/backend/orchestration/workspace-init-script-pipeline.d.ts.map +1 -0
  262. package/dist/src/backend/orchestration/workspace-init-script-pipeline.js +75 -0
  263. package/dist/src/backend/orchestration/workspace-init-script-pipeline.js.map +1 -0
  264. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  265. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +22 -73
  266. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  267. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +75 -16
  268. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js.map +1 -1
  269. package/dist/src/backend/resource_accessors/project.accessor.js +1 -1
  270. package/dist/src/backend/resource_accessors/project.accessor.js.map +1 -1
  271. package/dist/src/backend/routers/websocket/snapshots.handler.d.ts.map +1 -1
  272. package/dist/src/backend/routers/websocket/snapshots.handler.js +17 -6
  273. package/dist/src/backend/routers/websocket/snapshots.handler.js.map +1 -1
  274. package/dist/src/backend/routers/websocket/snapshots.handler.test.js +40 -5
  275. package/dist/src/backend/routers/websocket/snapshots.handler.test.js.map +1 -1
  276. package/dist/src/backend/routers/websocket/websocket.integration.test.js +1 -0
  277. package/dist/src/backend/routers/websocket/websocket.integration.test.js.map +1 -1
  278. package/dist/src/backend/server.d.ts.map +1 -1
  279. package/dist/src/backend/server.js +6 -2
  280. package/dist/src/backend/server.js.map +1 -1
  281. package/dist/src/backend/server.upgrade.test.js +2 -0
  282. package/dist/src/backend/server.upgrade.test.js.map +1 -1
  283. package/dist/src/backend/services/check-single-writer.test.d.ts +2 -0
  284. package/dist/src/backend/services/check-single-writer.test.d.ts.map +1 -0
  285. package/dist/src/backend/services/check-single-writer.test.js +132 -0
  286. package/dist/src/backend/services/check-single-writer.test.js.map +1 -0
  287. package/dist/src/backend/services/config.service.d.ts +14 -6
  288. package/dist/src/backend/services/config.service.d.ts.map +1 -1
  289. package/dist/src/backend/services/config.service.js +31 -9
  290. package/dist/src/backend/services/config.service.js.map +1 -1
  291. package/dist/src/backend/services/env-schemas.d.ts +7 -3
  292. package/dist/src/backend/services/env-schemas.d.ts.map +1 -1
  293. package/dist/src/backend/services/env-schemas.js +19 -3
  294. package/dist/src/backend/services/env-schemas.js.map +1 -1
  295. package/dist/src/backend/services/run-script-config-persistence.service.d.ts +37 -0
  296. package/dist/src/backend/services/run-script-config-persistence.service.d.ts.map +1 -0
  297. package/dist/src/backend/services/run-script-config-persistence.service.js +73 -0
  298. package/dist/src/backend/services/run-script-config-persistence.service.js.map +1 -0
  299. package/dist/src/backend/services/run-script-config-persistence.service.test.d.ts +2 -0
  300. package/dist/src/backend/services/run-script-config-persistence.service.test.d.ts.map +1 -0
  301. package/dist/src/backend/services/run-script-config-persistence.service.test.js +111 -0
  302. package/dist/src/backend/services/run-script-config-persistence.service.test.js.map +1 -0
  303. package/dist/src/backend/services/run-script-proxy.service.d.ts.map +1 -1
  304. package/dist/src/backend/services/run-script-proxy.service.js +2 -1
  305. package/dist/src/backend/services/run-script-proxy.service.js.map +1 -1
  306. package/dist/src/backend/services/run-script-proxy.service.test.js +4 -0
  307. package/dist/src/backend/services/run-script-proxy.service.test.js.map +1 -1
  308. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts +3 -3
  309. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts.map +1 -1
  310. package/dist/src/backend/services/workspace-snapshot-store.service.js +13 -12
  311. package/dist/src/backend/services/workspace-snapshot-store.service.js.map +1 -1
  312. package/dist/src/backend/services/workspace-snapshot-store.service.test.js +3 -0
  313. package/dist/src/backend/services/workspace-snapshot-store.service.test.js.map +1 -1
  314. package/dist/src/backend/trpc/admin.router.test.js +0 -2
  315. package/dist/src/backend/trpc/admin.router.test.js.map +1 -1
  316. package/dist/src/backend/trpc/admin.trpc.d.ts +2 -7
  317. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  318. package/dist/src/backend/trpc/admin.trpc.js +0 -1
  319. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  320. package/dist/src/backend/trpc/index.d.ts +8 -13
  321. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  322. package/dist/src/backend/trpc/project.trpc.d.ts +3 -3
  323. package/dist/src/backend/trpc/workspace/run-script.router.test.js +31 -4
  324. package/dist/src/backend/trpc/workspace/run-script.router.test.js.map +1 -1
  325. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts.map +1 -1
  326. package/dist/src/backend/trpc/workspace/run-script.trpc.js +8 -8
  327. package/dist/src/backend/trpc/workspace/run-script.trpc.js.map +1 -1
  328. package/dist/src/backend/trpc/workspace.router.test.js +6 -1
  329. package/dist/src/backend/trpc/workspace.router.test.js.map +1 -1
  330. package/dist/src/backend/trpc/workspace.trpc.d.ts +3 -3
  331. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  332. package/dist/src/backend/trpc/workspace.trpc.js +19 -13
  333. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  334. package/dist/src/cli/index.js +5 -2
  335. package/dist/src/cli/index.js.map +1 -1
  336. package/dist/src/shared/core/ci-status.d.ts +6 -4
  337. package/dist/src/shared/core/ci-status.d.ts.map +1 -1
  338. package/dist/src/shared/core/ci-status.js +47 -13
  339. package/dist/src/shared/core/ci-status.js.map +1 -1
  340. package/dist/src/shared/core/enums.d.ts +1 -0
  341. package/dist/src/shared/core/enums.d.ts.map +1 -1
  342. package/dist/src/shared/core/enums.js +1 -0
  343. package/dist/src/shared/core/enums.js.map +1 -1
  344. package/dist/src/shared/core/index.d.ts +1 -1
  345. package/dist/src/shared/core/index.d.ts.map +1 -1
  346. package/dist/src/shared/core/index.js +1 -1
  347. package/dist/src/shared/core/index.js.map +1 -1
  348. package/dist/src/shared/schemas/export-data.schema.d.ts +2 -0
  349. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  350. package/dist/src/shared/schemas/issue-tracker-config.schema.d.ts +2 -2
  351. package/dist/src/shared/workspace-flow-state.d.ts +3 -0
  352. package/dist/src/shared/workspace-flow-state.d.ts.map +1 -0
  353. package/dist/src/shared/workspace-flow-state.js +2 -0
  354. package/dist/src/shared/workspace-flow-state.js.map +1 -0
  355. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  356. package/package.json +1 -1
  357. package/prisma/migrations/20260224150000_add_workspace_archiving_state/migration.sql +4 -0
  358. package/prisma/schema.prisma +1 -0
  359. package/dist/client/assets/channel-B_f9a3jD.js +0 -1
  360. package/dist/client/assets/classDiagram-2ON5EDUG-CgnrkUO8.js +0 -1
  361. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CgnrkUO8.js +0 -1
  362. package/dist/client/assets/clone-BmilxOGI.js +0 -1
  363. package/dist/client/assets/index-DVprBuNv.css +0 -1
  364. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BRKf4wQr.js +0 -1
  365. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.d.ts.map +0 -1
  366. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js.map +0 -1
  367. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.test.d.ts +0 -2
  368. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.test.d.ts.map +0 -1
  369. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.test.js.map +0 -1
  370. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.d.ts +0 -10
  371. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.d.ts.map +0 -1
  372. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.js +0 -24
  373. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.js.map +0 -1
  374. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.d.ts +0 -2
  375. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.d.ts.map +0 -1
  376. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.js +0 -17
  377. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.js.map +0 -1
@@ -1,11 +1,10 @@
1
- import { AcpEventTranslator, 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
3
  import { sessionDomainService, } from '../../../../backend/domains/session/session-domain.service.js';
5
- import { interceptorRegistry } from '../../../../backend/interceptors/registry.js';
6
4
  import { createLogger } from '../../../../backend/services/logger.service.js';
7
5
  import { SessionStatus } from '../../../../shared/core/index.js';
8
6
  import { createInitialSessionRuntimeState, } from '../../../../shared/session-runtime.js';
7
+ import { AcpEventProcessor } from './acp-event-processor.js';
9
8
  import { SessionConfigService, } from './session.config.service.js';
10
9
  import { SessionPermissionService } from './session.permission.service.js';
11
10
  import { sessionPromptBuilder } from './session.prompt-builder.js';
@@ -26,21 +25,20 @@ export class SessionService {
26
25
  promptBuilder;
27
26
  runtimeManager;
28
27
  sessionDomainService;
29
- acpEventTranslator = new AcpEventTranslator(logger);
30
28
  sessionPermissionService;
31
29
  sessionConfigService;
32
- acpStreamState = new Map();
33
- pendingAcpToolCalls = new Map();
34
- suppressAcpReplayForSession = new Set();
30
+ acpEventProcessor;
35
31
  workspaceBridge = null;
36
- sessionToWorkspace = new Map();
37
- sessionToWorkingDir = new Map();
38
32
  promptTurnCompleteHandler = null;
33
+ promptTurnCompleteTimeouts = new Map();
39
34
  configure(bridges) {
40
35
  this.workspaceBridge = bridges.workspace;
41
36
  }
42
37
  setPromptTurnCompleteHandler(handler) {
43
38
  this.promptTurnCompleteHandler = handler;
39
+ if (!handler) {
40
+ this.clearAllScheduledPromptTurnCompletions();
41
+ }
44
42
  }
45
43
  isStaleLoadingRuntime(runtime) {
46
44
  if (runtime.phase !== 'loading' || runtime.processState === 'alive') {
@@ -53,39 +51,9 @@ export class SessionService {
53
51
  return Date.now() - updatedAtMs > STALE_LOADING_RUNTIME_MAX_AGE_MS;
54
52
  }
55
53
  setupAcpEventHandler(sessionId) {
56
- const permissionBridge = this.sessionPermissionService.createPermissionBridge(sessionId);
54
+ const runtimeEventHandler = this.acpEventProcessor.createRuntimeEventHandler(sessionId);
57
55
  return {
58
- permissionBridge,
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.sessionPermissionService.handlePermissionRequest(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,11 +75,8 @@ export 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);
78
+ this.clearScheduledPromptTurnCompletion(sid);
79
+ this.acpEventProcessor.clearSessionState(sid);
115
80
  this.sessionPermissionService.cancelPendingRequests(sid);
116
81
  acpTraceLogger.log(sid, 'runtime_exit', { exitCode });
117
82
  try {
@@ -120,7 +85,7 @@ export class SessionService {
120
85
  status: SessionStatus.COMPLETED,
121
86
  });
122
87
  logger.debug('Updated ACP session status to COMPLETED on exit', { sessionId: sid });
123
- await this.repository.clearRatchetActiveSession(session.workspaceId, sid);
88
+ await this.clearRatchetActiveSessionIfMatching(session.workspaceId, sid);
124
89
  if (session.workflow === 'ratchet') {
125
90
  await this.repository.deleteSession(sid);
126
91
  logger.debug('Deleted transient ratchet ACP session', { sessionId: sid });
@@ -149,319 +114,23 @@ export class SessionService {
149
114
  });
150
115
  },
151
116
  onAcpLog: (sid, payload) => {
152
- acpTraceLogger.log(sid, 'raw_acp_event', payload);
153
- sessionFileLogger.log(sid, 'FROM_CLAUDE_CLI', payload);
117
+ this.acpEventProcessor.handleAcpLog(sid, payload);
154
118
  },
155
119
  };
156
120
  }
157
- handleAcpDelta(sid, delta) {
158
- this.maybeLiftReplaySuppression(sid);
159
- if (this.suppressAcpReplayForSession.has(sid) &&
160
- delta.type !== 'config_options_update' &&
161
- delta.type !== 'slash_commands') {
162
- return;
163
- }
164
- this.trackPendingAcpToolCalls(sid, delta);
165
- if (delta.type === 'config_options_update') {
166
- const acpHandle = this.runtimeManager.getClient(sid);
167
- if (acpHandle) {
168
- const { configOptions } = delta;
169
- this.sessionConfigService.applyConfigOptionsUpdateDelta(sid, acpHandle, configOptions);
170
- return;
171
- }
172
- }
173
- if (delta.type !== 'agent_message') {
174
- this.sessionDomainService.emitDelta(sid, delta);
175
- return;
176
- }
177
- const data = delta.data;
178
- if (data.type === 'assistant') {
179
- this.accumulateAcpText(sid, data);
180
- return;
181
- }
182
- this.acpStreamState.delete(sid);
183
- const order = this.sessionDomainService.appendClaudeEvent(sid, data);
184
- this.sessionDomainService.emitDelta(sid, { ...delta, order });
185
- }
186
- trackPendingAcpToolCalls(sid, delta) {
187
- if (delta.type === 'agent_message') {
188
- this.trackPendingFromAgentMessage(sid, delta.data);
189
- return;
190
- }
191
- if (delta.type === 'tool_progress') {
192
- this.trackPendingFromToolProgress(sid, delta);
193
- }
194
- }
195
- trackPendingFromAgentMessage(sid, data) {
196
- if (data.type === 'stream_event') {
197
- this.trackPendingFromToolUseStreamEvent(sid, data);
198
- }
199
- if (data.type !== 'user') {
200
- return;
201
- }
202
- this.clearPendingFromToolResultMessage(sid, data);
203
- }
204
- trackPendingFromToolUseStreamEvent(sid, data) {
205
- const streamEvent = data.event;
206
- const contentBlock = streamEvent?.content_block;
207
- const isToolUse = streamEvent?.type === 'content_block_start' && contentBlock?.type === 'tool_use';
208
- if (!isToolUse) {
209
- return;
210
- }
211
- const toolUseId = typeof contentBlock?.id === 'string' ? contentBlock.id : null;
212
- if (!toolUseId) {
213
- return;
214
- }
215
- const toolName = typeof contentBlock?.name === 'string' ? contentBlock.name : 'ACP Tool';
216
- const toolInput = this.normalizeToolInput(contentBlock?.input);
217
- const existing = this.getPendingToolCall(sid, toolUseId);
218
- this.upsertPendingToolCall(sid, toolUseId, { toolName, toolInput });
219
- if (!existing) {
220
- this.notifyInterceptorToolStart(sid, {
221
- toolUseId,
222
- toolName,
223
- toolInput: toolInput ?? {},
224
- });
225
- }
226
- }
227
- clearPendingFromToolResultMessage(sid, data) {
228
- if (data.type !== 'user') {
229
- return;
230
- }
231
- const content = data.message?.content;
232
- if (!Array.isArray(content)) {
233
- return;
234
- }
235
- for (const item of content) {
236
- if (item.type === 'tool_result') {
237
- const pending = this.getPendingToolCall(sid, item.tool_use_id);
238
- this.notifyInterceptorToolComplete(sid, item.tool_use_id, item.content, item.is_error === true, pending);
239
- this.removePendingToolCall(sid, item.tool_use_id);
240
- }
241
- }
242
- }
243
- trackPendingFromToolProgress(sid, progress) {
244
- if (!progress.tool_use_id) {
245
- return;
246
- }
247
- const existing = this.getPendingToolCall(sid, progress.tool_use_id);
248
- this.upsertPendingToolCall(sid, progress.tool_use_id, {
249
- toolName: progress.tool_name ?? 'ACP Tool',
250
- acpKind: progress.acpKind,
251
- acpLocations: progress.acpLocations,
252
- });
253
- if (!existing) {
254
- this.notifyInterceptorToolStart(sid, {
255
- toolUseId: progress.tool_use_id,
256
- toolName: progress.tool_name ?? 'ACP Tool',
257
- toolInput: {},
258
- });
259
- }
260
- }
261
- upsertPendingToolCall(sid, toolUseId, update) {
262
- const pendingById = this.pendingAcpToolCalls.get(sid) ?? new Map();
263
- const existing = pendingById.get(toolUseId);
264
- pendingById.set(toolUseId, {
265
- toolUseId,
266
- toolName: update.toolName || existing?.toolName || 'ACP Tool',
267
- toolInput: update.toolInput ?? existing?.toolInput,
268
- acpKind: update.acpKind ?? existing?.acpKind,
269
- acpLocations: update.acpLocations ?? existing?.acpLocations,
270
- });
271
- this.pendingAcpToolCalls.set(sid, pendingById);
272
- }
273
- getPendingToolCall(sid, toolUseId) {
274
- return this.pendingAcpToolCalls.get(sid)?.get(toolUseId);
275
- }
276
- removePendingToolCall(sid, toolUseId) {
277
- const pendingById = this.pendingAcpToolCalls.get(sid);
278
- if (!pendingById) {
279
- return;
280
- }
281
- pendingById.delete(toolUseId);
282
- if (pendingById.size === 0) {
283
- this.pendingAcpToolCalls.delete(sid);
284
- }
285
- }
286
- normalizeToolInput(input) {
287
- if (typeof input !== 'object' || input === null || Array.isArray(input)) {
288
- return undefined;
289
- }
290
- return input;
291
- }
292
- extractToolResultText(content) {
293
- if (typeof content === 'string') {
294
- return content;
295
- }
296
- if (Array.isArray(content)) {
297
- return content
298
- .flatMap((item) => {
299
- if (typeof item === 'object' &&
300
- item !== null &&
301
- item.type === 'text' &&
302
- typeof item.text === 'string') {
303
- return [item.text];
304
- }
305
- return [];
306
- })
307
- .join('\n');
308
- }
309
- if (content === undefined || content === null) {
310
- return '';
311
- }
312
- try {
313
- return JSON.stringify(content);
314
- }
315
- catch {
316
- return String(content);
317
- }
318
- }
319
- getInterceptorContext(sessionId) {
320
- const workspaceId = this.sessionToWorkspace.get(sessionId);
321
- const workingDir = this.sessionToWorkingDir.get(sessionId);
322
- if (!(workspaceId && workingDir)) {
323
- return null;
324
- }
325
- return {
326
- sessionId,
327
- workspaceId,
328
- workingDir,
329
- timestamp: new Date(),
330
- };
331
- }
332
- notifyInterceptorToolStart(sessionId, tool) {
333
- const context = this.getInterceptorContext(sessionId);
334
- if (!context) {
335
- return;
336
- }
337
- const event = {
338
- toolUseId: tool.toolUseId,
339
- toolName: tool.toolName,
340
- input: tool.toolInput,
341
- };
342
- interceptorRegistry.notifyToolStart(event, context);
343
- }
344
- notifyInterceptorToolComplete(sessionId, toolUseId, content, isError, pending) {
345
- const context = this.getInterceptorContext(sessionId);
346
- if (!context) {
347
- return;
348
- }
349
- const event = {
350
- toolUseId,
351
- toolName: pending?.toolName ?? 'ACP Tool',
352
- input: pending?.toolInput ?? {},
353
- output: {
354
- content: this.extractToolResultText(content),
355
- isError,
356
- },
357
- };
358
- interceptorRegistry.notifyToolComplete(event, context);
359
- }
360
- finalizeOrphanedToolCalls(sid, reason) {
361
- const pendingById = this.pendingAcpToolCalls.get(sid);
362
- if (!pendingById || pendingById.size === 0) {
363
- this.pendingAcpToolCalls.delete(sid);
364
- return;
365
- }
366
- const toolUseIds = [...pendingById.keys()];
367
- logger.warn('Finalizing orphaned ACP tool calls without terminal status', {
368
- sessionId: sid,
369
- reason,
370
- count: toolUseIds.length,
371
- toolUseIds,
372
- });
373
- for (const pending of pendingById.values()) {
374
- const syntheticProgress = {
375
- type: 'tool_progress',
376
- tool_use_id: pending.toolUseId,
377
- tool_name: pending.toolName,
378
- acpStatus: 'failed',
379
- elapsed_time_seconds: 0,
380
- ...(pending.acpKind ? { acpKind: pending.acpKind } : {}),
381
- ...(pending.acpLocations ? { acpLocations: pending.acpLocations } : {}),
382
- };
383
- this.handleAcpDelta(sid, syntheticProgress);
384
- const syntheticResult = {
385
- type: 'agent_message',
386
- data: {
387
- type: 'user',
388
- message: {
389
- role: 'user',
390
- content: [
391
- {
392
- type: 'tool_result',
393
- tool_use_id: pending.toolUseId,
394
- content: `Tool call did not receive a terminal ACP update (${reason}). Marked as failed locally.`,
395
- is_error: true,
396
- },
397
- ],
398
- },
399
- },
400
- };
401
- this.handleAcpDelta(sid, syntheticResult);
402
- acpTraceLogger.log(sid, 'translated_delta', {
403
- sessionUpdate: 'synthetic_orphan_tool_call',
404
- delta: syntheticProgress,
405
- });
406
- acpTraceLogger.log(sid, 'translated_delta', {
407
- sessionUpdate: 'synthetic_orphan_tool_call',
408
- delta: syntheticResult,
409
- });
410
- }
411
- this.pendingAcpToolCalls.delete(sid);
412
- }
413
- handleAcpUserMessageChunk(sid, text) {
414
- this.maybeLiftReplaySuppression(sid);
415
- if (this.suppressAcpReplayForSession.has(sid)) {
416
- return;
417
- }
418
- if (this.runtimeManager.isSessionWorking(sid)) {
419
- return;
420
- }
421
- const normalized = text.trim();
422
- if (normalized.length === 0) {
423
- return;
424
- }
425
- this.sessionDomainService.injectCommittedUserMessage(sid, normalized);
426
- }
427
- accumulateAcpText(sid, data) {
428
- const content = data.message?.content;
429
- const chunkText = Array.isArray(content) && content[0]?.type === 'text'
430
- ? content[0].text
431
- : '';
432
- let ss = this.acpStreamState.get(sid);
433
- if (!ss) {
434
- ss = { textOrder: this.sessionDomainService.allocateOrder(sid), accText: '' };
435
- this.acpStreamState.set(sid, ss);
436
- }
437
- ss.accText += chunkText;
438
- const accMsg = {
439
- type: 'assistant',
440
- message: { role: 'assistant', content: [{ type: 'text', text: ss.accText }] },
441
- };
442
- this.sessionDomainService.upsertClaudeEvent(sid, accMsg, ss.textOrder);
443
- this.sessionDomainService.emitDelta(sid, {
444
- type: 'agent_message',
445
- data: accMsg,
446
- order: ss.textOrder,
447
- });
448
- }
449
121
  async createAcpClient(sessionId, options, session) {
450
122
  const sessionContext = await this.loadSessionContext(sessionId, session);
451
123
  if (!sessionContext) {
452
124
  throw new Error(`Session context not ready: ${sessionId}`);
453
125
  }
454
126
  await this.repository.markWorkspaceHasHadSessions(sessionContext.workspaceId);
455
- this.sessionToWorkspace.set(sessionId, sessionContext.workspaceId);
456
- this.sessionToWorkingDir.set(sessionId, sessionContext.workingDir);
127
+ this.acpEventProcessor.registerSessionContext(sessionId, {
128
+ workspaceId: sessionContext.workspaceId,
129
+ workingDir: sessionContext.workingDir,
130
+ });
457
131
  const handlers = this.setupAcpEventHandler(sessionId);
458
132
  const shouldSuppressReplay = this.shouldSuppressReplayDuringAcpResume(sessionId, session);
459
- if (shouldSuppressReplay) {
460
- this.suppressAcpReplayForSession.add(sessionId);
461
- }
462
- else {
463
- this.suppressAcpReplayForSession.delete(sessionId);
464
- }
133
+ this.acpEventProcessor.setReplaySuppression(sessionId, shouldSuppressReplay);
465
134
  const clientOptions = {
466
135
  provider: session?.provider ?? 'CLAUDE',
467
136
  workingDir: sessionContext.workingDir,
@@ -479,9 +148,7 @@ export class SessionService {
479
148
  });
480
149
  }
481
150
  catch (error) {
482
- this.suppressAcpReplayForSession.delete(sessionId);
483
- this.sessionToWorkspace.delete(sessionId);
484
- this.sessionToWorkingDir.delete(sessionId);
151
+ this.acpEventProcessor.clearSessionState(sessionId);
485
152
  throw error;
486
153
  }
487
154
  await this.persistAcpConfigSnapshot(sessionId, {
@@ -511,15 +178,6 @@ export class SessionService {
511
178
  }
512
179
  return this.sessionDomainService.getTranscriptSnapshot(sessionId).length > 0;
513
180
  }
514
- maybeLiftReplaySuppression(sessionId) {
515
- if (!this.suppressAcpReplayForSession.has(sessionId)) {
516
- return;
517
- }
518
- if (!this.runtimeManager.isSessionWorking(sessionId)) {
519
- return;
520
- }
521
- this.suppressAcpReplayForSession.delete(sessionId);
522
- }
523
181
  constructor(options) {
524
182
  this.repository = options?.repository ?? sessionRepository;
525
183
  this.promptBuilder = options?.promptBuilder ?? sessionPromptBuilder;
@@ -533,6 +191,12 @@ export class SessionService {
533
191
  runtimeManager: this.runtimeManager,
534
192
  sessionDomainService: this.sessionDomainService,
535
193
  });
194
+ this.acpEventProcessor = new AcpEventProcessor({
195
+ runtimeManager: this.runtimeManager,
196
+ sessionDomainService: this.sessionDomainService,
197
+ sessionPermissionService: this.sessionPermissionService,
198
+ sessionConfigService: this.sessionConfigService,
199
+ });
536
200
  }
537
201
  async startSession(sessionId, options) {
538
202
  const session = await this.repository.getSessionById(sessionId);
@@ -568,8 +232,9 @@ export class SessionService {
568
232
  await this.sessionConfigService.applyConfiguredPermissionPreset(sessionId, session, handle);
569
233
  }
570
234
  async stopSession(sessionId, options) {
235
+ this.clearScheduledPromptTurnCompletion(sessionId);
571
236
  const session = await this.loadSessionForStop(sessionId);
572
- const workspaceId = session?.workspaceId ?? this.sessionToWorkspace.get(sessionId);
237
+ const workspaceId = session?.workspaceId ?? this.acpEventProcessor.getWorkspaceId(sessionId);
573
238
  if (this.runtimeManager.isStopInProgress(sessionId)) {
574
239
  logger.debug('Session stop already in progress', { sessionId });
575
240
  return;
@@ -581,8 +246,8 @@ export class SessionService {
581
246
  activity: 'IDLE',
582
247
  updatedAt: new Date().toISOString(),
583
248
  });
584
- this.acpStreamState.delete(sessionId);
585
- this.suppressAcpReplayForSession.delete(sessionId);
249
+ this.acpEventProcessor.clearStreamingState(sessionId);
250
+ this.acpEventProcessor.clearReplaySuppression(sessionId);
586
251
  this.sessionPermissionService.cancelPendingRequests(sessionId);
587
252
  let stopClientFailed = false;
588
253
  try {
@@ -608,8 +273,7 @@ export class SessionService {
608
273
  updatedAt: new Date().toISOString(),
609
274
  });
610
275
  this.markWorkspaceSessionIdleOnStop(workspaceId, sessionId);
611
- this.sessionToWorkspace.delete(sessionId);
612
- this.sessionToWorkingDir.delete(sessionId);
276
+ this.acpEventProcessor.clearSessionContext(sessionId);
613
277
  if (!stopClientFailed) {
614
278
  const shouldCleanupTransientRatchetSession = options?.cleanupTransientRatchetSession ?? true;
615
279
  await this.cleanupTransientRatchetOnStop(session, sessionId, shouldCleanupTransientRatchetSession);
@@ -623,14 +287,14 @@ export class SessionService {
623
287
  }
624
288
  finalizeOrphanedToolCallsOnStop(sessionId) {
625
289
  try {
626
- this.finalizeOrphanedToolCalls(sessionId, 'session_stop');
290
+ this.acpEventProcessor.finalizeOrphanedToolCalls(sessionId, 'session_stop');
627
291
  }
628
292
  catch (error) {
629
293
  logger.warn('Failed finalizing orphaned ACP tool calls during stop', {
630
294
  sessionId,
631
295
  error: error instanceof Error ? error.message : String(error),
632
296
  });
633
- this.pendingAcpToolCalls.delete(sessionId);
297
+ this.acpEventProcessor.clearPendingToolCalls(sessionId);
634
298
  }
635
299
  }
636
300
  markWorkspaceSessionIdleOnStop(workspaceId, sessionId) {
@@ -678,7 +342,7 @@ export class SessionService {
678
342
  return;
679
343
  }
680
344
  try {
681
- await this.repository.clearRatchetActiveSession(session.workspaceId, sessionId);
345
+ await this.clearRatchetActiveSessionIfMatching(session.workspaceId, sessionId);
682
346
  }
683
347
  catch (error) {
684
348
  logger.warn('Failed clearing ratchet active session pointer during stop', {
@@ -701,6 +365,12 @@ export class SessionService {
701
365
  });
702
366
  }
703
367
  }
368
+ async clearRatchetActiveSessionIfMatching(workspaceId, sessionId) {
369
+ if (!this.workspaceBridge) {
370
+ return;
371
+ }
372
+ await this.workspaceBridge.clearRatchetActiveSessionIfMatching(workspaceId, sessionId);
373
+ }
704
374
  async stopWorkspaceSessions(workspaceId) {
705
375
  const sessions = await this.repository.getSessionsByWorkspaceId(workspaceId);
706
376
  for (const session of sessions) {
@@ -804,8 +474,8 @@ export class SessionService {
804
474
  return chunks.join('\n\n');
805
475
  }
806
476
  async sendAcpMessage(sessionId, content) {
807
- const workspaceId = this.sessionToWorkspace.get(sessionId);
808
- this.pendingAcpToolCalls.set(sessionId, new Map());
477
+ const workspaceId = this.acpEventProcessor.getWorkspaceId(sessionId);
478
+ this.acpEventProcessor.beginPromptTurn(sessionId);
809
479
  this.sessionDomainService.setRuntimeSnapshot(sessionId, {
810
480
  phase: 'running',
811
481
  processState: 'alive',
@@ -817,7 +487,7 @@ export class SessionService {
817
487
  }
818
488
  try {
819
489
  const result = await this.runtimeManager.sendPrompt(sessionId, content);
820
- this.finalizeOrphanedToolCalls(sessionId, `stop_reason:${result.stopReason}`);
490
+ this.acpEventProcessor.finalizeOrphanedToolCalls(sessionId, `stop_reason:${result.stopReason}`);
821
491
  this.sessionDomainService.setRuntimeSnapshot(sessionId, {
822
492
  phase: 'idle',
823
493
  processState: 'alive',
@@ -827,7 +497,7 @@ export class SessionService {
827
497
  return result.stopReason;
828
498
  }
829
499
  catch (error) {
830
- this.finalizeOrphanedToolCalls(sessionId, 'prompt_error');
500
+ this.acpEventProcessor.finalizeOrphanedToolCalls(sessionId, 'prompt_error');
831
501
  this.sessionDomainService.setRuntimeSnapshot(sessionId, {
832
502
  phase: 'error',
833
503
  processState: 'alive',
@@ -848,9 +518,12 @@ export class SessionService {
848
518
  if (!this.promptTurnCompleteHandler) {
849
519
  return;
850
520
  }
851
- setTimeout(() => {
521
+ this.clearScheduledPromptTurnCompletion(sessionId);
522
+ const timeout = setTimeout(() => {
523
+ this.promptTurnCompleteTimeouts.delete(sessionId);
852
524
  void this.notifyPromptTurnComplete(sessionId);
853
525
  }, 0);
526
+ this.promptTurnCompleteTimeouts.set(sessionId, timeout);
854
527
  }
855
528
  async notifyPromptTurnComplete(sessionId) {
856
529
  if (!this.promptTurnCompleteHandler) {
@@ -866,6 +539,20 @@ export class SessionService {
866
539
  });
867
540
  }
868
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
+ }
869
556
  async cancelAcpPrompt(sessionId) {
870
557
  await this.runtimeManager.cancelPrompt(sessionId);
871
558
  }
@@ -1019,9 +706,10 @@ export class SessionService {
1019
706
  buildAcpChatBarCapabilities(handle) {
1020
707
  return this.sessionConfigService.buildAcpChatBarCapabilities(handle);
1021
708
  }
1022
- async stopAllClients(_timeoutMs = 5000) {
709
+ async stopAllClients(timeoutMs = 5000) {
710
+ this.clearAllScheduledPromptTurnCompletions();
1023
711
  try {
1024
- await this.runtimeManager.stopAllClients();
712
+ await this.runtimeManager.stopAllClients(timeoutMs);
1025
713
  }
1026
714
  catch (error) {
1027
715
  logger.error('Failed to stop ACP clients during shutdown', {