factory-factory 0.3.3 → 0.3.5

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 (423) hide show
  1. package/dist/client/assets/{_basePickBy-0_GqMukI.js → _basePickBy-DOa44aLB.js} +1 -1
  2. package/dist/client/assets/{_baseUniq-BkDCIs_N.js → _baseUniq-DuVP6l01.js} +1 -1
  3. package/dist/client/assets/{arc-BYBi6T58.js → arc-BRTVE1a5.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-VXUJARFQ-utRnH0EI.js → architectureDiagram-VXUJARFQ-DphOng2K.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-VD42YOAC-ke2uPDpN.js → blockDiagram-VD42YOAC-DvVRHTty.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-YG6GDRKO-DAt0t6eK.js → c4Diagram-YG6GDRKO-BZaLUCEP.js} +1 -1
  7. package/dist/client/assets/channel-v55vPUhK.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-D1vNGBo6.js → chunk-4BX2VUAB-n69YHsoN.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-BDwpH7UI.js → chunk-55IACEB6-C67Ak1Qy.js} +1 -1
  10. package/dist/client/assets/{chunk-B4BG7PRW-DAM5zmSO.js → chunk-B4BG7PRW-_Ja9GXA4.js} +1 -1
  11. package/dist/client/assets/{chunk-DI55MBZ5-CgmMeVp9.js → chunk-DI55MBZ5-C1TAOocX.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-nijXNm9V.js → chunk-FMBD7UC4-Co8OmD7c.js} +1 -1
  13. package/dist/client/assets/{chunk-QN33PNHL-GM5iQLPS.js → chunk-QN33PNHL-ESdvapXF.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-CbOwrlLz.js → chunk-QZHKN3VN-DQTGFT4I.js} +1 -1
  15. package/dist/client/assets/{chunk-TZMSLE5B-D0eFaU6T.js → chunk-TZMSLE5B-C7a0BTNr.js} +1 -1
  16. package/dist/client/assets/classDiagram-2ON5EDUG-DV-E9odE.js +1 -0
  17. package/dist/client/assets/classDiagram-v2-WZHVMYZB-DV-E9odE.js +1 -0
  18. package/dist/client/assets/clone-DQgzPMba.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-S5V4N54A-BAHIgVQk.js → cose-bilkent-S5V4N54A-Dg_Elpr2.js} +1 -1
  20. package/dist/client/assets/{dagre-6UL2VRFP-CNvHuwOI.js → dagre-6UL2VRFP-DC_BntL_.js} +1 -1
  21. package/dist/client/assets/{diagram-PSM6KHXK-726LBpxe.js → diagram-PSM6KHXK-D4EnEadG.js} +1 -1
  22. package/dist/client/assets/{diagram-QEK2KX5R-DQsnVN2A.js → diagram-QEK2KX5R-DeDgxkkd.js} +1 -1
  23. package/dist/client/assets/{diagram-S2PKOQOG-D_T0ifdw.js → diagram-S2PKOQOG-DqCrW2Mz.js} +1 -1
  24. package/dist/client/assets/{erDiagram-Q2GNP2WA-BmVDGu8M.js → erDiagram-Q2GNP2WA-CoIzOJMx.js} +1 -1
  25. package/dist/client/assets/{flowDiagram-NV44I4VS-Z65JFfSc.js → flowDiagram-NV44I4VS-H-hzyVxN.js} +1 -1
  26. package/dist/client/assets/{ganttDiagram-JELNMOA3-BZ3yfDKP.js → ganttDiagram-JELNMOA3-BZbu1Bvf.js} +1 -1
  27. package/dist/client/assets/{gitGraphDiagram-NY62KEGX-faBi9oTt.js → gitGraphDiagram-NY62KEGX-yHNzOwte.js} +1 -1
  28. package/dist/client/assets/{graph-DMDSMqaB.js → graph-0fFVLhuM.js} +1 -1
  29. package/dist/client/assets/index-CzQJ6qnR.css +1 -0
  30. package/dist/client/assets/{index-D9ddlgEa.js → index-D2gG7VAV.js} +170 -170
  31. package/dist/client/assets/{infoDiagram-WHAUD3N6-CJU-Jxtx.js → infoDiagram-WHAUD3N6-BdYcSIzA.js} +1 -1
  32. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-CIFki-iq.js → journeyDiagram-XKPGCS4Q-BgD0iboh.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-3W4ZIXB7-DDuM9VeF.js → kanban-definition-3W4ZIXB7-2cCK2J0j.js} +1 -1
  34. package/dist/client/assets/{layout-CnYzyA25.js → layout-UQByNmge.js} +1 -1
  35. package/dist/client/assets/{linear-BoRrKhGP.js → linear-COsW-oY4.js} +1 -1
  36. package/dist/client/assets/{mindmap-definition-VGOIOE7T-QhVqNLyz.js → mindmap-definition-VGOIOE7T-CnhVGcBr.js} +1 -1
  37. package/dist/client/assets/{pieDiagram-ADFJNKIX-BkK0cKA8.js → pieDiagram-ADFJNKIX-DX0wt7fJ.js} +1 -1
  38. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-CeFigc3p.js → quadrantDiagram-AYHSOK5B-nfJepDyE.js} +1 -1
  39. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-KowHp3BW.js → requirementDiagram-UZGBJVZJ-I_tnp42L.js} +1 -1
  40. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-D7CevVS2.js → sankeyDiagram-TZEHDZUN-4r_mPLW_.js} +1 -1
  41. package/dist/client/assets/{sequenceDiagram-WL72ISMW-3mHDMyaP.js → sequenceDiagram-WL72ISMW-DWymCFZa.js} +1 -1
  42. package/dist/client/assets/{stateDiagram-FKZM4ZOC-h-G1xS2P.js → stateDiagram-FKZM4ZOC-CCHlcmzO.js} +1 -1
  43. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CuSoER-j.js +1 -0
  44. package/dist/client/assets/{terminal-instance-BbEVZkgm.js → terminal-instance-DKydBe-u.js} +1 -1
  45. package/dist/client/assets/{timeline-definition-IT6M3QCI-Cc2H2fvU.js → timeline-definition-IT6M3QCI-EkYjHzU_.js} +1 -1
  46. package/dist/client/assets/{treemap-KMMF4GRG-BAjv-2_R.js → treemap-KMMF4GRG-BH9wTzrS.js} +1 -1
  47. package/dist/client/assets/{xychartDiagram-PRI3JC2R-CqgFJhi0.js → xychartDiagram-PRI3JC2R-DwOnTNwE.js} +1 -1
  48. package/dist/client/index.html +2 -2
  49. package/dist/prisma/generated/commonInputTypes.d.ts +0 -30
  50. package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -1
  51. package/dist/prisma/generated/internal/class.js +2 -2
  52. package/dist/prisma/generated/internal/class.js.map +1 -1
  53. package/dist/prisma/generated/internal/prismaNamespace.d.ts +0 -2
  54. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  55. package/dist/prisma/generated/internal/prismaNamespace.js +0 -2
  56. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  57. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +0 -2
  58. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  59. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +0 -2
  60. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  61. package/dist/prisma/generated/models/Workspace.d.ts +1 -90
  62. package/dist/prisma/generated/models/Workspace.d.ts.map +1 -1
  63. package/dist/prompts/quick-actions/screenshots.md +12 -6
  64. package/dist/prompts/ratchet/dispatch.md +4 -0
  65. package/dist/src/backend/domains/github/bridges.d.ts +0 -15
  66. package/dist/src/backend/domains/github/bridges.d.ts.map +1 -1
  67. package/dist/src/backend/domains/github/github-domain-exports.test.js +1 -7
  68. package/dist/src/backend/domains/github/github-domain-exports.test.js.map +1 -1
  69. package/dist/src/backend/domains/github/index.d.ts +1 -3
  70. package/dist/src/backend/domains/github/index.d.ts.map +1 -1
  71. package/dist/src/backend/domains/github/index.js +0 -2
  72. package/dist/src/backend/domains/github/index.js.map +1 -1
  73. package/dist/src/backend/domains/ratchet/bridges.d.ts +6 -1
  74. package/dist/src/backend/domains/ratchet/bridges.d.ts.map +1 -1
  75. package/dist/src/backend/domains/ratchet/fixer-session.service.d.ts.map +1 -1
  76. package/dist/src/backend/domains/ratchet/fixer-session.service.js +2 -0
  77. package/dist/src/backend/domains/ratchet/fixer-session.service.js.map +1 -1
  78. package/dist/src/backend/domains/ratchet/fixer-session.service.test.js +1 -0
  79. package/dist/src/backend/domains/ratchet/fixer-session.service.test.js.map +1 -1
  80. package/dist/src/backend/domains/ratchet/index.d.ts +0 -3
  81. package/dist/src/backend/domains/ratchet/index.d.ts.map +1 -1
  82. package/dist/src/backend/domains/ratchet/index.js +0 -2
  83. package/dist/src/backend/domains/ratchet/index.js.map +1 -1
  84. package/dist/src/backend/domains/ratchet/ratchet-domain-exports.test.js +1 -7
  85. package/dist/src/backend/domains/ratchet/ratchet-domain-exports.test.js.map +1 -1
  86. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts.map +1 -1
  87. package/dist/src/backend/domains/ratchet/ratchet.service.js +27 -51
  88. package/dist/src/backend/domains/ratchet/ratchet.service.js.map +1 -1
  89. package/dist/src/backend/domains/ratchet/ratchet.service.test.js +18 -18
  90. package/dist/src/backend/domains/ratchet/ratchet.service.test.js.map +1 -1
  91. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts +3 -0
  92. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts.map +1 -1
  93. package/dist/src/backend/domains/session/acp/acp-event-translator.js +47 -56
  94. package/dist/src/backend/domains/session/acp/acp-event-translator.js.map +1 -1
  95. package/dist/src/backend/domains/session/acp/acp-permission-bridge.d.ts +3 -1
  96. package/dist/src/backend/domains/session/acp/acp-permission-bridge.d.ts.map +1 -1
  97. package/dist/src/backend/domains/session/acp/acp-permission-bridge.js +10 -1
  98. package/dist/src/backend/domains/session/acp/acp-permission-bridge.js.map +1 -1
  99. package/dist/src/backend/domains/session/acp/acp-permission-bridge.test.js +24 -0
  100. package/dist/src/backend/domains/session/acp/acp-permission-bridge.test.js.map +1 -1
  101. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts.map +1 -1
  102. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js +180 -18
  103. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js.map +1 -1
  104. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.d.ts +2 -0
  105. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.d.ts.map +1 -0
  106. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.js +40 -0
  107. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.js.map +1 -0
  108. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js +88 -1
  109. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js.map +1 -1
  110. package/dist/src/backend/domains/session/acp/acp-session-negotiation.integration.test.js +13 -1
  111. package/dist/src/backend/domains/session/acp/acp-session-negotiation.integration.test.js.map +1 -1
  112. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +96 -0
  113. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -0
  114. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +2496 -0
  115. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -0
  116. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.d.ts +2 -0
  117. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.d.ts.map +1 -0
  118. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js +92 -0
  119. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js.map +1 -0
  120. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.d.ts +2 -0
  121. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.d.ts.map +1 -0
  122. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +2026 -0
  123. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -0
  124. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.d.ts +46 -0
  125. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.d.ts.map +1 -0
  126. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.js +238 -0
  127. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.js.map +1 -0
  128. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.d.ts +2 -0
  129. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.d.ts.map +1 -0
  130. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.js +140 -0
  131. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.js.map +1 -0
  132. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.d.ts +2 -0
  133. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.d.ts.map +1 -0
  134. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.js +35 -0
  135. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.js.map +1 -0
  136. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts +334 -0
  137. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts.map +1 -0
  138. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.js +324 -0
  139. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.js.map +1 -0
  140. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.d.ts +2 -0
  141. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.d.ts.map +1 -0
  142. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.js +162 -0
  143. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.js.map +1 -0
  144. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.d.ts +2 -0
  145. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.d.ts.map +1 -0
  146. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.js +2 -0
  147. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.js.map +1 -0
  148. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.d.ts +2 -0
  149. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.d.ts.map +1 -0
  150. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.js +64 -0
  151. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.js.map +1 -0
  152. package/dist/src/backend/domains/session/acp/index.d.ts +1 -0
  153. package/dist/src/backend/domains/session/acp/index.d.ts.map +1 -1
  154. package/dist/src/backend/domains/session/acp/index.js +1 -0
  155. package/dist/src/backend/domains/session/acp/index.js.map +1 -1
  156. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.d.ts +2 -2
  157. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.d.ts.map +1 -1
  158. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.js +32 -1
  159. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.js.map +1 -1
  160. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.test.js +79 -9
  161. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.test.js.map +1 -1
  162. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/permission-response.handler.d.ts.map +1 -1
  163. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/permission-response.handler.js +3 -2
  164. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/permission-response.handler.js.map +1 -1
  165. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.d.ts +2 -2
  166. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.d.ts.map +1 -1
  167. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.js +2 -1
  168. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.js.map +1 -1
  169. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.test.js +7 -1
  170. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.test.js.map +1 -1
  171. package/dist/src/backend/domains/session/chat/chat-message-handlers/registry.js +2 -2
  172. package/dist/src/backend/domains/session/chat/chat-message-handlers/registry.js.map +1 -1
  173. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.d.ts +1 -1
  174. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.d.ts.map +1 -1
  175. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js +32 -21
  176. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js.map +1 -1
  177. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js +52 -0
  178. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js.map +1 -1
  179. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.d.ts.map +1 -1
  180. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js +17 -29
  181. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js.map +1 -1
  182. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts +1 -0
  183. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts.map +1 -1
  184. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js +121 -79
  185. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js.map +1 -1
  186. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.test.js +84 -1
  187. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.test.js.map +1 -1
  188. package/dist/src/backend/domains/session/data/session-data.service.d.ts +6 -9
  189. package/dist/src/backend/domains/session/data/session-data.service.d.ts.map +1 -1
  190. package/dist/src/backend/domains/session/data/session-data.service.js +3 -0
  191. package/dist/src/backend/domains/session/data/session-data.service.js.map +1 -1
  192. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.d.ts +6 -0
  193. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.d.ts.map +1 -0
  194. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.js +25 -0
  195. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.js.map +1 -0
  196. package/dist/src/backend/domains/session/data/session-provider-resolver.service.test.js +0 -2
  197. package/dist/src/backend/domains/session/data/session-provider-resolver.service.test.js.map +1 -1
  198. package/dist/src/backend/domains/session/index.d.ts +1 -1
  199. package/dist/src/backend/domains/session/index.d.ts.map +1 -1
  200. package/dist/src/backend/domains/session/index.js +1 -1
  201. package/dist/src/backend/domains/session/index.js.map +1 -1
  202. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts +2 -2
  203. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts.map +1 -1
  204. package/dist/src/backend/domains/session/lifecycle/session.repository.js.map +1 -1
  205. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts +29 -3
  206. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts.map +1 -1
  207. package/dist/src/backend/domains/session/lifecycle/session.service.js +384 -56
  208. package/dist/src/backend/domains/session/lifecycle/session.service.js.map +1 -1
  209. package/dist/src/backend/domains/session/lifecycle/session.service.test.js +531 -2
  210. package/dist/src/backend/domains/session/lifecycle/session.service.test.js.map +1 -1
  211. package/dist/src/backend/domains/session/session-domain.service.d.ts +6 -0
  212. package/dist/src/backend/domains/session/session-domain.service.d.ts.map +1 -1
  213. package/dist/src/backend/domains/session/session-domain.service.js +26 -1
  214. package/dist/src/backend/domains/session/session-domain.service.js.map +1 -1
  215. package/dist/src/backend/domains/session/session-domain.service.test.js +21 -0
  216. package/dist/src/backend/domains/session/session-domain.service.test.js.map +1 -1
  217. package/dist/src/backend/domains/session/store/session-replay-builder.d.ts.map +1 -1
  218. package/dist/src/backend/domains/session/store/session-replay-builder.js +2 -1
  219. package/dist/src/backend/domains/session/store/session-replay-builder.js.map +1 -1
  220. package/dist/src/backend/domains/session/store/session-replay-builder.test.js +26 -0
  221. package/dist/src/backend/domains/session/store/session-replay-builder.test.js.map +1 -1
  222. package/dist/src/backend/domains/session/store/session-store.types.d.ts +1 -1
  223. package/dist/src/backend/domains/session/store/session-store.types.d.ts.map +1 -1
  224. package/dist/src/backend/domains/session/store/session-transcript.d.ts +1 -0
  225. package/dist/src/backend/domains/session/store/session-transcript.d.ts.map +1 -1
  226. package/dist/src/backend/domains/session/store/session-transcript.js +8 -0
  227. package/dist/src/backend/domains/session/store/session-transcript.js.map +1 -1
  228. package/dist/src/backend/domains/workspace/bridges.d.ts +1 -0
  229. package/dist/src/backend/domains/workspace/bridges.d.ts.map +1 -1
  230. package/dist/src/backend/domains/workspace/index.d.ts +1 -0
  231. package/dist/src/backend/domains/workspace/index.d.ts.map +1 -1
  232. package/dist/src/backend/domains/workspace/index.js +1 -0
  233. package/dist/src/backend/domains/workspace/index.js.map +1 -1
  234. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js +0 -2
  235. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js.map +1 -1
  236. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts +10 -24
  237. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts.map +1 -1
  238. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts +2 -6
  239. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts.map +1 -1
  240. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts +82 -6
  241. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts.map +1 -1
  242. package/dist/src/backend/domains/workspace/query/workspace-query.service.js +15 -15
  243. package/dist/src/backend/domains/workspace/query/workspace-query.service.js.map +1 -1
  244. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.d.ts +2 -0
  245. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.d.ts.map +1 -0
  246. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js +165 -0
  247. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js.map +1 -0
  248. package/dist/src/backend/domains/workspace/state/pending-request-type.d.ts +6 -0
  249. package/dist/src/backend/domains/workspace/state/pending-request-type.d.ts.map +1 -0
  250. package/dist/src/backend/domains/workspace/state/pending-request-type.js +27 -0
  251. package/dist/src/backend/domains/workspace/state/pending-request-type.js.map +1 -0
  252. package/dist/src/backend/domains/workspace/state/pending-request-type.test.d.ts +2 -0
  253. package/dist/src/backend/domains/workspace/state/pending-request-type.test.d.ts.map +1 -0
  254. package/dist/src/backend/domains/workspace/state/pending-request-type.test.js +44 -0
  255. package/dist/src/backend/domains/workspace/state/pending-request-type.test.js.map +1 -0
  256. package/dist/src/backend/domains/workspace/worktree/worktree-init.test.js +9 -2
  257. package/dist/src/backend/domains/workspace/worktree/worktree-init.test.js.map +1 -1
  258. package/dist/src/backend/interceptors/pr-detection.interceptor.d.ts.map +1 -1
  259. package/dist/src/backend/interceptors/pr-detection.interceptor.js +57 -8
  260. package/dist/src/backend/interceptors/pr-detection.interceptor.js.map +1 -1
  261. package/dist/src/backend/interceptors/pr-detection.interceptor.test.d.ts +2 -0
  262. package/dist/src/backend/interceptors/pr-detection.interceptor.test.d.ts.map +1 -0
  263. package/dist/src/backend/interceptors/pr-detection.interceptor.test.js +120 -0
  264. package/dist/src/backend/interceptors/pr-detection.interceptor.test.js.map +1 -0
  265. package/dist/src/backend/lib/session-model.js +1 -1
  266. package/dist/src/backend/lib/session-model.js.map +1 -1
  267. package/dist/src/backend/lib/session-model.test.js +1 -1
  268. package/dist/src/backend/lib/session-model.test.js.map +1 -1
  269. package/dist/src/backend/orchestration/cli-health.service.d.ts +1 -0
  270. package/dist/src/backend/orchestration/cli-health.service.d.ts.map +1 -1
  271. package/dist/src/backend/orchestration/cli-health.service.js +16 -1
  272. package/dist/src/backend/orchestration/cli-health.service.js.map +1 -1
  273. package/dist/src/backend/orchestration/cli-health.service.test.js +23 -0
  274. package/dist/src/backend/orchestration/cli-health.service.test.js.map +1 -1
  275. package/dist/src/backend/orchestration/data-backup.service.d.ts.map +1 -1
  276. package/dist/src/backend/orchestration/data-backup.service.js +0 -4
  277. package/dist/src/backend/orchestration/data-backup.service.js.map +1 -1
  278. package/dist/src/backend/orchestration/data-backup.service.test.js +0 -4
  279. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  280. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
  281. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +3 -19
  282. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
  283. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js +13 -27
  284. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js.map +1 -1
  285. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts +1 -0
  286. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts.map +1 -1
  287. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js +1 -15
  288. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js.map +1 -1
  289. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js +97 -0
  290. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js.map +1 -1
  291. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +1 -3
  292. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  293. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  294. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +4 -1
  295. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  296. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +1 -0
  297. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js.map +1 -1
  298. package/dist/src/backend/prompts/ratchet-dispatch.d.ts +8 -1
  299. package/dist/src/backend/prompts/ratchet-dispatch.d.ts.map +1 -1
  300. package/dist/src/backend/prompts/ratchet-dispatch.js +20 -3
  301. package/dist/src/backend/prompts/ratchet-dispatch.js.map +1 -1
  302. package/dist/src/backend/resource_accessors/agent-session.accessor.d.ts +1 -0
  303. package/dist/src/backend/resource_accessors/agent-session.accessor.d.ts.map +1 -1
  304. package/dist/src/backend/resource_accessors/agent-session.accessor.js +10 -0
  305. package/dist/src/backend/resource_accessors/agent-session.accessor.js.map +1 -1
  306. package/dist/src/backend/resource_accessors/agent-session.accessor.test.d.ts +2 -0
  307. package/dist/src/backend/resource_accessors/agent-session.accessor.test.d.ts.map +1 -0
  308. package/dist/src/backend/resource_accessors/agent-session.accessor.test.js +148 -0
  309. package/dist/src/backend/resource_accessors/agent-session.accessor.test.js.map +1 -0
  310. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +0 -15
  311. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -1
  312. package/dist/src/backend/resource_accessors/workspace.accessor.js +0 -33
  313. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -1
  314. package/dist/src/backend/schemas/tool-inputs.schema.d.ts +2 -0
  315. package/dist/src/backend/schemas/tool-inputs.schema.d.ts.map +1 -1
  316. package/dist/src/backend/schemas/tool-inputs.schema.js +1 -0
  317. package/dist/src/backend/schemas/tool-inputs.schema.js.map +1 -1
  318. package/dist/src/backend/services/constants.d.ts +1 -5
  319. package/dist/src/backend/services/constants.d.ts.map +1 -1
  320. package/dist/src/backend/services/constants.js +1 -5
  321. package/dist/src/backend/services/constants.js.map +1 -1
  322. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts +2 -2
  323. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts.map +1 -1
  324. package/dist/src/backend/trpc/admin-active-processes.d.ts +55 -0
  325. package/dist/src/backend/trpc/admin-active-processes.d.ts.map +1 -0
  326. package/dist/src/backend/trpc/admin-active-processes.js +103 -0
  327. package/dist/src/backend/trpc/admin-active-processes.js.map +1 -0
  328. package/dist/src/backend/trpc/admin-active-processes.test.d.ts +2 -0
  329. package/dist/src/backend/trpc/admin-active-processes.test.d.ts.map +1 -0
  330. package/dist/src/backend/trpc/admin-active-processes.test.js +105 -0
  331. package/dist/src/backend/trpc/admin-active-processes.test.js.map +1 -0
  332. package/dist/src/backend/trpc/admin.trpc.d.ts +5 -32
  333. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  334. package/dist/src/backend/trpc/admin.trpc.js +29 -128
  335. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  336. package/dist/src/backend/trpc/decision-log.trpc.d.ts +3 -3
  337. package/dist/src/backend/trpc/index.d.ts +137 -104
  338. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  339. package/dist/src/backend/trpc/log-file-reader.d.ts +26 -0
  340. package/dist/src/backend/trpc/log-file-reader.d.ts.map +1 -0
  341. package/dist/src/backend/trpc/log-file-reader.js +160 -0
  342. package/dist/src/backend/trpc/log-file-reader.js.map +1 -0
  343. package/dist/src/backend/trpc/log-file-reader.test.d.ts +2 -0
  344. package/dist/src/backend/trpc/log-file-reader.test.d.ts.map +1 -0
  345. package/dist/src/backend/trpc/log-file-reader.test.js +162 -0
  346. package/dist/src/backend/trpc/log-file-reader.test.js.map +1 -0
  347. package/dist/src/backend/trpc/project.trpc.d.ts +2 -6
  348. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  349. package/dist/src/backend/trpc/session.trpc.d.ts +24 -31
  350. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  351. package/dist/src/backend/trpc/session.trpc.js +5 -1
  352. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  353. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +4 -6
  354. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  355. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +5 -9
  356. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  357. package/dist/src/backend/trpc/workspace.trpc.d.ts +103 -39
  358. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  359. package/dist/src/backend/trpc/workspace.trpc.js +8 -0
  360. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  361. package/dist/src/cli/index.js +7 -2
  362. package/dist/src/cli/index.js.map +1 -1
  363. package/dist/src/shared/acp-protocol/protocol/interaction.d.ts +2 -0
  364. package/dist/src/shared/acp-protocol/protocol/interaction.d.ts.map +1 -1
  365. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts +1 -0
  366. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts.map +1 -1
  367. package/dist/src/shared/acp-protocol/protocol/websocket.js.map +1 -1
  368. package/dist/src/shared/pending-request-types.d.ts +4 -0
  369. package/dist/src/shared/pending-request-types.d.ts.map +1 -1
  370. package/dist/src/shared/pending-request-types.js +10 -0
  371. package/dist/src/shared/pending-request-types.js.map +1 -1
  372. package/dist/src/shared/schemas/export-data.schema.d.ts +0 -18
  373. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  374. package/dist/src/shared/schemas/export-data.schema.js +0 -2
  375. package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
  376. package/dist/src/shared/websocket/chat-message.schema.d.ts +1 -0
  377. package/dist/src/shared/websocket/chat-message.schema.d.ts.map +1 -1
  378. package/dist/src/shared/websocket/chat-message.schema.js +1 -0
  379. package/dist/src/shared/websocket/chat-message.schema.js.map +1 -1
  380. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  381. package/package.json +4 -2
  382. package/prisma/migrations/20260214232046_remove_ratchet_last_modified/migration.sql +68 -0
  383. package/prisma/schema.prisma +0 -2
  384. package/prompts/quick-actions/screenshots.md +12 -6
  385. package/prompts/ratchet/dispatch.md +4 -0
  386. package/dist/client/assets/channel-BA4I5_zc.js +0 -1
  387. package/dist/client/assets/classDiagram-2ON5EDUG-DHiY0J8v.js +0 -1
  388. package/dist/client/assets/classDiagram-v2-WZHVMYZB-DHiY0J8v.js +0 -1
  389. package/dist/client/assets/clone-C7QOkM1k.js +0 -1
  390. package/dist/client/assets/index-D_8rf7lP.css +0 -1
  391. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BGGNxhyR.js +0 -1
  392. package/dist/src/backend/domains/github/pr-review-fixer.service.d.ts +0 -63
  393. package/dist/src/backend/domains/github/pr-review-fixer.service.d.ts.map +0 -1
  394. package/dist/src/backend/domains/github/pr-review-fixer.service.js +0 -141
  395. package/dist/src/backend/domains/github/pr-review-fixer.service.js.map +0 -1
  396. package/dist/src/backend/domains/github/pr-review-fixer.service.test.d.ts +0 -2
  397. package/dist/src/backend/domains/github/pr-review-fixer.service.test.d.ts.map +0 -1
  398. package/dist/src/backend/domains/github/pr-review-fixer.service.test.js +0 -28
  399. package/dist/src/backend/domains/github/pr-review-fixer.service.test.js.map +0 -1
  400. package/dist/src/backend/domains/github/pr-review-monitor.service.d.ts +0 -19
  401. package/dist/src/backend/domains/github/pr-review-monitor.service.d.ts.map +0 -1
  402. package/dist/src/backend/domains/github/pr-review-monitor.service.js +0 -215
  403. package/dist/src/backend/domains/github/pr-review-monitor.service.js.map +0 -1
  404. package/dist/src/backend/domains/ratchet/ci-fixer.service.d.ts +0 -47
  405. package/dist/src/backend/domains/ratchet/ci-fixer.service.d.ts.map +0 -1
  406. package/dist/src/backend/domains/ratchet/ci-fixer.service.js +0 -95
  407. package/dist/src/backend/domains/ratchet/ci-fixer.service.js.map +0 -1
  408. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.d.ts +0 -2
  409. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.d.ts.map +0 -1
  410. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.js +0 -100
  411. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.js.map +0 -1
  412. package/dist/src/backend/domains/ratchet/ci-monitor.service.d.ts +0 -36
  413. package/dist/src/backend/domains/ratchet/ci-monitor.service.d.ts.map +0 -1
  414. package/dist/src/backend/domains/ratchet/ci-monitor.service.js +0 -278
  415. package/dist/src/backend/domains/ratchet/ci-monitor.service.js.map +0 -1
  416. package/dist/src/backend/services/fixer-workflow.service.d.ts +0 -83
  417. package/dist/src/backend/services/fixer-workflow.service.d.ts.map +0 -1
  418. package/dist/src/backend/services/fixer-workflow.service.js +0 -77
  419. package/dist/src/backend/services/fixer-workflow.service.js.map +0 -1
  420. package/dist/src/backend/services/fixer-workflow.service.test.d.ts +0 -2
  421. package/dist/src/backend/services/fixer-workflow.service.test.d.ts.map +0 -1
  422. package/dist/src/backend/services/fixer-workflow.service.test.js +0 -55
  423. package/dist/src/backend/services/fixer-workflow.service.test.js.map +0 -1
