factory-factory 0.3.7 → 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 (323) hide show
  1. package/dist/client/assets/{_basePickBy-BsuMuaCZ.js → _basePickBy-BzH_iru3.js} +1 -1
  2. package/dist/client/assets/{_baseUniq-BDd8f52s.js → _baseUniq-D6ny9r_u.js} +1 -1
  3. package/dist/client/assets/{arc-BWbaJQoA.js → arc-CRVgibiy.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-VXUJARFQ-C_FQG3JS.js → architectureDiagram-VXUJARFQ-1aDFSaTZ.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-VD42YOAC-CLwvH-wA.js → blockDiagram-VD42YOAC-m3mDHY-k.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-YG6GDRKO-Ba80_haP.js → c4Diagram-YG6GDRKO-B7ZlkfXz.js} +1 -1
  7. package/dist/client/assets/channel-B_f9a3jD.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-CSlDSMiy.js → chunk-4BX2VUAB-zLj9eiFf.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-Dm3keBAf.js → chunk-55IACEB6-D6KQTgyD.js} +1 -1
  10. package/dist/client/assets/{chunk-B4BG7PRW-BSrvNYuP.js → chunk-B4BG7PRW-BQbzvx8l.js} +1 -1
  11. package/dist/client/assets/{chunk-DI55MBZ5-DFQPoLQZ.js → chunk-DI55MBZ5-CPxKCw_e.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-C1KS438H.js → chunk-FMBD7UC4-nFaeGtHP.js} +1 -1
  13. package/dist/client/assets/{chunk-QN33PNHL-4rPPxHo4.js → chunk-QN33PNHL-DhrGqSLY.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-B_sF5IzV.js → chunk-QZHKN3VN-CZWrGmvf.js} +1 -1
  15. package/dist/client/assets/{chunk-TZMSLE5B-L-qbjoBp.js → chunk-TZMSLE5B-xhHdVO37.js} +1 -1
  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-DB7lwAnl.js → cose-bilkent-S5V4N54A-Cr0HX6ro.js} +1 -1
  20. package/dist/client/assets/{dagre-6UL2VRFP-z2fl_1iD.js → dagre-6UL2VRFP-s6RRMHqY.js} +1 -1
  21. package/dist/client/assets/{diagram-PSM6KHXK-BL2iv8II.js → diagram-PSM6KHXK-BhdZNVs7.js} +1 -1
  22. package/dist/client/assets/{diagram-QEK2KX5R-DgMZW0D1.js → diagram-QEK2KX5R-Dgwc4sx_.js} +1 -1
  23. package/dist/client/assets/{diagram-S2PKOQOG-Ct2QBl2c.js → diagram-S2PKOQOG-BlcMpYrQ.js} +1 -1
  24. package/dist/client/assets/{erDiagram-Q2GNP2WA-DII-pqkb.js → erDiagram-Q2GNP2WA-BQQjswcC.js} +1 -1
  25. package/dist/client/assets/{flowDiagram-NV44I4VS-BV4CMZAZ.js → flowDiagram-NV44I4VS-_cBTH43Q.js} +1 -1
  26. package/dist/client/assets/{ganttDiagram-JELNMOA3-Dfj064tE.js → ganttDiagram-JELNMOA3-BxuyB7Oz.js} +1 -1
  27. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-Cg2b-j3t.js → gitGraphDiagram-V2S2FVAM-D0GjSYQi.js} +1 -1
  28. package/dist/client/assets/{graph-wzICjOO_.js → graph-DNCXrik3.js} +1 -1
  29. package/dist/client/assets/{index-EVrp_NXm.js → index-CCnMDzRJ.js} +165 -158
  30. package/dist/client/assets/index-DVprBuNv.css +1 -0
  31. package/dist/client/assets/{infoDiagram-HS3SLOUP-D09mbfgG.js → infoDiagram-HS3SLOUP-BsUKtNMj.js} +1 -1
  32. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-BebsQbuf.js → journeyDiagram-XKPGCS4Q-sScoNj-6.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-3W4ZIXB7-DOuawTNU.js → kanban-definition-3W4ZIXB7-CycFvltk.js} +1 -1
  34. package/dist/client/assets/{layout-Bj6cMfF5.js → layout-LTiJ8avf.js} +1 -1
  35. package/dist/client/assets/{linear-B58HS9F4.js → linear-CnQEAniJ.js} +1 -1
  36. package/dist/client/assets/{mindmap-definition-VGOIOE7T-hSFgcTL2.js → mindmap-definition-VGOIOE7T-Du5mb-g5.js} +1 -1
  37. package/dist/client/assets/{mobile-baseline-CmdjqYSm.js → mobile-baseline-necQV4Mu.js} +1 -1
  38. package/dist/client/assets/{pieDiagram-ADFJNKIX-D1vkoKs3.js → pieDiagram-ADFJNKIX-CUAEo70K.js} +1 -1
  39. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-pMQj9xcS.js → quadrantDiagram-AYHSOK5B-1MjtTI_Y.js} +1 -1
  40. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-DvRtxnIi.js → requirementDiagram-UZGBJVZJ-zgmi2Sjr.js} +1 -1
  41. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-BWoDxXkR.js → sankeyDiagram-TZEHDZUN-Datw0Rj8.js} +1 -1
  42. package/dist/client/assets/{sequenceDiagram-WL72ISMW-Dz5i1ly3.js → sequenceDiagram-WL72ISMW-DopxoRon.js} +1 -1
  43. package/dist/client/assets/{stateDiagram-FKZM4ZOC-BFd_gXUo.js → stateDiagram-FKZM4ZOC-ZqoVSvsu.js} +1 -1
  44. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BRKf4wQr.js +1 -0
  45. package/dist/client/assets/{terminal-instance-BTIzq32H.js → terminal-instance-gybkMDHu.js} +1 -1
  46. package/dist/client/assets/{timeline-definition-IT6M3QCI-BFEIWW6m.js → timeline-definition-IT6M3QCI-DQwpSE-n.js} +1 -1
  47. package/dist/client/assets/{treemap-GDKQZRPO-CC2Fh6RQ.js → treemap-GDKQZRPO-DK4UuMc6.js} +1 -1
  48. package/dist/client/assets/{xychartDiagram-PRI3JC2R-DFygXQrm.js → xychartDiagram-PRI3JC2R-CJP1ULwR.js} +1 -1
  49. package/dist/client/index.html +2 -2
  50. package/dist/prisma/generated/internal/class.js +4 -4
  51. package/dist/prisma/generated/internal/class.js.map +1 -1
  52. package/dist/prisma/generated/internal/prismaNamespace.d.ts +1 -0
  53. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  54. package/dist/prisma/generated/internal/prismaNamespace.js +1 -0
  55. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  56. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +1 -0
  57. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  58. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +1 -0
  59. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  60. package/dist/prisma/generated/models/Workspace.d.ts +44 -1
  61. package/dist/prisma/generated/models/Workspace.d.ts.map +1 -1
  62. package/dist/src/backend/app-context.d.ts +2 -1
  63. package/dist/src/backend/app-context.d.ts.map +1 -1
  64. package/dist/src/backend/app-context.js +19 -5
  65. package/dist/src/backend/app-context.js.map +1 -1
  66. package/dist/src/backend/domains/run-script/index.d.ts +1 -1
  67. package/dist/src/backend/domains/run-script/index.d.ts.map +1 -1
  68. package/dist/src/backend/domains/run-script/index.js +1 -1
  69. package/dist/src/backend/domains/run-script/index.js.map +1 -1
  70. package/dist/src/backend/domains/run-script/run-script-domain-exports.test.js +5 -4
  71. package/dist/src/backend/domains/run-script/run-script-domain-exports.test.js.map +1 -1
  72. package/dist/src/backend/domains/run-script/run-script.service.d.ts +12 -1
  73. package/dist/src/backend/domains/run-script/run-script.service.d.ts.map +1 -1
  74. package/dist/src/backend/domains/run-script/run-script.service.js +140 -2
  75. package/dist/src/backend/domains/run-script/run-script.service.js.map +1 -1
  76. package/dist/src/backend/domains/run-script/run-script.service.test.js +86 -0
  77. package/dist/src/backend/domains/run-script/run-script.service.test.js.map +1 -1
  78. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts.map +1 -1
  79. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js +4 -1
  80. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js.map +1 -1
  81. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.d.ts +23 -0
  82. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.d.ts.map +1 -0
  83. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.js +76 -0
  84. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.js.map +1 -0
  85. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.d.ts +97 -0
  86. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.d.ts.map +1 -0
  87. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.js +2 -0
  88. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/adapter-state.js.map +1 -0
  89. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +3 -24
  90. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
  91. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +36 -1127
  92. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
  93. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +0 -191
  94. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -1
  95. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts +3 -3
  96. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.d.ts +16 -0
  97. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.d.ts.map +1 -0
  98. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.js +292 -0
  99. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.js.map +1 -0
  100. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.d.ts +2 -0
  101. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.d.ts.map +1 -0
  102. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.js +56 -0
  103. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/command-metadata.test.js.map +1 -0
  104. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.d.ts +19 -0
  105. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.d.ts.map +1 -0
  106. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.js +369 -0
  107. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.js.map +1 -0
  108. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.d.ts +2 -0
  109. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.d.ts.map +1 -0
  110. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.js +91 -0
  111. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/protocol-permission-handler.test.js.map +1 -0
  112. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.d.ts +53 -0
  113. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.d.ts.map +1 -0
  114. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.js +419 -0
  115. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.js.map +1 -0
  116. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.d.ts +2 -0
  117. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.d.ts.map +1 -0
  118. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.js +95 -0
  119. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/stream-event-handler.test.js.map +1 -0
  120. package/dist/src/backend/domains/session/acp/index.d.ts +1 -1
  121. package/dist/src/backend/domains/session/acp/index.d.ts.map +1 -1
  122. package/dist/src/backend/domains/session/acp/index.js +1 -1
  123. package/dist/src/backend/domains/session/acp/index.js.map +1 -1
  124. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.d.ts.map +1 -1
  125. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js +19 -5
  126. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js.map +1 -1
  127. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts.map +1 -1
  128. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js +77 -24
  129. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js.map +1 -1
  130. package/dist/src/backend/domains/session/data/session-data.service.d.ts +2 -0
  131. package/dist/src/backend/domains/session/data/session-data.service.d.ts.map +1 -1
  132. package/dist/src/backend/domains/session/index.d.ts +3 -1
  133. package/dist/src/backend/domains/session/index.d.ts.map +1 -1
  134. package/dist/src/backend/domains/session/index.js +2 -1
  135. package/dist/src/backend/domains/session/index.js.map +1 -1
  136. package/dist/src/backend/domains/session/interceptor.bridge.d.ts +8 -0
  137. package/dist/src/backend/domains/session/interceptor.bridge.d.ts.map +1 -0
  138. package/dist/src/backend/domains/session/interceptor.bridge.js +7 -0
  139. package/dist/src/backend/domains/session/interceptor.bridge.js.map +1 -0
  140. package/dist/src/backend/domains/session/lifecycle/session.config.service.d.ts +59 -0
  141. package/dist/src/backend/domains/session/lifecycle/session.config.service.d.ts.map +1 -0
  142. package/dist/src/backend/domains/session/lifecycle/session.config.service.js +635 -0
  143. package/dist/src/backend/domains/session/lifecycle/session.config.service.js.map +1 -0
  144. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.d.ts +2 -0
  145. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.d.ts.map +1 -0
  146. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.js +552 -0
  147. package/dist/src/backend/domains/session/lifecycle/session.config.service.test.js.map +1 -0
  148. package/dist/src/backend/domains/session/lifecycle/session.permission.service.d.ts +17 -0
  149. package/dist/src/backend/domains/session/lifecycle/session.permission.service.d.ts.map +1 -0
  150. package/dist/src/backend/domains/session/lifecycle/session.permission.service.js +86 -0
  151. package/dist/src/backend/domains/session/lifecycle/session.permission.service.js.map +1 -0
  152. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.d.ts +2 -0
  153. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.d.ts.map +1 -0
  154. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.js +137 -0
  155. package/dist/src/backend/domains/session/lifecycle/session.permission.service.test.js.map +1 -0
  156. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts +16 -29
  157. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts.map +1 -1
  158. package/dist/src/backend/domains/session/lifecycle/session.service.js +92 -723
  159. package/dist/src/backend/domains/session/lifecycle/session.service.js.map +1 -1
  160. package/dist/src/backend/domains/session/lifecycle/session.service.test.js +0 -698
  161. package/dist/src/backend/domains/session/lifecycle/session.service.test.js.map +1 -1
  162. package/dist/src/backend/domains/session/session-domain.service.d.ts +1 -2
  163. package/dist/src/backend/domains/session/session-domain.service.d.ts.map +1 -1
  164. package/dist/src/backend/domains/session/session-domain.service.js +5 -2
  165. package/dist/src/backend/domains/session/session-domain.service.js.map +1 -1
  166. package/dist/src/backend/domains/session/store/file-lock.service.d.ts.map +1 -1
  167. package/dist/src/backend/domains/session/store/file-lock.service.js +23 -2
  168. package/dist/src/backend/domains/session/store/file-lock.service.js.map +1 -1
  169. package/dist/src/backend/domains/session/zod-issue-summary.d.ts +3 -0
  170. package/dist/src/backend/domains/session/zod-issue-summary.d.ts.map +1 -0
  171. package/dist/src/backend/domains/session/zod-issue-summary.js +7 -0
  172. package/dist/src/backend/domains/session/zod-issue-summary.js.map +1 -0
  173. package/dist/src/backend/domains/workspace/lifecycle/creation.service.d.ts +7 -0
  174. package/dist/src/backend/domains/workspace/lifecycle/creation.service.d.ts.map +1 -1
  175. package/dist/src/backend/domains/workspace/lifecycle/creation.service.js +98 -85
  176. package/dist/src/backend/domains/workspace/lifecycle/creation.service.js.map +1 -1
  177. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js +41 -1
  178. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js.map +1 -1
  179. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts +9 -1
  180. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts.map +1 -1
  181. package/dist/src/backend/domains/workspace/lifecycle/data.service.js +2 -1
  182. package/dist/src/backend/domains/workspace/lifecycle/data.service.js.map +1 -1
  183. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts +2 -0
  184. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts.map +1 -1
  185. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts +4 -1
  186. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts.map +1 -1
  187. package/dist/src/backend/domains/workspace/query/workspace-query.service.js +18 -7
  188. package/dist/src/backend/domains/workspace/query/workspace-query.service.js.map +1 -1
  189. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js +57 -0
  190. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js.map +1 -1
  191. package/dist/src/backend/domains/workspace/state/kanban-state.d.ts +2 -1
  192. package/dist/src/backend/domains/workspace/state/kanban-state.d.ts.map +1 -1
  193. package/dist/src/backend/domains/workspace/state/kanban-state.js +6 -3
  194. package/dist/src/backend/domains/workspace/state/kanban-state.js.map +1 -1
  195. package/dist/src/backend/domains/workspace/state/kanban-state.test.js +23 -0
  196. package/dist/src/backend/domains/workspace/state/kanban-state.test.js.map +1 -1
  197. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.d.ts +3 -6
  198. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.d.ts.map +1 -1
  199. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.js +7 -116
  200. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.js.map +1 -1
  201. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.test.js +38 -65
  202. package/dist/src/backend/domains/workspace/worktree/worktree-lifecycle.service.test.js.map +1 -1
  203. package/dist/src/backend/interceptors/conversation-rename.interceptor.d.ts.map +1 -1
  204. package/dist/src/backend/interceptors/conversation-rename.interceptor.js +6 -4
  205. package/dist/src/backend/interceptors/conversation-rename.interceptor.js.map +1 -1
  206. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js +10 -10
  207. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js.map +1 -1
  208. package/dist/src/backend/lib/file-helpers.d.ts +2 -0
  209. package/dist/src/backend/lib/file-helpers.d.ts.map +1 -1
  210. package/dist/src/backend/lib/file-helpers.js +64 -1
  211. package/dist/src/backend/lib/file-helpers.js.map +1 -1
  212. package/dist/src/backend/middleware/cors.middleware.d.ts +1 -2
  213. package/dist/src/backend/middleware/cors.middleware.d.ts.map +1 -1
  214. package/dist/src/backend/middleware/cors.middleware.js +0 -2
  215. package/dist/src/backend/middleware/cors.middleware.js.map +1 -1
  216. package/dist/src/backend/middleware/index.d.ts +1 -1
  217. package/dist/src/backend/middleware/index.d.ts.map +1 -1
  218. package/dist/src/backend/middleware/index.js +1 -1
  219. package/dist/src/backend/middleware/index.js.map +1 -1
  220. package/dist/src/backend/orchestration/data-backup.service.test.js +1 -0
  221. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  222. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts +26 -1
  223. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
  224. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +21 -1
  225. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
  226. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts +8 -1
  227. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
  228. package/dist/src/backend/orchestration/event-collector.orchestrator.js +41 -21
  229. package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
  230. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js +19 -4
  231. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js.map +1 -1
  232. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts +6 -2
  233. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts.map +1 -1
  234. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js +8 -3
  235. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js.map +1 -1
  236. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +19 -1
  237. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  238. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +5 -7
  239. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
  240. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +40 -47
  241. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
  242. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  243. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +86 -36
  244. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  245. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +62 -2
  246. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js.map +1 -1
  247. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +1 -0
  248. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -1
  249. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -1
  250. package/dist/src/backend/routers/websocket/index.d.ts +1 -0
  251. package/dist/src/backend/routers/websocket/index.d.ts.map +1 -1
  252. package/dist/src/backend/routers/websocket/index.js +1 -0
  253. package/dist/src/backend/routers/websocket/index.js.map +1 -1
  254. package/dist/src/backend/routers/websocket/post-run-logs.handler.d.ts +9 -0
  255. package/dist/src/backend/routers/websocket/post-run-logs.handler.d.ts.map +1 -0
  256. package/dist/src/backend/routers/websocket/post-run-logs.handler.js +52 -0
  257. package/dist/src/backend/routers/websocket/post-run-logs.handler.js.map +1 -0
  258. package/dist/src/backend/server.d.ts.map +1 -1
  259. package/dist/src/backend/server.js +10 -4
  260. package/dist/src/backend/server.js.map +1 -1
  261. package/dist/src/backend/server.upgrade.test.js +2 -0
  262. package/dist/src/backend/server.upgrade.test.js.map +1 -1
  263. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts +2 -0
  264. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts.map +1 -1
  265. package/dist/src/backend/services/workspace-snapshot-store.service.js +8 -4
  266. package/dist/src/backend/services/workspace-snapshot-store.service.js.map +1 -1
  267. package/dist/src/backend/trpc/admin.trpc.js +2 -2
  268. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  269. package/dist/src/backend/trpc/index.d.ts +41 -1
  270. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  271. package/dist/src/backend/trpc/project.trpc.d.ts +14 -0
  272. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  273. package/dist/src/backend/trpc/project.trpc.js +22 -0
  274. package/dist/src/backend/trpc/project.trpc.js.map +1 -1
  275. package/dist/src/backend/trpc/session.router.test.js +1 -0
  276. package/dist/src/backend/trpc/session.router.test.js.map +1 -1
  277. package/dist/src/backend/trpc/session.trpc.d.ts +4 -0
  278. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  279. package/dist/src/backend/trpc/session.trpc.js +2 -2
  280. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  281. package/dist/src/backend/trpc/workspace/files.trpc.d.ts.map +1 -1
  282. package/dist/src/backend/trpc/workspace/files.trpc.js +1 -64
  283. package/dist/src/backend/trpc/workspace/files.trpc.js.map +1 -1
  284. package/dist/src/backend/trpc/workspace/init.router.test.js +1 -1
  285. package/dist/src/backend/trpc/workspace/init.router.test.js.map +1 -1
  286. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +1 -0
  287. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  288. package/dist/src/backend/trpc/workspace/init.trpc.js +2 -3
  289. package/dist/src/backend/trpc/workspace/init.trpc.js.map +1 -1
  290. package/dist/src/backend/trpc/workspace/run-script.router.test.js +1 -1
  291. package/dist/src/backend/trpc/workspace/run-script.router.test.js.map +1 -1
  292. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts +2 -0
  293. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts.map +1 -1
  294. package/dist/src/backend/trpc/workspace/run-script.trpc.js +1 -1
  295. package/dist/src/backend/trpc/workspace/run-script.trpc.js.map +1 -1
  296. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +2 -0
  297. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  298. package/dist/src/backend/trpc/workspace.router.test.js +39 -0
  299. package/dist/src/backend/trpc/workspace.router.test.js.map +1 -1
  300. package/dist/src/backend/trpc/workspace.trpc.d.ts +23 -1
  301. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  302. package/dist/src/backend/trpc/workspace.trpc.js +6 -3
  303. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  304. package/dist/src/cli/index.js +12 -3
  305. package/dist/src/cli/index.js.map +1 -1
  306. package/dist/src/shared/schemas/factory-config.schema.d.ts +1 -0
  307. package/dist/src/shared/schemas/factory-config.schema.d.ts.map +1 -1
  308. package/dist/src/shared/schemas/factory-config.schema.js +1 -0
  309. package/dist/src/shared/schemas/factory-config.schema.js.map +1 -1
  310. package/dist/src/shared/schemas/persisted-stores.schema.d.ts +0 -2
  311. package/dist/src/shared/schemas/persisted-stores.schema.d.ts.map +1 -1
  312. package/dist/src/shared/schemas/persisted-stores.schema.js +0 -1
  313. package/dist/src/shared/schemas/persisted-stores.schema.js.map +1 -1
  314. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  315. package/package.json +1 -1
  316. package/prisma/migrations/20260222120000_add_post_run_command/migration.sql +1 -0
  317. package/prisma/schema.prisma +1 -0
  318. package/dist/client/assets/channel-B2z94T-9.js +0 -1
  319. package/dist/client/assets/classDiagram-2ON5EDUG-B2LoFG_o.js +0 -1
  320. package/dist/client/assets/classDiagram-v2-WZHVMYZB-B2LoFG_o.js +0 -1
  321. package/dist/client/assets/clone-C8LA0zQQ.js +0 -1
  322. package/dist/client/assets/index-DvtmO7DV.css +0 -1
  323. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CO6XGRkL.js +0 -1
