@cleocode/cleo 2026.10.4 → 2026.10.5-rc.ci.672

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 (331) hide show
  1. package/README.md +7 -0
  2. package/dist/cli/{adapter-LVXHFBC4.js → adapter-OUQRSFZL.js} +10 -9
  3. package/dist/cli/{add-WUAV7LDT.js → add-4SRRJL4U.js} +18 -18
  4. package/dist/cli/{add-batch-U2DLKAQC.js → add-batch-TSWICA5J.js} +12 -11
  5. package/dist/cli/admin-L3F6CDYH.js +1428 -0
  6. package/dist/cli/{admin-I7BQYVZD.js → admin-YMU55YCU.js} +10 -9
  7. package/dist/cli/{adr-K2THMQBS.js → adr-XESRMFMP.js} +10 -9
  8. package/dist/cli/{agent-WQ6XY2DW.js → agent-TAFPIYUU.js} +66 -28
  9. package/dist/cli/{agent-outputs-BJIYLVTU.js → agent-outputs-HVJJIPS4.js} +3 -3
  10. package/dist/cli/{analyze-PGQZWGOC.js → analyze-YQ22QVGW.js} +10 -9
  11. package/dist/cli/{archive-5LZPF7C3.js → archive-W5XX6AH7.js} +10 -9
  12. package/dist/cli/{archive-stats-U6CYC6JM.js → archive-stats-HP2KPAJU.js} +10 -9
  13. package/dist/cli/attention-7JBDCRZX.js +124 -0
  14. package/dist/cli/{attention-SOURWCNI.js → attention-ZXZANHKC.js} +13 -12
  15. package/dist/cli/{audit-FO2Y4LH2.js → audit-ICA2SEFN.js} +2 -2
  16. package/dist/cli/{auth-ED7TAIXI.js → auth-DXIG5OG7.js} +5 -5
  17. package/dist/cli/{backfill-32TRAYRD.js → backfill-LBSYBWLR.js} +2 -2
  18. package/dist/cli/{backup-LEJMZJKL.js → backup-NUGBZ7NA.js} +17 -16
  19. package/dist/cli/{backup-inspect-6HPLUEI2.js → backup-inspect-PDRXI45A.js} +3 -3
  20. package/dist/cli/{backup-recover-2BTYBZU2.js → backup-recover-TVKAPERB.js} +3 -3
  21. package/dist/cli/{blockers-5JULUJTV.js → blockers-ZOPCGHDW.js} +10 -9
  22. package/dist/cli/{brain-273N3FW4.js → brain-EJOBKL4A.js} +9 -12
  23. package/dist/cli/{briefing-7H6OLECX.js → briefing-RDQJ6WHS.js} +11 -10
  24. package/dist/cli/{caamp-MFQVN6VU.js → caamp-Z3XPKEHB.js} +2 -2
  25. package/dist/cli/{cancel-SCMJTXZB.js → cancel-S7EHLCJN.js} +10 -9
  26. package/dist/cli/{cant-46XCUP4P.js → cant-CHNN6O57.js} +2 -2
  27. package/dist/cli/{changeset-32NMBGG2.js → changeset-RYPHPN2B.js} +4 -6
  28. package/dist/cli/check-C67YAU7W.js +759 -0
  29. package/dist/cli/{check-RWJLBCI2.js → check-DHMURGHC.js} +30 -13
  30. package/dist/cli/{checkpoint-37HMMKD7.js → checkpoint-UWDFOGYQ.js} +3 -3
  31. package/dist/cli/{chunk-NRKWJLMS.js → chunk-22YPFZYB.js} +2 -2
  32. package/dist/cli/{chunk-I3CRQQAD.js → chunk-2MGFDMDF.js} +84 -37
  33. package/dist/cli/{chunk-BCEXRFA2.js → chunk-4JYHPP4C.js} +2 -2
  34. package/dist/cli/{chunk-A2IUEIM5.js → chunk-4PEODTHY.js} +2 -2
  35. package/dist/cli/{chunk-3ZO3M37V.js → chunk-4RGSNUUP.js} +118 -170
  36. package/dist/cli/{chunk-AWCQH2W5.js → chunk-4VASFLUW.js} +2 -2
  37. package/dist/cli/{chunk-BPEVD37G.js → chunk-5PNI276X.js} +2 -2
  38. package/dist/cli/{chunk-OGV57L4J.js → chunk-6N6WGLXE.js} +6 -2
  39. package/dist/cli/{chunk-KHB52JNB.js → chunk-75UH3BLS.js} +4 -3
  40. package/dist/cli/{chunk-5ZFFUFH7.js → chunk-7ACK4EIN.js} +2 -2
  41. package/dist/cli/{chunk-MNJRLSEQ.js → chunk-7NMKLVMI.js} +2 -2
  42. package/dist/cli/{chunk-GFGLLDXX.js → chunk-7SINJXB6.js} +2 -2
  43. package/dist/cli/{chunk-KJDWWQFY.js → chunk-7UARFJYS.js} +3 -3
  44. package/dist/cli/{chunk-JNZJPIPJ.js → chunk-7ZYPQV4N.js} +3 -3
  45. package/dist/cli/{chunk-DVTPIZJM.js → chunk-AQCYT3L4.js} +2 -2
  46. package/dist/cli/{chunk-EGOTK2HA.js → chunk-BQK6XTOH.js} +2 -2
  47. package/dist/cli/{chunk-DYABOIHB.js → chunk-CAPAGD5E.js} +6 -4
  48. package/dist/cli/{chunk-ZZTHTMQP.js → chunk-CHGEDCKG.js} +3 -3
  49. package/dist/cli/{chunk-QPUY2HQZ.js → chunk-COXFJ3PT.js} +2 -2
  50. package/dist/cli/chunk-D7BAQNV2.js +55 -0
  51. package/dist/cli/{chunk-OPTEQKBB.js → chunk-EIUXVHNF.js} +3 -3
  52. package/dist/cli/{chunk-3PGH67MT.js → chunk-EUGB6P5V.js} +4 -6
  53. package/dist/cli/chunk-EW2CKNNZ.js +304 -0
  54. package/dist/cli/{chunk-2JIJD2I7.js → chunk-FSKN4DWC.js} +2 -2
  55. package/dist/cli/{chunk-NSHV2JNM.js → chunk-FVKLULL7.js} +2 -2
  56. package/dist/cli/{chunk-GH37QXW5.js → chunk-GAGUBU4Z.js} +2 -2
  57. package/dist/cli/{chunk-37NU2XDP.js → chunk-GKRFH2YG.js} +2 -2
  58. package/dist/cli/{chunk-ULN4OKQQ.js → chunk-GRU74UE4.js} +21 -10
  59. package/dist/cli/{chunk-LKNUA3SB.js → chunk-HFLLZE6A.js} +2 -2
  60. package/dist/cli/{chunk-YGKEECTI.js → chunk-HXRXT3XU.js} +2 -2
  61. package/dist/cli/{chunk-REUTEW3O.js → chunk-IIOGUY3B.js} +6 -6
  62. package/dist/cli/chunk-ILWWL462.js +60 -0
  63. package/dist/cli/{chunk-XRAX6XFP.js → chunk-J5USPJKZ.js} +2 -2
  64. package/dist/cli/{chunk-S24YI723.js → chunk-KEQS36GD.js} +4 -4
  65. package/dist/cli/chunk-L7ONYSV6.js +2497 -0
  66. package/dist/cli/chunk-NEFMQYLE.js +656 -0
  67. package/dist/cli/{chunk-QFFQSKRC.js → chunk-NU6CQQVB.js} +6 -2
  68. package/dist/cli/{chunk-5J2VH3BC.js → chunk-PN4WW5VX.js} +3 -3
  69. package/dist/cli/{chunk-AYA6F4ZT.js → chunk-PSJ33WVO.js} +3 -3
  70. package/dist/cli/{chunk-FORFDPP5.js → chunk-QJJWWCIC.js} +3 -3
  71. package/dist/cli/{chunk-ZBISIPCK.js → chunk-QKMBWYAS.js} +16 -1
  72. package/dist/cli/chunk-QWNKLLLG.js +84 -0
  73. package/dist/cli/{chunk-7INMKEAD.js → chunk-QWUFFDL3.js} +2 -2
  74. package/dist/cli/chunk-QY76BRUZ.js +35 -0
  75. package/dist/cli/chunk-R45KVF5Y.js +117 -0
  76. package/dist/cli/{chunk-W33Q3FBH.js → chunk-RRKP7HLU.js} +3 -3
  77. package/dist/cli/{chunk-YUZJI67I.js → chunk-T6GZJYL3.js} +2 -2
  78. package/dist/cli/{chunk-LWQBJQSE.js → chunk-TLQ37HRE.js} +3 -3
  79. package/dist/cli/chunk-TPTNEJZJ.js +52 -0
  80. package/dist/cli/chunk-TYC7G5LF.js +100 -0
  81. package/dist/cli/{chunk-J3ZFM3UQ.js → chunk-UWCZY52R.js} +25 -13
  82. package/dist/cli/{chunk-V5GBGOGM.js → chunk-VB3LDPL5.js} +2 -2
  83. package/dist/cli/chunk-WWCYZYSN.js +56 -0
  84. package/dist/cli/{chunk-EBRZ76HS.js → chunk-XA5WISNV.js} +4 -3
  85. package/dist/cli/chunk-XHRZ7OYZ.js +132 -0
  86. package/dist/cli/{chunk-EOPQFCSR.js → chunk-XLPMIGJJ.js} +6 -6
  87. package/dist/cli/{chunk-NWTATTEQ.js → chunk-ZMGDZMSJ.js} +2 -2
  88. package/dist/cli/{claim-KPENYHIQ.js → claim-IGOG2QOC.js} +10 -9
  89. package/dist/cli/{classify-DRVMCFQU.js → classify-MG4N7GMQ.js} +2 -2
  90. package/dist/cli/{cli-T3CR7J57.js → cli-A23Q335V.js} +10 -7
  91. package/dist/cli/{cloud-PPQ4O5TX.js → cloud-SILYJVKO.js} +194 -28
  92. package/dist/cli/{code-Z5CTMVTD.js → code-H2FQCVMW.js} +2 -2
  93. package/dist/cli/{complete-UBOCOBRB.js → complete-JLX7NBI4.js} +9 -8
  94. package/dist/cli/{complexity-BV2AGQRZ.js → complexity-OKV7PVZH.js} +10 -9
  95. package/dist/cli/{compliance-32PD5Y47.js → compliance-QMGZHJNQ.js} +10 -9
  96. package/dist/cli/{conduit-VDKCH33F.js → conduit-4H32UYEA.js} +10 -9
  97. package/dist/cli/conduit-EY54WTZA.js +535 -0
  98. package/dist/cli/{config-I72JAXK4.js → config-TDYOC7XO.js} +21 -18
  99. package/dist/cli/{consensus-LFILLSTK.js → consensus-4XCOFPPT.js} +10 -9
  100. package/dist/cli/{context-XUUVFVTP.js → context-FN4YTGHD.js} +12 -11
  101. package/dist/cli/{contribution-37NQ4N5R.js → contribution-7RWFBJLC.js} +10 -9
  102. package/dist/cli/{curator-TFDXU2EX.js → curator-HKZJCVRL.js} +2 -2
  103. package/dist/cli/{current-C4SN5BWV.js → current-B2NU7V3G.js} +10 -9
  104. package/dist/cli/{daemon-DV25JQ62.js → daemon-GBD4TVCD.js} +11 -10
  105. package/dist/cli/{dash-TFU4RLQW.js → dash-IGDANIE5.js} +10 -9
  106. package/dist/cli/{decide-5VPMNTSI.js → decide-26SXC2V6.js} +5 -8
  107. package/dist/cli/{decompose-KOYEZNJL.js → decompose-LQ76TEZG.js} +11 -10
  108. package/dist/cli/{decomposition-7OHUFIQN.js → decomposition-WFRWNUSJ.js} +10 -9
  109. package/dist/cli/{delete-Q7YCAFY5.js → delete-T5DUQHOX.js} +11 -10
  110. package/dist/cli/{deps-6UZKLDGJ.js → deps-UTPZJBXL.js} +17 -18
  111. package/dist/cli/{detect-FERY35UL.js → detect-FFZSMVDT.js} +10 -9
  112. package/dist/cli/{detect-drift-UL2JTPUK.js → detect-drift-TVCJOFYJ.js} +7 -7
  113. package/dist/cli/diagnostics-GN5CVD3N.js +93 -0
  114. package/dist/cli/{diagnostics-TI5QAZXR.js → diagnostics-ZNBKH6GX.js} +10 -9
  115. package/dist/cli/docs-CLQKEEUK.js +1710 -0
  116. package/dist/cli/{docs-QI2PRN3T.js → docs-DPPDFTWR.js} +45 -42
  117. package/dist/cli/{doctor-AX5TICQO.js → doctor-GPENOP4N.js} +79 -62
  118. package/dist/cli/{doctor-ac-bindings-YPMYHU2G.js → doctor-ac-bindings-S3IOEFP4.js} +3 -3
  119. package/dist/cli/{doctor-acceptance-drift-PYNFGMKB.js → doctor-acceptance-drift-VNFKPBSQ.js} +3 -3
  120. package/dist/cli/{doctor-credentials-UZRIADKM.js → doctor-credentials-A5H4JMTF.js} +3 -3
  121. package/dist/cli/{doctor-db-substrate-Q2TOYM2S.js → doctor-db-substrate-FGCISE4Z.js} +3 -3
  122. package/dist/cli/{doctor-dep-cycles-GCVYZY6F.js → doctor-dep-cycles-BKKKHHYG.js} +3 -3
  123. package/dist/cli/{doctor-exodus-RO5SUTC2.js → doctor-exodus-ND2DH2KP.js} +3 -3
  124. package/dist/cli/{doctor-exodus-residue-EM2AWQXP.js → doctor-exodus-residue-4EMRYMEQ.js} +3 -3
  125. package/dist/cli/{doctor-fk-check-Q3FOLECE.js → doctor-fk-check-VY3RIQV3.js} +3 -3
  126. package/dist/cli/{doctor-global-delivery-TNOAQ3NP.js → doctor-global-delivery-JN6IGHUL.js} +3 -3
  127. package/dist/cli/{doctor-heavy-command-hook-IO3QAQLG.js → doctor-heavy-command-hook-XSN44WXU.js} +3 -3
  128. package/dist/cli/{doctor-legacy-backups-O2YH5VLS.js → doctor-legacy-backups-QAG5NHYP.js} +3 -3
  129. package/dist/cli/{doctor-legacy-reaper-VSEJEIFA.js → doctor-legacy-reaper-CIRGFE6R.js} +3 -3
  130. package/dist/cli/{doctor-malformed-ids-LQ766V5K.js → doctor-malformed-ids-WL7HT4TB.js} +3 -3
  131. package/dist/cli/{doctor-manifest-rows-6FQDNHLH.js → doctor-manifest-rows-SMQCKJ2T.js} +3 -3
  132. package/dist/cli/{doctor-memory-guard-J4PSEKB5.js → doctor-memory-guard-LJDOJG76.js} +3 -3
  133. package/dist/cli/{doctor-migrations-ONOH56YM.js → doctor-migrations-ETQPFNUP.js} +3 -3
  134. package/dist/cli/{doctor-nexus-residency-FUQAX7PV.js → doctor-nexus-residency-A4JMKBEJ.js} +3 -3
  135. package/dist/cli/{doctor-project-identity-GUDK3HYX.js → doctor-project-identity-FFQJ5LNX.js} +3 -3
  136. package/dist/cli/{doctor-projects-7L3BNL4O.js → doctor-projects-MFUTKRHP.js} +3 -3
  137. package/dist/cli/{doctor-projects-registry-TEAVHFQU.js → doctor-projects-registry-76X6VTGM.js} +3 -3
  138. package/dist/cli/{doctor-release-readiness-IEGHX6SL.js → doctor-release-readiness-QJCOPFTK.js} +3 -3
  139. package/dist/cli/{doctor-repair-NBONOSZU.js → doctor-repair-AU76FIKY.js} +3 -3
  140. package/dist/cli/doctor-row-identity-KW6JYZQE.js +26 -0
  141. package/dist/cli/{doctor-skill-fixtures-7Y6L34A3.js → doctor-skill-fixtures-G3T7JUHS.js} +3 -3
  142. package/dist/cli/{doctor-split-brain-TUKIGVHF.js → doctor-split-brain-FUW6L7FS.js} +3 -3
  143. package/dist/cli/{doctor-superseded-store-BHZY2B2L.js → doctor-superseded-store-DUHGSBLC.js} +3 -3
  144. package/dist/cli/doctor-sync-journal-SXMUIKF7.js +26 -0
  145. package/dist/cli/doctor-sync-triggers-6WNJZFRM.js +26 -0
  146. package/dist/cli/{doctor-tool-locks-REQMIVYK.js → doctor-tool-locks-66LSLUBN.js} +3 -3
  147. package/dist/cli/{doctor-twin-collapse-222GOSPE.js → doctor-twin-collapse-AYBYBFC4.js} +3 -3
  148. package/dist/cli/{doctor-worktree-stores-J7TCRVJ3.js → doctor-worktree-stores-C5XEH5OG.js} +3 -3
  149. package/dist/cli/{done-V3AOO65B.js → done-R64XRZ32.js} +11 -10
  150. package/dist/cli/entities-3JIHDIOK.js +361 -0
  151. package/dist/cli/{event-EGNPGE5A.js → event-45KEWV5H.js} +2 -2
  152. package/dist/cli/{exists-H4SDCBPL.js → exists-BEDZS5RI.js} +3 -3
  153. package/dist/cli/{exodus-KALO3B3X.js → exodus-DUX62344.js} +3 -3
  154. package/dist/cli/{export-ROFOCG4M.js → export-C5PQIQ5O.js} +11 -10
  155. package/dist/cli/{export-tasks-US3WBIEQ.js → export-tasks-CUXDZPJB.js} +11 -10
  156. package/dist/cli/{federation-SUIB5QWT.js → federation-ESM35EGG.js} +3 -3
  157. package/dist/cli/{find-YICG4BG6.js → find-5EUZHHQJ.js} +13 -12
  158. package/dist/cli/focus-6AH4KLRO.js +368 -0
  159. package/dist/cli/{focus-TKCZPKOM.js → focus-ANKAIRO5.js} +10 -9
  160. package/dist/cli/{gateway-H4HFDC3E.js → gateway-2GW2KTK3.js} +2 -2
  161. package/dist/cli/{gc-5R2TUY5T.js → gc-CTOQLUSA.js} +2 -2
  162. package/dist/cli/{go-PRQFK5YG.js → go-YJPNHHYT.js} +6 -6
  163. package/dist/cli/{goal-7CZRMLHC.js → goal-4GW4G77D.js} +4 -3
  164. package/dist/cli/{grade-PY2YRPUS.js → grade-25WSZH4X.js} +10 -9
  165. package/dist/cli/{graph-XIXMCFKG.js → graph-JUO3TMF3.js} +11 -10
  166. package/dist/cli/{history-EIXADPAD.js → history-NACNUQTC.js} +10 -9
  167. package/dist/cli/{import-R73SO444.js → import-7ESGL5SS.js} +10 -9
  168. package/dist/cli/{import-tasks-O22FZJ4U.js → import-tasks-FLE2RPBR.js} +10 -9
  169. package/dist/cli/index.js +395 -238
  170. package/dist/cli/{init-IHEJDQWU.js → init-AN4DZ2XO.js} +5 -5
  171. package/dist/cli/{inject-LSRVWNCP.js → inject-HQWA5GWY.js} +10 -9
  172. package/dist/cli/{install-global-4AZUCH6U.js → install-global-YQV4W5OG.js} +2 -2
  173. package/dist/cli/intelligence-OFFNQGHE.js +238 -0
  174. package/dist/cli/{intelligence-2OSFOGD2.js → intelligence-QIC4SN4X.js} +10 -9
  175. package/dist/cli/{issue-IIWEDNFC.js → issue-P5RNMRDG.js} +10 -9
  176. package/dist/cli/{janitor-GPMC7VOR.js → janitor-ZNCFQ7E3.js} +2 -2
  177. package/dist/cli/{labels-5NPOIQXN.js → labels-ORBM3T57.js} +10 -9
  178. package/dist/cli/{lifecycle-4FFS2K2T.js → lifecycle-MHR22TVI.js} +13 -12
  179. package/dist/cli/{list-47KEUGPQ.js → list-LB6GCYYU.js} +14 -13
  180. package/dist/cli/llm-H7LZWQKX.js +130 -0
  181. package/dist/cli/{llm-G5B3I6GD.js → llm-OTJWPMGI.js} +14 -13
  182. package/dist/cli/{llm-cost-S7RS6BVA.js → llm-cost-MLMXEAR4.js} +3 -3
  183. package/dist/cli/{llm-stream-24A45NTS.js → llm-stream-AAEUNKRP.js} +3 -3
  184. package/dist/cli/{log-XF6H2XSD.js → log-W2A5M2NA.js} +10 -9
  185. package/dist/cli/{login-LBPLGHYG.js → login-SIXFFZSP.js} +6 -4
  186. package/dist/cli/{logout-SX4JSJIV.js → logout-G3KVLQQM.js} +5 -5
  187. package/dist/cli/{manifest-NMCW4PIW.js → manifest-G4T6EBSI.js} +10 -9
  188. package/dist/cli/{map-BU72KMGF.js → map-VU5M72TK.js} +10 -9
  189. package/dist/cli/{memory-UHYIVGVM.js → memory-2E27G2G5.js} +17 -21
  190. package/dist/cli/memory-IAEYKXG6.js +1895 -0
  191. package/dist/cli/{migrate-agents-v2-OO7OILZK.js → migrate-agents-v2-A52QIYNJ.js} +3 -3
  192. package/dist/cli/{migrate-claude-mem-EDNYUY3K.js → migrate-claude-mem-TPDW3R4Z.js} +17 -12
  193. package/dist/cli/{next-RZFRG5X7.js → next-SVH4LIDY.js} +10 -9
  194. package/dist/cli/nexus-FPQV2EAF.js +1059 -0
  195. package/dist/cli/{nexus-4S4Z5EVU.js → nexus-XSFXN5E6.js} +14 -13
  196. package/dist/cli/{ops-KR7AWCG3.js → ops-K6LHY5J6.js} +10 -9
  197. package/dist/cli/orchestrate-CZ2J6W3L.js +1650 -0
  198. package/dist/cli/{orchestrate-HOYZY3VX.js → orchestrate-HURUCQFT.js} +13 -11
  199. package/dist/cli/{otel-U7IIRBCT.js → otel-JCNPVJLZ.js} +2 -2
  200. package/dist/cli/{phase-NYZFHUE5.js → phase-VDFRASSO.js} +10 -9
  201. package/dist/cli/pipeline-TCZPOEDR.js +697 -0
  202. package/dist/cli/{pivot-FF2CVUZL.js → pivot-V5MSQZ7L.js} +10 -9
  203. package/dist/cli/{plan-3SL2NTRV.js → plan-SQUGCKSM.js} +10 -9
  204. package/dist/cli/{playbook-2FCBV7N3.js → playbook-L47GLDQD.js} +10 -9
  205. package/dist/cli/playbook-NJVO4R6P.js +33 -0
  206. package/dist/cli/{project-WDX2TGMC.js → project-YZEC7GYF.js} +6 -5
  207. package/dist/cli/{promote-YINYFBZY.js → promote-FINF4HVK.js} +10 -9
  208. package/dist/cli/provenance-3TUWVBFR.js +141 -0
  209. package/dist/cli/{provenance-C7AYD7WG.js → provenance-YZG33JGM.js} +10 -9
  210. package/dist/cli/{provider-QLJEDQBR.js → provider-23JVLLG3.js} +10 -9
  211. package/dist/cli/{reason-JF5BHBM5.js → reason-FHN54O7O.js} +10 -9
  212. package/dist/cli/{reconcile-NMISHDGX.js → reconcile-MOM5T4AX.js} +11 -10
  213. package/dist/cli/{refresh-memory-EY5YNICV.js → refresh-memory-3OSTRAVK.js} +2 -2
  214. package/dist/cli/{relates-R3ZPICAY.js → relates-6FWUFUS2.js} +10 -9
  215. package/dist/cli/release-G2DPSG5M.js +347 -0
  216. package/dist/cli/{release-4ZJTMUUT.js → release-URX6JHZ2.js} +10 -9
  217. package/dist/cli/{remote-QSONJDIK.js → remote-VIULU2T5.js} +3 -3
  218. package/dist/cli/{renderers-64OR3IWX.js → renderers-TGSW77J4.js} +2 -2
  219. package/dist/cli/{reorder-J3DOE7ST.js → reorder-UIPN6TQY.js} +10 -9
  220. package/dist/cli/{reparent-2OUMKEZX.js → reparent-ALOWWUIU.js} +10 -9
  221. package/dist/cli/{req-TZB7OFKO.js → req-RH2Y3H7A.js} +10 -9
  222. package/dist/cli/{research-MTD7EX45.js → research-G2Y72HRC.js} +10 -9
  223. package/dist/cli/{restore-VEUOX7NF.js → restore-VBR5XNML.js} +62 -15
  224. package/dist/cli/{revert-3YF2IL5G.js → revert-32LDNSGP.js} +2 -2
  225. package/dist/cli/{roadmap-7OOQLXKG.js → roadmap-LFU3AG7D.js} +10 -9
  226. package/dist/cli/{run-2U5NZV5Z.js → run-HXRILSR7.js} +40 -6
  227. package/dist/cli/{safestop-VR4VK56D.js → safestop-Z5UC7NGQ.js} +10 -9
  228. package/dist/cli/{saga-SEWPIOX2.js → saga-Y6FZS6AM.js} +12 -11
  229. package/dist/cli/{schema-C52WZ35V.js → schema-OOOKLWUE.js} +5 -5
  230. package/dist/cli/{self-update-GQIGUDPS.js → self-update-26SOTJMH.js} +3 -3
  231. package/dist/cli/{selfimprove-3Y5L4ECT.js → selfimprove-4SMOCLUV.js} +10 -9
  232. package/dist/cli/selfimprove-EB4RQLP4.js +139 -0
  233. package/dist/cli/sentient-QPETVE53.js +254 -0
  234. package/dist/cli/{sentient-M4YMAVGV.js → sentient-RGMWR4XJ.js} +2 -2
  235. package/dist/cli/{sequence-6UBMA4IF.js → sequence-H7DSAJPF.js} +10 -9
  236. package/dist/cli/{service-5R7SILZ7.js → service-EK5MGB2D.js} +10 -9
  237. package/dist/cli/service-GLOMZWPQ.js +437 -0
  238. package/dist/cli/{session-3C6AAC4Y.js → session-HYUXAQGC.js} +12 -11
  239. package/dist/cli/session-N5ISU56W.js +568 -0
  240. package/dist/cli/{setup-BTUBW5PU.js → setup-L3YYV53D.js} +4 -4
  241. package/dist/cli/{show-MXT2V7TF.js → show-364V3KY2.js} +12 -11
  242. package/dist/cli/{skill-GFUZOU2C.js → skill-F2KR6HW5.js} +2 -2
  243. package/dist/cli/{skills-EDWLKAF3.js → skills-FS3DCP6E.js} +13 -12
  244. package/dist/cli/{snapshot-GUWMURCM.js → snapshot-EGXEQ5PR.js} +12 -11
  245. package/dist/cli/{src-66GAKPXR.js → src-LYLXHXHH.js} +2 -2
  246. package/dist/cli/{start-QFG56RGN.js → start-6DXOCCKL.js} +10 -9
  247. package/dist/cli/{stats-GW55P7RR.js → stats-UVUQEGYC.js} +10 -9
  248. package/dist/cli/{status-46HTKNRR.js → status-XLKYLN42.js} +3 -3
  249. package/dist/cli/sticky-VSTQ2I2O.js +264 -0
  250. package/dist/cli/{sticky-2DUZOUGI.js → sticky-XZXZDCFW.js} +12 -11
  251. package/dist/cli/{stop-J2QEUKHX.js → stop-VNOAFWNB.js} +10 -9
  252. package/dist/cli/{sync-GJP2QYT5.js → sync-YYPARW3A.js} +11 -10
  253. package/dist/cli/tasks-C24KHTFF.js +1118 -0
  254. package/dist/cli/{tasks-BNXTM7PB.js → tasks-LBJC7CZV.js} +10 -9
  255. package/dist/cli/{telemetry-55Z2XJWL.js → telemetry-CU7W5WAY.js} +2 -2
  256. package/dist/cli/{templates-7O77TKPV.js → templates-G42JBUY4.js} +9 -11
  257. package/dist/cli/{testing-37YTBNKP.js → testing-HSRITHEY.js} +10 -9
  258. package/dist/cli/{token-UAVJMNUI.js → token-J74E7TSU.js} +10 -9
  259. package/dist/cli/tools-BI74W7VE.js +652 -0
  260. package/dist/cli/{transcript-LORQTV5Z.js → transcript-RGK7RSGQ.js} +2 -2
  261. package/dist/cli/{update-NVCYV2FT.js → update-2KQWA27S.js} +19 -17
  262. package/dist/cli/update-check-entry.js +124 -0
  263. package/dist/cli/update-notice-6SQ6WPQG.js +68 -0
  264. package/dist/cli/upgrade-E2MJAPC7.js +136 -0
  265. package/dist/cli/{upgrade-OXJXOGEF.js → upgrade-XRSQ4RWH.js} +5 -5
  266. package/dist/cli/{verify-LYLDHPT2.js → verify-WASRGDBA.js} +10 -9
  267. package/dist/cli/{web-QP2RP266.js → web-NJ3P67EU.js} +4 -4
  268. package/dist/cli/{workgraph-FXBSZDQE.js → workgraph-OHJ2VKJD.js} +6 -6
  269. package/dist/cli/{worktree-6RXAJIST.js → worktree-FVQLORFY.js} +10 -9
  270. package/dist/cli/worktree-ZJ6JTQNG.js +287 -0
  271. package/package.json +13 -13
  272. package/studio-dist/client/_app/immutable/chunks/{Btgeq_wq.js → AH7dIemv.js} +1 -1
  273. package/studio-dist/client/_app/immutable/chunks/{DgEKqO6r.js → BDgH40i3.js} +1 -1
  274. package/studio-dist/client/_app/immutable/chunks/BXDCSJ7U.js +1 -0
  275. package/studio-dist/client/_app/immutable/chunks/{CgBjxmu6.js → Gg4iYl59.js} +1 -1
  276. package/studio-dist/client/_app/immutable/entry/{app.a02HWaRB.js → app.DUDNK-37.js} +2 -2
  277. package/studio-dist/client/_app/immutable/entry/start.DNmZ0pA4.js +1 -0
  278. package/studio-dist/client/_app/immutable/nodes/{0.nTXyRfc-.js → 0.DWqP3ail.js} +1 -1
  279. package/studio-dist/client/_app/immutable/nodes/{1.4zrWeHtl.js → 1.CZGVUP5B.js} +1 -1
  280. package/studio-dist/client/_app/immutable/nodes/{15.D9mk4JyY.js → 15.DGaflZRS.js} +1 -1
  281. package/studio-dist/client/_app/immutable/nodes/{16._-wt-sQf.js → 16.uYlarGXl.js} +1 -1
  282. package/studio-dist/client/_app/immutable/nodes/{17.CUu6LQDj.js → 17.CZMR0E47.js} +1 -1
  283. package/studio-dist/client/_app/immutable/nodes/{18.Dz4QRTkX.js → 18.CBC-AKH_.js} +1 -1
  284. package/studio-dist/client/_app/immutable/nodes/{20.CJ2_EB0U.js → 20.BGi43MvQ.js} +1 -1
  285. package/studio-dist/client/_app/immutable/nodes/{24.Igj2FS7k.js → 24.Dv8ftCyR.js} +1 -1
  286. package/studio-dist/client/_app/immutable/nodes/25.DQPVlTDQ.js +39 -0
  287. package/studio-dist/client/_app/immutable/nodes/{26.6iPyjT44.js → 26.Cl800304.js} +1 -1
  288. package/studio-dist/client/_app/immutable/nodes/{3.AA5GwNgP.js → 3.D_fQKj9f.js} +1 -1
  289. package/studio-dist/client/_app/version.json +1 -1
  290. package/studio-dist/server/chunks/{0-DGmsoBYm.js → 0-BpOagOst.js} +3 -3
  291. package/studio-dist/server/chunks/1-D0oRGR-C.js +9 -0
  292. package/studio-dist/server/chunks/{15-Bg6YTndh.js → 15-BcjHz7Tv.js} +3 -3
  293. package/studio-dist/server/chunks/{16-BObLwgyD.js → 16-CXm8TUk7.js} +3 -3
  294. package/studio-dist/server/chunks/{17-BNXGyAHX.js → 17-mSgUK-cp.js} +3 -3
  295. package/studio-dist/server/chunks/{18-UqQFRIID.js → 18-BtfnIw1d.js} +3 -3
  296. package/studio-dist/server/chunks/{20-CMn8a_yP.js → 20-By1e4QDS.js} +3 -3
  297. package/studio-dist/server/chunks/{24-BuOTDzib.js → 24-0i2YLVxG.js} +3 -3
  298. package/studio-dist/server/chunks/{dist-B8xbIrdB.js → 25-DPsrqbrh.js} +795 -10736
  299. package/studio-dist/server/chunks/{26-DWGObn2T.js → 26-P0XkOibm.js} +3 -3
  300. package/studio-dist/server/chunks/{3-CyiffdJZ.js → 3-WudjUK7e.js} +3 -3
  301. package/studio-dist/server/chunks/{_layout.svelte-DYtClaIk.js → _layout.svelte-D9m81Rle.js} +4 -4
  302. package/studio-dist/server/chunks/{_page.svelte-CEATWp_5.js → _page.svelte-2PDLOF83.js} +3 -3
  303. package/studio-dist/server/chunks/{_page.svelte-Bip079LT.js → _page.svelte-BjE3jm2K.js} +3 -3
  304. package/studio-dist/server/chunks/{_page.svelte-CV3xiD1y.js → _page.svelte-Clc0vmiZ.js} +4 -4
  305. package/studio-dist/server/chunks/{_page.svelte-DSSy6LuK.js → _page.svelte-DABdRT3h.js} +3 -3
  306. package/studio-dist/server/chunks/{_page.svelte-1h9E6s_f.js → _page.svelte-DG3PjiHj.js} +3 -3
  307. package/studio-dist/server/chunks/{_page.svelte-BT1EUadj.js → _page.svelte-Edy9CaE8.js} +20 -7
  308. package/studio-dist/server/chunks/{_page.svelte-BNNF62Nm.js → _page.svelte-Hrf3-ZR8.js} +3 -3
  309. package/studio-dist/server/chunks/{_page.svelte-TF795TAS.js → _page.svelte-VB4O4Nl5.js} +3 -3
  310. package/studio-dist/server/chunks/{_page.svelte-Cv_KVJDV.js → _page.svelte-d3jEgjsI.js} +3 -3
  311. package/studio-dist/server/chunks/{_server.ts-CzrwbhkQ.js → _server.ts-BcRFsyo3.js} +4 -5
  312. package/studio-dist/server/chunks/{_server.ts-C4w6UdU0.js → _server.ts-CEWpIFrj.js} +6 -5
  313. package/studio-dist/server/chunks/{_server.ts-BlhRFLY3.js → _server.ts-CLVdVIF9.js} +2 -2
  314. package/studio-dist/server/chunks/{_server.ts-Db6mEile.js → _server.ts-D_j7aSy5.js} +6 -5
  315. package/studio-dist/server/chunks/{_server.ts-DWt8Dziu.js → _server.ts-QEZF8h2q.js} +4 -5
  316. package/studio-dist/server/chunks/{client-D8f2k-H_.js → client-Kp1dP1od.js} +2 -2
  317. package/studio-dist/server/chunks/{error.svelte-DbbOwIme.js → error.svelte-WOCioJVX.js} +3 -3
  318. package/studio-dist/server/chunks/{hooks.server-D2qbf3Zp.js → hooks.server-DH9zkIrJ.js} +3 -1
  319. package/studio-dist/server/chunks/{http-1ftNGTs5.js → http-DT5kxaWk.js} +5 -4
  320. package/studio-dist/server/chunks/{internal-CTULuLPB.js → internal-z0vqd5_u.js} +3 -3
  321. package/studio-dist/server/chunks/operations-registry-DdzmYzqX.js +10584 -0
  322. package/studio-dist/server/chunks/{stores-CS5XOReX.js → stores-s2kaL315.js} +2 -2
  323. package/studio-dist/server/index.js +1 -1
  324. package/studio-dist/server/manifest.js +17 -17
  325. package/dist/cli/chunk-3IOQVUO7.js +0 -17308
  326. package/dist/cli/chunk-OAPN46TC.js +0 -89
  327. package/studio-dist/client/_app/immutable/chunks/t81h7afa.js +0 -1
  328. package/studio-dist/client/_app/immutable/entry/start.BreMSngo.js +0 -1
  329. package/studio-dist/client/_app/immutable/nodes/25.BnATjVGN.js +0 -39
  330. package/studio-dist/server/chunks/1-8PfxPvlK.js +0 -9
  331. package/studio-dist/server/chunks/25-CIMSmjVx.js +0 -366