@@ -2,16 +2,17 @@ import { AcpEventTranslator, AcpPermissionBridge, acpRuntimeManager, } from '../
2
2
  import { acpTraceLogger } from '../../../../backend/domains/session/logging/acp-trace-logger.service.js';
3
3
  import { sessionFileLogger } from '../../../../backend/domains/session/logging/session-file-logger.service.js';
4
4
  import { sessionDomainService } from '../../../../backend/domains/session/session-domain.service.js';
5
+ import { interceptorRegistry } from '../../../../backend/interceptors/registry.js';
5
6
  import { createLogger } from '../../../../backend/services/logger.service.js';
6
7
  import { extractPlanText } from '../../../../shared/acp-protocol/plan-content.js';
7
8
  import { EMPTY_CHAT_BAR_CAPABILITIES } from '../../../../shared/chat-capabilities.js';
8
9
  import { SessionStatus } from '../../../../shared/core/index.js';
10
+ import { isUserQuestionRequest } from '../../../../shared/pending-request-types.js';
9
11
  import { createInitialSessionRuntimeState, } from '../../../../shared/session-runtime.js';
10
12
  import { sessionPromptBuilder } from './session.prompt-builder.js';
11
13
  import { sessionRepository } from './session.repository.js';
12
14
  const logger = createLogger('session');
