factory-factory 0.3.6 → 0.3.8

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 (631) hide show
  1. package/dist/client/assets/{_basePickBy-CzLmZHC2.js → _basePickBy-BzH_iru3.js} +1 -1
  2. package/dist/client/assets/{_baseUniq-B2vXSgXW.js → _baseUniq-D6ny9r_u.js} +1 -1
  3. package/dist/client/assets/arc-CRVgibiy.js +1 -0
  4. package/dist/client/assets/architectureDiagram-VXUJARFQ-1aDFSaTZ.js +36 -0
  5. package/dist/client/assets/{blockDiagram-VD42YOAC-CJ7hB7tD.js → blockDiagram-VD42YOAC-m3mDHY-k.js} +4 -4
  6. package/dist/client/assets/{c4Diagram-YG6GDRKO-C9-3yIl7.js → c4Diagram-YG6GDRKO-B7ZlkfXz.js} +3 -3
  7. package/dist/client/assets/channel-B_f9a3jD.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-LA-tkKjD.js → chunk-4BX2VUAB-zLj9eiFf.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-D8Jq3_Ne.js → chunk-55IACEB6-D6KQTgyD.js} +1 -1
  10. package/dist/client/assets/{chunk-B4BG7PRW-BbB1Mssd.js → chunk-B4BG7PRW-BQbzvx8l.js} +1 -1
  11. package/dist/client/assets/{chunk-DI55MBZ5-CpO3WS5m.js → chunk-DI55MBZ5-CPxKCw_e.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-zaxR2CzR.js → chunk-FMBD7UC4-nFaeGtHP.js} +1 -1
  13. package/dist/client/assets/chunk-QN33PNHL-DhrGqSLY.js +1 -0
  14. package/dist/client/assets/{chunk-QZHKN3VN-CbCQqsiw.js → chunk-QZHKN3VN-CZWrGmvf.js} +1 -1
  15. package/dist/client/assets/chunk-TZMSLE5B-xhHdVO37.js +1 -0
  16. package/dist/client/assets/classDiagram-2ON5EDUG-CgnrkUO8.js +1 -0
  17. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CgnrkUO8.js +1 -0
  18. package/dist/client/assets/clone-BmilxOGI.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-S5V4N54A-BZtg5BPr.js → cose-bilkent-S5V4N54A-Cr0HX6ro.js} +1 -1
  20. package/dist/client/assets/{dagre-6UL2VRFP-DiejfPfI.js → dagre-6UL2VRFP-s6RRMHqY.js} +2 -2
  21. package/dist/client/assets/diagram-PSM6KHXK-BhdZNVs7.js +24 -0
  22. package/dist/client/assets/diagram-QEK2KX5R-Dgwc4sx_.js +43 -0
  23. package/dist/client/assets/diagram-S2PKOQOG-BlcMpYrQ.js +24 -0
  24. package/dist/client/assets/{erDiagram-Q2GNP2WA-IM11uKRy.js → erDiagram-Q2GNP2WA-BQQjswcC.js} +4 -4
  25. package/dist/client/assets/{flowDiagram-NV44I4VS-DTbQf_7g.js → flowDiagram-NV44I4VS-_cBTH43Q.js} +5 -5
  26. package/dist/client/assets/{ganttDiagram-JELNMOA3-Bqd3rUDW.js → ganttDiagram-JELNMOA3-BxuyB7Oz.js} +2 -2
  27. package/dist/client/assets/gitGraphDiagram-V2S2FVAM-D0GjSYQi.js +65 -0
  28. package/dist/client/assets/{graph-D667hHAk.js → graph-DNCXrik3.js} +1 -1
  29. package/dist/client/assets/index-CCnMDzRJ.js +436 -0
  30. package/dist/client/assets/index-DVprBuNv.css +1 -0
  31. package/dist/client/assets/infoDiagram-HS3SLOUP-BsUKtNMj.js +2 -0
  32. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-Br2GUbhE.js → journeyDiagram-XKPGCS4Q-sScoNj-6.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-3W4ZIXB7-D0SM1ldH.js → kanban-definition-3W4ZIXB7-CycFvltk.js} +6 -6
  34. package/dist/client/assets/{layout-BPE9Dzp9.js → layout-LTiJ8avf.js} +1 -1
  35. package/dist/client/assets/{linear-5exZFNBA.js → linear-CnQEAniJ.js} +1 -1
  36. package/dist/client/assets/{mindmap-definition-VGOIOE7T-D1W9h2lc.js → mindmap-definition-VGOIOE7T-Du5mb-g5.js} +3 -3
  37. package/dist/client/assets/mobile-baseline-necQV4Mu.js +10 -0
  38. package/dist/client/assets/pieDiagram-ADFJNKIX-CUAEo70K.js +30 -0
  39. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-Cb0ciONq.js → quadrantDiagram-AYHSOK5B-1MjtTI_Y.js} +1 -1
  40. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-BKYaJZ83.js → requirementDiagram-UZGBJVZJ-zgmi2Sjr.js} +1 -1
  41. package/dist/client/assets/sankeyDiagram-TZEHDZUN-Datw0Rj8.js +10 -0
  42. package/dist/client/assets/{sequenceDiagram-WL72ISMW-Cys03qhv.js → sequenceDiagram-WL72ISMW-DopxoRon.js} +6 -6
  43. package/dist/client/assets/stateDiagram-FKZM4ZOC-ZqoVSvsu.js +1 -0
  44. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BRKf4wQr.js +1 -0
  45. package/dist/client/assets/terminal-instance-DDGTF8rc.css +1 -0
  46. package/dist/client/assets/terminal-instance-gybkMDHu.js +16 -0
  47. package/dist/client/assets/{timeline-definition-IT6M3QCI-C0mVV_zL.js → timeline-definition-IT6M3QCI-DQwpSE-n.js} +4 -4
  48. package/dist/client/assets/{treemap-GDKQZRPO-DK-Wlxvy.js → treemap-GDKQZRPO-DK4UuMc6.js} +1 -1
  49. package/dist/client/assets/{xychartDiagram-PRI3JC2R-CFg2MfK9.js → xychartDiagram-PRI3JC2R-CJP1ULwR.js} +4 -4
  50. package/dist/client/index.html +2 -2
  51. package/dist/prisma/generated/commonInputTypes.d.ts +30 -0
  52. package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -1
  53. package/dist/prisma/generated/enums.d.ts +6 -0
  54. package/dist/prisma/generated/enums.d.ts.map +1 -1
  55. package/dist/prisma/generated/enums.js +5 -0
  56. package/dist/prisma/generated/enums.js.map +1 -1
  57. package/dist/prisma/generated/internal/class.js +4 -4
  58. package/dist/prisma/generated/internal/class.js.map +1 -1
  59. package/dist/prisma/generated/internal/prismaNamespace.d.ts +4 -0
  60. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  61. package/dist/prisma/generated/internal/prismaNamespace.js +3 -0
  62. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  63. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +3 -0
  64. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  65. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +3 -0
  66. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  67. package/dist/prisma/generated/models/UserSettings.d.ts +60 -1
  68. package/dist/prisma/generated/models/UserSettings.d.ts.map +1 -1
  69. package/dist/prisma/generated/models/Workspace.d.ts +44 -1
  70. package/dist/prisma/generated/models/Workspace.d.ts.map +1 -1
  71. package/dist/prompts/ratchet/dispatch.md +5 -2
  72. package/dist/prompts/workflows/pr-review-fix.md +2 -1
  73. package/dist/src/backend/app-context.d.ts +2 -1
  74. package/dist/src/backend/app-context.d.ts.map +1 -1
  75. package/dist/src/backend/app-context.js +19 -5
  76. package/dist/src/backend/app-context.js.map +1 -1
  77. package/dist/src/backend/domains/github/github-cli/schemas.d.ts +1 -1
  78. package/dist/src/backend/domains/github/github-cli/schemas.js +1 -1
  79. package/dist/src/backend/domains/github/github-cli/schemas.js.map +1 -1
  80. package/dist/src/backend/domains/github/github-cli.service.test.js +44 -0
  81. package/dist/src/backend/domains/github/github-cli.service.test.js.map +1 -1
  82. package/dist/src/backend/domains/ratchet/bridges.d.ts +1 -1
  83. package/dist/src/backend/domains/ratchet/bridges.d.ts.map +1 -1
  84. package/dist/src/backend/domains/ratchet/index.d.ts +2 -2
  85. package/dist/src/backend/domains/ratchet/index.d.ts.map +1 -1
  86. package/dist/src/backend/domains/ratchet/index.js +1 -1
  87. package/dist/src/backend/domains/ratchet/index.js.map +1 -1
  88. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts +10 -0
  89. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts.map +1 -1
  90. package/dist/src/backend/domains/ratchet/ratchet.service.js +69 -4
  91. package/dist/src/backend/domains/ratchet/ratchet.service.js.map +1 -1
  92. package/dist/src/backend/domains/ratchet/ratchet.service.test.js +229 -1
  93. package/dist/src/backend/domains/ratchet/ratchet.service.test.js.map +1 -1
  94. package/dist/src/backend/domains/run-script/index.d.ts +1 -1
  95. package/dist/src/backend/domains/run-script/index.d.ts.map +1 -1
  96. package/dist/src/backend/domains/run-script/index.js +1 -1
  97. package/dist/src/backend/domains/run-script/index.js.map +1 -1
  98. package/dist/src/backend/domains/run-script/run-script-domain-exports.test.js +5 -4
  99. package/dist/src/backend/domains/run-script/run-script-domain-exports.test.js.map +1 -1
  100. package/dist/src/backend/domains/run-script/run-script.service.d.ts +15 -1
  101. package/dist/src/backend/domains/run-script/run-script.service.d.ts.map +1 -1
  102. package/dist/src/backend/domains/run-script/run-script.service.js +174 -4
  103. package/dist/src/backend/domains/run-script/run-script.service.js.map +1 -1
  104. package/dist/src/backend/domains/run-script/run-script.service.test.js +128 -0
  105. package/dist/src/backend/domains/run-script/run-script.service.test.js.map +1 -1
  106. package/dist/src/backend/domains/run-script/startup-script.service.test.d.ts +2 -0
  107. package/dist/src/backend/domains/run-script/startup-script.service.test.d.ts.map +1 -0
  108. package/dist/src/backend/domains/run-script/startup-script.service.test.js +159 -0
  109. package/dist/src/backend/domains/run-script/startup-script.service.test.js.map +1 -0
  110. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts.map +1 -1
  111. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js +4 -1
  112. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js.map +1 -1
  113. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.d.ts +23 -0
  114. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.d.ts.map +1 -0
  115. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.js +76 -0
  116. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.js.map +1 -0
  117. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.d.ts +97 -0
  118. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.d.ts.map +1 -0
  119. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.js +2 -0
  120. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.js.map +1 -0
  121. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +3 -24
  122. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
  123. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +36 -1127
  124. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
  125. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +0 -191
  126. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -1
  127. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts +3 -3
  128. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.d.ts +16 -0
  129. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.d.ts.map +1 -0
  130. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.js +292 -0
  131. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.js.map +1 -0
  132. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.d.ts +2 -0
  133. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.d.ts.map +1 -0
  134. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.js +56 -0
  135. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.js.map +1 -0
  136. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.d.ts +19 -0
  137. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.d.ts.map +1 -0
  138. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.js +369 -0
  139. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.js.map +1 -0
  140. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.d.ts +2 -0
  141. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.d.ts.map +1 -0
  142. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.js +91 -0
  143. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.js.map +1 -0
  144. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.d.ts +53 -0
  145. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.d.ts.map +1 -0
  146. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.js +419 -0
  147. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.js.map +1 -0
  148. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.d.ts +2 -0
  149. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.d.ts.map +1 -0
  150. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.js +95 -0
  151. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.js.map +1 -0
  152. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.js +2 -2
  153. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.js.map +1 -1
  154. package/dist/src/backend/domains/session/acp/index.d.ts +1 -1
  155. package/dist/src/backend/domains/session/acp/index.d.ts.map +1 -1
  156. package/dist/src/backend/domains/session/acp/index.js +1 -1
  157. package/dist/src/backend/domains/session/acp/index.js.map +1 -1
  158. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/start.handler.d.ts.map +1 -1
  159. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/start.handler.js +15 -7
  160. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/start.handler.js.map +1 -1
  161. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/start.handler.test.js +1 -1
  162. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/start.handler.test.js.map +1 -1
  163. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.d.ts.map +1 -1
  164. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js +13 -2
  165. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js.map +1 -1
  166. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js +1 -1
  167. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js.map +1 -1
  168. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.d.ts.map +1 -1
  169. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js +19 -5
  170. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js.map +1 -1
  171. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts.map +1 -1
  172. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js +77 -24
  173. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js.map +1 -1
  174. package/dist/src/backend/domains/session/data/session-data.service.d.ts +2 -0
  175. package/dist/src/backend/domains/session/data/session-data.service.d.ts.map +1 -1
  176. package/dist/src/backend/domains/session/data/session-provider-resolver.service.d.ts +1 -0
  177. package/dist/src/backend/domains/session/data/session-provider-resolver.service.d.ts.map +1 -1
  178. package/dist/src/backend/domains/session/data/session-provider-resolver.service.js +6 -0
  179. package/dist/src/backend/domains/session/data/session-provider-resolver.service.js.map +1 -1
  180. package/dist/src/backend/domains/session/data/session-provider-resolver.service.test.js +2 -0
  181. package/dist/src/backend/domains/session/data/session-provider-resolver.service.test.js.map +1 -1
  182. package/dist/src/backend/domains/session/index.d.ts +3 -1
  183. package/dist/src/backend/domains/session/index.d.ts.map +1 -1
  184. package/dist/src/backend/domains/session/index.js +2 -1
  185. package/dist/src/backend/domains/session/index.js.map +1 -1
  186. package/dist/src/backend/domains/session/interceptor.bridge.d.ts +8 -0
  187. package/dist/src/backend/domains/session/interceptor.bridge.d.ts.map +1 -0
  188. package/dist/src/backend/domains/session/interceptor.bridge.js +7 -0
  189. package/dist/src/backend/domains/session/interceptor.bridge.js.map +1 -0
  190. package/dist/src/backend/domains/session/lifecycle/session.config.service.d.ts +59 -0
  191. package/dist/src/backend/domains/session/lifecycle/session.config.service.d.ts.map +1 -0
  192. package/dist/src/backend/domains/session/lifecycle/session.config.service.js +635 -0
  193. package/dist/src/backend/domains/session/lifecycle/session.config.service.js.map +1 -0
  194. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.d.ts +2 -0
  195. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.d.ts.map +1 -0
  196. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.js +552 -0
  197. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.js.map +1 -0
  198. package/dist/src/backend/domains/session/lifecycle/session.permission.service.d.ts +17 -0
  199. package/dist/src/backend/domains/session/lifecycle/session.permission.service.d.ts.map +1 -0
  200. package/dist/src/backend/domains/session/lifecycle/session.permission.service.js +86 -0
  201. package/dist/src/backend/domains/session/lifecycle/session.permission.service.js.map +1 -0
  202. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.d.ts +2 -0
  203. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.d.ts.map +1 -0
  204. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.js +137 -0
  205. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.js.map +1 -0
  206. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts +17 -25
  207. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts.map +1 -1
  208. package/dist/src/backend/domains/session/lifecycle/session.service.js +133 -556
  209. package/dist/src/backend/domains/session/lifecycle/session.service.js.map +1 -1
  210. package/dist/src/backend/domains/session/lifecycle/session.service.test.js +7 -540
  211. package/dist/src/backend/domains/session/lifecycle/session.service.test.js.map +1 -1
  212. package/dist/src/backend/domains/session/session-domain.service.d.ts +2 -3
  213. package/dist/src/backend/domains/session/session-domain.service.d.ts.map +1 -1
  214. package/dist/src/backend/domains/session/session-domain.service.js +15 -3
  215. package/dist/src/backend/domains/session/session-domain.service.js.map +1 -1
  216. package/dist/src/backend/domains/session/session-domain.service.test.js +113 -0
  217. package/dist/src/backend/domains/session/session-domain.service.test.js.map +1 -1
  218. package/dist/src/backend/domains/session/store/file-lock.service.d.ts.map +1 -1
  219. package/dist/src/backend/domains/session/store/file-lock.service.js +23 -2
  220. package/dist/src/backend/domains/session/store/file-lock.service.js.map +1 -1
  221. package/dist/src/backend/domains/session/store/session-runtime-machine.d.ts +1 -0
  222. package/dist/src/backend/domains/session/store/session-runtime-machine.d.ts.map +1 -1
  223. package/dist/src/backend/domains/session/store/session-runtime-machine.js +5 -2
  224. package/dist/src/backend/domains/session/store/session-runtime-machine.js.map +1 -1
  225. package/dist/src/backend/domains/session/store/session-runtime-machine.test.js +13 -0
  226. package/dist/src/backend/domains/session/store/session-runtime-machine.test.js.map +1 -1
  227. package/dist/src/backend/domains/session/zod-issue-summary.d.ts +3 -0
  228. package/dist/src/backend/domains/session/zod-issue-summary.d.ts.map +1 -0
  229. package/dist/src/backend/domains/session/zod-issue-summary.js +7 -0
  230. package/dist/src/backend/domains/session/zod-issue-summary.js.map +1 -0
  231. package/dist/src/backend/domains/workspace/index.d.ts +1 -0
  232. package/dist/src/backend/domains/workspace/index.d.ts.map +1 -1
  233. package/dist/src/backend/domains/workspace/index.js +1 -0
  234. package/dist/src/backend/domains/workspace/index.js.map +1 -1
  235. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.d.ts +10 -0
  236. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.d.ts.map +1 -0
  237. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.js +24 -0
  238. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.js.map +1 -0
  239. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.d.ts +2 -0
  240. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.d.ts.map +1 -0
  241. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.js +17 -0
  242. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.js.map +1 -0
  243. package/dist/src/backend/domains/workspace/lifecycle/creation.service.d.ts +10 -1
  244. package/dist/src/backend/domains/workspace/lifecycle/creation.service.d.ts.map +1 -1
  245. package/dist/src/backend/domains/workspace/lifecycle/creation.service.js +102 -87
  246. package/dist/src/backend/domains/workspace/lifecycle/creation.service.js.map +1 -1
  247. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js +48 -3
  248. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js.map +1 -1
  249. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts +59 -1
  250. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts.map +1 -1
  251. package/dist/src/backend/domains/workspace/lifecycle/data.service.js +10 -2
  252. package/dist/src/backend/domains/workspace/lifecycle/data.service.js.map +1 -1
  253. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts +2 -0
  254. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts.map +1 -1
  255. package/dist/src/backend/domains/workspace/query/user-settings-query.service.d.ts +2 -0
  256. package/dist/src/backend/domains/workspace/query/user-settings-query.service.d.ts.map +1 -1
  257. package/dist/src/backend/domains/workspace/query/user-settings-query.service.js.map +1 -1
  258. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts +6 -1
  259. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts.map +1 -1
  260. package/dist/src/backend/domains/workspace/query/workspace-query.service.js +23 -8
  261. package/dist/src/backend/domains/workspace/query/workspace-query.service.js.map +1 -1
  262. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js +324 -63
  263. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js.map +1 -1
  264. package/dist/src/backend/domains/workspace/state/flow-state.d.ts.map +1 -1
  265. package/dist/src/backend/domains/workspace/state/flow-state.js +9 -1
  266. package/dist/src/backend/domains/workspace/state/flow-state.js.map +1 -1
  267. package/dist/src/backend/domains/workspace/state/flow-state.test.js +22 -2
  268. package/dist/src/backend/domains/workspace/state/flow-state.test.js.map +1 -1
  269. package/dist/src/backend/domains/workspace/state/kanban-state.d.ts +2 -1
  270. package/dist/src/backend/domains/workspace/state/kanban-state.d.ts.map +1 -1
  271. package/dist/src/backend/domains/workspace/state/kanban-state.js +6 -3
  272. package/dist/src/backend/domains/workspace/state/kanban-state.js.map +1 -1
  273. package/dist/src/backend/domains/workspace/state/kanban-state.test.js +192 -202
  274. package/dist/src/backend/domains/workspace/state/kanban-state.test.js.map +1 -1
  275. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.d.ts +3 -6
  276. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.d.ts.map +1 -1
  277. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.js +7 -116
  278. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.js.map +1 -1
  279. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.test.js +38 -65
  280. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.test.js.map +1 -1
  281. package/dist/src/backend/interceptors/branch-rename.interceptor.test.d.ts +2 -0
  282. package/dist/src/backend/interceptors/branch-rename.interceptor.test.d.ts.map +1 -0
  283. package/dist/src/backend/interceptors/branch-rename.interceptor.test.js +79 -0
  284. package/dist/src/backend/interceptors/branch-rename.interceptor.test.js.map +1 -0
  285. package/dist/src/backend/interceptors/branch-rename.utils.d.ts +8 -0
  286. package/dist/src/backend/interceptors/branch-rename.utils.d.ts.map +1 -0
  287. package/dist/src/backend/interceptors/branch-rename.utils.js +34 -0
  288. package/dist/src/backend/interceptors/branch-rename.utils.js.map +1 -0
  289. package/dist/src/backend/interceptors/conversation-rename.interceptor.d.ts.map +1 -1
  290. package/dist/src/backend/interceptors/conversation-rename.interceptor.js +6 -4
  291. package/dist/src/backend/interceptors/conversation-rename.interceptor.js.map +1 -1
  292. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.d.ts +2 -0
  293. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.d.ts.map +1 -0
  294. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js +116 -0
  295. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js.map +1 -0
  296. package/dist/src/backend/interceptors/index.d.ts.map +1 -1
  297. package/dist/src/backend/interceptors/index.js +4 -0
  298. package/dist/src/backend/interceptors/index.js.map +1 -1
  299. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.d.ts +5 -0
  300. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.d.ts.map +1 -0
  301. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.js +211 -0
  302. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.js.map +1 -0
  303. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.d.ts +2 -0
  304. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.d.ts.map +1 -0
  305. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.js +304 -0
  306. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.js.map +1 -0
  307. package/dist/src/backend/interceptors/pre-push-rename.interceptor.d.ts +3 -0
  308. package/dist/src/backend/interceptors/pre-push-rename.interceptor.d.ts.map +1 -0
  309. package/dist/src/backend/interceptors/pre-push-rename.interceptor.js +81 -0
  310. package/dist/src/backend/interceptors/pre-push-rename.interceptor.js.map +1 -0
  311. package/dist/src/backend/interceptors/pre-push-rename.interceptor.test.d.ts +2 -0
  312. package/dist/src/backend/interceptors/pre-push-rename.interceptor.test.d.ts.map +1 -0
  313. package/dist/src/backend/interceptors/pre-push-rename.interceptor.test.js +130 -0
  314. package/dist/src/backend/interceptors/pre-push-rename.interceptor.test.js.map +1 -0
  315. package/dist/src/backend/lib/file-helpers.d.ts +2 -0
  316. package/dist/src/backend/lib/file-helpers.d.ts.map +1 -1
  317. package/dist/src/backend/lib/file-helpers.js +64 -1
  318. package/dist/src/backend/lib/file-helpers.js.map +1 -1
  319. package/dist/src/backend/lib/git-status-parser.test.d.ts +2 -0
  320. package/dist/src/backend/lib/git-status-parser.test.d.ts.map +1 -0
  321. package/dist/src/backend/{trpc/workspace.trpc.test.js → lib/git-status-parser.test.js} +1 -1
  322. package/dist/src/backend/lib/git-status-parser.test.js.map +1 -0
  323. package/dist/src/backend/lib/provider-cli-availability.d.ts +15 -0
  324. package/dist/src/backend/lib/provider-cli-availability.d.ts.map +1 -0
  325. package/dist/src/backend/lib/provider-cli-availability.js +26 -0
  326. package/dist/src/backend/lib/provider-cli-availability.js.map +1 -0
  327. package/dist/src/backend/lib/provider-cli-availability.test.d.ts +2 -0
  328. package/dist/src/backend/lib/provider-cli-availability.test.d.ts.map +1 -0
  329. package/dist/src/backend/lib/provider-cli-availability.test.js +39 -0
  330. package/dist/src/backend/lib/provider-cli-availability.test.js.map +1 -0
  331. package/dist/src/backend/lib/session-summaries.d.ts.map +1 -1
  332. package/dist/src/backend/lib/session-summaries.js +1 -0
  333. package/dist/src/backend/lib/session-summaries.js.map +1 -1
  334. package/dist/src/backend/middleware/cors.middleware.d.ts +1 -2
  335. package/dist/src/backend/middleware/cors.middleware.d.ts.map +1 -1
  336. package/dist/src/backend/middleware/cors.middleware.js +0 -2
  337. package/dist/src/backend/middleware/cors.middleware.js.map +1 -1
  338. package/dist/src/backend/middleware/index.d.ts +1 -1
  339. package/dist/src/backend/middleware/index.d.ts.map +1 -1
  340. package/dist/src/backend/middleware/index.js +1 -1
  341. package/dist/src/backend/middleware/index.js.map +1 -1
  342. package/dist/src/backend/orchestration/cli-health.service.d.ts +18 -0
  343. package/dist/src/backend/orchestration/cli-health.service.d.ts.map +1 -1
  344. package/dist/src/backend/orchestration/cli-health.service.js +106 -3
  345. package/dist/src/backend/orchestration/cli-health.service.js.map +1 -1
  346. package/dist/src/backend/orchestration/cli-health.service.test.js +22 -0
  347. package/dist/src/backend/orchestration/cli-health.service.test.js.map +1 -1
  348. package/dist/src/backend/orchestration/data-backup.service.d.ts.map +1 -1
  349. package/dist/src/backend/orchestration/data-backup.service.js +4 -0
  350. package/dist/src/backend/orchestration/data-backup.service.js.map +1 -1
  351. package/dist/src/backend/orchestration/data-backup.service.test.js +7 -0
  352. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  353. package/dist/src/backend/orchestration/decision-log-query.service.test.d.ts +2 -0
  354. package/dist/src/backend/orchestration/decision-log-query.service.test.d.ts.map +1 -0
  355. package/dist/src/backend/orchestration/decision-log-query.service.test.js +44 -0
  356. package/dist/src/backend/orchestration/decision-log-query.service.test.js.map +1 -0
  357. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts +26 -1
  358. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
  359. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +21 -1
  360. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
  361. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts +13 -2
  362. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
  363. package/dist/src/backend/orchestration/event-collector.orchestrator.js +111 -20
  364. package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
  365. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js +115 -14
  366. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js.map +1 -1
  367. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts +6 -2
  368. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts.map +1 -1
  369. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js +8 -3
  370. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js.map +1 -1
  371. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +19 -1
  372. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  373. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +44 -40
  374. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
  375. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +59 -48
  376. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
  377. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  378. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +124 -64
  379. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  380. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +62 -2
  381. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js.map +1 -1
  382. package/dist/src/backend/prompts/quick-actions.test.d.ts +2 -0
  383. package/dist/src/backend/prompts/quick-actions.test.d.ts.map +1 -0
  384. package/dist/src/backend/prompts/quick-actions.test.js +59 -0
  385. package/dist/src/backend/prompts/quick-actions.test.js.map +1 -0
  386. package/dist/src/backend/prompts/ratchet-dispatch.d.ts.map +1 -1
  387. package/dist/src/backend/prompts/ratchet-dispatch.js +3 -1
  388. package/dist/src/backend/prompts/ratchet-dispatch.js.map +1 -1
  389. package/dist/src/backend/resource_accessors/user-settings.accessor.d.ts +3 -1
  390. package/dist/src/backend/resource_accessors/user-settings.accessor.d.ts.map +1 -1
  391. package/dist/src/backend/resource_accessors/user-settings.accessor.js +4 -0
  392. package/dist/src/backend/resource_accessors/user-settings.accessor.js.map +1 -1
  393. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +1 -0
  394. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -1
  395. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -1
  396. package/dist/src/backend/routers/websocket/chat.handler.test.js +162 -43
  397. package/dist/src/backend/routers/websocket/chat.handler.test.js.map +1 -1
  398. package/dist/src/backend/routers/websocket/index.d.ts +2 -0
  399. package/dist/src/backend/routers/websocket/index.d.ts.map +1 -1
  400. package/dist/src/backend/routers/websocket/index.js +2 -0
  401. package/dist/src/backend/routers/websocket/index.js.map +1 -1
  402. package/dist/src/backend/routers/websocket/post-run-logs.handler.d.ts +9 -0
  403. package/dist/src/backend/routers/websocket/post-run-logs.handler.d.ts.map +1 -0
  404. package/dist/src/backend/routers/websocket/post-run-logs.handler.js +52 -0
  405. package/dist/src/backend/routers/websocket/post-run-logs.handler.js.map +1 -0
  406. package/dist/src/backend/routers/websocket/setup-terminal.handler.d.ts +6 -0
  407. package/dist/src/backend/routers/websocket/setup-terminal.handler.d.ts.map +1 -0
  408. package/dist/src/backend/routers/websocket/setup-terminal.handler.js +108 -0
  409. package/dist/src/backend/routers/websocket/setup-terminal.handler.js.map +1 -0
  410. package/dist/src/backend/routers/websocket/terminal.handler.test.js +166 -0
  411. package/dist/src/backend/routers/websocket/terminal.handler.test.js.map +1 -1
  412. package/dist/src/backend/server.d.ts.map +1 -1
  413. package/dist/src/backend/server.js +16 -4
  414. package/dist/src/backend/server.js.map +1 -1
  415. package/dist/src/backend/server.upgrade.test.js +4 -0
  416. package/dist/src/backend/server.upgrade.test.js.map +1 -1
  417. package/dist/src/backend/services/config.service.d.ts +2 -0
  418. package/dist/src/backend/services/config.service.d.ts.map +1 -1
  419. package/dist/src/backend/services/config.service.js +4 -0
  420. package/dist/src/backend/services/config.service.js.map +1 -1
  421. package/dist/src/backend/services/constants.d.ts +4 -0
  422. package/dist/src/backend/services/constants.d.ts.map +1 -1
  423. package/dist/src/backend/services/constants.js +4 -0
  424. package/dist/src/backend/services/constants.js.map +1 -1
  425. package/dist/src/backend/services/env-schemas.d.ts +1 -0
  426. package/dist/src/backend/services/env-schemas.d.ts.map +1 -1
  427. package/dist/src/backend/services/env-schemas.js +1 -0
  428. package/dist/src/backend/services/env-schemas.js.map +1 -1
  429. package/dist/src/backend/services/factory-config.service.test.d.ts +2 -0
  430. package/dist/src/backend/services/factory-config.service.test.d.ts.map +1 -0
  431. package/dist/src/backend/{trpc/project.trpc.test.js → services/factory-config.service.test.js} +1 -1
  432. package/dist/src/backend/services/factory-config.service.test.js.map +1 -0
  433. package/dist/src/backend/services/git-clone.service.d.ts +23 -0
  434. package/dist/src/backend/services/git-clone.service.d.ts.map +1 -0
  435. package/dist/src/backend/services/git-clone.service.js +67 -0
  436. package/dist/src/backend/services/git-clone.service.js.map +1 -0
  437. package/dist/src/backend/services/git-ops.service.test.d.ts +2 -0
  438. package/dist/src/backend/services/git-ops.service.test.d.ts.map +1 -0
  439. package/dist/src/backend/services/git-ops.service.test.js +133 -0
  440. package/dist/src/backend/services/git-ops.service.test.js.map +1 -0
  441. package/dist/src/backend/services/notification.service.test.d.ts +2 -0
  442. package/dist/src/backend/services/notification.service.test.d.ts.map +1 -0
  443. package/dist/src/backend/services/notification.service.test.js +118 -0
  444. package/dist/src/backend/services/notification.service.test.js.map +1 -0
  445. package/dist/src/backend/services/rate-limiter.service.test.d.ts +2 -0
  446. package/dist/src/backend/services/rate-limiter.service.test.d.ts.map +1 -0
  447. package/dist/src/backend/services/rate-limiter.service.test.js +92 -0
  448. package/dist/src/backend/services/rate-limiter.service.test.js.map +1 -0
  449. package/dist/src/backend/services/run-script-proxy.service.d.ts +12 -0
  450. package/dist/src/backend/services/run-script-proxy.service.d.ts.map +1 -0
  451. package/dist/src/backend/services/run-script-proxy.service.js +210 -0
  452. package/dist/src/backend/services/run-script-proxy.service.js.map +1 -0
  453. package/dist/src/backend/services/run-script-proxy.service.test.d.ts +2 -0
  454. package/dist/src/backend/services/run-script-proxy.service.test.d.ts.map +1 -0
  455. package/dist/src/backend/services/run-script-proxy.service.test.js +133 -0
  456. package/dist/src/backend/services/run-script-proxy.service.test.js.map +1 -0
  457. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts +2 -0
  458. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts.map +1 -1
  459. package/dist/src/backend/services/workspace-snapshot-store.service.js +8 -4
  460. package/dist/src/backend/services/workspace-snapshot-store.service.js.map +1 -1
  461. package/dist/src/backend/trpc/admin.router.test.d.ts +2 -0
  462. package/dist/src/backend/trpc/admin.router.test.d.ts.map +1 -0
  463. package/dist/src/backend/trpc/admin.router.test.js +238 -0
  464. package/dist/src/backend/trpc/admin.router.test.js.map +1 -0
  465. package/dist/src/backend/trpc/admin.trpc.d.ts +18 -0
  466. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  467. package/dist/src/backend/trpc/admin.trpc.js +20 -2
  468. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  469. package/dist/src/backend/trpc/decision-log.router.test.d.ts +2 -0
  470. package/dist/src/backend/trpc/decision-log.router.test.d.ts.map +1 -0
  471. package/dist/src/backend/trpc/decision-log.router.test.js +37 -0
  472. package/dist/src/backend/trpc/decision-log.router.test.js.map +1 -0
  473. package/dist/src/backend/trpc/github.router.test.d.ts +2 -0
  474. package/dist/src/backend/trpc/github.router.test.d.ts.map +1 -0
  475. package/dist/src/backend/trpc/github.router.test.js +89 -0
  476. package/dist/src/backend/trpc/github.router.test.js.map +1 -0
  477. package/dist/src/backend/trpc/index.d.ts +127 -1
  478. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  479. package/dist/src/backend/trpc/linear.router.test.d.ts +2 -0
  480. package/dist/src/backend/trpc/linear.router.test.d.ts.map +1 -0
  481. package/dist/src/backend/trpc/linear.router.test.js +101 -0
  482. package/dist/src/backend/trpc/linear.router.test.js.map +1 -0
  483. package/dist/src/backend/trpc/pr-review.router.test.d.ts +2 -0
  484. package/dist/src/backend/trpc/pr-review.router.test.d.ts.map +1 -0
  485. package/dist/src/backend/trpc/pr-review.router.test.js +86 -0
  486. package/dist/src/backend/trpc/pr-review.router.test.js.map +1 -0
  487. package/dist/src/backend/trpc/procedures/project-scoped.test.d.ts +2 -0
  488. package/dist/src/backend/trpc/procedures/project-scoped.test.d.ts.map +1 -0
  489. package/dist/src/backend/trpc/procedures/project-scoped.test.js +17 -0
  490. package/dist/src/backend/trpc/procedures/project-scoped.test.js.map +1 -0
  491. package/dist/src/backend/trpc/project.router.test.d.ts +2 -0
  492. package/dist/src/backend/trpc/project.router.test.d.ts.map +1 -0
  493. package/dist/src/backend/trpc/project.router.test.js +151 -0
  494. package/dist/src/backend/trpc/project.router.test.js.map +1 -0
  495. package/dist/src/backend/trpc/project.trpc.d.ts +50 -0
  496. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  497. package/dist/src/backend/trpc/project.trpc.js +68 -0
  498. package/dist/src/backend/trpc/project.trpc.js.map +1 -1
  499. package/dist/src/backend/trpc/session.router.test.d.ts +2 -0
  500. package/dist/src/backend/trpc/session.router.test.d.ts.map +1 -0
  501. package/dist/src/backend/trpc/session.router.test.js +163 -0
  502. package/dist/src/backend/trpc/session.router.test.js.map +1 -0
  503. package/dist/src/backend/trpc/session.trpc.d.ts +4 -0
  504. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  505. package/dist/src/backend/trpc/session.trpc.js +11 -2
  506. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  507. package/dist/src/backend/trpc/user-settings.router.test.d.ts +2 -0
  508. package/dist/src/backend/trpc/user-settings.router.test.d.ts.map +1 -0
  509. package/dist/src/backend/trpc/user-settings.router.test.js +60 -0
  510. package/dist/src/backend/trpc/user-settings.router.test.js.map +1 -0
  511. package/dist/src/backend/trpc/user-settings.trpc.d.ts +7 -1
  512. package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -1
  513. package/dist/src/backend/trpc/user-settings.trpc.js +3 -1
  514. package/dist/src/backend/trpc/user-settings.trpc.js.map +1 -1
  515. package/dist/src/backend/trpc/workspace/files.router.test.d.ts +2 -0
  516. package/dist/src/backend/trpc/workspace/files.router.test.d.ts.map +1 -0
  517. package/dist/src/backend/trpc/workspace/files.router.test.js +117 -0
  518. package/dist/src/backend/trpc/workspace/files.router.test.js.map +1 -0
  519. package/dist/src/backend/trpc/workspace/files.trpc.d.ts.map +1 -1
  520. package/dist/src/backend/trpc/workspace/files.trpc.js +1 -64
  521. package/dist/src/backend/trpc/workspace/files.trpc.js.map +1 -1
  522. package/dist/src/backend/trpc/workspace/git.router.test.d.ts +2 -0
  523. package/dist/src/backend/trpc/workspace/git.router.test.d.ts.map +1 -0
  524. package/dist/src/backend/trpc/workspace/git.router.test.js +130 -0
  525. package/dist/src/backend/trpc/workspace/git.router.test.js.map +1 -0
  526. package/dist/src/backend/trpc/workspace/ide.router.test.d.ts +2 -0
  527. package/dist/src/backend/trpc/workspace/ide.router.test.d.ts.map +1 -0
  528. package/dist/src/backend/trpc/workspace/ide.router.test.js +71 -0
  529. package/dist/src/backend/trpc/workspace/ide.router.test.js.map +1 -0
  530. package/dist/src/backend/trpc/workspace/init.router.test.d.ts +2 -0
  531. package/dist/src/backend/trpc/workspace/init.router.test.d.ts.map +1 -0
  532. package/dist/src/backend/trpc/workspace/init.router.test.js +136 -0
  533. package/dist/src/backend/trpc/workspace/init.router.test.js.map +1 -0
  534. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +1 -0
  535. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  536. package/dist/src/backend/trpc/workspace/init.trpc.js +2 -3
  537. package/dist/src/backend/trpc/workspace/init.trpc.js.map +1 -1
  538. package/dist/src/backend/trpc/workspace/run-script.router.test.d.ts +2 -0
  539. package/dist/src/backend/trpc/workspace/run-script.router.test.d.ts.map +1 -0
  540. package/dist/src/backend/trpc/workspace/run-script.router.test.js +106 -0
  541. package/dist/src/backend/trpc/workspace/run-script.router.test.js.map +1 -0
  542. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts +4 -0
  543. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts.map +1 -1
  544. package/dist/src/backend/trpc/workspace/run-script.trpc.js +2 -1
  545. package/dist/src/backend/trpc/workspace/run-script.trpc.js.map +1 -1
  546. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +2 -0
  547. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  548. package/dist/src/backend/trpc/workspace/workspace-helpers.test.d.ts +2 -0
  549. package/dist/src/backend/trpc/workspace/workspace-helpers.test.d.ts.map +1 -0
  550. package/dist/src/backend/trpc/workspace/workspace-helpers.test.js +54 -0
  551. package/dist/src/backend/trpc/workspace/workspace-helpers.test.js.map +1 -0
  552. package/dist/src/backend/trpc/workspace.router.test.d.ts +2 -0
  553. package/dist/src/backend/trpc/workspace.router.test.d.ts.map +1 -0
  554. package/dist/src/backend/trpc/workspace.router.test.js +267 -0
  555. package/dist/src/backend/trpc/workspace.router.test.js.map +1 -0
  556. package/dist/src/backend/trpc/workspace.trpc.d.ts +55 -7
  557. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  558. package/dist/src/backend/trpc/workspace.trpc.js +62 -3
  559. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  560. package/dist/src/cli/index.js +12 -3
  561. package/dist/src/cli/index.js.map +1 -1
  562. package/dist/src/cli/proxy.d.ts +7 -19
  563. package/dist/src/cli/proxy.d.ts.map +1 -1
  564. package/dist/src/cli/proxy.js +63 -292
  565. package/dist/src/cli/proxy.js.map +1 -1
  566. package/dist/src/cli/proxy.test.js +27 -0
  567. package/dist/src/cli/proxy.test.js.map +1 -1
  568. package/dist/src/shared/chat-capabilities.d.ts +1 -0
  569. package/dist/src/shared/chat-capabilities.d.ts.map +1 -1
  570. package/dist/src/shared/chat-capabilities.js +24 -0
  571. package/dist/src/shared/chat-capabilities.js.map +1 -1
  572. package/dist/src/shared/github-types.d.ts +1 -1
  573. package/dist/src/shared/github-types.d.ts.map +1 -1
  574. package/dist/src/shared/proxy-utils.d.ts +61 -0
  575. package/dist/src/shared/proxy-utils.d.ts.map +1 -0
  576. package/dist/src/shared/proxy-utils.js +334 -0
  577. package/dist/src/shared/proxy-utils.js.map +1 -0
  578. package/dist/src/shared/schemas/export-data.schema.d.ts +20 -0
  579. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  580. package/dist/src/shared/schemas/export-data.schema.js +3 -0
  581. package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
  582. package/dist/src/shared/schemas/factory-config.schema.d.ts +1 -0
  583. package/dist/src/shared/schemas/factory-config.schema.d.ts.map +1 -1
  584. package/dist/src/shared/schemas/factory-config.schema.js +1 -0
  585. package/dist/src/shared/schemas/factory-config.schema.js.map +1 -1
  586. package/dist/src/shared/schemas/persisted-stores.schema.d.ts +0 -2
  587. package/dist/src/shared/schemas/persisted-stores.schema.d.ts.map +1 -1
  588. package/dist/src/shared/schemas/persisted-stores.schema.js +0 -1
  589. package/dist/src/shared/schemas/persisted-stores.schema.js.map +1 -1
  590. package/dist/src/shared/session-runtime.d.ts +8 -0
  591. package/dist/src/shared/session-runtime.d.ts.map +1 -1
  592. package/dist/src/shared/session-runtime.js +40 -0
  593. package/dist/src/shared/session-runtime.js.map +1 -1
  594. package/dist/src/shared/workspace-words.d.ts +1 -0
  595. package/dist/src/shared/workspace-words.d.ts.map +1 -1
  596. package/dist/src/shared/workspace-words.js +77 -0
  597. package/dist/src/shared/workspace-words.js.map +1 -1
  598. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  599. package/package.json +10 -6
  600. package/prisma/migrations/20260220110000_add_user_permission_presets/migration.sql +2 -0
  601. package/prisma/migrations/20260222120000_add_post_run_command/migration.sql +1 -0
  602. package/prisma/schema.prisma +9 -0
  603. package/prompts/ratchet/dispatch.md +5 -2
  604. package/prompts/workflows/pr-review-fix.md +2 -1
  605. package/dist/client/assets/arc-Dq49BrkB.js +0 -1
  606. package/dist/client/assets/architectureDiagram-VXUJARFQ-BGubq_o9.js +0 -36
  607. package/dist/client/assets/channel-DMaON2vY.js +0 -1
  608. package/dist/client/assets/chunk-QN33PNHL-BMmRcEqx.js +0 -1
  609. package/dist/client/assets/chunk-TZMSLE5B-BhRzmVVB.js +0 -1
  610. package/dist/client/assets/classDiagram-2ON5EDUG-BKODUnN9.js +0 -1
  611. package/dist/client/assets/classDiagram-v2-WZHVMYZB-BKODUnN9.js +0 -1
  612. package/dist/client/assets/clone-d5fivKBG.js +0 -1
  613. package/dist/client/assets/diagram-PSM6KHXK-CRE7v2e7.js +0 -24
  614. package/dist/client/assets/diagram-QEK2KX5R-DpAOzBlm.js +0 -43
  615. package/dist/client/assets/diagram-S2PKOQOG-BOJvuhJd.js +0 -24
  616. package/dist/client/assets/gitGraphDiagram-V2S2FVAM-Cd1j3VMN.js +0 -65
  617. package/dist/client/assets/index-BXRnTMjJ.js +0 -448
  618. package/dist/client/assets/index-DllMnbgu.css +0 -1
  619. package/dist/client/assets/infoDiagram-HS3SLOUP-CzpZPq7Y.js +0 -2
  620. package/dist/client/assets/mobile-baseline-BHP-K4kd.js +0 -10
  621. package/dist/client/assets/pieDiagram-ADFJNKIX-DG-umOTY.js +0 -30
  622. package/dist/client/assets/sankeyDiagram-TZEHDZUN-DkR9L4Vw.js +0 -10
  623. package/dist/client/assets/stateDiagram-FKZM4ZOC-DQWCRtS7.js +0 -1
  624. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DoWi8XaX.js +0 -1
  625. package/dist/client/assets/terminal-instance-CpEqekOB.js +0 -1
  626. package/dist/src/backend/trpc/project.trpc.test.d.ts +0 -2
  627. package/dist/src/backend/trpc/project.trpc.test.d.ts.map +0 -1
  628. package/dist/src/backend/trpc/project.trpc.test.js.map +0 -1
  629. package/dist/src/backend/trpc/workspace.trpc.test.d.ts +0 -2
  630. package/dist/src/backend/trpc/workspace.trpc.test.d.ts.map +0 -1
  631. package/dist/src/backend/trpc/workspace.trpc.test.js.map +0 -1
