@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
package/src/cli/fleet.ts
CHANGED
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* clio-coder fleet commands init draft a repository command registry
|
|
8
8
|
* clio-coder fleet run <name> --var k=v ... preflight + execute a fleet contract
|
|
9
9
|
* clio-coder fleet status [--json] runtime snapshot from the durable ledger
|
|
10
|
+
* clio-coder fleet inspect --json bounded recent run and journal projection
|
|
11
|
+
* clio-coder fleet decisions --json bounded sealed review and compete gate verdicts
|
|
12
|
+
* clio-coder fleet view <runId|fleetRootId> one run's transcript, or a root's step index
|
|
10
13
|
* clio-coder fleet drain|resume [--json] close or reopen durable dispatch admission
|
|
11
14
|
*
|
|
12
15
|
* Fleet contracts are repo-owned policy (.clio-coder/fleets/<name>.md). Preflight
|
|
@@ -52,22 +55,34 @@ import { bindExecutionPlanEndpoints, type ExecutionPlan } from "../domains/dispa
|
|
|
52
55
|
import { agentRoleFactsResolver, requestExecutionRole, withAttemptRole } from "../domains/dispatch/execution-role.js";
|
|
53
56
|
import { compileFleetExecutionPlan } from "../domains/dispatch/fleet-plan.js";
|
|
54
57
|
import {
|
|
55
|
-
|
|
58
|
+
createDispatchDomainModule,
|
|
56
59
|
type ExecuteFleetRunInput,
|
|
57
60
|
executeFleetRun,
|
|
58
61
|
type FleetRunOutcome,
|
|
59
62
|
planFleetResume,
|
|
60
63
|
readFleetRun,
|
|
61
64
|
} from "../domains/dispatch/index.js";
|
|
65
|
+
import { configureRunEventJournal } from "../domains/dispatch/run-event-journal.js";
|
|
62
66
|
import { openLedger } from "../domains/dispatch/state.js";
|
|
63
67
|
import type { RunEnvelope, RunReceipt } from "../domains/dispatch/types.js";
|
|
64
68
|
import { WRITE_BOUNDARY_VIOLATION_REASON } from "../domains/dispatch/write-boundary.js";
|
|
65
69
|
import { preflightWriteBoundaries } from "../domains/dispatch/write-boundary-enforcer.js";
|
|
66
70
|
import { ensureClioState, LifecycleDomainModule } from "../domains/lifecycle/index.js";
|
|
67
71
|
import { MiddlewareDomainModule } from "../domains/middleware/index.js";
|
|
68
|
-
import {
|
|
72
|
+
import {
|
|
73
|
+
aggregateCostAmounts,
|
|
74
|
+
type CostAggregate,
|
|
75
|
+
ObservabilityDomainModule,
|
|
76
|
+
renderCostAggregate,
|
|
77
|
+
renderCostAmount,
|
|
78
|
+
} from "../domains/observability/index.js";
|
|
69
79
|
import { createPromptsDomainModule } from "../domains/prompts/index.js";
|
|
70
|
-
import {
|
|
80
|
+
import {
|
|
81
|
+
type CostProvenance,
|
|
82
|
+
foregroundStreamUsage,
|
|
83
|
+
normalizeCostProvenance,
|
|
84
|
+
ProvidersDomainModule,
|
|
85
|
+
} from "../domains/providers/index.js";
|
|
71
86
|
import { ResourcesDomainModule } from "../domains/resources/index.js";
|
|
72
87
|
import type { SafetyContract } from "../domains/safety/contract.js";
|
|
73
88
|
import { SafetyDomainModule } from "../domains/safety/index.js";
|
|
@@ -89,6 +104,10 @@ Subcommands:
|
|
|
89
104
|
[--resume <runId>] replay a completed prefix from a prior run of the same plan
|
|
90
105
|
[--json] emit step receipts as JSON
|
|
91
106
|
status [--json] show running, retrying, and total dispatch state
|
|
107
|
+
inspect --json emit a bounded recent-run and event-journal projection
|
|
108
|
+
decisions --json emit a bounded window of sealed review and compete gate verdicts
|
|
109
|
+
view <runId> [--follow] read one run's ledger entry, event journal, and receipt
|
|
110
|
+
view <fleetRootId> list a fleet run's steps and the run id to view for each
|
|
92
111
|
drain [--json] deny new execution starts for up to one hour
|
|
93
112
|
resume [--json] reopen dispatch admission immediately
|
|
94
113
|
|
|
@@ -96,6 +115,10 @@ Notes:
|
|
|
96
115
|
status reads the durable run ledger. Rows started by another process show
|
|
97
116
|
heartbeat liveness from the recorded worker pid; per-token live meters are
|
|
98
117
|
only available inside the process that owns the run.
|
|
118
|
+
view is read-only and shares no memory with the orchestrator, so it follows a
|
|
119
|
+
run from a second terminal or over SSH. Its transcript comes from the run
|
|
120
|
+
event journal, written when fleet.history.journal is on (the default). Handed the
|
|
121
|
+
fleet-<hex> root id that run prints, it lists that run's steps instead.
|
|
99
122
|
drain preserves running work. Repeat it to renew the one-hour expiry; resume
|
|
100
123
|
clears it early. The expiry prevents an abandoned drain from wedging Clio.
|
|
101
124
|
`;
|
|
@@ -127,7 +150,9 @@ function parseVars(args: ReadonlyArray<string>): { vars: Record<string, string>;
|
|
|
127
150
|
const eq = pair.indexOf("=");
|
|
128
151
|
const key = pair.slice(0, eq).trim();
|
|
129
152
|
const value = pair.slice(eq + 1);
|
|
130
|
-
if (key.length === 0)
|
|
153
|
+
if (key.length === 0) {
|
|
154
|
+
return { vars, rest, error: "--var requires a non-empty key" };
|
|
155
|
+
}
|
|
131
156
|
vars[key] = value;
|
|
132
157
|
}
|
|
133
158
|
return { vars, rest };
|
|
@@ -145,7 +170,9 @@ function renderStep(step: FleetContractStep): string {
|
|
|
145
170
|
if (step.kind === "code") return `code:${step.command}[${step.scope}]`;
|
|
146
171
|
if (step.kind === "agent") return `${step.agent}[${step.scope}]`;
|
|
147
172
|
if (step.kind === "gate") return `gate:${step.path}[${step.run}]`;
|
|
148
|
-
if (step.kind === "plan")
|
|
173
|
+
if (step.kind === "plan") {
|
|
174
|
+
return `plan:${step.agent}[${step.roster.join(",")}; max ${step.maxTasks}]`;
|
|
175
|
+
}
|
|
149
176
|
const check =
|
|
150
177
|
step.check.kind === "code"
|
|
151
178
|
? `code:${step.check.command}`
|
|
@@ -212,16 +239,28 @@ function contractAgents(
|
|
|
212
239
|
): Array<{ id: string; agent: string; scope: "readonly" | "workspace" }> {
|
|
213
240
|
const agents: Array<{ id: string; agent: string; scope: "readonly" | "workspace" }> = [];
|
|
214
241
|
for (const step of contract.steps) {
|
|
215
|
-
if (step.kind === "agent")
|
|
216
|
-
|
|
217
|
-
else if (step.kind === "
|
|
242
|
+
if (step.kind === "agent") {
|
|
243
|
+
agents.push({ id: step.id, agent: step.agent, scope: step.scope });
|
|
244
|
+
} else if (step.kind === "gate") {
|
|
245
|
+
agents.push({ id: step.id, agent: step.agent, scope: "workspace" });
|
|
246
|
+
} else if (step.kind === "plan") {
|
|
218
247
|
agents.push({ id: step.id, agent: step.agent, scope: step.scope });
|
|
219
|
-
for (const agent of step.roster)
|
|
248
|
+
for (const agent of step.roster) {
|
|
249
|
+
agents.push({ id: `${step.id}.roster`, agent, scope: "readonly" });
|
|
250
|
+
}
|
|
220
251
|
} else if (step.kind === "loop") {
|
|
221
252
|
if (step.check.kind === "agent") {
|
|
222
|
-
agents.push({
|
|
253
|
+
agents.push({
|
|
254
|
+
id: `${step.id}.check`,
|
|
255
|
+
agent: step.check.agent,
|
|
256
|
+
scope: step.check.scope,
|
|
257
|
+
});
|
|
223
258
|
}
|
|
224
|
-
agents.push({
|
|
259
|
+
agents.push({
|
|
260
|
+
id: `${step.id}.repair`,
|
|
261
|
+
agent: step.repair.agent,
|
|
262
|
+
scope: step.repair.scope,
|
|
263
|
+
});
|
|
225
264
|
}
|
|
226
265
|
}
|
|
227
266
|
return agents;
|
|
@@ -229,12 +268,14 @@ function contractAgents(
|
|
|
229
268
|
|
|
230
269
|
function preflightFleet(contract: FleetContract, deps: FleetPreflightDeps): string | null {
|
|
231
270
|
const targets = new Set(deps.settings.targets.map((target) => target.id));
|
|
232
|
-
const profiles = new Set(Object.keys(deps.settings.
|
|
271
|
+
const profiles = new Set(Object.keys(deps.settings.fleet?.profiles ?? {}));
|
|
233
272
|
const checkRoute = (id: string, route: { target?: string; profile?: string }): string | null => {
|
|
234
|
-
if (route.target !== undefined && !targets.has(route.target))
|
|
273
|
+
if (route.target !== undefined && !targets.has(route.target)) {
|
|
235
274
|
return `unknown target '${route.target}' at step '${id}'`;
|
|
236
|
-
|
|
275
|
+
}
|
|
276
|
+
if (route.profile !== undefined && !profiles.has(route.profile)) {
|
|
237
277
|
return `unknown profile '${route.profile}' at step '${id}'`;
|
|
278
|
+
}
|
|
238
279
|
return null;
|
|
239
280
|
};
|
|
240
281
|
for (const step of contract.steps) {
|
|
@@ -280,10 +321,13 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
|
|
|
280
321
|
const json = rest.includes("--json");
|
|
281
322
|
const resumeIndex = rest.indexOf("--resume");
|
|
282
323
|
const resumeId = resumeIndex === -1 ? undefined : rest[resumeIndex + 1];
|
|
283
|
-
if (resumeIndex !== -1 && (resumeId === undefined || resumeId.startsWith("-")))
|
|
324
|
+
if (resumeIndex !== -1 && (resumeId === undefined || resumeId.startsWith("-"))) {
|
|
284
325
|
return fail("--resume requires a run id");
|
|
326
|
+
}
|
|
285
327
|
const name = rest.find((arg) => !arg.startsWith("-"));
|
|
286
|
-
if (!name)
|
|
328
|
+
if (!name) {
|
|
329
|
+
return fail("usage: clio-coder fleet run <name> [--var key=value ...] [--resume <runId>] [--json]");
|
|
330
|
+
}
|
|
287
331
|
|
|
288
332
|
let contract: FleetContract;
|
|
289
333
|
let prompt: string;
|
|
@@ -312,7 +356,10 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
|
|
|
312
356
|
MiddlewareDomainModule,
|
|
313
357
|
ObservabilityDomainModule,
|
|
314
358
|
SchedulingDomainModule,
|
|
315
|
-
|
|
359
|
+
// A fleet step is dispatched by executeFleetRun, which drains the handle
|
|
360
|
+
// itself and never builds a dispatch event registry, so the domain is the
|
|
361
|
+
// only thing that can write each step's durable transcript.
|
|
362
|
+
createDispatchDomainModule({ journalRunEvents: true }),
|
|
316
363
|
SessionDomainModule,
|
|
317
364
|
LifecycleDomainModule,
|
|
318
365
|
]);
|
|
@@ -325,12 +372,17 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
|
|
|
325
372
|
await loaded.stop();
|
|
326
373
|
return fail("required domains unavailable (dispatch/agents/safety)");
|
|
327
374
|
}
|
|
375
|
+
const fleetSettings = config?.get() ?? readSettings();
|
|
376
|
+
// Install `panes.journal` the same way the interactive composition root
|
|
377
|
+
// does, so a fleet run honours the setting without the journal ever reading
|
|
378
|
+
// settings.yaml from the dispatch event path.
|
|
379
|
+
configureRunEventJournal(fleetSettings.fleet.history.journal);
|
|
328
380
|
const roleFacts = agentRoleFactsResolver((id) => agents.getSpec(id));
|
|
329
381
|
const preflightError = preflightFleet(contract, {
|
|
330
382
|
agents,
|
|
331
383
|
safety,
|
|
332
384
|
scheduling,
|
|
333
|
-
settings:
|
|
385
|
+
settings: fleetSettings,
|
|
334
386
|
});
|
|
335
387
|
if (preflightError !== null) {
|
|
336
388
|
await loaded.stop();
|
|
@@ -452,35 +504,48 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
|
|
|
452
504
|
fleetRootId,
|
|
453
505
|
dispatch,
|
|
454
506
|
agents: { getSpec: (agentId) => agents.getSpec(agentId) },
|
|
455
|
-
attributionEnabled: config?.get().
|
|
507
|
+
attributionEnabled: config?.get().integrations.git.commitAttribution ?? true,
|
|
456
508
|
vars,
|
|
457
509
|
...(resume !== undefined ? { resume } : {}),
|
|
458
510
|
onStepSettled(step) {
|
|
459
511
|
if (step.replayed === true && step.result !== undefined) {
|
|
460
|
-
if (json)
|
|
512
|
+
if (json) {
|
|
461
513
|
process.stdout.write(
|
|
462
|
-
`${JSON.stringify({
|
|
514
|
+
`${JSON.stringify({
|
|
515
|
+
stepId: step.stepId,
|
|
516
|
+
status: "replayed",
|
|
517
|
+
receipt: {
|
|
518
|
+
runId: step.result.terminalRunId,
|
|
519
|
+
digest: step.result.receiptDigest,
|
|
520
|
+
},
|
|
521
|
+
})}\n`,
|
|
463
522
|
);
|
|
464
|
-
else
|
|
523
|
+
} else {
|
|
465
524
|
process.stdout.write(
|
|
466
525
|
`step ${step.stepId}: replayed terminal-run=${step.result.terminalRunId} receipt=${step.result.receiptDigest}\n`,
|
|
467
526
|
);
|
|
527
|
+
}
|
|
468
528
|
return;
|
|
469
529
|
}
|
|
470
530
|
if (step.receipt !== undefined) {
|
|
471
531
|
if (json) process.stdout.write(`${JSON.stringify(step.receipt)}\n`);
|
|
472
|
-
else
|
|
532
|
+
else {
|
|
473
533
|
process.stdout.write(
|
|
474
|
-
`step ${step.stepId} ${step.agentId}: ${step.succeeded ? "succeeded" : "failed"}${step.failureReason !== undefined ? ` reason=${step.failureReason}` : ""} assignment=${step.assignmentId} terminal-run=${step.terminalRunId} cost
|
|
534
|
+
`step ${step.stepId} ${step.agentId}: ${step.succeeded ? "succeeded" : "failed"}${step.failureReason !== undefined ? ` reason=${step.failureReason}` : ""} assignment=${step.assignmentId} terminal-run=${step.terminalRunId} cost=${renderCostAmount(step.costUsd, step.costProvenance)}\n`,
|
|
475
535
|
);
|
|
536
|
+
}
|
|
476
537
|
return;
|
|
477
538
|
}
|
|
478
539
|
if (step.codeStep !== undefined) {
|
|
479
|
-
if (json)
|
|
480
|
-
|
|
540
|
+
if (json) {
|
|
541
|
+
process.stdout.write(`${JSON.stringify({ codeStep: step.codeStep })}\n`);
|
|
542
|
+
} else {
|
|
481
543
|
process.stdout.write(
|
|
482
|
-
`step ${step.stepId} code:${step.commandId}: ${
|
|
544
|
+
`step ${step.stepId} code:${step.commandId}: ${
|
|
545
|
+
step.succeeded ? "passed" : "failed"
|
|
546
|
+
} exit=${step.codeStep.exitCode} ${step.codeStep.durationMs}ms record=${step.recordPath}\n`,
|
|
483
547
|
);
|
|
548
|
+
}
|
|
484
549
|
}
|
|
485
550
|
},
|
|
486
551
|
onNotice(text, kind) {
|
|
@@ -512,21 +577,31 @@ async function runFleet(args: ReadonlyArray<string>): Promise<number> {
|
|
|
512
577
|
);
|
|
513
578
|
} else {
|
|
514
579
|
process.stdout.write(
|
|
515
|
-
`fleet ${contract.name}: ${outcome.succeededStepCount}/${outcome.requiredStepCount} steps succeeded, ${outcome.resolvedLoopCount}/${outcome.result.loops.length} loops resolved, total cost
|
|
580
|
+
`fleet ${contract.name}: ${outcome.succeededStepCount}/${outcome.requiredStepCount} steps succeeded, ${outcome.resolvedLoopCount}/${outcome.result.loops.length} loops resolved, total cost ${renderCostAggregate(outcome.totalCost)}\n`,
|
|
516
581
|
);
|
|
517
|
-
for (const loop of outcome.result.loops)
|
|
582
|
+
for (const loop of outcome.result.loops) {
|
|
518
583
|
process.stdout.write(
|
|
519
584
|
` loop ${loop.loopId}: ${loop.reason} after ${loop.attempts} verification(s) and ${loop.repairs} repair(s)\n`,
|
|
520
585
|
);
|
|
521
|
-
|
|
586
|
+
}
|
|
587
|
+
if (outcome.result.revalidated.length > 0) {
|
|
522
588
|
process.stdout.write(
|
|
523
|
-
` staleness: re-ran ${outcome.result.revalidated.join(
|
|
589
|
+
` staleness: re-ran ${outcome.result.revalidated.join(
|
|
590
|
+
", ",
|
|
591
|
+
)} because a workspace step landed after the last green\n`,
|
|
524
592
|
);
|
|
525
|
-
|
|
593
|
+
}
|
|
594
|
+
for (const message of outcome.result.needsDecision) {
|
|
595
|
+
process.stdout.write(` needs operator decision: ${message}\n`);
|
|
596
|
+
}
|
|
526
597
|
for (const boundary of outcome.result.writeBoundaries) {
|
|
527
598
|
if (!boundary.violated) continue;
|
|
528
599
|
process.stdout.write(` write boundary ${boundary.window}: ${boundary.detail ?? WRITE_BOUNDARY_VIOLATION_REASON}\n`);
|
|
529
600
|
}
|
|
601
|
+
// The root id printed at the top is the only identifier this command
|
|
602
|
+
// advertises, so say what it is good for rather than leaving an operator
|
|
603
|
+
// to guess that the viewer wants a per-step run id.
|
|
604
|
+
process.stdout.write(` clio-coder fleet view ${fleetRootId} step index with each step's run id\n`);
|
|
530
605
|
}
|
|
531
606
|
return outcome.cleanRun ? 0 : 1;
|
|
532
607
|
}
|
|
@@ -559,7 +634,10 @@ function receiptTokenSplit(row: RunEnvelope): { input: number; output: number }
|
|
|
559
634
|
const path = row.receiptPath ?? join(clioStateDir(), "receipts", `${row.id}.json`);
|
|
560
635
|
try {
|
|
561
636
|
const parsed = JSON.parse(readFileSync(path, "utf8")) as Partial<RunReceipt>;
|
|
562
|
-
return {
|
|
637
|
+
return {
|
|
638
|
+
input: finiteCount(parsed.inputTokenCount),
|
|
639
|
+
output: finiteCount(parsed.outputTokenCount),
|
|
640
|
+
};
|
|
563
641
|
} catch {
|
|
564
642
|
return null;
|
|
565
643
|
}
|
|
@@ -572,7 +650,10 @@ function receiptTokenSplit(row: RunEnvelope): { input: number; output: number }
|
|
|
572
650
|
*/
|
|
573
651
|
function rowTokenSplit(row: RunEnvelope): { input: number; output: number } {
|
|
574
652
|
if (row.inputTokenCount !== undefined || row.outputTokenCount !== undefined) {
|
|
575
|
-
return {
|
|
653
|
+
return {
|
|
654
|
+
input: finiteCount(row.inputTokenCount),
|
|
655
|
+
output: finiteCount(row.outputTokenCount),
|
|
656
|
+
};
|
|
576
657
|
}
|
|
577
658
|
if (row.endedAt !== null) {
|
|
578
659
|
return receiptTokenSplit(row) ?? { input: 0, output: 0 };
|
|
@@ -582,19 +663,33 @@ function rowTokenSplit(row: RunEnvelope): { input: number; output: number } {
|
|
|
582
663
|
|
|
583
664
|
export type FleetAdmissionStatus =
|
|
584
665
|
| { state: "open" }
|
|
585
|
-
| {
|
|
666
|
+
| {
|
|
667
|
+
state: "draining";
|
|
668
|
+
requestedByPid: number;
|
|
669
|
+
requestedAt: string;
|
|
670
|
+
expiresAt: string;
|
|
671
|
+
};
|
|
586
672
|
|
|
587
673
|
function admissionStatus(drain: CapacityDrain | null): FleetAdmissionStatus {
|
|
588
674
|
if (drain === null) return { state: "open" };
|
|
589
675
|
return { state: "draining", ...drain };
|
|
590
676
|
}
|
|
591
677
|
|
|
592
|
-
|
|
678
|
+
function statusSnapshot(): {
|
|
593
679
|
generatedAt: string;
|
|
594
680
|
admission: FleetAdmissionStatus;
|
|
595
681
|
running: Array<Record<string, unknown>>;
|
|
596
682
|
retrying: Array<Record<string, unknown>>;
|
|
597
|
-
totals: {
|
|
683
|
+
totals: {
|
|
684
|
+
inputTokens: number;
|
|
685
|
+
outputTokens: number;
|
|
686
|
+
totalTokens: number;
|
|
687
|
+
/** The bare sum, kept for JSON readers that already parse it. Render `cost`. */
|
|
688
|
+
costUsd: number;
|
|
689
|
+
/** Mirrors what `DispatchSnapshot.totals.cost` declares for the in-process surface. */
|
|
690
|
+
cost: CostAggregate;
|
|
691
|
+
runtimeSeconds: number;
|
|
692
|
+
};
|
|
598
693
|
} {
|
|
599
694
|
const ledger = openLedger();
|
|
600
695
|
const nowMs = Date.now();
|
|
@@ -615,10 +710,18 @@ export function statusSnapshot(): {
|
|
|
615
710
|
elapsedMs: Number.isFinite(startedMs) ? Math.max(0, nowMs - startedMs) : 0,
|
|
616
711
|
tokens: { input: 0, output: 0, total: row.tokenCount },
|
|
617
712
|
costUsd: row.costUsd,
|
|
713
|
+
// Absent on pre-provenance ledger rows, which readers must treat as
|
|
714
|
+
// unknown; `renderCostAmount` normalizes it rather than assuming free.
|
|
715
|
+
costProvenance: row.costProvenance,
|
|
618
716
|
node: row.node?.id ?? "local",
|
|
619
717
|
};
|
|
620
718
|
});
|
|
621
719
|
const totals = { inputTokens: 0, outputTokens: 0, totalTokens: 0, costUsd: 0, runtimeSeconds: 0 };
|
|
720
|
+
// Folded rather than summed: a ledger of runs nobody priced totals to an
|
|
721
|
+
// absent cost claim, not to zero dollars.
|
|
722
|
+
const cost = aggregateCostAmounts(
|
|
723
|
+
rows.map((row) => ({ usd: row.costUsd, provenance: normalizeCostProvenance(row.costProvenance) })),
|
|
724
|
+
);
|
|
622
725
|
for (const row of rows) {
|
|
623
726
|
const split = rowTokenSplit(row);
|
|
624
727
|
totals.inputTokens += split.input;
|
|
@@ -638,7 +741,7 @@ export function statusSnapshot(): {
|
|
|
638
741
|
admission: admissionStatus(capacityDrain(nowMs)),
|
|
639
742
|
running,
|
|
640
743
|
retrying: [],
|
|
641
|
-
totals,
|
|
744
|
+
totals: { ...totals, cost },
|
|
642
745
|
};
|
|
643
746
|
}
|
|
644
747
|
|
|
@@ -663,7 +766,7 @@ function runStatus(args: ReadonlyArray<string>): number {
|
|
|
663
766
|
for (const row of snapshot.running) {
|
|
664
767
|
const lineage = row.lineage as { attempt: number; depth: number };
|
|
665
768
|
process.stdout.write(
|
|
666
|
-
` ${row.runId} ${row.agentId} node=${row.node} ${row.heartbeat} attempt=${lineage.attempt} depth=${lineage.depth} ${Math.round((row.elapsedMs as number) / 1000)}s
|
|
769
|
+
` ${row.runId} ${row.agentId} node=${row.node} ${row.heartbeat} attempt=${lineage.attempt} depth=${lineage.depth} ${Math.round((row.elapsedMs as number) / 1000)}s ${renderCostAmount(row.costUsd as number, row.costProvenance as CostProvenance | undefined)}\n`,
|
|
667
770
|
);
|
|
668
771
|
const budget = row.budget as RunToolBudgetEnvelope | null;
|
|
669
772
|
if (budget !== null) {
|
|
@@ -684,7 +787,7 @@ function runStatus(args: ReadonlyArray<string>): number {
|
|
|
684
787
|
}
|
|
685
788
|
const t = snapshot.totals;
|
|
686
789
|
process.stdout.write(
|
|
687
|
-
`totals: tokens=${t.totalTokens} (in=${t.inputTokens} out=${t.outputTokens}) cost
|
|
790
|
+
`totals: tokens=${t.totalTokens} (in=${t.inputTokens} out=${t.outputTokens}) cost=${renderCostAggregate(t.cost)} runtime=${Math.round(t.runtimeSeconds)}s\n`,
|
|
688
791
|
);
|
|
689
792
|
return 0;
|
|
690
793
|
}
|
|
@@ -710,6 +813,9 @@ function runAdmissionControl(command: "drain" | "resume", args: ReadonlyArray<st
|
|
|
710
813
|
|
|
711
814
|
export async function runFleetCommand(args: ReadonlyArray<string>): Promise<number> {
|
|
712
815
|
const sub = args[0];
|
|
816
|
+
if (sub === "view" && (args.includes("--help") || args.includes("-h"))) {
|
|
817
|
+
return (await import("./fleet-view.js")).runFleetView(args.slice(1));
|
|
818
|
+
}
|
|
713
819
|
// Asking for help is not a usage error, and it is not an argument either.
|
|
714
820
|
// `status|drain|resume --help` answered `unknown flag: --help` on stderr with
|
|
715
821
|
// status 2, `run --help` answered its usage the same way, and `list --help`
|
|
@@ -738,6 +844,14 @@ export async function runFleetCommand(args: ReadonlyArray<string>): Promise<numb
|
|
|
738
844
|
return runFleet(args.slice(1));
|
|
739
845
|
case "status":
|
|
740
846
|
return runStatus(args.slice(1));
|
|
847
|
+
case "inspect":
|
|
848
|
+
return (await import("./fleet-inspect.js")).runFleetInspect(args.slice(1));
|
|
849
|
+
case "decisions":
|
|
850
|
+
return (await import("./fleet-decisions.js")).runFleetDecisions(args.slice(1));
|
|
851
|
+
case "verify":
|
|
852
|
+
return (await import("./fleet-verify.js")).runFleetVerify(args.slice(1));
|
|
853
|
+
case "view":
|
|
854
|
+
return (await import("./fleet-view.js")).runFleetView(args.slice(1));
|
|
741
855
|
case "drain":
|
|
742
856
|
return runAdmissionControl("drain", args.slice(1));
|
|
743
857
|
case "resume":
|
package/src/cli/index.ts
CHANGED
|
@@ -30,10 +30,13 @@ science. CLIO stands for Context Layer for Input/Output, named for the Greek mus
|
|
|
30
30
|
Usage:
|
|
31
31
|
clio-coder start interactive repository chat
|
|
32
32
|
clio-coder acp serve Clio as an ACP v1 agent over stdio
|
|
33
|
+
clio-coder --acp alias for clio-coder acp
|
|
33
34
|
clio-coder run [flags] <task> run one headless main-agent turn
|
|
34
35
|
clio-coder --version, -v print the Clio Coder version
|
|
35
36
|
clio-coder --api-key <key> override the active target API key for this run
|
|
36
37
|
clio-coder --no-context-files, -nc skip CLIO-CODER.md project-context injection
|
|
38
|
+
clio-coder --with-panes activate the panes extension (terminal panes for workers and tools)
|
|
39
|
+
clio-coder --no-panes keep panes off even when settings turn them on
|
|
37
40
|
clio-coder configure interactive first-run/configuration wizard
|
|
38
41
|
clio-coder targets list configured targets, health, auth, and capabilities
|
|
39
42
|
clio-coder targets add add a target interactively or via flags
|
|
@@ -57,7 +60,7 @@ Usage:
|
|
|
57
60
|
clio-coder uninstall remove all Clio Coder state; --remove-binary also unlinks the launcher
|
|
58
61
|
clio-coder upgrade upgrade Clio Coder and run pending migrations
|
|
59
62
|
clio-coder agents list discovered agent recipes
|
|
60
|
-
clio-coder fleet new|validate|graph|commands|run|status|drain|resume fleet authoring, execution, status, and admission control
|
|
63
|
+
clio-coder fleet new|validate|graph|commands|run|status|view|verify|drain|resume fleet authoring, execution, status, verification, and admission control
|
|
61
64
|
clio-coder evidence build, list, or inspect evidence artifacts
|
|
62
65
|
clio-coder eval run, report, or compare local eval task files
|
|
63
66
|
clio-coder memory list, propose, promote, approve, reject, or prune memory
|
|
@@ -66,7 +69,10 @@ Usage:
|
|
|
66
69
|
clio-coder extensions install, list, enable, disable, or remove extension packages
|
|
67
70
|
clio-coder skills list, inspect, validate, or install skills
|
|
68
71
|
clio-coder library list, search, add, or sync agents, prompts, fleets, and skills from catalogs
|
|
69
|
-
clio-coder verifiers discover, author, validate, edit, or dry-run project checks
|
|
72
|
+
clio-coder verifiers discover, inspect, author, validate, edit, or dry-run project checks
|
|
73
|
+
clio-coder tools list|status|install|remove <id> pinned external programs Clio can drive
|
|
74
|
+
clio-coder interop inspect --json detected external coding agents and how far each one is wired
|
|
75
|
+
clio-coder panes install install the pane multiplexer (alias for 'tools install herdr')
|
|
70
76
|
clio-coder docs [topic] serve the HTML docs of a source checkout on 127.0.0.1 (--no-open to skip browser)
|
|
71
77
|
clio-coder dev <command> harness instruments; run 'clio-coder dev' for the list
|
|
72
78
|
clio-coder --help, -h this message
|
|
@@ -112,6 +118,7 @@ interface CliBootOptions {
|
|
|
112
118
|
noContextFiles?: boolean;
|
|
113
119
|
noSkills?: boolean;
|
|
114
120
|
skillPaths?: string[];
|
|
121
|
+
panes?: "with" | "without";
|
|
115
122
|
}
|
|
116
123
|
|
|
117
124
|
type CommandHandler = (subArgs: string[], bootOptions: CliBootOptions) => Promise<number>;
|
|
@@ -143,6 +150,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
143
150
|
noContextFiles,
|
|
144
151
|
noSkills,
|
|
145
152
|
skillPaths,
|
|
153
|
+
panes,
|
|
146
154
|
rest,
|
|
147
155
|
error: globalFlagError,
|
|
148
156
|
} = extractGlobalFlags(argv, isCommandToken);
|
|
@@ -169,6 +177,7 @@ async function main(argv: string[]): Promise<number> {
|
|
|
169
177
|
...(noContextFiles ? { noContextFiles: true } : {}),
|
|
170
178
|
...(noSkills ? { noSkills: true } : {}),
|
|
171
179
|
...(skillPaths.length > 0 ? { skillPaths } : {}),
|
|
180
|
+
...(panes === undefined ? {} : { panes }),
|
|
172
181
|
};
|
|
173
182
|
if (!subcommand) {
|
|
174
183
|
await enableBootCompileCache();
|
|
@@ -261,6 +270,9 @@ const COMMAND_HANDLERS = new Map<string, CommandHandler>([
|
|
|
261
270
|
return (await import("./run.js")).runClioRun(subArgs, bootOptions);
|
|
262
271
|
},
|
|
263
272
|
],
|
|
273
|
+
["tools", async (subArgs) => (await import("./tools.js")).runToolsCommand(subArgs)],
|
|
274
|
+
["interop", async (subArgs) => (await import("./interop.js")).runInteropCommand(subArgs)],
|
|
275
|
+
["panes", async (subArgs) => (await import("./panes.js")).runPanesCommand(subArgs)],
|
|
264
276
|
["doctor", async (subArgs) => (await import("./doctor.js")).runDoctorCommand(subArgs)],
|
|
265
277
|
["paths", async (subArgs) => (await import("./paths.js")).runPathsCommand(subArgs)],
|
|
266
278
|
["reset", async (subArgs) => (await import("./reset.js")).runResetCommand(subArgs)],
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of detected external coding agents.
|
|
3
|
+
*
|
|
4
|
+
* `configure --interop` is an interactive review that writes delegation peers
|
|
5
|
+
* into settings, so it is not a transport a GUI host can invoke. This command
|
|
6
|
+
* takes no identifier or flag beyond `--json`, decides nothing, and writes
|
|
7
|
+
* nothing.
|
|
8
|
+
*
|
|
9
|
+
* It also runs no foreign executable. Detection can probe `<bin> --version`,
|
|
10
|
+
* and this read deliberately does not: a GUI refresh must not become "execute
|
|
11
|
+
* every coding agent installed on this machine". The version still crosses,
|
|
12
|
+
* because a non-probing detection keeps the last version the harness observed
|
|
13
|
+
* for the same binary, so what the operator sees is a recorded fact rather than
|
|
14
|
+
* a fresh execution.
|
|
15
|
+
*
|
|
16
|
+
* Resolved binary paths and the agent's home directory are native filesystem
|
|
17
|
+
* facts and stay on the host. Whether a directory exists crosses; where it is
|
|
18
|
+
* does not.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { readSettings } from "../core/config.js";
|
|
22
|
+
import {
|
|
23
|
+
detectInteropAgents,
|
|
24
|
+
INTEROP_AGENT_KINDS,
|
|
25
|
+
type InteropAgentId,
|
|
26
|
+
type InteropPresence,
|
|
27
|
+
interopAgentKind,
|
|
28
|
+
} from "../domains/interop/index.js";
|
|
29
|
+
|
|
30
|
+
export type InteropDecisionState = "accepted" | "declined";
|
|
31
|
+
|
|
32
|
+
export interface InteropInspectAgent {
|
|
33
|
+
readonly id: InteropAgentId;
|
|
34
|
+
readonly label: string;
|
|
35
|
+
readonly presence: InteropPresence;
|
|
36
|
+
/** The last version the harness observed for this binary, never probed here. */
|
|
37
|
+
readonly version: string | null;
|
|
38
|
+
/** Whether the agent owns a directory under the operator's home. The path stays host-side. */
|
|
39
|
+
readonly hasUserDirectory: boolean;
|
|
40
|
+
/** Whether this kind speaks ACP at all. */
|
|
41
|
+
readonly acp: boolean;
|
|
42
|
+
/** Whether the ACP adapter can start without a network install; null for a kind with no recipe. */
|
|
43
|
+
readonly adapter: InteropPresence | null;
|
|
44
|
+
/** Whether a `delegation.agents` entry already names this agent. */
|
|
45
|
+
readonly configured: boolean;
|
|
46
|
+
/** The operator's standing answer, or null when they have not been asked. */
|
|
47
|
+
readonly decision: InteropDecisionState | null;
|
|
48
|
+
readonly decidedAt: string | null;
|
|
49
|
+
/**
|
|
50
|
+
* True when the facts moved since the decision was taken.
|
|
51
|
+
*
|
|
52
|
+
* A standing answer suppresses re-proposal only while the facts it was made
|
|
53
|
+
* against still hold, so this is what says Clio Coder will ask again.
|
|
54
|
+
*/
|
|
55
|
+
readonly decisionStale: boolean;
|
|
56
|
+
/** True when Clio Coder would offer to wire this agent on the next review. */
|
|
57
|
+
readonly proposed: boolean;
|
|
58
|
+
/** True when wiring it would fetch the adapter from the network on first use. */
|
|
59
|
+
readonly needsNetworkInstall: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface InteropInspectSnapshot {
|
|
63
|
+
readonly version: 1;
|
|
64
|
+
readonly generatedAt: string;
|
|
65
|
+
readonly detectedAt: string;
|
|
66
|
+
/**
|
|
67
|
+
* How many agent kinds the registry knows, so an empty list reads as "none
|
|
68
|
+
* detected" rather than "nothing to detect". Detection drops a kind with no
|
|
69
|
+
* binary, no directory, and no artifacts, so the list is never padded.
|
|
70
|
+
*/
|
|
71
|
+
readonly knownKinds: number;
|
|
72
|
+
readonly agents: readonly InteropInspectAgent[];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Skill and artifact counts are deliberately absent.
|
|
77
|
+
*
|
|
78
|
+
* Detection populates them only from sources the resources and context domains
|
|
79
|
+
* have already loaded, and this command loads neither. Reporting the structural
|
|
80
|
+
* zero that would result would state a fact this read did not establish.
|
|
81
|
+
*/
|
|
82
|
+
async function interopInspectSnapshot(now: () => number = Date.now): Promise<InteropInspectSnapshot> {
|
|
83
|
+
const report = await detectInteropAgents({ cwd: process.cwd(), probeVersion: false });
|
|
84
|
+
const settings = readSettings();
|
|
85
|
+
const configured = new Set(settings.integrations.externalAgents.entries.map((agent) => agent.id));
|
|
86
|
+
const agents: InteropInspectAgent[] = [];
|
|
87
|
+
for (const record of report.agents) {
|
|
88
|
+
const kind = interopAgentKind(record.kind);
|
|
89
|
+
if (kind === undefined) continue;
|
|
90
|
+
const acp = kind.acp !== undefined;
|
|
91
|
+
const decision = record.decision === "accepted" || record.decision === "declined" ? record.decision : null;
|
|
92
|
+
const decisionStale = decision !== null && record.decidedFingerprint !== record.fingerprint;
|
|
93
|
+
const isConfigured = configured.has(kind.id);
|
|
94
|
+
agents.push({
|
|
95
|
+
id: kind.id,
|
|
96
|
+
label: kind.label,
|
|
97
|
+
presence: record.presence,
|
|
98
|
+
version: typeof record.version === "string" && record.version.length > 0 ? record.version : null,
|
|
99
|
+
hasUserDirectory: record.installDir !== undefined,
|
|
100
|
+
acp,
|
|
101
|
+
adapter: acp ? (record.adapter ?? "unknown") : null,
|
|
102
|
+
configured: isConfigured,
|
|
103
|
+
decision,
|
|
104
|
+
decidedAt: decision === null ? null : (record.decidedAt ?? null),
|
|
105
|
+
decisionStale,
|
|
106
|
+
// The same rule `interopProposals` applies, restated over the projected
|
|
107
|
+
// fields so the flag cannot drift from what the review would offer.
|
|
108
|
+
proposed: acp && record.presence === "present" && !isConfigured && (decision === null || decisionStale),
|
|
109
|
+
needsNetworkInstall: acp && record.adapter !== "present",
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
version: 1,
|
|
114
|
+
generatedAt: new Date(now()).toISOString(),
|
|
115
|
+
detectedAt: report.detectedAt,
|
|
116
|
+
knownKinds: INTEROP_AGENT_KINDS.length,
|
|
117
|
+
agents,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export async function runInteropInspect(args: ReadonlyArray<string>): Promise<number> {
|
|
122
|
+
if (args.length !== 1 || args[0] !== "--json") {
|
|
123
|
+
process.stderr.write("clio-coder interop inspect: usage: clio-coder interop inspect --json\n");
|
|
124
|
+
return 2;
|
|
125
|
+
}
|
|
126
|
+
process.stdout.write(`${JSON.stringify(await interopInspectSnapshot(), null, 2)}\n`);
|
|
127
|
+
return 0;
|
|
128
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `clio-coder interop`, the read half of external coding agent detection.
|
|
3
|
+
*
|
|
4
|
+
* Reviewing and wiring a detected agent as a delegation peer is an interactive
|
|
5
|
+
* mutation and stays on `configure --interop`. This command family carries the
|
|
6
|
+
* read only, and its one subcommand is the fixed projection a GUI host may run.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { runInteropInspect } from "./interop-inspect.js";
|
|
10
|
+
import { printError } from "./shared.js";
|
|
11
|
+
|
|
12
|
+
const HELP = `clio-coder interop <subcommand>
|
|
13
|
+
|
|
14
|
+
Detected external coding agents and how far each one is wired.
|
|
15
|
+
|
|
16
|
+
Subcommands:
|
|
17
|
+
inspect --json emit the detected agent inventory with no native paths
|
|
18
|
+
|
|
19
|
+
Notes:
|
|
20
|
+
inspect writes nothing and runs no foreign executable. Wiring a detected agent
|
|
21
|
+
as a delegation peer is an explicit review: run \`clio-coder configure --interop\`.
|
|
22
|
+
`;
|
|
23
|
+
|
|
24
|
+
export async function runInteropCommand(args: ReadonlyArray<string>): Promise<number> {
|
|
25
|
+
const sub = args[0];
|
|
26
|
+
if (sub === undefined || sub === "--help" || sub === "-h") {
|
|
27
|
+
process.stdout.write(HELP);
|
|
28
|
+
return sub === undefined ? 2 : 0;
|
|
29
|
+
}
|
|
30
|
+
if (sub === "inspect") return await runInteropInspect(args.slice(1));
|
|
31
|
+
printError(`unknown interop command: ${sub}`);
|
|
32
|
+
process.stdout.write(HELP);
|
|
33
|
+
return 2;
|
|
34
|
+
}
|
package/src/cli/models.ts
CHANGED
|
@@ -117,7 +117,7 @@ export async function runModelsCommand(args: ReadonlyArray<string>): Promise<num
|
|
|
117
117
|
return 0;
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
function collectRows(entries: ReadonlyArray<TargetStatus>, providers: ProvidersContract): ModelRow[] {
|
|
121
121
|
const rows: ModelRow[] = [];
|
|
122
122
|
for (const status of entries) {
|
|
123
123
|
const runtimeId = status.runtime?.id ?? status.target.runtime;
|
|
@@ -188,7 +188,7 @@ function compactTokenCount(value: number): string {
|
|
|
188
188
|
return String(value);
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
function emptyModelsMessage(
|
|
192
192
|
args: Pick<ModelArgs, "search" | "target">,
|
|
193
193
|
configuredTargets: number,
|
|
194
194
|
matchedTargets: number,
|
|
@@ -217,7 +217,7 @@ function truncateModelId(id: string): string {
|
|
|
217
217
|
return `${id.slice(0, MODEL_ID_WIDTH_CAP - 3)}...`;
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
-
|
|
220
|
+
function modelTableLines(rows: ReadonlyArray<ModelRow>): string[] {
|
|
221
221
|
const includeState = rows.some((row) => row.state && row.state !== "-");
|
|
222
222
|
const headers = includeState
|
|
223
223
|
? ["target", "runtime", "model", "state", "caps", "ctx", "max"]
|