factory-factory 0.3.8 → 0.3.9

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 (377) hide show
  1. package/dist/client/assets/{_basePickBy-BzH_iru3.js → _basePickBy-CoLLbaiQ.js} +1 -1
  2. package/dist/client/assets/{_baseUniq-D6ny9r_u.js → _baseUniq-xRgxfXUW.js} +1 -1
  3. package/dist/client/assets/{arc-CRVgibiy.js → arc-De4Ny3V9.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-VXUJARFQ-1aDFSaTZ.js → architectureDiagram-VXUJARFQ-DM0j158z.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-VD42YOAC-m3mDHY-k.js → blockDiagram-VD42YOAC-DKBZN-sz.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-YG6GDRKO-B7ZlkfXz.js → c4Diagram-YG6GDRKO-CIA6AVRp.js} +1 -1
  7. package/dist/client/assets/channel-DW2o9xrZ.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-zLj9eiFf.js → chunk-4BX2VUAB-BrHsCtgI.js} +1 -1
  9. package/dist/client/assets/{chunk-55IACEB6-D6KQTgyD.js → chunk-55IACEB6-DLwlJB2L.js} +1 -1
  10. package/dist/client/assets/{chunk-B4BG7PRW-BQbzvx8l.js → chunk-B4BG7PRW-cqTY9ldj.js} +1 -1
  11. package/dist/client/assets/{chunk-DI55MBZ5-CPxKCw_e.js → chunk-DI55MBZ5-PAp7fYLU.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-nFaeGtHP.js → chunk-FMBD7UC4-CsvpScij.js} +1 -1
  13. package/dist/client/assets/{chunk-QN33PNHL-DhrGqSLY.js → chunk-QN33PNHL-DmkkCoc-.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-CZWrGmvf.js → chunk-QZHKN3VN-Ds5Tjlpo.js} +1 -1
  15. package/dist/client/assets/{chunk-TZMSLE5B-xhHdVO37.js → chunk-TZMSLE5B-4Gu0uKkR.js} +1 -1
  16. package/dist/client/assets/classDiagram-2ON5EDUG-CUeZuC6S.js +1 -0
  17. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CUeZuC6S.js +1 -0
  18. package/dist/client/assets/clone-Df9JDgIw.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-S5V4N54A-Cr0HX6ro.js → cose-bilkent-S5V4N54A-CQJ_MgcD.js} +1 -1
  20. package/dist/client/assets/{dagre-6UL2VRFP-s6RRMHqY.js → dagre-6UL2VRFP-CfyncTju.js} +1 -1
  21. package/dist/client/assets/{diagram-PSM6KHXK-BhdZNVs7.js → diagram-PSM6KHXK-BL2QA0bQ.js} +1 -1
  22. package/dist/client/assets/{diagram-QEK2KX5R-Dgwc4sx_.js → diagram-QEK2KX5R-BDcBrJO4.js} +1 -1
  23. package/dist/client/assets/{diagram-S2PKOQOG-BlcMpYrQ.js → diagram-S2PKOQOG-BxofoMik.js} +1 -1
  24. package/dist/client/assets/{erDiagram-Q2GNP2WA-BQQjswcC.js → erDiagram-Q2GNP2WA-CDGe-bUA.js} +1 -1
  25. package/dist/client/assets/{flowDiagram-NV44I4VS-_cBTH43Q.js → flowDiagram-NV44I4VS-CodDw20I.js} +1 -1
  26. package/dist/client/assets/{ganttDiagram-JELNMOA3-BxuyB7Oz.js → ganttDiagram-JELNMOA3-BHJlNcF5.js} +1 -1
  27. package/dist/client/assets/{gitGraphDiagram-V2S2FVAM-D0GjSYQi.js → gitGraphDiagram-V2S2FVAM-DsFPFnxn.js} +1 -1
  28. package/dist/client/assets/{graph-DNCXrik3.js → graph-DtyTGYVa.js} +1 -1
  29. package/dist/client/assets/index-BkwQogmx.css +1 -0
  30. package/dist/client/assets/{index-CCnMDzRJ.js → index-CSanKe06.js} +175 -175
  31. package/dist/client/assets/{infoDiagram-HS3SLOUP-BsUKtNMj.js → infoDiagram-HS3SLOUP-CczckdeY.js} +1 -1
  32. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-sScoNj-6.js → journeyDiagram-XKPGCS4Q-CIDlGmYi.js} +1 -1
  33. package/dist/client/assets/{kanban-definition-3W4ZIXB7-CycFvltk.js → kanban-definition-3W4ZIXB7-Dvuu9eqr.js} +1 -1
  34. package/dist/client/assets/{layout-LTiJ8avf.js → layout-Cth5sJm6.js} +1 -1
  35. package/dist/client/assets/{linear-CnQEAniJ.js → linear-DRv-Y17x.js} +1 -1
  36. package/dist/client/assets/{mindmap-definition-VGOIOE7T-Du5mb-g5.js → mindmap-definition-VGOIOE7T-AXsc24V4.js} +1 -1
  37. package/dist/client/assets/{mobile-baseline-necQV4Mu.js → mobile-baseline-DXBPdrir.js} +1 -1
  38. package/dist/client/assets/{pieDiagram-ADFJNKIX-CUAEo70K.js → pieDiagram-ADFJNKIX-oIn8Bgi4.js} +1 -1
  39. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-1MjtTI_Y.js → quadrantDiagram-AYHSOK5B-rGTqNh3q.js} +1 -1
  40. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-zgmi2Sjr.js → requirementDiagram-UZGBJVZJ-DgE2dYES.js} +1 -1
  41. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-Datw0Rj8.js → sankeyDiagram-TZEHDZUN-BWRLa217.js} +1 -1
  42. package/dist/client/assets/{sequenceDiagram-WL72ISMW-DopxoRon.js → sequenceDiagram-WL72ISMW-lYEkh9VX.js} +1 -1
  43. package/dist/client/assets/{stateDiagram-FKZM4ZOC-ZqoVSvsu.js → stateDiagram-FKZM4ZOC-CV9VCuVK.js} +1 -1
  44. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DQ10FejB.js +1 -0
  45. package/dist/client/assets/{terminal-instance-gybkMDHu.js → terminal-instance-C3nwiweh.js} +1 -1
  46. package/dist/client/assets/{timeline-definition-IT6M3QCI-DQwpSE-n.js → timeline-definition-IT6M3QCI-Bzm_qoWF.js} +1 -1
  47. package/dist/client/assets/{treemap-GDKQZRPO-DK4UuMc6.js → treemap-GDKQZRPO-gouxKMUq.js} +1 -1
  48. package/dist/client/assets/{xychartDiagram-PRI3JC2R-CJP1ULwR.js → xychartDiagram-PRI3JC2R-DqSTMw-l.js} +1 -1
  49. package/dist/client/index.html +2 -2
  50. package/dist/prisma/generated/enums.d.ts +1 -0
  51. package/dist/prisma/generated/enums.d.ts.map +1 -1
  52. package/dist/prisma/generated/enums.js +1 -0
  53. package/dist/prisma/generated/enums.js.map +1 -1
  54. package/dist/prisma/generated/internal/class.js +1 -1
  55. package/dist/prisma/generated/internal/class.js.map +1 -1
  56. package/dist/src/backend/app-context.d.ts.map +1 -1
  57. package/dist/src/backend/app-context.js +3 -0
  58. package/dist/src/backend/app-context.js.map +1 -1
  59. package/dist/src/backend/domains/github/github-cli/mappers.d.ts +1 -1
  60. package/dist/src/backend/domains/github/github-cli/mappers.d.ts.map +1 -1
  61. package/dist/src/backend/domains/github/github-cli/mappers.js +2 -37
  62. package/dist/src/backend/domains/github/github-cli/mappers.js.map +1 -1
  63. package/dist/src/backend/domains/github/github-cli.service.test.js +20 -0
  64. package/dist/src/backend/domains/github/github-cli.service.test.js.map +1 -1
  65. package/dist/src/backend/domains/linear/linear-state-sync.service.d.ts.map +1 -1
  66. package/dist/src/backend/domains/linear/linear-state-sync.service.js.map +1 -1
  67. package/dist/src/backend/domains/ratchet/bridges.d.ts +4 -0
  68. package/dist/src/backend/domains/ratchet/bridges.d.ts.map +1 -1
  69. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.d.ts +15 -0
  70. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.d.ts.map +1 -0
  71. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.js +126 -0
  72. package/dist/src/backend/domains/ratchet/ratchet-active-session.helpers.js.map +1 -0
  73. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.d.ts +14 -0
  74. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.d.ts.map +1 -0
  75. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.js +55 -0
  76. package/dist/src/backend/domains/ratchet/ratchet-fixer-dispatch.helpers.js.map +1 -0
  77. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.d.ts +107 -0
  78. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.d.ts.map +1 -0
  79. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.js +246 -0
  80. package/dist/src/backend/domains/ratchet/ratchet-pr-state.helpers.js.map +1 -0
  81. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.d.ts +16 -0
  82. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.d.ts.map +1 -0
  83. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.js +52 -0
  84. package/dist/src/backend/domains/ratchet/ratchet-review-poll.helpers.js.map +1 -0
  85. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts +6 -40
  86. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts.map +1 -1
  87. package/dist/src/backend/domains/ratchet/ratchet.service.js +99 -426
  88. package/dist/src/backend/domains/ratchet/ratchet.service.js.map +1 -1
  89. package/dist/src/backend/domains/ratchet/ratchet.types.d.ts +86 -0
  90. package/dist/src/backend/domains/ratchet/ratchet.types.d.ts.map +1 -0
  91. package/dist/src/backend/domains/ratchet/ratchet.types.js +2 -0
  92. package/dist/src/backend/domains/ratchet/ratchet.types.js.map +1 -0
  93. package/dist/src/backend/domains/ratchet/reconciliation.service.d.ts.map +1 -1
  94. package/dist/src/backend/domains/ratchet/reconciliation.service.js +1 -2
  95. package/dist/src/backend/domains/ratchet/reconciliation.service.js.map +1 -1
  96. package/dist/src/backend/domains/ratchet/reconciliation.service.test.js +8 -10
  97. package/dist/src/backend/domains/ratchet/reconciliation.service.test.js.map +1 -1
  98. package/dist/src/backend/domains/run-script/run-script.service.d.ts +1 -0
  99. package/dist/src/backend/domains/run-script/run-script.service.d.ts.map +1 -1
  100. package/dist/src/backend/domains/run-script/run-script.service.js +46 -19
  101. package/dist/src/backend/domains/run-script/run-script.service.js.map +1 -1
  102. package/dist/src/backend/domains/run-script/run-script.service.test.js +118 -0
  103. package/dist/src/backend/domains/run-script/run-script.service.test.js.map +1 -1
  104. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts +13 -1
  105. package/dist/src/backend/domains/session/acp/acp-event-translator.d.ts.map +1 -1
  106. package/dist/src/backend/domains/session/acp/acp-event-translator.js +86 -1
  107. package/dist/src/backend/domains/session/acp/acp-event-translator.js.map +1 -1
  108. package/dist/src/backend/domains/session/acp/acp-event-translator.test.js +39 -0
  109. package/dist/src/backend/domains/session/acp/acp-event-translator.test.js.map +1 -1
  110. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts +5 -0
  111. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts.map +1 -1
  112. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js +12 -12
  113. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js.map +1 -1
  114. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js +3 -12
  115. package/dist/src/backend/domains/session/acp/acp-runtime-manager.test.js.map +1 -1
  116. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.d.ts +1 -0
  117. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.d.ts.map +1 -1
  118. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.js +3 -0
  119. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/acp-adapter-utils.js.map +1 -1
  120. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +14 -15
  121. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
  122. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +74 -568
  123. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
  124. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.d.ts +16 -0
  125. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.d.ts.map +1 -0
  126. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.js +53 -0
  127. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/retry-logic.js.map +1 -0
  128. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.d.ts +20 -0
  129. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.d.ts.map +1 -0
  130. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.js +341 -0
  131. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-config-resolver.js.map +1 -0
  132. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.d.ts +41 -0
  133. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.d.ts.map +1 -0
  134. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.js +137 -0
  135. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-negotiation.js.map +1 -0
  136. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.d.ts +25 -0
  137. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.d.ts.map +1 -0
  138. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.js +47 -0
  139. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/session-state-container.js.map +1 -0
  140. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.d.ts +8 -0
  141. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.d.ts.map +1 -0
  142. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.js +37 -0
  143. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/shape-drift-reporter.js.map +1 -0
  144. package/dist/src/backend/domains/session/bridges.d.ts +5 -0
  145. package/dist/src/backend/domains/session/bridges.d.ts.map +1 -1
  146. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.d.ts.map +1 -1
  147. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.js +2 -2
  148. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.js.map +1 -1
  149. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.test.js +1 -1
  150. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.test.js.map +1 -1
  151. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js +2 -2
  152. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js.map +1 -1
  153. package/dist/src/backend/domains/session/data/{claude-session-history-loader.service.d.ts → session-history-loader.service.d.ts} +1 -1
  154. package/dist/src/backend/domains/session/data/session-history-loader.service.d.ts.map +1 -0
  155. package/dist/src/backend/domains/session/data/{claude-session-history-loader.service.js → session-history-loader.service.js} +4 -4
  156. package/dist/src/backend/domains/session/data/session-history-loader.service.js.map +1 -0
  157. package/dist/src/backend/domains/session/data/session-history-loader.service.test.d.ts +2 -0
  158. package/dist/src/backend/domains/session/data/session-history-loader.service.test.d.ts.map +1 -0
  159. package/dist/src/backend/domains/session/data/{claude-session-history-loader.service.test.js → session-history-loader.service.test.js} +6 -3
  160. package/dist/src/backend/domains/session/data/session-history-loader.service.test.js.map +1 -0
  161. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.d.ts +71 -0
  162. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.d.ts.map +1 -0
  163. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.js +404 -0
  164. package/dist/src/backend/domains/session/lifecycle/acp-event-processor.js.map +1 -0
  165. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts +0 -2
  166. package/dist/src/backend/domains/session/lifecycle/session.repository.d.ts.map +1 -1
  167. package/dist/src/backend/domains/session/lifecycle/session.repository.js +0 -3
  168. package/dist/src/backend/domains/session/lifecycle/session.repository.js.map +1 -1
  169. package/dist/src/backend/domains/session/lifecycle/session.repository.test.js +0 -1
  170. package/dist/src/backend/domains/session/lifecycle/session.repository.test.js.map +1 -1
  171. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts +8 -27
  172. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts.map +1 -1
  173. package/dist/src/backend/domains/session/lifecycle/session.service.js +64 -376
  174. package/dist/src/backend/domains/session/lifecycle/session.service.js.map +1 -1
  175. package/dist/src/backend/domains/session/lifecycle/session.service.test.js +92 -21
  176. package/dist/src/backend/domains/session/lifecycle/session.service.test.js.map +1 -1
  177. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.d.ts.map +1 -1
  178. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.js +2 -13
  179. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.js.map +1 -1
  180. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.test.js +15 -3
  181. package/dist/src/backend/domains/session/logging/acp-trace-logger.service.test.js.map +1 -1
  182. package/dist/src/backend/domains/session/logging/session-file-logger.service.js +1 -1
  183. package/dist/src/backend/domains/session/logging/session-file-logger.service.js.map +1 -1
  184. package/dist/src/backend/domains/session/logging/session-file-logger.service.test.js +3 -0
  185. package/dist/src/backend/domains/session/logging/session-file-logger.service.test.js.map +1 -1
  186. package/dist/src/backend/domains/session/session-domain.service.d.ts.map +1 -1
  187. package/dist/src/backend/domains/session/session-domain.service.js +16 -0
  188. package/dist/src/backend/domains/session/session-domain.service.js.map +1 -1
  189. package/dist/src/backend/domains/session/session-domain.service.test.js +34 -0
  190. package/dist/src/backend/domains/session/session-domain.service.test.js.map +1 -1
  191. package/dist/src/backend/domains/session/store/file-lock.service.d.ts.map +1 -1
  192. package/dist/src/backend/domains/session/store/file-lock.service.js +2 -4
  193. package/dist/src/backend/domains/session/store/file-lock.service.js.map +1 -1
  194. package/dist/src/backend/domains/session/store/file-lock.service.test.js +3 -0
  195. package/dist/src/backend/domains/session/store/file-lock.service.test.js.map +1 -1
  196. package/dist/src/backend/domains/workspace/index.d.ts +0 -1
  197. package/dist/src/backend/domains/workspace/index.d.ts.map +1 -1
  198. package/dist/src/backend/domains/workspace/index.js +0 -1
  199. package/dist/src/backend/domains/workspace/index.js.map +1 -1
  200. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.d.ts +8 -0
  201. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.d.ts.map +1 -1
  202. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.js +47 -5
  203. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.js.map +1 -1
  204. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.test.js +117 -22
  205. package/dist/src/backend/domains/workspace/lifecycle/state-machine.service.test.js.map +1 -1
  206. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts.map +1 -1
  207. package/dist/src/backend/domains/workspace/query/workspace-query.service.js +48 -44
  208. package/dist/src/backend/domains/workspace/query/workspace-query.service.js.map +1 -1
  209. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js +137 -97
  210. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js.map +1 -1
  211. package/dist/src/backend/domains/workspace/state/flow-state.d.ts +2 -2
  212. package/dist/src/backend/domains/workspace/state/flow-state.d.ts.map +1 -1
  213. package/dist/src/backend/domains/workspace/state/flow-state.js.map +1 -1
  214. package/dist/src/backend/domains/workspace/state/init-policy.js +1 -1
  215. package/dist/src/backend/domains/workspace/state/init-policy.js.map +1 -1
  216. package/dist/src/backend/domains/workspace/state/kanban-state.d.ts.map +1 -1
  217. package/dist/src/backend/domains/workspace/state/kanban-state.js +3 -2
  218. package/dist/src/backend/domains/workspace/state/kanban-state.js.map +1 -1
  219. package/dist/src/backend/interceptors/conversation-rename.interceptor.d.ts.map +1 -1
  220. package/dist/src/backend/interceptors/conversation-rename.interceptor.js +16 -2
  221. package/dist/src/backend/interceptors/conversation-rename.interceptor.js.map +1 -1
  222. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js +15 -3
  223. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js.map +1 -1
  224. package/dist/src/backend/interceptors/index.d.ts +2 -0
  225. package/dist/src/backend/interceptors/index.d.ts.map +1 -1
  226. package/dist/src/backend/interceptors/index.js +6 -0
  227. package/dist/src/backend/interceptors/index.js.map +1 -1
  228. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.d.ts.map +1 -1
  229. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.js +8 -0
  230. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.js.map +1 -1
  231. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.js +5 -1
  232. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.js.map +1 -1
  233. package/dist/src/backend/interceptors/pre-push-rename.interceptor.d.ts.map +1 -1
  234. package/dist/src/backend/interceptors/pre-push-rename.interceptor.js +3 -0
  235. package/dist/src/backend/interceptors/pre-push-rename.interceptor.js.map +1 -1
  236. package/dist/src/backend/interceptors/registry.d.ts +5 -0
  237. package/dist/src/backend/interceptors/registry.d.ts.map +1 -1
  238. package/dist/src/backend/interceptors/registry.js +51 -0
  239. package/dist/src/backend/interceptors/registry.js.map +1 -1
  240. package/dist/src/backend/interceptors/types.d.ts +2 -0
  241. package/dist/src/backend/interceptors/types.d.ts.map +1 -1
  242. package/dist/src/backend/lib/workspace-derived-state.d.ts +47 -0
  243. package/dist/src/backend/lib/workspace-derived-state.d.ts.map +1 -0
  244. package/dist/src/backend/lib/workspace-derived-state.js +31 -0
  245. package/dist/src/backend/lib/workspace-derived-state.js.map +1 -0
  246. package/dist/src/backend/lib/workspace-derived-state.test.d.ts +2 -0
  247. package/dist/src/backend/lib/workspace-derived-state.test.d.ts.map +1 -0
  248. package/dist/src/backend/lib/workspace-derived-state.test.js +66 -0
  249. package/dist/src/backend/lib/workspace-derived-state.test.js.map +1 -0
  250. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
  251. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +3 -0
  252. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
  253. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js +19 -1
  254. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js.map +1 -1
  255. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  256. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +16 -6
  257. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
  258. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +63 -30
  259. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
  260. package/dist/src/backend/orchestration/workspace-init-script-pipeline.d.ts +18 -0
  261. package/dist/src/backend/orchestration/workspace-init-script-pipeline.d.ts.map +1 -0
  262. package/dist/src/backend/orchestration/workspace-init-script-pipeline.js +75 -0
  263. package/dist/src/backend/orchestration/workspace-init-script-pipeline.js.map +1 -0
  264. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  265. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +22 -73
  266. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  267. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +75 -16
  268. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js.map +1 -1
  269. package/dist/src/backend/resource_accessors/project.accessor.js +1 -1
  270. package/dist/src/backend/resource_accessors/project.accessor.js.map +1 -1
  271. package/dist/src/backend/routers/websocket/snapshots.handler.d.ts.map +1 -1
  272. package/dist/src/backend/routers/websocket/snapshots.handler.js +17 -6
  273. package/dist/src/backend/routers/websocket/snapshots.handler.js.map +1 -1
  274. package/dist/src/backend/routers/websocket/snapshots.handler.test.js +40 -5
  275. package/dist/src/backend/routers/websocket/snapshots.handler.test.js.map +1 -1
  276. package/dist/src/backend/routers/websocket/websocket.integration.test.js +1 -0
  277. package/dist/src/backend/routers/websocket/websocket.integration.test.js.map +1 -1
  278. package/dist/src/backend/server.d.ts.map +1 -1
  279. package/dist/src/backend/server.js +6 -2
  280. package/dist/src/backend/server.js.map +1 -1
  281. package/dist/src/backend/server.upgrade.test.js +2 -0
  282. package/dist/src/backend/server.upgrade.test.js.map +1 -1
  283. package/dist/src/backend/services/check-single-writer.test.d.ts +2 -0
  284. package/dist/src/backend/services/check-single-writer.test.d.ts.map +1 -0
  285. package/dist/src/backend/services/check-single-writer.test.js +132 -0
  286. package/dist/src/backend/services/check-single-writer.test.js.map +1 -0
  287. package/dist/src/backend/services/config.service.d.ts +14 -6
  288. package/dist/src/backend/services/config.service.d.ts.map +1 -1
  289. package/dist/src/backend/services/config.service.js +31 -9
  290. package/dist/src/backend/services/config.service.js.map +1 -1
  291. package/dist/src/backend/services/env-schemas.d.ts +7 -3
  292. package/dist/src/backend/services/env-schemas.d.ts.map +1 -1
  293. package/dist/src/backend/services/env-schemas.js +19 -3
  294. package/dist/src/backend/services/env-schemas.js.map +1 -1
  295. package/dist/src/backend/services/run-script-config-persistence.service.d.ts +37 -0
  296. package/dist/src/backend/services/run-script-config-persistence.service.d.ts.map +1 -0
  297. package/dist/src/backend/services/run-script-config-persistence.service.js +73 -0
  298. package/dist/src/backend/services/run-script-config-persistence.service.js.map +1 -0
  299. package/dist/src/backend/services/run-script-config-persistence.service.test.d.ts +2 -0
  300. package/dist/src/backend/services/run-script-config-persistence.service.test.d.ts.map +1 -0
  301. package/dist/src/backend/services/run-script-config-persistence.service.test.js +111 -0
  302. package/dist/src/backend/services/run-script-config-persistence.service.test.js.map +1 -0
  303. package/dist/src/backend/services/run-script-proxy.service.d.ts.map +1 -1
  304. package/dist/src/backend/services/run-script-proxy.service.js +2 -1
  305. package/dist/src/backend/services/run-script-proxy.service.js.map +1 -1
  306. package/dist/src/backend/services/run-script-proxy.service.test.js +4 -0
  307. package/dist/src/backend/services/run-script-proxy.service.test.js.map +1 -1
  308. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts +3 -3
  309. package/dist/src/backend/services/workspace-snapshot-store.service.d.ts.map +1 -1
  310. package/dist/src/backend/services/workspace-snapshot-store.service.js +13 -12
  311. package/dist/src/backend/services/workspace-snapshot-store.service.js.map +1 -1
  312. package/dist/src/backend/services/workspace-snapshot-store.service.test.js +3 -0
  313. package/dist/src/backend/services/workspace-snapshot-store.service.test.js.map +1 -1
  314. package/dist/src/backend/trpc/admin.router.test.js +0 -2
  315. package/dist/src/backend/trpc/admin.router.test.js.map +1 -1
  316. package/dist/src/backend/trpc/admin.trpc.d.ts +2 -7
  317. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  318. package/dist/src/backend/trpc/admin.trpc.js +0 -1
  319. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  320. package/dist/src/backend/trpc/index.d.ts +8 -13
  321. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  322. package/dist/src/backend/trpc/project.trpc.d.ts +3 -3
  323. package/dist/src/backend/trpc/workspace/run-script.router.test.js +31 -4
  324. package/dist/src/backend/trpc/workspace/run-script.router.test.js.map +1 -1
  325. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts.map +1 -1
  326. package/dist/src/backend/trpc/workspace/run-script.trpc.js +8 -8
  327. package/dist/src/backend/trpc/workspace/run-script.trpc.js.map +1 -1
  328. package/dist/src/backend/trpc/workspace.router.test.js +6 -1
  329. package/dist/src/backend/trpc/workspace.router.test.js.map +1 -1
  330. package/dist/src/backend/trpc/workspace.trpc.d.ts +3 -3
  331. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  332. package/dist/src/backend/trpc/workspace.trpc.js +19 -13
  333. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  334. package/dist/src/cli/index.js +5 -2
  335. package/dist/src/cli/index.js.map +1 -1
  336. package/dist/src/shared/core/ci-status.d.ts +6 -4
  337. package/dist/src/shared/core/ci-status.d.ts.map +1 -1
  338. package/dist/src/shared/core/ci-status.js +47 -13
  339. package/dist/src/shared/core/ci-status.js.map +1 -1
  340. package/dist/src/shared/core/enums.d.ts +1 -0
  341. package/dist/src/shared/core/enums.d.ts.map +1 -1
  342. package/dist/src/shared/core/enums.js +1 -0
  343. package/dist/src/shared/core/enums.js.map +1 -1
  344. package/dist/src/shared/core/index.d.ts +1 -1
  345. package/dist/src/shared/core/index.d.ts.map +1 -1
  346. package/dist/src/shared/core/index.js +1 -1
  347. package/dist/src/shared/core/index.js.map +1 -1
  348. package/dist/src/shared/schemas/export-data.schema.d.ts +2 -0
  349. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  350. package/dist/src/shared/schemas/issue-tracker-config.schema.d.ts +2 -2
  351. package/dist/src/shared/workspace-flow-state.d.ts +3 -0
  352. package/dist/src/shared/workspace-flow-state.d.ts.map +1 -0
  353. package/dist/src/shared/workspace-flow-state.js +2 -0
  354. package/dist/src/shared/workspace-flow-state.js.map +1 -0
  355. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  356. package/package.json +1 -1
  357. package/prisma/migrations/20260224150000_add_workspace_archiving_state/migration.sql +4 -0
  358. package/prisma/schema.prisma +1 -0
  359. package/dist/client/assets/channel-B_f9a3jD.js +0 -1
  360. package/dist/client/assets/classDiagram-2ON5EDUG-CgnrkUO8.js +0 -1
  361. package/dist/client/assets/classDiagram-v2-WZHVMYZB-CgnrkUO8.js +0 -1
  362. package/dist/client/assets/clone-BmilxOGI.js +0 -1
  363. package/dist/client/assets/index-DVprBuNv.css +0 -1
  364. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-BRKf4wQr.js +0 -1
  365. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.d.ts.map +0 -1
  366. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.js.map +0 -1
  367. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.test.d.ts +0 -2
  368. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.test.d.ts.map +0 -1
  369. package/dist/src/backend/domains/session/data/claude-session-history-loader.service.test.js.map +0 -1
  370. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.d.ts +0 -10
  371. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.d.ts.map +0 -1
  372. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.js +0 -24
  373. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.js.map +0 -1
  374. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.d.ts +0 -2
  375. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.d.ts.map +0 -1
  376. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.js +0 -17
  377. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.js.map +0 -1
