@iowarp/clio-coder 0.3.9 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +92 -0
- package/NOTICE +33 -0
- package/README.md +121 -16
- package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
- package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
- package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
- package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
- package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
- package/dist/chunk-5YHDIDBP.js +97 -0
- package/dist/chunk-6CCS4G3W.js +1529 -0
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
- package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/chunk-6NJQITNH.js +1412 -0
- package/dist/chunk-6VC4OV3Z.js +365 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
- package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
- package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
- package/dist/chunk-7RY5VZPH.js +573 -0
- package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
- package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
- package/dist/chunk-BJGUKIG4.js +302 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
- package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/chunk-D4CJV46V.js +462 -0
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GIZNH63R.js +40 -0
- package/dist/chunk-GPPB3JBE.js +688 -0
- package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/chunk-HRQMFLJP.js +75 -0
- package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
- package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
- package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
- package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
- package/dist/chunk-J4HBWF6Y.js +2635 -0
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
- package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
- package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
- package/dist/chunk-K6BF4U2H.js +1785 -0
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
- package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
- package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
- package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
- package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
- package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/chunk-RKSR6VSF.js +132 -0
- package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
- package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
- package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
- package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
- package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
- package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
- package/dist/chunk-WR6U3OVP.js +45 -0
- package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
- package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/chunk-YAKGTXEV.js +17 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
- package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
- package/dist/cli/index.js +48 -37
- package/dist/clio-IT3G3VQH.js +25 -0
- package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
- package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
- package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
- package/dist/configure-FL7Y3KJF.js +54 -0
- package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
- package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
- package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
- package/dist/eval-inventory-HBWSWQOK.js +315 -0
- package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
- package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
- package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
- package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
- package/dist/fleet-decisions-OTHB6KRL.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
- package/dist/fleet-inspect-SS6YMDCK.js +445 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
- package/dist/fleet-verify-QD5M7E7Q.js +178 -0
- package/dist/fleet-view-WAMJYNDT.js +94 -0
- package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
- package/dist/install-NKNG7KD4.js +13 -0
- package/dist/interop-34TVO25M.js +116 -0
- package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
- package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
- package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
- package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
- package/dist/panes-7STHOAUJ.js +103 -0
- package/dist/panes-SHAUIRXY.js +60 -0
- package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
- package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
- package/dist/resources-74GKTLSF.js +115 -0
- package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
- package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
- package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
- package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
- package/dist/skills-inventory-J357J34F.js +129 -0
- package/dist/slash-commands-JZZCQA32.js +79 -0
- package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
- package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
- package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
- package/dist/tools-MKNWVPBH.js +29 -0
- package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
- package/dist/tui-primitives-K5PASC3O.js +17 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
- package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
- package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
- package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
- package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
- package/dist/with-panes-OBOBFIIR.js +818 -0
- package/dist/worker/entry.js +131 -91
- package/docs/README.md +3 -2
- package/docs/acp.md +25 -4
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +4 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +39 -4
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +138 -167
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +3 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +30 -7
- package/docs/installation-and-lifecycle.md +16 -3
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +16 -11
- package/docs/troubleshooting.md +2 -2
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.md +1 -1
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +8 -16
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +8 -4
- package/src/cli/argv.ts +25 -0
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +50 -48
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +156 -0
- package/src/cli/doctor-toolchain.ts +78 -0
- package/src/cli/doctor.ts +34 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +827 -0
- package/src/cli/fleet.ts +154 -40
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +6 -3
- package/src/cli/run.ts +67 -13
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +23 -24
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +64 -2
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +347 -0
- package/src/cli/verifiers.ts +9 -0
- package/src/cli/wiki-generate.ts +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +4 -0
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1070 -845
- package/src/core/defaults.ts +342 -463
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/response-schema.ts +44 -4
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/theme-token-hex.ts +43 -0
- package/src/core/timers.ts +2 -12
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +165 -36
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +37 -46
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +48 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capacity-lease.ts +23 -6
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +287 -111
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +59 -3
- package/src/domains/dispatch/gate-decisions.ts +36 -15
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +24 -27
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +599 -0
- package/src/domains/dispatch/state.ts +45 -1
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +16 -3
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/inventory.ts +113 -0
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/serving.ts +31 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +12 -2
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/evidence/store.ts +6 -0
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +20 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/index.ts +0 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +566 -0
- package/src/domains/mux/detect.ts +182 -0
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +53 -0
- package/src/domains/mux/index.ts +116 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +192 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +62 -0
- package/src/domains/mux/socket-client.ts +964 -0
- package/src/domains/mux/types.ts +265 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +182 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +251 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/cost.ts +21 -0
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/index.ts +2 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +63 -11
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +25 -8
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +46 -2
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +72 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/action-classifier.ts +6 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/share/archive.ts +85 -36
- package/src/domains/toolchain/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +440 -96
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +20 -2
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +87 -0
- package/src/engine/claude/sdk-runtime.ts +25 -17
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/loop-guard.ts +0 -5
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +16 -26
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +207 -90
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +2 -1
- package/src/interactive/cost-overlay.ts +3 -1
- package/src/interactive/council-grid.ts +3 -5
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +56 -49
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +2 -44
- package/src/interactive/interactive-application.ts +229 -62
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +9 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +99 -23
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +3 -2
- package/src/interactive/modal-marker.ts +151 -0
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +62 -14
- package/src/interactive/overlay-general-openers.ts +7 -2
- package/src/interactive/overlay-key-routing.ts +21 -10
- package/src/interactive/overlay-lifecycle.ts +20 -4
- package/src/interactive/overlay-model-selectors.ts +43 -6
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +3 -2
- package/src/interactive/overlays/ask-user.ts +161 -41
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +29 -4
- package/src/interactive/overlays/cwd-fallback.ts +29 -4
- package/src/interactive/overlays/decisions.ts +15 -13
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +4 -3
- package/src/interactive/overlays/handoff-review.ts +3 -2
- package/src/interactive/overlays/help-reference.ts +2 -0
- package/src/interactive/overlays/interop.ts +2 -1
- package/src/interactive/overlays/library-install-confirm.ts +2 -1
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +2 -1
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +40 -31
- package/src/interactive/overlays/prompts.ts +11 -4
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +849 -268
- package/src/interactive/overlays/side-question.ts +3 -2
- package/src/interactive/overlays/skills-hub.ts +11 -19
- package/src/interactive/overlays/tree-selector.ts +3 -2
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +318 -0
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +521 -189
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +21 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +58 -13
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +120 -9
- package/src/interactive/view/view-overlay.ts +14 -10
- package/src/interactive/watch-pane.ts +180 -0
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +11 -5
- package/src/interactive/worker-receipts.ts +20 -2
- package/src/interactive/worker-stream.ts +6 -4
- package/src/interactive/yazi-bridge.ts +451 -0
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +16 -1
- package/src/tools/compete-worktrees.ts +108 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +18 -5
- package/src/tools/dispatch-arguments.ts +21 -21
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +145 -28
- package/src/tools/dispatch-runner.ts +40 -13
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +2 -2
- package/src/tools/executables.ts +17 -14
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +54 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-PNY46YEY.js +0 -1581
- package/dist/chunk-XDOQXGFO.js +0 -515
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/clio-LT5V7SSZ.js +0 -26
- package/dist/configure-2WYWSCSD.js +0 -49
- package/dist/doctor-TWBWFK5V.js +0 -165
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
package/src/tools/bootstrap.ts
CHANGED
|
@@ -3,13 +3,16 @@ import type { SafeEventBus } from "../core/event-bus.js";
|
|
|
3
3
|
import type { AgentSpec } from "../domains/agents/spec.js";
|
|
4
4
|
import type { DispatchContract } from "../domains/dispatch/contract.js";
|
|
5
5
|
import type { AgentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
|
|
6
|
+
import type { PanesOperations } from "../domains/mux/operations.js";
|
|
6
7
|
import type { AutonomyLevel } from "../domains/safety/autonomy.js";
|
|
7
8
|
import { builtin, toolPromptHintsForNames } from "./builtin-tool-catalog.js";
|
|
9
|
+
import type { CompeteMuxWorktrees } from "./compete-worktrees.js";
|
|
8
10
|
import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreTools } from "./core-bootstrap.js";
|
|
9
11
|
import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
|
|
10
12
|
import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
|
|
11
13
|
import { lazyTool } from "./lazy-tool.js";
|
|
12
14
|
import { monitorToolSurface } from "./monitor-surface.js";
|
|
15
|
+
import { panesToolSurface } from "./panes-surface.js";
|
|
13
16
|
import type { ToolRegistry } from "./registry.js";
|
|
14
17
|
import { steerToolSurface } from "./steer-surface.js";
|
|
15
18
|
|
|
@@ -25,6 +28,13 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
|
|
|
25
28
|
getCostCeilingUsd?: () => number;
|
|
26
29
|
getWorkerRosters?: () => WorkerRosters;
|
|
27
30
|
dispatchBackground?: DispatchBackgroundRegistry;
|
|
31
|
+
/** Optional herdr worktree lifecycle for compete candidates. */
|
|
32
|
+
competeMuxWorktrees?: CompeteMuxWorktrees;
|
|
33
|
+
/**
|
|
34
|
+
* Pane operations. Present only when a pane host answered detection, which
|
|
35
|
+
* is what keeps the `panes` tool out of the prompt on a machine with none.
|
|
36
|
+
*/
|
|
37
|
+
panes?: PanesOperations;
|
|
28
38
|
}
|
|
29
39
|
|
|
30
40
|
/**
|
|
@@ -36,7 +46,11 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
36
46
|
const registration = registerCoreTools(registry, deps);
|
|
37
47
|
if (deps.dispatch) {
|
|
38
48
|
const dispatch = deps.dispatch;
|
|
39
|
-
|
|
49
|
+
// Display tail only. In a composed process the dispatch domain writes the
|
|
50
|
+
// durable journal off its own progress channel, which covers every run
|
|
51
|
+
// rather than only the ones the model dispatched through this tool, so a
|
|
52
|
+
// second sink here would transcribe a tool-path run twice.
|
|
53
|
+
const dispatchRunEvents = createDispatchRunEventRegistry({ journal: null });
|
|
40
54
|
const dispatchToolDeps = {
|
|
41
55
|
dispatch,
|
|
42
56
|
runEvents: dispatchRunEvents,
|
|
@@ -48,6 +62,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
48
62
|
...(deps.getCostCeilingUsd ? { getCostCeilingUsd: deps.getCostCeilingUsd } : {}),
|
|
49
63
|
...(deps.getWorkerRosters ? { getWorkerRosters: deps.getWorkerRosters } : {}),
|
|
50
64
|
...(deps.dispatchBackground ? { background: deps.dispatchBackground } : {}),
|
|
65
|
+
...(deps.competeMuxWorktrees ? { competeWorktrees: { mux: deps.competeMuxWorktrees } } : {}),
|
|
51
66
|
};
|
|
52
67
|
registry.register({
|
|
53
68
|
...builtin(createDispatchTool(dispatchToolDeps), {
|
|
@@ -76,5 +91,14 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
|
|
|
76
91
|
),
|
|
77
92
|
});
|
|
78
93
|
}
|
|
79
|
-
|
|
94
|
+
if (deps.panes) {
|
|
95
|
+
const panes = deps.panes;
|
|
96
|
+
registry.register({
|
|
97
|
+
...builtin(
|
|
98
|
+
lazyTool(panesToolSurface, async () => (await import("./panes.js")).createPanesTool({ panes })),
|
|
99
|
+
{ path: "src/tools/panes.ts", scope: "core" },
|
|
100
|
+
),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
assertRegisteredBuiltinTools(registry, registration, Boolean(deps.dispatch), Boolean(deps.panes));
|
|
80
104
|
}
|
|
@@ -95,7 +95,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
95
95
|
),
|
|
96
96
|
costLatency: "local_fast",
|
|
97
97
|
promptHint:
|
|
98
|
-
'Call context with scope="skills" to list installed and marketplace skills; when one matches the task, or the operator names a skill or asks how one works, suggest the operator run /skill <name> (a marketplace skill is offered for install) and never load it uninvited. When the user message carries a skill request, first load that skill via context (scope="skills", name=<skill>) before doing anything else. When an [evicted ...] marker names content you need, recall it with context(scope="recall", ref=...); re-read the file only when the marker says it changed.',
|
|
98
|
+
'Call context with scope="skills" to list installed and marketplace skills; when one matches the task, or the operator names a skill or asks how one works, suggest the operator run /skill <name> (a marketplace skill is offered for install) and never load it uninvited; a [Marketplace] reminder naming an uninstalled skill may instead be offered through ask_user with its exact options, and the harness performs any install. When the user message carries a skill request, first load that skill via context (scope="skills", name=<skill>) before doing anything else. When an [evicted ...] marker names content you need, recall it with context(scope="recall", ref=...); re-read the file only when the marker says it changed.',
|
|
99
99
|
},
|
|
100
100
|
[ToolNames.CredentialPresent]: {
|
|
101
101
|
objective: "Check whether a credential key is present without returning its value.",
|
|
@@ -213,6 +213,21 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
213
213
|
},
|
|
214
214
|
costLatency: "local_fast",
|
|
215
215
|
},
|
|
216
|
+
[ToolNames.Panes]: {
|
|
217
|
+
objective: "Focus, open, close, and inventory the terminal panes Clio owns beside this session.",
|
|
218
|
+
uiLabel: "Panes",
|
|
219
|
+
// show and list land on the same state twice; open starts a second pane
|
|
220
|
+
// and close is a no-op the second time, so the surface as a whole is not.
|
|
221
|
+
retrySafety: "not_retry_safe",
|
|
222
|
+
resultSizePolicy: {
|
|
223
|
+
kind: "exact",
|
|
224
|
+
maxBytes: 8_192,
|
|
225
|
+
followUpHint: 'Call panes with action="list" to re-read the pane inventory.',
|
|
226
|
+
},
|
|
227
|
+
costLatency: "local_fast",
|
|
228
|
+
promptHint:
|
|
229
|
+
'When the operator asks to see a dispatched agent ("show me the tester"), call panes with action="show" and the agent id. Utility panes are presets only; an arbitrary command is the operator\'s own /panes open.',
|
|
230
|
+
},
|
|
216
231
|
// RETRIEVE: network-class.
|
|
217
232
|
[ToolNames.WebFetch]: {
|
|
218
233
|
objective: "Fetch HTTP(S) text for explicit external research.",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Scratch git worktrees for the compete dispatch topology.
|
|
3
3
|
*
|
|
4
4
|
* Each candidate builds in its own worktree on its own branch
|
|
5
|
-
* (`clio/compete/<group>/<n>`), created from the repository HEAD under
|
|
5
|
+
* (`clio-coder/compete/<group>/<n>`), created from the repository HEAD under
|
|
6
6
|
* `<root>/.clio-coder/worktrees/<group>/candidate-<n>`. The path sits inside the
|
|
7
7
|
* project root because remote fleet nodes share the filesystem and doctor
|
|
8
8
|
* preflight verifies path parity only for the project root; `.clio-coder/` is
|
|
@@ -34,7 +34,7 @@ import {
|
|
|
34
34
|
} from "node:fs";
|
|
35
35
|
import { hostname } from "node:os";
|
|
36
36
|
import { join, relative, resolve } from "node:path";
|
|
37
|
-
import type { RunKind } from "../domains/dispatch/types.js";
|
|
37
|
+
import type { RunGateWorktreeProvenance, RunKind } from "../domains/dispatch/types.js";
|
|
38
38
|
import {
|
|
39
39
|
commitWorktreePath,
|
|
40
40
|
isCanonicalWorktreePathInside,
|
|
@@ -47,6 +47,24 @@ export interface CandidateWorktree {
|
|
|
47
47
|
index: number;
|
|
48
48
|
branch: string;
|
|
49
49
|
path: string;
|
|
50
|
+
provenance?: RunGateWorktreeProvenance;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Narrow mux surface used by compete; the native functions remain usable alone. */
|
|
54
|
+
export interface CompeteMuxWorktrees {
|
|
55
|
+
available(): boolean;
|
|
56
|
+
worktreeCreate(request: {
|
|
57
|
+
cwd: string;
|
|
58
|
+
branch: string;
|
|
59
|
+
base: string;
|
|
60
|
+
path: string;
|
|
61
|
+
label: string;
|
|
62
|
+
focus: boolean;
|
|
63
|
+
}): Promise<{
|
|
64
|
+
workspaceId: string;
|
|
65
|
+
worktree: { path: string; branch: string | null };
|
|
66
|
+
} | null>;
|
|
67
|
+
worktreeRemove(workspaceId: string, options?: { force?: boolean }): Promise<boolean>;
|
|
50
68
|
}
|
|
51
69
|
|
|
52
70
|
export type CompeteGroupState = "active" | "cleanup-ready" | "winner-preserved";
|
|
@@ -109,8 +127,9 @@ export interface CompeteRunAdmission {
|
|
|
109
127
|
|
|
110
128
|
const COMPETE_PARENT_SEGMENTS = [".clio-coder", "worktrees"] as const;
|
|
111
129
|
const COMPETE_MANIFEST_FILE = ".clio-coder-compete-owner.json";
|
|
112
|
-
const COMPETE_MANIFEST_KIND = "clio-compete-group";
|
|
113
|
-
const
|
|
130
|
+
const COMPETE_MANIFEST_KIND = "clio-coder-compete-group";
|
|
131
|
+
const LEGACY_COMPETE_MANIFEST_KIND = "clio-compete-group";
|
|
132
|
+
const COMPETE_COMMIT_IDENTITY = "clio-coder-compete";
|
|
114
133
|
|
|
115
134
|
const SAFE_GROUP = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
116
135
|
const PROCESS_EXIT_GRACE_MS = 750;
|
|
@@ -306,7 +325,7 @@ function isCanonicalDirectoryAt(path: string): boolean {
|
|
|
306
325
|
* `relative()` makes the decision by path segment, so `/group-a2` can never
|
|
307
326
|
* be mistaken for a child of `/group-a` as it can with textual startsWith.
|
|
308
327
|
*/
|
|
309
|
-
|
|
328
|
+
function isCanonicalPathInside(parent: string, candidate: string): boolean {
|
|
310
329
|
return isCanonicalWorktreePathInside(parent, candidate);
|
|
311
330
|
}
|
|
312
331
|
|
|
@@ -315,7 +334,7 @@ function manifestFromUnknown(value: unknown): CompeteGroupManifest | null {
|
|
|
315
334
|
const manifest = value as Record<string, unknown>;
|
|
316
335
|
if (
|
|
317
336
|
manifest.version !== 2 ||
|
|
318
|
-
manifest.kind !== COMPETE_MANIFEST_KIND ||
|
|
337
|
+
(manifest.kind !== COMPETE_MANIFEST_KIND && manifest.kind !== LEGACY_COMPETE_MANIFEST_KIND) ||
|
|
319
338
|
typeof manifest.root !== "string" ||
|
|
320
339
|
typeof manifest.group !== "string" ||
|
|
321
340
|
typeof manifest.token !== "string" ||
|
|
@@ -399,10 +418,14 @@ export function isGitRepository(root: string): boolean {
|
|
|
399
418
|
}
|
|
400
419
|
}
|
|
401
420
|
|
|
402
|
-
function competeBranch(group: string, index: number): string {
|
|
421
|
+
function competeBranch(group: string, index: number, legacy = false): string {
|
|
403
422
|
validateGroup(group);
|
|
404
423
|
if (!Number.isInteger(index) || index < 1) throw new Error(`invalid compete candidate index ${index}`);
|
|
405
|
-
return
|
|
424
|
+
return `${legacy ? "clio" : "clio-coder"}/compete/${group}/${index}`;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
function competeBranchMatches(branch: string, group: string, index: number): boolean {
|
|
428
|
+
return branch === competeBranch(group, index) || branch === competeBranch(group, index, true);
|
|
406
429
|
}
|
|
407
430
|
|
|
408
431
|
/** Claim the group before creating a branch or candidate worktree. */
|
|
@@ -531,19 +554,61 @@ export function markCompeteGroupWinnerPreserved(
|
|
|
531
554
|
* baseline is a parameter rather than HEAD so every candidate in a compete
|
|
532
555
|
* transaction starts from the same approved state.
|
|
533
556
|
*/
|
|
534
|
-
|
|
557
|
+
function createCandidateWorktree(ownership: CompeteGroupOwnership, index: number, baseline: string): CandidateWorktree {
|
|
558
|
+
assertOwnership(ownership);
|
|
559
|
+
const branch = competeBranch(ownership.group, index);
|
|
560
|
+
const path = join(ownership.directory, `candidate-${index}`);
|
|
561
|
+
if (!isCanonicalPathInside(ownership.directory, path)) {
|
|
562
|
+
throw new Error(`candidate ${index} path escapes compete group ${ownership.group}`);
|
|
563
|
+
}
|
|
564
|
+
git(ownership.root, ["worktree", "add", "-b", branch, path, baseline]);
|
|
565
|
+
return { index, branch, path };
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
/**
|
|
569
|
+
* Prefer herdr's worktree lifecycle while preserving Git as the recovery
|
|
570
|
+
* authority. A failed or vanished mux is deliberately indistinguishable from
|
|
571
|
+
* no mux to the caller except for the receipt provenance returned here.
|
|
572
|
+
*/
|
|
573
|
+
export async function createCandidateWorktreeMapped(
|
|
535
574
|
ownership: CompeteGroupOwnership,
|
|
536
575
|
index: number,
|
|
537
576
|
baseline: string,
|
|
538
|
-
|
|
577
|
+
mux?: CompeteMuxWorktrees,
|
|
578
|
+
): Promise<CandidateWorktree> {
|
|
539
579
|
assertOwnership(ownership);
|
|
540
580
|
const branch = competeBranch(ownership.group, index);
|
|
541
581
|
const path = join(ownership.directory, `candidate-${index}`);
|
|
542
582
|
if (!isCanonicalPathInside(ownership.directory, path)) {
|
|
543
583
|
throw new Error(`candidate ${index} path escapes compete group ${ownership.group}`);
|
|
544
584
|
}
|
|
545
|
-
|
|
546
|
-
|
|
585
|
+
let fallback: RunGateWorktreeProvenance["fallback"] = "mux-unavailable";
|
|
586
|
+
if (mux?.available()) {
|
|
587
|
+
const created = await mux
|
|
588
|
+
.worktreeCreate({
|
|
589
|
+
cwd: ownership.root,
|
|
590
|
+
branch,
|
|
591
|
+
base: baseline,
|
|
592
|
+
path,
|
|
593
|
+
label: `clio-coder compete ${ownership.group} candidate ${index}`,
|
|
594
|
+
focus: false,
|
|
595
|
+
})
|
|
596
|
+
.catch(() => null);
|
|
597
|
+
if (created !== null) {
|
|
598
|
+
if (resolve(created.worktree.path) !== resolve(path) || created.worktree.branch !== branch) {
|
|
599
|
+
throw new Error(`herdr created candidate ${index} at an unexpected path or branch`);
|
|
600
|
+
}
|
|
601
|
+
return {
|
|
602
|
+
index,
|
|
603
|
+
branch,
|
|
604
|
+
path,
|
|
605
|
+
provenance: { backend: "herdr", path, branch, workspaceId: created.workspaceId },
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
fallback = "mux-operation-failed";
|
|
609
|
+
}
|
|
610
|
+
const native = createCandidateWorktree(ownership, index, baseline);
|
|
611
|
+
return { ...native, provenance: { backend: "native", path, branch, fallback } };
|
|
547
612
|
}
|
|
548
613
|
|
|
549
614
|
/**
|
|
@@ -588,7 +653,7 @@ function exactGroupBranches(root: string, group: string): string[] {
|
|
|
588
653
|
const parts = branch.split("/");
|
|
589
654
|
return (
|
|
590
655
|
parts.length === 4 &&
|
|
591
|
-
parts[0] === "clio" &&
|
|
656
|
+
(parts[0] === "clio-coder" || parts[0] === "clio") &&
|
|
592
657
|
parts[1] === "compete" &&
|
|
593
658
|
parts[2] === group &&
|
|
594
659
|
/^\d+$/.test(parts[3] ?? "")
|
|
@@ -596,6 +661,16 @@ function exactGroupBranches(root: string, group: string): string[] {
|
|
|
596
661
|
});
|
|
597
662
|
}
|
|
598
663
|
|
|
664
|
+
/** Resolve a current candidate branch while retaining indefinite read support for released refs. */
|
|
665
|
+
export function competeBranchForCandidate(root: string, group: string, index: number): string {
|
|
666
|
+
const branches = exactGroupBranches(root, group);
|
|
667
|
+
return (
|
|
668
|
+
branches.find((branch) => branch === competeBranch(group, index)) ??
|
|
669
|
+
branches.find((branch) => branch === competeBranch(group, index, true)) ??
|
|
670
|
+
competeBranch(group, index)
|
|
671
|
+
);
|
|
672
|
+
}
|
|
673
|
+
|
|
599
674
|
function removeRegisteredWorktree(root: string, path: string): void {
|
|
600
675
|
try {
|
|
601
676
|
git(root, ["worktree", "remove", "--force", path]);
|
|
@@ -605,17 +680,16 @@ function removeRegisteredWorktree(root: string, path: string): void {
|
|
|
605
680
|
}
|
|
606
681
|
}
|
|
607
682
|
|
|
608
|
-
|
|
683
|
+
function removeCandidateWorktree(
|
|
609
684
|
ownership: CompeteGroupOwnership,
|
|
610
685
|
worktree: CandidateWorktree,
|
|
611
686
|
deleteBranch: boolean,
|
|
612
687
|
): void {
|
|
613
688
|
assertOwnership(ownership);
|
|
614
689
|
const expectedPath = join(ownership.directory, `candidate-${worktree.index}`);
|
|
615
|
-
const expectedBranch = competeBranch(ownership.group, worktree.index);
|
|
616
690
|
if (
|
|
617
691
|
resolve(worktree.path) !== resolve(expectedPath) ||
|
|
618
|
-
worktree.branch
|
|
692
|
+
!competeBranchMatches(worktree.branch, ownership.group, worktree.index) ||
|
|
619
693
|
!isCanonicalPathInside(ownership.directory, worktree.path)
|
|
620
694
|
) {
|
|
621
695
|
throw new Error(`candidate ${worktree.index} does not belong to compete group ${ownership.group}`);
|
|
@@ -633,6 +707,23 @@ export function removeCandidateWorktree(
|
|
|
633
707
|
}
|
|
634
708
|
}
|
|
635
709
|
|
|
710
|
+
/** Remove through herdr when it owns the workspace, then verify with Git. */
|
|
711
|
+
export async function removeCandidateWorktreeMapped(
|
|
712
|
+
ownership: CompeteGroupOwnership,
|
|
713
|
+
worktree: CandidateWorktree,
|
|
714
|
+
deleteBranch: boolean,
|
|
715
|
+
mux?: CompeteMuxWorktrees,
|
|
716
|
+
): Promise<void> {
|
|
717
|
+
const workspaceId = worktree.provenance?.backend === "herdr" ? worktree.provenance.workspaceId : undefined;
|
|
718
|
+
if (workspaceId && mux?.available()) {
|
|
719
|
+
await mux.worktreeRemove(workspaceId, { force: true }).catch(() => false);
|
|
720
|
+
}
|
|
721
|
+
// This is both the native fallback after mux loss and the postcondition check
|
|
722
|
+
// after a successful RPC. It prunes an already-removed path harmlessly and
|
|
723
|
+
// removes the candidate branch, which worktree.remove does not promise to do.
|
|
724
|
+
removeCandidateWorktree(ownership, worktree, deleteBranch);
|
|
725
|
+
}
|
|
726
|
+
|
|
636
727
|
/**
|
|
637
728
|
* Merge the winning candidate branch into the current branch. Fast-forward
|
|
638
729
|
* is impossible by construction (the candidate branched from HEAD and HEAD
|
|
@@ -738,8 +829,8 @@ export function settleRecoveredCompeteDecision(
|
|
|
738
829
|
cleanupWorktreeGroup(ownership);
|
|
739
830
|
return null;
|
|
740
831
|
}
|
|
741
|
-
const winnerBranch = competeBranch(group, winnerIndex);
|
|
742
832
|
const branches = exactGroupBranches(ownership.root, group);
|
|
833
|
+
const winnerBranch = competeBranchForCandidate(ownership.root, group, winnerIndex);
|
|
743
834
|
const winnerPath = join(ownership.directory, `candidate-${winnerIndex}`);
|
|
744
835
|
if (
|
|
745
836
|
!branches.includes(winnerBranch) ||
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { type Dirent, readdirSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import type { ContextRecalledPayload } from "../../core/bus-events.js";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
SKILL_INSTALL_OFFER_OPTION_NEVER,
|
|
6
|
+
SKILL_INSTALL_OFFER_OPTION_NOT_NOW,
|
|
7
|
+
SKILL_INSTALL_OFFER_OPTION_PROJECT,
|
|
8
|
+
SKILL_INSTALL_OFFER_OPTION_USER,
|
|
9
|
+
SKILL_SUGGESTION_ANCHOR,
|
|
10
|
+
} from "../../core/skill-activation.js";
|
|
5
11
|
import { ToolNames } from "../../core/tool-names.js";
|
|
6
12
|
import { foldWorkingSet } from "../../domains/context/working-set/fold.js";
|
|
7
13
|
import {
|
|
@@ -289,6 +295,14 @@ function renderSkillsList(
|
|
|
289
295
|
"",
|
|
290
296
|
`If one skill above matches the current task, begin your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose), then continue the task in the same turn without it; only the operator can run it. If none match, do not mention skills.`,
|
|
291
297
|
);
|
|
298
|
+
if (marketplace.length > 0) {
|
|
299
|
+
// The offer protocol mirrors the marketplace-offer middleware: fixed
|
|
300
|
+
// option labels so the harness recognizes the answer, and the model
|
|
301
|
+
// never performs an install itself.
|
|
302
|
+
lines.push(
|
|
303
|
+
`When no installed skill serves the task but a marketplace skill above genuinely does, you may instead ask the operator with ask_user (mode=single_question, header "Install skill") whether to install it, offering exactly: "${SKILL_INSTALL_OFFER_OPTION_PROJECT}", "${SKILL_INSTALL_OFFER_OPTION_USER}", "${SKILL_INSTALL_OFFER_OPTION_NOT_NOW}", "${SKILL_INSTALL_OFFER_OPTION_NEVER}". The harness handles the answer and any install; never install or load a skill yourself.`,
|
|
304
|
+
);
|
|
305
|
+
}
|
|
292
306
|
return lines.join("\n");
|
|
293
307
|
}
|
|
294
308
|
|
|
@@ -184,6 +184,7 @@ export function assertRegisteredBuiltinTools(
|
|
|
184
184
|
registry: ToolRegistry,
|
|
185
185
|
registration: CoreToolRegistration,
|
|
186
186
|
includeDispatchTools: boolean,
|
|
187
|
+
includePanesTools = false,
|
|
187
188
|
): void {
|
|
188
|
-
assertBuiltinToolPolicy(registry.listAll(), { ...registration, includeDispatchTools });
|
|
189
|
+
assertBuiltinToolPolicy(registry.listAll(), { ...registration, includeDispatchTools, includePanesTools });
|
|
189
190
|
}
|
|
@@ -4,11 +4,13 @@ import type { ExecutionPlan } from "../domains/dispatch/execution-plan.js";
|
|
|
4
4
|
import { gateDeciderAgentId } from "../domains/dispatch/execution-role.js";
|
|
5
5
|
import {
|
|
6
6
|
COUNCIL_JUDGE_PROMPT,
|
|
7
|
+
COUNCIL_MAX_MEMBERS,
|
|
8
|
+
COUNCIL_MIN_MEMBERS,
|
|
7
9
|
JUDGE_GATE_PROMPT,
|
|
8
10
|
REVIEWER_GATE_PROMPT,
|
|
9
11
|
renderCouncilVoteMemberTask,
|
|
10
12
|
} from "../domains/dispatch/gate-role-prompts.js";
|
|
11
|
-
import { normalizeDispatchIntent } from "../domains/dispatch/intent.js";
|
|
13
|
+
import { narrowDispatchIntentToReadOnly, normalizeDispatchIntent } from "../domains/dispatch/intent.js";
|
|
12
14
|
import { renderDispatchReviewerTask } from "../domains/dispatch/intent-requirements.js";
|
|
13
15
|
import { approvedRouteCandidates } from "../domains/dispatch/route-approval.js";
|
|
14
16
|
import { defaultRoutingIntent } from "../domains/dispatch/routing-intent.js";
|
|
@@ -109,7 +111,9 @@ function councilSettingsFromArgs(
|
|
|
109
111
|
members.push({ label, target, ...(model ? { model } : {}), ...(thinking ? { thinking } : {}) });
|
|
110
112
|
}
|
|
111
113
|
}
|
|
112
|
-
if (members.length <
|
|
114
|
+
if (members.length < COUNCIL_MIN_MEMBERS || members.length > COUNCIL_MAX_MEMBERS) {
|
|
115
|
+
return { ok: false, message: "council_members_out_of_range" };
|
|
116
|
+
}
|
|
113
117
|
const labels = new Set<string>();
|
|
114
118
|
for (const member of members) {
|
|
115
119
|
if (labels.has(member.label)) return { ok: false, message: `council_member_label_duplicate: ${member.label}` };
|
|
@@ -389,7 +393,9 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
|
|
|
389
393
|
};
|
|
390
394
|
});
|
|
391
395
|
const reservation = deps.dispatch.reservations.prepare({
|
|
392
|
-
|
|
396
|
+
// A council keeps its own name so a capacity denial can say that its
|
|
397
|
+
// width has a floor. A fleet's waves are already parallel by shape.
|
|
398
|
+
topology: artifact.topology === "fleet" ? "parallel" : artifact.topology,
|
|
393
399
|
tasks,
|
|
394
400
|
});
|
|
395
401
|
try {
|
|
@@ -450,10 +456,12 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
|
|
|
450
456
|
return shapeRejection(args, "dispatch: apply_winner must be an options object");
|
|
451
457
|
}
|
|
452
458
|
const branch = stringArg(args.apply_winner, "branch");
|
|
453
|
-
const match = branch
|
|
459
|
+
const match = branch
|
|
460
|
+
? /^(?:clio-coder|clio)\/compete\/([A-Za-z0-9][A-Za-z0-9._-]{0,127})\/([1-9]\d*)$/.exec(branch)
|
|
461
|
+
: null;
|
|
454
462
|
if (branch === undefined) return shapeRejection(args, "dispatch: apply_winner.branch is required");
|
|
455
463
|
if (match === null) {
|
|
456
|
-
return shapeRejection(args, "dispatch: apply_winner.branch must be a clio/compete/<group>/<n> branch");
|
|
464
|
+
return shapeRejection(args, "dispatch: apply_winner.branch must be a clio-coder/compete/<group>/<n> branch");
|
|
457
465
|
}
|
|
458
466
|
try {
|
|
459
467
|
const cwd = resolve(stringArg(args.apply_winner, "cwd") ?? process.cwd());
|
|
@@ -638,6 +646,11 @@ export function createDispatchAdmissionController(deps: DispatchToolDeps): Dispa
|
|
|
638
646
|
executionRole: "researcher",
|
|
639
647
|
autonomy: "read-only",
|
|
640
648
|
toolProfile: "council-read-only",
|
|
649
|
+
// A member inherits the caller's declared scope but never its
|
|
650
|
+
// write authority: the same trees arrive as read roots, so the
|
|
651
|
+
// declaration stays enforceable against a read-only run instead of
|
|
652
|
+
// claiming a write scope nothing can grant.
|
|
653
|
+
...(base.intent === undefined ? {} : { intent: narrowDispatchIntentToReadOnly(base.intent) }),
|
|
641
654
|
// The runner reuses this composed task from the resolved plan, so
|
|
642
655
|
// the approval artifact the plan hash binds shows the operator the
|
|
643
656
|
// exact ballot the member is asked to cast.
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
/** Pure model-argument parsing; every returned DispatchRequest has a concrete agent id. */
|
|
2
2
|
|
|
3
|
-
import { pathBoundaryCovers } from "../core/path-boundary.js";
|
|
4
3
|
import type { AgentAutomationAuthority } from "../domains/agents/spec.js";
|
|
5
4
|
import { type AgentTaskType, classifyAgentTask } from "../domains/dispatch/agent-candidates.js";
|
|
6
5
|
import { cloneDispatchBudgetRequest } from "../domains/dispatch/budget-envelope.js";
|
|
7
6
|
import type { DispatchRequest } from "../domains/dispatch/contract.js";
|
|
8
7
|
import { type AgentRoleFactsResolver, requestExecutionRole } from "../domains/dispatch/execution-role.js";
|
|
9
8
|
import type { DispatchIntent } from "../domains/dispatch/intent.js";
|
|
9
|
+
import {
|
|
10
|
+
classifyDispatchIntentCompatibility,
|
|
11
|
+
dispatchIntentRefusals,
|
|
12
|
+
dispatchIntentScopeWidening,
|
|
13
|
+
} from "../domains/dispatch/intent-compatibility.js";
|
|
10
14
|
import { parseRoutingIntent } from "../domains/dispatch/routing-intent.js";
|
|
11
15
|
import { DISPATCH_BRIEFING_MAX_BYTES, type JobThinkingLevel } from "../domains/dispatch/validation.js";
|
|
12
16
|
import { isToolProfileName, TOOL_PROFILE_NAMES } from "./profiles.js";
|
|
@@ -58,7 +62,7 @@ const AUTO_BASELINE_FALLBACK_AGENT_ID = "scout";
|
|
|
58
62
|
* the mapped recipe is not present in this install, so a trimmed recipe set
|
|
59
63
|
* can never produce a dispatch against an agent id that does not resolve.
|
|
60
64
|
*/
|
|
61
|
-
|
|
65
|
+
function autoBaselineAgentId(task: string, hasAgent?: (id: string) => boolean): string {
|
|
62
66
|
const mapped = AUTO_BASELINE_BY_TASK_TYPE[classifyAgentTask(task).taskType] ?? AUTO_BASELINE_FALLBACK_AGENT_ID;
|
|
63
67
|
if (hasAgent === undefined) return mapped;
|
|
64
68
|
if (hasAgent(mapped)) return mapped;
|
|
@@ -197,10 +201,17 @@ function dispatchRequestFromArgs(
|
|
|
197
201
|
? args.writeRoots.filter((entry): entry is string => typeof entry === "string")
|
|
198
202
|
: undefined;
|
|
199
203
|
if (legacy !== undefined) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
+
// Asked through the same rule the job-spec validator asks, so the two
|
|
205
|
+
// cannot disagree about the same pair. A raw string comparison here
|
|
206
|
+
// would refuse './src/tools' against 'src/tools', which name one tree.
|
|
207
|
+
const refusal = dispatchIntentRefusals(
|
|
208
|
+
classifyDispatchIntentCompatibility({
|
|
209
|
+
intent: resolved.intent,
|
|
210
|
+
writeRoots: legacy,
|
|
211
|
+
...(cwd !== undefined ? { cwd } : {}),
|
|
212
|
+
}),
|
|
213
|
+
).find((entry) => entry.code === "intent_write_roots_contradiction");
|
|
214
|
+
if (refusal !== undefined) return { ok: false, message: refusal.message };
|
|
204
215
|
request.writeRoots = legacy;
|
|
205
216
|
} else {
|
|
206
217
|
request.writeRoots = resolved.intent.writeRoots;
|
|
@@ -273,21 +284,10 @@ export function dispatchRequestsFromArgs(
|
|
|
273
284
|
}
|
|
274
285
|
const ceiling = options.resolveIntent(sharedIntent, parsed.request.cwd);
|
|
275
286
|
if (!ceiling.ok) return { ok: false, message: `dispatch: task ${index + 1}: ${ceiling.message}` };
|
|
276
|
-
const
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
};
|
|
281
|
-
for (const field of ["readRoots", "writeRoots", "relevantPaths"] as const) {
|
|
282
|
-
const outside = parsed.request.intent?.[field].find(
|
|
283
|
-
(candidate) => !pathBoundaryCovers(pathCeilings[field], candidate),
|
|
284
|
-
);
|
|
285
|
-
if (outside !== undefined) {
|
|
286
|
-
return {
|
|
287
|
-
ok: false,
|
|
288
|
-
message: `dispatch: task ${index + 1}: intent_scope_widening: ${field} entry '${outside}' is outside the top-level intent ceiling`,
|
|
289
|
-
};
|
|
290
|
-
}
|
|
287
|
+
const widening =
|
|
288
|
+
parsed.request.intent === undefined ? null : dispatchIntentScopeWidening(ceiling.intent, parsed.request.intent);
|
|
289
|
+
if (widening !== null) {
|
|
290
|
+
return { ok: false, message: `dispatch: task ${index + 1}: ${widening.message}` };
|
|
291
291
|
}
|
|
292
292
|
}
|
|
293
293
|
requests.push(parsed.request);
|
|
@@ -900,14 +900,3 @@ export function describeDispatchPlan(rawArgs: Record<string, unknown> | undefine
|
|
|
900
900
|
...(confirmation !== undefined ? { confirmation } : {}),
|
|
901
901
|
};
|
|
902
902
|
}
|
|
903
|
-
|
|
904
|
-
/** Registry-side predicate: does this dispatch call require plan approval at supervised levels? */
|
|
905
|
-
export function isPlanScaleDispatchArgs(rawArgs: Record<string, unknown> | undefined): boolean {
|
|
906
|
-
try {
|
|
907
|
-
return describeDispatchPlan(rawArgs).planScale;
|
|
908
|
-
} catch {
|
|
909
|
-
// A malformed call fails closed as NOT plan-scale; the dispatch tool's
|
|
910
|
-
// own validation rejects it with a real error message.
|
|
911
|
-
return false;
|
|
912
|
-
}
|
|
913
|
-
}
|