factory-factory 0.3.2 → 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 (476) hide show
  1. package/dist/client/assets/{_basePickBy-DXuH24ai.js → _basePickBy-kS1IrKFQ.js} +1 -1
  2. package/dist/client/assets/{_baseUniq-CslDyWeR.js → _baseUniq-DisTPj-I.js} +1 -1
  3. package/dist/client/assets/{arc-2gvAyDbt.js → arc-CWpVTRns.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-VXUJARFQ-DgcFaiEM.js → architectureDiagram-VXUJARFQ-Dp1AYPMt.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-VD42YOAC-x5GBnWvh.js → blockDiagram-VD42YOAC-DXpmez0y.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-YG6GDRKO-BH1ALhYh.js → c4Diagram-YG6GDRKO-C6sDxR49.js} +1 -1
  7. package/dist/client/assets/channel-D5BCeybW.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-BrzGnqT-.js → chunk-4BX2VUAB-CQxlRbYu.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-l8A9_mQA.js → chunk-55IACEB6-DxubFDep.js} +1 -1
  10. package/dist/client/assets/{chunk-B4BG7PRW-BsAqXKe3.js → chunk-B4BG7PRW-BtTQ0im9.js} +1 -1
  11. package/dist/client/assets/{chunk-DI55MBZ5-IIbvvT0k.js → chunk-DI55MBZ5-C2tNYDZj.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-DLu7thHk.js → chunk-FMBD7UC4-kRQRN6vP.js} +1 -1
  13. package/dist/client/assets/{chunk-QN33PNHL-WRLtM-7j.js → chunk-QN33PNHL-DP72lCp6.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-Dsklvm2v.js → chunk-QZHKN3VN-BfxMFZDN.js} +1 -1
  15. package/dist/client/assets/{chunk-TZMSLE5B-D06U47VI.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-BYd0MvfE.js → cose-bilkent-S5V4N54A-QPsUxyAe.js} +1 -1
  20. package/dist/client/assets/{dagre-6UL2VRFP-D-kPXmRT.js → dagre-6UL2VRFP-BAmsmcnI.js} +1 -1
  21. package/dist/client/assets/{diagram-PSM6KHXK-QIglBDlg.js → diagram-PSM6KHXK-QA-3O0wr.js} +1 -1
  22. package/dist/client/assets/{diagram-QEK2KX5R-CMd7cwDZ.js → diagram-QEK2KX5R-VZkRJLXU.js} +1 -1
  23. package/dist/client/assets/{diagram-S2PKOQOG-TfTgUpyH.js → diagram-S2PKOQOG-DwLmogjW.js} +1 -1
  24. package/dist/client/assets/{erDiagram-Q2GNP2WA-DtuLC2xg.js → erDiagram-Q2GNP2WA-DMKIVzp4.js} +1 -1
  25. package/dist/client/assets/{flowDiagram-NV44I4VS-DfgrrhwS.js → flowDiagram-NV44I4VS-op3xA_nS.js} +1 -1
  26. package/dist/client/assets/{ganttDiagram-JELNMOA3-D_dPspnH.js → ganttDiagram-JELNMOA3-nrnzVCJK.js} +1 -1
  27. package/dist/client/assets/{gitGraphDiagram-NY62KEGX-DJsigQIR.js → gitGraphDiagram-NY62KEGX-CK2ytvyZ.js} +1 -1
  28. package/dist/client/assets/{graph-B9NXnAuJ.js → graph-D_lEcPMk.js} +1 -1
  29. package/dist/client/assets/{index-DY2IN4MN.js → index-C2qHRaOH.js} +233 -231
  30. package/dist/client/assets/index-D5ywoSOH.css +1 -0
  31. package/dist/client/assets/{infoDiagram-WHAUD3N6-D5yAAuIK.js → infoDiagram-WHAUD3N6-DO5X8HkW.js} +1 -1
  32. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-DMeR4Vy_.js → journeyDiagram-XKPGCS4Q-Bnhe4U1x.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-3W4ZIXB7-xNNLjBQO.js → kanban-definition-3W4ZIXB7-DpTaTXko.js} +1 -1
  34. package/dist/client/assets/{layout-Bv4qdz5g.js → layout-HT5qr--Q.js} +1 -1
  35. package/dist/client/assets/{linear-DOse4wNy.js → linear-CDmQ8HG8.js} +1 -1
  36. package/dist/client/assets/{mindmap-definition-VGOIOE7T-BjuQGPGv.js → mindmap-definition-VGOIOE7T-zDr7s4o2.js} +1 -1
  37. package/dist/client/assets/{pieDiagram-ADFJNKIX-VvsVA8GJ.js → pieDiagram-ADFJNKIX-BVBJCvYL.js} +1 -1
  38. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-oRc7Vk8X.js → quadrantDiagram-AYHSOK5B-DzdJzkAJ.js} +1 -1
  39. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-Dq3exCr2.js → requirementDiagram-UZGBJVZJ-ChrLzx8S.js} +1 -1
  40. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-Dzab26G_.js → sankeyDiagram-TZEHDZUN-GIzxIQQB.js} +1 -1
  41. package/dist/client/assets/{sequenceDiagram-WL72ISMW-C0gbEvnf.js → sequenceDiagram-WL72ISMW-BHxEpSCU.js} +1 -1
  42. package/dist/client/assets/{stateDiagram-FKZM4ZOC-lFd4FBIQ.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-BI_R5Gu9.js → terminal-instance-xdECz0dx.js} +1 -1
  45. package/dist/client/assets/{timeline-definition-IT6M3QCI-DEWrwvzp.js → timeline-definition-IT6M3QCI-BcCmIxix.js} +1 -1
  46. package/dist/client/assets/{treemap-KMMF4GRG-5d3j9VOH.js → treemap-KMMF4GRG-CVpLLzhu.js} +1 -1
  47. package/dist/client/assets/{xychartDiagram-PRI3JC2R-uBZMdNdc.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/app-context.d.ts +3 -2
  64. package/dist/src/backend/app-context.d.ts.map +1 -1
  65. package/dist/src/backend/app-context.js +2 -1
  66. package/dist/src/backend/app-context.js.map +1 -1
  67. package/dist/src/backend/domains/github/bridges.d.ts +0 -15
  68. package/dist/src/backend/domains/github/bridges.d.ts.map +1 -1
  69. package/dist/src/backend/domains/github/github-cli/mappers.d.ts +1 -1
  70. package/dist/src/backend/domains/github/github-cli/mappers.d.ts.map +1 -1
  71. package/dist/src/backend/domains/github/github-cli/mappers.js +1 -1
  72. package/dist/src/backend/domains/github/github-cli/mappers.js.map +1 -1
  73. package/dist/src/backend/domains/github/github-cli/schemas.d.ts +6 -6
  74. package/dist/src/backend/domains/github/github-cli.service.d.ts +1 -1
  75. package/dist/src/backend/domains/github/github-cli.service.d.ts.map +1 -1
  76. package/dist/src/backend/domains/github/github-cli.service.js.map +1 -1
  77. package/dist/src/backend/domains/github/github-domain-exports.test.js +1 -7
  78. package/dist/src/backend/domains/github/github-domain-exports.test.js.map +1 -1
  79. package/dist/src/backend/domains/github/index.d.ts +1 -3
  80. package/dist/src/backend/domains/github/index.d.ts.map +1 -1
  81. package/dist/src/backend/domains/github/index.js +0 -2
  82. package/dist/src/backend/domains/github/index.js.map +1 -1
  83. package/dist/src/backend/domains/ratchet/bridges.d.ts +2 -1
  84. package/dist/src/backend/domains/ratchet/bridges.d.ts.map +1 -1
  85. package/dist/src/backend/domains/ratchet/fixer-session.service.d.ts +1 -1
  86. package/dist/src/backend/domains/ratchet/fixer-session.service.d.ts.map +1 -1
  87. package/dist/src/backend/domains/ratchet/fixer-session.service.js +3 -1
  88. package/dist/src/backend/domains/ratchet/fixer-session.service.js.map +1 -1
  89. package/dist/src/backend/domains/ratchet/fixer-session.service.test.js +2 -1
  90. package/dist/src/backend/domains/ratchet/fixer-session.service.test.js.map +1 -1
  91. package/dist/src/backend/domains/ratchet/index.d.ts +0 -3
  92. package/dist/src/backend/domains/ratchet/index.d.ts.map +1 -1
  93. package/dist/src/backend/domains/ratchet/index.js +0 -2
  94. package/dist/src/backend/domains/ratchet/index.js.map +1 -1
  95. package/dist/src/backend/domains/ratchet/ratchet-domain-exports.test.js +1 -7
  96. package/dist/src/backend/domains/ratchet/ratchet-domain-exports.test.js.map +1 -1
  97. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts +1 -1
  98. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts.map +1 -1
  99. package/dist/src/backend/domains/ratchet/ratchet.service.js +1 -1
  100. package/dist/src/backend/domains/ratchet/ratchet.service.js.map +1 -1
  101. package/dist/src/backend/domains/ratchet/ratchet.service.test.js +1 -1
  102. package/dist/src/backend/domains/ratchet/ratchet.service.test.js.map +1 -1
  103. package/dist/src/backend/domains/ratchet/reconciliation.service.js +1 -1
  104. package/dist/src/backend/domains/ratchet/reconciliation.service.js.map +1 -1
  105. package/dist/src/backend/domains/run-script/run-script-state-machine.service.d.ts +1 -1
  106. package/dist/src/backend/domains/run-script/run-script-state-machine.service.d.ts.map +1 -1
  107. package/dist/src/backend/domains/run-script/run-script-state-machine.service.js.map +1 -1
  108. package/dist/src/backend/domains/run-script/run-script.service.d.ts +1 -1
  109. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts +3 -0
  110. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts.map +1 -1
  111. package/dist/src/backend/domains/session/acp/acp-event-translator.js +47 -56
  112. package/dist/src/backend/domains/session/acp/acp-event-translator.js.map +1 -1
  113. package/dist/src/backend/domains/session/acp/acp-permission-bridge.d.ts +3 -1
  114. package/dist/src/backend/domains/session/acp/acp-permission-bridge.d.ts.map +1 -1
  115. package/dist/src/backend/domains/session/acp/acp-permission-bridge.js +10 -1
  116. package/dist/src/backend/domains/session/acp/acp-permission-bridge.js.map +1 -1
  117. package/dist/src/backend/domains/session/acp/acp-permission-bridge.test.js +24 -0
  118. package/dist/src/backend/domains/session/acp/acp-permission-bridge.test.js.map +1 -1
  119. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts.map +1 -1
  120. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js +176 -18
  121. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js.map +1 -1
  122. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.d.ts +2 -0
  123. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.d.ts.map +1 -0
  124. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.js +40 -0
  125. package/dist/src/backend/domains/session/acp/acp-runtime-manager.manual.integration.test.js.map +1 -0
  126. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js +88 -1
  127. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js.map +1 -1
  128. package/dist/src/backend/domains/session/acp/acp-session-negotiation.integration.test.js +13 -1
  129. package/dist/src/backend/domains/session/acp/acp-session-negotiation.integration.test.js.map +1 -1
  130. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +85 -0
  131. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -0
  132. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +1794 -0
  133. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -0
  134. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.d.ts +2 -0
  135. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.d.ts.map +1 -0
  136. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js +92 -0
  137. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js.map +1 -0
  138. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.d.ts +2 -0
  139. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.d.ts.map +1 -0
  140. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +1407 -0
  141. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -0
  142. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.d.ts +46 -0
  143. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.d.ts.map +1 -0
  144. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.js +238 -0
  145. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.js.map +1 -0
  146. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.d.ts +2 -0
  147. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.d.ts.map +1 -0
  148. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.js +140 -0
  149. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-rpc-client.test.js.map +1 -0
  150. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.d.ts +2 -0
  151. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.d.ts.map +1 -0
  152. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.js +35 -0
  153. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-schema-snapshot.test.js.map +1 -0
  154. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts +314 -0
  155. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts.map +1 -0
  156. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.js +308 -0
  157. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.js.map +1 -0
  158. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.d.ts +2 -0
  159. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.d.ts.map +1 -0
  160. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.js +147 -0
  161. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.js.map +1 -0
  162. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.d.ts +2 -0
  163. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.d.ts.map +1 -0
  164. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.js +2 -0
  165. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/index.js.map +1 -0
  166. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.d.ts +2 -0
  167. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.d.ts.map +1 -0
  168. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.js +64 -0
  169. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.js.map +1 -0
  170. package/dist/src/backend/domains/session/acp/index.d.ts +1 -0
  171. package/dist/src/backend/domains/session/acp/index.d.ts.map +1 -1
  172. package/dist/src/backend/domains/session/acp/index.js +1 -0
  173. package/dist/src/backend/domains/session/acp/index.js.map +1 -1
  174. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/permission-response.handler.d.ts.map +1 -1
  175. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/permission-response.handler.js +3 -2
  176. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/permission-response.handler.js.map +1 -1
  177. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.d.ts.map +1 -1
  178. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js +13 -11
  179. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js.map +1 -1
  180. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js +9 -0
  181. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js.map +1 -1
  182. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.d.ts.map +1 -1
  183. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js +17 -29
  184. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js.map +1 -1
  185. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts +1 -0
  186. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts.map +1 -1
  187. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js +152 -74
  188. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js.map +1 -1
  189. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.test.js +96 -0
  190. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.test.js.map +1 -1
  191. package/dist/src/backend/domains/session/data/session-data.service.d.ts +7 -10
  192. package/dist/src/backend/domains/session/data/session-data.service.d.ts.map +1 -1
  193. package/dist/src/backend/domains/session/data/session-data.service.js +3 -0
  194. package/dist/src/backend/domains/session/data/session-data.service.js.map +1 -1
  195. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.d.ts +6 -0
  196. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.d.ts.map +1 -0
  197. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.js +25 -0
  198. package/dist/src/backend/domains/session/data/session-history-jsonl-reader.js.map +1 -0
  199. package/dist/src/backend/domains/session/data/session-provider-resolver.service.test.js +0 -2
  200. package/dist/src/backend/domains/session/data/session-provider-resolver.service.test.js.map +1 -1
  201. package/dist/src/backend/domains/session/index.d.ts +2 -1
  202. package/dist/src/backend/domains/session/index.d.ts.map +1 -1
  203. package/dist/src/backend/domains/session/index.js +2 -1
  204. package/dist/src/backend/domains/session/index.js.map +1 -1
  205. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts +2 -2
  206. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts.map +1 -1
  207. package/dist/src/backend/domains/session/lifecycle/session.repository.js.map +1 -1
  208. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts +31 -3
  209. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts.map +1 -1
  210. package/dist/src/backend/domains/session/lifecycle/session.service.js +448 -51
  211. package/dist/src/backend/domains/session/lifecycle/session.service.js.map +1 -1
  212. package/dist/src/backend/domains/session/lifecycle/session.service.test.js +494 -3
  213. package/dist/src/backend/domains/session/lifecycle/session.service.test.js.map +1 -1
  214. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.d.ts +15 -0
  215. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.d.ts.map +1 -0
  216. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.js +135 -0
  217. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.js.map +1 -0
  218. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.test.d.ts +2 -0
  219. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.test.d.ts.map +1 -0
  220. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.test.js +93 -0
  221. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.test.js.map +1 -0
  222. package/dist/src/backend/domains/session/store/session-replay-builder.d.ts.map +1 -1
  223. package/dist/src/backend/domains/session/store/session-replay-builder.js +2 -1
  224. package/dist/src/backend/domains/session/store/session-replay-builder.js.map +1 -1
  225. package/dist/src/backend/domains/session/store/session-replay-builder.test.js +26 -0
  226. package/dist/src/backend/domains/session/store/session-replay-builder.test.js.map +1 -1
  227. package/dist/src/backend/domains/workspace/bridges.d.ts +1 -0
  228. package/dist/src/backend/domains/workspace/bridges.d.ts.map +1 -1
  229. package/dist/src/backend/domains/workspace/index.d.ts +1 -0
  230. package/dist/src/backend/domains/workspace/index.d.ts.map +1 -1
  231. package/dist/src/backend/domains/workspace/index.js +1 -0
  232. package/dist/src/backend/domains/workspace/index.js.map +1 -1
  233. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js +0 -2
  234. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js.map +1 -1
  235. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts +11 -25
  236. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts.map +1 -1
  237. package/dist/src/backend/domains/workspace/lifecycle/data.service.js.map +1 -1
  238. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.d.ts +1 -1
  239. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.d.ts.map +1 -1
  240. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.js.map +1 -1
  241. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts +2 -6
  242. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts.map +1 -1
  243. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts +84 -8
  244. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts.map +1 -1
  245. package/dist/src/backend/domains/workspace/query/workspace-query.service.js +16 -16
  246. package/dist/src/backend/domains/workspace/query/workspace-query.service.js.map +1 -1
  247. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.d.ts +2 -0
  248. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.d.ts.map +1 -0
  249. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js +165 -0
  250. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js.map +1 -0
  251. package/dist/src/backend/domains/workspace/state/flow-state.d.ts +1 -1
  252. package/dist/src/backend/domains/workspace/state/flow-state.d.ts.map +1 -1
  253. package/dist/src/backend/domains/workspace/state/flow-state.js +1 -1
  254. package/dist/src/backend/domains/workspace/state/flow-state.js.map +1 -1
  255. package/dist/src/backend/domains/workspace/state/flow-state.test.js +1 -1
  256. package/dist/src/backend/domains/workspace/state/flow-state.test.js.map +1 -1
  257. package/dist/src/backend/domains/workspace/state/init-policy.d.ts +1 -1
  258. package/dist/src/backend/domains/workspace/state/init-policy.d.ts.map +1 -1
  259. package/dist/src/backend/domains/workspace/state/kanban-state.d.ts +1 -1
  260. package/dist/src/backend/domains/workspace/state/kanban-state.d.ts.map +1 -1
  261. package/dist/src/backend/domains/workspace/state/kanban-state.js +1 -1
  262. package/dist/src/backend/domains/workspace/state/kanban-state.js.map +1 -1
  263. package/dist/src/backend/domains/workspace/state/pending-request-type.d.ts +6 -0
  264. package/dist/src/backend/domains/workspace/state/pending-request-type.d.ts.map +1 -0
  265. package/dist/src/backend/domains/workspace/state/pending-request-type.js +27 -0
  266. package/dist/src/backend/domains/workspace/state/pending-request-type.js.map +1 -0
  267. package/dist/src/backend/domains/workspace/state/pending-request-type.test.d.ts +2 -0
  268. package/dist/src/backend/domains/workspace/state/pending-request-type.test.d.ts.map +1 -0
  269. package/dist/src/backend/domains/workspace/state/pending-request-type.test.js +44 -0
  270. package/dist/src/backend/domains/workspace/state/pending-request-type.test.js.map +1 -0
  271. package/dist/src/backend/domains/workspace/worktree/worktree-init.test.js +10 -3
  272. package/dist/src/backend/domains/workspace/worktree/worktree-init.test.js.map +1 -1
  273. package/dist/src/backend/interceptors/pr-detection.interceptor.d.ts.map +1 -1
  274. package/dist/src/backend/interceptors/pr-detection.interceptor.js +53 -8
  275. package/dist/src/backend/interceptors/pr-detection.interceptor.js.map +1 -1
  276. package/dist/src/backend/interceptors/pr-detection.interceptor.test.d.ts +2 -0
  277. package/dist/src/backend/interceptors/pr-detection.interceptor.test.d.ts.map +1 -0
  278. package/dist/src/backend/interceptors/pr-detection.interceptor.test.js +106 -0
  279. package/dist/src/backend/interceptors/pr-detection.interceptor.test.js.map +1 -0
  280. package/dist/src/backend/lib/session-model.js +1 -1
  281. package/dist/src/backend/lib/session-model.js.map +1 -1
  282. package/dist/src/backend/lib/session-model.test.js +1 -1
  283. package/dist/src/backend/lib/session-model.test.js.map +1 -1
  284. package/dist/src/backend/lib/session-summaries.d.ts +1 -1
  285. package/dist/src/backend/lib/session-summaries.d.ts.map +1 -1
  286. package/dist/src/backend/orchestration/data-backup.service.d.ts.map +1 -1
  287. package/dist/src/backend/orchestration/data-backup.service.js +0 -4
  288. package/dist/src/backend/orchestration/data-backup.service.js.map +1 -1
  289. package/dist/src/backend/orchestration/data-backup.service.test.js +1 -5
  290. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  291. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
  292. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +3 -19
  293. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
  294. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js +13 -27
  295. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js.map +1 -1
  296. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
  297. package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
  298. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts +1 -0
  299. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts.map +1 -1
  300. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js +1 -15
  301. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js.map +1 -1
  302. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js +97 -0
  303. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js.map +1 -1
  304. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +1 -3
  305. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  306. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  307. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +5 -2
  308. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  309. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +2 -1
  310. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js.map +1 -1
  311. package/dist/src/backend/resource_accessors/agent-session.accessor.d.ts +2 -1
  312. package/dist/src/backend/resource_accessors/agent-session.accessor.d.ts.map +1 -1
  313. package/dist/src/backend/resource_accessors/agent-session.accessor.js +11 -1
  314. package/dist/src/backend/resource_accessors/agent-session.accessor.js.map +1 -1
  315. package/dist/src/backend/resource_accessors/agent-session.accessor.test.d.ts +2 -0
  316. package/dist/src/backend/resource_accessors/agent-session.accessor.test.d.ts.map +1 -0
  317. package/dist/src/backend/resource_accessors/agent-session.accessor.test.js +148 -0
  318. package/dist/src/backend/resource_accessors/agent-session.accessor.test.js.map +1 -0
  319. package/dist/src/backend/resource_accessors/terminal-session.accessor.d.ts +1 -1
  320. package/dist/src/backend/resource_accessors/terminal-session.accessor.d.ts.map +1 -1
  321. package/dist/src/backend/resource_accessors/terminal-session.accessor.js.map +1 -1
  322. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +1 -16
  323. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -1
  324. package/dist/src/backend/resource_accessors/workspace.accessor.js +0 -33
  325. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -1
  326. package/dist/src/backend/schemas/tool-inputs.schema.d.ts +2 -0
  327. package/dist/src/backend/schemas/tool-inputs.schema.d.ts.map +1 -1
  328. package/dist/src/backend/schemas/tool-inputs.schema.js +1 -0
  329. package/dist/src/backend/schemas/tool-inputs.schema.js.map +1 -1
  330. package/dist/src/backend/server.d.ts.map +1 -1
  331. package/dist/src/backend/server.js +3 -1
  332. package/dist/src/backend/server.js.map +1 -1
  333. package/dist/src/backend/server.upgrade.test.js +4 -0
  334. package/dist/src/backend/server.upgrade.test.js.map +1 -1
  335. package/dist/src/backend/services/constants.d.ts +0 -5
  336. package/dist/src/backend/services/constants.d.ts.map +1 -1
  337. package/dist/src/backend/services/constants.js +0 -5
  338. package/dist/src/backend/services/constants.js.map +1 -1
  339. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts +3 -3
  340. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts.map +1 -1
  341. package/dist/src/backend/services/workspace-snapshot-store.service.test.js +1 -1
  342. package/dist/src/backend/services/workspace-snapshot-store.service.test.js.map +1 -1
  343. package/dist/src/backend/trpc/admin-active-processes.d.ts +55 -0
  344. package/dist/src/backend/trpc/admin-active-processes.d.ts.map +1 -0
  345. package/dist/src/backend/trpc/admin-active-processes.js +103 -0
  346. package/dist/src/backend/trpc/admin-active-processes.js.map +1 -0
  347. package/dist/src/backend/trpc/admin-active-processes.test.d.ts +2 -0
  348. package/dist/src/backend/trpc/admin-active-processes.test.d.ts.map +1 -0
  349. package/dist/src/backend/trpc/admin-active-processes.test.js +105 -0
  350. package/dist/src/backend/trpc/admin-active-processes.test.js.map +1 -0
  351. package/dist/src/backend/trpc/admin.trpc.d.ts +19 -46
  352. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  353. package/dist/src/backend/trpc/admin.trpc.js +29 -128
  354. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  355. package/dist/src/backend/trpc/decision-log.trpc.d.ts +3 -3
  356. package/dist/src/backend/trpc/index.d.ts +158 -126
  357. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  358. package/dist/src/backend/trpc/log-file-reader.d.ts +26 -0
  359. package/dist/src/backend/trpc/log-file-reader.d.ts.map +1 -0
  360. package/dist/src/backend/trpc/log-file-reader.js +160 -0
  361. package/dist/src/backend/trpc/log-file-reader.js.map +1 -0
  362. package/dist/src/backend/trpc/log-file-reader.test.d.ts +2 -0
  363. package/dist/src/backend/trpc/log-file-reader.test.d.ts.map +1 -0
  364. package/dist/src/backend/trpc/log-file-reader.test.js +162 -0
  365. package/dist/src/backend/trpc/log-file-reader.test.js.map +1 -0
  366. package/dist/src/backend/trpc/project.trpc.d.ts +2 -6
  367. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  368. package/dist/src/backend/trpc/session.trpc.d.ts +25 -33
  369. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  370. package/dist/src/backend/trpc/session.trpc.js +1 -1
  371. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  372. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +4 -6
  373. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  374. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts +1 -1
  375. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +5 -9
  376. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  377. package/dist/src/backend/trpc/workspace.trpc.d.ts +109 -45
  378. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  379. package/dist/src/backend/trpc/workspace.trpc.js +9 -1
  380. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  381. package/dist/src/cli/index.js +7 -2
  382. package/dist/src/cli/index.js.map +1 -1
  383. package/dist/src/shared/acp-protocol/protocol/interaction.d.ts +2 -0
  384. package/dist/src/shared/acp-protocol/protocol/interaction.d.ts.map +1 -1
  385. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts +1 -0
  386. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts.map +1 -1
  387. package/dist/src/shared/acp-protocol/protocol/websocket.js.map +1 -1
  388. package/{packages/core/dist/shared → dist/src/shared/core}/ci-status.d.ts +1 -1
  389. package/dist/src/shared/core/ci-status.d.ts.map +1 -0
  390. package/dist/src/shared/core/ci-status.js.map +1 -0
  391. package/dist/src/shared/core/enums.d.ts.map +1 -0
  392. package/dist/src/shared/core/enums.js.map +1 -0
  393. package/{packages/core/dist → dist/src/shared/core}/index.d.ts +3 -3
  394. package/dist/src/shared/core/index.d.ts.map +1 -0
  395. package/{packages/core/dist → dist/src/shared/core}/index.js +3 -7
  396. package/dist/src/shared/core/index.js.map +1 -0
  397. package/{packages/core/dist/shared → dist/src/shared/core}/workspace-sidebar-status.d.ts +1 -1
  398. package/dist/src/shared/core/workspace-sidebar-status.d.ts.map +1 -0
  399. package/dist/src/shared/core/workspace-sidebar-status.js.map +1 -0
  400. package/dist/src/shared/pending-request-types.d.ts +4 -0
  401. package/dist/src/shared/pending-request-types.d.ts.map +1 -1
  402. package/dist/src/shared/pending-request-types.js +10 -0
  403. package/dist/src/shared/pending-request-types.js.map +1 -1
  404. package/dist/src/shared/schemas/export-data.schema.d.ts +34 -52
  405. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  406. package/dist/src/shared/schemas/export-data.schema.js +1 -3
  407. package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
  408. package/dist/src/shared/session-runtime.d.ts +1 -1
  409. package/dist/src/shared/session-runtime.d.ts.map +1 -1
  410. package/dist/src/shared/websocket/chat-message.schema.d.ts +1 -0
  411. package/dist/src/shared/websocket/chat-message.schema.d.ts.map +1 -1
  412. package/dist/src/shared/websocket/chat-message.schema.js +1 -0
  413. package/dist/src/shared/websocket/chat-message.schema.js.map +1 -1
  414. package/dist/src/shared/workspace-sidebar-status.d.ts +1 -1
  415. package/dist/src/shared/workspace-sidebar-status.d.ts.map +1 -1
  416. package/dist/src/shared/workspace-sidebar-status.js +1 -1
  417. package/dist/src/shared/workspace-sidebar-status.js.map +1 -1
  418. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  419. package/package.json +4 -5
  420. package/prisma/migrations/20260214232046_remove_ratchet_last_modified/migration.sql +68 -0
  421. package/prisma/schema.prisma +0 -2
  422. package/dist/client/assets/channel-C_n33uex.js +0 -1
  423. package/dist/client/assets/classDiagram-2ON5EDUG-ByvTr4wu.js +0 -1
  424. package/dist/client/assets/classDiagram-v2-WZHVMYZB-ByvTr4wu.js +0 -1
  425. package/dist/client/assets/clone-CVeCVXXl.js +0 -1
  426. package/dist/client/assets/index-D_8rf7lP.css +0 -1
  427. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-C7liWkST.js +0 -1
  428. package/dist/src/backend/domains/github/pr-review-fixer.service.d.ts +0 -63
  429. package/dist/src/backend/domains/github/pr-review-fixer.service.d.ts.map +0 -1
  430. package/dist/src/backend/domains/github/pr-review-fixer.service.js +0 -141
  431. package/dist/src/backend/domains/github/pr-review-fixer.service.js.map +0 -1
  432. package/dist/src/backend/domains/github/pr-review-fixer.service.test.d.ts +0 -2
  433. package/dist/src/backend/domains/github/pr-review-fixer.service.test.d.ts.map +0 -1
  434. package/dist/src/backend/domains/github/pr-review-fixer.service.test.js +0 -28
  435. package/dist/src/backend/domains/github/pr-review-fixer.service.test.js.map +0 -1
  436. package/dist/src/backend/domains/github/pr-review-monitor.service.d.ts +0 -19
  437. package/dist/src/backend/domains/github/pr-review-monitor.service.d.ts.map +0 -1
  438. package/dist/src/backend/domains/github/pr-review-monitor.service.js +0 -215
  439. package/dist/src/backend/domains/github/pr-review-monitor.service.js.map +0 -1
  440. package/dist/src/backend/domains/ratchet/ci-fixer.service.d.ts +0 -47
  441. package/dist/src/backend/domains/ratchet/ci-fixer.service.d.ts.map +0 -1
  442. package/dist/src/backend/domains/ratchet/ci-fixer.service.js +0 -95
  443. package/dist/src/backend/domains/ratchet/ci-fixer.service.js.map +0 -1
  444. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.d.ts +0 -2
  445. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.d.ts.map +0 -1
  446. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.js +0 -100
  447. package/dist/src/backend/domains/ratchet/ci-fixer.service.test.js.map +0 -1
  448. package/dist/src/backend/domains/ratchet/ci-monitor.service.d.ts +0 -36
  449. package/dist/src/backend/domains/ratchet/ci-monitor.service.d.ts.map +0 -1
  450. package/dist/src/backend/domains/ratchet/ci-monitor.service.js +0 -278
  451. package/dist/src/backend/domains/ratchet/ci-monitor.service.js.map +0 -1
  452. package/dist/src/backend/services/fixer-workflow.service.d.ts +0 -83
  453. package/dist/src/backend/services/fixer-workflow.service.d.ts.map +0 -1
  454. package/dist/src/backend/services/fixer-workflow.service.js +0 -77
  455. package/dist/src/backend/services/fixer-workflow.service.js.map +0 -1
  456. package/dist/src/backend/services/fixer-workflow.service.test.d.ts +0 -2
  457. package/dist/src/backend/services/fixer-workflow.service.test.d.ts.map +0 -1
  458. package/dist/src/backend/services/fixer-workflow.service.test.js +0 -55
  459. package/dist/src/backend/services/fixer-workflow.service.test.js.map +0 -1
  460. package/packages/core/dist/index.d.ts.map +0 -1
  461. package/packages/core/dist/index.js.map +0 -1
  462. package/packages/core/dist/shared/ci-status.d.ts.map +0 -1
  463. package/packages/core/dist/shared/ci-status.js.map +0 -1
  464. package/packages/core/dist/shared/workspace-sidebar-status.d.ts.map +0 -1
  465. package/packages/core/dist/shared/workspace-sidebar-status.js.map +0 -1
  466. package/packages/core/dist/types/enums.d.ts.map +0 -1
  467. package/packages/core/dist/types/enums.js.map +0 -1
  468. package/packages/core/dist/types/index.d.ts +0 -2
  469. package/packages/core/dist/types/index.d.ts.map +0 -1
  470. package/packages/core/dist/types/index.js +0 -2
  471. package/packages/core/dist/types/index.js.map +0 -1
  472. package/packages/core/package.json +0 -25
  473. /package/{packages/core/dist/shared → dist/src/shared/core}/ci-status.js +0 -0
  474. /package/{packages/core/dist/types → dist/src/shared/core}/enums.d.ts +0 -0
  475. /package/{packages/core/dist/types → dist/src/shared/core}/enums.js +0 -0
  476. /package/{packages/core/dist/shared → dist/src/shared/core}/workspace-sidebar-status.js +0 -0
@@ -1,27 +1,35 @@
1
- import { SessionStatus } from '@factory-factory/core';
2
1
  import { AcpEventTranslator, AcpPermissionBridge, acpRuntimeManager, } from '../../../../backend/domains/session/acp/index.js';
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
5
  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
+ import { SessionStatus } from '../../../../shared/core/index.js';
9
+ import { isUserQuestionRequest } from '../../../../shared/pending-request-types.js';
8
10
  import { createInitialSessionRuntimeState, } from '../../../../shared/session-runtime.js';
9
11
  import { sessionPromptBuilder } from './session.prompt-builder.js';
10
12
  import { sessionRepository } from './session.repository.js';
11
13
  const logger = createLogger('session');
12
14
  const STALE_LOADING_RUNTIME_MAX_AGE_MS = 30_000;
15
+ const TERMINAL_TOOL_STATUSES = new Set(['completed', 'failed', 'cancelled']);
13
16
  class SessionService {
14
17
  repository;
15
18
  promptBuilder;
16
19
  acpEventTranslator = new AcpEventTranslator(logger);
17
20
  acpPermissionBridges = new Map();
18
21
  acpStreamState = new Map();
22
+ pendingAcpToolCalls = new Map();
19
23
  suppressAcpReplayForSession = new Set();
20
24
  workspaceBridge = null;
21
25
  sessionToWorkspace = new Map();
26
+ promptTurnCompleteHandler = null;
22
27
  configure(bridges) {
23
28
  this.workspaceBridge = bridges.workspace;
24
29
  }
30
+ setPromptTurnCompleteHandler(handler) {
31
+ this.promptTurnCompleteHandler = handler;
32
+ }
25
33
  isStaleLoadingRuntime(runtime) {
26
34
  if (runtime.phase !== 'loading' || runtime.processState === 'alive') {
27
35
  return false;
@@ -46,7 +54,18 @@ class SessionService {
46
54
  return;
47
55
  }
48
56
  const deltas = this.acpEventTranslator.translateSessionUpdate(update);
49
- for (const delta of deltas) {
57
+ if (deltas.length === 0) {
58
+ acpTraceLogger.log(sid, 'translated_delta', {
59
+ sessionUpdate: update.sessionUpdate,
60
+ deltaCount: 0,
61
+ });
62
+ }
63
+ for (const [index, delta] of deltas.entries()) {
64
+ acpTraceLogger.log(sid, 'translated_delta', {
65
+ sessionUpdate: update.sessionUpdate,
66
+ deltaIndex: index,
67
+ delta,
68
+ });
50
69
  this.handleAcpDelta(sid, delta);
51
70
  }
52
71
  return;
@@ -59,6 +78,10 @@ class SessionService {
59
78
  onSessionId: async (sid, providerSessionId) => {
60
79
  try {
61
80
  await this.repository.updateSession(sid, { providerSessionId });
81
+ acpTraceLogger.log(sid, 'runtime_metadata', {
82
+ type: 'provider_session_id',
83
+ providerSessionId,
84
+ });
62
85
  logger.debug('Updated session with ACP providerSessionId', {
63
86
  sessionId: sid,
64
87
  providerSessionId,
@@ -74,6 +97,7 @@ class SessionService {
74
97
  },
75
98
  onExit: async (sid, exitCode) => {
76
99
  this.acpStreamState.delete(sid);
100
+ this.pendingAcpToolCalls.delete(sid);
77
101
  this.suppressAcpReplayForSession.delete(sid);
78
102
  this.sessionToWorkspace.delete(sid);
79
103
  const b = this.acpPermissionBridges.get(sid);
@@ -81,6 +105,7 @@ class SessionService {
81
105
  b.cancelAll();
82
106
  this.acpPermissionBridges.delete(sid);
83
107
  }
108
+ acpTraceLogger.log(sid, 'runtime_exit', { exitCode });
84
109
  try {
85
110
  sessionDomainService.markProcessExit(sid, exitCode);
86
111
  const session = await this.repository.updateSession(sid, {
@@ -99,8 +124,15 @@ class SessionService {
99
124
  error: error instanceof Error ? error.message : String(error),
100
125
  });
101
126
  }
127
+ finally {
128
+ acpTraceLogger.closeSession(sid);
129
+ }
102
130
  },
103
131
  onError: (sid, error) => {
132
+ acpTraceLogger.log(sid, 'runtime_error', {
133
+ message: error.message,
134
+ stack: error.stack,
135
+ });
104
136
  logger.error('ACP client error', {
105
137
  sessionId: sid,
106
138
  error: error.message,
@@ -108,6 +140,7 @@ class SessionService {
108
140
  });
109
141
  },
110
142
  onAcpLog: (sid, payload) => {
143
+ acpTraceLogger.log(sid, 'raw_acp_event', payload);
111
144
  sessionFileLogger.log(sid, 'FROM_CLAUDE_CLI', payload);
112
145
  },
113
146
  };
@@ -119,6 +152,7 @@ class SessionService {
119
152
  delta.type !== 'slash_commands') {
120
153
  return;
121
154
  }
155
+ this.trackPendingAcpToolCalls(sid, delta);
122
156
  if (delta.type === 'config_options_update') {
123
157
  const acpHandle = acpRuntimeManager.getClient(sid);
124
158
  if (acpHandle) {
@@ -150,6 +184,140 @@ class SessionService {
150
184
  const order = sessionDomainService.appendClaudeEvent(sid, data);
151
185
  sessionDomainService.emitDelta(sid, { ...delta, order });
152
186
  }
187
+ trackPendingAcpToolCalls(sid, delta) {
188
+ if (delta.type === 'agent_message') {
189
+ this.trackPendingFromAgentMessage(sid, delta.data);
190
+ return;
191
+ }
192
+ if (delta.type === 'tool_progress') {
193
+ this.trackPendingFromToolProgress(sid, delta);
194
+ }
195
+ }
196
+ trackPendingFromAgentMessage(sid, data) {
197
+ if (data.type === 'stream_event') {
198
+ this.trackPendingFromToolUseStreamEvent(sid, data);
199
+ }
200
+ if (data.type !== 'user') {
201
+ return;
202
+ }
203
+ this.clearPendingFromToolResultMessage(sid, data);
204
+ }
205
+ trackPendingFromToolUseStreamEvent(sid, data) {
206
+ const streamEvent = data.event;
207
+ const contentBlock = streamEvent?.content_block;
208
+ const isToolUse = streamEvent?.type === 'content_block_start' && contentBlock?.type === 'tool_use';
209
+ if (!isToolUse) {
210
+ return;
211
+ }
212
+ const toolUseId = typeof contentBlock?.id === 'string' ? contentBlock.id : null;
213
+ if (!toolUseId) {
214
+ return;
215
+ }
216
+ const toolName = typeof contentBlock?.name === 'string' ? contentBlock.name : 'ACP Tool';
217
+ this.upsertPendingToolCall(sid, toolUseId, { toolName });
218
+ }
219
+ clearPendingFromToolResultMessage(sid, data) {
220
+ if (data.type !== 'user') {
221
+ return;
222
+ }
223
+ const content = data.message?.content;
224
+ if (!Array.isArray(content)) {
225
+ return;
226
+ }
227
+ for (const item of content) {
228
+ if (item.type === 'tool_result') {
229
+ this.removePendingToolCall(sid, item.tool_use_id);
230
+ }
231
+ }
232
+ }
233
+ trackPendingFromToolProgress(sid, progress) {
234
+ if (!progress.tool_use_id) {
235
+ return;
236
+ }
237
+ if (progress.acpStatus && TERMINAL_TOOL_STATUSES.has(progress.acpStatus)) {
238
+ this.removePendingToolCall(sid, progress.tool_use_id);
239
+ return;
240
+ }
241
+ this.upsertPendingToolCall(sid, progress.tool_use_id, {
242
+ toolName: progress.tool_name ?? 'ACP Tool',
243
+ acpKind: progress.acpKind,
244
+ acpLocations: progress.acpLocations,
245
+ });
246
+ }
247
+ upsertPendingToolCall(sid, toolUseId, update) {
248
+ const pendingById = this.pendingAcpToolCalls.get(sid) ?? new Map();
249
+ const existing = pendingById.get(toolUseId);
250
+ pendingById.set(toolUseId, {
251
+ toolUseId,
252
+ toolName: update.toolName || existing?.toolName || 'ACP Tool',
253
+ acpKind: update.acpKind ?? existing?.acpKind,
254
+ acpLocations: update.acpLocations ?? existing?.acpLocations,
255
+ });
256
+ this.pendingAcpToolCalls.set(sid, pendingById);
257
+ }
258
+ removePendingToolCall(sid, toolUseId) {
259
+ const pendingById = this.pendingAcpToolCalls.get(sid);
260
+ if (!pendingById) {
261
+ return;
262
+ }
263
+ pendingById.delete(toolUseId);
264
+ if (pendingById.size === 0) {
265
+ this.pendingAcpToolCalls.delete(sid);
266
+ }
267
+ }
268
+ finalizeOrphanedToolCalls(sid, reason) {
269
+ const pendingById = this.pendingAcpToolCalls.get(sid);
270
+ if (!pendingById || pendingById.size === 0) {
271
+ this.pendingAcpToolCalls.delete(sid);
272
+ return;
273
+ }
274
+ const toolUseIds = [...pendingById.keys()];
275
+ logger.warn('Finalizing orphaned ACP tool calls without terminal status', {
276
+ sessionId: sid,
277
+ reason,
278
+ count: toolUseIds.length,
279
+ toolUseIds,
280
+ });
281
+ for (const pending of pendingById.values()) {
282
+ const syntheticProgress = {
283
+ type: 'tool_progress',
284
+ tool_use_id: pending.toolUseId,
285
+ tool_name: pending.toolName,
286
+ acpStatus: 'failed',
287
+ elapsed_time_seconds: 0,
288
+ ...(pending.acpKind ? { acpKind: pending.acpKind } : {}),
289
+ ...(pending.acpLocations ? { acpLocations: pending.acpLocations } : {}),
290
+ };
291
+ this.handleAcpDelta(sid, syntheticProgress);
292
+ const syntheticResult = {
293
+ type: 'agent_message',
294
+ data: {
295
+ type: 'user',
296
+ message: {
297
+ role: 'user',
298
+ content: [
299
+ {
300
+ type: 'tool_result',
301
+ tool_use_id: pending.toolUseId,
302
+ content: `Tool call did not receive a terminal ACP update (${reason}). Marked as failed locally.`,
303
+ is_error: true,
304
+ },
305
+ ],
306
+ },
307
+ },
308
+ };
309
+ this.handleAcpDelta(sid, syntheticResult);
310
+ acpTraceLogger.log(sid, 'translated_delta', {
311
+ sessionUpdate: 'synthetic_orphan_tool_call',
312
+ delta: syntheticProgress,
313
+ });
314
+ acpTraceLogger.log(sid, 'translated_delta', {
315
+ sessionUpdate: 'synthetic_orphan_tool_call',
316
+ delta: syntheticResult,
317
+ });
318
+ }
319
+ this.pendingAcpToolCalls.delete(sid);
320
+ }
153
321
  handleAcpUserMessageChunk(sid, text) {
154
322
  this.maybeLiftReplaySuppression(sid);
155
323
  if (this.suppressAcpReplayForSession.has(sid)) {
@@ -196,11 +364,12 @@ class SessionService {
196
364
  kind: o.kind,
197
365
  }));
198
366
  const planContent = this.extractPlanContent(toolName, toolInput);
199
- if (toolName === 'AskUserQuestion') {
367
+ if (isUserQuestionRequest({ toolName, input: toolInput })) {
200
368
  const questions = this.extractAskUserQuestions(toolInput);
201
369
  sessionDomainService.emitDelta(sid, {
202
370
  type: 'user_question',
203
371
  requestId,
372
+ toolName,
204
373
  questions,
205
374
  acpOptions,
206
375
  });
@@ -326,15 +495,110 @@ class SessionService {
326
495
  if (existingClient) {
327
496
  throw new Error('Session is already running');
328
497
  }
329
- 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);
330
502
  const initialPrompt = options?.initialPrompt ?? 'Continue with the task.';
331
503
  if (initialPrompt) {
332
504
  await this.sendSessionMessage(sessionId, initialPrompt);
333
505
  }
334
506
  logger.info('Session started', { sessionId, provider: session.provider });
335
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
+ }
336
599
  async stopSession(sessionId, options) {
337
600
  const session = await this.loadSessionForStop(sessionId);
601
+ const workspaceId = session?.workspaceId ?? this.sessionToWorkspace.get(sessionId);
338
602
  if (acpRuntimeManager.isStopInProgress(sessionId)) {
339
603
  logger.debug('Session stop already in progress', { sessionId });
340
604
  return;
@@ -367,14 +631,17 @@ class SessionService {
367
631
  });
368
632
  }
369
633
  finally {
634
+ this.finalizeOrphanedToolCallsOnStop(sessionId);
370
635
  await this.updateStoppedSessionState(sessionId);
371
- sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: false });
636
+ sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: true });
372
637
  sessionDomainService.setRuntimeSnapshot(sessionId, {
373
638
  phase: 'idle',
374
639
  processState: 'stopped',
375
640
  activity: 'IDLE',
376
641
  updatedAt: new Date().toISOString(),
377
642
  });
643
+ this.markWorkspaceSessionIdleOnStop(workspaceId, sessionId);
644
+ this.sessionToWorkspace.delete(sessionId);
378
645
  if (!stopClientFailed) {
379
646
  const shouldCleanupTransientRatchetSession = options?.cleanupTransientRatchetSession ?? true;
380
647
  await this.cleanupTransientRatchetOnStop(session, sessionId, shouldCleanupTransientRatchetSession);
@@ -383,6 +650,34 @@ class SessionService {
383
650
  sessionId,
384
651
  ...(stopClientFailed ? { runtimeStopFailed: true } : {}),
385
652
  });
653
+ acpTraceLogger.closeSession(sessionId);
654
+ }
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
+ });
386
681
  }
387
682
  }
388
683
  async loadSessionForStop(sessionId) {
@@ -526,7 +821,15 @@ class SessionService {
526
821
  }
527
822
  async setSessionConfigOption(sessionId, configId, value) {
528
823
  const acpHandle = acpRuntimeManager.getClient(sessionId);
529
- 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);
530
833
  const isModeOption = configId === 'mode' || selectedOption?.category === 'mode';
531
834
  const isModelOption = configId === 'model' || selectedOption?.category === 'model';
532
835
  const configOptions = isModeOption
@@ -547,6 +850,46 @@ class SessionService {
547
850
  });
548
851
  }
549
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
+ }
550
893
  sendSessionMessage(sessionId, content) {
551
894
  const acpClient = acpRuntimeManager.getClient(sessionId);
552
895
  if (acpClient) {
@@ -595,6 +938,7 @@ class SessionService {
595
938
  }
596
939
  async sendAcpMessage(sessionId, content) {
597
940
  const workspaceId = this.sessionToWorkspace.get(sessionId);
941
+ this.pendingAcpToolCalls.set(sessionId, new Map());
598
942
  sessionDomainService.setRuntimeSnapshot(sessionId, {
599
943
  phase: 'running',
600
944
  processState: 'alive',
@@ -606,6 +950,7 @@ class SessionService {
606
950
  }
607
951
  try {
608
952
  const result = await acpRuntimeManager.sendPrompt(sessionId, content);
953
+ this.finalizeOrphanedToolCalls(sessionId, `stop_reason:${result.stopReason}`);
609
954
  sessionDomainService.setRuntimeSnapshot(sessionId, {
610
955
  phase: 'idle',
611
956
  processState: 'alive',
@@ -615,6 +960,7 @@ class SessionService {
615
960
  return result.stopReason;
616
961
  }
617
962
  catch (error) {
963
+ this.finalizeOrphanedToolCalls(sessionId, 'prompt_error');
618
964
  sessionDomainService.setRuntimeSnapshot(sessionId, {
619
965
  phase: 'error',
620
966
  processState: 'alive',
@@ -627,6 +973,29 @@ class SessionService {
627
973
  if (workspaceId && this.workspaceBridge) {
628
974
  this.workspaceBridge.markSessionIdle(workspaceId, sessionId);
629
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
+ });
630
999
  }
631
1000
  }
632
1001
  async cancelAcpPrompt(sessionId) {
@@ -678,12 +1047,12 @@ class SessionService {
678
1047
  .join('\n')
679
1048
  .trim();
680
1049
  }
681
- respondToAcpPermission(sessionId, requestId, optionId) {
1050
+ respondToAcpPermission(sessionId, requestId, optionId, answers) {
682
1051
  const bridge = this.acpPermissionBridges.get(sessionId);
683
1052
  if (!bridge) {
684
1053
  return false;
685
1054
  }
686
- return bridge.resolvePermission(requestId, optionId);
1055
+ return bridge.resolvePermission(requestId, optionId, answers);
687
1056
  }
688
1057
  getRuntimeSnapshot(sessionId) {
689
1058
  const fallback = createInitialSessionRuntimeState();
@@ -793,12 +1162,36 @@ class SessionService {
793
1162
  }
794
1163
  buildCapabilitiesFromConfigOptions(provider, configOptions, fallbackModel) {
795
1164
  const modelOption = configOptions.find((o) => o.category === 'model');
796
- 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');
797
1167
  const selectedModel = modelOption?.currentValue
798
1168
  ? String(modelOption.currentValue)
799
1169
  : (fallbackModel ?? undefined);
800
1170
  const modelOptions = this.buildModelOptions(modelOption, selectedModel);
801
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));
802
1195
  return {
803
1196
  provider,
804
1197
  model: {
@@ -807,13 +1200,14 @@ class SessionService {
807
1200
  ...(selectedModel ? { selected: selectedModel } : {}),
808
1201
  },
809
1202
  reasoning: {
810
- enabled: false,
811
- options: [],
1203
+ enabled: reasoningOptions.length > 0,
1204
+ options: reasoningOptions,
1205
+ ...(selectedReasoning ? { selected: selectedReasoning } : {}),
812
1206
  },
813
1207
  thinking: {
814
- enabled: !!thoughtOption,
1208
+ enabled: !isCodexProvider && !!thoughtOption,
815
1209
  },
816
- planMode: { enabled: true },
1210
+ planMode: { enabled: planModeEnabled },
817
1211
  attachments: isCodexProvider
818
1212
  ? { enabled: false, kinds: [] }
819
1213
  : { enabled: true, kinds: ['image', 'text'] },
@@ -826,28 +1220,34 @@ class SessionService {
826
1220
  if (!modelOption) {
827
1221
  return selectedModel ? [{ value: selectedModel, label: selectedModel }] : [];
828
1222
  }
829
- const uniqueValues = new Set(this.getConfigOptionValues(modelOption));
830
- if (selectedModel) {
831
- 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);
832
1231
  }
833
- return Array.from(uniqueValues).map((value) => ({ value, label: value }));
1232
+ return Array.from(byValue.entries()).map(([value, label]) => ({ value, label }));
834
1233
  }
835
- getConfigOptionValues(option) {
1234
+ getSelectOptions(option) {
836
1235
  return option.options.flatMap((entry) => {
837
1236
  if (typeof entry !== 'object' || entry === null) {
838
1237
  return [];
839
1238
  }
840
1239
  if ('value' in entry && typeof entry.value === 'string') {
841
- return [entry.value];
1240
+ return [entry];
842
1241
  }
843
1242
  if ('options' in entry && Array.isArray(entry.options)) {
844
- return entry.options
845
- .map((grouped) => grouped?.value)
846
- .filter((value) => typeof value === 'string');
1243
+ return entry.options.filter((grouped) => typeof grouped === 'object' && grouped !== null && typeof grouped.value === 'string');
847
1244
  }
848
1245
  return [];
849
1246
  });
850
1247
  }
1248
+ getConfigOptionValues(option) {
1249
+ return this.getSelectOptions(option).map((entry) => entry.value);
1250
+ }
851
1251
  async stopAllClients(_timeoutMs = 5000) {
852
1252
  try {
853
1253
  await acpRuntimeManager.stopAllClients();
@@ -868,7 +1268,6 @@ class SessionService {
868
1268
  const metadataSource = params.existingMetadata ??
869
1269
  (await this.repository.getSessionById(sessionId))?.providerMetadata ??
870
1270
  null;
871
- const metadataRecord = this.toMetadataRecord(metadataSource);
872
1271
  const snapshot = {
873
1272
  provider: params.provider,
874
1273
  providerSessionId: params.providerSessionId,
@@ -876,44 +1275,42 @@ class SessionService {
876
1275
  configOptions: configOptionsForStorage,
877
1276
  ...(observedModelId ? { observedModelId } : {}),
878
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) {
879
1291
  const nextMetadata = {
880
- ...metadataRecord,
1292
+ ...this.toMetadataRecord(metadataSource),
881
1293
  acpConfigSnapshot: snapshot,
882
1294
  };
883
1295
  if (observedModelId) {
884
1296
  nextMetadata.observedModelId = observedModelId;
885
1297
  }
1298
+ return {
1299
+ providerMetadata: nextMetadata,
1300
+ ...(observedModelId ? { model: observedModelId } : {}),
1301
+ };
1302
+ }
1303
+ async retryPersistAcpConfigSnapshot(sessionId, snapshot, observedModelId) {
886
1304
  try {
887
- await this.repository.updateSession(sessionId, {
888
- providerMetadata: nextMetadata,
889
- });
1305
+ const latestMetadataSource = (await this.repository.getSessionById(sessionId))
1306
+ ?.providerMetadata;
1307
+ await this.repository.updateSession(sessionId, this.buildSnapshotPersistUpdate(latestMetadataSource, snapshot, observedModelId));
890
1308
  }
891
- catch (error) {
892
- 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', {
893
1311
  sessionId,
894
- error: error instanceof Error ? error.message : String(error),
1312
+ error: retryError instanceof Error ? retryError.message : String(retryError),
895
1313
  });
896
- try {
897
- const latestMetadataSource = (await this.repository.getSessionById(sessionId))
898
- ?.providerMetadata;
899
- const latestMetadata = this.toMetadataRecord(latestMetadataSource);
900
- const retryMetadata = {
901
- ...latestMetadata,
902
- acpConfigSnapshot: snapshot,
903
- };
904
- if (observedModelId) {
905
- retryMetadata.observedModelId = observedModelId;
906
- }
907
- await this.repository.updateSession(sessionId, {
908
- providerMetadata: retryMetadata,
909
- });
910
- }
911
- catch (retryError) {
912
- logger.warn('Retry failed persisting ACP config snapshot to session metadata', {
913
- sessionId,
914
- error: retryError instanceof Error ? retryError.message : String(retryError),
915
- });
916
- }
917
1314
  }
918
1315
  }
919
1316
  cloneConfigOptionsForStorage(configOptions) {