@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
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of recent evidence artifacts.
|
|
3
|
+
*
|
|
4
|
+
* `evidence list` is an operator table and `evidence inspect <id>` needs an id,
|
|
5
|
+
* so neither is a transport a GUI host can invoke blind. This command accepts
|
|
6
|
+
* no identifier, path, or limit, selects a bounded newest-first window itself,
|
|
7
|
+
* and emits provenance, tags, totals, and a trust verdict.
|
|
8
|
+
*
|
|
9
|
+
* An overview carries the working directories the runs executed in, the task
|
|
10
|
+
* text the operator typed, and the file names inside the bundle. None of that
|
|
11
|
+
* appears here. What does is the shape of the artifact and how far it can be
|
|
12
|
+
* trusted, which is what an operator picks a bundle by.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { clioDataDir } from "../core/xdg.js";
|
|
16
|
+
import {
|
|
17
|
+
EVIDENCE_TAGS,
|
|
18
|
+
type EvidenceOverview,
|
|
19
|
+
type EvidenceTag,
|
|
20
|
+
listEvidenceOverviews,
|
|
21
|
+
loadEvidenceTrustStatus,
|
|
22
|
+
type TrustVerdict,
|
|
23
|
+
trustVerdict,
|
|
24
|
+
} from "../domains/evidence/index.js";
|
|
25
|
+
import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
|
|
26
|
+
import { truncateToWidth } from "../engine/tui-primitives.js";
|
|
27
|
+
|
|
28
|
+
export const EVIDENCE_INVENTORY_MAX_ARTIFACTS = 12;
|
|
29
|
+
export const EVIDENCE_INVENTORY_MAX_IDS = 8;
|
|
30
|
+
|
|
31
|
+
const IDENTITY_WIDTH = 128;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Worst verdict first.
|
|
35
|
+
*
|
|
36
|
+
* An artifact covering several runs is only as trustworthy as its weakest run,
|
|
37
|
+
* so the fold takes the worst rather than the newest or the most common. A
|
|
38
|
+
* `compromised` run inside an otherwise clean bundle is the fact the operator
|
|
39
|
+
* needs, and averaging it away would be the one summary worth not printing.
|
|
40
|
+
*/
|
|
41
|
+
const VERDICT_SEVERITY: ReadonlyArray<TrustVerdict> = ["compromised", "unverified", "unknown", "grounded", "reviewed"];
|
|
42
|
+
|
|
43
|
+
export interface EvidenceInventoryArtifact {
|
|
44
|
+
readonly evidenceId: string;
|
|
45
|
+
readonly sourceKind: "run" | "session" | "eval";
|
|
46
|
+
readonly generatedAt: string;
|
|
47
|
+
readonly startedAt: string | null;
|
|
48
|
+
readonly endedAt: string | null;
|
|
49
|
+
readonly runIds: readonly string[];
|
|
50
|
+
readonly runIdsTruncated: boolean;
|
|
51
|
+
readonly agentIds: readonly string[];
|
|
52
|
+
readonly statuses: readonly string[];
|
|
53
|
+
readonly tags: readonly EvidenceTag[];
|
|
54
|
+
readonly totals: Readonly<{
|
|
55
|
+
runs: number;
|
|
56
|
+
receipts: number;
|
|
57
|
+
toolCalls: number;
|
|
58
|
+
toolErrors: number;
|
|
59
|
+
blockedToolCalls: number;
|
|
60
|
+
protectedArtifacts: number;
|
|
61
|
+
tokens: number;
|
|
62
|
+
costUsd: number;
|
|
63
|
+
wallTimeMs: number;
|
|
64
|
+
}>;
|
|
65
|
+
/** Secret-shaped values the builder replaced across the bundle's exports. */
|
|
66
|
+
readonly redactionCount: number;
|
|
67
|
+
readonly trust: Readonly<{
|
|
68
|
+
verdict: TrustVerdict;
|
|
69
|
+
/** Runs whose canonical trust status the bundle actually recorded. */
|
|
70
|
+
runsCovered: number;
|
|
71
|
+
/** True when the bundle predates the canonical trust projection. */
|
|
72
|
+
historical: boolean;
|
|
73
|
+
}>;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface EvidenceInventorySnapshot {
|
|
77
|
+
readonly version: 1;
|
|
78
|
+
readonly generatedAt: string;
|
|
79
|
+
readonly artifacts: readonly EvidenceInventoryArtifact[];
|
|
80
|
+
readonly truncated: boolean;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function bounded(value: string, width: number): string {
|
|
84
|
+
const sanitized = sanitizeCallTargetText(value);
|
|
85
|
+
if (sanitized.length === 0) return "unavailable";
|
|
86
|
+
return sanitizeCallTargetText(truncateToWidth(sanitized, width, "…", false));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Distinct, sanitized, bounded, in first-seen order. */
|
|
90
|
+
function identities(values: ReadonlyArray<string>): string[] {
|
|
91
|
+
const seen: string[] = [];
|
|
92
|
+
for (const value of values) {
|
|
93
|
+
const text = bounded(value, IDENTITY_WIDTH);
|
|
94
|
+
if (!seen.includes(text)) seen.push(text);
|
|
95
|
+
if (seen.length >= EVIDENCE_INVENTORY_MAX_IDS) break;
|
|
96
|
+
}
|
|
97
|
+
return seen;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function tally(value: number | undefined): number {
|
|
101
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : 0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function amount(value: number | undefined): number {
|
|
105
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Newest generation first. An unparseable stamp sorts oldest rather than throwing. */
|
|
109
|
+
function byNewest(a: EvidenceOverview, b: EvidenceOverview): number {
|
|
110
|
+
return (Date.parse(b.generatedAt) || 0) - (Date.parse(a.generatedAt) || 0);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async function evidenceInventorySnapshot(
|
|
114
|
+
now: () => number = Date.now,
|
|
115
|
+
dataDir: string = clioDataDir(),
|
|
116
|
+
): Promise<EvidenceInventorySnapshot> {
|
|
117
|
+
const all = (await listEvidenceOverviews(dataDir)).sort(byNewest);
|
|
118
|
+
const window = all.slice(0, EVIDENCE_INVENTORY_MAX_ARTIFACTS);
|
|
119
|
+
const artifacts: EvidenceInventoryArtifact[] = [];
|
|
120
|
+
for (const overview of window) {
|
|
121
|
+
// One unreadable trust file costs that artifact its verdict, never the
|
|
122
|
+
// whole inventory: the bundle itself is still the thing being listed.
|
|
123
|
+
let verdict: TrustVerdict = "unknown";
|
|
124
|
+
let runsCovered = 0;
|
|
125
|
+
let historical = true;
|
|
126
|
+
try {
|
|
127
|
+
const status = await loadEvidenceTrustStatus(dataDir, overview.evidenceId);
|
|
128
|
+
historical = status.projection !== "canonical";
|
|
129
|
+
runsCovered = status.runs.length;
|
|
130
|
+
const verdicts = status.runs.map((run) => trustVerdict(run.status));
|
|
131
|
+
verdict = VERDICT_SEVERITY.find((candidate) => verdicts.includes(candidate)) ?? "unknown";
|
|
132
|
+
} catch {
|
|
133
|
+
verdict = "unknown";
|
|
134
|
+
}
|
|
135
|
+
artifacts.push({
|
|
136
|
+
evidenceId: bounded(overview.evidenceId, IDENTITY_WIDTH),
|
|
137
|
+
sourceKind: overview.source.kind,
|
|
138
|
+
generatedAt: overview.generatedAt,
|
|
139
|
+
startedAt: overview.startedAt,
|
|
140
|
+
endedAt: overview.endedAt,
|
|
141
|
+
runIds: identities(overview.runIds),
|
|
142
|
+
runIdsTruncated: overview.runIds.length > EVIDENCE_INVENTORY_MAX_IDS,
|
|
143
|
+
agentIds: identities(overview.agentIds),
|
|
144
|
+
statuses: identities(overview.statuses),
|
|
145
|
+
tags: overview.tags.filter((tag) => EVIDENCE_TAGS.includes(tag)),
|
|
146
|
+
totals: {
|
|
147
|
+
runs: tally(overview.totals.runs),
|
|
148
|
+
receipts: tally(overview.totals.receipts),
|
|
149
|
+
toolCalls: tally(overview.totals.toolCalls),
|
|
150
|
+
toolErrors: tally(overview.totals.toolErrors),
|
|
151
|
+
blockedToolCalls: tally(overview.totals.blockedToolCalls),
|
|
152
|
+
protectedArtifacts: tally(overview.totals.protectedArtifacts),
|
|
153
|
+
tokens: tally(overview.totals.tokens),
|
|
154
|
+
costUsd: amount(overview.totals.costUsd),
|
|
155
|
+
wallTimeMs: tally(overview.totals.wallTimeMs),
|
|
156
|
+
},
|
|
157
|
+
redactionCount: tally(overview.redactionCount),
|
|
158
|
+
trust: { verdict, runsCovered, historical },
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
version: 1,
|
|
163
|
+
generatedAt: new Date(now()).toISOString(),
|
|
164
|
+
artifacts,
|
|
165
|
+
truncated: all.length > window.length,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* `clio-coder evidence inventory --json`, and nothing else.
|
|
171
|
+
*
|
|
172
|
+
* `fixed` is false as soon as the caller supplied an id or any other argument.
|
|
173
|
+
* A GUI host invokes this knowing the process it started cannot be steered into
|
|
174
|
+
* reading a different bundle or a wider window.
|
|
175
|
+
*/
|
|
176
|
+
export async function runEvidenceInventory(fixed: boolean): Promise<number> {
|
|
177
|
+
if (!fixed) {
|
|
178
|
+
process.stderr.write("clio-coder evidence inventory: usage: clio-coder evidence inventory --json\n");
|
|
179
|
+
return 2;
|
|
180
|
+
}
|
|
181
|
+
process.stdout.write(`${JSON.stringify(await evidenceInventorySnapshot(), null, 2)}\n`);
|
|
182
|
+
return 0;
|
|
183
|
+
}
|
package/src/cli/evidence.ts
CHANGED
|
@@ -12,21 +12,25 @@ import {
|
|
|
12
12
|
loadEvidenceRunProvenance,
|
|
13
13
|
provenanceTranscriptLines,
|
|
14
14
|
} from "../domains/evidence/index.js";
|
|
15
|
+
import { runEvidenceDetail } from "./evidence-detail.js";
|
|
16
|
+
import { runEvidenceInventory } from "./evidence-inventory.js";
|
|
15
17
|
import { printError, printNote, printOk } from "./shared.js";
|
|
16
18
|
|
|
17
19
|
const HELP = `clio-coder evidence build --run <runId>
|
|
18
20
|
clio-coder evidence build --session <sessionId>
|
|
19
21
|
clio-coder evidence build --eval <evalId>
|
|
20
|
-
clio-coder evidence inspect <evidenceId>
|
|
22
|
+
clio-coder evidence inspect <evidenceId> [--json]
|
|
21
23
|
clio-coder evidence list
|
|
24
|
+
clio-coder evidence inventory --json
|
|
22
25
|
|
|
23
26
|
Build or inspect deterministic Clio evidence artifacts.
|
|
24
27
|
`;
|
|
25
28
|
|
|
26
|
-
type EvidenceCommand = "build" | "inspect" | "list";
|
|
29
|
+
type EvidenceCommand = "build" | "inspect" | "list" | "inventory";
|
|
27
30
|
|
|
28
31
|
interface ParsedEvidenceArgs {
|
|
29
32
|
command?: EvidenceCommand;
|
|
33
|
+
json: boolean;
|
|
30
34
|
runId?: string;
|
|
31
35
|
sessionId?: string;
|
|
32
36
|
evalId?: string;
|
|
@@ -35,7 +39,7 @@ interface ParsedEvidenceArgs {
|
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
function parseEvidenceArgs(args: ReadonlyArray<string>): ParsedEvidenceArgs {
|
|
38
|
-
const parsed: ParsedEvidenceArgs = { help: false };
|
|
42
|
+
const parsed: ParsedEvidenceArgs = { help: false, json: false };
|
|
39
43
|
for (let index = 0; index < args.length; index += 1) {
|
|
40
44
|
const arg = args[index];
|
|
41
45
|
if (arg === undefined) continue;
|
|
@@ -44,12 +48,22 @@ function parseEvidenceArgs(args: ReadonlyArray<string>): ParsedEvidenceArgs {
|
|
|
44
48
|
continue;
|
|
45
49
|
}
|
|
46
50
|
if (parsed.command === undefined) {
|
|
47
|
-
if (arg === "build" || arg === "inspect" || arg === "list") {
|
|
51
|
+
if (arg === "build" || arg === "inspect" || arg === "list" || arg === "inventory") {
|
|
48
52
|
parsed.command = arg;
|
|
49
53
|
continue;
|
|
50
54
|
}
|
|
51
55
|
throw new Error(`unknown evidence command: ${arg}`);
|
|
52
56
|
}
|
|
57
|
+
// `inventory` is the fixed read a GUI host may invoke. Its argv is not a
|
|
58
|
+
// surface, so anything past the one required flag is a usage error rather
|
|
59
|
+
// than something to ignore.
|
|
60
|
+
if (parsed.command === "inventory") {
|
|
61
|
+
if (arg === "--json" && !parsed.json) {
|
|
62
|
+
parsed.json = true;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
throw new Error("inventory accepts only --json");
|
|
66
|
+
}
|
|
53
67
|
if (parsed.command === "build") {
|
|
54
68
|
if (arg === "--run") {
|
|
55
69
|
const value = args[index + 1];
|
|
@@ -74,6 +88,10 @@ function parseEvidenceArgs(args: ReadonlyArray<string>): ParsedEvidenceArgs {
|
|
|
74
88
|
}
|
|
75
89
|
throw new Error(`unknown evidence build argument: ${arg}`);
|
|
76
90
|
}
|
|
91
|
+
if (parsed.command === "inspect" && arg === "--json" && !parsed.json) {
|
|
92
|
+
parsed.json = true;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
77
95
|
if (parsed.command === "inspect" && parsed.evidenceId === undefined) {
|
|
78
96
|
if (arg.startsWith("-")) throw new Error("inspect requires an evidence id");
|
|
79
97
|
parsed.evidenceId = arg;
|
|
@@ -103,6 +121,11 @@ function parseEvidenceArgs(args: ReadonlyArray<string>): ParsedEvidenceArgs {
|
|
|
103
121
|
) {
|
|
104
122
|
throw new Error("list does not accept extra arguments");
|
|
105
123
|
}
|
|
124
|
+
// The GUI read is only fixed if `--json` is required rather than defaulted:
|
|
125
|
+
// a bare `evidence inventory` must not quietly print something else.
|
|
126
|
+
if (parsed.command === "inventory" && !parsed.json) {
|
|
127
|
+
throw new Error("inventory requires --json");
|
|
128
|
+
}
|
|
106
129
|
return parsed;
|
|
107
130
|
}
|
|
108
131
|
|
|
@@ -159,6 +182,7 @@ export async function runEvidenceCommand(args: ReadonlyArray<string>): Promise<n
|
|
|
159
182
|
printError("inspect requires an evidence id");
|
|
160
183
|
return 2;
|
|
161
184
|
}
|
|
185
|
+
if (parsed.json) return runEvidenceDetail(evidenceId);
|
|
162
186
|
const inspected = await inspectEvidence(dataDir, evidenceId);
|
|
163
187
|
const provenance = await loadEvidenceRunProvenance(dataDir, evidenceId);
|
|
164
188
|
renderEvidence(inspected, provenance);
|
|
@@ -168,7 +192,8 @@ export async function runEvidenceCommand(args: ReadonlyArray<string>): Promise<n
|
|
|
168
192
|
renderEvidenceList(await listEvidenceOverviews(dataDir));
|
|
169
193
|
return 0;
|
|
170
194
|
}
|
|
171
|
-
|
|
195
|
+
if (parsed.command === "inventory") return runEvidenceInventory(parsed.json);
|
|
196
|
+
printError("evidence requires build, inspect, list, or inventory");
|
|
172
197
|
return 2;
|
|
173
198
|
} catch (error) {
|
|
174
199
|
printError(error instanceof Error ? error.message : String(error));
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of durable coordinator gate decisions.
|
|
3
|
+
*
|
|
4
|
+
* A review or compete gate seals an integrity-covered artifact linking the
|
|
5
|
+
* decider receipt to every subject receipt, and nothing in the operator surface
|
|
6
|
+
* reads them: `fleet view` shows a run, not the verdict a gate reached about
|
|
7
|
+
* it. This command accepts no identifier, group, or limit, selects a bounded
|
|
8
|
+
* newest-first window itself, and emits the shape of each decision.
|
|
9
|
+
*
|
|
10
|
+
* It is a separate command from `fleet inspect --json` rather than another
|
|
11
|
+
* field on it, on the same reasoning the trace read used. The decisions live in
|
|
12
|
+
* their own directory with their own failure mode, and an installation that has
|
|
13
|
+
* never run a gate has no directory at all, so folding the read in would turn a
|
|
14
|
+
* missing directory into a failure of the run journal.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
GATE_TOPOLOGY_MAX_DECISIONS,
|
|
19
|
+
GATE_TOPOLOGY_MAX_SUBJECTS,
|
|
20
|
+
type GateDecisionReason,
|
|
21
|
+
type GateTopologyDecision,
|
|
22
|
+
gateTopology,
|
|
23
|
+
} from "../domains/dispatch/gate-topology.js";
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
GATE_TOPOLOGY_MAX_DECISIONS as FLEET_DECISIONS_MAX,
|
|
27
|
+
GATE_TOPOLOGY_MAX_SUBJECTS as FLEET_DECISIONS_MAX_SUBJECTS,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export interface FleetDecisionsSnapshot {
|
|
31
|
+
readonly version: 1;
|
|
32
|
+
readonly generatedAt: string;
|
|
33
|
+
readonly available: boolean;
|
|
34
|
+
readonly decisions: readonly GateTopologyDecision[];
|
|
35
|
+
readonly truncated: boolean;
|
|
36
|
+
readonly unverifiable: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type { GateDecisionReason, GateTopologyDecision };
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Pure command payload builder, exported so the fixed CLI contract is testable
|
|
43
|
+
* without subprocess output capture.
|
|
44
|
+
*
|
|
45
|
+
* `available` separates an installation that has never run a gate from one
|
|
46
|
+
* whose gates all aged out of the scan. Both report no decisions and they are
|
|
47
|
+
* different operator states, so the flag is reported rather than inferred from
|
|
48
|
+
* an empty list.
|
|
49
|
+
*/
|
|
50
|
+
function fleetDecisionsSnapshot(now: () => number = Date.now): FleetDecisionsSnapshot {
|
|
51
|
+
const topology = gateTopology();
|
|
52
|
+
return {
|
|
53
|
+
version: 1,
|
|
54
|
+
generatedAt: new Date(now()).toISOString(),
|
|
55
|
+
available: topology.present,
|
|
56
|
+
decisions: topology.decisions,
|
|
57
|
+
truncated: topology.truncated,
|
|
58
|
+
unverifiable: topology.unverifiable,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function runFleetDecisions(args: ReadonlyArray<string>): number {
|
|
63
|
+
if (args.length !== 1 || args[0] !== "--json") {
|
|
64
|
+
process.stderr.write("clio-coder fleet decisions: usage: clio-coder fleet decisions --json\n");
|
|
65
|
+
return 2;
|
|
66
|
+
}
|
|
67
|
+
process.stdout.write(`${JSON.stringify(fleetDecisionsSnapshot(), null, 2)}\n`);
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixed machine-readable projection of recent durable dispatch runs.
|
|
3
|
+
*
|
|
4
|
+
* `fleet view` is an operator-directed terminal surface: it accepts a run id,
|
|
5
|
+
* prints native evidence paths, and can follow one alternate-screen view. The
|
|
6
|
+
* GUI cannot safely reuse that transport. This command accepts no identifier
|
|
7
|
+
* or path, selects a bounded newest-first window itself, and emits only the
|
|
8
|
+
* already-sanitized view model fields a typed host adapter can further narrow.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
COUNCIL_TOPOLOGY_MAX_COUNCILS,
|
|
13
|
+
COUNCIL_TOPOLOGY_MAX_MEMBERS,
|
|
14
|
+
COUNCIL_TOPOLOGY_MAX_SCAN,
|
|
15
|
+
COUNCIL_TOPOLOGY_MAX_TURNS,
|
|
16
|
+
type CouncilApproval,
|
|
17
|
+
type CouncilOrigin,
|
|
18
|
+
type CouncilSynthesisKind,
|
|
19
|
+
councilTopologies,
|
|
20
|
+
} from "../domains/dispatch/council-topology.js";
|
|
21
|
+
import type { ExecutionRole } from "../domains/dispatch/execution-role.js";
|
|
22
|
+
import { listFleetRuns, openLedger } from "../domains/dispatch/state.js";
|
|
23
|
+
import type { RunOutcome, RunStatus } from "../domains/dispatch/types.js";
|
|
24
|
+
import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
|
|
25
|
+
import { truncateToWidth } from "../engine/tui-primitives.js";
|
|
26
|
+
import { loadFleetRunViewModel, loadRunViewModel } from "./fleet-view.js";
|
|
27
|
+
|
|
28
|
+
export const FLEET_INSPECT_MAX_RUNS = 8;
|
|
29
|
+
export const FLEET_INSPECT_MAX_EVENTS = 32;
|
|
30
|
+
export const FLEET_INSPECT_MAX_ROOTS = 4;
|
|
31
|
+
export const FLEET_INSPECT_MAX_STEPS = 24;
|
|
32
|
+
export const FLEET_INSPECT_MAX_COUNCILS = COUNCIL_TOPOLOGY_MAX_COUNCILS;
|
|
33
|
+
export const FLEET_INSPECT_MAX_COUNCIL_MEMBERS = COUNCIL_TOPOLOGY_MAX_MEMBERS;
|
|
34
|
+
export const FLEET_INSPECT_MAX_COUNCIL_TURNS = COUNCIL_TOPOLOGY_MAX_TURNS;
|
|
35
|
+
|
|
36
|
+
const IDENTITY_WIDTH = 128;
|
|
37
|
+
const TASK_WIDTH = 400;
|
|
38
|
+
const EVENT_LABEL_WIDTH = 96;
|
|
39
|
+
const EVENT_DETAIL_WIDTH = 240;
|
|
40
|
+
const OUTCOME_WIDTH = 160;
|
|
41
|
+
const STEP_ID_WIDTH = 96;
|
|
42
|
+
|
|
43
|
+
export type FleetInspectEvidenceState = "pending" | "verified" | "failed" | "unavailable";
|
|
44
|
+
|
|
45
|
+
export interface FleetInspectEvent {
|
|
46
|
+
readonly at: string;
|
|
47
|
+
readonly label: string;
|
|
48
|
+
readonly detail: string | null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface FleetInspectRun {
|
|
52
|
+
readonly runId: string;
|
|
53
|
+
readonly agentId: string;
|
|
54
|
+
readonly model: string;
|
|
55
|
+
readonly target: string;
|
|
56
|
+
readonly node: string;
|
|
57
|
+
readonly phase: string;
|
|
58
|
+
readonly startedAt: string;
|
|
59
|
+
readonly elapsedMs: number;
|
|
60
|
+
readonly task: string | null;
|
|
61
|
+
readonly journal: "available" | "missing";
|
|
62
|
+
readonly events: readonly FleetInspectEvent[];
|
|
63
|
+
readonly eventsTruncated: boolean;
|
|
64
|
+
readonly evidence: Readonly<{
|
|
65
|
+
state: FleetInspectEvidenceState;
|
|
66
|
+
summary: string;
|
|
67
|
+
}>;
|
|
68
|
+
readonly outcome: string | null;
|
|
69
|
+
readonly outcomeDetail: string | null;
|
|
70
|
+
readonly terminal: boolean;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface FleetInspectRootStep {
|
|
74
|
+
readonly stepId: string;
|
|
75
|
+
/** The run the step terminated on, or null when the step never ran. */
|
|
76
|
+
readonly runId: string | null;
|
|
77
|
+
readonly agentId: string | null;
|
|
78
|
+
readonly outcome: string;
|
|
79
|
+
readonly detail: string | null;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* One fleet root's step index.
|
|
84
|
+
*
|
|
85
|
+
* A root is not a run: it has no ledger row, receipt, or journal, so nothing
|
|
86
|
+
* here is a transcript. What it answers is the question the run window alone
|
|
87
|
+
* cannot, which is which planned steps a fleet had and which run each one
|
|
88
|
+
* terminated on. That turns the flat recent-run list into something an operator
|
|
89
|
+
* can trace back to the fleet that dispatched it.
|
|
90
|
+
*/
|
|
91
|
+
export interface FleetInspectRoot {
|
|
92
|
+
readonly rootId: string;
|
|
93
|
+
readonly fleet: string;
|
|
94
|
+
readonly startedAt: string;
|
|
95
|
+
readonly elapsedMs: number;
|
|
96
|
+
readonly running: boolean;
|
|
97
|
+
readonly resumedFrom: string | null;
|
|
98
|
+
readonly plannedSteps: number;
|
|
99
|
+
readonly recordedSteps: number;
|
|
100
|
+
readonly steps: readonly FleetInspectRootStep[];
|
|
101
|
+
readonly stepsTruncated: boolean;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export interface FleetInspectCouncilTurn {
|
|
105
|
+
readonly round: number;
|
|
106
|
+
readonly runId: string;
|
|
107
|
+
readonly status: RunStatus;
|
|
108
|
+
readonly outcome: RunOutcome | null;
|
|
109
|
+
readonly terminal: boolean;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export interface FleetInspectCouncilMember {
|
|
113
|
+
readonly label: string;
|
|
114
|
+
readonly agentId: string;
|
|
115
|
+
readonly target: string;
|
|
116
|
+
readonly model: string;
|
|
117
|
+
readonly executionRole: ExecutionRole;
|
|
118
|
+
readonly turns: readonly FleetInspectCouncilTurn[];
|
|
119
|
+
readonly turnsTruncated: boolean;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export interface FleetInspectCouncilJudge {
|
|
123
|
+
readonly runId: string;
|
|
124
|
+
readonly agentId: string;
|
|
125
|
+
readonly target: string;
|
|
126
|
+
readonly model: string;
|
|
127
|
+
readonly status: RunStatus;
|
|
128
|
+
readonly outcome: RunOutcome | null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* One council's topology, reconstructed from the same ledger the run window
|
|
133
|
+
* reads.
|
|
134
|
+
*
|
|
135
|
+
* A council is not a fleet root and owns no record of its own: it is a set of
|
|
136
|
+
* ordinary runs sharing a group stamp. What this carries is the shape of that
|
|
137
|
+
* set. The members' answers, the judge's synthesis prose, and the vote tally are
|
|
138
|
+
* free model text inside receipt output and stay on the host permanently, so a
|
|
139
|
+
* council row says who was seated, where each voice ran, how many rounds it
|
|
140
|
+
* took, and whether a synthesis was reached, and nothing about what was said.
|
|
141
|
+
*/
|
|
142
|
+
export interface FleetInspectCouncil {
|
|
143
|
+
readonly group: string;
|
|
144
|
+
readonly startedAt: string;
|
|
145
|
+
readonly endedAt: string | null;
|
|
146
|
+
readonly running: boolean;
|
|
147
|
+
readonly roundsPlanned: number | null;
|
|
148
|
+
readonly roundsObserved: number;
|
|
149
|
+
readonly origin: CouncilOrigin | null;
|
|
150
|
+
readonly approval: CouncilApproval | null;
|
|
151
|
+
readonly members: readonly FleetInspectCouncilMember[];
|
|
152
|
+
readonly membersTruncated: boolean;
|
|
153
|
+
readonly membersRejected: number;
|
|
154
|
+
readonly synthesis: Readonly<{
|
|
155
|
+
kind: CouncilSynthesisKind | null;
|
|
156
|
+
sealedRunId: string | null;
|
|
157
|
+
judge: FleetInspectCouncilJudge | null;
|
|
158
|
+
}>;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export interface FleetInspectSnapshot {
|
|
162
|
+
readonly version: 1;
|
|
163
|
+
readonly generatedAt: string;
|
|
164
|
+
readonly runs: readonly FleetInspectRun[];
|
|
165
|
+
readonly truncated: boolean;
|
|
166
|
+
readonly roots: readonly FleetInspectRoot[];
|
|
167
|
+
readonly rootsTruncated: boolean;
|
|
168
|
+
readonly councils: readonly FleetInspectCouncil[];
|
|
169
|
+
readonly councilsTruncated: boolean;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function bounded(value: string, width: number): string {
|
|
173
|
+
const sanitized = sanitizeCallTargetText(value);
|
|
174
|
+
if (sanitized.length === 0) return "unavailable";
|
|
175
|
+
return sanitizeCallTargetText(truncateToWidth(sanitized, width, "…", false));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function evidenceProjection(text: string): FleetInspectRun["evidence"] {
|
|
179
|
+
if (text.startsWith("receipt pending;")) {
|
|
180
|
+
return {
|
|
181
|
+
state: "pending",
|
|
182
|
+
summary: "Receipt pending; this run has not finalized.",
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
if (text.startsWith("RECEIPT INTEGRITY FAILED:")) {
|
|
186
|
+
return {
|
|
187
|
+
state: "failed",
|
|
188
|
+
summary: "Clio Coder rejected the stored receipt's integrity.",
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (text.startsWith("receipt unavailable:")) {
|
|
192
|
+
return {
|
|
193
|
+
state: "unavailable",
|
|
194
|
+
summary: "The durable receipt is unavailable.",
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
if (text.startsWith("trust v")) {
|
|
198
|
+
return { state: "verified", summary: bounded(text, EVENT_DETAIL_WIDTH) };
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
state: "unavailable",
|
|
202
|
+
summary: "Receipt trust could not be classified.",
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/** Pure command payload builder, exported so the fixed CLI contract is testable without subprocess output capture. */
|
|
207
|
+
function fleetInspectSnapshot(now: () => number = Date.now): FleetInspectSnapshot {
|
|
208
|
+
const ledgerRows = openLedger().list();
|
|
209
|
+
const selected = ledgerRows.slice(0, FLEET_INSPECT_MAX_RUNS);
|
|
210
|
+
// The council window is deliberately wider than the run window. A single
|
|
211
|
+
// council is up to five members over three rounds plus a judge and its sealed
|
|
212
|
+
// report, so a council that finished an hour ago holds no row in the eight
|
|
213
|
+
// newest runs. Selecting it from the same already-open ledger costs nothing
|
|
214
|
+
// but the scan; a second child process reading the same file would not.
|
|
215
|
+
const topology = councilTopologies(ledgerRows.slice(0, COUNCIL_TOPOLOGY_MAX_SCAN));
|
|
216
|
+
const runs: FleetInspectRun[] = [];
|
|
217
|
+
for (const row of selected) {
|
|
218
|
+
const model = loadRunViewModel(row.id, { now });
|
|
219
|
+
if (model === null) continue;
|
|
220
|
+
const visibleEvents = model.transcript.slice(-FLEET_INSPECT_MAX_EVENTS);
|
|
221
|
+
runs.push({
|
|
222
|
+
runId: bounded(model.runId, IDENTITY_WIDTH),
|
|
223
|
+
agentId: bounded(model.agentId, IDENTITY_WIDTH),
|
|
224
|
+
model: bounded(model.model, IDENTITY_WIDTH),
|
|
225
|
+
target: bounded(model.target, IDENTITY_WIDTH),
|
|
226
|
+
node: bounded(model.node, IDENTITY_WIDTH),
|
|
227
|
+
phase: bounded(model.phase, IDENTITY_WIDTH),
|
|
228
|
+
startedAt: model.startedAt,
|
|
229
|
+
elapsedMs: model.elapsedMs,
|
|
230
|
+
task: model.task === undefined ? null : bounded(model.task, TASK_WIDTH),
|
|
231
|
+
journal: model.journalPresent ? "available" : "missing",
|
|
232
|
+
events: visibleEvents.map((event) => ({
|
|
233
|
+
at: event.at,
|
|
234
|
+
label: bounded(event.label, EVENT_LABEL_WIDTH),
|
|
235
|
+
detail: event.detail === undefined ? null : bounded(event.detail, EVENT_DETAIL_WIDTH),
|
|
236
|
+
})),
|
|
237
|
+
eventsTruncated: model.transcriptTruncated || model.transcript.length > visibleEvents.length,
|
|
238
|
+
evidence: evidenceProjection(model.evidence),
|
|
239
|
+
outcome: model.outcome === null ? null : bounded(model.outcome, OUTCOME_WIDTH),
|
|
240
|
+
outcomeDetail: model.outcomeDetail === null ? null : bounded(model.outcomeDetail, OUTCOME_WIDTH),
|
|
241
|
+
terminal: model.terminal,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
const rootRecords = listFleetRuns();
|
|
245
|
+
const selectedRoots = rootRecords.slice(0, FLEET_INSPECT_MAX_ROOTS);
|
|
246
|
+
const roots: FleetInspectRoot[] = [];
|
|
247
|
+
for (const record of selectedRoots) {
|
|
248
|
+
const model = loadFleetRunViewModel(record.id, { now });
|
|
249
|
+
if (model === null) continue;
|
|
250
|
+
// The planned order is the order the operator wrote the fleet in, so the
|
|
251
|
+
// index keeps its head rather than its tail: an operator reading a step
|
|
252
|
+
// index is looking for where the fleet got to, not where it ended.
|
|
253
|
+
const visibleSteps = model.steps.slice(0, FLEET_INSPECT_MAX_STEPS);
|
|
254
|
+
roots.push({
|
|
255
|
+
rootId: bounded(model.rootId, IDENTITY_WIDTH),
|
|
256
|
+
fleet: bounded(model.fleet, IDENTITY_WIDTH),
|
|
257
|
+
startedAt: model.startedAt,
|
|
258
|
+
elapsedMs: model.elapsedMs,
|
|
259
|
+
running: model.running,
|
|
260
|
+
resumedFrom: model.resumedFrom === null ? null : bounded(model.resumedFrom, IDENTITY_WIDTH),
|
|
261
|
+
plannedSteps: model.plannedSteps,
|
|
262
|
+
recordedSteps: model.recordedSteps,
|
|
263
|
+
steps: visibleSteps.map((step) => ({
|
|
264
|
+
stepId: bounded(step.stepId, STEP_ID_WIDTH),
|
|
265
|
+
runId: step.runId === null ? null : bounded(step.runId, IDENTITY_WIDTH),
|
|
266
|
+
agentId: step.agentId === null ? null : bounded(step.agentId, IDENTITY_WIDTH),
|
|
267
|
+
outcome: bounded(step.outcome, OUTCOME_WIDTH),
|
|
268
|
+
detail: step.detail === undefined ? null : bounded(step.detail, OUTCOME_WIDTH),
|
|
269
|
+
})),
|
|
270
|
+
stepsTruncated: model.steps.length > visibleSteps.length,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
const councils: FleetInspectCouncil[] = topology.councils.map((council) => ({
|
|
274
|
+
group: bounded(council.group, IDENTITY_WIDTH),
|
|
275
|
+
startedAt: council.startedAt,
|
|
276
|
+
endedAt: council.endedAt,
|
|
277
|
+
running: council.running,
|
|
278
|
+
roundsPlanned: council.roundsPlanned,
|
|
279
|
+
roundsObserved: council.roundsObserved,
|
|
280
|
+
origin: council.origin,
|
|
281
|
+
approval: council.approval,
|
|
282
|
+
members: council.members.map((member) => ({
|
|
283
|
+
label: bounded(member.label, IDENTITY_WIDTH),
|
|
284
|
+
agentId: bounded(member.agentId, IDENTITY_WIDTH),
|
|
285
|
+
target: bounded(member.targetId, IDENTITY_WIDTH),
|
|
286
|
+
model: bounded(member.wireModelId, IDENTITY_WIDTH),
|
|
287
|
+
executionRole: member.executionRole,
|
|
288
|
+
turns: member.turns.map((turn) => ({
|
|
289
|
+
round: turn.round,
|
|
290
|
+
runId: bounded(turn.runId, IDENTITY_WIDTH),
|
|
291
|
+
status: turn.status,
|
|
292
|
+
outcome: turn.outcome,
|
|
293
|
+
terminal: turn.terminal,
|
|
294
|
+
})),
|
|
295
|
+
turnsTruncated: member.turnsTruncated,
|
|
296
|
+
})),
|
|
297
|
+
membersTruncated: council.membersTruncated,
|
|
298
|
+
membersRejected: council.membersRejected,
|
|
299
|
+
synthesis: {
|
|
300
|
+
kind: council.synthesis.kind,
|
|
301
|
+
sealedRunId: council.synthesis.sealedRunId === null ? null : bounded(council.synthesis.sealedRunId, IDENTITY_WIDTH),
|
|
302
|
+
judge:
|
|
303
|
+
council.synthesis.judge === null
|
|
304
|
+
? null
|
|
305
|
+
: {
|
|
306
|
+
runId: bounded(council.synthesis.judge.runId, IDENTITY_WIDTH),
|
|
307
|
+
agentId: bounded(council.synthesis.judge.agentId, IDENTITY_WIDTH),
|
|
308
|
+
target: bounded(council.synthesis.judge.targetId, IDENTITY_WIDTH),
|
|
309
|
+
model: bounded(council.synthesis.judge.wireModelId, IDENTITY_WIDTH),
|
|
310
|
+
status: council.synthesis.judge.status,
|
|
311
|
+
outcome: council.synthesis.judge.outcome,
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
}));
|
|
315
|
+
return {
|
|
316
|
+
version: 1,
|
|
317
|
+
generatedAt: new Date(now()).toISOString(),
|
|
318
|
+
runs,
|
|
319
|
+
truncated: ledgerRows.length > selected.length || runs.length !== selected.length,
|
|
320
|
+
roots,
|
|
321
|
+
rootsTruncated: rootRecords.length > selectedRoots.length || roots.length !== selectedRoots.length,
|
|
322
|
+
councils,
|
|
323
|
+
councilsTruncated: topology.truncated || ledgerRows.length > COUNCIL_TOPOLOGY_MAX_SCAN,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export function runFleetInspect(args: ReadonlyArray<string>): number {
|
|
328
|
+
if (args.length !== 1 || args[0] !== "--json") {
|
|
329
|
+
process.stderr.write("clio-coder fleet inspect: usage: clio-coder fleet inspect --json\n");
|
|
330
|
+
return 2;
|
|
331
|
+
}
|
|
332
|
+
process.stdout.write(`${JSON.stringify(fleetInspectSnapshot(), null, 2)}\n`);
|
|
333
|
+
return 0;
|
|
334
|
+
}
|
|
@@ -33,7 +33,7 @@ export function inspectFleet(name: string, vars?: Readonly<Record<string, string
|
|
|
33
33
|
const resolved = new Set<string>();
|
|
34
34
|
const settings = readSettings();
|
|
35
35
|
const targetIds = new Set(settings.targets.map((target) => target.id));
|
|
36
|
-
const profileIds = new Set(Object.keys(settings.
|
|
36
|
+
const profileIds = new Set(Object.keys(settings.fleet?.profiles ?? {}));
|
|
37
37
|
for (const step of contract.steps) {
|
|
38
38
|
const positions =
|
|
39
39
|
step.kind === "loop"
|