factory-factory 0.3.3 → 0.3.4

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 (375) hide show
  1. package/dist/client/assets/{_basePickBy-0_GqMukI.js → _basePickBy-kS1IrKFQ.js} +1 -1
  2. package/dist/client/assets/{_baseUniq-BkDCIs_N.js → _baseUniq-DisTPj-I.js} +1 -1
  3. package/dist/client/assets/{arc-BYBi6T58.js → arc-CWpVTRns.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-VXUJARFQ-utRnH0EI.js → architectureDiagram-VXUJARFQ-Dp1AYPMt.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-VD42YOAC-ke2uPDpN.js → blockDiagram-VD42YOAC-DXpmez0y.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-YG6GDRKO-DAt0t6eK.js → c4Diagram-YG6GDRKO-C6sDxR49.js} +1 -1
  7. package/dist/client/assets/channel-D5BCeybW.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-D1vNGBo6.js → chunk-4BX2VUAB-CQxlRbYu.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-BDwpH7UI.js → chunk-55IACEB6-DxubFDep.js} +1 -1
  10. package/dist/client/assets/{chunk-B4BG7PRW-DAM5zmSO.js → chunk-B4BG7PRW-BtTQ0im9.js} +1 -1
  11. package/dist/client/assets/{chunk-DI55MBZ5-CgmMeVp9.js → chunk-DI55MBZ5-C2tNYDZj.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-nijXNm9V.js → chunk-FMBD7UC4-kRQRN6vP.js} +1 -1
  13. package/dist/client/assets/{chunk-QN33PNHL-GM5iQLPS.js → chunk-QN33PNHL-DP72lCp6.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-CbOwrlLz.js → chunk-QZHKN3VN-BfxMFZDN.js} +1 -1
  15. package/dist/client/assets/{chunk-TZMSLE5B-D0eFaU6T.js → chunk-TZMSLE5B-G3wPktxK.js} +1 -1
  16. package/dist/client/assets/classDiagram-2ON5EDUG-BUS1JDwr.js +1 -0
  17. package/dist/client/assets/classDiagram-v2-WZHVMYZB-BUS1JDwr.js +1 -0
  18. package/dist/client/assets/clone-C5xhPZw8.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-S5V4N54A-BAHIgVQk.js → cose-bilkent-S5V4N54A-QPsUxyAe.js} +1 -1
  20. package/dist/client/assets/{dagre-6UL2VRFP-CNvHuwOI.js → dagre-6UL2VRFP-BAmsmcnI.js} +1 -1
  21. package/dist/client/assets/{diagram-PSM6KHXK-726LBpxe.js → diagram-PSM6KHXK-QA-3O0wr.js} +1 -1
  22. package/dist/client/assets/{diagram-QEK2KX5R-DQsnVN2A.js → diagram-QEK2KX5R-VZkRJLXU.js} +1 -1
  23. package/dist/client/assets/{diagram-S2PKOQOG-D_T0ifdw.js → diagram-S2PKOQOG-DwLmogjW.js} +1 -1
  24. package/dist/client/assets/{erDiagram-Q2GNP2WA-BmVDGu8M.js → erDiagram-Q2GNP2WA-DMKIVzp4.js} +1 -1
  25. package/dist/client/assets/{flowDiagram-NV44I4VS-Z65JFfSc.js → flowDiagram-NV44I4VS-op3xA_nS.js} +1 -1
  26. package/dist/client/assets/{ganttDiagram-JELNMOA3-BZ3yfDKP.js → ganttDiagram-JELNMOA3-nrnzVCJK.js} +1 -1
  27. package/dist/client/assets/{gitGraphDiagram-NY62KEGX-faBi9oTt.js → gitGraphDiagram-NY62KEGX-CK2ytvyZ.js} +1 -1
  28. package/dist/client/assets/{graph-DMDSMqaB.js → graph-D_lEcPMk.js} +1 -1
  29. package/dist/client/assets/{index-D9ddlgEa.js → index-C2qHRaOH.js} +233 -231
  30. package/dist/client/assets/index-D5ywoSOH.css +1 -0
  31. package/dist/client/assets/{infoDiagram-WHAUD3N6-CJU-Jxtx.js → infoDiagram-WHAUD3N6-DO5X8HkW.js} +1 -1
  32. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-CIFki-iq.js → journeyDiagram-XKPGCS4Q-Bnhe4U1x.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-3W4ZIXB7-DDuM9VeF.js → kanban-definition-3W4ZIXB7-DpTaTXko.js} +1 -1
  34. package/dist/client/assets/{layout-CnYzyA25.js → layout-HT5qr--Q.js} +1 -1
  35. package/dist/client/assets/{linear-BoRrKhGP.js → linear-CDmQ8HG8.js} +1 -1
  36. package/dist/client/assets/{mindmap-definition-VGOIOE7T-QhVqNLyz.js → mindmap-definition-VGOIOE7T-zDr7s4o2.js} +1 -1
  37. package/dist/client/assets/{pieDiagram-ADFJNKIX-BkK0cKA8.js → pieDiagram-ADFJNKIX-BVBJCvYL.js} +1 -1
  38. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-CeFigc3p.js → quadrantDiagram-AYHSOK5B-DzdJzkAJ.js} +1 -1
  39. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-KowHp3BW.js → requirementDiagram-UZGBJVZJ-ChrLzx8S.js} +1 -1
  40. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-D7CevVS2.js → sankeyDiagram-TZEHDZUN-GIzxIQQB.js} +1 -1
  41. package/dist/client/assets/{sequenceDiagram-WL72ISMW-3mHDMyaP.js → sequenceDiagram-WL72ISMW-BHxEpSCU.js} +1 -1
  42. package/dist/client/assets/{stateDiagram-FKZM4ZOC-h-G1xS2P.js → stateDiagram-FKZM4ZOC-ByvdYZKl.js} +1 -1
  43. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-ynQtAOKH.js +1 -0
  44. package/dist/client/assets/{terminal-instance-BbEVZkgm.js → terminal-instance-xdECz0dx.js} +1 -1
  45. package/dist/client/assets/{timeline-definition-IT6M3QCI-Cc2H2fvU.js → timeline-definition-IT6M3QCI-BcCmIxix.js} +1 -1
  46. package/dist/client/assets/{treemap-KMMF4GRG-BAjv-2_R.js → treemap-KMMF4GRG-CVpLLzhu.js} +1 -1
  47. package/dist/client/assets/{xychartDiagram-PRI3JC2R-CqgFJhi0.js → xychartDiagram-PRI3JC2R-DrgKBPUM.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/src/backend/domains/github/bridges.d.ts +0 -15
  64. package/dist/src/backend/domains/github/bridges.d.ts.map +1 -1
  65. package/dist/src/backend/domains/github/github-domain-exports.test.js +1 -7
  66. package/dist/src/backend/domains/github/github-domain-exports.test.js.map +1 -1
  67. package/dist/src/backend/domains/github/index.d.ts +1 -3
  68. package/dist/src/backend/domains/github/index.d.ts.map +1 -1
  69. package/dist/src/backend/domains/github/index.js +0 -2
  70. package/dist/src/backend/domains/github/index.js.map +1 -1
  71. package/dist/src/backend/domains/ratchet/bridges.d.ts +1 -0
  72. package/dist/src/backend/domains/ratchet/bridges.d.ts.map +1 -1
  73. package/dist/src/backend/domains/ratchet/fixer-session.service.d.ts.map +1 -1
  74. package/dist/src/backend/domains/ratchet/fixer-session.service.js +2 -0
  75. package/dist/src/backend/domains/ratchet/fixer-session.service.js.map +1 -1
  76. package/dist/src/backend/domains/ratchet/fixer-session.service.test.js +1 -0
  77. package/dist/src/backend/domains/ratchet/fixer-session.service.test.js.map +1 -1
  78. package/dist/src/backend/domains/ratchet/index.d.ts +0 -3
  79. package/dist/src/backend/domains/ratchet/index.d.ts.map +1 -1
  80. package/dist/src/backend/domains/ratchet/index.js +0 -2
  81. package/dist/src/backend/domains/ratchet/index.js.map +1 -1
  82. package/dist/src/backend/domains/ratchet/ratchet-domain-exports.test.js +1 -7
  83. package/dist/src/backend/domains/ratchet/ratchet-domain-exports.test.js.map +1 -1
  84. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts +3 -0
  85. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts.map +1 -1
  86. package/dist/src/backend/domains/session/acp/acp-event-translator.js +47 -56
  87. package/dist/src/backend/domains/session/acp/acp-event-translator.js.map +1 -1
  88. package/dist/src/backend/domains/session/acp/acp-permission-bridge.d.ts +3 -1
  89. package/dist/src/backend/domains/session/acp/acp-permission-bridge.d.ts.map +1 -1
  90. package/dist/src/backend/domains/session/acp/acp-permission-bridge.js +10 -1
  91. package/dist/src/backend/domains/session/acp/acp-permission-bridge.js.map +1 -1
  92. package/dist/src/backend/domains/session/acp/acp-permission-bridge.test.js +24 -0
  93. package/dist/src/backend/domains/session/acp/acp-permission-bridge.test.js.map +1 -1
  94. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts.map +1 -1
  95. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js +176 -18
  96. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js.map +1 -1
  97. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.d.ts +2 -0
  98. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.d.ts.map +1 -0
  99. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.js +40 -0
  100. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.js.map +1 -0
  101. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js +88 -1
  102. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js.map +1 -1
  103. package/dist/src/backend/domains/session/acp/acp-session-negotiation.integration.test.js +13 -1
  104. package/dist/src/backend/domains/session/acp/acp-session-negotiation.integration.test.js.map +1 -1
  105. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +85 -0
  106. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -0
  107. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +1794 -0
  108. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -0
  109. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.d.ts +2 -0
  110. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.d.ts.map +1 -0
  111. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js +92 -0
  112. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js.map +1 -0
  113. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.d.ts +2 -0
  114. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.d.ts.map +1 -0
  115. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +1407 -0
  116. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -0
  117. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.d.ts +46 -0
  118. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.d.ts.map +1 -0
  119. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.js +238 -0
  120. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.js.map +1 -0
  121. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.d.ts +2 -0
  122. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.d.ts.map +1 -0
  123. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.js +140 -0
  124. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.js.map +1 -0
  125. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.d.ts +2 -0
  126. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.d.ts.map +1 -0
  127. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.js +35 -0
  128. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.js.map +1 -0
  129. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts +314 -0
  130. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts.map +1 -0
  131. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.js +308 -0
  132. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.js.map +1 -0
  133. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.d.ts +2 -0
  134. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.d.ts.map +1 -0
  135. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.js +147 -0
  136. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.js.map +1 -0
  137. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.d.ts +2 -0
  138. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.d.ts.map +1 -0
  139. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.js +2 -0
  140. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.js.map +1 -0
  141. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.d.ts +2 -0
  142. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.d.ts.map +1 -0
  143. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.js +64 -0
  144. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.js.map +1 -0
  145. package/dist/src/backend/domains/session/acp/index.d.ts +1 -0
  146. package/dist/src/backend/domains/session/acp/index.d.ts.map +1 -1
  147. package/dist/src/backend/domains/session/acp/index.js +1 -0
  148. package/dist/src/backend/domains/session/acp/index.js.map +1 -1
  149. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/permission-response.handler.d.ts.map +1 -1
  150. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/permission-response.handler.js +3 -2
  151. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/permission-response.handler.js.map +1 -1
  152. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.d.ts.map +1 -1
  153. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js +13 -11
  154. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js.map +1 -1
  155. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js +9 -0
  156. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js.map +1 -1
  157. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.d.ts.map +1 -1
  158. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js +17 -29
  159. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js.map +1 -1
  160. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts +1 -0
  161. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts.map +1 -1
  162. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js +152 -74
  163. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js.map +1 -1
  164. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.test.js +96 -0
  165. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.test.js.map +1 -1
  166. package/dist/src/backend/domains/session/data/session-data.service.d.ts +6 -9
  167. package/dist/src/backend/domains/session/data/session-data.service.d.ts.map +1 -1
  168. package/dist/src/backend/domains/session/data/session-data.service.js +3 -0
  169. package/dist/src/backend/domains/session/data/session-data.service.js.map +1 -1
  170. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.d.ts +6 -0
  171. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.d.ts.map +1 -0
  172. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.js +25 -0
  173. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.js.map +1 -0
  174. package/dist/src/backend/domains/session/data/session-provider-resolver.service.test.js +0 -2
  175. package/dist/src/backend/domains/session/data/session-provider-resolver.service.test.js.map +1 -1
  176. package/dist/src/backend/domains/session/index.d.ts +1 -1
  177. package/dist/src/backend/domains/session/index.d.ts.map +1 -1
  178. package/dist/src/backend/domains/session/index.js +1 -1
  179. package/dist/src/backend/domains/session/index.js.map +1 -1
  180. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts +2 -2
  181. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts.map +1 -1
  182. package/dist/src/backend/domains/session/lifecycle/session.repository.js.map +1 -1
  183. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts +22 -3
  184. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts.map +1 -1
  185. package/dist/src/backend/domains/session/lifecycle/session.service.js +279 -50
  186. package/dist/src/backend/domains/session/lifecycle/session.service.js.map +1 -1
  187. package/dist/src/backend/domains/session/lifecycle/session.service.test.js +447 -2
  188. package/dist/src/backend/domains/session/lifecycle/session.service.test.js.map +1 -1
  189. package/dist/src/backend/domains/session/store/session-replay-builder.d.ts.map +1 -1
  190. package/dist/src/backend/domains/session/store/session-replay-builder.js +2 -1
  191. package/dist/src/backend/domains/session/store/session-replay-builder.js.map +1 -1
  192. package/dist/src/backend/domains/session/store/session-replay-builder.test.js +26 -0
  193. package/dist/src/backend/domains/session/store/session-replay-builder.test.js.map +1 -1
  194. package/dist/src/backend/domains/workspace/bridges.d.ts +1 -0
  195. package/dist/src/backend/domains/workspace/bridges.d.ts.map +1 -1
  196. package/dist/src/backend/domains/workspace/index.d.ts +1 -0
  197. package/dist/src/backend/domains/workspace/index.d.ts.map +1 -1
  198. package/dist/src/backend/domains/workspace/index.js +1 -0
  199. package/dist/src/backend/domains/workspace/index.js.map +1 -1
  200. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js +0 -2
  201. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js.map +1 -1
  202. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts +10 -24
  203. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts.map +1 -1
  204. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts +2 -6
  205. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts.map +1 -1
  206. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts +82 -6
  207. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts.map +1 -1
  208. package/dist/src/backend/domains/workspace/query/workspace-query.service.js +15 -15
  209. package/dist/src/backend/domains/workspace/query/workspace-query.service.js.map +1 -1
  210. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.d.ts +2 -0
  211. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.d.ts.map +1 -0
  212. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js +165 -0
  213. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js.map +1 -0
  214. package/dist/src/backend/domains/workspace/state/pending-request-type.d.ts +6 -0
  215. package/dist/src/backend/domains/workspace/state/pending-request-type.d.ts.map +1 -0
  216. package/dist/src/backend/domains/workspace/state/pending-request-type.js +27 -0
  217. package/dist/src/backend/domains/workspace/state/pending-request-type.js.map +1 -0
  218. package/dist/src/backend/domains/workspace/state/pending-request-type.test.d.ts +2 -0
  219. package/dist/src/backend/domains/workspace/state/pending-request-type.test.d.ts.map +1 -0
  220. package/dist/src/backend/domains/workspace/state/pending-request-type.test.js +44 -0
  221. package/dist/src/backend/domains/workspace/state/pending-request-type.test.js.map +1 -0
  222. package/dist/src/backend/domains/workspace/worktree/worktree-init.test.js +9 -2
  223. package/dist/src/backend/domains/workspace/worktree/worktree-init.test.js.map +1 -1
  224. package/dist/src/backend/interceptors/pr-detection.interceptor.d.ts.map +1 -1
  225. package/dist/src/backend/interceptors/pr-detection.interceptor.js +53 -8
  226. package/dist/src/backend/interceptors/pr-detection.interceptor.js.map +1 -1
  227. package/dist/src/backend/interceptors/pr-detection.interceptor.test.d.ts +2 -0
  228. package/dist/src/backend/interceptors/pr-detection.interceptor.test.d.ts.map +1 -0
  229. package/dist/src/backend/interceptors/pr-detection.interceptor.test.js +106 -0
  230. package/dist/src/backend/interceptors/pr-detection.interceptor.test.js.map +1 -0
  231. package/dist/src/backend/lib/session-model.js +1 -1
  232. package/dist/src/backend/lib/session-model.js.map +1 -1
  233. package/dist/src/backend/lib/session-model.test.js +1 -1
  234. package/dist/src/backend/lib/session-model.test.js.map +1 -1
  235. package/dist/src/backend/orchestration/data-backup.service.d.ts.map +1 -1
  236. package/dist/src/backend/orchestration/data-backup.service.js +0 -4
  237. package/dist/src/backend/orchestration/data-backup.service.js.map +1 -1
  238. package/dist/src/backend/orchestration/data-backup.service.test.js +0 -4
  239. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  240. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
  241. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +3 -19
  242. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
  243. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js +13 -27
  244. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js.map +1 -1
  245. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts +1 -0
  246. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts.map +1 -1
  247. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js +1 -15
  248. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js.map +1 -1
  249. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js +97 -0
  250. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js.map +1 -1
  251. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +1 -3
  252. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  253. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  254. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +4 -1
  255. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  256. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +1 -0
  257. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js.map +1 -1
  258. package/dist/src/backend/resource_accessors/agent-session.accessor.d.ts +1 -0
  259. package/dist/src/backend/resource_accessors/agent-session.accessor.d.ts.map +1 -1
  260. package/dist/src/backend/resource_accessors/agent-session.accessor.js +10 -0
  261. package/dist/src/backend/resource_accessors/agent-session.accessor.js.map +1 -1
  262. package/dist/src/backend/resource_accessors/agent-session.accessor.test.d.ts +2 -0
  263. package/dist/src/backend/resource_accessors/agent-session.accessor.test.d.ts.map +1 -0
  264. package/dist/src/backend/resource_accessors/agent-session.accessor.test.js +148 -0
  265. package/dist/src/backend/resource_accessors/agent-session.accessor.test.js.map +1 -0
  266. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +0 -15
  267. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -1
  268. package/dist/src/backend/resource_accessors/workspace.accessor.js +0 -33
  269. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -1
  270. package/dist/src/backend/schemas/tool-inputs.schema.d.ts +2 -0
  271. package/dist/src/backend/schemas/tool-inputs.schema.d.ts.map +1 -1
  272. package/dist/src/backend/schemas/tool-inputs.schema.js +1 -0
  273. package/dist/src/backend/schemas/tool-inputs.schema.js.map +1 -1
  274. package/dist/src/backend/services/constants.d.ts +0 -5
  275. package/dist/src/backend/services/constants.d.ts.map +1 -1
  276. package/dist/src/backend/services/constants.js +0 -5
  277. package/dist/src/backend/services/constants.js.map +1 -1
  278. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts +2 -2
  279. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts.map +1 -1
  280. package/dist/src/backend/trpc/admin-active-processes.d.ts +55 -0
  281. package/dist/src/backend/trpc/admin-active-processes.d.ts.map +1 -0
  282. package/dist/src/backend/trpc/admin-active-processes.js +103 -0
  283. package/dist/src/backend/trpc/admin-active-processes.js.map +1 -0
  284. package/dist/src/backend/trpc/admin-active-processes.test.d.ts +2 -0
  285. package/dist/src/backend/trpc/admin-active-processes.test.d.ts.map +1 -0
  286. package/dist/src/backend/trpc/admin-active-processes.test.js +105 -0
  287. package/dist/src/backend/trpc/admin-active-processes.test.js.map +1 -0
  288. package/dist/src/backend/trpc/admin.trpc.d.ts +5 -32
  289. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  290. package/dist/src/backend/trpc/admin.trpc.js +29 -128
  291. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  292. package/dist/src/backend/trpc/decision-log.trpc.d.ts +3 -3
  293. package/dist/src/backend/trpc/index.d.ts +136 -104
  294. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  295. package/dist/src/backend/trpc/log-file-reader.d.ts +26 -0
  296. package/dist/src/backend/trpc/log-file-reader.d.ts.map +1 -0
  297. package/dist/src/backend/trpc/log-file-reader.js +160 -0
  298. package/dist/src/backend/trpc/log-file-reader.js.map +1 -0
  299. package/dist/src/backend/trpc/log-file-reader.test.d.ts +2 -0
  300. package/dist/src/backend/trpc/log-file-reader.test.d.ts.map +1 -0
  301. package/dist/src/backend/trpc/log-file-reader.test.js +162 -0
  302. package/dist/src/backend/trpc/log-file-reader.test.js.map +1 -0
  303. package/dist/src/backend/trpc/project.trpc.d.ts +2 -6
  304. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  305. package/dist/src/backend/trpc/session.trpc.d.ts +23 -31
  306. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  307. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +4 -6
  308. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  309. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +5 -9
  310. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  311. package/dist/src/backend/trpc/workspace.trpc.d.ts +103 -39
  312. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  313. package/dist/src/backend/trpc/workspace.trpc.js +8 -0
  314. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  315. package/dist/src/cli/index.js +7 -2
  316. package/dist/src/cli/index.js.map +1 -1
  317. package/dist/src/shared/acp-protocol/protocol/interaction.d.ts +2 -0
  318. package/dist/src/shared/acp-protocol/protocol/interaction.d.ts.map +1 -1
  319. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts +1 -0
  320. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts.map +1 -1
  321. package/dist/src/shared/acp-protocol/protocol/websocket.js.map +1 -1
  322. package/dist/src/shared/pending-request-types.d.ts +4 -0
  323. package/dist/src/shared/pending-request-types.d.ts.map +1 -1
  324. package/dist/src/shared/pending-request-types.js +10 -0
  325. package/dist/src/shared/pending-request-types.js.map +1 -1
  326. package/dist/src/shared/schemas/export-data.schema.d.ts +0 -18
  327. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  328. package/dist/src/shared/schemas/export-data.schema.js +0 -2
  329. package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
  330. package/dist/src/shared/websocket/chat-message.schema.d.ts +1 -0
  331. package/dist/src/shared/websocket/chat-message.schema.d.ts.map +1 -1
  332. package/dist/src/shared/websocket/chat-message.schema.js +1 -0
  333. package/dist/src/shared/websocket/chat-message.schema.js.map +1 -1
  334. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  335. package/package.json +4 -2
  336. package/prisma/migrations/20260214232046_remove_ratchet_last_modified/migration.sql +68 -0
  337. package/prisma/schema.prisma +0 -2
  338. package/dist/client/assets/channel-BA4I5_zc.js +0 -1
  339. package/dist/client/assets/classDiagram-2ON5EDUG-DHiY0J8v.js +0 -1
  340. package/dist/client/assets/classDiagram-v2-WZHVMYZB-DHiY0J8v.js +0 -1
  341. package/dist/client/assets/clone-C7QOkM1k.js +0 -1
  342. package/dist/client/assets/index-D_8rf7lP.css +0 -1
  343. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BGGNxhyR.js +0 -1
  344. package/dist/src/backend/domains/github/pr-review-fixer.service.d.ts +0 -63
  345. package/dist/src/backend/domains/github/pr-review-fixer.service.d.ts.map +0 -1
  346. package/dist/src/backend/domains/github/pr-review-fixer.service.js +0 -141
  347. package/dist/src/backend/domains/github/pr-review-fixer.service.js.map +0 -1
  348. package/dist/src/backend/domains/github/pr-review-fixer.service.test.d.ts +0 -2
  349. package/dist/src/backend/domains/github/pr-review-fixer.service.test.d.ts.map +0 -1
  350. package/dist/src/backend/domains/github/pr-review-fixer.service.test.js +0 -28
  351. package/dist/src/backend/domains/github/pr-review-fixer.service.test.js.map +0 -1
  352. package/dist/src/backend/domains/github/pr-review-monitor.service.d.ts +0 -19
  353. package/dist/src/backend/domains/github/pr-review-monitor.service.d.ts.map +0 -1
  354. package/dist/src/backend/domains/github/pr-review-monitor.service.js +0 -215
  355. package/dist/src/backend/domains/github/pr-review-monitor.service.js.map +0 -1
  356. package/dist/src/backend/domains/ratchet/ci-fixer.service.d.ts +0 -47
  357. package/dist/src/backend/domains/ratchet/ci-fixer.service.d.ts.map +0 -1
  358. package/dist/src/backend/domains/ratchet/ci-fixer.service.js +0 -95
  359. package/dist/src/backend/domains/ratchet/ci-fixer.service.js.map +0 -1
  360. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.d.ts +0 -2
  361. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.d.ts.map +0 -1
  362. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.js +0 -100
  363. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.js.map +0 -1
  364. package/dist/src/backend/domains/ratchet/ci-monitor.service.d.ts +0 -36
  365. package/dist/src/backend/domains/ratchet/ci-monitor.service.d.ts.map +0 -1
  366. package/dist/src/backend/domains/ratchet/ci-monitor.service.js +0 -278
  367. package/dist/src/backend/domains/ratchet/ci-monitor.service.js.map +0 -1
  368. package/dist/src/backend/services/fixer-workflow.service.d.ts +0 -83
  369. package/dist/src/backend/services/fixer-workflow.service.d.ts.map +0 -1
  370. package/dist/src/backend/services/fixer-workflow.service.js +0 -77
  371. package/dist/src/backend/services/fixer-workflow.service.js.map +0 -1
  372. package/dist/src/backend/services/fixer-workflow.service.test.d.ts +0 -2
  373. package/dist/src/backend/services/fixer-workflow.service.test.d.ts.map +0 -1
  374. package/dist/src/backend/services/fixer-workflow.service.test.js +0 -55
  375. package/dist/src/backend/services/fixer-workflow.service.test.js.map +0 -1
@@ -6,6 +6,7 @@ import { createLogger } from '../../../../backend/services/logger.service.js';
6
6
  import { extractPlanText } from '../../../../shared/acp-protocol/plan-content.js';
7
7
  import { EMPTY_CHAT_BAR_CAPABILITIES } from '../../../../shared/chat-capabilities.js';
8
8
  import { SessionStatus } from '../../../../shared/core/index.js';
9
+ import { isUserQuestionRequest } from '../../../../shared/pending-request-types.js';
9
10
  import { createInitialSessionRuntimeState, } from '../../../../shared/session-runtime.js';
10
11
  import { sessionPromptBuilder } from './session.prompt-builder.js';
11
12
  import { sessionRepository } from './session.repository.js';
@@ -22,9 +23,13 @@ class SessionService {
22
23
  suppressAcpReplayForSession = new Set();
23
24
  workspaceBridge = null;
24
25
  sessionToWorkspace = new Map();
26
+ promptTurnCompleteHandler = null;
25
27
  configure(bridges) {
26
28
  this.workspaceBridge = bridges.workspace;
27
29
  }
30
+ setPromptTurnCompleteHandler(handler) {
31
+ this.promptTurnCompleteHandler = handler;
32
+ }
28
33
  isStaleLoadingRuntime(runtime) {
29
34
  if (runtime.phase !== 'loading' || runtime.processState === 'alive') {
30
35
  return false;
@@ -359,11 +364,12 @@ class SessionService {
359
364
  kind: o.kind,
360
365
  }));
361
366
  const planContent = this.extractPlanContent(toolName, toolInput);
362
- if (toolName === 'AskUserQuestion') {
367
+ if (isUserQuestionRequest({ toolName, input: toolInput })) {
363
368
  const questions = this.extractAskUserQuestions(toolInput);
364
369
  sessionDomainService.emitDelta(sid, {
365
370
  type: 'user_question',
366
371
  requestId,
372
+ toolName,
367
373
  questions,
368
374
  acpOptions,
369
375
  });
@@ -489,15 +495,110 @@ class SessionService {
489
495
  if (existingClient) {
490
496
  throw new Error('Session is already running');
491
497
  }
492
- await this.getOrCreateAcpSessionClient(sessionId, { permissionMode: 'bypassPermissions' }, session);
498
+ const startupModePreset = options?.startupModePreset;
499
+ const startupPermissionMode = startupModePreset === 'plan' ? 'plan' : 'bypassPermissions';
500
+ const handle = await this.getOrCreateAcpSessionClient(sessionId, { permissionMode: startupPermissionMode }, session);
501
+ await this.applyStartupModePreset(sessionId, handle, startupModePreset);
493
502
  const initialPrompt = options?.initialPrompt ?? 'Continue with the task.';
494
503
  if (initialPrompt) {
495
504
  await this.sendSessionMessage(sessionId, initialPrompt);
496
505
  }
497
506
  logger.info('Session started', { sessionId, provider: session.provider });
498
507
  }
508
+ async applyStartupModePreset(sessionId, handle, startupModePreset) {
509
+ if (!startupModePreset) {
510
+ return;
511
+ }
512
+ const modeOption = handle.configOptions.find((option) => option.category === 'mode');
513
+ if (!modeOption) {
514
+ return;
515
+ }
516
+ const availableModeValues = this.getConfigOptionValues(modeOption);
517
+ const targetMode = this.resolveStartupModeTarget(handle.provider, startupModePreset, availableModeValues);
518
+ if (!targetMode) {
519
+ logger.debug('Startup mode preset not available in ACP mode options', {
520
+ sessionId,
521
+ provider: handle.provider,
522
+ startupModePreset,
523
+ availableModeValues,
524
+ });
525
+ return;
526
+ }
527
+ const currentMode = modeOption.currentValue ? String(modeOption.currentValue) : null;
528
+ if (currentMode === targetMode) {
529
+ return;
530
+ }
531
+ try {
532
+ const configOptions = await acpRuntimeManager.setSessionMode(sessionId, targetMode);
533
+ handle.configOptions = configOptions;
534
+ await this.persistAcpConfigSnapshot(sessionId, {
535
+ provider: handle.provider,
536
+ providerSessionId: handle.providerSessionId,
537
+ configOptions,
538
+ });
539
+ sessionDomainService.emitDelta(sessionId, {
540
+ type: 'config_options_update',
541
+ configOptions,
542
+ });
543
+ sessionDomainService.emitDelta(sessionId, {
544
+ type: 'chat_capabilities',
545
+ capabilities: this.buildAcpChatBarCapabilities(handle),
546
+ });
547
+ }
548
+ catch (error) {
549
+ logger.warn('Failed applying startup mode preset', {
550
+ sessionId,
551
+ provider: handle.provider,
552
+ startupModePreset,
553
+ targetMode,
554
+ error: error instanceof Error ? error.message : String(error),
555
+ });
556
+ }
557
+ }
558
+ resolveStartupModeTarget(provider, startupModePreset, availableModeValues) {
559
+ if (availableModeValues.length === 0) {
560
+ return null;
561
+ }
562
+ if (startupModePreset === 'plan') {
563
+ return this.findModeValue(availableModeValues, ['plan']);
564
+ }
565
+ if (provider === 'CLAUDE') {
566
+ return this.findModeValue(availableModeValues, [
567
+ 'bypassPermissions',
568
+ 'dangerouslySkipPermissions',
569
+ 'dangerousSkipPermissions',
570
+ 'acceptEdits',
571
+ ]);
572
+ }
573
+ return this.findModeValue(availableModeValues, [
574
+ 'fullAccess',
575
+ 'full_access',
576
+ 'full-access',
577
+ 'code',
578
+ ]);
579
+ }
580
+ findModeValue(availableModeValues, preferredModeValues) {
581
+ if (availableModeValues.length === 0 || preferredModeValues.length === 0) {
582
+ return null;
583
+ }
584
+ const availableByNormalized = new Map();
585
+ for (const value of availableModeValues) {
586
+ availableByNormalized.set(this.normalizeModeValue(value), value);
587
+ }
588
+ for (const preferredValue of preferredModeValues) {
589
+ const match = availableByNormalized.get(this.normalizeModeValue(preferredValue));
590
+ if (match) {
591
+ return match;
592
+ }
593
+ }
594
+ return null;
595
+ }
596
+ normalizeModeValue(value) {
597
+ return value.replace(/[^a-z0-9]/gi, '').toLowerCase();
598
+ }
499
599
  async stopSession(sessionId, options) {
500
600
  const session = await this.loadSessionForStop(sessionId);
601
+ const workspaceId = session?.workspaceId ?? this.sessionToWorkspace.get(sessionId);
501
602
  if (acpRuntimeManager.isStopInProgress(sessionId)) {
502
603
  logger.debug('Session stop already in progress', { sessionId });
503
604
  return;
@@ -510,7 +611,6 @@ class SessionService {
510
611
  updatedAt: new Date().toISOString(),
511
612
  });
512
613
  this.acpStreamState.delete(sessionId);
513
- this.pendingAcpToolCalls.delete(sessionId);
514
614
  this.suppressAcpReplayForSession.delete(sessionId);
515
615
  const acpBridge = this.acpPermissionBridges.get(sessionId);
516
616
  if (acpBridge) {
@@ -531,14 +631,17 @@ class SessionService {
531
631
  });
532
632
  }
533
633
  finally {
634
+ this.finalizeOrphanedToolCallsOnStop(sessionId);
534
635
  await this.updateStoppedSessionState(sessionId);
535
- sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: false });
636
+ sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: true });
536
637
  sessionDomainService.setRuntimeSnapshot(sessionId, {
537
638
  phase: 'idle',
538
639
  processState: 'stopped',
539
640
  activity: 'IDLE',
540
641
  updatedAt: new Date().toISOString(),
541
642
  });
643
+ this.markWorkspaceSessionIdleOnStop(workspaceId, sessionId);
644
+ this.sessionToWorkspace.delete(sessionId);
542
645
  if (!stopClientFailed) {
543
646
  const shouldCleanupTransientRatchetSession = options?.cleanupTransientRatchetSession ?? true;
544
647
  await this.cleanupTransientRatchetOnStop(session, sessionId, shouldCleanupTransientRatchetSession);
@@ -550,6 +653,33 @@ class SessionService {
550
653
  acpTraceLogger.closeSession(sessionId);
551
654
  }
552
655
  }
656
+ finalizeOrphanedToolCallsOnStop(sessionId) {
657
+ try {
658
+ this.finalizeOrphanedToolCalls(sessionId, 'session_stop');
659
+ }
660
+ catch (error) {
661
+ logger.warn('Failed finalizing orphaned ACP tool calls during stop', {
662
+ sessionId,
663
+ error: error instanceof Error ? error.message : String(error),
664
+ });
665
+ this.pendingAcpToolCalls.delete(sessionId);
666
+ }
667
+ }
668
+ markWorkspaceSessionIdleOnStop(workspaceId, sessionId) {
669
+ if (!(workspaceId && this.workspaceBridge)) {
670
+ return;
671
+ }
672
+ try {
673
+ this.workspaceBridge.markSessionIdle(workspaceId, sessionId);
674
+ }
675
+ catch (error) {
676
+ logger.warn('Failed to mark workspace session idle during stop', {
677
+ sessionId,
678
+ workspaceId,
679
+ error: error instanceof Error ? error.message : String(error),
680
+ });
681
+ }
682
+ }
553
683
  async loadSessionForStop(sessionId) {
554
684
  try {
555
685
  return await this.repository.getSessionById(sessionId);
@@ -691,7 +821,15 @@ class SessionService {
691
821
  }
692
822
  async setSessionConfigOption(sessionId, configId, value) {
693
823
  const acpHandle = acpRuntimeManager.getClient(sessionId);
694
- const selectedOption = acpHandle?.configOptions.find((option) => option.id === configId);
824
+ if (!acpHandle) {
825
+ const configOptions = await this.setCachedSessionConfigOption(sessionId, configId, value);
826
+ sessionDomainService.emitDelta(sessionId, {
827
+ type: 'config_options_update',
828
+ configOptions,
829
+ });
830
+ return;
831
+ }
832
+ const selectedOption = acpHandle.configOptions.find((option) => option.id === configId);
695
833
  const isModeOption = configId === 'mode' || selectedOption?.category === 'mode';
696
834
  const isModelOption = configId === 'model' || selectedOption?.category === 'model';
697
835
  const configOptions = isModeOption
@@ -712,6 +850,46 @@ class SessionService {
712
850
  });
713
851
  }
714
852
  }
853
+ async setCachedSessionConfigOption(sessionId, configId, value) {
854
+ const session = await this.repository.getSessionById(sessionId);
855
+ if (!session) {
856
+ throw new Error(`Session not found: ${sessionId}`);
857
+ }
858
+ const snapshot = this.extractAcpConfigSnapshot(session.providerMetadata);
859
+ if (!snapshot || snapshot.provider !== session.provider) {
860
+ throw new Error(`Cannot set config option for inactive session ${sessionId}: no cached ACP config available`);
861
+ }
862
+ const configOptions = this.updateCachedConfigOptions(snapshot.configOptions, configId, value);
863
+ await this.persistAcpConfigSnapshot(sessionId, {
864
+ provider: snapshot.provider,
865
+ providerSessionId: snapshot.providerSessionId,
866
+ configOptions,
867
+ existingMetadata: session.providerMetadata,
868
+ });
869
+ return configOptions;
870
+ }
871
+ updateCachedConfigOptions(configOptions, configId, value) {
872
+ let didUpdate = false;
873
+ const nextConfigOptions = configOptions.map((option) => {
874
+ if (option.id !== configId) {
875
+ return option;
876
+ }
877
+ const allowedValues = this.getConfigOptionValues(option);
878
+ if (allowedValues.length > 0 && !allowedValues.includes(value)) {
879
+ throw new Error(`Unsupported value "${value}" for config option "${configId}"` +
880
+ ` (allowed: ${allowedValues.join(', ')})`);
881
+ }
882
+ didUpdate = true;
883
+ return {
884
+ ...option,
885
+ currentValue: value,
886
+ };
887
+ });
888
+ if (!didUpdate) {
889
+ throw new Error(`Unknown config option: ${configId}`);
890
+ }
891
+ return nextConfigOptions;
892
+ }
715
893
  sendSessionMessage(sessionId, content) {
716
894
  const acpClient = acpRuntimeManager.getClient(sessionId);
717
895
  if (acpClient) {
@@ -795,6 +973,29 @@ class SessionService {
795
973
  if (workspaceId && this.workspaceBridge) {
796
974
  this.workspaceBridge.markSessionIdle(workspaceId, sessionId);
797
975
  }
976
+ this.schedulePromptTurnComplete(sessionId);
977
+ }
978
+ }
979
+ schedulePromptTurnComplete(sessionId) {
980
+ if (!this.promptTurnCompleteHandler) {
981
+ return;
982
+ }
983
+ setTimeout(() => {
984
+ void this.notifyPromptTurnComplete(sessionId);
985
+ }, 0);
986
+ }
987
+ async notifyPromptTurnComplete(sessionId) {
988
+ if (!this.promptTurnCompleteHandler) {
989
+ return;
990
+ }
991
+ try {
992
+ await this.promptTurnCompleteHandler(sessionId);
993
+ }
994
+ catch (error) {
995
+ logger.warn('Prompt turn completion handler failed', {
996
+ sessionId,
997
+ error: error instanceof Error ? error.message : String(error),
998
+ });
798
999
  }
799
1000
  }
800
1001
  async cancelAcpPrompt(sessionId) {
@@ -846,12 +1047,12 @@ class SessionService {
846
1047
  .join('\n')
847
1048
  .trim();
848
1049
  }
849
- respondToAcpPermission(sessionId, requestId, optionId) {
1050
+ respondToAcpPermission(sessionId, requestId, optionId, answers) {
850
1051
  const bridge = this.acpPermissionBridges.get(sessionId);
851
1052
  if (!bridge) {
852
1053
  return false;
853
1054
  }
854
- return bridge.resolvePermission(requestId, optionId);
1055
+ return bridge.resolvePermission(requestId, optionId, answers);
855
1056
  }
856
1057
  getRuntimeSnapshot(sessionId) {
857
1058
  const fallback = createInitialSessionRuntimeState();
@@ -961,12 +1162,36 @@ class SessionService {
961
1162
  }
962
1163
  buildCapabilitiesFromConfigOptions(provider, configOptions, fallbackModel) {
963
1164
  const modelOption = configOptions.find((o) => o.category === 'model');
964
- const thoughtOption = configOptions.find((o) => o.category === 'thought_level');
1165
+ const modeOption = configOptions.find((o) => o.category === 'mode');
1166
+ const thoughtOption = configOptions.find((o) => o.category === 'thought_level' || o.id === 'reasoning_effort' || o.category === 'reasoning');
965
1167
  const selectedModel = modelOption?.currentValue
966
1168
  ? String(modelOption.currentValue)
967
1169
  : (fallbackModel ?? undefined);
968
1170
  const modelOptions = this.buildModelOptions(modelOption, selectedModel);
969
1171
  const isCodexProvider = provider === 'CODEX';
1172
+ const reasoningOptions = isCodexProvider && thoughtOption
1173
+ ? this.getSelectOptions(thoughtOption).map((option) => ({
1174
+ value: option.value,
1175
+ label: option.name ?? option.value,
1176
+ ...(option.description ? { description: option.description } : {}),
1177
+ }))
1178
+ : [];
1179
+ const reasoningValues = new Set(reasoningOptions.map((option) => option.value));
1180
+ const selectedReasoning = isCodexProvider &&
1181
+ thoughtOption?.currentValue &&
1182
+ typeof thoughtOption.currentValue === 'string' &&
1183
+ reasoningValues.has(thoughtOption.currentValue)
1184
+ ? thoughtOption.currentValue
1185
+ : undefined;
1186
+ const modeDescriptors = modeOption
1187
+ ? [
1188
+ ...this.getConfigOptionValues(modeOption),
1189
+ ...this.getSelectOptions(modeOption)
1190
+ .map((entry) => entry.name ?? '')
1191
+ .filter((value) => value.trim().length > 0),
1192
+ ]
1193
+ : [];
1194
+ const planModeEnabled = modeDescriptors.some((entry) => /plan/i.test(entry));
970
1195
  return {
971
1196
  provider,
972
1197
  model: {
@@ -975,13 +1200,14 @@ class SessionService {
975
1200
  ...(selectedModel ? { selected: selectedModel } : {}),
976
1201
  },
977
1202
  reasoning: {
978
- enabled: false,
979
- options: [],
1203
+ enabled: reasoningOptions.length > 0,
1204
+ options: reasoningOptions,
1205
+ ...(selectedReasoning ? { selected: selectedReasoning } : {}),
980
1206
  },
981
1207
  thinking: {
982
- enabled: !!thoughtOption,
1208
+ enabled: !isCodexProvider && !!thoughtOption,
983
1209
  },
984
- planMode: { enabled: true },
1210
+ planMode: { enabled: planModeEnabled },
985
1211
  attachments: isCodexProvider
986
1212
  ? { enabled: false, kinds: [] }
987
1213
  : { enabled: true, kinds: ['image', 'text'] },
@@ -994,28 +1220,34 @@ class SessionService {
994
1220
  if (!modelOption) {
995
1221
  return selectedModel ? [{ value: selectedModel, label: selectedModel }] : [];
996
1222
  }
997
- const uniqueValues = new Set(this.getConfigOptionValues(modelOption));
998
- if (selectedModel) {
999
- uniqueValues.add(selectedModel);
1223
+ const byValue = new Map();
1224
+ for (const option of this.getSelectOptions(modelOption)) {
1225
+ if (!byValue.has(option.value)) {
1226
+ byValue.set(option.value, option.name ?? option.value);
1227
+ }
1228
+ }
1229
+ if (selectedModel && !byValue.has(selectedModel)) {
1230
+ byValue.set(selectedModel, selectedModel);
1000
1231
  }
1001
- return Array.from(uniqueValues).map((value) => ({ value, label: value }));
1232
+ return Array.from(byValue.entries()).map(([value, label]) => ({ value, label }));
1002
1233
  }
1003
- getConfigOptionValues(option) {
1234
+ getSelectOptions(option) {
1004
1235
  return option.options.flatMap((entry) => {
1005
1236
  if (typeof entry !== 'object' || entry === null) {
1006
1237
  return [];
1007
1238
  }
1008
1239
  if ('value' in entry && typeof entry.value === 'string') {
1009
- return [entry.value];
1240
+ return [entry];
1010
1241
  }
1011
1242
  if ('options' in entry && Array.isArray(entry.options)) {
1012
- return entry.options
1013
- .map((grouped) => grouped?.value)
1014
- .filter((value) => typeof value === 'string');
1243
+ return entry.options.filter((grouped) => typeof grouped === 'object' && grouped !== null && typeof grouped.value === 'string');
1015
1244
  }
1016
1245
  return [];
1017
1246
  });
1018
1247
  }
1248
+ getConfigOptionValues(option) {
1249
+ return this.getSelectOptions(option).map((entry) => entry.value);
1250
+ }
1019
1251
  async stopAllClients(_timeoutMs = 5000) {
1020
1252
  try {
1021
1253
  await acpRuntimeManager.stopAllClients();
@@ -1036,7 +1268,6 @@ class SessionService {
1036
1268
  const metadataSource = params.existingMetadata ??
1037
1269
  (await this.repository.getSessionById(sessionId))?.providerMetadata ??
1038
1270
  null;
1039
- const metadataRecord = this.toMetadataRecord(metadataSource);
1040
1271
  const snapshot = {
1041
1272
  provider: params.provider,
1042
1273
  providerSessionId: params.providerSessionId,
@@ -1044,44 +1275,42 @@ class SessionService {
1044
1275
  configOptions: configOptionsForStorage,
1045
1276
  ...(observedModelId ? { observedModelId } : {}),
1046
1277
  };
1278
+ const persistedUpdate = this.buildSnapshotPersistUpdate(metadataSource, snapshot, observedModelId);
1279
+ try {
1280
+ await this.repository.updateSession(sessionId, persistedUpdate);
1281
+ }
1282
+ catch (error) {
1283
+ logger.warn('Failed persisting ACP config snapshot to session metadata; retrying once', {
1284
+ sessionId,
1285
+ error: error instanceof Error ? error.message : String(error),
1286
+ });
1287
+ await this.retryPersistAcpConfigSnapshot(sessionId, snapshot, observedModelId);
1288
+ }
1289
+ }
1290
+ buildSnapshotPersistUpdate(metadataSource, snapshot, observedModelId) {
1047
1291
  const nextMetadata = {
1048
- ...metadataRecord,
1292
+ ...this.toMetadataRecord(metadataSource),
1049
1293
  acpConfigSnapshot: snapshot,
1050
1294
  };
1051
1295
  if (observedModelId) {
1052
1296
  nextMetadata.observedModelId = observedModelId;
1053
1297
  }
1298
+ return {
1299
+ providerMetadata: nextMetadata,
1300
+ ...(observedModelId ? { model: observedModelId } : {}),
1301
+ };
1302
+ }
1303
+ async retryPersistAcpConfigSnapshot(sessionId, snapshot, observedModelId) {
1054
1304
  try {
1055
- await this.repository.updateSession(sessionId, {
1056
- providerMetadata: nextMetadata,
1057
- });
1305
+ const latestMetadataSource = (await this.repository.getSessionById(sessionId))
1306
+ ?.providerMetadata;
1307
+ await this.repository.updateSession(sessionId, this.buildSnapshotPersistUpdate(latestMetadataSource, snapshot, observedModelId));
1058
1308
  }
1059
- catch (error) {
1060
- logger.warn('Failed persisting ACP config snapshot to session metadata; retrying once', {
1309
+ catch (retryError) {
1310
+ logger.warn('Retry failed persisting ACP config snapshot to session metadata', {
1061
1311
  sessionId,
1062
- error: error instanceof Error ? error.message : String(error),
1312
+ error: retryError instanceof Error ? retryError.message : String(retryError),
1063
1313
  });
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
1314
  }
1086
1315
  }
1087
1316
  cloneConfigOptionsForStorage(configOptions) {