@@ -2,127 +2,16 @@ import { Readable, Writable } from 'node:stream';
2
2
  import { AgentSideConnection, ndJsonStream, PROTOCOL_VERSION, RequestError, } from '@agentclientprotocol/sdk';
3
3
  import { asString, dedupeStrings, extractLocations, isRecord, resolveToolCallId, } from './acp-adapter-utils.js';
4
4
  import { CodexRequestError, CodexRpcClient } from './codex-rpc-client.js';
5
- import { collaborationModeListResponseSchema, configRequirementsReadResponseSchema, modelListResponseSchema, threadResumeResponseSchema, threadStartResponseSchema, turnStartResponseSchema, } from './codex-zod.js';
5
+ import { turnStartResponseSchema } from './codex-zod.js';
6
6
  import { resolveCommandDisplay } from './command-metadata.js';
7
7
  import { handleCodexServerPermissionRequest } from './protocol-permission-handler.js';
8
+ import { attachCloseWatcherWithRetry } from './retry-logic.js';
9
+ import { buildConfigOptions, createSandboxPolicyFromMode, getCollaborationModeValues, getExecutionPresets, isKnownModel, isReasoningEffortSupportedForModel, resolveCollaborationModeLabel, resolveDefaultCollaborationMode, resolveDefaultModel, resolveReasoningEffortForModel, resolveSandboxPolicy, resolveSessionModel, resolveTurnCollaborationMode, } from './session-config-resolver.js';
10
+ import { loadCollaborationModes, loadConfigRequirements, loadModelCatalog, negotiateNewSession, negotiateSessionResume, } from './session-negotiation.js';
11
+ import { CodexAdapterSessionStateContainer } from './session-state-container.js';
12
+ import { ShapeDriftReporter } from './shape-drift-reporter.js';
8
13
  import { CodexStreamEventHandler } from './stream-event-handler.js';
