@cleocode/cleo 2026.10.4 → 2026.10.5
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.
- package/README.md +7 -0
- package/dist/cli/{adapter-LVXHFBC4.js → adapter-OUQRSFZL.js} +10 -9
- package/dist/cli/{add-WUAV7LDT.js → add-4SRRJL4U.js} +18 -18
- package/dist/cli/{add-batch-U2DLKAQC.js → add-batch-TSWICA5J.js} +12 -11
- package/dist/cli/admin-L3F6CDYH.js +1428 -0
- package/dist/cli/{admin-I7BQYVZD.js → admin-YMU55YCU.js} +10 -9
- package/dist/cli/{adr-K2THMQBS.js → adr-XESRMFMP.js} +10 -9
- package/dist/cli/{agent-WQ6XY2DW.js → agent-TAFPIYUU.js} +66 -28
- package/dist/cli/{agent-outputs-BJIYLVTU.js → agent-outputs-HVJJIPS4.js} +3 -3
- package/dist/cli/{analyze-PGQZWGOC.js → analyze-YQ22QVGW.js} +10 -9
- package/dist/cli/{archive-5LZPF7C3.js → archive-W5XX6AH7.js} +10 -9
- package/dist/cli/{archive-stats-U6CYC6JM.js → archive-stats-HP2KPAJU.js} +10 -9
- package/dist/cli/attention-7JBDCRZX.js +124 -0
- package/dist/cli/{attention-SOURWCNI.js → attention-ZXZANHKC.js} +13 -12
- package/dist/cli/{audit-FO2Y4LH2.js → audit-ICA2SEFN.js} +2 -2
- package/dist/cli/{auth-ED7TAIXI.js → auth-DXIG5OG7.js} +5 -5
- package/dist/cli/{backfill-32TRAYRD.js → backfill-LBSYBWLR.js} +2 -2
- package/dist/cli/{backup-LEJMZJKL.js → backup-NUGBZ7NA.js} +17 -16
- package/dist/cli/{backup-inspect-6HPLUEI2.js → backup-inspect-PDRXI45A.js} +3 -3
- package/dist/cli/{backup-recover-2BTYBZU2.js → backup-recover-TVKAPERB.js} +3 -3
- package/dist/cli/{blockers-5JULUJTV.js → blockers-ZOPCGHDW.js} +10 -9
- package/dist/cli/{brain-273N3FW4.js → brain-EJOBKL4A.js} +9 -12
- package/dist/cli/{briefing-7H6OLECX.js → briefing-RDQJ6WHS.js} +11 -10
- package/dist/cli/{caamp-MFQVN6VU.js → caamp-Z3XPKEHB.js} +2 -2
- package/dist/cli/{cancel-SCMJTXZB.js → cancel-S7EHLCJN.js} +10 -9
- package/dist/cli/{cant-46XCUP4P.js → cant-CHNN6O57.js} +2 -2
- package/dist/cli/{changeset-32NMBGG2.js → changeset-RYPHPN2B.js} +4 -6
- package/dist/cli/check-C67YAU7W.js +759 -0
- package/dist/cli/{check-RWJLBCI2.js → check-DHMURGHC.js} +30 -13
- package/dist/cli/{checkpoint-37HMMKD7.js → checkpoint-UWDFOGYQ.js} +3 -3
- package/dist/cli/{chunk-NRKWJLMS.js → chunk-22YPFZYB.js} +2 -2
- package/dist/cli/{chunk-I3CRQQAD.js → chunk-2MGFDMDF.js} +84 -37
- package/dist/cli/{chunk-BCEXRFA2.js → chunk-4JYHPP4C.js} +2 -2
- package/dist/cli/{chunk-A2IUEIM5.js → chunk-4PEODTHY.js} +2 -2
- package/dist/cli/{chunk-3ZO3M37V.js → chunk-4RGSNUUP.js} +118 -170
- package/dist/cli/{chunk-AWCQH2W5.js → chunk-4VASFLUW.js} +2 -2
- package/dist/cli/{chunk-BPEVD37G.js → chunk-5PNI276X.js} +2 -2
- package/dist/cli/{chunk-OGV57L4J.js → chunk-6N6WGLXE.js} +6 -2
- package/dist/cli/{chunk-KHB52JNB.js → chunk-75UH3BLS.js} +4 -3
- package/dist/cli/{chunk-5ZFFUFH7.js → chunk-7ACK4EIN.js} +2 -2
- package/dist/cli/{chunk-MNJRLSEQ.js → chunk-7NMKLVMI.js} +2 -2
- package/dist/cli/{chunk-GFGLLDXX.js → chunk-7SINJXB6.js} +2 -2
- package/dist/cli/{chunk-KJDWWQFY.js → chunk-7UARFJYS.js} +3 -3
- package/dist/cli/{chunk-JNZJPIPJ.js → chunk-7ZYPQV4N.js} +3 -3
- package/dist/cli/{chunk-DVTPIZJM.js → chunk-AQCYT3L4.js} +2 -2
- package/dist/cli/{chunk-EGOTK2HA.js → chunk-BQK6XTOH.js} +2 -2
- package/dist/cli/{chunk-DYABOIHB.js → chunk-CAPAGD5E.js} +6 -4
- package/dist/cli/{chunk-ZZTHTMQP.js → chunk-CHGEDCKG.js} +3 -3
- package/dist/cli/{chunk-QPUY2HQZ.js → chunk-COXFJ3PT.js} +2 -2
- package/dist/cli/chunk-D7BAQNV2.js +55 -0
- package/dist/cli/{chunk-OPTEQKBB.js → chunk-EIUXVHNF.js} +3 -3
- package/dist/cli/{chunk-3PGH67MT.js → chunk-EUGB6P5V.js} +4 -6
- package/dist/cli/chunk-EW2CKNNZ.js +304 -0
- package/dist/cli/{chunk-2JIJD2I7.js → chunk-FSKN4DWC.js} +2 -2
- package/dist/cli/{chunk-NSHV2JNM.js → chunk-FVKLULL7.js} +2 -2
- package/dist/cli/{chunk-GH37QXW5.js → chunk-GAGUBU4Z.js} +2 -2
- package/dist/cli/{chunk-37NU2XDP.js → chunk-GKRFH2YG.js} +2 -2
- package/dist/cli/{chunk-ULN4OKQQ.js → chunk-GRU74UE4.js} +21 -10
- package/dist/cli/{chunk-LKNUA3SB.js → chunk-HFLLZE6A.js} +2 -2
- package/dist/cli/{chunk-YGKEECTI.js → chunk-HXRXT3XU.js} +2 -2
- package/dist/cli/{chunk-REUTEW3O.js → chunk-IIOGUY3B.js} +6 -6
- package/dist/cli/chunk-ILWWL462.js +60 -0
- package/dist/cli/{chunk-XRAX6XFP.js → chunk-J5USPJKZ.js} +2 -2
- package/dist/cli/{chunk-S24YI723.js → chunk-KEQS36GD.js} +4 -4
- package/dist/cli/chunk-L7ONYSV6.js +2497 -0
- package/dist/cli/chunk-NEFMQYLE.js +656 -0
- package/dist/cli/{chunk-QFFQSKRC.js → chunk-NU6CQQVB.js} +6 -2
- package/dist/cli/{chunk-5J2VH3BC.js → chunk-PN4WW5VX.js} +3 -3
- package/dist/cli/{chunk-AYA6F4ZT.js → chunk-PSJ33WVO.js} +3 -3
- package/dist/cli/{chunk-FORFDPP5.js → chunk-QJJWWCIC.js} +3 -3
- package/dist/cli/{chunk-ZBISIPCK.js → chunk-QKMBWYAS.js} +16 -1
- package/dist/cli/chunk-QWNKLLLG.js +84 -0
- package/dist/cli/{chunk-7INMKEAD.js → chunk-QWUFFDL3.js} +2 -2
- package/dist/cli/chunk-QY76BRUZ.js +35 -0
- package/dist/cli/chunk-R45KVF5Y.js +117 -0
- package/dist/cli/{chunk-W33Q3FBH.js → chunk-RRKP7HLU.js} +3 -3
- package/dist/cli/{chunk-YUZJI67I.js → chunk-T6GZJYL3.js} +2 -2
- package/dist/cli/{chunk-LWQBJQSE.js → chunk-TLQ37HRE.js} +3 -3
- package/dist/cli/chunk-TPTNEJZJ.js +52 -0
- package/dist/cli/chunk-TYC7G5LF.js +100 -0
- package/dist/cli/{chunk-J3ZFM3UQ.js → chunk-UWCZY52R.js} +25 -13
- package/dist/cli/{chunk-V5GBGOGM.js → chunk-VB3LDPL5.js} +2 -2
- package/dist/cli/chunk-WWCYZYSN.js +56 -0
- package/dist/cli/{chunk-EBRZ76HS.js → chunk-XA5WISNV.js} +4 -3
- package/dist/cli/chunk-XHRZ7OYZ.js +132 -0
- package/dist/cli/{chunk-EOPQFCSR.js → chunk-XLPMIGJJ.js} +6 -6
- package/dist/cli/{chunk-NWTATTEQ.js → chunk-ZMGDZMSJ.js} +2 -2
- package/dist/cli/{claim-KPENYHIQ.js → claim-IGOG2QOC.js} +10 -9
- package/dist/cli/{classify-DRVMCFQU.js → classify-MG4N7GMQ.js} +2 -2
- package/dist/cli/{cli-T3CR7J57.js → cli-A23Q335V.js} +10 -7
- package/dist/cli/{cloud-PPQ4O5TX.js → cloud-SILYJVKO.js} +194 -28
- package/dist/cli/{code-Z5CTMVTD.js → code-H2FQCVMW.js} +2 -2
- package/dist/cli/{complete-UBOCOBRB.js → complete-JLX7NBI4.js} +9 -8
- package/dist/cli/{complexity-BV2AGQRZ.js → complexity-OKV7PVZH.js} +10 -9
- package/dist/cli/{compliance-32PD5Y47.js → compliance-QMGZHJNQ.js} +10 -9
- package/dist/cli/{conduit-VDKCH33F.js → conduit-4H32UYEA.js} +10 -9
- package/dist/cli/conduit-EY54WTZA.js +535 -0
- package/dist/cli/{config-I72JAXK4.js → config-TDYOC7XO.js} +21 -18
- package/dist/cli/{consensus-LFILLSTK.js → consensus-4XCOFPPT.js} +10 -9
- package/dist/cli/{context-XUUVFVTP.js → context-FN4YTGHD.js} +12 -11
- package/dist/cli/{contribution-37NQ4N5R.js → contribution-7RWFBJLC.js} +10 -9
- package/dist/cli/{curator-TFDXU2EX.js → curator-HKZJCVRL.js} +2 -2
- package/dist/cli/{current-C4SN5BWV.js → current-B2NU7V3G.js} +10 -9
- package/dist/cli/{daemon-DV25JQ62.js → daemon-GBD4TVCD.js} +11 -10
- package/dist/cli/{dash-TFU4RLQW.js → dash-IGDANIE5.js} +10 -9
- package/dist/cli/{decide-5VPMNTSI.js → decide-26SXC2V6.js} +5 -8
- package/dist/cli/{decompose-KOYEZNJL.js → decompose-LQ76TEZG.js} +11 -10
- package/dist/cli/{decomposition-7OHUFIQN.js → decomposition-WFRWNUSJ.js} +10 -9
- package/dist/cli/{delete-Q7YCAFY5.js → delete-T5DUQHOX.js} +11 -10
- package/dist/cli/{deps-6UZKLDGJ.js → deps-UTPZJBXL.js} +17 -18
- package/dist/cli/{detect-FERY35UL.js → detect-FFZSMVDT.js} +10 -9
- package/dist/cli/{detect-drift-UL2JTPUK.js → detect-drift-TVCJOFYJ.js} +7 -7
- package/dist/cli/diagnostics-GN5CVD3N.js +93 -0
- package/dist/cli/{diagnostics-TI5QAZXR.js → diagnostics-ZNBKH6GX.js} +10 -9
- package/dist/cli/docs-CLQKEEUK.js +1710 -0
- package/dist/cli/{docs-QI2PRN3T.js → docs-DPPDFTWR.js} +45 -42
- package/dist/cli/{doctor-AX5TICQO.js → doctor-GPENOP4N.js} +79 -62
- package/dist/cli/{doctor-ac-bindings-YPMYHU2G.js → doctor-ac-bindings-S3IOEFP4.js} +3 -3
- package/dist/cli/{doctor-acceptance-drift-PYNFGMKB.js → doctor-acceptance-drift-VNFKPBSQ.js} +3 -3
- package/dist/cli/{doctor-credentials-UZRIADKM.js → doctor-credentials-A5H4JMTF.js} +3 -3
- package/dist/cli/{doctor-db-substrate-Q2TOYM2S.js → doctor-db-substrate-FGCISE4Z.js} +3 -3
- package/dist/cli/{doctor-dep-cycles-GCVYZY6F.js → doctor-dep-cycles-BKKKHHYG.js} +3 -3
- package/dist/cli/{doctor-exodus-RO5SUTC2.js → doctor-exodus-ND2DH2KP.js} +3 -3
- package/dist/cli/{doctor-exodus-residue-EM2AWQXP.js → doctor-exodus-residue-4EMRYMEQ.js} +3 -3
- package/dist/cli/{doctor-fk-check-Q3FOLECE.js → doctor-fk-check-VY3RIQV3.js} +3 -3
- package/dist/cli/{doctor-global-delivery-TNOAQ3NP.js → doctor-global-delivery-JN6IGHUL.js} +3 -3
- package/dist/cli/{doctor-heavy-command-hook-IO3QAQLG.js → doctor-heavy-command-hook-XSN44WXU.js} +3 -3
- package/dist/cli/{doctor-legacy-backups-O2YH5VLS.js → doctor-legacy-backups-QAG5NHYP.js} +3 -3
- package/dist/cli/{doctor-legacy-reaper-VSEJEIFA.js → doctor-legacy-reaper-CIRGFE6R.js} +3 -3
- package/dist/cli/{doctor-malformed-ids-LQ766V5K.js → doctor-malformed-ids-WL7HT4TB.js} +3 -3
- package/dist/cli/{doctor-manifest-rows-6FQDNHLH.js → doctor-manifest-rows-SMQCKJ2T.js} +3 -3
- package/dist/cli/{doctor-memory-guard-J4PSEKB5.js → doctor-memory-guard-LJDOJG76.js} +3 -3
- package/dist/cli/{doctor-migrations-ONOH56YM.js → doctor-migrations-ETQPFNUP.js} +3 -3
- package/dist/cli/{doctor-nexus-residency-FUQAX7PV.js → doctor-nexus-residency-A4JMKBEJ.js} +3 -3
- package/dist/cli/{doctor-project-identity-GUDK3HYX.js → doctor-project-identity-FFQJ5LNX.js} +3 -3
- package/dist/cli/{doctor-projects-7L3BNL4O.js → doctor-projects-MFUTKRHP.js} +3 -3
- package/dist/cli/{doctor-projects-registry-TEAVHFQU.js → doctor-projects-registry-76X6VTGM.js} +3 -3
- package/dist/cli/{doctor-release-readiness-IEGHX6SL.js → doctor-release-readiness-QJCOPFTK.js} +3 -3
- package/dist/cli/{doctor-repair-NBONOSZU.js → doctor-repair-AU76FIKY.js} +3 -3
- package/dist/cli/doctor-row-identity-KW6JYZQE.js +26 -0
- package/dist/cli/{doctor-skill-fixtures-7Y6L34A3.js → doctor-skill-fixtures-G3T7JUHS.js} +3 -3
- package/dist/cli/{doctor-split-brain-TUKIGVHF.js → doctor-split-brain-FUW6L7FS.js} +3 -3
- package/dist/cli/{doctor-superseded-store-BHZY2B2L.js → doctor-superseded-store-DUHGSBLC.js} +3 -3
- package/dist/cli/doctor-sync-journal-SXMUIKF7.js +26 -0
- package/dist/cli/doctor-sync-triggers-6WNJZFRM.js +26 -0
- package/dist/cli/{doctor-tool-locks-REQMIVYK.js → doctor-tool-locks-66LSLUBN.js} +3 -3
- package/dist/cli/{doctor-twin-collapse-222GOSPE.js → doctor-twin-collapse-AYBYBFC4.js} +3 -3
- package/dist/cli/{doctor-worktree-stores-J7TCRVJ3.js → doctor-worktree-stores-C5XEH5OG.js} +3 -3
- package/dist/cli/{done-V3AOO65B.js → done-R64XRZ32.js} +11 -10
- package/dist/cli/entities-3JIHDIOK.js +361 -0
- package/dist/cli/{event-EGNPGE5A.js → event-45KEWV5H.js} +2 -2
- package/dist/cli/{exists-H4SDCBPL.js → exists-BEDZS5RI.js} +3 -3
- package/dist/cli/{exodus-KALO3B3X.js → exodus-DUX62344.js} +3 -3
- package/dist/cli/{export-ROFOCG4M.js → export-C5PQIQ5O.js} +11 -10
- package/dist/cli/{export-tasks-US3WBIEQ.js → export-tasks-CUXDZPJB.js} +11 -10
- package/dist/cli/{federation-SUIB5QWT.js → federation-ESM35EGG.js} +3 -3
- package/dist/cli/{find-YICG4BG6.js → find-5EUZHHQJ.js} +13 -12
- package/dist/cli/focus-6AH4KLRO.js +368 -0
- package/dist/cli/{focus-TKCZPKOM.js → focus-ANKAIRO5.js} +10 -9
- package/dist/cli/{gateway-H4HFDC3E.js → gateway-2GW2KTK3.js} +2 -2
- package/dist/cli/{gc-5R2TUY5T.js → gc-CTOQLUSA.js} +2 -2
- package/dist/cli/{go-PRQFK5YG.js → go-YJPNHHYT.js} +6 -6
- package/dist/cli/{goal-7CZRMLHC.js → goal-4GW4G77D.js} +4 -3
- package/dist/cli/{grade-PY2YRPUS.js → grade-25WSZH4X.js} +10 -9
- package/dist/cli/{graph-XIXMCFKG.js → graph-JUO3TMF3.js} +11 -10
- package/dist/cli/{history-EIXADPAD.js → history-NACNUQTC.js} +10 -9
- package/dist/cli/{import-R73SO444.js → import-7ESGL5SS.js} +10 -9
- package/dist/cli/{import-tasks-O22FZJ4U.js → import-tasks-FLE2RPBR.js} +10 -9
- package/dist/cli/index.js +395 -238
- package/dist/cli/{init-IHEJDQWU.js → init-AN4DZ2XO.js} +5 -5
- package/dist/cli/{inject-LSRVWNCP.js → inject-HQWA5GWY.js} +10 -9
- package/dist/cli/{install-global-4AZUCH6U.js → install-global-YQV4W5OG.js} +2 -2
- package/dist/cli/intelligence-OFFNQGHE.js +238 -0
- package/dist/cli/{intelligence-2OSFOGD2.js → intelligence-QIC4SN4X.js} +10 -9
- package/dist/cli/{issue-IIWEDNFC.js → issue-P5RNMRDG.js} +10 -9
- package/dist/cli/{janitor-GPMC7VOR.js → janitor-ZNCFQ7E3.js} +2 -2
- package/dist/cli/{labels-5NPOIQXN.js → labels-ORBM3T57.js} +10 -9
- package/dist/cli/{lifecycle-4FFS2K2T.js → lifecycle-MHR22TVI.js} +13 -12
- package/dist/cli/{list-47KEUGPQ.js → list-LB6GCYYU.js} +14 -13
- package/dist/cli/llm-H7LZWQKX.js +130 -0
- package/dist/cli/{llm-G5B3I6GD.js → llm-OTJWPMGI.js} +14 -13
- package/dist/cli/{llm-cost-S7RS6BVA.js → llm-cost-MLMXEAR4.js} +3 -3
- package/dist/cli/{llm-stream-24A45NTS.js → llm-stream-AAEUNKRP.js} +3 -3
- package/dist/cli/{log-XF6H2XSD.js → log-W2A5M2NA.js} +10 -9
- package/dist/cli/{login-LBPLGHYG.js → login-SIXFFZSP.js} +6 -4
- package/dist/cli/{logout-SX4JSJIV.js → logout-G3KVLQQM.js} +5 -5
- package/dist/cli/{manifest-NMCW4PIW.js → manifest-G4T6EBSI.js} +10 -9
- package/dist/cli/{map-BU72KMGF.js → map-VU5M72TK.js} +10 -9
- package/dist/cli/{memory-UHYIVGVM.js → memory-2E27G2G5.js} +17 -21
- package/dist/cli/memory-IAEYKXG6.js +1895 -0
- package/dist/cli/{migrate-agents-v2-OO7OILZK.js → migrate-agents-v2-A52QIYNJ.js} +3 -3
- package/dist/cli/{migrate-claude-mem-EDNYUY3K.js → migrate-claude-mem-TPDW3R4Z.js} +17 -12
- package/dist/cli/{next-RZFRG5X7.js → next-SVH4LIDY.js} +10 -9
- package/dist/cli/nexus-FPQV2EAF.js +1059 -0
- package/dist/cli/{nexus-4S4Z5EVU.js → nexus-XSFXN5E6.js} +14 -13
- package/dist/cli/{ops-KR7AWCG3.js → ops-K6LHY5J6.js} +10 -9
- package/dist/cli/orchestrate-CZ2J6W3L.js +1650 -0
- package/dist/cli/{orchestrate-HOYZY3VX.js → orchestrate-HURUCQFT.js} +13 -11
- package/dist/cli/{otel-U7IIRBCT.js → otel-JCNPVJLZ.js} +2 -2
- package/dist/cli/{phase-NYZFHUE5.js → phase-VDFRASSO.js} +10 -9
- package/dist/cli/pipeline-TCZPOEDR.js +697 -0
- package/dist/cli/{pivot-FF2CVUZL.js → pivot-V5MSQZ7L.js} +10 -9
- package/dist/cli/{plan-3SL2NTRV.js → plan-SQUGCKSM.js} +10 -9
- package/dist/cli/{playbook-2FCBV7N3.js → playbook-L47GLDQD.js} +10 -9
- package/dist/cli/playbook-NJVO4R6P.js +33 -0
- package/dist/cli/{project-WDX2TGMC.js → project-YZEC7GYF.js} +6 -5
- package/dist/cli/{promote-YINYFBZY.js → promote-FINF4HVK.js} +10 -9
- package/dist/cli/provenance-3TUWVBFR.js +141 -0
- package/dist/cli/{provenance-C7AYD7WG.js → provenance-YZG33JGM.js} +10 -9
- package/dist/cli/{provider-QLJEDQBR.js → provider-23JVLLG3.js} +10 -9
- package/dist/cli/{reason-JF5BHBM5.js → reason-FHN54O7O.js} +10 -9
- package/dist/cli/{reconcile-NMISHDGX.js → reconcile-MOM5T4AX.js} +11 -10
- package/dist/cli/{refresh-memory-EY5YNICV.js → refresh-memory-3OSTRAVK.js} +2 -2
- package/dist/cli/{relates-R3ZPICAY.js → relates-6FWUFUS2.js} +10 -9
- package/dist/cli/release-G2DPSG5M.js +347 -0
- package/dist/cli/{release-4ZJTMUUT.js → release-URX6JHZ2.js} +10 -9
- package/dist/cli/{remote-QSONJDIK.js → remote-VIULU2T5.js} +3 -3
- package/dist/cli/{renderers-64OR3IWX.js → renderers-TGSW77J4.js} +2 -2
- package/dist/cli/{reorder-J3DOE7ST.js → reorder-UIPN6TQY.js} +10 -9
- package/dist/cli/{reparent-2OUMKEZX.js → reparent-ALOWWUIU.js} +10 -9
- package/dist/cli/{req-TZB7OFKO.js → req-RH2Y3H7A.js} +10 -9
- package/dist/cli/{research-MTD7EX45.js → research-G2Y72HRC.js} +10 -9
- package/dist/cli/{restore-VEUOX7NF.js → restore-VBR5XNML.js} +62 -15
- package/dist/cli/{revert-3YF2IL5G.js → revert-32LDNSGP.js} +2 -2
- package/dist/cli/{roadmap-7OOQLXKG.js → roadmap-LFU3AG7D.js} +10 -9
- package/dist/cli/{run-2U5NZV5Z.js → run-HXRILSR7.js} +40 -6
- package/dist/cli/{safestop-VR4VK56D.js → safestop-Z5UC7NGQ.js} +10 -9
- package/dist/cli/{saga-SEWPIOX2.js → saga-Y6FZS6AM.js} +12 -11
- package/dist/cli/{schema-C52WZ35V.js → schema-OOOKLWUE.js} +5 -5
- package/dist/cli/{self-update-GQIGUDPS.js → self-update-26SOTJMH.js} +3 -3
- package/dist/cli/{selfimprove-3Y5L4ECT.js → selfimprove-4SMOCLUV.js} +10 -9
- package/dist/cli/selfimprove-EB4RQLP4.js +139 -0
- package/dist/cli/sentient-QPETVE53.js +254 -0
- package/dist/cli/{sentient-M4YMAVGV.js → sentient-RGMWR4XJ.js} +2 -2
- package/dist/cli/{sequence-6UBMA4IF.js → sequence-H7DSAJPF.js} +10 -9
- package/dist/cli/{service-5R7SILZ7.js → service-EK5MGB2D.js} +10 -9
- package/dist/cli/service-GLOMZWPQ.js +437 -0
- package/dist/cli/{session-3C6AAC4Y.js → session-HYUXAQGC.js} +12 -11
- package/dist/cli/session-N5ISU56W.js +568 -0
- package/dist/cli/{setup-BTUBW5PU.js → setup-L3YYV53D.js} +4 -4
- package/dist/cli/{show-MXT2V7TF.js → show-364V3KY2.js} +12 -11
- package/dist/cli/{skill-GFUZOU2C.js → skill-F2KR6HW5.js} +2 -2
- package/dist/cli/{skills-EDWLKAF3.js → skills-FS3DCP6E.js} +13 -12
- package/dist/cli/{snapshot-GUWMURCM.js → snapshot-EGXEQ5PR.js} +12 -11
- package/dist/cli/{src-66GAKPXR.js → src-LYLXHXHH.js} +2 -2
- package/dist/cli/{start-QFG56RGN.js → start-6DXOCCKL.js} +10 -9
- package/dist/cli/{stats-GW55P7RR.js → stats-UVUQEGYC.js} +10 -9
- package/dist/cli/{status-46HTKNRR.js → status-XLKYLN42.js} +3 -3
- package/dist/cli/sticky-VSTQ2I2O.js +264 -0
- package/dist/cli/{sticky-2DUZOUGI.js → sticky-XZXZDCFW.js} +12 -11
- package/dist/cli/{stop-J2QEUKHX.js → stop-VNOAFWNB.js} +10 -9
- package/dist/cli/{sync-GJP2QYT5.js → sync-YYPARW3A.js} +11 -10
- package/dist/cli/tasks-C24KHTFF.js +1118 -0
- package/dist/cli/{tasks-BNXTM7PB.js → tasks-LBJC7CZV.js} +10 -9
- package/dist/cli/{telemetry-55Z2XJWL.js → telemetry-CU7W5WAY.js} +2 -2
- package/dist/cli/{templates-7O77TKPV.js → templates-G42JBUY4.js} +9 -11
- package/dist/cli/{testing-37YTBNKP.js → testing-HSRITHEY.js} +10 -9
- package/dist/cli/{token-UAVJMNUI.js → token-J74E7TSU.js} +10 -9
- package/dist/cli/tools-BI74W7VE.js +652 -0
- package/dist/cli/{transcript-LORQTV5Z.js → transcript-RGK7RSGQ.js} +2 -2
- package/dist/cli/{update-NVCYV2FT.js → update-2KQWA27S.js} +19 -17
- package/dist/cli/update-check-entry.js +124 -0
- package/dist/cli/update-notice-6SQ6WPQG.js +68 -0
- package/dist/cli/upgrade-E2MJAPC7.js +136 -0
- package/dist/cli/{upgrade-OXJXOGEF.js → upgrade-XRSQ4RWH.js} +5 -5
- package/dist/cli/{verify-LYLDHPT2.js → verify-WASRGDBA.js} +10 -9
- package/dist/cli/{web-QP2RP266.js → web-NJ3P67EU.js} +4 -4
- package/dist/cli/{workgraph-FXBSZDQE.js → workgraph-OHJ2VKJD.js} +6 -6
- package/dist/cli/{worktree-6RXAJIST.js → worktree-FVQLORFY.js} +10 -9
- package/dist/cli/worktree-ZJ6JTQNG.js +287 -0
- package/package.json +13 -13
- package/studio-dist/client/_app/immutable/chunks/{Btgeq_wq.js → AH7dIemv.js} +1 -1
- package/studio-dist/client/_app/immutable/chunks/{DgEKqO6r.js → BDgH40i3.js} +1 -1
- package/studio-dist/client/_app/immutable/chunks/BXDCSJ7U.js +1 -0
- package/studio-dist/client/_app/immutable/chunks/{CgBjxmu6.js → Gg4iYl59.js} +1 -1
- package/studio-dist/client/_app/immutable/entry/{app.a02HWaRB.js → app.DUDNK-37.js} +2 -2
- package/studio-dist/client/_app/immutable/entry/start.DNmZ0pA4.js +1 -0
- package/studio-dist/client/_app/immutable/nodes/{0.nTXyRfc-.js → 0.DWqP3ail.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{1.4zrWeHtl.js → 1.CZGVUP5B.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{15.D9mk4JyY.js → 15.DGaflZRS.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{16._-wt-sQf.js → 16.uYlarGXl.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{17.CUu6LQDj.js → 17.CZMR0E47.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{18.Dz4QRTkX.js → 18.CBC-AKH_.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{20.CJ2_EB0U.js → 20.BGi43MvQ.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{24.Igj2FS7k.js → 24.Dv8ftCyR.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/25.DQPVlTDQ.js +39 -0
- package/studio-dist/client/_app/immutable/nodes/{26.6iPyjT44.js → 26.Cl800304.js} +1 -1
- package/studio-dist/client/_app/immutable/nodes/{3.AA5GwNgP.js → 3.D_fQKj9f.js} +1 -1
- package/studio-dist/client/_app/version.json +1 -1
- package/studio-dist/server/chunks/{0-DGmsoBYm.js → 0-BpOagOst.js} +3 -3
- package/studio-dist/server/chunks/1-D0oRGR-C.js +9 -0
- package/studio-dist/server/chunks/{15-Bg6YTndh.js → 15-BcjHz7Tv.js} +3 -3
- package/studio-dist/server/chunks/{16-BObLwgyD.js → 16-CXm8TUk7.js} +3 -3
- package/studio-dist/server/chunks/{17-BNXGyAHX.js → 17-mSgUK-cp.js} +3 -3
- package/studio-dist/server/chunks/{18-UqQFRIID.js → 18-BtfnIw1d.js} +3 -3
- package/studio-dist/server/chunks/{20-CMn8a_yP.js → 20-By1e4QDS.js} +3 -3
- package/studio-dist/server/chunks/{24-BuOTDzib.js → 24-0i2YLVxG.js} +3 -3
- package/studio-dist/server/chunks/{dist-B8xbIrdB.js → 25-DPsrqbrh.js} +795 -10736
- package/studio-dist/server/chunks/{26-DWGObn2T.js → 26-P0XkOibm.js} +3 -3
- package/studio-dist/server/chunks/{3-CyiffdJZ.js → 3-WudjUK7e.js} +3 -3
- package/studio-dist/server/chunks/{_layout.svelte-DYtClaIk.js → _layout.svelte-D9m81Rle.js} +4 -4
- package/studio-dist/server/chunks/{_page.svelte-CEATWp_5.js → _page.svelte-2PDLOF83.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-Bip079LT.js → _page.svelte-BjE3jm2K.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-CV3xiD1y.js → _page.svelte-Clc0vmiZ.js} +4 -4
- package/studio-dist/server/chunks/{_page.svelte-DSSy6LuK.js → _page.svelte-DABdRT3h.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-1h9E6s_f.js → _page.svelte-DG3PjiHj.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-BT1EUadj.js → _page.svelte-Edy9CaE8.js} +20 -7
- package/studio-dist/server/chunks/{_page.svelte-BNNF62Nm.js → _page.svelte-Hrf3-ZR8.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-TF795TAS.js → _page.svelte-VB4O4Nl5.js} +3 -3
- package/studio-dist/server/chunks/{_page.svelte-Cv_KVJDV.js → _page.svelte-d3jEgjsI.js} +3 -3
- package/studio-dist/server/chunks/{_server.ts-CzrwbhkQ.js → _server.ts-BcRFsyo3.js} +4 -5
- package/studio-dist/server/chunks/{_server.ts-C4w6UdU0.js → _server.ts-CEWpIFrj.js} +6 -5
- package/studio-dist/server/chunks/{_server.ts-BlhRFLY3.js → _server.ts-CLVdVIF9.js} +2 -2
- package/studio-dist/server/chunks/{_server.ts-Db6mEile.js → _server.ts-D_j7aSy5.js} +6 -5
- package/studio-dist/server/chunks/{_server.ts-DWt8Dziu.js → _server.ts-QEZF8h2q.js} +4 -5
- package/studio-dist/server/chunks/{client-D8f2k-H_.js → client-Kp1dP1od.js} +2 -2
- package/studio-dist/server/chunks/{error.svelte-DbbOwIme.js → error.svelte-WOCioJVX.js} +3 -3
- package/studio-dist/server/chunks/{hooks.server-D2qbf3Zp.js → hooks.server-DH9zkIrJ.js} +3 -1
- package/studio-dist/server/chunks/{http-1ftNGTs5.js → http-DT5kxaWk.js} +5 -4
- package/studio-dist/server/chunks/{internal-CTULuLPB.js → internal-z0vqd5_u.js} +3 -3
- package/studio-dist/server/chunks/operations-registry-DdzmYzqX.js +10584 -0
- package/studio-dist/server/chunks/{stores-CS5XOReX.js → stores-s2kaL315.js} +2 -2
- package/studio-dist/server/index.js +1 -1
- package/studio-dist/server/manifest.js +17 -17
- package/dist/cli/chunk-3IOQVUO7.js +0 -17308
- package/dist/cli/chunk-OAPN46TC.js +0 -89
- package/studio-dist/client/_app/immutable/chunks/t81h7afa.js +0 -1
- package/studio-dist/client/_app/immutable/entry/start.BreMSngo.js +0 -1
- package/studio-dist/client/_app/immutable/nodes/25.BnATjVGN.js +0 -39
- package/studio-dist/server/chunks/1-8PfxPvlK.js +0 -9
- 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
|