@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
|
@@ -32,7 +32,20 @@ export type DispatchIntentNormalizationResult =
|
|
|
32
32
|
| { ok: true; intent: DispatchIntent }
|
|
33
33
|
| { ok: false; reason: string; message: string };
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
/**
|
|
36
|
+
* `version` is accepted on raw model-facing intent so a caller replaying a
|
|
37
|
+
* declaration it was shown can echo the version back. It is validated, never
|
|
38
|
+
* trusted: an unsupported value is a terminal refusal rather than a field the
|
|
39
|
+
* normalizer quietly overwrites with the version this build speaks.
|
|
40
|
+
*/
|
|
41
|
+
const RAW_FIELDS = new Set([
|
|
42
|
+
"version",
|
|
43
|
+
"read_roots",
|
|
44
|
+
"write_roots",
|
|
45
|
+
"relevant_paths",
|
|
46
|
+
"expected_outputs",
|
|
47
|
+
"verification",
|
|
48
|
+
]);
|
|
36
49
|
|
|
37
50
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
38
51
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
@@ -129,6 +142,47 @@ function normalizePathList(
|
|
|
129
142
|
return [...new Set(normalized)].sort(compareCodepoints);
|
|
130
143
|
}
|
|
131
144
|
|
|
145
|
+
/**
|
|
146
|
+
* Build typed intent from paths a non-model producer already holds.
|
|
147
|
+
*
|
|
148
|
+
* Fleet contracts, CLI entry points, and extensions declare repository-relative
|
|
149
|
+
* scope in their own artifacts long before a dispatch request exists. Without
|
|
150
|
+
* this they hand the request nothing, and the scope resolver falls back to
|
|
151
|
+
* reading path-like tokens out of the rendered prompt, which is the exact
|
|
152
|
+
* ambiguity typed intent removes. The paths go through the same normalization,
|
|
153
|
+
* caps, and provenance construction as a model-facing declaration, so a
|
|
154
|
+
* producer cannot mint an intent shape the dispatch tool could not.
|
|
155
|
+
*
|
|
156
|
+
* Verification and expected outputs are deliberately not accepted here.
|
|
157
|
+
* A declared check id has to be resolved against the project's verification
|
|
158
|
+
* catalog before it means anything, and that resolution belongs to the
|
|
159
|
+
* admission controller that owns the catalog, not to a scope builder.
|
|
160
|
+
*/
|
|
161
|
+
export function declaredScopeIntent(input: {
|
|
162
|
+
readRoots?: ReadonlyArray<string>;
|
|
163
|
+
writeRoots?: ReadonlyArray<string>;
|
|
164
|
+
relevantPaths?: ReadonlyArray<string>;
|
|
165
|
+
}): DispatchIntentNormalizationResult {
|
|
166
|
+
const readRoots = normalizePathList(input.readRoots, "intent.read_roots");
|
|
167
|
+
if (!Array.isArray(readRoots)) return readRoots;
|
|
168
|
+
const writeRoots = normalizePathList(input.writeRoots, "intent.write_roots");
|
|
169
|
+
if (!Array.isArray(writeRoots)) return writeRoots;
|
|
170
|
+
const relevantPaths = normalizePathList(input.relevantPaths, "intent.relevant_paths");
|
|
171
|
+
if (!Array.isArray(relevantPaths)) return relevantPaths;
|
|
172
|
+
return {
|
|
173
|
+
ok: true,
|
|
174
|
+
intent: {
|
|
175
|
+
version: 2,
|
|
176
|
+
readRoots,
|
|
177
|
+
writeRoots,
|
|
178
|
+
relevantPaths,
|
|
179
|
+
pathProvenance: declaredIntentPathProvenance({ readRoots, writeRoots, relevantPaths }),
|
|
180
|
+
expectedOutputs: [],
|
|
181
|
+
verification: [],
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
132
186
|
export function isDispatchIntent(value: unknown): value is DispatchIntent {
|
|
133
187
|
if (!isRecord(value) || value.version !== 2) return false;
|
|
134
188
|
for (const field of ["readRoots", "writeRoots", "relevantPaths", "expectedOutputs"] as const) {
|
|
@@ -164,6 +218,30 @@ export function isDispatchIntent(value: unknown): value is DispatchIntent {
|
|
|
164
218
|
);
|
|
165
219
|
}
|
|
166
220
|
|
|
221
|
+
/**
|
|
222
|
+
* Project a declared intent onto a run that may not write.
|
|
223
|
+
*
|
|
224
|
+
* Council members, reviewers, judges, and any other read-only expansion of a
|
|
225
|
+
* caller's single task inherit the caller's declared scope. Inheriting
|
|
226
|
+
* `writeRoots` verbatim would leave the request claiming a write scope the run's
|
|
227
|
+
* autonomy makes unenforceable, so the write roots become read roots: the same
|
|
228
|
+
* trees, strictly less authority. Nothing is added, so the projection can only
|
|
229
|
+
* narrow. Returns the input unchanged when there is no write scope to demote.
|
|
230
|
+
*/
|
|
231
|
+
export function narrowDispatchIntentToReadOnly(intent: DispatchIntent): DispatchIntent {
|
|
232
|
+
if (intent.writeRoots.length === 0) return intent;
|
|
233
|
+
const readRoots = [...new Set([...intent.readRoots, ...intent.writeRoots])].sort(compareCodepoints);
|
|
234
|
+
return {
|
|
235
|
+
version: 2,
|
|
236
|
+
readRoots,
|
|
237
|
+
writeRoots: [],
|
|
238
|
+
relevantPaths: [...intent.relevantPaths],
|
|
239
|
+
pathProvenance: declaredIntentPathProvenance({ readRoots, writeRoots: [], relevantPaths: intent.relevantPaths }),
|
|
240
|
+
expectedOutputs: [...intent.expectedOutputs],
|
|
241
|
+
verification: intent.verification.map((entry) => ({ ...entry })),
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
167
245
|
export function normalizeDispatchIntent(
|
|
168
246
|
raw: unknown,
|
|
169
247
|
checks: ReadonlyMap<string, DispatchIntentCheckBound>,
|
|
@@ -173,6 +251,12 @@ export function normalizeDispatchIntent(
|
|
|
173
251
|
.filter((key) => !RAW_FIELDS.has(key))
|
|
174
252
|
.sort(compareCodepoints);
|
|
175
253
|
if (unknown.length > 0) return fail("intent_malformed", `intent contains unknown field '${unknown[0]}'`);
|
|
254
|
+
if (raw.version !== undefined && raw.version !== 2) {
|
|
255
|
+
return fail(
|
|
256
|
+
"intent_version_unsupported",
|
|
257
|
+
`intent declares version ${JSON.stringify(raw.version)}; this build speaks dispatch intent version 2. A declaration at another version is refused rather than migrated: restate read_roots, write_roots, relevant_paths, expected_outputs, and verification under version 2`,
|
|
258
|
+
);
|
|
259
|
+
}
|
|
176
260
|
const readRoots = normalizePathList(raw.read_roots, "intent.read_roots");
|
|
177
261
|
if (!Array.isArray(readRoots)) return readRoots;
|
|
178
262
|
const writeRoots = normalizePathList(raw.write_roots, "intent.write_roots");
|
|
@@ -76,7 +76,7 @@ export interface JointAgentDimension {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
/** A single truthful role-quality label retires task-feature priors for this tuple. */
|
|
79
|
-
|
|
79
|
+
function routePriorForAgentEvidence(
|
|
80
80
|
agent: JointAgentDimension,
|
|
81
81
|
observations: ReadonlyArray<RouteObservation>,
|
|
82
82
|
): RoutePrior {
|
|
@@ -64,19 +64,6 @@ export interface DeclaredScopeReplacementNotice {
|
|
|
64
64
|
message: string;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
export interface LegacyScopeInferenceNotice {
|
|
68
|
-
code: "legacy_scope_inferred" | "legacy_scope_empty";
|
|
69
|
-
level: "warning";
|
|
70
|
-
paths: ReadonlyArray<{
|
|
71
|
-
path: string;
|
|
72
|
-
policy: "working-context" | "write-boundary";
|
|
73
|
-
provenance: DispatchPathProvenanceKind;
|
|
74
|
-
source: DispatchPathProvenanceSource;
|
|
75
|
-
confidence: DispatchPathConfidence;
|
|
76
|
-
}>;
|
|
77
|
-
message: string;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
67
|
export type DispatchPathScopeInferenceErrorCode = "legacy_scope_path_absolute" | "legacy_scope_path_malformed";
|
|
81
68
|
|
|
82
69
|
export class DispatchPathScopeInferenceError extends Error {
|
|
@@ -320,51 +307,3 @@ export function declaredScopeReplacementNotice(scope: DispatchPathScope): Declar
|
|
|
320
307
|
)}. Those paths did not select project rules or expand worker authority.`,
|
|
321
308
|
};
|
|
322
309
|
}
|
|
323
|
-
|
|
324
|
-
function legacyNoticePaths(scope: DispatchPathScope): LegacyScopeInferenceNotice["paths"] {
|
|
325
|
-
const paths: Array<LegacyScopeInferenceNotice["paths"][number]> = [];
|
|
326
|
-
for (const [policy, entries] of [
|
|
327
|
-
["working-context", scope.provenance.workingContextPaths],
|
|
328
|
-
["write-boundary", scope.provenance.writeBoundaries],
|
|
329
|
-
] as const) {
|
|
330
|
-
for (const entry of entries) {
|
|
331
|
-
for (const evidence of entry.evidence) {
|
|
332
|
-
paths.push({
|
|
333
|
-
path: entry.path,
|
|
334
|
-
policy,
|
|
335
|
-
provenance: evidence.provenance,
|
|
336
|
-
source: evidence.source,
|
|
337
|
-
confidence: evidence.confidence,
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
return paths;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
/** Render the operator-visible warning for a legacy scope resolution. */
|
|
346
|
-
export function legacyScopeInferenceNotice(scope: DispatchPathScope): LegacyScopeInferenceNotice | null {
|
|
347
|
-
if (scope.source !== "inferred") return null;
|
|
348
|
-
const paths = legacyNoticePaths(scope);
|
|
349
|
-
if (paths.length === 0) {
|
|
350
|
-
return {
|
|
351
|
-
code: "legacy_scope_empty",
|
|
352
|
-
level: "warning",
|
|
353
|
-
paths,
|
|
354
|
-
message:
|
|
355
|
-
"[dispatch scope] legacy dispatch has no declared intent and inferred no policy-bearing paths. Path-scoped rules received no inferred match input, and worker authority did not expand.",
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
const rendered = paths
|
|
359
|
-
.map(
|
|
360
|
-
(entry) =>
|
|
361
|
-
`${entry.policy} ${entry.path} (provenance=${entry.provenance} source=${entry.source} confidence=${entry.confidence})`,
|
|
362
|
-
)
|
|
363
|
-
.join("; ");
|
|
364
|
-
return {
|
|
365
|
-
code: "legacy_scope_inferred",
|
|
366
|
-
level: "warning",
|
|
367
|
-
paths,
|
|
368
|
-
message: `[dispatch scope] legacy dispatch resolved policy-bearing scope without declared intent: ${rendered}. Review this scope before execution.`,
|
|
369
|
-
};
|
|
370
|
-
}
|
|
@@ -61,9 +61,9 @@ function completedReroutes(
|
|
|
61
61
|
|
|
62
62
|
function requestedNodeId(req: DispatchRequest, settings: Readonly<ClioSettings> | undefined): string | null {
|
|
63
63
|
if (req.node !== undefined && req.node.trim().length > 0) return req.node.trim();
|
|
64
|
-
const workers = settings?.
|
|
64
|
+
const workers = settings?.fleet;
|
|
65
65
|
if (!workers) return null;
|
|
66
|
-
const profileName = req.workerProfile ?? workers.
|
|
66
|
+
const profileName = req.workerProfile ?? workers.agentProfiles?.[req.agentId];
|
|
67
67
|
if (!profileName) return null;
|
|
68
68
|
const pin = workers.profiles?.[profileName]?.node;
|
|
69
69
|
return pin !== undefined && pin.trim().length > 0 ? pin.trim() : null;
|
|
@@ -49,7 +49,7 @@ function canonicalJson(value: unknown): string {
|
|
|
49
49
|
throw new Error(`response schema digest cannot represent ${typeof value}`);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
function canonicalResponseSchemaDigest(schema: Record<string, unknown>): string {
|
|
53
53
|
return createHash("sha256").update(canonicalJson(schema), "utf8").digest("hex");
|
|
54
54
|
}
|
|
55
55
|
|
|
@@ -123,7 +123,7 @@ export const RECEIPT_INTEGRITY_FIELD_COVERAGE = {
|
|
|
123
123
|
dynamicHash: true,
|
|
124
124
|
promptSignature: true,
|
|
125
125
|
toolSignature: true,
|
|
126
|
-
|
|
126
|
+
clioCoderVersion: true,
|
|
127
127
|
piMonoVersion: true,
|
|
128
128
|
platform: true,
|
|
129
129
|
nodeVersion: true,
|
|
@@ -172,8 +172,14 @@ function selectedReceiptFields(
|
|
|
172
172
|
return result;
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
-
function receiptDigestFields(receipt: RunReceipt | RunReceiptDraft): Record<string, unknown> {
|
|
175
|
+
function receiptDigestFields(receipt: RunReceipt | RunReceiptDraft, legacyNaming = false): Record<string, unknown> {
|
|
176
176
|
const result = selectedReceiptFields(receipt, RECEIPT_FIELDS);
|
|
177
|
+
if (legacyNaming) {
|
|
178
|
+
const source = receipt as unknown as Record<string, unknown>;
|
|
179
|
+
const version = source.clioVersion ?? source.clioCoderVersion;
|
|
180
|
+
delete result.clioCoderVersion;
|
|
181
|
+
if (version !== undefined) result.clioVersion = version;
|
|
182
|
+
}
|
|
177
183
|
result.briefing = receipt.briefing ?? null;
|
|
178
184
|
result.outcomeCode = receipt.outcomeCode ?? null;
|
|
179
185
|
result.steering = receipt.steering ?? null;
|
|
@@ -227,24 +233,29 @@ function ledgerDigestFields(envelope: RunEnvelope): Record<string, unknown> {
|
|
|
227
233
|
};
|
|
228
234
|
}
|
|
229
235
|
|
|
230
|
-
function integrityPayload(
|
|
236
|
+
function integrityPayload(
|
|
237
|
+
receipt: RunReceipt | RunReceiptDraft,
|
|
238
|
+
envelope: RunEnvelope,
|
|
239
|
+
legacyNaming = false,
|
|
240
|
+
): Record<string, unknown> {
|
|
231
241
|
return {
|
|
232
|
-
contract: "clio.runReceipt.integrity",
|
|
242
|
+
contract: legacyNaming ? "clio.runReceipt.integrity" : "clio-coder.runReceipt.integrity",
|
|
233
243
|
version: RUN_RECEIPT_INTEGRITY_VERSION,
|
|
234
244
|
sources: ["receipt", "run-ledger"],
|
|
235
|
-
receipt: receiptDigestFields(receipt),
|
|
245
|
+
receipt: receiptDigestFields(receipt, legacyNaming),
|
|
236
246
|
ledger: ledgerDigestFields(envelope),
|
|
237
247
|
};
|
|
238
248
|
}
|
|
239
249
|
|
|
240
|
-
|
|
250
|
+
function computeReceiptIntegrity(
|
|
241
251
|
receipt: RunReceipt | RunReceiptDraft,
|
|
242
252
|
envelope: RunEnvelope,
|
|
253
|
+
legacyNaming = false,
|
|
243
254
|
): RunReceiptIntegrity {
|
|
244
255
|
return {
|
|
245
256
|
version: RUN_RECEIPT_INTEGRITY_VERSION,
|
|
246
257
|
algorithm: RUN_RECEIPT_INTEGRITY_ALGORITHM,
|
|
247
|
-
digest: sha256(canonicalJson(integrityPayload(receipt, envelope))),
|
|
258
|
+
digest: sha256(canonicalJson(integrityPayload(receipt, envelope, legacyNaming))),
|
|
248
259
|
};
|
|
249
260
|
}
|
|
250
261
|
|
|
@@ -385,7 +396,8 @@ export function verifyReceiptIntegrity(receipt: RunReceipt, envelope: RunEnvelop
|
|
|
385
396
|
return { ok: false, reason: `ledger mismatch: ${mismatch}` };
|
|
386
397
|
}
|
|
387
398
|
const expected = computeReceiptIntegrity(receipt, envelope);
|
|
388
|
-
|
|
399
|
+
const legacyExpected = computeReceiptIntegrity(receipt, envelope, true);
|
|
400
|
+
if (expected.digest !== receipt.integrity.digest && legacyExpected.digest !== receipt.integrity.digest) {
|
|
389
401
|
return { ok: false, reason: "integrity mismatch" };
|
|
390
402
|
}
|
|
391
403
|
return { ok: true };
|
|
@@ -9,14 +9,29 @@ import {
|
|
|
9
9
|
type CapacityStateFile,
|
|
10
10
|
capacityStateLockPath,
|
|
11
11
|
describeEndpointCapacityHolders,
|
|
12
|
+
endpointCapacityRemedy,
|
|
12
13
|
readCapacityStateUnsafe,
|
|
13
14
|
writeCapacityStateUnsafe,
|
|
14
15
|
} from "./capacity-lease.js";
|
|
16
|
+
import { COUNCIL_MIN_MEMBERS } from "./gate-role-prompts.js";
|
|
15
17
|
|
|
16
18
|
const MAX_RESERVATION_RECORDS = 500;
|
|
17
19
|
export const DEFAULT_RESERVATION_TTL_MS = 15 * 60_000;
|
|
18
20
|
|
|
19
|
-
|
|
21
|
+
/**
|
|
22
|
+
* `council` is carried rather than flattened into `parallel` because it is the
|
|
23
|
+
* one topology with a floor on its own width. Every other plan can answer a
|
|
24
|
+
* capacity denial by dispatching fewer at once; a council of two cannot, and a
|
|
25
|
+
* denial that tells it to is advice it cannot take.
|
|
26
|
+
*/
|
|
27
|
+
export type ReservationTopology =
|
|
28
|
+
| "parallel"
|
|
29
|
+
| "detached"
|
|
30
|
+
| "sequential"
|
|
31
|
+
| "pipeline"
|
|
32
|
+
| "review"
|
|
33
|
+
| "compete"
|
|
34
|
+
| "council";
|
|
20
35
|
export type ReservationMemberStatus = "held" | "consumed" | "released";
|
|
21
36
|
export type ReservationStatus = "active" | "released" | "rolled_back" | "expired";
|
|
22
37
|
|
|
@@ -79,8 +94,10 @@ function endpointCapacityDenial(input: {
|
|
|
79
94
|
leases: number;
|
|
80
95
|
reservations: number;
|
|
81
96
|
foregroundStreams: number;
|
|
97
|
+
topology?: ReservationTopology;
|
|
82
98
|
}): string {
|
|
83
|
-
|
|
99
|
+
const remedy = endpointCapacityRemedy(input.topology === "council" ? { rosterFloor: COUNCIL_MIN_MEMBERS } : undefined);
|
|
100
|
+
return `dispatch: admission denied: endpoint '${endpointLabel(input.endpointKey)}' capacity exceeded (${input.used + input.requested}/${input.limit} slots): ${describeEndpointCapacityHolders(input)}; ${remedy}`;
|
|
84
101
|
}
|
|
85
102
|
|
|
86
103
|
function copyRecord(record: DispatchReservationRecord): DispatchReservationRecord {
|
|
@@ -100,7 +117,8 @@ function validRecord(value: unknown): value is DispatchReservationRecord {
|
|
|
100
117
|
record.topology === "sequential" ||
|
|
101
118
|
record.topology === "pipeline" ||
|
|
102
119
|
record.topology === "review" ||
|
|
103
|
-
record.topology === "compete"
|
|
120
|
+
record.topology === "compete" ||
|
|
121
|
+
record.topology === "council") &&
|
|
104
122
|
(record.status === "active" ||
|
|
105
123
|
record.status === "released" ||
|
|
106
124
|
record.status === "rolled_back" ||
|
|
@@ -191,6 +209,7 @@ function allocateReservation(
|
|
|
191
209
|
tasks: ReadonlyArray<ReservationPlanTask>,
|
|
192
210
|
existing: ReadonlyArray<DispatchReservationRecord>,
|
|
193
211
|
capacity: ReservationCapacitySnapshot,
|
|
212
|
+
topology?: ReservationTopology,
|
|
194
213
|
): ReservationPlanResult {
|
|
195
214
|
if (tasks.length === 0) return { ok: false, reason: "reservation requires at least one task" };
|
|
196
215
|
const duplicate = tasks.find((task, index) => tasks.slice(0, index).some((entry) => entry.memberId === task.memberId));
|
|
@@ -230,6 +249,7 @@ function allocateReservation(
|
|
|
230
249
|
leases: endpoint.leases ?? endpoint.active - (endpoint.foregroundStreams ?? 0),
|
|
231
250
|
reservations: heldSlots,
|
|
232
251
|
foregroundStreams: endpoint.foregroundStreams ?? 0,
|
|
252
|
+
...(topology === undefined ? {} : { topology }),
|
|
233
253
|
}),
|
|
234
254
|
};
|
|
235
255
|
}
|
|
@@ -264,7 +284,7 @@ export function createDispatchReservation(input: {
|
|
|
264
284
|
`dispatch: reservation denied: capacity is draining (requested by pid ${drain.requestedByPid} at ${drain.requestedAt})`,
|
|
265
285
|
);
|
|
266
286
|
}
|
|
267
|
-
const planned = allocateReservation(input.tasks, records, input.capacity);
|
|
287
|
+
const planned = allocateReservation(input.tasks, records, input.capacity, input.topology);
|
|
268
288
|
if (!planned.ok) {
|
|
269
289
|
replaceReservations(state, records);
|
|
270
290
|
writeCapacityStateUnsafe(state);
|
|
@@ -579,31 +599,8 @@ export function getDispatchReservation(ownerId: string): DispatchReservationReco
|
|
|
579
599
|
return record ? copyRecord(record) : null;
|
|
580
600
|
}
|
|
581
601
|
|
|
582
|
-
export function listDispatchReservations(): ReadonlyArray<DispatchReservationRecord> {
|
|
583
|
-
return readStore();
|
|
584
|
-
}
|
|
585
|
-
|
|
586
602
|
export function reservedBudgetUsd(): number {
|
|
587
603
|
return readStore()
|
|
588
604
|
.filter((record) => record.status === "active")
|
|
589
605
|
.reduce((sum, record) => sum + outstandingBudget(record), 0);
|
|
590
606
|
}
|
|
591
|
-
|
|
592
|
-
export function reservedCapacity(): {
|
|
593
|
-
globalSlots: number;
|
|
594
|
-
nodeSlots: Readonly<Record<string, number>>;
|
|
595
|
-
endpointSlots: Readonly<Record<string, number>>;
|
|
596
|
-
} {
|
|
597
|
-
let globalSlots = 0;
|
|
598
|
-
const nodeSlots: Record<string, number> = {};
|
|
599
|
-
const endpointSlots: Record<string, number> = {};
|
|
600
|
-
for (const record of readStore().filter((entry) => entry.status === "active")) {
|
|
601
|
-
const allocation = reservationAllocation(outstandingTasks(record));
|
|
602
|
-
globalSlots += allocation.globalSlots;
|
|
603
|
-
for (const [nodeId, count] of Object.entries(allocation.nodeSlots))
|
|
604
|
-
nodeSlots[nodeId] = (nodeSlots[nodeId] ?? 0) + count;
|
|
605
|
-
for (const [endpointKey, count] of Object.entries(allocation.endpointSlots))
|
|
606
|
-
endpointSlots[endpointKey] = (endpointSlots[endpointKey] ?? 0) + count;
|
|
607
|
-
}
|
|
608
|
-
return { globalSlots, nodeSlots, endpointSlots };
|
|
609
|
-
}
|
|
@@ -597,7 +597,7 @@ function readinessHashProjection(report: RouteReadinessReport): readonly [boolea
|
|
|
597
597
|
* `decisionDurationMs`, which is a measurement of the decision rather than an
|
|
598
598
|
* input to it, so a replay on a faster machine still reproduces the hash.
|
|
599
599
|
*/
|
|
600
|
-
|
|
600
|
+
function routeDecisionHash(input: RouteDecisionInput): string {
|
|
601
601
|
// Arrays give every field an explicit position, so native JSON serialization
|
|
602
602
|
// is deterministic without recursively sorting hundreds of short-lived
|
|
603
603
|
// objects at the maximum universe bound. Candidate identity uses the same
|
|
@@ -137,7 +137,7 @@ function retireHistory(path: string, version: unknown): void {
|
|
|
137
137
|
const retired = `${path}.v${String(version)}.${stamp}.retired`;
|
|
138
138
|
renameSync(path, retired);
|
|
139
139
|
process.stderr.write(
|
|
140
|
-
`[clio:dispatch] route history v${String(version)} is retired; starting empty at v${ROUTE_HISTORY_VERSION}. Prior observations: ${retired}\n`,
|
|
140
|
+
`[clio-coder:dispatch] route history v${String(version)} is retired; starting empty at v${ROUTE_HISTORY_VERSION}. Prior observations: ${retired}\n`,
|
|
141
141
|
);
|
|
142
142
|
}
|
|
143
143
|
|
|
@@ -146,7 +146,7 @@ function rate(values: ReadonlyArray<boolean>, fallback = 0): number {
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
/** Conservative 95% Wilson lower confidence bound for a Bernoulli success rate. */
|
|
149
|
-
|
|
149
|
+
function wilsonLowerBound(successes: number, observations: number, z = 1.96): number {
|
|
150
150
|
if (observations <= 0) return 0;
|
|
151
151
|
const proportion = successes / observations;
|
|
152
152
|
const z2 = z * z;
|
|
@@ -90,31 +90,3 @@ export function evaluateRouteReadiness(input: RouteReadinessInput): RouteReadine
|
|
|
90
90
|
labelsNeeded: Math.max(0, MINIMUM_ACTIVE_QUALITY_LABELS - estimate.qualityLabeledCount),
|
|
91
91
|
};
|
|
92
92
|
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Human-readable one-liners for a refusal message. The wording names the
|
|
96
|
-
* missing evidence, so an operator who sees an active refusal can tell whether
|
|
97
|
-
* to wait for measurements or to fix a stale fact.
|
|
98
|
-
*/
|
|
99
|
-
export function describeReadinessGap(gap: ReadinessGap): string {
|
|
100
|
-
switch (gap) {
|
|
101
|
-
case "hard-constraint-validity-below-one":
|
|
102
|
-
return "hard-constraint evaluation was not consistently valid over the retained window";
|
|
103
|
-
case "integrity-failures-in-window":
|
|
104
|
-
return "the retained window contains receipt or source integrity failures";
|
|
105
|
-
case "insufficient-quality-labels":
|
|
106
|
-
return `fewer than ${MINIMUM_ACTIVE_QUALITY_LABELS} quality-labeled outcomes for this route and role`;
|
|
107
|
-
case "quality-lower-bound-below-posture-floor":
|
|
108
|
-
return "the conservative quality lower bound is below the posture floor";
|
|
109
|
-
case "quality-lower-bound-below-requested-minimum":
|
|
110
|
-
return "the conservative quality lower bound is below the request's minimumQuality";
|
|
111
|
-
case "reliability-below-posture-floor":
|
|
112
|
-
return "route-attributable reliability is below the posture floor";
|
|
113
|
-
case "cost-upper-bound-unknown":
|
|
114
|
-
return "the route has no conservative cost upper bound";
|
|
115
|
-
case "route-facts-stale":
|
|
116
|
-
return "node, endpoint, resource, capacity, or settings facts are stale";
|
|
117
|
-
case "decision-latency-above-budget":
|
|
118
|
-
return `shadow decision p95 exceeds ${DECISION_LATENCY_BUDGET_MS} ms at the configured universe bound`;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain-owned writer for the run event journal.
|
|
3
|
+
*
|
|
4
|
+
* The journal was originally teed from `createDispatchRunEventRegistry`
|
|
5
|
+
* (src/tools/dispatch-run-events.ts), the display-tail helper behind the
|
|
6
|
+
* model-facing `dispatch` tool. That helper is not on the operator paths:
|
|
7
|
+
* `clio-coder run --agent` (src/cli/run.ts), `clio-coder fleet run`
|
|
8
|
+
* (src/cli/fleet.ts), and the TUI `/run` slash command each take a handle
|
|
9
|
+
* straight off `DispatchContract.dispatch` and iterate `handle.events`
|
|
10
|
+
* themselves, so no registry is ever built and the sink never fired. The
|
|
11
|
+
* writer had to move to something every dispatch reaches.
|
|
12
|
+
*
|
|
13
|
+
* `BusChannels.DispatchProgress` is that thing. The dispatch domain publishes
|
|
14
|
+
* it from inside the event pump for every consumer-visible event of every run,
|
|
15
|
+
* "attached, detached, batched, and retry runs, exactly once" (see
|
|
16
|
+
* src/core/bus-events.ts), whether or not anyone iterates the handle. The
|
|
17
|
+
* terminal pair `DispatchCompleted`/`DispatchFailed` closes every run the same
|
|
18
|
+
* way. Subscribing here makes the journal a property of dispatching, not of
|
|
19
|
+
* which caller happened to build a registry.
|
|
20
|
+
*
|
|
21
|
+
* Ownership is explicit rather than ambient: the bridge attaches only when a
|
|
22
|
+
* composition root asks for it (`DispatchBundleOptions.journalRunEvents`), and
|
|
23
|
+
* `registerAllTools` hands its registry `journal: null` in that same process.
|
|
24
|
+
* One writer per file, decided at one place, so a tool-path run in the TUI is
|
|
25
|
+
* not transcribed twice.
|
|
26
|
+
*
|
|
27
|
+
* Every write is best-effort. The sink degrades itself on I/O failure and a
|
|
28
|
+
* listener that throws is contained by the safe bus, so nothing here can fail a
|
|
29
|
+
* dispatch.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
import type {
|
|
33
|
+
DispatchCompletedPayload,
|
|
34
|
+
DispatchFailedPayload,
|
|
35
|
+
DispatchProgressPayload,
|
|
36
|
+
} from "../../core/bus-events.js";
|
|
37
|
+
import { BusChannels } from "../../core/bus-events.js";
|
|
38
|
+
import type { SafeEventBus } from "../../core/event-bus.js";
|
|
39
|
+
import { runTailEntryFromEvent } from "../../tools/dispatch-run-events.js";
|
|
40
|
+
import { defaultRunEventJournal, type RunEventJournalSink } from "./run-event-journal.js";
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Runs whose `open` line this bridge has already written. Bounded so a
|
|
44
|
+
* long-lived orchestrator cannot grow it without limit; the journal writer
|
|
45
|
+
* keeps its own bound for the same reason. Evicting a run only forgets that it
|
|
46
|
+
* was opened, and a later event for it writes a second `open` line, which the
|
|
47
|
+
* reader and the writer both tolerate.
|
|
48
|
+
*/
|
|
49
|
+
const OPENED_RUN_LIMIT = 512;
|
|
50
|
+
|
|
51
|
+
export interface RunEventJournalBridge {
|
|
52
|
+
/** Unsubscribe from the bus. Idempotent. */
|
|
53
|
+
stop(): void;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface AttachRunEventJournalBridgeOptions {
|
|
57
|
+
/** Sink override; defaults to the process-wide journal. */
|
|
58
|
+
journal?: RunEventJournalSink;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
62
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function runIdentity(payload: unknown): { runId: string; agentId: string } | null {
|
|
66
|
+
if (!isRecord(payload)) return null;
|
|
67
|
+
if (typeof payload.runId !== "string" || payload.runId.length === 0) return null;
|
|
68
|
+
return { runId: payload.runId, agentId: typeof payload.agentId === "string" ? payload.agentId : "unknown" };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Subscribe the journal to a dispatch bus. Returns a handle whose `stop()` the
|
|
73
|
+
* owning bundle calls on shutdown so a second bundle in the same process (tests
|
|
74
|
+
* do this) never inherits the first one's listeners.
|
|
75
|
+
*/
|
|
76
|
+
export function attachRunEventJournalBridge(
|
|
77
|
+
bus: SafeEventBus,
|
|
78
|
+
options: AttachRunEventJournalBridgeOptions = {},
|
|
79
|
+
): RunEventJournalBridge {
|
|
80
|
+
const journal = options.journal ?? defaultRunEventJournal();
|
|
81
|
+
const opened = new Set<string>();
|
|
82
|
+
|
|
83
|
+
const ensureOpen = (runId: string, agentId: string): void => {
|
|
84
|
+
if (opened.has(runId)) return;
|
|
85
|
+
opened.add(runId);
|
|
86
|
+
while (opened.size > OPENED_RUN_LIMIT) {
|
|
87
|
+
const oldest = opened.values().next();
|
|
88
|
+
if (oldest.done === true) break;
|
|
89
|
+
opened.delete(oldest.value);
|
|
90
|
+
}
|
|
91
|
+
journal.open(runId, agentId);
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Write the receipt facts and close the run. Read defensively for the same
|
|
96
|
+
* reason the registry's seal is: a terminal payload that is missing a field
|
|
97
|
+
* it is typed to have must degrade the transcript, never throw back into the
|
|
98
|
+
* finalizer that emitted it.
|
|
99
|
+
*/
|
|
100
|
+
const seal = (outcome: string, detail: string | null | undefined, payload: unknown): void => {
|
|
101
|
+
const identity = runIdentity(payload);
|
|
102
|
+
if (identity === null) return;
|
|
103
|
+
ensureOpen(identity.runId, identity.agentId);
|
|
104
|
+
const exitCode = isRecord(payload) && typeof payload.exitCode === "number" ? payload.exitCode : null;
|
|
105
|
+
journal.receipt(identity.runId, { outcome, exitCode });
|
|
106
|
+
journal.terminal(identity.runId, outcome, detail ?? undefined);
|
|
107
|
+
opened.delete(identity.runId);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const unsubscribes = [
|
|
111
|
+
bus.on(BusChannels.DispatchProgress, (payload: DispatchProgressPayload) => {
|
|
112
|
+
const identity = runIdentity(payload);
|
|
113
|
+
if (identity === null) return;
|
|
114
|
+
// The display projection decides what a transcript line is; a
|
|
115
|
+
// heartbeat or a streaming delta is not one. Opening the run only
|
|
116
|
+
// once an event survives that filter keeps a heartbeat-only run from
|
|
117
|
+
// creating an empty journal directory.
|
|
118
|
+
const entry = runTailEntryFromEvent(payload.event);
|
|
119
|
+
if (entry === null) return;
|
|
120
|
+
ensureOpen(identity.runId, identity.agentId);
|
|
121
|
+
// Route resolution warnings use `message`, while worker transcript
|
|
122
|
+
// events generally project their text through `detail`. Preserve the
|
|
123
|
+
// warning at this dispatch-owned durability seam so fleet view does not
|
|
124
|
+
// render a content-free `route_warning` line.
|
|
125
|
+
const message =
|
|
126
|
+
isRecord(payload.event) && typeof payload.event.message === "string" ? payload.event.message : undefined;
|
|
127
|
+
journal.append(
|
|
128
|
+
identity.runId,
|
|
129
|
+
entry.detail === undefined && message !== undefined ? { ...entry, detail: message } : entry,
|
|
130
|
+
);
|
|
131
|
+
}),
|
|
132
|
+
bus.on(BusChannels.DispatchCompleted, (payload: DispatchCompletedPayload) => {
|
|
133
|
+
seal(payload.outcome, payload.outcomeDetail, payload);
|
|
134
|
+
}),
|
|
135
|
+
bus.on(BusChannels.DispatchFailed, (payload: DispatchFailedPayload) => {
|
|
136
|
+
seal(payload.outcome, payload.outcomeDetail, payload);
|
|
137
|
+
}),
|
|
138
|
+
];
|
|
139
|
+
|
|
140
|
+
let stopped = false;
|
|
141
|
+
return {
|
|
142
|
+
stop(): void {
|
|
143
|
+
if (stopped) return;
|
|
144
|
+
stopped = true;
|
|
145
|
+
for (const unsubscribe of unsubscribes) unsubscribe();
|
|
146
|
+
opened.clear();
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|