9
14
  const PENDING_TURN_ID = '__pending_turn__';
10
- const MAX_CLOSE_WATCHER_ATTACH_RETRIES = 50;
11
- const DEFAULT_APPROVAL_POLICIES = ['on-failure', 'on-request', 'never'];
12
- const DEFAULT_SANDBOX_MODES = ['read-only', 'workspace-write', 'danger-full-access'];
13
- const SHAPE_DRIFT_DETAILS_LIMIT = 700;
14
- function toShapeDriftDetails(value) {
15
- try {
16
- const text = JSON.stringify(value);
17
- if (typeof text !== 'string') {
18
- return '[unserializable]';
19
- }
20
- return text.length > SHAPE_DRIFT_DETAILS_LIMIT
21
- ? `${text.slice(0, SHAPE_DRIFT_DETAILS_LIMIT)}...`
22
- : text;
23
- }
24
- catch {
25
- return '[unserializable]';
26
- }
27
- }
28
- function isNonEmptyString(value) {
29
- return typeof value === 'string' && value.trim().length > 0;
30
- }
31
- function humanizeToken(value) {
32
- return value
33
- .split(/[-_]/)
34
- .filter((part) => part.length > 0)
35
- .map((part) => part.slice(0, 1).toUpperCase() + part.slice(1))
36
- .join(' ');
37
- }
38
- function sanitizeModeName(mode) {
39
- return mode
40
- .split('_')
41
- .map((part) => part.slice(0, 1).toUpperCase() + part.slice(1))
42
- .join(' ');
43
- }
44
- function formatApprovalPolicyLabel(policy) {
45
- if (policy === 'on-request') {
46
- return 'On Request';
47
- }
48
- if (policy === 'on-failure') {
49
- return 'On Failure';
50
- }
51
- if (policy === 'never') {
52
- return 'Never Ask';
53
- }
54
- if (policy === 'untrusted') {
55
- return 'Untrusted';
56
- }
57
- return humanizeToken(policy);
58
- }
59
- function formatSandboxModeLabel(mode) {
60
- if (mode === 'workspace-write') {
61
- return 'Workspace Write';
62
- }
63
- if (mode === 'read-only') {
64
- return 'Read-only';
65
- }
66
- if (mode === 'danger-full-access') {
67
- return 'Full Access';
68
- }
69
- return humanizeToken(mode);
70
- }
71
- function formatExecutionPresetName(approvalPolicy, sandboxMode) {
72
- if (approvalPolicy === 'never' && sandboxMode === 'danger-full-access') {
73
- return 'YOLO (Full Access)';
74
- }
75
- return `${formatApprovalPolicyLabel(approvalPolicy)} (${formatSandboxModeLabel(sandboxMode)})`;
76
- }
77
- function createWorkspaceWriteSandboxPolicy(cwd) {
78
- return {
79
- type: 'workspaceWrite',
80
- writableRoots: [cwd],
81
- readOnlyAccess: { type: 'fullAccess' },
82
- networkAccess: true,
83
- excludeTmpdirEnvVar: false,
84
- excludeSlashTmp: false,
85
- };
86
- }
87
- function createDangerFullAccessSandboxPolicy() {
88
- return {
89
- type: 'dangerFullAccess',
90
- };
91
- }
92
- function parseSandboxModeFromPolicy(policy) {
93
- if (!isRecord(policy)) {
94
- return null;
95
- }
96
- const policyType = asString(policy.type);
97
- if (policyType === 'workspaceWrite') {
98
- return 'workspace-write';
99
- }
100
- if (policyType === 'readOnly') {
101
- return 'read-only';
102
- }
103
- if (policyType === 'dangerFullAccess') {
104
- return 'danger-full-access';
105
- }
106
- return null;
107
- }
108
- function createSandboxPolicyFromMode(mode, cwd) {
109
- if (mode === 'danger-full-access') {
110
- return createDangerFullAccessSandboxPolicy();
111
- }
112
- if (mode === 'read-only') {
113
- return {
114
- type: 'readOnly',
115
- access: { type: 'fullAccess' },
116
- };
117
- }
118
- return createWorkspaceWriteSandboxPolicy(cwd);
119
- }
120
- function toSessionId(threadId) {
121
- return `sess_${threadId}`;
122
- }
123
- function toThreadId(sessionId) {
124
- return sessionId.startsWith('sess_') ? sessionId.slice('sess_'.length) : sessionId;
125
- }
126
15
  function isPlanLikeMode(mode) {
127
16
  return /plan/i.test(mode);
128
17
  }