13
15
  const STALE_LOADING_RUNTIME_MAX_AGE_MS = 30_000;
14
- const TERMINAL_TOOL_STATUSES = new Set(['completed', 'failed', 'cancelled']);
15
16
  class SessionService {
16
17
  repository;
17
18
  promptBuilder;
@@ -22,9 +23,14 @@ class SessionService {
22
23
  suppressAcpReplayForSession = new Set();
23
24
  workspaceBridge = null;
24
25
  sessionToWorkspace = new Map();
26
+ sessionToWorkingDir = new Map();
27
+ promptTurnCompleteHandler = null;
25
28
  configure(bridges) {
26
29
  this.workspaceBridge = bridges.workspace;
27
30
  }
31
+ setPromptTurnCompleteHandler(handler) {
32
+ this.promptTurnCompleteHandler = handler;
33
+ }
28
34
  isStaleLoadingRuntime(runtime) {
29
35
  if (runtime.phase !== 'loading' || runtime.processState === 'alive') {
30
36
  return false;
@@ -95,6 +101,7 @@ class SessionService {
95
101
  this.pendingAcpToolCalls.delete(sid);
96
102
  this.suppressAcpReplayForSession.delete(sid);
97
103
  this.sessionToWorkspace.delete(sid);
104
+ this.sessionToWorkingDir.delete(sid);
98
105
  const b = this.acpPermissionBridges.get(sid);
99
106
  if (b) {
100
107
  b.cancelAll();
@@ -209,7 +216,16 @@ class SessionService {
209
216
  return;
210
217
  }
211
218
  const toolName = typeof contentBlock?.name === 'string' ? contentBlock.name : 'ACP Tool';
212
- this.upsertPendingToolCall(sid, toolUseId, { toolName });
219
+ const toolInput = this.normalizeToolInput(contentBlock?.input);
220
+ const existing = this.getPendingToolCall(sid, toolUseId);
221
+ this.upsertPendingToolCall(sid, toolUseId, { toolName, toolInput });
222
+ if (!existing) {
223
+ this.notifyInterceptorToolStart(sid, {
224
+ toolUseId,
225
+ toolName,
226
+ toolInput: toolInput ?? {},
227
+ });
228
+ }
213
229
  }
214
230
  clearPendingFromToolResultMessage(sid, data) {
215
231
  if (data.type !== 'user') {
@@ -221,6 +237,8 @@ class SessionService {
221
237
  }
222
238
  for (const item of content) {
223
239
  if (item.type === 'tool_result') {
240
+ const pending = this.getPendingToolCall(sid, item.tool_use_id);
241
+ this.notifyInterceptorToolComplete(sid, item.tool_use_id, item.content, item.is_error === true, pending);
224
242
  this.removePendingToolCall(sid, item.tool_use_id);
225
243
  }
226
244
  }
@@ -229,15 +247,19 @@ class SessionService {
229
247
  if (!progress.tool_use_id) {
230
248
  return;
231
249
  }
232
- if (progress.acpStatus && TERMINAL_TOOL_STATUSES.has(progress.acpStatus)) {
233
- this.removePendingToolCall(sid, progress.tool_use_id);
234
- return;
235
- }
250
+ const existing = this.getPendingToolCall(sid, progress.tool_use_id);
236
251
  this.upsertPendingToolCall(sid, progress.tool_use_id, {
237
252
  toolName: progress.tool_name ?? 'ACP Tool',
238
253
  acpKind: progress.acpKind,
239
254
  acpLocations: progress.acpLocations,
240
255
  });
256
+ if (!existing) {
257
+ this.notifyInterceptorToolStart(sid, {
258
+ toolUseId: progress.tool_use_id,
259
+ toolName: progress.tool_name ?? 'ACP Tool',
260
+ toolInput: {},
261
+ });
262
+ }
241
263
  }
242
264
  upsertPendingToolCall(sid, toolUseId, update) {
243
265
  const pendingById = this.pendingAcpToolCalls.get(sid) ?? new Map();
@@ -245,11 +267,15 @@ class SessionService {
245
267
  pendingById.set(toolUseId, {
246
268
  toolUseId,
247
269
  toolName: update.toolName || existing?.toolName || 'ACP Tool',
270
+ toolInput: update.toolInput ?? existing?.toolInput,
248
271
  acpKind: update.acpKind ?? existing?.acpKind,
249
272
  acpLocations: update.acpLocations ?? existing?.acpLocations,
250
273
  });
251
274
  this.pendingAcpToolCalls.set(sid, pendingById);
252
275
  }
276
+ getPendingToolCall(sid, toolUseId) {
277
+ return this.pendingAcpToolCalls.get(sid)?.get(toolUseId);
278
+ }
253
279
  removePendingToolCall(sid, toolUseId) {
254
280
  const pendingById = this.pendingAcpToolCalls.get(sid);
255
281
  if (!pendingById) {
@@ -260,6 +286,80 @@ class SessionService {
260
286
  this.pendingAcpToolCalls.delete(sid);
261
287
  }
262
288
  }
289
+ normalizeToolInput(input) {
290
+ if (typeof input !== 'object' || input === null || Array.isArray(input)) {
291
+ return undefined;
292
+ }
293
+ return input;
294
+ }
295
+ extractToolResultText(content) {
296
+ if (typeof content === 'string') {
297
+ return content;
298
+ }
299
+ if (Array.isArray(content)) {
300
+ return content
301
+ .flatMap((item) => {
302
+ if (typeof item === 'object' &&
303
+ item !== null &&
304
+ item.type === 'text' &&
305
+ typeof item.text === 'string') {
306
+ return [item.text];
307
+ }
308
+ return [];
309
+ })
310
+ .join('\n');
311
+ }
312
+ if (content === undefined || content === null) {
313
+ return '';
314
+ }
315
+ try {
316
+ return JSON.stringify(content);
317
+ }
318
+ catch {
319
+ return String(content);
320
+ }
321
+ }
322
+ getInterceptorContext(sessionId) {
323
+ const workspaceId = this.sessionToWorkspace.get(sessionId);
324
+ const workingDir = this.sessionToWorkingDir.get(sessionId);
325
+ if (!(workspaceId && workingDir)) {
326
+ return null;
327
+ }
328
+ return {
329
+ sessionId,
330
+ workspaceId,
331
+ workingDir,
332
+ timestamp: new Date(),
333
+ };
334
+ }
335
+ notifyInterceptorToolStart(sessionId, tool) {
336
+ const context = this.getInterceptorContext(sessionId);
337
+ if (!context) {
338
+ return;
339
+ }
340
+ const event = {
341
+ toolUseId: tool.toolUseId,
342
+ toolName: tool.toolName,
343
+ input: tool.toolInput,
344
+ };
345
+ interceptorRegistry.notifyToolStart(event, context);
346
+ }
347
+ notifyInterceptorToolComplete(sessionId, toolUseId, content, isError, pending) {
348
+ const context = this.getInterceptorContext(sessionId);
349
+ if (!context) {
350
+ return;
351
+ }
352
+ const event = {
353
+ toolUseId,
354
+ toolName: pending?.toolName ?? 'ACP Tool',
355
+ input: pending?.toolInput ?? {},
356
+ output: {
357
+ content: this.extractToolResultText(content),
358
+ isError,
359
+ },
360
+ };
361
+ interceptorRegistry.notifyToolComplete(event, context);
362
+ }
263
363
  finalizeOrphanedToolCalls(sid, reason) {
264
364
  const pendingById = this.pendingAcpToolCalls.get(sid);
265
365
  if (!pendingById || pendingById.size === 0) {
@@ -359,11 +459,12 @@ class SessionService {
359
459
  kind: o.kind,
360
460
  }));
361
461
  const planContent = this.extractPlanContent(toolName, toolInput);
362
- if (toolName === 'AskUserQuestion') {
462
+ if (isUserQuestionRequest({ toolName, input: toolInput })) {
363
463
  const questions = this.extractAskUserQuestions(toolInput);
364
464
  sessionDomainService.emitDelta(sid, {
365
465
  type: 'user_question',
366
466
  requestId,
467
+ toolName,
367
468
  questions,
368
469
  acpOptions,
369
470
  });
@@ -409,6 +510,7 @@ class SessionService {
409
510
  }
410
511
  await this.repository.markWorkspaceHasHadSessions(sessionContext.workspaceId);
411
512
  this.sessionToWorkspace.set(sessionId, sessionContext.workspaceId);
513
+ this.sessionToWorkingDir.set(sessionId, sessionContext.workingDir);
412
514
  const handlers = this.setupAcpEventHandler(sessionId);
413
515
  const shouldSuppressReplay = this.shouldSuppressReplayDuringAcpResume(sessionId, session);
414
516
  if (shouldSuppressReplay) {
@@ -435,6 +537,8 @@ class SessionService {
435
537
  }
436
538
  catch (error) {
437
539
  this.suppressAcpReplayForSession.delete(sessionId);
540
+ this.sessionToWorkspace.delete(sessionId);
541
+ this.sessionToWorkingDir.delete(sessionId);
438
542
  throw error;
439
543
  }
440
544
  await this.persistAcpConfigSnapshot(sessionId, {
@@ -489,15 +593,110 @@ class SessionService {
489
593
  if (existingClient) {
490
594
  throw new Error('Session is already running');
491
595
  }
492
- await this.getOrCreateAcpSessionClient(sessionId, { permissionMode: 'bypassPermissions' }, session);
596
+ const startupModePreset = options?.startupModePreset;
597
+ const startupPermissionMode = startupModePreset === 'plan' ? 'plan' : 'bypassPermissions';
598
+ const handle = await this.getOrCreateAcpSessionClient(sessionId, { permissionMode: startupPermissionMode }, session);
599
+ await this.applyStartupModePreset(sessionId, handle, startupModePreset);
493
600
  const initialPrompt = options?.initialPrompt ?? 'Continue with the task.';
494
601
  if (initialPrompt) {
495
602
  await this.sendSessionMessage(sessionId, initialPrompt);
496
603
  }
497
604
  logger.info('Session started', { sessionId, provider: session.provider });
498
605
  }
606
+ async applyStartupModePreset(sessionId, handle, startupModePreset) {
607
+ if (!startupModePreset) {
608
+ return;
609
+ }
610
+ const modeOption = handle.configOptions.find((option) => option.category === 'mode');
611
+ if (!modeOption) {
612
+ return;
613
+ }
614
+ const availableModeValues = this.getConfigOptionValues(modeOption);
615
+ const targetMode = this.resolveStartupModeTarget(handle.provider, startupModePreset, availableModeValues);
616
+ if (!targetMode) {
617
+ logger.debug('Startup mode preset not available in ACP mode options', {
618
+ sessionId,
619
+ provider: handle.provider,
620
+ startupModePreset,
621
+ availableModeValues,
622
+ });
623
+ return;
624
+ }
625
+ const currentMode = modeOption.currentValue ? String(modeOption.currentValue) : null;
626
+ if (currentMode === targetMode) {
627
+ return;
628
+ }
629
+ try {
630
+ const configOptions = await acpRuntimeManager.setSessionMode(sessionId, targetMode);
631
+ handle.configOptions = configOptions;
632
+ await this.persistAcpConfigSnapshot(sessionId, {
633
+ provider: handle.provider,
634
+ providerSessionId: handle.providerSessionId,
635
+ configOptions,
636
+ });
637
+ sessionDomainService.emitDelta(sessionId, {
638
+ type: 'config_options_update',
639
+ configOptions,
640
+ });
641
+ sessionDomainService.emitDelta(sessionId, {
642
+ type: 'chat_capabilities',
643
+ capabilities: this.buildAcpChatBarCapabilities(handle),
644
+ });
645
+ }
646
+ catch (error) {
647
+ logger.warn('Failed applying startup mode preset', {
648
+ sessionId,
649
+ provider: handle.provider,
650
+ startupModePreset,
651
+ targetMode,
652
+ error: error instanceof Error ? error.message : String(error),
653
+ });
654
+ }
655
+ }
656
+ resolveStartupModeTarget(provider, startupModePreset, availableModeValues) {
657
+ if (availableModeValues.length === 0) {
658
+ return null;
659
+ }
660
+ if (startupModePreset === 'plan') {
661
+ return this.findModeValue(availableModeValues, ['plan']);
662
+ }
663
+ if (provider === 'CLAUDE') {
664
+ return this.findModeValue(availableModeValues, [
665
+ 'bypassPermissions',
666
+ 'dangerouslySkipPermissions',
667
+ 'dangerousSkipPermissions',
668
+ 'acceptEdits',
669
+ ]);
670
+ }
671
+ return this.findModeValue(availableModeValues, [
672
+ 'fullAccess',
673
+ 'full_access',
674
+ 'full-access',
675
+ 'code',
676
+ ]);
677
+ }
678
+ findModeValue(availableModeValues, preferredModeValues) {
679
+ if (availableModeValues.length === 0 || preferredModeValues.length === 0) {
680
+ return null;
681
+ }
682
+ const availableByNormalized = new Map();
683
+ for (const value of availableModeValues) {
684
+ availableByNormalized.set(this.normalizeModeValue(value), value);
685
+ }
686
+ for (const preferredValue of preferredModeValues) {
687
+ const match = availableByNormalized.get(this.normalizeModeValue(preferredValue));
688
+ if (match) {
689
+ return match;
690
+ }
691
+ }
692
+ return null;
693
+ }
694
+ normalizeModeValue(value) {
695
+ return value.replace(/[^a-z0-9]/gi, '').toLowerCase();
696
+ }
499
697
  async stopSession(sessionId, options) {
500
698
  const session = await this.loadSessionForStop(sessionId);
699
+ const workspaceId = session?.workspaceId ?? this.sessionToWorkspace.get(sessionId);
501
700
  if (acpRuntimeManager.isStopInProgress(sessionId)) {
502
701
  logger.debug('Session stop already in progress', { sessionId });
503
702
  return;
@@ -510,7 +709,6 @@ class SessionService {
510
709
  updatedAt: new Date().toISOString(),
511
710
  });
512
711
  this.acpStreamState.delete(sessionId);
513
- this.pendingAcpToolCalls.delete(sessionId);
514
712
  this.suppressAcpReplayForSession.delete(sessionId);
515
713
  const acpBridge = this.acpPermissionBridges.get(sessionId);
516
714
  if (acpBridge) {
@@ -531,14 +729,18 @@ class SessionService {
531
729
  });
532
730
  }
533
731
  finally {
732
+ this.finalizeOrphanedToolCallsOnStop(sessionId);
534
733
  await this.updateStoppedSessionState(sessionId);
535
- sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: false });
734
+ sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: true });
536
735
  sessionDomainService.setRuntimeSnapshot(sessionId, {
537
736
  phase: 'idle',
538
737
  processState: 'stopped',
539
738
  activity: 'IDLE',
540
739
  updatedAt: new Date().toISOString(),
541
740
  });
741
+ this.markWorkspaceSessionIdleOnStop(workspaceId, sessionId);
742
+ this.sessionToWorkspace.delete(sessionId);
743
+ this.sessionToWorkingDir.delete(sessionId);
542
744
  if (!stopClientFailed) {
543
745
  const shouldCleanupTransientRatchetSession = options?.cleanupTransientRatchetSession ?? true;
544
746
  await this.cleanupTransientRatchetOnStop(session, sessionId, shouldCleanupTransientRatchetSession);
@@ -550,6 +752,33 @@ class SessionService {
550
752
  acpTraceLogger.closeSession(sessionId);
551
753
  }
552
754
  }
755
+ finalizeOrphanedToolCallsOnStop(sessionId) {
756
+ try {
757
+ this.finalizeOrphanedToolCalls(sessionId, 'session_stop');
758
+ }
759
+ catch (error) {
760
+ logger.warn('Failed finalizing orphaned ACP tool calls during stop', {
761
+ sessionId,
762
+ error: error instanceof Error ? error.message : String(error),
763
+ });
764
+ this.pendingAcpToolCalls.delete(sessionId);
765
+ }
766
+ }
767
+ markWorkspaceSessionIdleOnStop(workspaceId, sessionId) {
768
+ if (!(workspaceId && this.workspaceBridge)) {
769
+ return;
770
+ }
771
+ try {
772
+ this.workspaceBridge.markSessionIdle(workspaceId, sessionId);
773
+ }
774
+ catch (error) {
775
+ logger.warn('Failed to mark workspace session idle during stop', {
776
+ sessionId,
777
+ workspaceId,
778
+ error: error instanceof Error ? error.message : String(error),
779
+ });
780
+ }
781
+ }
553
782
  async loadSessionForStop(sessionId) {
554
783
  try {
555
784
  return await this.repository.getSessionById(sessionId);
@@ -691,7 +920,15 @@ class SessionService {
691
920
  }
692
921
  async setSessionConfigOption(sessionId, configId, value) {
693
922
  const acpHandle = acpRuntimeManager.getClient(sessionId);
694
- const selectedOption = acpHandle?.configOptions.find((option) => option.id === configId);
923
+ if (!acpHandle) {
924
+ const configOptions = await this.setCachedSessionConfigOption(sessionId, configId, value);
925
+ sessionDomainService.emitDelta(sessionId, {
926
+ type: 'config_options_update',
927
+ configOptions,
928
+ });
929
+ return;
930
+ }
931
+ const selectedOption = acpHandle.configOptions.find((option) => option.id === configId);
695
932
  const isModeOption = configId === 'mode' || selectedOption?.category === 'mode';
696
933
  const isModelOption = configId === 'model' || selectedOption?.category === 'model';
697
934
  const configOptions = isModeOption
@@ -712,6 +949,46 @@ class SessionService {
712
949
  });
713
950
  }
714
951
  }
952
+ async setCachedSessionConfigOption(sessionId, configId, value) {
953
+ const session = await this.repository.getSessionById(sessionId);
954
+ if (!session) {
955
+ throw new Error(`Session not found: ${sessionId}`);
956
+ }
957
+ const snapshot = this.extractAcpConfigSnapshot(session.providerMetadata);
958
+ if (!snapshot || snapshot.provider !== session.provider) {
959
+ throw new Error(`Cannot set config option for inactive session ${sessionId}: no cached ACP config available`);
960
+ }
961
+ const configOptions = this.updateCachedConfigOptions(snapshot.configOptions, configId, value);
962
+ await this.persistAcpConfigSnapshot(sessionId, {
963
+ provider: snapshot.provider,
964
+ providerSessionId: snapshot.providerSessionId,
965
+ configOptions,
966
+ existingMetadata: session.providerMetadata,
967
+ });
968
+ return configOptions;
969
+ }
970
+ updateCachedConfigOptions(configOptions, configId, value) {
971
+ let didUpdate = false;
972
+ const nextConfigOptions = configOptions.map((option) => {
973
+ if (option.id !== configId) {
974
+ return option;
975
+ }
976
+ const allowedValues = this.getConfigOptionValues(option);
977
+ if (allowedValues.length > 0 && !allowedValues.includes(value)) {
978
+ throw new Error(`Unsupported value "${value}" for config option "${configId}"` +
979
+ ` (allowed: ${allowedValues.join(', ')})`);
980
+ }
981
+ didUpdate = true;
982
+ return {
983
+ ...option,
984
+ currentValue: value,
985
+ };
986
+ });
987
+ if (!didUpdate) {
988
+ throw new Error(`Unknown config option: ${configId}`);
989
+ }
990
+ return nextConfigOptions;
991
+ }
715
992
  sendSessionMessage(sessionId, content) {
716
993
  const acpClient = acpRuntimeManager.getClient(sessionId);
717
994
  if (acpClient) {
@@ -795,6 +1072,29 @@ class SessionService {
795
1072
  if (workspaceId && this.workspaceBridge) {
796
1073
  this.workspaceBridge.markSessionIdle(workspaceId, sessionId);
797
1074
  }
1075
+ this.schedulePromptTurnComplete(sessionId);
1076
+ }
1077
+ }
1078
+ schedulePromptTurnComplete(sessionId) {
1079
+ if (!this.promptTurnCompleteHandler) {
1080
+ return;
1081
+ }
1082
+ setTimeout(() => {
1083
+ void this.notifyPromptTurnComplete(sessionId);
1084
+ }, 0);
1085
+ }
1086
+ async notifyPromptTurnComplete(sessionId) {
1087
+ if (!this.promptTurnCompleteHandler) {
1088
+ return;
1089
+ }
1090
+ try {
1091
+ await this.promptTurnCompleteHandler(sessionId);
1092
+ }
1093
+ catch (error) {
1094
+ logger.warn('Prompt turn completion handler failed', {
1095
+ sessionId,
1096
+ error: error instanceof Error ? error.message : String(error),
1097
+ });
798
1098
  }
799
1099
  }
800
1100
  async cancelAcpPrompt(sessionId) {
@@ -846,12 +1146,12 @@ class SessionService {
846
1146
  .join('\n')
847
1147
  .trim();
848
1148
  }
849
- respondToAcpPermission(sessionId, requestId, optionId) {
1149
+ respondToAcpPermission(sessionId, requestId, optionId, answers) {
850
1150
  const bridge = this.acpPermissionBridges.get(sessionId);
851
1151
  if (!bridge) {
852
1152
  return false;
853
1153
  }
854
- return bridge.resolvePermission(requestId, optionId);
1154
+ return bridge.resolvePermission(requestId, optionId, answers);
855
1155
  }
856
1156
  getRuntimeSnapshot(sessionId) {
857
1157
  const fallback = createInitialSessionRuntimeState();
@@ -961,12 +1261,36 @@ class SessionService {
961
1261
  }
962
1262
  buildCapabilitiesFromConfigOptions(provider, configOptions, fallbackModel) {
963
1263
  const modelOption = configOptions.find((o) => o.category === 'model');
964
- const thoughtOption = configOptions.find((o) => o.category === 'thought_level');
1264
+ const modeOption = configOptions.find((o) => o.category === 'mode');
1265
+ const thoughtOption = configOptions.find((o) => o.category === 'thought_level' || o.id === 'reasoning_effort' || o.category === 'reasoning');
965
1266
  const selectedModel = modelOption?.currentValue
966
1267
  ? String(modelOption.currentValue)
967
1268
  : (fallbackModel ?? undefined);
968
1269
  const modelOptions = this.buildModelOptions(modelOption, selectedModel);
969
1270
  const isCodexProvider = provider === 'CODEX';
1271
+ const reasoningOptions = isCodexProvider && thoughtOption
1272
+ ? this.getSelectOptions(thoughtOption).map((option) => ({
1273
+ value: option.value,
1274
+ label: option.name ?? option.value,
1275
+ ...(option.description ? { description: option.description } : {}),
1276
+ }))
1277
+ : [];
1278
+ const reasoningValues = new Set(reasoningOptions.map((option) => option.value));
1279
+ const selectedReasoning = isCodexProvider &&
1280
+ thoughtOption?.currentValue &&
1281
+ typeof thoughtOption.currentValue === 'string' &&
1282
+ reasoningValues.has(thoughtOption.currentValue)
1283
+ ? thoughtOption.currentValue
1284
+ : undefined;
1285
+ const modeDescriptors = modeOption
1286
+ ? [
1287
+ ...this.getConfigOptionValues(modeOption),
1288
+ ...this.getSelectOptions(modeOption)
1289
+ .map((entry) => entry.name ?? '')
1290
+ .filter((value) => value.trim().length > 0),
1291
+ ]
1292
+ : [];
1293
+ const planModeEnabled = modeDescriptors.some((entry) => /plan/i.test(entry));
970
1294
  return {
971
1295
  provider,
972
1296
  model: {
@@ -975,13 +1299,14 @@ class SessionService {
975
1299
  ...(selectedModel ? { selected: selectedModel } : {}),
976
1300
  },
977
1301
  reasoning: {
978
- enabled: false,
979
- options: [],
1302
+ enabled: reasoningOptions.length > 0,
1303
+ options: reasoningOptions,
1304
+ ...(selectedReasoning ? { selected: selectedReasoning } : {}),
980
1305
  },
981
1306
  thinking: {
982
- enabled: !!thoughtOption,
1307
+ enabled: !isCodexProvider && !!thoughtOption,
983
1308
  },
984
- planMode: { enabled: true },
1309
+ planMode: { enabled: planModeEnabled },
985
1310
  attachments: isCodexProvider
986
1311
  ? { enabled: false, kinds: [] }
987
1312
  : { enabled: true, kinds: ['image', 'text'] },
@@ -994,28 +1319,34 @@ class SessionService {
994
1319
  if (!modelOption) {
995
1320
  return selectedModel ? [{ value: selectedModel, label: selectedModel }] : [];
996
1321
  }
997
- const uniqueValues = new Set(this.getConfigOptionValues(modelOption));
998
- if (selectedModel) {
999
- uniqueValues.add(selectedModel);
1322
+ const byValue = new Map();
1323
+ for (const option of this.getSelectOptions(modelOption)) {
1324
+ if (!byValue.has(option.value)) {
1325
+ byValue.set(option.value, option.name ?? option.value);
1326
+ }
1327
+ }
1328
+ if (selectedModel && !byValue.has(selectedModel)) {
1329
+ byValue.set(selectedModel, selectedModel);
1000
1330
  }
1001
- return Array.from(uniqueValues).map((value) => ({ value, label: value }));
1331
+ return Array.from(byValue.entries()).map(([value, label]) => ({ value, label }));
1002
1332
  }
1003
- getConfigOptionValues(option) {
1333
+ getSelectOptions(option) {
1004
1334
  return option.options.flatMap((entry) => {
1005
1335
  if (typeof entry !== 'object' || entry === null) {
1006
1336
  return [];
1007
1337
  }
1008
1338
  if ('value' in entry && typeof entry.value === 'string') {
1009
- return [entry.value];
1339
+ return [entry];
1010
1340
  }
1011
1341
  if ('options' in entry && Array.isArray(entry.options)) {
1012
- return entry.options
1013
- .map((grouped) => grouped?.value)
1014
- .filter((value) => typeof value === 'string');
1342
+ return entry.options.filter((grouped) => typeof grouped === 'object' && grouped !== null && typeof grouped.value === 'string');
1015
1343
  }
1016
1344
  return [];
1017
1345
  });
1018
1346
  }
1347
+ getConfigOptionValues(option) {
1348
+ return this.getSelectOptions(option).map((entry) => entry.value);
1349
+ }
1019
1350
  async stopAllClients(_timeoutMs = 5000) {
1020
1351
  try {
1021
1352
  await acpRuntimeManager.stopAllClients();
@@ -1036,7 +1367,6 @@ class SessionService {
1036
1367
  const metadataSource = params.existingMetadata ??
1037
1368
  (await this.repository.getSessionById(sessionId))?.providerMetadata ??
1038
1369
  null;
1039
- const metadataRecord = this.toMetadataRecord(metadataSource);
1040
1370
  const snapshot = {
1041
1371
  provider: params.provider,
1042
1372
  providerSessionId: params.providerSessionId,
@@ -1044,44 +1374,42 @@ class SessionService {
1044
1374
  configOptions: configOptionsForStorage,
1045
1375
  ...(observedModelId ? { observedModelId } : {}),
1046
1376
  };
1377
+ const persistedUpdate = this.buildSnapshotPersistUpdate(metadataSource, snapshot, observedModelId);
1378
+ try {
1379
+ await this.repository.updateSession(sessionId, persistedUpdate);
1380
+ }
1381
+ catch (error) {
1382
+ logger.warn('Failed persisting ACP config snapshot to session metadata; retrying once', {
1383
+ sessionId,
1384
+ error: error instanceof Error ? error.message : String(error),
1385
+ });
1386
+ await this.retryPersistAcpConfigSnapshot(sessionId, snapshot, observedModelId);
1387
+ }
1388
+ }
1389
+ buildSnapshotPersistUpdate(metadataSource, snapshot, observedModelId) {
1047
1390
  const nextMetadata = {
1048
- ...metadataRecord,
1391
+ ...this.toMetadataRecord(metadataSource),
1049
1392
  acpConfigSnapshot: snapshot,
1050
1393
  };
1051
1394
  if (observedModelId) {
1052
1395
  nextMetadata.observedModelId = observedModelId;
1053
1396
  }
1397
+ return {
1398
+ providerMetadata: nextMetadata,
1399
+ ...(observedModelId ? { model: observedModelId } : {}),
1400
+ };
1401
+ }
1402
+ async retryPersistAcpConfigSnapshot(sessionId, snapshot, observedModelId) {
1054
1403
  try {
1055
- await this.repository.updateSession(sessionId, {
1056
- providerMetadata: nextMetadata,
1057
- });
1404
+ const latestMetadataSource = (await this.repository.getSessionById(sessionId))
1405
+ ?.providerMetadata;
1406
+ await this.repository.updateSession(sessionId, this.buildSnapshotPersistUpdate(latestMetadataSource, snapshot, observedModelId));
1058
1407
  }
1059
- catch (error) {
1060
- logger.warn('Failed persisting ACP config snapshot to session metadata; retrying once', {
1408
+ catch (retryError) {
1409
+ logger.warn('Retry failed persisting ACP config snapshot to session metadata', {
1061
1410
  sessionId,
1062
- error: error instanceof Error ? error.message : String(error),
1411
+ error: retryError instanceof Error ? retryError.message : String(retryError),
1063
1412
  });
1064
- try {
1065
- const latestMetadataSource = (await this.repository.getSessionById(sessionId))
1066
- ?.providerMetadata;
1067
- const latestMetadata = this.toMetadataRecord(latestMetadataSource);
1068
- const retryMetadata = {
1069
- ...latestMetadata,
1070
- acpConfigSnapshot: snapshot,
1071
- };
1072
- if (observedModelId) {
1073
- retryMetadata.observedModelId = observedModelId;
1074
- }
1075
- await this.repository.updateSession(sessionId, {
1076
- providerMetadata: retryMetadata,
1077
- });
1078
- }
1079
- catch (retryError) {
1080
- logger.warn('Retry failed persisting ACP config snapshot to session metadata', {
1081
- sessionId,
1082
- error: retryError instanceof Error ? retryError.message : String(retryError),
1083
- });
1084
- }
1085
1413
  }
1086
1414
  }
1087
1415
  cloneConfigOptionsForStorage(configOptions) {