@@ -202,289 +202,6 @@ describe('SessionService', () => {
202
202
  status: SessionStatus.RUNNING,
203
203
  });
204
204
  });
205
- it('applies Claude non-interactive startup mode preset when bypassPermissions is available', async () => {
206
- const session = unsafeCoerce({
207
- id: 'session-1',
208
- workspaceId: 'workspace-1',
209
- status: SessionStatus.IDLE,
210
- workflow: 'default',
211
- model: 'sonnet',
212
- provider: 'CLAUDE',
213
- providerSessionId: null,
214
- });
215
- const workspace = unsafeCoerce({
216
- id: 'workspace-1',
217
- worktreePath: '/tmp/work',
218
- branchName: 'feature-branch',
219
- isAutoGeneratedBranch: false,
220
- hasHadSessions: true,
221
- name: 'Workspace A',
222
- description: null,
223
- projectId: 'project-1',
224
- });
225
- const modeConfig = {
226
- id: 'mode',
227
- name: 'Mode',
228
- type: 'select',
229
- category: 'mode',
230
- currentValue: 'default',
231
- options: [
232
- { value: 'default', name: 'Default' },
233
- { value: 'bypassPermissions', name: 'Bypass Permissions' },
234
- ],
235
- };
236
- const acpHandle = unsafeCoerce({
237
- getPid: vi.fn().mockReturnValue(456),
238
- provider: 'CLAUDE',
239
- providerSessionId: 'provider-session-1',
240
- isPromptInFlight: false,
241
- configOptions: [modeConfig],
242
- });
243
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(session);
244
- vi.mocked(sessionRepository.getWorkspaceById).mockResolvedValue(workspace);
245
- vi.mocked(sessionRepository.markWorkspaceHasHadSessions).mockResolvedValue();
246
- vi.mocked(sessionRepository.updateSession).mockResolvedValue(session);
247
- vi.mocked(sessionPromptBuilder.shouldInjectBranchRename).mockReturnValue(false);
248
- vi.mocked(sessionPromptBuilder.buildSystemPrompt).mockReturnValue({
249
- workflowPrompt: undefined,
250
- systemPrompt: undefined,
251
- injectedBranchRename: false,
252
- });
253
- vi.mocked(acpRuntimeManager.getOrCreateClient).mockResolvedValue(acpHandle);
254
- vi.mocked(acpRuntimeManager.setSessionMode).mockResolvedValue([
255
- {
256
- ...modeConfig,
257
- currentValue: 'bypassPermissions',
258
- },
259
- ]);
260
- await sessionService.startSession('session-1', {
261
- initialPrompt: '',
262
- startupModePreset: 'non_interactive',
263
- });
264
- expect(acpRuntimeManager.setSessionMode).toHaveBeenCalledWith('session-1', 'bypassPermissions');
265
- expect(acpRuntimeManager.sendPrompt).not.toHaveBeenCalled();
266
- });
267
- it('applies Codex non-interactive startup mode preset using code mode', async () => {
268
- const session = unsafeCoerce({
269
- id: 'session-codex',
270
- workspaceId: 'workspace-1',
271
- status: SessionStatus.IDLE,
272
- workflow: 'default',
273
- model: 'gpt-5-codex',
274
- provider: 'CODEX',
275
- providerSessionId: null,
276
- });
277
- const workspace = unsafeCoerce({
278
- id: 'workspace-1',
279
- worktreePath: '/tmp/work',
280
- branchName: 'feature-branch',
281
- isAutoGeneratedBranch: false,
282
- hasHadSessions: true,
283
- name: 'Workspace A',
284
- description: null,
285
- projectId: 'project-1',
286
- });
287
- const modeConfig = {
288
- id: 'mode',
289
- name: 'Mode',
290
- type: 'select',
291
- category: 'mode',
292
- currentValue: 'ask',
293
- options: [
294
- { value: 'ask', name: 'Ask' },
295
- { value: 'code', name: 'Code' },
296
- ],
297
- };
298
- const acpHandle = unsafeCoerce({
299
- getPid: vi.fn().mockReturnValue(457),
300
- provider: 'CODEX',
301
- providerSessionId: 'provider-codex-1',
302
- isPromptInFlight: false,
303
- configOptions: [modeConfig],
304
- });
305
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(session);
306
- vi.mocked(sessionRepository.getWorkspaceById).mockResolvedValue(workspace);
307
- vi.mocked(sessionRepository.markWorkspaceHasHadSessions).mockResolvedValue();
308
- vi.mocked(sessionRepository.updateSession).mockResolvedValue(session);
309
- vi.mocked(sessionPromptBuilder.shouldInjectBranchRename).mockReturnValue(false);
310
- vi.mocked(sessionPromptBuilder.buildSystemPrompt).mockReturnValue({
311
- workflowPrompt: undefined,
312
- systemPrompt: undefined,
313
- injectedBranchRename: false,
314
- });
315
- vi.mocked(acpRuntimeManager.getOrCreateClient).mockResolvedValue(acpHandle);
316
- vi.mocked(acpRuntimeManager.setSessionMode).mockResolvedValue([
317
- {
318
- ...modeConfig,
319
- currentValue: 'code',
320
- },
321
- ]);
322
- await sessionService.startSession('session-codex', {
323
- initialPrompt: '',
324
- startupModePreset: 'non_interactive',
325
- });
326
- expect(acpRuntimeManager.setSessionMode).toHaveBeenCalledWith('session-codex', 'code');
327
- expect(acpRuntimeManager.sendPrompt).not.toHaveBeenCalled();
328
- });
329
- it('applies Codex ratchet non-interactive startup execution mode using YOLO', async () => {
330
- const session = unsafeCoerce({
331
- id: 'session-codex-ratchet',
332
- workspaceId: 'workspace-1',
333
- status: SessionStatus.IDLE,
334
- workflow: 'ratchet',
335
- model: 'gpt-5-codex',
336
- provider: 'CODEX',
337
- providerSessionId: null,
338
- });
339
- const workspace = unsafeCoerce({
340
- id: 'workspace-1',
341
- worktreePath: '/tmp/work',
342
- branchName: 'feature-branch',
343
- isAutoGeneratedBranch: false,
344
- hasHadSessions: true,
345
- name: 'Workspace A',
346
- description: null,
347
- projectId: 'project-1',
348
- });
349
- const modeConfig = {
350
- id: 'mode',
351
- name: 'Mode',
352
- type: 'select',
353
- category: 'mode',
354
- currentValue: 'ask',
355
- options: [
356
- { value: 'ask', name: 'Ask' },
357
- { value: 'code', name: 'Code' },
358
- ],
359
- };
360
- const executionModeConfig = {
361
- id: 'execution_mode',
362
- name: 'Execution Mode',
363
- type: 'select',
364
- category: 'permission',
365
- currentValue: '["on-failure","workspace-write"]',
366
- options: [
367
- {
368
- value: '["on-failure","workspace-write"]',
369
- name: 'On Failure (Workspace Write)',
370
- },
371
- {
372
- value: '["never","danger-full-access"]',
373
- name: 'YOLO (Full Access)',
374
- },
375
- ],
376
- };
377
- const acpHandle = unsafeCoerce({
378
- getPid: vi.fn().mockReturnValue(458),
379
- provider: 'CODEX',
380
- providerSessionId: 'provider-codex-ratchet-1',
381
- isPromptInFlight: false,
382
- configOptions: [modeConfig, executionModeConfig],
383
- });
384
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(session);
385
- vi.mocked(sessionRepository.getWorkspaceById).mockResolvedValue(workspace);
386
- vi.mocked(sessionRepository.markWorkspaceHasHadSessions).mockResolvedValue();
387
- vi.mocked(sessionRepository.updateSession).mockResolvedValue(session);
388
- vi.mocked(sessionPromptBuilder.shouldInjectBranchRename).mockReturnValue(false);
389
- vi.mocked(sessionPromptBuilder.buildSystemPrompt).mockReturnValue({
390
- workflowPrompt: undefined,
391
- systemPrompt: undefined,
392
- injectedBranchRename: false,
393
- });
394
- vi.mocked(acpRuntimeManager.getOrCreateClient).mockResolvedValue(acpHandle);
395
- vi.mocked(acpRuntimeManager.setSessionMode).mockResolvedValue([
396
- {
397
- ...modeConfig,
398
- currentValue: 'code',
399
- },
400
- executionModeConfig,
401
- ]);
402
- vi.mocked(acpRuntimeManager.setConfigOption).mockResolvedValue([
403
- {
404
- ...modeConfig,
405
- currentValue: 'code',
406
- },
407
- {
408
- ...executionModeConfig,
409
- currentValue: '["never","danger-full-access"]',
410
- },
411
- ]);
412
- await sessionService.startSession('session-codex-ratchet', {
413
- initialPrompt: '',
414
- startupModePreset: 'non_interactive',
415
- });
416
- expect(acpRuntimeManager.setSessionMode).toHaveBeenCalledWith('session-codex-ratchet', 'code');
417
- expect(acpRuntimeManager.setConfigOption).toHaveBeenCalledWith('session-codex-ratchet', 'execution_mode', '["never","danger-full-access"]');
418
- expect(acpRuntimeManager.sendPrompt).not.toHaveBeenCalled();
419
- });
420
- it('continues startup when persisting startup mode preset config snapshot fails', async () => {
421
- const session = unsafeCoerce({
422
- id: 'session-1',
423
- workspaceId: 'workspace-1',
424
- status: SessionStatus.IDLE,
425
- workflow: 'default',
426
- model: 'sonnet',
427
- provider: 'CLAUDE',
428
- providerSessionId: null,
429
- });
430
- const workspace = unsafeCoerce({
431
- id: 'workspace-1',
432
- worktreePath: '/tmp/work',
433
- branchName: 'feature-branch',
434
- isAutoGeneratedBranch: false,
435
- hasHadSessions: true,
436
- name: 'Workspace A',
437
- description: null,
438
- projectId: 'project-1',
439
- });
440
- const modeConfig = {
441
- id: 'mode',
442
- name: 'Mode',
443
- type: 'select',
444
- category: 'mode',
445
- currentValue: 'default',
446
- options: [
447
- { value: 'default', name: 'Default' },
448
- { value: 'bypassPermissions', name: 'Bypass Permissions' },
449
- ],
450
- };
451
- const acpHandle = unsafeCoerce({
452
- getPid: vi.fn().mockReturnValue(459),
453
- provider: 'CLAUDE',
454
- providerSessionId: 'provider-session-1',
455
- isPromptInFlight: false,
456
- configOptions: [modeConfig],
457
- });
458
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(session);
459
- vi.mocked(sessionRepository.getWorkspaceById).mockResolvedValue(workspace);
460
- vi.mocked(sessionRepository.markWorkspaceHasHadSessions).mockResolvedValue();
461
- vi.mocked(sessionRepository.updateSession).mockResolvedValue(session);
462
- vi.mocked(sessionPromptBuilder.shouldInjectBranchRename).mockReturnValue(false);
463
- vi.mocked(sessionPromptBuilder.buildSystemPrompt).mockReturnValue({
464
- workflowPrompt: undefined,
465
- systemPrompt: undefined,
466
- injectedBranchRename: false,
467
- });
468
- vi.mocked(acpRuntimeManager.getOrCreateClient).mockResolvedValue(acpHandle);
469
- vi.mocked(acpRuntimeManager.setSessionMode).mockResolvedValue([
470
- {
471
- ...modeConfig,
472
- currentValue: 'bypassPermissions',
473
- },
474
- ]);
475
- const persistSpy = vi
476
- .spyOn(sessionService, 'persistAcpConfigSnapshot')
477
- .mockResolvedValueOnce(undefined)
478
- .mockRejectedValueOnce(new Error('db unavailable'));
479
- await expect(sessionService.startSession('session-1', {
480
- initialPrompt: '',
481
- startupModePreset: 'non_interactive',
482
- })).resolves.toBeUndefined();
483
- expect(acpRuntimeManager.setSessionMode).toHaveBeenCalledWith('session-1', 'bypassPermissions');
484
- expect(persistSpy).toHaveBeenCalledTimes(2);
485
- expect(acpHandle.configOptions[0]?.currentValue).toBe('bypassPermissions');
486
- expect(acpRuntimeManager.sendPrompt).not.toHaveBeenCalled();
487
- });
488
205
  it('injects replayed user_message_chunk events while session is idle', async () => {
489
206
  const session = unsafeCoerce({
490
207
  id: 'session-1',
@@ -1133,421 +850,6 @@ describe('SessionService', () => {
1133
850
  status: SessionStatus.RUNNING,
1134
851
  });
1135
852
  });
1136
- it('returns ACP config options for active session handles', () => {
1137
- const configOptions = [
1138
- {
1139
- id: 'model',
1140
- name: 'Model',
1141
- type: 'string',
1142
- category: 'model',
1143
- currentValue: 'sonnet',
1144
- options: [{ value: 'sonnet', name: 'Sonnet' }],
1145
- },
1146
- ];
1147
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1148
- configOptions,
1149
- }));
1150
- expect(sessionService.getSessionConfigOptions('session-1')).toEqual(configOptions);
1151
- });
1152
- it('returns empty config options when no ACP handle is active', () => {
1153
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1154
- expect(sessionService.getSessionConfigOptions('session-1')).toEqual([]);
1155
- });
1156
- it('returns cached config options when no ACP handle is active', async () => {
1157
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1158
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1159
- id: 'session-1',
1160
- provider: 'CLAUDE',
1161
- providerMetadata: {
1162
- acpConfigSnapshot: {
1163
- provider: 'CLAUDE',
1164
- providerSessionId: 'provider-session-1',
1165
- capturedAt: '2026-02-14T00:00:00.000Z',
1166
- configOptions: [
1167
- {
1168
- id: 'model',
1169
- name: 'Model',
1170
- type: 'select',
1171
- category: 'model',
1172
- currentValue: 'claude-sonnet-4-5',
1173
- options: [{ value: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' }],
1174
- },
1175
- ],
1176
- },
1177
- },
1178
- }));
1179
- await expect(sessionService.getSessionConfigOptionsWithFallback('session-1')).resolves.toEqual([
1180
- {
1181
- id: 'model',
1182
- name: 'Model',
1183
- type: 'select',
1184
- category: 'model',
1185
- currentValue: 'claude-sonnet-4-5',
1186
- options: [{ value: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' }],
1187
- },
1188
- ]);
1189
- });
1190
- it('returns empty Claude capabilities when no ACP handle or cached snapshot exists', async () => {
1191
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1192
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1193
- id: 'session-claude',
1194
- provider: 'CLAUDE',
1195
- model: 'claude-sonnet-4-5',
1196
- providerMetadata: null,
1197
- }));
1198
- const capabilities = await sessionService.getChatBarCapabilities('session-claude');
1199
- expect(capabilities.provider).toBe('CLAUDE');
1200
- expect(capabilities.model.enabled).toBe(false);
1201
- expect(capabilities.model.selected).toBeUndefined();
1202
- expect(capabilities.model.options).toEqual([]);
1203
- });
1204
- it('retries persisting ACP config snapshot metadata once when first write fails', async () => {
1205
- const configOptions = unsafeCoerce([
1206
- {
1207
- id: 'model',
1208
- name: 'Model',
1209
- type: 'select',
1210
- category: 'model',
1211
- currentValue: 'claude-sonnet-4-5',
1212
- options: [{ value: 'claude-sonnet-4-5', name: 'Claude Sonnet 4.5' }],
1213
- },
1214
- ]);
1215
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1216
- provider: 'CLAUDE',
1217
- providerSessionId: 'provider-session-1',
1218
- configOptions,
1219
- }));
1220
- vi.mocked(acpRuntimeManager.setSessionModel).mockResolvedValue(configOptions);
1221
- vi.mocked(sessionRepository.updateSession)
1222
- .mockRejectedValueOnce(new Error('primary metadata write failed'))
1223
- .mockResolvedValueOnce(unsafeCoerce({ id: 'session-1' }));
1224
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1225
- id: 'session-1',
1226
- providerMetadata: { existing: 'metadata' },
1227
- }));
1228
- await sessionService.setSessionConfigOption('session-1', 'model', 'claude-sonnet-4-5');
1229
- const metadataUpdates = vi
1230
- .mocked(sessionRepository.updateSession)
1231
- .mock.calls.filter(([, update]) => Object.hasOwn(update, 'providerMetadata'));
1232
- expect(metadataUpdates).toHaveLength(2);
1233
- expect(metadataUpdates[1]?.[1]).toMatchObject({
1234
- model: 'claude-sonnet-4-5',
1235
- providerMetadata: expect.objectContaining({
1236
- existing: 'metadata',
1237
- acpConfigSnapshot: expect.any(Object),
1238
- }),
1239
- });
1240
- });
1241
- it('returns CODEX provider fallback capabilities when no ACP handle is active', async () => {
1242
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1243
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1244
- id: 'session-codex',
1245
- provider: 'CODEX',
1246
- }));
1247
- const capabilities = await sessionService.getChatBarCapabilities('session-codex');
1248
- expect(capabilities.provider).toBe('CODEX');
1249
- expect(capabilities.model.enabled).toBe(false);
1250
- });
1251
- it('derives CODEX model/reasoning/plan-mode capabilities from cached ACP config options', async () => {
1252
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1253
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1254
- id: 'session-codex',
1255
- provider: 'CODEX',
1256
- providerMetadata: {
1257
- acpConfigSnapshot: {
1258
- provider: 'CODEX',
1259
- providerSessionId: 'sess_123',
1260
- capturedAt: '2026-02-15T00:00:00.000Z',
1261
- configOptions: [
1262
- {
1263
- id: 'model',
1264
- name: 'Model',
1265
- type: 'select',
1266
- category: 'model',
1267
- currentValue: 'gpt-5-codex',
1268
- options: [
1269
- { value: 'gpt-5-codex', name: 'GPT-5 Codex' },
1270
- { value: 'gpt-5-mini', name: 'GPT-5 Mini' },
1271
- ],
1272
- },
1273
- {
1274
- id: 'mode',
1275
- name: 'Mode',
1276
- type: 'select',
1277
- category: 'mode',
1278
- currentValue: 'plan',
1279
- options: [
1280
- { value: 'ask', name: 'Ask' },
1281
- { value: 'plan', name: 'Plan' },
1282
- ],
1283
- },
1284
- {
1285
- id: 'reasoning_effort',
1286
- name: 'Reasoning Effort',
1287
- type: 'select',
1288
- category: 'thought_level',
1289
- currentValue: 'high',
1290
- options: [
1291
- { value: 'medium', name: 'Medium', description: 'Balanced' },
1292
- { value: 'high', name: 'High', description: 'Thorough' },
1293
- ],
1294
- },
1295
- ],
1296
- },
1297
- },
1298
- }));
1299
- const capabilities = await sessionService.getChatBarCapabilities('session-codex');
1300
- expect(capabilities.provider).toBe('CODEX');
1301
- expect(capabilities.model.options).toEqual([
1302
- { value: 'gpt-5-codex', label: 'GPT-5 Codex' },
1303
- { value: 'gpt-5-mini', label: 'GPT-5 Mini' },
1304
- ]);
1305
- expect(capabilities.reasoning.enabled).toBe(true);
1306
- expect(capabilities.reasoning.options).toEqual([
1307
- { value: 'medium', label: 'Medium', description: 'Balanced' },
1308
- { value: 'high', label: 'High', description: 'Thorough' },
1309
- ]);
1310
- expect(capabilities.reasoning.selected).toBe('high');
1311
- expect(capabilities.planMode.enabled).toBe(true);
1312
- expect(capabilities.thinking.enabled).toBe(false);
1313
- });
1314
- it('disables plan mode when ACP config options do not advertise a plan variant', async () => {
1315
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1316
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1317
- id: 'session-codex',
1318
- provider: 'CODEX',
1319
- providerMetadata: {
1320
- acpConfigSnapshot: {
1321
- provider: 'CODEX',
1322
- providerSessionId: 'sess_124',
1323
- capturedAt: '2026-02-15T00:00:00.000Z',
1324
- configOptions: [
1325
- {
1326
- id: 'mode',
1327
- name: 'Approval Policy',
1328
- type: 'select',
1329
- category: 'mode',
1330
- currentValue: 'on-failure',
1331
- options: [{ value: 'on-failure', name: 'On Failure' }],
1332
- },
1333
- ],
1334
- },
1335
- },
1336
- }));
1337
- const capabilities = await sessionService.getChatBarCapabilities('session-codex');
1338
- expect(capabilities.planMode.enabled).toBe(false);
1339
- });
1340
- it('skips setSessionModel when requested model is not in ACP model options', async () => {
1341
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1342
- provider: 'CODEX',
1343
- configOptions: [
1344
- {
1345
- id: 'model',
1346
- name: 'Model',
1347
- type: 'select',
1348
- category: 'model',
1349
- currentValue: 'gpt-5.3-codex',
1350
- options: [
1351
- { value: 'gpt-5.3-codex', name: 'GPT-5.3 Codex' },
1352
- { value: 'gpt-5.2-codex', name: 'GPT-5.2 Codex' },
1353
- ],
1354
- },
1355
- ],
1356
- }));
1357
- await sessionService.setSessionModel('session-codex', 'opus');
1358
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1359
- });
1360
- it('applies setSessionModel when requested model is supported by ACP options', async () => {
1361
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1362
- provider: 'CODEX',
1363
- configOptions: [
1364
- {
1365
- id: 'model',
1366
- name: 'Model',
1367
- type: 'select',
1368
- category: 'model',
1369
- currentValue: 'gpt-5.3-codex',
1370
- options: [
1371
- { value: 'gpt-5.3-codex', name: 'GPT-5.3 Codex' },
1372
- { value: 'gpt-5.2-codex', name: 'GPT-5.2 Codex' },
1373
- ],
1374
- },
1375
- ],
1376
- }));
1377
- vi.mocked(acpRuntimeManager.setSessionModel).mockResolvedValue([
1378
- {
1379
- id: 'model',
1380
- name: 'Model',
1381
- type: 'select',
1382
- category: 'model',
1383
- currentValue: 'gpt-5.2-codex',
1384
- options: [{ value: 'gpt-5.2-codex', name: 'GPT-5.2 Codex' }],
1385
- },
1386
- ]);
1387
- await sessionService.setSessionModel('session-codex', 'gpt-5.2-codex');
1388
- expect(acpRuntimeManager.setSessionModel).toHaveBeenCalledWith('session-codex', 'gpt-5.2-codex');
1389
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1390
- });
1391
- it('routes mode config updates through ACP setSessionMode', async () => {
1392
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1393
- provider: 'CLAUDE',
1394
- configOptions: [
1395
- {
1396
- id: 'mode',
1397
- name: 'Mode',
1398
- type: 'select',
1399
- category: 'mode',
1400
- currentValue: 'default',
1401
- options: [
1402
- { value: 'default', name: 'Default' },
1403
- { value: 'acceptEdits', name: 'Accept Edits' },
1404
- ],
1405
- },
1406
- ],
1407
- }));
1408
- vi.mocked(acpRuntimeManager.setSessionMode).mockResolvedValue([
1409
- {
1410
- id: 'mode',
1411
- name: 'Mode',
1412
- type: 'select',
1413
- category: 'mode',
1414
- currentValue: 'acceptEdits',
1415
- options: [
1416
- { value: 'default', name: 'Default' },
1417
- { value: 'acceptEdits', name: 'Accept Edits' },
1418
- ],
1419
- },
1420
- ]);
1421
- await sessionService.setSessionConfigOption('session-1', 'mode', 'acceptEdits');
1422
- expect(acpRuntimeManager.setSessionMode).toHaveBeenCalledWith('session-1', 'acceptEdits');
1423
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1424
- });
1425
- it('routes model config updates through ACP setSessionModel', async () => {
1426
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(unsafeCoerce({
1427
- provider: 'CLAUDE',
1428
- configOptions: [
1429
- {
1430
- id: 'model',
1431
- name: 'Model',
1432
- type: 'select',
1433
- category: 'model',
1434
- currentValue: 'default',
1435
- options: [
1436
- { value: 'default', name: 'Default' },
1437
- { value: 'claude-sonnet-4-5', name: 'Sonnet 4.5' },
1438
- ],
1439
- },
1440
- ],
1441
- }));
1442
- vi.mocked(acpRuntimeManager.setSessionModel).mockResolvedValue([
1443
- {
1444
- id: 'model',
1445
- name: 'Model',
1446
- type: 'select',
1447
- category: 'model',
1448
- currentValue: 'claude-sonnet-4-5',
1449
- options: [
1450
- { value: 'default', name: 'Default' },
1451
- { value: 'claude-sonnet-4-5', name: 'Sonnet 4.5' },
1452
- ],
1453
- },
1454
- ]);
1455
- await sessionService.setSessionConfigOption('session-1', 'model', 'claude-sonnet-4-5');
1456
- expect(acpRuntimeManager.setSessionModel).toHaveBeenCalledWith('session-1', 'claude-sonnet-4-5');
1457
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1458
- });
1459
- it('updates cached config snapshot when setting config on inactive session', async () => {
1460
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1461
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1462
- id: 'session-1',
1463
- provider: 'CODEX',
1464
- providerMetadata: {
1465
- acpConfigSnapshot: {
1466
- provider: 'CODEX',
1467
- providerSessionId: 'thread_123',
1468
- capturedAt: '2026-02-15T00:00:00.000Z',
1469
- configOptions: [
1470
- {
1471
- id: 'execution_mode',
1472
- name: 'Execution Mode',
1473
- type: 'select',
1474
- category: 'permission',
1475
- currentValue: '["on-request","workspace-write"]',
1476
- options: [
1477
- {
1478
- value: '["on-request","workspace-write"]',
1479
- name: 'on-request + workspace-write',
1480
- },
1481
- {
1482
- value: '["on-failure","workspace-write"]',
1483
- name: 'on-failure + workspace-write',
1484
- },
1485
- ],
1486
- },
1487
- ],
1488
- },
1489
- },
1490
- }));
1491
- vi.mocked(sessionRepository.updateSession).mockResolvedValue(unsafeCoerce({ id: 'session-1' }));
1492
- const emitDeltaSpy = vi.spyOn(sessionDomainService, 'emitDelta');
1493
- await sessionService.setSessionConfigOption('session-1', 'execution_mode', '["on-failure","workspace-write"]');
1494
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1495
- expect(acpRuntimeManager.setSessionMode).not.toHaveBeenCalled();
1496
- expect(acpRuntimeManager.setSessionModel).not.toHaveBeenCalled();
1497
- expect(sessionRepository.updateSession).toHaveBeenCalledWith('session-1', expect.objectContaining({
1498
- providerMetadata: expect.objectContaining({
1499
- acpConfigSnapshot: expect.objectContaining({
1500
- configOptions: expect.arrayContaining([
1501
- expect.objectContaining({
1502
- id: 'execution_mode',
1503
- currentValue: '["on-failure","workspace-write"]',
1504
- }),
1505
- ]),
1506
- }),
1507
- }),
1508
- }));
1509
- expect(emitDeltaSpy).toHaveBeenCalledWith('session-1', expect.objectContaining({
1510
- type: 'config_options_update',
1511
- configOptions: expect.arrayContaining([
1512
- expect.objectContaining({
1513
- id: 'execution_mode',
1514
- currentValue: '["on-failure","workspace-write"]',
1515
- }),
1516
- ]),
1517
- }));
1518
- });
1519
- it('rejects unsupported cached config values on inactive session', async () => {
1520
- vi.mocked(acpRuntimeManager.getClient).mockReturnValue(undefined);
1521
- vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
1522
- id: 'session-1',
1523
- provider: 'CODEX',
1524
- providerMetadata: {
1525
- acpConfigSnapshot: {
1526
- provider: 'CODEX',
1527
- providerSessionId: 'thread_123',
1528
- capturedAt: '2026-02-15T00:00:00.000Z',
1529
- configOptions: [
1530
- {
1531
- id: 'execution_mode',
1532
- name: 'Execution Mode',
1533
- type: 'select',
1534
- category: 'permission',
1535
- currentValue: '["on-request","workspace-write"]',
1536
- options: [
1537
- {
1538
- value: '["on-request","workspace-write"]',
1539
- name: 'on-request + workspace-write',
1540
- },
1541
- ],
1542
- },
1543
- ],
1544
- },
1545
- },
1546
- }));
1547
- await expect(sessionService.setSessionConfigOption('session-1', 'execution_mode', '["never","danger-full-access"]')).rejects.toThrow('Unsupported value');
1548
- expect(sessionRepository.updateSession).not.toHaveBeenCalled();
1549
- expect(acpRuntimeManager.setConfigOption).not.toHaveBeenCalled();
1550
- });
1551
853
  it('finalizes orphaned ACP tool calls when prompt ends without terminal updates', async () => {
1552
854
  const pendingToolCalls = sessionService.pendingAcpToolCalls;
1553
855
  vi.mocked(acpRuntimeManager.sendPrompt).mockImplementation(() => {