factory-factory 0.4.9 → 0.4.11

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 (2029) hide show
  1. package/README.md +18 -14
  2. package/dist/client/assets/Archive.es-BE-C3QlQ.js +1 -0
  3. package/dist/client/assets/ArrowDown.es-4I45mlTH.js +1 -0
  4. package/dist/client/assets/ArrowLeft.es-DN5jQwPJ.js +1 -0
  5. package/dist/client/assets/CaretLeft.es-9DxLcb6_.js +1 -0
  6. package/dist/client/assets/CheckCircle.es-DXonq-sZ.js +1 -0
  7. package/dist/client/assets/FileCode.es-DR_LOoWF.js +1 -0
  8. package/dist/client/assets/GitBranch.es-mG-NJT2D.js +38 -0
  9. package/dist/client/assets/Microphone.es-Dxzgml4h.js +1 -0
  10. package/dist/client/assets/Plus.es-BWjwMswT.js +1 -0
  11. package/dist/client/assets/Warning.es-IZ9KCqrC.js +1 -0
  12. package/dist/client/assets/abnfDiagram-WEYOIA3C-DVEiY1ie.js +1 -0
  13. package/dist/client/assets/admin-page-D7lZMWat.js +1 -0
  14. package/dist/client/assets/alert-B2Dogz3x.js +1 -0
  15. package/dist/client/assets/appearance-C0wAeEbK.js +1 -0
  16. package/dist/client/assets/appearance-DUV_jbpk.js +1 -0
  17. package/dist/client/assets/arc-DgcGdgmL.js +1 -0
  18. package/dist/client/assets/architecture-WOLXFQ4H-D8_bqkQ5.js +1 -0
  19. package/dist/client/assets/architectureDiagram-ZHVYKT53-DK1iJQs8.js +36 -0
  20. package/dist/client/assets/badge-otjWVZmT.js +1 -0
  21. package/dist/client/assets/blockDiagram-RJAE7QA3-BrArLTPu.js +140 -0
  22. package/dist/client/assets/c4Diagram-XDPPPE54-D8IsOgad.js +38 -0
  23. package/dist/client/assets/channel-BTLnaWNu.js +1 -0
  24. package/dist/client/assets/chunk-2E7WHVMD-2-65BeVg.js +88 -0
  25. package/dist/client/assets/chunk-4EMNKR2T-BrjAojhc.js +1 -0
  26. package/dist/client/assets/chunk-55XCU76K-CW553Dnn.js +1 -0
  27. package/dist/client/assets/chunk-7S6XSTFO-CFBOM1Lj.js +2 -0
  28. package/dist/client/assets/chunk-AQDTSKZB-6rQWSZYM.js +72 -0
  29. package/dist/client/assets/chunk-DSNLSHJZ-CUGqfRgF.js +129 -0
  30. package/dist/client/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
  31. package/dist/client/assets/chunk-HAGFOTED-Ck2rJx94.js +62 -0
  32. package/dist/client/assets/chunk-HNE4Q36P-Bbv56IAo.js +1 -0
  33. package/dist/client/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
  34. package/dist/client/assets/chunk-NGNAAXSQ-DqoPQk1a.js +136 -0
  35. package/dist/client/assets/chunk-NQOKRVIF-C0DH8BgT.js +213 -0
  36. package/dist/client/assets/chunk-UHW7PFBP-CyPOv_kz.js +1 -0
  37. package/dist/client/assets/chunk-VQ5W62QI-CTVLuqLY.js +1 -0
  38. package/dist/client/assets/chunk-WQQL4CDK-BJt_wgBJ.js +10 -0
  39. package/dist/client/assets/chunk-XXDRQBXY-BvKO0v-W.js +1 -0
  40. package/dist/client/assets/chunk-YZO67HFG-DbxSk-ct.js +1 -0
  41. package/dist/client/assets/chunk-ZAUX2LTX-CVjhoX0K.js +1 -0
  42. package/dist/client/assets/chunk-ZCHMQSOR-BMffM2ys.js +2 -0
  43. package/dist/client/assets/classDiagram-v2-4MYWR3UA-BkEgkiR0.js +217 -0
  44. package/dist/client/assets/components-p5I0A6Vd.js +1 -0
  45. package/dist/client/assets/confirm-dialog-DhOUf6MK.js +1 -0
  46. package/dist/client/assets/cose-bilkent-JH36ORCC-COXSdE6a.js +1 -0
  47. package/dist/client/assets/cynefin-EF2NZ3EQ-rxH1tEn5.js +1 -0
  48. package/dist/client/assets/cynefinDiagram-WF24UDRP-CAVj5u85.js +62 -0
  49. package/dist/client/assets/cytoscape.esm-Yq6u8L66.js +321 -0
  50. package/dist/client/assets/dagre-NK4GIZVX-Dht732Rd.js +4 -0
  51. package/dist/client/assets/data-import-button-DJYdu7Eb.js +6 -0
  52. package/dist/client/assets/detail-5iYq6r8r.js +1 -0
  53. package/dist/client/assets/diagram-CBK3MWTC-9mCqagmF.js +24 -0
  54. package/dist/client/assets/diagram-I5XIIV2D-BcCCh8oH.js +24 -0
  55. package/dist/client/assets/diagram-ODIL2UCW-BzeAmH9A.js +30 -0
  56. package/dist/client/assets/diagram-PFBEJUXE-D59aoLTm.js +3 -0
  57. package/dist/client/assets/diagram-RJA3I4VV-B7BaY0Ni.js +41 -0
  58. package/dist/client/assets/diagram-TYUNFSNR-CedzMphh.js +200 -0
  59. package/dist/client/assets/diff-highlight.worker-C1Klarob.js +124 -0
  60. package/dist/client/assets/diff-viewer-BYwKQ2p9.js +1 -0
  61. package/dist/client/assets/dist-1TKc18Bj.js +1 -0
  62. package/dist/client/assets/dist-73BCHs_0.js +41 -0
  63. package/dist/client/assets/dist-B_J_HbC0.js +1 -0
  64. package/dist/client/assets/dist-Cxtf14PY.js +1 -0
  65. package/dist/client/assets/dist-D8Wfxh48.js +1 -0
  66. package/dist/client/assets/ebnfDiagram-V4P3TTPT-C4-3Ub50.js +1 -0
  67. package/dist/client/assets/elk-QONTBCTQ-oNnVvW-r.js +27 -0
  68. package/dist/client/assets/en-US-D47MEQ2P.js +1 -0
  69. package/dist/client/assets/erDiagram-KYQIGQAA-Cg853NMH.js +99 -0
  70. package/dist/client/assets/eventmodeling-K75KTNOO-DHQo3qm_.js +1 -0
  71. package/dist/client/assets/factory-config-scripts-vPMzLtkM.js +1 -0
  72. package/dist/client/assets/file-viewer-DVd46AFa.css +1 -0
  73. package/dist/client/assets/file-viewer-c_SCdIkJ.js +6 -0
  74. package/dist/client/assets/flowDiagram-IUGLLWBU-DqHx31a9.js +1 -0
  75. package/dist/client/assets/ganttDiagram-R7GPNTJY-DKzE8bVz.js +292 -0
  76. package/dist/client/assets/gitGraph-VSP46ZUC-rAFoVncH.js +1 -0
  77. package/dist/client/assets/gitGraphDiagram-PDYL7XHY-C1uuBdCy.js +106 -0
  78. package/dist/client/assets/home-chNeaYGH.js +1 -0
  79. package/dist/client/assets/hooks-BUzAAw4j.js +1 -0
  80. package/dist/client/assets/index-ChVJBrR6.css +2 -0
  81. package/dist/client/assets/index-WEPhGzO4.js +10 -0
  82. package/dist/client/assets/info-OHQRW6UA-gLd3etLY.js +1 -0
  83. package/dist/client/assets/infoDiagram-MVDRKAX5-DGRB_CjG.js +2 -0
  84. package/dist/client/assets/input-CEdVqLrs.js +1 -0
  85. package/dist/client/assets/ishikawaDiagram-HPEHV2GE-BxVUtvw6.js +70 -0
  86. package/dist/client/assets/journeyDiagram-BOSHW7O7-C6wB5m3H.js +139 -0
  87. package/dist/client/assets/jsx-runtime-D1cyW64m.js +1 -0
  88. package/dist/client/assets/kanban-column-projection-BU6FRtAn.js +1 -0
  89. package/dist/client/assets/kanban-definition-FNSA4HC5-Bn5vEICj.js +89 -0
  90. package/dist/client/assets/katex-CqLmZ2j0.js +257 -0
  91. package/dist/client/assets/label-B9QTA9_a.js +1 -0
  92. package/dist/client/assets/lib-BSQ3Lw06.js +1 -0
  93. package/dist/client/assets/line-BbL9OV4X.js +1 -0
  94. package/dist/client/assets/linear-BUnzfXgk.js +1 -0
  95. package/dist/client/assets/list-BMxVZIFW.js +1 -0
  96. package/dist/client/assets/list-BVGKUBT-.js +30 -0
  97. package/dist/client/assets/logs-CR0XV-h_.js +1 -0
  98. package/dist/client/assets/markdown-BoT1wClA.js +32 -0
  99. package/dist/client/assets/mermaid-diagram-Bfra6L_Q.js +44 -0
  100. package/dist/client/assets/mermaid-parser.core-cMhM95A-.js +7 -0
  101. package/dist/client/assets/mindmap-definition-6OY57UG3-BAAg07RN.js +98 -0
  102. package/dist/client/assets/mobile-baseline-Dfn8816-.js +10 -0
  103. package/dist/client/assets/new-CwGEOm_r.js +1 -0
  104. package/dist/client/assets/new-DhJS4n1v.js +1 -0
  105. package/dist/client/assets/packet-JDAUHWVQ-QS8JM89I.js +1 -0
  106. package/dist/client/assets/page-header-hwXw08Vy.js +1 -0
  107. package/dist/client/assets/pegDiagram-ECIUJNBX-BfHNXHz7.js +1 -0
  108. package/dist/client/assets/pie-XZMESJXO-CmwD9NEw.js +1 -0
  109. package/dist/client/assets/pieDiagram-GNMPY74T-reb72QD2.js +39 -0
  110. package/dist/client/assets/pr-inbox-item-CE0t_DNT.js +4 -0
  111. package/dist/client/assets/preload-helper-BLdHbfdN.js +1 -0
  112. package/dist/client/assets/project-repo-form-CrHt3I4k.js +1 -0
  113. package/dist/client/assets/quadrantDiagram-D57K4MC3-CWx7vew-.js +7 -0
  114. package/dist/client/assets/radar-ABXABTNO-DvCNdtQs.js +1 -0
  115. package/dist/client/assets/radio-group-C43J47HT.js +1 -0
  116. package/dist/client/assets/railroad-I3PHUGI6-bGESLDGJ.js +1 -0
  117. package/dist/client/assets/railroad-abnf-LNEFI6M7-CCmkN-sh.js +1 -0
  118. package/dist/client/assets/railroad-ebnf-DWYD2UWJ-CX1IEXFW.js +1 -0
  119. package/dist/client/assets/railroad-peg-JR7BVNR7-c0faYJjC.js +1 -0
  120. package/dist/client/assets/railroadDiagram-Y72NRBL7-Din1EVGd.js +1 -0
  121. package/dist/client/assets/redirect-DTpIUCRQ.js +1 -0
  122. package/dist/client/assets/requirementDiagram-EQYSW5RA-jBsqqIzq.js +84 -0
  123. package/dist/client/assets/reviews-B3PkJukE.js +1 -0
  124. package/dist/client/assets/rolldown-runtime-Dd_uD5pT.js +1 -0
  125. package/dist/client/assets/sankeyDiagram-SY24JHO5-CPFBcT81.js +40 -0
  126. package/dist/client/assets/schemas-BP-Iz5w3.js +55 -0
  127. package/dist/client/assets/select-KX1N4UhM.js +1 -0
  128. package/dist/client/assets/sequenceDiagram-BLEHNHQU-D73V4VuD.js +169 -0
  129. package/dist/client/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
  130. package/dist/client/assets/src-oBChb5qS.js +1 -0
  131. package/dist/client/assets/startup-script-form-DKZhwUVZ.js +1 -0
  132. package/dist/client/assets/stateDiagram-v2-A6IESKWZ-BkzWbLnl.js +291 -0
  133. package/dist/client/assets/styles-DoMUeUYO.js +4 -0
  134. package/dist/client/assets/swimlanes-B3ENRKFQ-Ce1aOeOr.js +1 -0
  135. package/dist/client/assets/swimlanesDiagram-AYQRV4AK-BpG-n3st.js +8 -0
  136. package/dist/client/assets/table-BenFunE4.js +1 -0
  137. package/dist/client/assets/tabs-u7304FGl.js +1 -0
  138. package/dist/client/assets/terminal-instance-95FxBwBb.js +16 -0
  139. package/dist/client/assets/textarea-ArqTtMgi.js +1 -0
  140. package/dist/client/assets/timeline-definition-JXYKGLGB-DF76e3wb.js +120 -0
  141. package/dist/client/assets/treeView-D4JQ5SDB-CJdcCvRA.js +1 -0
  142. package/dist/client/assets/treemap-SAJKECNS-DTBzxZDt.js +1 -0
  143. package/dist/client/assets/trpc-BMFFcCw2.js +2 -0
  144. package/dist/client/assets/use-download-server-log-CJjvMsx_.js +1 -0
  145. package/dist/client/assets/use-mobile-CtHsbvqp.js +1 -0
  146. package/dist/client/assets/use-persistent-scroll-BHuL8Pd-.js +1 -0
  147. package/dist/client/assets/use-project-header-navigation-DADIEa7B.js +1 -0
  148. package/dist/client/assets/use-websocket-transport-D4bs6Hno.js +1 -0
  149. package/dist/client/assets/usecaseDiagram-WPOLBNNX-DCQLhHhn.js +328 -0
  150. package/dist/client/assets/vennDiagram-Q3Y3IDCW-fnuOYsgr.js +34 -0
  151. package/dist/client/assets/wardley-7MLQ67FV-DV836ODM.js +1 -0
  152. package/dist/client/assets/wardleyDiagram-IVAIDKWA-BjTSHNYC.js +78 -0
  153. package/dist/client/assets/workspace-Bue-amA4.js +12 -0
  154. package/dist/client/assets/workspace-sidebar-status-DiNClksZ.js +4 -0
  155. package/dist/client/assets/xychartDiagram-4URNHDU4-Dx451vki.js +7 -0
  156. package/dist/client/index.html +70 -30
  157. package/dist/prisma/generated/browser.d.ts +4 -1
  158. package/dist/prisma/generated/browser.d.ts.map +1 -1
  159. package/dist/prisma/generated/client.d.ts +5 -2
  160. package/dist/prisma/generated/client.d.ts.map +1 -1
  161. package/dist/prisma/generated/commonInputTypes.d.ts +38 -29
  162. package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -1
  163. package/dist/prisma/generated/internal/class.d.ts +11 -2
  164. package/dist/prisma/generated/internal/class.d.ts.map +1 -1
  165. package/dist/prisma/generated/internal/class.js +7 -7
  166. package/dist/prisma/generated/internal/class.js.map +1 -1
  167. package/dist/prisma/generated/internal/prismaNamespace.d.ts +331 -51
  168. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  169. package/dist/prisma/generated/internal/prismaNamespace.js +68 -16
  170. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  171. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +78 -22
  172. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  173. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +66 -14
  174. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  175. package/dist/prisma/generated/models/AgentSession.d.ts +292 -2
  176. package/dist/prisma/generated/models/AgentSession.d.ts.map +1 -1
  177. package/dist/prisma/generated/models/ClosedSession.d.ts +1 -1
  178. package/dist/prisma/generated/models/DecisionLog.d.ts +1 -1
  179. package/dist/prisma/generated/models/PeriodicTask.d.ts +1 -1
  180. package/dist/prisma/generated/models/PeriodicTaskExecution.d.ts +1 -1
  181. package/dist/prisma/generated/models/Project.d.ts +1 -1
  182. package/dist/prisma/generated/models/SessionLifecycleEvent.d.ts +1 -1
  183. package/dist/prisma/generated/models/TerminalSession.d.ts +1 -1
  184. package/dist/prisma/generated/models/UserSettings.d.ts +316 -30
  185. package/dist/prisma/generated/models/UserSettings.d.ts.map +1 -1
  186. package/dist/prisma/generated/models/Workspace.d.ts +716 -263
  187. package/dist/prisma/generated/models/Workspace.d.ts.map +1 -1
  188. package/dist/prisma/generated/models/WorkspaceAutoIteration.d.ts +1 -1
  189. package/dist/prisma/generated/models/WorkspaceNotification.d.ts +1 -1
  190. package/dist/prisma/generated/models/WorkspacePR.d.ts +763 -156
  191. package/dist/prisma/generated/models/WorkspacePR.d.ts.map +1 -1
  192. package/dist/prisma/generated/models/WorkspacePRDedicatedSession.d.ts +469 -0
  193. package/dist/prisma/generated/models/WorkspacePRDedicatedSession.d.ts.map +1 -0
  194. package/dist/prisma/generated/models/WorkspacePRDedicatedSession.js +2 -0
  195. package/dist/prisma/generated/models/WorkspacePRDedicatedSession.js.map +1 -0
  196. package/dist/prisma/generated/models/WorkspacePRDiscovery.d.ts +493 -0
  197. package/dist/prisma/generated/models/WorkspacePRDiscovery.d.ts.map +1 -0
  198. package/dist/prisma/generated/models/WorkspacePRDiscovery.js +2 -0
  199. package/dist/prisma/generated/models/WorkspacePRDiscovery.js.map +1 -0
  200. package/dist/prisma/generated/models/WorkspacePREvent.d.ts +1180 -0
  201. package/dist/prisma/generated/models/WorkspacePREvent.d.ts.map +1 -0
  202. package/dist/prisma/generated/models/WorkspacePREvent.js +2 -0
  203. package/dist/prisma/generated/models/WorkspacePREvent.js.map +1 -0
  204. package/dist/prisma/generated/models/WorkspacePRMonitoring.d.ts +809 -0
  205. package/dist/prisma/generated/models/WorkspacePRMonitoring.d.ts.map +1 -0
  206. package/dist/prisma/generated/models/WorkspacePRMonitoring.js +2 -0
  207. package/dist/prisma/generated/models/WorkspacePRMonitoring.js.map +1 -0
  208. package/dist/prisma/generated/models/WorkspaceRunScript.d.ts +1 -1
  209. package/dist/prisma/generated/models.d.ts +4 -1
  210. package/dist/prisma/generated/models.d.ts.map +1 -1
  211. package/dist/prompts/adversarial-review/dispatch.md +93 -0
  212. package/dist/scripts/check-no-direct-process-env.d.mts.map +1 -1
  213. package/dist/scripts/check-no-direct-process-env.mjs +0 -2
  214. package/dist/scripts/check-no-direct-process-env.mjs.map +1 -1
  215. package/dist/src/backend/app-context.d.ts +9 -4
  216. package/dist/src/backend/app-context.d.ts.map +1 -1
  217. package/dist/src/backend/app-context.js +15 -9
  218. package/dist/src/backend/app-context.js.map +1 -1
  219. package/dist/src/backend/app-context.test.js +0 -1
  220. package/dist/src/backend/app-context.test.js.map +1 -1
  221. package/dist/src/backend/index.js +2 -10
  222. package/dist/src/backend/index.js.map +1 -1
  223. package/dist/src/backend/interceptors/branch-naming.interceptor.test.js +1 -1
  224. package/dist/src/backend/interceptors/branch-naming.interceptor.test.js.map +1 -1
  225. package/dist/src/backend/lib/codex-cli-command.d.ts +5 -0
  226. package/dist/src/backend/lib/codex-cli-command.d.ts.map +1 -0
  227. package/dist/src/backend/lib/codex-cli-command.js +10 -0
  228. package/dist/src/backend/lib/codex-cli-command.js.map +1 -0
  229. package/dist/src/backend/lib/request-trust.d.ts +1 -1
  230. package/dist/src/backend/lib/request-trust.d.ts.map +1 -1
  231. package/dist/src/backend/lib/request-trust.js +4 -1
  232. package/dist/src/backend/lib/request-trust.js.map +1 -1
  233. package/dist/src/backend/lib/request-trust.test.js +4 -0
  234. package/dist/src/backend/lib/request-trust.test.js.map +1 -1
  235. package/dist/src/backend/lib/workspace-derived-state.d.ts +5 -3
  236. package/dist/src/backend/lib/workspace-derived-state.d.ts.map +1 -1
  237. package/dist/src/backend/lib/workspace-derived-state.js +2 -7
  238. package/dist/src/backend/lib/workspace-derived-state.js.map +1 -1
  239. package/dist/src/backend/lib/workspace-derived-state.test.js +6 -21
  240. package/dist/src/backend/lib/workspace-derived-state.test.js.map +1 -1
  241. package/dist/src/backend/middleware/cors.middleware.d.ts.map +1 -1
  242. package/dist/src/backend/middleware/cors.middleware.js +3 -2
  243. package/dist/src/backend/middleware/cors.middleware.js.map +1 -1
  244. package/dist/src/backend/middleware/middleware.test.js +12 -0
  245. package/dist/src/backend/middleware/middleware.test.js.map +1 -1
  246. package/dist/src/backend/multiple-workspace-prs.migration.test.d.ts +2 -0
  247. package/dist/src/backend/multiple-workspace-prs.migration.test.d.ts.map +1 -0
  248. package/dist/src/backend/multiple-workspace-prs.migration.test.js +88 -0
  249. package/dist/src/backend/multiple-workspace-prs.migration.test.js.map +1 -0
  250. package/dist/src/backend/orchestration/adversarial-review-diff-line-index.d.ts +9 -0
  251. package/dist/src/backend/orchestration/adversarial-review-diff-line-index.d.ts.map +1 -0
  252. package/dist/src/backend/orchestration/adversarial-review-diff-line-index.js +87 -0
  253. package/dist/src/backend/orchestration/adversarial-review-diff-line-index.js.map +1 -0
  254. package/dist/src/backend/orchestration/adversarial-review-diff-line-index.test.d.ts +2 -0
  255. package/dist/src/backend/orchestration/adversarial-review-diff-line-index.test.d.ts.map +1 -0
  256. package/dist/src/backend/orchestration/adversarial-review-diff-line-index.test.js +91 -0
  257. package/dist/src/backend/orchestration/adversarial-review-diff-line-index.test.js.map +1 -0
  258. package/dist/src/backend/orchestration/adversarial-review-fallback.test.d.ts +2 -0
  259. package/dist/src/backend/orchestration/adversarial-review-fallback.test.d.ts.map +1 -0
  260. package/dist/src/backend/orchestration/adversarial-review-fallback.test.js +179 -0
  261. package/dist/src/backend/orchestration/adversarial-review-fallback.test.js.map +1 -0
  262. package/dist/src/backend/orchestration/adversarial-review.orchestrator.d.ts +15 -0
  263. package/dist/src/backend/orchestration/adversarial-review.orchestrator.d.ts.map +1 -0
  264. package/dist/src/backend/orchestration/adversarial-review.orchestrator.js +264 -0
  265. package/dist/src/backend/orchestration/adversarial-review.orchestrator.js.map +1 -0
  266. package/dist/src/backend/orchestration/adversarial-review.orchestrator.test.d.ts +2 -0
  267. package/dist/src/backend/orchestration/adversarial-review.orchestrator.test.d.ts.map +1 -0
  268. package/dist/src/backend/orchestration/adversarial-review.orchestrator.test.js +215 -0
  269. package/dist/src/backend/orchestration/adversarial-review.orchestrator.test.js.map +1 -0
  270. package/dist/src/backend/orchestration/cli-health.service.d.ts +0 -1
  271. package/dist/src/backend/orchestration/cli-health.service.d.ts.map +1 -1
  272. package/dist/src/backend/orchestration/cli-health.service.js +17 -22
  273. package/dist/src/backend/orchestration/cli-health.service.js.map +1 -1
  274. package/dist/src/backend/orchestration/cli-health.service.test.js +42 -41
  275. package/dist/src/backend/orchestration/cli-health.service.test.js.map +1 -1
  276. package/dist/src/backend/orchestration/data-backup-pr-events.d.ts +417 -0
  277. package/dist/src/backend/orchestration/data-backup-pr-events.d.ts.map +1 -0
  278. package/dist/src/backend/orchestration/data-backup-pr-events.js +77 -0
  279. package/dist/src/backend/orchestration/data-backup-pr-events.js.map +1 -0
  280. package/dist/src/backend/orchestration/data-backup.service.d.ts.map +1 -1
  281. package/dist/src/backend/orchestration/data-backup.service.js +125 -67
  282. package/dist/src/backend/orchestration/data-backup.service.js.map +1 -1
  283. package/dist/src/backend/orchestration/data-backup.service.test.js +124 -40
  284. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  285. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts +4 -5
  286. package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
  287. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +35 -54
  288. package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
  289. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js +50 -116
  290. package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js.map +1 -1
  291. package/dist/src/backend/orchestration/event-coalescer.integration.test.js +23 -5
  292. package/dist/src/backend/orchestration/event-coalescer.integration.test.js.map +1 -1
  293. package/dist/src/backend/orchestration/event-collector-pr-opened.test.d.ts +2 -0
  294. package/dist/src/backend/orchestration/event-collector-pr-opened.test.d.ts.map +1 -0
  295. package/dist/src/backend/orchestration/event-collector-pr-opened.test.js +65 -0
  296. package/dist/src/backend/orchestration/event-collector-pr-opened.test.js.map +1 -0
  297. package/dist/src/backend/orchestration/event-collector.idle-refresh.test.js +1 -0
  298. package/dist/src/backend/orchestration/event-collector.idle-refresh.test.js.map +1 -1
  299. package/dist/src/backend/orchestration/event-collector.linear.test.js +251 -15
  300. package/dist/src/backend/orchestration/event-collector.linear.test.js.map +1 -1
  301. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts +3 -0
  302. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
  303. package/dist/src/backend/orchestration/event-collector.orchestrator.js +121 -42
  304. package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
  305. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js +27 -35
  306. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js.map +1 -1
  307. package/dist/src/backend/orchestration/multiple-pr-attachment.integration.test.d.ts +2 -0
  308. package/dist/src/backend/orchestration/multiple-pr-attachment.integration.test.d.ts.map +1 -0
  309. package/dist/src/backend/orchestration/multiple-pr-attachment.integration.test.js +97 -0
  310. package/dist/src/backend/orchestration/multiple-pr-attachment.integration.test.js.map +1 -0
  311. package/dist/src/backend/orchestration/multiple-pr-backup.integration.test.d.ts +2 -0
  312. package/dist/src/backend/orchestration/multiple-pr-backup.integration.test.d.ts.map +1 -0
  313. package/dist/src/backend/orchestration/multiple-pr-backup.integration.test.js +532 -0
  314. package/dist/src/backend/orchestration/multiple-pr-backup.integration.test.js.map +1 -0
  315. package/dist/src/backend/orchestration/pr-attachment.integration.test.d.ts +2 -0
  316. package/dist/src/backend/orchestration/pr-attachment.integration.test.d.ts.map +1 -0
  317. package/dist/src/backend/orchestration/pr-attachment.integration.test.js +118 -0
  318. package/dist/src/backend/orchestration/pr-attachment.integration.test.js.map +1 -0
  319. package/dist/src/backend/orchestration/pr-dedicated-session.orchestrator.d.ts +9 -0
  320. package/dist/src/backend/orchestration/pr-dedicated-session.orchestrator.d.ts.map +1 -0
  321. package/dist/src/backend/orchestration/pr-dedicated-session.orchestrator.js +165 -0
  322. package/dist/src/backend/orchestration/pr-dedicated-session.orchestrator.js.map +1 -0
  323. package/dist/src/backend/orchestration/pr-dedicated-session.orchestrator.test.d.ts +2 -0
  324. package/dist/src/backend/orchestration/pr-dedicated-session.orchestrator.test.d.ts.map +1 -0
  325. package/dist/src/backend/orchestration/pr-dedicated-session.orchestrator.test.js +278 -0
  326. package/dist/src/backend/orchestration/pr-dedicated-session.orchestrator.test.js.map +1 -0
  327. package/dist/src/backend/orchestration/pr-delivery-dependencies.d.ts +5 -0
  328. package/dist/src/backend/orchestration/pr-delivery-dependencies.d.ts.map +1 -0
  329. package/dist/src/backend/orchestration/pr-delivery-dependencies.js +45 -0
  330. package/dist/src/backend/orchestration/pr-delivery-dependencies.js.map +1 -0
  331. package/dist/src/backend/orchestration/pr-delivery-readiness.d.ts +3 -0
  332. package/dist/src/backend/orchestration/pr-delivery-readiness.d.ts.map +1 -0
  333. package/dist/src/backend/orchestration/pr-delivery-readiness.js +21 -0
  334. package/dist/src/backend/orchestration/pr-delivery-readiness.js.map +1 -0
  335. package/dist/src/backend/orchestration/pr-delivery-readiness.test.d.ts +2 -0
  336. package/dist/src/backend/orchestration/pr-delivery-readiness.test.d.ts.map +1 -0
  337. package/dist/src/backend/orchestration/pr-delivery-readiness.test.js +34 -0
  338. package/dist/src/backend/orchestration/pr-delivery-readiness.test.js.map +1 -0
  339. package/dist/src/backend/orchestration/pr-delivery-recipient.d.ts +14 -0
  340. package/dist/src/backend/orchestration/pr-delivery-recipient.d.ts.map +1 -0
  341. package/dist/src/backend/orchestration/pr-delivery-recipient.js +15 -0
  342. package/dist/src/backend/orchestration/pr-delivery-recipient.js.map +1 -0
  343. package/dist/src/backend/orchestration/pr-delivery-recovery.d.ts +3 -0
  344. package/dist/src/backend/orchestration/pr-delivery-recovery.d.ts.map +1 -0
  345. package/dist/src/backend/orchestration/pr-delivery-recovery.js +68 -0
  346. package/dist/src/backend/orchestration/pr-delivery-recovery.js.map +1 -0
  347. package/dist/src/backend/orchestration/pr-event-delivery-port.d.ts +5 -0
  348. package/dist/src/backend/orchestration/pr-event-delivery-port.d.ts.map +1 -0
  349. package/dist/src/backend/orchestration/pr-event-delivery-port.js +101 -0
  350. package/dist/src/backend/orchestration/pr-event-delivery-port.js.map +1 -0
  351. package/dist/src/backend/orchestration/pr-event-delivery.orchestrator.d.ts +10 -0
  352. package/dist/src/backend/orchestration/pr-event-delivery.orchestrator.d.ts.map +1 -0
  353. package/dist/src/backend/orchestration/pr-event-delivery.orchestrator.js +235 -0
  354. package/dist/src/backend/orchestration/pr-event-delivery.orchestrator.js.map +1 -0
  355. package/dist/src/backend/orchestration/pr-event-delivery.orchestrator.test.d.ts +2 -0
  356. package/dist/src/backend/orchestration/pr-event-delivery.orchestrator.test.d.ts.map +1 -0
  357. package/dist/src/backend/orchestration/pr-event-delivery.orchestrator.test.js +524 -0
  358. package/dist/src/backend/orchestration/pr-event-delivery.orchestrator.test.js.map +1 -0
  359. package/dist/src/backend/orchestration/pr-event-flow.integration.test.d.ts +2 -0
  360. package/dist/src/backend/orchestration/pr-event-flow.integration.test.d.ts.map +1 -0
  361. package/dist/src/backend/orchestration/pr-event-flow.integration.test.js +299 -0
  362. package/dist/src/backend/orchestration/pr-event-flow.integration.test.js.map +1 -0
  363. package/dist/src/backend/orchestration/pr-event-projection.d.ts +17 -0
  364. package/dist/src/backend/orchestration/pr-event-projection.d.ts.map +1 -0
  365. package/dist/src/backend/orchestration/pr-event-projection.js +107 -0
  366. package/dist/src/backend/orchestration/pr-event-projection.js.map +1 -0
  367. package/dist/src/backend/orchestration/pr-event-projection.test.d.ts +2 -0
  368. package/dist/src/backend/orchestration/pr-event-projection.test.d.ts.map +1 -0
  369. package/dist/src/backend/orchestration/pr-event-projection.test.js +61 -0
  370. package/dist/src/backend/orchestration/pr-event-projection.test.js.map +1 -0
  371. package/dist/src/backend/orchestration/pr-monitoring-backup.integration.test.d.ts +2 -0
  372. package/dist/src/backend/orchestration/pr-monitoring-backup.integration.test.d.ts.map +1 -0
  373. package/dist/src/backend/orchestration/pr-monitoring-backup.integration.test.js +115 -0
  374. package/dist/src/backend/orchestration/pr-monitoring-backup.integration.test.js.map +1 -0
  375. package/dist/src/backend/orchestration/pr-monitoring-cutover.orchestrator.d.ts +6 -0
  376. package/dist/src/backend/orchestration/pr-monitoring-cutover.orchestrator.d.ts.map +1 -0
  377. package/dist/src/backend/orchestration/pr-monitoring-cutover.orchestrator.js +102 -0
  378. package/dist/src/backend/orchestration/pr-monitoring-cutover.orchestrator.js.map +1 -0
  379. package/dist/src/backend/orchestration/pr-monitoring-cutover.orchestrator.test.d.ts +2 -0
  380. package/dist/src/backend/orchestration/pr-monitoring-cutover.orchestrator.test.d.ts.map +1 -0
  381. package/dist/src/backend/orchestration/pr-monitoring-cutover.orchestrator.test.js +91 -0
  382. package/dist/src/backend/orchestration/pr-monitoring-cutover.orchestrator.test.js.map +1 -0
  383. package/dist/src/backend/orchestration/pr-monitoring-dependencies.d.ts +24 -0
  384. package/dist/src/backend/orchestration/pr-monitoring-dependencies.d.ts.map +1 -0
  385. package/dist/src/backend/orchestration/pr-monitoring-dependencies.js +51 -0
  386. package/dist/src/backend/orchestration/pr-monitoring-dependencies.js.map +1 -0
  387. package/dist/src/backend/orchestration/pr-monitoring-ports.d.ts +46 -0
  388. package/dist/src/backend/orchestration/pr-monitoring-ports.d.ts.map +1 -0
  389. package/dist/src/backend/orchestration/pr-monitoring-ports.js +2 -0
  390. package/dist/src/backend/orchestration/pr-monitoring-ports.js.map +1 -0
  391. package/dist/src/backend/orchestration/pr-monitoring.orchestrator.d.ts +24 -0
  392. package/dist/src/backend/orchestration/pr-monitoring.orchestrator.d.ts.map +1 -0
  393. package/dist/src/backend/orchestration/pr-monitoring.orchestrator.js +76 -0
  394. package/dist/src/backend/orchestration/pr-monitoring.orchestrator.js.map +1 -0
  395. package/dist/src/backend/orchestration/pr-monitoring.orchestrator.test.d.ts +2 -0
  396. package/dist/src/backend/orchestration/pr-monitoring.orchestrator.test.d.ts.map +1 -0
  397. package/dist/src/backend/orchestration/pr-monitoring.orchestrator.test.js +196 -0
  398. package/dist/src/backend/orchestration/pr-monitoring.orchestrator.test.js.map +1 -0
  399. package/dist/src/backend/orchestration/pr-observation.orchestrator.d.ts +6 -0
  400. package/dist/src/backend/orchestration/pr-observation.orchestrator.d.ts.map +1 -0
  401. package/dist/src/backend/orchestration/pr-observation.orchestrator.js +75 -0
  402. package/dist/src/backend/orchestration/pr-observation.orchestrator.js.map +1 -0
  403. package/dist/src/backend/orchestration/pr-observation.orchestrator.test.d.ts +2 -0
  404. package/dist/src/backend/orchestration/pr-observation.orchestrator.test.d.ts.map +1 -0
  405. package/dist/src/backend/orchestration/pr-observation.orchestrator.test.js +58 -0
  406. package/dist/src/backend/orchestration/pr-observation.orchestrator.test.js.map +1 -0
  407. package/dist/src/backend/orchestration/ratchet-projection.worker.d.ts +3 -1
  408. package/dist/src/backend/orchestration/ratchet-projection.worker.d.ts.map +1 -1
  409. package/dist/src/backend/orchestration/ratchet-projection.worker.js +13 -5
  410. package/dist/src/backend/orchestration/ratchet-projection.worker.js.map +1 -1
  411. package/dist/src/backend/orchestration/ratchet-projection.worker.test.js +39 -13
  412. package/dist/src/backend/orchestration/ratchet-projection.worker.test.js.map +1 -1
  413. package/dist/src/backend/orchestration/reconciliation.service.test.js +7 -1
  414. package/dist/src/backend/orchestration/reconciliation.service.test.js.map +1 -1
  415. package/dist/src/backend/orchestration/scheduler.service.d.ts.map +1 -1
  416. package/dist/src/backend/orchestration/scheduler.service.js +19 -19
  417. package/dist/src/backend/orchestration/scheduler.service.js.map +1 -1
  418. package/dist/src/backend/orchestration/scheduler.service.test.js +67 -44
  419. package/dist/src/backend/orchestration/scheduler.service.test.js.map +1 -1
  420. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts.map +1 -1
  421. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js +17 -15
  422. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js.map +1 -1
  423. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js +34 -31
  424. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js.map +1 -1
  425. package/dist/src/backend/orchestration/snapshot-reconciliation.streaming.test.js +7 -3
  426. package/dist/src/backend/orchestration/snapshot-reconciliation.streaming.test.js.map +1 -1
  427. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.d.ts.map +1 -1
  428. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.js +16 -7
  429. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.js.map +1 -1
  430. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +1 -2
  431. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  432. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +3 -2
  433. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
  434. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +2 -0
  435. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
  436. package/dist/src/backend/orchestration/workspace-children.orchestrator.d.ts.map +1 -1
  437. package/dist/src/backend/orchestration/workspace-children.orchestrator.js.map +1 -1
  438. package/dist/src/backend/orchestration/workspace-init-pr-binding.test.d.ts +2 -0
  439. package/dist/src/backend/orchestration/workspace-init-pr-binding.test.d.ts.map +1 -0
  440. package/dist/src/backend/orchestration/workspace-init-pr-binding.test.js +97 -0
  441. package/dist/src/backend/orchestration/workspace-init-pr-binding.test.js.map +1 -0
  442. package/dist/src/backend/orchestration/workspace-init-script-pipeline.d.ts +0 -2
  443. package/dist/src/backend/orchestration/workspace-init-script-pipeline.d.ts.map +1 -1
  444. package/dist/src/backend/orchestration/workspace-init-script-pipeline.js +2 -4
  445. package/dist/src/backend/orchestration/workspace-init-script-pipeline.js.map +1 -1
  446. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  447. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +20 -4
  448. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  449. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.d.ts +1 -1
  450. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.d.ts.map +1 -1
  451. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +4 -163
  452. package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js.map +1 -1
  453. package/dist/src/backend/orchestration/workspace-init.test-harness.d.ts +187 -0
  454. package/dist/src/backend/orchestration/workspace-init.test-harness.d.ts.map +1 -0
  455. package/dist/src/backend/orchestration/workspace-init.test-harness.js +170 -0
  456. package/dist/src/backend/orchestration/workspace-init.test-harness.js.map +1 -0
  457. package/dist/src/backend/orchestration/workspace-notification-delivery.orchestrator.test.js.map +1 -1
  458. package/dist/src/backend/orchestration/workspace-runtime-cleanup-notification.test.js +1 -0
  459. package/dist/src/backend/orchestration/workspace-runtime-cleanup-notification.test.js.map +1 -1
  460. package/dist/src/backend/pr-delivery-modes.migration.test.d.ts +2 -0
  461. package/dist/src/backend/pr-delivery-modes.migration.test.d.ts.map +1 -0
  462. package/dist/src/backend/pr-delivery-modes.migration.test.js +58 -0
  463. package/dist/src/backend/pr-delivery-modes.migration.test.js.map +1 -0
  464. package/dist/src/backend/pr-event-ledger.migration.test.d.ts +2 -0
  465. package/dist/src/backend/pr-event-ledger.migration.test.d.ts.map +1 -0
  466. package/dist/src/backend/pr-event-ledger.migration.test.js +119 -0
  467. package/dist/src/backend/pr-event-ledger.migration.test.js.map +1 -0
  468. package/dist/src/backend/prompts/adversarial-review-dispatch.d.ts +10 -0
  469. package/dist/src/backend/prompts/adversarial-review-dispatch.d.ts.map +1 -0
  470. package/dist/src/backend/prompts/adversarial-review-dispatch.js +60 -0
  471. package/dist/src/backend/prompts/adversarial-review-dispatch.js.map +1 -0
  472. package/dist/src/backend/prompts/adversarial-review-dispatch.test.d.ts +2 -0
  473. package/dist/src/backend/prompts/adversarial-review-dispatch.test.d.ts.map +1 -0
  474. package/dist/src/backend/prompts/adversarial-review-dispatch.test.js +119 -0
  475. package/dist/src/backend/prompts/adversarial-review-dispatch.test.js.map +1 -0
  476. package/dist/src/backend/prompts/adversarial-review-findings.schema.d.ts +36 -0
  477. package/dist/src/backend/prompts/adversarial-review-findings.schema.d.ts.map +1 -0
  478. package/dist/src/backend/prompts/adversarial-review-findings.schema.js +34 -0
  479. package/dist/src/backend/prompts/adversarial-review-findings.schema.js.map +1 -0
  480. package/dist/src/backend/prompts/adversarial-review-findings.schema.test.d.ts +2 -0
  481. package/dist/src/backend/prompts/adversarial-review-findings.schema.test.d.ts.map +1 -0
  482. package/dist/src/backend/prompts/adversarial-review-findings.schema.test.js +99 -0
  483. package/dist/src/backend/prompts/adversarial-review-findings.schema.test.js.map +1 -0
  484. package/dist/src/backend/prompts/pr-event.d.ts +17 -0
  485. package/dist/src/backend/prompts/pr-event.d.ts.map +1 -0
  486. package/dist/src/backend/prompts/pr-event.js +85 -0
  487. package/dist/src/backend/prompts/pr-event.js.map +1 -0
  488. package/dist/src/backend/prompts/pr-event.test.d.ts +2 -0
  489. package/dist/src/backend/prompts/pr-event.test.d.ts.map +1 -0
  490. package/dist/src/backend/prompts/pr-event.test.js +150 -0
  491. package/dist/src/backend/prompts/pr-event.test.js.map +1 -0
  492. package/dist/src/backend/routers/websocket/chat.handler.d.ts.map +1 -1
  493. package/dist/src/backend/routers/websocket/chat.handler.js +6 -1
  494. package/dist/src/backend/routers/websocket/chat.handler.js.map +1 -1
  495. package/dist/src/backend/routers/websocket/chat.handler.test.js +40 -1
  496. package/dist/src/backend/routers/websocket/chat.handler.test.js.map +1 -1
  497. package/dist/src/backend/routers/websocket/index.d.ts +2 -2
  498. package/dist/src/backend/routers/websocket/index.d.ts.map +1 -1
  499. package/dist/src/backend/routers/websocket/index.js +2 -2
  500. package/dist/src/backend/routers/websocket/index.js.map +1 -1
  501. package/dist/src/backend/routers/websocket/snapshots.handler.d.ts.map +1 -1
  502. package/dist/src/backend/routers/websocket/snapshots.handler.js.map +1 -1
  503. package/dist/src/backend/routers/websocket/upgrade-utils.d.ts.map +1 -1
  504. package/dist/src/backend/routers/websocket/upgrade-utils.js +5 -2
  505. package/dist/src/backend/routers/websocket/upgrade-utils.js.map +1 -1
  506. package/dist/src/backend/routers/websocket/upgrade-utils.test.js +33 -2
  507. package/dist/src/backend/routers/websocket/upgrade-utils.test.js.map +1 -1
  508. package/dist/src/backend/routers/websocket/websocket.integration.test.js +1 -1
  509. package/dist/src/backend/routers/websocket/websocket.integration.test.js.map +1 -1
  510. package/dist/src/backend/schemas/tool-inputs.schema.d.ts +4 -0
  511. package/dist/src/backend/schemas/tool-inputs.schema.d.ts.map +1 -1
  512. package/dist/src/backend/schemas/tool-inputs.schema.js +2 -0
  513. package/dist/src/backend/schemas/tool-inputs.schema.js.map +1 -1
  514. package/dist/src/backend/schemas/websocket/index.d.ts +1 -1
  515. package/dist/src/backend/schemas/websocket/index.d.ts.map +1 -1
  516. package/dist/src/backend/schemas/websocket/index.js +1 -1
  517. package/dist/src/backend/schemas/websocket/index.js.map +1 -1
  518. package/dist/src/backend/server.js +1 -1
  519. package/dist/src/backend/server.js.map +1 -1
  520. package/dist/src/backend/services/auto-iteration/service/auto-iteration.service.d.ts.map +1 -1
  521. package/dist/src/backend/services/auto-iteration/service/auto-iteration.service.js.map +1 -1
  522. package/dist/src/backend/services/auto-iteration/service/auto-iteration.service.test.js +69 -1
  523. package/dist/src/backend/services/auto-iteration/service/auto-iteration.service.test.js.map +1 -1
  524. package/dist/src/backend/services/auto-iteration/service/git-ops.d.ts.map +1 -1
  525. package/dist/src/backend/services/auto-iteration/service/git-ops.integration.test.js +88 -1
  526. package/dist/src/backend/services/auto-iteration/service/git-ops.integration.test.js.map +1 -1
  527. package/dist/src/backend/services/auto-iteration/service/git-ops.js +11 -25
  528. package/dist/src/backend/services/auto-iteration/service/git-ops.js.map +1 -1
  529. package/dist/src/backend/services/check-single-writer.test.js +51 -50
  530. package/dist/src/backend/services/check-single-writer.test.js.map +1 -1
  531. package/dist/src/backend/services/config.service.d.ts +1 -14
  532. package/dist/src/backend/services/config.service.d.ts.map +1 -1
  533. package/dist/src/backend/services/config.service.js +7 -38
  534. package/dist/src/backend/services/config.service.js.map +1 -1
  535. package/dist/src/backend/services/config.service.test.js +7 -13
  536. package/dist/src/backend/services/config.service.test.js.map +1 -1
  537. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.d.ts +0 -9
  538. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.d.ts.map +1 -1
  539. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.js +0 -46
  540. package/dist/src/backend/services/decision-log/resources/decision-log.accessor.js.map +1 -1
  541. package/dist/src/backend/services/decision-log/service/decision-log.service.d.ts +0 -2
  542. package/dist/src/backend/services/decision-log/service/decision-log.service.d.ts.map +1 -1
  543. package/dist/src/backend/services/decision-log/service/decision-log.service.js +0 -6
  544. package/dist/src/backend/services/decision-log/service/decision-log.service.js.map +1 -1
  545. package/dist/src/backend/services/decision-log/service/decision-log.service.test.js +0 -12
  546. package/dist/src/backend/services/decision-log/service/decision-log.service.test.js.map +1 -1
  547. package/dist/src/backend/services/env-schemas.d.ts +1 -6
  548. package/dist/src/backend/services/env-schemas.d.ts.map +1 -1
  549. package/dist/src/backend/services/env-schemas.js +1 -3
  550. package/dist/src/backend/services/env-schemas.js.map +1 -1
  551. package/dist/src/backend/services/env-schemas.test.js +0 -2
  552. package/dist/src/backend/services/env-schemas.test.js.map +1 -1
  553. package/dist/src/backend/services/github/service/bridges.d.ts +24 -0
  554. package/dist/src/backend/services/github/service/bridges.d.ts.map +1 -1
  555. package/dist/src/backend/services/github/service/github-cli/auth-check.d.ts +7 -0
  556. package/dist/src/backend/services/github/service/github-cli/auth-check.d.ts.map +1 -0
  557. package/dist/src/backend/services/github/service/github-cli/auth-check.js +24 -0
  558. package/dist/src/backend/services/github/service/github-cli/auth-check.js.map +1 -0
  559. package/dist/src/backend/services/github/service/github-cli/auth-check.test.d.ts +2 -0
  560. package/dist/src/backend/services/github/service/github-cli/auth-check.test.d.ts.map +1 -0
  561. package/dist/src/backend/services/github/service/github-cli/auth-check.test.js +125 -0
  562. package/dist/src/backend/services/github/service/github-cli/auth-check.test.js.map +1 -0
  563. package/dist/src/backend/services/github/service/github-cli/code-review.d.ts +27 -0
  564. package/dist/src/backend/services/github/service/github-cli/code-review.d.ts.map +1 -0
  565. package/dist/src/backend/services/github/service/github-cli/code-review.js +144 -0
  566. package/dist/src/backend/services/github/service/github-cli/code-review.js.map +1 -0
  567. package/dist/src/backend/services/github/service/github-cli/code-review.test.d.ts +2 -0
  568. package/dist/src/backend/services/github/service/github-cli/code-review.test.d.ts.map +1 -0
  569. package/dist/src/backend/services/github/service/github-cli/code-review.test.js +80 -0
  570. package/dist/src/backend/services/github/service/github-cli/code-review.test.js.map +1 -0
  571. package/dist/src/backend/services/github/service/github-cli/constants.d.ts +3 -0
  572. package/dist/src/backend/services/github/service/github-cli/constants.d.ts.map +1 -1
  573. package/dist/src/backend/services/github/service/github-cli/constants.js +4 -0
  574. package/dist/src/backend/services/github/service/github-cli/constants.js.map +1 -1
  575. package/dist/src/backend/services/github/service/github-cli/mappers.d.ts +4 -2
  576. package/dist/src/backend/services/github/service/github-cli/mappers.d.ts.map +1 -1
  577. package/dist/src/backend/services/github/service/github-cli/mappers.js +14 -8
  578. package/dist/src/backend/services/github/service/github-cli/mappers.js.map +1 -1
  579. package/dist/src/backend/services/github/service/github-cli/mappers.test.d.ts +2 -0
  580. package/dist/src/backend/services/github/service/github-cli/mappers.test.d.ts.map +1 -0
  581. package/dist/src/backend/services/github/service/github-cli/mappers.test.js +76 -0
  582. package/dist/src/backend/services/github/service/github-cli/mappers.test.js.map +1 -0
  583. package/dist/src/backend/services/github/service/github-cli/resolved-review-comments.d.ts +7 -0
  584. package/dist/src/backend/services/github/service/github-cli/resolved-review-comments.d.ts.map +1 -0
  585. package/dist/src/backend/services/github/service/github-cli/resolved-review-comments.js +21 -0
  586. package/dist/src/backend/services/github/service/github-cli/resolved-review-comments.js.map +1 -0
  587. package/dist/src/backend/services/github/service/github-cli/reviews.d.ts +7 -0
  588. package/dist/src/backend/services/github/service/github-cli/reviews.d.ts.map +1 -0
  589. package/dist/src/backend/services/github/service/github-cli/reviews.js +24 -0
  590. package/dist/src/backend/services/github/service/github-cli/reviews.js.map +1 -0
  591. package/dist/src/backend/services/github/service/github-cli/reviews.test.d.ts +2 -0
  592. package/dist/src/backend/services/github/service/github-cli/reviews.test.d.ts.map +1 -0
  593. package/dist/src/backend/services/github/service/github-cli/reviews.test.js +98 -0
  594. package/dist/src/backend/services/github/service/github-cli/reviews.test.js.map +1 -0
  595. package/dist/src/backend/services/github/service/github-cli/schemas.d.ts +18 -11
  596. package/dist/src/backend/services/github/service/github-cli/schemas.d.ts.map +1 -1
  597. package/dist/src/backend/services/github/service/github-cli/schemas.js +17 -11
  598. package/dist/src/backend/services/github/service/github-cli/schemas.js.map +1 -1
  599. package/dist/src/backend/services/github/service/github-cli/types.d.ts +5 -0
  600. package/dist/src/backend/services/github/service/github-cli/types.d.ts.map +1 -1
  601. package/dist/src/backend/services/github/service/github-cli-full-details-buffer.test.d.ts +2 -0
  602. package/dist/src/backend/services/github/service/github-cli-full-details-buffer.test.d.ts.map +1 -0
  603. package/dist/src/backend/services/github/service/github-cli-full-details-buffer.test.js +130 -0
  604. package/dist/src/backend/services/github/service/github-cli-full-details-buffer.test.js.map +1 -0
  605. package/dist/src/backend/services/github/service/github-cli-pr-details.test.d.ts +2 -0
  606. package/dist/src/backend/services/github/service/github-cli-pr-details.test.d.ts.map +1 -0
  607. package/dist/src/backend/services/github/service/github-cli-pr-details.test.js +150 -0
  608. package/dist/src/backend/services/github/service/github-cli-pr-details.test.js.map +1 -0
  609. package/dist/src/backend/services/github/service/github-cli-review-authors.test.d.ts +2 -0
  610. package/dist/src/backend/services/github/service/github-cli-review-authors.test.d.ts.map +1 -0
  611. package/dist/src/backend/services/github/service/github-cli-review-authors.test.js +57 -0
  612. package/dist/src/backend/services/github/service/github-cli-review-authors.test.js.map +1 -0
  613. package/dist/src/backend/services/github/service/github-cli.service.d.ts +5 -2
  614. package/dist/src/backend/services/github/service/github-cli.service.d.ts.map +1 -1
  615. package/dist/src/backend/services/github/service/github-cli.service.js +29 -37
  616. package/dist/src/backend/services/github/service/github-cli.service.js.map +1 -1
  617. package/dist/src/backend/services/github/service/github-cli.service.test.js +24 -116
  618. package/dist/src/backend/services/github/service/github-cli.service.test.js.map +1 -1
  619. package/dist/src/backend/services/github/service/index.d.ts +5 -1
  620. package/dist/src/backend/services/github/service/index.d.ts.map +1 -1
  621. package/dist/src/backend/services/github/service/index.js +5 -1
  622. package/dist/src/backend/services/github/service/index.js.map +1 -1
  623. package/dist/src/backend/services/github/service/pr-actionable-review.d.ts +48 -0
  624. package/dist/src/backend/services/github/service/pr-actionable-review.d.ts.map +1 -0
  625. package/dist/src/backend/services/github/service/pr-actionable-review.js +144 -0
  626. package/dist/src/backend/services/github/service/pr-actionable-review.js.map +1 -0
  627. package/dist/src/backend/services/github/service/pr-actionable-review.test.d.ts +2 -0
  628. package/dist/src/backend/services/github/service/pr-actionable-review.test.d.ts.map +1 -0
  629. package/dist/src/backend/services/github/service/pr-actionable-review.test.js +377 -0
  630. package/dist/src/backend/services/github/service/pr-actionable-review.test.js.map +1 -0
  631. package/dist/src/backend/services/github/service/pr-fetch-coordinator.d.ts +5 -1
  632. package/dist/src/backend/services/github/service/pr-fetch-coordinator.d.ts.map +1 -1
  633. package/dist/src/backend/services/github/service/pr-fetch-coordinator.js +21 -3
  634. package/dist/src/backend/services/github/service/pr-fetch-coordinator.js.map +1 -1
  635. package/dist/src/backend/services/github/service/pr-observation.service.d.ts +19 -0
  636. package/dist/src/backend/services/github/service/pr-observation.service.d.ts.map +1 -0
  637. package/dist/src/backend/services/github/service/pr-observation.service.js +146 -0
  638. package/dist/src/backend/services/github/service/pr-observation.service.js.map +1 -0
  639. package/dist/src/backend/services/github/service/pr-observation.service.test.d.ts +2 -0
  640. package/dist/src/backend/services/github/service/pr-observation.service.test.d.ts.map +1 -0
  641. package/dist/src/backend/services/github/service/pr-observation.service.test.js +229 -0
  642. package/dist/src/backend/services/github/service/pr-observation.service.test.js.map +1 -0
  643. package/dist/src/backend/services/github/service/pr-snapshot-collection.service.test.d.ts +2 -0
  644. package/dist/src/backend/services/github/service/pr-snapshot-collection.service.test.d.ts.map +1 -0
  645. package/dist/src/backend/services/github/service/pr-snapshot-collection.service.test.js +291 -0
  646. package/dist/src/backend/services/github/service/pr-snapshot-collection.service.test.js.map +1 -0
  647. package/dist/src/backend/services/github/service/pr-snapshot.service.d.ts +35 -15
  648. package/dist/src/backend/services/github/service/pr-snapshot.service.d.ts.map +1 -1
  649. package/dist/src/backend/services/github/service/pr-snapshot.service.js +176 -195
  650. package/dist/src/backend/services/github/service/pr-snapshot.service.js.map +1 -1
  651. package/dist/src/backend/services/github/service/pr-snapshot.service.test.js +133 -632
  652. package/dist/src/backend/services/github/service/pr-snapshot.service.test.js.map +1 -1
  653. package/dist/src/backend/services/logger.service.d.ts +0 -4
  654. package/dist/src/backend/services/logger.service.d.ts.map +1 -1
  655. package/dist/src/backend/services/logger.service.js +0 -31
  656. package/dist/src/backend/services/logger.service.js.map +1 -1
  657. package/dist/src/backend/services/logger.service.test.js +0 -30
  658. package/dist/src/backend/services/logger.service.test.js.map +1 -1
  659. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.d.ts +1 -7
  660. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.d.ts.map +1 -1
  661. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.js +0 -21
  662. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.js.map +1 -1
  663. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.test.js +45 -38
  664. package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.test.js.map +1 -1
  665. package/dist/src/backend/services/ratchet/service/index.d.ts +0 -3
  666. package/dist/src/backend/services/ratchet/service/index.d.ts.map +1 -1
  667. package/dist/src/backend/services/ratchet/service/index.js +0 -1
  668. package/dist/src/backend/services/ratchet/service/index.js.map +1 -1
  669. package/dist/src/backend/services/ratchet/service/ratchet-observation-watcher.test.d.ts +2 -0
  670. package/dist/src/backend/services/ratchet/service/ratchet-observation-watcher.test.d.ts.map +1 -0
  671. package/dist/src/backend/services/ratchet/service/ratchet-observation-watcher.test.js +179 -0
  672. package/dist/src/backend/services/ratchet/service/ratchet-observation-watcher.test.js.map +1 -0
  673. package/dist/src/backend/services/ratchet/service/ratchet.service.d.ts +80 -54
  674. package/dist/src/backend/services/ratchet/service/ratchet.service.d.ts.map +1 -1
  675. package/dist/src/backend/services/ratchet/service/ratchet.service.js +156 -547
  676. package/dist/src/backend/services/ratchet/service/ratchet.service.js.map +1 -1
  677. package/dist/src/backend/services/rate-limit-backoff.test.js.map +1 -1
  678. package/dist/src/backend/services/registry.d.ts +3 -3
  679. package/dist/src/backend/services/registry.d.ts.map +1 -1
  680. package/dist/src/backend/services/registry.js +13 -3
  681. package/dist/src/backend/services/registry.js.map +1 -1
  682. package/dist/src/backend/services/resources.integration.test.js +27 -262
  683. package/dist/src/backend/services/resources.integration.test.js.map +1 -1
  684. package/dist/src/backend/services/run-script/service/run-script.service.d.ts.map +1 -1
  685. package/dist/src/backend/services/run-script/service/run-script.service.js +12 -18
  686. package/dist/src/backend/services/run-script/service/run-script.service.js.map +1 -1
  687. package/dist/src/backend/services/run-script/service/run-script.service.test.js +14 -12
  688. package/dist/src/backend/services/run-script/service/run-script.service.test.js.map +1 -1
  689. package/dist/src/backend/services/run-script/service/startup-script.service.d.ts.map +1 -1
  690. package/dist/src/backend/services/run-script/service/startup-script.service.js.map +1 -1
  691. package/dist/src/backend/services/session/resources/agent-session.accessor.d.ts +13 -21
  692. package/dist/src/backend/services/session/resources/agent-session.accessor.d.ts.map +1 -1
  693. package/dist/src/backend/services/session/resources/agent-session.accessor.js +31 -59
  694. package/dist/src/backend/services/session/resources/agent-session.accessor.js.map +1 -1
  695. package/dist/src/backend/services/session/resources/agent-session.accessor.test.js +16 -3
  696. package/dist/src/backend/services/session/resources/agent-session.accessor.test.js.map +1 -1
  697. package/dist/src/backend/services/session/resources/closed-session.accessor.d.ts +1 -0
  698. package/dist/src/backend/services/session/resources/closed-session.accessor.d.ts.map +1 -1
  699. package/dist/src/backend/services/session/resources/closed-session.accessor.js +7 -0
  700. package/dist/src/backend/services/session/resources/closed-session.accessor.js.map +1 -1
  701. package/dist/src/backend/services/session/resources/pr-dedicated-session.accessor.d.ts +28 -0
  702. package/dist/src/backend/services/session/resources/pr-dedicated-session.accessor.d.ts.map +1 -0
  703. package/dist/src/backend/services/session/resources/pr-dedicated-session.accessor.js +131 -0
  704. package/dist/src/backend/services/session/resources/pr-dedicated-session.accessor.js.map +1 -0
  705. package/dist/src/backend/services/session/resources/pr-dedicated-session.accessor.test.d.ts +2 -0
  706. package/dist/src/backend/services/session/resources/pr-dedicated-session.accessor.test.d.ts.map +1 -0
  707. package/dist/src/backend/services/session/resources/pr-dedicated-session.accessor.test.js +217 -0
  708. package/dist/src/backend/services/session/resources/pr-dedicated-session.accessor.test.js.map +1 -0
  709. package/dist/src/backend/services/session/resources/provider-identity-rollover.integration.test.d.ts +2 -0
  710. package/dist/src/backend/services/session/resources/provider-identity-rollover.integration.test.d.ts.map +1 -0
  711. package/dist/src/backend/services/session/resources/provider-identity-rollover.integration.test.js +153 -0
  712. package/dist/src/backend/services/session/resources/provider-identity-rollover.integration.test.js.map +1 -0
  713. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.d.ts +1 -1
  714. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.d.ts.map +1 -1
  715. package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.js.map +1 -1
  716. package/dist/src/backend/services/session/service/acp/acp-client-factory.d.ts +1 -2
  717. package/dist/src/backend/services/session/service/acp/acp-client-factory.d.ts.map +1 -1
  718. package/dist/src/backend/services/session/service/acp/acp-client-factory.js +60 -29
  719. package/dist/src/backend/services/session/service/acp/acp-client-factory.js.map +1 -1
  720. package/dist/src/backend/services/session/service/acp/acp-client-factory.test.js +101 -19
  721. package/dist/src/backend/services/session/service/acp/acp-client-factory.test.js.map +1 -1
  722. package/dist/src/backend/services/session/service/acp/acp-client-handler.d.ts +5 -4
  723. package/dist/src/backend/services/session/service/acp/acp-client-handler.d.ts.map +1 -1
  724. package/dist/src/backend/services/session/service/acp/acp-client-handler.js +58 -100
  725. package/dist/src/backend/services/session/service/acp/acp-client-handler.js.map +1 -1
  726. package/dist/src/backend/services/session/service/acp/acp-client-handler.test.js +59 -195
  727. package/dist/src/backend/services/session/service/acp/acp-client-handler.test.js.map +1 -1
  728. package/dist/src/backend/services/session/service/acp/acp-configured-handle.d.ts +4 -0
  729. package/dist/src/backend/services/session/service/acp/acp-configured-handle.d.ts.map +1 -0
  730. package/dist/src/backend/services/session/service/acp/acp-configured-handle.js +14 -0
  731. package/dist/src/backend/services/session/service/acp/acp-configured-handle.js.map +1 -0
  732. package/dist/src/backend/services/session/service/acp/acp-elicitation-form.d.ts +8 -0
  733. package/dist/src/backend/services/session/service/acp/acp-elicitation-form.d.ts.map +1 -0
  734. package/dist/src/backend/services/session/service/acp/acp-elicitation-form.js +288 -0
  735. package/dist/src/backend/services/session/service/acp/acp-elicitation-form.js.map +1 -0
  736. package/dist/src/backend/services/session/service/acp/acp-elicitation.d.ts +3 -0
  737. package/dist/src/backend/services/session/service/acp/acp-elicitation.d.ts.map +1 -0
  738. package/dist/src/backend/services/session/service/acp/acp-elicitation.js +100 -0
  739. package/dist/src/backend/services/session/service/acp/acp-elicitation.js.map +1 -0
  740. package/dist/src/backend/services/session/service/acp/acp-elicitation.test.d.ts +2 -0
  741. package/dist/src/backend/services/session/service/acp/acp-elicitation.test.d.ts.map +1 -0
  742. package/dist/src/backend/services/session/service/acp/acp-elicitation.test.js +308 -0
  743. package/dist/src/backend/services/session/service/acp/acp-elicitation.test.js.map +1 -0
  744. package/dist/src/backend/services/session/service/acp/acp-native-session-tracker.d.ts +45 -0
  745. package/dist/src/backend/services/session/service/acp/acp-native-session-tracker.d.ts.map +1 -0
  746. package/dist/src/backend/services/session/service/acp/acp-native-session-tracker.js +346 -0
  747. package/dist/src/backend/services/session/service/acp/acp-native-session-tracker.js.map +1 -0
  748. package/dist/src/backend/services/session/service/acp/acp-native-session-tracker.test.d.ts +2 -0
  749. package/dist/src/backend/services/session/service/acp/acp-native-session-tracker.test.d.ts.map +1 -0
  750. package/dist/src/backend/services/session/service/acp/acp-native-session-tracker.test.js +404 -0
  751. package/dist/src/backend/services/session/service/acp/acp-native-session-tracker.test.js.map +1 -0
  752. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.d.ts +3 -1
  753. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.d.ts.map +1 -1
  754. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.js +11 -2
  755. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.js.map +1 -1
  756. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.test.js +10 -0
  757. package/dist/src/backend/services/session/service/acp/acp-permission-bridge.test.js.map +1 -1
  758. package/dist/src/backend/services/session/service/acp/acp-process-handle.d.ts +18 -2
  759. package/dist/src/backend/services/session/service/acp/acp-process-handle.d.ts.map +1 -1
  760. package/dist/src/backend/services/session/service/acp/acp-process-handle.js +31 -1
  761. package/dist/src/backend/services/session/service/acp/acp-process-handle.js.map +1 -1
  762. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.js +22 -3
  763. package/dist/src/backend/services/session/service/acp/acp-process-handle.test.js.map +1 -1
  764. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.js +2 -2
  765. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.js.map +1 -1
  766. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.test.js +17 -0
  767. package/dist/src/backend/services/session/service/acp/acp-prompt-controller.test.js.map +1 -1
  768. package/dist/src/backend/services/session/service/acp/acp-prompt-readiness.d.ts +13 -0
  769. package/dist/src/backend/services/session/service/acp/acp-prompt-readiness.d.ts.map +1 -0
  770. package/dist/src/backend/services/session/service/acp/acp-prompt-readiness.js +48 -0
  771. package/dist/src/backend/services/session/service/acp/acp-prompt-readiness.js.map +1 -0
  772. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.js +2 -2
  773. package/dist/src/backend/services/session/service/acp/acp-runtime-config-controller.js.map +1 -1
  774. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.d.ts.map +1 -1
  775. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.js +4 -1
  776. package/dist/src/backend/services/session/service/acp/acp-runtime-error-handler.js.map +1 -1
  777. package/dist/src/backend/services/session/service/acp/acp-runtime-events.d.ts +16 -0
  778. package/dist/src/backend/services/session/service/acp/acp-runtime-events.d.ts.map +1 -1
  779. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.creation.test.js +25 -24
  780. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.creation.test.js.map +1 -1
  781. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts +0 -1
  782. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts.map +1 -1
  783. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.js +10 -1
  784. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.js.map +1 -1
  785. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.manual.integration.test.js +21 -3
  786. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.manual.integration.test.js.map +1 -1
  787. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.readiness.test.d.ts +2 -0
  788. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.readiness.test.d.ts.map +1 -0
  789. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.readiness.test.js +208 -0
  790. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.readiness.test.js.map +1 -0
  791. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.d.ts +3 -3
  792. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.d.ts.map +1 -1
  793. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-harness.js.map +1 -1
  794. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.d.ts +3 -2
  795. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.d.ts.map +1 -1
  796. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.js +1 -0
  797. package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test-helpers.js.map +1 -1
  798. package/dist/src/backend/services/session/service/acp/acp-runtime-spawn.d.ts +3 -1
  799. package/dist/src/backend/services/session/service/acp/acp-runtime-spawn.d.ts.map +1 -1
  800. package/dist/src/backend/services/session/service/acp/acp-runtime-spawn.js +41 -86
  801. package/dist/src/backend/services/session/service/acp/acp-runtime-spawn.js.map +1 -1
  802. package/dist/src/backend/services/session/service/acp/acp-runtime-spawn.test.d.ts +2 -0
  803. package/dist/src/backend/services/session/service/acp/acp-runtime-spawn.test.d.ts.map +1 -0
  804. package/dist/src/backend/services/session/service/acp/acp-runtime-spawn.test.js +32 -0
  805. package/dist/src/backend/services/session/service/acp/acp-runtime-spawn.test.js.map +1 -0
  806. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.creation.test.js +220 -0
  807. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.creation.test.js.map +1 -1
  808. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.d.ts +1 -0
  809. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.d.ts.map +1 -1
  810. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.js +105 -23
  811. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.js.map +1 -1
  812. package/dist/src/backend/services/session/service/acp/acp-session-config-options.js +1 -1
  813. package/dist/src/backend/services/session/service/acp/acp-session-config-options.js.map +1 -1
  814. package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.js +12 -0
  815. package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.js.map +1 -1
  816. package/dist/src/backend/services/session/service/acp/acp-session-creation-outcome.d.ts +10 -0
  817. package/dist/src/backend/services/session/service/acp/acp-session-creation-outcome.d.ts.map +1 -0
  818. package/dist/src/backend/services/session/service/acp/acp-session-creation-outcome.js +2 -0
  819. package/dist/src/backend/services/session/service/acp/acp-session-creation-outcome.js.map +1 -0
  820. package/dist/src/backend/services/session/service/acp/acp-session-identity.d.ts +4 -0
  821. package/dist/src/backend/services/session/service/acp/acp-session-identity.d.ts.map +1 -0
  822. package/dist/src/backend/services/session/service/acp/acp-session-identity.js +9 -0
  823. package/dist/src/backend/services/session/service/acp/acp-session-identity.js.map +1 -0
  824. package/dist/src/backend/services/session/service/acp/acp-session-identity.test.d.ts +2 -0
  825. package/dist/src/backend/services/session/service/acp/acp-session-identity.test.d.ts.map +1 -0
  826. package/dist/src/backend/services/session/service/acp/acp-session-identity.test.js +8 -0
  827. package/dist/src/backend/services/session/service/acp/acp-session-identity.test.js.map +1 -0
  828. package/dist/src/backend/services/session/service/acp/acp-stream-normalizer.d.ts +2 -1
  829. package/dist/src/backend/services/session/service/acp/acp-stream-normalizer.d.ts.map +1 -1
  830. package/dist/src/backend/services/session/service/acp/acp-stream-normalizer.js +14 -8
  831. package/dist/src/backend/services/session/service/acp/acp-stream-normalizer.js.map +1 -1
  832. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.d.ts.map +1 -1
  833. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.js +8 -2
  834. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.js.map +1 -1
  835. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.test.js +72 -0
  836. package/dist/src/backend/services/session/service/acp/acp-subagent-browser.test.js.map +1 -1
  837. package/dist/src/backend/services/session/service/acp/acp-task-status-protocol.d.ts +8 -0
  838. package/dist/src/backend/services/session/service/acp/acp-task-status-protocol.d.ts.map +1 -0
  839. package/dist/src/backend/services/session/service/acp/acp-task-status-protocol.js +9 -0
  840. package/dist/src/backend/services/session/service/acp/acp-task-status-protocol.js.map +1 -0
  841. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.d.ts.map +1 -1
  842. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.js +1 -38
  843. package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.js.map +1 -1
  844. package/dist/src/backend/services/session/service/acp/codex-model-catalog-loader.d.ts +20 -0
  845. package/dist/src/backend/services/session/service/acp/codex-model-catalog-loader.d.ts.map +1 -0
  846. package/dist/src/backend/services/session/service/acp/codex-model-catalog-loader.js +150 -0
  847. package/dist/src/backend/services/session/service/acp/codex-model-catalog-loader.js.map +1 -0
  848. package/dist/src/backend/services/session/service/acp/codex-model-catalog-loader.test.d.ts +2 -0
  849. package/dist/src/backend/services/session/service/acp/codex-model-catalog-loader.test.d.ts.map +1 -0
  850. package/dist/src/backend/services/session/service/acp/codex-model-catalog-loader.test.js +141 -0
  851. package/dist/src/backend/services/session/service/acp/codex-model-catalog-loader.test.js.map +1 -0
  852. package/dist/src/backend/services/session/service/acp/index.d.ts +5 -4
  853. package/dist/src/backend/services/session/service/acp/index.d.ts.map +1 -1
  854. package/dist/src/backend/services/session/service/acp/index.js +4 -3
  855. package/dist/src/backend/services/session/service/acp/index.js.map +1 -1
  856. package/dist/src/backend/services/session/service/acp/types.d.ts +2 -0
  857. package/dist/src/backend/services/session/service/acp/types.d.ts.map +1 -1
  858. package/dist/src/backend/services/session/service/acp/upstream-codex.integration.test.d.ts +2 -0
  859. package/dist/src/backend/services/session/service/acp/upstream-codex.integration.test.d.ts.map +1 -0
  860. package/dist/src/backend/services/session/service/acp/upstream-codex.integration.test.js +94 -0
  861. package/dist/src/backend/services/session/service/acp/upstream-codex.integration.test.js.map +1 -0
  862. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.recovery.test.js +1 -0
  863. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.recovery.test.js.map +1 -1
  864. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.test.js +1 -0
  865. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.test.js.map +1 -1
  866. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/permission-response.handler.d.ts.map +1 -1
  867. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/permission-response.handler.js +1 -3
  868. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/permission-response.handler.js.map +1 -1
  869. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/permission-response.handler.test.js +2 -2
  870. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/permission-response.handler.test.js.map +1 -1
  871. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.d.ts.map +1 -1
  872. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.js +11 -1
  873. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.js.map +1 -1
  874. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.test.js +25 -0
  875. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.test.js.map +1 -1
  876. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/remove-queued-message.handler.d.ts.map +1 -1
  877. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/remove-queued-message.handler.js +7 -0
  878. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/remove-queued-message.handler.js.map +1 -1
  879. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/resume-queued-messages.handler.d.ts.map +1 -1
  880. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/resume-queued-messages.handler.js +6 -0
  881. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/resume-queued-messages.handler.js.map +1 -1
  882. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/resume-queued-messages.handler.test.d.ts +2 -0
  883. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/resume-queued-messages.handler.test.d.ts.map +1 -0
  884. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/resume-queued-messages.handler.test.js +52 -0
  885. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/resume-queued-messages.handler.test.js.map +1 -0
  886. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.d.ts.map +1 -1
  887. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.js +5 -0
  888. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.js.map +1 -1
  889. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.test.js +62 -0
  890. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.test.js.map +1 -1
  891. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/user-input.handler.d.ts.map +1 -1
  892. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/user-input.handler.js +5 -0
  893. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/user-input.handler.js.map +1 -1
  894. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/user-input.handler.test.js +46 -2
  895. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/user-input.handler.test.js.map +1 -1
  896. package/dist/src/backend/services/session/service/chat/chat-message-handlers/types.d.ts +8 -0
  897. package/dist/src/backend/services/session/service/chat/chat-message-handlers/types.d.ts.map +1 -1
  898. package/dist/src/backend/services/session/service/chat/chat-message-handlers.pr-events.test.d.ts +2 -0
  899. package/dist/src/backend/services/session/service/chat/chat-message-handlers.pr-events.test.d.ts.map +1 -0
  900. package/dist/src/backend/services/session/service/chat/chat-message-handlers.pr-events.test.js +389 -0
  901. package/dist/src/backend/services/session/service/chat/chat-message-handlers.pr-events.test.js.map +1 -0
  902. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.d.ts +3 -0
  903. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.d.ts.map +1 -1
  904. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js +105 -15
  905. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js.map +1 -1
  906. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js +1 -0
  907. package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js.map +1 -1
  908. package/dist/src/backend/services/session/service/data/codex-session-history-loader.messages.test.d.ts +2 -0
  909. package/dist/src/backend/services/session/service/data/codex-session-history-loader.messages.test.d.ts.map +1 -0
  910. package/dist/src/backend/services/session/service/data/codex-session-history-loader.messages.test.js +198 -0
  911. package/dist/src/backend/services/session/service/data/codex-session-history-loader.messages.test.js.map +1 -0
  912. package/dist/src/backend/services/session/service/data/codex-session-history-loader.service.d.ts.map +1 -1
  913. package/dist/src/backend/services/session/service/data/codex-session-history-loader.service.js +81 -9
  914. package/dist/src/backend/services/session/service/data/codex-session-history-loader.service.js.map +1 -1
  915. package/dist/src/backend/services/session/service/data/session-data.dedicated.test.d.ts +2 -0
  916. package/dist/src/backend/services/session/service/data/session-data.dedicated.test.d.ts.map +1 -0
  917. package/dist/src/backend/services/session/service/data/session-data.dedicated.test.js +66 -0
  918. package/dist/src/backend/services/session/service/data/session-data.dedicated.test.js.map +1 -0
  919. package/dist/src/backend/services/session/service/data/session-data.service.d.ts +10 -10
  920. package/dist/src/backend/services/session/service/data/session-data.service.d.ts.map +1 -1
  921. package/dist/src/backend/services/session/service/data/session-data.service.js +33 -5
  922. package/dist/src/backend/services/session/service/data/session-data.service.js.map +1 -1
  923. package/dist/src/backend/services/session/service/data/session-data.service.test.js +19 -31
  924. package/dist/src/backend/services/session/service/data/session-data.service.test.js.map +1 -1
  925. package/dist/src/backend/services/session/service/data/session-provider-resolver.service.d.ts.map +1 -1
  926. package/dist/src/backend/services/session/service/data/session-provider-resolver.service.js.map +1 -1
  927. package/dist/src/backend/services/session/service/data/session-provider-resolver.service.test.js +11 -2
  928. package/dist/src/backend/services/session/service/data/session-provider-resolver.service.test.js.map +1 -1
  929. package/dist/src/backend/services/session/service/index.d.ts +7 -3
  930. package/dist/src/backend/services/session/service/index.d.ts.map +1 -1
  931. package/dist/src/backend/services/session/service/index.js +6 -2
  932. package/dist/src/backend/services/session/service/index.js.map +1 -1
  933. package/dist/src/backend/services/session/service/lifecycle/acp-config-snapshot.d.ts.map +1 -1
  934. package/dist/src/backend/services/session/service/lifecycle/acp-config-snapshot.js +63 -1
  935. package/dist/src/backend/services/session/service/lifecycle/acp-config-snapshot.js.map +1 -1
  936. package/dist/src/backend/services/session/service/lifecycle/acp-config-snapshot.test.js +54 -0
  937. package/dist/src/backend/services/session/service/lifecycle/acp-config-snapshot.test.js.map +1 -1
  938. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.d.ts +2 -0
  939. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.d.ts.map +1 -1
  940. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.js +8 -2
  941. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.js.map +1 -1
  942. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.slash-commands.test.js +1 -0
  943. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.slash-commands.test.js.map +1 -1
  944. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.text-streaming.test.js +1 -0
  945. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.text-streaming.test.js.map +1 -1
  946. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.tool-timeout.test.js +1 -0
  947. package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.tool-timeout.test.js.map +1 -1
  948. package/dist/src/backend/services/session/service/lifecycle/adversarial-review-startup.test.d.ts +2 -0
  949. package/dist/src/backend/services/session/service/lifecycle/adversarial-review-startup.test.d.ts.map +1 -0
  950. package/dist/src/backend/services/session/service/lifecycle/adversarial-review-startup.test.js +419 -0
  951. package/dist/src/backend/services/session/service/lifecycle/adversarial-review-startup.test.js.map +1 -0
  952. package/dist/src/backend/services/session/service/lifecycle/claude-model-catalog.service.d.ts +7 -0
  953. package/dist/src/backend/services/session/service/lifecycle/claude-model-catalog.service.d.ts.map +1 -0
  954. package/dist/src/backend/services/session/service/lifecycle/claude-model-catalog.service.js +4 -0
  955. package/dist/src/backend/services/session/service/lifecycle/claude-model-catalog.service.js.map +1 -0
  956. package/dist/src/backend/services/session/service/lifecycle/claude-model-catalog.service.test.d.ts +2 -0
  957. package/dist/src/backend/services/session/service/lifecycle/claude-model-catalog.service.test.d.ts.map +1 -0
  958. package/dist/src/backend/services/session/service/lifecycle/claude-model-catalog.service.test.js +56 -0
  959. package/dist/src/backend/services/session/service/lifecycle/claude-model-catalog.service.test.js.map +1 -0
  960. package/dist/src/backend/services/session/service/lifecycle/closed-session-persistence.service.d.ts +3 -1
  961. package/dist/src/backend/services/session/service/lifecycle/closed-session-persistence.service.d.ts.map +1 -1
  962. package/dist/src/backend/services/session/service/lifecycle/closed-session-persistence.service.js +2 -1
  963. package/dist/src/backend/services/session/service/lifecycle/closed-session-persistence.service.js.map +1 -1
  964. package/dist/src/backend/services/session/service/lifecycle/closed-session-persistence.service.test.js +5 -0
  965. package/dist/src/backend/services/session/service/lifecycle/closed-session-persistence.service.test.js.map +1 -1
  966. package/dist/src/backend/services/session/service/lifecycle/codex-model-catalog.service.d.ts +2 -8
  967. package/dist/src/backend/services/session/service/lifecycle/codex-model-catalog.service.d.ts.map +1 -1
  968. package/dist/src/backend/services/session/service/lifecycle/codex-model-catalog.service.js +2 -23
  969. package/dist/src/backend/services/session/service/lifecycle/codex-model-catalog.service.js.map +1 -1
  970. package/dist/src/backend/services/session/service/lifecycle/model-catalog-cache.d.ts +10 -0
  971. package/dist/src/backend/services/session/service/lifecycle/model-catalog-cache.d.ts.map +1 -0
  972. package/dist/src/backend/services/session/service/lifecycle/model-catalog-cache.js +25 -0
  973. package/dist/src/backend/services/session/service/lifecycle/model-catalog-cache.js.map +1 -0
  974. package/dist/src/backend/services/session/service/lifecycle/session-background-delivery.service.d.ts +57 -0
  975. package/dist/src/backend/services/session/service/lifecycle/session-background-delivery.service.d.ts.map +1 -0
  976. package/dist/src/backend/services/session/service/lifecycle/session-background-delivery.service.js +133 -0
  977. package/dist/src/backend/services/session/service/lifecycle/session-background-delivery.service.js.map +1 -0
  978. package/dist/src/backend/services/session/service/lifecycle/session-background-delivery.service.test.d.ts +2 -0
  979. package/dist/src/backend/services/session/service/lifecycle/session-background-delivery.service.test.d.ts.map +1 -0
  980. package/dist/src/backend/services/session/service/lifecycle/session-background-delivery.service.test.js +224 -0
  981. package/dist/src/backend/services/session/service/lifecycle/session-background-delivery.service.test.js.map +1 -0
  982. package/dist/src/backend/services/session/service/lifecycle/session-config-option-helpers.d.ts.map +1 -1
  983. package/dist/src/backend/services/session/service/lifecycle/session-config-option-helpers.js +3 -1
  984. package/dist/src/backend/services/session/service/lifecycle/session-config-option-helpers.js.map +1 -1
  985. package/dist/src/backend/services/session/service/lifecycle/session-context.service.d.ts +2 -1
  986. package/dist/src/backend/services/session/service/lifecycle/session-context.service.d.ts.map +1 -1
  987. package/dist/src/backend/services/session/service/lifecycle/session-context.service.js +2 -2
  988. package/dist/src/backend/services/session/service/lifecycle/session-context.service.js.map +1 -1
  989. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.js +10 -3
  990. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.js.map +1 -1
  991. package/dist/src/backend/services/session/service/lifecycle/session-core-services.d.ts +5 -3
  992. package/dist/src/backend/services/session/service/lifecycle/session-core-services.d.ts.map +1 -1
  993. package/dist/src/backend/services/session/service/lifecycle/session-core-services.js +20 -8
  994. package/dist/src/backend/services/session/service/lifecycle/session-core-services.js.map +1 -1
  995. package/dist/src/backend/services/session/service/lifecycle/session-legacy-runtime-exit.test.d.ts +2 -0
  996. package/dist/src/backend/services/session/service/lifecycle/session-legacy-runtime-exit.test.d.ts.map +1 -0
  997. package/dist/src/backend/services/session/service/lifecycle/session-legacy-runtime-exit.test.js +227 -0
  998. package/dist/src/backend/services/session/service/lifecycle/session-legacy-runtime-exit.test.js.map +1 -0
  999. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.d.ts.map +1 -1
  1000. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.js +3 -3
  1001. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.js.map +1 -1
  1002. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.js +12 -2
  1003. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.js.map +1 -1
  1004. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.test.js.map +1 -1
  1005. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.d.ts +7 -5
  1006. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.d.ts.map +1 -1
  1007. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.js +34 -5
  1008. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.js.map +1 -1
  1009. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.d.ts +1 -1
  1010. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.d.ts.map +1 -1
  1011. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.js +3 -3
  1012. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.js.map +1 -1
  1013. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.test.js +10 -0
  1014. package/dist/src/backend/services/session/service/lifecycle/session-notification-delivery.service.test.js.map +1 -1
  1015. package/dist/src/backend/services/session/service/lifecycle/session-permission-policy.d.ts +7 -0
  1016. package/dist/src/backend/services/session/service/lifecycle/session-permission-policy.d.ts.map +1 -0
  1017. package/dist/src/backend/services/session/service/lifecycle/session-permission-policy.js +53 -0
  1018. package/dist/src/backend/services/session/service/lifecycle/session-permission-policy.js.map +1 -0
  1019. package/dist/src/backend/services/session/service/lifecycle/session-permission-policy.test.d.ts +2 -0
  1020. package/dist/src/backend/services/session/service/lifecycle/session-permission-policy.test.d.ts.map +1 -0
  1021. package/dist/src/backend/services/session/service/lifecycle/session-permission-policy.test.js +85 -0
  1022. package/dist/src/backend/services/session/service/lifecycle/session-permission-policy.test.js.map +1 -0
  1023. package/dist/src/backend/services/session/service/lifecycle/session-pr-receipt.d.ts +2 -0
  1024. package/dist/src/backend/services/session/service/lifecycle/session-pr-receipt.d.ts.map +1 -0
  1025. package/dist/src/backend/services/session/service/lifecycle/session-pr-receipt.js +115 -0
  1026. package/dist/src/backend/services/session/service/lifecycle/session-pr-receipt.js.map +1 -0
  1027. package/dist/src/backend/services/session/service/lifecycle/session-pr-receipt.test.d.ts +2 -0
  1028. package/dist/src/backend/services/session/service/lifecycle/session-pr-receipt.test.d.ts.map +1 -0
  1029. package/dist/src/backend/services/session/service/lifecycle/session-pr-receipt.test.js +137 -0
  1030. package/dist/src/backend/services/session/service/lifecycle/session-pr-receipt.test.js.map +1 -0
  1031. package/dist/src/backend/services/session/service/lifecycle/session-pr-resume-config.d.ts +4 -0
  1032. package/dist/src/backend/services/session/service/lifecycle/session-pr-resume-config.d.ts.map +1 -0
  1033. package/dist/src/backend/services/session/service/lifecycle/session-pr-resume-config.js +51 -0
  1034. package/dist/src/backend/services/session/service/lifecycle/session-pr-resume-config.js.map +1 -0
  1035. package/dist/src/backend/services/session/service/lifecycle/session-pr-resume-config.test.d.ts +2 -0
  1036. package/dist/src/backend/services/session/service/lifecycle/session-pr-resume-config.test.d.ts.map +1 -0
  1037. package/dist/src/backend/services/session/service/lifecycle/session-pr-resume-config.test.js +113 -0
  1038. package/dist/src/backend/services/session/service/lifecycle/session-pr-resume-config.test.js.map +1 -0
  1039. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.d.ts.map +1 -1
  1040. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.js +10 -1
  1041. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.js.map +1 -1
  1042. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.test.d.ts +2 -0
  1043. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.test.d.ts.map +1 -0
  1044. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.test.js +191 -0
  1045. package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.test.js.map +1 -0
  1046. package/dist/src/backend/services/session/service/lifecycle/session-provider-identity.service.d.ts +16 -0
  1047. package/dist/src/backend/services/session/service/lifecycle/session-provider-identity.service.d.ts.map +1 -0
  1048. package/dist/src/backend/services/session/service/lifecycle/session-provider-identity.service.js +86 -0
  1049. package/dist/src/backend/services/session/service/lifecycle/session-provider-identity.service.js.map +1 -0
  1050. package/dist/src/backend/services/session/service/lifecycle/session-provider-identity.service.test.d.ts +2 -0
  1051. package/dist/src/backend/services/session/service/lifecycle/session-provider-identity.service.test.d.ts.map +1 -0
  1052. package/dist/src/backend/services/session/service/lifecycle/session-provider-identity.service.test.js +166 -0
  1053. package/dist/src/backend/services/session/service/lifecycle/session-provider-identity.service.test.js.map +1 -0
  1054. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.d.ts +5 -3
  1055. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.d.ts.map +1 -1
  1056. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.js +18 -2
  1057. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.js.map +1 -1
  1058. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.js +48 -1
  1059. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.js.map +1 -1
  1060. package/dist/src/backend/services/session/service/lifecycle/session-saved-native-modes.d.ts +6 -0
  1061. package/dist/src/backend/services/session/service/lifecycle/session-saved-native-modes.d.ts.map +1 -0
  1062. package/dist/src/backend/services/session/service/lifecycle/session-saved-native-modes.js +82 -0
  1063. package/dist/src/backend/services/session/service/lifecycle/session-saved-native-modes.js.map +1 -0
  1064. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.js +4 -2
  1065. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.js.map +1 -1
  1066. package/dist/src/backend/services/session/service/lifecycle/session-services.d.ts +2 -2
  1067. package/dist/src/backend/services/session/service/lifecycle/session-services.d.ts.map +1 -1
  1068. package/dist/src/backend/services/session/service/lifecycle/session-services.js +3 -2
  1069. package/dist/src/backend/services/session/service/lifecycle/session-services.js.map +1 -1
  1070. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.d.ts +21 -6
  1071. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.d.ts.map +1 -1
  1072. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.js +303 -84
  1073. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.js.map +1 -1
  1074. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.test.js +21 -12
  1075. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.test.js.map +1 -1
  1076. package/dist/src/backend/services/session/service/lifecycle/session-startup.guards.test.d.ts +2 -0
  1077. package/dist/src/backend/services/session/service/lifecycle/session-startup.guards.test.d.ts.map +1 -0
  1078. package/dist/src/backend/services/session/service/lifecycle/session-startup.guards.test.js +193 -0
  1079. package/dist/src/backend/services/session/service/lifecycle/session-startup.guards.test.js.map +1 -0
  1080. package/dist/src/backend/services/session/service/lifecycle/session-startup.pr-events.test.d.ts +2 -0
  1081. package/dist/src/backend/services/session/service/lifecycle/session-startup.pr-events.test.d.ts.map +1 -0
  1082. package/dist/src/backend/services/session/service/lifecycle/session-startup.pr-events.test.js +279 -0
  1083. package/dist/src/backend/services/session/service/lifecycle/session-startup.pr-events.test.js.map +1 -0
  1084. package/dist/src/backend/services/session/service/lifecycle/session-startup.saved-access.test.d.ts +2 -0
  1085. package/dist/src/backend/services/session/service/lifecycle/session-startup.saved-access.test.d.ts.map +1 -0
  1086. package/dist/src/backend/services/session/service/lifecycle/session-startup.saved-access.test.js +77 -0
  1087. package/dist/src/backend/services/session/service/lifecycle/session-startup.saved-access.test.js.map +1 -0
  1088. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.d.ts +5 -4
  1089. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.d.ts.map +1 -1
  1090. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.js +50 -11
  1091. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.js.map +1 -1
  1092. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.test.js +177 -8
  1093. package/dist/src/backend/services/session/service/lifecycle/session-termination.coordinator.test.js.map +1 -1
  1094. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.d.ts +1 -1
  1095. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.d.ts.map +1 -1
  1096. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.js +5 -3
  1097. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.js.map +1 -1
  1098. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.test.js +21 -3
  1099. package/dist/src/backend/services/session/service/lifecycle/session-workflow-finalizer.test.js.map +1 -1
  1100. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.d.ts +3 -3
  1101. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.d.ts.map +1 -1
  1102. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.js +7 -4
  1103. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.js.map +1 -1
  1104. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.test.d.ts +2 -0
  1105. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.test.d.ts.map +1 -0
  1106. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.test.js +20 -0
  1107. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.test.js.map +1 -0
  1108. package/dist/src/backend/services/session/service/lifecycle/session.config-validation.test.js +2 -2
  1109. package/dist/src/backend/services/session/service/lifecycle/session.config-validation.test.js.map +1 -1
  1110. package/dist/src/backend/services/session/service/lifecycle/session.config.service.cached-options.test.js +31 -0
  1111. package/dist/src/backend/services/session/service/lifecycle/session.config.service.cached-options.test.js.map +1 -1
  1112. package/dist/src/backend/services/session/service/lifecycle/session.config.service.d.ts +7 -5
  1113. package/dist/src/backend/services/session/service/lifecycle/session.config.service.d.ts.map +1 -1
  1114. package/dist/src/backend/services/session/service/lifecycle/session.config.service.js +120 -143
  1115. package/dist/src/backend/services/session/service/lifecycle/session.config.service.js.map +1 -1
  1116. package/dist/src/backend/services/session/service/lifecycle/session.config.service.periodic-task.test.d.ts +2 -0
  1117. package/dist/src/backend/services/session/service/lifecycle/session.config.service.periodic-task.test.d.ts.map +1 -0
  1118. package/dist/src/backend/services/session/service/lifecycle/session.config.service.periodic-task.test.js +61 -0
  1119. package/dist/src/backend/services/session/service/lifecycle/session.config.service.periodic-task.test.js.map +1 -0
  1120. package/dist/src/backend/services/session/service/lifecycle/session.config.service.readiness.test.d.ts +2 -0
  1121. package/dist/src/backend/services/session/service/lifecycle/session.config.service.readiness.test.d.ts.map +1 -0
  1122. package/dist/src/backend/services/session/service/lifecycle/session.config.service.readiness.test.js +249 -0
  1123. package/dist/src/backend/services/session/service/lifecycle/session.config.service.readiness.test.js.map +1 -0
  1124. package/dist/src/backend/services/session/service/lifecycle/session.config.service.saved-access.test.d.ts +2 -0
  1125. package/dist/src/backend/services/session/service/lifecycle/session.config.service.saved-access.test.d.ts.map +1 -0
  1126. package/dist/src/backend/services/session/service/lifecycle/session.config.service.saved-access.test.js +313 -0
  1127. package/dist/src/backend/services/session/service/lifecycle/session.config.service.saved-access.test.js.map +1 -0
  1128. package/dist/src/backend/services/session/service/lifecycle/session.config.service.test.js +68 -82
  1129. package/dist/src/backend/services/session/service/lifecycle/session.config.service.test.js.map +1 -1
  1130. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.js +2 -15
  1131. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.js.map +1 -1
  1132. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts +1 -3
  1133. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts.map +1 -1
  1134. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js +0 -4
  1135. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js.map +1 -1
  1136. package/dist/src/backend/services/session/service/lifecycle/session.permission.question-classification.test.d.ts +2 -0
  1137. package/dist/src/backend/services/session/service/lifecycle/session.permission.question-classification.test.d.ts.map +1 -0
  1138. package/dist/src/backend/services/session/service/lifecycle/session.permission.question-classification.test.js +183 -0
  1139. package/dist/src/backend/services/session/service/lifecycle/session.permission.question-classification.test.js.map +1 -0
  1140. package/dist/src/backend/services/session/service/lifecycle/session.permission.service.d.ts +1 -2
  1141. package/dist/src/backend/services/session/service/lifecycle/session.permission.service.d.ts.map +1 -1
  1142. package/dist/src/backend/services/session/service/lifecycle/session.permission.service.js +27 -46
  1143. package/dist/src/backend/services/session/service/lifecycle/session.permission.service.js.map +1 -1
  1144. package/dist/src/backend/services/session/service/lifecycle/session.permission.service.test.js +64 -2
  1145. package/dist/src/backend/services/session/service/lifecycle/session.permission.service.test.js.map +1 -1
  1146. package/dist/src/backend/services/session/service/lifecycle/session.prompt.service.test.js +1 -1
  1147. package/dist/src/backend/services/session/service/lifecycle/session.prompt.service.test.js.map +1 -1
  1148. package/dist/src/backend/services/session/service/lifecycle/session.repository.d.ts +6 -2
  1149. package/dist/src/backend/services/session/service/lifecycle/session.repository.d.ts.map +1 -1
  1150. package/dist/src/backend/services/session/service/lifecycle/session.repository.js +61 -4
  1151. package/dist/src/backend/services/session/service/lifecycle/session.repository.js.map +1 -1
  1152. package/dist/src/backend/services/session/service/lifecycle/session.repository.test.js +98 -0
  1153. package/dist/src/backend/services/session/service/lifecycle/session.repository.test.js.map +1 -1
  1154. package/dist/src/backend/services/session/service/lifecycle/session.service.d.ts +1 -1
  1155. package/dist/src/backend/services/session/service/lifecycle/session.service.d.ts.map +1 -1
  1156. package/dist/src/backend/services/session/service/lifecycle/session.service.js.map +1 -1
  1157. package/dist/src/backend/services/session/service/lifecycle/session.service.test.js +26 -158
  1158. package/dist/src/backend/services/session/service/lifecycle/session.service.test.js.map +1 -1
  1159. package/dist/src/backend/services/session/service/session-domain.service.d.ts +7 -2
  1160. package/dist/src/backend/services/session/service/session-domain.service.d.ts.map +1 -1
  1161. package/dist/src/backend/services/session/service/session-domain.service.js +55 -15
  1162. package/dist/src/backend/services/session/service/session-domain.service.js.map +1 -1
  1163. package/dist/src/backend/services/session/service/session-domain.service.test.js +0 -7
  1164. package/dist/src/backend/services/session/service/session-domain.service.test.js.map +1 -1
  1165. package/dist/src/backend/services/session/service/session-resume-fence.d.ts +8 -0
  1166. package/dist/src/backend/services/session/service/session-resume-fence.d.ts.map +1 -0
  1167. package/dist/src/backend/services/session/service/session-resume-fence.js +19 -0
  1168. package/dist/src/backend/services/session/service/session-resume-fence.js.map +1 -0
  1169. package/dist/src/backend/services/session/service/store/session-queue.d.ts.map +1 -1
  1170. package/dist/src/backend/services/session/service/store/session-queue.js +7 -1
  1171. package/dist/src/backend/services/session/service/store/session-queue.js.map +1 -1
  1172. package/dist/src/backend/services/session/service/store/session-replay-builder.d.ts.map +1 -1
  1173. package/dist/src/backend/services/session/service/store/session-replay-builder.js +5 -3
  1174. package/dist/src/backend/services/session/service/store/session-replay-builder.js.map +1 -1
  1175. package/dist/src/backend/services/session/service/store/session-replay-builder.test.js +74 -0
  1176. package/dist/src/backend/services/session/service/store/session-replay-builder.test.js.map +1 -1
  1177. package/dist/src/backend/services/session/service/store/session-store-registry.d.ts +1 -0
  1178. package/dist/src/backend/services/session/service/store/session-store-registry.d.ts.map +1 -1
  1179. package/dist/src/backend/services/session/service/store/session-store-registry.js +3 -0
  1180. package/dist/src/backend/services/session/service/store/session-store-registry.js.map +1 -1
  1181. package/dist/src/backend/services/session/service/store/session-store.types.d.ts +3 -0
  1182. package/dist/src/backend/services/session/service/store/session-store.types.d.ts.map +1 -1
  1183. package/dist/src/backend/services/session/service/store/session-transcript.d.ts.map +1 -1
  1184. package/dist/src/backend/services/session/service/store/session-transcript.js +16 -0
  1185. package/dist/src/backend/services/session/service/store/session-transcript.js.map +1 -1
  1186. package/dist/src/backend/services/session/service/store/session-transcript.test.js +27 -0
  1187. package/dist/src/backend/services/session/service/store/session-transcript.test.js.map +1 -1
  1188. package/dist/src/backend/services/session/service/store/slash-command-cache.service.d.ts.map +1 -1
  1189. package/dist/src/backend/services/session/service/store/slash-command-cache.service.js.map +1 -1
  1190. package/dist/src/backend/services/session/service/voice/voice-narration.service.d.ts.map +1 -1
  1191. package/dist/src/backend/services/session/service/voice/voice-narration.service.js.map +1 -1
  1192. package/dist/src/backend/services/session/types.d.ts +15 -0
  1193. package/dist/src/backend/services/session/types.d.ts.map +1 -1
  1194. package/dist/src/backend/services/settings/resources/data-backup.accessor.d.ts +8 -2
  1195. package/dist/src/backend/services/settings/resources/data-backup.accessor.d.ts.map +1 -1
  1196. package/dist/src/backend/services/settings/resources/data-backup.accessor.js +8 -1
  1197. package/dist/src/backend/services/settings/resources/data-backup.accessor.js.map +1 -1
  1198. package/dist/src/backend/services/settings/resources/user-settings.accessor.d.ts +11 -1
  1199. package/dist/src/backend/services/settings/resources/user-settings.accessor.d.ts.map +1 -1
  1200. package/dist/src/backend/services/settings/resources/user-settings.accessor.js +48 -5
  1201. package/dist/src/backend/services/settings/resources/user-settings.accessor.js.map +1 -1
  1202. package/dist/src/backend/services/settings/resources/user-settings.accessor.test.js +31 -0
  1203. package/dist/src/backend/services/settings/resources/user-settings.accessor.test.js.map +1 -1
  1204. package/dist/src/backend/services/settings/service/index.d.ts +1 -0
  1205. package/dist/src/backend/services/settings/service/index.d.ts.map +1 -1
  1206. package/dist/src/backend/services/settings/service/index.js.map +1 -1
  1207. package/dist/src/backend/services/settings/service/user-settings.service.d.ts +11 -1
  1208. package/dist/src/backend/services/settings/service/user-settings.service.d.ts.map +1 -1
  1209. package/dist/src/backend/services/settings/service/user-settings.service.js.map +1 -1
  1210. package/dist/src/backend/services/terminal/resources/terminal-session.accessor.d.ts +1 -1
  1211. package/dist/src/backend/services/terminal/resources/terminal-session.accessor.d.ts.map +1 -1
  1212. package/dist/src/backend/services/terminal/resources/terminal-session.accessor.js.map +1 -1
  1213. package/dist/src/backend/services/terminal/service/terminal-session.service.d.ts +2 -3
  1214. package/dist/src/backend/services/terminal/service/terminal-session.service.d.ts.map +1 -1
  1215. package/dist/src/backend/services/terminal/service/terminal-session.service.js.map +1 -1
  1216. package/dist/src/backend/services/terminal/service/terminal.service.d.ts.map +1 -1
  1217. package/dist/src/backend/services/terminal/service/terminal.service.js +4 -1
  1218. package/dist/src/backend/services/terminal/service/terminal.service.js.map +1 -1
  1219. package/dist/src/backend/services/workspace/resources/project.accessor.d.ts +2 -2
  1220. package/dist/src/backend/services/workspace/resources/project.accessor.d.ts.map +1 -1
  1221. package/dist/src/backend/services/workspace/resources/project.accessor.js +1 -1
  1222. package/dist/src/backend/services/workspace/resources/project.accessor.js.map +1 -1
  1223. package/dist/src/backend/services/workspace/resources/workspace-auto-iteration.accessor.d.ts +1 -1
  1224. package/dist/src/backend/services/workspace/resources/workspace-auto-iteration.accessor.d.ts.map +1 -1
  1225. package/dist/src/backend/services/workspace/resources/workspace-auto-iteration.accessor.js.map +1 -1
  1226. package/dist/src/backend/services/workspace/resources/workspace-notification.accessor.d.ts.map +1 -1
  1227. package/dist/src/backend/services/workspace/resources/workspace-notification.accessor.js.map +1 -1
  1228. package/dist/src/backend/services/workspace/resources/workspace-pr-aggregate.accessor.d.ts +61 -0
  1229. package/dist/src/backend/services/workspace/resources/workspace-pr-aggregate.accessor.d.ts.map +1 -0
  1230. package/dist/src/backend/services/workspace/resources/workspace-pr-aggregate.accessor.js +35 -0
  1231. package/dist/src/backend/services/workspace/resources/workspace-pr-aggregate.accessor.js.map +1 -0
  1232. package/dist/src/backend/services/workspace/resources/workspace-pr-collection.accessor.integration.test.d.ts +2 -0
  1233. package/dist/src/backend/services/workspace/resources/workspace-pr-collection.accessor.integration.test.d.ts.map +1 -0
  1234. package/dist/src/backend/services/workspace/resources/workspace-pr-collection.accessor.integration.test.js +272 -0
  1235. package/dist/src/backend/services/workspace/resources/workspace-pr-collection.accessor.integration.test.js.map +1 -0
  1236. package/dist/src/backend/services/workspace/resources/workspace-pr-delivery-modes.accessor.integration.test.d.ts +2 -0
  1237. package/dist/src/backend/services/workspace/resources/workspace-pr-delivery-modes.accessor.integration.test.d.ts.map +1 -0
  1238. package/dist/src/backend/services/workspace/resources/workspace-pr-delivery-modes.accessor.integration.test.js +581 -0
  1239. package/dist/src/backend/services/workspace/resources/workspace-pr-delivery-modes.accessor.integration.test.js.map +1 -0
  1240. package/dist/src/backend/services/workspace/resources/workspace-pr-discovery.accessor.d.ts +73 -0
  1241. package/dist/src/backend/services/workspace/resources/workspace-pr-discovery.accessor.d.ts.map +1 -0
  1242. package/dist/src/backend/services/workspace/resources/workspace-pr-discovery.accessor.js +74 -0
  1243. package/dist/src/backend/services/workspace/resources/workspace-pr-discovery.accessor.js.map +1 -0
  1244. package/dist/src/backend/services/workspace/resources/workspace-pr-event-rollover.accessor.integration.test.d.ts +2 -0
  1245. package/dist/src/backend/services/workspace/resources/workspace-pr-event-rollover.accessor.integration.test.d.ts.map +1 -0
  1246. package/dist/src/backend/services/workspace/resources/workspace-pr-event-rollover.accessor.integration.test.js +176 -0
  1247. package/dist/src/backend/services/workspace/resources/workspace-pr-event-rollover.accessor.integration.test.js.map +1 -0
  1248. package/dist/src/backend/services/workspace/resources/workspace-pr-event.accessor.d.ts +75 -0
  1249. package/dist/src/backend/services/workspace/resources/workspace-pr-event.accessor.d.ts.map +1 -0
  1250. package/dist/src/backend/services/workspace/resources/workspace-pr-event.accessor.js +329 -0
  1251. package/dist/src/backend/services/workspace/resources/workspace-pr-event.accessor.js.map +1 -0
  1252. package/dist/src/backend/services/workspace/resources/workspace-pr-lifecycle.accessor.integration.test.d.ts +2 -0
  1253. package/dist/src/backend/services/workspace/resources/workspace-pr-lifecycle.accessor.integration.test.d.ts.map +1 -0
  1254. package/dist/src/backend/services/workspace/resources/workspace-pr-lifecycle.accessor.integration.test.js +437 -0
  1255. package/dist/src/backend/services/workspace/resources/workspace-pr-lifecycle.accessor.integration.test.js.map +1 -0
  1256. package/dist/src/backend/services/workspace/resources/workspace-pr-monitoring.accessor.d.ts +151 -0
  1257. package/dist/src/backend/services/workspace/resources/workspace-pr-monitoring.accessor.d.ts.map +1 -0
  1258. package/dist/src/backend/services/workspace/resources/workspace-pr-monitoring.accessor.integration.test.d.ts +2 -0
  1259. package/dist/src/backend/services/workspace/resources/workspace-pr-monitoring.accessor.integration.test.d.ts.map +1 -0
  1260. package/dist/src/backend/services/workspace/resources/workspace-pr-monitoring.accessor.integration.test.js +250 -0
  1261. package/dist/src/backend/services/workspace/resources/workspace-pr-monitoring.accessor.integration.test.js.map +1 -0
  1262. package/dist/src/backend/services/workspace/resources/workspace-pr-monitoring.accessor.js +275 -0
  1263. package/dist/src/backend/services/workspace/resources/workspace-pr-monitoring.accessor.js.map +1 -0
  1264. package/dist/src/backend/services/workspace/resources/workspace-pr.accessor.d.ts +204 -25
  1265. package/dist/src/backend/services/workspace/resources/workspace-pr.accessor.d.ts.map +1 -1
  1266. package/dist/src/backend/services/workspace/resources/workspace-pr.accessor.js +269 -164
  1267. package/dist/src/backend/services/workspace/resources/workspace-pr.accessor.js.map +1 -1
  1268. package/dist/src/backend/services/workspace/resources/workspace-pr.accessor.test.js +14 -339
  1269. package/dist/src/backend/services/workspace/resources/workspace-pr.accessor.test.js.map +1 -1
  1270. package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.d.ts +52 -42
  1271. package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.d.ts.map +1 -1
  1272. package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.js +34 -176
  1273. package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.js.map +1 -1
  1274. package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.test.js +82 -334
  1275. package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.test.js.map +1 -1
  1276. package/dist/src/backend/services/workspace/resources/workspace-run-script.accessor.d.ts +1 -1
  1277. package/dist/src/backend/services/workspace/resources/workspace-run-script.accessor.d.ts.map +1 -1
  1278. package/dist/src/backend/services/workspace/resources/workspace-run-script.accessor.js.map +1 -1
  1279. package/dist/src/backend/services/workspace/resources/workspace.accessor.d.ts +72 -36
  1280. package/dist/src/backend/services/workspace/resources/workspace.accessor.d.ts.map +1 -1
  1281. package/dist/src/backend/services/workspace/resources/workspace.accessor.js +86 -80
  1282. package/dist/src/backend/services/workspace/resources/workspace.accessor.js.map +1 -1
  1283. package/dist/src/backend/services/workspace/resources/workspace.accessor.test.js +76 -288
  1284. package/dist/src/backend/services/workspace/resources/workspace.accessor.test.js.map +1 -1
  1285. package/dist/src/backend/services/workspace/service/bridges.d.ts +2 -1
  1286. package/dist/src/backend/services/workspace/service/bridges.d.ts.map +1 -1
  1287. package/dist/src/backend/services/workspace/service/index.d.ts +4 -3
  1288. package/dist/src/backend/services/workspace/service/index.d.ts.map +1 -1
  1289. package/dist/src/backend/services/workspace/service/index.js +4 -3
  1290. package/dist/src/backend/services/workspace/service/index.js.map +1 -1
  1291. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.d.ts +1 -1
  1292. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.d.ts.map +1 -1
  1293. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.js.map +1 -1
  1294. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js +33 -8
  1295. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js.map +1 -1
  1296. package/dist/src/backend/services/workspace/service/lifecycle/data.service.d.ts +159 -77
  1297. package/dist/src/backend/services/workspace/service/lifecycle/data.service.d.ts.map +1 -1
  1298. package/dist/src/backend/services/workspace/service/lifecycle/data.service.js +4 -2
  1299. package/dist/src/backend/services/workspace/service/lifecycle/data.service.js.map +1 -1
  1300. package/dist/src/backend/services/workspace/service/lifecycle/state-machine.service.d.ts +1 -1
  1301. package/dist/src/backend/services/workspace/service/lifecycle/state-machine.service.d.ts.map +1 -1
  1302. package/dist/src/backend/services/workspace/service/lifecycle/state-machine.service.js.map +1 -1
  1303. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-monitoring.service.d.ts +174 -0
  1304. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-monitoring.service.d.ts.map +1 -0
  1305. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-monitoring.service.js +23 -0
  1306. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-monitoring.service.js.map +1 -0
  1307. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.d.ts +106 -2
  1308. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.d.ts.map +1 -1
  1309. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.integration.test.d.ts +2 -0
  1310. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.integration.test.d.ts.map +1 -0
  1311. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.integration.test.js +83 -0
  1312. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.integration.test.js.map +1 -0
  1313. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.js +24 -6
  1314. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.js.map +1 -1
  1315. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.test.js +2 -0
  1316. package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.test.js.map +1 -1
  1317. package/dist/src/backend/services/workspace/service/lifecycle/workspace-relationships.service.d.ts +87 -52
  1318. package/dist/src/backend/services/workspace/service/lifecycle/workspace-relationships.service.d.ts.map +1 -1
  1319. package/dist/src/backend/services/workspace/service/lifecycle/workspace-run-script.service.d.ts +1 -1
  1320. package/dist/src/backend/services/workspace/service/lifecycle/workspace-run-script.service.d.ts.map +1 -1
  1321. package/dist/src/backend/services/workspace/service/lifecycle/workspace-run-script.service.js.map +1 -1
  1322. package/dist/src/backend/services/workspace/service/lifecycle/workspace-state-capabilities.test.js +0 -15
  1323. package/dist/src/backend/services/workspace/service/lifecycle/workspace-state-capabilities.test.js.map +1 -1
  1324. package/dist/src/backend/services/workspace/service/query/project-management.service.d.ts +6 -8
  1325. package/dist/src/backend/services/workspace/service/query/project-management.service.d.ts.map +1 -1
  1326. package/dist/src/backend/services/workspace/service/query/project-management.service.js.map +1 -1
  1327. package/dist/src/backend/services/workspace/service/query/workspace-maintenance.service.d.ts +232 -67
  1328. package/dist/src/backend/services/workspace/service/query/workspace-maintenance.service.d.ts.map +1 -1
  1329. package/dist/src/backend/services/workspace/service/query/workspace-maintenance.service.js +1 -1
  1330. package/dist/src/backend/services/workspace/service/query/workspace-maintenance.service.js.map +1 -1
  1331. package/dist/src/backend/services/workspace/service/query/workspace-notification.service.test.js.map +1 -1
  1332. package/dist/src/backend/services/workspace/service/query/workspace-query-git.service.test.d.ts +2 -0
  1333. package/dist/src/backend/services/workspace/service/query/workspace-query-git.service.test.d.ts.map +1 -0
  1334. package/dist/src/backend/services/workspace/service/query/workspace-query-git.service.test.js +51 -0
  1335. package/dist/src/backend/services/workspace/service/query/workspace-query-git.service.test.js.map +1 -0
  1336. package/dist/src/backend/services/workspace/service/query/workspace-query-pr-sync.test.d.ts +2 -0
  1337. package/dist/src/backend/services/workspace/service/query/workspace-query-pr-sync.test.d.ts.map +1 -0
  1338. package/dist/src/backend/services/workspace/service/query/workspace-query-pr-sync.test.js +128 -0
  1339. package/dist/src/backend/services/workspace/service/query/workspace-query-pr-sync.test.js.map +1 -0
  1340. package/dist/src/backend/services/workspace/service/query/workspace-query.service.d.ts +29 -3
  1341. package/dist/src/backend/services/workspace/service/query/workspace-query.service.d.ts.map +1 -1
  1342. package/dist/src/backend/services/workspace/service/query/workspace-query.service.js +42 -10
  1343. package/dist/src/backend/services/workspace/service/query/workspace-query.service.js.map +1 -1
  1344. package/dist/src/backend/services/workspace/service/query/workspace-query.service.test.js +92 -56
  1345. package/dist/src/backend/services/workspace/service/query/workspace-query.service.test.js.map +1 -1
  1346. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-pr-equality.test.d.ts +2 -0
  1347. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-pr-equality.test.d.ts.map +1 -0
  1348. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-pr-equality.test.js +41 -0
  1349. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-pr-equality.test.js.map +1 -0
  1350. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.pr-monitoring.test.d.ts +2 -0
  1351. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.pr-monitoring.test.d.ts.map +1 -0
  1352. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.pr-monitoring.test.js +80 -0
  1353. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.pr-monitoring.test.js.map +1 -0
  1354. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.prs.test.d.ts +2 -0
  1355. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.prs.test.d.ts.map +1 -0
  1356. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.prs.test.js +60 -0
  1357. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.prs.test.js.map +1 -0
  1358. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.d.ts +8 -4
  1359. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.d.ts.map +1 -1
  1360. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.js +27 -11
  1361. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.js.map +1 -1
  1362. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.test.js +24 -42
  1363. package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.test.js.map +1 -1
  1364. package/dist/src/backend/services/workspace/service/state/flow-state.d.ts +1 -21
  1365. package/dist/src/backend/services/workspace/service/state/flow-state.d.ts.map +1 -1
  1366. package/dist/src/backend/services/workspace/service/state/flow-state.js +1 -107
  1367. package/dist/src/backend/services/workspace/service/state/flow-state.js.map +1 -1
  1368. package/dist/src/backend/services/workspace/service/state/pending-request-type.d.ts +1 -0
  1369. package/dist/src/backend/services/workspace/service/state/pending-request-type.d.ts.map +1 -1
  1370. package/dist/src/backend/services/workspace/service/state/pending-request-type.js +1 -1
  1371. package/dist/src/backend/services/workspace/service/state/pending-request-type.js.map +1 -1
  1372. package/dist/src/backend/services/workspace/service/state/pending-request-type.test.js +30 -2
  1373. package/dist/src/backend/services/workspace/service/state/pending-request-type.test.js.map +1 -1
  1374. package/dist/src/backend/services/workspace/service/workspace-domain-exports.test.js +2 -2
  1375. package/dist/src/backend/services/workspace/service/workspace-domain-exports.test.js.map +1 -1
  1376. package/dist/src/backend/services/workspace/service/worktree/git-clone.case-sensitivity.test.d.ts +2 -0
  1377. package/dist/src/backend/services/workspace/service/worktree/git-clone.case-sensitivity.test.d.ts.map +1 -0
  1378. package/dist/src/backend/services/workspace/service/worktree/git-clone.case-sensitivity.test.js +98 -0
  1379. package/dist/src/backend/services/workspace/service/worktree/git-clone.case-sensitivity.test.js.map +1 -0
  1380. package/dist/src/backend/services/workspace/service/worktree/git-clone.service.d.ts +16 -17
  1381. package/dist/src/backend/services/workspace/service/worktree/git-clone.service.d.ts.map +1 -1
  1382. package/dist/src/backend/services/workspace/service/worktree/git-clone.service.js +94 -45
  1383. package/dist/src/backend/services/workspace/service/worktree/git-clone.service.js.map +1 -1
  1384. package/dist/src/backend/services/workspace/service/worktree/git-clone.service.test.js +269 -0
  1385. package/dist/src/backend/services/workspace/service/worktree/git-clone.service.test.js.map +1 -1
  1386. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree-safety.d.ts +5 -0
  1387. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree-safety.d.ts.map +1 -0
  1388. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree-safety.js +58 -0
  1389. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree-safety.js.map +1 -0
  1390. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree-safety.test.d.ts +2 -0
  1391. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree-safety.test.d.ts.map +1 -0
  1392. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree-safety.test.js +221 -0
  1393. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree-safety.test.js.map +1 -0
  1394. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree.service.d.ts +22 -0
  1395. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree.service.d.ts.map +1 -0
  1396. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree.service.js +154 -0
  1397. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree.service.js.map +1 -0
  1398. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree.service.test.d.ts +2 -0
  1399. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree.service.test.d.ts.map +1 -0
  1400. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree.service.test.js +108 -0
  1401. package/dist/src/backend/services/workspace/service/worktree/orphaned-worktree.service.test.js.map +1 -0
  1402. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.test.js +1 -1
  1403. package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.test.js.map +1 -1
  1404. package/dist/src/backend/services/workspace/types.d.ts +6 -1
  1405. package/dist/src/backend/services/workspace/types.d.ts.map +1 -1
  1406. package/dist/src/backend/services/workspace-depth-triggers.integration.test.js.map +1 -1
  1407. package/dist/src/backend/services/workspace-git-state.concurrency.test.d.ts +2 -0
  1408. package/dist/src/backend/services/workspace-git-state.concurrency.test.d.ts.map +1 -0
  1409. package/dist/src/backend/services/workspace-git-state.concurrency.test.js +262 -0
  1410. package/dist/src/backend/services/workspace-git-state.concurrency.test.js.map +1 -0
  1411. package/dist/src/backend/services/workspace-git-state.service.d.ts +1 -0
  1412. package/dist/src/backend/services/workspace-git-state.service.d.ts.map +1 -1
  1413. package/dist/src/backend/services/workspace-git-state.service.js +34 -25
  1414. package/dist/src/backend/services/workspace-git-state.service.js.map +1 -1
  1415. package/dist/src/backend/shutdown-signal-handlers.d.ts +16 -0
  1416. package/dist/src/backend/shutdown-signal-handlers.d.ts.map +1 -0
  1417. package/dist/src/backend/shutdown-signal-handlers.js +18 -0
  1418. package/dist/src/backend/shutdown-signal-handlers.js.map +1 -0
  1419. package/dist/src/backend/shutdown-signal-handlers.test.d.ts +2 -0
  1420. package/dist/src/backend/shutdown-signal-handlers.test.d.ts.map +1 -0
  1421. package/dist/src/backend/shutdown-signal-handlers.test.js +58 -0
  1422. package/dist/src/backend/shutdown-signal-handlers.test.js.map +1 -0
  1423. package/dist/src/backend/testing/check-lint-suppressions-script.test.d.ts +2 -0
  1424. package/dist/src/backend/testing/check-lint-suppressions-script.test.d.ts.map +1 -0
  1425. package/dist/src/backend/testing/check-lint-suppressions-script.test.js +120 -0
  1426. package/dist/src/backend/testing/check-lint-suppressions-script.test.js.map +1 -0
  1427. package/dist/src/backend/testing/dependency-security-patches.test.d.ts +2 -0
  1428. package/dist/src/backend/testing/dependency-security-patches.test.d.ts.map +1 -0
  1429. package/dist/src/backend/testing/dependency-security-patches.test.js +65 -0
  1430. package/dist/src/backend/testing/dependency-security-patches.test.js.map +1 -0
  1431. package/dist/src/backend/testing/fixtures/fake-codex-app-server.d.mts +3 -0
  1432. package/dist/src/backend/testing/fixtures/fake-codex-app-server.d.mts.map +1 -0
  1433. package/dist/src/backend/testing/fixtures/fake-codex-app-server.mjs +125 -0
  1434. package/dist/src/backend/testing/fixtures/fake-codex-app-server.mjs.map +1 -0
  1435. package/dist/src/backend/testing/integration-db.d.ts.map +1 -1
  1436. package/dist/src/backend/testing/integration-db.js +1 -1
  1437. package/dist/src/backend/testing/integration-db.js.map +1 -1
  1438. package/dist/src/backend/testing/lint-migration-parity.test.d.ts +2 -0
  1439. package/dist/src/backend/testing/lint-migration-parity.test.d.ts.map +1 -0
  1440. package/dist/src/backend/testing/lint-migration-parity.test.js +71 -0
  1441. package/dist/src/backend/testing/lint-migration-parity.test.js.map +1 -0
  1442. package/dist/src/backend/testing/npm-publish-workflow.test.js +4 -3
  1443. package/dist/src/backend/testing/npm-publish-workflow.test.js.map +1 -1
  1444. package/dist/src/backend/testing/oxlint-factory-rules.test.d.ts +2 -0
  1445. package/dist/src/backend/testing/oxlint-factory-rules.test.d.ts.map +1 -0
  1446. package/dist/src/backend/testing/oxlint-factory-rules.test.js +71 -0
  1447. package/dist/src/backend/testing/oxlint-factory-rules.test.js.map +1 -0
  1448. package/dist/src/backend/testing/pr-projection-fixture.d.ts +18 -0
  1449. package/dist/src/backend/testing/pr-projection-fixture.d.ts.map +1 -0
  1450. package/dist/src/backend/testing/pr-projection-fixture.js +11 -0
  1451. package/dist/src/backend/testing/pr-projection-fixture.js.map +1 -0
  1452. package/dist/src/backend/trpc/admin.router.test.js +31 -1
  1453. package/dist/src/backend/trpc/admin.router.test.js.map +1 -1
  1454. package/dist/src/backend/trpc/admin.trpc.d.ts +1962 -5
  1455. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  1456. package/dist/src/backend/trpc/admin.trpc.js +2 -0
  1457. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  1458. package/dist/src/backend/trpc/adversarial-review.trpc.d.ts +26 -0
  1459. package/dist/src/backend/trpc/adversarial-review.trpc.d.ts.map +1 -0
  1460. package/dist/src/backend/trpc/adversarial-review.trpc.js +10 -0
  1461. package/dist/src/backend/trpc/adversarial-review.trpc.js.map +1 -0
  1462. package/dist/src/backend/trpc/github.router.test.js +0 -37
  1463. package/dist/src/backend/trpc/github.router.test.js.map +1 -1
  1464. package/dist/src/backend/trpc/github.trpc.d.ts +0 -29
  1465. package/dist/src/backend/trpc/github.trpc.d.ts.map +1 -1
  1466. package/dist/src/backend/trpc/github.trpc.js +0 -56
  1467. package/dist/src/backend/trpc/github.trpc.js.map +1 -1
  1468. package/dist/src/backend/trpc/index.d.ts +2219 -263
  1469. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  1470. package/dist/src/backend/trpc/index.js +2 -0
  1471. package/dist/src/backend/trpc/index.js.map +1 -1
  1472. package/dist/src/backend/trpc/model-catalog.integration.test.js +1 -1
  1473. package/dist/src/backend/trpc/model-catalog.integration.test.js.map +1 -1
  1474. package/dist/src/backend/trpc/project.router.test.js +85 -10
  1475. package/dist/src/backend/trpc/project.router.test.js.map +1 -1
  1476. package/dist/src/backend/trpc/project.slash-command-precedence.test.d.ts +2 -0
  1477. package/dist/src/backend/trpc/project.slash-command-precedence.test.d.ts.map +1 -0
  1478. package/dist/src/backend/trpc/project.slash-command-precedence.test.js +69 -0
  1479. package/dist/src/backend/trpc/project.slash-command-precedence.test.js.map +1 -0
  1480. package/dist/src/backend/trpc/project.trpc.d.ts +13 -12
  1481. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  1482. package/dist/src/backend/trpc/project.trpc.js +10 -7
  1483. package/dist/src/backend/trpc/project.trpc.js.map +1 -1
  1484. package/dist/src/backend/trpc/session.router.test.js +1 -1
  1485. package/dist/src/backend/trpc/session.router.test.js.map +1 -1
  1486. package/dist/src/backend/trpc/session.trpc.d.ts +2 -2
  1487. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  1488. package/dist/src/backend/trpc/session.trpc.js +1 -1
  1489. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  1490. package/dist/src/backend/trpc/trpc.d.ts.map +1 -1
  1491. package/dist/src/backend/trpc/trpc.js +1 -1
  1492. package/dist/src/backend/trpc/trpc.js.map +1 -1
  1493. package/dist/src/backend/trpc/user-settings.router.test.js +66 -10
  1494. package/dist/src/backend/trpc/user-settings.router.test.js.map +1 -1
  1495. package/dist/src/backend/trpc/user-settings.trpc.d.ts +38 -8
  1496. package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -1
  1497. package/dist/src/backend/trpc/user-settings.trpc.js +19 -8
  1498. package/dist/src/backend/trpc/user-settings.trpc.js.map +1 -1
  1499. package/dist/src/backend/trpc/workspace/children.trpc.d.ts +23 -2
  1500. package/dist/src/backend/trpc/workspace/children.trpc.d.ts.map +1 -1
  1501. package/dist/src/backend/trpc/workspace/children.trpc.js +5 -1
  1502. package/dist/src/backend/trpc/workspace/children.trpc.js.map +1 -1
  1503. package/dist/src/backend/trpc/workspace/init.router.test.js +0 -2
  1504. package/dist/src/backend/trpc/workspace/init.router.test.js.map +1 -1
  1505. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +40 -22
  1506. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  1507. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +78 -43
  1508. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  1509. package/dist/src/backend/trpc/workspace-pr-actions.test.d.ts +2 -0
  1510. package/dist/src/backend/trpc/workspace-pr-actions.test.d.ts.map +1 -0
  1511. package/dist/src/backend/trpc/workspace-pr-actions.test.js +48 -0
  1512. package/dist/src/backend/trpc/workspace-pr-actions.test.js.map +1 -0
  1513. package/dist/src/backend/trpc/workspace.router.test.js +48 -6
  1514. package/dist/src/backend/trpc/workspace.router.test.js.map +1 -1
  1515. package/dist/src/backend/trpc/workspace.trpc.d.ts +292 -387
  1516. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  1517. package/dist/src/backend/trpc/workspace.trpc.js +52 -38
  1518. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  1519. package/dist/src/cli/codex.d.ts +4 -0
  1520. package/dist/src/cli/codex.d.ts.map +1 -0
  1521. package/dist/src/cli/codex.js +50 -0
  1522. package/dist/src/cli/codex.js.map +1 -0
  1523. package/dist/src/cli/codex.test.d.ts +2 -0
  1524. package/dist/src/cli/codex.test.d.ts.map +1 -0
  1525. package/dist/src/cli/codex.test.js +64 -0
  1526. package/dist/src/cli/codex.test.js.map +1 -0
  1527. package/dist/src/cli/index.js +7 -10
  1528. package/dist/src/cli/index.js.map +1 -1
  1529. package/dist/src/shared/acp-protocol/protocol/interaction.d.ts +6 -0
  1530. package/dist/src/shared/acp-protocol/protocol/interaction.d.ts.map +1 -1
  1531. package/dist/src/shared/acp-protocol/protocol/messages.d.ts +1 -1
  1532. package/dist/src/shared/acp-protocol/protocol/messages.d.ts.map +1 -1
  1533. package/dist/src/shared/acp-protocol/protocol/messages.js +1 -0
  1534. package/dist/src/shared/acp-protocol/protocol/messages.js.map +1 -1
  1535. package/dist/src/shared/acp-protocol/protocol/queued.d.ts +5 -0
  1536. package/dist/src/shared/acp-protocol/protocol/queued.d.ts.map +1 -1
  1537. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts +2 -0
  1538. package/dist/src/shared/acp-protocol/protocol/websocket.d.ts.map +1 -1
  1539. package/dist/src/shared/acp-protocol/protocol/websocket.js.map +1 -1
  1540. package/dist/src/shared/acp-protocol/question-input.d.ts +11 -0
  1541. package/dist/src/shared/acp-protocol/question-input.d.ts.map +1 -0
  1542. package/dist/src/shared/acp-protocol/question-input.js +40 -0
  1543. package/dist/src/shared/acp-protocol/question-input.js.map +1 -0
  1544. package/dist/src/shared/acp-protocol/question-validation.d.ts +31 -0
  1545. package/dist/src/shared/acp-protocol/question-validation.d.ts.map +1 -0
  1546. package/dist/src/shared/acp-protocol/question-validation.js +88 -0
  1547. package/dist/src/shared/acp-protocol/question-validation.js.map +1 -0
  1548. package/dist/src/shared/acp-protocol/session-update-translator.d.ts +5 -1
  1549. package/dist/src/shared/acp-protocol/session-update-translator.d.ts.map +1 -1
  1550. package/dist/src/shared/acp-protocol/session-update-translator.js +87 -12
  1551. package/dist/src/shared/acp-protocol/session-update-translator.js.map +1 -1
  1552. package/dist/src/shared/adversarial-review.d.ts +4 -0
  1553. package/dist/src/shared/adversarial-review.d.ts.map +1 -0
  1554. package/dist/src/shared/adversarial-review.js +6 -0
  1555. package/dist/src/shared/adversarial-review.js.map +1 -0
  1556. package/dist/src/shared/appearance.d.ts +69 -0
  1557. package/dist/src/shared/appearance.d.ts.map +1 -0
  1558. package/dist/src/shared/appearance.js +151 -0
  1559. package/dist/src/shared/appearance.js.map +1 -0
  1560. package/dist/src/shared/chat-capabilities.d.ts +0 -16
  1561. package/dist/src/shared/chat-capabilities.d.ts.map +1 -1
  1562. package/dist/src/shared/chat-capabilities.js +0 -113
  1563. package/dist/src/shared/chat-capabilities.js.map +1 -1
  1564. package/dist/src/shared/core/index.d.ts +1 -1
  1565. package/dist/src/shared/core/index.d.ts.map +1 -1
  1566. package/dist/src/shared/core/index.js +1 -1
  1567. package/dist/src/shared/core/index.js.map +1 -1
  1568. package/dist/src/shared/core/workspace-sidebar-status.d.ts +4 -1
  1569. package/dist/src/shared/core/workspace-sidebar-status.d.ts.map +1 -1
  1570. package/dist/src/shared/core/workspace-sidebar-status.js +1 -25
  1571. package/dist/src/shared/core/workspace-sidebar-status.js.map +1 -1
  1572. package/dist/src/shared/github-types.d.ts +4 -1
  1573. package/dist/src/shared/github-types.d.ts.map +1 -1
  1574. package/dist/src/shared/github-url.d.ts +6 -0
  1575. package/dist/src/shared/github-url.d.ts.map +1 -0
  1576. package/dist/src/shared/github-url.js +20 -0
  1577. package/dist/src/shared/github-url.js.map +1 -0
  1578. package/dist/src/shared/kanban-column-projection.d.ts.map +1 -1
  1579. package/dist/src/shared/kanban-column-projection.js +6 -1
  1580. package/dist/src/shared/kanban-column-projection.js.map +1 -1
  1581. package/dist/src/shared/pending-request-types.d.ts +3 -7
  1582. package/dist/src/shared/pending-request-types.d.ts.map +1 -1
  1583. package/dist/src/shared/pending-request-types.js +1 -14
  1584. package/dist/src/shared/pending-request-types.js.map +1 -1
  1585. package/dist/src/shared/pr-monitoring.d.ts +67 -0
  1586. package/dist/src/shared/pr-monitoring.d.ts.map +1 -0
  1587. package/dist/src/shared/pr-monitoring.js +159 -0
  1588. package/dist/src/shared/pr-monitoring.js.map +1 -0
  1589. package/dist/src/shared/pr-monitoring.test-helpers.d.ts +3 -0
  1590. package/dist/src/shared/pr-monitoring.test-helpers.d.ts.map +1 -0
  1591. package/dist/src/shared/pr-monitoring.test-helpers.js +29 -0
  1592. package/dist/src/shared/pr-monitoring.test-helpers.js.map +1 -0
  1593. package/dist/src/shared/schemas/export-data-pr-validation.d.ts +39 -0
  1594. package/dist/src/shared/schemas/export-data-pr-validation.d.ts.map +1 -0
  1595. package/dist/src/shared/schemas/export-data-pr-validation.js +67 -0
  1596. package/dist/src/shared/schemas/export-data-pr-validation.js.map +1 -0
  1597. package/dist/src/shared/schemas/export-data.schema.d.ts +4052 -9
  1598. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  1599. package/dist/src/shared/schemas/export-data.schema.js +195 -4
  1600. package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
  1601. package/dist/src/shared/schemas/pr-event.schema.d.ts +898 -0
  1602. package/dist/src/shared/schemas/pr-event.schema.d.ts.map +1 -0
  1603. package/dist/src/shared/schemas/pr-event.schema.js +76 -0
  1604. package/dist/src/shared/schemas/pr-event.schema.js.map +1 -0
  1605. package/dist/src/shared/schemas/pr-monitoring-backup.schema.d.ts +531 -0
  1606. package/dist/src/shared/schemas/pr-monitoring-backup.schema.d.ts.map +1 -0
  1607. package/dist/src/shared/schemas/pr-monitoring-backup.schema.js +76 -0
  1608. package/dist/src/shared/schemas/pr-monitoring-backup.schema.js.map +1 -0
  1609. package/dist/src/shared/websocket/chat-message.schema.d.ts +1 -0
  1610. package/dist/src/shared/websocket/chat-message.schema.d.ts.map +1 -1
  1611. package/dist/src/shared/websocket/chat-message.schema.js +5 -1
  1612. package/dist/src/shared/websocket/chat-message.schema.js.map +1 -1
  1613. package/dist/src/shared/workspace-flow-state.d.ts +21 -0
  1614. package/dist/src/shared/workspace-flow-state.d.ts.map +1 -1
  1615. package/dist/src/shared/workspace-flow-state.js +116 -0
  1616. package/dist/src/shared/workspace-flow-state.js.map +1 -1
  1617. package/dist/src/shared/workspace-pr-summary.d.ts +35 -0
  1618. package/dist/src/shared/workspace-pr-summary.d.ts.map +1 -0
  1619. package/dist/src/shared/workspace-pr-summary.js +62 -0
  1620. package/dist/src/shared/workspace-pr-summary.js.map +1 -0
  1621. package/dist/src/shared/workspace-pr.d.ts +29 -0
  1622. package/dist/src/shared/workspace-pr.d.ts.map +1 -0
  1623. package/dist/src/shared/workspace-pr.js +16 -0
  1624. package/dist/src/shared/workspace-pr.js.map +1 -0
  1625. package/dist/src/shared/workspace-sidebar-status.d.ts +1 -1
  1626. package/dist/src/shared/workspace-sidebar-status.d.ts.map +1 -1
  1627. package/dist/src/shared/workspace-sidebar-status.js +1 -1
  1628. package/dist/src/shared/workspace-sidebar-status.js.map +1 -1
  1629. package/dist/src/shared/workspace-snapshot.d.ts +360 -35
  1630. package/dist/src/shared/workspace-snapshot.d.ts.map +1 -1
  1631. package/dist/src/shared/workspace-snapshot.js +22 -4
  1632. package/dist/src/shared/workspace-snapshot.js.map +1 -1
  1633. package/dist/src/shared/workspace-status-reason.d.ts +3 -1
  1634. package/dist/src/shared/workspace-status-reason.d.ts.map +1 -1
  1635. package/dist/src/shared/workspace-status-reason.js +29 -7
  1636. package/dist/src/shared/workspace-status-reason.js.map +1 -1
  1637. package/dist/src/test-utils/application-graph.d.ts +0 -6
  1638. package/dist/src/test-utils/application-graph.d.ts.map +1 -1
  1639. package/dist/src/test-utils/application-graph.js +23 -17
  1640. package/dist/src/test-utils/application-graph.js.map +1 -1
  1641. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  1642. package/package.json +106 -89
  1643. package/prisma/migrations/20260916235822_add_adversarial_review_settings/migration.sql +42 -0
  1644. package/prisma/migrations/20261008120000_multiple_workspace_prs/migration.sql +49 -0
  1645. package/prisma/migrations/20261008130000_pr_event_ledger/migration.sql +43 -0
  1646. package/prisma/migrations/20261008140000_pr_monitoring_cutover/migration.sql +18 -0
  1647. package/prisma/migrations/20261008150000_pr_delivery_identity/migration.sql +3 -0
  1648. package/prisma/migrations/20261009120000_pr_delivery_modes/migration.sql +10 -0
  1649. package/prisma/migrations/20261011120000_add_appearance_settings/migration.sql +7 -0
  1650. package/prisma/schema.prisma +104 -96
  1651. package/prompts/adversarial-review/dispatch.md +93 -0
  1652. package/scripts/postinstall.mjs +62 -67
  1653. package/dist/client/assets/Archive.es-moH8rDRO.js +0 -1
  1654. package/dist/client/assets/ArrowLeft.es-CVl_zVBC.js +0 -1
  1655. package/dist/client/assets/abnfDiagram-VCTEODGH-DzuBdUSN.js +0 -1
  1656. package/dist/client/assets/admin-page-CAsPxzW9.js +0 -1
  1657. package/dist/client/assets/alert-2CAe526X.js +0 -1
  1658. package/dist/client/assets/alert-dialog-8vhMuR-k.js +0 -1
  1659. package/dist/client/assets/arc-Pry-7G1_.js +0 -1
  1660. package/dist/client/assets/architecture-7GRP2DOG-Bcwjoi8B.js +0 -1
  1661. package/dist/client/assets/architectureDiagram-5GKGNRK7-CeuoQvaW.js +0 -36
  1662. package/dist/client/assets/badge-CoDH1rER.js +0 -1
  1663. package/dist/client/assets/blockDiagram-I7D4REHJ-BY92gQgN.js +0 -129
  1664. package/dist/client/assets/c4Diagram-7LVT6UL2-D5TNBYXh.js +0 -38
  1665. package/dist/client/assets/channel-NEbtzeVB.js +0 -1
  1666. package/dist/client/assets/chunk-4HAMMTFA-DBbX-wzu.js +0 -62
  1667. package/dist/client/assets/chunk-75Z2AOVW-962-yyBD.js +0 -2
  1668. package/dist/client/assets/chunk-DU6HZSFF-CHHMX1CR.js +0 -127
  1669. package/dist/client/assets/chunk-F27PBJKO-BOnYAGjZ.js +0 -1
  1670. package/dist/client/assets/chunk-FOHPRMQF-CoA4358r.js +0 -161
  1671. package/dist/client/assets/chunk-GMAD6QVW-DQF31PdR.js +0 -72
  1672. package/dist/client/assets/chunk-GVQU2GXP-rruJzn36.js +0 -1
  1673. package/dist/client/assets/chunk-IMKFNOWR-GIKO0MCA.js +0 -231
  1674. package/dist/client/assets/chunk-L3NEJ4N5-USlKRxmU.js +0 -1
  1675. package/dist/client/assets/chunk-OSK3NFVY-DYQeYWNP.js +0 -10
  1676. package/dist/client/assets/chunk-P2QGCYS3-SDkZ9hQX.js +0 -1
  1677. package/dist/client/assets/chunk-POPQ4Y6H-bdnFdIMc.js +0 -1
  1678. package/dist/client/assets/chunk-PWAF6VOD-DuKrEmQw.js +0 -1
  1679. package/dist/client/assets/chunk-SHT3W25Y-BnWDS29f.js +0 -168
  1680. package/dist/client/assets/chunk-SVP7TREG-BqyZjR36.js +0 -88
  1681. package/dist/client/assets/chunk-TICWLB2K-ZCb3dlre.js +0 -206
  1682. package/dist/client/assets/chunk-XXDRQBXY-DqAYeljN.js +0 -1
  1683. package/dist/client/assets/ci-status-cs76P3se.js +0 -1
  1684. package/dist/client/assets/classDiagram-ZZMXUADV-zE_E4kYq.js +0 -1
  1685. package/dist/client/assets/classDiagram-v2-VYDZK3BY-zE_E4kYq.js +0 -1
  1686. package/dist/client/assets/components-CoS_rGt2.js +0 -1
  1687. package/dist/client/assets/confirm-dialog-CfvO9f42.js +0 -1
  1688. package/dist/client/assets/core-DW3tuXQ3.js +0 -1
  1689. package/dist/client/assets/cose-bilkent-JH36ORCC-BbJNf1Rj.js +0 -1
  1690. package/dist/client/assets/cynefin-OW5HDTMX-Ci2WypGa.js +0 -1
  1691. package/dist/client/assets/cynefinDiagram-5FMLGOSQ-CGea7wa2.js +0 -62
  1692. package/dist/client/assets/cytoscape.esm-B-1iW2ft.js +0 -321
  1693. package/dist/client/assets/dagre-C-rnJpZF.js +0 -1
  1694. package/dist/client/assets/dagre-GXQ25YYZ-CJcHs09G.js +0 -4
  1695. package/dist/client/assets/data-import-button-cvKmYZJe.js +0 -6
  1696. package/dist/client/assets/detail-C3U9ED1b.js +0 -1
  1697. package/dist/client/assets/diagram-S7CK7UJ4-Drsfjeco.js +0 -30
  1698. package/dist/client/assets/diagram-UQ7AKVKN-0SrBP_3E.js +0 -41
  1699. package/dist/client/assets/diagram-VSXAHHWV-DB2rqHgv.js +0 -3
  1700. package/dist/client/assets/diagram-VX7I27RA-B2y3VQbR.js +0 -24
  1701. package/dist/client/assets/diagram-Z3DM3KII-D63_zfy5.js +0 -24
  1702. package/dist/client/assets/diff-highlight.worker-FEJq0yPv.js +0 -60
  1703. package/dist/client/assets/dist-BO6Gz-vk.js +0 -1
  1704. package/dist/client/assets/dist-DGw3MClt.js +0 -41
  1705. package/dist/client/assets/dist-v5Q1xZ2K.js +0 -1
  1706. package/dist/client/assets/ebnfDiagram-PWID7BFC-8gEK-ifx.js +0 -1
  1707. package/dist/client/assets/en-US-C-x19js7.js +0 -1
  1708. package/dist/client/assets/erDiagram-RLTQ6QDP-B2CcHHg7.js +0 -99
  1709. package/dist/client/assets/eventmodeling-NTZA5JFV-DqUwwD9w.js +0 -1
  1710. package/dist/client/assets/factory-config-scripts-C2BfO5od.js +0 -1
  1711. package/dist/client/assets/flowDiagram-HODETNUW-DCZkaOsj.js +0 -1
  1712. package/dist/client/assets/ganttDiagram-EL5Y4UJY-B_Y3HJTL.js +0 -292
  1713. package/dist/client/assets/gitGraph-4MIJSDKK-DBd1UxTm.js +0 -1
  1714. package/dist/client/assets/gitGraphDiagram-WWUBYQGX-CrdKibnu.js +0 -106
  1715. package/dist/client/assets/home-DRzNpm0E.js +0 -1
  1716. package/dist/client/assets/hooks-3rxtNHRh.js +0 -1
  1717. package/dist/client/assets/index-BJo4hZ8z.js +0 -10
  1718. package/dist/client/assets/index-CpFffknJ.css +0 -2
  1719. package/dist/client/assets/info-A6RAGUB7-CCMRmQ2H.js +0 -1
  1720. package/dist/client/assets/infoDiagram-27XIBGKW-DO-IhKUM.js +0 -2
  1721. package/dist/client/assets/ishikawaDiagram-5VMMS53U-KejlLQ1k.js +0 -70
  1722. package/dist/client/assets/journeyDiagram-3NMN7TZE-DemWKqD6.js +0 -139
  1723. package/dist/client/assets/jsx-runtime-BNakU3Ej.js +0 -1
  1724. package/dist/client/assets/kanban-definition-UXKFOSKX-uRffHAE9.js +0 -89
  1725. package/dist/client/assets/katex-ZlcWpGUi.js +0 -257
  1726. package/dist/client/assets/label-ANA2Lfpk.js +0 -1
  1727. package/dist/client/assets/lib-CHy_7XQu.js +0 -1
  1728. package/dist/client/assets/line-CfCBYCoS.js +0 -1
  1729. package/dist/client/assets/linear-SzVmGSw4.js +0 -1
  1730. package/dist/client/assets/list-C3P6JbyU.js +0 -30
  1731. package/dist/client/assets/list-oJCufmEX.js +0 -1
  1732. package/dist/client/assets/logs-zb2la033.js +0 -1
  1733. package/dist/client/assets/mermaid-diagram-kbWN558y.js +0 -44
  1734. package/dist/client/assets/mermaid-parser.core-CpkwJ-8U.js +0 -7
  1735. package/dist/client/assets/mindmap-definition-YA3MSWOX-DYYi_9Si.js +0 -96
  1736. package/dist/client/assets/mobile-baseline-BVS3GXLz.js +0 -10
  1737. package/dist/client/assets/new-BiEmR60A.js +0 -1
  1738. package/dist/client/assets/new-CcQm3ES8.js +0 -1
  1739. package/dist/client/assets/packet-AYTQ26CC-kvNXQn-j.js +0 -1
  1740. package/dist/client/assets/page-header-CpSh-j1O.js +0 -1
  1741. package/dist/client/assets/pegDiagram-XKGWAZYB-CMAngYAK.js +0 -1
  1742. package/dist/client/assets/pie-WAS4IAKB-DFNGAljQ.js +0 -1
  1743. package/dist/client/assets/pieDiagram-E7YTZNPT-XGRy7b5E.js +0 -39
  1744. package/dist/client/assets/popover-CIfFCO0U.js +0 -1
  1745. package/dist/client/assets/pr-inbox-item-D9UcI0SS.js +0 -2
  1746. package/dist/client/assets/preload-helper-BZ1Pz5am.js +0 -1
  1747. package/dist/client/assets/project-repo-form-Dc8ha6XP.js +0 -1
  1748. package/dist/client/assets/provider-cli-warning-CIAJ88Cy.js +0 -1
  1749. package/dist/client/assets/quadrantDiagram-AXDQQJYC-BFek-axl.js +0 -7
  1750. package/dist/client/assets/radar-RG4KPBEZ-k-UBw86I.js +0 -1
  1751. package/dist/client/assets/radio-group-BhmTXkIv.js +0 -1
  1752. package/dist/client/assets/railroad-74A4TZTK-B6DuT-HY.js +0 -1
  1753. package/dist/client/assets/railroad-abnf-HS5TGJTU-DF-z1cVb.js +0 -1
  1754. package/dist/client/assets/railroad-ebnf-LZEXJU2U-C6VgaalR.js +0 -1
  1755. package/dist/client/assets/railroad-peg-WCYAUIDC-DRMqhGU3.js +0 -1
  1756. package/dist/client/assets/railroadDiagram-O6MQD6OU-CBzDTFh9.js +0 -1
  1757. package/dist/client/assets/redirect-DexaYCz_.js +0 -1
  1758. package/dist/client/assets/requirementDiagram-BXWQKSXE-DSgpbBy3.js +0 -84
  1759. package/dist/client/assets/reviews-DDO7Pvrz.js +0 -1
  1760. package/dist/client/assets/rolldown-runtime-hePW80VL.js +0 -1
  1761. package/dist/client/assets/sankeyDiagram-P5KCCOFB-BOWaOPXp.js +0 -40
  1762. package/dist/client/assets/select-Cq3ddA2b.js +0 -1
  1763. package/dist/client/assets/sequenceDiagram-WJ2MYXX4-9wHsZFGh.js +0 -162
  1764. package/dist/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -1
  1765. package/dist/client/assets/spinner-BszfzCYe.js +0 -1
  1766. package/dist/client/assets/src-B6xuSHsQ.js +0 -1
  1767. package/dist/client/assets/startup-script-form-CHvwd1Nb.js +0 -1
  1768. package/dist/client/assets/stateDiagram-D77RDMKH-Blo9H6q_.js +0 -1
  1769. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BzJ9AKXW.js +0 -1
  1770. package/dist/client/assets/swimlanes-42K2YHIH-DI0BHdWG.js +0 -1
  1771. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DSnxWZUW.js +0 -8
  1772. package/dist/client/assets/table-CUvMM0aA.js +0 -1
  1773. package/dist/client/assets/tabs-BBAQyvSA.js +0 -1
  1774. package/dist/client/assets/terminal-instance-BEqkmyvv.js +0 -16
  1775. package/dist/client/assets/textarea-DxWYClhS.js +0 -1
  1776. package/dist/client/assets/timeline-definition-24CTP7MA-C8fyxpVm.js +0 -120
  1777. package/dist/client/assets/tooltip-DXcY1U7y.js +0 -1
  1778. package/dist/client/assets/treeView-Q6P3EWNA-CzQAwJw-.js +0 -1
  1779. package/dist/client/assets/treemap-WGGIJYW6-zWRSK6WR.js +0 -1
  1780. package/dist/client/assets/trpc-CQO3zfei.js +0 -1
  1781. package/dist/client/assets/use-auto-scroll-DNohsNoz.js +0 -1
  1782. package/dist/client/assets/use-download-server-log-efKIcIwE.js +0 -1
  1783. package/dist/client/assets/use-project-header-navigation-D5yIIgnb.js +0 -1
  1784. package/dist/client/assets/use-websocket-channel-dNXOJZfW.js +0 -4
  1785. package/dist/client/assets/use-websocket-transport-BuYcrZTd.js +0 -55
  1786. package/dist/client/assets/vbnet-CwR9YcOY.js +0 -57
  1787. package/dist/client/assets/vennDiagram-4TSXK5OY-ffnMpD5u.js +0 -34
  1788. package/dist/client/assets/wardley-WFR3VGLG-acbsrLnl.js +0 -1
  1789. package/dist/client/assets/wardleyDiagram-VM6X3IG4-BtqGCwsu.js +0 -78
  1790. package/dist/client/assets/workspace-a6lf168c.js +0 -18
  1791. package/dist/client/assets/xychartDiagram-S5SC5T6Z-Bfy9xcWF.js +0 -7
  1792. package/dist/prisma/generated/models/WorkspaceRatchet.d.ts +0 -625
  1793. package/dist/prisma/generated/models/WorkspaceRatchet.d.ts.map +0 -1
  1794. package/dist/prisma/generated/models/WorkspaceRatchet.js +0 -2
  1795. package/dist/prisma/generated/models/WorkspaceRatchet.js.map +0 -1
  1796. package/dist/prompts/ratchet/dispatch.md +0 -19
  1797. package/dist/src/backend/prompts/ratchet-dispatch.d.ts +0 -14
  1798. package/dist/src/backend/prompts/ratchet-dispatch.d.ts.map +0 -1
  1799. package/dist/src/backend/prompts/ratchet-dispatch.js +0 -80
  1800. package/dist/src/backend/prompts/ratchet-dispatch.js.map +0 -1
  1801. package/dist/src/backend/prompts/ratchet-dispatch.test.d.ts +0 -2
  1802. package/dist/src/backend/prompts/ratchet-dispatch.test.d.ts.map +0 -1
  1803. package/dist/src/backend/prompts/ratchet-dispatch.test.js +0 -156
  1804. package/dist/src/backend/prompts/ratchet-dispatch.test.js.map +0 -1
  1805. package/dist/src/backend/services/ratchet/service/bridges.d.ts +0 -157
  1806. package/dist/src/backend/services/ratchet/service/bridges.d.ts.map +0 -1
  1807. package/dist/src/backend/services/ratchet/service/bridges.js +0 -2
  1808. package/dist/src/backend/services/ratchet/service/bridges.js.map +0 -1
  1809. package/dist/src/backend/services/ratchet/service/fixer-session.service.d.ts +0 -61
  1810. package/dist/src/backend/services/ratchet/service/fixer-session.service.d.ts.map +0 -1
  1811. package/dist/src/backend/services/ratchet/service/fixer-session.service.js +0 -234
  1812. package/dist/src/backend/services/ratchet/service/fixer-session.service.js.map +0 -1
  1813. package/dist/src/backend/services/ratchet/service/fixer-session.service.test.d.ts +0 -2
  1814. package/dist/src/backend/services/ratchet/service/fixer-session.service.test.d.ts.map +0 -1
  1815. package/dist/src/backend/services/ratchet/service/fixer-session.service.test.js +0 -336
  1816. package/dist/src/backend/services/ratchet/service/fixer-session.service.test.js.map +0 -1
  1817. package/dist/src/backend/services/ratchet/service/provider-selection.d.ts +0 -6
  1818. package/dist/src/backend/services/ratchet/service/provider-selection.d.ts.map +0 -1
  1819. package/dist/src/backend/services/ratchet/service/provider-selection.js +0 -6
  1820. package/dist/src/backend/services/ratchet/service/provider-selection.js.map +0 -1
  1821. package/dist/src/backend/services/ratchet/service/provider-selection.test.d.ts +0 -2
  1822. package/dist/src/backend/services/ratchet/service/provider-selection.test.d.ts.map +0 -1
  1823. package/dist/src/backend/services/ratchet/service/provider-selection.test.js +0 -23
  1824. package/dist/src/backend/services/ratchet/service/provider-selection.test.js.map +0 -1
  1825. package/dist/src/backend/services/ratchet/service/ratchet-active-session.helpers.d.ts +0 -13
  1826. package/dist/src/backend/services/ratchet/service/ratchet-active-session.helpers.d.ts.map +0 -1
  1827. package/dist/src/backend/services/ratchet/service/ratchet-active-session.helpers.js +0 -134
  1828. package/dist/src/backend/services/ratchet/service/ratchet-active-session.helpers.js.map +0 -1
  1829. package/dist/src/backend/services/ratchet/service/ratchet-decision-logging.helpers.d.ts +0 -61
  1830. package/dist/src/backend/services/ratchet/service/ratchet-decision-logging.helpers.d.ts.map +0 -1
  1831. package/dist/src/backend/services/ratchet/service/ratchet-decision-logging.helpers.js +0 -79
  1832. package/dist/src/backend/services/ratchet/service/ratchet-decision-logging.helpers.js.map +0 -1
  1833. package/dist/src/backend/services/ratchet/service/ratchet-domain-exports.test.d.ts +0 -2
  1834. package/dist/src/backend/services/ratchet/service/ratchet-domain-exports.test.d.ts.map +0 -1
  1835. package/dist/src/backend/services/ratchet/service/ratchet-domain-exports.test.js +0 -11
  1836. package/dist/src/backend/services/ratchet/service/ratchet-domain-exports.test.js.map +0 -1
  1837. package/dist/src/backend/services/ratchet/service/ratchet-fixer-dispatch.helpers.d.ts +0 -14
  1838. package/dist/src/backend/services/ratchet/service/ratchet-fixer-dispatch.helpers.d.ts.map +0 -1
  1839. package/dist/src/backend/services/ratchet/service/ratchet-fixer-dispatch.helpers.js +0 -226
  1840. package/dist/src/backend/services/ratchet/service/ratchet-fixer-dispatch.helpers.js.map +0 -1
  1841. package/dist/src/backend/services/ratchet/service/ratchet-pr-state.helpers.d.ts +0 -103
  1842. package/dist/src/backend/services/ratchet/service/ratchet-pr-state.helpers.d.ts.map +0 -1
  1843. package/dist/src/backend/services/ratchet/service/ratchet-pr-state.helpers.js +0 -370
  1844. package/dist/src/backend/services/ratchet/service/ratchet-pr-state.helpers.js.map +0 -1
  1845. package/dist/src/backend/services/ratchet/service/ratchet-pr-state.helpers.test.d.ts +0 -2
  1846. package/dist/src/backend/services/ratchet/service/ratchet-pr-state.helpers.test.d.ts.map +0 -1
  1847. package/dist/src/backend/services/ratchet/service/ratchet-pr-state.helpers.test.js +0 -944
  1848. package/dist/src/backend/services/ratchet/service/ratchet-pr-state.helpers.test.js.map +0 -1
  1849. package/dist/src/backend/services/ratchet/service/ratchet-provider-resolver.service.d.ts +0 -15
  1850. package/dist/src/backend/services/ratchet/service/ratchet-provider-resolver.service.d.ts.map +0 -1
  1851. package/dist/src/backend/services/ratchet/service/ratchet-provider-resolver.service.js +0 -18
  1852. package/dist/src/backend/services/ratchet/service/ratchet-provider-resolver.service.js.map +0 -1
  1853. package/dist/src/backend/services/ratchet/service/ratchet-provider-resolver.service.test.d.ts +0 -2
  1854. package/dist/src/backend/services/ratchet/service/ratchet-provider-resolver.service.test.d.ts.map +0 -1
  1855. package/dist/src/backend/services/ratchet/service/ratchet-provider-resolver.service.test.js +0 -76
  1856. package/dist/src/backend/services/ratchet/service/ratchet-provider-resolver.service.test.js.map +0 -1
  1857. package/dist/src/backend/services/ratchet/service/ratchet-workspace-check-coordinator.d.ts +0 -10
  1858. package/dist/src/backend/services/ratchet/service/ratchet-workspace-check-coordinator.d.ts.map +0 -1
  1859. package/dist/src/backend/services/ratchet/service/ratchet-workspace-check-coordinator.js +0 -62
  1860. package/dist/src/backend/services/ratchet/service/ratchet-workspace-check-coordinator.js.map +0 -1
  1861. package/dist/src/backend/services/ratchet/service/ratchet-workspace-check-coordinator.test.d.ts +0 -2
  1862. package/dist/src/backend/services/ratchet/service/ratchet-workspace-check-coordinator.test.d.ts.map +0 -1
  1863. package/dist/src/backend/services/ratchet/service/ratchet-workspace-check-coordinator.test.js +0 -116
  1864. package/dist/src/backend/services/ratchet/service/ratchet-workspace-check-coordinator.test.js.map +0 -1
  1865. package/dist/src/backend/services/ratchet/service/ratchet.service.test.d.ts +0 -2
  1866. package/dist/src/backend/services/ratchet/service/ratchet.service.test.d.ts.map +0 -1
  1867. package/dist/src/backend/services/ratchet/service/ratchet.service.test.js +0 -3485
  1868. package/dist/src/backend/services/ratchet/service/ratchet.service.test.js.map +0 -1
  1869. package/dist/src/backend/services/ratchet/service/ratchet.types.d.ts +0 -99
  1870. package/dist/src/backend/services/ratchet/service/ratchet.types.d.ts.map +0 -1
  1871. package/dist/src/backend/services/ratchet/service/ratchet.types.js +0 -2
  1872. package/dist/src/backend/services/ratchet/service/ratchet.types.js.map +0 -1
  1873. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/acp-adapter-utils.d.ts +0 -24
  1874. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/acp-adapter-utils.d.ts.map +0 -1
  1875. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/acp-adapter-utils.js +0 -79
  1876. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/acp-adapter-utils.js.map +0 -1
  1877. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/adapter-state.d.ts +0 -99
  1878. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/adapter-state.d.ts.map +0 -1
  1879. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/adapter-state.js +0 -2
  1880. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/adapter-state.js.map +0 -1
  1881. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-adapter-parsing.d.ts +0 -10
  1882. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-adapter-parsing.d.ts.map +0 -1
  1883. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-adapter-parsing.js +0 -166
  1884. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-adapter-parsing.js.map +0 -1
  1885. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-adapter-parsing.test.d.ts +0 -2
  1886. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-adapter-parsing.test.d.ts.map +0 -1
  1887. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-adapter-parsing.test.js +0 -8
  1888. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-adapter-parsing.test.js.map +0 -1
  1889. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +0 -74
  1890. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +0 -1
  1891. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +0 -734
  1892. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +0 -1
  1893. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.d.ts +0 -2
  1894. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.d.ts.map +0 -1
  1895. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js +0 -261
  1896. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js.map +0 -1
  1897. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.d.ts +0 -2
  1898. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.d.ts.map +0 -1
  1899. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.js +0 -353
  1900. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.notification-ordering.test.js.map +0 -1
  1901. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.d.ts +0 -2
  1902. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.d.ts.map +0 -1
  1903. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +0 -2533
  1904. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +0 -1
  1905. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-model-catalog-loader.d.ts +0 -6
  1906. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-model-catalog-loader.d.ts.map +0 -1
  1907. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-model-catalog-loader.js +0 -27
  1908. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-model-catalog-loader.js.map +0 -1
  1909. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.d.ts +0 -7
  1910. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.d.ts.map +0 -1
  1911. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.js +0 -96
  1912. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.js.map +0 -1
  1913. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.d.ts +0 -2
  1914. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.d.ts.map +0 -1
  1915. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.js +0 -148
  1916. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.test.js.map +0 -1
  1917. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-rpc-client.d.ts +0 -70
  1918. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-rpc-client.d.ts.map +0 -1
  1919. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-rpc-client.js +0 -303
  1920. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-rpc-client.js.map +0 -1
  1921. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-rpc-client.test.d.ts +0 -2
  1922. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-rpc-client.test.d.ts.map +0 -1
  1923. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-rpc-client.test.js +0 -243
  1924. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-rpc-client.test.js.map +0 -1
  1925. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-schema-snapshot.test.d.ts +0 -2
  1926. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-schema-snapshot.test.d.ts.map +0 -1
  1927. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-schema-snapshot.test.js +0 -35
  1928. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-schema-snapshot.test.js.map +0 -1
  1929. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.d.ts +0 -38
  1930. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.d.ts.map +0 -1
  1931. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.js +0 -287
  1932. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.js.map +0 -1
  1933. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.d.ts +0 -2
  1934. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.d.ts.map +0 -1
  1935. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.js +0 -648
  1936. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.js.map +0 -1
  1937. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.d.ts +0 -12
  1938. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.d.ts.map +0 -1
  1939. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.js +0 -51
  1940. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.js.map +0 -1
  1941. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.d.ts +0 -2
  1942. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.d.ts.map +0 -1
  1943. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.js +0 -95
  1944. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.js.map +0 -1
  1945. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.d.ts +0 -541
  1946. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.d.ts.map +0 -1
  1947. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.js +0 -438
  1948. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.js.map +0 -1
  1949. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.d.ts +0 -2
  1950. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.d.ts.map +0 -1
  1951. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.js +0 -310
  1952. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.js.map +0 -1
  1953. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/command-metadata.d.ts +0 -16
  1954. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/command-metadata.d.ts.map +0 -1
  1955. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/command-metadata.js +0 -393
  1956. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/command-metadata.js.map +0 -1
  1957. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/command-metadata.test.d.ts +0 -2
  1958. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/command-metadata.test.d.ts.map +0 -1
  1959. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/command-metadata.test.js +0 -198
  1960. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/command-metadata.test.js.map +0 -1
  1961. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/index.d.ts +0 -3
  1962. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/index.d.ts.map +0 -1
  1963. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/index.js +0 -3
  1964. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/index.js.map +0 -1
  1965. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/plan-approval-handler.d.ts +0 -23
  1966. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/plan-approval-handler.d.ts.map +0 -1
  1967. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/plan-approval-handler.js +0 -191
  1968. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/plan-approval-handler.js.map +0 -1
  1969. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/protocol-permission-handler.d.ts +0 -19
  1970. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/protocol-permission-handler.d.ts.map +0 -1
  1971. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/protocol-permission-handler.js +0 -369
  1972. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/protocol-permission-handler.js.map +0 -1
  1973. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/protocol-permission-handler.test.d.ts +0 -2
  1974. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/protocol-permission-handler.test.d.ts.map +0 -1
  1975. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/protocol-permission-handler.test.js +0 -91
  1976. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/protocol-permission-handler.test.js.map +0 -1
  1977. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/retry-logic.d.ts +0 -16
  1978. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/retry-logic.d.ts.map +0 -1
  1979. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/retry-logic.js +0 -51
  1980. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/retry-logic.js.map +0 -1
  1981. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/retry-logic.test.d.ts +0 -2
  1982. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/retry-logic.test.d.ts.map +0 -1
  1983. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/retry-logic.test.js +0 -31
  1984. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/retry-logic.test.js.map +0 -1
  1985. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-config-resolver.d.ts +0 -20
  1986. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-config-resolver.d.ts.map +0 -1
  1987. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-config-resolver.js +0 -350
  1988. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-config-resolver.js.map +0 -1
  1989. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-config-resolver.test.d.ts +0 -2
  1990. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-config-resolver.test.d.ts.map +0 -1
  1991. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-config-resolver.test.js +0 -211
  1992. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-config-resolver.test.js.map +0 -1
  1993. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-negotiation.d.ts +0 -41
  1994. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-negotiation.d.ts.map +0 -1
  1995. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-negotiation.js +0 -137
  1996. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-negotiation.js.map +0 -1
  1997. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-state-container.d.ts +0 -25
  1998. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-state-container.d.ts.map +0 -1
  1999. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-state-container.js +0 -47
  2000. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/session-state-container.js.map +0 -1
  2001. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/shape-drift-reporter.d.ts +0 -8
  2002. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/shape-drift-reporter.d.ts.map +0 -1
  2003. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/shape-drift-reporter.js +0 -37
  2004. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/shape-drift-reporter.js.map +0 -1
  2005. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.cancellation.test.d.ts +0 -2
  2006. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.cancellation.test.d.ts.map +0 -1
  2007. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.cancellation.test.js +0 -181
  2008. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.cancellation.test.js.map +0 -1
  2009. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.d.ts +0 -75
  2010. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.d.ts.map +0 -1
  2011. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.js +0 -677
  2012. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.js.map +0 -1
  2013. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.d.ts +0 -2
  2014. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.d.ts.map +0 -1
  2015. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.js +0 -882
  2016. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.js.map +0 -1
  2017. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.d.ts +0 -8
  2018. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.d.ts.map +0 -1
  2019. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.js +0 -9
  2020. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/task-status-protocol.js.map +0 -1
  2021. package/dist/src/backend/services/session/service/acp/codex-cli-import-resolution.integration.test.d.ts +0 -2
  2022. package/dist/src/backend/services/session/service/acp/codex-cli-import-resolution.integration.test.d.ts.map +0 -1
  2023. package/dist/src/backend/services/session/service/acp/codex-cli-import-resolution.integration.test.js +0 -106
  2024. package/dist/src/backend/services/session/service/acp/codex-cli-import-resolution.integration.test.js.map +0 -1
  2025. package/dist/src/backend/services/workspace/service/lifecycle/workspace-ratchet.service.d.ts +0 -20
  2026. package/dist/src/backend/services/workspace/service/lifecycle/workspace-ratchet.service.d.ts.map +0 -1
  2027. package/dist/src/backend/services/workspace/service/lifecycle/workspace-ratchet.service.js +0 -35
  2028. package/dist/src/backend/services/workspace/service/lifecycle/workspace-ratchet.service.js.map +0 -1
  2029. package/prompts/ratchet/dispatch.md +0 -19
@@ -1,3485 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { SERVICE_THRESHOLDS, SERVICE_TIMEOUT_MS } from '../../constants.js';
3
- import { CIStatus, RatchetState, SessionStatus } from '../../../../shared/core/index.js';
4
- import { unsafeCoerce } from '../../../../test-utils/unsafe-coerce.js';
5
- vi.mock('@/backend/services/workspace', () => ({
6
- workspaceDataService: {
7
- findById: vi.fn(),
8
- },
9
- workspaceRatchetService: {
10
- findCandidates: vi.fn(),
11
- findCandidateById: vi.fn(),
12
- clearActiveSession: vi.fn(),
13
- enable: vi.fn(),
14
- disable: vi.fn(),
15
- recordCheckIfEnabled: vi.fn(),
16
- recordDispatchIfEnabled: vi.fn(),
17
- adoptActiveSessionIfEnabled: vi.fn(),
18
- recordSessionEnd: vi.fn(),
19
- },
20
- }));
21
- vi.mock('@/backend/services/session', () => ({
22
- sessionDataService: {
23
- findAgentSessionById: vi.fn(),
24
- findAgentSessionsByWorkspaceId: vi.fn(),
25
- },
26
- }));
27
- vi.mock('@/backend/services/settings', () => ({
28
- userSettingsService: {
29
- get: vi.fn(),
30
- getDefaultSessionProvider: vi.fn(),
31
- },
32
- }));
33
- vi.mock('./fixer-session.service', () => ({
34
- fixerSessionService: {
35
- acquireAndDispatch: vi.fn(),
36
- },
37
- }));
38
- vi.mock('@/backend/services/logger.service', () => ({
39
- createLogger: () => ({
40
- debug: vi.fn(),
41
- info: vi.fn(),
42
- warn: vi.fn(),
43
- error: vi.fn(),
44
- }),
45
- }));
46
- import { userSettingsService } from '../../settings/index.js';
47
- import { workspaceDataService, workspaceRatchetService } from '../../workspace/index.js';
48
- import { fixerSessionService } from './fixer-session.service.js';
49
- import { RATCHET_DISPATCH_CHANGED, RATCHET_STATE_CHANGED, RATCHET_TOGGLED, ratchetService, } from './ratchet.service.js';
50
- import { buildRatchetingLogContext } from './ratchet-decision-logging.helpers.js';
51
- import { computeDispatchSnapshotKey, computeLatestReviewActivityAtMs, determineRatchetState, } from './ratchet-pr-state.helpers.js';
52
- const mockSessionBridge = {
53
- findSessionById: vi.fn(),
54
- findSessionsByWorkspaceId: vi.fn(),
55
- acquireFixerSession: vi.fn(),
56
- isSessionRunning: vi.fn(),
57
- isSessionWorking: vi.fn(),
58
- stopSession: vi.fn(),
59
- startSession: vi.fn(),
60
- restartSession: vi.fn(),
61
- sendSessionMessage: vi.fn(),
62
- injectCommittedUserMessage: vi.fn(),
63
- };
64
- const mockWorkspaceBridge = {
65
- findFixerContext: vi.fn(),
66
- recordSessionEnd: vi.fn(),
67
- markDispatchStalled: vi.fn().mockResolvedValue(true),
68
- };
69
- const fakeCoordinator = { cooldownActive: false, inFlightSkips: 0 };
70
- const mockGitHubBridge = {
71
- extractPRInfo: vi.fn(),
72
- getPRFullDetails: vi.fn(),
73
- getReviewComments: vi.fn(),
74
- getResolvedReviewCommentIds: vi.fn(),
75
- computeCIStatus: vi.fn(),
76
- computePRState: vi.fn(() => 'OPEN'),
77
- getAuthenticatedUsername: vi.fn(),
78
- fetchAndComputePRState: vi.fn(),
79
- coordinatePrFetch: vi.fn(async (_workspaceId, fetch, options) => {
80
- if (fakeCoordinator.inFlightSkips > 0) {
81
- fakeCoordinator.inFlightSkips -= 1;
82
- return { status: 'skipped', reason: 'recently_fetched' };
83
- }
84
- if (fakeCoordinator.cooldownActive && !options?.ignoreCooldown) {
85
- return { status: 'skipped', reason: 'recently_fetched' };
86
- }
87
- return { status: 'fetched', value: await fetch() };
88
- }),
89
- };
90
- const mockSnapshotBridge = {
91
- recordPrObservation: vi.fn(),
92
- recordCINotification: vi.fn(),
93
- recordReviewCheck: vi.fn(),
94
- };
95
- function setRatchetShuttingDown(shuttingDown) {
96
- const controller = new AbortController();
97
- if (shuttingDown) {
98
- controller.abort();
99
- }
100
- const internals = unsafeCoerce(ratchetService);
101
- internals.runSignal = controller.signal;
102
- internals.stopped = shuttingDown;
103
- }
104
- describe('ratchet service (state-change + idle dispatch)', () => {
105
- beforeEach(() => {
106
- vi.clearAllMocks();
107
- fakeCoordinator.cooldownActive = false;
108
- fakeCoordinator.inFlightSkips = 0;
109
- setRatchetShuttingDown(false);
110
- unsafeCoerce(ratchetService).workspaceCheckTimeoutMs =
111
- SERVICE_TIMEOUT_MS.ratchetWorkspaceCheck;
112
- ratchetService.configure({
113
- session: mockSessionBridge,
114
- github: mockGitHubBridge,
115
- snapshot: mockSnapshotBridge,
116
- workspace: mockWorkspaceBridge,
117
- });
118
- vi.mocked(workspaceRatchetService.recordCheckIfEnabled).mockResolvedValue(true);
119
- vi.mocked(workspaceRatchetService.recordDispatchIfEnabled).mockResolvedValue(true);
120
- vi.mocked(workspaceRatchetService.adoptActiveSessionIfEnabled).mockResolvedValue(true);
121
- vi.mocked(workspaceRatchetService.recordSessionEnd).mockResolvedValue(true);
122
- vi.mocked(mockWorkspaceBridge.recordSessionEnd).mockResolvedValue(true);
123
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
124
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
125
- vi.mocked(mockGitHubBridge.getAuthenticatedUsername).mockResolvedValue(null);
126
- vi.mocked(mockGitHubBridge.getResolvedReviewCommentIds).mockResolvedValue(new Set());
127
- vi.mocked(mockSessionBridge.isSessionWorking).mockReturnValue(false);
128
- vi.mocked(userSettingsService.get).mockResolvedValue({
129
- id: 'settings-1',
130
- userId: 'default',
131
- preferredIde: 'cursor',
132
- customIdeCommand: null,
133
- playSoundOnComplete: true,
134
- notificationSoundPath: null,
135
- workspaceOrder: null,
136
- cachedSlashCommands: null,
137
- ratchetEnabled: false,
138
- ratchetReplyToPrComments: true,
139
- ratchetReviewTriggerMode: 'CHANGES_REQUESTED',
140
- defaultSessionProvider: 'CLAUDE',
141
- defaultClaudeModel: 'sonnet',
142
- defaultCodexModel: 'default',
143
- defaultClaudeReasoningEffort: null,
144
- defaultCodexReasoningEffort: null,
145
- defaultWorkspacePermissions: 'STRICT',
146
- ratchetPermissions: 'YOLO',
147
- voiceModeEnabled: false,
148
- deepgramApiKeyEncrypted: null,
149
- voiceTtsModel: 'flux-haley-en',
150
- voiceTtsSpeed: 1,
151
- voiceUtteranceEndMs: 1000,
152
- voiceBargeInSustainedMs: 16,
153
- createdAt: new Date('2026-01-01T00:00:00.000Z'),
154
- updatedAt: new Date('2026-01-01T00:00:00.000Z'),
155
- });
156
- vi.mocked(userSettingsService.getDefaultSessionProvider).mockResolvedValue('CLAUDE');
157
- });
158
- it('records session completion through the configured workspace bridge', async () => {
159
- await ratchetService.recordSessionEnd('workspace-1', 'session-1', 'COMPLETED');
160
- expect(mockWorkspaceBridge.recordSessionEnd).toHaveBeenCalledWith('workspace-1', 'session-1', 'COMPLETED');
161
- expect(workspaceRatchetService.recordSessionEnd).not.toHaveBeenCalled();
162
- });
163
- afterEach(() => {
164
- ratchetService.removeAllListeners();
165
- });
166
- it('checks workspaces and processes each', async () => {
167
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue([
168
- {
169
- id: 'ws-1',
170
- prUrl: 'https://github.com/example/repo/pull/1',
171
- prNumber: 1,
172
- prState: 'OPEN',
173
- prReviewState: null,
174
- prHasMergeConflict: false,
175
- prCiStatus: CIStatus.UNKNOWN,
176
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
177
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
178
- ratchetEnabled: true,
179
- ratchetState: RatchetState.IDLE,
180
- ratchetLastCheckedAt: null,
181
- ratchetActiveSessionId: null,
182
- ratchetDispatchSnapshotKey: null,
183
- prReviewLastCheckedAt: null,
184
- ratchetDispatchOutcome: null,
185
- ratchetDispatchRetryCount: 0,
186
- ratchetDispatchStalled: false,
187
- },
188
- ]);
189
- vi.spyOn(unsafeCoerce(ratchetService), 'processWorkspace').mockResolvedValue({
190
- workspaceId: 'ws-1',
191
- previousState: RatchetState.IDLE,
192
- newState: RatchetState.IDLE,
193
- action: { type: 'WAITING', reason: 'noop' },
194
- });
195
- const result = await ratchetService.checkAllWorkspaces();
196
- expect(result.checked).toBe(1);
197
- });
198
- it('does not dispatch when workspace ratcheting is disabled', async () => {
199
- const workspace = {
200
- id: 'ws-disabled',
201
- prUrl: 'https://github.com/example/repo/pull/2',
202
- prNumber: 2,
203
- prState: 'OPEN',
204
- prReviewState: null,
205
- prHasMergeConflict: false,
206
- prCiStatus: CIStatus.UNKNOWN,
207
- ratchetEnabled: false,
208
- ratchetState: RatchetState.IDLE,
209
- ratchetActiveSessionId: null,
210
- ratchetDispatchSnapshotKey: null,
211
- prReviewLastCheckedAt: null,
212
- ratchetDispatchOutcome: null,
213
- ratchetDispatchRetryCount: 0,
214
- };
215
- const fetchPRStateSpy = vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState');
216
- const triggerSpy = vi.spyOn(unsafeCoerce(ratchetService), 'triggerFixer');
217
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
218
- expect(fetchPRStateSpy).not.toHaveBeenCalled();
219
- expect(triggerSpy).not.toHaveBeenCalled();
220
- expect(result).toMatchObject({
221
- action: { type: 'DISABLED', reason: 'Workspace ratcheting disabled' },
222
- newState: RatchetState.IDLE,
223
- });
224
- expect(workspaceRatchetService.recordCheckIfEnabled).not.toHaveBeenCalled();
225
- });
226
- it('reports a disabled workspace as IDLE without writing anything', async () => {
227
- const workspace = {
228
- id: 'ws-disabled-settle',
229
- prUrl: 'https://github.com/example/repo/pull/2',
230
- prNumber: 2,
231
- prState: 'OPEN',
232
- prReviewState: null,
233
- prHasMergeConflict: false,
234
- prCiStatus: CIStatus.UNKNOWN,
235
- ratchetEnabled: false,
236
- ratchetState: RatchetState.IDLE,
237
- ratchetActiveSessionId: null,
238
- ratchetDispatchSnapshotKey: null,
239
- prReviewLastCheckedAt: null,
240
- ratchetDispatchOutcome: null,
241
- ratchetDispatchRetryCount: 0,
242
- };
243
- const events = [];
244
- ratchetService.on(RATCHET_STATE_CHANGED, (event) => {
245
- events.push(event);
246
- });
247
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
248
- expect(result).toMatchObject({
249
- previousState: RatchetState.IDLE,
250
- newState: RatchetState.IDLE,
251
- action: { type: 'DISABLED' },
252
- });
253
- expect(events).toEqual([]);
254
- expect(workspaceRatchetService.recordCheckIfEnabled).not.toHaveBeenCalled();
255
- });
256
- it('does not dispatch when workspace is not idle', async () => {
257
- const workspace = {
258
- id: 'ws-busy',
259
- prUrl: 'https://github.com/example/repo/pull/3',
260
- prNumber: 3,
261
- prState: 'OPEN',
262
- prReviewState: null,
263
- prHasMergeConflict: false,
264
- prCiStatus: CIStatus.UNKNOWN,
265
- ratchetEnabled: true,
266
- ratchetState: RatchetState.IDLE,
267
- ratchetActiveSessionId: null,
268
- ratchetDispatchSnapshotKey: null,
269
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
270
- ratchetDispatchOutcome: null,
271
- ratchetDispatchRetryCount: 0,
272
- };
273
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
274
- ciStatus: CIStatus.SUCCESS,
275
- snapshotKey: '2026-01-02T00:00:00Z',
276
- hasChangesRequested: false,
277
- latestReviewActivityAtMs: new Date('2026-01-02T00:00:00Z').getTime(),
278
- statusCheckRollup: null,
279
- prState: 'OPEN',
280
- prNumber: 3,
281
- reviewComments: [
282
- {
283
- author: 'reviewer',
284
- body: 'Please update this',
285
- path: 'src/test.ts',
286
- line: 3,
287
- url: 'https://github.com/example/repo/pull/3#discussion_r1',
288
- },
289
- ],
290
- });
291
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([
292
- {
293
- id: 'chat-1',
294
- workflow: 'default-followup',
295
- status: 'RUNNING',
296
- },
297
- ]);
298
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
299
- vi.mocked(mockSessionBridge.isSessionWorking).mockReturnValue(true);
300
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
301
- expect(result).toMatchObject({
302
- action: {
303
- type: 'WAITING',
304
- reason: 'Workspace has another working session',
305
- },
306
- });
307
- });
308
- it('dispatches when PR state changed since last ratchet', async () => {
309
- const workspace = {
310
- id: 'ws-change',
311
- prUrl: 'https://github.com/example/repo/pull/4',
312
- prNumber: 4,
313
- prState: 'OPEN',
314
- prReviewState: null,
315
- prHasMergeConflict: false,
316
- prCiStatus: CIStatus.UNKNOWN,
317
- ratchetEnabled: true,
318
- ratchetState: RatchetState.IDLE,
319
- ratchetActiveSessionId: null,
320
- ratchetDispatchSnapshotKey: '2026-01-01T00:00:00Z',
321
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
322
- ratchetDispatchOutcome: null,
323
- ratchetDispatchRetryCount: 0,
324
- };
325
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
326
- ciStatus: CIStatus.FAILURE,
327
- snapshotKey: '2026-01-02T00:00:00Z',
328
- hasChangesRequested: false,
329
- latestReviewActivityAtMs: null,
330
- statusCheckRollup: null,
331
- prState: 'OPEN',
332
- prNumber: 4,
333
- });
334
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
335
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
336
- status: 'started',
337
- sessionId: 'ratchet-session',
338
- promptSent: true,
339
- });
340
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
341
- expect(result).toMatchObject({
342
- action: { type: 'TRIGGERED_FIXER' },
343
- });
344
- expect(workspaceRatchetService.recordDispatchIfEnabled).toHaveBeenCalledWith('ws-change', {
345
- sessionId: 'ratchet-session',
346
- snapshotKey: '2026-01-02T00:00:00Z',
347
- retryCount: 0,
348
- });
349
- expect(workspaceRatchetService.recordCheckIfEnabled).toHaveBeenLastCalledWith('ws-change', expect.any(Date));
350
- expect(mockSnapshotBridge.recordReviewCheck).toHaveBeenCalledWith('ws-change', expect.any(Date));
351
- });
352
- it('stops fixer and returns disabled when active-session recording loses disable race', async () => {
353
- const workspace = {
354
- id: 'ws-disable-race-dispatch',
355
- prUrl: 'https://github.com/example/repo/pull/40',
356
- prNumber: 40,
357
- prState: 'OPEN',
358
- prReviewState: null,
359
- prHasMergeConflict: false,
360
- prCiStatus: CIStatus.UNKNOWN,
361
- ratchetEnabled: true,
362
- ratchetState: RatchetState.IDLE,
363
- ratchetActiveSessionId: null,
364
- ratchetDispatchSnapshotKey: 'old-snapshot',
365
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
366
- ratchetDispatchOutcome: null,
367
- ratchetDispatchRetryCount: 0,
368
- };
369
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
370
- ciStatus: CIStatus.FAILURE,
371
- snapshotKey: 'new-snapshot',
372
- hasChangesRequested: false,
373
- latestReviewActivityAtMs: null,
374
- statusCheckRollup: null,
375
- prState: 'OPEN',
376
- prNumber: 40,
377
- });
378
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
379
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
380
- status: 'started',
381
- sessionId: 'raced-session',
382
- promptSent: true,
383
- });
384
- vi.mocked(workspaceRatchetService.recordDispatchIfEnabled).mockResolvedValue(false);
385
- vi.mocked(workspaceRatchetService.recordCheckIfEnabled).mockResolvedValue(false);
386
- vi.mocked(workspaceDataService.findById).mockResolvedValue({
387
- id: 'ws-disable-race-dispatch',
388
- ratchetEnabled: false,
389
- });
390
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
391
- const events = [];
392
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
393
- events.push(event);
394
- });
395
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
396
- expect(result).toMatchObject({
397
- newState: RatchetState.IDLE,
398
- action: { type: 'DISABLED', reason: 'Workspace ratcheting disabled' },
399
- });
400
- expect(workspaceRatchetService.recordDispatchIfEnabled).toHaveBeenCalledWith('ws-disable-race-dispatch', { sessionId: 'raced-session', snapshotKey: 'new-snapshot', retryCount: 0 });
401
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('raced-session');
402
- expect(mockSnapshotBridge.recordReviewCheck).not.toHaveBeenCalled();
403
- expect(events).toHaveLength(0);
404
- });
405
- it('dispatches when session is running but idle', async () => {
406
- const workspace = {
407
- id: 'ws-idle-session',
408
- prUrl: 'https://github.com/example/repo/pull/44',
409
- prNumber: 44,
410
- prState: 'OPEN',
411
- prReviewState: null,
412
- prHasMergeConflict: false,
413
- prCiStatus: CIStatus.UNKNOWN,
414
- ratchetEnabled: true,
415
- ratchetState: RatchetState.IDLE,
416
- ratchetActiveSessionId: null,
417
- ratchetDispatchSnapshotKey: '2026-01-01T00:00:00Z',
418
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
419
- ratchetDispatchOutcome: null,
420
- ratchetDispatchRetryCount: 0,
421
- };
422
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
423
- ciStatus: CIStatus.FAILURE,
424
- snapshotKey: '2026-01-02T00:00:00Z',
425
- hasChangesRequested: false,
426
- latestReviewActivityAtMs: null,
427
- statusCheckRollup: null,
428
- prState: 'OPEN',
429
- prNumber: 44,
430
- });
431
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([
432
- {
433
- id: 'chat-idle-1',
434
- workflow: 'default-followup',
435
- status: 'RUNNING',
436
- },
437
- ]);
438
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
439
- vi.mocked(mockSessionBridge.isSessionWorking).mockReturnValue(false);
440
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
441
- status: 'started',
442
- sessionId: 'ratchet-session',
443
- promptSent: true,
444
- });
445
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
446
- expect(result).toMatchObject({
447
- action: { type: 'TRIGGERED_FIXER' },
448
- });
449
- expect(mockSessionBridge.isSessionWorking).toHaveBeenCalledWith('chat-idle-1');
450
- expect(fixerSessionService.acquireAndDispatch).toHaveBeenCalled();
451
- });
452
- it('does not dispatch when PR state unchanged since last dispatch', async () => {
453
- const workspace = {
454
- id: 'ws-unchanged',
455
- prUrl: 'https://github.com/example/repo/pull/5',
456
- prNumber: 5,
457
- prState: 'OPEN',
458
- prReviewState: null,
459
- prHasMergeConflict: false,
460
- prCiStatus: CIStatus.UNKNOWN,
461
- ratchetEnabled: true,
462
- ratchetState: RatchetState.READY,
463
- ratchetActiveSessionId: null,
464
- ratchetDispatchSnapshotKey: '2026-01-02T00:00:00Z',
465
- prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
466
- ratchetDispatchOutcome: null,
467
- ratchetDispatchRetryCount: 0,
468
- };
469
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
470
- ciStatus: CIStatus.FAILURE,
471
- snapshotKey: '2026-01-02T00:00:00Z',
472
- hasChangesRequested: false,
473
- latestReviewActivityAtMs: null,
474
- statusCheckRollup: null,
475
- prState: 'OPEN',
476
- prNumber: 5,
477
- });
478
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
479
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
480
- expect(result).toMatchObject({
481
- action: {
482
- type: 'WAITING',
483
- reason: 'PR state unchanged since last ratchet dispatch',
484
- },
485
- });
486
- expect(mockSessionBridge.findSessionsByWorkspaceId).not.toHaveBeenCalled();
487
- expect(mockSnapshotBridge.recordReviewCheck).not.toHaveBeenCalled();
488
- });
489
- it('marks the dispatch stalled when a settled dispatch achieved nothing', async () => {
490
- const workspace = {
491
- id: 'ws-1',
492
- prUrl: 'https://github.com/example/repo/pull/5',
493
- prNumber: 5,
494
- prState: 'OPEN',
495
- prReviewState: null,
496
- prHasMergeConflict: false,
497
- prCiStatus: CIStatus.UNKNOWN,
498
- ratchetEnabled: true,
499
- ratchetState: RatchetState.READY,
500
- ratchetActiveSessionId: null,
501
- ratchetDispatchSnapshotKey: '2026-01-02T00:00:00Z',
502
- prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
503
- ratchetDispatchOutcome: 'COMPLETED',
504
- ratchetDispatchRetryCount: 0,
505
- };
506
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
507
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
508
- ciStatus: CIStatus.FAILURE,
509
- snapshotKey: '2026-01-02T00:00:00Z',
510
- hasChangesRequested: false,
511
- latestReviewActivityAtMs: null,
512
- statusCheckRollup: null,
513
- prState: 'OPEN',
514
- prNumber: 5,
515
- });
516
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
517
- await ratchetService.checkWorkspaceById('ws-1');
518
- expect(mockWorkspaceBridge.markDispatchStalled).toHaveBeenCalledWith('ws-1', '2026-01-02T00:00:00Z');
519
- });
520
- it('marks the dispatch stalled when a DIED fixer exhausts its retries', async () => {
521
- const workspace = {
522
- id: 'ws-1',
523
- prUrl: 'https://github.com/example/repo/pull/15',
524
- prNumber: 15,
525
- prState: 'OPEN',
526
- prReviewState: null,
527
- prHasMergeConflict: false,
528
- prCiStatus: CIStatus.FAILURE,
529
- ratchetEnabled: true,
530
- ratchetState: RatchetState.CI_FAILED,
531
- ratchetActiveSessionId: null,
532
- ratchetDispatchSnapshotKey: 'same-snapshot',
533
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
534
- ratchetDispatchOutcome: 'DIED',
535
- ratchetDispatchRetryCount: SERVICE_THRESHOLDS.ratchetDispatchMaxRetries,
536
- };
537
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
538
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
539
- ciStatus: CIStatus.FAILURE,
540
- snapshotKey: 'same-snapshot',
541
- hasChangesRequested: false,
542
- latestReviewActivityAtMs: null,
543
- statusCheckRollup: null,
544
- prState: 'OPEN',
545
- prNumber: 15,
546
- });
547
- await ratchetService.checkWorkspaceById('ws-1');
548
- expect(mockWorkspaceBridge.markDispatchStalled).toHaveBeenCalledWith('ws-1', 'same-snapshot');
549
- });
550
- it('publishes a dispatch-changed event when the stall flag actually flips', async () => {
551
- const workspace = {
552
- id: 'ws-1',
553
- prUrl: 'https://github.com/example/repo/pull/5',
554
- prNumber: 5,
555
- prState: 'OPEN',
556
- prReviewState: null,
557
- prHasMergeConflict: false,
558
- prCiStatus: CIStatus.FAILURE,
559
- ratchetEnabled: true,
560
- ratchetState: RatchetState.CI_FAILED,
561
- ratchetActiveSessionId: null,
562
- ratchetDispatchSnapshotKey: 'stalled-key',
563
- prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
564
- ratchetDispatchOutcome: 'COMPLETED',
565
- ratchetDispatchRetryCount: 0,
566
- };
567
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
568
- vi.mocked(mockWorkspaceBridge.markDispatchStalled).mockResolvedValue(true);
569
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
570
- ciStatus: CIStatus.FAILURE,
571
- snapshotKey: 'stalled-key',
572
- hasChangesRequested: false,
573
- latestReviewActivityAtMs: null,
574
- statusCheckRollup: null,
575
- prState: 'OPEN',
576
- prNumber: 5,
577
- });
578
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
579
- const events = [];
580
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
581
- events.push(event);
582
- });
583
- await ratchetService.checkWorkspaceById('ws-1');
584
- expect(events).toEqual([{ workspaceId: 'ws-1' }]);
585
- });
586
- it('publishes nothing when the stall flag was already set', async () => {
587
- const workspace = {
588
- id: 'ws-1',
589
- prUrl: 'https://github.com/example/repo/pull/5',
590
- prNumber: 5,
591
- prState: 'OPEN',
592
- prReviewState: null,
593
- prHasMergeConflict: false,
594
- prCiStatus: CIStatus.FAILURE,
595
- ratchetEnabled: true,
596
- ratchetState: RatchetState.CI_FAILED,
597
- ratchetActiveSessionId: null,
598
- ratchetDispatchSnapshotKey: 'stalled-key',
599
- prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
600
- ratchetDispatchOutcome: 'COMPLETED',
601
- ratchetDispatchRetryCount: 0,
602
- };
603
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
604
- vi.mocked(mockWorkspaceBridge.markDispatchStalled).mockResolvedValue(false);
605
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
606
- ciStatus: CIStatus.FAILURE,
607
- snapshotKey: 'stalled-key',
608
- hasChangesRequested: false,
609
- latestReviewActivityAtMs: null,
610
- statusCheckRollup: null,
611
- prState: 'OPEN',
612
- prNumber: 5,
613
- });
614
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
615
- const events = [];
616
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
617
- events.push(event);
618
- });
619
- await ratchetService.checkWorkspaceById('ws-1');
620
- expect(events).toEqual([]);
621
- });
622
- it('does not mark the dispatch stalled when the PR state has changed', async () => {
623
- const workspace = {
624
- id: 'ws-1',
625
- prUrl: 'https://github.com/example/repo/pull/5',
626
- prNumber: 5,
627
- prState: 'OPEN',
628
- prReviewState: null,
629
- prHasMergeConflict: false,
630
- prCiStatus: CIStatus.UNKNOWN,
631
- ratchetEnabled: true,
632
- ratchetState: RatchetState.READY,
633
- ratchetActiveSessionId: null,
634
- ratchetDispatchSnapshotKey: 'old-snapshot',
635
- prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
636
- ratchetDispatchOutcome: null,
637
- ratchetDispatchRetryCount: 0,
638
- };
639
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
640
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
641
- ciStatus: CIStatus.FAILURE,
642
- snapshotKey: '2026-01-02T00:00:00Z',
643
- hasChangesRequested: false,
644
- latestReviewActivityAtMs: null,
645
- statusCheckRollup: null,
646
- prState: 'OPEN',
647
- prNumber: 5,
648
- });
649
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
650
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
651
- status: 'started',
652
- sessionId: 'fresh-session',
653
- promptSent: true,
654
- });
655
- await ratchetService.checkWorkspaceById('ws-1');
656
- expect(mockWorkspaceBridge.markDispatchStalled).not.toHaveBeenCalled();
657
- });
658
- it('does not dispatch repeatedly for unchanged CHANGES_REQUESTED state', async () => {
659
- const workspace = {
660
- id: 'ws-review-unchanged',
661
- prUrl: 'https://github.com/example/repo/pull/55',
662
- prNumber: 55,
663
- prState: 'OPEN',
664
- prReviewState: null,
665
- prHasMergeConflict: false,
666
- prCiStatus: CIStatus.UNKNOWN,
667
- ratchetEnabled: true,
668
- ratchetState: RatchetState.REVIEW_PENDING,
669
- ratchetActiveSessionId: null,
670
- ratchetDispatchSnapshotKey: 'ci:SUCCESS|changes-requested:1735776000000',
671
- prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
672
- ratchetDispatchOutcome: null,
673
- ratchetDispatchRetryCount: 0,
674
- };
675
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
676
- ciStatus: CIStatus.SUCCESS,
677
- snapshotKey: 'ci:SUCCESS|changes-requested:1735776000000',
678
- hasChangesRequested: true,
679
- latestReviewActivityAtMs: new Date('2026-01-02T00:00:00Z').getTime(),
680
- statusCheckRollup: null,
681
- prState: 'OPEN',
682
- prNumber: 55,
683
- reviewComments: [
684
- {
685
- author: 'reviewer',
686
- body: 'Please revise this',
687
- path: 'src/example.ts',
688
- line: 9,
689
- url: 'https://github.com/example/repo/pull/55#discussion_r1',
690
- },
691
- ],
692
- });
693
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
694
- const triggerSpy = vi.spyOn(unsafeCoerce(ratchetService), 'triggerFixer');
695
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
696
- expect(triggerSpy).not.toHaveBeenCalled();
697
- expect(result).toMatchObject({
698
- action: {
699
- type: 'WAITING',
700
- reason: 'PR state unchanged since last ratchet dispatch',
701
- },
702
- });
703
- expect(mockSessionBridge.findSessionsByWorkspaceId).not.toHaveBeenCalled();
704
- });
705
- it('dispatches for CHANGES_REQUESTED when there are no PR review comments', async () => {
706
- const workspace = {
707
- id: 'ws-review-no-comments',
708
- prUrl: 'https://github.com/example/repo/pull/56',
709
- prNumber: 56,
710
- prState: 'OPEN',
711
- prReviewState: null,
712
- prHasMergeConflict: false,
713
- prCiStatus: CIStatus.UNKNOWN,
714
- ratchetEnabled: true,
715
- ratchetState: RatchetState.REVIEW_PENDING,
716
- ratchetActiveSessionId: null,
717
- ratchetDispatchSnapshotKey: 'ci:SUCCESS|changes-requested:old',
718
- prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
719
- ratchetDispatchOutcome: null,
720
- ratchetDispatchRetryCount: 0,
721
- };
722
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
723
- ciStatus: CIStatus.SUCCESS,
724
- snapshotKey: 'ci:SUCCESS|changes-requested:new',
725
- hasChangesRequested: true,
726
- latestReviewActivityAtMs: new Date('2026-01-03T00:00:00Z').getTime(),
727
- statusCheckRollup: null,
728
- prState: 'OPEN',
729
- prNumber: 56,
730
- reviewComments: [],
731
- });
732
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
733
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
734
- status: 'started',
735
- sessionId: 'ratchet-session',
736
- promptSent: true,
737
- });
738
- const triggerSpy = vi.spyOn(unsafeCoerce(ratchetService), 'triggerFixer');
739
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
740
- expect(triggerSpy).toHaveBeenCalled();
741
- expect(result).toMatchObject({
742
- action: { type: 'TRIGGERED_FIXER' },
743
- });
744
- });
745
- it('dispatches for PR review summary feedback in all-feedback mode', async () => {
746
- const workspace = {
747
- id: 'ws-review-summary',
748
- prUrl: 'https://github.com/example/repo/pull/57',
749
- prNumber: 57,
750
- prState: 'OPEN',
751
- prReviewState: null,
752
- prHasMergeConflict: false,
753
- prCiStatus: CIStatus.UNKNOWN,
754
- ratchetEnabled: true,
755
- ratchetState: RatchetState.READY,
756
- ratchetActiveSessionId: null,
757
- ratchetDispatchSnapshotKey: 'ci:SUCCESS|no-changes-requested:old|merge:clean',
758
- prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
759
- ratchetDispatchOutcome: null,
760
- ratchetDispatchRetryCount: 0,
761
- };
762
- vi.mocked(userSettingsService.get).mockResolvedValue({
763
- ratchetReviewTriggerMode: 'ALL_REVIEW_FEEDBACK',
764
- ratchetReplyToPrComments: true,
765
- ratchetPermissions: 'YOLO',
766
- });
767
- const fetchPRStateSpy = vi
768
- .spyOn(unsafeCoerce(ratchetService), 'fetchPRState')
769
- .mockResolvedValue({
770
- ciStatus: CIStatus.SUCCESS,
771
- snapshotKey: 'ci:SUCCESS|no-changes-requested:1767315600000|merge:clean',
772
- hasChangesRequested: false,
773
- hasMergeConflict: false,
774
- latestReviewActivityAtMs: new Date('2026-01-02T01:00:00Z').getTime(),
775
- statusCheckRollup: null,
776
- prState: 'OPEN',
777
- prNumber: 57,
778
- reviewComments: [
779
- {
780
- author: 'cubic-dev-ai',
781
- body: 'Please fix the hydration edge case.',
782
- path: 'PR review',
783
- line: null,
784
- url: 'https://github.com/example/repo/pull/57#pullrequestreview-1',
785
- },
786
- ],
787
- });
788
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
789
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
790
- status: 'started',
791
- sessionId: 'ratchet-session',
792
- promptSent: true,
793
- });
794
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
795
- expect(result).toMatchObject({
796
- action: { type: 'TRIGGERED_FIXER' },
797
- newState: RatchetState.READY,
798
- });
799
- expect(fixerSessionService.acquireAndDispatch).toHaveBeenCalled();
800
- expect(fetchPRStateSpy).toHaveBeenCalledWith(workspace, null, expect.objectContaining({ reviewTriggerMode: 'ALL_REVIEW_FEEDBACK' }), expect.any(AbortSignal));
801
- });
802
- it('treats closed PR as IDLE and does not dispatch', () => {
803
- const state = determineRatchetState({
804
- ciStatus: CIStatus.SUCCESS,
805
- snapshotKey: '2026-01-02T00:00:00Z',
806
- hasChangesRequested: false,
807
- latestReviewActivityAtMs: null,
808
- prState: 'CLOSED',
809
- prNumber: 6,
810
- });
811
- expect(state).toBe(RatchetState.IDLE);
812
- });
813
- it('handles prompt delivery failure by clearing active session and stopping runner', async () => {
814
- const workspace = {
815
- id: 'ws-prompt-fail',
816
- prUrl: 'https://github.com/example/repo/pull/7',
817
- prNumber: 7,
818
- prState: 'OPEN',
819
- prReviewState: null,
820
- prHasMergeConflict: false,
821
- prCiStatus: CIStatus.UNKNOWN,
822
- ratchetEnabled: true,
823
- ratchetState: RatchetState.IDLE,
824
- ratchetActiveSessionId: null,
825
- ratchetDispatchSnapshotKey: null,
826
- prReviewLastCheckedAt: null,
827
- ratchetDispatchOutcome: null,
828
- ratchetDispatchRetryCount: 0,
829
- };
830
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
831
- ciStatus: CIStatus.SUCCESS,
832
- snapshotKey: '2026-01-02T00:00:00Z',
833
- hasChangesRequested: true,
834
- latestReviewActivityAtMs: new Date('2026-01-02T00:00:00Z').getTime(),
835
- statusCheckRollup: null,
836
- prState: 'OPEN',
837
- prNumber: 7,
838
- reviewComments: [
839
- {
840
- author: 'reviewer',
841
- body: 'Please fix this',
842
- path: 'src/example.ts',
843
- line: 12,
844
- url: 'https://github.com/example/repo/pull/7#discussion_r1',
845
- },
846
- ],
847
- });
848
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
849
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
850
- status: 'started',
851
- sessionId: 'ratchet-session',
852
- promptSent: false,
853
- });
854
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
855
- vi.mocked(mockSessionBridge.stopSession).mockResolvedValue();
856
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
857
- expect(result).toMatchObject({
858
- action: { type: 'ERROR', error: 'Failed to deliver initial ratchet prompt' },
859
- });
860
- expect(workspaceRatchetService.clearActiveSession).toHaveBeenCalledWith(workspace.id, 'ratchet-session');
861
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('ratchet-session');
862
- });
863
- it('routes an aborted prompt-failure path through orphan cleanup', async () => {
864
- const controller = new AbortController();
865
- const timeoutError = new Error('Workspace check timed out');
866
- let finishPointerClear;
867
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
868
- status: 'started',
869
- sessionId: 'aborted-prompt-session',
870
- promptSent: false,
871
- });
872
- vi.mocked(workspaceRatchetService.clearActiveSession).mockImplementation(() => new Promise((resolve) => {
873
- finishPointerClear = () => resolve({});
874
- }));
875
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
876
- const trigger = unsafeCoerce(ratchetService).triggerFixer({
877
- id: 'ws-aborted-prompt',
878
- prUrl: 'https://github.com/example/repo/pull/7',
879
- }, {
880
- ciStatus: CIStatus.FAILURE,
881
- snapshotKey: 'failed:7',
882
- prNumber: 7,
883
- reviewComments: [],
884
- hasMergeConflict: false,
885
- }, 0, controller.signal);
886
- await vi.waitFor(() => expect(workspaceRatchetService.clearActiveSession).toHaveBeenCalled());
887
- controller.abort(timeoutError);
888
- finishPointerClear();
889
- await expect(trigger).rejects.toBe(timeoutError);
890
- expect(workspaceRatchetService.recordSessionEnd).toHaveBeenCalledWith('ws-aborted-prompt', 'aborted-prompt-session', 'COMPLETED');
891
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('aborted-prompt-session');
892
- });
893
- it('publishes a dispatch invalidation after lifecycle settlement', async () => {
894
- const events = [];
895
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
896
- events.push(event);
897
- });
898
- await ratchetService.recordSessionEnd('ws-1', 'session-1', 'DIED');
899
- expect(events).toContainEqual({ workspaceId: 'ws-1' });
900
- });
901
- it('does not publish a dispatch change when lifecycle settlement loses its CAS', async () => {
902
- const events = [];
903
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
904
- events.push(event);
905
- });
906
- vi.mocked(mockWorkspaceBridge.recordSessionEnd).mockResolvedValue(false);
907
- await ratchetService.recordSessionEnd('ws-1', 'session-1', 'DIED');
908
- expect(events).toHaveLength(0);
909
- });
910
- it('does not dispatch on a clean PR with no new review activity', async () => {
911
- const recentCheck = new Date();
912
- const workspace = {
913
- id: 'ws-clean',
914
- prUrl: 'https://github.com/example/repo/pull/8',
915
- prNumber: 8,
916
- prState: 'OPEN',
917
- prReviewState: null,
918
- prHasMergeConflict: false,
919
- prCiStatus: CIStatus.UNKNOWN,
920
- ratchetEnabled: true,
921
- ratchetState: RatchetState.READY,
922
- ratchetActiveSessionId: null,
923
- ratchetDispatchSnapshotKey: '2026-01-01T00:00:00Z',
924
- prReviewLastCheckedAt: recentCheck,
925
- ratchetDispatchOutcome: null,
926
- ratchetDispatchRetryCount: 0,
927
- };
928
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
929
- ciStatus: CIStatus.SUCCESS,
930
- snapshotKey: '2026-01-03T00:00:00Z',
931
- hasChangesRequested: false,
932
- latestReviewActivityAtMs: recentCheck.getTime() - 1000,
933
- statusCheckRollup: null,
934
- prState: 'OPEN',
935
- prNumber: 8,
936
- });
937
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
938
- const triggerSpy = vi.spyOn(unsafeCoerce(ratchetService), 'triggerFixer');
939
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
940
- expect(triggerSpy).not.toHaveBeenCalled();
941
- expect(result).toMatchObject({
942
- action: {
943
- type: 'WAITING',
944
- reason: 'PR is clean (green CI and no new review activity)',
945
- },
946
- });
947
- });
948
- it('dispatches stale actionable review comments when the PR snapshot changes', async () => {
949
- const recentCheck = new Date();
950
- const workspace = {
951
- id: 'ws-stale-actionable-review',
952
- prUrl: 'https://github.com/example/repo/pull/43',
953
- prNumber: 43,
954
- prState: 'OPEN',
955
- prReviewState: null,
956
- prHasMergeConflict: false,
957
- prCiStatus: CIStatus.FAILURE,
958
- ratchetEnabled: true,
959
- ratchetState: RatchetState.CI_FAILED,
960
- ratchetActiveSessionId: null,
961
- ratchetDispatchSnapshotKey: 'failed-snapshot',
962
- prReviewLastCheckedAt: recentCheck,
963
- ratchetDispatchOutcome: 'COMPLETED',
964
- ratchetDispatchRetryCount: 0,
965
- };
966
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
967
- ciStatus: CIStatus.SUCCESS,
968
- snapshotKey: 'successful-snapshot',
969
- hasChangesRequested: false,
970
- hasMergeConflict: false,
971
- latestReviewActivityAtMs: recentCheck.getTime() - 1000,
972
- statusCheckRollup: null,
973
- prState: 'OPEN',
974
- prNumber: 43,
975
- reviewComments: [
976
- {
977
- author: 'reviewer',
978
- body: 'Please handle this edge case.',
979
- path: 'src/example.ts',
980
- line: 10,
981
- url: 'https://github.com/example/repo/pull/43#discussion_r1',
982
- },
983
- ],
984
- });
985
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
986
- status: 'started',
987
- sessionId: 'ratchet-review-session',
988
- promptSent: true,
989
- });
990
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
991
- expect(result).toMatchObject({
992
- action: { type: 'TRIGGERED_FIXER', sessionId: 'ratchet-review-session' },
993
- });
994
- expect(workspaceRatchetService.recordDispatchIfEnabled).toHaveBeenCalledWith('ws-stale-actionable-review', {
995
- sessionId: 'ratchet-review-session',
996
- snapshotKey: 'successful-snapshot',
997
- retryCount: 0,
998
- });
999
- });
1000
- it('returns disabled when stale check-state update loses disable race', async () => {
1001
- const recentCheck = new Date();
1002
- const workspace = {
1003
- id: 'ws-disable-race-state',
1004
- prUrl: 'https://github.com/example/repo/pull/41',
1005
- prNumber: 41,
1006
- prState: 'OPEN',
1007
- prReviewState: null,
1008
- prHasMergeConflict: false,
1009
- prCiStatus: CIStatus.UNKNOWN,
1010
- ratchetEnabled: true,
1011
- ratchetState: RatchetState.READY,
1012
- ratchetActiveSessionId: null,
1013
- ratchetDispatchSnapshotKey: 'old-snapshot',
1014
- prReviewLastCheckedAt: recentCheck,
1015
- ratchetDispatchOutcome: null,
1016
- ratchetDispatchRetryCount: 0,
1017
- };
1018
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1019
- ciStatus: CIStatus.SUCCESS,
1020
- snapshotKey: 'new-snapshot',
1021
- hasChangesRequested: false,
1022
- latestReviewActivityAtMs: recentCheck.getTime() - 1000,
1023
- statusCheckRollup: null,
1024
- prState: 'OPEN',
1025
- prNumber: 41,
1026
- });
1027
- vi.mocked(workspaceRatchetService.recordCheckIfEnabled).mockResolvedValue(false);
1028
- vi.mocked(workspaceDataService.findById).mockResolvedValue({
1029
- id: 'ws-disable-race-state',
1030
- ratchetEnabled: false,
1031
- });
1032
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
1033
- const events = [];
1034
- ratchetService.on(RATCHET_STATE_CHANGED, (event) => {
1035
- events.push(event);
1036
- });
1037
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1038
- expect(result).toMatchObject({
1039
- newState: RatchetState.IDLE,
1040
- action: { type: 'DISABLED', reason: 'Workspace ratcheting disabled' },
1041
- });
1042
- expect(events).toHaveLength(0);
1043
- ratchetService.removeAllListeners();
1044
- });
1045
- it('persists PR state and review decision the check observed, not just CI', async () => {
1046
- const workspace = {
1047
- id: 'ws-observation',
1048
- prUrl: 'https://github.com/example/repo/pull/44',
1049
- prNumber: 44,
1050
- prState: 'OPEN',
1051
- prReviewState: null,
1052
- prHasMergeConflict: false,
1053
- prCiStatus: CIStatus.SUCCESS,
1054
- ratchetEnabled: true,
1055
- ratchetState: RatchetState.READY,
1056
- ratchetActiveSessionId: null,
1057
- ratchetDispatchSnapshotKey: 'observation-snapshot',
1058
- prReviewLastCheckedAt: null,
1059
- ratchetDispatchOutcome: null,
1060
- ratchetDispatchRetryCount: 0,
1061
- };
1062
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1063
- ciStatus: CIStatus.SUCCESS,
1064
- snapshotKey: 'observation-snapshot',
1065
- hasChangesRequested: true,
1066
- hasMergeConflict: false,
1067
- latestReviewActivityAtMs: null,
1068
- statusCheckRollup: null,
1069
- prState: 'OPEN',
1070
- cachedPrState: 'CHANGES_REQUESTED',
1071
- reviewDecision: 'CHANGES_REQUESTED',
1072
- prNumber: 44,
1073
- reviewComments: [],
1074
- });
1075
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
1076
- await unsafeCoerce(ratchetService).processWorkspace(workspace);
1077
- expect(mockSnapshotBridge.recordPrObservation).toHaveBeenCalledWith(expect.objectContaining({
1078
- workspaceId: 'ws-observation',
1079
- prUrl: 'https://github.com/example/repo/pull/44',
1080
- prState: 'CHANGES_REQUESTED',
1081
- reviewState: 'CHANGES_REQUESTED',
1082
- ciStatus: CIStatus.SUCCESS,
1083
- hasMergeConflict: false,
1084
- }));
1085
- });
1086
- it('stops live ratchet sessions before persisting a merged PR', async () => {
1087
- const workspace = {
1088
- id: 'ws-merged',
1089
- prUrl: 'https://github.com/example/repo/pull/45',
1090
- prNumber: 45,
1091
- prState: 'OPEN',
1092
- prReviewState: null,
1093
- prHasMergeConflict: false,
1094
- prCiStatus: CIStatus.SUCCESS,
1095
- ratchetEnabled: true,
1096
- ratchetState: RatchetState.READY,
1097
- ratchetActiveSessionId: null,
1098
- ratchetDispatchSnapshotKey: 'merged-snapshot',
1099
- prReviewLastCheckedAt: null,
1100
- ratchetDispatchOutcome: null,
1101
- ratchetDispatchRetryCount: 0,
1102
- };
1103
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1104
- ciStatus: CIStatus.SUCCESS,
1105
- snapshotKey: 'merged-snapshot',
1106
- hasChangesRequested: false,
1107
- hasMergeConflict: false,
1108
- latestReviewActivityAtMs: null,
1109
- statusCheckRollup: null,
1110
- prState: 'MERGED',
1111
- cachedPrState: 'MERGED',
1112
- reviewDecision: null,
1113
- prNumber: 45,
1114
- reviewComments: [],
1115
- });
1116
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([
1117
- {
1118
- id: 'ratchet-running',
1119
- workflow: 'ratchet',
1120
- status: SessionStatus.RUNNING,
1121
- },
1122
- {
1123
- id: 'ratchet-idle',
1124
- workflow: 'ratchet',
1125
- status: SessionStatus.IDLE,
1126
- },
1127
- {
1128
- id: 'ratchet-completed',
1129
- workflow: 'ratchet',
1130
- status: SessionStatus.COMPLETED,
1131
- },
1132
- {
1133
- id: 'manual-running',
1134
- workflow: 'default',
1135
- status: SessionStatus.RUNNING,
1136
- },
1137
- ]);
1138
- vi.mocked(mockSessionBridge.isSessionRunning).mockImplementation((sessionId) => ['ratchet-running', 'ratchet-idle', 'manual-running'].includes(sessionId));
1139
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1140
- expect(mockSessionBridge.stopSession).toHaveBeenCalledTimes(2);
1141
- expect(mockSessionBridge.stopSession).toHaveBeenNthCalledWith(1, 'ratchet-running');
1142
- expect(mockSessionBridge.stopSession).toHaveBeenNthCalledWith(2, 'ratchet-idle');
1143
- expect(mockSnapshotBridge.recordPrObservation).toHaveBeenCalledWith(expect.objectContaining({
1144
- workspaceId: 'ws-merged',
1145
- prUrl: 'https://github.com/example/repo/pull/45',
1146
- prState: 'MERGED',
1147
- }));
1148
- expect(vi.mocked(mockSessionBridge.stopSession).mock.invocationCallOrder.at(-1)).toBeLessThan(vi.mocked(mockSnapshotBridge.recordPrObservation).mock.invocationCallOrder[0] ?? 0);
1149
- expect(result).toMatchObject({
1150
- newState: RatchetState.MERGED,
1151
- action: { type: 'COMPLETED' },
1152
- });
1153
- });
1154
- it('does not persist a merged PR when stopping a ratchet session fails', async () => {
1155
- const workspace = {
1156
- id: 'ws-merged-stop-failure',
1157
- prUrl: 'https://github.com/example/repo/pull/46',
1158
- prNumber: 46,
1159
- prState: 'OPEN',
1160
- prReviewState: null,
1161
- prHasMergeConflict: false,
1162
- prCiStatus: CIStatus.SUCCESS,
1163
- ratchetEnabled: true,
1164
- ratchetState: RatchetState.READY,
1165
- ratchetActiveSessionId: 'ratchet-running',
1166
- ratchetDispatchSnapshotKey: 'merged-stop-failure-snapshot',
1167
- prReviewLastCheckedAt: null,
1168
- ratchetDispatchOutcome: 'RUNNING',
1169
- ratchetDispatchRetryCount: 0,
1170
- };
1171
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1172
- ciStatus: CIStatus.SUCCESS,
1173
- snapshotKey: 'merged-stop-failure-snapshot',
1174
- hasChangesRequested: false,
1175
- hasMergeConflict: false,
1176
- latestReviewActivityAtMs: null,
1177
- statusCheckRollup: null,
1178
- prState: 'MERGED',
1179
- cachedPrState: 'MERGED',
1180
- reviewDecision: null,
1181
- prNumber: 46,
1182
- reviewComments: [],
1183
- });
1184
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([
1185
- {
1186
- id: 'ratchet-running',
1187
- workflow: 'ratchet',
1188
- status: SessionStatus.RUNNING,
1189
- },
1190
- ]);
1191
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
1192
- vi.mocked(mockSessionBridge.stopSession).mockRejectedValue(new Error('stop failed'));
1193
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1194
- expect(result).toMatchObject({
1195
- previousState: RatchetState.READY,
1196
- newState: RatchetState.READY,
1197
- action: { type: 'ERROR', error: 'stop failed' },
1198
- });
1199
- expect(workspaceRatchetService.recordCheckIfEnabled).not.toHaveBeenCalled();
1200
- expect(mockSnapshotBridge.recordPrObservation).not.toHaveBeenCalled();
1201
- });
1202
- it('persists a newly observed merge conflict even when CI status is unchanged', async () => {
1203
- const workspace = {
1204
- id: 'ws-conflict',
1205
- prUrl: 'https://github.com/example/repo/pull/43',
1206
- prNumber: 43,
1207
- prState: 'OPEN',
1208
- prReviewState: null,
1209
- prHasMergeConflict: false,
1210
- prCiStatus: CIStatus.SUCCESS,
1211
- ratchetEnabled: true,
1212
- ratchetState: RatchetState.READY,
1213
- ratchetActiveSessionId: null,
1214
- ratchetDispatchSnapshotKey: 'conflict-snapshot',
1215
- prReviewLastCheckedAt: null,
1216
- ratchetDispatchOutcome: null,
1217
- ratchetDispatchRetryCount: 0,
1218
- };
1219
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1220
- ciStatus: CIStatus.SUCCESS,
1221
- snapshotKey: 'conflict-snapshot',
1222
- hasChangesRequested: false,
1223
- hasMergeConflict: true,
1224
- latestReviewActivityAtMs: null,
1225
- statusCheckRollup: null,
1226
- prState: 'OPEN',
1227
- cachedPrState: 'OPEN',
1228
- reviewDecision: null,
1229
- prNumber: 43,
1230
- reviewComments: [],
1231
- });
1232
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
1233
- await unsafeCoerce(ratchetService).processWorkspace(workspace);
1234
- expect(mockSnapshotBridge.recordPrObservation).toHaveBeenCalledWith(expect.objectContaining({
1235
- workspaceId: 'ws-conflict',
1236
- prUrl: 'https://github.com/example/repo/pull/43',
1237
- ciStatus: CIStatus.SUCCESS,
1238
- hasMergeConflict: true,
1239
- }));
1240
- });
1241
- it('redispatches with an incremented retry count when the previous fixer died', async () => {
1242
- const workspace = {
1243
- id: 'ws-died-retry',
1244
- prUrl: 'https://github.com/example/repo/pull/13',
1245
- prNumber: 13,
1246
- prState: 'OPEN',
1247
- prReviewState: null,
1248
- prHasMergeConflict: false,
1249
- prCiStatus: CIStatus.FAILURE,
1250
- ratchetEnabled: true,
1251
- ratchetState: RatchetState.CI_FAILED,
1252
- ratchetActiveSessionId: null,
1253
- ratchetDispatchSnapshotKey: 'same-snapshot',
1254
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
1255
- ratchetDispatchOutcome: 'DIED',
1256
- ratchetDispatchRetryCount: 1,
1257
- };
1258
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1259
- ciStatus: CIStatus.FAILURE,
1260
- snapshotKey: 'same-snapshot',
1261
- hasChangesRequested: false,
1262
- latestReviewActivityAtMs: null,
1263
- statusCheckRollup: null,
1264
- prState: 'OPEN',
1265
- prNumber: 13,
1266
- });
1267
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
1268
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
1269
- status: 'started',
1270
- sessionId: 'retry-session',
1271
- promptSent: true,
1272
- });
1273
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1274
- expect(result).toMatchObject({
1275
- action: { type: 'TRIGGERED_FIXER' },
1276
- });
1277
- expect(workspaceRatchetService.recordDispatchIfEnabled).toHaveBeenCalledWith('ws-died-retry', {
1278
- sessionId: 'retry-session',
1279
- snapshotKey: 'same-snapshot',
1280
- retryCount: 2,
1281
- });
1282
- });
1283
- it('redispatches a died fixer even when the PR is otherwise clean', async () => {
1284
- const checkedAt = new Date('2026-01-02T00:00:00Z');
1285
- const workspace = {
1286
- id: 'ws-died-clean',
1287
- prUrl: 'https://github.com/example/repo/pull/14',
1288
- prNumber: 14,
1289
- prState: 'OPEN',
1290
- prReviewState: null,
1291
- prHasMergeConflict: false,
1292
- prCiStatus: CIStatus.SUCCESS,
1293
- ratchetEnabled: true,
1294
- ratchetState: RatchetState.READY,
1295
- ratchetActiveSessionId: null,
1296
- ratchetDispatchSnapshotKey: 'clean-snapshot',
1297
- prReviewLastCheckedAt: checkedAt,
1298
- ratchetDispatchOutcome: 'DIED',
1299
- ratchetDispatchRetryCount: 0,
1300
- };
1301
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1302
- ciStatus: CIStatus.SUCCESS,
1303
- snapshotKey: 'clean-snapshot',
1304
- hasChangesRequested: false,
1305
- latestReviewActivityAtMs: checkedAt.getTime() - 1000,
1306
- statusCheckRollup: null,
1307
- prState: 'OPEN',
1308
- prNumber: 14,
1309
- reviewComments: [],
1310
- });
1311
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
1312
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
1313
- status: 'started',
1314
- sessionId: 'retry-session',
1315
- promptSent: true,
1316
- });
1317
- const events = [];
1318
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
1319
- events.push(event);
1320
- });
1321
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1322
- expect(result).toMatchObject({
1323
- action: { type: 'TRIGGERED_FIXER' },
1324
- });
1325
- expect(workspaceRatchetService.recordDispatchIfEnabled).toHaveBeenCalledWith('ws-died-clean', {
1326
- sessionId: 'retry-session',
1327
- snapshotKey: 'clean-snapshot',
1328
- retryCount: 1,
1329
- });
1330
- expect(events).toContainEqual({ workspaceId: 'ws-died-clean' });
1331
- });
1332
- it('stops retrying a died fixer once the retry budget is exhausted', async () => {
1333
- const workspace = {
1334
- id: 'ws-died-exhausted',
1335
- prUrl: 'https://github.com/example/repo/pull/15',
1336
- prNumber: 15,
1337
- prState: 'OPEN',
1338
- prReviewState: null,
1339
- prHasMergeConflict: false,
1340
- prCiStatus: CIStatus.FAILURE,
1341
- ratchetEnabled: true,
1342
- ratchetState: RatchetState.CI_FAILED,
1343
- ratchetActiveSessionId: null,
1344
- ratchetDispatchSnapshotKey: 'same-snapshot',
1345
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
1346
- ratchetDispatchOutcome: 'DIED',
1347
- ratchetDispatchRetryCount: 3,
1348
- };
1349
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1350
- ciStatus: CIStatus.FAILURE,
1351
- snapshotKey: 'same-snapshot',
1352
- hasChangesRequested: false,
1353
- latestReviewActivityAtMs: null,
1354
- statusCheckRollup: null,
1355
- prState: 'OPEN',
1356
- prNumber: 15,
1357
- });
1358
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1359
- expect(result).toMatchObject({
1360
- action: {
1361
- type: 'WAITING',
1362
- reason: 'Fixer died 4 times for this PR state; waiting for PR state to change',
1363
- },
1364
- });
1365
- expect(fixerSessionService.acquireAndDispatch).not.toHaveBeenCalled();
1366
- });
1367
- it('resets the retry count when the PR state changes after a death', async () => {
1368
- const workspace = {
1369
- id: 'ws-died-changed',
1370
- prUrl: 'https://github.com/example/repo/pull/16',
1371
- prNumber: 16,
1372
- prState: 'OPEN',
1373
- prReviewState: null,
1374
- prHasMergeConflict: false,
1375
- prCiStatus: CIStatus.FAILURE,
1376
- ratchetEnabled: true,
1377
- ratchetState: RatchetState.CI_FAILED,
1378
- ratchetActiveSessionId: null,
1379
- ratchetDispatchSnapshotKey: 'old-snapshot',
1380
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
1381
- ratchetDispatchOutcome: 'DIED',
1382
- ratchetDispatchRetryCount: 3,
1383
- };
1384
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1385
- ciStatus: CIStatus.FAILURE,
1386
- snapshotKey: 'new-snapshot',
1387
- hasChangesRequested: false,
1388
- latestReviewActivityAtMs: null,
1389
- statusCheckRollup: null,
1390
- prState: 'OPEN',
1391
- prNumber: 16,
1392
- });
1393
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
1394
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
1395
- status: 'started',
1396
- sessionId: 'fresh-session',
1397
- promptSent: true,
1398
- });
1399
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1400
- expect(result).toMatchObject({
1401
- action: { type: 'TRIGGERED_FIXER' },
1402
- });
1403
- expect(workspaceRatchetService.recordDispatchIfEnabled).toHaveBeenCalledWith('ws-died-changed', { sessionId: 'fresh-session', snapshotKey: 'new-snapshot', retryCount: 0 });
1404
- });
1405
- it('does not redispatch when the previous fixer completed and PR state is unchanged', async () => {
1406
- const workspace = {
1407
- id: 'ws-completed-unchanged',
1408
- prUrl: 'https://github.com/example/repo/pull/17',
1409
- prNumber: 17,
1410
- prState: 'OPEN',
1411
- prReviewState: null,
1412
- prHasMergeConflict: false,
1413
- prCiStatus: CIStatus.FAILURE,
1414
- ratchetEnabled: true,
1415
- ratchetState: RatchetState.CI_FAILED,
1416
- ratchetActiveSessionId: null,
1417
- ratchetDispatchSnapshotKey: 'same-snapshot',
1418
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
1419
- ratchetDispatchOutcome: 'COMPLETED',
1420
- ratchetDispatchRetryCount: 2,
1421
- };
1422
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1423
- ciStatus: CIStatus.FAILURE,
1424
- snapshotKey: 'same-snapshot',
1425
- hasChangesRequested: false,
1426
- latestReviewActivityAtMs: null,
1427
- statusCheckRollup: null,
1428
- prState: 'OPEN',
1429
- prNumber: 17,
1430
- });
1431
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1432
- expect(result).toMatchObject({
1433
- action: {
1434
- type: 'WAITING',
1435
- reason: 'PR state unchanged since last ratchet dispatch',
1436
- },
1437
- });
1438
- expect(fixerSessionService.acquireAndDispatch).not.toHaveBeenCalled();
1439
- });
1440
- it('dispatches a fresh fixer after switching PRs with identical merge-conflict state', async () => {
1441
- const previousSnapshotKey = computeDispatchSnapshotKey(123, CIStatus.SUCCESS, false, null, null, true);
1442
- const currentSnapshotKey = computeDispatchSnapshotKey(456, CIStatus.SUCCESS, false, null, null, true);
1443
- expect(previousSnapshotKey).toBe('pr:123|ci:SUCCESS|no-changes-requested:none|merge:conflict');
1444
- expect(currentSnapshotKey).toBe('pr:456|ci:SUCCESS|no-changes-requested:none|merge:conflict');
1445
- const workspace = {
1446
- id: 'ws-pr-switch-merge-conflict',
1447
- prUrl: 'https://github.com/example/repo/pull/456',
1448
- prNumber: 456,
1449
- prState: 'OPEN',
1450
- prReviewState: null,
1451
- prHasMergeConflict: false,
1452
- prCiStatus: CIStatus.SUCCESS,
1453
- ratchetEnabled: true,
1454
- ratchetState: RatchetState.MERGE_CONFLICT,
1455
- ratchetActiveSessionId: null,
1456
- ratchetDispatchSnapshotKey: previousSnapshotKey,
1457
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
1458
- ratchetDispatchOutcome: 'COMPLETED',
1459
- ratchetDispatchRetryCount: 2,
1460
- };
1461
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1462
- ciStatus: CIStatus.SUCCESS,
1463
- snapshotKey: currentSnapshotKey,
1464
- hasChangesRequested: false,
1465
- hasMergeConflict: true,
1466
- latestReviewActivityAtMs: null,
1467
- statusCheckRollup: null,
1468
- prState: 'OPEN',
1469
- prNumber: 456,
1470
- reviewComments: [],
1471
- });
1472
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
1473
- status: 'started',
1474
- sessionId: 'fresh-pr-session',
1475
- promptSent: true,
1476
- });
1477
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1478
- expect(result).toMatchObject({
1479
- action: { type: 'TRIGGERED_FIXER' },
1480
- });
1481
- expect(workspaceRatchetService.recordDispatchIfEnabled).toHaveBeenCalledWith(workspace.id, {
1482
- sessionId: 'fresh-pr-session',
1483
- snapshotKey: currentSnapshotKey,
1484
- retryCount: 0,
1485
- });
1486
- });
1487
- it('settles the dispatch as DIED when ratchet session process is not running', async () => {
1488
- const workspace = {
1489
- id: 'ws-stale-active',
1490
- prUrl: 'https://github.com/example/repo/pull/9',
1491
- prNumber: 9,
1492
- prState: 'OPEN',
1493
- prReviewState: null,
1494
- prHasMergeConflict: false,
1495
- prCiStatus: CIStatus.UNKNOWN,
1496
- ratchetEnabled: true,
1497
- ratchetState: RatchetState.CI_FAILED,
1498
- ratchetActiveSessionId: 'ratchet-session',
1499
- ratchetDispatchSnapshotKey: 'previous-snapshot-key',
1500
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
1501
- ratchetDispatchOutcome: 'RUNNING',
1502
- ratchetDispatchRetryCount: 0,
1503
- };
1504
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue({
1505
- id: 'ratchet-session',
1506
- provider: 'CLAUDE',
1507
- status: SessionStatus.RUNNING,
1508
- });
1509
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(false);
1510
- const result = await unsafeCoerce(ratchetService).checkActiveFixerSession(workspace);
1511
- expect(result).toEqual({ kind: 'settled', outcome: 'DIED' });
1512
- expect(mockWorkspaceBridge.recordSessionEnd).toHaveBeenCalledWith(workspace.id, 'ratchet-session', 'DIED');
1513
- });
1514
- it('settles the dispatch as DIED when ratchet session is not found in database', async () => {
1515
- const workspace = {
1516
- id: 'ws-missing-session',
1517
- prUrl: 'https://github.com/example/repo/pull/12',
1518
- prNumber: 12,
1519
- prState: 'OPEN',
1520
- prReviewState: null,
1521
- prHasMergeConflict: false,
1522
- prCiStatus: CIStatus.UNKNOWN,
1523
- ratchetEnabled: true,
1524
- ratchetState: RatchetState.CI_FAILED,
1525
- ratchetActiveSessionId: 'deleted-session',
1526
- ratchetDispatchSnapshotKey: 'previous-snapshot-key',
1527
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
1528
- ratchetDispatchOutcome: 'RUNNING',
1529
- ratchetDispatchRetryCount: 0,
1530
- };
1531
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue(null);
1532
- const events = [];
1533
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
1534
- events.push(event);
1535
- });
1536
- const result = await unsafeCoerce(ratchetService).checkActiveFixerSession(workspace);
1537
- expect(result).toEqual({ kind: 'settled', outcome: 'DIED' });
1538
- expect(mockWorkspaceBridge.recordSessionEnd).toHaveBeenCalledWith(workspace.id, 'deleted-session', 'DIED');
1539
- expect(events).toEqual([{ workspaceId: 'ws-missing-session' }]);
1540
- });
1541
- it('reports a concurrent end when another path already settled the dispatch', async () => {
1542
- const workspace = {
1543
- id: 'ws-concurrent-end',
1544
- prUrl: 'https://github.com/example/repo/pull/12',
1545
- prNumber: 12,
1546
- prState: 'OPEN',
1547
- prReviewState: null,
1548
- prHasMergeConflict: false,
1549
- prCiStatus: CIStatus.UNKNOWN,
1550
- ratchetEnabled: true,
1551
- ratchetState: RatchetState.CI_FAILED,
1552
- ratchetActiveSessionId: 'finished-session',
1553
- ratchetDispatchSnapshotKey: 'previous-snapshot-key',
1554
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
1555
- ratchetDispatchOutcome: 'RUNNING',
1556
- ratchetDispatchRetryCount: 0,
1557
- };
1558
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue(null);
1559
- vi.mocked(mockWorkspaceBridge.recordSessionEnd).mockResolvedValue(false);
1560
- const events = [];
1561
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
1562
- events.push(event);
1563
- });
1564
- const result = await unsafeCoerce(ratchetService).checkActiveFixerSession(workspace);
1565
- expect(result).toEqual({ kind: 'ended_concurrently' });
1566
- expect(events).toHaveLength(0);
1567
- });
1568
- it('waits for the next cycle when the fixer ends concurrently mid-check', async () => {
1569
- const workspace = {
1570
- id: 'ws-concurrent-wait',
1571
- prUrl: 'https://github.com/example/repo/pull/12',
1572
- prNumber: 12,
1573
- prState: 'OPEN',
1574
- prReviewState: null,
1575
- prHasMergeConflict: false,
1576
- prCiStatus: CIStatus.UNKNOWN,
1577
- ratchetEnabled: true,
1578
- ratchetState: RatchetState.CI_FAILED,
1579
- ratchetActiveSessionId: 'finished-session',
1580
- ratchetDispatchSnapshotKey: 'previous-snapshot-key',
1581
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
1582
- ratchetDispatchOutcome: 'RUNNING',
1583
- ratchetDispatchRetryCount: 0,
1584
- };
1585
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
1586
- ciStatus: CIStatus.FAILURE,
1587
- snapshotKey: 'new-snapshot',
1588
- hasChangesRequested: false,
1589
- latestReviewActivityAtMs: null,
1590
- statusCheckRollup: null,
1591
- prState: 'OPEN',
1592
- prNumber: 12,
1593
- });
1594
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue(null);
1595
- vi.mocked(mockWorkspaceBridge.recordSessionEnd).mockResolvedValue(false);
1596
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1597
- expect(result).toMatchObject({
1598
- action: {
1599
- type: 'WAITING',
1600
- reason: 'Fixer session ended during this check; re-evaluating next cycle',
1601
- },
1602
- });
1603
- expect(fixerSessionService.acquireAndDispatch).not.toHaveBeenCalled();
1604
- });
1605
- it('settles the dispatch as COMPLETED when ratchet session finished its work', async () => {
1606
- const workspace = {
1607
- id: 'ws-idle-active',
1608
- prUrl: 'https://github.com/example/repo/pull/11',
1609
- prNumber: 11,
1610
- prState: 'OPEN',
1611
- prReviewState: null,
1612
- prHasMergeConflict: false,
1613
- prCiStatus: CIStatus.UNKNOWN,
1614
- ratchetEnabled: true,
1615
- ratchetState: RatchetState.CI_FAILED,
1616
- ratchetActiveSessionId: 'ratchet-session',
1617
- ratchetDispatchSnapshotKey: 'snapshot-key',
1618
- prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
1619
- ratchetDispatchOutcome: 'RUNNING',
1620
- ratchetDispatchRetryCount: 0,
1621
- };
1622
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue({
1623
- id: 'ratchet-session',
1624
- provider: 'CLAUDE',
1625
- status: SessionStatus.RUNNING,
1626
- });
1627
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
1628
- vi.mocked(mockSessionBridge.isSessionWorking).mockReturnValue(false);
1629
- vi.mocked(mockSessionBridge.stopSession).mockResolvedValue();
1630
- const result = await unsafeCoerce(ratchetService).checkActiveFixerSession(workspace);
1631
- expect(result).toEqual({ kind: 'settled', outcome: 'COMPLETED' });
1632
- expect(mockWorkspaceBridge.recordSessionEnd).toHaveBeenCalledWith(workspace.id, 'ratchet-session', 'COMPLETED');
1633
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('ratchet-session');
1634
- });
1635
- it('decides to trigger fixer when context is actionable', async () => {
1636
- const decision = await unsafeCoerce(ratchetService).decideRatchetAction({
1637
- workspace: { id: 'ws-decide', ratchetEnabled: true },
1638
- prStateInfo: { prState: 'OPEN', ciStatus: CIStatus.FAILURE },
1639
- isCleanPrWithNoNewReviewActivity: false,
1640
- activeFixerCheck: { kind: 'none' },
1641
- dispatchOutcome: null,
1642
- dispatchRetryCount: 0,
1643
- hasStateChangedSinceLastDispatch: true,
1644
- });
1645
- expect(decision).toEqual({ type: 'TRIGGER_FIXER', retryCount: 0 });
1646
- });
1647
- it('waits when CI is not in terminal state (PENDING)', async () => {
1648
- const decision = await unsafeCoerce(ratchetService).decideRatchetAction({
1649
- workspace: { id: 'ws-decide', ratchetEnabled: true },
1650
- prStateInfo: { prState: 'OPEN', ciStatus: CIStatus.PENDING },
1651
- isCleanPrWithNoNewReviewActivity: false,
1652
- activeFixerCheck: { kind: 'none' },
1653
- dispatchOutcome: null,
1654
- dispatchRetryCount: 0,
1655
- hasStateChangedSinceLastDispatch: true,
1656
- });
1657
- expect(decision).toEqual({
1658
- type: 'RETURN_ACTION',
1659
- action: { type: 'WAITING', reason: 'Waiting for CI to complete (not in terminal state)' },
1660
- });
1661
- });
1662
- it('waits when CI is not in terminal state (UNKNOWN)', async () => {
1663
- const decision = await unsafeCoerce(ratchetService).decideRatchetAction({
1664
- workspace: { id: 'ws-decide', ratchetEnabled: true },
1665
- prStateInfo: { prState: 'OPEN', ciStatus: CIStatus.UNKNOWN },
1666
- isCleanPrWithNoNewReviewActivity: false,
1667
- activeFixerCheck: { kind: 'none' },
1668
- dispatchOutcome: null,
1669
- dispatchRetryCount: 0,
1670
- hasStateChangedSinceLastDispatch: true,
1671
- });
1672
- expect(decision).toEqual({
1673
- type: 'RETURN_ACTION',
1674
- action: { type: 'WAITING', reason: 'Waiting for CI to complete (not in terminal state)' },
1675
- });
1676
- });
1677
- it('prefers precomputed review-activity diagnostics from decision context', () => {
1678
- const workspace = {
1679
- id: 'ws-log-diag',
1680
- prUrl: 'https://github.com/example/repo/pull/10',
1681
- prNumber: 10,
1682
- prState: 'OPEN',
1683
- prReviewState: null,
1684
- prHasMergeConflict: false,
1685
- prCiStatus: CIStatus.UNKNOWN,
1686
- ratchetEnabled: true,
1687
- ratchetState: RatchetState.READY,
1688
- ratchetActiveSessionId: null,
1689
- ratchetDispatchSnapshotKey: 'prev-snapshot',
1690
- prReviewLastCheckedAt: null,
1691
- ratchetDispatchOutcome: null,
1692
- ratchetDispatchRetryCount: 0,
1693
- };
1694
- const prStateInfo = {
1695
- ciStatus: CIStatus.SUCCESS,
1696
- snapshotKey: 'next-snapshot',
1697
- hasChangesRequested: false,
1698
- latestReviewActivityAtMs: null,
1699
- statusCheckRollup: null,
1700
- prState: 'OPEN',
1701
- prNumber: 10,
1702
- };
1703
- const logContext = buildRatchetingLogContext({
1704
- workspace: workspace,
1705
- previousState: RatchetState.READY,
1706
- newState: RatchetState.READY,
1707
- action: { type: 'WAITING', reason: 'noop' },
1708
- prStateInfo: prStateInfo,
1709
- prNumber: 10,
1710
- decisionContext: { hasNewReviewActivitySinceLastDispatch: true },
1711
- });
1712
- expect(logContext.reviewTimestampComparison?.hasNewReviewActivitySinceLastDispatch).toBe(true);
1713
- });
1714
- it('ignores review activity authored by the authenticated user', () => {
1715
- const latestActivity = computeLatestReviewActivityAtMs({
1716
- reviews: [
1717
- {
1718
- submittedAt: '2026-01-02T00:00:00Z',
1719
- author: { login: 'ratchet-bot' },
1720
- state: 'CHANGES_REQUESTED',
1721
- },
1722
- {
1723
- submittedAt: '2026-01-01T00:00:00Z',
1724
- author: { login: 'reviewer' },
1725
- state: 'CHANGES_REQUESTED',
1726
- },
1727
- ],
1728
- comments: [{ updatedAt: '2026-01-02T01:00:00Z', author: { login: 'ratchet-bot' } }],
1729
- }, [{ updatedAt: '2026-01-01T02:00:00Z', author: { login: 'reviewer2' } }], 'ratchet-bot', 'CHANGES_REQUESTED');
1730
- expect(latestActivity).toBe(new Date('2026-01-01T02:00:00Z').getTime());
1731
- });
1732
- describe('determineRatchetState', () => {
1733
- const callDetermineRatchetState = (pr) => determineRatchetState(pr);
1734
- it('returns MERGED for merged PR', () => {
1735
- expect(callDetermineRatchetState({
1736
- ciStatus: CIStatus.SUCCESS,
1737
- prState: 'MERGED',
1738
- hasChangesRequested: false,
1739
- })).toBe(RatchetState.MERGED);
1740
- });
1741
- it('returns IDLE for closed (non-merged) PR', () => {
1742
- expect(callDetermineRatchetState({
1743
- ciStatus: CIStatus.SUCCESS,
1744
- prState: 'CLOSED',
1745
- hasChangesRequested: false,
1746
- })).toBe(RatchetState.IDLE);
1747
- });
1748
- it('returns CI_RUNNING for PENDING CI on open PR', () => {
1749
- expect(callDetermineRatchetState({
1750
- ciStatus: CIStatus.PENDING,
1751
- prState: 'OPEN',
1752
- hasChangesRequested: false,
1753
- })).toBe(RatchetState.CI_RUNNING);
1754
- });
1755
- it('returns CI_RUNNING for UNKNOWN CI on open PR', () => {
1756
- expect(callDetermineRatchetState({
1757
- ciStatus: CIStatus.UNKNOWN,
1758
- prState: 'OPEN',
1759
- hasChangesRequested: false,
1760
- })).toBe(RatchetState.CI_RUNNING);
1761
- });
1762
- it('returns CI_FAILED for FAILURE CI on open PR', () => {
1763
- expect(callDetermineRatchetState({
1764
- ciStatus: CIStatus.FAILURE,
1765
- prState: 'OPEN',
1766
- hasChangesRequested: false,
1767
- })).toBe(RatchetState.CI_FAILED);
1768
- });
1769
- it('returns REVIEW_PENDING when changes requested on open PR with passing CI', () => {
1770
- expect(callDetermineRatchetState({
1771
- ciStatus: CIStatus.SUCCESS,
1772
- prState: 'OPEN',
1773
- hasChangesRequested: true,
1774
- })).toBe(RatchetState.REVIEW_PENDING);
1775
- });
1776
- it('returns READY when open PR with passing CI and no changes requested', () => {
1777
- expect(callDetermineRatchetState({
1778
- ciStatus: CIStatus.SUCCESS,
1779
- prState: 'OPEN',
1780
- hasChangesRequested: false,
1781
- })).toBe(RatchetState.READY);
1782
- });
1783
- it('returns CI_FAILED even when changes are requested if CI is failing', () => {
1784
- expect(callDetermineRatchetState({
1785
- ciStatus: CIStatus.FAILURE,
1786
- prState: 'OPEN',
1787
- hasChangesRequested: true,
1788
- })).toBe(RatchetState.CI_FAILED);
1789
- });
1790
- });
1791
- describe('computeDispatchSnapshotKey', () => {
1792
- const callComputeSnapshotKey = (ciStatus, hasChangesRequested, latestReviewActivityAtMs, statusChecks) => computeDispatchSnapshotKey(123, ciStatus, hasChangesRequested, latestReviewActivityAtMs, statusChecks);
1793
- it('includes CI status in key for non-failure states', () => {
1794
- const key = callComputeSnapshotKey(CIStatus.SUCCESS, false, null, null);
1795
- expect(key).toContain('ci:SUCCESS');
1796
- expect(key).toContain('no-changes-requested');
1797
- expect(key).toContain('none');
1798
- });
1799
- it('includes failed check details in key for FAILURE status', () => {
1800
- const key = callComputeSnapshotKey(CIStatus.FAILURE, false, null, [
1801
- {
1802
- name: 'test',
1803
- conclusion: 'FAILURE',
1804
- detailsUrl: 'https://github.com/o/r/actions/runs/12345',
1805
- },
1806
- ]);
1807
- expect(key).toContain('ci:FAILURE');
1808
- expect(key).toContain('test:FAILURE:12345');
1809
- });
1810
- it('sorts failed checks for stable key generation', () => {
1811
- const key = callComputeSnapshotKey(CIStatus.FAILURE, false, null, [
1812
- {
1813
- name: 'ztest',
1814
- conclusion: 'FAILURE',
1815
- detailsUrl: 'https://github.com/o/r/actions/runs/2',
1816
- },
1817
- {
1818
- name: 'atest',
1819
- conclusion: 'FAILURE',
1820
- detailsUrl: 'https://github.com/o/r/actions/runs/1',
1821
- },
1822
- ]);
1823
- expect(key.indexOf('atest')).toBeLessThan(key.indexOf('ztest'));
1824
- });
1825
- it('uses unknown for FAILURE with empty check array', () => {
1826
- const key = callComputeSnapshotKey(CIStatus.FAILURE, false, null, []);
1827
- expect(key).toContain('ci:FAILURE:unknown');
1828
- });
1829
- it('includes review activity timestamp in key', () => {
1830
- const ts = 1_735_776_000_000;
1831
- const key = callComputeSnapshotKey(CIStatus.SUCCESS, true, ts, null);
1832
- expect(key).toContain(`changes-requested:${ts}`);
1833
- });
1834
- });
1835
- describe('computeLatestReviewActivityAtMs edge cases', () => {
1836
- const callCompute = (prDetails, reviewComments, authenticatedUsername) => computeLatestReviewActivityAtMs(prDetails, reviewComments, authenticatedUsername, 'CHANGES_REQUESTED');
1837
- it('returns null when there are no reviews or comments', () => {
1838
- expect(callCompute({ reviews: [], comments: [] }, [], null)).toBeNull();
1839
- });
1840
- it('returns null when all activity is from the authenticated user', () => {
1841
- expect(callCompute({
1842
- reviews: [
1843
- {
1844
- submittedAt: '2026-01-01T00:00:00Z',
1845
- author: { login: 'me' },
1846
- state: 'CHANGES_REQUESTED',
1847
- },
1848
- ],
1849
- comments: [{ updatedAt: '2026-01-02T00:00:00Z', author: { login: 'me' } }],
1850
- }, [{ updatedAt: '2026-01-03T00:00:00Z', author: { login: 'me' } }], 'me')).toBeNull();
1851
- });
1852
- it('does not filter when authenticatedUsername is null', () => {
1853
- const result = callCompute({
1854
- reviews: [
1855
- {
1856
- submittedAt: '2026-01-01T00:00:00Z',
1857
- author: { login: 'bot' },
1858
- state: 'CHANGES_REQUESTED',
1859
- },
1860
- ],
1861
- comments: [],
1862
- }, [], null);
1863
- expect(result).toBe(new Date('2026-01-01T00:00:00Z').getTime());
1864
- });
1865
- it('ignores reviews with null submittedAt and ordinary PR comments', () => {
1866
- const result = callCompute({
1867
- reviews: [
1868
- {
1869
- submittedAt: null,
1870
- author: { login: 'reviewer' },
1871
- state: 'CHANGES_REQUESTED',
1872
- },
1873
- ],
1874
- comments: [{ updatedAt: '2026-01-02T00:00:00Z', author: { login: 'commenter' } }],
1875
- }, [], null);
1876
- expect(result).toBeNull();
1877
- });
1878
- it('returns the latest timestamp across all sources', () => {
1879
- const result = callCompute({
1880
- reviews: [
1881
- {
1882
- submittedAt: '2026-01-01T00:00:00Z',
1883
- author: { login: 'a' },
1884
- state: 'CHANGES_REQUESTED',
1885
- },
1886
- ],
1887
- comments: [{ updatedAt: '2026-01-03T00:00:00Z', author: { login: 'b' } }],
1888
- }, [{ updatedAt: '2026-01-02T00:00:00Z', author: { login: 'c' } }], null);
1889
- expect(result).toBe(new Date('2026-01-02T00:00:00Z').getTime());
1890
- });
1891
- });
1892
- describe('processWorkspace error handling', () => {
1893
- it('returns ERROR action when fetchPRState returns null', async () => {
1894
- const workspace = {
1895
- id: 'ws-fetch-err',
1896
- prUrl: 'https://github.com/example/repo/pull/99',
1897
- prNumber: 99,
1898
- ratchetEnabled: true,
1899
- ratchetState: RatchetState.IDLE,
1900
- ratchetActiveSessionId: null,
1901
- ratchetDispatchSnapshotKey: null,
1902
- prReviewLastCheckedAt: null,
1903
- ratchetDispatchOutcome: null,
1904
- ratchetDispatchRetryCount: 0,
1905
- };
1906
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue(null);
1907
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1908
- expect(result).toMatchObject({
1909
- action: { type: 'ERROR', error: 'Failed to fetch PR state' },
1910
- newState: RatchetState.IDLE,
1911
- });
1912
- });
1913
- it('returns WAITING action when fetchPRState skips a recent fetch', async () => {
1914
- const workspace = {
1915
- id: 'ws-recent-fetch',
1916
- prUrl: 'https://github.com/example/repo/pull/99',
1917
- prNumber: 99,
1918
- ratchetEnabled: true,
1919
- ratchetState: RatchetState.IDLE,
1920
- ratchetActiveSessionId: null,
1921
- ratchetDispatchSnapshotKey: null,
1922
- prReviewLastCheckedAt: null,
1923
- ratchetDispatchOutcome: null,
1924
- ratchetDispatchRetryCount: 0,
1925
- };
1926
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({ skipped: true, reason: 'recently_fetched' });
1927
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1928
- expect(result).toMatchObject({
1929
- action: { type: 'WAITING', reason: 'recently_fetched' },
1930
- newState: RatchetState.IDLE,
1931
- });
1932
- expect(workspaceRatchetService.clearActiveSession).not.toHaveBeenCalled();
1933
- });
1934
- it('returns WAITING when shutting down', async () => {
1935
- setRatchetShuttingDown(true);
1936
- const workspace = {
1937
- id: 'ws-shutdown',
1938
- prUrl: 'https://github.com/example/repo/pull/1',
1939
- prNumber: 1,
1940
- ratchetEnabled: true,
1941
- ratchetState: RatchetState.CI_FAILED,
1942
- ratchetActiveSessionId: null,
1943
- ratchetDispatchSnapshotKey: null,
1944
- prReviewLastCheckedAt: null,
1945
- ratchetDispatchOutcome: null,
1946
- ratchetDispatchRetryCount: 0,
1947
- };
1948
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1949
- expect(result).toMatchObject({
1950
- action: { type: 'WAITING', reason: 'Shutting down' },
1951
- previousState: RatchetState.CI_FAILED,
1952
- newState: RatchetState.CI_FAILED,
1953
- });
1954
- });
1955
- it('returns ERROR and preserves state when processWorkspace throws', async () => {
1956
- const workspace = {
1957
- id: 'ws-throw',
1958
- prUrl: 'https://github.com/example/repo/pull/50',
1959
- prNumber: 50,
1960
- ratchetEnabled: true,
1961
- ratchetState: RatchetState.CI_FAILED,
1962
- ratchetActiveSessionId: null,
1963
- ratchetDispatchSnapshotKey: null,
1964
- prReviewLastCheckedAt: null,
1965
- ratchetDispatchOutcome: null,
1966
- ratchetDispatchRetryCount: 0,
1967
- };
1968
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockRejectedValue(new Error('Unexpected explosion'));
1969
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
1970
- expect(result).toMatchObject({
1971
- action: { type: 'ERROR', error: 'Unexpected explosion' },
1972
- previousState: RatchetState.CI_FAILED,
1973
- newState: RatchetState.CI_FAILED,
1974
- });
1975
- });
1976
- });
1977
- describe('checkAllWorkspaces', () => {
1978
- it('returns zero counts when shutting down', async () => {
1979
- setRatchetShuttingDown(true);
1980
- const result = await ratchetService.checkAllWorkspaces();
1981
- expect(result).toEqual({ checked: 0, stateChanges: 0, actionsTriggered: 0, results: [] });
1982
- });
1983
- it('returns zero counts when no workspaces have PRs', async () => {
1984
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue([]);
1985
- const result = await ratchetService.checkAllWorkspaces();
1986
- expect(result).toEqual({ checked: 0, stateChanges: 0, actionsTriggered: 0, results: [] });
1987
- });
1988
- it('loads the global review trigger mode once for the whole batch', async () => {
1989
- const workspaces = ['ws-one', 'ws-two'].map((id) => ({
1990
- id,
1991
- prUrl: `https://github.com/example/repo/pull/${id}`,
1992
- prNumber: 1,
1993
- prState: 'OPEN',
1994
- prReviewState: null,
1995
- prHasMergeConflict: false,
1996
- prCiStatus: CIStatus.UNKNOWN,
1997
- ratchetEnabled: true,
1998
- ratchetState: RatchetState.IDLE,
1999
- ratchetActiveSessionId: null,
2000
- ratchetDispatchSnapshotKey: null,
2001
- prReviewLastCheckedAt: null,
2002
- ratchetDispatchOutcome: null,
2003
- ratchetDispatchRetryCount: 0,
2004
- }));
2005
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue(workspaces);
2006
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({ skipped: true, reason: 'recently_fetched' });
2007
- const result = await ratchetService.checkAllWorkspaces();
2008
- expect(result.checked).toBe(2);
2009
- expect(userSettingsService.get).toHaveBeenCalledTimes(1);
2010
- });
2011
- it('returns an error result when one workspace check times out', async () => {
2012
- unsafeCoerce(ratchetService).workspaceCheckTimeoutMs = 5;
2013
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue([
2014
- {
2015
- id: 'ws-timeout',
2016
- prUrl: 'https://github.com/example/repo/pull/1',
2017
- prNumber: 1,
2018
- prState: 'OPEN',
2019
- prCiStatus: CIStatus.FAILURE,
2020
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
2021
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
2022
- ratchetEnabled: true,
2023
- ratchetState: RatchetState.IDLE,
2024
- ratchetActiveSessionId: null,
2025
- ratchetDispatchSnapshotKey: null,
2026
- prReviewLastCheckedAt: null,
2027
- ratchetDispatchOutcome: null,
2028
- ratchetDispatchRetryCount: 0,
2029
- },
2030
- {
2031
- id: 'ws-fast',
2032
- prUrl: 'https://github.com/example/repo/pull/2',
2033
- prNumber: 2,
2034
- prState: 'OPEN',
2035
- prCiStatus: CIStatus.SUCCESS,
2036
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
2037
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
2038
- ratchetEnabled: true,
2039
- ratchetState: RatchetState.CI_RUNNING,
2040
- ratchetActiveSessionId: null,
2041
- ratchetDispatchSnapshotKey: null,
2042
- prReviewLastCheckedAt: null,
2043
- ratchetDispatchOutcome: null,
2044
- ratchetDispatchRetryCount: 0,
2045
- },
2046
- ]);
2047
- vi.spyOn(unsafeCoerce(ratchetService), 'processWorkspace').mockImplementation((workspace, _opts, signal) => {
2048
- if (workspace.id === 'ws-timeout') {
2049
- return new Promise((_resolve, reject) => {
2050
- signal.addEventListener('abort', () => reject(signal.reason), { once: true });
2051
- });
2052
- }
2053
- return Promise.resolve({
2054
- workspaceId: workspace.id,
2055
- previousState: RatchetState.CI_RUNNING,
2056
- newState: RatchetState.CI_RUNNING,
2057
- action: { type: 'WAITING', reason: 'noop' },
2058
- });
2059
- });
2060
- const result = await ratchetService.checkAllWorkspaces();
2061
- expect(result.checked).toBe(2);
2062
- expect(result.results).toEqual(expect.arrayContaining([
2063
- expect.objectContaining({
2064
- workspaceId: 'ws-timeout',
2065
- action: expect.objectContaining({
2066
- type: 'ERROR',
2067
- error: expect.stringContaining('timed out'),
2068
- }),
2069
- }),
2070
- expect.objectContaining({
2071
- workspaceId: 'ws-fast',
2072
- action: { type: 'WAITING', reason: 'noop' },
2073
- }),
2074
- ]));
2075
- });
2076
- it('does not count concurrency queue wait toward the workspace timeout', async () => {
2077
- unsafeCoerce(ratchetService).workspaceCheckTimeoutMs = 5;
2078
- const workspaces = Array.from({ length: 4 }, (_, index) => ({
2079
- id: `ws-queued-timeout-${index}`,
2080
- prUrl: `https://github.com/example/repo/pull/${index + 1}`,
2081
- prNumber: index + 1,
2082
- prState: 'OPEN',
2083
- prReviewState: null,
2084
- prHasMergeConflict: false,
2085
- prCiStatus: CIStatus.UNKNOWN,
2086
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
2087
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
2088
- ratchetEnabled: true,
2089
- ratchetState: RatchetState.IDLE,
2090
- ratchetActiveSessionId: null,
2091
- ratchetDispatchSnapshotKey: null,
2092
- prReviewLastCheckedAt: null,
2093
- ratchetDispatchOutcome: null,
2094
- ratchetDispatchRetryCount: 0,
2095
- }));
2096
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue(workspaces);
2097
- const processWorkspaceSpy = vi.spyOn(unsafeCoerce(ratchetService), 'processWorkspace');
2098
- processWorkspaceSpy.mockImplementation((workspace, _opts, signal) => {
2099
- if (workspace.id !== 'ws-queued-timeout-3') {
2100
- return new Promise((_resolve, reject) => {
2101
- signal.addEventListener('abort', () => reject(signal.reason), { once: true });
2102
- });
2103
- }
2104
- return Promise.resolve({
2105
- workspaceId: workspace.id,
2106
- previousState: RatchetState.IDLE,
2107
- newState: RatchetState.IDLE,
2108
- action: { type: 'WAITING', reason: 'ran after queue' },
2109
- });
2110
- });
2111
- const result = await ratchetService.checkAllWorkspaces();
2112
- expect(processWorkspaceSpy).toHaveBeenCalledWith(expect.objectContaining({ id: 'ws-queued-timeout-3' }), undefined, expect.any(AbortSignal), expect.any(Function), 'CHANGES_REQUESTED');
2113
- expect(result.results[3]).toMatchObject({
2114
- workspaceId: 'ws-queued-timeout-3',
2115
- action: { type: 'WAITING', reason: 'ran after queue' },
2116
- });
2117
- });
2118
- it('lets a committed dispatch finish instead of reporting a timeout error', async () => {
2119
- unsafeCoerce(ratchetService).workspaceCheckTimeoutMs = 5;
2120
- const workspace = {
2121
- id: 'ws-committed-dispatch',
2122
- prUrl: 'https://github.com/example/repo/pull/1',
2123
- prNumber: 1,
2124
- ratchetEnabled: true,
2125
- ratchetState: RatchetState.IDLE,
2126
- };
2127
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue([workspace]);
2128
- let finishCommit;
2129
- const commitBarrier = new Promise((resolve) => {
2130
- finishCommit = resolve;
2131
- });
2132
- vi.spyOn(unsafeCoerce(ratchetService), 'processWorkspace').mockImplementation(async (workspaceArg, _opts, signal, commitSideEffects) => {
2133
- commitSideEffects();
2134
- await commitBarrier;
2135
- signal.throwIfAborted();
2136
- return {
2137
- workspaceId: workspaceArg.id,
2138
- previousState: RatchetState.IDLE,
2139
- newState: RatchetState.IDLE,
2140
- action: { type: 'TRIGGERED_FIXER', sessionId: 'session-1', promptSent: true },
2141
- };
2142
- });
2143
- const resultPromise = ratchetService.checkAllWorkspaces();
2144
- await new Promise((resolve) => setTimeout(resolve, 10));
2145
- finishCommit();
2146
- const result = await resultPromise;
2147
- expect(result.results[0]).toMatchObject({
2148
- workspaceId: workspace.id,
2149
- action: { type: 'TRIGGERED_FIXER', sessionId: 'session-1' },
2150
- });
2151
- });
2152
- it('runs at most three workspace checks concurrently', async () => {
2153
- const workspaces = Array.from({ length: 7 }, (_, index) => ({
2154
- id: `ws-${index}`,
2155
- prUrl: `https://github.com/example/repo/pull/${index + 1}`,
2156
- prNumber: index + 1,
2157
- prState: 'OPEN',
2158
- prReviewState: null,
2159
- prHasMergeConflict: false,
2160
- prCiStatus: CIStatus.UNKNOWN,
2161
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
2162
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
2163
- ratchetEnabled: true,
2164
- ratchetState: RatchetState.IDLE,
2165
- ratchetActiveSessionId: null,
2166
- ratchetDispatchSnapshotKey: null,
2167
- prReviewLastCheckedAt: null,
2168
- ratchetDispatchOutcome: null,
2169
- ratchetDispatchRetryCount: 0,
2170
- }));
2171
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue(workspaces);
2172
- let active = 0;
2173
- let maximumActive = 0;
2174
- let releaseChecks;
2175
- const checkBarrier = new Promise((resolve) => {
2176
- releaseChecks = resolve;
2177
- });
2178
- vi.spyOn(unsafeCoerce(ratchetService), 'processWorkspace').mockImplementation(async (workspace) => {
2179
- active += 1;
2180
- maximumActive = Math.max(maximumActive, active);
2181
- await checkBarrier;
2182
- active -= 1;
2183
- return {
2184
- workspaceId: workspace.id,
2185
- previousState: RatchetState.IDLE,
2186
- newState: RatchetState.IDLE,
2187
- action: { type: 'WAITING', reason: 'noop' },
2188
- };
2189
- });
2190
- const resultPromise = ratchetService.checkAllWorkspaces();
2191
- await vi.waitFor(() => expect(active).toBe(3));
2192
- expect(maximumActive).toBe(3);
2193
- releaseChecks();
2194
- const result = await resultPromise;
2195
- expect(maximumActive).toBe(3);
2196
- expect(result.checked).toBe(7);
2197
- expect(result.results).toHaveLength(7);
2198
- });
2199
- });
2200
- describe('shutdown behavior', () => {
2201
- it('stops immediately while monitor loop is sleeping', async () => {
2202
- vi.useFakeTimers();
2203
- vi.spyOn(ratchetService, 'checkAllWorkspaces').mockResolvedValue({
2204
- checked: 0,
2205
- stateChanges: 0,
2206
- actionsTriggered: 0,
2207
- results: [],
2208
- });
2209
- ratchetService.start();
2210
- await Promise.resolve();
2211
- await Promise.resolve();
2212
- await expect(ratchetService.stop()).resolves.toBeUndefined();
2213
- vi.useRealTimers();
2214
- });
2215
- });
2216
- describe('check abort safety', () => {
2217
- afterEach(() => {
2218
- ratchetService.removeAllListeners();
2219
- });
2220
- it('does not continue to side effects after a timed-out await completes', async () => {
2221
- unsafeCoerce(ratchetService).workspaceCheckTimeoutMs = 5;
2222
- const workspace = {
2223
- id: 'ws-zombie',
2224
- prUrl: 'https://github.com/example/repo/pull/1',
2225
- prNumber: 1,
2226
- prState: 'OPEN',
2227
- prReviewState: null,
2228
- prHasMergeConflict: false,
2229
- prCiStatus: CIStatus.FAILURE,
2230
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
2231
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
2232
- ratchetEnabled: true,
2233
- ratchetState: RatchetState.IDLE,
2234
- ratchetActiveSessionId: null,
2235
- ratchetDispatchSnapshotKey: null,
2236
- prReviewLastCheckedAt: null,
2237
- ratchetDispatchOutcome: null,
2238
- ratchetDispatchRetryCount: 0,
2239
- };
2240
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue([workspace]);
2241
- let releaseFetch;
2242
- const fetchBarrier = new Promise((resolve) => {
2243
- releaseFetch = resolve;
2244
- });
2245
- const finishSpy = vi.spyOn(unsafeCoerce(ratchetService), 'finishRatchetCheck');
2246
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockImplementation(async () => {
2247
- await fetchBarrier;
2248
- return {
2249
- ciStatus: CIStatus.FAILURE,
2250
- snapshotKey: 'failed:1',
2251
- hasChangesRequested: false,
2252
- hasMergeConflict: false,
2253
- latestReviewActivityAtMs: null,
2254
- statusCheckRollup: [],
2255
- prState: 'OPEN',
2256
- prNumber: 1,
2257
- reviewComments: [],
2258
- };
2259
- });
2260
- const result = await ratchetService.checkAllWorkspaces();
2261
- expect(result.results[0]?.action.type).toBe('ERROR');
2262
- releaseFetch();
2263
- await new Promise((resolve) => setTimeout(resolve, 0));
2264
- expect(finishSpy).not.toHaveBeenCalled();
2265
- expect(workspaceRatchetService.recordCheckIfEnabled).not.toHaveBeenCalled();
2266
- });
2267
- });
2268
- describe('checkWorkspaceById', () => {
2269
- it('returns null when shutting down', async () => {
2270
- setRatchetShuttingDown(true);
2271
- const result = await ratchetService.checkWorkspaceById('ws-1');
2272
- expect(result).toBeNull();
2273
- });
2274
- it('returns null when workspace not found', async () => {
2275
- setRatchetShuttingDown(false);
2276
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(null);
2277
- const result = await ratchetService.checkWorkspaceById('ws-nonexistent');
2278
- expect(result).toBeNull();
2279
- });
2280
- it('skips the PR fetch when the workspace was recently fetched', async () => {
2281
- const workspace = {
2282
- id: 'ws-cooldown',
2283
- prUrl: 'https://github.com/example/repo/pull/9',
2284
- prNumber: 9,
2285
- prState: 'OPEN',
2286
- prReviewState: null,
2287
- prHasMergeConflict: false,
2288
- prCiStatus: CIStatus.UNKNOWN,
2289
- ratchetEnabled: true,
2290
- ratchetState: RatchetState.CI_RUNNING,
2291
- ratchetActiveSessionId: null,
2292
- ratchetDispatchSnapshotKey: null,
2293
- prReviewLastCheckedAt: null,
2294
- ratchetDispatchOutcome: null,
2295
- ratchetDispatchRetryCount: 0,
2296
- };
2297
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
2298
- vi.mocked(mockGitHubBridge.extractPRInfo).mockReturnValue({
2299
- owner: 'example',
2300
- repo: 'repo',
2301
- number: 9,
2302
- });
2303
- fakeCoordinator.cooldownActive = true;
2304
- const result = await ratchetService.checkWorkspaceById('ws-cooldown');
2305
- expect(result?.action).toEqual({ type: 'WAITING', reason: 'recently_fetched' });
2306
- expect(mockGitHubBridge.getPRFullDetails).not.toHaveBeenCalled();
2307
- });
2308
- it('bypasses the PR fetch cooldown when requested by an event-driven check', async () => {
2309
- const workspace = {
2310
- id: 'ws-bypass',
2311
- prUrl: 'https://github.com/example/repo/pull/9',
2312
- prNumber: 9,
2313
- prState: 'OPEN',
2314
- prReviewState: null,
2315
- prHasMergeConflict: false,
2316
- prCiStatus: CIStatus.UNKNOWN,
2317
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
2318
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
2319
- ratchetEnabled: true,
2320
- ratchetState: RatchetState.CI_RUNNING,
2321
- ratchetActiveSessionId: null,
2322
- ratchetDispatchSnapshotKey: null,
2323
- prReviewLastCheckedAt: null,
2324
- ratchetDispatchOutcome: null,
2325
- ratchetDispatchRetryCount: 0,
2326
- };
2327
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
2328
- vi.mocked(mockGitHubBridge.extractPRInfo).mockReturnValue({
2329
- owner: 'example',
2330
- repo: 'repo',
2331
- number: 9,
2332
- });
2333
- fakeCoordinator.cooldownActive = true;
2334
- vi.mocked(mockGitHubBridge.getPRFullDetails).mockResolvedValue({
2335
- isDraft: false,
2336
- state: 'OPEN',
2337
- number: 9,
2338
- url: 'https://github.com/example/repo/pull/9',
2339
- reviewDecision: null,
2340
- mergeStateStatus: 'CLEAN',
2341
- reviews: [],
2342
- comments: [],
2343
- statusCheckRollup: null,
2344
- });
2345
- vi.mocked(mockGitHubBridge.getReviewComments).mockResolvedValue([]);
2346
- vi.mocked(mockGitHubBridge.computeCIStatus).mockReturnValue(CIStatus.SUCCESS);
2347
- const result = await ratchetService.checkWorkspaceById('ws-bypass', {
2348
- bypassPrFetchCooldown: true,
2349
- });
2350
- expect(mockGitHubBridge.getPRFullDetails).toHaveBeenCalledWith('example/repo', 9, expect.any(AbortSignal));
2351
- expect(result?.newState).toBe(RatchetState.READY);
2352
- expect(result?.action).not.toEqual({ type: 'WAITING', reason: 'recently_fetched' });
2353
- });
2354
- it('reruns a bypassed check once when the first attempt was dedup-skipped', async () => {
2355
- const workspace = {
2356
- id: 'ws-rerun',
2357
- prUrl: 'https://github.com/example/repo/pull/9',
2358
- prNumber: 9,
2359
- prState: 'OPEN',
2360
- prReviewState: null,
2361
- prHasMergeConflict: false,
2362
- prCiStatus: CIStatus.UNKNOWN,
2363
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
2364
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
2365
- ratchetEnabled: true,
2366
- ratchetState: RatchetState.CI_RUNNING,
2367
- ratchetActiveSessionId: null,
2368
- ratchetDispatchSnapshotKey: null,
2369
- prReviewLastCheckedAt: null,
2370
- ratchetDispatchOutcome: null,
2371
- ratchetDispatchRetryCount: 0,
2372
- };
2373
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
2374
- vi.mocked(mockGitHubBridge.extractPRInfo).mockReturnValue({
2375
- owner: 'example',
2376
- repo: 'repo',
2377
- number: 9,
2378
- });
2379
- fakeCoordinator.inFlightSkips = 1;
2380
- vi.mocked(mockGitHubBridge.getPRFullDetails).mockResolvedValue({
2381
- isDraft: false,
2382
- state: 'OPEN',
2383
- number: 9,
2384
- url: 'https://github.com/example/repo/pull/9',
2385
- reviewDecision: null,
2386
- mergeStateStatus: 'CLEAN',
2387
- reviews: [],
2388
- comments: [],
2389
- statusCheckRollup: null,
2390
- });
2391
- vi.mocked(mockGitHubBridge.getReviewComments).mockResolvedValue([]);
2392
- vi.mocked(mockGitHubBridge.computeCIStatus).mockReturnValue(CIStatus.SUCCESS);
2393
- const result = await ratchetService.checkWorkspaceById('ws-rerun', {
2394
- bypassPrFetchCooldown: true,
2395
- });
2396
- expect(mockGitHubBridge.getPRFullDetails).toHaveBeenCalledTimes(1);
2397
- expect(result?.newState).toBe(RatchetState.READY);
2398
- expect(result?.action).not.toEqual({ type: 'WAITING', reason: 'recently_fetched' });
2399
- });
2400
- it('does not rerun a bypassed check more than once', async () => {
2401
- const workspace = {
2402
- id: 'ws-rerun-cap',
2403
- prUrl: 'https://github.com/example/repo/pull/9',
2404
- prNumber: 9,
2405
- prState: 'OPEN',
2406
- prReviewState: null,
2407
- prHasMergeConflict: false,
2408
- prCiStatus: CIStatus.UNKNOWN,
2409
- ratchetEnabled: true,
2410
- ratchetState: RatchetState.CI_RUNNING,
2411
- ratchetActiveSessionId: null,
2412
- ratchetDispatchSnapshotKey: null,
2413
- prReviewLastCheckedAt: null,
2414
- ratchetDispatchOutcome: null,
2415
- ratchetDispatchRetryCount: 0,
2416
- };
2417
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
2418
- vi.mocked(mockGitHubBridge.extractPRInfo).mockReturnValue({
2419
- owner: 'example',
2420
- repo: 'repo',
2421
- number: 9,
2422
- });
2423
- fakeCoordinator.inFlightSkips = Number.POSITIVE_INFINITY;
2424
- const result = await ratchetService.checkWorkspaceById('ws-rerun-cap', {
2425
- bypassPrFetchCooldown: true,
2426
- });
2427
- expect(result?.action).toEqual({ type: 'WAITING', reason: 'recently_fetched' });
2428
- expect(mockGitHubBridge.coordinatePrFetch).toHaveBeenCalledTimes(2);
2429
- expect(mockGitHubBridge.getPRFullDetails).not.toHaveBeenCalled();
2430
- });
2431
- it('deduplicates concurrent checks for the same workspace', async () => {
2432
- setRatchetShuttingDown(false);
2433
- const workspace = {
2434
- id: 'ws-1',
2435
- prUrl: 'https://github.com/example/repo/pull/1',
2436
- prNumber: 1,
2437
- prState: 'OPEN',
2438
- prReviewState: null,
2439
- prHasMergeConflict: false,
2440
- prCiStatus: CIStatus.UNKNOWN,
2441
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
2442
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
2443
- ratchetEnabled: true,
2444
- ratchetState: RatchetState.IDLE,
2445
- ratchetActiveSessionId: null,
2446
- ratchetDispatchSnapshotKey: null,
2447
- prReviewLastCheckedAt: null,
2448
- ratchetDispatchOutcome: null,
2449
- ratchetDispatchRetryCount: 0,
2450
- };
2451
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
2452
- let releaseCheck;
2453
- const checkBarrier = new Promise((resolve) => {
2454
- releaseCheck = () => resolve();
2455
- });
2456
- const result = {
2457
- workspaceId: 'ws-1',
2458
- previousState: RatchetState.IDLE,
2459
- newState: RatchetState.IDLE,
2460
- action: { type: 'WAITING', reason: 'noop' },
2461
- };
2462
- const processWorkspaceSpy = vi
2463
- .spyOn(unsafeCoerce(ratchetService), 'processWorkspace')
2464
- .mockImplementation(async () => {
2465
- await checkBarrier;
2466
- return result;
2467
- });
2468
- const first = ratchetService.checkWorkspaceById('ws-1');
2469
- const second = ratchetService.checkWorkspaceById('ws-1');
2470
- await vi.waitFor(() => expect(processWorkspaceSpy).toHaveBeenCalledTimes(1));
2471
- expect(processWorkspaceSpy).toHaveBeenCalledTimes(1);
2472
- releaseCheck();
2473
- const [firstResult, secondResult] = await Promise.all([first, second]);
2474
- expect(firstResult).toEqual(result);
2475
- expect(secondResult).toEqual(result);
2476
- expect(processWorkspaceSpy).toHaveBeenCalledTimes(1);
2477
- });
2478
- it('deduplicates a same-workspace check before it enters the concurrency queue', async () => {
2479
- const makeWorkspace = (id) => ({
2480
- id,
2481
- prUrl: `https://github.com/example/repo/pull/${id}`,
2482
- prNumber: 1,
2483
- ratchetEnabled: true,
2484
- ratchetState: RatchetState.IDLE,
2485
- });
2486
- const workspaces = [
2487
- makeWorkspace('blocker-1'),
2488
- makeWorkspace('blocker-2'),
2489
- makeWorkspace('blocker-3'),
2490
- makeWorkspace('queued-target'),
2491
- ];
2492
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue(workspaces);
2493
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspaces[3]);
2494
- let releaseBlockers;
2495
- const blockerBarrier = new Promise((resolve) => {
2496
- releaseBlockers = resolve;
2497
- });
2498
- let activeBlockers = 0;
2499
- let targetRuns = 0;
2500
- vi.spyOn(unsafeCoerce(ratchetService), 'processWorkspace').mockImplementation(async (workspace) => {
2501
- if (workspace.id.startsWith('blocker-')) {
2502
- activeBlockers += 1;
2503
- await blockerBarrier;
2504
- }
2505
- else {
2506
- targetRuns += 1;
2507
- }
2508
- return {
2509
- workspaceId: workspace.id,
2510
- previousState: RatchetState.IDLE,
2511
- newState: RatchetState.IDLE,
2512
- action: { type: 'WAITING', reason: 'noop' },
2513
- };
2514
- });
2515
- const batch = ratchetService.checkAllWorkspaces();
2516
- await vi.waitFor(() => expect(activeBlockers).toBe(3));
2517
- const direct = ratchetService.checkWorkspaceById('queued-target');
2518
- await Promise.resolve();
2519
- expect(targetRuns).toBe(0);
2520
- releaseBlockers();
2521
- const [batchResult, directResult] = await Promise.all([batch, direct]);
2522
- expect(targetRuns).toBe(1);
2523
- expect(directResult).toEqual(batchResult.results[3]);
2524
- });
2525
- it('keeps a limiter slot occupied until a timed-out runner finishes cleanup', async () => {
2526
- unsafeCoerce(ratchetService).workspaceCheckTimeoutMs = 5;
2527
- const makeWorkspace = (id) => ({
2528
- id,
2529
- prUrl: `https://github.com/example/repo/pull/${id}`,
2530
- prNumber: 1,
2531
- ratchetEnabled: true,
2532
- ratchetState: RatchetState.IDLE,
2533
- });
2534
- const workspaces = [
2535
- makeWorkspace('timed-out-1'),
2536
- makeWorkspace('timed-out-2'),
2537
- makeWorkspace('timed-out-3'),
2538
- makeWorkspace('after-timeouts'),
2539
- ];
2540
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue(workspaces);
2541
- let finishCleanup;
2542
- const cleanupBarrier = new Promise((resolve) => {
2543
- finishCleanup = resolve;
2544
- });
2545
- let activeTimedOutChecks = 0;
2546
- let targetRuns = 0;
2547
- vi.spyOn(unsafeCoerce(ratchetService), 'processWorkspace').mockImplementation(async (workspace, _opts, signal) => {
2548
- if (workspace.id.startsWith('timed-out-')) {
2549
- activeTimedOutChecks += 1;
2550
- await new Promise((resolve) => {
2551
- signal.addEventListener('abort', () => resolve(), { once: true });
2552
- });
2553
- await cleanupBarrier;
2554
- signal.throwIfAborted();
2555
- }
2556
- targetRuns += workspace.id === 'after-timeouts' ? 1 : 0;
2557
- return {
2558
- workspaceId: workspace.id,
2559
- previousState: RatchetState.IDLE,
2560
- newState: RatchetState.IDLE,
2561
- action: { type: 'WAITING', reason: 'noop' },
2562
- };
2563
- });
2564
- const batch = ratchetService.checkAllWorkspaces();
2565
- await vi.waitFor(() => expect(activeTimedOutChecks).toBe(3));
2566
- await new Promise((resolve) => setTimeout(resolve, 10));
2567
- expect(targetRuns).toBe(0);
2568
- finishCleanup();
2569
- await batch;
2570
- expect(targetRuns).toBe(1);
2571
- });
2572
- it('runs a direct workspace check without waiting for the batch limiter', async () => {
2573
- const makeWorkspace = (id) => ({
2574
- id,
2575
- prUrl: `https://github.com/example/repo/pull/${id}`,
2576
- prNumber: 1,
2577
- ratchetEnabled: true,
2578
- ratchetState: RatchetState.IDLE,
2579
- });
2580
- const batchWorkspaces = [
2581
- makeWorkspace('batch-blocker-1'),
2582
- makeWorkspace('batch-blocker-2'),
2583
- makeWorkspace('batch-blocker-3'),
2584
- ];
2585
- const directWorkspace = makeWorkspace('direct-target');
2586
- vi.mocked(workspaceRatchetService.findCandidates).mockResolvedValue(batchWorkspaces);
2587
- vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(directWorkspace);
2588
- let releaseBatch;
2589
- const batchBarrier = new Promise((resolve) => {
2590
- releaseBatch = resolve;
2591
- });
2592
- let activeBatchChecks = 0;
2593
- let directRuns = 0;
2594
- vi.spyOn(unsafeCoerce(ratchetService), 'processWorkspace').mockImplementation(async (workspace) => {
2595
- if (workspace.id.startsWith('batch-blocker-')) {
2596
- activeBatchChecks += 1;
2597
- await batchBarrier;
2598
- }
2599
- else {
2600
- directRuns += 1;
2601
- }
2602
- return {
2603
- workspaceId: workspace.id,
2604
- previousState: RatchetState.IDLE,
2605
- newState: RatchetState.IDLE,
2606
- action: { type: 'WAITING', reason: 'noop' },
2607
- };
2608
- });
2609
- const batch = ratchetService.checkAllWorkspaces();
2610
- await vi.waitFor(() => expect(activeBatchChecks).toBe(3));
2611
- const directResult = await ratchetService.checkWorkspaceById(directWorkspace.id);
2612
- expect(directRuns).toBe(1);
2613
- expect(directResult?.workspaceId).toBe(directWorkspace.id);
2614
- releaseBatch();
2615
- await batch;
2616
- });
2617
- });
2618
- describe('decideRatchetAction edge cases', () => {
2619
- const callDecide = (context) => unsafeCoerce(ratchetService).decideRatchetAction(context);
2620
- const arrangeOtherWorkingSession = () => {
2621
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([
2622
- { id: 'other-session' },
2623
- ]);
2624
- vi.mocked(mockSessionBridge.isSessionWorking).mockReturnValue(true);
2625
- };
2626
- it('returns COMPLETED for merged PR', async () => {
2627
- expect(await callDecide({
2628
- workspace: { id: 'ws-decide', ratchetEnabled: true },
2629
- prStateInfo: { prState: 'MERGED', ciStatus: CIStatus.SUCCESS },
2630
- isCleanPrWithNoNewReviewActivity: false,
2631
- activeFixerCheck: { kind: 'none' },
2632
- dispatchOutcome: null,
2633
- dispatchRetryCount: 0,
2634
- hasStateChangedSinceLastDispatch: true,
2635
- })).toEqual({ type: 'RETURN_ACTION', action: { type: 'COMPLETED' } });
2636
- });
2637
- it('returns WAITING for non-open PR', async () => {
2638
- const result = (await callDecide({
2639
- workspace: { id: 'ws-decide', ratchetEnabled: true },
2640
- prStateInfo: { prState: 'CLOSED', ciStatus: CIStatus.SUCCESS },
2641
- isCleanPrWithNoNewReviewActivity: false,
2642
- activeFixerCheck: { kind: 'none' },
2643
- dispatchOutcome: null,
2644
- dispatchRetryCount: 0,
2645
- hasStateChangedSinceLastDispatch: true,
2646
- }));
2647
- expect(result.action?.reason).toBe('PR is not open');
2648
- });
2649
- it('returns active session when one exists', async () => {
2650
- const activeSession = { type: 'FIXER_ACTIVE', sessionId: 's-1' };
2651
- const result = (await callDecide({
2652
- workspace: { id: 'ws-decide', ratchetEnabled: true },
2653
- prStateInfo: { prState: 'OPEN', ciStatus: CIStatus.FAILURE },
2654
- isCleanPrWithNoNewReviewActivity: false,
2655
- activeFixerCheck: { kind: 'active', action: activeSession },
2656
- dispatchOutcome: 'RUNNING',
2657
- dispatchRetryCount: 0,
2658
- hasStateChangedSinceLastDispatch: true,
2659
- }));
2660
- expect(result.action).toEqual(activeSession);
2661
- });
2662
- it('returns WAITING when other active session blocks dispatch', async () => {
2663
- arrangeOtherWorkingSession();
2664
- const result = (await callDecide({
2665
- workspace: { id: 'ws-decide', ratchetEnabled: true },
2666
- prStateInfo: { prState: 'OPEN', ciStatus: CIStatus.FAILURE },
2667
- isCleanPrWithNoNewReviewActivity: false,
2668
- activeFixerCheck: { kind: 'none' },
2669
- dispatchOutcome: null,
2670
- dispatchRetryCount: 0,
2671
- hasStateChangedSinceLastDispatch: true,
2672
- }));
2673
- expect(result.action?.reason).toBe('Workspace has another working session');
2674
- });
2675
- it('returns WAITING when there are no CI failures or PR review comments', async () => {
2676
- const result = (await callDecide({
2677
- workspace: { id: 'ws-decide', ratchetEnabled: true },
2678
- prStateInfo: {
2679
- prState: 'OPEN',
2680
- ciStatus: CIStatus.SUCCESS,
2681
- reviewComments: [],
2682
- },
2683
- isCleanPrWithNoNewReviewActivity: false,
2684
- activeFixerCheck: { kind: 'none' },
2685
- dispatchOutcome: null,
2686
- dispatchRetryCount: 0,
2687
- hasStateChangedSinceLastDispatch: true,
2688
- }));
2689
- expect(result.action?.reason).toBe('No CI failures or PR review comments to address');
2690
- });
2691
- it('waits when the fixer ended concurrently during the check', async () => {
2692
- const result = (await callDecide({
2693
- workspace: { id: 'ws-decide', ratchetEnabled: true },
2694
- prStateInfo: { prState: 'OPEN', ciStatus: CIStatus.FAILURE },
2695
- isCleanPrWithNoNewReviewActivity: false,
2696
- activeFixerCheck: { kind: 'ended_concurrently' },
2697
- dispatchOutcome: 'COMPLETED',
2698
- dispatchRetryCount: 0,
2699
- hasStateChangedSinceLastDispatch: false,
2700
- }));
2701
- expect(result.action?.reason).toBe('Fixer session ended during this check; re-evaluating next cycle');
2702
- });
2703
- it('retries a died fixer ahead of the unchanged-state gate', async () => {
2704
- const result = await callDecide({
2705
- workspace: { id: 'ws-decide', ratchetEnabled: true },
2706
- prStateInfo: { prState: 'OPEN', ciStatus: CIStatus.FAILURE },
2707
- isCleanPrWithNoNewReviewActivity: false,
2708
- activeFixerCheck: { kind: 'settled', outcome: 'DIED' },
2709
- dispatchOutcome: 'DIED',
2710
- dispatchRetryCount: 2,
2711
- hasStateChangedSinceLastDispatch: false,
2712
- });
2713
- expect(result).toEqual({ type: 'TRIGGER_FIXER', retryCount: 3 });
2714
- });
2715
- it('does not retry a died fixer while another session is working', async () => {
2716
- arrangeOtherWorkingSession();
2717
- const result = (await callDecide({
2718
- workspace: { id: 'ws-decide', ratchetEnabled: true },
2719
- prStateInfo: { prState: 'OPEN', ciStatus: CIStatus.FAILURE },
2720
- isCleanPrWithNoNewReviewActivity: false,
2721
- activeFixerCheck: { kind: 'settled', outcome: 'DIED' },
2722
- dispatchOutcome: 'DIED',
2723
- dispatchRetryCount: 0,
2724
- hasStateChangedSinceLastDispatch: false,
2725
- }));
2726
- expect(result.action?.reason).toBe('Workspace has another working session');
2727
- });
2728
- it('gives up on a died fixer once the retry budget is spent', async () => {
2729
- const result = (await callDecide({
2730
- workspace: { id: 'ws-decide', ratchetEnabled: true },
2731
- prStateInfo: { prState: 'OPEN', ciStatus: CIStatus.FAILURE },
2732
- isCleanPrWithNoNewReviewActivity: false,
2733
- activeFixerCheck: { kind: 'none' },
2734
- dispatchOutcome: 'DIED',
2735
- dispatchRetryCount: 3,
2736
- hasStateChangedSinceLastDispatch: false,
2737
- }));
2738
- expect(result.action?.reason).toBe('Fixer died 4 times for this PR state; waiting for PR state to change');
2739
- });
2740
- });
2741
- describe('checkActiveFixerSession edge cases', () => {
2742
- const callCheckActiveFixerSession = (workspace) => unsafeCoerce(ratchetService).checkActiveFixerSession(workspace);
2743
- it('returns none when ratchetActiveSessionId is null', async () => {
2744
- const result = await callCheckActiveFixerSession({
2745
- id: 'ws-1',
2746
- ratchetActiveSessionId: null,
2747
- });
2748
- expect(result).toEqual({ kind: 'none' });
2749
- });
2750
- it('settles a non-RUNNING session as COMPLETED when its status is not FAILED', async () => {
2751
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue({
2752
- id: 'completed-session',
2753
- provider: 'CLAUDE',
2754
- status: SessionStatus.IDLE,
2755
- });
2756
- const result = await callCheckActiveFixerSession({
2757
- id: 'ws-3',
2758
- ratchetActiveSessionId: 'completed-session',
2759
- });
2760
- expect(result).toEqual({ kind: 'settled', outcome: 'COMPLETED' });
2761
- expect(mockWorkspaceBridge.recordSessionEnd).toHaveBeenCalledWith('ws-3', 'completed-session', 'COMPLETED');
2762
- });
2763
- it('settles a FAILED session as DIED', async () => {
2764
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue({
2765
- id: 'failed-session',
2766
- provider: 'CLAUDE',
2767
- status: SessionStatus.FAILED,
2768
- });
2769
- const result = await callCheckActiveFixerSession({
2770
- id: 'ws-4',
2771
- ratchetActiveSessionId: 'failed-session',
2772
- });
2773
- expect(result).toEqual({ kind: 'settled', outcome: 'DIED' });
2774
- expect(mockWorkspaceBridge.recordSessionEnd).toHaveBeenCalledWith('ws-4', 'failed-session', 'DIED');
2775
- });
2776
- it('waits for provider-mismatch cleanup before returning a successful settlement', async () => {
2777
- let finishStop;
2778
- const pendingStop = new Promise((resolve) => {
2779
- finishStop = resolve;
2780
- });
2781
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue({
2782
- id: 'codex-session',
2783
- provider: 'CODEX',
2784
- status: SessionStatus.RUNNING,
2785
- });
2786
- vi.mocked(mockSessionBridge.stopSession).mockReturnValue(pendingStop);
2787
- const check = callCheckActiveFixerSession({
2788
- id: 'ws-5',
2789
- ratchetActiveSessionId: 'codex-session',
2790
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
2791
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
2792
- });
2793
- await vi.waitFor(() => expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('codex-session'));
2794
- await expect(Promise.race([check, Promise.resolve({ kind: 'cleanup_pending' })])).resolves.toEqual({ kind: 'cleanup_pending' });
2795
- expect(mockWorkspaceBridge.recordSessionEnd).toHaveBeenCalledWith('ws-5', 'codex-session', 'DIED');
2796
- finishStop();
2797
- await expect(check).resolves.toEqual({ kind: 'settled', outcome: 'DIED' });
2798
- });
2799
- it('returns cancellation without waiting for provider-mismatch cleanup', async () => {
2800
- const controller = new AbortController();
2801
- const timeoutError = new Error('Workspace check timed out');
2802
- let finishStop;
2803
- const pendingStop = new Promise((resolve) => {
2804
- finishStop = resolve;
2805
- });
2806
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue({
2807
- id: 'codex-session',
2808
- provider: 'CODEX',
2809
- status: SessionStatus.RUNNING,
2810
- });
2811
- vi.mocked(mockSessionBridge.stopSession).mockReturnValue(pendingStop);
2812
- vi.mocked(mockWorkspaceBridge.recordSessionEnd).mockImplementation(() => {
2813
- controller.abort(timeoutError);
2814
- return Promise.resolve(true);
2815
- });
2816
- const check = unsafeCoerce(ratchetService).checkActiveFixerSession({
2817
- id: 'ws-provider-mismatch-cancelled-after-settlement',
2818
- ratchetActiveSessionId: 'codex-session',
2819
- defaultSessionProvider: 'WORKSPACE_DEFAULT',
2820
- ratchetSessionProvider: 'WORKSPACE_DEFAULT',
2821
- }, controller.signal);
2822
- const outcome = check.then((value) => ({ status: 'resolved', value }), (error) => ({ status: 'rejected', error }));
2823
- await vi.waitFor(() => expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('codex-session'));
2824
- await expect(Promise.race([outcome, Promise.resolve({ status: 'pending' })])).resolves.toEqual({ status: 'rejected', error: timeoutError });
2825
- expect(mockWorkspaceBridge.recordSessionEnd).toHaveBeenCalledWith('ws-provider-mismatch-cancelled-after-settlement', 'codex-session', 'DIED');
2826
- finishStop();
2827
- await pendingStop;
2828
- });
2829
- it('stops completed session even when abort fires after settlement', async () => {
2830
- const controller = new AbortController();
2831
- const timeoutError = new Error('Workspace check timed out');
2832
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue({
2833
- id: 'completed-session',
2834
- provider: 'CLAUDE',
2835
- status: SessionStatus.RUNNING,
2836
- });
2837
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
2838
- vi.mocked(mockSessionBridge.isSessionWorking).mockReturnValue(false);
2839
- vi.mocked(mockSessionBridge.stopSession).mockResolvedValue();
2840
- vi.mocked(mockWorkspaceBridge.recordSessionEnd).mockImplementation(() => {
2841
- controller.abort(timeoutError);
2842
- return Promise.resolve(true);
2843
- });
2844
- const check = unsafeCoerce(ratchetService).checkActiveFixerSession({
2845
- id: 'ws-completed-aborted-after-settlement',
2846
- ratchetActiveSessionId: 'completed-session',
2847
- defaultSessionProvider: 'CLAUDE',
2848
- ratchetSessionProvider: 'CLAUDE',
2849
- }, controller.signal);
2850
- await expect(check).rejects.toBe(timeoutError);
2851
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('completed-session');
2852
- });
2853
- it('returns the active fixer when the session is working', async () => {
2854
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue({
2855
- id: 'working-session',
2856
- provider: 'CLAUDE',
2857
- status: SessionStatus.RUNNING,
2858
- });
2859
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
2860
- vi.mocked(mockSessionBridge.isSessionWorking).mockReturnValue(true);
2861
- const result = await callCheckActiveFixerSession({
2862
- id: 'ws-6',
2863
- ratchetActiveSessionId: 'working-session',
2864
- });
2865
- expect(result).toEqual({
2866
- kind: 'active',
2867
- action: { type: 'FIXER_ACTIVE', sessionId: 'working-session' },
2868
- });
2869
- expect(mockWorkspaceBridge.recordSessionEnd).not.toHaveBeenCalled();
2870
- });
2871
- it('does not settle or stop a fixer after cancellation during session lookup', async () => {
2872
- const controller = new AbortController();
2873
- const timeoutError = new Error('Workspace check timed out');
2874
- let finishLookup;
2875
- vi.mocked(mockSessionBridge.findSessionById).mockImplementation(() => new Promise((resolve) => {
2876
- finishLookup = resolve;
2877
- }));
2878
- const check = unsafeCoerce(ratchetService).checkActiveFixerSession({
2879
- id: 'ws-cancelled-active-check',
2880
- ratchetActiveSessionId: 'session-1',
2881
- }, controller.signal);
2882
- await vi.waitFor(() => expect(mockSessionBridge.findSessionById).toHaveBeenCalled());
2883
- controller.abort(timeoutError);
2884
- finishLookup(null);
2885
- await expect(check).rejects.toBe(timeoutError);
2886
- expect(mockWorkspaceBridge.recordSessionEnd).not.toHaveBeenCalled();
2887
- expect(mockSessionBridge.stopSession).not.toHaveBeenCalled();
2888
- });
2889
- it('publishes a successful fallback settlement before observing post-write cancellation', async () => {
2890
- const controller = new AbortController();
2891
- const timeoutError = new Error('Workspace check timed out');
2892
- vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue(null);
2893
- vi.mocked(mockWorkspaceBridge.recordSessionEnd).mockImplementation(() => {
2894
- controller.abort(timeoutError);
2895
- return Promise.resolve(true);
2896
- });
2897
- const events = [];
2898
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
2899
- events.push(event);
2900
- });
2901
- const check = unsafeCoerce(ratchetService).checkActiveFixerSession({
2902
- id: 'ws-cancelled-after-settlement',
2903
- ratchetActiveSessionId: 'session-1',
2904
- ratchetDispatchRetryCount: 2,
2905
- }, controller.signal);
2906
- await expect(check).rejects.toBe(timeoutError);
2907
- expect(events).toEqual([{ workspaceId: 'ws-cancelled-after-settlement' }]);
2908
- });
2909
- });
2910
- describe('triggerFixer error handling', () => {
2911
- it('commits the workspace check as soon as the fixer session starts', async () => {
2912
- const commitSideEffects = vi.fn();
2913
- vi.mocked(fixerSessionService.acquireAndDispatch).mockImplementation(async (input) => {
2914
- await input.afterStart?.({ sessionId: 'started-session', prompt: 'prompt' });
2915
- return {
2916
- status: 'started',
2917
- sessionId: 'started-session',
2918
- promptSent: true,
2919
- };
2920
- });
2921
- const result = await unsafeCoerce(ratchetService).triggerFixer({
2922
- id: 'ws-started-dispatch',
2923
- prUrl: 'https://github.com/example/repo/pull/20',
2924
- }, {
2925
- ciStatus: CIStatus.FAILURE,
2926
- snapshotKey: 'failed:20',
2927
- prNumber: 20,
2928
- reviewComments: [],
2929
- hasMergeConflict: false,
2930
- }, 0, new AbortController().signal, commitSideEffects);
2931
- expect(result).toMatchObject({
2932
- type: 'TRIGGERED_FIXER',
2933
- sessionId: 'started-session',
2934
- });
2935
- expect(commitSideEffects).toHaveBeenCalledTimes(2);
2936
- });
2937
- it('cleans up a fixer when cancellation races with session startup', async () => {
2938
- const controller = new AbortController();
2939
- const timeoutError = new Error('Workspace check timed out');
2940
- const commitSideEffects = vi.fn();
2941
- vi.mocked(fixerSessionService.acquireAndDispatch).mockImplementation(async (input) => {
2942
- controller.abort(timeoutError);
2943
- try {
2944
- await input.afterStart?.({ sessionId: 'cancelled-startup-session', prompt: 'prompt' });
2945
- return {
2946
- status: 'started',
2947
- sessionId: 'cancelled-startup-session',
2948
- promptSent: true,
2949
- };
2950
- }
2951
- catch (error) {
2952
- return {
2953
- status: 'error',
2954
- error: error instanceof Error ? error.message : String(error),
2955
- };
2956
- }
2957
- });
2958
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
2959
- const trigger = unsafeCoerce(ratchetService).triggerFixer({
2960
- id: 'ws-cancelled-startup',
2961
- prUrl: 'https://github.com/example/repo/pull/20',
2962
- }, {
2963
- ciStatus: CIStatus.FAILURE,
2964
- snapshotKey: 'failed:20',
2965
- prNumber: 20,
2966
- reviewComments: [],
2967
- hasMergeConflict: false,
2968
- }, 0, controller.signal, commitSideEffects);
2969
- await expect(trigger).rejects.toBe(timeoutError);
2970
- expect(commitSideEffects).toHaveBeenCalledTimes(1);
2971
- expect(workspaceRatchetService.recordSessionEnd).toHaveBeenCalledWith('ws-cancelled-startup', 'cancelled-startup-session', 'COMPLETED');
2972
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('cancelled-startup-session');
2973
- });
2974
- it('does not clean up a fixer after its dispatch record is persisted', async () => {
2975
- const controller = new AbortController();
2976
- const timeoutError = new Error('Workspace check timed out');
2977
- let finishRecord;
2978
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
2979
- status: 'started',
2980
- sessionId: 'cancelled-session',
2981
- promptSent: true,
2982
- });
2983
- vi.mocked(workspaceRatchetService.recordDispatchIfEnabled).mockImplementation(() => new Promise((resolve) => {
2984
- finishRecord = resolve;
2985
- }));
2986
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
2987
- const commitSideEffects = vi.fn();
2988
- const events = [];
2989
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
2990
- events.push(event);
2991
- });
2992
- const trigger = unsafeCoerce(ratchetService).triggerFixer({
2993
- id: 'ws-cancelled-dispatch',
2994
- prUrl: 'https://github.com/example/repo/pull/20',
2995
- }, {
2996
- ciStatus: CIStatus.FAILURE,
2997
- snapshotKey: 'failed:20',
2998
- prNumber: 20,
2999
- reviewComments: [],
3000
- hasMergeConflict: false,
3001
- }, 0, controller.signal, commitSideEffects);
3002
- await vi.waitFor(() => expect(workspaceRatchetService.recordDispatchIfEnabled).toHaveBeenCalled());
3003
- controller.abort(timeoutError);
3004
- finishRecord(true);
3005
- await expect(trigger).rejects.toBe(timeoutError);
3006
- expect(commitSideEffects).toHaveBeenCalledTimes(1);
3007
- expect(workspaceRatchetService.recordSessionEnd).not.toHaveBeenCalled();
3008
- expect(mockSessionBridge.stopSession).not.toHaveBeenCalled();
3009
- expect(events).toEqual([{ workspaceId: 'ws-cancelled-dispatch' }]);
3010
- });
3011
- it('persists and commits a dispatch while prompt completion is pending', async () => {
3012
- let finishPrompt;
3013
- const promptCompletion = new Promise((resolve) => {
3014
- finishPrompt = resolve;
3015
- });
3016
- let finishRecord;
3017
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
3018
- status: 'started',
3019
- sessionId: 'pending-prompt-session',
3020
- promptSent: true,
3021
- promptCompletion,
3022
- });
3023
- vi.mocked(workspaceRatchetService.recordDispatchIfEnabled).mockImplementation(() => new Promise((resolve) => {
3024
- finishRecord = resolve;
3025
- }));
3026
- const commitSideEffects = vi.fn();
3027
- const trigger = unsafeCoerce(ratchetService).triggerFixer({
3028
- id: 'ws-pending-prompt',
3029
- prUrl: 'https://github.com/example/repo/pull/20',
3030
- }, {
3031
- ciStatus: CIStatus.FAILURE,
3032
- snapshotKey: 'failed:20',
3033
- prNumber: 20,
3034
- reviewComments: [],
3035
- hasMergeConflict: false,
3036
- }, 0, new AbortController().signal, commitSideEffects);
3037
- await vi.waitFor(() => expect(workspaceRatchetService.recordDispatchIfEnabled).toHaveBeenCalled());
3038
- expect(commitSideEffects).toHaveBeenCalledTimes(1);
3039
- finishRecord(true);
3040
- await expect(trigger).resolves.toMatchObject({ type: 'TRIGGERED_FIXER' });
3041
- expect(commitSideEffects).toHaveBeenCalledTimes(1);
3042
- finishPrompt(true);
3043
- await promptCompletion;
3044
- });
3045
- it('settles a persisted dispatch as died when prompt completion fails', async () => {
3046
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
3047
- status: 'started',
3048
- sessionId: 'failed-prompt-session',
3049
- promptSent: true,
3050
- promptCompletion: Promise.resolve(false),
3051
- });
3052
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
3053
- const events = [];
3054
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
3055
- events.push(event);
3056
- });
3057
- const result = await unsafeCoerce(ratchetService).triggerFixer({
3058
- id: 'ws-failed-prompt',
3059
- prUrl: 'https://github.com/example/repo/pull/20',
3060
- }, {
3061
- ciStatus: CIStatus.FAILURE,
3062
- snapshotKey: 'failed:20',
3063
- prNumber: 20,
3064
- reviewComments: [],
3065
- hasMergeConflict: false,
3066
- }, 0);
3067
- expect(result).toMatchObject({ type: 'TRIGGERED_FIXER' });
3068
- await vi.waitFor(() => expect(workspaceRatchetService.recordSessionEnd).toHaveBeenCalledWith('ws-failed-prompt', 'failed-prompt-session', 'DIED'));
3069
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('failed-prompt-session');
3070
- await vi.waitFor(() => expect(events).toEqual([
3071
- { workspaceId: 'ws-failed-prompt' },
3072
- { workspaceId: 'ws-failed-prompt' },
3073
- ]));
3074
- });
3075
- it('does not stop a newer active session when an old prompt completion fails', async () => {
3076
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
3077
- status: 'started',
3078
- sessionId: 'stale-prompt-session',
3079
- promptSent: true,
3080
- promptCompletion: Promise.resolve(false),
3081
- });
3082
- vi.mocked(workspaceRatchetService.recordSessionEnd).mockResolvedValue(false);
3083
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
3084
- const events = [];
3085
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
3086
- events.push(event);
3087
- });
3088
- await unsafeCoerce(ratchetService).triggerFixer({
3089
- id: 'ws-replaced-prompt',
3090
- prUrl: 'https://github.com/example/repo/pull/20',
3091
- }, {
3092
- ciStatus: CIStatus.FAILURE,
3093
- snapshotKey: 'failed:20',
3094
- prNumber: 20,
3095
- reviewComments: [],
3096
- hasMergeConflict: false,
3097
- }, 0);
3098
- await vi.waitFor(() => expect(workspaceRatchetService.recordSessionEnd).toHaveBeenCalled());
3099
- expect(mockSessionBridge.stopSession).not.toHaveBeenCalled();
3100
- expect(events).toEqual([{ workspaceId: 'ws-replaced-prompt' }]);
3101
- });
3102
- it('cleans up a fixer through prompt failure after its dispatch record is persisted', async () => {
3103
- const controller = new AbortController();
3104
- const timeoutError = new Error('Workspace check timed out');
3105
- let finishRecord;
3106
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
3107
- status: 'started',
3108
- sessionId: 'cancelled-session',
3109
- promptSent: true,
3110
- promptCompletion: Promise.resolve(false),
3111
- });
3112
- vi.mocked(workspaceRatchetService.recordDispatchIfEnabled).mockImplementation(() => new Promise((resolve) => {
3113
- finishRecord = resolve;
3114
- }));
3115
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
3116
- const commitSideEffects = vi.fn();
3117
- const trigger = unsafeCoerce(ratchetService).triggerFixer({
3118
- id: 'ws-cancelled-dispatch',
3119
- prUrl: 'https://github.com/example/repo/pull/20',
3120
- }, {
3121
- ciStatus: CIStatus.FAILURE,
3122
- snapshotKey: 'failed:20',
3123
- prNumber: 20,
3124
- reviewComments: [],
3125
- hasMergeConflict: false,
3126
- }, 0, controller.signal, commitSideEffects);
3127
- await vi.waitFor(() => expect(workspaceRatchetService.recordDispatchIfEnabled).toHaveBeenCalled());
3128
- controller.abort(timeoutError);
3129
- finishRecord(true);
3130
- await expect(trigger).rejects.toBe(timeoutError);
3131
- expect(commitSideEffects).toHaveBeenCalledTimes(1);
3132
- await vi.waitFor(() => expect(workspaceRatchetService.recordSessionEnd).toHaveBeenCalledWith('ws-cancelled-dispatch', 'cancelled-session', 'DIED'));
3133
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('cancelled-session');
3134
- });
3135
- it('cleans up a started fixer when dispatch persistence fails', async () => {
3136
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
3137
- status: 'started',
3138
- sessionId: 'unrecorded-session',
3139
- promptSent: true,
3140
- });
3141
- vi.mocked(workspaceRatchetService.recordDispatchIfEnabled).mockRejectedValue(new Error('dispatch record write failed'));
3142
- vi.mocked(workspaceRatchetService.recordSessionEnd).mockRejectedValue(new Error('dispatch cleanup write failed'));
3143
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
3144
- const commitSideEffects = vi.fn();
3145
- const result = await unsafeCoerce(ratchetService).triggerFixer({
3146
- id: 'ws-unrecorded-dispatch',
3147
- prUrl: 'https://github.com/example/repo/pull/20',
3148
- }, {
3149
- ciStatus: CIStatus.FAILURE,
3150
- snapshotKey: 'failed:20',
3151
- prNumber: 20,
3152
- reviewComments: [],
3153
- hasMergeConflict: false,
3154
- }, 0, new AbortController().signal, commitSideEffects);
3155
- expect(result).toMatchObject({ type: 'ERROR', error: 'dispatch record write failed' });
3156
- expect(commitSideEffects).toHaveBeenCalledTimes(1);
3157
- expect(workspaceRatchetService.recordSessionEnd).toHaveBeenCalledWith('ws-unrecorded-dispatch', 'unrecorded-session', 'COMPLETED');
3158
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('unrecorded-session');
3159
- });
3160
- it('handles acquireAndDispatch throwing an error', async () => {
3161
- const workspace = {
3162
- id: 'ws-trigger-fail',
3163
- prUrl: 'https://github.com/example/repo/pull/20',
3164
- prNumber: 20,
3165
- ratchetEnabled: true,
3166
- ratchetState: RatchetState.CI_FAILED,
3167
- ratchetActiveSessionId: null,
3168
- ratchetDispatchSnapshotKey: null,
3169
- prReviewLastCheckedAt: null,
3170
- ratchetDispatchOutcome: null,
3171
- ratchetDispatchRetryCount: 0,
3172
- };
3173
- vi.mocked(fixerSessionService.acquireAndDispatch).mockRejectedValue(new Error('Session creation failed'));
3174
- const result = await unsafeCoerce(ratchetService).triggerFixer(workspace, {
3175
- ciStatus: CIStatus.FAILURE,
3176
- prNumber: 20,
3177
- }, 0);
3178
- expect(result).toMatchObject({
3179
- type: 'ERROR',
3180
- error: 'Session creation failed',
3181
- });
3182
- });
3183
- it('handles already_active result from acquireAndDispatch', async () => {
3184
- const workspace = {
3185
- id: 'ws-already-active',
3186
- prUrl: 'https://github.com/example/repo/pull/21',
3187
- prNumber: 21,
3188
- ratchetEnabled: true,
3189
- ratchetState: RatchetState.CI_FAILED,
3190
- ratchetActiveSessionId: null,
3191
- ratchetDispatchSnapshotKey: null,
3192
- prReviewLastCheckedAt: null,
3193
- ratchetDispatchOutcome: null,
3194
- ratchetDispatchRetryCount: 2,
3195
- };
3196
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
3197
- status: 'already_active',
3198
- sessionId: 'existing-session',
3199
- });
3200
- const events = [];
3201
- ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
3202
- events.push(event);
3203
- });
3204
- const result = await unsafeCoerce(ratchetService).triggerFixer(workspace, {
3205
- ciStatus: CIStatus.FAILURE,
3206
- prNumber: 21,
3207
- }, 0);
3208
- expect(result).toMatchObject({
3209
- type: 'FIXER_ACTIVE',
3210
- sessionId: 'existing-session',
3211
- });
3212
- expect(workspaceRatchetService.adoptActiveSessionIfEnabled).toHaveBeenCalledWith('ws-already-active', 'existing-session');
3213
- expect(workspaceRatchetService.recordDispatchIfEnabled).not.toHaveBeenCalled();
3214
- expect(events).toEqual([{ workspaceId: 'ws-already-active' }]);
3215
- });
3216
- it('stops already-active fixer when active-session recording loses disable race', async () => {
3217
- const workspace = {
3218
- id: 'ws-already-active-disabled',
3219
- prUrl: 'https://github.com/example/repo/pull/24',
3220
- prNumber: 24,
3221
- ratchetEnabled: true,
3222
- ratchetState: RatchetState.CI_FAILED,
3223
- ratchetActiveSessionId: null,
3224
- ratchetDispatchSnapshotKey: null,
3225
- prReviewLastCheckedAt: null,
3226
- ratchetDispatchOutcome: null,
3227
- ratchetDispatchRetryCount: 0,
3228
- };
3229
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
3230
- status: 'already_active',
3231
- sessionId: 'existing-session',
3232
- });
3233
- vi.mocked(workspaceRatchetService.adoptActiveSessionIfEnabled).mockResolvedValue(false);
3234
- vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
3235
- const result = await unsafeCoerce(ratchetService).triggerFixer(workspace, {
3236
- ciStatus: CIStatus.FAILURE,
3237
- prNumber: 24,
3238
- }, 0);
3239
- expect(result).toMatchObject({
3240
- type: 'DISABLED',
3241
- reason: 'Workspace ratcheting disabled',
3242
- });
3243
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('existing-session');
3244
- });
3245
- it('handles skipped result from acquireAndDispatch', async () => {
3246
- const workspace = {
3247
- id: 'ws-skipped',
3248
- prUrl: 'https://github.com/example/repo/pull/22',
3249
- prNumber: 22,
3250
- ratchetEnabled: true,
3251
- ratchetState: RatchetState.CI_FAILED,
3252
- ratchetActiveSessionId: null,
3253
- ratchetDispatchSnapshotKey: null,
3254
- prReviewLastCheckedAt: null,
3255
- ratchetDispatchOutcome: null,
3256
- ratchetDispatchRetryCount: 0,
3257
- };
3258
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
3259
- status: 'skipped',
3260
- reason: 'No worktree path',
3261
- });
3262
- const result = await unsafeCoerce(ratchetService).triggerFixer(workspace, {
3263
- ciStatus: CIStatus.FAILURE,
3264
- prNumber: 22,
3265
- }, 0);
3266
- expect(result).toMatchObject({
3267
- type: 'ERROR',
3268
- error: 'No worktree path',
3269
- });
3270
- });
3271
- });
3272
- describe('workspace ratchet toggle events', () => {
3273
- afterEach(() => {
3274
- ratchetService.removeAllListeners();
3275
- });
3276
- it('emits ratchet_toggled when enabling workspace ratcheting', async () => {
3277
- vi.mocked(workspaceDataService.findById).mockResolvedValue({
3278
- id: 'ws-enable',
3279
- ratchetState: RatchetState.CI_FAILED,
3280
- ratchetActiveSessionId: null,
3281
- ratchetDispatchOutcome: 'DIED',
3282
- ratchetDispatchRetryCount: 2,
3283
- });
3284
- const toggledEvents = [];
3285
- const stateEvents = [];
3286
- ratchetService.on(RATCHET_TOGGLED, (event) => {
3287
- toggledEvents.push(event);
3288
- });
3289
- ratchetService.on(RATCHET_STATE_CHANGED, (event) => {
3290
- stateEvents.push(event);
3291
- });
3292
- await ratchetService.setWorkspaceRatcheting('ws-enable', true);
3293
- expect(workspaceRatchetService.enable).toHaveBeenCalledWith('ws-enable');
3294
- expect(toggledEvents).toEqual([
3295
- {
3296
- workspaceId: 'ws-enable',
3297
- enabled: true,
3298
- ratchetState: RatchetState.CI_FAILED,
3299
- },
3300
- ]);
3301
- expect(stateEvents).toHaveLength(0);
3302
- });
3303
- it('emits ratchet_toggled and ratchet_state_changed when disabling non-idle workspace', async () => {
3304
- vi.mocked(workspaceDataService.findById).mockResolvedValue({
3305
- id: 'ws-disable',
3306
- ratchetState: RatchetState.CI_RUNNING,
3307
- ratchetActiveSessionId: null,
3308
- });
3309
- const toggledEvents = [];
3310
- const stateEvents = [];
3311
- ratchetService.on(RATCHET_TOGGLED, (event) => {
3312
- toggledEvents.push(event);
3313
- });
3314
- ratchetService.on(RATCHET_STATE_CHANGED, (event) => {
3315
- stateEvents.push(event);
3316
- });
3317
- await ratchetService.setWorkspaceRatcheting('ws-disable', false);
3318
- expect(workspaceRatchetService.disable).toHaveBeenCalledWith('ws-disable');
3319
- expect(stateEvents).toEqual([
3320
- {
3321
- workspaceId: 'ws-disable',
3322
- fromState: RatchetState.CI_RUNNING,
3323
- toState: RatchetState.IDLE,
3324
- },
3325
- ]);
3326
- expect(toggledEvents).toEqual([
3327
- {
3328
- workspaceId: 'ws-disable',
3329
- enabled: false,
3330
- ratchetState: RatchetState.IDLE,
3331
- },
3332
- ]);
3333
- });
3334
- it('stops ratchet workflow sessions found after disabling workspace', async () => {
3335
- vi.mocked(workspaceDataService.findById).mockResolvedValue({
3336
- id: 'ws-disable-raced-session',
3337
- ratchetState: RatchetState.CI_RUNNING,
3338
- ratchetActiveSessionId: null,
3339
- });
3340
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([
3341
- {
3342
- id: 'raced-ratchet-session',
3343
- workflow: 'ratchet',
3344
- status: SessionStatus.RUNNING,
3345
- },
3346
- {
3347
- id: 'manual-session',
3348
- workflow: 'default',
3349
- status: SessionStatus.RUNNING,
3350
- },
3351
- ]);
3352
- vi.mocked(mockSessionBridge.isSessionRunning).mockImplementation((sessionId) => sessionId === 'raced-ratchet-session');
3353
- await ratchetService.setWorkspaceRatcheting('ws-disable-raced-session', false);
3354
- expect(mockSessionBridge.findSessionsByWorkspaceId).toHaveBeenCalledWith('ws-disable-raced-session');
3355
- expect(mockSessionBridge.stopSession).toHaveBeenCalledTimes(1);
3356
- expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('raced-ratchet-session');
3357
- });
3358
- });
3359
- describe('event emission', () => {
3360
- afterEach(() => {
3361
- ratchetService.removeAllListeners();
3362
- });
3363
- it('never emits from a check on a disabled workspace', async () => {
3364
- const workspace = {
3365
- id: 'ws-disabled-idle',
3366
- prUrl: 'https://github.com/example/repo/pull/31',
3367
- prNumber: 31,
3368
- ratchetEnabled: false,
3369
- ratchetState: RatchetState.IDLE,
3370
- ratchetActiveSessionId: null,
3371
- ratchetDispatchSnapshotKey: null,
3372
- prReviewLastCheckedAt: null,
3373
- ratchetDispatchOutcome: null,
3374
- ratchetDispatchRetryCount: 0,
3375
- };
3376
- const events = [];
3377
- ratchetService.on(RATCHET_STATE_CHANGED, (event) => {
3378
- events.push(event);
3379
- });
3380
- await unsafeCoerce(ratchetService).processWorkspace(workspace);
3381
- expect(events).toHaveLength(0);
3382
- });
3383
- it('emits ratchet_state_changed on main path when state changes', async () => {
3384
- const workspace = {
3385
- id: 'ws-state-change',
3386
- prUrl: 'https://github.com/example/repo/pull/32',
3387
- prNumber: 32,
3388
- ratchetEnabled: true,
3389
- ratchetState: RatchetState.IDLE,
3390
- ratchetActiveSessionId: null,
3391
- ratchetDispatchSnapshotKey: null,
3392
- prReviewLastCheckedAt: null,
3393
- ratchetDispatchOutcome: null,
3394
- ratchetDispatchRetryCount: 0,
3395
- };
3396
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
3397
- ciStatus: CIStatus.FAILURE,
3398
- snapshotKey: 'new-snapshot-key',
3399
- hasChangesRequested: false,
3400
- latestReviewActivityAtMs: null,
3401
- statusCheckRollup: null,
3402
- prState: 'OPEN',
3403
- prNumber: 32,
3404
- });
3405
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
3406
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
3407
- status: 'started',
3408
- sessionId: 'ratchet-session-32',
3409
- promptSent: true,
3410
- });
3411
- const events = [];
3412
- ratchetService.on(RATCHET_STATE_CHANGED, (event) => {
3413
- events.push(event);
3414
- });
3415
- await unsafeCoerce(ratchetService).processWorkspace(workspace);
3416
- expect(events).toHaveLength(1);
3417
- expect(events[0]).toEqual({
3418
- workspaceId: 'ws-state-change',
3419
- fromState: RatchetState.IDLE,
3420
- toState: RatchetState.CI_FAILED,
3421
- prCiStatus: CIStatus.FAILURE,
3422
- });
3423
- });
3424
- it('does NOT emit when main path state unchanged', async () => {
3425
- const workspace = {
3426
- id: 'ws-no-change',
3427
- prUrl: 'https://github.com/example/repo/pull/33',
3428
- prNumber: 33,
3429
- ratchetEnabled: true,
3430
- ratchetState: RatchetState.CI_FAILED,
3431
- ratchetActiveSessionId: null,
3432
- ratchetDispatchSnapshotKey: null,
3433
- prReviewLastCheckedAt: null,
3434
- ratchetDispatchOutcome: null,
3435
- ratchetDispatchRetryCount: 0,
3436
- };
3437
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
3438
- ciStatus: CIStatus.FAILURE,
3439
- snapshotKey: 'new-snapshot-key',
3440
- hasChangesRequested: false,
3441
- latestReviewActivityAtMs: null,
3442
- statusCheckRollup: null,
3443
- prState: 'OPEN',
3444
- prNumber: 33,
3445
- });
3446
- vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
3447
- vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
3448
- status: 'started',
3449
- sessionId: 'ratchet-session-33',
3450
- promptSent: true,
3451
- });
3452
- const events = [];
3453
- ratchetService.on(RATCHET_STATE_CHANGED, (event) => {
3454
- events.push(event);
3455
- });
3456
- await unsafeCoerce(ratchetService).processWorkspace(workspace);
3457
- expect(events).toHaveLength(0);
3458
- });
3459
- it('does NOT emit on error path', async () => {
3460
- const workspace = {
3461
- id: 'ws-error',
3462
- prUrl: 'https://github.com/example/repo/pull/34',
3463
- prNumber: 34,
3464
- ratchetEnabled: true,
3465
- ratchetState: RatchetState.CI_FAILED,
3466
- ratchetActiveSessionId: null,
3467
- ratchetDispatchSnapshotKey: null,
3468
- prReviewLastCheckedAt: null,
3469
- ratchetDispatchOutcome: null,
3470
- ratchetDispatchRetryCount: 0,
3471
- };
3472
- vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue(null);
3473
- const events = [];
3474
- ratchetService.on(RATCHET_STATE_CHANGED, (event) => {
3475
- events.push(event);
3476
- });
3477
- const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
3478
- expect(result).toMatchObject({
3479
- action: { type: 'ERROR' },
3480
- });
3481
- expect(events).toHaveLength(0);
3482
- });
3483
- });
3484
- });
3485
- //# sourceMappingURL=ratchet.service.test.js.map