@@ -284,112 +173,34 @@ function parseTextFromPromptBlock(block) {
284
173
  }
285
174
  return JSON.stringify(block);
286
175
  }
287
- function createCollaborationModeConfigOption(currentMode, collaborationModes) {
288
- const options = collaborationModes
289
- .filter((entry) => isNonEmptyString(entry.mode))
290
- .map((entry) => ({
291
- value: entry.mode,
292
- name: entry.name,
293
- }));
294
- if (!options.some((option) => option.value === currentMode)) {
295
- options.unshift({ value: currentMode, name: sanitizeModeName(currentMode) });
296
- }
297
- return {
298
- id: 'mode',
299
- category: 'mode',
300
- name: 'Collaboration Mode',
301
- type: 'select',
302
- currentValue: currentMode,
303
- options,
304
- };
305
- }
306
- function createModelConfigOption(currentModel, modelCatalog) {
307
- const options = modelCatalog.map((model) => ({
308
- value: model.id,
309
- name: model.displayName,
310
- description: model.description,
311
- }));
312
- if (!options.some((option) => option.value === currentModel)) {
313
- options.unshift({ value: currentModel, name: currentModel });
314
- }
315
- return {
316
- id: 'model',
317
- category: 'model',
318
- name: 'Model',
319
- type: 'select',
320
- currentValue: currentModel,
321
- options,
322
- };
323
- }
324
- function createReasoningEffortConfigOption(currentReasoningEffort, modelCatalog, currentModel) {
325
- const modelEntry = modelCatalog.find((model) => model.id === currentModel);
326
- if (!modelEntry) {
327
- return null;
328
- }
329
- const supportedEntries = modelEntry.supportedReasoningEfforts.filter((entry) => isNonEmptyString(entry.reasoningEffort));
330
- if (supportedEntries.length === 0) {
331
- return null;
332
- }
333
- const supportedByValue = new Map();
334
- for (const entry of supportedEntries) {
335
- if (!supportedByValue.has(entry.reasoningEffort)) {
336
- supportedByValue.set(entry.reasoningEffort, entry.description);
337
- }
338
- }
339
- const supportedValues = [...supportedByValue.keys()];
340
- const resolvedCurrent = currentReasoningEffort && supportedByValue.has(currentReasoningEffort)
341
- ? currentReasoningEffort
342
- : supportedByValue.has(modelEntry.defaultReasoningEffort)
343
- ? modelEntry.defaultReasoningEffort
344
- : supportedValues[0];
345
- if (!resolvedCurrent) {
346
- return null;
347
- }
348
- return {
349
- id: 'reasoning_effort',
350
- category: 'thought_level',
351
- name: 'Reasoning Effort',
352
- type: 'select',
353
- currentValue: resolvedCurrent,
354
- options: supportedValues.map((value) => ({
355
- value,
356
- name: value,
357
- ...(supportedByValue.get(value) ? { description: supportedByValue.get(value) } : {}),
358
- })),
359
- };
360
- }
361
- function createExecutionModeConfigOption(currentPresetId, presets) {
362
- return {
363
- id: 'execution_mode',
364
- category: 'permission',
365
- name: 'Execution Mode',
366
- type: 'select',
367
- currentValue: currentPresetId,
368
- options: presets.map((preset) => ({
369
- value: preset.id,
370
- name: preset.name,
371
- ...(preset.description ? { description: preset.description } : {}),
372
- })),
373
- };
374
- }
375
- function toExecutionPresetId(approvalPolicy, sandboxMode) {
376
- return JSON.stringify([approvalPolicy, sandboxMode]);
377
- }
378
176
  export class CodexAppServerAcpAdapter {
379
177
  connection;
380
178
  codex;
381
- sessions = new Map();
382
- sessionIdByThreadId = new Map();
179
+ stateContainer = new CodexAdapterSessionStateContainer();
383
180
  modelCatalog = [];
384
181
  allowedApprovalPolicies = [];
385
182
  allowedSandboxModes = [];
386
183
  collaborationModes = [];
387
- mcpServersByThreadId = new Map();
388
- appliedMcpServerConfigJson = '{}';
389
- shapeDriftCounts = new Map();
184
+ shapeDriftReporter;
390
185
  streamEventHandler;
391
- constructor(connection, codexClient) {
186
+ get sessions() {
187
+ return this.stateContainer.sessions;
188
+ }
189
+ get sessionIdByThreadId() {
190
+ return this.stateContainer.sessionIdByThreadId;
191
+ }
192
+ get mcpServersByThreadId() {
193
+ return this.stateContainer.mcpServersByThreadId;
194
+ }
195
+ get appliedMcpServerConfigJson() {
196
+ return this.stateContainer.appliedMcpServerConfigJson;
197
+ }
198
+ set appliedMcpServerConfigJson(value) {
199
+ this.stateContainer.appliedMcpServerConfigJson = value;
200
+ }
201
+ constructor(connection, codexClient, options) {
392
202
  this.connection = connection;
203
+ this.shapeDriftReporter = new ShapeDriftReporter(options?.shapeDriftWarn);
393
204
  this.codex =
394
205
  codexClient ??
395
206
  new CodexRpcClient({
@@ -434,28 +245,14 @@ export class CodexAppServerAcpAdapter {
434
245
  this.monitorConnectionClose();
435
246
  }
436
247
  monitorConnectionClose() {
437
- let attachAttempts = 0;
438
- const attachCloseWatcher = () => {
439
- try {
440
- void this.connection.closed
441
- .finally(async () => {
442
- await this.codex.stop();
443
- })
444
- .catch(() => {
445
- });
446
- }
447
- catch {
448
- attachAttempts += 1;
449
- if (attachAttempts >= MAX_CLOSE_WATCHER_ATTACH_RETRIES) {
450
- process.stderr.write(`[codex-app-server-acp] failed to attach close watcher after ${MAX_CLOSE_WATCHER_ATTACH_RETRIES} attempts\n`);
451
- void this.codex.stop();
452
- return;
453
- }
454
- const retryTimer = setTimeout(attachCloseWatcher, 0);
455
- retryTimer.unref?.();
456
- }
457
- };
458
- queueMicrotask(attachCloseWatcher);
248
+ attachCloseWatcherWithRetry({
249
+ getClosed: () => this.connection.closed,
250
+ onClose: async () => this.codex.stop(),
251
+ onAttachRetryLimitReached: (maxAttempts) => {
252
+ process.stderr.write(`[codex-app-server-acp] failed to attach close watcher after ${maxAttempts} attempts\n`);
253
+ void this.codex.stop();
254
+ },
255
+ });
459
256
  }
460
257
  async initialize(_params) {
461
258
  this.codex.start();
@@ -469,11 +266,11 @@ export class CodexAppServerAcpAdapter {
469
266
  },
470
267
  });
471
268
  this.codex.notify('initialized');
472
- const configRequirements = await this.loadConfigRequirements();
269
+ const configRequirements = await loadConfigRequirements({ codex: this.codex });
473
270
  this.allowedApprovalPolicies = configRequirements.allowedApprovalPolicies;
474
271
  this.allowedSandboxModes = configRequirements.allowedSandboxModes;
475
- this.collaborationModes = await this.loadCollaborationModes();
476
- this.modelCatalog = await this.loadModelCatalog();
272
+ this.collaborationModes = await loadCollaborationModes({ codex: this.codex });
273
+ this.modelCatalog = await loadModelCatalog({ codex: this.codex });
477
274
  return {
478
275
  protocolVersion: PROTOCOL_VERSION,
479
276
  agentInfo: {
@@ -491,91 +288,42 @@ export class CodexAppServerAcpAdapter {
491
288
  };
492
289
  }
493
290
  async newSession(params) {
494
- const defaultModel = this.resolveDefaultModel();
495
- const responseRaw = await this.codex.request('thread/start', {
291
+ const negotiatedSession = await negotiateNewSession({
292
+ codex: this.codex,
496
293
  cwd: params.cwd,
497
- model: defaultModel,
294
+ resolveDefaultModel: () => this.resolveDefaultModel(),
295
+ resolveSessionModel: (model, fallbackModel) => this.resolveSessionModel(model, fallbackModel),
296
+ resolveSandboxPolicy: (sandbox, cwd) => this.resolveSandboxPolicy(sandbox, cwd),
297
+ resolveReasoningEffortForModel: (modelId, candidateReasoningEffort) => this.resolveReasoningEffortForModel(modelId, candidateReasoningEffort),
298
+ resolveDefaultCollaborationMode: () => this.resolveDefaultCollaborationMode(),
498
299
  });
499
- const response = threadStartResponseSchema.parse(responseRaw);
500
- const sessionId = toSessionId(response.thread.id);
501
- const approvalPolicy = this.requireApprovalPolicy(response.approvalPolicy, 'thread/start');
502
- const model = this.resolveSessionModel(response.model, defaultModel);
503
- const sandboxPolicy = this.resolveSandboxPolicy(response.sandbox, params.cwd);
504
- const reasoningEffort = this.resolveReasoningEffortForModel(model, response.reasoningEffort);
505
- const collaborationMode = this.resolveDefaultCollaborationMode();
506
- const session = {
507
- sessionId,
508
- threadId: response.thread.id,
509
- cwd: params.cwd,
510
- defaults: {
511
- model,
512
- approvalPolicy,
513
- sandboxPolicy,
514
- reasoningEffort,
515
- collaborationMode,
516
- },
517
- activeTurn: null,
518
- toolCallsByItemId: new Map(),
519
- syntheticallyCompletedToolItemIds: new Set(),
520
- reasoningDeltaItemIds: new Set(),
521
- planTextByItemId: new Map(),
522
- planApprovalRequestedByTurnId: new Set(),
523
- pendingPlanApprovalsByTurnId: new Map(),
524
- pendingTurnCompletionsByTurnId: new Map(),
525
- commandApprovalScopes: new Set(),
526
- replayedTurnItemKeys: new Set(),
527
- };
528
- this.sessions.set(sessionId, session);
529
- this.sessionIdByThreadId.set(session.threadId, sessionId);
300
+ const session = this.stateContainer.createSession(negotiatedSession);
301
+ this.stateContainer.registerSession(session);
530
302
  try {
531
303
  await this.applyMcpServers(session.threadId, params.mcpServers);
532
304
  }
533
305
  catch (error) {
534
- this.sessions.delete(sessionId);
535
- this.sessionIdByThreadId.delete(session.threadId);
306
+ this.stateContainer.deleteSession(negotiatedSession.sessionId);
536
307
  throw error;
537
308
  }
538
309
  return {
539
- sessionId,
310
+ sessionId: negotiatedSession.sessionId,
540
311
  configOptions: this.buildConfigOptions(session),
541
312
  };
542
313
  }
543
314
  async loadSession(params) {
544
- const threadId = toThreadId(params.sessionId);
545
- const responseRaw = await this.codex.request('thread/resume', {
546
- threadId,
547
- cwd: params.cwd,
548
- });
549
- const response = threadResumeResponseSchema.parse(responseRaw);
550
- const approvalPolicy = this.requireApprovalPolicy(response.approvalPolicy, 'thread/resume');
551
- const model = this.resolveSessionModel(response.model, this.resolveDefaultModel());
552
- const sandboxPolicy = this.resolveSandboxPolicy(response.sandbox, params.cwd);
553
- const reasoningEffort = this.resolveReasoningEffortForModel(model, response.reasoningEffort);
554
- const collaborationMode = this.resolveDefaultCollaborationMode();
555
- const session = {
315
+ const negotiatedSession = await negotiateSessionResume({
316
+ codex: this.codex,
556
317
  sessionId: params.sessionId,
557
- threadId: response.thread.id,
558
318
  cwd: params.cwd,
559
- defaults: {
560
- model,
561
- approvalPolicy,
562
- sandboxPolicy,
563
- reasoningEffort,
564
- collaborationMode,
565
- },
566
- activeTurn: null,
567
- toolCallsByItemId: new Map(),
568
- syntheticallyCompletedToolItemIds: new Set(),
569
- reasoningDeltaItemIds: new Set(),
570
- planTextByItemId: new Map(),
571
- planApprovalRequestedByTurnId: new Set(),
572
- pendingPlanApprovalsByTurnId: new Map(),
573
- pendingTurnCompletionsByTurnId: new Map(),
574
- commandApprovalScopes: new Set(),
575
- replayedTurnItemKeys: new Set(),
576
- };
577
- this.sessions.set(session.sessionId, session);
578
- this.sessionIdByThreadId.set(session.threadId, session.sessionId);
319
+ resolveDefaultModel: () => this.resolveDefaultModel(),
320
+ resolveSessionModel: (model, fallbackModel) => this.resolveSessionModel(model, fallbackModel),
321
+ resolveSandboxPolicy: (sandbox, cwd) => this.resolveSandboxPolicy(sandbox, cwd),
322
+ resolveReasoningEffortForModel: (modelId, candidateReasoningEffort) => this.resolveReasoningEffortForModel(modelId, candidateReasoningEffort),
323
+ resolveDefaultCollaborationMode: () => this.resolveDefaultCollaborationMode(),
324
+ });
325
+ const session = this.stateContainer.createSession(negotiatedSession);
326
+ this.stateContainer.registerSession(session);
579
327
  try {
580
328
  await this.applyMcpServers(session.threadId, params.mcpServers);
581
329
  await this.replayThreadHistory(session.sessionId, session.threadId);
@@ -586,8 +334,7 @@ export class CodexAppServerAcpAdapter {
586
334
  }
587
335
  catch {
588
336
  }
589
- this.sessions.delete(session.sessionId);
590
- this.sessionIdByThreadId.delete(session.threadId);
337
+ this.stateContainer.deleteSession(session.sessionId);
591
338
  throw error;
592
339
  }
593
340
  return {
@@ -639,7 +386,7 @@ export class CodexAppServerAcpAdapter {
639
386
  break;
640
387
  }
641
388
  case 'model': {
642
- if (!this.modelCatalog.some((model) => model.id === params.value)) {
389
+ if (!isKnownModel(this.modelCatalog, params.value)) {
643
390
  throw RequestError.invalidParams({
644
391
  configId: params.configId,
645
392
  value: params.value,
@@ -651,12 +398,7 @@ export class CodexAppServerAcpAdapter {
651
398
  }
652
399
  case 'reasoning_effort':
653
400
  case 'thought_level': {
654
- const modelEntry = this.modelCatalog.find((model) => model.id === session.defaults.model);
655
- const supportedReasoningEfforts = modelEntry?.supportedReasoningEfforts ?? [];
656
- const supportedValues = new Set(supportedReasoningEfforts
657
- .map((entry) => entry.reasoningEffort)
658
- .filter((effort) => isNonEmptyString(effort)));
659
- if (!supportedValues.has(params.value)) {
401
+ if (!isReasoningEffortSupportedForModel(this.modelCatalog, session.defaults.model, params.value)) {
660
402
  throw RequestError.invalidParams({
661
403
  configId: params.configId,
662
404
  value: params.value,
@@ -806,15 +548,7 @@ export class CodexAppServerAcpAdapter {
806
548
  }
807
549
  }
808
550
  resolveDefaultModel() {
809
- const preferred = this.modelCatalog.find((model) => model.isDefault);
810
- const fallback = this.modelCatalog[0]?.id;
811
- if (preferred?.id) {
812
- return preferred.id;
813
- }
814
- if (fallback) {
815
- return fallback;
816
- }
817
- throw new Error('Codex app-server model/list returned no models');
551
+ return resolveDefaultModel(this.modelCatalog);
818
552
  }
819
553
  buildMergedMcpServersConfig() {
820
554
  const merged = {};
@@ -887,256 +621,36 @@ export class CodexAppServerAcpAdapter {
887
621
  }
888
622
  }
889
623
  buildConfigOptions(session) {
890
- const executionPresets = this.getExecutionPresets(session);
891
- const currentExecutionPreset = this.resolveExecutionPresetId(session, executionPresets);
892
- const configOptions = [
893
- createModelConfigOption(session.defaults.model, this.modelCatalog),
894
- createCollaborationModeConfigOption(session.defaults.collaborationMode, this.collaborationModes),
895
- createExecutionModeConfigOption(currentExecutionPreset, executionPresets),
896
- ];
897
- const reasoningOption = createReasoningEffortConfigOption(session.defaults.reasoningEffort, this.modelCatalog, session.defaults.model);
898
- if (reasoningOption) {
899
- configOptions.push(reasoningOption);
900
- }
901
- return configOptions;
902
- }
903
- requireApprovalPolicy(approvalPolicy, source) {
904
- if (!isNonEmptyString(approvalPolicy)) {
905
- throw new Error(`Codex ${source} response did not include approvalPolicy`);
906
- }
907
- return approvalPolicy;
624
+ return buildConfigOptions(session, this.modelCatalog, this.collaborationModes, this.allowedApprovalPolicies, this.allowedSandboxModes);
908
625
  }
909
626
  resolveSessionModel(model, fallbackModel) {
910
- return isNonEmptyString(model) ? model : fallbackModel;
627
+ return resolveSessionModel(model, fallbackModel);
911
628
  }
912
629
  resolveSandboxPolicy(sandbox, cwd) {
913
- return isRecord(sandbox) ? sandbox : createWorkspaceWriteSandboxPolicy(cwd);
630
+ return resolveSandboxPolicy(sandbox, cwd);
914
631
  }
915
632
  resolveDefaultCollaborationMode() {
916
- if (this.collaborationModes.length === 0) {
917
- throw new Error('Codex collaborationMode/list returned no modes');
918
- }
919
- const preferredDefault = this.collaborationModes.find((entry) => entry.mode === 'default');
920
- const firstMode = this.collaborationModes[0]?.mode;
921
- if (!firstMode) {
922
- throw new Error('Codex collaborationMode/list returned an invalid mode entry');
923
- }
924
- return preferredDefault?.mode ?? firstMode;
633
+ return resolveDefaultCollaborationMode(this.collaborationModes);
925
634
  }
926
635
  resolveTurnCollaborationMode(session) {
927
- const modeEntry = this.collaborationModes.find((entry) => entry.mode === session.defaults.collaborationMode);
928
- return {
929
- mode: modeEntry?.mode ?? session.defaults.collaborationMode,
930
- settings: {
931
- model: modeEntry?.model ?? session.defaults.model,
932
- reasoning_effort: modeEntry?.reasoningEffort ?? session.defaults.reasoningEffort,
933
- developer_instructions: modeEntry?.developerInstructions ?? null,
934
- },
935
- };
636
+ return resolveTurnCollaborationMode(this.collaborationModes, session);
936
637
  }
937
638
  resolveReasoningEffortForModel(modelId, candidateReasoningEffort) {
938
- const modelEntry = this.modelCatalog.find((entry) => entry.id === modelId);
939
- if (!modelEntry) {
940
- return null;
941
- }
942
- const supportedEntries = modelEntry.supportedReasoningEfforts.filter((entry) => isNonEmptyString(entry.reasoningEffort));
943
- if (supportedEntries.length === 0) {
944
- return null;
945
- }
946
- const supportedValues = dedupeStrings(supportedEntries.map((entry) => entry.reasoningEffort));
947
- if (isNonEmptyString(candidateReasoningEffort) &&
948
- supportedValues.includes(candidateReasoningEffort)) {
949
- return candidateReasoningEffort;
950
- }
951
- if (supportedValues.includes(modelEntry.defaultReasoningEffort)) {
952
- return modelEntry.defaultReasoningEffort;
953
- }
954
- return supportedValues[0] ?? null;
639
+ return resolveReasoningEffortForModel(this.modelCatalog, modelId, candidateReasoningEffort);
955
640
  }
956
641
  getCollaborationModeValues(currentMode) {
957
- const values = this.collaborationModes
958
- .map((entry) => entry.mode)
959
- .filter((mode) => isNonEmptyString(mode));
960
- if (!values.includes(currentMode)) {
961
- values.unshift(currentMode);
962
- }
963
- return dedupeStrings(values);
964
- }
965
- resolveCurrentSandboxMode(session) {
966
- const currentSandboxMode = parseSandboxModeFromPolicy(session.defaults.sandboxPolicy);
967
- if (currentSandboxMode) {
968
- return currentSandboxMode;
969
- }
970
- const allowedSandboxMode = this.allowedSandboxModes[0];
971
- if (allowedSandboxMode) {
972
- return allowedSandboxMode;
973
- }
974
- throw new Error('Unable to resolve current sandbox mode for execution-mode options');
642
+ return getCollaborationModeValues(this.collaborationModes, currentMode);
975
643
  }
976
644
  getExecutionPresets(session) {
977
- const currentSandboxMode = this.resolveCurrentSandboxMode(session);
978
- const policies = this.allowedApprovalPolicies.length > 0
979
- ? this.allowedApprovalPolicies
980
- : [session.defaults.approvalPolicy];
981
- const sandboxModes = this.allowedSandboxModes.length > 0 ? this.allowedSandboxModes : [currentSandboxMode];
982
- const presets = [];
983
- const seen = new Set();
984
- const addPreset = (approvalPolicy, sandboxMode, description) => {
985
- const id = toExecutionPresetId(approvalPolicy, sandboxMode);
986
- if (seen.has(id)) {
987
- return;
988
- }
989
- seen.add(id);
990
- presets.push({
991
- id,
992
- name: formatExecutionPresetName(approvalPolicy, sandboxMode),
993
- ...(description ? { description } : {}),
994
- approvalPolicy,
995
- sandboxMode,
996
- });
997
- };
998
- addPreset(session.defaults.approvalPolicy, currentSandboxMode, `Current session: ${formatExecutionPresetName(session.defaults.approvalPolicy, currentSandboxMode)}`);
999
- for (const policy of policies) {
1000
- for (const sandboxMode of sandboxModes) {
1001
- addPreset(policy, sandboxMode);
1002
- }
1003
- }
1004
- return presets;
1005
- }
1006
- resolveExecutionPresetId(session, presets) {
1007
- const currentSandboxMode = this.resolveCurrentSandboxMode(session);
1008
- const currentPresetId = toExecutionPresetId(session.defaults.approvalPolicy, currentSandboxMode);
1009
- const fallbackPresetId = presets[0]?.id;
1010
- if (!fallbackPresetId) {
1011
- throw new Error('Execution-mode presets are unavailable for this session');
1012
- }
1013
- return presets.some((preset) => preset.id === currentPresetId)
1014
- ? currentPresetId
1015
- : fallbackPresetId;
645
+ return getExecutionPresets(session, this.allowedApprovalPolicies, this.allowedSandboxModes);
1016
646
  }
1017
647
  requireSession(sessionId) {
1018
- const session = this.sessions.get(sessionId);
648
+ const session = this.stateContainer.getSession(sessionId);
1019
649
  if (!session) {
1020
650
  throw RequestError.invalidParams({ sessionId });
1021
651
  }
1022
652
  return session;
1023
653
  }
1024
- async loadConfigRequirements() {
1025
- const raw = await this.codex.request('configRequirements/read', undefined);
1026
- const parsed = configRequirementsReadResponseSchema.parse(raw);
1027
- const requirements = parsed.requirements;
1028
- const allowedApprovalPolicies = dedupeStrings((requirements?.allowedApprovalPolicies ?? []).filter(isNonEmptyString));
1029
- const allowedSandboxModes = dedupeStrings((requirements?.allowedSandboxModes ?? []).filter((mode) => mode === 'read-only' || mode === 'workspace-write' || mode === 'danger-full-access'));
1030
- const hasExplicitApprovalPolicies = Array.isArray(requirements?.allowedApprovalPolicies);
1031
- const hasExplicitSandboxModes = Array.isArray(requirements?.allowedSandboxModes);
1032
- return {
1033
- allowedApprovalPolicies: allowedApprovalPolicies.length > 0
1034
- ? allowedApprovalPolicies
1035
- : hasExplicitApprovalPolicies
1036
- ? []
1037
- : DEFAULT_APPROVAL_POLICIES,
1038
- allowedSandboxModes: allowedSandboxModes.length > 0
1039
- ? allowedSandboxModes
1040
- : hasExplicitSandboxModes
1041
- ? []
1042
- : DEFAULT_SANDBOX_MODES,
1043
- };
1044
- }
1045
- async loadCollaborationModes() {
1046
- const entries = [];
1047
- let cursor = null;
1048
- for (;;) {
1049
- const response = await this.requestCollaborationModeListWithRetry(cursor);
1050
- entries.push(...response.data.flatMap((entry) => isNonEmptyString(entry.mode)
1051
- ? [
1052
- {
1053
- mode: entry.mode,
1054
- name: entry.name,
1055
- model: entry.model ?? null,
1056
- reasoningEffort: entry.reasoning_effort ?? null,
1057
- developerInstructions: entry.developer_instructions ?? null,
1058
- },
1059
- ]
1060
- : []));
1061
- cursor = response.nextCursor ?? null;
1062
- if (!cursor) {
1063
- break;
1064
- }
1065
- }
1066
- if (entries.length === 0) {
1067
- throw new Error('Codex collaborationMode/list returned no modes');
1068
- }
1069
- return entries;
1070
- }
1071
- async requestCollaborationModeListWithRetry(cursor, maxAttempts = 3) {
1072
- let attempt = 0;
1073
- let lastError;
1074
- while (attempt < maxAttempts) {
1075
- attempt += 1;
1076
- try {
1077
- const raw = await this.codex.request('collaborationMode/list', cursor ? { cursor } : {});
1078
- return collaborationModeListResponseSchema.parse(raw);
1079
- }
1080
- catch (error) {
1081
- lastError = error;
1082
- if (!(error instanceof CodexRequestError) ||
1083
- error.code !== -32_001 ||
1084
- attempt >= maxAttempts) {
1085
- throw error;
1086
- }
1087
- const delayMs = Math.round(2 ** attempt * 100 + Math.random() * 120);
1088
- await new Promise((resolve) => setTimeout(resolve, delayMs));
1089
- }
1090
- }
1091
- throw lastError;
1092
- }
1093
- async loadModelCatalog() {
1094
- const models = [];
1095
- let cursor = null;
1096
- for (;;) {
1097
- const response = await this.requestModelListWithRetry(cursor);
1098
- models.push(...response.data.map((model) => ({
1099
- id: model.id,
1100
- displayName: model.displayName,
1101
- description: model.description,
1102
- defaultReasoningEffort: model.defaultReasoningEffort,
1103
- supportedReasoningEfforts: (model.supportedReasoningEfforts ?? [])
1104
- .filter((entry) => isNonEmptyString(entry.reasoningEffort))
1105
- .map((entry) => ({
1106
- reasoningEffort: entry.reasoningEffort,
1107
- description: entry.description,
1108
- })),
1109
- inputModalities: model.inputModalities ?? [],
1110
- isDefault: model.isDefault ?? false,
1111
- })));
1112
- cursor = response.nextCursor ?? null;
1113
- if (!cursor) {
1114
- return models;
1115
- }
1116
- }
1117
- }
1118
- async requestModelListWithRetry(cursor, maxAttempts = 3) {
1119
- let attempt = 0;
1120
- let lastError;
1121
- while (attempt < maxAttempts) {
1122
- attempt += 1;
1123
- try {
1124
- const raw = await this.codex.request('model/list', cursor ? { cursor } : {});
1125
- return modelListResponseSchema.parse(raw);
1126
- }
1127
- catch (error) {
1128
- lastError = error;
1129
- if (!(error instanceof CodexRequestError) ||
1130
- error.code !== -32_001 ||
1131
- attempt >= maxAttempts) {
1132
- throw error;
1133
- }
1134
- const delayMs = Math.round(2 ** attempt * 100 + Math.random() * 120);
1135
- await new Promise((resolve) => setTimeout(resolve, delayMs));
1136
- }
1137
- }
1138
- throw lastError;
1139
- }
1140
654
  async replayThreadHistory(sessionId, threadId) {
1141
655
  await this.streamEventHandler.replayThreadHistory(sessionId, threadId);
1142
656
  }
@@ -1196,11 +710,7 @@ export class CodexAppServerAcpAdapter {
1196
710
  return left.localeCompare(right);
1197
711
  }
1198
712
  resolveCollaborationModeLabel(modeId) {
1199
- const entry = this.collaborationModes.find((candidate) => candidate.mode === modeId);
1200
- if (entry?.name) {
1201
- return entry.name;
1202
- }
1203
- return sanitizeModeName(modeId);
713
+ return resolveCollaborationModeLabel(this.collaborationModes, modeId);
1204
714
  }
1205
715
  buildPlanApprovalOptions(session) {
1206
716
  const currentMode = session.defaults.collaborationMode;
@@ -1413,11 +923,7 @@ export class CodexAppServerAcpAdapter {
1413
923
  session.pendingTurnCompletionsByTurnId.clear();
1414
924
  }
1415
925
  reportShapeDrift(event, details) {
1416
- const count = (this.shapeDriftCounts.get(event) ?? 0) + 1;
1417
- this.shapeDriftCounts.set(event, count);
1418
- const includeDetails = details !== undefined && (count <= 5 || count % 50 === 0);
1419
- const detailsSuffix = includeDetails ? ` details=${toShapeDriftDetails(details)}` : '';
1420
- process.stderr.write(`[codex-app-server-acp] shape-drift event=${event} count=${count}${detailsSuffix}\n`);
926
+ this.shapeDriftReporter.report(event, details);
1421
927
  }
1422
928
  async emitSessionUpdate(sessionId, update) {
1423
929
  try {
@@ -1427,10 +933,10 @@ export class CodexAppServerAcpAdapter {
1427
933
  }
1428
934
  }
1429
935
  }
1430
- export function runCodexAppServerAcpAdapter() {
936
+ export function runCodexAppServerAcpAdapter(options) {
1431
937
  const output = Writable.toWeb(process.stdout);
1432
938
  const input = Readable.toWeb(process.stdin);
1433
939
  const stream = ndJsonStream(output, input);
1434
- new AgentSideConnection((connection) => new CodexAppServerAcpAdapter(connection), stream);
940
+ new AgentSideConnection((connection) => new CodexAppServerAcpAdapter(connection, undefined, options), stream);
1435
941
  }
1436
942
  //# sourceMappingURL=codex-app-server-acp-adapter.js.map