@@ -1,23 +1,34 @@
1
- import { AcpEventTranslator, AcpPermissionBridge, acpRuntimeManager, } from '../../../../backend/domains/session/acp/index.js';
1
+ import { AcpEventTranslator, acpRuntimeManager, } from '../../../../backend/domains/session/acp/index.js';
2
2
  import { acpTraceLogger } from '../../../../backend/domains/session/logging/acp-trace-logger.service.js';
3
3
  import { sessionFileLogger } from '../../../../backend/domains/session/logging/session-file-logger.service.js';
4
- import { sessionDomainService } from '../../../../backend/domains/session/session-domain.service.js';
4
+ import { sessionDomainService, } from '../../../../backend/domains/session/session-domain.service.js';
5
5
  import { interceptorRegistry } from '../../../../backend/interceptors/registry.js';
6
6
  import { createLogger } from '../../../../backend/services/logger.service.js';
7
- import { extractPlanText } from '../../../../shared/acp-protocol/plan-content.js';
8
- import { EMPTY_CHAT_BAR_CAPABILITIES } from '../../../../shared/chat-capabilities.js';
9
7
  import { SessionStatus } from '../../../../shared/core/index.js';
10
- import { isUserQuestionRequest } from '../../../../shared/pending-request-types.js';
11
8
  import { createInitialSessionRuntimeState, } from '../../../../shared/session-runtime.js';
