@iowarp/clio-coder 0.3.9 → 0.4.1
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/CHANGELOG.md +92 -0
- package/NOTICE +33 -0
- package/README.md +121 -16
- package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
- package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
- package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
- package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
- package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
- package/dist/chunk-5YHDIDBP.js +97 -0
- package/dist/chunk-6CCS4G3W.js +1529 -0
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
- package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/chunk-6NJQITNH.js +1412 -0
- package/dist/chunk-6VC4OV3Z.js +365 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
- package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
- package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
- package/dist/chunk-7RY5VZPH.js +573 -0
- package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
- package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
- package/dist/chunk-BJGUKIG4.js +302 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
- package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/chunk-D4CJV46V.js +462 -0
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GIZNH63R.js +40 -0
- package/dist/chunk-GPPB3JBE.js +688 -0
- package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/chunk-HRQMFLJP.js +75 -0
- package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
- package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
- package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
- package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
- package/dist/chunk-J4HBWF6Y.js +2635 -0
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
- package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
- package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
- package/dist/chunk-K6BF4U2H.js +1785 -0
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
- package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
- package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
- package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
- package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
- package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/chunk-RKSR6VSF.js +132 -0
- package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
- package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
- package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
- package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
- package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
- package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
- package/dist/chunk-WR6U3OVP.js +45 -0
- package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
- package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/chunk-YAKGTXEV.js +17 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
- package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
- package/dist/cli/index.js +48 -37
- package/dist/clio-IT3G3VQH.js +25 -0
- package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
- package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
- package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
- package/dist/configure-FL7Y3KJF.js +54 -0
- package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
- package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
- package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
- package/dist/eval-inventory-HBWSWQOK.js +315 -0
- package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
- package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
- package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
- package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
- package/dist/fleet-decisions-OTHB6KRL.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
- package/dist/fleet-inspect-SS6YMDCK.js +445 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
- package/dist/fleet-verify-QD5M7E7Q.js +178 -0
- package/dist/fleet-view-WAMJYNDT.js +94 -0
- package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
- package/dist/install-NKNG7KD4.js +13 -0
- package/dist/interop-34TVO25M.js +116 -0
- package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
- package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
- package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
- package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
- package/dist/panes-7STHOAUJ.js +103 -0
- package/dist/panes-SHAUIRXY.js +60 -0
- package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
- package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
- package/dist/resources-74GKTLSF.js +115 -0
- package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
- package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
- package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
- package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
- package/dist/skills-inventory-J357J34F.js +129 -0
- package/dist/slash-commands-JZZCQA32.js +79 -0
- package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
- package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
- package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
- package/dist/tools-MKNWVPBH.js +29 -0
- package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
- package/dist/tui-primitives-K5PASC3O.js +17 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
- package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
- package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
- package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
- package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
- package/dist/with-panes-OBOBFIIR.js +818 -0
- package/dist/worker/entry.js +131 -91
- package/docs/README.md +3 -2
- package/docs/acp.md +25 -4
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +4 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +39 -4
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +138 -167
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +3 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +30 -7
- package/docs/installation-and-lifecycle.md +16 -3
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +16 -11
- package/docs/troubleshooting.md +2 -2
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +8 -16
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +8 -4
- package/src/cli/argv.ts +25 -0
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +50 -48
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +156 -0
- package/src/cli/doctor-toolchain.ts +78 -0
- package/src/cli/doctor.ts +34 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +827 -0
- package/src/cli/fleet.ts +154 -40
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +6 -3
- package/src/cli/run.ts +67 -13
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +23 -24
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +64 -2
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/cli/wiki-generate.ts +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +4 -0
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1070 -845
- package/src/core/defaults.ts +342 -463
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/response-schema.ts +44 -4
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/theme-token-hex.ts +43 -0
- package/src/core/timers.ts +2 -12
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +165 -36
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +37 -46
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +48 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capacity-lease.ts +23 -6
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +287 -111
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +59 -3
- package/src/domains/dispatch/gate-decisions.ts +36 -15
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +24 -27
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +599 -0
- package/src/domains/dispatch/state.ts +45 -1
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +16 -3
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/serving.ts +31 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +12 -2
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +20 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/index.ts +0 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +566 -0
- package/src/domains/mux/detect.ts +182 -0
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +53 -0
- package/src/domains/mux/index.ts +116 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +192 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +62 -0
- package/src/domains/mux/socket-client.ts +964 -0
- package/src/domains/mux/types.ts +265 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +182 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +251 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/cost.ts +21 -0
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/index.ts +2 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +63 -11
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +25 -8
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +46 -2
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +72 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/share/archive.ts +85 -36
- package/src/domains/toolchain/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +440 -96
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +20 -2
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +87 -0
- package/src/engine/claude/sdk-runtime.ts +25 -17
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/loop-guard.ts +0 -5
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +16 -26
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +207 -90
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +2 -1
- package/src/interactive/cost-overlay.ts +3 -1
- package/src/interactive/council-grid.ts +3 -5
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +56 -49
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +2 -44
- package/src/interactive/interactive-application.ts +229 -62
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +9 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +99 -23
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +3 -2
- package/src/interactive/modal-marker.ts +151 -0
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +62 -14
- package/src/interactive/overlay-general-openers.ts +7 -2
- package/src/interactive/overlay-key-routing.ts +21 -10
- package/src/interactive/overlay-lifecycle.ts +20 -4
- package/src/interactive/overlay-model-selectors.ts +43 -6
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +3 -2
- package/src/interactive/overlays/ask-user.ts +161 -41
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +29 -4
- package/src/interactive/overlays/cwd-fallback.ts +29 -4
- package/src/interactive/overlays/decisions.ts +15 -13
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +4 -3
- package/src/interactive/overlays/handoff-review.ts +3 -2
- package/src/interactive/overlays/help-reference.ts +2 -0
- package/src/interactive/overlays/interop.ts +2 -1
- package/src/interactive/overlays/library-install-confirm.ts +2 -1
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +2 -1
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +40 -31
- package/src/interactive/overlays/prompts.ts +11 -4
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +849 -268
- package/src/interactive/overlays/side-question.ts +3 -2
- package/src/interactive/overlays/skills-hub.ts +11 -19
- package/src/interactive/overlays/tree-selector.ts +3 -2
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +318 -0
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +521 -189
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +21 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +58 -13
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +120 -9
- package/src/interactive/view/view-overlay.ts +14 -10
- package/src/interactive/watch-pane.ts +180 -0
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +11 -5
- package/src/interactive/worker-receipts.ts +20 -2
- package/src/interactive/worker-stream.ts +6 -4
- package/src/interactive/yazi-bridge.ts +451 -0
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +16 -1
- package/src/tools/compete-worktrees.ts +108 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +18 -5
- package/src/tools/dispatch-arguments.ts +21 -21
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +145 -28
- package/src/tools/dispatch-runner.ts +40 -13
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +2 -2
- package/src/tools/executables.ts +17 -14
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +54 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-PNY46YEY.js +0 -1581
- package/dist/chunk-XDOQXGFO.js +0 -515
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/clio-LT5V7SSZ.js +0 -26
- package/dist/configure-2WYWSCSD.js +0 -49
- package/dist/doctor-TWBWFK5V.js +0 -165
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { createHash, randomBytes } from "node:crypto";
|
|
13
|
-
import { type Dirent,
|
|
13
|
+
import { type Dirent, readdirSync, readFileSync } from "node:fs";
|
|
14
14
|
import { isAbsolute, relative, resolve as resolvePath, sep } from "node:path";
|
|
15
15
|
import { performance } from "node:perf_hooks";
|
|
16
16
|
import { BusChannels, type DispatchCompletedPayload, type DispatchRunIdentity } from "../../core/bus-events.js";
|
|
@@ -58,6 +58,7 @@ import {
|
|
|
58
58
|
import type { AgentsContract } from "../agents/contract.js";
|
|
59
59
|
import type { AgentRecipe } from "../agents/recipe.js";
|
|
60
60
|
import { validateRecipeResult } from "../agents/result-contract.js";
|
|
61
|
+
import { nodeResultContractFilesystem } from "../agents/result-contract-filesystem.js";
|
|
61
62
|
import {
|
|
62
63
|
type AgentAudience,
|
|
63
64
|
type AgentCapabilityClass,
|
|
@@ -78,7 +79,7 @@ import {
|
|
|
78
79
|
type CapabilityFlags,
|
|
79
80
|
canonicalizeWireModelId,
|
|
80
81
|
type EndpointCapacity,
|
|
81
|
-
|
|
82
|
+
endpointCapacityFor,
|
|
82
83
|
endpointCapacityForStatus,
|
|
83
84
|
firstRuntimeResolutionError,
|
|
84
85
|
isDispatchEligibleRuntime,
|
|
@@ -86,6 +87,7 @@ import {
|
|
|
86
87
|
type ResolvedRuntimeTarget,
|
|
87
88
|
type RuntimeApiFamily,
|
|
88
89
|
type RuntimeDescriptor,
|
|
90
|
+
resolveEndpointCapacities,
|
|
89
91
|
resolveModelCapabilities,
|
|
90
92
|
resolveRuntimeTarget,
|
|
91
93
|
runtimeResolutionWarnings,
|
|
@@ -112,6 +114,7 @@ import {
|
|
|
112
114
|
routeValidationProjection,
|
|
113
115
|
} from "./active-route-planner.js";
|
|
114
116
|
import { admit, createCapacityAdmissionController, createLeaseSlotGuard } from "./admission.js";
|
|
117
|
+
import { AdmissionCanceledError } from "./admission-error.js";
|
|
115
118
|
import { agentRouteCandidates } from "./agent-candidates.js";
|
|
116
119
|
import { AGENT_LEDGER_PROMPT_MAX_CHARS, renderAgentLedger } from "./agent-ledger.js";
|
|
117
120
|
import { publishAgentLedgerEntry, subscribeAgentLedger } from "./agent-ledger-hub.js";
|
|
@@ -236,6 +239,7 @@ import {
|
|
|
236
239
|
import { createRouteObserver, type RouteObservationHandle, type RouteObserver } from "./route-observer.js";
|
|
237
240
|
import { reduceRouteQuality } from "./route-quality.js";
|
|
238
241
|
import { defaultRoutingIntent } from "./routing-intent.js";
|
|
242
|
+
import { attachRunEventJournalBridge, type RunEventJournalBridge } from "./run-event-journal-bridge.js";
|
|
239
243
|
import { detectRunIdentity } from "./run-identity.js";
|
|
240
244
|
import { type Ledger, newRunId, openLedger } from "./state.js";
|
|
241
245
|
import {
|
|
@@ -358,6 +362,12 @@ interface ActiveRun {
|
|
|
358
362
|
finalPromise: Promise<RunReceipt>;
|
|
359
363
|
}
|
|
360
364
|
|
|
365
|
+
interface PendingCapacityAdmission {
|
|
366
|
+
identity: DispatchRunIdentity & { requestOrigin: DispatchRequestOrigin };
|
|
367
|
+
timing: RunPhaseMarks;
|
|
368
|
+
node: RunNodeIdentity | null;
|
|
369
|
+
}
|
|
370
|
+
|
|
361
371
|
interface DispatchFinishContractSnapshot {
|
|
362
372
|
assessment: FinishContractAssessment;
|
|
363
373
|
rigor: Rigor;
|
|
@@ -398,6 +408,15 @@ export interface DispatchBundleOptions {
|
|
|
398
408
|
collectReproducibility?: typeof collectReproducibilityMetadata;
|
|
399
409
|
/** Observer injection seam. Production constructs the durable observer. */
|
|
400
410
|
routeObserver?: RouteObserver;
|
|
411
|
+
/**
|
|
412
|
+
* Write the durable run event journal for every run this bundle dispatches.
|
|
413
|
+
* Off by default and turned on by the three composition roots
|
|
414
|
+
* (src/entry/orchestrator.ts, src/cli/run.ts, src/cli/fleet.ts), because the
|
|
415
|
+
* process that owns a bundle also decides who owns the journal file: a
|
|
416
|
+
* composed process routes `registerAllTools`' event registry to
|
|
417
|
+
* `journal: null` so a tool-path run is transcribed once, not twice.
|
|
418
|
+
*/
|
|
419
|
+
journalRunEvents?: boolean;
|
|
401
420
|
}
|
|
402
421
|
|
|
403
422
|
const DEFAULT_HEARTBEAT_INTERVAL_MS = 1000;
|
|
@@ -437,8 +456,8 @@ function calculateUsageCostUsd(meter: RunTokenMeter, pricing: EffectivePricing["
|
|
|
437
456
|
* admit a route before settings are resolved, and it defers to the one place
|
|
438
457
|
* that owns the default rather than restating the number here.
|
|
439
458
|
*/
|
|
440
|
-
|
|
441
|
-
return settings?.
|
|
459
|
+
function admissionMaxOutputTokens(settings: EffectiveSettings): number {
|
|
460
|
+
return settings?.chat.maxOutputTokens ?? DEFAULT_SETTINGS.chat.maxOutputTokens;
|
|
442
461
|
}
|
|
443
462
|
|
|
444
463
|
function conservativeRouteAdmissionEstimateUsd(pricing: EffectivePricing, maxOutputTokens: number): number {
|
|
@@ -490,7 +509,7 @@ function eventContainsFirstModelToken(event: Record<string, unknown>): boolean {
|
|
|
490
509
|
}
|
|
491
510
|
|
|
492
511
|
function eventStartsTool(event: Record<string, unknown>): boolean {
|
|
493
|
-
return event.type === "tool_execution_start" || event.type === "
|
|
512
|
+
return event.type === "tool_execution_start" || event.type === "clio_coder_tool_start";
|
|
494
513
|
}
|
|
495
514
|
|
|
496
515
|
function finitePositive(value: unknown): number | undefined {
|
|
@@ -667,7 +686,7 @@ async function awaitEventDrain(drained: Promise<void>, graceMs = DISPATCH_DRAIN_
|
|
|
667
686
|
function reportDispatchDiagnostic(scope: string, error: unknown): void {
|
|
668
687
|
const message = error instanceof Error ? error.message : String(error);
|
|
669
688
|
try {
|
|
670
|
-
process.stderr.write(`[clio:dispatch] ${scope}: ${message}\n`);
|
|
689
|
+
process.stderr.write(`[clio-coder:dispatch] ${scope}: ${message}\n`);
|
|
671
690
|
} catch {
|
|
672
691
|
// stderr itself is best-effort
|
|
673
692
|
}
|
|
@@ -873,7 +892,7 @@ export interface WorkspaceRootFacts {
|
|
|
873
892
|
* claimed `npm test` then "validated" in 4ms. None of that is a model failure.
|
|
874
893
|
* The harness knows the cwd exactly and was sending it nowhere.
|
|
875
894
|
*/
|
|
876
|
-
|
|
895
|
+
function readWorkspaceRootFacts(
|
|
877
896
|
cwd: string,
|
|
878
897
|
readEntries: (dir: string) => Dirent[] = readDirentsSafely,
|
|
879
898
|
): WorkspaceRootFacts {
|
|
@@ -903,7 +922,7 @@ function readDirentsSafely(dir: string): Dirent[] {
|
|
|
903
922
|
* projection of CLIO-CODER.md: a read-only scout that cannot afford the handbook read
|
|
904
923
|
* still needs its first shell call to land in the right place.
|
|
905
924
|
*/
|
|
906
|
-
|
|
925
|
+
function renderWorkerWorkspaceContext(workspace: WorkspaceRootFacts): string {
|
|
907
926
|
const lines = ["# Workspace", `Root: ${workspace.root}`, "Your process starts here; relative paths resolve from it."];
|
|
908
927
|
if (workspace.entries.length > 0) {
|
|
909
928
|
lines.push(`Top level: ${workspace.entries.join(", ")}${workspace.truncated ? ", …" : ""}`);
|
|
@@ -956,7 +975,7 @@ function renderPipelineInput(input: PipelineInput): PipelineInputRender {
|
|
|
956
975
|
* the command actually printed rather than a summary of it. Like pipeline
|
|
957
976
|
* input, this is data and is never presented as instructions.
|
|
958
977
|
*/
|
|
959
|
-
|
|
978
|
+
function renderPredecessorHandoffs(handoffs: ReadonlyArray<ExecutionHandoff>): WorkerPromptMessage | null {
|
|
960
979
|
if (handoffs.length === 0) return null;
|
|
961
980
|
const body = [
|
|
962
981
|
"Outputs from this step's declared predecessors, in dependency order.",
|
|
@@ -1086,7 +1105,7 @@ export interface WorkerDynamicContext {
|
|
|
1086
1105
|
* the projected "Verification expectations" body (verification-class runs
|
|
1087
1106
|
* only); when off, output is byte-identical to the historical renderer.
|
|
1088
1107
|
*/
|
|
1089
|
-
|
|
1108
|
+
function renderWorkerProjectContext(
|
|
1090
1109
|
project: ProjectStructuredContext,
|
|
1091
1110
|
options: { includeVerification?: boolean } = {},
|
|
1092
1111
|
): string {
|
|
@@ -1128,7 +1147,7 @@ function workerProjectContextIncludesVerification(body: string): boolean {
|
|
|
1128
1147
|
return body.includes("\nVerification expectations:\n");
|
|
1129
1148
|
}
|
|
1130
1149
|
|
|
1131
|
-
|
|
1150
|
+
function buildDynamicPromptMessages(
|
|
1132
1151
|
req: DispatchRequest,
|
|
1133
1152
|
dynamicContext: WorkerDynamicContext = {},
|
|
1134
1153
|
): WorkerPromptMessage[] {
|
|
@@ -1336,7 +1355,7 @@ interface DispatchLifecycleStage {
|
|
|
1336
1355
|
interface AcpDelegationLifecycleStage {
|
|
1337
1356
|
admission: DispatchAdmissionStage;
|
|
1338
1357
|
pathScope: DispatchPathScope;
|
|
1339
|
-
agentConfig: ReturnType<ConfigContract["get"]>["
|
|
1358
|
+
agentConfig: ReturnType<ConfigContract["get"]>["integrations"]["externalAgents"]["entries"][number];
|
|
1340
1359
|
cwd: string;
|
|
1341
1360
|
systemPrompt: string;
|
|
1342
1361
|
dynamicPromptMessages: ReadonlyArray<WorkerPromptMessage>;
|
|
@@ -1588,7 +1607,7 @@ function workerToolCallHardCap(settings: EffectiveSettings): number {
|
|
|
1588
1607
|
const parsedEnvCap = rawEnvCap && /^[1-9]\d*$/.test(rawEnvCap) ? Number(rawEnvCap) : Number.NaN;
|
|
1589
1608
|
return Number.isSafeInteger(parsedEnvCap)
|
|
1590
1609
|
? parsedEnvCap
|
|
1591
|
-
: (settings?.
|
|
1610
|
+
: (settings?.fleet.limits.toolCallsPerRun ?? GUARDRAIL_DEFAULTS.workerToolCallCap);
|
|
1592
1611
|
}
|
|
1593
1612
|
|
|
1594
1613
|
function resolveEffectiveWorkerBudget(input: {
|
|
@@ -1716,15 +1735,15 @@ function acpRuntimeLimitations(): string[] {
|
|
|
1716
1735
|
}
|
|
1717
1736
|
|
|
1718
1737
|
function readWorkerTargets(settings: ReturnType<ConfigContract["get"]> | undefined): WorkerTargets {
|
|
1719
|
-
const workerDefault = settings?.
|
|
1738
|
+
const workerDefault = settings?.fleet?.default
|
|
1720
1739
|
? {
|
|
1721
|
-
target: settings.
|
|
1722
|
-
model: settings.
|
|
1723
|
-
thinkingLevel: (settings.
|
|
1740
|
+
target: settings.fleet.default.target ?? null,
|
|
1741
|
+
model: settings.fleet.default.model ?? null,
|
|
1742
|
+
thinkingLevel: (settings.fleet.default.thinkingLevel ?? "off") as ThinkingLevel,
|
|
1724
1743
|
}
|
|
1725
1744
|
: null;
|
|
1726
1745
|
const workerProfiles: WorkerProfileMap = {};
|
|
1727
|
-
for (const [name, profile] of Object.entries(settings?.
|
|
1746
|
+
for (const [name, profile] of Object.entries(settings?.fleet?.profiles ?? {})) {
|
|
1728
1747
|
workerProfiles[name] = {
|
|
1729
1748
|
target: profile.target ?? null,
|
|
1730
1749
|
model: profile.model ?? null,
|
|
@@ -1732,7 +1751,7 @@ function readWorkerTargets(settings: ReturnType<ConfigContract["get"]> | undefin
|
|
|
1732
1751
|
};
|
|
1733
1752
|
}
|
|
1734
1753
|
const agentBindings: WorkerAgentBindingMap = {};
|
|
1735
|
-
for (const [agentId, profileName] of Object.entries(settings?.
|
|
1754
|
+
for (const [agentId, profileName] of Object.entries(settings?.fleet?.agentProfiles ?? {})) {
|
|
1736
1755
|
const id = agentId.trim();
|
|
1737
1756
|
const profile = profileName.trim();
|
|
1738
1757
|
if (id.length > 0 && profile.length > 0) agentBindings[id] = profile;
|
|
@@ -1909,17 +1928,17 @@ function buildDispatchWorkerSpec(input: DispatchWorkerSpecInput, config?: Config
|
|
|
1909
1928
|
if (input.req.trustProjectCompatRoots !== undefined) {
|
|
1910
1929
|
spec.trustProjectCompatRoots = input.req.trustProjectCompatRoots;
|
|
1911
1930
|
} else if (settings) {
|
|
1912
|
-
spec.trustProjectCompatRoots = settings.
|
|
1931
|
+
spec.trustProjectCompatRoots = settings.integrations.projectResources.trustProjectImports === true;
|
|
1913
1932
|
}
|
|
1914
|
-
spec.gitCommitAttribution = settings?.
|
|
1933
|
+
spec.gitCommitAttribution = settings?.integrations.git.commitAttribution ?? true;
|
|
1915
1934
|
// Non-stall posture (Symphony §10.5): a dispatched worker has no operator
|
|
1916
1935
|
// to answer a permission prompt by default, so the resolution policy ships
|
|
1917
1936
|
// with the spec and the worker enforces it within bounded time. Under the
|
|
1918
1937
|
// escalate posture the configured timeout/fallback bounds ride along so the
|
|
1919
1938
|
// worker still cannot hang when no operator resolves the ask.
|
|
1920
|
-
spec.onPermission = settings?.
|
|
1939
|
+
spec.onPermission = settings?.fleet.permissions.mode ?? "deny";
|
|
1921
1940
|
if (spec.onPermission === "escalate") {
|
|
1922
|
-
const escalation = settings?.
|
|
1941
|
+
const escalation = settings?.fleet.permissions.escalation;
|
|
1923
1942
|
if (escalation) spec.escalation = { timeoutMs: escalation.timeoutMs, fallback: escalation.fallback };
|
|
1924
1943
|
}
|
|
1925
1944
|
assertRuntimeCanHonorWorkerPermissionMode(input.target.runtime, spec.onPermission);
|
|
@@ -2013,7 +2032,7 @@ function autonomyEnforcementForAcpDelegation(
|
|
|
2013
2032
|
dangerousBypass: true,
|
|
2014
2033
|
};
|
|
2015
2034
|
}
|
|
2016
|
-
// clio-policy applies the exact autonomy mapping to every permission
|
|
2035
|
+
// clio-coder-policy applies the exact autonomy mapping to every permission
|
|
2017
2036
|
// request. deny-all is stricter than every autonomy level, but is still a
|
|
2018
2037
|
// Clio-mediated upper bound rather than an external approximation.
|
|
2019
2038
|
return { grade: "mediated", autonomy, ...authorityEvidence, externalMode: toolGovernance };
|
|
@@ -2407,7 +2426,7 @@ export function createDispatchBundle(
|
|
|
2407
2426
|
const heartbeatIntervalMs = options?.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS;
|
|
2408
2427
|
const getResilienceCooldownMs = (): number => {
|
|
2409
2428
|
if (options?.resilienceCooldownMs !== undefined) return options.resilienceCooldownMs;
|
|
2410
|
-
const settingsVal = getEffectiveSettings()?.
|
|
2429
|
+
const settingsVal = getEffectiveSettings()?.fleet?.retry.routeCooldownMs;
|
|
2411
2430
|
if (settingsVal !== undefined && settingsVal >= 0) return settingsVal;
|
|
2412
2431
|
return DEFAULT_RESILIENCE_COOLDOWN_MS;
|
|
2413
2432
|
};
|
|
@@ -2419,6 +2438,7 @@ export function createDispatchBundle(
|
|
|
2419
2438
|
let ledger: Ledger | null = null;
|
|
2420
2439
|
let heartbeatTimer: ReturnType<typeof setInterval> | null = null;
|
|
2421
2440
|
const active = new Map<string, ActiveRun>();
|
|
2441
|
+
const pendingCapacity = new Map<string, PendingCapacityAdmission>();
|
|
2422
2442
|
const targetCooldowns = new Map<string, { until: number; reason: string }>();
|
|
2423
2443
|
const ownedReservations = new Set<string>();
|
|
2424
2444
|
/**
|
|
@@ -2459,19 +2479,37 @@ export function createDispatchBundle(
|
|
|
2459
2479
|
}),
|
|
2460
2480
|
);
|
|
2461
2481
|
|
|
2482
|
+
/**
|
|
2483
|
+
* Every endpoint the configured fleet can reach.
|
|
2484
|
+
*
|
|
2485
|
+
* Deliberately resolved from the configured targets as well as the probed
|
|
2486
|
+
* statuses. A target whose status has not been built yet contributed no key,
|
|
2487
|
+
* an absent key carries no limit, and reservation planning skips a dimension
|
|
2488
|
+
* it has no limit for, so admission against a single-slot server used to fail
|
|
2489
|
+
* open for whoever asked first after boot.
|
|
2490
|
+
*/
|
|
2491
|
+
function configuredEndpointCapacities(): Readonly<Record<string, EndpointCapacity>> {
|
|
2492
|
+
return resolveEndpointCapacities({
|
|
2493
|
+
statuses: providers.list(),
|
|
2494
|
+
targets: getEffectiveSettings()?.targets ?? [],
|
|
2495
|
+
runtimeFor: (runtimeId) => providers.getRuntime(runtimeId),
|
|
2496
|
+
});
|
|
2497
|
+
}
|
|
2498
|
+
|
|
2462
2499
|
function configuredEndpointLimits(): Readonly<Record<string, number>> {
|
|
2463
|
-
return Object.fromEntries(
|
|
2464
|
-
Object.entries(endpointCapacitiesForStatuses(providers.list())).map(([key, value]) => [key, value.limit]),
|
|
2465
|
-
);
|
|
2500
|
+
return Object.fromEntries(Object.entries(configuredEndpointCapacities()).map(([key, value]) => [key, value.limit]));
|
|
2466
2501
|
}
|
|
2467
2502
|
|
|
2468
2503
|
function endpointCapacityForTarget(targetId: string): EndpointCapacity | null {
|
|
2469
2504
|
const status = providers.list().find((entry) => entry.target.id === targetId);
|
|
2470
|
-
|
|
2471
|
-
|
|
2505
|
+
const target = status?.target ?? providers.getTarget(targetId);
|
|
2506
|
+
if (target === null || target === undefined) return null;
|
|
2507
|
+
const endpoint =
|
|
2508
|
+
status === undefined
|
|
2509
|
+
? endpointCapacityFor({ target, runtime: providers.getRuntime(target.runtime) })
|
|
2510
|
+
: endpointCapacityForStatus(status);
|
|
2472
2511
|
if (endpoint === null) return null;
|
|
2473
|
-
|
|
2474
|
-
return configured ?? endpoint;
|
|
2512
|
+
return configuredEndpointCapacities()[endpoint.key] ?? endpoint;
|
|
2475
2513
|
}
|
|
2476
2514
|
|
|
2477
2515
|
function reservationCapacitySnapshot(settings: EffectiveSettings): ReservationCapacitySnapshot {
|
|
@@ -2560,10 +2598,38 @@ export function createDispatchBundle(
|
|
|
2560
2598
|
}
|
|
2561
2599
|
|
|
2562
2600
|
function configuredGlobalCapacity(settings: EffectiveSettings): number {
|
|
2563
|
-
const configured = settings?.
|
|
2601
|
+
const configured = settings?.fleet.concurrency;
|
|
2564
2602
|
return scheduling.maxWorkers?.() ?? (configured === "auto" || configured === undefined ? 4 : Math.max(1, configured));
|
|
2565
2603
|
}
|
|
2566
2604
|
|
|
2605
|
+
function publishCapacityQueued(
|
|
2606
|
+
identity: DispatchRunIdentity & { requestOrigin: DispatchRequestOrigin },
|
|
2607
|
+
timing: RunPhaseMarks,
|
|
2608
|
+
node: RunNodeIdentity | null,
|
|
2609
|
+
): void {
|
|
2610
|
+
pendingCapacity.set(identity.runId, { identity, timing, node });
|
|
2611
|
+
context.bus.emit(BusChannels.DispatchEnqueued, identity);
|
|
2612
|
+
}
|
|
2613
|
+
|
|
2614
|
+
function publishCapacityAdmissionFailure(
|
|
2615
|
+
identity: DispatchRunIdentity & { requestOrigin: DispatchRequestOrigin },
|
|
2616
|
+
error: unknown,
|
|
2617
|
+
): void {
|
|
2618
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
2619
|
+
const outcome: RunOutcome =
|
|
2620
|
+
error instanceof AdmissionCanceledError
|
|
2621
|
+
? "canceled"
|
|
2622
|
+
: /admission timed out/u.test(detail)
|
|
2623
|
+
? "timed_out"
|
|
2624
|
+
: "denied_by_policy";
|
|
2625
|
+
context.bus.emit(BusChannels.DispatchFailed, {
|
|
2626
|
+
...identity,
|
|
2627
|
+
outcome,
|
|
2628
|
+
outcomeDetail: detail,
|
|
2629
|
+
reason: outcome,
|
|
2630
|
+
});
|
|
2631
|
+
}
|
|
2632
|
+
|
|
2567
2633
|
async function admitAssignmentCapacity(
|
|
2568
2634
|
req: DispatchRequest,
|
|
2569
2635
|
nodeId: string,
|
|
@@ -2572,7 +2638,8 @@ export function createDispatchBundle(
|
|
|
2572
2638
|
) {
|
|
2573
2639
|
const queuedAt = now();
|
|
2574
2640
|
timing.queuedAt = new Date(queuedAt).toISOString();
|
|
2575
|
-
const assignmentId =
|
|
2641
|
+
const assignmentId =
|
|
2642
|
+
req.lineage?.rootRunId ?? req.runIdHint ?? `pending-${queuedAt.toString(36)}-${randomBytes(6).toString("hex")}`;
|
|
2576
2643
|
const requestedAt = Date.parse(timing.requestedAt ?? timing.queuedAt);
|
|
2577
2644
|
const deadlineAt = req.assignmentDeadlineAt ?? requestedAt + (req.routingIntent?.deadlineMs ?? 60_000);
|
|
2578
2645
|
if (req.lineage === undefined) await registerAssignment(assignmentId);
|
|
@@ -2657,7 +2724,7 @@ export function createDispatchBundle(
|
|
|
2657
2724
|
const finalizedCosts: Array<{ usd: number; provenance: import("../providers/index.js").CostProvenance }> = [];
|
|
2658
2725
|
|
|
2659
2726
|
function workersMaxRetries(settings: EffectiveSettings = getEffectiveSettings()): number {
|
|
2660
|
-
const value = settings?.
|
|
2727
|
+
const value = settings?.fleet?.retry.maxRetries;
|
|
2661
2728
|
return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : 2;
|
|
2662
2729
|
}
|
|
2663
2730
|
|
|
@@ -2919,6 +2986,10 @@ export function createDispatchBundle(
|
|
|
2919
2986
|
depth: run.lineage.depth,
|
|
2920
2987
|
},
|
|
2921
2988
|
};
|
|
2989
|
+
// A run-id hint names only the first attempt (and, for task worktrees,
|
|
2990
|
+
// the worktree it created). A retry shares the assignment lineage but
|
|
2991
|
+
// must receive its own ledger/run identity.
|
|
2992
|
+
delete retryReq.runIdHint;
|
|
2922
2993
|
const reasonKey = retryReasonKey(run.lineage.rootRunId, attempt);
|
|
2923
2994
|
retryReasons.set(reasonKey, reason);
|
|
2924
2995
|
try {
|
|
@@ -3347,11 +3418,11 @@ export function createDispatchBundle(
|
|
|
3347
3418
|
providers,
|
|
3348
3419
|
);
|
|
3349
3420
|
enforceCapabilityGate(target.target.id, target.modelCapabilities, req.requiredCapabilities);
|
|
3350
|
-
assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.
|
|
3421
|
+
assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.fleet.permissions.mode ?? "deny");
|
|
3351
3422
|
assertWorkerBudgetEnforceable(target.runtime, spec.budget !== null || req.budget !== undefined);
|
|
3352
3423
|
|
|
3353
3424
|
const cwd = req.cwd ?? process.cwd();
|
|
3354
|
-
const sessionAutonomy = settings?.autonomy ?? "auto-edit";
|
|
3425
|
+
const sessionAutonomy = settings?.safety.autonomy ?? "auto-edit";
|
|
3355
3426
|
const effectiveAutonomy = clampWorkerAutonomy(sessionAutonomy, req.autonomy);
|
|
3356
3427
|
const effectiveTools = withLedgerToolNarrowing(
|
|
3357
3428
|
effectiveToolNames(admission.allowedTools, target, pathScope.writeBoundaries.length > 0, deniedToolNames(req)),
|
|
@@ -3374,7 +3445,7 @@ export function createDispatchBundle(
|
|
|
3374
3445
|
recipe.skills !== undefined &&
|
|
3375
3446
|
recipe.skills.length > 0 &&
|
|
3376
3447
|
req.noSkills !== true,
|
|
3377
|
-
onPermission: settings?.
|
|
3448
|
+
onPermission: settings?.fleet.permissions.mode ?? "deny",
|
|
3378
3449
|
persona: {
|
|
3379
3450
|
id: `persona.${recipe.id}`,
|
|
3380
3451
|
relPath: recipe.filepath,
|
|
@@ -3402,7 +3473,7 @@ export function createDispatchBundle(
|
|
|
3402
3473
|
capabilityClass: spec.capabilityClass,
|
|
3403
3474
|
projectContextTier: tier,
|
|
3404
3475
|
autonomy: effectiveAutonomy,
|
|
3405
|
-
onPermission: settings?.
|
|
3476
|
+
onPermission: settings?.fleet.permissions.mode ?? "deny",
|
|
3406
3477
|
project,
|
|
3407
3478
|
workspace: readWorkspaceRootFacts(cwd),
|
|
3408
3479
|
});
|
|
@@ -3422,7 +3493,7 @@ export function createDispatchBundle(
|
|
|
3422
3493
|
// Match chat-loop's LOCAL_API_KEY_FALLBACK so dispatch-spawned workers can
|
|
3423
3494
|
// reach openai-compat local endpoints (LM Studio, llama.cpp) without
|
|
3424
3495
|
// requiring the user to invent a credential.
|
|
3425
|
-
const apiKey = auth?.apiKey ?? (auth === null ? "clio-local-target" : undefined);
|
|
3496
|
+
const apiKey = auth?.apiKey ?? (auth === null ? "clio-coder-local-target" : undefined);
|
|
3426
3497
|
const runtimeKind: RunKind = target.runtime.kind;
|
|
3427
3498
|
const limitations = runtimeLimitations(runtimeKind, target.runtime.id);
|
|
3428
3499
|
return {
|
|
@@ -3477,16 +3548,16 @@ export function createDispatchBundle(
|
|
|
3477
3548
|
}
|
|
3478
3549
|
}
|
|
3479
3550
|
if (!settings) throw new Error("dispatch: effective settings required for ACP delegation");
|
|
3480
|
-
const configured = settings.
|
|
3551
|
+
const configured = settings.integrations.externalAgents.entries.find((entry) => entry.id === agentId);
|
|
3481
3552
|
if (!configured) throw new Error(`dispatch: ACP delegation agent '${agentId}' not configured`);
|
|
3482
|
-
const toolGovernance = configured.toolGovernance ?? "clio-policy";
|
|
3553
|
+
const toolGovernance = configured.toolGovernance ?? "clio-coder-policy";
|
|
3483
3554
|
if (options?.autonomyOverride === true && toolGovernance === "agent-managed") {
|
|
3484
3555
|
throw new Error(
|
|
3485
|
-
`dispatch: ACP delegation agent '${agentId}' uses toolGovernance='agent-managed', which cannot enforce an explicit one-run autonomy override; choose clio-policy or deny-all governance, or omit --autonomy`,
|
|
3556
|
+
`dispatch: ACP delegation agent '${agentId}' uses toolGovernance='agent-managed', which cannot enforce an explicit one-run autonomy override; choose clio-coder-policy or deny-all governance, or omit --autonomy`,
|
|
3486
3557
|
);
|
|
3487
3558
|
}
|
|
3488
3559
|
const admission = resolveDelegationAdmissionStage(req, safety);
|
|
3489
|
-
const sessionAutonomy = settings.autonomy ?? "auto-edit";
|
|
3560
|
+
const sessionAutonomy = settings.safety.autonomy ?? "auto-edit";
|
|
3490
3561
|
const autonomy = clampWorkerAutonomy(sessionAutonomy, req.autonomy);
|
|
3491
3562
|
if (toolGovernance === "agent-managed" && autonomy !== sessionAutonomy) {
|
|
3492
3563
|
throw new Error(
|
|
@@ -3566,7 +3637,29 @@ export function createDispatchBundle(
|
|
|
3566
3637
|
|
|
3567
3638
|
assertBudgetAdmitsRoute(req, { rates: null, provenance: "unknown" }, settings);
|
|
3568
3639
|
|
|
3569
|
-
const
|
|
3640
|
+
const queuedIdentity =
|
|
3641
|
+
req.lineage === undefined && req.runIdHint !== undefined
|
|
3642
|
+
? {
|
|
3643
|
+
runId: req.runIdHint,
|
|
3644
|
+
agentId: req.agentId,
|
|
3645
|
+
task: req.task,
|
|
3646
|
+
requestOrigin: lifecycle.requestOrigin,
|
|
3647
|
+
targetId,
|
|
3648
|
+
wireModelId,
|
|
3649
|
+
runtimeId,
|
|
3650
|
+
runtimeKind: "acp-delegation" as const,
|
|
3651
|
+
}
|
|
3652
|
+
: null;
|
|
3653
|
+
if (queuedIdentity !== null) publishCapacityQueued(queuedIdentity, timing, null);
|
|
3654
|
+
let capacityLease: Awaited<ReturnType<typeof admitAssignmentCapacity>>;
|
|
3655
|
+
try {
|
|
3656
|
+
capacityLease = await admitAssignmentCapacity(req, "local", timing, null);
|
|
3657
|
+
} catch (error) {
|
|
3658
|
+
if (queuedIdentity !== null) publishCapacityAdmissionFailure(queuedIdentity, error);
|
|
3659
|
+
throw error;
|
|
3660
|
+
} finally {
|
|
3661
|
+
if (queuedIdentity !== null) pendingCapacity.delete(queuedIdentity.runId);
|
|
3662
|
+
}
|
|
3570
3663
|
const leaseSlot = createLeaseSlotGuard(capacityAdmission, capacityLease.leaseId, req.lineage !== undefined);
|
|
3571
3664
|
|
|
3572
3665
|
// Resolve the ledger before starting the ACP process: an external agent
|
|
@@ -3662,15 +3755,15 @@ export function createDispatchBundle(
|
|
|
3662
3755
|
if (eventContainsFirstModelToken(event)) markObservedPhase("firstModelTokenAt");
|
|
3663
3756
|
if (eventStartsTool(event)) markObservedPhase("firstToolAt");
|
|
3664
3757
|
}
|
|
3665
|
-
if (event.type === "
|
|
3758
|
+
if (event.type === "clio_coder_tool_start" && event.payload && typeof event.payload.tool === "string") {
|
|
3666
3759
|
recordToolStart(inFlightTools, event.payload);
|
|
3667
3760
|
}
|
|
3668
3761
|
// ACP is an external protocol peer, never an authority for Clio's
|
|
3669
3762
|
// deterministic terminal taxonomy. Ignore even syntactically valid
|
|
3670
3763
|
// assertions; only a future coordinator-side classifier may set one.
|
|
3671
|
-
if (event.type === "
|
|
3764
|
+
if (event.type === "clio_coder_run_outcome" && !reportedSpoofedOutcome) {
|
|
3672
3765
|
reportedSpoofedOutcome = true;
|
|
3673
|
-
reportDispatchDiagnostic("ACP outcome event", new Error("ignored untrusted
|
|
3766
|
+
reportDispatchDiagnostic("ACP outcome event", new Error("ignored untrusted clio_coder_run_outcome assertion"));
|
|
3674
3767
|
}
|
|
3675
3768
|
if (isRecord(event)) {
|
|
3676
3769
|
const finishEntry = appendDispatchFinishContractEntry(finishContractEntries, event);
|
|
@@ -3701,7 +3794,7 @@ export function createDispatchBundle(
|
|
|
3701
3794
|
if (message !== null) failureMessage = message;
|
|
3702
3795
|
}
|
|
3703
3796
|
}
|
|
3704
|
-
if (event.type === "
|
|
3797
|
+
if (event.type === "clio_coder_permission_resolved" && event.payload && typeof event.payload.tool === "string") {
|
|
3705
3798
|
const requestId =
|
|
3706
3799
|
typeof event.payload.requestId === "string" ? event.payload.requestId : `delegation-permission-${Date.now()}`;
|
|
3707
3800
|
const origin = runIdForPermissionAudit !== null ? `delegation:${runIdForPermissionAudit}` : "delegation:unknown";
|
|
@@ -3727,7 +3820,7 @@ export function createDispatchBundle(
|
|
|
3727
3820
|
...(runIdForPermissionAudit !== null ? { requestedBy: runIdForPermissionAudit } : {}),
|
|
3728
3821
|
});
|
|
3729
3822
|
}
|
|
3730
|
-
if (event.type === "
|
|
3823
|
+
if (event.type === "clio_coder_tool_finish" && event.payload && typeof event.payload.tool === "string") {
|
|
3731
3824
|
recordToolCompletion(inFlightTools, event.payload);
|
|
3732
3825
|
recordToolFinish(toolStats, event.payload);
|
|
3733
3826
|
if (event.payload.decision === "allowed") safetyDecisionCounts.allowed += 1;
|
|
@@ -3774,8 +3867,10 @@ export function createDispatchBundle(
|
|
|
3774
3867
|
runIdForPermissionAudit = envelope.id;
|
|
3775
3868
|
lineage = lineageFor(req, envelope.id);
|
|
3776
3869
|
if (req.lineage === undefined) {
|
|
3777
|
-
|
|
3778
|
-
|
|
3870
|
+
if (capacityLease.assignmentId !== lineage.rootRunId) {
|
|
3871
|
+
capacityAdmission.rename(capacityLease.leaseId, lineage.rootRunId);
|
|
3872
|
+
await renameStoredAssignment(capacityLease.assignmentId, lineage.rootRunId);
|
|
3873
|
+
}
|
|
3779
3874
|
leaseSlot.transferToAssignment();
|
|
3780
3875
|
}
|
|
3781
3876
|
identity = detectRunIdentity();
|
|
@@ -3801,16 +3896,18 @@ export function createDispatchBundle(
|
|
|
3801
3896
|
// One durable write at start so sibling processes (clio-coder fleet status)
|
|
3802
3897
|
// can observe the running row; finalization persists the terminal state.
|
|
3803
3898
|
await ledgerRef.persist();
|
|
3804
|
-
|
|
3805
|
-
|
|
3806
|
-
|
|
3807
|
-
|
|
3808
|
-
|
|
3809
|
-
|
|
3810
|
-
|
|
3811
|
-
|
|
3812
|
-
|
|
3813
|
-
|
|
3899
|
+
if (req.lineage !== undefined) {
|
|
3900
|
+
context.bus.emit(BusChannels.DispatchEnqueued, {
|
|
3901
|
+
runId: envelope.id,
|
|
3902
|
+
agentId: req.agentId,
|
|
3903
|
+
task: req.task,
|
|
3904
|
+
requestOrigin: lifecycle.requestOrigin,
|
|
3905
|
+
targetId,
|
|
3906
|
+
wireModelId,
|
|
3907
|
+
runtimeId,
|
|
3908
|
+
runtimeKind: "acp-delegation",
|
|
3909
|
+
});
|
|
3910
|
+
}
|
|
3814
3911
|
context.bus.emit(BusChannels.DispatchStarted, {
|
|
3815
3912
|
runId: envelope.id,
|
|
3816
3913
|
agentId: req.agentId,
|
|
@@ -3925,7 +4022,7 @@ export function createDispatchBundle(
|
|
|
3925
4022
|
const finalFailureMessage = result.failureMessage ?? failureMessage;
|
|
3926
4023
|
const finalToolStats = snapshotToolStats(toolStats);
|
|
3927
4024
|
const unfinished = snapshotUnfinishedTools(inFlightTools);
|
|
3928
|
-
const toolGovernance = lifecycle.agentConfig.toolGovernance ?? "clio-policy";
|
|
4025
|
+
const toolGovernance = lifecycle.agentConfig.toolGovernance ?? "clio-coder-policy";
|
|
3929
4026
|
return {
|
|
3930
4027
|
runId: envelope.id,
|
|
3931
4028
|
agentId: req.agentId,
|
|
@@ -3978,7 +4075,7 @@ export function createDispatchBundle(
|
|
|
3978
4075
|
dynamicHash: lifecycle.dynamicHash,
|
|
3979
4076
|
promptSignature: lifecycle.promptSignature,
|
|
3980
4077
|
toolSignature: lifecycle.toolSignature,
|
|
3981
|
-
|
|
4078
|
+
clioCoderVersion: readClioVersion(),
|
|
3982
4079
|
piMonoVersion: readPiMonoVersion(),
|
|
3983
4080
|
platform: process.platform,
|
|
3984
4081
|
nodeVersion: process.version,
|
|
@@ -3992,7 +4089,7 @@ export function createDispatchBundle(
|
|
|
3992
4089
|
quality: createRunReceiptQuality({ runtimeEnforceable: false, enforcementPassed: null, resultContract: null }),
|
|
3993
4090
|
autonomyEnforcement: autonomyEnforcementForAcpDelegation(
|
|
3994
4091
|
lifecycle.autonomy,
|
|
3995
|
-
lifecycle.agentConfig.toolGovernance ?? "clio-policy",
|
|
4092
|
+
lifecycle.agentConfig.toolGovernance ?? "clio-coder-policy",
|
|
3996
4093
|
lifecycle.sessionAutonomy,
|
|
3997
4094
|
req.autonomy,
|
|
3998
4095
|
),
|
|
@@ -4022,7 +4119,7 @@ export function createDispatchBundle(
|
|
|
4022
4119
|
toolCallsRequested: result.delegation.toolCallsRequested,
|
|
4023
4120
|
toolCallsApproved: result.delegation.toolCallsApproved,
|
|
4024
4121
|
toolCallsDenied: result.delegation.toolCallsDenied,
|
|
4025
|
-
toolGovernance: lifecycle.agentConfig.toolGovernance ?? "clio-policy",
|
|
4122
|
+
toolGovernance: lifecycle.agentConfig.toolGovernance ?? "clio-coder-policy",
|
|
4026
4123
|
toolCallLog: acp.toolCallLog(),
|
|
4027
4124
|
},
|
|
4028
4125
|
sessionId: result.delegation.acpSessionId,
|
|
@@ -4257,7 +4354,7 @@ export function createDispatchBundle(
|
|
|
4257
4354
|
const requestedAt = new Date(now()).toISOString();
|
|
4258
4355
|
const timing: RunPhaseMarks = { requestedAt, decisionStartedAt: requestedAt };
|
|
4259
4356
|
const settings = getEffectiveSettings();
|
|
4260
|
-
const isAcpAgent = settings?.
|
|
4357
|
+
const isAcpAgent = settings?.integrations.externalAgents?.entries?.some((entry) => entry.id === req.agentId) ?? false;
|
|
4261
4358
|
if (isAcpAgent && !req.delegationAgentId) {
|
|
4262
4359
|
req.delegationAgentId = req.agentId;
|
|
4263
4360
|
}
|
|
@@ -4268,12 +4365,16 @@ export function createDispatchBundle(
|
|
|
4268
4365
|
throw new Error(`dispatch: invalid spec: ${validated.errors.join("; ")}`);
|
|
4269
4366
|
}
|
|
4270
4367
|
req = validation.restore(validated.spec);
|
|
4368
|
+
// A top-level run needs its stable identity before it can wait for
|
|
4369
|
+
// capacity. The board can then render the assignment as queued and the
|
|
4370
|
+
// same id becomes the ledger row once its slot opens.
|
|
4371
|
+
if (req.lineage === undefined && req.runIdHint === undefined) req = { ...req, runIdHint: newRunId() };
|
|
4271
4372
|
let activeRouteObservation: RouteObservationHandle | null = null;
|
|
4272
4373
|
if (req.delegationAgentId === undefined) {
|
|
4273
4374
|
const recipe = agents.get(req.agentId);
|
|
4274
4375
|
const activation = consumeActiveRouteApproval({
|
|
4275
4376
|
request: req,
|
|
4276
|
-
settings: settings?.
|
|
4377
|
+
settings: settings?.fleet.adaptiveRouting,
|
|
4277
4378
|
capabilityClass: recipe === null ? null : normalizeAgentSpec(recipe).capabilityClass,
|
|
4278
4379
|
failover: failoverModeFor(req),
|
|
4279
4380
|
requestedAt,
|
|
@@ -4395,7 +4496,41 @@ export function createDispatchBundle(
|
|
|
4395
4496
|
shadow: () => observeShadowRoute(req, placed, settings),
|
|
4396
4497
|
});
|
|
4397
4498
|
|
|
4398
|
-
const
|
|
4499
|
+
const queuedIdentity =
|
|
4500
|
+
req.lineage === undefined && req.runIdHint !== undefined
|
|
4501
|
+
? {
|
|
4502
|
+
runId: req.runIdHint,
|
|
4503
|
+
agentId: req.agentId,
|
|
4504
|
+
task: req.task,
|
|
4505
|
+
agentAudience: lifecycle.agentAudience,
|
|
4506
|
+
requestOrigin: lifecycle.requestOrigin,
|
|
4507
|
+
targetId: lifecycle.target.target.id,
|
|
4508
|
+
wireModelId: lifecycle.target.wireModelId,
|
|
4509
|
+
runtimeId: lifecycle.target.runtime.id,
|
|
4510
|
+
runtimeKind: lifecycle.runtimeKind,
|
|
4511
|
+
budget: lifecycle.budgetEnvelope,
|
|
4512
|
+
...(endpoint !== null ? { endpoint: { key: endpoint.key, label: endpoint.label, limit: endpoint.limit } } : {}),
|
|
4513
|
+
...(placement !== null ? { node: placement.node.id } : {}),
|
|
4514
|
+
...(req.gate !== undefined ? { gate: { role: req.gate.role, cycle: req.gate.cycle } } : {}),
|
|
4515
|
+
...(req.council !== undefined ? { council: req.council } : {}),
|
|
4516
|
+
...(req.reroutes !== undefined && req.reroutes.length > 0 ? { rerouteCount: req.reroutes.length } : {}),
|
|
4517
|
+
...(lifecycle.target.modelCapabilities !== undefined &&
|
|
4518
|
+
lifecycle.target.modelCapabilities !== null &&
|
|
4519
|
+
lifecycle.target.modelCapabilities.contextWindow > 0
|
|
4520
|
+
? { contextWindow: lifecycle.target.modelCapabilities.contextWindow }
|
|
4521
|
+
: {}),
|
|
4522
|
+
}
|
|
4523
|
+
: null;
|
|
4524
|
+
if (queuedIdentity !== null) publishCapacityQueued(queuedIdentity, timing, placement?.node ?? null);
|
|
4525
|
+
let capacityLease: Awaited<ReturnType<typeof admitAssignmentCapacity>>;
|
|
4526
|
+
try {
|
|
4527
|
+
capacityLease = await admitAssignmentCapacity(req, placement?.node.id ?? "local", timing, endpoint);
|
|
4528
|
+
} catch (error) {
|
|
4529
|
+
if (queuedIdentity !== null) publishCapacityAdmissionFailure(queuedIdentity, error);
|
|
4530
|
+
throw error;
|
|
4531
|
+
} finally {
|
|
4532
|
+
if (queuedIdentity !== null) pendingCapacity.delete(queuedIdentity.runId);
|
|
4533
|
+
}
|
|
4399
4534
|
const leaseSlot = createLeaseSlotGuard(capacityAdmission, capacityLease.leaseId, req.lineage !== undefined);
|
|
4400
4535
|
|
|
4401
4536
|
const ledgerRef = (() => {
|
|
@@ -4533,7 +4668,7 @@ export function createDispatchBundle(
|
|
|
4533
4668
|
context.bus.emit(BusChannels.DispatchProgress, {
|
|
4534
4669
|
runId,
|
|
4535
4670
|
agentId: req.agentId,
|
|
4536
|
-
event: { type: "
|
|
4671
|
+
event: { type: "clio_coder_write_record_downgraded", payload: downgrade },
|
|
4537
4672
|
});
|
|
4538
4673
|
},
|
|
4539
4674
|
});
|
|
@@ -4587,8 +4722,8 @@ export function createDispatchBundle(
|
|
|
4587
4722
|
policySource?: string;
|
|
4588
4723
|
reason?: string;
|
|
4589
4724
|
skillActivation?: unknown;
|
|
4590
|
-
// Worker permission-escalation fields (
|
|
4591
|
-
//
|
|
4725
|
+
// Worker permission-escalation fields (clio_coder_permission_escalated /
|
|
4726
|
+
// clio_coder_permission_resolved escalate path).
|
|
4592
4727
|
requestId?: string;
|
|
4593
4728
|
summary?: string;
|
|
4594
4729
|
target?: string;
|
|
@@ -4601,12 +4736,12 @@ export function createDispatchBundle(
|
|
|
4601
4736
|
if (eventContainsFirstModelToken(event)) markObservedPhase("firstModelTokenAt");
|
|
4602
4737
|
if (eventStartsTool(event)) markObservedPhase("firstToolAt");
|
|
4603
4738
|
}
|
|
4604
|
-
if (event.type === "
|
|
4739
|
+
if (event.type === "clio_coder_tool_start" && event.payload && typeof event.payload.tool === "string") {
|
|
4605
4740
|
recordToolStart(inFlightTools, event.payload);
|
|
4606
4741
|
}
|
|
4607
|
-
if (event.type === "
|
|
4742
|
+
if (event.type === "clio_coder_steer_received") acknowledgeSteer(event.payload?.sequence);
|
|
4608
4743
|
if (
|
|
4609
|
-
event.type === "
|
|
4744
|
+
event.type === "clio_coder_run_outcome" &&
|
|
4610
4745
|
isRunOutcomeCode(event.payload?.outcomeCode) &&
|
|
4611
4746
|
event.payload.outcomeCode !== "worker_final_output_missing" &&
|
|
4612
4747
|
event.payload.outcomeCode !== "host_verification_rejected"
|
|
@@ -4629,7 +4764,11 @@ export function createDispatchBundle(
|
|
|
4629
4764
|
}
|
|
4630
4765
|
recordWorkerRunEffect(runEffects, event);
|
|
4631
4766
|
}
|
|
4632
|
-
if (
|
|
4767
|
+
if (
|
|
4768
|
+
event.type === "clio_coder_permission_escalated" &&
|
|
4769
|
+
event.payload &&
|
|
4770
|
+
typeof event.payload.requestId === "string"
|
|
4771
|
+
) {
|
|
4633
4772
|
escalationCounts.requested += 1;
|
|
4634
4773
|
const ctx = isRecord(event.payload.decision) ? event.payload.decision : null;
|
|
4635
4774
|
const classification = ctx !== null && isRecord(ctx.classification) ? ctx.classification : null;
|
|
@@ -4664,6 +4803,7 @@ export function createDispatchBundle(
|
|
|
4664
4803
|
...(ruleId !== null ? { ruleId } : {}),
|
|
4665
4804
|
...(policySource !== null ? { policySource } : {}),
|
|
4666
4805
|
...(typeof event.payload.timeoutMs === "number" ? { timeoutMs: event.payload.timeoutMs } : {}),
|
|
4806
|
+
fallback: spec.escalation?.fallback ?? "deny",
|
|
4667
4807
|
escalation: true,
|
|
4668
4808
|
});
|
|
4669
4809
|
}
|
|
@@ -4689,7 +4829,7 @@ export function createDispatchBundle(
|
|
|
4689
4829
|
if (message !== null) failureMessage = message;
|
|
4690
4830
|
}
|
|
4691
4831
|
}
|
|
4692
|
-
if (event.type === "
|
|
4832
|
+
if (event.type === "clio_coder_permission_resolved" && event.payload && typeof event.payload.tool === "string") {
|
|
4693
4833
|
// Escalation resolutions already have a request event. Policy
|
|
4694
4834
|
// deny/fail is non-stalling, so dispatch mints the adjacent pair.
|
|
4695
4835
|
const source = event.payload.source;
|
|
@@ -4738,10 +4878,11 @@ export function createDispatchBundle(
|
|
|
4738
4878
|
decidedBy,
|
|
4739
4879
|
actionClass,
|
|
4740
4880
|
reason,
|
|
4881
|
+
...(source === "timeout" ? { fallback: spec.escalation?.fallback ?? "deny" } : {}),
|
|
4741
4882
|
...(runIdForPermissionAudit !== null ? { requestedBy: runIdForPermissionAudit } : {}),
|
|
4742
4883
|
});
|
|
4743
4884
|
}
|
|
4744
|
-
if (event.type === "
|
|
4885
|
+
if (event.type === "clio_coder_tool_finish" && event.payload && typeof event.payload.tool === "string") {
|
|
4745
4886
|
recordToolCompletion(inFlightTools, event.payload);
|
|
4746
4887
|
recordToolFinish(toolStats, event.payload);
|
|
4747
4888
|
if (isSkillActivation(event.payload.skillActivation)) {
|
|
@@ -4793,8 +4934,10 @@ export function createDispatchBundle(
|
|
|
4793
4934
|
runIdForPermissionAudit = envelope.id;
|
|
4794
4935
|
lineage = lineageFor(req, envelope.id);
|
|
4795
4936
|
if (req.lineage === undefined) {
|
|
4796
|
-
|
|
4797
|
-
|
|
4937
|
+
if (capacityLease.assignmentId !== lineage.rootRunId) {
|
|
4938
|
+
capacityAdmission.rename(capacityLease.leaseId, lineage.rootRunId);
|
|
4939
|
+
await renameStoredAssignment(capacityLease.assignmentId, lineage.rootRunId);
|
|
4940
|
+
}
|
|
4798
4941
|
leaseSlot.transferToAssignment();
|
|
4799
4942
|
}
|
|
4800
4943
|
if (agentLedgerId !== null) {
|
|
@@ -4855,18 +4998,20 @@ export function createDispatchBundle(
|
|
|
4855
4998
|
? { contextWindow: lifecycle.target.modelCapabilities.contextWindow }
|
|
4856
4999
|
: {}),
|
|
4857
5000
|
};
|
|
4858
|
-
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
|
|
4863
|
-
|
|
4864
|
-
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
5001
|
+
if (req.lineage !== undefined) {
|
|
5002
|
+
context.bus.emit(BusChannels.DispatchEnqueued, {
|
|
5003
|
+
runId: envelope.id,
|
|
5004
|
+
agentId: req.agentId,
|
|
5005
|
+
task: req.task,
|
|
5006
|
+
agentAudience: lifecycle.agentAudience,
|
|
5007
|
+
requestOrigin: lifecycle.requestOrigin,
|
|
5008
|
+
targetId: lifecycle.target.target.id,
|
|
5009
|
+
wireModelId: lifecycle.target.wireModelId,
|
|
5010
|
+
runtimeId: lifecycle.target.runtime.id,
|
|
5011
|
+
runtimeKind: lifecycle.runtimeKind,
|
|
5012
|
+
...fleetIdentity,
|
|
5013
|
+
});
|
|
5014
|
+
}
|
|
4870
5015
|
context.bus.emit(BusChannels.DispatchStarted, {
|
|
4871
5016
|
runId: envelope.id,
|
|
4872
5017
|
agentId: req.agentId,
|
|
@@ -5096,7 +5241,7 @@ export function createDispatchBundle(
|
|
|
5096
5241
|
dynamicHash: lifecycle.dynamicHash,
|
|
5097
5242
|
promptSignature: lifecycle.promptSignature,
|
|
5098
5243
|
toolSignature: lifecycle.toolSignature,
|
|
5099
|
-
|
|
5244
|
+
clioCoderVersion: readClioVersion(),
|
|
5100
5245
|
piMonoVersion: readPiMonoVersion(),
|
|
5101
5246
|
platform: process.platform,
|
|
5102
5247
|
nodeVersion: process.version,
|
|
@@ -5121,7 +5266,7 @@ export function createDispatchBundle(
|
|
|
5121
5266
|
...(skillActivations.length > 0 ? { skillActivations: [...skillActivations] } : {}),
|
|
5122
5267
|
autonomyEnforcement: autonomyEnforcementForWorkerSpec(
|
|
5123
5268
|
spec,
|
|
5124
|
-
lifecycle.settings?.autonomy ?? "auto-edit",
|
|
5269
|
+
lifecycle.settings?.safety.autonomy ?? "auto-edit",
|
|
5125
5270
|
req.autonomy,
|
|
5126
5271
|
),
|
|
5127
5272
|
safety: {
|
|
@@ -5295,18 +5440,7 @@ export function createDispatchBundle(
|
|
|
5295
5440
|
cwd: lifecycle.cwd,
|
|
5296
5441
|
networkAllowed: lifecycle.admission.allowedTools.includes(ToolNames.WebFetch),
|
|
5297
5442
|
observedRunEffects,
|
|
5298
|
-
filesystem:
|
|
5299
|
-
readFile(filePath) {
|
|
5300
|
-
try {
|
|
5301
|
-
return readFileSync(filePath, "utf8");
|
|
5302
|
-
} catch {
|
|
5303
|
-
return null;
|
|
5304
|
-
}
|
|
5305
|
-
},
|
|
5306
|
-
pathExists(filePath) {
|
|
5307
|
-
return existsSync(filePath);
|
|
5308
|
-
},
|
|
5309
|
-
},
|
|
5443
|
+
filesystem: nodeResultContractFilesystem(),
|
|
5310
5444
|
});
|
|
5311
5445
|
const resultValidation = resultContract?.applicable === true ? resultContract.validation : null;
|
|
5312
5446
|
if (finalOutcome === "succeeded" && resultValidation?.conformance === "fail") {
|
|
@@ -5645,7 +5779,7 @@ export function createDispatchBundle(
|
|
|
5645
5779
|
req: DispatchRequest,
|
|
5646
5780
|
settings: EffectiveSettings = getEffectiveSettings(),
|
|
5647
5781
|
): DispatchPlanTaskResolution {
|
|
5648
|
-
const isAcpAgent = settings?.
|
|
5782
|
+
const isAcpAgent = settings?.integrations.externalAgents?.entries?.some((entry) => entry.id === req.agentId) ?? false;
|
|
5649
5783
|
if (isAcpAgent && !req.delegationAgentId) req = { ...req, delegationAgentId: req.agentId };
|
|
5650
5784
|
const validation = routeValidationProjection(req, true);
|
|
5651
5785
|
const validated = validateJobSpec(validation.jobSpec);
|
|
@@ -5721,7 +5855,7 @@ export function createDispatchBundle(
|
|
|
5721
5855
|
req,
|
|
5722
5856
|
);
|
|
5723
5857
|
assertPostRuntimeToolCompatibility(req.agentId, agentSpec, effectiveTools, target);
|
|
5724
|
-
assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.
|
|
5858
|
+
assertRuntimeCanHonorWorkerPermissionMode(target.runtime, settings?.fleet.permissions.mode ?? "deny");
|
|
5725
5859
|
assertWorkerBudgetEnforceable(target.runtime, agentSpec.budget !== null || req.budget !== undefined);
|
|
5726
5860
|
assertResponseSchemaEnforceable(target.runtime, target.modelCapabilities, req.responseSchema, effectiveTools.length);
|
|
5727
5861
|
assertWriteRootsEnforceable(target.runtime, pathScope.writeBoundaries);
|
|
@@ -5783,7 +5917,7 @@ export function createDispatchBundle(
|
|
|
5783
5917
|
specs,
|
|
5784
5918
|
request: req,
|
|
5785
5919
|
mode,
|
|
5786
|
-
activeAgentRoles: settings?.
|
|
5920
|
+
activeAgentRoles: settings?.fleet.adaptiveRouting.agentRoles ?? [],
|
|
5787
5921
|
...(agentIntent === undefined ? {} : { intentOverride: agentIntent }),
|
|
5788
5922
|
});
|
|
5789
5923
|
const settingsFingerprint = computeSettingsFingerprint(settings ?? null);
|
|
@@ -5878,7 +6012,7 @@ export function createDispatchBundle(
|
|
|
5878
6012
|
const recipe = agents.get(req.agentId);
|
|
5879
6013
|
return planActiveRoute({
|
|
5880
6014
|
request: req,
|
|
5881
|
-
settings: settings?.
|
|
6015
|
+
settings: settings?.fleet.adaptiveRouting,
|
|
5882
6016
|
capabilityClass: recipe === null ? null : normalizeAgentSpec(recipe).capabilityClass,
|
|
5883
6017
|
failover: failoverModeFor(req),
|
|
5884
6018
|
fixed,
|
|
@@ -6089,7 +6223,7 @@ export function createDispatchBundle(
|
|
|
6089
6223
|
costProvenance: "unknown",
|
|
6090
6224
|
compiledPromptHash: null,
|
|
6091
6225
|
staticCompositionHash: null,
|
|
6092
|
-
|
|
6226
|
+
clioCoderVersion: readClioVersion(),
|
|
6093
6227
|
piMonoVersion: readPiMonoVersion(),
|
|
6094
6228
|
platform: process.platform,
|
|
6095
6229
|
nodeVersion: process.version,
|
|
@@ -6154,8 +6288,15 @@ export function createDispatchBundle(
|
|
|
6154
6288
|
return receipt;
|
|
6155
6289
|
}
|
|
6156
6290
|
|
|
6291
|
+
let journalBridge: RunEventJournalBridge | null = null;
|
|
6292
|
+
|
|
6157
6293
|
const extension: DomainExtension = {
|
|
6158
6294
|
async start() {
|
|
6295
|
+
// The journal subscribes before anything can dispatch. It rides the
|
|
6296
|
+
// domain's own progress and terminal channels, so it covers a run
|
|
6297
|
+
// whose caller iterates the handle itself (every operator path) as
|
|
6298
|
+
// well as one drained by the dispatch tool's event registry.
|
|
6299
|
+
if (options?.journalRunEvents === true) journalBridge = attachRunEventJournalBridge(context.bus);
|
|
6159
6300
|
// No in-memory executor survives a process restart, so every active
|
|
6160
6301
|
// side-store lease from an earlier bundle is orphaned and must expire.
|
|
6161
6302
|
cleanupDispatchReservations({ startup: true, nowMs: now() });
|
|
@@ -6221,6 +6362,10 @@ export function createDispatchBundle(
|
|
|
6221
6362
|
for (const ownerId of ownedReservations) rollbackDispatchReservation(ownerId, now());
|
|
6222
6363
|
ownedReservations.clear();
|
|
6223
6364
|
await Promise.allSettled([...assignmentWrites]);
|
|
6365
|
+
// After drain(), so the last run's terminal line is written before the
|
|
6366
|
+
// bridge stops listening.
|
|
6367
|
+
journalBridge?.stop();
|
|
6368
|
+
journalBridge = null;
|
|
6224
6369
|
},
|
|
6225
6370
|
};
|
|
6226
6371
|
|
|
@@ -6248,6 +6393,26 @@ export function createDispatchBundle(
|
|
|
6248
6393
|
const running: DispatchSnapshot["running"] = [];
|
|
6249
6394
|
const totals = { ...finalizedTotals };
|
|
6250
6395
|
const costAmounts = [...finalizedCosts];
|
|
6396
|
+
for (const pending of pendingCapacity.values()) {
|
|
6397
|
+
const startedAt = pending.timing.queuedAt ?? pending.timing.requestedAt ?? new Date(tickNow).toISOString();
|
|
6398
|
+
running.push({
|
|
6399
|
+
runId: pending.identity.runId,
|
|
6400
|
+
agentId: pending.identity.agentId,
|
|
6401
|
+
...(pending.identity.task !== undefined ? { task: pending.identity.task } : {}),
|
|
6402
|
+
...(pending.identity.budget !== undefined ? { budget: pending.identity.budget } : {}),
|
|
6403
|
+
runtimeKind: pending.identity.runtimeKind,
|
|
6404
|
+
outcomePhase: "queued",
|
|
6405
|
+
heartbeat: "n/a",
|
|
6406
|
+
lineage: { parentRunId: null, rootRunId: pending.identity.runId, attempt: 0, depth: 0 },
|
|
6407
|
+
startedAt,
|
|
6408
|
+
elapsedMs: 0,
|
|
6409
|
+
timing: deriveRunPhaseDurations(pending.timing, startedAt, new Date(tickNow).toISOString()),
|
|
6410
|
+
tokens: { input: 0, output: 0, total: 0 },
|
|
6411
|
+
costUsd: 0,
|
|
6412
|
+
costProvenance: "unknown",
|
|
6413
|
+
node: pending.node === null ? null : { ...pending.node },
|
|
6414
|
+
});
|
|
6415
|
+
}
|
|
6251
6416
|
for (const run of active.values()) {
|
|
6252
6417
|
let heartbeat: "alive" | "stale" | "dead" | "n/a" = "n/a";
|
|
6253
6418
|
if (run.heartbeatAt && Number.isFinite(heartbeatMonotonicAt(run.heartbeatAt))) {
|
|
@@ -6426,6 +6591,17 @@ export function createDispatchBundle(
|
|
|
6426
6591
|
},
|
|
6427
6592
|
abort(runId, reason) {
|
|
6428
6593
|
const rootRunId = assignmentRootFor(runId);
|
|
6594
|
+
const queued = pendingCapacity.get(rootRunId);
|
|
6595
|
+
if (queued !== undefined && capacityAdmission.cancel(rootRunId)) {
|
|
6596
|
+
persistAssignment(cancelStoredAssignment(rootRunId), `${rootRunId}:cancel-queued`);
|
|
6597
|
+
context.bus.emit(BusChannels.RunAborted, {
|
|
6598
|
+
source: "dispatch_abort",
|
|
6599
|
+
runId: rootRunId,
|
|
6600
|
+
startedAt: null,
|
|
6601
|
+
elapsedMs: null,
|
|
6602
|
+
reason: reason?.detail ?? "operator abort while waiting for an endpoint slot",
|
|
6603
|
+
});
|
|
6604
|
+
}
|
|
6429
6605
|
const assignment = assignments.get(rootRunId);
|
|
6430
6606
|
if (assignment?.status === "running") {
|
|
6431
6607
|
assignments.cancel(assignment.id);
|