@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
|
@@ -4,6 +4,7 @@ import type { SafeEventBus } from "../core/event-bus.js";
|
|
|
4
4
|
import { parseCouncilReport, parseOracleResult } from "../domains/agents/index.js";
|
|
5
5
|
import type { AgentSpec } from "../domains/agents/spec.js";
|
|
6
6
|
import type { ContextInitOptions } from "../domains/context/init-options.js";
|
|
7
|
+
import { AdmissionCanceledError } from "../domains/dispatch/admission-error.js";
|
|
7
8
|
import type { DispatchContract, DispatchRequest } from "../domains/dispatch/contract.js";
|
|
8
9
|
import { type AgentRoleFactsResolver, requestExecutionRole } from "../domains/dispatch/execution-role.js";
|
|
9
10
|
import type { RunReceipt } from "../domains/dispatch/types.js";
|
|
@@ -11,6 +12,14 @@ import type { JobThinkingLevel } from "../domains/dispatch/validation.js";
|
|
|
11
12
|
import type { ReceiptIntegrityOutcome } from "../domains/evidence/trust-status.js";
|
|
12
13
|
import type { InstalledExtension } from "../domains/extensions/index.js";
|
|
13
14
|
import type { InteropAgentId, InteropProposal, InteropReport } from "../domains/interop/index.js";
|
|
15
|
+
import {
|
|
16
|
+
isPanesPresetId,
|
|
17
|
+
PANES_PRESET_IDS,
|
|
18
|
+
PANES_PRESETS,
|
|
19
|
+
type PanesOperations,
|
|
20
|
+
type PanesPresetId,
|
|
21
|
+
type PanesStatus,
|
|
22
|
+
} from "../domains/mux/operations.js";
|
|
14
23
|
import type { ProvidersContract, ResolvedModelRef } from "../domains/providers/index.js";
|
|
15
24
|
import { resolveModelReference } from "../domains/providers/index.js";
|
|
16
25
|
import type {
|
|
@@ -27,13 +36,13 @@ import type { NoticeLevel } from "./command-output.js";
|
|
|
27
36
|
import {
|
|
28
37
|
buildCouncilDispatchArgs,
|
|
29
38
|
COUNCIL_MAX_ROUNDS,
|
|
39
|
+
COUNCIL_SYNTHESIS_LABEL,
|
|
30
40
|
COUNCIL_SYNTHESIS_MODES,
|
|
31
41
|
type CouncilCommandOptions,
|
|
32
42
|
type CouncilRosters,
|
|
33
43
|
isCouncilSynthesisMode,
|
|
34
44
|
resolveCouncilRoster,
|
|
35
45
|
} from "./council.js";
|
|
36
|
-
import { COUNCIL_SYNTHESIS_LABEL } from "./council-grid.js";
|
|
37
46
|
import {
|
|
38
47
|
formatOracleAnswer,
|
|
39
48
|
ORACLE_AGENT_ID,
|
|
@@ -41,8 +50,7 @@ import {
|
|
|
41
50
|
type OracleDigestSources,
|
|
42
51
|
packOracleDigest,
|
|
43
52
|
} from "./oracle.js";
|
|
44
|
-
import {
|
|
45
|
-
import { isLibraryTab, LIBRARY_TABS } from "./overlays/skills-hub.js";
|
|
53
|
+
import { isLibraryTab, LIBRARY_TABS } from "./overlays/library-tabs.js";
|
|
46
54
|
import type { CommandArgsSpec, CommandPositionalSpec, ParsedArgs } from "./slash-spec.js";
|
|
47
55
|
import { matchFromSpec, usageLine } from "./slash-spec.js";
|
|
48
56
|
import {
|
|
@@ -60,14 +68,43 @@ import type { WorkerEntryState } from "./worker-stream.js";
|
|
|
60
68
|
* one user-facing slash command: how it parses, which SlashCommand kinds it
|
|
61
69
|
* produces, and how those kinds execute. Adding a new command is one entry
|
|
62
70
|
* rather than extending two parallel switches.
|
|
71
|
+
*
|
|
72
|
+
* This module is a CLI seam, which constrains what it may import.
|
|
73
|
+
* `src/cli/run.ts` reaches `parseSlashCommand` here so a headless
|
|
74
|
+
* `clio-coder run "/typo"` refuses the token by the same shape test and the same
|
|
75
|
+
* registry membership the editor uses; a second copy of the parser would drift
|
|
76
|
+
* from this one on the first command added. That makes the CLI a reacher of
|
|
77
|
+
* everything this file statically imports, so nothing here may reach the
|
|
78
|
+
* interactive render graph: no theme, no overlay frame, no overlay module, no
|
|
79
|
+
* `../engine/tui.js`. Those modules share one bundle chunk with the instant
|
|
80
|
+
* shell's Stage 0 closure, and a second, disjoint reacher makes esbuild split
|
|
81
|
+
* it, which is a startup-latency regression rather than a style problem. The
|
|
82
|
+
* parse-time data tables the registry needs live in leaves for that reason:
|
|
83
|
+
* `./overlays/library-tabs.js` and `COUNCIL_SYNTHESIS_LABEL` in
|
|
84
|
+
* `./council.js`. Import from those, not from overlays that re-export them.
|
|
85
|
+
*
|
|
86
|
+
* Boundaries rule6 in `tests/boundaries/check-boundaries.ts` refuses a violation
|
|
87
|
+
* at lint time; `tests/contracts/instant-shell-import-graph.test.ts` is the
|
|
88
|
+
* measurement it protects.
|
|
63
89
|
*/
|
|
64
90
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
| { kind: "
|
|
70
|
-
| { kind: "
|
|
91
|
+
/** Put a finished worker run's answer into the main agent's context. Bare `/share` takes the newest one. */
|
|
92
|
+
type ShareCommandVariant = { kind: "share"; runId?: string };
|
|
93
|
+
type ArchiveCommandVariant =
|
|
94
|
+
| { kind: "archive-export"; path: string }
|
|
95
|
+
| { kind: "archive-import"; path: string; dryRun: boolean; force: boolean }
|
|
96
|
+
| { kind: "archive-usage"; subcommand?: "export" | "import"; error?: string };
|
|
97
|
+
|
|
98
|
+
export const SETTINGS_AREA_IDS = [
|
|
99
|
+
"chat",
|
|
100
|
+
"fleet",
|
|
101
|
+
"targets",
|
|
102
|
+
"context",
|
|
103
|
+
"safety",
|
|
104
|
+
"interface",
|
|
105
|
+
"integrations",
|
|
106
|
+
] as const;
|
|
107
|
+
export type SettingsAreaId = (typeof SETTINGS_AREA_IDS)[number];
|
|
71
108
|
|
|
72
109
|
type SlashCommandVariant =
|
|
73
110
|
| { kind: "quit" }
|
|
@@ -78,12 +115,10 @@ type SlashCommandVariant =
|
|
|
78
115
|
/** `ref` is the turnId an `[evicted ...]` marker names. */
|
|
79
116
|
| { kind: "context-recall"; ref: string }
|
|
80
117
|
| { kind: "skill-selector" }
|
|
81
|
-
| { kind: "
|
|
118
|
+
| { kind: "resources"; family?: "skills" | "prompts" | "extensions"; tab?: LibraryEntryKind }
|
|
82
119
|
| { kind: "skill-invocation"; text: string }
|
|
83
|
-
| { kind: "prompts" }
|
|
84
|
-
| { kind: "extensions" }
|
|
85
|
-
| { kind: "interop" }
|
|
86
120
|
| ShareCommandVariant
|
|
121
|
+
| ArchiveCommandVariant
|
|
87
122
|
/** `source` is the line the operator typed, echoed above the run's transcript block. */
|
|
88
123
|
| { kind: "run"; agentId: string; task: string; options: RunCommandOptions; source: string }
|
|
89
124
|
| { kind: "run-usage" }
|
|
@@ -102,7 +137,8 @@ type SlashCommandVariant =
|
|
|
102
137
|
/** `/fleet run <name>`: compile the plan, show it for approval, dispatch on accept. */
|
|
103
138
|
| { kind: "fleet-run"; name: string; vars: Record<string, string> }
|
|
104
139
|
| { kind: "fleet-run-usage"; reason?: string }
|
|
105
|
-
| { kind: "
|
|
140
|
+
| { kind: "fleet" }
|
|
141
|
+
| { kind: "agents"; connect?: boolean }
|
|
106
142
|
| { kind: "cost" }
|
|
107
143
|
| { kind: "context-view" }
|
|
108
144
|
| { kind: "tasks" }
|
|
@@ -116,11 +152,22 @@ type SlashCommandVariant =
|
|
|
116
152
|
| { kind: "view"; filter?: string }
|
|
117
153
|
| { kind: "view-verify"; runId: string }
|
|
118
154
|
| { kind: "view-usage" }
|
|
155
|
+
/** `/panes`: mode, health, pane inventory, effective settings. */
|
|
156
|
+
| { kind: "panes" }
|
|
157
|
+
| { kind: "panes-show"; target: string }
|
|
158
|
+
/** A preset the model may also ask for, or operator-only argv. Never both. */
|
|
159
|
+
| { kind: "panes-open"; preset?: PanesPresetId; argv?: ReadonlyArray<string>; once?: boolean }
|
|
160
|
+
/** Toggle zoom on a Clio-owned pane; the bare form targets the watch pane. */
|
|
161
|
+
| { kind: "panes-zoom"; target: string }
|
|
162
|
+
| { kind: "panes-close"; target: string }
|
|
163
|
+
| { kind: "panes-usage"; reason?: string }
|
|
119
164
|
| { kind: "thinking-set"; level: string }
|
|
165
|
+
| { kind: "thinking-picker" }
|
|
120
166
|
| { kind: "output-set"; verbosity: string }
|
|
167
|
+
| { kind: "output-picker" }
|
|
121
168
|
| { kind: "model" }
|
|
122
169
|
| { kind: "model-set"; pattern: string }
|
|
123
|
-
| { kind: "settings";
|
|
170
|
+
| { kind: "settings"; area?: SettingsAreaId; group?: string }
|
|
124
171
|
| { kind: "resume" }
|
|
125
172
|
| { kind: "new" }
|
|
126
173
|
| { kind: "tree" }
|
|
@@ -258,21 +305,27 @@ async function runAttributed(
|
|
|
258
305
|
progressBus?.emit(BusChannels.DispatchProgress, { runId: handle.runId, agentId: request.agentId, event });
|
|
259
306
|
}
|
|
260
307
|
const receipt = await handle.finalPromise;
|
|
261
|
-
if (receipt.
|
|
308
|
+
if (receipt.outcome === "canceled") {
|
|
309
|
+
notice("warn", `${command} aborted: ${receipt.outcomeDetail ?? "operator abort"}`);
|
|
310
|
+
} else if (receipt.exitCode !== 0 || receipt.failureMessage) {
|
|
262
311
|
const failure = receipt.failureMessage ? ` ${receipt.failureMessage}` : "";
|
|
263
312
|
notice("error", `${command} failed: exit=${receipt.exitCode}${failure}`);
|
|
264
313
|
}
|
|
265
314
|
if (share) shareReceipt(request.agentId, receipt, deps);
|
|
266
315
|
} catch (err) {
|
|
267
316
|
const msg = err instanceof Error ? err.message : String(err);
|
|
268
|
-
|
|
317
|
+
if (err instanceof AdmissionCanceledError) {
|
|
318
|
+
notice("warn", `${command} aborted: ${msg.replace(/^dispatch:\s*/u, "")}`);
|
|
319
|
+
} else {
|
|
320
|
+
notice("error", `${command} failed: ${msg}`);
|
|
321
|
+
}
|
|
269
322
|
}
|
|
270
323
|
}
|
|
271
324
|
|
|
272
325
|
/**
|
|
273
326
|
* Dispatches /run through the dispatch contract and streams events to stdout.
|
|
274
327
|
* Target + model are resolved by the dispatch domain from request overrides,
|
|
275
|
-
* worker profiles, recipe hints, and `settings.
|
|
328
|
+
* worker profiles, recipe hints, and `settings.fleet.default`.
|
|
276
329
|
*/
|
|
277
330
|
export async function handleRun(
|
|
278
331
|
agentId: string,
|
|
@@ -629,20 +682,36 @@ export interface SlashCommandContext {
|
|
|
629
682
|
seedTaskMemory?: () => TaskMemorySeedCommandResult;
|
|
630
683
|
/** Open `/view`, the full observability artifact viewer. */
|
|
631
684
|
openView: (filter?: string) => void;
|
|
685
|
+
/**
|
|
686
|
+
* The pane layer's operator surface. It remains present when mux resolves to
|
|
687
|
+
* `none` because the Yazi preset can borrow the terminal for one selection;
|
|
688
|
+
* absent only when the host did not compose pane operations at all.
|
|
689
|
+
*/
|
|
690
|
+
panes?: PanesOperations;
|
|
691
|
+
/** Serialize a local async command so the next admitted slash command observes its committed state. */
|
|
692
|
+
runLocalOperation?: (operation: () => Promise<void>) => void;
|
|
632
693
|
/**
|
|
633
694
|
* Apply a thinking level named on the command line. Returns why it was
|
|
634
695
|
* refused so the caller can say so, because the level the operator typed may
|
|
635
696
|
* not be one the active target supports.
|
|
636
697
|
*/
|
|
637
698
|
setThinkingLevel?: (level: string) => SetThinkingLevelResult;
|
|
699
|
+
thinkingLevelChoices?: () => ReadonlyArray<{ value: string; label: string }>;
|
|
700
|
+
openThinkingPicker?: () => void;
|
|
638
701
|
/** Apply a transcript verbosity named on the command line; refused values are reported by the caller. */
|
|
639
702
|
setOutputVerbosity?: (verbosity: string) => SetOutputVerbosityResult;
|
|
703
|
+
openOutputPicker?: () => void;
|
|
640
704
|
openModel: () => void;
|
|
641
705
|
/** Live providers contract used by `/model <pattern>` to resolve directly. */
|
|
642
706
|
providers: ProvidersContract;
|
|
643
|
-
/**
|
|
644
|
-
|
|
645
|
-
|
|
707
|
+
/**
|
|
708
|
+
* Apply a resolved model reference, or hand it to the scope dialog. "pending"
|
|
709
|
+
* means the operator has yet to choose session or global and nothing has
|
|
710
|
+
* changed; the dialog reports the outcome itself.
|
|
711
|
+
*/
|
|
712
|
+
applyModelRef: (ref: ResolvedModelRef) => "applied" | "pending";
|
|
713
|
+
openSettings: (area?: SettingsAreaId, group?: string) => void;
|
|
714
|
+
openFleetRuns?: () => void;
|
|
646
715
|
openResume: () => void;
|
|
647
716
|
startNewSession: () => void;
|
|
648
717
|
openTree: () => void;
|
|
@@ -662,10 +731,16 @@ export interface SlashCommandContext {
|
|
|
662
731
|
runCompact: (instructions: string | undefined) => void;
|
|
663
732
|
/**
|
|
664
733
|
* Escape hatch for the `view verify` entry: verify a receipt file on disk
|
|
665
|
-
* and emit
|
|
734
|
+
* and emit an actionable verification block. Kept on the context so the registry does
|
|
666
735
|
* not import the overlay module.
|
|
667
736
|
*/
|
|
668
|
-
verifyReceipt: (runId: string) => ReceiptIntegrityOutcome
|
|
737
|
+
verifyReceipt: (runId: string) => ReceiptIntegrityOutcome & {
|
|
738
|
+
receiptPath?: string;
|
|
739
|
+
sealedDigest?: string | null;
|
|
740
|
+
trustSummary?: string | null;
|
|
741
|
+
compromised?: boolean;
|
|
742
|
+
checks?: ReadonlyArray<{ name: string; ok: boolean; evidence: string }>;
|
|
743
|
+
};
|
|
669
744
|
/**
|
|
670
745
|
* Handles the "unknown" case: append the text to the chat panel as a user
|
|
671
746
|
* turn, submit to the chat loop, and schedule a re-render. Handlers for
|
|
@@ -677,6 +752,24 @@ export interface SlashCommandContext {
|
|
|
677
752
|
render: () => void;
|
|
678
753
|
}
|
|
679
754
|
|
|
755
|
+
type SlashReceiptVerification = ReturnType<SlashCommandContext["verifyReceipt"]>;
|
|
756
|
+
|
|
757
|
+
/** Compact multiline receipt verification for the composer notice surface. */
|
|
758
|
+
function formatReceiptVerificationBlock(runId: string, result: SlashReceiptVerification): string {
|
|
759
|
+
const status = result.ok ? (result.compromised ? "compromised" : "ok") : result.retired ? "retired" : "fail";
|
|
760
|
+
const lines = [
|
|
761
|
+
`verify ${status} ${runId}`,
|
|
762
|
+
`receipt ${result.receiptPath ?? "unavailable"}`,
|
|
763
|
+
`digest ${result.sealedDigest ?? "unavailable"}`,
|
|
764
|
+
`evidence ${result.trustSummary ?? (!result.ok ? result.reason : "trust status unavailable")}`,
|
|
765
|
+
];
|
|
766
|
+
if (result.checks && result.checks.length > 0) {
|
|
767
|
+
lines.push("checks");
|
|
768
|
+
for (const check of result.checks) lines.push(` ${check.ok ? "✓" : "✗"} ${check.name}: ${check.evidence}`);
|
|
769
|
+
}
|
|
770
|
+
return lines.join("\n");
|
|
771
|
+
}
|
|
772
|
+
|
|
680
773
|
/** The one operator-authored turn used by slash and overlay handoff paths. */
|
|
681
774
|
export function formatUserTaskHandoff(task: Pick<UserTask, "id" | "title" | "note">): string {
|
|
682
775
|
const note = task.note ? ` ${task.note}.` : "";
|
|
@@ -684,7 +777,7 @@ export function formatUserTaskHandoff(task: Pick<UserTask, "id" | "title" | "not
|
|
|
684
777
|
}
|
|
685
778
|
|
|
686
779
|
/** The verb a command performs, in the order /help lists the groups. */
|
|
687
|
-
export const SLASH_COMMAND_GROUPS = ["
|
|
780
|
+
export const SLASH_COMMAND_GROUPS = ["Work", "Inspect", "Configure", "Session"] as const;
|
|
688
781
|
export type SlashCommandGroup = (typeof SLASH_COMMAND_GROUPS)[number];
|
|
689
782
|
|
|
690
783
|
export interface BuiltinSlashCommand {
|
|
@@ -711,8 +804,8 @@ function isRunThinkingLevel(value: string): value is JobThinkingLevel {
|
|
|
711
804
|
return RUN_THINKING_LEVELS.some((level) => level === value);
|
|
712
805
|
}
|
|
713
806
|
|
|
714
|
-
function
|
|
715
|
-
return
|
|
807
|
+
function isSettingsAreaId(value: string): value is SettingsAreaId {
|
|
808
|
+
return SETTINGS_AREA_IDS.some((area) => area === value);
|
|
716
809
|
}
|
|
717
810
|
|
|
718
811
|
/** `/context compact` alone keeps a free-form optional instruction tail. */
|
|
@@ -739,37 +832,51 @@ function fromArgsOrUsage(name: string, command: SlashCommand): (parsed: ParsedAr
|
|
|
739
832
|
return (parsed) => (parsed.error ? { kind: "usage-error", command: name, reason: parsed.error } : command);
|
|
740
833
|
}
|
|
741
834
|
|
|
742
|
-
/**
|
|
743
|
-
* A configuration-shaped command that is a shortcut into one settings section.
|
|
744
|
-
* It parses to the same `settings` command `/settings <section>` produces, so
|
|
745
|
-
* the settings entry dispatches it and this entry owns no kind of its own.
|
|
746
|
-
*/
|
|
747
|
-
function settingsDeepLink(
|
|
748
|
-
name: string,
|
|
749
|
-
section: SettingsSectionId,
|
|
750
|
-
description: string,
|
|
751
|
-
rowId?: SettingsCenterRowId,
|
|
752
|
-
): BuiltinSlashCommand {
|
|
753
|
-
return {
|
|
754
|
-
name,
|
|
755
|
-
description,
|
|
756
|
-
group: "Configure",
|
|
757
|
-
kinds: [],
|
|
758
|
-
args: {},
|
|
759
|
-
fromArgs: fromArgsOrUsage(name, { kind: "settings", section, ...(rowId ? { rowId } : {}) }),
|
|
760
|
-
handle: () => undefined,
|
|
761
|
-
};
|
|
762
|
-
}
|
|
763
|
-
|
|
764
835
|
function usageNotice(entry: BuiltinSlashCommand, subcommand?: string): string {
|
|
765
836
|
return usageLine(entry, subcommand).trim();
|
|
766
837
|
}
|
|
767
838
|
|
|
839
|
+
/**
|
|
840
|
+
* `/panes` output, as plain lines. Pure so the contract test asserts the text
|
|
841
|
+
* an operator reads rather than the object behind it, and so the registry keeps
|
|
842
|
+
* its promise not to reach a renderer.
|
|
843
|
+
*/
|
|
844
|
+
function formatPanesStatus(status: PanesStatus): ReadonlyArray<string> {
|
|
845
|
+
const server = status.server ? `pane host ${status.server.version}, protocol ${status.server.protocol}` : "no server";
|
|
846
|
+
const lines = [
|
|
847
|
+
`panes: mode=${status.mode} ${status.available ? "available" : "unavailable"} (${server})`,
|
|
848
|
+
` ${status.reason}`,
|
|
849
|
+
...(status.socketPath ? [` socket ${status.socketPath}`] : []),
|
|
850
|
+
` settings: enabled=${status.settings.enabled} notifications=${status.settings.notifications} layout=${status.settings.layout} journal=${status.settings.journal}`,
|
|
851
|
+
` files: enabled=${status.settings.yazi.enabled} mode=${status.settings.yazi.mode} profile=${status.settings.yazi.profile} followCwd=${status.settings.yazi.followCwd}`,
|
|
852
|
+
` file pane: mode=${status.yazi.mode} pane=${status.yazi.paneId ?? "none"} cwd=${status.yazi.paneCwd ?? "unknown"} lastLine=${status.yazi.lastLineAt === null ? "never" : new Date(status.yazi.lastLineAt).toISOString()} dropped=${status.yazi.droppedLines}`,
|
|
853
|
+
];
|
|
854
|
+
if (status.docks.length > 0) {
|
|
855
|
+
lines.push(
|
|
856
|
+
` docks: ${status.docks
|
|
857
|
+
.map((dock) => `${dock.slot}=${dock.paneId} @${(dock.targetShare * 100).toFixed(0)}%`)
|
|
858
|
+
.join(", ")}`,
|
|
859
|
+
);
|
|
860
|
+
}
|
|
861
|
+
if (status.panes.length === 0) {
|
|
862
|
+
lines.push(" no Clio-owned panes");
|
|
863
|
+
} else {
|
|
864
|
+
lines.push(` ${status.panes.length} Clio-owned pane(s):`);
|
|
865
|
+
for (const pane of status.panes) {
|
|
866
|
+
const adopted = pane.adopted ? " adopted" : "";
|
|
867
|
+
const pending = pane.pending ? " opening" : "";
|
|
868
|
+
lines.push(` ${pane.paneId} ${pane.purpose} ${pane.label}${adopted}${pending}`);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
lines.push(` presets: ${PANES_PRESETS.map((preset) => `${preset.id} (${preset.summary})`).join(", ")}`);
|
|
872
|
+
return lines;
|
|
873
|
+
}
|
|
874
|
+
|
|
768
875
|
export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
769
876
|
{
|
|
770
877
|
name: "quit",
|
|
771
878
|
description: "Exit Clio Coder",
|
|
772
|
-
group: "
|
|
879
|
+
group: "Session",
|
|
773
880
|
kinds: ["quit"],
|
|
774
881
|
args: {},
|
|
775
882
|
fromArgs: fromArgsOrUsage("quit", { kind: "quit" }),
|
|
@@ -795,7 +902,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
795
902
|
{
|
|
796
903
|
name: "skill",
|
|
797
904
|
description: "Open the Skills Hub or invoke a skill",
|
|
798
|
-
group: "
|
|
905
|
+
group: "Work",
|
|
799
906
|
kinds: ["skill-selector", "skill-invocation"],
|
|
800
907
|
args: {
|
|
801
908
|
positionals: [
|
|
@@ -822,65 +929,74 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
822
929
|
},
|
|
823
930
|
},
|
|
824
931
|
{
|
|
825
|
-
name: "
|
|
826
|
-
description: "
|
|
827
|
-
group: "
|
|
828
|
-
kinds: ["
|
|
829
|
-
|
|
932
|
+
name: "resources",
|
|
933
|
+
description: "Browse skills, prompts, libraries, and extensions",
|
|
934
|
+
group: "Inspect",
|
|
935
|
+
kinds: ["resources"],
|
|
936
|
+
subcommandDescriptions: {
|
|
937
|
+
skills: "Browse installed skills",
|
|
938
|
+
prompts: "Browse prompt templates",
|
|
939
|
+
library: "Browse resource libraries",
|
|
940
|
+
extensions: "Browse installed extensions",
|
|
941
|
+
},
|
|
942
|
+
args: {
|
|
943
|
+
subcommands: {
|
|
944
|
+
skills: {},
|
|
945
|
+
prompts: {},
|
|
946
|
+
library: { positionals: [{ name: "kind", required: false }] },
|
|
947
|
+
extensions: {},
|
|
948
|
+
},
|
|
949
|
+
},
|
|
830
950
|
fromArgs(parsed) {
|
|
831
|
-
if (parsed.error) return { kind: "usage-error", command: "
|
|
951
|
+
if (parsed.error) return { kind: "usage-error", command: "resources", reason: parsed.error };
|
|
952
|
+
if (parsed.subcommand === undefined || parsed.subcommand === "skills")
|
|
953
|
+
return { kind: "resources", family: "skills" };
|
|
954
|
+
if (parsed.subcommand === "prompts" || parsed.subcommand === "extensions")
|
|
955
|
+
return { kind: "resources", family: parsed.subcommand };
|
|
832
956
|
const tab = parsed.positionals[0];
|
|
833
|
-
if (tab === undefined) return { kind: "
|
|
957
|
+
if (tab === undefined) return { kind: "resources" };
|
|
834
958
|
if (!isLibraryTab(tab)) {
|
|
835
959
|
const known = LIBRARY_TABS.map((entry) => entry.id).join(", ");
|
|
836
|
-
return { kind: "usage-error", command: "
|
|
960
|
+
return { kind: "usage-error", command: "resources", reason: `Unknown kind: ${tab} (one of ${known})` };
|
|
837
961
|
}
|
|
838
|
-
return { kind: "
|
|
962
|
+
return { kind: "resources", tab };
|
|
839
963
|
},
|
|
840
964
|
handle(command, ctx) {
|
|
841
|
-
if (command.kind
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
name: "prompts",
|
|
846
|
-
description: "List prompt templates",
|
|
847
|
-
group: "Inspect",
|
|
848
|
-
kinds: ["prompts"],
|
|
849
|
-
args: {},
|
|
850
|
-
fromArgs: fromArgsOrUsage("prompts", { kind: "prompts" }),
|
|
851
|
-
handle(_command, ctx) {
|
|
852
|
-
ctx.openPrompts();
|
|
965
|
+
if (command.kind !== "resources") return;
|
|
966
|
+
if (command.family === "prompts") ctx.openPrompts();
|
|
967
|
+
else if (command.family === "extensions") ctx.openExtensions();
|
|
968
|
+
else ctx.openSkillsHub?.(command.tab);
|
|
853
969
|
},
|
|
854
970
|
},
|
|
855
971
|
{
|
|
856
|
-
name: "
|
|
857
|
-
description: "
|
|
858
|
-
group: "
|
|
859
|
-
kinds: ["
|
|
860
|
-
args: {},
|
|
861
|
-
fromArgs
|
|
862
|
-
|
|
863
|
-
|
|
972
|
+
name: "share",
|
|
973
|
+
description: "Share a worker result with the main agent",
|
|
974
|
+
group: "Work",
|
|
975
|
+
kinds: ["share"],
|
|
976
|
+
args: { positionals: [{ name: "run-id", required: false }] },
|
|
977
|
+
fromArgs(parsed) {
|
|
978
|
+
const retiredArchiveVerb = parsed.positionals[0];
|
|
979
|
+
if (retiredArchiveVerb === "export" || retiredArchiveVerb === "import") {
|
|
980
|
+
return {
|
|
981
|
+
kind: "usage-error",
|
|
982
|
+
command: "share",
|
|
983
|
+
reason: `/share ${retiredArchiveVerb} is retired and did not run; use /archive ${retiredArchiveVerb}`,
|
|
984
|
+
};
|
|
985
|
+
}
|
|
986
|
+
if (parsed.error) return { kind: "usage-error", command: "share", reason: parsed.error };
|
|
987
|
+
return { kind: "share", ...(parsed.positionals[0] ? { runId: parsed.positionals[0] } : {}) };
|
|
864
988
|
},
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
name: "interop",
|
|
868
|
-
description: "Review other coding agents detected on this machine",
|
|
869
|
-
group: "Inspect",
|
|
870
|
-
kinds: ["interop"],
|
|
871
|
-
args: {},
|
|
872
|
-
fromArgs: fromArgsOrUsage("interop", { kind: "interop" }),
|
|
873
|
-
handle(_command, ctx) {
|
|
874
|
-
ctx.openInterop?.();
|
|
989
|
+
handle(command, ctx) {
|
|
990
|
+
if (command.kind === "share") shareWorkerRun(command.runId, ctx);
|
|
875
991
|
},
|
|
876
992
|
},
|
|
877
993
|
{
|
|
878
|
-
name: "
|
|
879
|
-
description: "
|
|
880
|
-
group: "
|
|
881
|
-
kinds: ["
|
|
994
|
+
name: "archive",
|
|
995
|
+
description: "Export or import a full Clio archive",
|
|
996
|
+
group: "Session",
|
|
997
|
+
kinds: ["archive-export", "archive-import", "archive-usage"],
|
|
998
|
+
subcommandDescriptions: { export: "Export a full Clio archive", import: "Import a full Clio archive" },
|
|
882
999
|
args: {
|
|
883
|
-
positionals: [{ name: "runId", required: false }],
|
|
884
1000
|
subcommands: {
|
|
885
1001
|
export: {
|
|
886
1002
|
positionals: [{ name: "path", required: true }],
|
|
@@ -895,56 +1011,43 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
895
1011
|
const subcommand = parsed.subcommand === "export" || parsed.subcommand === "import" ? parsed.subcommand : undefined;
|
|
896
1012
|
if (parsed.error) {
|
|
897
1013
|
return {
|
|
898
|
-
kind: "
|
|
899
|
-
action: "usage",
|
|
1014
|
+
kind: "archive-usage",
|
|
900
1015
|
...(subcommand !== undefined ? { subcommand } : {}),
|
|
901
1016
|
error: parsed.error,
|
|
902
1017
|
};
|
|
903
1018
|
}
|
|
904
1019
|
const path = parsed.positionals[0];
|
|
905
|
-
if (subcommand === "export" && path !== undefined) return { kind: "
|
|
1020
|
+
if (subcommand === "export" && path !== undefined) return { kind: "archive-export", path };
|
|
906
1021
|
if (subcommand === "import" && path !== undefined) {
|
|
907
1022
|
return {
|
|
908
|
-
kind: "
|
|
909
|
-
action: "import",
|
|
1023
|
+
kind: "archive-import",
|
|
910
1024
|
path,
|
|
911
1025
|
dryRun: parsed.flags.has("--dry-run"),
|
|
912
1026
|
force: parsed.flags.has("--force"),
|
|
913
1027
|
};
|
|
914
1028
|
}
|
|
915
|
-
|
|
916
|
-
// without a run id. `export` and `import` are the archive senses and are
|
|
917
|
-
// matched above, so neither reading can swallow the other.
|
|
918
|
-
if (subcommand === undefined) {
|
|
919
|
-
return { kind: "share", action: "worker-run", ...(path !== undefined ? { runId: path } : {}) };
|
|
920
|
-
}
|
|
921
|
-
return { kind: "share", action: "usage", ...(subcommand !== undefined ? { subcommand } : {}) };
|
|
1029
|
+
return { kind: "archive-usage", ...(subcommand !== undefined ? { subcommand } : {}) };
|
|
922
1030
|
},
|
|
923
1031
|
handle(command, ctx) {
|
|
924
|
-
if (command.kind
|
|
925
|
-
|
|
926
|
-
shareWorkerRun(command.runId, ctx);
|
|
927
|
-
return;
|
|
928
|
-
}
|
|
929
|
-
if (command.action === "usage") {
|
|
930
|
-
const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === "share");
|
|
1032
|
+
if (command.kind === "archive-usage") {
|
|
1033
|
+
const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === "archive");
|
|
931
1034
|
if (!entry) return;
|
|
932
1035
|
const usage = usageNotice(entry, command.subcommand);
|
|
933
1036
|
ctx.notice("info", command.error ? `${command.error}\n${usage}` : usage);
|
|
934
1037
|
return;
|
|
935
1038
|
}
|
|
936
|
-
if (command.
|
|
1039
|
+
if (command.kind === "archive-export") {
|
|
937
1040
|
if (!ctx.exportShareArchive) {
|
|
938
|
-
ctx.notice("error", "
|
|
1041
|
+
ctx.notice("error", "archive export is not wired");
|
|
939
1042
|
return;
|
|
940
1043
|
}
|
|
941
1044
|
const result = ctx.exportShareArchive(command.path);
|
|
942
1045
|
ctx.notice("success", `exported ${result.fileCount} item(s) to ${result.path}`);
|
|
943
1046
|
return;
|
|
944
1047
|
}
|
|
945
|
-
if (command.
|
|
1048
|
+
if (command.kind === "archive-import") {
|
|
946
1049
|
if (!ctx.importShareArchive) {
|
|
947
|
-
ctx.notice("error", "
|
|
1050
|
+
ctx.notice("error", "archive import is not wired");
|
|
948
1051
|
return;
|
|
949
1052
|
}
|
|
950
1053
|
const plan = ctx.importShareArchive(command.path, { dryRun: command.dryRun, force: command.force });
|
|
@@ -965,7 +1068,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
965
1068
|
{
|
|
966
1069
|
name: "run",
|
|
967
1070
|
description: "Run a fleet agent",
|
|
968
|
-
group: "
|
|
1071
|
+
group: "Work",
|
|
969
1072
|
kinds: ["run", "run-usage"],
|
|
970
1073
|
args: {
|
|
971
1074
|
parseFlagsBeforeRest: true,
|
|
@@ -1056,7 +1159,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1056
1159
|
{
|
|
1057
1160
|
name: "delegate",
|
|
1058
1161
|
description: "Run an ACP delegation agent",
|
|
1059
|
-
group: "
|
|
1162
|
+
group: "Work",
|
|
1060
1163
|
kinds: ["delegate", "delegate-usage"],
|
|
1061
1164
|
args: {
|
|
1062
1165
|
parseFlagsBeforeRest: true,
|
|
@@ -1103,7 +1206,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1103
1206
|
{
|
|
1104
1207
|
name: "btw",
|
|
1105
1208
|
description: "Ask a side question that never enters the session transcript",
|
|
1106
|
-
group: "
|
|
1209
|
+
group: "Work",
|
|
1107
1210
|
kinds: ["btw", "btw-usage"],
|
|
1108
1211
|
args: {
|
|
1109
1212
|
positionals: [{ name: "question", required: true, rest: true }],
|
|
@@ -1126,7 +1229,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1126
1229
|
{
|
|
1127
1230
|
name: "oracle",
|
|
1128
1231
|
description: "Ask a read-only advisor to challenge a question against this session's settled decisions",
|
|
1129
|
-
group: "
|
|
1232
|
+
group: "Work",
|
|
1130
1233
|
kinds: ["oracle", "oracle-usage"],
|
|
1131
1234
|
args: {
|
|
1132
1235
|
positionals: [{ name: "question", required: true, rest: true }],
|
|
@@ -1152,7 +1255,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1152
1255
|
{
|
|
1153
1256
|
name: "council",
|
|
1154
1257
|
description: "Ask a roster of read-only members the same task, with an optional vote or judge synthesis",
|
|
1155
|
-
group: "
|
|
1258
|
+
group: "Work",
|
|
1156
1259
|
kinds: ["council", "council-usage"],
|
|
1157
1260
|
args: {
|
|
1158
1261
|
parseFlagsBeforeRest: true,
|
|
@@ -1204,16 +1307,24 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1204
1307
|
},
|
|
1205
1308
|
{
|
|
1206
1309
|
name: "agents",
|
|
1207
|
-
description: "List
|
|
1310
|
+
description: "List agents or connect a detected external agent",
|
|
1208
1311
|
group: "Inspect",
|
|
1209
1312
|
kinds: ["agents"],
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1313
|
+
subcommandDescriptions: {
|
|
1314
|
+
list: "List native and external agents",
|
|
1315
|
+
connect: "Review detected external-agent proposals",
|
|
1316
|
+
},
|
|
1317
|
+
args: { subcommands: { list: {}, connect: {} } },
|
|
1318
|
+
fromArgs(parsed) {
|
|
1319
|
+
if (parsed.error) return { kind: "usage-error", command: "agents", reason: parsed.error };
|
|
1320
|
+
return { kind: "agents", ...(parsed.subcommand === "connect" ? { connect: true } : {}) };
|
|
1321
|
+
},
|
|
1322
|
+
handle(command, ctx) {
|
|
1323
|
+
if (command.kind !== "agents") return;
|
|
1324
|
+
if (command.connect) ctx.openInterop?.();
|
|
1325
|
+
else ctx.openAgents();
|
|
1214
1326
|
},
|
|
1215
1327
|
},
|
|
1216
|
-
settingsDeepLink("targets", "targets", "Open Settings → Targets: health, use, connect, probe, remove"),
|
|
1217
1328
|
{
|
|
1218
1329
|
name: "cost",
|
|
1219
1330
|
description: "Show session token and cost totals",
|
|
@@ -1298,9 +1409,9 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1298
1409
|
},
|
|
1299
1410
|
{
|
|
1300
1411
|
name: "fleet",
|
|
1301
|
-
description: "Open
|
|
1302
|
-
group: "
|
|
1303
|
-
kinds: ["fleet-run", "fleet-run-usage"],
|
|
1412
|
+
description: "Open Fleet Runs or run a fleet contract with an approval preview",
|
|
1413
|
+
group: "Work",
|
|
1414
|
+
kinds: ["fleet", "fleet-run", "fleet-run-usage"],
|
|
1304
1415
|
subcommandDescriptions: { run: "Preview and run a repo-owned fleet contract" },
|
|
1305
1416
|
args: {
|
|
1306
1417
|
subcommands: {
|
|
@@ -1310,17 +1421,9 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1310
1421
|
},
|
|
1311
1422
|
},
|
|
1312
1423
|
},
|
|
1313
|
-
/**
|
|
1314
|
-
* `/fleet` alone keeps the settings deep link it has always been, and
|
|
1315
|
-
* only `run` parses as a command of its own, so an operator who types
|
|
1316
|
-
* `/fleet` out of habit still lands in Settings → Fleet. Anything else
|
|
1317
|
-
* on the line stays the usage error every other deep link reports.
|
|
1318
|
-
*/
|
|
1319
1424
|
fromArgs(parsed) {
|
|
1320
1425
|
if (parsed.subcommand !== "run") {
|
|
1321
|
-
return parsed.error
|
|
1322
|
-
? { kind: "usage-error", command: "fleet", reason: parsed.error }
|
|
1323
|
-
: { kind: "settings", section: "fleet" };
|
|
1426
|
+
return parsed.error ? { kind: "usage-error", command: "fleet", reason: parsed.error } : { kind: "fleet" };
|
|
1324
1427
|
}
|
|
1325
1428
|
if (parsed.error) return { kind: "fleet-run-usage", reason: parsed.error };
|
|
1326
1429
|
const name = parsed.positionals[0] ?? "";
|
|
@@ -1335,6 +1438,11 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1335
1438
|
return { kind: "fleet-run", name, vars };
|
|
1336
1439
|
},
|
|
1337
1440
|
handle(command, ctx) {
|
|
1441
|
+
if (command.kind === "fleet") {
|
|
1442
|
+
if (ctx.openFleetRuns) ctx.openFleetRuns();
|
|
1443
|
+
else ctx.notice("error", "Fleet Runs is not wired in this session");
|
|
1444
|
+
return;
|
|
1445
|
+
}
|
|
1338
1446
|
if (command.kind === "fleet-run-usage") {
|
|
1339
1447
|
const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === "fleet");
|
|
1340
1448
|
const usage = entry ? usageNotice(entry, "run") : "usage: /fleet run <name> [--var key=value ...]";
|
|
@@ -1505,32 +1613,178 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1505
1613
|
}
|
|
1506
1614
|
if (command.kind !== "view-verify") return;
|
|
1507
1615
|
const result = ctx.verifyReceipt(command.runId);
|
|
1616
|
+
const block = formatReceiptVerificationBlock(command.runId, result);
|
|
1508
1617
|
if (result.ok) {
|
|
1509
|
-
ctx.notice("success",
|
|
1618
|
+
ctx.notice(result.compromised ? "warn" : "success", block);
|
|
1510
1619
|
} else if (result.retired !== undefined) {
|
|
1511
1620
|
// A retired seal is the expected state of a run from the previous
|
|
1512
1621
|
// release, so it is a warning that names the versions, never the
|
|
1513
1622
|
// failure a tampered receipt gets.
|
|
1514
|
-
ctx.notice("warn",
|
|
1623
|
+
ctx.notice("warn", block);
|
|
1515
1624
|
} else {
|
|
1516
|
-
ctx.notice("error",
|
|
1625
|
+
ctx.notice("error", block);
|
|
1626
|
+
}
|
|
1627
|
+
},
|
|
1628
|
+
},
|
|
1629
|
+
{
|
|
1630
|
+
name: "panes",
|
|
1631
|
+
description: "Inspect the pane layer, watch a live run in a pane, or open a utility pane",
|
|
1632
|
+
group: "Inspect",
|
|
1633
|
+
kinds: ["panes", "panes-show", "panes-open", "panes-zoom", "panes-close", "panes-usage"],
|
|
1634
|
+
args: {
|
|
1635
|
+
subcommands: {
|
|
1636
|
+
show: { positionals: [{ name: "run-or-agent", required: true }] },
|
|
1637
|
+
// A rest positional, so an argv pane keeps its own flags: the parser
|
|
1638
|
+
// would otherwise refuse `--follow` as an unknown flag of `/panes`.
|
|
1639
|
+
open: { positionals: [{ name: "preset-or-argv", required: true, rest: true }] },
|
|
1640
|
+
zoom: { positionals: [{ name: "target", required: false }] },
|
|
1641
|
+
close: { positionals: [{ name: "target", required: false }] },
|
|
1642
|
+
},
|
|
1643
|
+
},
|
|
1644
|
+
subcommandDescriptions: {
|
|
1645
|
+
show: "watch a live run or agent in the watch pane",
|
|
1646
|
+
open: `open a utility pane (${PANES_PRESET_IDS.join(", ")}, or a command)`,
|
|
1647
|
+
zoom: "toggle zoom on a Clio-owned pane (default: the watch pane)",
|
|
1648
|
+
close: "close a Clio-owned pane, or all of them",
|
|
1649
|
+
},
|
|
1650
|
+
fromArgs(parsed) {
|
|
1651
|
+
if (parsed.error) return { kind: "panes-usage", reason: parsed.error };
|
|
1652
|
+
if (parsed.subcommand === "show") {
|
|
1653
|
+
return { kind: "panes-show", target: parsed.positionals[0] ?? "" };
|
|
1654
|
+
}
|
|
1655
|
+
if (parsed.subcommand === "open") {
|
|
1656
|
+
const rest = (parsed.rest ?? "").trim();
|
|
1657
|
+
if (rest.length === 0) return { kind: "panes-usage", reason: "Missing required argument: preset-or-argv" };
|
|
1658
|
+
const argv = rest.split(/\s+/).filter((token) => token.length > 0);
|
|
1659
|
+
const first = argv[0] ?? "";
|
|
1660
|
+
// A bare preset name is a preset; anything else is operator argv,
|
|
1661
|
+
// which the tool surface deliberately cannot ask for.
|
|
1662
|
+
if (argv.length === 1 && isPanesPresetId(first)) return { kind: "panes-open", preset: first };
|
|
1663
|
+
if (argv.length === 2 && first === "yazi" && argv[1] === "--once") {
|
|
1664
|
+
return { kind: "panes-open", preset: "yazi", once: true };
|
|
1665
|
+
}
|
|
1666
|
+
return { kind: "panes-open", argv };
|
|
1667
|
+
}
|
|
1668
|
+
if (parsed.subcommand === "zoom") {
|
|
1669
|
+
return { kind: "panes-zoom", target: parsed.positionals[0] ?? "" };
|
|
1670
|
+
}
|
|
1671
|
+
if (parsed.subcommand === "close") {
|
|
1672
|
+
return { kind: "panes-close", target: parsed.positionals[0] ?? "all" };
|
|
1673
|
+
}
|
|
1674
|
+
if (parsed.positionals.length > 0) {
|
|
1675
|
+
return { kind: "panes-usage", reason: `Unexpected argument: ${parsed.positionals[0]}` };
|
|
1676
|
+
}
|
|
1677
|
+
return { kind: "panes" };
|
|
1678
|
+
},
|
|
1679
|
+
handle(command, ctx) {
|
|
1680
|
+
const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === "panes");
|
|
1681
|
+
if (command.kind === "panes-usage") {
|
|
1682
|
+
// usageNotice trims the leading newline usageLine carries, so the reason
|
|
1683
|
+
// and the usage line need their own separator or they run together as
|
|
1684
|
+
// `Missing required argument: run-or-agentusage: /panes show ...`.
|
|
1685
|
+
if (entry) ctx.notice("info", command.reason ? `${command.reason}\n${usageNotice(entry)}` : usageNotice(entry));
|
|
1686
|
+
return;
|
|
1687
|
+
}
|
|
1688
|
+
const panes = ctx.panes;
|
|
1689
|
+
if (!panes) {
|
|
1690
|
+
// Inactive by choice, not unavailable: the operations object exists in
|
|
1691
|
+
// every `--with-panes` session, even one where no pane host answered.
|
|
1692
|
+
ctx.notice(
|
|
1693
|
+
"info",
|
|
1694
|
+
"panes are inactive: this session started without them. Restart with `clio-coder --with-panes`, or set panes.enabled=auto",
|
|
1695
|
+
);
|
|
1696
|
+
return;
|
|
1697
|
+
}
|
|
1698
|
+
const runLocal = ctx.runLocalOperation ?? ((operation: () => Promise<void>) => void operation());
|
|
1699
|
+
if (command.kind === "panes") {
|
|
1700
|
+
runLocal(async () => {
|
|
1701
|
+
for (const line of formatPanesStatus(panes.status())) ctx.io.stdout(`${line}\n`);
|
|
1702
|
+
ctx.render();
|
|
1703
|
+
});
|
|
1704
|
+
return;
|
|
1705
|
+
}
|
|
1706
|
+
if (command.kind === "panes-show") {
|
|
1707
|
+
runLocal(async () => {
|
|
1708
|
+
const result = await panes.show(command.target);
|
|
1709
|
+
if (result.status === "watching") {
|
|
1710
|
+
ctx.notice("success", `watching ${result.agentId} (${result.runId})${result.opened ? " in a new pane" : ""}`);
|
|
1711
|
+
} else if (result.status === "not-found") {
|
|
1712
|
+
const known = result.candidates.length > 0 ? `; live runs: ${result.candidates.join(", ")}` : "";
|
|
1713
|
+
ctx.notice("warn", `no live run matches ${result.target}${known}`);
|
|
1714
|
+
} else {
|
|
1715
|
+
ctx.notice("warn", result.reason);
|
|
1716
|
+
}
|
|
1717
|
+
});
|
|
1718
|
+
return;
|
|
1719
|
+
}
|
|
1720
|
+
if (command.kind === "panes-open") {
|
|
1721
|
+
runLocal(async () => {
|
|
1722
|
+
const result = await panes.open({
|
|
1723
|
+
...(command.preset ? { preset: command.preset } : {}),
|
|
1724
|
+
...(command.argv ? { argv: command.argv } : {}),
|
|
1725
|
+
...(command.once ? { once: true } : {}),
|
|
1726
|
+
});
|
|
1727
|
+
if (result.status === "opened") {
|
|
1728
|
+
// The in-terminal chooser has already restored the TUI by the
|
|
1729
|
+
// time this resolves. A pick emitted its composer notice; an empty
|
|
1730
|
+
// chooser was cancellation and deliberately stays silent.
|
|
1731
|
+
if (result.paneId !== null) ctx.notice("success", `opened pane ${result.label} (${result.paneId})`);
|
|
1732
|
+
} else if (result.status === "missing-binary") {
|
|
1733
|
+
// This is a synchronous slash-surface line, not a transient pane-host
|
|
1734
|
+
// notification. It remains visible when no pane was ever created and
|
|
1735
|
+
// reuses the exact doctor/tools diagnostic including the install hint.
|
|
1736
|
+
ctx.io.stdout(`${result.detail}\n`);
|
|
1737
|
+
ctx.render();
|
|
1738
|
+
} else {
|
|
1739
|
+
ctx.notice("warn", result.reason);
|
|
1740
|
+
}
|
|
1741
|
+
});
|
|
1742
|
+
return;
|
|
1517
1743
|
}
|
|
1744
|
+
if (command.kind === "panes-zoom") {
|
|
1745
|
+
runLocal(async () => {
|
|
1746
|
+
const result = await panes.zoom(command.target);
|
|
1747
|
+
if (result.status === "zoomed") {
|
|
1748
|
+
ctx.notice("success", `toggled zoom on ${result.label} (${result.paneId})`);
|
|
1749
|
+
} else if (result.status === "not-found") {
|
|
1750
|
+
ctx.notice("warn", `no Clio-owned pane matches ${result.target}`);
|
|
1751
|
+
} else {
|
|
1752
|
+
ctx.notice("warn", result.reason);
|
|
1753
|
+
}
|
|
1754
|
+
});
|
|
1755
|
+
return;
|
|
1756
|
+
}
|
|
1757
|
+
if (command.kind !== "panes-close") return;
|
|
1758
|
+
runLocal(async () => {
|
|
1759
|
+
const result = await panes.close(command.target);
|
|
1760
|
+
if (result.status === "closed") {
|
|
1761
|
+
const what = result.labels.length > 0 ? `: ${result.labels.join(", ")}` : "";
|
|
1762
|
+
ctx.notice(result.closed > 0 ? "success" : "info", `closed ${result.closed} pane(s)${what}`);
|
|
1763
|
+
} else if (result.status === "not-found") {
|
|
1764
|
+
ctx.notice("warn", `no Clio-owned pane matches ${result.target}`);
|
|
1765
|
+
} else {
|
|
1766
|
+
ctx.notice("warn", result.reason);
|
|
1767
|
+
}
|
|
1768
|
+
});
|
|
1518
1769
|
},
|
|
1519
1770
|
},
|
|
1520
1771
|
{
|
|
1521
1772
|
name: "thinking",
|
|
1522
|
-
description: "Set the chat thinking level
|
|
1773
|
+
description: "Set the chat thinking level",
|
|
1523
1774
|
group: "Configure",
|
|
1524
|
-
kinds: ["thinking-set"],
|
|
1775
|
+
kinds: ["thinking-set", "thinking-picker"],
|
|
1525
1776
|
args: { positionals: [{ name: "level", required: false }] },
|
|
1526
1777
|
fromArgs(parsed) {
|
|
1527
1778
|
if (parsed.error) return { kind: "usage-error", command: "thinking", reason: parsed.error };
|
|
1528
1779
|
const level = parsed.positionals[0];
|
|
1529
|
-
return level
|
|
1530
|
-
? { kind: "thinking-set", level }
|
|
1531
|
-
: { kind: "settings", section: "orchestrator", rowId: "orchestrator.thinkingLevel" };
|
|
1780
|
+
return level ? { kind: "thinking-set", level } : { kind: "thinking-picker" };
|
|
1532
1781
|
},
|
|
1533
1782
|
handle(command, ctx) {
|
|
1783
|
+
if (command.kind === "thinking-picker") {
|
|
1784
|
+
if (ctx.openThinkingPicker) ctx.openThinkingPicker();
|
|
1785
|
+
else ctx.notice("error", "thinking picker is not wired in this session");
|
|
1786
|
+
return;
|
|
1787
|
+
}
|
|
1534
1788
|
if (command.kind !== "thinking-set") return;
|
|
1535
1789
|
const result = ctx.setThinkingLevel?.(command.level) ?? { status: "unavailable" as const };
|
|
1536
1790
|
if (result.status === "applied") {
|
|
@@ -1545,18 +1799,21 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1545
1799
|
},
|
|
1546
1800
|
{
|
|
1547
1801
|
name: "output",
|
|
1548
|
-
description: "Set transcript detail
|
|
1802
|
+
description: "Set transcript detail to minimal, default, or verbose",
|
|
1549
1803
|
group: "Configure",
|
|
1550
|
-
kinds: ["output-set"],
|
|
1804
|
+
kinds: ["output-set", "output-picker"],
|
|
1551
1805
|
args: { positionals: [{ name: "verbosity", required: false }] },
|
|
1552
1806
|
fromArgs(parsed) {
|
|
1553
1807
|
if (parsed.error) return { kind: "usage-error", command: "output", reason: parsed.error };
|
|
1554
1808
|
const verbosity = parsed.positionals[0];
|
|
1555
|
-
return verbosity
|
|
1556
|
-
? { kind: "output-set", verbosity }
|
|
1557
|
-
: { kind: "settings", section: "terminal", rowId: "terminal.outputVerbosity" };
|
|
1809
|
+
return verbosity ? { kind: "output-set", verbosity } : { kind: "output-picker" };
|
|
1558
1810
|
},
|
|
1559
1811
|
handle(command, ctx) {
|
|
1812
|
+
if (command.kind === "output-picker") {
|
|
1813
|
+
if (ctx.openOutputPicker) ctx.openOutputPicker();
|
|
1814
|
+
else ctx.notice("error", "output picker is not wired in this session");
|
|
1815
|
+
return;
|
|
1816
|
+
}
|
|
1560
1817
|
if (command.kind !== "output-set") return;
|
|
1561
1818
|
const result = ctx.setOutputVerbosity?.(command.verbosity) ?? { status: "unavailable" as const };
|
|
1562
1819
|
if (result.status === "applied") {
|
|
@@ -1604,43 +1861,49 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1604
1861
|
return;
|
|
1605
1862
|
}
|
|
1606
1863
|
if (result.warning) ctx.notice("warn", result.warning);
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1864
|
+
// "pending" means the scope dialog is up: it says what landed and
|
|
1865
|
+
// where, so announcing a swap here would be announcing a choice the
|
|
1866
|
+
// operator has not made yet.
|
|
1867
|
+
if (ctx.applyModelRef(result.ref) === "applied") {
|
|
1868
|
+
const suffix = result.ref.thinkingLevel ? ` thinking=${result.ref.thinkingLevel}` : "";
|
|
1869
|
+
ctx.notice("success", `active this session: ${result.ref.target}/${result.ref.model}${suffix}`);
|
|
1870
|
+
}
|
|
1610
1871
|
ctx.render();
|
|
1611
1872
|
})();
|
|
1612
1873
|
},
|
|
1613
1874
|
},
|
|
1614
|
-
settingsDeepLink(
|
|
1615
|
-
"scoped-models",
|
|
1616
|
-
"models",
|
|
1617
|
-
"Open Settings → Models: the Alt+J / Alt+K cycle set and favorites",
|
|
1618
|
-
"scope",
|
|
1619
|
-
),
|
|
1620
1875
|
{
|
|
1621
1876
|
name: "settings",
|
|
1622
1877
|
description: "Open interactive settings",
|
|
1623
1878
|
group: "Configure",
|
|
1624
1879
|
kinds: ["settings"],
|
|
1625
|
-
args: {
|
|
1880
|
+
args: {
|
|
1881
|
+
positionals: [
|
|
1882
|
+
{ name: "area", required: false },
|
|
1883
|
+
{ name: "group", required: false },
|
|
1884
|
+
],
|
|
1885
|
+
},
|
|
1626
1886
|
fromArgs(parsed) {
|
|
1627
1887
|
if (parsed.error) return { kind: "usage-error", command: "settings", reason: parsed.error };
|
|
1628
|
-
const
|
|
1629
|
-
if (
|
|
1630
|
-
if (!
|
|
1631
|
-
|
|
1632
|
-
|
|
1888
|
+
const area = parsed.positionals[0];
|
|
1889
|
+
if (area === undefined) return { kind: "settings" };
|
|
1890
|
+
if (!isSettingsAreaId(area)) {
|
|
1891
|
+
return {
|
|
1892
|
+
kind: "usage-error",
|
|
1893
|
+
command: "settings",
|
|
1894
|
+
reason: `Unknown area: ${area} (one of ${SETTINGS_AREA_IDS.join(", ")})`,
|
|
1895
|
+
};
|
|
1633
1896
|
}
|
|
1634
|
-
return { kind: "settings",
|
|
1897
|
+
return { kind: "settings", area, ...(parsed.positionals[1] ? { group: parsed.positionals[1] } : {}) };
|
|
1635
1898
|
},
|
|
1636
1899
|
handle(command, ctx) {
|
|
1637
|
-
if (command.kind === "settings") ctx.openSettings(command.
|
|
1900
|
+
if (command.kind === "settings") ctx.openSettings(command.area, command.group);
|
|
1638
1901
|
},
|
|
1639
1902
|
},
|
|
1640
1903
|
{
|
|
1641
1904
|
name: "resume",
|
|
1642
1905
|
description: "Resume a past session",
|
|
1643
|
-
group: "
|
|
1906
|
+
group: "Session",
|
|
1644
1907
|
kinds: ["resume"],
|
|
1645
1908
|
args: {},
|
|
1646
1909
|
fromArgs: fromArgsOrUsage("resume", { kind: "resume" }),
|
|
@@ -1651,7 +1914,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1651
1914
|
{
|
|
1652
1915
|
name: "new",
|
|
1653
1916
|
description: "Start a fresh session",
|
|
1654
|
-
group: "
|
|
1917
|
+
group: "Session",
|
|
1655
1918
|
kinds: ["new"],
|
|
1656
1919
|
args: {},
|
|
1657
1920
|
fromArgs: fromArgsOrUsage("new", { kind: "new" }),
|
|
@@ -1662,7 +1925,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1662
1925
|
{
|
|
1663
1926
|
name: "handoff",
|
|
1664
1927
|
description: "Hand this session's working state to a fresh session for a stated goal",
|
|
1665
|
-
group: "
|
|
1928
|
+
group: "Session",
|
|
1666
1929
|
kinds: ["handoff", "handoff-usage"],
|
|
1667
1930
|
args: {
|
|
1668
1931
|
positionals: [{ name: "goal", required: true, rest: true }],
|
|
@@ -1685,7 +1948,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1685
1948
|
{
|
|
1686
1949
|
name: "tree",
|
|
1687
1950
|
description: "Open session tree navigator",
|
|
1688
|
-
group: "
|
|
1951
|
+
group: "Session",
|
|
1689
1952
|
kinds: ["tree"],
|
|
1690
1953
|
args: {},
|
|
1691
1954
|
fromArgs: fromArgsOrUsage("tree", { kind: "tree" }),
|
|
@@ -1696,7 +1959,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1696
1959
|
{
|
|
1697
1960
|
name: "fork",
|
|
1698
1961
|
description: "Fork from an assistant turn",
|
|
1699
|
-
group: "
|
|
1962
|
+
group: "Session",
|
|
1700
1963
|
kinds: ["fork"],
|
|
1701
1964
|
args: {},
|
|
1702
1965
|
fromArgs: fromArgsOrUsage("fork", { kind: "fork" }),
|
|
@@ -1707,7 +1970,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
|
|
|
1707
1970
|
{
|
|
1708
1971
|
name: "export",
|
|
1709
1972
|
description: "Export a self-contained HTML transcript by default; a .md path writes Markdown",
|
|
1710
|
-
group: "
|
|
1973
|
+
group: "Session",
|
|
1711
1974
|
kinds: ["export"],
|
|
1712
1975
|
args: {
|
|
1713
1976
|
positionals: [{ name: "path", required: false }],
|
|
@@ -1779,6 +2042,32 @@ const COMMAND_SHAPED_TOKEN = /^[A-Za-z][A-Za-z0-9:-]*$/u;
|
|
|
1779
2042
|
*/
|
|
1780
2043
|
const COMMAND_ESCAPE = "\\/";
|
|
1781
2044
|
|
|
2045
|
+
const RETIRED_COMMAND_HINTS: Readonly<Record<string, string>> = Object.freeze({
|
|
2046
|
+
status: "Use the footer or Alt+U for status; /cost, /context, and /fleet inspect their own domains.",
|
|
2047
|
+
receipts: "Use /view or /view verify <run-id>.",
|
|
2048
|
+
"context-init": "Use /context init.",
|
|
2049
|
+
"context-clear": "Use /context reset for project context or /new for a fresh session.",
|
|
2050
|
+
"context-view": "Use /context.",
|
|
2051
|
+
compact: "Use /context compact [instructions].",
|
|
2052
|
+
skills: "Use /skill or /resources skills.",
|
|
2053
|
+
exit: "Use /quit.",
|
|
2054
|
+
config: "Use /settings.",
|
|
2055
|
+
ctx: "Use /context.",
|
|
2056
|
+
models: "Use /model.",
|
|
2057
|
+
clear: "Use /new for a fresh session or /context reset for project context.",
|
|
2058
|
+
library: "Use /resources library [kind].",
|
|
2059
|
+
prompts: "Use /resources prompts.",
|
|
2060
|
+
extensions: "Use /resources extensions.",
|
|
2061
|
+
interop: "Use /agents connect.",
|
|
2062
|
+
targets: "Use /settings targets.",
|
|
2063
|
+
"scoped-models": "Use /settings chat model-picker.",
|
|
2064
|
+
});
|
|
2065
|
+
|
|
2066
|
+
function retiredCommandHint(token: string): string | undefined {
|
|
2067
|
+
if (/^skills?:[^\s]+$/u.test(token)) return "Use /skill <name> [task].";
|
|
2068
|
+
return RETIRED_COMMAND_HINTS[token];
|
|
2069
|
+
}
|
|
2070
|
+
|
|
1782
2071
|
/** Pure slash-command parser: no I/O, no side effects. Walks the registry in order. */
|
|
1783
2072
|
export function parseSlashCommand(input: string): SlashCommand {
|
|
1784
2073
|
const trimmed = input.trim();
|
|
@@ -1808,6 +2097,12 @@ export function dispatchSlashCommand(command: SlashCommand, ctx: SlashCommandCon
|
|
|
1808
2097
|
return "accepted";
|
|
1809
2098
|
}
|
|
1810
2099
|
if (command.kind === "unknown-command") {
|
|
2100
|
+
const retiredHint = retiredCommandHint(command.token);
|
|
2101
|
+
if (retiredHint) {
|
|
2102
|
+
ctx.notice("error", `/${command.token} is retired and did not run. ${retiredHint}`);
|
|
2103
|
+
ctx.render();
|
|
2104
|
+
return "rejected";
|
|
2105
|
+
}
|
|
1811
2106
|
// The registry does not own the token, but a prompt template might. The
|
|
1812
2107
|
// parser stays pure, so the lookup happens here, and only for a spelling
|
|
1813
2108
|
// that matched no command: `/name` is how every other agent invokes the
|
|
@@ -1849,18 +2144,55 @@ export interface CommandReferenceEntry {
|
|
|
1849
2144
|
subcommandDescriptions?: Readonly<Record<string, string>>;
|
|
1850
2145
|
}
|
|
1851
2146
|
|
|
2147
|
+
const COMMAND_ORDER = [
|
|
2148
|
+
"run",
|
|
2149
|
+
"fleet",
|
|
2150
|
+
"delegate",
|
|
2151
|
+
"council",
|
|
2152
|
+
"oracle",
|
|
2153
|
+
"btw",
|
|
2154
|
+
"share",
|
|
2155
|
+
"skill",
|
|
2156
|
+
"agents",
|
|
2157
|
+
"tasks",
|
|
2158
|
+
"context",
|
|
2159
|
+
"memory",
|
|
2160
|
+
"view",
|
|
2161
|
+
"panes",
|
|
2162
|
+
"cost",
|
|
2163
|
+
"decisions",
|
|
2164
|
+
"resources",
|
|
2165
|
+
"help",
|
|
2166
|
+
"model",
|
|
2167
|
+
"thinking",
|
|
2168
|
+
"output",
|
|
2169
|
+
"settings",
|
|
2170
|
+
"new",
|
|
2171
|
+
"resume",
|
|
2172
|
+
"handoff",
|
|
2173
|
+
"fork",
|
|
2174
|
+
"tree",
|
|
2175
|
+
"export",
|
|
2176
|
+
"archive",
|
|
2177
|
+
"quit",
|
|
2178
|
+
] as const;
|
|
2179
|
+
const COMMAND_ORDER_INDEX = new Map<string, number>(COMMAND_ORDER.map((name, index) => [name, index]));
|
|
2180
|
+
|
|
1852
2181
|
export function commandReference(): ReadonlyArray<CommandReferenceEntry> {
|
|
1853
|
-
return BUILTIN_SLASH_COMMANDS.filter((entry) => entry.hidden !== true)
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
2182
|
+
return BUILTIN_SLASH_COMMANDS.filter((entry) => entry.hidden !== true)
|
|
2183
|
+
.slice()
|
|
2184
|
+
.sort((a, b) => (COMMAND_ORDER_INDEX.get(a.name) ?? 99) - (COMMAND_ORDER_INDEX.get(b.name) ?? 99))
|
|
2185
|
+
.map((entry) => {
|
|
2186
|
+
const usage = usageLine(entry)
|
|
2187
|
+
.replace(/^\nusage:\s*/, "")
|
|
2188
|
+
.replace(/\n$/, "");
|
|
2189
|
+
return {
|
|
2190
|
+
name: entry.name,
|
|
2191
|
+
usage,
|
|
2192
|
+
description: entry.description,
|
|
2193
|
+
group: entry.group,
|
|
2194
|
+
...(entry.args ? { args: entry.args } : {}),
|
|
2195
|
+
...(entry.subcommandDescriptions ? { subcommandDescriptions: entry.subcommandDescriptions } : {}),
|
|
2196
|
+
};
|
|
2197
|
+
});
|
|
1866
2198
|
}
|