@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/engine/acp/server.ts
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { realpathSync } from "node:fs";
|
|
3
3
|
import { isAbsolute, resolve as resolvePath } from "node:path";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
BusChannels,
|
|
6
|
+
type DispatchCompletedPayload,
|
|
7
|
+
type DispatchEnqueuedPayload,
|
|
8
|
+
type DispatchFailedPayload,
|
|
9
|
+
type DispatchProgressPayload,
|
|
10
|
+
type DispatchStartedPayload,
|
|
11
|
+
type LoopBlockedPayload,
|
|
12
|
+
} from "../../core/bus-events.js";
|
|
5
13
|
import { DEFAULT_DELEGATION_PERMISSION_TIMEOUT_MS } from "../../core/defaults.js";
|
|
6
14
|
import type { SafeEventBus } from "../../core/event-bus.js";
|
|
7
15
|
import { MAX_TIMER_DELAY_MS } from "../../core/timers.js";
|
|
@@ -33,6 +41,7 @@ import type {
|
|
|
33
41
|
AcpToolKind,
|
|
34
42
|
} from "./types.js";
|
|
35
43
|
import {
|
|
44
|
+
ACP_AGENT_META_KEY,
|
|
36
45
|
ACP_MAX_CHUNK_BYTES,
|
|
37
46
|
ACP_MAX_RAW_RECORD_BYTES,
|
|
38
47
|
ACP_MAX_STRING_BYTES,
|
|
@@ -68,10 +77,10 @@ export interface AcpSafeSettingsSnapshot extends AcpRoutingSnapshot {
|
|
|
68
77
|
}
|
|
69
78
|
|
|
70
79
|
export type AcpSafeSettingsPatch = Partial<{
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
autonomy: AutonomyLevel;
|
|
80
|
+
"chat.target": string | null;
|
|
81
|
+
"chat.model": string | null;
|
|
82
|
+
"chat.thinkingLevel": AcpThinkingLevel;
|
|
83
|
+
"safety.autonomy": AutonomyLevel;
|
|
75
84
|
}>;
|
|
76
85
|
|
|
77
86
|
export interface AcpSettingsControl {
|
|
@@ -173,6 +182,25 @@ interface ActivePrompt {
|
|
|
173
182
|
interface AcpToolCallSnapshot {
|
|
174
183
|
rawInput: Record<string, unknown>;
|
|
175
184
|
locations?: AcpToolCallLocation[];
|
|
185
|
+
/** Exact title and kind this call was announced under, replayed by later updates. */
|
|
186
|
+
title: string;
|
|
187
|
+
kind: AcpToolKind;
|
|
188
|
+
/**
|
|
189
|
+
* Delegated agents this call spawned, oldest first, bounded by
|
|
190
|
+
* {@link ACP_MAX_TOOL_CALL_AGENTS}. A dispatch tool that fans out reports one
|
|
191
|
+
* entry per run, which is what lets a client label the segment with the
|
|
192
|
+
* agents that actually ran under it rather than with the product name.
|
|
193
|
+
*/
|
|
194
|
+
agents?: AcpAgentAttribution[];
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** One `clio-coder/agent` attribution entry. `role` names where the identity came from. */
|
|
198
|
+
interface AcpAgentAttribution {
|
|
199
|
+
version: 1;
|
|
200
|
+
role: "orchestrator" | "worker";
|
|
201
|
+
agentId: string;
|
|
202
|
+
runId?: string;
|
|
203
|
+
node?: string;
|
|
176
204
|
}
|
|
177
205
|
|
|
178
206
|
interface AcpServerUsage {
|
|
@@ -299,6 +327,74 @@ const ACP_MAX_TOOL_TITLE_BYTES = 512;
|
|
|
299
327
|
const ACP_MAX_LIVE_TOOL_CALLS = 128;
|
|
300
328
|
const ACP_MAX_REPLAY_TOOL_CALLS = 8192;
|
|
301
329
|
|
|
330
|
+
/**
|
|
331
|
+
* Bus channels this server is willing to forward over the opt-in
|
|
332
|
+
* `clio-coder/event` notification. Nothing outside this list is forwardable:
|
|
333
|
+
* the list is the allowlist, and a client's requested kinds are intersected
|
|
334
|
+
* with it rather than trusted. `safety.loopBlocked` was the first member; the
|
|
335
|
+
* dispatch lifecycle joined it so a client can draw a live fleet board from
|
|
336
|
+
* reported facts instead of inferring one from tool titles or timing.
|
|
337
|
+
*/
|
|
338
|
+
const ACP_FORWARDABLE_EVENT_KINDS = [
|
|
339
|
+
"safety.loopBlocked",
|
|
340
|
+
"dispatch.enqueued",
|
|
341
|
+
"dispatch.started",
|
|
342
|
+
"dispatch.progress",
|
|
343
|
+
"dispatch.completed",
|
|
344
|
+
"dispatch.failed",
|
|
345
|
+
] as const;
|
|
346
|
+
|
|
347
|
+
type AcpForwardableEventKind = (typeof ACP_FORWARDABLE_EVENT_KINDS)[number];
|
|
348
|
+
|
|
349
|
+
/** A client may name at most this many kinds; an over-long list refuses the whole opt-in. */
|
|
350
|
+
const ACP_MAX_REQUESTED_EVENT_KINDS = 16;
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Sanitized, bounded preview of a dispatched task. The exact task is the
|
|
354
|
+
* operator's own prose and can be arbitrarily long, so what crosses is a
|
|
355
|
+
* control-character-stripped prefix carrying the standard truncation marker;
|
|
356
|
+
* the exact text never leaves the process.
|
|
357
|
+
*/
|
|
358
|
+
const ACP_MAX_DISPATCH_TASK_PREVIEW_BYTES = 160;
|
|
359
|
+
|
|
360
|
+
/** Wire bound for the short identifiers a dispatch event carries. */
|
|
361
|
+
const ACP_MAX_DISPATCH_ID_BYTES = 128;
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* Progress events forwarded per run before the stream is capped. One run
|
|
365
|
+
* publishes one progress fact per worker event, which is unbounded; a client
|
|
366
|
+
* only needs enough to know the run is alive, so the cap is announced with a
|
|
367
|
+
* final `truncated` frame rather than by silently going quiet.
|
|
368
|
+
*/
|
|
369
|
+
const ACP_MAX_DISPATCH_PROGRESS_EVENTS = 256;
|
|
370
|
+
|
|
371
|
+
/** Live dispatch runs whose progress counters this server tracks at once. */
|
|
372
|
+
const ACP_MAX_TRACKED_DISPATCH_RUNS = 512;
|
|
373
|
+
|
|
374
|
+
/** Delegated agents recorded against one tool call before further ones are dropped. */
|
|
375
|
+
const ACP_MAX_TOOL_CALL_AGENTS = 16;
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Attribution for a frame this server produced on the main session. Every live
|
|
379
|
+
* frame carries it, so a client never has to decide whether an unattributed
|
|
380
|
+
* frame means "the orchestrator" or "identity unavailable".
|
|
381
|
+
*/
|
|
382
|
+
const ORCHESTRATOR_ATTRIBUTION: AcpAgentAttribution = {
|
|
383
|
+
version: 1,
|
|
384
|
+
role: "orchestrator",
|
|
385
|
+
agentId: "orchestrator",
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
const ORCHESTRATOR_UPDATE_META: Record<string, unknown> = {
|
|
389
|
+
[ACP_AGENT_META_KEY]: [ORCHESTRATOR_ATTRIBUTION],
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
/** The `_meta` a tool-call frame carries: its own agents when it spawned any, else the orchestrator. */
|
|
393
|
+
function toolCallUpdateMeta(snapshot: AcpToolCallSnapshot | undefined): Record<string, unknown> {
|
|
394
|
+
if (snapshot?.agents === undefined || snapshot.agents.length === 0) return ORCHESTRATOR_UPDATE_META;
|
|
395
|
+
return { [ACP_AGENT_META_KEY]: [ORCHESTRATOR_ATTRIBUTION, ...snapshot.agents] };
|
|
396
|
+
}
|
|
397
|
+
|
|
302
398
|
/** Depth past which `boundRawRecord` stops walking and elides the subtree. */
|
|
303
399
|
const ACP_MAX_RAW_RECORD_DEPTH = 8;
|
|
304
400
|
|
|
@@ -580,21 +676,26 @@ function eventTextDelta(event: AcpEventRecord): string {
|
|
|
580
676
|
}
|
|
581
677
|
|
|
582
678
|
/**
|
|
583
|
-
* The next unused `clio-tool-<n>`. The counter alone is not enough: an engine
|
|
584
|
-
* that names its own calls `clio-tool-1` would otherwise collide with an alias
|
|
679
|
+
* The next unused `clio-coder-tool-<n>`. The counter alone is not enough: an engine
|
|
680
|
+
* that names its own calls `clio-coder-tool-1` would otherwise collide with an alias
|
|
585
681
|
* this server minted, and two different calls sharing one wire id is the exact
|
|
586
682
|
* failure aliasing exists to prevent.
|
|
587
683
|
*/
|
|
588
684
|
function nextAliasToolCallId(active: ActivePrompt): string {
|
|
589
685
|
for (;;) {
|
|
590
686
|
active.toolCallSequence += 1;
|
|
591
|
-
const alias = `clio-tool-${active.toolCallSequence}`;
|
|
687
|
+
const alias = `clio-coder-tool-${active.toolCallSequence}`;
|
|
592
688
|
if (active.usedWireIds.has(alias)) continue;
|
|
593
689
|
active.usedWireIds.add(alias);
|
|
594
690
|
return alias;
|
|
595
691
|
}
|
|
596
692
|
}
|
|
597
693
|
|
|
694
|
+
function normalizeReleasedAliasToolCallId(engineId: string): string {
|
|
695
|
+
const legacy = /^clio-tool-([1-9]\d*)$/u.exec(engineId);
|
|
696
|
+
return legacy === null ? engineId : `clio-coder-tool-${legacy[1]}`;
|
|
697
|
+
}
|
|
698
|
+
|
|
598
699
|
/** Records `wireId` as the newest wire id this engine id speaks under. */
|
|
599
700
|
function pushWireId(active: ActivePrompt, engineId: string, wireId: string): string {
|
|
600
701
|
const existing = active.toolCallWireIds.get(engineId);
|
|
@@ -609,9 +710,10 @@ function pushWireId(active: ActivePrompt, engineId: string, wireId: string): str
|
|
|
609
710
|
* call travels under a per-prompt alias.
|
|
610
711
|
*/
|
|
611
712
|
function mintWireId(active: ActivePrompt, engineId: string): string {
|
|
612
|
-
const
|
|
613
|
-
|
|
614
|
-
|
|
713
|
+
const candidate = normalizeReleasedAliasToolCallId(engineId);
|
|
714
|
+
const usable = utf8Bytes(candidate) <= ACP_MAX_TOOL_CALL_ID_BYTES && !active.usedWireIds.has(candidate);
|
|
715
|
+
if (usable) active.usedWireIds.add(candidate);
|
|
716
|
+
return pushWireId(active, engineId, usable ? candidate : nextAliasToolCallId(active));
|
|
615
717
|
}
|
|
616
718
|
|
|
617
719
|
/**
|
|
@@ -691,8 +793,9 @@ function sendUpdate(
|
|
|
691
793
|
sessionId: string,
|
|
692
794
|
active: ActivePrompt,
|
|
693
795
|
update: Record<string, unknown>,
|
|
796
|
+
meta: Record<string, unknown> = ORCHESTRATOR_UPDATE_META,
|
|
694
797
|
): void {
|
|
695
|
-
const params: AcpSessionUpdateParams = { sessionId, update };
|
|
798
|
+
const params: AcpSessionUpdateParams = { sessionId, update, _meta: meta };
|
|
696
799
|
active.updatesSent += 1;
|
|
697
800
|
transport.notify("session/update", params);
|
|
698
801
|
}
|
|
@@ -722,12 +825,18 @@ function settleOpenToolCalls(
|
|
|
722
825
|
text: string,
|
|
723
826
|
): void {
|
|
724
827
|
for (const toolCallId of active.openToolCalls) {
|
|
725
|
-
sendUpdate(
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
828
|
+
sendUpdate(
|
|
829
|
+
transport,
|
|
830
|
+
sessionId,
|
|
831
|
+
active,
|
|
832
|
+
{
|
|
833
|
+
sessionUpdate: "tool_call_update",
|
|
834
|
+
toolCallId,
|
|
835
|
+
status: "failed" satisfies AcpToolCallStatus,
|
|
836
|
+
content: toolCallContent(text),
|
|
837
|
+
},
|
|
838
|
+
toolCallUpdateMeta(active.toolCallSnapshots.get(toolCallId)),
|
|
839
|
+
);
|
|
731
840
|
// The sweep is a terminal update like any other, so a late end for a swept
|
|
732
841
|
// id cannot reopen the call the client has already seen fail.
|
|
733
842
|
active.terminalToolCalls.add(toolCallId);
|
|
@@ -794,13 +903,15 @@ function handleChatEvent(
|
|
|
794
903
|
const snapshot: AcpToolCallSnapshot = {
|
|
795
904
|
rawInput: boundRawRecord(event.args),
|
|
796
905
|
...(locations !== null ? { locations } : {}),
|
|
906
|
+
title: boundString(toolName ?? "tool", ACP_MAX_TOOL_TITLE_BYTES),
|
|
907
|
+
kind: toolKind(toolName),
|
|
797
908
|
};
|
|
798
909
|
active.toolCallSnapshots.set(toolCallId, snapshot);
|
|
799
910
|
sendUpdate(transport, sessionId, active, {
|
|
800
911
|
sessionUpdate: "tool_call",
|
|
801
912
|
toolCallId,
|
|
802
|
-
title:
|
|
803
|
-
kind:
|
|
913
|
+
title: snapshot.title,
|
|
914
|
+
kind: snapshot.kind,
|
|
804
915
|
status: "in_progress" satisfies AcpToolCallStatus,
|
|
805
916
|
rawInput: snapshot.rawInput,
|
|
806
917
|
...(snapshot.locations !== undefined ? { locations: snapshot.locations } : {}),
|
|
@@ -826,15 +937,21 @@ function handleChatEvent(
|
|
|
826
937
|
active.openToolCalls.delete(toolCallId);
|
|
827
938
|
active.terminalToolCalls.add(toolCallId);
|
|
828
939
|
const output = boundString(outputText(event.result), ACP_MAX_CHUNK_BYTES);
|
|
829
|
-
sendUpdate(
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
940
|
+
sendUpdate(
|
|
941
|
+
transport,
|
|
942
|
+
sessionId,
|
|
943
|
+
active,
|
|
944
|
+
{
|
|
945
|
+
sessionUpdate: "tool_call_update",
|
|
946
|
+
toolCallId,
|
|
947
|
+
title: boundString(toolName ?? "tool", ACP_MAX_TOOL_TITLE_BYTES),
|
|
948
|
+
kind: toolKind(toolName),
|
|
949
|
+
status: toolStatus(event),
|
|
950
|
+
...(output.length > 0 ? { content: toolCallContent(output) } : {}),
|
|
951
|
+
rawOutput: boundRawRecord({ result: event.result, isError: event.isError === true }),
|
|
952
|
+
},
|
|
953
|
+
toolCallUpdateMeta(active.toolCallSnapshots.get(toolCallId)),
|
|
954
|
+
);
|
|
838
955
|
return;
|
|
839
956
|
}
|
|
840
957
|
if (event.type === "message_end") {
|
|
@@ -864,14 +981,14 @@ function handleChatEvent(
|
|
|
864
981
|
if (last !== undefined) applyStopReason(active, last);
|
|
865
982
|
return;
|
|
866
983
|
}
|
|
867
|
-
// Clio lifecycle events (agent_start, retry_status,
|
|
984
|
+
// Clio lifecycle events (agent_start, retry_status, clio_coder_plan_update) have
|
|
868
985
|
// no ACP v1 SessionUpdate equivalent. The prompt turn is bounded by the
|
|
869
986
|
// session/prompt response, so emitting non-spec `progress` updates would
|
|
870
987
|
// break strict clients. They are intentionally dropped. The same protocol
|
|
871
988
|
// gap applies to routing advisories (external settings divergence, active
|
|
872
989
|
// target removed): ACP v1 has no agent-initiated advisory channel, so the
|
|
873
990
|
// orchestrator records those as `custom` session-ledger entries
|
|
874
|
-
// (customType "clio.routing-notice") instead of inventing update kinds.
|
|
991
|
+
// (customType "clio-coder.routing-notice") instead of inventing update kinds.
|
|
875
992
|
}
|
|
876
993
|
|
|
877
994
|
const ACP_MAX_SESSION_ID_BYTES = 128;
|
|
@@ -1148,12 +1265,7 @@ function sessionResultMeta(
|
|
|
1148
1265
|
};
|
|
1149
1266
|
}
|
|
1150
1267
|
|
|
1151
|
-
const ACP_SAFE_SETTINGS_KEYS = [
|
|
1152
|
-
"orchestrator.target",
|
|
1153
|
-
"orchestrator.model",
|
|
1154
|
-
"orchestrator.thinkingLevel",
|
|
1155
|
-
"autonomy",
|
|
1156
|
-
] as const;
|
|
1268
|
+
const ACP_SAFE_SETTINGS_KEYS = ["chat.target", "chat.model", "chat.thinkingLevel", "safety.autonomy"] as const;
|
|
1157
1269
|
const ACP_THINKING_LEVELS = new Set<AcpThinkingLevel>(["off", "minimal", "low", "medium", "high", "xhigh", "max"]);
|
|
1158
1270
|
const ACP_AUTONOMY_LEVELS = new Set<AutonomyLevel>(["read-only", "suggest", "auto-edit", "full-auto"]);
|
|
1159
1271
|
const ACP_MAX_TARGETS = 64;
|
|
@@ -1177,12 +1289,12 @@ function safeSettingsProjection(snapshot: AcpSafeSettingsSnapshot): Record<strin
|
|
|
1177
1289
|
const autonomy = ACP_AUTONOMY_LEVELS.has(snapshot.autonomy) ? snapshot.autonomy : DEFAULT_AUTONOMY_LEVEL;
|
|
1178
1290
|
return {
|
|
1179
1291
|
settings: {
|
|
1180
|
-
|
|
1292
|
+
chat: {
|
|
1181
1293
|
target: safeConfiguredIdentifier(snapshot.target, ACP_MAX_TARGET_ID_BYTES),
|
|
1182
1294
|
model: safeConfiguredIdentifier(snapshot.model, ACP_MAX_MODEL_ID_BYTES),
|
|
1183
1295
|
thinkingLevel,
|
|
1184
1296
|
},
|
|
1185
|
-
autonomy,
|
|
1297
|
+
safety: { autonomy },
|
|
1186
1298
|
},
|
|
1187
1299
|
editable: [...ACP_SAFE_SETTINGS_KEYS],
|
|
1188
1300
|
};
|
|
@@ -1500,9 +1612,24 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1500
1612
|
const sessions = new Map<string, AcpServerSession>();
|
|
1501
1613
|
const workspaceInstanceId = randomUUID();
|
|
1502
1614
|
let initialized = false;
|
|
1503
|
-
|
|
1615
|
+
const enabledEventKinds = new Set<AcpForwardableEventKind>();
|
|
1504
1616
|
let eventSequence = 0;
|
|
1617
|
+
/**
|
|
1618
|
+
* Per-run progress counters for the forwarded dispatch stream, insertion
|
|
1619
|
+
* ordered. A terminal event removes its run; the cap evicts the oldest live
|
|
1620
|
+
* run rather than refusing the newest, so a leaked run cannot starve the
|
|
1621
|
+
* board of the run an operator is actually watching.
|
|
1622
|
+
*/
|
|
1623
|
+
const dispatchProgress = new Map<string, { count: number; capped: boolean }>();
|
|
1505
1624
|
let activeSessionId: string | null = null;
|
|
1625
|
+
/**
|
|
1626
|
+
* The one session this process hosts, from the moment it is bound until it is
|
|
1627
|
+
* closed. Distinct from {@link activeSessionId}, which is only set while a
|
|
1628
|
+
* prompt is running: a detached dispatch run legitimately finishes after the
|
|
1629
|
+
* turn that started it, and a client keyed on the bound session still needs
|
|
1630
|
+
* that outcome so its board does not leave the run running forever.
|
|
1631
|
+
*/
|
|
1632
|
+
let boundSessionId: string | null = null;
|
|
1506
1633
|
let activePromptState: ActivePrompt | null = null;
|
|
1507
1634
|
let sessionCreated = false;
|
|
1508
1635
|
let promptSettled: Promise<void> | null = null;
|
|
@@ -1541,48 +1668,244 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1541
1668
|
options.chat.cancel();
|
|
1542
1669
|
},
|
|
1543
1670
|
});
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1671
|
+
/**
|
|
1672
|
+
* Sends one frame of the opt-in stream. Every forwarded channel goes through
|
|
1673
|
+
* here so the envelope, the sequence, and the opt-in check cannot drift per
|
|
1674
|
+
* channel. Nothing is sent before a session exists: the envelope's
|
|
1675
|
+
* `sessionId` is the client's only way to bind a fact to what it is showing.
|
|
1676
|
+
*/
|
|
1677
|
+
const forwardEvent = (
|
|
1678
|
+
kind: AcpForwardableEventKind,
|
|
1679
|
+
turnId: string | null,
|
|
1680
|
+
terminal: boolean,
|
|
1681
|
+
payload: Record<string, unknown>,
|
|
1682
|
+
): void => {
|
|
1683
|
+
const sessionId = activeSessionId ?? boundSessionId;
|
|
1684
|
+
if (!initialized || !enabledEventKinds.has(kind) || sessionId === null) return;
|
|
1685
|
+
eventSequence += 1;
|
|
1686
|
+
try {
|
|
1687
|
+
options.transport.notify("clio-coder/event", {
|
|
1688
|
+
version: 1,
|
|
1689
|
+
workspaceInstanceId,
|
|
1690
|
+
sessionId,
|
|
1691
|
+
turnId,
|
|
1692
|
+
sequence: eventSequence,
|
|
1693
|
+
kind,
|
|
1694
|
+
terminal,
|
|
1695
|
+
payload,
|
|
1696
|
+
});
|
|
1697
|
+
} catch {
|
|
1698
|
+
options.diagnostics?.("failed to send an opted-in ACP event");
|
|
1699
|
+
}
|
|
1700
|
+
};
|
|
1701
|
+
|
|
1702
|
+
/**
|
|
1703
|
+
* The identity every dispatch frame carries. The exact task never crosses:
|
|
1704
|
+
* what goes on the wire is a control-character-stripped, byte-bounded prefix
|
|
1705
|
+
* carrying the standard truncation marker, so a client can label a run
|
|
1706
|
+
* without receiving the operator's prose. A run whose id or agent cannot be
|
|
1707
|
+
* represented safely is dropped rather than forwarded under a repaired
|
|
1708
|
+
* identity, because a board keyed on a rewritten id merges distinct runs.
|
|
1709
|
+
*/
|
|
1710
|
+
const dispatchIdentity = (payload: {
|
|
1711
|
+
runId: string;
|
|
1712
|
+
agentId: string;
|
|
1713
|
+
task?: string | undefined;
|
|
1714
|
+
node?: string | undefined;
|
|
1715
|
+
}): { runId: string; agentId: string; taskPreview: string | null; node: string | null } | null => {
|
|
1716
|
+
const runId = safeStoredIdentifier(payload.runId, ACP_MAX_DISPATCH_ID_BYTES);
|
|
1717
|
+
const agentId = safeStoredIdentifier(payload.agentId, ACP_MAX_DISPATCH_ID_BYTES);
|
|
1718
|
+
if (runId === null || agentId === null) return null;
|
|
1719
|
+
const preview =
|
|
1720
|
+
payload.task === undefined ? "" : safeStoredString(payload.task, ACP_MAX_DISPATCH_TASK_PREVIEW_BYTES).trim();
|
|
1721
|
+
return {
|
|
1722
|
+
runId,
|
|
1723
|
+
agentId,
|
|
1724
|
+
taskPreview: preview.length === 0 ? null : preview,
|
|
1725
|
+
node: safeStoredIdentifier(payload.node, ACP_MAX_DISPATCH_ID_BYTES),
|
|
1726
|
+
};
|
|
1727
|
+
};
|
|
1728
|
+
|
|
1729
|
+
/** Forgets a run's progress counter and keeps the live map inside its cap. */
|
|
1730
|
+
const trackDispatchRun = (runId: string): { count: number; capped: boolean } => {
|
|
1731
|
+
const existing = dispatchProgress.get(runId);
|
|
1732
|
+
if (existing !== undefined) return existing;
|
|
1733
|
+
if (dispatchProgress.size >= ACP_MAX_TRACKED_DISPATCH_RUNS) {
|
|
1734
|
+
const oldest = dispatchProgress.keys().next();
|
|
1735
|
+
if (!oldest.done) dispatchProgress.delete(oldest.value);
|
|
1736
|
+
}
|
|
1737
|
+
const created = { count: 0, capped: false };
|
|
1738
|
+
dispatchProgress.set(runId, created);
|
|
1739
|
+
return created;
|
|
1740
|
+
};
|
|
1741
|
+
|
|
1742
|
+
const safeCount = (value: unknown): number | null =>
|
|
1743
|
+
typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : null;
|
|
1744
|
+
|
|
1745
|
+
const unsubscribeEvents: Array<() => void> = [];
|
|
1746
|
+
if (options.bus !== undefined) {
|
|
1747
|
+
const bus = options.bus;
|
|
1748
|
+
unsubscribeEvents.push(
|
|
1749
|
+
bus.on(BusChannels.LoopBlocked, (payload: LoopBlockedPayload) => {
|
|
1750
|
+
// Loop blocks describe the turn that is running, so unlike a dispatch
|
|
1751
|
+
// run they are meaningless outside one.
|
|
1752
|
+
if (activePromptState === null) return;
|
|
1753
|
+
if (
|
|
1754
|
+
!Number.isSafeInteger(payload.repeatCount) ||
|
|
1755
|
+
payload.repeatCount < 1 ||
|
|
1756
|
+
!Number.isSafeInteger(payload.blocksThisTurn) ||
|
|
1757
|
+
payload.blocksThisTurn < 1 ||
|
|
1758
|
+
!Number.isSafeInteger(payload.budget) ||
|
|
1759
|
+
payload.budget < 1 ||
|
|
1760
|
+
!(["block", "lockout", "stop"] as ReadonlyArray<string>).includes(payload.disposition) ||
|
|
1761
|
+
payload.interrupted !== (payload.disposition === "stop")
|
|
1762
|
+
) {
|
|
1763
|
+
return;
|
|
1764
|
+
}
|
|
1765
|
+
const tool = safeStoredString(payload.tool, 64).trim();
|
|
1766
|
+
if (tool.length === 0) return;
|
|
1767
|
+
forwardEvent("safety.loopBlocked", safeStoredIdentifier(payload.turnId, ACP_MAX_SESSION_ID_BYTES), false, {
|
|
1768
|
+
toolCallId: null,
|
|
1769
|
+
tool,
|
|
1770
|
+
repeatCount: payload.repeatCount,
|
|
1771
|
+
blocksThisTurn: payload.blocksThisTurn,
|
|
1772
|
+
budget: payload.budget,
|
|
1773
|
+
disposition: payload.disposition,
|
|
1774
|
+
interrupted: payload.interrupted,
|
|
1775
|
+
shape: null,
|
|
1581
1776
|
});
|
|
1582
|
-
}
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1777
|
+
}),
|
|
1778
|
+
);
|
|
1779
|
+
unsubscribeEvents.push(
|
|
1780
|
+
bus.on(BusChannels.DispatchEnqueued, (payload: DispatchEnqueuedPayload) => {
|
|
1781
|
+
const identity = dispatchIdentity(payload);
|
|
1782
|
+
if (identity === null) return;
|
|
1783
|
+
trackDispatchRun(identity.runId);
|
|
1784
|
+
forwardEvent("dispatch.enqueued", null, false, {
|
|
1785
|
+
...identity,
|
|
1786
|
+
origin: safeStoredIdentifier(payload.requestOrigin, 64),
|
|
1787
|
+
attempt: null,
|
|
1788
|
+
});
|
|
1789
|
+
}),
|
|
1790
|
+
);
|
|
1791
|
+
unsubscribeEvents.push(
|
|
1792
|
+
bus.on(BusChannels.DispatchStarted, (payload: DispatchStartedPayload) => {
|
|
1793
|
+
const identity = dispatchIdentity(payload);
|
|
1794
|
+
if (identity === null) return;
|
|
1795
|
+
trackDispatchRun(identity.runId);
|
|
1796
|
+
// A run started by a tool call this turn already put on the wire is
|
|
1797
|
+
// the one place the harness knows which agent produced a tool
|
|
1798
|
+
// segment. Record it and re-announce the call so a client can label
|
|
1799
|
+
// the segment while the worker is still running.
|
|
1800
|
+
attributeRunToToolCall(payload.parentToolCallId, identity);
|
|
1801
|
+
forwardEvent("dispatch.started", null, false, {
|
|
1802
|
+
...identity,
|
|
1803
|
+
origin: safeStoredIdentifier(payload.requestOrigin, 64),
|
|
1804
|
+
attempt: safeCount(payload.attempt),
|
|
1805
|
+
});
|
|
1806
|
+
}),
|
|
1807
|
+
);
|
|
1808
|
+
unsubscribeEvents.push(
|
|
1809
|
+
bus.on(BusChannels.DispatchProgress, (payload: DispatchProgressPayload) => {
|
|
1810
|
+
const identity = dispatchIdentity(payload);
|
|
1811
|
+
if (identity === null) return;
|
|
1812
|
+
const state = trackDispatchRun(identity.runId);
|
|
1813
|
+
if (state.capped) return;
|
|
1814
|
+
state.count += 1;
|
|
1815
|
+
const capped = state.count > ACP_MAX_DISPATCH_PROGRESS_EVENTS;
|
|
1816
|
+
if (capped) state.capped = true;
|
|
1817
|
+
// The worker/ACP event that triggered this crossed a process boundary
|
|
1818
|
+
// and is typed `unknown`; none of it goes on the wire. What a board
|
|
1819
|
+
// needs is that the run is alive and roughly how much it has done.
|
|
1820
|
+
forwardEvent("dispatch.progress", null, false, {
|
|
1821
|
+
runId: identity.runId,
|
|
1822
|
+
agentId: identity.agentId,
|
|
1823
|
+
progressCount: state.count,
|
|
1824
|
+
truncated: capped,
|
|
1825
|
+
});
|
|
1826
|
+
}),
|
|
1827
|
+
);
|
|
1828
|
+
unsubscribeEvents.push(
|
|
1829
|
+
bus.on(BusChannels.DispatchCompleted, (payload: DispatchCompletedPayload) => {
|
|
1830
|
+
const identity = dispatchIdentity(payload);
|
|
1831
|
+
if (identity === null) return;
|
|
1832
|
+
dispatchProgress.delete(identity.runId);
|
|
1833
|
+
forwardEvent("dispatch.completed", null, true, {
|
|
1834
|
+
runId: identity.runId,
|
|
1835
|
+
agentId: identity.agentId,
|
|
1836
|
+
outcome: safeStoredIdentifier(payload.outcome, 64),
|
|
1837
|
+
outcomeCode: safeStoredIdentifier(payload.outcomeCode, 64),
|
|
1838
|
+
durationMs: safeCount(payload.durationMs),
|
|
1839
|
+
tokenCount: safeCount(payload.tokenCount),
|
|
1840
|
+
});
|
|
1841
|
+
}),
|
|
1842
|
+
);
|
|
1843
|
+
unsubscribeEvents.push(
|
|
1844
|
+
bus.on(BusChannels.DispatchFailed, (payload: DispatchFailedPayload) => {
|
|
1845
|
+
const identity = dispatchIdentity(payload);
|
|
1846
|
+
if (identity === null) return;
|
|
1847
|
+
dispatchProgress.delete(identity.runId);
|
|
1848
|
+
// `outcomeDetail` is free-form failure prose that legitimately quotes
|
|
1849
|
+
// paths, argv, and provider bodies. The taxonomy crosses; the prose
|
|
1850
|
+
// does not.
|
|
1851
|
+
forwardEvent("dispatch.failed", null, true, {
|
|
1852
|
+
runId: identity.runId,
|
|
1853
|
+
agentId: identity.agentId,
|
|
1854
|
+
outcome: safeStoredIdentifier(payload.outcome, 64),
|
|
1855
|
+
reason: safeStoredIdentifier(payload.reason, 64),
|
|
1856
|
+
durationMs: safeCount(payload.durationMs),
|
|
1857
|
+
});
|
|
1858
|
+
}),
|
|
1859
|
+
);
|
|
1860
|
+
}
|
|
1861
|
+
const unsubscribeEventStream = (): void => {
|
|
1862
|
+
for (const unsubscribe of unsubscribeEvents) unsubscribe();
|
|
1863
|
+
unsubscribeEvents.length = 0;
|
|
1864
|
+
dispatchProgress.clear();
|
|
1865
|
+
};
|
|
1866
|
+
|
|
1867
|
+
/**
|
|
1868
|
+
* Records a delegated agent against the tool call that spawned it and
|
|
1869
|
+
* re-announces that call so the attribution reaches the client while the
|
|
1870
|
+
* worker is running. Nothing is minted here: an id with no open call this
|
|
1871
|
+
* turn binds to nothing, exactly as on the permission path.
|
|
1872
|
+
*/
|
|
1873
|
+
function attributeRunToToolCall(
|
|
1874
|
+
parentToolCallId: string | undefined,
|
|
1875
|
+
identity: { runId: string; agentId: string; node: string | null },
|
|
1876
|
+
): void {
|
|
1877
|
+
const active = activePromptState;
|
|
1878
|
+
if (active === null || activeSessionId === null) return;
|
|
1879
|
+
if (parentToolCallId === undefined || parentToolCallId.length === 0) return;
|
|
1880
|
+
const wireId = openWireIdFor(active, parentToolCallId);
|
|
1881
|
+
if (wireId === null) return;
|
|
1882
|
+
const snapshot = active.toolCallSnapshots.get(wireId);
|
|
1883
|
+
if (snapshot === undefined) return;
|
|
1884
|
+
const agents = snapshot.agents ?? [];
|
|
1885
|
+
if (agents.length >= ACP_MAX_TOOL_CALL_AGENTS) return;
|
|
1886
|
+
if (agents.some((agent) => agent.runId === identity.runId)) return;
|
|
1887
|
+
agents.push({
|
|
1888
|
+
version: 1,
|
|
1889
|
+
role: "worker",
|
|
1890
|
+
agentId: identity.agentId,
|
|
1891
|
+
runId: identity.runId,
|
|
1892
|
+
...(identity.node !== null ? { node: identity.node } : {}),
|
|
1893
|
+
});
|
|
1894
|
+
snapshot.agents = agents;
|
|
1895
|
+
sendUpdate(
|
|
1896
|
+
options.transport,
|
|
1897
|
+
activeSessionId,
|
|
1898
|
+
active,
|
|
1899
|
+
{
|
|
1900
|
+
sessionUpdate: "tool_call_update",
|
|
1901
|
+
toolCallId: wireId,
|
|
1902
|
+
title: snapshot.title,
|
|
1903
|
+
kind: snapshot.kind,
|
|
1904
|
+
status: "in_progress" satisfies AcpToolCallStatus,
|
|
1905
|
+
},
|
|
1906
|
+
toolCallUpdateMeta(snapshot),
|
|
1907
|
+
);
|
|
1908
|
+
}
|
|
1586
1909
|
|
|
1587
1910
|
const requireInitialized = (): void => {
|
|
1588
1911
|
if (!initialized) throw new AcpRequestError(-32000, "initialize must be called first", { code: "not_initialized" });
|
|
@@ -1671,15 +1994,21 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1671
1994
|
const eventRequest =
|
|
1672
1995
|
clientMeta !== null && isRecord(clientMeta["clio-coder/events"]) ? clientMeta["clio-coder/events"] : null;
|
|
1673
1996
|
const requestedEventKinds = eventRequest !== null ? eventRequest.kinds : null;
|
|
1674
|
-
|
|
1997
|
+
// A malformed request refuses the whole opt-in rather than the offending
|
|
1998
|
+
// entry: a client that sent an unrepresentable kind does not know what it
|
|
1999
|
+
// asked for, and silently honouring the rest of its list hides that.
|
|
2000
|
+
enabledEventKinds.clear();
|
|
2001
|
+
if (
|
|
1675
2002
|
eventRequest !== null &&
|
|
1676
2003
|
eventRequest.version === 1 &&
|
|
1677
2004
|
Array.isArray(requestedEventKinds) &&
|
|
1678
|
-
requestedEventKinds.length <=
|
|
1679
|
-
requestedEventKinds.every(
|
|
1680
|
-
|
|
1681
|
-
)
|
|
1682
|
-
|
|
2005
|
+
requestedEventKinds.length <= ACP_MAX_REQUESTED_EVENT_KINDS &&
|
|
2006
|
+
requestedEventKinds.every((kind) => typeof kind === "string" && utf8Bytes(kind) <= 64 && !hasControlCharacters(kind))
|
|
2007
|
+
) {
|
|
2008
|
+
for (const kind of ACP_FORWARDABLE_EVENT_KINDS) {
|
|
2009
|
+
if (requestedEventKinds.includes(kind)) enabledEventKinds.add(kind);
|
|
2010
|
+
}
|
|
2011
|
+
}
|
|
1683
2012
|
const canLoadSession =
|
|
1684
2013
|
options.session !== undefined &&
|
|
1685
2014
|
options.readSessionEntries !== undefined &&
|
|
@@ -1717,12 +2046,16 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1717
2046
|
list: options.providers !== undefined,
|
|
1718
2047
|
probe: options.providers !== undefined,
|
|
1719
2048
|
},
|
|
2049
|
+
// Per-frame agent attribution on `session/update`. Announced so a
|
|
2050
|
+
// client can tell "this agent produced nothing" apart from "this
|
|
2051
|
+
// peer does not report identity at all".
|
|
2052
|
+
[ACP_AGENT_META_KEY]: { version: 1, meta: ACP_AGENT_META_KEY },
|
|
1720
2053
|
...(options.bus
|
|
1721
2054
|
? {
|
|
1722
2055
|
"clio-coder/events": {
|
|
1723
2056
|
version: 1,
|
|
1724
2057
|
notification: "clio-coder/event",
|
|
1725
|
-
kinds:
|
|
2058
|
+
kinds: ACP_FORWARDABLE_EVENT_KINDS,
|
|
1726
2059
|
workspaceInstanceId,
|
|
1727
2060
|
},
|
|
1728
2061
|
}
|
|
@@ -1730,7 +2063,15 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1730
2063
|
...(options.toolRegistry !== undefined ? { "clio-coder/tools": "mediated" } : {}),
|
|
1731
2064
|
},
|
|
1732
2065
|
},
|
|
1733
|
-
authMethods: [
|
|
2066
|
+
authMethods: [
|
|
2067
|
+
{
|
|
2068
|
+
id: "clio-login",
|
|
2069
|
+
name: "Clio Target Auth & Setup",
|
|
2070
|
+
description: "Configure models, API keys, and target endpoints in terminal",
|
|
2071
|
+
type: "terminal",
|
|
2072
|
+
args: ["auth", "login"],
|
|
2073
|
+
},
|
|
2074
|
+
],
|
|
1734
2075
|
} satisfies AcpInitializeResponse;
|
|
1735
2076
|
});
|
|
1736
2077
|
|
|
@@ -1767,6 +2108,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1767
2108
|
};
|
|
1768
2109
|
sessionCreated = true;
|
|
1769
2110
|
sessions.set(id, session);
|
|
2111
|
+
boundSessionId = id;
|
|
1770
2112
|
// NewSessionResponse is { sessionId, modes?, models?, _meta? }; cwd is not a
|
|
1771
2113
|
// schema field. Clio runs a single-session-per-process server pinned to the
|
|
1772
2114
|
// launch cwd, so no extra fields are needed.
|
|
@@ -1840,6 +2182,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1840
2182
|
};
|
|
1841
2183
|
sessionCreated = true;
|
|
1842
2184
|
sessions.set(id, session);
|
|
2185
|
+
boundSessionId = id;
|
|
1843
2186
|
for (const replayParams of replay.params) options.transport.notify("session/update", replayParams);
|
|
1844
2187
|
return {
|
|
1845
2188
|
_meta: {
|
|
@@ -1976,7 +2319,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1976
2319
|
throw new AcpRequestError(-32602, "patch contains an unknown setting", { code: "invalid_params" });
|
|
1977
2320
|
}
|
|
1978
2321
|
switch (key) {
|
|
1979
|
-
case "
|
|
2322
|
+
case "chat.target": {
|
|
1980
2323
|
if (value === null) {
|
|
1981
2324
|
patch[key] = null;
|
|
1982
2325
|
break;
|
|
@@ -1991,16 +2334,16 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
1991
2334
|
patch[key] = target;
|
|
1992
2335
|
break;
|
|
1993
2336
|
}
|
|
1994
|
-
case "
|
|
2337
|
+
case "chat.model":
|
|
1995
2338
|
patch[key] = value === null ? null : requireBoundedClientString(value, key, ACP_MAX_MODEL_ID_BYTES);
|
|
1996
2339
|
break;
|
|
1997
|
-
case "
|
|
2340
|
+
case "chat.thinkingLevel":
|
|
1998
2341
|
if (typeof value !== "string" || !ACP_THINKING_LEVELS.has(value as AcpThinkingLevel)) {
|
|
1999
2342
|
throw new AcpRequestError(-32602, "invalid thinking level", { code: "invalid_params" });
|
|
2000
2343
|
}
|
|
2001
2344
|
patch[key] = value as AcpThinkingLevel;
|
|
2002
2345
|
break;
|
|
2003
|
-
case "autonomy":
|
|
2346
|
+
case "safety.autonomy":
|
|
2004
2347
|
if (typeof value !== "string" || !ACP_AUTONOMY_LEVELS.has(value as AutonomyLevel)) {
|
|
2005
2348
|
throw new AcpRequestError(-32602, "invalid autonomy level", { code: "invalid_params" });
|
|
2006
2349
|
}
|
|
@@ -2009,8 +2352,8 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2009
2352
|
}
|
|
2010
2353
|
}
|
|
2011
2354
|
const current = options.settings.read();
|
|
2012
|
-
const nextTarget = patch["
|
|
2013
|
-
const nextModel = patch["
|
|
2355
|
+
const nextTarget = patch["chat.target"] === undefined ? current.target : patch["chat.target"];
|
|
2356
|
+
const nextModel = patch["chat.model"] === undefined ? current.model : patch["chat.model"];
|
|
2014
2357
|
if (nextTarget === null && nextModel !== null) {
|
|
2015
2358
|
throw new AcpRequestError(-32602, "model requires a configured target", { code: "invalid_params" });
|
|
2016
2359
|
}
|
|
@@ -2134,6 +2477,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2134
2477
|
}
|
|
2135
2478
|
if (options.session?.current()?.id === session.id) await options.session.close();
|
|
2136
2479
|
sessions.delete(session.id);
|
|
2480
|
+
if (boundSessionId === session.id) boundSessionId = null;
|
|
2137
2481
|
closedSessionIds.add(session.id);
|
|
2138
2482
|
return {};
|
|
2139
2483
|
});
|
|
@@ -2230,7 +2574,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
|
|
|
2230
2574
|
return await new Promise<number>((resolve) => {
|
|
2231
2575
|
options.transport.onClose(() => {
|
|
2232
2576
|
permission.unregister();
|
|
2233
|
-
|
|
2577
|
+
unsubscribeEventStream();
|
|
2234
2578
|
permission.cancelPending("ACP transport closed");
|
|
2235
2579
|
for (const session of sessions.values()) cancelSession(session, "ACP transport closed");
|
|
2236
2580
|
const inFlight = promptSettled;
|