9
+ import { SessionConfigService, } from './session.config.service.js';
10
+ import { SessionPermissionService } from './session.permission.service.js';
12
11
  import { sessionPromptBuilder } from './session.prompt-builder.js';
13
12
  import { sessionRepository } from './session.repository.js';
14
13
  const logger = createLogger('session');
15
14
  const STALE_LOADING_RUNTIME_MAX_AGE_MS = 30_000;
16
- class SessionService {
15
+ function toErrorMessage(error) {
16
+ if (error instanceof Error) {
17
+ return error.message;
18
+ }
19
+ if (typeof error === 'object') {
20
+ return JSON.stringify(error);
21
+ }
22
+ return String(error);
23
+ }
24
+ export class SessionService {
17
25
  repository;
18
26
  promptBuilder;
27
+ runtimeManager;
28
+ sessionDomainService;
19
29
  acpEventTranslator = new AcpEventTranslator(logger);
20
- acpPermissionBridges = new Map();
30
+ sessionPermissionService;
31
+ sessionConfigService;
21
32
  acpStreamState = new Map();
22
33
  pendingAcpToolCalls = new Map();
23
34
  suppressAcpReplayForSession = new Set();
@@ -42,10 +53,9 @@ class SessionService {
42
53
  return Date.now() - updatedAtMs > STALE_LOADING_RUNTIME_MAX_AGE_MS;
43
54
  }
44
55
  setupAcpEventHandler(sessionId) {
45
- const bridge = new AcpPermissionBridge();
46
- this.acpPermissionBridges.set(sessionId, bridge);
56
+ const permissionBridge = this.sessionPermissionService.createPermissionBridge(sessionId);
47
57
  return {
48
- permissionBridge: bridge,
58
+ permissionBridge,
49
59
  onAcpEvent: (sid, event) => {
50
60
  const typed = event;
51
61
  if (typed.type === 'acp_session_update') {
@@ -72,7 +82,7 @@ class SessionService {
72
82
  return;
73
83
  }
74
84
  if (typed.type === 'acp_permission_request') {
75
- this.handleAcpPermissionRequest(sid, event);
85
+ this.sessionPermissionService.handlePermissionRequest(sid, event);
76
86
  return;
77
87
  }
78
88
  },
@@ -102,14 +112,10 @@ class SessionService {
102
112
  this.suppressAcpReplayForSession.delete(sid);
103
113
  this.sessionToWorkspace.delete(sid);
104
114
  this.sessionToWorkingDir.delete(sid);
105
- const b = this.acpPermissionBridges.get(sid);
106
- if (b) {
107
- b.cancelAll();
108
- this.acpPermissionBridges.delete(sid);
109
- }
115
+ this.sessionPermissionService.cancelPendingRequests(sid);
110
116
  acpTraceLogger.log(sid, 'runtime_exit', { exitCode });
111
117
  try {
112
- sessionDomainService.markProcessExit(sid, exitCode);
118
+ this.sessionDomainService.markProcessExit(sid, exitCode);
113
119
  const session = await this.repository.updateSession(sid, {
114
120
  status: SessionStatus.COMPLETED,
115
121
  });
@@ -135,6 +141,7 @@ class SessionService {
135
141
  message: error.message,
136
142
  stack: error.stack,
137
143
  });
144
+ this.sessionDomainService.markError(sid, error.message);
138
145
  logger.error('ACP client error', {
139
146
  sessionId: sid,
140
147
  error: error.message,
@@ -156,25 +163,15 @@ class SessionService {
156
163
  }
157
164
  this.trackPendingAcpToolCalls(sid, delta);
158
165
  if (delta.type === 'config_options_update') {
159
- const acpHandle = acpRuntimeManager.getClient(sid);
166
+ const acpHandle = this.runtimeManager.getClient(sid);
160
167
  if (acpHandle) {
161
168
  const { configOptions } = delta;
162
- acpHandle.configOptions = configOptions;
163
- void this.persistAcpConfigSnapshot(sid, {
164
- provider: acpHandle.provider,
165
- providerSessionId: acpHandle.providerSessionId,
166
- configOptions: acpHandle.configOptions,
167
- });
168
- sessionDomainService.emitDelta(sid, delta);
169
- sessionDomainService.emitDelta(sid, {
170
- type: 'chat_capabilities',
171
- capabilities: this.buildAcpChatBarCapabilities(acpHandle),
172
- });
169
+ this.sessionConfigService.applyConfigOptionsUpdateDelta(sid, acpHandle, configOptions);
173
170
  return;
174
171
  }
175
172
  }
176
173
  if (delta.type !== 'agent_message') {
177
- sessionDomainService.emitDelta(sid, delta);
174
+ this.sessionDomainService.emitDelta(sid, delta);
178
175
  return;
179
176
  }
180
177
  const data = delta.data;
@@ -183,8 +180,8 @@ class SessionService {
183
180
  return;
184
181
  }
185
182
  this.acpStreamState.delete(sid);
186
- const order = sessionDomainService.appendClaudeEvent(sid, data);
187
- sessionDomainService.emitDelta(sid, { ...delta, order });
183
+ const order = this.sessionDomainService.appendClaudeEvent(sid, data);
184
+ this.sessionDomainService.emitDelta(sid, { ...delta, order });
188
185
  }
189
186
  trackPendingAcpToolCalls(sid, delta) {
190
187
  if (delta.type === 'agent_message') {
@@ -418,14 +415,14 @@ class SessionService {
418
415
  if (this.suppressAcpReplayForSession.has(sid)) {
419
416
  return;
420
417
  }
421
- if (acpRuntimeManager.isSessionWorking(sid)) {
418
+ if (this.runtimeManager.isSessionWorking(sid)) {
422
419
  return;
423
420
  }
424
421
  const normalized = text.trim();
425
422
  if (normalized.length === 0) {
426
423
  return;
427
424
  }
428
- sessionDomainService.injectCommittedUserMessage(sid, normalized);
425
+ this.sessionDomainService.injectCommittedUserMessage(sid, normalized);
429
426
  }
430
427
  accumulateAcpText(sid, data) {
431
428
  const content = data.message?.content;
@@ -434,7 +431,7 @@ class SessionService {
434
431
  : '';
435
432
  let ss = this.acpStreamState.get(sid);
436
433
  if (!ss) {
437
- ss = { textOrder: sessionDomainService.allocateOrder(sid), accText: '' };
434
+ ss = { textOrder: this.sessionDomainService.allocateOrder(sid), accText: '' };
438
435
  this.acpStreamState.set(sid, ss);
439
436
  }
440
437
  ss.accText += chunkText;
@@ -442,67 +439,13 @@ class SessionService {
442
439
  type: 'assistant',
443
440
  message: { role: 'assistant', content: [{ type: 'text', text: ss.accText }] },
444
441
  };
445
- sessionDomainService.upsertClaudeEvent(sid, accMsg, ss.textOrder);
446
- sessionDomainService.emitDelta(sid, {
442
+ this.sessionDomainService.upsertClaudeEvent(sid, accMsg, ss.textOrder);
443
+ this.sessionDomainService.emitDelta(sid, {
447
444
  type: 'agent_message',
448
445
  data: accMsg,
449
446
  order: ss.textOrder,
450
447
  });
451
448
  }
452
- handleAcpPermissionRequest(sid, event) {
453
- const { requestId, params } = event;
454
- const toolName = params.toolCall.title ?? 'ACP Tool';
455
- const toolInput = params.toolCall.rawInput ?? {};
456
- const acpOptions = params.options.map((o) => ({
457
- optionId: o.optionId,
458
- name: o.name,
459
- kind: o.kind,
460
- }));
461
- const planContent = this.extractPlanContent(toolName, toolInput);
462
- if (isUserQuestionRequest({ toolName, input: toolInput })) {
463
- const questions = this.extractAskUserQuestions(toolInput);
464
- sessionDomainService.emitDelta(sid, {
465
- type: 'user_question',
466
- requestId,
467
- toolName,
468
- questions,
469
- acpOptions,
470
- });
471
- }
472
- else {
473
- sessionDomainService.emitDelta(sid, {
474
- type: 'permission_request',
475
- requestId,
476
- toolName,
477
- toolUseId: params.toolCall.toolCallId,
478
- toolInput,
479
- planContent,
480
- acpOptions,
481
- });
482
- }
483
- sessionDomainService.setPendingInteractiveRequest(sid, {
484
- requestId,
485
- toolName,
486
- toolUseId: params.toolCall.toolCallId,
487
- input: toolInput,
488
- planContent,
489
- acpOptions,
490
- timestamp: new Date().toISOString(),
491
- });
492
- }
493
- extractAskUserQuestions(input) {
494
- const questions = input.questions;
495
- if (!Array.isArray(questions)) {
496
- return [];
497
- }
498
- return questions;
499
- }
500
- extractPlanContent(toolName, input) {
501
- if (toolName !== 'ExitPlanMode') {
502
- return null;
503
- }
504
- return extractPlanText(input.plan);
505
- }
506
449
  async createAcpClient(sessionId, options, session) {
507
450
  const sessionContext = await this.loadSessionContext(sessionId, session);
508
451
  if (!sessionContext) {
@@ -530,7 +473,7 @@ class SessionService {
530
473
  };
531
474
  let handle;
532
475
  try {
533
- handle = await acpRuntimeManager.getOrCreateClient(sessionId, clientOptions, handlers, {
476
+ handle = await this.runtimeManager.getOrCreateClient(sessionId, clientOptions, handlers, {
534
477
  workspaceId: sessionContext.workspaceId,
535
478
  workingDir: sessionContext.workingDir,
536
479
  });
@@ -548,12 +491,12 @@ class SessionService {
548
491
  existingMetadata: session?.providerMetadata ?? undefined,
549
492
  });
550
493
  if (handle.configOptions.length > 0) {
551
- sessionDomainService.emitDelta(sessionId, {
494
+ this.sessionDomainService.emitDelta(sessionId, {
552
495
  type: 'config_options_update',
553
496
  configOptions: handle.configOptions,
554
497
  });
555
498
  }
556
- sessionDomainService.emitDelta(sessionId, {
499
+ this.sessionDomainService.emitDelta(sessionId, {
557
500
  type: 'chat_capabilities',
558
501
  capabilities: this.buildAcpChatBarCapabilities(handle),
559
502
  });
@@ -563,16 +506,16 @@ class SessionService {
563
506
  if (!session?.providerSessionId) {
564
507
  return false;
565
508
  }
566
- if (!sessionDomainService.isHistoryHydrated(sessionId)) {
509
+ if (!this.sessionDomainService.isHistoryHydrated(sessionId)) {
567
510
  return false;
568
511
  }
569
- return sessionDomainService.getTranscriptSnapshot(sessionId).length > 0;
512
+ return this.sessionDomainService.getTranscriptSnapshot(sessionId).length > 0;
570
513
  }
571
514
  maybeLiftReplaySuppression(sessionId) {
572
515
  if (!this.suppressAcpReplayForSession.has(sessionId)) {
573
516
  return;
574
517
  }
575
- if (!acpRuntimeManager.isSessionWorking(sessionId)) {
518
+ if (!this.runtimeManager.isSessionWorking(sessionId)) {
576
519
  return;
577
520
  }
578
521
  this.suppressAcpReplayForSession.delete(sessionId);
@@ -580,129 +523,59 @@ class SessionService {
580
523
  constructor(options) {
581
524
  this.repository = options?.repository ?? sessionRepository;
582
525
  this.promptBuilder = options?.promptBuilder ?? sessionPromptBuilder;
526
+ this.runtimeManager = options?.runtimeManager ?? acpRuntimeManager;
527
+ this.sessionDomainService = options?.sessionDomainService ?? sessionDomainService;
528
+ this.sessionPermissionService = new SessionPermissionService({
529
+ sessionDomainService: this.sessionDomainService,
530
+ });
531
+ this.sessionConfigService = new SessionConfigService({
532
+ repository: this.repository,
533
+ runtimeManager: this.runtimeManager,
534
+ sessionDomainService: this.sessionDomainService,
535
+ });
583
536
  }
584
537
  async startSession(sessionId, options) {
585
538
  const session = await this.repository.getSessionById(sessionId);
586
539
  if (!session) {
587
540
  throw new Error(`Session not found: ${sessionId}`);
588
541
  }
589
- if (acpRuntimeManager.isStopInProgress(sessionId)) {
542
+ if (this.runtimeManager.isStopInProgress(sessionId)) {
590
543
  throw new Error('Session is currently being stopped');
591
544
  }
592
- const existingClient = acpRuntimeManager.getClient(sessionId);
545
+ const existingClient = this.runtimeManager.getClient(sessionId);
593
546
  if (existingClient) {
594
547
  throw new Error('Session is already running');
595
548
  }
596
549
  const startupModePreset = options?.startupModePreset;
597
550
  const startupPermissionMode = startupModePreset === 'plan' ? 'plan' : 'bypassPermissions';
598
551
  const handle = await this.getOrCreateAcpSessionClient(sessionId, { permissionMode: startupPermissionMode }, session);
599
- await this.applyStartupModePreset(sessionId, handle, startupModePreset);
552
+ await this.applyStartupModePreset(sessionId, handle, startupModePreset, session.workflow);
553
+ if (!session.providerSessionId) {
554
+ await this.applyConfiguredPermissionPreset(sessionId, session, handle);
555
+ }
600
556
  const initialPrompt = options?.initialPrompt ?? 'Continue with the task.';
601
557
  if (initialPrompt) {
602
558
  await this.sendSessionMessage(sessionId, initialPrompt);
603
559
  }
604
560
  logger.info('Session started', { sessionId, provider: session.provider });
605
561
  }
606
- async applyStartupModePreset(sessionId, handle, startupModePreset) {
607
- if (!startupModePreset) {
608
- return;
609
- }
610
- const modeOption = handle.configOptions.find((option) => option.category === 'mode');
611
- if (!modeOption) {
612
- return;
613
- }
614
- const availableModeValues = this.getConfigOptionValues(modeOption);
615
- const targetMode = this.resolveStartupModeTarget(handle.provider, startupModePreset, availableModeValues);
616
- if (!targetMode) {
617
- logger.debug('Startup mode preset not available in ACP mode options', {
618
- sessionId,
619
- provider: handle.provider,
620
- startupModePreset,
621
- availableModeValues,
622
- });
623
- return;
624
- }
625
- const currentMode = modeOption.currentValue ? String(modeOption.currentValue) : null;
626
- if (currentMode === targetMode) {
627
- return;
628
- }
629
- try {
630
- const configOptions = await acpRuntimeManager.setSessionMode(sessionId, targetMode);
631
- handle.configOptions = configOptions;
632
- await this.persistAcpConfigSnapshot(sessionId, {
633
- provider: handle.provider,
634
- providerSessionId: handle.providerSessionId,
635
- configOptions,
636
- });
637
- sessionDomainService.emitDelta(sessionId, {
638
- type: 'config_options_update',
639
- configOptions,
640
- });
641
- sessionDomainService.emitDelta(sessionId, {
642
- type: 'chat_capabilities',
643
- capabilities: this.buildAcpChatBarCapabilities(handle),
644
- });
645
- }
646
- catch (error) {
647
- logger.warn('Failed applying startup mode preset', {
648
- sessionId,
649
- provider: handle.provider,
650
- startupModePreset,
651
- targetMode,
652
- error: error instanceof Error ? error.message : String(error),
653
- });
654
- }
655
- }
656
- resolveStartupModeTarget(provider, startupModePreset, availableModeValues) {
657
- if (availableModeValues.length === 0) {
658
- return null;
659
- }
660
- if (startupModePreset === 'plan') {
661
- return this.findModeValue(availableModeValues, ['plan']);
662
- }
663
- if (provider === 'CLAUDE') {
664
- return this.findModeValue(availableModeValues, [
665
- 'bypassPermissions',
666
- 'dangerouslySkipPermissions',
667
- 'dangerousSkipPermissions',
668
- 'acceptEdits',
669
- ]);
670
- }
671
- return this.findModeValue(availableModeValues, [
672
- 'fullAccess',
673
- 'full_access',
674
- 'full-access',
675
- 'code',
676
- ]);
677
- }
678
- findModeValue(availableModeValues, preferredModeValues) {
679
- if (availableModeValues.length === 0 || preferredModeValues.length === 0) {
680
- return null;
681
- }
682
- const availableByNormalized = new Map();
683
- for (const value of availableModeValues) {
684
- availableByNormalized.set(this.normalizeModeValue(value), value);
685
- }
686
- for (const preferredValue of preferredModeValues) {
687
- const match = availableByNormalized.get(this.normalizeModeValue(preferredValue));
688
- if (match) {
689
- return match;
690
- }
691
- }
692
- return null;
562
+ async applyStartupModePreset(sessionId, handle, startupModePreset, workflow) {
563
+ await this.sessionConfigService.applyStartupModePreset(sessionId, handle, startupModePreset, workflow, {
564
+ persistSnapshot: this.persistAcpConfigSnapshot.bind(this),
565
+ });
693
566
  }
694
- normalizeModeValue(value) {
695
- return value.replace(/[^a-z0-9]/gi, '').toLowerCase();
567
+ async applyConfiguredPermissionPreset(sessionId, session, handle) {
568
+ await this.sessionConfigService.applyConfiguredPermissionPreset(sessionId, session, handle);
696
569
  }
697
570
  async stopSession(sessionId, options) {
698
571
  const session = await this.loadSessionForStop(sessionId);
699
572
  const workspaceId = session?.workspaceId ?? this.sessionToWorkspace.get(sessionId);
700
- if (acpRuntimeManager.isStopInProgress(sessionId)) {
573
+ if (this.runtimeManager.isStopInProgress(sessionId)) {
701
574
  logger.debug('Session stop already in progress', { sessionId });
702
575
  return;
703
576
  }
704
577
  const current = this.getRuntimeSnapshot(sessionId);
705
- sessionDomainService.setRuntimeSnapshot(sessionId, {
578
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
706
579
  ...current,
707
580
  phase: 'stopping',
708
581
  activity: 'IDLE',
@@ -710,15 +583,11 @@ class SessionService {
710
583
  });
711
584
  this.acpStreamState.delete(sessionId);
712
585
  this.suppressAcpReplayForSession.delete(sessionId);
713
- const acpBridge = this.acpPermissionBridges.get(sessionId);
714
- if (acpBridge) {
715
- acpBridge.cancelAll();
716
- this.acpPermissionBridges.delete(sessionId);
717
- }
586
+ this.sessionPermissionService.cancelPendingRequests(sessionId);
718
587
  let stopClientFailed = false;
719
588
  try {
720
- if (!acpRuntimeManager.isStopInProgress(sessionId)) {
721
- await acpRuntimeManager.stopClient(sessionId);
589
+ if (!this.runtimeManager.isStopInProgress(sessionId)) {
590
+ await this.runtimeManager.stopClient(sessionId);
722
591
  }
723
592
  }
724
593
  catch (error) {
@@ -731,8 +600,8 @@ class SessionService {
731
600
  finally {
732
601
  this.finalizeOrphanedToolCallsOnStop(sessionId);
733
602
  await this.updateStoppedSessionState(sessionId);
734
- sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: true });
735
- sessionDomainService.setRuntimeSnapshot(sessionId, {
603
+ this.sessionDomainService.clearQueuedWork(sessionId, { emitSnapshot: true });
604
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
736
605
  phase: 'idle',
737
606
  processState: 'stopped',
738
607
  activity: 'IDLE',
@@ -836,7 +705,7 @@ class SessionService {
836
705
  const sessions = await this.repository.getSessionsByWorkspaceId(workspaceId);
837
706
  for (const session of sessions) {
838
707
  if (session.status === SessionStatus.RUNNING ||
839
- acpRuntimeManager.isSessionRunning(session.id)) {
708
+ this.runtimeManager.isSessionRunning(session.id)) {
840
709
  try {
841
710
  await this.stopSession(session.id);
842
711
  }
@@ -856,152 +725,51 @@ class SessionService {
856
725
  if (!session) {
857
726
  throw new Error(`Session not found: ${sessionId}`);
858
727
  }
859
- return await this.getOrCreateAcpSessionClient(sessionId, options ?? {}, session);
728
+ const hadClient = !!this.runtimeManager.getClient(sessionId);
729
+ const handle = await this.getOrCreateAcpSessionClient(sessionId, options ?? {}, session);
730
+ if (!(hadClient || session.providerSessionId)) {
731
+ await this.applyConfiguredPermissionPreset(sessionId, session, handle);
732
+ }
733
+ return handle;
860
734
  }
861
735
  async getOrCreateSessionClientFromRecord(session, options) {
862
- return await this.getOrCreateAcpSessionClient(session.id, options ?? {}, session);
736
+ const hadClient = !!this.runtimeManager.getClient(session.id);
737
+ const handle = await this.getOrCreateAcpSessionClient(session.id, options ?? {}, session);
738
+ if (!(hadClient || session.providerSessionId)) {
739
+ await this.applyConfiguredPermissionPreset(session.id, session, handle);
740
+ }
741
+ return handle;
863
742
  }
864
743
  getSessionClient(sessionId) {
865
- return acpRuntimeManager.getClient(sessionId);
744
+ return this.runtimeManager.getClient(sessionId);
866
745
  }
867
746
  getSessionConfigOptions(sessionId) {
868
- const acpHandle = acpRuntimeManager.getClient(sessionId);
869
- return acpHandle ? [...acpHandle.configOptions] : [];
747
+ return this.sessionConfigService.getSessionConfigOptions(sessionId);
870
748
  }
871
- async getSessionConfigOptionsWithFallback(sessionId) {
872
- const liveConfigOptions = this.getSessionConfigOptions(sessionId);
873
- if (liveConfigOptions.length > 0) {
874
- return liveConfigOptions;
875
- }
876
- const session = await this.repository.getSessionById(sessionId);
877
- if (!session) {
878
- return [];
879
- }
880
- const cachedSnapshot = this.extractAcpConfigSnapshot(session.providerMetadata);
881
- if (cachedSnapshot && cachedSnapshot.provider === session.provider) {
882
- return [...cachedSnapshot.configOptions];
883
- }
884
- return [];
749
+ getSessionConfigOptionsWithFallback(sessionId) {
750
+ return this.sessionConfigService.getSessionConfigOptionsWithFallback(sessionId);
885
751
  }
886
752
  async setSessionModel(sessionId, model) {
887
- const acpHandle = acpRuntimeManager.getClient(sessionId);
888
- if (acpHandle) {
889
- const modelOption = acpHandle.configOptions.find((o) => o.category === 'model');
890
- if (modelOption && model) {
891
- const availableValues = this.getConfigOptionValues(modelOption);
892
- if (availableValues.length > 0 && !availableValues.includes(model)) {
893
- logger.debug('Skipping unsupported model for ACP session', {
894
- sessionId,
895
- provider: acpHandle.provider,
896
- model,
897
- availableValues,
898
- });
899
- return;
900
- }
901
- await this.setSessionConfigOption(sessionId, modelOption.id, model);
902
- }
903
- return;
904
- }
905
- logger.debug('No ACP handle for setSessionModel', { sessionId, model });
753
+ await this.sessionConfigService.setSessionModel(sessionId, model);
906
754
  }
907
755
  setSessionReasoningEffort(sessionId, _effort) {
908
756
  logger.debug('setSessionReasoningEffort is a no-op for ACP sessions', { sessionId });
909
757
  }
910
758
  async setSessionThinkingBudget(sessionId, maxTokens) {
911
- const acpHandle = acpRuntimeManager.getClient(sessionId);
912
- if (acpHandle) {
913
- const thoughtOption = acpHandle.configOptions.find((o) => o.category === 'thought_level');
914
- if (thoughtOption && maxTokens != null) {
915
- await this.setSessionConfigOption(sessionId, thoughtOption.id, String(maxTokens));
916
- }
917
- return;
918
- }
919
- logger.debug('No ACP handle for setSessionThinkingBudget', { sessionId, maxTokens });
759
+ await this.sessionConfigService.setSessionThinkingBudget(sessionId, maxTokens);
920
760
  }
921
761
  async setSessionConfigOption(sessionId, configId, value) {
922
- const acpHandle = acpRuntimeManager.getClient(sessionId);
923
- if (!acpHandle) {
924
- const configOptions = await this.setCachedSessionConfigOption(sessionId, configId, value);
925
- sessionDomainService.emitDelta(sessionId, {
926
- type: 'config_options_update',
927
- configOptions,
928
- });
929
- return;
930
- }
931
- const selectedOption = acpHandle.configOptions.find((option) => option.id === configId);
932
- const isModeOption = configId === 'mode' || selectedOption?.category === 'mode';
933
- const isModelOption = configId === 'model' || selectedOption?.category === 'model';
934
- const configOptions = isModeOption
935
- ? await acpRuntimeManager.setSessionMode(sessionId, value)
936
- : isModelOption
937
- ? await acpRuntimeManager.setSessionModel(sessionId, value)
938
- : await acpRuntimeManager.setConfigOption(sessionId, configId, value);
939
- sessionDomainService.emitDelta(sessionId, {
940
- type: 'config_options_update',
941
- configOptions,
942
- });
943
- const acpHandleAfterUpdate = acpRuntimeManager.getClient(sessionId);
944
- if (acpHandleAfterUpdate) {
945
- await this.persistAcpConfigSnapshot(sessionId, {
946
- provider: acpHandleAfterUpdate.provider,
947
- providerSessionId: acpHandleAfterUpdate.providerSessionId,
948
- configOptions: configOptions,
949
- });
950
- }
951
- }
952
- async setCachedSessionConfigOption(sessionId, configId, value) {
953
- const session = await this.repository.getSessionById(sessionId);
954
- if (!session) {
955
- throw new Error(`Session not found: ${sessionId}`);
956
- }
957
- const snapshot = this.extractAcpConfigSnapshot(session.providerMetadata);
958
- if (!snapshot || snapshot.provider !== session.provider) {
959
- throw new Error(`Cannot set config option for inactive session ${sessionId}: no cached ACP config available`);
960
- }
961
- const configOptions = this.updateCachedConfigOptions(snapshot.configOptions, configId, value);
962
- await this.persistAcpConfigSnapshot(sessionId, {
963
- provider: snapshot.provider,
964
- providerSessionId: snapshot.providerSessionId,
965
- configOptions,
966
- existingMetadata: session.providerMetadata,
967
- });
968
- return configOptions;
969
- }
970
- updateCachedConfigOptions(configOptions, configId, value) {
971
- let didUpdate = false;
972
- const nextConfigOptions = configOptions.map((option) => {
973
- if (option.id !== configId) {
974
- return option;
975
- }
976
- const allowedValues = this.getConfigOptionValues(option);
977
- if (allowedValues.length > 0 && !allowedValues.includes(value)) {
978
- throw new Error(`Unsupported value "${value}" for config option "${configId}"` +
979
- ` (allowed: ${allowedValues.join(', ')})`);
980
- }
981
- didUpdate = true;
982
- return {
983
- ...option,
984
- currentValue: value,
985
- };
986
- });
987
- if (!didUpdate) {
988
- throw new Error(`Unknown config option: ${configId}`);
989
- }
990
- return nextConfigOptions;
762
+ await this.sessionConfigService.setSessionConfigOption(sessionId, configId, value);
991
763
  }
992
764
  sendSessionMessage(sessionId, content) {
993
- const acpClient = acpRuntimeManager.getClient(sessionId);
765
+ const acpClient = this.runtimeManager.getClient(sessionId);
994
766
  if (acpClient) {
995
767
  const normalizedText = typeof content === 'string' ? content : this.normalizeContentToText(content);
996
768
  return this.sendAcpMessage(sessionId, normalizedText).then(() => {
997
769
  }, (error) => {
998
770
  logger.error('ACP prompt failed', {
999
771
  sessionId,
1000
- error: error instanceof Error
1001
- ? error.message
1002
- : typeof error === 'object'
1003
- ? JSON.stringify(error)
1004
- : String(error),
772
+ error: toErrorMessage(error),
1005
773
  });
1006
774
  });
1007
775
  }
@@ -1038,7 +806,7 @@ class SessionService {
1038
806
  async sendAcpMessage(sessionId, content) {
1039
807
  const workspaceId = this.sessionToWorkspace.get(sessionId);
1040
808
  this.pendingAcpToolCalls.set(sessionId, new Map());
1041
- sessionDomainService.setRuntimeSnapshot(sessionId, {
809
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1042
810
  phase: 'running',
1043
811
  processState: 'alive',
1044
812
  activity: 'WORKING',
@@ -1048,9 +816,9 @@ class SessionService {
1048
816
  this.workspaceBridge.markSessionRunning(workspaceId, sessionId);
1049
817
  }
1050
818
  try {
1051
- const result = await acpRuntimeManager.sendPrompt(sessionId, content);
819
+ const result = await this.runtimeManager.sendPrompt(sessionId, content);
1052
820
  this.finalizeOrphanedToolCalls(sessionId, `stop_reason:${result.stopReason}`);
1053
- sessionDomainService.setRuntimeSnapshot(sessionId, {
821
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1054
822
  phase: 'idle',
1055
823
  processState: 'alive',
1056
824
  activity: 'IDLE',
@@ -1060,10 +828,11 @@ class SessionService {
1060
828
  }
1061
829
  catch (error) {
1062
830
  this.finalizeOrphanedToolCalls(sessionId, 'prompt_error');
1063
- sessionDomainService.setRuntimeSnapshot(sessionId, {
831
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1064
832
  phase: 'error',
1065
833
  processState: 'alive',
1066
834
  activity: 'IDLE',
835
+ errorMessage: toErrorMessage(error),
1067
836
  updatedAt: new Date().toISOString(),
1068
837
  });
1069
838
  throw error;
@@ -1098,10 +867,10 @@ class SessionService {
1098
867
  }
1099
868
  }
1100
869
  async cancelAcpPrompt(sessionId) {
1101
- await acpRuntimeManager.cancelPrompt(sessionId);
870
+ await this.runtimeManager.cancelPrompt(sessionId);
1102
871
  }
1103
872
  getSessionConversationHistory(sessionId, _workingDir) {
1104
- const transcript = sessionDomainService.getTranscriptSnapshot(sessionId);
873
+ const transcript = this.sessionDomainService.getTranscriptSnapshot(sessionId);
1105
874
  return transcript.flatMap((entry) => this.mapTranscriptEntryToHistory(entry));
1106
875
  }
1107
876
  mapTranscriptEntryToHistory(entry) {
@@ -1147,19 +916,15 @@ class SessionService {
1147
916
  .trim();
1148
917
  }
1149
918
  respondToAcpPermission(sessionId, requestId, optionId, answers) {
1150
- const bridge = this.acpPermissionBridges.get(sessionId);
1151
- if (!bridge) {
1152
- return false;
1153
- }
1154
- return bridge.resolvePermission(requestId, optionId, answers);
919
+ return this.sessionPermissionService.respondToPermission(sessionId, requestId, optionId, answers);
1155
920
  }
1156
921
  getRuntimeSnapshot(sessionId) {
1157
922
  const fallback = createInitialSessionRuntimeState();
1158
- const persisted = sessionDomainService.getRuntimeSnapshot(sessionId);
923
+ const persisted = this.sessionDomainService.getRuntimeSnapshot(sessionId);
1159
924
  const base = persisted ?? fallback;
1160
- const acpClient = acpRuntimeManager.getClient(sessionId);
925
+ const acpClient = this.runtimeManager.getClient(sessionId);
1161
926
  if (acpClient) {
1162
- const isWorking = acpRuntimeManager.isSessionWorking(sessionId);
927
+ const isWorking = this.runtimeManager.isSessionWorking(sessionId);
1163
928
  return {
1164
929
  phase: isWorking ? 'running' : 'idle',
1165
930
  processState: 'alive',
@@ -1167,7 +932,7 @@ class SessionService {
1167
932
  updatedAt: base.updatedAt,
1168
933
  };
1169
934
  }
1170
- if (acpRuntimeManager.isStopInProgress(sessionId)) {
935
+ if (this.runtimeManager.isStopInProgress(sessionId)) {
1171
936
  return {
1172
937
  ...base,
1173
938
  phase: 'stopping',
@@ -1186,9 +951,9 @@ class SessionService {
1186
951
  return base;
1187
952
  }
1188
953
  async getOrCreateAcpSessionClient(sessionId, options, session) {
1189
- const existingAcp = acpRuntimeManager.getClient(sessionId);
954
+ const existingAcp = this.runtimeManager.getClient(sessionId);
1190
955
  if (existingAcp) {
1191
- sessionDomainService.setRuntimeSnapshot(sessionId, {
956
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1192
957
  phase: existingAcp.isPromptInFlight ? 'running' : 'idle',
1193
958
  processState: 'alive',
1194
959
  activity: existingAcp.isPromptInFlight ? 'WORKING' : 'IDLE',
@@ -1196,17 +961,30 @@ class SessionService {
1196
961
  });
1197
962
  return existingAcp;
1198
963
  }
1199
- sessionDomainService.setRuntimeSnapshot(sessionId, {
964
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1200
965
  phase: 'starting',
1201
966
  processState: 'alive',
1202
967
  activity: 'IDLE',
1203
968
  updatedAt: new Date().toISOString(),
1204
969
  });
1205
- const handle = await this.createAcpClient(sessionId, options, session);
970
+ let handle;
971
+ try {
972
+ handle = await this.createAcpClient(sessionId, options, session);
973
+ }
974
+ catch (error) {
975
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
976
+ phase: 'error',
977
+ processState: 'stopped',
978
+ activity: 'IDLE',
979
+ errorMessage: `Failed to start agent: ${toErrorMessage(error)}`,
980
+ updatedAt: new Date().toISOString(),
981
+ });
982
+ throw error;
983
+ }
1206
984
  await this.repository.updateSession(sessionId, {
1207
985
  status: SessionStatus.RUNNING,
1208
986
  });
1209
- sessionDomainService.setRuntimeSnapshot(sessionId, {
987
+ this.sessionDomainService.setRuntimeSnapshot(sessionId, {
1210
988
  phase: handle.isPromptInFlight ? 'running' : 'idle',
1211
989
  processState: 'alive',
1212
990
  activity: handle.isPromptInFlight ? 'WORKING' : 'IDLE',
@@ -1215,13 +993,13 @@ class SessionService {
1215
993
  return handle;
1216
994
  }
1217
995
  isSessionRunning(sessionId) {
1218
- return acpRuntimeManager.isSessionRunning(sessionId);
996
+ return this.runtimeManager.isSessionRunning(sessionId);
1219
997
  }
1220
998
  isSessionWorking(sessionId) {
1221
- return acpRuntimeManager.isSessionWorking(sessionId);
999
+ return this.runtimeManager.isSessionWorking(sessionId);
1222
1000
  }
1223
1001
  isAnySessionWorking(sessionIds) {
1224
- return acpRuntimeManager.isAnySessionWorking(sessionIds);
1002
+ return this.runtimeManager.isAnySessionWorking(sessionIds);
1225
1003
  }
1226
1004
  async getSessionOptions(sessionId) {
1227
1005
  const sessionContext = await this.loadSessionContext(sessionId);
@@ -1235,121 +1013,15 @@ class SessionService {
1235
1013
  model: sessionContext.model,
1236
1014
  };
1237
1015
  }
1238
- async getChatBarCapabilities(sessionId) {
1239
- const acpHandle = acpRuntimeManager.getClient(sessionId);
1240
- if (acpHandle) {
1241
- return this.buildAcpChatBarCapabilities(acpHandle);
1242
- }
1243
- const session = await this.repository.getSessionById(sessionId);
1244
- if (!session) {
1245
- return EMPTY_CHAT_BAR_CAPABILITIES;
1246
- }
1247
- const cachedSnapshot = this.extractAcpConfigSnapshot(session.providerMetadata);
1248
- if (cachedSnapshot && cachedSnapshot.provider === session.provider) {
1249
- return this.buildCapabilitiesFromConfigOptions(session.provider, cachedSnapshot.configOptions, cachedSnapshot.observedModelId);
1250
- }
1251
- if (session.provider === 'CODEX') {
1252
- return {
1253
- ...EMPTY_CHAT_BAR_CAPABILITIES,
1254
- provider: 'CODEX',
1255
- };
1256
- }
1257
- return EMPTY_CHAT_BAR_CAPABILITIES;
1016
+ getChatBarCapabilities(sessionId) {
1017
+ return this.sessionConfigService.getChatBarCapabilities(sessionId);
1258
1018
  }
1259
1019
  buildAcpChatBarCapabilities(handle) {
1260
- return this.buildCapabilitiesFromConfigOptions(handle.provider, handle.configOptions);
1261
- }
1262
- buildCapabilitiesFromConfigOptions(provider, configOptions, fallbackModel) {
1263
- const modelOption = configOptions.find((o) => o.category === 'model');
1264
- const modeOption = configOptions.find((o) => o.category === 'mode');
1265
- const thoughtOption = configOptions.find((o) => o.category === 'thought_level' || o.id === 'reasoning_effort' || o.category === 'reasoning');
1266
- const selectedModel = modelOption?.currentValue
1267
- ? String(modelOption.currentValue)
1268
- : (fallbackModel ?? undefined);
1269
- const modelOptions = this.buildModelOptions(modelOption, selectedModel);
1270
- const isCodexProvider = provider === 'CODEX';
1271
- const reasoningOptions = isCodexProvider && thoughtOption
1272
- ? this.getSelectOptions(thoughtOption).map((option) => ({
1273
- value: option.value,
1274
- label: option.name ?? option.value,
1275
- ...(option.description ? { description: option.description } : {}),
1276
- }))
1277
- : [];
1278
- const reasoningValues = new Set(reasoningOptions.map((option) => option.value));
1279
- const selectedReasoning = isCodexProvider &&
1280
- thoughtOption?.currentValue &&
1281
- typeof thoughtOption.currentValue === 'string' &&
1282
- reasoningValues.has(thoughtOption.currentValue)
1283
- ? thoughtOption.currentValue
1284
- : undefined;
1285
- const modeDescriptors = modeOption
1286
- ? [
1287
- ...this.getConfigOptionValues(modeOption),
1288
- ...this.getSelectOptions(modeOption)
1289
- .map((entry) => entry.name ?? '')
1290
- .filter((value) => value.trim().length > 0),
1291
- ]
1292
- : [];
1293
- const planModeEnabled = modeDescriptors.some((entry) => /plan/i.test(entry));
1294
- return {
1295
- provider,
1296
- model: {
1297
- enabled: modelOptions.length > 0,
1298
- options: modelOptions,
1299
- ...(selectedModel ? { selected: selectedModel } : {}),
1300
- },
1301
- reasoning: {
1302
- enabled: reasoningOptions.length > 0,
1303
- options: reasoningOptions,
1304
- ...(selectedReasoning ? { selected: selectedReasoning } : {}),
1305
- },
1306
- thinking: {
1307
- enabled: !isCodexProvider && !!thoughtOption,
1308
- },
1309
- planMode: { enabled: planModeEnabled },
1310
- attachments: isCodexProvider
1311
- ? { enabled: false, kinds: [] }
1312
- : { enabled: true, kinds: ['image', 'text'] },
1313
- slashCommands: { enabled: false },
1314
- usageStats: { enabled: false, contextWindow: false },
1315
- rewind: { enabled: false },
1316
- };
1317
- }
1318
- buildModelOptions(modelOption, selectedModel) {
1319
- if (!modelOption) {
1320
- return selectedModel ? [{ value: selectedModel, label: selectedModel }] : [];
1321
- }
1322
- const byValue = new Map();
1323
- for (const option of this.getSelectOptions(modelOption)) {
1324
- if (!byValue.has(option.value)) {
1325
- byValue.set(option.value, option.name ?? option.value);
1326
- }
1327
- }
1328
- if (selectedModel && !byValue.has(selectedModel)) {
1329
- byValue.set(selectedModel, selectedModel);
1330
- }
1331
- return Array.from(byValue.entries()).map(([value, label]) => ({ value, label }));
1332
- }
1333
- getSelectOptions(option) {
1334
- return option.options.flatMap((entry) => {
1335
- if (typeof entry !== 'object' || entry === null) {
1336
- return [];
1337
- }
1338
- if ('value' in entry && typeof entry.value === 'string') {
1339
- return [entry];
1340
- }
1341
- if ('options' in entry && Array.isArray(entry.options)) {
1342
- return entry.options.filter((grouped) => typeof grouped === 'object' && grouped !== null && typeof grouped.value === 'string');
1343
- }
1344
- return [];
1345
- });
1346
- }
1347
- getConfigOptionValues(option) {
1348
- return this.getSelectOptions(option).map((entry) => entry.value);
1020
+ return this.sessionConfigService.buildAcpChatBarCapabilities(handle);
1349
1021
  }
1350
1022
  async stopAllClients(_timeoutMs = 5000) {
1351
1023
  try {
1352
- await acpRuntimeManager.stopAllClients();
1024
+ await this.runtimeManager.stopAllClients();
1353
1025
  }
1354
1026
  catch (error) {
1355
1027
  logger.error('Failed to stop ACP clients during shutdown', {
@@ -1359,105 +1031,7 @@ class SessionService {
1359
1031
  }
1360
1032
  }
1361
1033
  async persistAcpConfigSnapshot(sessionId, params) {
1362
- if (params.configOptions.length === 0) {
1363
- return;
1364
- }
1365
- const configOptionsForStorage = this.cloneConfigOptionsForStorage(params.configOptions);
1366
- const observedModelId = this.resolveObservedModel(configOptionsForStorage);
1367
- const metadataSource = params.existingMetadata ??
1368
- (await this.repository.getSessionById(sessionId))?.providerMetadata ??
1369
- null;
1370
- const snapshot = {
1371
- provider: params.provider,
1372
- providerSessionId: params.providerSessionId,
1373
- capturedAt: new Date().toISOString(),
1374
- configOptions: configOptionsForStorage,
1375
- ...(observedModelId ? { observedModelId } : {}),
1376
- };
1377
- const persistedUpdate = this.buildSnapshotPersistUpdate(metadataSource, snapshot, observedModelId);
1378
- try {
1379
- await this.repository.updateSession(sessionId, persistedUpdate);
1380
- }
1381
- catch (error) {
1382
- logger.warn('Failed persisting ACP config snapshot to session metadata; retrying once', {
1383
- sessionId,
1384
- error: error instanceof Error ? error.message : String(error),
1385
- });
1386
- await this.retryPersistAcpConfigSnapshot(sessionId, snapshot, observedModelId);
1387
- }
1388
- }
1389
- buildSnapshotPersistUpdate(metadataSource, snapshot, observedModelId) {
1390
- const nextMetadata = {
1391
- ...this.toMetadataRecord(metadataSource),
1392
- acpConfigSnapshot: snapshot,
1393
- };
1394
- if (observedModelId) {
1395
- nextMetadata.observedModelId = observedModelId;
1396
- }
1397
- return {
1398
- providerMetadata: nextMetadata,
1399
- ...(observedModelId ? { model: observedModelId } : {}),
1400
- };
1401
- }
1402
- async retryPersistAcpConfigSnapshot(sessionId, snapshot, observedModelId) {
1403
- try {
1404
- const latestMetadataSource = (await this.repository.getSessionById(sessionId))
1405
- ?.providerMetadata;
1406
- await this.repository.updateSession(sessionId, this.buildSnapshotPersistUpdate(latestMetadataSource, snapshot, observedModelId));
1407
- }
1408
- catch (retryError) {
1409
- logger.warn('Retry failed persisting ACP config snapshot to session metadata', {
1410
- sessionId,
1411
- error: retryError instanceof Error ? retryError.message : String(retryError),
1412
- });
1413
- }
1414
- }
1415
- cloneConfigOptionsForStorage(configOptions) {
1416
- try {
1417
- return structuredClone(configOptions);
1418
- }
1419
- catch {
1420
- return configOptions;
1421
- }
1422
- }
1423
- toMetadataRecord(metadata) {
1424
- if (typeof metadata !== 'object' || metadata === null || Array.isArray(metadata)) {
1425
- return {};
1426
- }
1427
- return { ...metadata };
1428
- }
1429
- extractAcpConfigSnapshot(metadata) {
1430
- const record = this.toMetadataRecord(metadata);
1431
- const snapshot = record.acpConfigSnapshot;
1432
- if (typeof snapshot !== 'object' || snapshot === null || Array.isArray(snapshot)) {
1433
- return null;
1434
- }
1435
- const candidate = snapshot;
1436
- const provider = candidate.provider;
1437
- const providerSessionId = candidate.providerSessionId;
1438
- const configOptions = candidate.configOptions;
1439
- const observedModelId = candidate.observedModelId;
1440
- if (provider !== 'CLAUDE' && provider !== 'CODEX') {
1441
- return null;
1442
- }
1443
- if (typeof providerSessionId !== 'string' || providerSessionId.length === 0) {
1444
- return null;
1445
- }
1446
- if (!Array.isArray(configOptions)) {
1447
- return null;
1448
- }
1449
- return {
1450
- provider,
1451
- providerSessionId,
1452
- capturedAt: typeof candidate.capturedAt === 'string' ? candidate.capturedAt : new Date(0).toISOString(),
1453
- configOptions: configOptions,
1454
- ...(typeof observedModelId === 'string' ? { observedModelId } : {}),
1455
- };
1456
- }
1457
- resolveObservedModel(configOptions) {
1458
- const modelOption = configOptions.find((option) => option.category === 'model');
1459
- const currentValue = modelOption?.currentValue;
1460
- return currentValue ? String(currentValue) : undefined;
1034
+ await this.sessionConfigService.persistAcpConfigSnapshot(sessionId, params);
1461
1035
  }
1462
1036
  async loadSessionContext(sessionId, preloadedSession) {
1463
1037
  const session = preloadedSession ?? (await this.repository.getSessionById(sessionId));
@@ -1520,5 +1094,8 @@ class SessionService {
1520
1094
  };
1521
1095
  }
1522
1096
  }
1523
- export const sessionService = new SessionService();
1097
+ export function createSessionService(options) {
1098
+ return new SessionService(options);
1099
+ }
1100
+ export const sessionService = createSessionService();
1524
1101
  //# sourceMappingURL=session.service.js.map