@iowarp/clio-coder 0.4.0 → 0.4.2
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 +131 -0
- package/CONTRIBUTING.md +59 -36
- package/README.md +407 -375
- package/SECURITY.md +2 -1
- package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
- package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
- package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/chunk-34BHNEE3.js +1846 -0
- package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/chunk-3KIPBMUA.js +308 -0
- package/dist/chunk-3M6DQK6S.js +362 -0
- package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
- package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
- package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
- package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
- package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
- package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
- package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
- package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
- package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-F2I26BDK.js +66 -0
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
- package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
- package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
- package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
- package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
- package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
- package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/chunk-NMJXSHBJ.js +283 -0
- package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
- package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
- package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
- package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
- package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
- package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
- package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
- package/dist/chunk-UXCU4E3T.js +303 -0
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
- package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
- package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
- package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
- package/dist/chunk-XQRY4DTA.js +657 -0
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
- package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
- package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +38 -37
- package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
- package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
- package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
- package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
- package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
- package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
- package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
- package/dist/doctor-LHBD36VU.js +773 -0
- package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
- package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
- package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
- package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
- package/dist/fleet-view-TWHJKCN6.js +96 -0
- package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
- package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
- package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
- package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
- package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
- package/dist/panes-IXKLOKA2.js +75 -0
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
- package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
- package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
- package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
- package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
- package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
- package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
- package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
- package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
- package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
- package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
- package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
- package/dist/worker/entry.js +83 -63
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
- package/docs/history/release-cut-checklist.md +207 -0
- package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- 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 +13 -21
- package/skills/README.md +51 -42
- package/skills/coding/ast-grep/SKILL.md +9 -3
- package/skills/coding/coding-standards/SKILL.md +9 -3
- package/skills/coding/prototype/SKILL.md +9 -3
- package/skills/coding/tdd/SKILL.md +9 -3
- package/skills/context/context-handoff/SKILL.md +13 -4
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +9 -3
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +10 -5
- 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 +9 -3
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +10 -4
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +8 -3
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +8 -3
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
- package/skills/meta/clio-coder-test/SKILL.md +146 -0
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
- package/skills/meta/clio-coder-test/references/harness.md +102 -0
- package/skills/meta/clio-coder-test/references/test-map.md +96 -0
- package/skills/meta/credentials/SKILL.md +10 -3
- package/skills/meta/find-skills/SKILL.md +9 -3
- package/skills/meta/herdr/SKILL.md +9 -3
- package/skills/meta/skill-craft/SKILL.md +39 -16
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +9 -3
- package/skills/planning/prd/SKILL.md +9 -3
- package/skills/planning/product-intent/SKILL.md +9 -3
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +9 -3
- package/skills/research/experiment-protocol/SKILL.md +10 -3
- package/skills/research/scientific-debugging/SKILL.md +10 -3
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +10 -3
- package/skills/skill-marketplace.json +285 -66
- package/skills/workflow/cut-it/SKILL.md +11 -3
- package/skills/workflow/design-council/SKILL.md +12 -3
- package/skills/workflow/grill-me/SKILL.md +9 -3
- package/skills/workflow/workflow-distiller/SKILL.md +9 -3
- package/src/cli/acp.ts +2 -2
- package/src/cli/args.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +6 -6
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +68 -15
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -31
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +28 -20
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +31 -10
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/eval.ts +1 -2
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet-decisions.ts +1 -1
- package/src/cli/fleet-inspect.ts +1 -1
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +1 -1
- package/src/cli/fleet-view.ts +40 -23
- package/src/cli/fleet.ts +9 -6
- package/src/cli/index.ts +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/interop-inspect.ts +2 -2
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +19 -5
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +13 -17
- package/src/cli/share.ts +6 -2
- package/src/cli/skills-eval.ts +14 -14
- package/src/cli/targets.ts +25 -30
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +96 -4
- 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 +1 -1
- package/src/cli/wiki-generate.ts +6 -6
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +132 -87
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +51 -6
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1066 -886
- package/src/core/defaults.ts +326 -530
- package/src/core/dispatch-outcome.ts +16 -0
- 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 +33 -52
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/prompt-hint.ts +9 -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/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/timers.ts +2 -12
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +14 -26
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +26 -4
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract.ts +1 -1
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +35 -47
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +56 -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 -6
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- 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/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/capability-match.ts +10 -0
- package/src/domains/dispatch/capacity-lease.ts +2 -5
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/extension.ts +169 -82
- package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +0 -7
- package/src/domains/dispatch/gate-decisions.ts +25 -14
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +220 -70
- 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 +0 -23
- 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.ts +9 -19
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +47 -40
- package/src/domains/dispatch/types.ts +58 -6
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +10 -4
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- 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/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 +20 -3
- 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/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- 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-extension-install-digests.ts +27 -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 +22 -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 +276 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +86 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +35 -4
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +30 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +195 -25
- package/src/domains/mux/detect.ts +23 -6
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +21 -1
- package/src/domains/mux/operations.ts +72 -5
- package/src/domains/mux/protocol.ts +19 -6
- package/src/domains/mux/socket-client.ts +167 -19
- package/src/domains/mux/types.ts +49 -6
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +79 -7
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/extension.ts +12 -4
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +15 -91
- package/src/domains/observability/trace-store.ts +65 -19
- package/src/domains/prompts/compiler.ts +75 -55
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +100 -12
- package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +11 -18
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +99 -23
- 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} +671 -106
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtime-resolution.ts +31 -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 +9 -4
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +87 -39
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- 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 +41 -18
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- 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/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +249 -43
- package/src/domains/toolchain/install.ts +1 -1
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +89 -35
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +1 -1
- 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 +4 -23
- package/src/engine/apis/lmstudio.ts +4 -9
- package/src/engine/apis/ollama-native.ts +9 -9
- package/src/engine/apis/openai-completions.ts +30 -27
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +10 -35
- package/src/engine/claude/sdk-module.ts +1 -12
- package/src/engine/claude/sdk-runtime.ts +6 -6
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -17
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +1 -1
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +54 -24
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +163 -120
- package/src/interactive/application-controller.ts +23 -22
- package/src/interactive/bus-notices.ts +10 -3
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +18 -9
- package/src/interactive/chat-panel.ts +37 -14
- package/src/interactive/chat-renderer.ts +71 -7
- 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 +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +36 -44
- 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 +15 -44
- package/src/interactive/interactive-application.ts +116 -61
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +6 -2
- package/src/interactive/interactive-presentation.ts +22 -17
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +65 -17
- 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 +2 -2
- package/src/interactive/modal-marker.ts +2 -21
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/overlay-frame.ts +4 -12
- package/src/interactive/overlay-general-openers.ts +6 -2
- package/src/interactive/overlay-key-routing.ts +7 -7
- package/src/interactive/overlay-lifecycle.ts +1 -1
- package/src/interactive/overlay-model-selectors.ts +3 -3
- package/src/interactive/overlays/agents.ts +2 -2
- package/src/interactive/overlays/ask-user.ts +25 -11
- package/src/interactive/overlays/context-reset.ts +28 -4
- package/src/interactive/overlays/cwd-fallback.ts +28 -4
- package/src/interactive/overlays/decisions.ts +4 -2
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/interop.ts +1 -1
- package/src/interactive/overlays/library-install-confirm.ts +1 -1
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/model-selector.ts +39 -31
- package/src/interactive/overlays/prompts.ts +10 -4
- package/src/interactive/overlays/session-selector.ts +2 -2
- package/src/interactive/overlays/settings.ts +360 -303
- package/src/interactive/overlays/side-question.ts +2 -2
- package/src/interactive/overlays/skills-hub.ts +8 -8
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/panes-runtime.ts +145 -43
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +401 -190
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -24
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +41 -26
- 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 +12 -9
- package/src/interactive/view/view-overlay.ts +13 -10
- package/src/interactive/watch-pane.ts +38 -10
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +4 -4
- package/src/interactive/worker-receipts.ts +1 -1
- package/src/interactive/worker-stream.ts +1 -4
- package/src/interactive/yazi-bridge.ts +72 -11
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +6 -6
- package/src/tools/bash.ts +2 -2
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +44 -13
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +6 -2
- package/src/tools/dispatch-plan.ts +48 -15
- package/src/tools/dispatch-run-events.ts +13 -11
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/find.ts +1 -6
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +4 -5
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +30 -7
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- 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-36EJLSQQ.js +0 -814
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUCTJL45.js +0 -45
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-TZ3SGWZZ.js +0 -48
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/dist/fleet-view-ZCON35AG.js +0 -102
- package/dist/panes-HMABYVO4.js +0 -58
- package/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/release-cut-checklist.md +0 -193
- package/docs/time-conventions.md +0 -101
- package/skills/meta/clio-test/SKILL.md +0 -133
- package/skills/meta/clio-test/references/harness.md +0 -126
- package/skills/meta/clio-test/references/test-map.md +0 -69
- package/src/engine/apis/degraded-inference.ts +0 -95
|
@@ -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;
|
|
@@ -151,7 +151,6 @@ const RECEIPT_REQUIRED_KEYS = [
|
|
|
151
151
|
"costUsd",
|
|
152
152
|
"compiledPromptHash",
|
|
153
153
|
"staticCompositionHash",
|
|
154
|
-
"clioVersion",
|
|
155
154
|
"piMonoVersion",
|
|
156
155
|
"platform",
|
|
157
156
|
"nodeVersion",
|
|
@@ -255,7 +254,7 @@ export function receiptFilePath(stateDir: string, runId: string): string {
|
|
|
255
254
|
return join(stateDir, "receipts", `${runId}.json`);
|
|
256
255
|
}
|
|
257
256
|
|
|
258
|
-
|
|
257
|
+
function runLedgerPath(stateDir: string): string {
|
|
259
258
|
return join(stateDir, "runs.json");
|
|
260
259
|
}
|
|
261
260
|
|
|
@@ -317,7 +316,7 @@ type ReadLedgerResult = { ok: true; envelope: RunEnvelope } | { ok: false; reaso
|
|
|
317
316
|
* the same file and ledger row, projected through the shared boundary so the
|
|
318
317
|
* receipt view spells its verdict exactly as the board and the CLI do.
|
|
319
318
|
*/
|
|
320
|
-
|
|
319
|
+
function receiptTrustDetail(stateDir: string, runId: string): string {
|
|
321
320
|
try {
|
|
322
321
|
const receipt = JSON.parse(readFileSync(receiptFilePath(stateDir, runId), "utf8")) as RunReceipt;
|
|
323
322
|
const ledger = readRunEnvelope(stateDir, runId);
|
|
@@ -335,7 +334,7 @@ function readRunEnvelope(stateDir: string, runId: string): ReadLedgerResult {
|
|
|
335
334
|
return { ok: false, reason: runs.length === 0 ? "run ledger not found" : "run not found in ledger" };
|
|
336
335
|
}
|
|
337
336
|
|
|
338
|
-
|
|
337
|
+
function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerifyResult {
|
|
339
338
|
const target = receiptFilePath(stateDir, runId);
|
|
340
339
|
let raw: string;
|
|
341
340
|
try {
|
|
@@ -358,6 +357,9 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
|
|
|
358
357
|
for (const key of RECEIPT_REQUIRED_KEYS) {
|
|
359
358
|
if (!(key in r)) return { ok: false, reason: `missing field: ${key}` };
|
|
360
359
|
}
|
|
360
|
+
if (!("clioCoderVersion" in r) && !("clioVersion" in r)) {
|
|
361
|
+
return { ok: false, reason: "missing field: clioCoderVersion" };
|
|
362
|
+
}
|
|
361
363
|
if (!isNonEmptyString(r.runId)) {
|
|
362
364
|
return { ok: false, reason: `runId invalid: ${String(r.runId)}` };
|
|
363
365
|
}
|
|
@@ -413,8 +415,9 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
|
|
|
413
415
|
if (!isIso8601(r.endedAt)) {
|
|
414
416
|
return { ok: false, reason: `endedAt not ISO-8601: ${String(r.endedAt)}` };
|
|
415
417
|
}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
+
const clioCoderVersion = r.clioCoderVersion ?? r.clioVersion;
|
|
419
|
+
if (typeof clioCoderVersion !== "string" || clioCoderVersion.length === 0) {
|
|
420
|
+
return { ok: false, reason: "clioCoderVersion empty" };
|
|
418
421
|
}
|
|
419
422
|
if (!isNonEmptyString(r.piMonoVersion)) {
|
|
420
423
|
return { ok: false, reason: `piMonoVersion invalid: ${String(r.piMonoVersion)}` };
|
|
@@ -453,7 +456,7 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
|
|
|
453
456
|
|
|
454
457
|
const RECEIPT_FILE_FAILURE = /^(?:receipt file not found|read error:)/u;
|
|
455
458
|
const RECEIPT_CONTRACT_FAILURE =
|
|
456
|
-
/^(?: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:|
|
|
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;
|
|
457
460
|
const LEDGER_FAILURE = /^(?:run ledger not found|run not found in ledger|ledger mismatch:)/u;
|
|
458
461
|
|
|
459
462
|
function receiptIntegrityDigest(value: unknown): string | null {
|
|
@@ -586,7 +589,7 @@ function splitLinesCapped(text: string, path?: string, maxLines = VIEW_ARTIFACT_
|
|
|
586
589
|
return [...lines.slice(0, maxLines), `[truncated, open file directly${path ? `: ${path}` : ""}]`];
|
|
587
590
|
}
|
|
588
591
|
|
|
589
|
-
|
|
592
|
+
async function loadJsonFileLines(path: string): Promise<ViewArtifactLoadResult> {
|
|
590
593
|
let canPrettyPrint = false;
|
|
591
594
|
try {
|
|
592
595
|
const info = await stat(path);
|
|
@@ -1569,7 +1572,7 @@ export function createDefaultArtifactProviders(deps: ArtifactProviderDeps): Arti
|
|
|
1569
1572
|
];
|
|
1570
1573
|
}
|
|
1571
1574
|
|
|
1572
|
-
|
|
1575
|
+
function sortViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
|
|
1573
1576
|
return [...artifacts].sort((a, b) => {
|
|
1574
1577
|
const time = b.timestamp - a.timestamp;
|
|
1575
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
|
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
import { mkdirSync, renameSync, writeFileSync } from "node:fs";
|
|
22
22
|
import { dirname, join } from "node:path";
|
|
23
23
|
import { type ClioDirs, clioCacheDir, clioConfigDir, clioDataDir, clioStateDir } from "../core/xdg.js";
|
|
24
|
-
import type { MuxContract } from "../domains/mux/index.js";
|
|
24
|
+
import type { MuxContract, MuxPaneRef } from "../domains/mux/index.js";
|
|
25
25
|
import type { PanesWatchController, PanesWatchResult } from "../domains/mux/operations.js";
|
|
26
26
|
import { watchViewerCommand } from "../domains/mux/viewer-command.js";
|
|
27
27
|
|
|
@@ -38,6 +38,12 @@ function watchSelectionPath(stateDir: string = clioStateDir()): string {
|
|
|
38
38
|
export interface WatchPaneDeps {
|
|
39
39
|
mux: MuxContract;
|
|
40
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;
|
|
41
47
|
/** Selection-file override for tests. */
|
|
42
48
|
selectionPath?: string;
|
|
43
49
|
/** Resolved-layout override for tests. Production pins this process's four cached roots. */
|
|
@@ -78,7 +84,7 @@ export function createWatchPaneController(deps: WatchPaneDeps): PanesWatchContro
|
|
|
78
84
|
if (disposed || paneId !== null) return Promise.resolve(true);
|
|
79
85
|
if (adoptionInFlight !== null) return adoptionInFlight;
|
|
80
86
|
const attempt = Promise.resolve()
|
|
81
|
-
.then(() => deps.mux.adoptPane({ purpose: "watch", label: "watch" }))
|
|
87
|
+
.then(() => deps.mux.adoptPane({ purpose: "watch", label: "watch", dock: "workers" }))
|
|
82
88
|
.then((adopted) => {
|
|
83
89
|
if (!disposed && paneId === null && adopted !== null) paneId = adopted.paneId;
|
|
84
90
|
return true;
|
|
@@ -104,11 +110,40 @@ export function createWatchPaneController(deps: WatchPaneDeps): PanesWatchContro
|
|
|
104
110
|
}
|
|
105
111
|
};
|
|
106
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
|
+
|
|
107
128
|
// Reclaim durable ownership for inventory and navigation immediately. The
|
|
108
129
|
// scan remains best effort and never opens a replacement pane on its own.
|
|
109
130
|
void adoptExistingPane();
|
|
110
131
|
|
|
111
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
|
+
|
|
112
147
|
async watch(runId: string): Promise<PanesWatchResult> {
|
|
113
148
|
if (!writeSelection(runId)) {
|
|
114
149
|
return { status: "unavailable", reason: `cannot write the watch selection at ${selectionPath}` };
|
|
@@ -117,14 +152,7 @@ export function createWatchPaneController(deps: WatchPaneDeps): PanesWatchContro
|
|
|
117
152
|
const scanned = await adoptExistingPane();
|
|
118
153
|
if (!scanned) await adoptExistingPane();
|
|
119
154
|
if (paneId !== null) return { status: "watching", runId, paneId, opened: false };
|
|
120
|
-
const opened = await
|
|
121
|
-
argv: command(selectionPath, dirs),
|
|
122
|
-
cwd: deps.getCwd(),
|
|
123
|
-
label: "watch",
|
|
124
|
-
title: "clio watch",
|
|
125
|
-
purpose: "watch",
|
|
126
|
-
direction: "right",
|
|
127
|
-
});
|
|
155
|
+
const opened = await openPane();
|
|
128
156
|
if (opened === null) {
|
|
129
157
|
return { status: "unavailable", reason: "the pane host refused to open the watch pane" };
|
|
130
158
|
}
|
|
@@ -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",
|
|
@@ -164,9 +164,9 @@ function isThinkingEvent(event: Record<string, unknown>): boolean {
|
|
|
164
164
|
return assistantEvent?.type === "thinking_delta";
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
-
/** The action a `
|
|
167
|
+
/** The action a `clio_coder_tool_start`/`clio_coder_tool_finish` event names, or null when it is neither. */
|
|
168
168
|
function toolEventAction(event: Record<string, unknown>): WorkerAction | null {
|
|
169
|
-
if (event.type !== "
|
|
169
|
+
if (event.type !== "clio_coder_tool_start" && event.type !== "clio_coder_tool_finish") return null;
|
|
170
170
|
const payload = isRecord(event.payload) ? event.payload : null;
|
|
171
171
|
const tool = nonEmptyString(payload?.tool);
|
|
172
172
|
if (tool === undefined) return null;
|
|
@@ -363,7 +363,7 @@ export function createWorkerProgressFold(): WorkerProgressFold {
|
|
|
363
363
|
}
|
|
364
364
|
|
|
365
365
|
const action = toolEventAction(event);
|
|
366
|
-
if (action !== null && event.type === "
|
|
366
|
+
if (action !== null && event.type === "clio_coder_tool_start") {
|
|
367
367
|
if (action.toolCallId !== undefined) {
|
|
368
368
|
const duplicate = pendingActionsById.get(action.toolCallId);
|
|
369
369
|
if (duplicate !== undefined) removePendingAction(duplicate);
|
|
@@ -375,7 +375,7 @@ export function createWorkerProgressFold(): WorkerProgressFold {
|
|
|
375
375
|
touch();
|
|
376
376
|
setPhase("tool");
|
|
377
377
|
changed = true;
|
|
378
|
-
} else if (action !== null && event.type === "
|
|
378
|
+
} else if (action !== null && event.type === "clio_coder_tool_finish") {
|
|
379
379
|
// An id is authoritative when both sides carry it. If either side came
|
|
380
380
|
// from an older or incomplete producer, retain the historical name match.
|
|
381
381
|
const finished =
|
|
@@ -77,7 +77,7 @@ function contractKindFrom(receipt: Record<string, unknown>): WorkerPresentedResu
|
|
|
77
77
|
* by older versions of Clio are still valid history, so every field is read
|
|
78
78
|
* structurally and a missing one degrades the footer rather than the render.
|
|
79
79
|
*/
|
|
80
|
-
|
|
80
|
+
function workerReceiptFacts(receipt: Record<string, unknown>): WorkerReceiptFacts | null {
|
|
81
81
|
const outcome = optionalString(receipt.outcome);
|
|
82
82
|
if (outcome === undefined) return null;
|
|
83
83
|
const output = isRecord(receipt.output) ? receipt.output : null;
|
|
@@ -185,10 +185,7 @@ function finiteNumber(value: unknown): number | undefined {
|
|
|
185
185
|
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
-
|
|
189
|
-
runtimeKind: RunKind | undefined,
|
|
190
|
-
runtimeId: string | undefined,
|
|
191
|
-
): WorkerRunRuntimeKind {
|
|
188
|
+
function workerRuntimeKind(runtimeKind: RunKind | undefined, runtimeId: string | undefined): WorkerRunRuntimeKind {
|
|
192
189
|
if (runtimeKind === "acp-delegation") return "acp";
|
|
193
190
|
if (runtimeId === "claude-code") return "claude-code";
|
|
194
191
|
if (runtimeId === "claude-sdk") return "claude-sdk";
|
|
@@ -25,6 +25,8 @@ export interface YaziBridgeSettings {
|
|
|
25
25
|
mode: YaziSessionMode;
|
|
26
26
|
profile: YaziProfileMode;
|
|
27
27
|
followCwd: boolean;
|
|
28
|
+
/** Files-dock share of the height; absent leaves the dock spec's default. */
|
|
29
|
+
ratio?: number;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
export interface YaziMentionBatch {
|
|
@@ -50,6 +52,10 @@ export type YaziBridgeOpenResult =
|
|
|
50
52
|
|
|
51
53
|
export interface YaziBridge {
|
|
52
54
|
open(options?: { once?: boolean }): Promise<YaziBridgeOpenResult>;
|
|
55
|
+
/** Close the files pane and hand focus back to the composer; false when nothing was open. */
|
|
56
|
+
close(): Promise<boolean>;
|
|
57
|
+
/** True while the pane host still reports the files pane. */
|
|
58
|
+
isOpen(): boolean;
|
|
53
59
|
status(): Readonly<YaziBridgeStatus>;
|
|
54
60
|
dispose(): void;
|
|
55
61
|
}
|
|
@@ -111,7 +117,7 @@ function readOptional(path: string): string {
|
|
|
111
117
|
* before the TUI lease is released. A missing or below-floor binary therefore
|
|
112
118
|
* leaves the screen intact and returns the shared doctor sentence verbatim.
|
|
113
119
|
*/
|
|
114
|
-
|
|
120
|
+
async function runYaziTerminalChooser(options: YaziTerminalChooserOptions): Promise<YaziTerminalChooserResult> {
|
|
115
121
|
const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
|
|
116
122
|
if (!binaries.yaziPath) {
|
|
117
123
|
return { status: "missing-binary", binary: "yazi", detail: binaries.missingYaziDetail };
|
|
@@ -217,7 +223,7 @@ function pathKind(path: string): "file" | "directory" | "other" {
|
|
|
217
223
|
}
|
|
218
224
|
|
|
219
225
|
/** Format one DDS or chooser batch for the composer without ever submitting it. */
|
|
220
|
-
|
|
226
|
+
function formatYaziMentions(
|
|
221
227
|
paths: ReadonlyArray<string>,
|
|
222
228
|
options: {
|
|
223
229
|
cwd: string;
|
|
@@ -310,9 +316,12 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
310
316
|
}
|
|
311
317
|
deps.setDraft(appendDraft(draft, batch.text));
|
|
312
318
|
deps.requestRender();
|
|
319
|
+
// The pick is the end of the operator's trip into the files pane, so the
|
|
320
|
+
// keyboard comes back to the composer without a click.
|
|
321
|
+
void deps.mux?.focusSelf();
|
|
313
322
|
deps.notice(
|
|
314
323
|
"info",
|
|
315
|
-
`${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the
|
|
324
|
+
`${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the files pane added to the draft`,
|
|
316
325
|
);
|
|
317
326
|
if (batch.plainPaths > 0) {
|
|
318
327
|
deps.notice(
|
|
@@ -328,7 +337,11 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
328
337
|
}
|
|
329
338
|
};
|
|
330
339
|
|
|
331
|
-
const start = async (
|
|
340
|
+
const start = async (
|
|
341
|
+
mode: YaziSessionMode,
|
|
342
|
+
profileMode: YaziProfileMode,
|
|
343
|
+
dockShare?: number,
|
|
344
|
+
): Promise<YaziBridgeOpenResult> => {
|
|
332
345
|
const mux = deps.mux;
|
|
333
346
|
if (!mux?.available()) return { status: "unavailable", reason: "the pane layer is not available" };
|
|
334
347
|
generation += 1;
|
|
@@ -341,6 +354,7 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
341
354
|
mode,
|
|
342
355
|
profileMode,
|
|
343
356
|
cwd: deps.getCwd(),
|
|
357
|
+
...(dockShare === undefined ? {} : { dockShare }),
|
|
344
358
|
pickToken: token,
|
|
345
359
|
onEvent: (event: YaziEvent) => {
|
|
346
360
|
if (disposed || ownGeneration !== generation) return;
|
|
@@ -359,6 +373,8 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
359
373
|
if (disposed || ownGeneration !== generation) return;
|
|
360
374
|
paneCwd = choice.cwd;
|
|
361
375
|
if (choice.paths.length > 0) insert(choice.paths, choice.cwd);
|
|
376
|
+
// A cancelled pick still ends the trip; the composer gets the keyboard back.
|
|
377
|
+
else void deps.mux?.focusSelf();
|
|
362
378
|
},
|
|
363
379
|
onStopped: () => {
|
|
364
380
|
if (ownGeneration !== generation) return;
|
|
@@ -372,14 +388,18 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
372
388
|
return { status: "unavailable", reason: "the file pane was closed while it was opening" };
|
|
373
389
|
}
|
|
374
390
|
active = result.session;
|
|
391
|
+
// An explicit open is a request to go and pick something, so the keyboard
|
|
392
|
+
// follows the pane. The dock tier itself never steals focus; this is the
|
|
393
|
+
// one caller entitled to ask.
|
|
394
|
+
await mux.focusPane(result.session.pane.paneId);
|
|
375
395
|
if (mode === "companion") {
|
|
376
396
|
livenessTimer = setTimeout(() => {
|
|
377
397
|
if (disposed || ownGeneration !== generation || sawLine || active === null) return;
|
|
378
398
|
const stale = active;
|
|
379
399
|
active = null;
|
|
380
|
-
deps.notice("warning", "the
|
|
400
|
+
deps.notice("warning", "the files pane did not report back in time; reopening it in pick mode");
|
|
381
401
|
void stale.close().finally(() => {
|
|
382
|
-
if (!disposed && ownGeneration === generation) void start("chooser", profileMode);
|
|
402
|
+
if (!disposed && ownGeneration === generation) void start("chooser", profileMode, dockShare);
|
|
383
403
|
});
|
|
384
404
|
}, deps.livenessMs ?? YAZI_LIVENESS_MS);
|
|
385
405
|
livenessTimer.unref();
|
|
@@ -387,16 +407,49 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
387
407
|
return { status: "opened", mode, paneId: result.session.pane.paneId, existing: false };
|
|
388
408
|
};
|
|
389
409
|
|
|
410
|
+
/**
|
|
411
|
+
* The pane host is the authority on whether the pane exists. `active` lags
|
|
412
|
+
* it by one event at most, but a caller deciding between open and close
|
|
413
|
+
* must not be told a pane is open when herdr already reported it gone.
|
|
414
|
+
*/
|
|
415
|
+
const liveSession = (): YaziSession | null => {
|
|
416
|
+
if (active === null) return null;
|
|
417
|
+
const mux = deps.mux;
|
|
418
|
+
if (mux?.available() && !mux.list().some((record) => record.ref.paneId === active?.pane.paneId)) {
|
|
419
|
+
active = null;
|
|
420
|
+
return null;
|
|
421
|
+
}
|
|
422
|
+
return active;
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
const closeActive = async (): Promise<boolean> => {
|
|
426
|
+
const session = liveSession();
|
|
427
|
+
if (session === null) return false;
|
|
428
|
+
generation += 1;
|
|
429
|
+
clearLiveness();
|
|
430
|
+
active = null;
|
|
431
|
+
await session.close();
|
|
432
|
+
// Closing the dock the operator was looking at would otherwise leave
|
|
433
|
+
// focus wherever herdr puts it after a close, which is not the composer.
|
|
434
|
+
await deps.mux?.focusSelf();
|
|
435
|
+
return true;
|
|
436
|
+
};
|
|
437
|
+
|
|
390
438
|
return {
|
|
391
439
|
async open(options = {}): Promise<YaziBridgeOpenResult> {
|
|
392
|
-
if (disposed) return { status: "unavailable", reason: "the
|
|
440
|
+
if (disposed) return { status: "unavailable", reason: "the files pane bridge is closed" };
|
|
393
441
|
const settings = deps.getSettings?.() ?? { mode: "companion", profile: "managed", followCwd: true };
|
|
394
|
-
|
|
442
|
+
const existing = liveSession();
|
|
443
|
+
if (existing) {
|
|
395
444
|
if (settings.followCwd) {
|
|
396
445
|
const cwd = deps.getCwd();
|
|
397
|
-
if (await
|
|
446
|
+
if (await existing.pushCwd(cwd)) paneCwd = cwd;
|
|
398
447
|
}
|
|
399
|
-
|
|
448
|
+
// Re-opening an open pane means "take me there": leave any zoom that
|
|
449
|
+
// hides it and put the keyboard in it.
|
|
450
|
+
await deps.mux?.unzoomSelf();
|
|
451
|
+
await deps.mux?.focusPane(existing.pane.paneId);
|
|
452
|
+
return { status: "opened", mode: existing.mode, paneId: existing.pane.paneId, existing: true };
|
|
400
453
|
}
|
|
401
454
|
const mode = options.once || settings.profile === "user" ? "chooser" : settings.mode;
|
|
402
455
|
if (!deps.mux?.available()) {
|
|
@@ -419,7 +472,15 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
419
472
|
}
|
|
420
473
|
return result;
|
|
421
474
|
}
|
|
422
|
-
|
|
475
|
+
await deps.mux.unzoomSelf();
|
|
476
|
+
return await start(mode, settings.profile, settings.ratio);
|
|
477
|
+
},
|
|
478
|
+
close(): Promise<boolean> {
|
|
479
|
+
if (disposed) return Promise.resolve(false);
|
|
480
|
+
return closeActive();
|
|
481
|
+
},
|
|
482
|
+
isOpen(): boolean {
|
|
483
|
+
return liveSession() !== null;
|
|
423
484
|
},
|
|
424
485
|
status(): Readonly<YaziBridgeStatus> {
|
|
425
486
|
const snapshot = active?.snapshot();
|