@@ -0,0 +1,1650 @@
1
+ (() => {
2
+ const _installed = Symbol.for('cleocode.cli.sqliteWarningFilter');
3
+ if (globalThis[_installed]) return;
4
+ globalThis[_installed] = true;
5
+ const _origEmitWarning = process.emitWarning;
6
+ process.emitWarning = function(warning, type, code, ctor) {
7
+ if (typeof warning === 'object' && warning.name === 'ExperimentalWarning' && typeof warning.message === 'string' && /SQLite is an experimental feature/i.test(warning.message)) {
8
+ return;
9
+ }
10
+ if (typeof warning === 'string' && /SQLite is an experimental feature/i.test(warning)) {
11
+ return;
12
+ }
13
+ return _origEmitWarning.call(process, warning, type, code, ctor);
14
+ };
15
+ })();
16
+ import {
17
+ routeByParam
18
+ } from "./chunk-QY76BRUZ.js";
19
+ import {
20
+ acquirePlaybookDb,
21
+ listPendingApprovalsForDispatch,
22
+ lookupApprovalByTokenForDispatch
23
+ } from "./chunk-NEFMQYLE.js";
24
+ import "./chunk-NU6CQQVB.js";
25
+ import {
26
+ defineTypedHandler,
27
+ lafsError,
28
+ lafsSuccess,
29
+ typedDispatch
30
+ } from "./chunk-QWNKLLLG.js";
31
+ import {
32
+ lazyOperation
33
+ } from "./chunk-TYC7G5LF.js";
34
+ import {
35
+ dispatchMeta,
36
+ errorResult,
37
+ handleErrorResult,
38
+ unsupportedOp,
39
+ wrapResult
40
+ } from "./chunk-XHRZ7OYZ.js";
41
+
42
+ // packages/cleo/src/dispatch/domains/orchestrate.ts
43
+ import { CleoError } from "@cleocode/core/errors";
44
+ import { getLogger as getLogger2 } from "@cleocode/core/logger";
45
+ import { getProjectRoot as getProjectRoot2 } from "@cleocode/core/project-scope";
46
+ import { sessionContextInject } from "@cleocode/core/session/engine-ops";
47
+ import { CLEO_DIR_NAME, WORKFLOWS_SUBDIR } from "@cleocode/runtime/gateway/dispatch";
48
+
49
+ // packages/cleo/src/dispatch/domains/ivtr.ts
50
+ import { getIvtrState } from "@cleocode/core/lifecycle/ivtr-loop";
51
+ import { getLogger } from "@cleocode/core/logger";
52
+ import { getProjectRoot } from "@cleocode/core/project-scope";
53
+ import { engineSuccess } from "@cleocode/runtime/gateway/dispatch";
54
+ var log = getLogger("domain:ivtr");
55
+ var E_DEPRECATED_USE_PLAYBOOK = "E_DEPRECATED_USE_PLAYBOOK";
56
+ function deprecatedMutateEnvelope(op, taskId) {
57
+ const id = taskId ?? "T####";
58
+ const manual = `cleo playbook run ivtr --context '{"taskId":"${id}"}'`;
59
+ const autonomous = "cleo go";
60
+ const migration = {
61
+ deprecatedBy: "T11764-state-machine-collapse",
62
+ deprecatedOp: op,
63
+ survivor: "cantbook-runtime (ivtr.cantbook)",
64
+ autonomous,
65
+ manual,
66
+ ...taskId !== void 0 ? { taskId } : {}
67
+ };
68
+ return lafsError(
69
+ E_DEPRECATED_USE_PLAYBOOK,
70
+ `'cleo orchestrate ivtr --${op}' is deprecated. The hand-rolled IVTR phase walk was collapsed into the cantbook runtime (T11764). Drive IVTR through the playbook runtime instead: '${autonomous}' (autonomous, default) or '${manual}' (single manual run).`,
71
+ op,
72
+ manual,
73
+ {
74
+ migration,
75
+ alternatives: [
76
+ { action: "Autonomous IVTR loop (default)", command: autonomous },
77
+ { action: "Manual single IVTR run", command: manual }
78
+ ]
79
+ }
80
+ );
81
+ }
82
+ function isAlternativesList(value) {
83
+ return Array.isArray(value) && value.every(
84
+ (v) => typeof v === "object" && v !== null && typeof v.action === "string" && typeof v.command === "string"
85
+ );
86
+ }
87
+ async function ivtrStatusOp(params) {
88
+ const cwd = getProjectRoot();
89
+ const state = await getIvtrState(params.taskId, { cwd });
90
+ if (!state) {
91
+ return engineSuccess({
92
+ taskId: params.taskId,
93
+ started: false,
94
+ currentPhase: null,
95
+ phaseHistory: [],
96
+ message: `Task ${params.taskId} has no IVTR state. The IVTR loop now runs on the cantbook runtime (T11764) \u2014 drive it with 'cleo go' (autonomous) or 'cleo playbook run ivtr --context '{"taskId":"${params.taskId}"}''.`
97
+ });
98
+ }
99
+ return engineSuccess({
100
+ taskId: params.taskId,
101
+ started: true,
102
+ currentPhase: state.currentPhase,
103
+ startedAt: state.startedAt,
104
+ phaseHistory: state.phaseHistory,
105
+ loopBackCount: state.loopBackCount ?? {
106
+ implement: 0,
107
+ validate: 0,
108
+ test: 0,
109
+ released: 0
110
+ },
111
+ evidenceCount: state.phaseHistory.reduce(
112
+ (acc, e) => acc + e.evidenceRefs.length,
113
+ 0
114
+ )
115
+ });
116
+ }
117
+ var DEPRECATED_OP_RESULT = {
118
+ success: false,
119
+ error: { code: E_DEPRECATED_USE_PLAYBOOK, message: "IVTR mutate ops are deprecated (T11764)." }
120
+ };
121
+ function ivtrStartOp(_params) {
122
+ return Promise.resolve(DEPRECATED_OP_RESULT);
123
+ }
124
+ function ivtrNextOp(_params) {
125
+ return Promise.resolve(DEPRECATED_OP_RESULT);
126
+ }
127
+ function ivtrReleaseOp(_params) {
128
+ return Promise.resolve(DEPRECATED_OP_RESULT);
129
+ }
130
+ function ivtrLoopBackOp(_params) {
131
+ return Promise.resolve(DEPRECATED_OP_RESULT);
132
+ }
133
+ var ivtrCoreOps = {
134
+ status: ivtrStatusOp,
135
+ start: ivtrStartOp,
136
+ next: ivtrNextOp,
137
+ release: ivtrReleaseOp,
138
+ "loop-back": ivtrLoopBackOp
139
+ };
140
+ var _ivtrTypedHandler = defineTypedHandler("ivtr", {
141
+ status: async (params) => {
142
+ const result = await ivtrCoreOps.status(params);
143
+ return result.success ? lafsSuccess(result.data, "status") : lafsError(result.error?.code ?? "E_INTERNAL", result.error?.message ?? "", "status");
144
+ },
145
+ // ── DEPRECATED mutate ops (T11896 · T11764 collapse) ────────────────────
146
+ // The per-step phase walk has no 1:1 mapping onto the whole-run cantbook
147
+ // primitives (`executePlaybook`/`resumePlaybook`), so each op returns the
148
+ // typed E_DEPRECATED_USE_PLAYBOOK migration envelope (ADR-086) rather than
149
+ // silently breaking. `params.taskId` is woven into the migration command.
150
+ start: async (params) => deprecatedMutateEnvelope("start", params.taskId),
151
+ next: async (params) => deprecatedMutateEnvelope("next", params.taskId),
152
+ release: async (params) => deprecatedMutateEnvelope("release", params.taskId),
153
+ "loop-back": async (params) => deprecatedMutateEnvelope("loop-back", params.taskId)
154
+ });
155
+ var IvtrHandler = class {
156
+ // -----------------------------------------------------------------------
157
+ // query — read-only
158
+ // -----------------------------------------------------------------------
159
+ /**
160
+ * Handle read-only IVTR queries.
161
+ *
162
+ * Supported operations:
163
+ * - `status` — return IvtrState + resolved summary for a task
164
+ */
165
+ async query(operation, params) {
166
+ const startTime = Date.now();
167
+ const queryOps = /* @__PURE__ */ new Set(["status"]);
168
+ if (!queryOps.has(operation)) {
169
+ return unsupportedOp("query", "ivtr", operation, startTime);
170
+ }
171
+ try {
172
+ if (!params?.["taskId"]) {
173
+ return {
174
+ meta: dispatchMeta("query", "ivtr", operation, startTime),
175
+ success: false,
176
+ error: { code: "E_INVALID_INPUT", message: "taskId is required" }
177
+ };
178
+ }
179
+ const envelope = await typedDispatch(
180
+ _ivtrTypedHandler,
181
+ operation,
182
+ params ?? {}
183
+ );
184
+ return {
185
+ meta: dispatchMeta("query", "ivtr", operation, startTime),
186
+ success: envelope.success,
187
+ ...envelope.success ? { data: envelope.data } : {
188
+ error: {
189
+ code: envelope.error?.code !== void 0 ? String(envelope.error.code) : "E_INTERNAL",
190
+ message: envelope.error?.message ?? "Unknown error"
191
+ }
192
+ }
193
+ };
194
+ } catch (err) {
195
+ log.error({ err, operation }, "IvtrHandler query error");
196
+ return handleErrorResult("query", "ivtr", operation, err, startTime);
197
+ }
198
+ }
199
+ // -----------------------------------------------------------------------
200
+ // mutate — state-modifying
201
+ // -----------------------------------------------------------------------
202
+ /**
203
+ * Handle state-modifying IVTR mutations — all DEPRECATED (T11896).
204
+ *
205
+ * `start`/`next`/`release`/`loop-back` are no longer driven by the hand-rolled
206
+ * phase walk; each returns the typed {@link E_DEPRECATED_USE_PLAYBOOK}
207
+ * migration envelope (carrying `fix`, `details.migration`, and `alternatives`
208
+ * per ADR-086) so the caller is routed onto the cantbook runtime. The full
209
+ * migration-hint payload is forwarded onto the `DispatchResponse.error` —
210
+ * nothing is orphaned silently.
211
+ */
212
+ async mutate(operation, params) {
213
+ const startTime = Date.now();
214
+ const mutateOps = /* @__PURE__ */ new Set(["start", "next", "release", "loop-back"]);
215
+ if (!mutateOps.has(operation)) {
216
+ return unsupportedOp("mutate", "ivtr", operation, startTime);
217
+ }
218
+ try {
219
+ const envelope = await typedDispatch(
220
+ _ivtrTypedHandler,
221
+ operation,
222
+ params ?? {}
223
+ );
224
+ if (envelope.success) {
225
+ return {
226
+ meta: dispatchMeta("mutate", "ivtr", operation, startTime),
227
+ success: true,
228
+ data: envelope.data
229
+ };
230
+ }
231
+ const err = envelope.error;
232
+ const error = {
233
+ code: err?.code !== void 0 ? String(err.code) : "E_INTERNAL",
234
+ message: err?.message ?? "Unknown error"
235
+ };
236
+ if (err?.fix !== void 0) error.fix = err.fix;
237
+ if (err?.details !== void 0) error.details = err.details;
238
+ const alternatives = err?.details?.["alternatives"];
239
+ if (isAlternativesList(alternatives)) error.alternatives = alternatives;
240
+ return {
241
+ meta: dispatchMeta("mutate", "ivtr", operation, startTime),
242
+ success: false,
243
+ error
244
+ };
245
+ } catch (err) {
246
+ log.error({ err, operation }, "IvtrHandler mutate error");
247
+ return handleErrorResult("mutate", "ivtr", operation, err, startTime);
248
+ }
249
+ }
250
+ // -----------------------------------------------------------------------
251
+ // getSupportedOperations
252
+ // -----------------------------------------------------------------------
253
+ /** Return declared operations for introspection and validation. */
254
+ getSupportedOperations() {
255
+ return {
256
+ query: ["status"],
257
+ mutate: ["start", "next", "release", "loop-back"]
258
+ };
259
+ }
260
+ };
261
+
262
+ // packages/cleo/src/dispatch/domains/orchestrate.ts
263
+ var orchestrateAnalyze = lazyOperation(
264
+ async () => (await import("@cleocode/core/orchestrate/query-ops")).orchestrateAnalyze
265
+ );
266
+ var orchestrateBootstrap = lazyOperation(
267
+ async () => (await import("@cleocode/core/orchestrate/lifecycle-ops")).orchestrateBootstrap
268
+ );
269
+ var orchestrateContext = lazyOperation(
270
+ async () => (await import("@cleocode/core/orchestrate/query-ops")).orchestrateContext
271
+ );
272
+ var orchestrateHandoff = lazyOperation(
273
+ async () => (await import("@cleocode/core/orchestrate/handoff-ops")).orchestrateHandoff
274
+ );
275
+ var orchestrateNext = lazyOperation(
276
+ async () => (await import("@cleocode/core/orchestrate/query-ops")).orchestrateNext
277
+ );
278
+ var orchestrateParallelEnd = lazyOperation(
279
+ async () => (await import("@cleocode/core/orchestrate/lifecycle-ops")).orchestrateParallelEnd
280
+ );
281
+ var orchestrateParallelStart = lazyOperation(
282
+ async () => (await import("@cleocode/core/orchestrate/lifecycle-ops")).orchestrateParallelStart
283
+ );
284
+ var orchestratePlan = lazyOperation(
285
+ async () => (await import("@cleocode/core/orchestrate/plan")).orchestratePlan
286
+ );
287
+ var orchestrateReady = lazyOperation(
288
+ async () => (await import("@cleocode/core/orchestrate/query-ops")).orchestrateReady
289
+ );
290
+ var orchestrateReport = lazyOperation(
291
+ async () => (await import("@cleocode/core/orchestrate/query-ops")).orchestrateReport
292
+ );
293
+ var orchestrateSpawn = lazyOperation(
294
+ async () => (await import("@cleocode/core/orchestrate/spawn-ops")).orchestrateSpawn
295
+ );
296
+ var orchestrateSpawnExecute = lazyOperation(
297
+ async () => (await import("@cleocode/core/orchestrate/spawn-ops")).orchestrateSpawnExecute
298
+ );
299
+ var orchestrateStartup = lazyOperation(
300
+ async () => (await import("@cleocode/core/orchestrate/lifecycle-ops")).orchestrateStartup
301
+ );
302
+ var orchestrateStatus = lazyOperation(
303
+ async () => (await import("@cleocode/core/orchestrate/query-ops")).orchestrateStatus
304
+ );
305
+ var orchestrateUnblockOpportunities = lazyOperation(
306
+ async () => (await import("@cleocode/core/orchestrate/lifecycle-ops")).orchestrateUnblockOpportunities
307
+ );
308
+ var orchestrateValidate = lazyOperation(
309
+ async () => (await import("@cleocode/core/orchestrate/query-ops")).orchestrateValidate
310
+ );
311
+ var orchestrateWaves = lazyOperation(
312
+ async () => (await import("@cleocode/core/orchestrate/query-ops")).orchestrateWaves
313
+ );
314
+ var pivotTask = lazyOperation(
315
+ async () => (await import("@cleocode/core/orchestrate/pivot")).pivotTask
316
+ );
317
+ var sessionEnd = lazyOperation(
318
+ async () => (await import("@cleocode/core/session/engine-ops")).sessionEnd
319
+ );
320
+ var sessionStatus = lazyOperation(
321
+ async () => (await import("@cleocode/core/session/status-op")).sessionStatus
322
+ );
323
+ var ivtrHandler = new IvtrHandler();
324
+ var FANOUT_MANIFEST_MAX_SIZE = 64;
325
+ var fanoutManifestStore = /* @__PURE__ */ new Map();
326
+ function evictFanoutManifest() {
327
+ while (fanoutManifestStore.size > FANOUT_MANIFEST_MAX_SIZE) {
328
+ const oldest = fanoutManifestStore.keys().next().value;
329
+ if (oldest !== void 0) fanoutManifestStore.delete(oldest);
330
+ }
331
+ }
332
+ async function orchestrateStatusOp(params) {
333
+ return orchestrateStatus(params.epicId, getProjectRoot2());
334
+ }
335
+ async function orchestrateNextOp(params) {
336
+ return orchestrateNext(params.epicId, getProjectRoot2());
337
+ }
338
+ async function orchestrateReadyOp(params) {
339
+ return orchestrateReady(params.epicId, getProjectRoot2(), {
340
+ ignoreDepsValidate: params.ignoreDepsValidate,
341
+ via: params.via
342
+ });
343
+ }
344
+ async function orchestrateReportOp(params) {
345
+ return orchestrateReport(params.epicId, getProjectRoot2(), params);
346
+ }
347
+ async function orchestrateAnalyzeOp(params) {
348
+ if (params.mode === "parallel-safety") {
349
+ return orchestrateAnalyzeParallelSafety(params.taskIds ?? [], getProjectRoot2());
350
+ }
351
+ return orchestrateAnalyze(params.epicId, getProjectRoot2(), params.mode);
352
+ }
353
+ async function orchestrateClassifyOp(params) {
354
+ return orchestrateClassify(params.request, params.context, getProjectRoot2(), params.taskId);
355
+ }
356
+ function orchestrateFanoutStatusOp(params) {
357
+ const entry = fanoutManifestStore.get(params.manifestEntryId);
358
+ if (!entry) {
359
+ return Promise.resolve({
360
+ success: true,
361
+ data: {
362
+ manifestEntryId: params.manifestEntryId,
363
+ pending: [],
364
+ running: [],
365
+ complete: [],
366
+ failed: [],
367
+ found: false
368
+ }
369
+ });
370
+ }
371
+ const spawned = entry.results.filter((r) => r.status === "spawned").map((r) => r.taskId);
372
+ const failed = entry.results.filter((r) => r.status === "failed").map((r) => r.taskId);
373
+ return Promise.resolve({
374
+ success: true,
375
+ data: {
376
+ manifestEntryId: params.manifestEntryId,
377
+ pending: [],
378
+ running: spawned,
379
+ complete: [],
380
+ failed,
381
+ found: true,
382
+ completedAt: entry.completedAt
383
+ }
384
+ });
385
+ }
386
+ async function orchestrateContextOp(params) {
387
+ return orchestrateContext(params.epicId, getProjectRoot2());
388
+ }
389
+ async function orchestrateWavesOp(params) {
390
+ return orchestrateWaves(params.epicId, getProjectRoot2(), {
391
+ via: params.via,
392
+ ...params.hideCompleted === true ? { hideCompleted: true } : {}
393
+ });
394
+ }
395
+ async function orchestratePlanOp(params) {
396
+ return orchestratePlan({
397
+ epicId: params.epicId,
398
+ projectRoot: getProjectRoot2(),
399
+ preferTier: params.preferTier
400
+ });
401
+ }
402
+ async function orchestrateBootstrapOp(params) {
403
+ return orchestrateBootstrap(getProjectRoot2(), { speed: params.speed });
404
+ }
405
+ async function orchestrateUnblockOp(_params) {
406
+ return orchestrateUnblockOpportunities(getProjectRoot2());
407
+ }
408
+ async function orchestrateIvtrStatusOp(params) {
409
+ return ivtrHandler.query("status", params);
410
+ }
411
+ async function orchestratePendingOp(_params) {
412
+ return Promise.resolve({ success: true, data: {} });
413
+ }
414
+ async function orchestrateStartOp(params) {
415
+ return orchestrateStartup(params.epicId, getProjectRoot2());
416
+ }
417
+ async function orchestrateSpawnOp(params) {
418
+ return orchestrateSpawn(
419
+ params.taskId,
420
+ params.protocolType,
421
+ getProjectRoot2(),
422
+ params.tier,
423
+ params.noWorktree,
424
+ params.spawnScope,
425
+ params.atomicityScope,
426
+ params.resume
427
+ );
428
+ }
429
+ async function orchestrateHandoffOp(params) {
430
+ return orchestrateHandoff(
431
+ {
432
+ taskId: params.taskId,
433
+ protocolType: params.protocolType,
434
+ note: params.note,
435
+ nextAction: params.nextAction,
436
+ variant: params.variant,
437
+ tier: params.tier,
438
+ idempotencyKey: params.idempotencyKey
439
+ },
440
+ // Inject cleo session ops to avoid core→cleo import cycle (T1570 ADR-057)
441
+ { sessionStatus, sessionEnd, sessionContextInject },
442
+ getProjectRoot2()
443
+ );
444
+ }
445
+ async function orchestrateSpawnExecuteOp(params) {
446
+ return orchestrateSpawnExecute(
447
+ params.taskId,
448
+ params.adapterId,
449
+ params.protocolType,
450
+ getProjectRoot2(),
451
+ params.tier
452
+ );
453
+ }
454
+ async function orchestrateValidateOp(params) {
455
+ return orchestrateValidate(params.taskId, getProjectRoot2());
456
+ }
457
+ async function orchestratePivotOp(params) {
458
+ try {
459
+ const result = await pivotTask(params.fromTaskId, params.toTaskId, {
460
+ reason: params.reason,
461
+ blocksFrom: params.blocksFrom,
462
+ projectRoot: getProjectRoot2(),
463
+ takeOver: params.takeOver === true,
464
+ forceClaim: params.forceClaim === true
465
+ });
466
+ return { success: true, data: result };
467
+ } catch (err) {
468
+ const code = err?.code;
469
+ const message = err instanceof Error ? err.message : String(err);
470
+ let errorCode = "E_GENERAL";
471
+ if (code === 2) errorCode = "E_INVALID_INPUT";
472
+ else if (code === 4) errorCode = "E_NOT_FOUND";
473
+ else if (code === 6) errorCode = "E_VALIDATION";
474
+ else if (code === 38) errorCode = "E_NOT_ACTIVE";
475
+ else if (code === 35) errorCode = "E_TASK_CLAIMED";
476
+ else if (code === 24) errorCode = "E_SESSION_UNBOUND";
477
+ else if (code === 26) errorCode = "E_TASK_RENAMED";
478
+ const cleo = err instanceof CleoError ? err : void 0;
479
+ return {
480
+ success: false,
481
+ error: {
482
+ code: errorCode,
483
+ message,
484
+ ...typeof code === "number" && code !== 0 ? { exitCode: code } : {},
485
+ ...cleo?.fix ? { fix: cleo.fix } : {},
486
+ ...cleo?.details ? { details: cleo.details } : {}
487
+ }
488
+ };
489
+ }
490
+ }
491
+ async function orchestrateWorktreeCompleteOp(params) {
492
+ return handleWorktreeComplete(params.taskId, getProjectRoot2(), params.resolve);
493
+ }
494
+ async function orchestrateWorktreeCleanupOp(params) {
495
+ return handleWorktreeCleanup(getProjectRoot2(), params.taskIds);
496
+ }
497
+ async function orchestrateWorktreePruneOp(params) {
498
+ return handleWorktreePrune(getProjectRoot2(), params.taskId);
499
+ }
500
+ async function orchestrateParallelOp(params) {
501
+ return Promise.resolve({ success: true, data: params });
502
+ }
503
+ async function orchestrateFanoutOp(params) {
504
+ return orchestrateFanoutImpl(params.items, getProjectRoot2());
505
+ }
506
+ async function orchestrateApproveOp(params) {
507
+ return Promise.resolve({ success: true, data: params });
508
+ }
509
+ async function orchestrateRejectOp(params) {
510
+ return Promise.resolve({ success: true, data: params });
511
+ }
512
+ var coreOps = {
513
+ status: orchestrateStatusOp,
514
+ next: orchestrateNextOp,
515
+ ready: orchestrateReadyOp,
516
+ report: orchestrateReportOp,
517
+ analyze: orchestrateAnalyzeOp,
518
+ classify: orchestrateClassifyOp,
519
+ "fanout.status": orchestrateFanoutStatusOp,
520
+ context: orchestrateContextOp,
521
+ waves: orchestrateWavesOp,
522
+ plan: orchestratePlanOp,
523
+ bootstrap: orchestrateBootstrapOp,
524
+ "unblock.opportunities": orchestrateUnblockOp,
525
+ "ivtr.status": orchestrateIvtrStatusOp,
526
+ pending: orchestratePendingOp,
527
+ start: orchestrateStartOp,
528
+ spawn: orchestrateSpawnOp,
529
+ handoff: orchestrateHandoffOp,
530
+ "spawn.execute": orchestrateSpawnExecuteOp,
531
+ validate: orchestrateValidateOp,
532
+ pivot: orchestratePivotOp,
533
+ "worktree.complete": orchestrateWorktreeCompleteOp,
534
+ "worktree.cleanup": orchestrateWorktreeCleanupOp,
535
+ "worktree.prune": orchestrateWorktreePruneOp,
536
+ parallel: orchestrateParallelOp,
537
+ fanout: orchestrateFanoutOp,
538
+ approve: orchestrateApproveOp,
539
+ reject: orchestrateRejectOp
540
+ };
541
+ var OrchestrateHandler = class {
542
+ // -----------------------------------------------------------------------
543
+ // DomainHandler interface
544
+ // -----------------------------------------------------------------------
545
+ async query(operation, params) {
546
+ const startTime = Date.now();
547
+ try {
548
+ switch (operation) {
549
+ case "status": {
550
+ const p = { epicId: params?.epicId };
551
+ return wrapResult(await coreOps.status(p), "query", "orchestrate", operation, startTime);
552
+ }
553
+ case "next": {
554
+ if (!params?.epicId)
555
+ return errorResult(
556
+ "query",
557
+ "orchestrate",
558
+ operation,
559
+ "E_INVALID_INPUT",
560
+ "epicId is required",
561
+ startTime
562
+ );
563
+ const p = { epicId: params.epicId };
564
+ return wrapResult(await coreOps.next(p), "query", "orchestrate", operation, startTime);
565
+ }
566
+ case "ready": {
567
+ if (!params?.epicId)
568
+ return errorResult(
569
+ "query",
570
+ "orchestrate",
571
+ operation,
572
+ "E_INVALID_INPUT",
573
+ "epicId is required",
574
+ startTime
575
+ );
576
+ const viaRaw = params.via;
577
+ const via = viaRaw === "parent" || viaRaw === "saga" || viaRaw === "both" ? viaRaw : void 0;
578
+ const p = {
579
+ epicId: params.epicId,
580
+ ignoreDepsValidate: params.ignoreDepsValidate,
581
+ ...via !== void 0 && { via }
582
+ };
583
+ return wrapResult(await coreOps.ready(p), "query", "orchestrate", operation, startTime);
584
+ }
585
+ case "report": {
586
+ if (!params?.epicId)
587
+ return errorResult(
588
+ "query",
589
+ "orchestrate",
590
+ operation,
591
+ "E_INVALID_INPUT",
592
+ "epicId is required",
593
+ startTime
594
+ );
595
+ const rp = {
596
+ epicId: params.epicId,
597
+ page: params.page,
598
+ pageSize: params.pageSize
599
+ };
600
+ return wrapResult(await coreOps.report(rp), "query", "orchestrate", operation, startTime);
601
+ }
602
+ case "analyze": {
603
+ const p = {
604
+ epicId: params?.epicId,
605
+ mode: params?.mode,
606
+ taskIds: params?.taskIds
607
+ };
608
+ return wrapResult(
609
+ await coreOps.analyze(p),
610
+ "query",
611
+ "orchestrate",
612
+ "analyze",
613
+ startTime
614
+ );
615
+ }
616
+ case "classify": {
617
+ if (!params?.request)
618
+ return errorResult(
619
+ "query",
620
+ "orchestrate",
621
+ operation,
622
+ "E_INVALID_INPUT",
623
+ "request is required",
624
+ startTime
625
+ );
626
+ const p = {
627
+ request: params.request,
628
+ context: params.context
629
+ };
630
+ return wrapResult(
631
+ await coreOps.classify(p),
632
+ "query",
633
+ "orchestrate",
634
+ operation,
635
+ startTime
636
+ );
637
+ }
638
+ case "fanout.status": {
639
+ if (!params?.manifestEntryId)
640
+ return errorResult(
641
+ "query",
642
+ "orchestrate",
643
+ operation,
644
+ "E_INVALID_INPUT",
645
+ "manifestEntryId is required",
646
+ startTime
647
+ );
648
+ const p = {
649
+ manifestEntryId: params.manifestEntryId
650
+ };
651
+ const result = await coreOps["fanout.status"](p);
652
+ return {
653
+ meta: dispatchMeta("query", "orchestrate", operation, startTime),
654
+ success: true,
655
+ data: result.data
656
+ };
657
+ }
658
+ case "context": {
659
+ const p = { epicId: params?.epicId };
660
+ return wrapResult(await coreOps.context(p), "query", "orchestrate", operation, startTime);
661
+ }
662
+ case "waves": {
663
+ if (!params?.epicId)
664
+ return errorResult(
665
+ "query",
666
+ "orchestrate",
667
+ operation,
668
+ "E_INVALID_INPUT",
669
+ "epicId is required",
670
+ startTime
671
+ );
672
+ const wavesViaRaw = params.via;
673
+ const wavesVia = wavesViaRaw === "parent" || wavesViaRaw === "saga" || wavesViaRaw === "both" ? wavesViaRaw : void 0;
674
+ const p = {
675
+ epicId: params.epicId,
676
+ ...wavesVia !== void 0 && { via: wavesVia },
677
+ ...params.hideCompleted === true && { hideCompleted: true }
678
+ };
679
+ return wrapResult(await coreOps.waves(p), "query", "orchestrate", operation, startTime);
680
+ }
681
+ case "plan": {
682
+ if (!params?.epicId)
683
+ return errorResult(
684
+ "query",
685
+ "orchestrate",
686
+ operation,
687
+ "E_INVALID_INPUT",
688
+ "epicId is required",
689
+ startTime
690
+ );
691
+ const preferTierRaw = params.preferTier;
692
+ let preferTier;
693
+ if (preferTierRaw === 0 || preferTierRaw === 1 || preferTierRaw === 2) {
694
+ preferTier = preferTierRaw;
695
+ }
696
+ const p = { epicId: params.epicId, preferTier };
697
+ return wrapResult(await coreOps.plan(p), "query", "orchestrate", operation, startTime);
698
+ }
699
+ case "bootstrap": {
700
+ const p = {
701
+ speed: params?.speed
702
+ };
703
+ return wrapResult(
704
+ await coreOps.bootstrap(p),
705
+ "query",
706
+ "orchestrate",
707
+ operation,
708
+ startTime
709
+ );
710
+ }
711
+ case "unblock.opportunities":
712
+ return wrapResult(
713
+ await coreOps["unblock.opportunities"]({}),
714
+ "query",
715
+ "orchestrate",
716
+ operation,
717
+ startTime
718
+ );
719
+ case "ivtr.status":
720
+ return ivtrHandler.query("status", params);
721
+ case "pending":
722
+ return handlePendingApprovals(startTime);
723
+ default:
724
+ return errorResult(
725
+ "query",
726
+ "orchestrate",
727
+ operation,
728
+ "E_INVALID_OPERATION",
729
+ `Unknown orchestrate query: ${operation}`,
730
+ startTime
731
+ );
732
+ }
733
+ } catch (error) {
734
+ getLogger2("domain:orchestrate").error(
735
+ { gateway: "query", domain: "orchestrate", operation, err: error },
736
+ error instanceof Error ? error.message : String(error)
737
+ );
738
+ return handleErrorResult("query", "orchestrate", operation, error, startTime);
739
+ }
740
+ }
741
+ async mutate(operation, params) {
742
+ const startTime = Date.now();
743
+ try {
744
+ switch (operation) {
745
+ case "start": {
746
+ if (!params?.epicId)
747
+ return errorResult(
748
+ "mutate",
749
+ "orchestrate",
750
+ operation,
751
+ "E_INVALID_INPUT",
752
+ "epicId is required",
753
+ startTime
754
+ );
755
+ const p = { epicId: params.epicId };
756
+ return wrapResult(await coreOps.start(p), "mutate", "orchestrate", operation, startTime);
757
+ }
758
+ case "spawn": {
759
+ if (!params?.taskId)
760
+ return errorResult(
761
+ "mutate",
762
+ "orchestrate",
763
+ operation,
764
+ "E_INVALID_INPUT",
765
+ "taskId is required",
766
+ startTime
767
+ );
768
+ const tierRaw = params.tier;
769
+ const tier = tierRaw === 0 || tierRaw === 1 || tierRaw === 2 ? tierRaw : void 0;
770
+ const atomicityScopeRaw = params.atomicityScope;
771
+ const atomicityScope = atomicityScopeRaw === "orchestrator-defer" ? "orchestrator-defer" : void 0;
772
+ const p = {
773
+ taskId: params.taskId,
774
+ protocolType: params.protocolType,
775
+ tier,
776
+ noWorktree: params.noWorktree,
777
+ spawnScope: params.spawnScope,
778
+ ...atomicityScope ? { atomicityScope } : {},
779
+ // T12506 — `--resume` was dropped here, so every resume ran the
780
+ // normal provisioning path (and hit the worktree lock).
781
+ ...params.resume === true ? { resume: true } : {}
782
+ };
783
+ return wrapResult(await coreOps.spawn(p), "mutate", "orchestrate", operation, startTime);
784
+ }
785
+ case "handoff": {
786
+ if (!params?.taskId)
787
+ return errorResult(
788
+ "mutate",
789
+ "orchestrate",
790
+ operation,
791
+ "E_INVALID_INPUT",
792
+ "taskId is required",
793
+ startTime
794
+ );
795
+ if (!params?.protocolType)
796
+ return errorResult(
797
+ "mutate",
798
+ "orchestrate",
799
+ operation,
800
+ "E_INVALID_INPUT",
801
+ "protocolType is required",
802
+ startTime
803
+ );
804
+ const tierRaw = params.tier;
805
+ const tier = tierRaw === 0 || tierRaw === 1 || tierRaw === 2 ? tierRaw : void 0;
806
+ const p = {
807
+ taskId: params.taskId,
808
+ protocolType: params.protocolType,
809
+ note: params.note,
810
+ nextAction: params.nextAction,
811
+ variant: params.variant,
812
+ tier,
813
+ idempotencyKey: params.idempotencyKey
814
+ };
815
+ return wrapResult(
816
+ await coreOps.handoff(p),
817
+ "mutate",
818
+ "orchestrate",
819
+ operation,
820
+ startTime
821
+ );
822
+ }
823
+ case "spawn.execute": {
824
+ if (!params?.taskId)
825
+ return errorResult(
826
+ "mutate",
827
+ "orchestrate",
828
+ operation,
829
+ "E_INVALID_INPUT",
830
+ "taskId is required",
831
+ startTime
832
+ );
833
+ const tierRaw = params.tier;
834
+ const tier = tierRaw === 0 || tierRaw === 1 || tierRaw === 2 ? tierRaw : void 0;
835
+ const p = {
836
+ taskId: params.taskId,
837
+ adapterId: params.adapterId,
838
+ protocolType: params.protocolType,
839
+ tier
840
+ };
841
+ return wrapResult(
842
+ await coreOps["spawn.execute"](p),
843
+ "mutate",
844
+ "orchestrate",
845
+ operation,
846
+ startTime
847
+ );
848
+ }
849
+ case "validate": {
850
+ if (!params?.taskId)
851
+ return errorResult(
852
+ "mutate",
853
+ "orchestrate",
854
+ operation,
855
+ "E_INVALID_INPUT",
856
+ "taskId is required",
857
+ startTime
858
+ );
859
+ const p = { taskId: params.taskId };
860
+ return wrapResult(
861
+ await coreOps.validate(p),
862
+ "mutate",
863
+ "orchestrate",
864
+ operation,
865
+ startTime
866
+ );
867
+ }
868
+ case "pivot": {
869
+ if (!params?.fromTaskId)
870
+ return errorResult(
871
+ "mutate",
872
+ "orchestrate",
873
+ operation,
874
+ "E_INVALID_INPUT",
875
+ "fromTaskId is required",
876
+ startTime
877
+ );
878
+ if (!params?.toTaskId)
879
+ return errorResult(
880
+ "mutate",
881
+ "orchestrate",
882
+ operation,
883
+ "E_INVALID_INPUT",
884
+ "toTaskId is required",
885
+ startTime
886
+ );
887
+ if (!params?.reason || typeof params.reason !== "string" || !params.reason.trim())
888
+ return errorResult(
889
+ "mutate",
890
+ "orchestrate",
891
+ operation,
892
+ "E_VALIDATION",
893
+ "reason is required (no silent pivots)",
894
+ startTime
895
+ );
896
+ const p = {
897
+ fromTaskId: params.fromTaskId,
898
+ toTaskId: params.toTaskId,
899
+ reason: params.reason,
900
+ blocksFrom: params.blocksFrom,
901
+ takeOver: params.takeOver === true,
902
+ forceClaim: params.forceClaim === true
903
+ };
904
+ return wrapResult(
905
+ await coreOps.pivot(p),
906
+ "mutate",
907
+ "orchestrate",
908
+ operation,
909
+ startTime
910
+ );
911
+ }
912
+ case "worktree.complete": {
913
+ if (!params?.taskId)
914
+ return errorResult(
915
+ "mutate",
916
+ "orchestrate",
917
+ operation,
918
+ "E_INVALID_INPUT",
919
+ "taskId is required",
920
+ startTime
921
+ );
922
+ const rawResolve = params.resolve;
923
+ const resolve = rawResolve === "manual" ? "manual" : rawResolve === "auto" ? "auto" : void 0;
924
+ const p = {
925
+ taskId: params.taskId,
926
+ ...resolve !== void 0 ? { resolve } : {}
927
+ };
928
+ return wrapResult(
929
+ await coreOps["worktree.complete"](p),
930
+ "mutate",
931
+ "orchestrate",
932
+ operation,
933
+ startTime
934
+ );
935
+ }
936
+ case "worktree.cleanup": {
937
+ const p = {
938
+ taskIds: params?.taskIds
939
+ };
940
+ return wrapResult(
941
+ await coreOps["worktree.cleanup"](p),
942
+ "mutate",
943
+ "orchestrate",
944
+ operation,
945
+ startTime
946
+ );
947
+ }
948
+ case "worktree.prune": {
949
+ const p = {
950
+ taskId: params?.taskId
951
+ };
952
+ return wrapResult(
953
+ await coreOps["worktree.prune"](p),
954
+ "mutate",
955
+ "orchestrate",
956
+ operation,
957
+ startTime
958
+ );
959
+ }
960
+ case "parallel": {
961
+ return routeByParam(params, "action", {
962
+ start: async () => {
963
+ const epicId = params?.epicId;
964
+ const wave = params?.wave;
965
+ if (!epicId)
966
+ return errorResult(
967
+ "mutate",
968
+ "orchestrate",
969
+ "parallel",
970
+ "E_INVALID_INPUT",
971
+ "epicId is required",
972
+ startTime
973
+ );
974
+ if (wave === void 0 || wave === null)
975
+ return errorResult(
976
+ "mutate",
977
+ "orchestrate",
978
+ "parallel",
979
+ "E_INVALID_INPUT",
980
+ "wave number is required",
981
+ startTime
982
+ );
983
+ return wrapResult(
984
+ await orchestrateParallelStart(epicId, wave, getProjectRoot2()),
985
+ "mutate",
986
+ "orchestrate",
987
+ "parallel",
988
+ startTime
989
+ );
990
+ },
991
+ end: async () => {
992
+ const epicId = params?.epicId;
993
+ const wave = params?.wave;
994
+ if (!epicId)
995
+ return errorResult(
996
+ "mutate",
997
+ "orchestrate",
998
+ "parallel",
999
+ "E_INVALID_INPUT",
1000
+ "epicId is required",
1001
+ startTime
1002
+ );
1003
+ if (wave === void 0 || wave === null)
1004
+ return errorResult(
1005
+ "mutate",
1006
+ "orchestrate",
1007
+ "parallel",
1008
+ "E_INVALID_INPUT",
1009
+ "wave number is required",
1010
+ startTime
1011
+ );
1012
+ return wrapResult(
1013
+ await orchestrateParallelEnd(epicId, wave, getProjectRoot2()),
1014
+ "mutate",
1015
+ "orchestrate",
1016
+ "parallel",
1017
+ startTime
1018
+ );
1019
+ }
1020
+ });
1021
+ }
1022
+ case "fanout": {
1023
+ const items = params?.items;
1024
+ if (!items || !Array.isArray(items) || items.length === 0)
1025
+ return errorResult(
1026
+ "mutate",
1027
+ "orchestrate",
1028
+ operation,
1029
+ "E_INVALID_INPUT",
1030
+ "items array is required and must be non-empty",
1031
+ startTime
1032
+ );
1033
+ const p = { items };
1034
+ return wrapResult(
1035
+ await coreOps.fanout(p),
1036
+ "mutate",
1037
+ "orchestrate",
1038
+ operation,
1039
+ startTime
1040
+ );
1041
+ }
1042
+ case "ivtr.start":
1043
+ return ivtrHandler.mutate("start", params);
1044
+ case "ivtr.next":
1045
+ return ivtrHandler.mutate("next", params);
1046
+ case "ivtr.release":
1047
+ return ivtrHandler.mutate("release", params);
1048
+ case "ivtr.loop-back":
1049
+ return ivtrHandler.mutate("loop-back", params);
1050
+ case "approve":
1051
+ return handleApproveGate(params, startTime);
1052
+ case "reject":
1053
+ return handleRejectGate(params, startTime);
1054
+ default:
1055
+ return errorResult(
1056
+ "mutate",
1057
+ "orchestrate",
1058
+ operation,
1059
+ "E_INVALID_OPERATION",
1060
+ `Unknown orchestrate mutation: ${operation}`,
1061
+ startTime
1062
+ );
1063
+ }
1064
+ } catch (error) {
1065
+ getLogger2("domain:orchestrate").error(
1066
+ { gateway: "mutate", domain: "orchestrate", operation, err: error },
1067
+ error instanceof Error ? error.message : String(error)
1068
+ );
1069
+ return handleErrorResult("mutate", "orchestrate", operation, error, startTime);
1070
+ }
1071
+ }
1072
+ getSupportedOperations() {
1073
+ return {
1074
+ query: [
1075
+ "status",
1076
+ "next",
1077
+ "ready",
1078
+ "analyze",
1079
+ "context",
1080
+ "waves",
1081
+ "plan",
1082
+ "bootstrap",
1083
+ "unblock.opportunities",
1084
+ "classify",
1085
+ "fanout.status",
1086
+ "ivtr.status",
1087
+ "pending"
1088
+ ],
1089
+ mutate: [
1090
+ "start",
1091
+ "spawn",
1092
+ "handoff",
1093
+ "spawn.execute",
1094
+ "validate",
1095
+ "pivot",
1096
+ "parallel",
1097
+ "fanout",
1098
+ "ivtr.start",
1099
+ "ivtr.next",
1100
+ "ivtr.release",
1101
+ "ivtr.loop-back",
1102
+ "approve",
1103
+ "reject",
1104
+ "worktree.complete",
1105
+ "worktree.cleanup",
1106
+ "worktree.prune"
1107
+ ]
1108
+ };
1109
+ }
1110
+ };
1111
+ async function orchestrateClassify(request, context, projectRoot, taskId) {
1112
+ if (taskId) {
1113
+ try {
1114
+ const { getDb } = await import("@cleocode/core/store/sqlite");
1115
+ const { tasks } = await import("@cleocode/core/store/tasks-schema");
1116
+ const { eq } = await import("drizzle-orm");
1117
+ const { classifyTask } = await import("@cleocode/core");
1118
+ const db = await getDb(projectRoot);
1119
+ const row = await db.select().from(tasks).where(eq(tasks.id, taskId)).get();
1120
+ if (!row) {
1121
+ return {
1122
+ success: false,
1123
+ error: {
1124
+ code: "E_NOT_FOUND",
1125
+ message: `Task ${taskId} not found`
1126
+ }
1127
+ };
1128
+ }
1129
+ const task = {
1130
+ id: row.id,
1131
+ title: row.title,
1132
+ description: row.description ?? "",
1133
+ status: row.status,
1134
+ priority: row.priority ?? "medium",
1135
+ type: row.type ?? void 0,
1136
+ kind: row.kind ?? void 0,
1137
+ size: row.size ?? void 0,
1138
+ labels: (() => {
1139
+ try {
1140
+ const parsed = JSON.parse(row.labelsJson ?? "[]");
1141
+ return Array.isArray(parsed) ? parsed : [];
1142
+ } catch {
1143
+ return [];
1144
+ }
1145
+ })(),
1146
+ createdAt: row.createdAt
1147
+ };
1148
+ const result = classifyTask(task);
1149
+ return {
1150
+ success: true,
1151
+ data: {
1152
+ team: result.agentId,
1153
+ lead: result.role === "lead" ? result.agentId : null,
1154
+ protocol: result.role,
1155
+ stage: null,
1156
+ confidence: result.confidence,
1157
+ reasoning: result.warning ? `${result.reason} | warning: ${result.warning}` : result.reason
1158
+ }
1159
+ };
1160
+ } catch (error) {
1161
+ getLogger2("domain:orchestrate").error(
1162
+ { operation: "classify", taskId, err: error },
1163
+ error instanceof Error ? error.message : String(error)
1164
+ );
1165
+ return {
1166
+ success: false,
1167
+ error: {
1168
+ code: "E_CLASSIFY_FAILED",
1169
+ message: error instanceof Error ? error.message : String(error)
1170
+ }
1171
+ };
1172
+ }
1173
+ }
1174
+ try {
1175
+ const { getCleoCantWorkflowsDir } = await import("@cleocode/core/core-paths");
1176
+ const { readFileSync, readdirSync, existsSync } = await import("node:fs");
1177
+ const { join } = await import("node:path");
1178
+ const workflowsDir = getCleoCantWorkflowsDir();
1179
+ const combined = `${request} ${context ?? ""}`.toLowerCase();
1180
+ const matches = [];
1181
+ if (existsSync(workflowsDir)) {
1182
+ const files = readdirSync(workflowsDir).filter((f) => f.endsWith(".cant"));
1183
+ for (const file of files) {
1184
+ try {
1185
+ const src = readFileSync(join(workflowsDir, file), "utf-8");
1186
+ const teamMatch = /^team\s+(\S+):/m.exec(src);
1187
+ if (!teamMatch) continue;
1188
+ const teamName = teamMatch[1];
1189
+ const cwMatch = /consult-when:\s*["']?(.+?)["']?\s*$/m.exec(src);
1190
+ const consultWhen = cwMatch ? cwMatch[1].trim() : "";
1191
+ const stagesMatch = /stages:\s*\[([^\]]+)\]/.exec(src);
1192
+ const stages = stagesMatch ? stagesMatch[1].split(",").map((s) => s.trim()) : [];
1193
+ const hintWords = consultWhen.toLowerCase().split(/\s+/);
1194
+ const score = hintWords.filter((w) => combined.includes(w)).length;
1195
+ matches.push({ team: teamName, score, consultWhen, stages });
1196
+ } catch {
1197
+ }
1198
+ }
1199
+ }
1200
+ const localCantDir = join(projectRoot, CLEO_DIR_NAME, WORKFLOWS_SUBDIR);
1201
+ if (existsSync(localCantDir)) {
1202
+ const files = readdirSync(localCantDir).filter((f) => f.endsWith(".cant"));
1203
+ for (const file of files) {
1204
+ try {
1205
+ const src = readFileSync(join(localCantDir, file), "utf-8");
1206
+ const teamMatch = /^team\s+(\S+):/m.exec(src);
1207
+ if (!teamMatch) continue;
1208
+ const teamName = teamMatch[1];
1209
+ const cwMatch = /consult-when:\s*["']?(.+?)["']?\s*$/m.exec(src);
1210
+ const consultWhen = cwMatch ? cwMatch[1].trim() : "";
1211
+ const stagesMatch = /stages:\s*\[([^\]]+)\]/.exec(src);
1212
+ const stages = stagesMatch ? stagesMatch[1].split(",").map((s) => s.trim()) : [];
1213
+ const hintWords = consultWhen.toLowerCase().split(/\s+/);
1214
+ const score = hintWords.filter((w) => combined.includes(w)).length;
1215
+ matches.push({ team: teamName, score, consultWhen, stages });
1216
+ } catch {
1217
+ }
1218
+ }
1219
+ }
1220
+ if (matches.length === 0) {
1221
+ return {
1222
+ success: true,
1223
+ data: {
1224
+ team: null,
1225
+ lead: null,
1226
+ protocol: null,
1227
+ stage: null,
1228
+ confidence: 0,
1229
+ reasoning: "No CANT team definitions found. Seed teams.cant in the global workflows dir (W7b runtime enforcement) to enable team routing."
1230
+ }
1231
+ };
1232
+ }
1233
+ matches.sort((a, b) => b.score - a.score);
1234
+ const best = matches[0];
1235
+ const allHintWords = best.consultWhen.toLowerCase().split(/\s+/).filter(Boolean);
1236
+ const normalised = allHintWords.length > 0 ? Math.min(best.score / allHintWords.length, 1) : 0;
1237
+ const confidence = best.score > 0 ? Math.max(normalised, 0.5) : 0.1;
1238
+ return {
1239
+ success: true,
1240
+ data: {
1241
+ team: best.team,
1242
+ lead: null,
1243
+ protocol: "base-subagent",
1244
+ stage: best.stages[0] ?? null,
1245
+ confidence,
1246
+ reasoning: best.score > 0 ? `Matched team '${best.team}' via consult-when hint: "${best.consultWhen}"` : `No strong match found; defaulting to first registered team '${best.team}'`
1247
+ }
1248
+ };
1249
+ } catch (error) {
1250
+ getLogger2("domain:orchestrate").error(
1251
+ { operation: "classify", err: error },
1252
+ error instanceof Error ? error.message : String(error)
1253
+ );
1254
+ return {
1255
+ success: false,
1256
+ error: {
1257
+ code: "E_CLASSIFY_FAILED",
1258
+ message: error instanceof Error ? error.message : String(error)
1259
+ }
1260
+ };
1261
+ }
1262
+ }
1263
+ async function orchestrateFanoutImpl(items, projectRoot) {
1264
+ const manifestEntryId = `fanout-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
1265
+ try {
1266
+ const settled = await Promise.allSettled(
1267
+ items.map(async (item) => {
1268
+ const spawnResult = await orchestrateSpawnExecute(
1269
+ item.taskId,
1270
+ void 0,
1271
+ void 0,
1272
+ projectRoot,
1273
+ void 0
1274
+ );
1275
+ if (!spawnResult.success) {
1276
+ return {
1277
+ taskId: item.taskId,
1278
+ status: "failed",
1279
+ error: spawnResult.error?.message ?? `Spawn failed for task ${item.taskId}`
1280
+ };
1281
+ }
1282
+ const data = spawnResult.data;
1283
+ return {
1284
+ taskId: item.taskId,
1285
+ status: "spawned",
1286
+ instanceId: typeof data?.instanceId === "string" ? data.instanceId : void 0
1287
+ };
1288
+ })
1289
+ );
1290
+ const results = settled.map((outcome, i) => {
1291
+ if (outcome.status === "fulfilled") return outcome.value;
1292
+ return {
1293
+ taskId: items[i].taskId,
1294
+ status: "failed",
1295
+ error: outcome.reason instanceof Error ? outcome.reason.message : String(outcome.reason)
1296
+ };
1297
+ });
1298
+ fanoutManifestStore.set(manifestEntryId, { results, completedAt: (/* @__PURE__ */ new Date()).toISOString() });
1299
+ evictFanoutManifest();
1300
+ return {
1301
+ success: true,
1302
+ data: {
1303
+ manifestEntryId,
1304
+ results,
1305
+ total: items.length,
1306
+ spawned: results.filter((r) => r.status === "spawned").length,
1307
+ failed: results.filter((r) => r.status === "failed").length
1308
+ }
1309
+ };
1310
+ } catch (error) {
1311
+ getLogger2("domain:orchestrate").error(
1312
+ { operation: "fanout", err: error },
1313
+ error instanceof Error ? error.message : String(error)
1314
+ );
1315
+ return {
1316
+ success: false,
1317
+ error: {
1318
+ code: "E_FANOUT_FAILED",
1319
+ message: error instanceof Error ? error.message : String(error)
1320
+ }
1321
+ };
1322
+ }
1323
+ }
1324
+ async function orchestrateAnalyzeParallelSafety(taskIds, projectRoot) {
1325
+ if (taskIds.length === 0) {
1326
+ return {
1327
+ success: true,
1328
+ data: {
1329
+ parallelSafe: true,
1330
+ groups: [],
1331
+ note: "No tasks provided \u2014 trivially parallel-safe"
1332
+ }
1333
+ };
1334
+ }
1335
+ try {
1336
+ let transitiveClose2 = function(id, visited = /* @__PURE__ */ new Set()) {
1337
+ if (visited.has(id)) return visited;
1338
+ visited.add(id);
1339
+ const deps = depMap.get(id) ?? [];
1340
+ for (const dep of deps) {
1341
+ transitiveClose2(dep, visited);
1342
+ }
1343
+ return visited;
1344
+ }, parallelSafe2 = function(a, b) {
1345
+ const closureA = closures.get(a) ?? /* @__PURE__ */ new Set();
1346
+ const closureB = closures.get(b) ?? /* @__PURE__ */ new Set();
1347
+ return !closureA.has(b) && !closureB.has(a);
1348
+ };
1349
+ var transitiveClose = transitiveClose2, parallelSafe = parallelSafe2;
1350
+ const { getTaskAccessor } = await import("@cleocode/core/store/data-accessor");
1351
+ const accessor = await getTaskAccessor(projectRoot);
1352
+ const result = await accessor.queryTasks({});
1353
+ const allTasks = result?.tasks ?? [];
1354
+ const depMap = /* @__PURE__ */ new Map();
1355
+ for (const t of allTasks) {
1356
+ const deps = t.blockers ?? [];
1357
+ depMap.set(t.id, deps);
1358
+ }
1359
+ const closures = /* @__PURE__ */ new Map();
1360
+ for (const id of taskIds) {
1361
+ closures.set(id, transitiveClose2(id));
1362
+ }
1363
+ const groups = [];
1364
+ for (const id of taskIds) {
1365
+ let placed = false;
1366
+ for (const group of groups) {
1367
+ if (group.every((member) => parallelSafe2(id, member))) {
1368
+ group.push(id);
1369
+ placed = true;
1370
+ break;
1371
+ }
1372
+ }
1373
+ if (!placed) {
1374
+ groups.push([id]);
1375
+ }
1376
+ }
1377
+ return {
1378
+ success: true,
1379
+ data: {
1380
+ parallelSafe: groups.length <= 1,
1381
+ groups,
1382
+ taskCount: taskIds.length,
1383
+ groupCount: groups.length
1384
+ }
1385
+ };
1386
+ } catch (error) {
1387
+ getLogger2("domain:orchestrate").error(
1388
+ { operation: "analyze/parallel-safety", err: error },
1389
+ error instanceof Error ? error.message : String(error)
1390
+ );
1391
+ return {
1392
+ success: false,
1393
+ error: {
1394
+ code: "E_ANALYZE_FAILED",
1395
+ message: error instanceof Error ? error.message : String(error)
1396
+ }
1397
+ };
1398
+ }
1399
+ }
1400
+ async function handleWorktreeComplete(taskId, projectRoot, resolve) {
1401
+ try {
1402
+ const { completeWorktreeForTask } = await import("@cleocode/core/orchestrate/worktree-complete");
1403
+ const result = completeWorktreeForTask(taskId, projectRoot, {
1404
+ resolve: resolve ?? "auto"
1405
+ });
1406
+ if (result.outcome === "conflict") {
1407
+ return {
1408
+ success: false,
1409
+ error: {
1410
+ code: "E_WORKTREE_COMPLETE_FAILED",
1411
+ message: result.reason,
1412
+ details: {
1413
+ taskId: result.taskId,
1414
+ integration: result.integration,
1415
+ recovery: result.recovery
1416
+ }
1417
+ }
1418
+ };
1419
+ }
1420
+ return { success: true, data: result };
1421
+ } catch (error) {
1422
+ getLogger2("domain:orchestrate").error(
1423
+ { operation: "worktree.complete", taskId, err: error },
1424
+ error instanceof Error ? error.message : String(error)
1425
+ );
1426
+ return {
1427
+ success: false,
1428
+ error: {
1429
+ code: "E_WORKTREE_COMPLETE_FAILED",
1430
+ message: error instanceof Error ? error.message : String(error)
1431
+ }
1432
+ };
1433
+ }
1434
+ }
1435
+ async function handleWorktreeCleanup(projectRoot, taskIds) {
1436
+ try {
1437
+ const { pruneOrphanedWorktrees } = await import("@cleocode/core/spawn/branch-lock");
1438
+ const activeSet = taskIds ? new Set(taskIds) : void 0;
1439
+ const result = pruneOrphanedWorktrees(projectRoot, activeSet);
1440
+ return { success: true, data: result };
1441
+ } catch (error) {
1442
+ getLogger2("domain:orchestrate").error(
1443
+ { operation: "worktree.cleanup", err: error },
1444
+ error instanceof Error ? error.message : String(error)
1445
+ );
1446
+ return {
1447
+ success: false,
1448
+ error: {
1449
+ code: "E_WORKTREE_CLEANUP_FAILED",
1450
+ message: error instanceof Error ? error.message : String(error)
1451
+ }
1452
+ };
1453
+ }
1454
+ }
1455
+ async function handleWorktreePrune(projectRoot, taskId) {
1456
+ try {
1457
+ const { pruneWorktree, pruneOrphanedWorktrees } = await import("@cleocode/core/spawn/branch-lock");
1458
+ if (taskId) {
1459
+ const result2 = pruneWorktree(taskId, projectRoot);
1460
+ return { success: true, data: result2 };
1461
+ }
1462
+ const result = pruneOrphanedWorktrees(projectRoot, void 0);
1463
+ return { success: true, data: { ...result, mode: "bulk" } };
1464
+ } catch (error) {
1465
+ getLogger2("domain:orchestrate").error(
1466
+ { operation: "worktree.prune", taskId, err: error },
1467
+ error instanceof Error ? error.message : String(error)
1468
+ );
1469
+ return {
1470
+ success: false,
1471
+ error: {
1472
+ code: "E_WORKTREE_PRUNE_FAILED",
1473
+ message: error instanceof Error ? error.message : String(error)
1474
+ }
1475
+ };
1476
+ }
1477
+ }
1478
+ async function handlePendingApprovals(startTime) {
1479
+ try {
1480
+ const approvals = await listPendingApprovalsForDispatch();
1481
+ return {
1482
+ meta: dispatchMeta("query", "orchestrate", "pending", startTime),
1483
+ success: true,
1484
+ data: { approvals, count: approvals.length, total: approvals.length }
1485
+ };
1486
+ } catch (error) {
1487
+ getLogger2("domain:orchestrate").error(
1488
+ { operation: "pending", err: error },
1489
+ error instanceof Error ? error.message : String(error)
1490
+ );
1491
+ return handleErrorResult("query", "orchestrate", "pending", error, startTime);
1492
+ }
1493
+ }
1494
+ async function handleApproveGate(params, startTime) {
1495
+ const resumeToken = params?.resumeToken;
1496
+ if (!resumeToken)
1497
+ return errorResult(
1498
+ "mutate",
1499
+ "orchestrate",
1500
+ "approve",
1501
+ "E_VALIDATION",
1502
+ "resumeToken is required",
1503
+ startTime
1504
+ );
1505
+ const approver = typeof params?.approver === "string" && params.approver.length > 0 ? params.approver : "cli-user";
1506
+ const reason = typeof params?.reason === "string" ? params.reason : void 0;
1507
+ try {
1508
+ const existing = await lookupApprovalByTokenForDispatch(resumeToken);
1509
+ if (existing === null)
1510
+ return errorResult(
1511
+ "mutate",
1512
+ "orchestrate",
1513
+ "approve",
1514
+ "E_APPROVAL_NOT_FOUND",
1515
+ `no approval gate for token ${resumeToken}`,
1516
+ startTime
1517
+ );
1518
+ if (existing.status === "approved") {
1519
+ return {
1520
+ meta: dispatchMeta("mutate", "orchestrate", "approve", startTime),
1521
+ success: true,
1522
+ data: { ...existing, idempotent: true }
1523
+ };
1524
+ }
1525
+ if (existing.status === "rejected")
1526
+ return errorResult(
1527
+ "mutate",
1528
+ "orchestrate",
1529
+ "approve",
1530
+ "E_APPROVAL_ALREADY_DECIDED",
1531
+ `gate ${existing.approvalId} was rejected${existing.reason ? ` (${existing.reason})` : ""}`,
1532
+ startTime
1533
+ );
1534
+ const db = await acquirePlaybookDb();
1535
+ const { approveGate } = await import("./src-LYLXHXHH.js");
1536
+ const updated = approveGate(db, resumeToken, approver, reason);
1537
+ return {
1538
+ meta: dispatchMeta("mutate", "orchestrate", "approve", startTime),
1539
+ success: true,
1540
+ data: updated
1541
+ };
1542
+ } catch (error) {
1543
+ const message = error instanceof Error ? error.message : String(error);
1544
+ if (message.includes("E_APPROVAL_ALREADY_DECIDED"))
1545
+ return errorResult(
1546
+ "mutate",
1547
+ "orchestrate",
1548
+ "approve",
1549
+ "E_APPROVAL_ALREADY_DECIDED",
1550
+ message,
1551
+ startTime
1552
+ );
1553
+ if (message.includes("E_APPROVAL_NOT_FOUND"))
1554
+ return errorResult(
1555
+ "mutate",
1556
+ "orchestrate",
1557
+ "approve",
1558
+ "E_APPROVAL_NOT_FOUND",
1559
+ message,
1560
+ startTime
1561
+ );
1562
+ getLogger2("domain:orchestrate").error({ operation: "approve", err: error }, message);
1563
+ return handleErrorResult("mutate", "orchestrate", "approve", error, startTime);
1564
+ }
1565
+ }
1566
+ async function handleRejectGate(params, startTime) {
1567
+ const resumeToken = params?.resumeToken;
1568
+ if (!resumeToken)
1569
+ return errorResult(
1570
+ "mutate",
1571
+ "orchestrate",
1572
+ "reject",
1573
+ "E_VALIDATION",
1574
+ "resumeToken is required",
1575
+ startTime
1576
+ );
1577
+ const reason = typeof params?.reason === "string" ? params.reason.trim() : "";
1578
+ if (reason.length === 0)
1579
+ return errorResult(
1580
+ "mutate",
1581
+ "orchestrate",
1582
+ "reject",
1583
+ "E_VALIDATION",
1584
+ "reason is required for rejection",
1585
+ startTime
1586
+ );
1587
+ const approver = typeof params?.approver === "string" && params.approver.length > 0 ? params.approver : "cli-user";
1588
+ try {
1589
+ const existing = await lookupApprovalByTokenForDispatch(resumeToken);
1590
+ if (existing === null)
1591
+ return errorResult(
1592
+ "mutate",
1593
+ "orchestrate",
1594
+ "reject",
1595
+ "E_APPROVAL_NOT_FOUND",
1596
+ `no approval gate for token ${resumeToken}`,
1597
+ startTime
1598
+ );
1599
+ if (existing.status === "rejected") {
1600
+ return {
1601
+ meta: dispatchMeta("mutate", "orchestrate", "reject", startTime),
1602
+ success: true,
1603
+ data: { ...existing, idempotent: true }
1604
+ };
1605
+ }
1606
+ if (existing.status === "approved")
1607
+ return errorResult(
1608
+ "mutate",
1609
+ "orchestrate",
1610
+ "reject",
1611
+ "E_APPROVAL_ALREADY_DECIDED",
1612
+ `gate ${existing.approvalId} was already approved`,
1613
+ startTime
1614
+ );
1615
+ const db = await acquirePlaybookDb();
1616
+ const { rejectGate } = await import("./src-LYLXHXHH.js");
1617
+ const updated = rejectGate(db, resumeToken, approver, reason);
1618
+ return {
1619
+ meta: dispatchMeta("mutate", "orchestrate", "reject", startTime),
1620
+ success: true,
1621
+ data: updated
1622
+ };
1623
+ } catch (error) {
1624
+ const message = error instanceof Error ? error.message : String(error);
1625
+ if (message.includes("E_APPROVAL_ALREADY_DECIDED"))
1626
+ return errorResult(
1627
+ "mutate",
1628
+ "orchestrate",
1629
+ "reject",
1630
+ "E_APPROVAL_ALREADY_DECIDED",
1631
+ message,
1632
+ startTime
1633
+ );
1634
+ if (message.includes("E_APPROVAL_NOT_FOUND"))
1635
+ return errorResult(
1636
+ "mutate",
1637
+ "orchestrate",
1638
+ "reject",
1639
+ "E_APPROVAL_NOT_FOUND",
1640
+ message,
1641
+ startTime
1642
+ );
1643
+ getLogger2("domain:orchestrate").error({ operation: "reject", err: error }, message);
1644
+ return handleErrorResult("mutate", "orchestrate", "reject", error, startTime);
1645
+ }
1646
+ }
1647
+ export {
1648
+ OrchestrateHandler
1649
+ };
1650
+ //# sourceMappingURL=orchestrate-CZ2J6W3L.js.map