@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
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { BusChannels } from "../core/bus-events.js";
|
|
2
2
|
import type { SafeEventBus } from "../core/event-bus.js";
|
|
3
|
+
import { normalizeClioCoderEventRecord, normalizeClioCoderEventType } from "../core/naming-events.js";
|
|
3
4
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
4
5
|
import { durableAssistantTextFromEvent } from "../domains/dispatch/event-pump.js";
|
|
6
|
+
import { defaultRunEventJournal, type RunEventJournalSink } from "../domains/dispatch/run-event-journal.js";
|
|
5
7
|
import type { RunReceipt } from "../domains/dispatch/types.js";
|
|
6
8
|
import { assistantTextFromEvent } from "./dispatch-event-text.js";
|
|
7
9
|
import { truncateUtf8 } from "./truncate-utf8.js";
|
|
@@ -60,27 +62,113 @@ function isRecord(value: unknown): value is Record<string, unknown> {
|
|
|
60
62
|
}
|
|
61
63
|
|
|
62
64
|
function eventDetail(event: unknown): string | undefined {
|
|
63
|
-
const
|
|
65
|
+
const normalized = isRecord(event) ? normalizeClioCoderEventRecord(event) : event;
|
|
66
|
+
const text = assistantTextFromEvent(normalized);
|
|
64
67
|
if (text.length > 0) return truncateUtf8(text, RUN_TAIL_TEXT_LIMIT, "...");
|
|
65
|
-
if (!isRecord(
|
|
66
|
-
if (
|
|
67
|
-
const tool = typeof
|
|
68
|
-
const outcome = typeof
|
|
68
|
+
if (!isRecord(normalized)) return undefined;
|
|
69
|
+
if (normalized.type === "clio_coder_tool_finish" && isRecord(normalized.payload)) {
|
|
70
|
+
const tool = typeof normalized.payload.tool === "string" ? normalized.payload.tool : "tool";
|
|
71
|
+
const outcome = typeof normalized.payload.outcome === "string" ? normalized.payload.outcome : "";
|
|
69
72
|
return `${tool} ${outcome}`.trim();
|
|
70
73
|
}
|
|
71
|
-
if (
|
|
72
|
-
const attempt = typeof
|
|
73
|
-
const runId = typeof
|
|
74
|
-
const reason = typeof
|
|
74
|
+
if (normalized.type === "attempt_start") {
|
|
75
|
+
const attempt = typeof normalized.attempt === "number" ? normalized.attempt : "?";
|
|
76
|
+
const runId = typeof normalized.runId === "string" ? normalized.runId : "?";
|
|
77
|
+
const reason = typeof normalized.reason === "string" ? normalized.reason : "retry";
|
|
75
78
|
return truncateUtf8(`attempt ${attempt} -> ${runId}: ${reason}`, RUN_TAIL_TEXT_LIMIT, "...");
|
|
76
79
|
}
|
|
77
80
|
return undefined;
|
|
78
81
|
}
|
|
79
82
|
|
|
80
|
-
|
|
83
|
+
/**
|
|
84
|
+
* Project one worker/ACP event into the display tail, or null when the event is
|
|
85
|
+
* not tail-visible. Heartbeats and streaming `message_update` increments are
|
|
86
|
+
* noise on a transcript: the tail keeps message boundaries, not deltas.
|
|
87
|
+
*
|
|
88
|
+
* The durable journal writes exactly this projection, so a transcript read back
|
|
89
|
+
* by `clio-coder fleet view` and the monitor's live peek cannot disagree about
|
|
90
|
+
* what a run did. Both the registry below and the domain-owned journal bridge
|
|
91
|
+
* (src/domains/dispatch/run-event-journal-bridge.ts) call it.
|
|
92
|
+
*/
|
|
93
|
+
export function runTailEntryFromEvent(event: unknown, at: string = new Date().toISOString()): RunTailEntry | null {
|
|
94
|
+
const type = isRecord(event) && typeof event.type === "string" ? normalizeClioCoderEventType(event.type) : "unknown";
|
|
95
|
+
if (type === "heartbeat" || type === "message_update") return null;
|
|
96
|
+
const entry: RunTailEntry = { at, type };
|
|
97
|
+
const detail = eventDetail(event);
|
|
98
|
+
if (detail !== undefined) entry.detail = detail;
|
|
99
|
+
return entry;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export interface DispatchRunEventRegistryOptions {
|
|
103
|
+
/**
|
|
104
|
+
* Durable tee for the display tail. Omitted takes the process-wide default
|
|
105
|
+
* journal (settings-gated by `panes.journal`); `null` turns it off for this
|
|
106
|
+
* registry. This is the one wiring choke point: every registry in the
|
|
107
|
+
* process is built by this factory, so the sink attaches here rather than at
|
|
108
|
+
* each of the three construction sites that call it.
|
|
109
|
+
*/
|
|
110
|
+
journal?: RunEventJournalSink | null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Outcome recorded for a run whose completion rejected before a receipt existed. */
|
|
114
|
+
const REGISTRY_FAILURE_OUTCOME = "failed";
|
|
115
|
+
/** Outcome recorded when a receipt settled without a readable outcome field. */
|
|
116
|
+
const REGISTRY_UNKNOWN_OUTCOME = "unknown";
|
|
117
|
+
|
|
118
|
+
function errorText(error: unknown): string {
|
|
119
|
+
return error instanceof Error ? error.message : String(error);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function createDispatchRunEventRegistry(
|
|
123
|
+
options: DispatchRunEventRegistryOptions = {},
|
|
124
|
+
): DispatchRunEventRegistry {
|
|
81
125
|
const runTails = new Map<string, RunTailState>();
|
|
82
126
|
const activeRuns = new Set<string>();
|
|
83
127
|
const activeBatches = new Set<string>();
|
|
128
|
+
const journal: RunEventJournalSink | null = options.journal === undefined ? defaultRunEventJournal() : options.journal;
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Seal one logical run in the journal. `logicalRunId` is the id an operator
|
|
132
|
+
* asked about; a retried run's receipt carries the terminal attempt's id
|
|
133
|
+
* instead, and that only ever appears as a field on the line.
|
|
134
|
+
*/
|
|
135
|
+
const journalSeal = (logicalRunId: string, receipt: RunReceipt): void => {
|
|
136
|
+
if (journal === null || !isRecord(receipt)) return;
|
|
137
|
+
// Every field is read defensively. The journal sits on the completion path
|
|
138
|
+
// of every dispatch, and a receipt that is missing a block it is typed to
|
|
139
|
+
// have (a stubbed contract, a truncated read) must degrade the transcript,
|
|
140
|
+
// never reject the completion the caller is awaiting.
|
|
141
|
+
const digest = receipt.integrity?.digest;
|
|
142
|
+
const outcome = typeof receipt.outcome === "string" ? receipt.outcome : REGISTRY_UNKNOWN_OUTCOME;
|
|
143
|
+
journal.receipt(logicalRunId, {
|
|
144
|
+
outcome,
|
|
145
|
+
exitCode: typeof receipt.exitCode === "number" ? receipt.exitCode : null,
|
|
146
|
+
...(typeof digest === "string" ? { digest } : {}),
|
|
147
|
+
...(receipt.runId !== logicalRunId ? { attemptRunId: receipt.runId } : {}),
|
|
148
|
+
});
|
|
149
|
+
journal.terminal(logicalRunId, outcome, receipt.outcomeDetail ?? undefined);
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Seal a batch's journals. `assignmentIds` are the logical work ids in
|
|
154
|
+
* admission order and `dispatchBatch` resolves one receipt per request, so
|
|
155
|
+
* equal lengths pair by index. Anything else pairs by the receipt's own run
|
|
156
|
+
* id and leaves unmatched assignments without a terminal line rather than
|
|
157
|
+
* inventing an outcome for them.
|
|
158
|
+
*/
|
|
159
|
+
const sealBatchJournals = (assignmentIds: ReadonlyArray<string>, receipts: ReadonlyArray<RunReceipt>): void => {
|
|
160
|
+
if (journal === null || !Array.isArray(receipts)) return;
|
|
161
|
+
if (assignmentIds.length === receipts.length) {
|
|
162
|
+
for (const [index, runId] of assignmentIds.entries()) {
|
|
163
|
+
const receipt = receipts[index];
|
|
164
|
+
if (receipt !== undefined) journalSeal(runId, receipt);
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
for (const receipt of receipts) {
|
|
169
|
+
if (receipt != null && typeof receipt.runId === "string") journalSeal(receipt.runId, receipt);
|
|
170
|
+
}
|
|
171
|
+
};
|
|
84
172
|
|
|
85
173
|
const pruneRunTails = (): void => {
|
|
86
174
|
while (runTails.size > RUN_TAIL_RUN_LIMIT) {
|
|
@@ -97,19 +185,20 @@ export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
|
|
|
97
185
|
};
|
|
98
186
|
|
|
99
187
|
const recordRunEvent = (runId: string, agentId: string, event: unknown): void => {
|
|
100
|
-
const
|
|
101
|
-
if (
|
|
188
|
+
const entry = runTailEntryFromEvent(event);
|
|
189
|
+
if (entry === null) return;
|
|
102
190
|
const state = runTails.get(runId) ?? { agentId, entries: [], lastSeenAt: Date.now() };
|
|
103
191
|
state.lastSeenAt = Date.now();
|
|
104
|
-
const entry: RunTailEntry = { at: new Date().toISOString(), type };
|
|
105
|
-
const detail = eventDetail(event);
|
|
106
|
-
if (detail !== undefined) entry.detail = detail;
|
|
107
192
|
state.entries.push(entry);
|
|
108
193
|
if (state.entries.length > RUN_TAIL_ENTRY_LIMIT) {
|
|
109
194
|
state.entries.splice(0, state.entries.length - RUN_TAIL_ENTRY_LIMIT);
|
|
110
195
|
}
|
|
111
196
|
runTails.set(runId, state);
|
|
112
197
|
pruneRunTails();
|
|
198
|
+
// The journal is a tee of exactly this projection, appended after the
|
|
199
|
+
// in-memory tail is already updated so a sink that degrades cannot change
|
|
200
|
+
// what `eventTail` returns.
|
|
201
|
+
journal?.append(runId, entry);
|
|
113
202
|
};
|
|
114
203
|
|
|
115
204
|
const drainSingle = async (
|
|
@@ -172,6 +261,7 @@ export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
|
|
|
172
261
|
throw new Error(`dispatch event registry: run '${handle.runId}' is already registered`);
|
|
173
262
|
}
|
|
174
263
|
activeRuns.add(handle.runId);
|
|
264
|
+
journal?.open(handle.runId, agentId);
|
|
175
265
|
const summaryPromise = drainSingle(handle.runId, agentId, handle.events, bus);
|
|
176
266
|
const completion = Promise.allSettled([summaryPromise, handle.finalPromise]).then(
|
|
177
267
|
([summaryResult, receiptResult]) => {
|
|
@@ -180,12 +270,24 @@ export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
|
|
|
180
270
|
return { receipt: receiptResult.value, summary: summaryResult.value };
|
|
181
271
|
},
|
|
182
272
|
);
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
.
|
|
273
|
+
// One subscription, not a `.then().finally()` chain. Chaining pushes the
|
|
274
|
+
// tail release a microtask later than it used to land, and a caller that
|
|
275
|
+
// awaits `completion` and then reads `eventTail` observes the run as
|
|
276
|
+
// still active. Journal and release settle together in this handler.
|
|
277
|
+
const releaseSingle = (): void => {
|
|
278
|
+
activeRuns.delete(handle.runId);
|
|
279
|
+
pruneRunTails();
|
|
280
|
+
};
|
|
281
|
+
void completion.then(
|
|
282
|
+
({ receipt }) => {
|
|
283
|
+
journalSeal(handle.runId, receipt);
|
|
284
|
+
releaseSingle();
|
|
285
|
+
},
|
|
286
|
+
(error: unknown) => {
|
|
287
|
+
journal?.terminal(handle.runId, REGISTRY_FAILURE_OUTCOME, errorText(error));
|
|
288
|
+
releaseSingle();
|
|
289
|
+
},
|
|
290
|
+
);
|
|
189
291
|
return { runId: handle.runId, completion };
|
|
190
292
|
},
|
|
191
293
|
registerBatch(handle, agentIds, bus) {
|
|
@@ -204,6 +306,9 @@ export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
|
|
|
204
306
|
}
|
|
205
307
|
activeBatches.add(handle.batchId);
|
|
206
308
|
for (const runId of handle.assignmentIds) activeRuns.add(runId);
|
|
309
|
+
for (const [index, runId] of handle.assignmentIds.entries()) {
|
|
310
|
+
journal?.open(runId, agentIds[index] ?? "unknown");
|
|
311
|
+
}
|
|
207
312
|
const completion = Promise.allSettled([drainBatch(handle.batchId, handle.events, bus), handle.finalPromise]).then(
|
|
208
313
|
([summariesResult, receiptsResult]) => {
|
|
209
314
|
if (summariesResult.status === "rejected") throw summariesResult.reason;
|
|
@@ -211,13 +316,25 @@ export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
|
|
|
211
316
|
return { receipts: receiptsResult.value, summaries: summariesResult.value };
|
|
212
317
|
},
|
|
213
318
|
);
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
319
|
+
// Single subscription for the same reason as registerSingle above.
|
|
320
|
+
const releaseBatch = (): void => {
|
|
321
|
+
activeBatches.delete(handle.batchId);
|
|
322
|
+
for (const runId of handle.assignmentIds) activeRuns.delete(runId);
|
|
323
|
+
pruneRunTails();
|
|
324
|
+
};
|
|
325
|
+
void completion.then(
|
|
326
|
+
({ receipts }) => {
|
|
327
|
+
sealBatchJournals(handle.assignmentIds, receipts);
|
|
328
|
+
releaseBatch();
|
|
329
|
+
},
|
|
330
|
+
(error: unknown) => {
|
|
331
|
+
const detail = errorText(error);
|
|
332
|
+
for (const runId of handle.assignmentIds) {
|
|
333
|
+
journal?.terminal(runId, REGISTRY_FAILURE_OUTCOME, detail);
|
|
334
|
+
}
|
|
335
|
+
releaseBatch();
|
|
336
|
+
},
|
|
337
|
+
);
|
|
221
338
|
for (const [index, runId] of handle.assignmentIds.entries()) {
|
|
222
339
|
if (!runTails.has(runId)) {
|
|
223
340
|
runTails.set(runId, {
|
|
@@ -40,6 +40,7 @@ import {
|
|
|
40
40
|
REVIEWER_GATE_PROMPT,
|
|
41
41
|
renderCouncilVoteMemberTask,
|
|
42
42
|
} from "../domains/dispatch/gate-role-prompts.js";
|
|
43
|
+
import { narrowDispatchIntentToReadOnly } from "../domains/dispatch/intent.js";
|
|
43
44
|
import { renderDispatchReviewerTask } from "../domains/dispatch/intent-requirements.js";
|
|
44
45
|
import { UNVERIFIABLE_RECEIPT_VERIFICATION } from "../domains/dispatch/receipt-findings.js";
|
|
45
46
|
import { type ReceiptIntegrityResult, verifyReceiptIntegrity } from "../domains/dispatch/receipt-integrity.js";
|
|
@@ -56,7 +57,8 @@ import {
|
|
|
56
57
|
claimCompeteGroup,
|
|
57
58
|
cleanupCompeteGroup,
|
|
58
59
|
commitCandidateWork,
|
|
59
|
-
|
|
60
|
+
competeBranchForCandidate,
|
|
61
|
+
createCandidateWorktreeMapped,
|
|
60
62
|
isGitRepository,
|
|
61
63
|
loadCompeteGroup,
|
|
62
64
|
markCompeteGroupCleanupReady,
|
|
@@ -65,7 +67,7 @@ import {
|
|
|
65
67
|
protectedPathsChangedByCompeteBranch,
|
|
66
68
|
recoverCleanupReadyCompeteGroups,
|
|
67
69
|
registerCompeteGroupRun,
|
|
68
|
-
|
|
70
|
+
removeCandidateWorktreeMapped,
|
|
69
71
|
settleCompeteGroupRun,
|
|
70
72
|
settleRecoveredCompeteDecision,
|
|
71
73
|
} from "./compete-worktrees.js";
|
|
@@ -963,6 +965,8 @@ function recoverPendingGateEvidence(deps: DispatchToolDeps): void {
|
|
|
963
965
|
const pick = judged?.ok ? judged.result.winner : null;
|
|
964
966
|
const pickedSubject = pick === null ? undefined : record.subjects[pick - 1];
|
|
965
967
|
const candidateReceipt = pickedSubject === undefined ? null : readVerifiedGateReceipt(deps, pickedSubject.runId);
|
|
968
|
+
const root = record.resourceRoot ?? process.cwd();
|
|
969
|
+
const pickedBranch = pick === null ? null : competeBranchForCandidate(root, record.group, pick);
|
|
966
970
|
if (pickedSubject !== undefined && candidateReceipt === null) {
|
|
967
971
|
throw new Error(
|
|
968
972
|
`pending compete decision ${record.id} has no verified candidate receipt for ${pickedSubject.runId}`,
|
|
@@ -970,11 +974,10 @@ function recoverPendingGateEvidence(deps: DispatchToolDeps): void {
|
|
|
970
974
|
}
|
|
971
975
|
let blockedProtected: string[] = [];
|
|
972
976
|
if (pick !== null && pickedSubject !== undefined && candidateReceipt !== null) {
|
|
973
|
-
const root = record.resourceRoot ?? process.cwd();
|
|
974
977
|
const protectedPaths = deps.dispatch.protectedArtifactState?.().artifacts.map((artifact) => artifact.path) ?? [];
|
|
975
978
|
blockedProtected = protectedPathsChangedByCompeteBranch(
|
|
976
979
|
root,
|
|
977
|
-
`clio/compete/${record.group}/${pick}`,
|
|
980
|
+
pickedBranch ?? `clio-coder/compete/${record.group}/${pick}`,
|
|
978
981
|
protectedPaths,
|
|
979
982
|
);
|
|
980
983
|
}
|
|
@@ -984,7 +987,7 @@ function recoverPendingGateEvidence(deps: DispatchToolDeps): void {
|
|
|
984
987
|
candidateReceipt !== null &&
|
|
985
988
|
!isPipelineStepFailure(candidateReceipt) &&
|
|
986
989
|
blockedProtected.length === 0;
|
|
987
|
-
if (validWinner && pick !== null && pickedSubject !== undefined) {
|
|
990
|
+
if (validWinner && pick !== null && pickedSubject !== undefined && pickedBranch !== null) {
|
|
988
991
|
draft = {
|
|
989
992
|
group: record.group,
|
|
990
993
|
topology: "compete",
|
|
@@ -996,7 +999,7 @@ function recoverPendingGateEvidence(deps: DispatchToolDeps): void {
|
|
|
996
999
|
winner: {
|
|
997
1000
|
index: pick,
|
|
998
1001
|
subject: pickedSubject,
|
|
999
|
-
branch:
|
|
1002
|
+
branch: pickedBranch,
|
|
1000
1003
|
},
|
|
1001
1004
|
};
|
|
1002
1005
|
} else {
|
|
@@ -1255,10 +1258,14 @@ async function runCompete(
|
|
|
1255
1258
|
// every branch and worktree created below is covered by finalization.
|
|
1256
1259
|
ownership = claimCompeteGroup(requestedRoot, group);
|
|
1257
1260
|
const root = ownership.root;
|
|
1258
|
-
const createCandidate = deps.competeWorktrees?.createCandidate ?? createCandidateWorktree;
|
|
1259
1261
|
for (let index = 1; index <= compete.candidates; index += 1) {
|
|
1260
1262
|
throwIfStopped();
|
|
1261
|
-
|
|
1263
|
+
const customCreate = deps.competeWorktrees?.createCandidate;
|
|
1264
|
+
worktrees.push(
|
|
1265
|
+
await (customCreate
|
|
1266
|
+
? customCreate(ownership, index, "HEAD")
|
|
1267
|
+
: createCandidateWorktreeMapped(ownership, index, "HEAD", deps.competeWorktrees?.mux)),
|
|
1268
|
+
);
|
|
1262
1269
|
}
|
|
1263
1270
|
|
|
1264
1271
|
if (timeoutMs !== undefined) {
|
|
@@ -1287,7 +1294,12 @@ async function runCompete(
|
|
|
1287
1294
|
executionRole: "builder",
|
|
1288
1295
|
cwd: worktree.path,
|
|
1289
1296
|
protectedArtifactRemap: { sourceRoot: root, workerRoot: worktree.path },
|
|
1290
|
-
gate: {
|
|
1297
|
+
gate: {
|
|
1298
|
+
role: "candidate",
|
|
1299
|
+
group,
|
|
1300
|
+
cycle: worktree.index,
|
|
1301
|
+
...(worktree.provenance ? { worktree: worktree.provenance } : {}),
|
|
1302
|
+
},
|
|
1291
1303
|
ledger,
|
|
1292
1304
|
competeStance: COMPETE_STANCES[(worktree.index - 1) % COMPETE_STANCES.length] as CompeteStance,
|
|
1293
1305
|
};
|
|
@@ -1523,7 +1535,7 @@ async function runCompete(
|
|
|
1523
1535
|
for (const worktree of worktrees) {
|
|
1524
1536
|
if (worktree.index === winnerAtFinalization.index) continue;
|
|
1525
1537
|
try {
|
|
1526
|
-
|
|
1538
|
+
await removeCandidateWorktreeMapped(ownership, worktree, true, deps.competeWorktrees?.mux);
|
|
1527
1539
|
} catch (err) {
|
|
1528
1540
|
finalizationErrors.push(err);
|
|
1529
1541
|
}
|
|
@@ -1540,8 +1552,13 @@ async function runCompete(
|
|
|
1540
1552
|
finalizationErrors.push(err);
|
|
1541
1553
|
}
|
|
1542
1554
|
try {
|
|
1555
|
+
if (deps.competeWorktrees?.mux) {
|
|
1556
|
+
for (const worktree of worktrees) {
|
|
1557
|
+
await removeCandidateWorktreeMapped(ownership, worktree, true, deps.competeWorktrees.mux);
|
|
1558
|
+
}
|
|
1559
|
+
}
|
|
1543
1560
|
const cleanupGroup = deps.competeWorktrees?.cleanupGroup ?? cleanupCompeteGroup;
|
|
1544
|
-
cleanupGroup(ownership);
|
|
1561
|
+
await cleanupGroup(ownership);
|
|
1545
1562
|
} catch (err) {
|
|
1546
1563
|
finalizationErrors.push(err);
|
|
1547
1564
|
}
|
|
@@ -1584,9 +1601,12 @@ function runApplyWinner(
|
|
|
1584
1601
|
};
|
|
1585
1602
|
}
|
|
1586
1603
|
const branch = input.branch;
|
|
1587
|
-
const match = /^clio\/compete\/([A-Za-z0-9][A-Za-z0-9._-]{0,127})\/([1-9]\d*)$/.exec(branch);
|
|
1604
|
+
const match = /^(?:clio-coder|clio)\/compete\/([A-Za-z0-9][A-Za-z0-9._-]{0,127})\/([1-9]\d*)$/.exec(branch);
|
|
1588
1605
|
if (!match) {
|
|
1589
|
-
return {
|
|
1606
|
+
return {
|
|
1607
|
+
kind: "error",
|
|
1608
|
+
message: "dispatch: apply_winner.branch must be a clio-coder/compete/<group>/<n> branch",
|
|
1609
|
+
};
|
|
1590
1610
|
}
|
|
1591
1611
|
const group = match[1] ?? "";
|
|
1592
1612
|
const winnerIndex = Number.parseInt(match[2] ?? "", 10);
|
|
@@ -1885,6 +1905,13 @@ async function runCouncil(
|
|
|
1885
1905
|
executionRole: "researcher",
|
|
1886
1906
|
autonomy: "read-only",
|
|
1887
1907
|
toolProfile: "council-read-only",
|
|
1908
|
+
// Admission already demoted the caller's declared write roots to
|
|
1909
|
+
// read roots for every planned member, and the resolved-plan pin
|
|
1910
|
+
// below carries that narrowed intent in. Repeat it here so the
|
|
1911
|
+
// no-plan fallback path lands on the same request: a member spread
|
|
1912
|
+
// from `base` would otherwise inherit a write scope its read-only
|
|
1913
|
+
// autonomy cannot grant, and the two paths would disagree.
|
|
1914
|
+
...(base.intent === undefined ? {} : { intent: narrowDispatchIntentToReadOnly(base.intent) }),
|
|
1888
1915
|
// A vote is a majority over the members' verdict fields, so a vote
|
|
1889
1916
|
// council asks each member for one and seals the ballot it asked
|
|
1890
1917
|
// for. The seated recipe is untouched: the ask is a task suffix and
|
|
@@ -3,7 +3,13 @@ import type { AgentSpec } from "../domains/agents/spec.js";
|
|
|
3
3
|
import type { DispatchContract, DispatchRequest } from "../domains/dispatch/contract.js";
|
|
4
4
|
import type { AgentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
|
|
5
5
|
import type { AutonomyLevel } from "../domains/safety/autonomy.js";
|
|
6
|
-
import type {
|
|
6
|
+
import type {
|
|
7
|
+
CandidateWorktree,
|
|
8
|
+
CompeteGroupOwnership,
|
|
9
|
+
CompeteMuxWorktrees,
|
|
10
|
+
cleanupCompeteGroup,
|
|
11
|
+
mergeWinnerBranch,
|
|
12
|
+
} from "./compete-worktrees.js";
|
|
7
13
|
import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
|
|
8
14
|
import type { DispatchPlanView, ResolvedDispatchPlanArtifact } from "./dispatch-plan.js";
|
|
9
15
|
import type { DispatchRunEventRegistry } from "./dispatch-run-events.js";
|
|
@@ -83,9 +89,15 @@ export interface DispatchToolDeps {
|
|
|
83
89
|
background?: DispatchBackgroundRegistry;
|
|
84
90
|
/** Optional compete storage overrides for alternate backends and deterministic fault tests. */
|
|
85
91
|
competeWorktrees?: {
|
|
86
|
-
createCandidate?:
|
|
87
|
-
|
|
92
|
+
createCandidate?: (
|
|
93
|
+
ownership: CompeteGroupOwnership,
|
|
94
|
+
index: number,
|
|
95
|
+
baseline: string,
|
|
96
|
+
) => CandidateWorktree | Promise<CandidateWorktree>;
|
|
97
|
+
cleanupGroup?: (...args: Parameters<typeof cleanupCompeteGroup>) => void | Promise<void>;
|
|
88
98
|
mergeWinner?: typeof mergeWinnerBranch;
|
|
99
|
+
/** Optional herdr route; every operation retains native Git fallback. */
|
|
100
|
+
mux?: CompeteMuxWorktrees;
|
|
89
101
|
};
|
|
90
102
|
getAgentCatalog?: () => string;
|
|
91
103
|
getAgentSpecs: () => ReadonlyArray<AgentSpec>;
|
package/src/tools/dispatch.ts
CHANGED
|
@@ -80,7 +80,7 @@ const DispatchIntentSchema = Type.Object(
|
|
|
80
80
|
{
|
|
81
81
|
additionalProperties: false,
|
|
82
82
|
description:
|
|
83
|
-
"Typed repository-relative path and output intent. Verification checks are declared ids from package scripts or .clio-coder/verifiers.yaml, not shell commands.",
|
|
83
|
+
"Typed repository-relative path and output intent. Declare it on every dispatch: declared paths select the project rules that apply to them and pin worker context, and omitting it falls back to reading path-like tokens out of your task and briefing text, which can miss an applicable rule. Verification checks are declared ids from package scripts or .clio-coder/verifiers.yaml, not shell commands. In a batch, per-task intent narrows the top-level intent and is refused if it reaches outside it.",
|
|
84
84
|
},
|
|
85
85
|
);
|
|
86
86
|
|
|
@@ -252,7 +252,7 @@ export function createDispatchTool(
|
|
|
252
252
|
apply_winner: Type.Optional(
|
|
253
253
|
Type.Object(
|
|
254
254
|
{
|
|
255
|
-
branch: Type.String({ description: "Preserved winner branch: clio/compete/<group>/<n>." }),
|
|
255
|
+
branch: Type.String({ description: "Preserved winner branch: clio-coder/compete/<group>/<n>." }),
|
|
256
256
|
cwd: Type.Optional(Type.String({ description: "Repository root (default: current directory)." })),
|
|
257
257
|
},
|
|
258
258
|
{
|
package/src/tools/executables.ts
CHANGED
|
@@ -1,17 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { delimiter, join } from "node:path";
|
|
3
|
-
|
|
4
|
-
function findExecutableOnPath(name: string): string | null {
|
|
5
|
-
const pathEnv = process.env.PATH;
|
|
6
|
-
if (!pathEnv) return null;
|
|
7
|
-
for (const dir of pathEnv.split(delimiter)) {
|
|
8
|
-
if (!dir) continue;
|
|
9
|
-
const candidate = join(dir, name);
|
|
10
|
-
const stat = statSync(candidate, { throwIfNoEntry: false });
|
|
11
|
-
if (stat?.isFile() && (stat.mode & 0o111) !== 0) return candidate;
|
|
12
|
-
}
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
1
|
+
import { findExecutableOnPath, resolveToolBinary } from "../domains/toolchain/resolve.js";
|
|
15
2
|
|
|
16
3
|
export function resolveFdBinary(): string | null {
|
|
17
4
|
return findExecutableOnPath("fd") ?? findExecutableOnPath("fdfind");
|
|
@@ -20,3 +7,19 @@ export function resolveFdBinary(): string | null {
|
|
|
20
7
|
export function resolveRgBinary(): string | null {
|
|
21
8
|
return findExecutableOnPath("rg");
|
|
22
9
|
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Resolve any executable Clio might run, through the toolchain ladder.
|
|
13
|
+
*
|
|
14
|
+
* For a name in the pinned registry the answer is PATH when the copy there
|
|
15
|
+
* clears the pin's floor, then Clio's vendored copy, then null. For anything
|
|
16
|
+
* else it is a plain PATH lookup, which is what `resolveFdBinary` and
|
|
17
|
+
* `resolveRgBinary` above already do for the two search tools Clio never
|
|
18
|
+
* vendors.
|
|
19
|
+
*
|
|
20
|
+
* Callers that need to explain the answer (doctor, `clio-coder tools status`)
|
|
21
|
+
* want `resolveToolBinary` instead: this returns only the path to run.
|
|
22
|
+
*/
|
|
23
|
+
export function resolveBinary(name: string): string | null {
|
|
24
|
+
return resolveToolBinary(name).binaryPath;
|
|
25
|
+
}
|
package/src/tools/find.ts
CHANGED
|
@@ -31,12 +31,7 @@ type FindOrder = "path" | "mtime";
|
|
|
31
31
|
// Build fd's argv. Ignore semantics (hidden files, .gitignore honoring,
|
|
32
32
|
// generated-dir excludes, include_ignored) come entirely from the shared
|
|
33
33
|
// ignore policy so grep and find never disagree about tree visibility.
|
|
34
|
-
|
|
35
|
-
pattern: string,
|
|
36
|
-
searchPath: string,
|
|
37
|
-
maxResults: number,
|
|
38
|
-
includeIgnored: boolean,
|
|
39
|
-
): string[] {
|
|
34
|
+
function buildFdArgs(pattern: string, searchPath: string, maxResults: number, includeIgnored: boolean): string[] {
|
|
40
35
|
const args = ["--glob", "--color=never", ...fdIgnoreArgs(searchPath, includeIgnored)];
|
|
41
36
|
args.push("--max-results", String(maxResults));
|
|
42
37
|
let effectivePattern = pattern;
|
package/src/tools/monitor.ts
CHANGED
|
@@ -214,16 +214,16 @@ const TOOLS_MAX_BYTES = 8 * 1024;
|
|
|
214
214
|
const TOOLS_ARGUMENTS_CHARS = 160;
|
|
215
215
|
|
|
216
216
|
/**
|
|
217
|
-
* Tail event types that describe one tool call. `
|
|
217
|
+
* Tail event types that describe one tool call. `clio_coder_tool_finish` is the
|
|
218
218
|
* authoritative per-call outcome (it distinguishes a permission block from a
|
|
219
219
|
* command that ran and exited nonzero); the engine's own `tool_execution_end`
|
|
220
220
|
* is kept only when the tail recorded a detail for it, since a bare type line
|
|
221
221
|
* says nothing the finish event does not.
|
|
222
222
|
*/
|
|
223
223
|
const TOOL_CALL_EVENT_TYPES: ReadonlySet<string> = new Set([
|
|
224
|
-
"
|
|
225
|
-
"
|
|
226
|
-
"
|
|
224
|
+
"clio_coder_tool_finish",
|
|
225
|
+
"clio_coder_permission_resolved",
|
|
226
|
+
"clio_coder_permission_escalated",
|
|
227
227
|
]);
|
|
228
228
|
|
|
229
229
|
function toolCallLines(entries: ReadonlyArray<{ at: string; type: string; detail?: string }>): string[] {
|
package/src/tools/observation.ts
CHANGED
|
@@ -70,9 +70,29 @@ export const OBSERVATION_TURN_BUDGET_ENV = GUARDRAIL_ENV_VARS.observationTurnBud
|
|
|
70
70
|
const MIN_BUDGET_SLICE_BYTES = 1024;
|
|
71
71
|
const BUDGET_TRACK_LIMIT = 256;
|
|
72
72
|
|
|
73
|
+
/**
|
|
74
|
+
* How many exhausted-pool notices one turn gets before the next such call fails
|
|
75
|
+
* terminally instead of returning a retryable notice.
|
|
76
|
+
*
|
|
77
|
+
* Smoke pass 2 (G2) watched a 9B local model re-issue the identical read about
|
|
78
|
+
* twenty times against the same 208-byte notice, until the unrelated tool-call
|
|
79
|
+
* budget stopped it. The notice cannot become un-retryable by wording alone: a
|
|
80
|
+
* `kind:"ok"` result is an invitation to try again.
|
|
81
|
+
*
|
|
82
|
+
* Three is the smallest count that still lets a model learn the shape from the
|
|
83
|
+
* notice itself. The pool is shared by six OBSERVE tools, so a model that reads,
|
|
84
|
+
* then greps narrower, then lists, has spent three honest attempts at the advice
|
|
85
|
+
* the notice gives. A fourth consecutive exhausted call is evidence the advice
|
|
86
|
+
* is not landing, and it fails. Waste is bounded at four calls out of the 60-call
|
|
87
|
+
* turn budget instead of twenty.
|
|
88
|
+
*/
|
|
89
|
+
const MAX_EXHAUSTED_NOTICES_PER_TURN = 3;
|
|
90
|
+
|
|
73
91
|
interface TurnBudgetState {
|
|
74
92
|
usedBytes: number;
|
|
75
93
|
lastSeenAt: number;
|
|
94
|
+
/** Consecutive exhausted-pool short-circuits; reset by any call that got a slice. */
|
|
95
|
+
exhaustedStreak: number;
|
|
76
96
|
}
|
|
77
97
|
|
|
78
98
|
const turnBudgets = new Map<string, TurnBudgetState>();
|
|
@@ -156,7 +176,7 @@ export function reserveObservation(selfCapBytes: number, options?: ToolInvokeOpt
|
|
|
156
176
|
};
|
|
157
177
|
}
|
|
158
178
|
const limitBytes = observationTurnBudgetLimit();
|
|
159
|
-
const state = turnBudgets.get(key) ?? { usedBytes: 0, lastSeenAt: Date.now() };
|
|
179
|
+
const state = turnBudgets.get(key) ?? { usedBytes: 0, lastSeenAt: Date.now(), exhaustedStreak: 0 };
|
|
160
180
|
state.lastSeenAt = Date.now();
|
|
161
181
|
turnBudgets.set(key, state);
|
|
162
182
|
pruneBudgetMap();
|
|
@@ -174,6 +194,9 @@ export function reserveObservation(selfCapBytes: number, options?: ToolInvokeOpt
|
|
|
174
194
|
settled: false,
|
|
175
195
|
};
|
|
176
196
|
}
|
|
197
|
+
// A call that got a slice is progress, so the exhausted streak starts over.
|
|
198
|
+
// Only an unbroken run of short-circuits reaches the terminal failure.
|
|
199
|
+
state.exhaustedStreak = 0;
|
|
177
200
|
const callCapBytes = Math.min(selfCapBytes, remaining);
|
|
178
201
|
return {
|
|
179
202
|
key,
|
|
@@ -203,6 +226,7 @@ export function commitObservationReservation(reservation: ObservationReservation
|
|
|
203
226
|
const state = turnBudgets.get(reservation.key) ?? {
|
|
204
227
|
usedBytes: reservation.usedBeforeBytes,
|
|
205
228
|
lastSeenAt: Date.now(),
|
|
229
|
+
exhaustedStreak: 0,
|
|
206
230
|
};
|
|
207
231
|
state.usedBytes += reservation.callCapBytes;
|
|
208
232
|
state.lastSeenAt = Date.now();
|
|
@@ -237,6 +261,7 @@ function recordSpentBytes(reservation: ObservationReservation, bytes: number): v
|
|
|
237
261
|
const state = turnBudgets.get(reservation.key) ?? {
|
|
238
262
|
usedBytes: reservation.usedBeforeBytes + committedBytes,
|
|
239
263
|
lastSeenAt: Date.now(),
|
|
264
|
+
exhaustedStreak: 0,
|
|
240
265
|
};
|
|
241
266
|
state.usedBytes = Math.max(0, state.usedBytes + bytes - committedBytes);
|
|
242
267
|
state.lastSeenAt = Date.now();
|
|
@@ -252,10 +277,26 @@ function budgetDetails(reservation: ObservationReservation): ObservationBudgetDe
|
|
|
252
277
|
};
|
|
253
278
|
}
|
|
254
279
|
|
|
280
|
+
/** Count this short-circuit against the turn's run of them. Untracked calls never escalate. */
|
|
281
|
+
function bumpExhaustedStreak(key: string | null): number {
|
|
282
|
+
if (key === null) return 1;
|
|
283
|
+
const state = turnBudgets.get(key);
|
|
284
|
+
if (state === undefined) return 1;
|
|
285
|
+
state.exhaustedStreak += 1;
|
|
286
|
+
state.lastSeenAt = Date.now();
|
|
287
|
+
turnBudgets.set(key, state);
|
|
288
|
+
return state.exhaustedStreak;
|
|
289
|
+
}
|
|
290
|
+
|
|
255
291
|
/**
|
|
256
292
|
* Structured result for a call that found the turn pool already spent.
|
|
257
293
|
* `subject` names what the call was about (a path, a pattern); `hint` names
|
|
258
294
|
* the narrowing arguments the tool supports.
|
|
295
|
+
*
|
|
296
|
+
* The first few such calls get the notice, which states the numbers and the
|
|
297
|
+
* narrowing advice. Past MAX_EXHAUSTED_NOTICES_PER_TURN the call fails instead:
|
|
298
|
+
* nothing this turn can return content, so an `ok` result is an invitation to a
|
|
299
|
+
* retry loop the pool can never satisfy.
|
|
259
300
|
*/
|
|
260
301
|
export function observationBudgetExhausted(input: {
|
|
261
302
|
tool: string;
|
|
@@ -265,9 +306,18 @@ export function observationBudgetExhausted(input: {
|
|
|
265
306
|
hint: string;
|
|
266
307
|
}): ToolResult {
|
|
267
308
|
const { tool, unit, reservation, subject, hint } = input;
|
|
268
|
-
const
|
|
269
|
-
|
|
270
|
-
|
|
309
|
+
const streak = bumpExhaustedStreak(reservation.key);
|
|
310
|
+
const spent = `${formatSize(reservation.usedBeforeBytes)} already returned of ${formatSize(reservation.limitBytes)}`;
|
|
311
|
+
if (streak > MAX_EXHAUSTED_NOTICES_PER_TURN) {
|
|
312
|
+
const message =
|
|
313
|
+
`observation budget exhausted for this turn before ${tool} ${subject}: ${spent}. ` +
|
|
314
|
+
`This is the ${streak}th call to hit it, so no observation tool can return content until the ` +
|
|
315
|
+
`next turn. Do not retry this call and do not substitute another one. Re-plan with what you ` +
|
|
316
|
+
`already have: say what you found, name what is still unread, and propose the next step.`;
|
|
317
|
+
recordSpentBytes(reservation, byteLength(message));
|
|
318
|
+
return { kind: "error", message };
|
|
319
|
+
}
|
|
320
|
+
const output = `[observation budget exhausted for this turn before ${tool} ${subject}: ${spent}. ${hint}]`;
|
|
271
321
|
const shownBytes = byteLength(output);
|
|
272
322
|
recordSpentBytes(reservation, shownBytes);
|
|
273
323
|
const budget = budgetDetails(reservation);
|
package/src/tools/observers.ts
CHANGED
|
@@ -44,39 +44,6 @@ export interface FileMutationEvent {
|
|
|
44
44
|
toolName: string;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
/**
|
|
48
|
-
* Defers file-mutation sinks off the after_tool hot path and coalesces rapid
|
|
49
|
-
* events into one best-effort batch. Lifecycle-owned sinks that must drain at
|
|
50
|
-
* shutdown should admit work synchronously instead of using this convenience.
|
|
51
|
-
*/
|
|
52
|
-
export function coalescePathSink(sink: (paths: string[]) => void): (event: FileMutationEvent) => void {
|
|
53
|
-
const pending = new Set<string>();
|
|
54
|
-
let flushScheduled = false;
|
|
55
|
-
|
|
56
|
-
const scheduleFlush = (): void => {
|
|
57
|
-
if (flushScheduled) return;
|
|
58
|
-
flushScheduled = true;
|
|
59
|
-
setImmediate(() => {
|
|
60
|
-
flushScheduled = false;
|
|
61
|
-
if (pending.size === 0) return;
|
|
62
|
-
const paths = [...pending];
|
|
63
|
-
pending.clear();
|
|
64
|
-
try {
|
|
65
|
-
sink(paths);
|
|
66
|
-
} catch {
|
|
67
|
-
// Incremental indexing is best-effort and must not change tool execution.
|
|
68
|
-
}
|
|
69
|
-
if (pending.size > 0) scheduleFlush();
|
|
70
|
-
});
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
return (event) => {
|
|
74
|
-
if (event.paths.length === 0) return;
|
|
75
|
-
for (const path of event.paths) pending.add(path);
|
|
76
|
-
scheduleFlush();
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
47
|
/** Notifies the caller after a successful file-mutating tool, for incremental indexing. */
|
|
81
48
|
export function createFileMutationObserver(sink: (event: FileMutationEvent) => void): MiddlewareHookRegistration {
|
|
82
49
|
return {
|