@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
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { open, readdir, stat } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { basename, dirname, join, relative, resolve, sep } from "node:path";
|
|
5
|
+
import { enumerateWorkspaceFilesAsync } from "../core/workspace-files.js";
|
|
6
|
+
import { fuzzyFilter, stripTerminalSequences } from "../engine/tui.js";
|
|
7
|
+
import { isEditorSteerTargetToken } from "./editor-steer.js";
|
|
8
|
+
|
|
9
|
+
const MAX_COMPLETION_ROWS = 40;
|
|
10
|
+
const PREVIEW_BYTES = 2048;
|
|
11
|
+
const PREVIEW_CHARS = 120;
|
|
12
|
+
const SNAPSHOT_TTL_MS = 2_000;
|
|
13
|
+
const GIT_OUTPUT_LIMIT_BYTES = 128 * 1024 * 1024;
|
|
14
|
+
|
|
15
|
+
export interface FileReferenceCompletionRequest {
|
|
16
|
+
/** Text after the active `@`, decoded when the reference is quoted. */
|
|
17
|
+
query: string;
|
|
18
|
+
signal: AbortSignal;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface FileReferenceCompletionValue {
|
|
22
|
+
id: string;
|
|
23
|
+
/** Complete inline reference spelling, including `@` and any quotes. */
|
|
24
|
+
value: string;
|
|
25
|
+
/** Workspace/path spelling without the leading `@` or a trailing slash. */
|
|
26
|
+
path: string;
|
|
27
|
+
label: string;
|
|
28
|
+
description: string;
|
|
29
|
+
isDirectory: boolean;
|
|
30
|
+
tracked: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type FileReferenceCompletionSource = (
|
|
34
|
+
request: FileReferenceCompletionRequest,
|
|
35
|
+
) => Promise<ReadonlyArray<FileReferenceCompletionValue>>;
|
|
36
|
+
|
|
37
|
+
export interface FileReferenceCompletionOptions {
|
|
38
|
+
basePath: string;
|
|
39
|
+
cacheTtlMs?: number;
|
|
40
|
+
/** Test/runtime seam; defaults to the repository's authoritative visible-file enumerator. */
|
|
41
|
+
listWorkspaceFiles?: (basePath: string) => Promise<ReadonlyArray<string>>;
|
|
42
|
+
/** Test/runtime seam; defaults to `git ls-files --cached`. */
|
|
43
|
+
listTrackedFiles?: (basePath: string) => Promise<ReadonlySet<string>>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface FileCandidate {
|
|
47
|
+
path: string;
|
|
48
|
+
absolutePath: string;
|
|
49
|
+
isDirectory: boolean;
|
|
50
|
+
tracked: boolean;
|
|
51
|
+
descendantFiles: number;
|
|
52
|
+
workspace: boolean;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface WorkspaceSnapshot {
|
|
56
|
+
candidates: FileCandidate[];
|
|
57
|
+
directories: ReadonlySet<string>;
|
|
58
|
+
trackedFiles: ReadonlySet<string>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function posixPath(path: string): string {
|
|
62
|
+
return sep === "\\" ? path.replaceAll("\\", "/") : path;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function safeRelativePath(path: string): string | null {
|
|
66
|
+
const normalized = posixPath(path).replace(/^\.\//u, "").replace(/\/$/u, "");
|
|
67
|
+
if (normalized.length === 0 || normalized.startsWith("/") || normalized.includes("\0") || /[\r\n]/u.test(normalized)) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const segments = normalized.split("/");
|
|
71
|
+
if (segments.some((segment) => segment.length === 0 || segment === "." || segment === "..")) return null;
|
|
72
|
+
return segments.join("/");
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function gitTrackedFiles(basePath: string): Promise<ReadonlySet<string>> {
|
|
76
|
+
return new Promise((resolveTracked) => {
|
|
77
|
+
execFile(
|
|
78
|
+
"git",
|
|
79
|
+
["--literal-pathspecs", "ls-files", "-z", "--cached"],
|
|
80
|
+
{ cwd: basePath, encoding: "utf8", maxBuffer: GIT_OUTPUT_LIMIT_BYTES },
|
|
81
|
+
(error, stdout) => {
|
|
82
|
+
if (error) {
|
|
83
|
+
resolveTracked(new Set());
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const tracked = new Set<string>();
|
|
87
|
+
for (const raw of stdout.split("\0")) {
|
|
88
|
+
const normalized = safeRelativePath(raw);
|
|
89
|
+
if (normalized) tracked.add(normalized);
|
|
90
|
+
}
|
|
91
|
+
resolveTracked(tracked);
|
|
92
|
+
},
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function buildWorkspaceSnapshot(
|
|
98
|
+
basePath: string,
|
|
99
|
+
visibleFiles: ReadonlyArray<string>,
|
|
100
|
+
trackedFiles: ReadonlySet<string>,
|
|
101
|
+
): WorkspaceSnapshot {
|
|
102
|
+
const files: FileCandidate[] = [];
|
|
103
|
+
const directoryFacts = new Map<string, { tracked: boolean; descendantFiles: number }>();
|
|
104
|
+
for (const raw of visibleFiles) {
|
|
105
|
+
const path = safeRelativePath(raw);
|
|
106
|
+
if (!path) continue;
|
|
107
|
+
const tracked = trackedFiles.has(path);
|
|
108
|
+
files.push({
|
|
109
|
+
path,
|
|
110
|
+
absolutePath: join(basePath, path),
|
|
111
|
+
isDirectory: false,
|
|
112
|
+
tracked,
|
|
113
|
+
descendantFiles: 0,
|
|
114
|
+
workspace: true,
|
|
115
|
+
});
|
|
116
|
+
const segments = path.split("/");
|
|
117
|
+
for (let index = 1; index < segments.length; index += 1) {
|
|
118
|
+
const directory = segments.slice(0, index).join("/");
|
|
119
|
+
const facts = directoryFacts.get(directory) ?? { tracked: false, descendantFiles: 0 };
|
|
120
|
+
facts.tracked ||= tracked;
|
|
121
|
+
facts.descendantFiles += 1;
|
|
122
|
+
directoryFacts.set(directory, facts);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const directories = [...directoryFacts].map(
|
|
126
|
+
([path, facts]): FileCandidate => ({
|
|
127
|
+
path,
|
|
128
|
+
absolutePath: join(basePath, path),
|
|
129
|
+
isDirectory: true,
|
|
130
|
+
tracked: facts.tracked,
|
|
131
|
+
descendantFiles: facts.descendantFiles,
|
|
132
|
+
workspace: true,
|
|
133
|
+
}),
|
|
134
|
+
);
|
|
135
|
+
return {
|
|
136
|
+
candidates: [...directories, ...files],
|
|
137
|
+
directories: new Set(directoryFacts.keys()),
|
|
138
|
+
trackedFiles,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function candidateParent(path: string): string {
|
|
143
|
+
const parent = posixPath(dirname(path));
|
|
144
|
+
return parent === "." ? "" : parent;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function fuzzyOrdered(candidates: ReadonlyArray<FileCandidate>, query: string): FileCandidate[] {
|
|
148
|
+
const buckets: FileCandidate[][] = [[], [], [], []];
|
|
149
|
+
for (const candidate of candidates) {
|
|
150
|
+
const bucket = candidate.tracked ? (candidate.isDirectory ? 0 : 1) : candidate.isDirectory ? 2 : 3;
|
|
151
|
+
buckets[bucket]?.push(candidate);
|
|
152
|
+
}
|
|
153
|
+
return buckets.flatMap((bucket) =>
|
|
154
|
+
fuzzyFilter(bucket, query, (candidate) => `${basename(candidate.path)} ${candidate.path}`),
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function workspaceCandidates(snapshot: WorkspaceSnapshot, rawQuery: string): FileCandidate[] {
|
|
159
|
+
const explicitDot = rawQuery.startsWith("./");
|
|
160
|
+
const query = explicitDot ? rawQuery.slice(2) : rawQuery;
|
|
161
|
+
const slash = query.lastIndexOf("/");
|
|
162
|
+
if (query.length === 0) {
|
|
163
|
+
return fuzzyOrdered(
|
|
164
|
+
snapshot.candidates
|
|
165
|
+
.filter((candidate) => candidateParent(candidate.path) === "")
|
|
166
|
+
.map((candidate) => (explicitDot ? { ...candidate, path: `./${candidate.path}` } : candidate)),
|
|
167
|
+
"",
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
if (slash >= 0) {
|
|
171
|
+
const parent = query.slice(0, slash);
|
|
172
|
+
const fragment = query.slice(slash + 1);
|
|
173
|
+
if (parent.length === 0 || snapshot.directories.has(parent)) {
|
|
174
|
+
const displayPrefix = explicitDot ? "./" : "";
|
|
175
|
+
return fuzzyOrdered(
|
|
176
|
+
snapshot.candidates
|
|
177
|
+
.filter((candidate) => candidateParent(candidate.path) === parent)
|
|
178
|
+
.map((candidate) => ({ ...candidate, path: `${displayPrefix}${candidate.path}` })),
|
|
179
|
+
fragment,
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return fuzzyOrdered(
|
|
184
|
+
snapshot.candidates.map((candidate) => (explicitDot ? { ...candidate, path: `./${candidate.path}` } : candidate)),
|
|
185
|
+
query,
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function explicitPathQuery(query: string): boolean {
|
|
190
|
+
return query.startsWith("../") || query.startsWith("~/") || query.startsWith("/");
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function resolveDisplayBase(basePath: string, displayBase: string): string {
|
|
194
|
+
if (displayBase.startsWith("~/")) return resolve(homedir(), displayBase.slice(2));
|
|
195
|
+
if (displayBase.startsWith("/")) return resolve(displayBase);
|
|
196
|
+
return resolve(basePath, displayBase);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function workspaceRelative(basePath: string, absolutePath: string): string | null {
|
|
200
|
+
const candidate = posixPath(relative(basePath, absolutePath));
|
|
201
|
+
if (candidate.length === 0 || candidate === ".." || candidate.startsWith("../")) return null;
|
|
202
|
+
return safeRelativePath(candidate);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async function explicitCandidates(
|
|
206
|
+
basePath: string,
|
|
207
|
+
query: string,
|
|
208
|
+
trackedFiles: ReadonlySet<string>,
|
|
209
|
+
): Promise<FileCandidate[]> {
|
|
210
|
+
const slash = query.lastIndexOf("/");
|
|
211
|
+
if (slash < 0) return [];
|
|
212
|
+
const displayBase = query.slice(0, slash + 1);
|
|
213
|
+
const fragment = query.slice(slash + 1);
|
|
214
|
+
const directory = resolveDisplayBase(basePath, displayBase);
|
|
215
|
+
const candidates: FileCandidate[] = [];
|
|
216
|
+
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
|
217
|
+
if (entry.name === ".git" || /[\r\n\0]/u.test(entry.name)) continue;
|
|
218
|
+
const absolutePath = join(directory, entry.name);
|
|
219
|
+
let isDirectory = entry.isDirectory();
|
|
220
|
+
let isFile = entry.isFile();
|
|
221
|
+
if (!isDirectory && !isFile && entry.isSymbolicLink()) {
|
|
222
|
+
try {
|
|
223
|
+
const facts = await stat(absolutePath);
|
|
224
|
+
isDirectory = facts.isDirectory();
|
|
225
|
+
isFile = facts.isFile();
|
|
226
|
+
} catch {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (!isDirectory && !isFile) continue;
|
|
231
|
+
const relativePath = workspaceRelative(basePath, absolutePath);
|
|
232
|
+
candidates.push({
|
|
233
|
+
path: `${displayBase}${entry.name}`,
|
|
234
|
+
absolutePath,
|
|
235
|
+
isDirectory,
|
|
236
|
+
tracked: relativePath !== null && trackedFiles.has(relativePath),
|
|
237
|
+
descendantFiles: 0,
|
|
238
|
+
workspace: relativePath !== null,
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
return fuzzyOrdered(candidates, fragment);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function formatBytes(bytes: number): string {
|
|
245
|
+
if (bytes < 1024) return `${bytes}B`;
|
|
246
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0)}KB`;
|
|
247
|
+
return `${(bytes / (1024 * 1024)).toFixed(bytes < 10 * 1024 * 1024 ? 1 : 0)}MB`;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function cleanPreview(bytes: Buffer): string | null {
|
|
251
|
+
if (bytes.includes(0)) return "binary file";
|
|
252
|
+
const text = stripTerminalSequences(bytes.toString("utf8"));
|
|
253
|
+
const line = text
|
|
254
|
+
.split(/\r?\n/u)
|
|
255
|
+
.map((candidate) =>
|
|
256
|
+
Array.from(candidate, (character) => {
|
|
257
|
+
const code = character.codePointAt(0) ?? 0;
|
|
258
|
+
return code < 32 || code === 127 ? " " : character;
|
|
259
|
+
})
|
|
260
|
+
.join("")
|
|
261
|
+
.trim(),
|
|
262
|
+
)
|
|
263
|
+
.find((candidate) => candidate.length > 0);
|
|
264
|
+
if (!line) return null;
|
|
265
|
+
return line.length > PREVIEW_CHARS ? `${line.slice(0, PREVIEW_CHARS - 1)}…` : line;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async function candidateDescription(candidate: FileCandidate): Promise<string> {
|
|
269
|
+
const provenance = candidate.tracked ? "git tracked" : candidate.workspace ? "untracked" : "filesystem";
|
|
270
|
+
if (candidate.isDirectory) {
|
|
271
|
+
const count = candidate.descendantFiles > 0 ? ` · ${candidate.descendantFiles} files` : "";
|
|
272
|
+
return `${provenance} directory${count} · Tab/Enter opens`;
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const facts = await stat(candidate.absolutePath);
|
|
276
|
+
const handle = await open(candidate.absolutePath, "r");
|
|
277
|
+
let preview: string | null = null;
|
|
278
|
+
try {
|
|
279
|
+
const buffer = Buffer.alloc(Math.min(PREVIEW_BYTES, Math.max(0, facts.size)));
|
|
280
|
+
if (buffer.length > 0) {
|
|
281
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
|
|
282
|
+
preview = cleanPreview(buffer.subarray(0, bytesRead));
|
|
283
|
+
}
|
|
284
|
+
} finally {
|
|
285
|
+
await handle.close();
|
|
286
|
+
}
|
|
287
|
+
return `${provenance} · ${formatBytes(facts.size)}${preview ? ` · ${preview}` : ""}`;
|
|
288
|
+
} catch {
|
|
289
|
+
return `${provenance} · preview unavailable`;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/** Quote a completion exactly the way the inline-reference scanner accepts. */
|
|
294
|
+
function formatInlineFileReference(path: string, isDirectory: boolean): string {
|
|
295
|
+
const completionPath = isDirectory ? `${path.replace(/\/$/u, "")}/` : path;
|
|
296
|
+
if (!/[\s"'\\]/u.test(completionPath) && !isEditorSteerTargetToken(completionPath)) return `@${completionPath}`;
|
|
297
|
+
return `@"${completionPath.replaceAll("\\", "\\\\").replaceAll('"', '\\"')}"`;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function completionId(candidate: FileCandidate): string {
|
|
301
|
+
return `file-reference:${candidate.isDirectory ? "directory" : "file"}:${candidate.absolutePath}`;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Workspace-aware `@` source for Clio's one grammar-aware composer provider.
|
|
306
|
+
* A bare `@` is a top-level tree; text without a slash fuzzes the whole
|
|
307
|
+
* workspace; a real directory prefix becomes its child submenu. Explicit
|
|
308
|
+
* `../`, `~/`, and absolute prefixes stay scoped filesystem navigation.
|
|
309
|
+
*/
|
|
310
|
+
export function createFileReferenceCompletionSource(
|
|
311
|
+
options: FileReferenceCompletionOptions,
|
|
312
|
+
): FileReferenceCompletionSource {
|
|
313
|
+
const basePath = resolve(options.basePath);
|
|
314
|
+
const listWorkspaceFiles = options.listWorkspaceFiles ?? ((cwd: string) => enumerateWorkspaceFilesAsync(cwd));
|
|
315
|
+
const listTrackedFiles = options.listTrackedFiles ?? gitTrackedFiles;
|
|
316
|
+
const cacheTtlMs = options.cacheTtlMs ?? SNAPSHOT_TTL_MS;
|
|
317
|
+
let cached: { expiresAt: number; snapshot: WorkspaceSnapshot } | null = null;
|
|
318
|
+
let loading: Promise<WorkspaceSnapshot> | null = null;
|
|
319
|
+
|
|
320
|
+
const snapshot = async (): Promise<WorkspaceSnapshot> => {
|
|
321
|
+
const now = Date.now();
|
|
322
|
+
if (cached && cached.expiresAt > now) return cached.snapshot;
|
|
323
|
+
loading ??= Promise.all([listWorkspaceFiles(basePath), listTrackedFiles(basePath)]).then(([visible, tracked]) =>
|
|
324
|
+
buildWorkspaceSnapshot(basePath, visible, tracked),
|
|
325
|
+
);
|
|
326
|
+
try {
|
|
327
|
+
const next = await loading;
|
|
328
|
+
cached = { expiresAt: now + cacheTtlMs, snapshot: next };
|
|
329
|
+
return next;
|
|
330
|
+
} finally {
|
|
331
|
+
loading = null;
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
return async (request) => {
|
|
336
|
+
if (request.signal.aborted) return [];
|
|
337
|
+
try {
|
|
338
|
+
const workspace = await snapshot();
|
|
339
|
+
if (request.signal.aborted) return [];
|
|
340
|
+
const candidates = explicitPathQuery(request.query)
|
|
341
|
+
? await explicitCandidates(basePath, request.query, workspace.trackedFiles)
|
|
342
|
+
: workspaceCandidates(workspace, request.query);
|
|
343
|
+
if (request.signal.aborted) return [];
|
|
344
|
+
const top = candidates.slice(0, MAX_COMPLETION_ROWS);
|
|
345
|
+
const descriptions = await Promise.all(top.map(candidateDescription));
|
|
346
|
+
if (request.signal.aborted) return [];
|
|
347
|
+
return top.map((candidate, index) => ({
|
|
348
|
+
id: completionId(candidate),
|
|
349
|
+
value: formatInlineFileReference(candidate.path, candidate.isDirectory),
|
|
350
|
+
path: candidate.path,
|
|
351
|
+
label: `${candidate.path}${candidate.isDirectory ? "/" : ""}`,
|
|
352
|
+
description: descriptions[index] ?? "preview unavailable",
|
|
353
|
+
isDirectory: candidate.isDirectory,
|
|
354
|
+
tracked: candidate.tracked,
|
|
355
|
+
}));
|
|
356
|
+
} catch {
|
|
357
|
+
return [];
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
}
|
|
@@ -208,7 +208,7 @@ function renderFooterDashboardLines(
|
|
|
208
208
|
* Widths from 80 to 119 columns use a two by two grid.
|
|
209
209
|
* Widths below 80 columns use a vertical stack with all sections retained.
|
|
210
210
|
*/
|
|
211
|
-
|
|
211
|
+
function renderFooterStatusLines(state: FooterDashboardRenderState, width: number): string[] {
|
|
212
212
|
const theme = clioTheme();
|
|
213
213
|
const safeWidth = Math.max(1, Math.floor(width));
|
|
214
214
|
const header = headerLine(state.session, safeWidth);
|
|
@@ -297,7 +297,7 @@ export function renderFooterStatusLines(state: FooterDashboardRenderState, width
|
|
|
297
297
|
* current work the strongest column; surplus is shared by urgency until the
|
|
298
298
|
* lower-priority sections reach their caps, then spills into Activity.
|
|
299
299
|
*/
|
|
300
|
-
|
|
300
|
+
function expandedWideColumnWidths(width: number, totalSepWidth: number): [number, number, number, number] {
|
|
301
301
|
const available = Math.max(0, width - totalSepWidth);
|
|
302
302
|
const widths: [number, number, number, number] = [32, 31, 27, 21];
|
|
303
303
|
let remaining = Math.max(0, available - widths.reduce((sum, item) => sum + item, 0));
|
|
@@ -392,33 +392,31 @@ export function buildFooterDashboard(deps: FooterDashboardDeps): FooterDashboard
|
|
|
392
392
|
const tokensLabel = tokens || (usage?.totalTokens ? `Σ${formatFooterTokens(usage.totalTokens)}` : null);
|
|
393
393
|
|
|
394
394
|
const statuses = deps.providers.list();
|
|
395
|
-
const current = settings?.
|
|
396
|
-
? (statuses.find((s) => s.target.id === settings.orchestrator?.target) ?? null)
|
|
397
|
-
: null;
|
|
395
|
+
const current = settings?.chat?.target ? (statuses.find((s) => s.target.id === settings.chat?.target) ?? null) : null;
|
|
398
396
|
|
|
399
|
-
const target = formatTargetLabel(settings?.
|
|
397
|
+
const target = formatTargetLabel(settings?.chat?.target, settings?.chat?.model);
|
|
400
398
|
|
|
401
399
|
const resolution = resolveModelRuntimeCapabilitiesForProviders(
|
|
402
400
|
deps.providers,
|
|
403
|
-
settings?.
|
|
404
|
-
settings?.
|
|
405
|
-
settings?.
|
|
401
|
+
settings?.chat?.target,
|
|
402
|
+
settings?.chat?.model,
|
|
403
|
+
settings?.chat?.thinkingLevel ?? "off",
|
|
406
404
|
);
|
|
407
405
|
|
|
408
|
-
const thinking = resolution?.thinking.display ?? settings?.
|
|
406
|
+
const thinking = resolution?.thinking.display ?? settings?.chat?.thinkingLevel ?? "off";
|
|
409
407
|
|
|
410
|
-
const wireModelId = settings?.
|
|
408
|
+
const wireModelId = settings?.chat?.model ?? current?.target.defaultModel ?? null;
|
|
411
409
|
const detectedReasoning =
|
|
412
410
|
wireModelId && typeof deps.providers.getDetectedReasoning === "function"
|
|
413
|
-
? deps.providers.getDetectedReasoning(settings?.
|
|
411
|
+
? deps.providers.getDetectedReasoning(settings?.chat?.target ?? "", wireModelId)
|
|
414
412
|
: null;
|
|
415
413
|
const caps = current
|
|
416
414
|
? resolveModelCapabilities(current, wireModelId, deps.providers.knowledgeBase, { detectedReasoning })
|
|
417
415
|
: null;
|
|
418
416
|
const capabilities = capabilityLabels(caps);
|
|
419
417
|
|
|
420
|
-
const safety = settings?.autonomy ?? "auto-edit";
|
|
421
|
-
const toolProfile = settings?.
|
|
418
|
+
const safety = settings?.safety.autonomy ?? "auto-edit";
|
|
419
|
+
const toolProfile = settings?.integrations.externalAgents?.defaults?.toolGovernance ?? "clio-coder-policy";
|
|
422
420
|
|
|
423
421
|
return {
|
|
424
422
|
workspace: workspaceFacts(deps, branchSlot),
|
|
@@ -436,7 +434,7 @@ export function buildFooterDashboard(deps: FooterDashboardDeps): FooterDashboard
|
|
|
436
434
|
capabilities,
|
|
437
435
|
safety,
|
|
438
436
|
toolProfile,
|
|
439
|
-
outputVerbosity: settings?.
|
|
437
|
+
outputVerbosity: settings?.interface.outputDetail ?? "default",
|
|
440
438
|
leaderArmed: deps.getLeaderArmed?.() ?? false,
|
|
441
439
|
shutdownArmed: deps.getShutdownArmed?.() ?? false,
|
|
442
440
|
memoryIntervention: taskMemory
|
|
@@ -454,8 +452,8 @@ export function buildFooterDashboard(deps: FooterDashboardDeps): FooterDashboard
|
|
|
454
452
|
used: contextUsage?.tokens ?? null,
|
|
455
453
|
contextWindow: contextUsage?.contextWindow ?? null,
|
|
456
454
|
toolSchemaTokens: contextUsage?.breakdown?.toolSchemaTokens ?? null,
|
|
457
|
-
compactionThreshold: settings?.compaction?.threshold ?? null,
|
|
458
|
-
compactionAuto: settings?.compaction?.auto ?? null,
|
|
455
|
+
compactionThreshold: settings?.context.compaction?.threshold ?? null,
|
|
456
|
+
compactionAuto: settings?.context.compaction?.auto ?? null,
|
|
459
457
|
compactionActive,
|
|
460
458
|
clioMd: formatClioMdState(contextState?.clioMd),
|
|
461
459
|
memory: formatMemoryState(contextState?.memoryCount),
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* color lives in `theme/**`; every emitted line is width-clamped.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { truncateToWidth, visibleWidth } from "../../engine/tui.js";
|
|
17
|
+
import { truncateToWidth, visibleWidth, wrapTextWithAnsi } from "../../engine/tui.js";
|
|
18
18
|
import { fitFooterText } from "../footer-panel.js";
|
|
19
19
|
import { type ClioTheme, type ClioToken, clioTheme, GLYPH, rule } from "../theme/index.js";
|
|
20
20
|
|
|
@@ -152,7 +152,7 @@ function boundNotifyBytes(text: string, maxBytes: number): string {
|
|
|
152
152
|
}
|
|
153
153
|
|
|
154
154
|
/** The closed-vocabulary body for one event. */
|
|
155
|
-
|
|
155
|
+
function desktopNotifyBody(event: DesktopNotifyEvent): string {
|
|
156
156
|
if (event.kind === "turn-finished") return "turn finished";
|
|
157
157
|
if (event.kind === "approval-needed") return "approval needed";
|
|
158
158
|
const shortId = boundNotifyBytes(sanitizeNotifyText(event.shortId), 32);
|
|
@@ -160,7 +160,7 @@ export function desktopNotifyBody(event: DesktopNotifyEvent): string {
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
/** True when the environment names a terminal that answers OSC 9 rather than OSC 777. */
|
|
163
|
-
|
|
163
|
+
function prefersOsc9(env: Readonly<Record<string, string | undefined>>): boolean {
|
|
164
164
|
if (typeof env.WT_SESSION === "string" && env.WT_SESSION.length > 0) return true;
|
|
165
165
|
const program = (env.TERM_PROGRAM ?? "").trim().toLowerCase();
|
|
166
166
|
if (program.length === 0) return false;
|
|
@@ -173,7 +173,7 @@ export function prefersOsc9(env: Readonly<Record<string, string | undefined>>):
|
|
|
173
173
|
* chosen for the terminals that implement it instead. Exactly one sequence is
|
|
174
174
|
* returned, so a single event can never produce two notifications.
|
|
175
175
|
*/
|
|
176
|
-
|
|
176
|
+
function buildDesktopNotifySequence(
|
|
177
177
|
event: DesktopNotifyEvent,
|
|
178
178
|
env: Readonly<Record<string, string | undefined>> = process.env,
|
|
179
179
|
): string {
|
|
@@ -208,7 +208,7 @@ export interface DesktopNotifier {
|
|
|
208
208
|
* events. Every call re-checks the setting and the surface, so turning
|
|
209
209
|
* `terminal.notify` off mid-session silences the next event.
|
|
210
210
|
*/
|
|
211
|
-
|
|
211
|
+
function createDesktopNotifier(deps: DesktopNotifierDeps): DesktopNotifier {
|
|
212
212
|
const env = deps.env ?? process.env;
|
|
213
213
|
return {
|
|
214
214
|
notify(event) {
|
|
@@ -470,8 +470,9 @@ export function formatNotificationBadge(
|
|
|
470
470
|
}
|
|
471
471
|
|
|
472
472
|
/**
|
|
473
|
-
* Expanded notices panel for the dashboard.
|
|
474
|
-
*
|
|
473
|
+
* Expanded notices panel for the dashboard. The entry count is capped so a
|
|
474
|
+
* noisy boot cannot take over the dashboard, but every included notice wraps
|
|
475
|
+
* in full: this is the detail surface that the compact badge points toward.
|
|
475
476
|
*/
|
|
476
477
|
export function formatNotificationPanel(
|
|
477
478
|
entries: ReadonlyArray<Notification>,
|
|
@@ -485,7 +486,12 @@ export function formatNotificationPanel(
|
|
|
485
486
|
const lines: string[] = [rule(theme, width, { left: "notices" })];
|
|
486
487
|
for (const entry of entries.slice(0, maxRows)) {
|
|
487
488
|
const glyph = theme.fg(notificationToken(entry.level), notificationGlyph(entry.level));
|
|
488
|
-
|
|
489
|
+
const prefix = `${glyph} `;
|
|
490
|
+
const prefixWidth = visibleWidth(prefix);
|
|
491
|
+
const wrapped = wrapTextWithAnsi(theme.fg("muted", entry.text), Math.max(1, width - prefixWidth));
|
|
492
|
+
lines.push(
|
|
493
|
+
...wrapped.map((line, index) => fitFooterText(`${index === 0 ? prefix : " ".repeat(prefixWidth)}${line}`, width)),
|
|
494
|
+
);
|
|
489
495
|
}
|
|
490
496
|
const overflow = entries.length - maxRows;
|
|
491
497
|
const hint = overflow > 0 ? `+${overflow} more · ${dismiss} dismiss` : `${dismiss} dismiss`;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { OutputVerbosity } from "../../core/defaults.js";
|
|
2
|
-
import { responseModelIdObservationLabel } from "../../core/response-model-id.js";
|
|
3
2
|
import { ToolNames } from "../../core/tool-names.js";
|
|
4
3
|
import {
|
|
5
4
|
type CostAggregate,
|
|
@@ -28,7 +27,6 @@ import {
|
|
|
28
27
|
type TurnSummary,
|
|
29
28
|
} from "../status/index.js";
|
|
30
29
|
import {
|
|
31
|
-
abbreviateModelId,
|
|
32
30
|
type ClioTheme,
|
|
33
31
|
type ClioToken,
|
|
34
32
|
clioTheme,
|
|
@@ -700,46 +698,6 @@ function stopReasonStyle(reason: TurnSummary["stopReason"]): { glyph: string; to
|
|
|
700
698
|
return { glyph: GLYPH.ok, token: "success" };
|
|
701
699
|
}
|
|
702
700
|
|
|
703
|
-
/**
|
|
704
|
-
* Elegant single-line readout of the most recent completed turn. This is the
|
|
705
|
-
* footer home for the metrics that used to print faintly under each assistant
|
|
706
|
-
* reply: stop outcome, wall time, token in/out, reasoning, and tool work. The
|
|
707
|
-
* model is intentionally omitted because the editor rail already carries it.
|
|
708
|
-
*/
|
|
709
|
-
export function formatLastTurn(theme: ClioTheme, summary: TurnSummary): string {
|
|
710
|
-
const stop = stopReasonStyle(summary.stopReason);
|
|
711
|
-
const parts: string[] = [
|
|
712
|
-
theme.fg(stop.token, `${stop.glyph} ${formatCompactMs(summary.elapsedMs)}`),
|
|
713
|
-
theme.fg("muted", `${GLYPH.up}${summary.inputTokens} ${GLYPH.down}${summary.outputTokens}`),
|
|
714
|
-
];
|
|
715
|
-
// Zero suppresses the chip, the same rule the chat panel's turn line follows:
|
|
716
|
-
// a turn that spent no reasoning tokens states nothing by printing `r0`.
|
|
717
|
-
const chip = formatReasoningChip(reasoningFromSummary(summary), String);
|
|
718
|
-
if (chip !== null) parts.push(theme.fg("reason", chip));
|
|
719
|
-
if (summary.cacheReadTokens > 0 || summary.cacheWriteTokens > 0) {
|
|
720
|
-
parts.push(theme.fg("dim", `cache ${summary.cacheReadTokens}/${summary.cacheWriteTokens}`));
|
|
721
|
-
}
|
|
722
|
-
if (summary.toolCount > 0) {
|
|
723
|
-
const label = `${summary.toolCount} tool${summary.toolCount === 1 ? "" : "s"}`;
|
|
724
|
-
const errors = summary.toolErrorCount > 0 ? theme.fg("error", ` ${summary.toolErrorCount}${GLYPH.error}`) : "";
|
|
725
|
-
parts.push(`${theme.fg("muted", label)}${errors}`);
|
|
726
|
-
}
|
|
727
|
-
if (summary.watchdogPeak >= 2) parts.push(theme.fg("warning", "slow"));
|
|
728
|
-
if (summary.truncated) parts.push(theme.fg("warning", "trunc"));
|
|
729
|
-
const observation = summary.responseModelIdObservation;
|
|
730
|
-
const observedId =
|
|
731
|
-
observation.state === "reported"
|
|
732
|
-
? observation.reportedModelId
|
|
733
|
-
: observation.state === "legacy-difference-only"
|
|
734
|
-
? observation.differingModelId
|
|
735
|
-
: null;
|
|
736
|
-
const observationText = `response model id observation ${responseModelIdObservationLabel(observation)}${
|
|
737
|
-
observedId === null ? "" : ` ${abbreviateModelId(observedId)}`
|
|
738
|
-
}`;
|
|
739
|
-
parts.push(theme.fg("warning", observationText));
|
|
740
|
-
return parts.join(theme.fg("dim", " · "));
|
|
741
|
-
}
|
|
742
|
-
|
|
743
701
|
/**
|
|
744
702
|
* One row per live worker: the origin glyph, the sub-process glyph when Clio
|
|
745
703
|
* started the run for itself, the agent's own name, the fleet node it landed
|
|
@@ -1099,7 +1057,7 @@ function outputVerbosityLabel(verbosity: OutputVerbosity): string {
|
|
|
1099
1057
|
return verbosity === "minimal" ? "min" : verbosity === "verbose" ? "verbose" : "default";
|
|
1100
1058
|
}
|
|
1101
1059
|
|
|
1102
|
-
|
|
1060
|
+
function buildHarnessStatePill(
|
|
1103
1061
|
theme: ClioTheme,
|
|
1104
1062
|
status: AgentStatus,
|
|
1105
1063
|
toolCounts: ToolTallySnapshot,
|
|
@@ -1175,7 +1133,7 @@ function selectChips(
|
|
|
1175
1133
|
return surviving();
|
|
1176
1134
|
}
|
|
1177
1135
|
|
|
1178
|
-
|
|
1136
|
+
function buildMetricStrip(
|
|
1179
1137
|
theme: ClioTheme,
|
|
1180
1138
|
status: AgentStatus,
|
|
1181
1139
|
throughput: TokenThroughputSnapshot | null | undefined,
|