@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
|
@@ -52,7 +52,7 @@ import type { TurnMiddleware } from "./turn-middleware.js";
|
|
|
52
52
|
import type { TurnPersistence } from "./turn-persistence.js";
|
|
53
53
|
import type { AgentRuntime, ChatLoopTarget, ChatTurnState } from "./turn-state.js";
|
|
54
54
|
|
|
55
|
-
const LOCAL_API_KEY_FALLBACK = "clio-local-target";
|
|
55
|
+
const LOCAL_API_KEY_FALLBACK = "clio-coder-local-target";
|
|
56
56
|
|
|
57
57
|
/**
|
|
58
58
|
* A turn that never started, with a machine-readable reason attached. The
|
|
@@ -85,7 +85,7 @@ export class TurnAdmissionError extends Error {
|
|
|
85
85
|
* same discovery view the planner budgets against, so a model Clio is planning
|
|
86
86
|
* a loaded window for is never announced as absent.
|
|
87
87
|
*/
|
|
88
|
-
|
|
88
|
+
function coldModelNotice(
|
|
89
89
|
status: TargetStatus | null | undefined,
|
|
90
90
|
targetId: string,
|
|
91
91
|
wireModelId: string,
|
|
@@ -183,13 +183,13 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
183
183
|
|
|
184
184
|
const readTarget = (): ChatLoopTarget | null => {
|
|
185
185
|
const settings = deps.getSettings();
|
|
186
|
-
const targetId = settings.
|
|
187
|
-
const wireModelId = settings.
|
|
186
|
+
const targetId = settings.chat.target?.trim();
|
|
187
|
+
const wireModelId = settings.chat.model?.trim();
|
|
188
188
|
if (!targetId || !wireModelId) return null;
|
|
189
189
|
const resolved = resolveRuntimeTarget(deps.providers, {
|
|
190
190
|
targetId,
|
|
191
191
|
wireModelId,
|
|
192
|
-
requestedThinkingLevel: settings.
|
|
192
|
+
requestedThinkingLevel: settings.chat.thinkingLevel ?? "off",
|
|
193
193
|
use: "orchestrator",
|
|
194
194
|
requireTools: false,
|
|
195
195
|
requireOutputBudget: true,
|
|
@@ -243,8 +243,8 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
243
243
|
const targetProbesInFlight = new Map<string, Promise<void>>();
|
|
244
244
|
const ensureLiveCapabilitiesForSelectedModel = async (): Promise<void> => {
|
|
245
245
|
const settings = deps.getSettings();
|
|
246
|
-
const targetId = settings.
|
|
247
|
-
const wireModelId = settings.
|
|
246
|
+
const targetId = settings.chat.target?.trim();
|
|
247
|
+
const wireModelId = settings.chat.model?.trim();
|
|
248
248
|
if (!targetId || !wireModelId) return;
|
|
249
249
|
const target = deps.providers.getTarget(targetId);
|
|
250
250
|
if (!target) return;
|
|
@@ -316,7 +316,7 @@ export function createTurnRuntime(deps: TurnRuntimeDeps): TurnRuntime {
|
|
|
316
316
|
const refreshed = resolveRuntimeTarget(deps.providers, {
|
|
317
317
|
targetId: target.target.id,
|
|
318
318
|
wireModelId: target.wireModelId,
|
|
319
|
-
requestedThinkingLevel: deps.getSettings().
|
|
319
|
+
requestedThinkingLevel: deps.getSettings().chat.thinkingLevel ?? "off",
|
|
320
320
|
use: "orchestrator",
|
|
321
321
|
requireTools: false,
|
|
322
322
|
requireOutputBudget: true,
|
|
@@ -43,7 +43,7 @@ export interface ChatLoopRunSnapshot {
|
|
|
43
43
|
runtimeId: string;
|
|
44
44
|
runtimeKind: RuntimeDescriptor["kind"];
|
|
45
45
|
wireModelId: string;
|
|
46
|
-
autonomy: ClioSettings["autonomy"];
|
|
46
|
+
autonomy: ClioSettings["safety"]["autonomy"];
|
|
47
47
|
compiledPromptHash: string | null;
|
|
48
48
|
staticCompositionHash: string | null;
|
|
49
49
|
promptSignature: string | null;
|
|
@@ -5,12 +5,14 @@ import type { DispatchContract } from "../../domains/dispatch/contract.js";
|
|
|
5
5
|
import { isReceiptIntegrity, verifyReceiptIntegrity } from "../../domains/dispatch/receipt-integrity.js";
|
|
6
6
|
import type { RunEnvelope, RunReceipt } from "../../domains/dispatch/types.js";
|
|
7
7
|
import { evidenceDirectory, inspectEvidence, listEvidenceOverviews } from "../../domains/evidence/store.js";
|
|
8
|
-
import { formatTrustSummaryLine } from "../../domains/evidence/trust-projection.js";
|
|
8
|
+
import { formatTrustSummaryLine, trustStateWord } from "../../domains/evidence/trust-projection.js";
|
|
9
9
|
import {
|
|
10
10
|
inspectRunReceiptTrustStatus,
|
|
11
11
|
type ReceiptIntegrityOutcome,
|
|
12
12
|
retiredReceiptIntegrity,
|
|
13
13
|
retiredReceiptIntegrityReason,
|
|
14
|
+
TRUST_STATUS_AXES,
|
|
15
|
+
type TrustStatusAxis,
|
|
14
16
|
} from "../../domains/evidence/trust-status.js";
|
|
15
17
|
import type { EvidenceFinding, EvidenceOverview, EvidenceSource } from "../../domains/evidence/types.js";
|
|
16
18
|
import { type AccountabilitySummary, readAccountabilitySummary } from "../../domains/observability/index.js";
|
|
@@ -113,6 +115,20 @@ const JSON_PRETTY_MAX_BYTES = 10 * 1024 * 1024;
|
|
|
113
115
|
|
|
114
116
|
export type ReceiptVerifyResult = ReceiptIntegrityOutcome;
|
|
115
117
|
|
|
118
|
+
export interface ReceiptVerificationCheck {
|
|
119
|
+
name: string;
|
|
120
|
+
ok: boolean;
|
|
121
|
+
evidence: string;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export type ReceiptVerificationReport = ReceiptIntegrityOutcome & {
|
|
125
|
+
receiptPath: string;
|
|
126
|
+
sealedDigest: string | null;
|
|
127
|
+
trustSummary: string | null;
|
|
128
|
+
compromised: boolean;
|
|
129
|
+
checks: ReceiptVerificationCheck[];
|
|
130
|
+
};
|
|
131
|
+
|
|
116
132
|
/**
|
|
117
133
|
* What a verify action reports. `retired` marks a seal this build does not
|
|
118
134
|
* verify because its integrity version was retired: not a pass, and not the
|
|
@@ -135,7 +151,6 @@ const RECEIPT_REQUIRED_KEYS = [
|
|
|
135
151
|
"costUsd",
|
|
136
152
|
"compiledPromptHash",
|
|
137
153
|
"staticCompositionHash",
|
|
138
|
-
"clioVersion",
|
|
139
154
|
"piMonoVersion",
|
|
140
155
|
"platform",
|
|
141
156
|
"nodeVersion",
|
|
@@ -239,7 +254,7 @@ export function receiptFilePath(stateDir: string, runId: string): string {
|
|
|
239
254
|
return join(stateDir, "receipts", `${runId}.json`);
|
|
240
255
|
}
|
|
241
256
|
|
|
242
|
-
|
|
257
|
+
function runLedgerPath(stateDir: string): string {
|
|
243
258
|
return join(stateDir, "runs.json");
|
|
244
259
|
}
|
|
245
260
|
|
|
@@ -301,7 +316,7 @@ type ReadLedgerResult = { ok: true; envelope: RunEnvelope } | { ok: false; reaso
|
|
|
301
316
|
* the same file and ledger row, projected through the shared boundary so the
|
|
302
317
|
* receipt view spells its verdict exactly as the board and the CLI do.
|
|
303
318
|
*/
|
|
304
|
-
|
|
319
|
+
function receiptTrustDetail(stateDir: string, runId: string): string {
|
|
305
320
|
try {
|
|
306
321
|
const receipt = JSON.parse(readFileSync(receiptFilePath(stateDir, runId), "utf8")) as RunReceipt;
|
|
307
322
|
const ledger = readRunEnvelope(stateDir, runId);
|
|
@@ -319,7 +334,7 @@ function readRunEnvelope(stateDir: string, runId: string): ReadLedgerResult {
|
|
|
319
334
|
return { ok: false, reason: runs.length === 0 ? "run ledger not found" : "run not found in ledger" };
|
|
320
335
|
}
|
|
321
336
|
|
|
322
|
-
|
|
337
|
+
function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerifyResult {
|
|
323
338
|
const target = receiptFilePath(stateDir, runId);
|
|
324
339
|
let raw: string;
|
|
325
340
|
try {
|
|
@@ -342,6 +357,9 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
|
|
|
342
357
|
for (const key of RECEIPT_REQUIRED_KEYS) {
|
|
343
358
|
if (!(key in r)) return { ok: false, reason: `missing field: ${key}` };
|
|
344
359
|
}
|
|
360
|
+
if (!("clioCoderVersion" in r) && !("clioVersion" in r)) {
|
|
361
|
+
return { ok: false, reason: "missing field: clioCoderVersion" };
|
|
362
|
+
}
|
|
345
363
|
if (!isNonEmptyString(r.runId)) {
|
|
346
364
|
return { ok: false, reason: `runId invalid: ${String(r.runId)}` };
|
|
347
365
|
}
|
|
@@ -397,8 +415,9 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
|
|
|
397
415
|
if (!isIso8601(r.endedAt)) {
|
|
398
416
|
return { ok: false, reason: `endedAt not ISO-8601: ${String(r.endedAt)}` };
|
|
399
417
|
}
|
|
400
|
-
|
|
401
|
-
|
|
418
|
+
const clioCoderVersion = r.clioCoderVersion ?? r.clioVersion;
|
|
419
|
+
if (typeof clioCoderVersion !== "string" || clioCoderVersion.length === 0) {
|
|
420
|
+
return { ok: false, reason: "clioCoderVersion empty" };
|
|
402
421
|
}
|
|
403
422
|
if (!isNonEmptyString(r.piMonoVersion)) {
|
|
404
423
|
return { ok: false, reason: `piMonoVersion invalid: ${String(r.piMonoVersion)}` };
|
|
@@ -435,6 +454,98 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
|
|
|
435
454
|
return verifyReceiptIntegrity(r as unknown as RunReceipt, ledger.envelope);
|
|
436
455
|
}
|
|
437
456
|
|
|
457
|
+
const RECEIPT_FILE_FAILURE = /^(?:receipt file not found|read error:)/u;
|
|
458
|
+
const RECEIPT_CONTRACT_FAILURE =
|
|
459
|
+
/^(?:invalid json:|receipt is not an object|missing field:|runId invalid:|runId mismatch:|agentId invalid:|task invalid:|targetId invalid:|wireModelId invalid:|runtimeId invalid:|runtimeKind invalid:|exitCode out of range:|tokenCount out of range:|inputTokenCount out of range:|outputTokenCount out of range:|cacheReadTokenCount out of range:|cacheWriteTokenCount out of range:|costUsd out of range:|reasoningTokenCount out of range:|startedAt not ISO-8601:|endedAt not ISO-8601:|clioCoderVersion empty|piMonoVersion invalid:|platform invalid:|nodeVersion invalid:|toolCalls out of range:|toolStats\[|compiledPromptHash invalid:|staticCompositionHash invalid:|sessionId invalid:|integrity invalid|execution role invalid|routing intent invalid|route decision invalid)/u;
|
|
460
|
+
const LEDGER_FAILURE = /^(?:run ledger not found|run not found in ledger|ledger mismatch:)/u;
|
|
461
|
+
|
|
462
|
+
function receiptIntegrityDigest(value: unknown): string | null {
|
|
463
|
+
if (!isRecord(value) || value.algorithm !== "sha256" || !isNonEmptyString(value.digest)) return null;
|
|
464
|
+
return `sha256:${value.digest}`;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
function trustCheckEvidence(status: ReturnType<typeof inspectRunReceiptTrustStatus>["status"], axis: string): string {
|
|
468
|
+
const entry = status[axis as keyof typeof status];
|
|
469
|
+
if (typeof entry !== "object" || entry === null || !("state" in entry)) return "canonical trust projection";
|
|
470
|
+
if (entry.state === "absent") return `reason=${entry.reason}`;
|
|
471
|
+
const refs = entry.artifacts.map((artifact) => `${artifact.kind}:${artifact.id}`);
|
|
472
|
+
return refs.length > 0 ? refs.join(", ") : `${entry.authority.kind}:${entry.authority.id}`;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
function compromisedTrustAxes(status: ReturnType<typeof inspectRunReceiptTrustStatus>["status"]): TrustStatusAxis[] {
|
|
476
|
+
return TRUST_STATUS_AXES.filter((axis) => {
|
|
477
|
+
const state = status[axis].state;
|
|
478
|
+
if (axis === "artifactIntegrity") return state === "failed";
|
|
479
|
+
if (axis === "validationGrounding") return state === "failed" || state === "ungrounded";
|
|
480
|
+
if (axis === "independentReview") return state === "failed" || state === "not_independent";
|
|
481
|
+
if (axis === "contextProvenance") return state === "invalid";
|
|
482
|
+
if (axis === "autonomyEnforcement") return state === "bypassed";
|
|
483
|
+
return false;
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/** Actionable `/view verify` report without changing the low-level verifier contract. */
|
|
488
|
+
export function verifyReceiptFileReport(stateDir: string, runId: string): ReceiptVerificationReport {
|
|
489
|
+
const receiptPath = receiptFilePath(stateDir, runId);
|
|
490
|
+
const result = verifyReceiptFile(stateDir, runId);
|
|
491
|
+
let receipt: RunReceipt | null = null;
|
|
492
|
+
try {
|
|
493
|
+
receipt = JSON.parse(readFileSync(receiptPath, "utf8")) as RunReceipt;
|
|
494
|
+
} catch {
|
|
495
|
+
// The verifier's named file or JSON check below retains the actionable error.
|
|
496
|
+
}
|
|
497
|
+
const sealedDigest = receiptIntegrityDigest(receipt?.integrity);
|
|
498
|
+
const ledger = readRunEnvelope(stateDir, runId);
|
|
499
|
+
const inspection = receipt === null ? null : inspectRunReceiptTrustStatus(receipt, ledger.ok ? ledger.envelope : null);
|
|
500
|
+
const trustSummary = inspection === null ? null : formatTrustSummaryLine(inspection.status);
|
|
501
|
+
const compromiseAxes = inspection === null ? [] : compromisedTrustAxes(inspection.status);
|
|
502
|
+
const checks: ReceiptVerificationCheck[] = [];
|
|
503
|
+
|
|
504
|
+
if (!result.ok && RECEIPT_FILE_FAILURE.test(result.reason)) {
|
|
505
|
+
checks.push({ name: "receipt file", ok: false, evidence: `${receiptPath}: ${result.reason}` });
|
|
506
|
+
} else {
|
|
507
|
+
checks.push({ name: "receipt file", ok: true, evidence: receiptPath });
|
|
508
|
+
if (!result.ok && (RECEIPT_CONTRACT_FAILURE.test(result.reason) || result.retired !== undefined)) {
|
|
509
|
+
checks.push({ name: "receipt contract", ok: false, evidence: result.reason });
|
|
510
|
+
} else {
|
|
511
|
+
checks.push({
|
|
512
|
+
name: "receipt contract",
|
|
513
|
+
ok: true,
|
|
514
|
+
evidence: `current integrity v${receipt?.integrity.version ?? "unknown"}`,
|
|
515
|
+
});
|
|
516
|
+
if (!result.ok && LEDGER_FAILURE.test(result.reason)) {
|
|
517
|
+
checks.push({ name: "run ledger", ok: false, evidence: result.reason });
|
|
518
|
+
} else {
|
|
519
|
+
checks.push({ name: "run ledger", ok: true, evidence: `run ${runId} fields match` });
|
|
520
|
+
checks.push({
|
|
521
|
+
name: "sealed digest",
|
|
522
|
+
ok: result.ok,
|
|
523
|
+
evidence: result.ok ? `${sealedDigest ?? "digest unavailable"} matches receipt and ledger` : result.reason,
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
if (inspection !== null) {
|
|
530
|
+
for (const axis of compromiseAxes) {
|
|
531
|
+
checks.push({
|
|
532
|
+
name: `trust ${axis}`,
|
|
533
|
+
ok: false,
|
|
534
|
+
evidence: `${trustStateWord(axis, inspection.status[axis].state)}; ${trustCheckEvidence(inspection.status, axis)}`,
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
return {
|
|
540
|
+
...result,
|
|
541
|
+
receiptPath,
|
|
542
|
+
sealedDigest,
|
|
543
|
+
trustSummary,
|
|
544
|
+
compromised: compromiseAxes.length > 0,
|
|
545
|
+
checks,
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
|
|
438
549
|
function pushCapped(lines: string[], line: string, maxLines: number): boolean {
|
|
439
550
|
if (lines.length >= maxLines) return false;
|
|
440
551
|
lines.push(line);
|
|
@@ -478,7 +589,7 @@ function splitLinesCapped(text: string, path?: string, maxLines = VIEW_ARTIFACT_
|
|
|
478
589
|
return [...lines.slice(0, maxLines), `[truncated, open file directly${path ? `: ${path}` : ""}]`];
|
|
479
590
|
}
|
|
480
591
|
|
|
481
|
-
|
|
592
|
+
async function loadJsonFileLines(path: string): Promise<ViewArtifactLoadResult> {
|
|
482
593
|
let canPrettyPrint = false;
|
|
483
594
|
try {
|
|
484
595
|
const info = await stat(path);
|
|
@@ -1461,7 +1572,7 @@ export function createDefaultArtifactProviders(deps: ArtifactProviderDeps): Arti
|
|
|
1461
1572
|
];
|
|
1462
1573
|
}
|
|
1463
1574
|
|
|
1464
|
-
|
|
1575
|
+
function sortViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
|
|
1465
1576
|
return [...artifacts].sort((a, b) => {
|
|
1466
1577
|
const time = b.timestamp - a.timestamp;
|
|
1467
1578
|
if (time !== 0) return time;
|
|
@@ -141,7 +141,7 @@ function isViewArtifactCategory(value: string): value is ViewArtifactCategory {
|
|
|
141
141
|
return VIEW_ARTIFACT_CATEGORY_SET.has(value as ViewArtifactCategory);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
|
|
144
|
+
function parseViewFilterQuery(query: string): ViewFilterQuery {
|
|
145
145
|
const text = query.trim();
|
|
146
146
|
if (text.length === 0) return { kind: "text", text };
|
|
147
147
|
const colon = text.indexOf(":");
|
|
@@ -215,7 +215,7 @@ function formatLocalTime(timestamp: number): string {
|
|
|
215
215
|
return !Number.isFinite(timestamp) || timestamp <= 0 ? "unknown time" : clockLocal(timestamp);
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
-
|
|
218
|
+
function filterViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>, query: string): ViewArtifact[] {
|
|
219
219
|
const parsed = parseViewFilterQuery(query);
|
|
220
220
|
if (parsed.kind === "category") {
|
|
221
221
|
const categoryArtifacts = artifacts.filter((artifact) => artifact.category === parsed.category);
|
|
@@ -226,11 +226,11 @@ export function filterViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>, quer
|
|
|
226
226
|
return fuzzyFilter([...artifacts], parsed.text, broadFilterText);
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
|
|
229
|
+
function artifactsInCategoryOrder(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
|
|
230
230
|
return VIEW_ARTIFACT_CATEGORIES.flatMap((category) => artifacts.filter((artifact) => artifact.category === category));
|
|
231
231
|
}
|
|
232
232
|
|
|
233
|
-
|
|
233
|
+
function initialViewSelection(artifacts: ReadonlyArray<ViewArtifact>, initialFilter = ""): number {
|
|
234
234
|
const filtered = filterViewArtifacts(artifacts, initialFilter);
|
|
235
235
|
const first = filtered[0];
|
|
236
236
|
if (!first) return 0;
|
|
@@ -252,7 +252,7 @@ export function initialViewSelection(artifacts: ReadonlyArray<ViewArtifact>, ini
|
|
|
252
252
|
return Math.max(0, artifactsInCategoryOrder(filtered).indexOf(selected));
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
-
|
|
255
|
+
function nextCategorySelection(
|
|
256
256
|
artifacts: ReadonlyArray<ViewArtifact>,
|
|
257
257
|
currentIndex: number,
|
|
258
258
|
direction: -1 | 1,
|
|
@@ -271,7 +271,7 @@ export function nextCategorySelection(
|
|
|
271
271
|
return safeCurrent;
|
|
272
272
|
}
|
|
273
273
|
|
|
274
|
-
|
|
274
|
+
function groupedViewRows(artifacts: ReadonlyArray<ViewArtifact>): RenderedViewRow[] {
|
|
275
275
|
const rows: RenderedViewRow[] = [];
|
|
276
276
|
for (const category of VIEW_ARTIFACT_CATEGORIES) {
|
|
277
277
|
const items = artifacts.filter((artifact) => artifact.category === category);
|
|
@@ -334,7 +334,7 @@ function verificationText(state: ViewVerificationState | undefined): string {
|
|
|
334
334
|
return `${GLYPH.error} verify fail ${state.detail}`;
|
|
335
335
|
}
|
|
336
336
|
|
|
337
|
-
|
|
337
|
+
function buildArtifactHeader(
|
|
338
338
|
artifact: ViewArtifact | undefined,
|
|
339
339
|
verification: ViewVerificationState | undefined,
|
|
340
340
|
width: number,
|
|
@@ -361,7 +361,7 @@ export function buildArtifactHeader(
|
|
|
361
361
|
}
|
|
362
362
|
|
|
363
363
|
/** Put verification on wrapped rows so a canonical receipt verdict is never reduced to a prefix. */
|
|
364
|
-
|
|
364
|
+
function buildArtifactHeaderLines(
|
|
365
365
|
artifact: ViewArtifact | undefined,
|
|
366
366
|
verification: ViewVerificationState | undefined,
|
|
367
367
|
width: number,
|
|
@@ -384,7 +384,7 @@ export function buildArtifactHeaderLines(
|
|
|
384
384
|
];
|
|
385
385
|
}
|
|
386
386
|
|
|
387
|
-
|
|
387
|
+
function viewFooterHint(focus: ViewPaneFocus, canVerify: boolean, innerWidth?: number): string {
|
|
388
388
|
// One pane at a time means Tab is how the other one is reached, so the
|
|
389
389
|
// narrow footer states it. The generic elider drops middle entries, and Tab
|
|
390
390
|
// sits in the middle.
|
|
@@ -527,6 +527,7 @@ export class ViewOverlayView implements Component {
|
|
|
527
527
|
private renderedContentLines(width: number): string[] {
|
|
528
528
|
const content = this.content;
|
|
529
529
|
if (!content) return [];
|
|
530
|
+
if (content.status === "error") return content.lines.flatMap((line) => wrapTextWithAnsi(line, Math.max(1, width)));
|
|
530
531
|
if (content.format !== "markdown") return content.lines;
|
|
531
532
|
if (content.renderedLines && content.renderWidth === width) return content.renderedLines;
|
|
532
533
|
const md = new Markdown(content.lines.join("\n"), 0, 0, markdownTheme(clioTheme()));
|
|
@@ -548,7 +549,9 @@ export class ViewOverlayView implements Component {
|
|
|
548
549
|
return this.fixedLines(lines, width, height);
|
|
549
550
|
}
|
|
550
551
|
if (this.artifactError) {
|
|
551
|
-
lines.push(
|
|
552
|
+
lines.push(
|
|
553
|
+
...wrapTextWithAnsi(theme.fg("error", this.artifactError), Math.max(1, width)).map((line) => padAnsi(line, width)),
|
|
554
|
+
);
|
|
552
555
|
return this.fixedLines(lines, width, height);
|
|
553
556
|
}
|
|
554
557
|
|
|
@@ -764,6 +767,7 @@ export function openViewOverlay(
|
|
|
764
767
|
width: VIEW_OVERLAY_WIDTH,
|
|
765
768
|
maxHeight: VIEW_OVERLAY_MAX_HEIGHT,
|
|
766
769
|
margin: VIEW_OVERLAY_MARGIN,
|
|
770
|
+
markerId: "view",
|
|
767
771
|
title: "View",
|
|
768
772
|
footerHint: (innerWidth) => view.getHint(innerWidth),
|
|
769
773
|
});
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The workers-view watch pane: one pane, beside Clio's own, rendering whatever
|
|
3
|
+
* run the operator points at.
|
|
4
|
+
*
|
|
5
|
+
* The pane hosts `clio-coder fleet view --watch <selection-file>` (see
|
|
6
|
+
* src/cli/fleet-view.ts), a durable-state viewer that re-reads the selection
|
|
7
|
+
* file on every poll. Retargeting is therefore one small atomic file write:
|
|
8
|
+
* arrow keys in the Alt+W board follow the cursor with zero socket traffic and
|
|
9
|
+
* zero pane churn, which is what makes the navigation feel like part of the
|
|
10
|
+
* board rather than like driving a terminal multiplexer.
|
|
11
|
+
*
|
|
12
|
+
* Pane creation is deliberately lazy, but reclamation is eager. A surviving
|
|
13
|
+
* pane is adopted as soon as the controller starts so the relaunched session's
|
|
14
|
+
* inventory owns it before the next watch command. A new pane still opens only
|
|
15
|
+
* on the first watch (operator Enter, `/panes show`, or the panes tool), and is
|
|
16
|
+
* never closed by navigation: leaving the workers view parks it on the last
|
|
17
|
+
* selection, and it goes away when the operator quits the viewer (`q`), closes
|
|
18
|
+
* the pane, or runs `/panes close watch`.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { mkdirSync, renameSync, writeFileSync } from "node:fs";
|
|
22
|
+
import { dirname, join } from "node:path";
|
|
23
|
+
import { type ClioDirs, clioCacheDir, clioConfigDir, clioDataDir, clioStateDir } from "../core/xdg.js";
|
|
24
|
+
import type { MuxContract, MuxPaneRef } from "../domains/mux/index.js";
|
|
25
|
+
import type { PanesWatchController, PanesWatchResult } from "../domains/mux/operations.js";
|
|
26
|
+
import { watchViewerCommand } from "../domains/mux/viewer-command.js";
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* One selection file per state root, deliberately not per session: every
|
|
30
|
+
* session over a state root shares one run ledger, so a surviving watch pane
|
|
31
|
+
* from a crashed session keeps working the moment a new session writes the
|
|
32
|
+
* same file.
|
|
33
|
+
*/
|
|
34
|
+
function watchSelectionPath(stateDir: string = clioStateDir()): string {
|
|
35
|
+
return join(stateDir, "watch-selection");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface WatchPaneDeps {
|
|
39
|
+
mux: MuxContract;
|
|
40
|
+
getCwd: () => string;
|
|
41
|
+
/**
|
|
42
|
+
* Live workers-dock share, read at each open so a `/settings` edit applies
|
|
43
|
+
* to the next pane. Absent (tests, minimal wiring) the dock spec's default
|
|
44
|
+
* governs.
|
|
45
|
+
*/
|
|
46
|
+
getWorkersRatio?: () => number;
|
|
47
|
+
/** Selection-file override for tests. */
|
|
48
|
+
selectionPath?: string;
|
|
49
|
+
/** Resolved-layout override for tests. Production pins this process's four cached roots. */
|
|
50
|
+
dirs?: Readonly<ClioDirs>;
|
|
51
|
+
/** Command override for tests; production runs this install's own CLI. */
|
|
52
|
+
command?: (selectionPath: string, dirs: Readonly<ClioDirs>) => ReadonlyArray<string>;
|
|
53
|
+
writeFile?: (path: string, content: string) => void;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Replace-by-rename so the viewer's poll never reads a torn line. */
|
|
57
|
+
function atomicWrite(path: string, content: string): void {
|
|
58
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
59
|
+
const tmp = `${path}.tmp`;
|
|
60
|
+
writeFileSync(tmp, content, "utf8");
|
|
61
|
+
renameSync(tmp, path);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function createWatchPaneController(deps: WatchPaneDeps): PanesWatchController {
|
|
65
|
+
const selectionPath = deps.selectionPath ?? watchSelectionPath();
|
|
66
|
+
const dirs =
|
|
67
|
+
deps.dirs ??
|
|
68
|
+
Object.freeze({
|
|
69
|
+
config: clioConfigDir(),
|
|
70
|
+
data: clioDataDir(),
|
|
71
|
+
state: clioStateDir(),
|
|
72
|
+
cache: clioCacheDir(),
|
|
73
|
+
});
|
|
74
|
+
const command = deps.command ?? ((path, layout) => watchViewerCommand(path, { dirs: layout }));
|
|
75
|
+
const write = deps.writeFile ?? atomicWrite;
|
|
76
|
+
|
|
77
|
+
let paneId: string | null = null;
|
|
78
|
+
let disposed = false;
|
|
79
|
+
let adoptionInFlight: Promise<boolean> | null = null;
|
|
80
|
+
const unsubscribe = deps.mux.onPaneGone((record) => {
|
|
81
|
+
if (record.ref.paneId === paneId) paneId = null;
|
|
82
|
+
});
|
|
83
|
+
const adoptExistingPane = (): Promise<boolean> => {
|
|
84
|
+
if (disposed || paneId !== null) return Promise.resolve(true);
|
|
85
|
+
if (adoptionInFlight !== null) return adoptionInFlight;
|
|
86
|
+
const attempt = Promise.resolve()
|
|
87
|
+
.then(() => deps.mux.adoptPane({ purpose: "watch", label: "watch", dock: "workers" }))
|
|
88
|
+
.then((adopted) => {
|
|
89
|
+
if (!disposed && paneId === null && adopted !== null) paneId = adopted.paneId;
|
|
90
|
+
return true;
|
|
91
|
+
})
|
|
92
|
+
.catch(() => {
|
|
93
|
+
// Startup reclamation is best effort. An explicit watch retries the
|
|
94
|
+
// scan before it opens a replacement pane.
|
|
95
|
+
return false;
|
|
96
|
+
})
|
|
97
|
+
.finally(() => {
|
|
98
|
+
if (adoptionInFlight === attempt) adoptionInFlight = null;
|
|
99
|
+
});
|
|
100
|
+
adoptionInFlight = attempt;
|
|
101
|
+
return attempt;
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const writeSelection = (runId: string): boolean => {
|
|
105
|
+
try {
|
|
106
|
+
write(selectionPath, `${runId}\n`);
|
|
107
|
+
return true;
|
|
108
|
+
} catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* The one place a watch pane is created: the workers dock slot, split right
|
|
115
|
+
* of Clio's pane at the configured share. On a host without the layout tier
|
|
116
|
+
* the dock request degrades inside the contract to a plain right split.
|
|
117
|
+
*/
|
|
118
|
+
const openPane = (): Promise<MuxPaneRef | null> =>
|
|
119
|
+
deps.mux.openUtilityPane({
|
|
120
|
+
argv: command(selectionPath, dirs),
|
|
121
|
+
cwd: deps.getCwd(),
|
|
122
|
+
label: "watch",
|
|
123
|
+
title: "clio-coder watch",
|
|
124
|
+
purpose: "watch",
|
|
125
|
+
dock: { slot: "workers", ...(deps.getWorkersRatio ? { share: deps.getWorkersRatio() } : {}) },
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// Reclaim durable ownership for inventory and navigation immediately. The
|
|
129
|
+
// scan remains best effort and never opens a replacement pane on its own.
|
|
130
|
+
void adoptExistingPane();
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
async ensureOpen(): Promise<boolean> {
|
|
134
|
+
// Boot composition: the pane exists and parks on the last selection
|
|
135
|
+
// (the viewer renders "no selection" until one is written). Adoption
|
|
136
|
+
// first, so a surviving dock is reused rather than doubled.
|
|
137
|
+
if (disposed) return false;
|
|
138
|
+
if (paneId !== null) return true;
|
|
139
|
+
await adoptExistingPane();
|
|
140
|
+
if (paneId !== null) return true;
|
|
141
|
+
const opened = await openPane();
|
|
142
|
+
if (opened === null) return false;
|
|
143
|
+
paneId = opened.paneId;
|
|
144
|
+
return true;
|
|
145
|
+
},
|
|
146
|
+
|
|
147
|
+
async watch(runId: string): Promise<PanesWatchResult> {
|
|
148
|
+
if (!writeSelection(runId)) {
|
|
149
|
+
return { status: "unavailable", reason: `cannot write the watch selection at ${selectionPath}` };
|
|
150
|
+
}
|
|
151
|
+
if (paneId !== null) return { status: "watching", runId, paneId, opened: false };
|
|
152
|
+
const scanned = await adoptExistingPane();
|
|
153
|
+
if (!scanned) await adoptExistingPane();
|
|
154
|
+
if (paneId !== null) return { status: "watching", runId, paneId, opened: false };
|
|
155
|
+
const opened = await openPane();
|
|
156
|
+
if (opened === null) {
|
|
157
|
+
return { status: "unavailable", reason: "the pane host refused to open the watch pane" };
|
|
158
|
+
}
|
|
159
|
+
paneId = opened.paneId;
|
|
160
|
+
return { status: "watching", runId, paneId, opened: true };
|
|
161
|
+
},
|
|
162
|
+
|
|
163
|
+
follow(runId: string): boolean {
|
|
164
|
+
// Navigation never opens anything; a closed watch pane stays closed
|
|
165
|
+
// until the operator asks again with Enter.
|
|
166
|
+
if (paneId === null) return false;
|
|
167
|
+
return writeSelection(runId);
|
|
168
|
+
},
|
|
169
|
+
|
|
170
|
+
isOpen(): boolean {
|
|
171
|
+
return paneId !== null;
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
dispose(): void {
|
|
175
|
+
// The pane parks; only the subscription goes.
|
|
176
|
+
disposed = true;
|
|
177
|
+
unsubscribe();
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
@@ -103,7 +103,7 @@ function findCurrentStatus(
|
|
|
103
103
|
statuses: ReadonlyArray<TargetStatus>,
|
|
104
104
|
settings: Readonly<ClioSettings> | undefined,
|
|
105
105
|
): TargetStatus | null {
|
|
106
|
-
const targetId = settings?.
|
|
106
|
+
const targetId = settings?.chat?.target ?? null;
|
|
107
107
|
if (!targetId) return null;
|
|
108
108
|
return statuses.find((status) => status.target.id === targetId) ?? null;
|
|
109
109
|
}
|
|
@@ -127,7 +127,7 @@ function selectedModelCapabilities(
|
|
|
127
127
|
providers: ProvidersContract,
|
|
128
128
|
): CapabilityFlags | null {
|
|
129
129
|
if (!status) return null;
|
|
130
|
-
const wireModelId = settings?.
|
|
130
|
+
const wireModelId = settings?.chat?.model ?? status.target.defaultModel ?? null;
|
|
131
131
|
const detectedReasoning =
|
|
132
132
|
wireModelId && typeof providers.getDetectedReasoning === "function"
|
|
133
133
|
? providers.getDetectedReasoning(status.target.id, wireModelId)
|
|
@@ -216,7 +216,7 @@ function handoffFacts(cwd: string): { handoffCount: number; handoffFreshness: st
|
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
218
|
|
|
219
|
-
|
|
219
|
+
function readWelcomeRepositoryFacts(cwd: string): WelcomeRepositoryFacts {
|
|
220
220
|
const codewiki = readCodewiki(cwd);
|
|
221
221
|
const wiki = codewiki ? wikiFactsFrom(cwd, wikiStaleness(cwd)) : { wikiPageCount: 0, wikiStatus: NO_WIKI_STATUS };
|
|
222
222
|
return {
|
|
@@ -255,7 +255,7 @@ async function readWelcomeRepositoryFactsAsync(cwd: string): Promise<WelcomeRepo
|
|
|
255
255
|
* guessed, because it decides whether the Wiki row exists at all and the whole
|
|
256
256
|
* point of a placeholder is that the banner never changes height.
|
|
257
257
|
*/
|
|
258
|
-
|
|
258
|
+
function placeholderRepositoryFacts(cwd: string): WelcomeRepositoryFacts {
|
|
259
259
|
return {
|
|
260
260
|
clioMdStatus: clioMdStatusFor(cwd),
|
|
261
261
|
hasCodewiki: existsSync(join(cwd, ".clio-coder", "codewiki.json")),
|
|
@@ -269,13 +269,13 @@ export function placeholderRepositoryFacts(cwd: string): WelcomeRepositoryFacts
|
|
|
269
269
|
};
|
|
270
270
|
}
|
|
271
271
|
|
|
272
|
-
|
|
272
|
+
function deriveWelcomeDashboardStats(deps: WelcomeDashboardDeps): WelcomeDashboardStats {
|
|
273
273
|
const settings = deps.getSettings?.();
|
|
274
274
|
const statuses = deps.providers.list();
|
|
275
275
|
const current = findCurrentStatus(statuses, settings);
|
|
276
276
|
// Left null when unset; formatTargetLabel owns the one spelling for that.
|
|
277
|
-
const targetLabel = current?.target.id ?? settings?.
|
|
278
|
-
const modelLabel = settings?.
|
|
277
|
+
const targetLabel = current?.target.id ?? settings?.chat?.target ?? null;
|
|
278
|
+
const modelLabel = settings?.chat?.model ?? current?.target.defaultModel ?? null;
|
|
279
279
|
const workspace = deps.getWorkspaceSnapshot?.() ?? null;
|
|
280
280
|
const cwd = workspace?.cwd ?? process.cwd();
|
|
281
281
|
const currentAvailable = current ? activeStatus(current) : false;
|
|
@@ -283,16 +283,16 @@ export function deriveWelcomeDashboardStats(deps: WelcomeDashboardDeps): Welcome
|
|
|
283
283
|
const thinkingLevel =
|
|
284
284
|
resolveModelRuntimeCapabilitiesForProviders(
|
|
285
285
|
deps.providers,
|
|
286
|
-
settings?.
|
|
287
|
-
settings?.
|
|
288
|
-
settings?.
|
|
286
|
+
settings?.chat?.target,
|
|
287
|
+
settings?.chat?.model,
|
|
288
|
+
settings?.chat?.thinkingLevel ?? "off",
|
|
289
289
|
)?.thinking.display ??
|
|
290
|
-
settings?.
|
|
290
|
+
settings?.chat?.thinkingLevel ??
|
|
291
291
|
"off";
|
|
292
292
|
|
|
293
|
-
const autonomy = settings?.autonomy ?? "auto-edit";
|
|
294
|
-
const toolProfile = settings?.
|
|
295
|
-
const threshold = settings?.compaction?.threshold;
|
|
293
|
+
const autonomy = settings?.safety.autonomy ?? "auto-edit";
|
|
294
|
+
const toolProfile = settings?.integrations.externalAgents?.defaults?.toolGovernance ?? "clio-coder-policy";
|
|
295
|
+
const threshold = settings?.context.compaction?.threshold;
|
|
296
296
|
const compactionThreshold =
|
|
297
297
|
typeof threshold === "number" && Number.isFinite(threshold) ? `${Math.round(threshold * 100)}%` : "80%";
|
|
298
298
|
|
|
@@ -376,7 +376,7 @@ function nextValue(stats: WelcomeDashboardStats): string {
|
|
|
376
376
|
* route answers, and what the context is ready for. Maturity caveats belong
|
|
377
377
|
* in the README, not in a line the operator reads on every turn.
|
|
378
378
|
*/
|
|
379
|
-
|
|
379
|
+
function buildWelcomeDashboardLines(
|
|
380
380
|
stats: WelcomeDashboardStats,
|
|
381
381
|
width: number,
|
|
382
382
|
mode: WelcomeDashboardMode = "launchpad",
|