@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
|
@@ -36,14 +36,18 @@ import {
|
|
|
36
36
|
MuxError,
|
|
37
37
|
type MuxEvent,
|
|
38
38
|
type MuxEventKind,
|
|
39
|
+
type MuxLayoutNode,
|
|
40
|
+
type MuxLayoutTree,
|
|
39
41
|
type MuxLog,
|
|
40
42
|
type MuxNotificationSound,
|
|
41
43
|
type MuxPane,
|
|
44
|
+
type MuxRect,
|
|
42
45
|
type MuxReportableAgentState,
|
|
43
46
|
MuxRequestTimeout,
|
|
44
47
|
type MuxServerInfo,
|
|
45
48
|
type MuxSnapshot,
|
|
46
49
|
type MuxTab,
|
|
50
|
+
type MuxTabGeometry,
|
|
47
51
|
type MuxWorktree,
|
|
48
52
|
type MuxWorktreeSource,
|
|
49
53
|
muxErrorKind,
|
|
@@ -192,8 +196,32 @@ export interface MuxClient {
|
|
|
192
196
|
/** Set the pane's operator-facing label. Available on herdr protocol 17. */
|
|
193
197
|
paneRename(paneId: string, label: string): Promise<void>;
|
|
194
198
|
paneClose(paneId: string): Promise<void>;
|
|
195
|
-
/**
|
|
196
|
-
|
|
199
|
+
/**
|
|
200
|
+
* Cell-precise geometry of the tab holding `paneId` (the server's focused
|
|
201
|
+
* pane when omitted): outer area, pane rects, and live split ratios.
|
|
202
|
+
*/
|
|
203
|
+
paneLayout(paneId?: string): Promise<MuxTabGeometry>;
|
|
204
|
+
/**
|
|
205
|
+
* Focus a pane. This switches the focused tab as well as the pane (verified
|
|
206
|
+
* on 0.8.2), so it is only ever driven by an explicit "show me" request,
|
|
207
|
+
* never by background bookkeeping.
|
|
208
|
+
*/
|
|
209
|
+
paneFocus(paneId: string): Promise<void>;
|
|
210
|
+
/** Zoom a pane. Zooming an unfocused pane steals focus; same rule as paneFocus. */
|
|
211
|
+
paneZoom(paneId: string, mode: "on" | "off" | "toggle"): Promise<{ changed: boolean; focusChanged: boolean }>;
|
|
212
|
+
/** Portable layout tree for a tab, or the tab holding `paneId`. */
|
|
213
|
+
layoutExport(request?: { tabId?: string; paneId?: string }): Promise<MuxLayoutTree>;
|
|
214
|
+
/**
|
|
215
|
+
* Set one split's ratio, addressed by a boolean path from the root split
|
|
216
|
+
* (`false` descends first, `true` second; `[]` is the root). Returns the
|
|
217
|
+
* updated tree.
|
|
218
|
+
*/
|
|
219
|
+
layoutSetSplitRatio(request: {
|
|
220
|
+
tabId?: string;
|
|
221
|
+
paneId?: string;
|
|
222
|
+
path: ReadonlyArray<boolean>;
|
|
223
|
+
ratio: number;
|
|
224
|
+
}): Promise<MuxLayoutTree>;
|
|
197
225
|
worktreeList(request?: MuxWorktreeListRequest): Promise<MuxWorktreeListResult>;
|
|
198
226
|
worktreeCreate(request: MuxWorktreeCreateRequest): Promise<MuxWorktreeCreatedResult>;
|
|
199
227
|
worktreeOpen(request: MuxWorktreeOpenRequest): Promise<MuxWorktreeOpenedResult>;
|
|
@@ -410,8 +438,93 @@ function readSnapshot(value: unknown): MuxSnapshot {
|
|
|
410
438
|
};
|
|
411
439
|
}
|
|
412
440
|
|
|
441
|
+
function requireNumber(source: Record<string, unknown>, key: string, context: string): number {
|
|
442
|
+
const value = source[key];
|
|
443
|
+
if (typeof value !== "number") {
|
|
444
|
+
throw new MuxError("protocol", `mux ${context} response is missing number field ${key}`);
|
|
445
|
+
}
|
|
446
|
+
return value;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
function readRect(value: unknown, context: string): MuxRect {
|
|
450
|
+
const source = asRecord(value);
|
|
451
|
+
if (!source) throw new MuxError("protocol", `mux ${context} rect is not an object`);
|
|
452
|
+
return {
|
|
453
|
+
x: requireNumber(source, "x", context),
|
|
454
|
+
y: requireNumber(source, "y", context),
|
|
455
|
+
width: requireNumber(source, "width", context),
|
|
456
|
+
height: requireNumber(source, "height", context),
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
function readSplitDirection(value: unknown, context: string): "right" | "down" {
|
|
461
|
+
if (value === "right" || value === "down") return value;
|
|
462
|
+
throw new MuxError("protocol", `mux ${context} split direction is not right/down`);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/** Parses a `PaneLayoutSnapshot`: the shape `pane.layout` and `layout_updated` both carry. */
|
|
466
|
+
function readTabGeometry(value: unknown): MuxTabGeometry {
|
|
467
|
+
const source = asRecord(value);
|
|
468
|
+
if (!source) throw new MuxError("protocol", "mux layout snapshot is not an object");
|
|
469
|
+
return {
|
|
470
|
+
workspaceId: requireString(source, "workspace_id", "layout"),
|
|
471
|
+
tabId: requireString(source, "tab_id", "layout"),
|
|
472
|
+
zoomed: source.zoomed === true,
|
|
473
|
+
area: readRect(source.area, "layout"),
|
|
474
|
+
focusedPaneId: optionalString(source, "focused_pane_id"),
|
|
475
|
+
panes: readArray(source, "panes").map((entry) => {
|
|
476
|
+
const pane = asRecord(entry);
|
|
477
|
+
if (!pane) throw new MuxError("protocol", "mux layout pane entry is not an object");
|
|
478
|
+
return {
|
|
479
|
+
paneId: requireString(pane, "pane_id", "layout pane"),
|
|
480
|
+
focused: pane.focused === true,
|
|
481
|
+
rect: readRect(pane.rect, "layout pane"),
|
|
482
|
+
};
|
|
483
|
+
}),
|
|
484
|
+
splits: readArray(source, "splits").map((entry) => {
|
|
485
|
+
const split = asRecord(entry);
|
|
486
|
+
if (!split) throw new MuxError("protocol", "mux layout split entry is not an object");
|
|
487
|
+
return {
|
|
488
|
+
direction: readSplitDirection(split.direction, "layout"),
|
|
489
|
+
ratio: requireNumber(split, "ratio", "layout split"),
|
|
490
|
+
rect: readRect(split.rect, "layout split"),
|
|
491
|
+
};
|
|
492
|
+
}),
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function readLayoutNode(value: unknown): MuxLayoutNode {
|
|
497
|
+
const source = asRecord(value);
|
|
498
|
+
if (!source) throw new MuxError("protocol", "mux layout node is not an object");
|
|
499
|
+
if (source.type === "pane") {
|
|
500
|
+
return { type: "pane", paneId: optionalString(source, "pane_id"), label: optionalString(source, "label") };
|
|
501
|
+
}
|
|
502
|
+
if (source.type === "split") {
|
|
503
|
+
return {
|
|
504
|
+
type: "split",
|
|
505
|
+
direction: readSplitDirection(source.direction, "layout tree"),
|
|
506
|
+
ratio: requireNumber(source, "ratio", "layout tree split"),
|
|
507
|
+
first: readLayoutNode(source.first),
|
|
508
|
+
second: readLayoutNode(source.second),
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
throw new MuxError("protocol", "mux layout node has an unknown type");
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
function readLayoutTree(value: unknown): MuxLayoutTree {
|
|
515
|
+
const source = asRecord(value);
|
|
516
|
+
if (!source) throw new MuxError("protocol", "mux layout tree is not an object");
|
|
517
|
+
return {
|
|
518
|
+
workspaceId: requireString(source, "workspace_id", "layout tree"),
|
|
519
|
+
tabId: requireString(source, "tab_id", "layout tree"),
|
|
520
|
+
zoomed: source.zoomed === true,
|
|
521
|
+
focusedPaneId: optionalString(source, "focused_pane_id"),
|
|
522
|
+
root: readLayoutNode(source.root),
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
|
|
413
526
|
/** herdr names lifecycle event kinds with underscores on the wire and dots in subscriptions. */
|
|
414
|
-
const
|
|
527
|
+
const PANE_LEAVE_KIND_BY_WIRE: Readonly<Record<string, "pane.closed" | "pane.exited">> = {
|
|
415
528
|
pane_closed: "pane.closed",
|
|
416
529
|
pane_exited: "pane.exited",
|
|
417
530
|
};
|
|
@@ -419,14 +532,37 @@ const EVENT_KIND_BY_WIRE: Readonly<Record<string, MuxEventKind>> = {
|
|
|
419
532
|
function readEvent(line: Record<string, unknown>): MuxEvent | null {
|
|
420
533
|
const wireKind = line.event;
|
|
421
534
|
if (typeof wireKind !== "string") return null;
|
|
422
|
-
const kind = EVENT_KIND_BY_WIRE[wireKind];
|
|
423
|
-
if (!kind) return null;
|
|
424
535
|
const data = asRecord(line.data);
|
|
425
536
|
if (!data) return null;
|
|
426
|
-
const
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
537
|
+
const leaveKind = PANE_LEAVE_KIND_BY_WIRE[wireKind];
|
|
538
|
+
if (leaveKind) {
|
|
539
|
+
const paneId = data.pane_id;
|
|
540
|
+
const workspaceId = data.workspace_id;
|
|
541
|
+
if (typeof paneId !== "string" || typeof workspaceId !== "string") return null;
|
|
542
|
+
return { kind: leaveKind, paneId, workspaceId };
|
|
543
|
+
}
|
|
544
|
+
if (wireKind === "pane_moved") {
|
|
545
|
+
// The move rewrites the pane id; the payload carries the new pane record
|
|
546
|
+
// plus the id it replaced, and consumers continue from the new one.
|
|
547
|
+
const pane = asRecord(data.pane);
|
|
548
|
+
const previousPaneId = data.previous_pane_id;
|
|
549
|
+
if (!pane || typeof previousPaneId !== "string") return null;
|
|
550
|
+
const paneId = pane.pane_id;
|
|
551
|
+
const tabId = pane.tab_id;
|
|
552
|
+
const workspaceId = pane.workspace_id;
|
|
553
|
+
if (typeof paneId !== "string" || typeof tabId !== "string" || typeof workspaceId !== "string") return null;
|
|
554
|
+
return { kind: "pane.moved", paneId, previousPaneId, tabId, workspaceId };
|
|
555
|
+
}
|
|
556
|
+
if (wireKind === "layout_updated") {
|
|
557
|
+
// The push already carries the full tab geometry, so a consumer never
|
|
558
|
+
// has to answer a layout event with a layout request.
|
|
559
|
+
try {
|
|
560
|
+
return { kind: "layout.updated", geometry: readTabGeometry(data.layout) };
|
|
561
|
+
} catch {
|
|
562
|
+
return null;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
return null;
|
|
430
566
|
}
|
|
431
567
|
|
|
432
568
|
/** Drops undefined entries so an optional field is absent rather than `null` on the wire. */
|
|
@@ -693,17 +829,29 @@ export function createMuxClient(options: MuxClientOptions): MuxClient {
|
|
|
693
829
|
async paneClose(paneId: string): Promise<void> {
|
|
694
830
|
await call("pane.close", { pane_id: paneId });
|
|
695
831
|
},
|
|
696
|
-
async paneLayout(paneId?: string): Promise<
|
|
832
|
+
async paneLayout(paneId?: string): Promise<MuxTabGeometry> {
|
|
697
833
|
const result = await callObject("pane.layout", params({ pane_id: paneId }));
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
834
|
+
return readTabGeometry(result.layout);
|
|
835
|
+
},
|
|
836
|
+
async paneFocus(paneId: string): Promise<void> {
|
|
837
|
+
await call("pane.focus", { pane_id: paneId });
|
|
838
|
+
},
|
|
839
|
+
async paneZoom(paneId: string, mode: "on" | "off" | "toggle"): Promise<{ changed: boolean; focusChanged: boolean }> {
|
|
840
|
+
const result = await callObject("pane.zoom", { pane_id: paneId, mode });
|
|
841
|
+
const zoom = asRecord(result.zoom);
|
|
842
|
+
if (!zoom) throw new MuxError("protocol", "mux pane.zoom returned no zoom result");
|
|
843
|
+
return { changed: zoom.changed === true, focusChanged: zoom.focus_changed === true };
|
|
844
|
+
},
|
|
845
|
+
async layoutExport(request = {}): Promise<MuxLayoutTree> {
|
|
846
|
+
const result = await callObject("layout.export", params({ tab_id: request.tabId, pane_id: request.paneId }));
|
|
847
|
+
return readLayoutTree(result.layout);
|
|
848
|
+
},
|
|
849
|
+
async layoutSetSplitRatio(request): Promise<MuxLayoutTree> {
|
|
850
|
+
const result = await callObject(
|
|
851
|
+
"layout.set_split_ratio",
|
|
852
|
+
params({ tab_id: request.tabId, pane_id: request.paneId, path: [...request.path], ratio: request.ratio }),
|
|
853
|
+
);
|
|
854
|
+
return readLayoutTree(result.layout);
|
|
707
855
|
},
|
|
708
856
|
async worktreeList(request = {}): Promise<MuxWorktreeListResult> {
|
|
709
857
|
const result = await callObject("worktree.list", params({ workspace_id: request.workspaceId, cwd: request.cwd }));
|
package/src/domains/mux/types.ts
CHANGED
|
@@ -97,14 +97,57 @@ export interface MuxSnapshot {
|
|
|
97
97
|
tabs: ReadonlyArray<MuxTab>;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
/** Lifecycle event kinds
|
|
101
|
-
export type MuxEventKind = "pane.closed" | "pane.exited";
|
|
100
|
+
/** Lifecycle event kinds the pane layer can subscribe to. */
|
|
101
|
+
export type MuxEventKind = "pane.closed" | "pane.exited" | "pane.moved" | "layout.updated";
|
|
102
102
|
|
|
103
|
-
/**
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
/**
|
|
104
|
+
* One pushed lifecycle event. A discriminated union because the payloads
|
|
105
|
+
* differ: pane leave events carry the pane, a move carries the id rewrite
|
|
106
|
+
* herdr performs, and a layout update carries the whole tab geometry so a
|
|
107
|
+
* consumer does not have to turn around and fetch what the push already said.
|
|
108
|
+
*/
|
|
109
|
+
export type MuxEvent =
|
|
110
|
+
| { kind: "pane.closed" | "pane.exited"; paneId: string; workspaceId: string }
|
|
111
|
+
| { kind: "pane.moved"; paneId: string; previousPaneId: string; tabId: string; workspaceId: string }
|
|
112
|
+
| { kind: "layout.updated"; geometry: MuxTabGeometry };
|
|
113
|
+
|
|
114
|
+
/** One rectangle in terminal cells, as herdr's layout snapshots report them. */
|
|
115
|
+
export interface MuxRect {
|
|
116
|
+
x: number;
|
|
117
|
+
y: number;
|
|
118
|
+
width: number;
|
|
119
|
+
height: number;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Cell-precise geometry of one tab: the outer area, every pane's rect, and
|
|
124
|
+
* every split with its live ratio. This is what dock sizing converges on.
|
|
125
|
+
*/
|
|
126
|
+
export interface MuxTabGeometry {
|
|
127
|
+
workspaceId: string;
|
|
128
|
+
tabId: string;
|
|
129
|
+
zoomed: boolean;
|
|
130
|
+
area: MuxRect;
|
|
131
|
+
focusedPaneId: string | null;
|
|
132
|
+
panes: ReadonlyArray<{ paneId: string; focused: boolean; rect: MuxRect }>;
|
|
133
|
+
splits: ReadonlyArray<{ direction: "right" | "down"; ratio: number; rect: MuxRect }>;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* One node of a portable tab layout tree, as `layout.export` describes it.
|
|
138
|
+
* Split ratio is the share of the axis the `first` child keeps.
|
|
139
|
+
*/
|
|
140
|
+
export type MuxLayoutNode =
|
|
141
|
+
| { type: "pane"; paneId: string | null; label: string | null }
|
|
142
|
+
| { type: "split"; direction: "right" | "down"; ratio: number; first: MuxLayoutNode; second: MuxLayoutNode };
|
|
143
|
+
|
|
144
|
+
/** A whole tab's portable layout tree. */
|
|
145
|
+
export interface MuxLayoutTree {
|
|
107
146
|
workspaceId: string;
|
|
147
|
+
tabId: string;
|
|
148
|
+
zoomed: boolean;
|
|
149
|
+
focusedPaneId: string | null;
|
|
150
|
+
root: MuxLayoutNode;
|
|
108
151
|
}
|
|
109
152
|
|
|
110
153
|
/** Where Clio's own pane lives, read from the herdr environment. */
|
|
@@ -3,6 +3,8 @@ import { StringDecoder } from "node:string_decoder";
|
|
|
3
3
|
|
|
4
4
|
export const YAZI_STREAM_POLL_MS = 250;
|
|
5
5
|
export const YAZI_STREAM_MAX_BYTES = 1024 * 1024;
|
|
6
|
+
export const YAZI_PICK_EVENT = "clio-coder-pick";
|
|
7
|
+
export const LEGACY_YAZI_PICK_EVENT = "clio-pick";
|
|
6
8
|
|
|
7
9
|
export interface YaziCdEvent {
|
|
8
10
|
kind: "cd";
|
|
@@ -13,7 +15,7 @@ export interface YaziCdEvent {
|
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
export interface YaziPickEvent {
|
|
16
|
-
kind:
|
|
18
|
+
kind: typeof YAZI_PICK_EVENT;
|
|
17
19
|
receiver: string;
|
|
18
20
|
sender: string;
|
|
19
21
|
values: ReadonlyArray<string>;
|
|
@@ -61,7 +63,7 @@ export function parseYaziEventLine(line: string): YaziEvent | null {
|
|
|
61
63
|
const third = second < 0 ? -1 : line.indexOf(",", second + 1);
|
|
62
64
|
if (first <= 0 || second <= first + 1 || third <= second + 1) return null;
|
|
63
65
|
const kind = line.slice(0, first);
|
|
64
|
-
if (kind !== "cd" && kind !==
|
|
66
|
+
if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) return null;
|
|
65
67
|
const receiver = line.slice(first + 1, second);
|
|
66
68
|
const sender = line.slice(second + 1, third);
|
|
67
69
|
try {
|
|
@@ -73,7 +75,7 @@ export function parseYaziEventLine(line: string): YaziEvent | null {
|
|
|
73
75
|
return { kind, receiver, sender, tab: String(tab), cwd: body.url };
|
|
74
76
|
}
|
|
75
77
|
if (!Array.isArray(body) || !body.every((value) => typeof value === "string")) return null;
|
|
76
|
-
return { kind, receiver, sender, values: body };
|
|
78
|
+
return { kind: YAZI_PICK_EVENT, receiver, sender, values: body };
|
|
77
79
|
} catch {
|
|
78
80
|
return null;
|
|
79
81
|
}
|
|
@@ -152,7 +154,7 @@ export function createYaziEventStream(options: YaziEventStreamOptions): YaziEven
|
|
|
152
154
|
const line = raw.endsWith("\r") ? raw.slice(0, -1) : raw;
|
|
153
155
|
if (line.length === 0) continue;
|
|
154
156
|
const kind = line.slice(0, line.indexOf(","));
|
|
155
|
-
if (kind !== "cd" && kind !==
|
|
157
|
+
if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) continue;
|
|
156
158
|
const event = parseYaziEventLine(line);
|
|
157
159
|
if (!event) {
|
|
158
160
|
state.malformedLines += 1;
|
|
@@ -119,7 +119,7 @@ function shellQuote(value: string): string {
|
|
|
119
119
|
|
|
120
120
|
/** Render the one Clio key chord, with an absolute `ya` path for vendored installs. */
|
|
121
121
|
export function renderYaziKeymap(yaPath: string): string {
|
|
122
|
-
const command = `shell -- ${shellQuote(yaPath)} pub-to "$YAZI_ID" clio-pick --list "$
|
|
122
|
+
const command = `shell -- ${shellQuote(yaPath)} pub-to "$YAZI_ID" clio-coder-pick --list "$CLIO_CODER_YAZI_PICK_TOKEN" %s`;
|
|
123
123
|
return `# Generated by Clio Coder. Changes are replaced when the managed profile regenerates.
|
|
124
124
|
|
|
125
125
|
[[mgr.prepend_keymap]]
|
|
@@ -1,13 +1,21 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
|
-
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
+
import { namingCompatibilityEnvironment } from "../../../core/naming-compat.js";
|
|
5
6
|
import { clioCacheDir } from "../../../core/xdg.js";
|
|
6
7
|
import { findPinnedTool } from "../../toolchain/registry.js";
|
|
7
8
|
import { describeResolution, resolveToolBinary, toolStatus } from "../../toolchain/resolve.js";
|
|
8
9
|
import type { MuxContract } from "../contract.js";
|
|
9
10
|
import type { MuxPaneRef } from "../types.js";
|
|
10
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
createYaziEventStream,
|
|
13
|
+
LEGACY_YAZI_PICK_EVENT,
|
|
14
|
+
YAZI_PICK_EVENT,
|
|
15
|
+
YAZI_STREAM_POLL_MS,
|
|
16
|
+
type YaziEvent,
|
|
17
|
+
type YaziEventStream,
|
|
18
|
+
} from "./event-stream.js";
|
|
11
19
|
import { ensureYaziProfile, type YaziProfile, yaziProfileDir } from "./profile.js";
|
|
12
20
|
|
|
13
21
|
export type YaziSessionMode = "companion" | "chooser";
|
|
@@ -55,6 +63,11 @@ export interface YaziSessionOptions {
|
|
|
55
63
|
mode: YaziSessionMode;
|
|
56
64
|
profileMode: YaziProfileMode;
|
|
57
65
|
cwd: string;
|
|
66
|
+
/**
|
|
67
|
+
* Files-dock share of the height. Set by the interactive bridge from
|
|
68
|
+
* `interface.panes.files.ratio`; absent it, the dock spec's default governs.
|
|
69
|
+
*/
|
|
70
|
+
dockShare?: number;
|
|
58
71
|
onEvent: (event: YaziEvent) => void;
|
|
59
72
|
onChooser: (result: YaziChooserResult) => void;
|
|
60
73
|
onStopped?: (reason: string) => void;
|
|
@@ -94,6 +107,37 @@ function readOptional(path: string): string {
|
|
|
94
107
|
}
|
|
95
108
|
}
|
|
96
109
|
|
|
110
|
+
/** Transport files older than this are leftovers of a process that never reached its cleanup. */
|
|
111
|
+
export const YAZI_STALE_TRANSPORT_MS = 24 * 60 * 60 * 1000;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Drop transport files no live session can own. A crash, a kill, or a
|
|
115
|
+
* release before cleanup existed leaves `.stream`, `.chooser`, and `.cwd`
|
|
116
|
+
* files behind; a day is long past any pane's life, so anything older goes.
|
|
117
|
+
*/
|
|
118
|
+
export function sweepStaleTransportFiles(sessionsDir: string, now: number = Date.now()): number {
|
|
119
|
+
let removed = 0;
|
|
120
|
+
let entries: string[];
|
|
121
|
+
try {
|
|
122
|
+
entries = readdirSync(sessionsDir);
|
|
123
|
+
} catch {
|
|
124
|
+
return 0;
|
|
125
|
+
}
|
|
126
|
+
for (const name of entries) {
|
|
127
|
+
if (!/\.(stream|chooser|cwd)$/u.test(name)) continue;
|
|
128
|
+
const path = join(sessionsDir, name);
|
|
129
|
+
try {
|
|
130
|
+
if (now - statSync(path).mtimeMs > YAZI_STALE_TRANSPORT_MS) {
|
|
131
|
+
rmSync(path, { force: true });
|
|
132
|
+
removed += 1;
|
|
133
|
+
}
|
|
134
|
+
} catch {
|
|
135
|
+
// A file that vanished between readdir and stat was someone else's to remove.
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return removed;
|
|
139
|
+
}
|
|
140
|
+
|
|
97
141
|
/** Open one mux-hosted Yazi process and own its DDS or chooser-file transport. */
|
|
98
142
|
export async function createYaziSession(options: YaziSessionOptions): Promise<YaziSessionOpenResult> {
|
|
99
143
|
const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
|
|
@@ -112,6 +156,7 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
112
156
|
const sessionId = options.sessionId ?? randomUUID();
|
|
113
157
|
const sessionsDir = join(cacheDir, "yazi", "sessions");
|
|
114
158
|
mkdirSync(sessionsDir, { recursive: true });
|
|
159
|
+
sweepStaleTransportFiles(sessionsDir);
|
|
115
160
|
const managedProfile =
|
|
116
161
|
options.profileMode === "managed"
|
|
117
162
|
? (options.ensureProfile ?? ensureYaziProfile)({
|
|
@@ -130,13 +175,19 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
130
175
|
const token = options.mode === "companion" ? (options.pickToken ?? randomUUID()) : null;
|
|
131
176
|
const env: Record<string, string> = {
|
|
132
177
|
...(managedProfile ? { YAZI_CONFIG_HOME: managedProfile.dir } : {}),
|
|
133
|
-
...(token ?
|
|
178
|
+
...(token ? namingCompatibilityEnvironment("CLIO_CODER_YAZI_PICK_TOKEN", "CLIO_YAZI_PICK_TOKEN", token) : {}),
|
|
134
179
|
};
|
|
135
180
|
let argv: ReadonlyArray<string>;
|
|
136
181
|
let stdoutPath: string | undefined;
|
|
137
182
|
if (options.mode === "companion") {
|
|
138
183
|
writeFileSync(streamPath, "");
|
|
139
|
-
argv = [
|
|
184
|
+
argv = [
|
|
185
|
+
binaries.yaziPath,
|
|
186
|
+
"--local-events",
|
|
187
|
+
`cd,${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`,
|
|
188
|
+
"--remote-events",
|
|
189
|
+
`${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`,
|
|
190
|
+
];
|
|
140
191
|
stdoutPath = streamPath;
|
|
141
192
|
} else {
|
|
142
193
|
writeFileSync(chooserPath, "");
|
|
@@ -144,14 +195,30 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
144
195
|
argv = [binaries.yaziPath, options.cwd, "--chooser-file", chooserPath, "--cwd-file", cwdPath];
|
|
145
196
|
}
|
|
146
197
|
|
|
198
|
+
// Transport files are per session and worthless once it ends: a pick has
|
|
199
|
+
// already been consumed by the bridge, and a chooser file has been read.
|
|
200
|
+
// Removing them here is what keeps `<cache>/yazi/sessions` from growing by
|
|
201
|
+
// three files per open for the life of the install.
|
|
202
|
+
const removeTransportFiles = (): void => {
|
|
203
|
+
for (const path of [streamPath, chooserPath, cwdPath]) rmSync(path, { force: true });
|
|
204
|
+
};
|
|
205
|
+
|
|
147
206
|
const pane = await options.mux.openUtilityPane({
|
|
148
207
|
argv,
|
|
149
208
|
cwd: options.cwd,
|
|
150
|
-
label: "
|
|
209
|
+
label: "files",
|
|
210
|
+
title: "files",
|
|
211
|
+
// The files dock: split down from the anchor at the configured share.
|
|
212
|
+
// Degrades to a plain split inside the contract when the layout tier is
|
|
213
|
+
// absent.
|
|
214
|
+
dock: { slot: "files", ...(options.dockShare === undefined ? {} : { share: options.dockShare }) },
|
|
151
215
|
...(Object.keys(env).length > 0 ? { env } : {}),
|
|
152
216
|
...(stdoutPath ? { stdoutPath } : {}),
|
|
153
217
|
});
|
|
154
|
-
if (!pane)
|
|
218
|
+
if (!pane) {
|
|
219
|
+
removeTransportFiles();
|
|
220
|
+
return { status: "unavailable", reason: "the pane host refused to open the files pane" };
|
|
221
|
+
}
|
|
155
222
|
|
|
156
223
|
let paneCwd = options.cwd;
|
|
157
224
|
let instanceId: string | null = null;
|
|
@@ -165,6 +232,7 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
165
232
|
if (chooserTimer) clearInterval(chooserTimer);
|
|
166
233
|
chooserTimer = null;
|
|
167
234
|
options.onStopped?.(reason);
|
|
235
|
+
removeTransportFiles();
|
|
168
236
|
};
|
|
169
237
|
|
|
170
238
|
if (options.mode === "companion") {
|
|
@@ -181,7 +249,11 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
181
249
|
options.onEvent(event);
|
|
182
250
|
},
|
|
183
251
|
});
|
|
184
|
-
void stream.done.then((reason) =>
|
|
252
|
+
void stream.done.then((reason) => {
|
|
253
|
+
// A stream that ended on its own means the pane is gone or the file
|
|
254
|
+
// was lost; either way the session is over and says so.
|
|
255
|
+
stop(reason);
|
|
256
|
+
});
|
|
185
257
|
} else {
|
|
186
258
|
const pollChooser = (): void => {
|
|
187
259
|
if (stopped || alive()) return;
|
|
@@ -1,30 +1,130 @@
|
|
|
1
1
|
import { tokenHex } from "../../../core/theme-token-hex.js";
|
|
2
2
|
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* Render the Clio overlay on Yazi's pinned preset theme.
|
|
5
|
+
*
|
|
6
|
+
* Every color comes from Clio's own token palette (`core/theme-token-hex.ts`),
|
|
7
|
+
* read when the managed profile is generated, which happens on the open that
|
|
8
|
+
* finds no current profile. The profile stamp carries this file's output hash,
|
|
9
|
+
* so a palette change regenerates the profile on the next open rather than
|
|
10
|
+
* leaving a pane in last release's colors. Only keys Yazi 26.8 documents are
|
|
11
|
+
* set; the rest of the preset stays, because a wrong key here is rejected by
|
|
12
|
+
* the validation open in `profile.ts` and would leave the operator with no
|
|
13
|
+
* files pane at all.
|
|
14
|
+
*/
|
|
4
15
|
export function renderYaziTheme(): string {
|
|
5
|
-
|
|
16
|
+
const accent = tokenHex("accent");
|
|
17
|
+
const action = tokenHex("action");
|
|
18
|
+
const success = tokenHex("success");
|
|
19
|
+
const warning = tokenHex("warning");
|
|
20
|
+
const error = tokenHex("error");
|
|
21
|
+
const info = tokenHex("info");
|
|
22
|
+
const dim = tokenHex("dim");
|
|
23
|
+
const muted = tokenHex("muted");
|
|
24
|
+
const frame = tokenHex("frame");
|
|
25
|
+
const frameStrong = tokenHex("frameStrong");
|
|
26
|
+
return `# Generated by Clio Coder from its theme tokens. Changes are replaced when the managed profile regenerates.
|
|
6
27
|
|
|
7
28
|
[mgr]
|
|
8
|
-
cwd = { fg = "${
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
29
|
+
cwd = { fg = "${accent}" }
|
|
30
|
+
hovered = { reversed = true }
|
|
31
|
+
preview_hovered = { underline = true }
|
|
32
|
+
find_keyword = { fg = "${warning}", bold = true }
|
|
33
|
+
find_position = { fg = "${action}", italic = true }
|
|
34
|
+
marker_selected = { fg = "${success}", bg = "${success}" }
|
|
35
|
+
marker_copied = { fg = "${accent}", bg = "${accent}" }
|
|
36
|
+
marker_cut = { fg = "${error}", bg = "${error}" }
|
|
37
|
+
marker_marked = { fg = "${info}", bg = "${info}" }
|
|
38
|
+
count_copied = { fg = "${accent}", bg = "${frame}" }
|
|
39
|
+
count_cut = { fg = "${error}", bg = "${frame}" }
|
|
40
|
+
count_selected = { fg = "${success}", bg = "${frame}" }
|
|
41
|
+
border_style = { fg = "${frame}" }
|
|
42
|
+
syntect_theme = ""
|
|
14
43
|
|
|
15
44
|
[mode]
|
|
16
|
-
normal_main = { bg = "${
|
|
17
|
-
normal_alt = { fg = "${
|
|
18
|
-
select_main = { bg = "${
|
|
19
|
-
select_alt = { fg = "${
|
|
20
|
-
unset_main = { bg = "${
|
|
21
|
-
unset_alt = { fg = "${
|
|
45
|
+
normal_main = { bg = "${accent}", bold = true }
|
|
46
|
+
normal_alt = { fg = "${accent}" }
|
|
47
|
+
select_main = { bg = "${action}", bold = true }
|
|
48
|
+
select_alt = { fg = "${action}" }
|
|
49
|
+
unset_main = { bg = "${error}", bold = true }
|
|
50
|
+
unset_alt = { fg = "${error}" }
|
|
22
51
|
|
|
23
52
|
[tabs]
|
|
24
|
-
active = { bg = "${
|
|
25
|
-
inactive = { fg = "${
|
|
53
|
+
active = { bg = "${accent}", bold = true }
|
|
54
|
+
inactive = { fg = "${accent}" }
|
|
26
55
|
|
|
27
56
|
[status]
|
|
28
|
-
|
|
57
|
+
perm_type = { fg = "${accent}" }
|
|
58
|
+
perm_read = { fg = "${warning}" }
|
|
59
|
+
perm_write = { fg = "${error}" }
|
|
60
|
+
perm_exec = { fg = "${success}" }
|
|
61
|
+
perm_sep = { fg = "${dim}" }
|
|
62
|
+
progress_label = { bold = true }
|
|
63
|
+
progress_normal = { fg = "${accent}" }
|
|
64
|
+
progress_error = { fg = "${error}" }
|
|
65
|
+
|
|
66
|
+
[which]
|
|
67
|
+
cols = 3
|
|
68
|
+
mask = { bg = "${frame}" }
|
|
69
|
+
cand = { fg = "${accent}" }
|
|
70
|
+
rest = { fg = "${muted}" }
|
|
71
|
+
desc = { fg = "${action}" }
|
|
72
|
+
separator_style = { fg = "${dim}" }
|
|
73
|
+
|
|
74
|
+
[confirm]
|
|
75
|
+
border = { fg = "${frameStrong}" }
|
|
76
|
+
title = { fg = "${accent}" }
|
|
77
|
+
btn_yes = { reversed = true }
|
|
78
|
+
btn_no = {}
|
|
79
|
+
|
|
80
|
+
[pick]
|
|
81
|
+
border = { fg = "${frameStrong}" }
|
|
82
|
+
active = { fg = "${action}", bold = true }
|
|
83
|
+
|
|
84
|
+
[input]
|
|
85
|
+
border = { fg = "${frameStrong}" }
|
|
86
|
+
title = { fg = "${accent}" }
|
|
87
|
+
selected = { reversed = true }
|
|
88
|
+
|
|
89
|
+
[cmp]
|
|
90
|
+
border = { fg = "${frameStrong}" }
|
|
91
|
+
active = { reversed = true }
|
|
92
|
+
|
|
93
|
+
[tasks]
|
|
94
|
+
border = { fg = "${frameStrong}" }
|
|
95
|
+
title = { fg = "${accent}" }
|
|
96
|
+
hovered = { fg = "${action}", underline = true }
|
|
97
|
+
|
|
98
|
+
[help]
|
|
99
|
+
on = { fg = "${accent}" }
|
|
100
|
+
run = { fg = "${action}" }
|
|
101
|
+
footer = { fg = "${muted}" }
|
|
102
|
+
|
|
103
|
+
[notify]
|
|
104
|
+
title_info = { fg = "${info}" }
|
|
105
|
+
title_warn = { fg = "${warning}" }
|
|
106
|
+
title_error = { fg = "${error}" }
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* The same palette as a herdr `[theme.custom]` block.
|
|
112
|
+
*
|
|
113
|
+
* herdr themes its chrome (sidebar, tab bar, borders, agent rows) from its own
|
|
114
|
+
* config.toml and has no per-pane styling on the wire, so Clio cannot color
|
|
115
|
+
* the panes it opens. What it can do is hand the operator the block that makes
|
|
116
|
+
* herdr's chrome match Clio, to paste into herdr's config; Clio never writes
|
|
117
|
+
* another program's configuration itself.
|
|
118
|
+
*/
|
|
119
|
+
export function renderHerdrThemeBlock(): string {
|
|
120
|
+
return `# Clio Coder theme tokens for herdr. Paste into ~/.config/herdr/config.toml, then run \`herdr server reload-config\`.
|
|
121
|
+
[theme.custom]
|
|
122
|
+
accent = "${tokenHex("accent")}"
|
|
123
|
+
green = "${tokenHex("success")}"
|
|
124
|
+
blue = "${tokenHex("info")}"
|
|
125
|
+
red = "${tokenHex("error")}"
|
|
126
|
+
yellow = "${tokenHex("warning")}"
|
|
127
|
+
selection_bg = "${tokenHex("frame")}"
|
|
128
|
+
active_row_bg = "${tokenHex("frame")}"
|
|
29
129
|
`;
|
|
30
130
|
}
|