@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
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
ensureYaziProfile,
|
|
4
|
+
yaziProfileDir
|
|
5
|
+
} from "./chunk-3M6DQK6S.js";
|
|
5
6
|
import {
|
|
6
7
|
describeResolution,
|
|
7
8
|
resolveToolBinary,
|
|
@@ -11,279 +12,217 @@ import {
|
|
|
11
12
|
findPinnedTool
|
|
12
13
|
} from "./chunk-QDC3K2U3.js";
|
|
13
14
|
import {
|
|
14
|
-
|
|
15
|
+
namingCompatibilityEnvironment
|
|
16
|
+
} from "./chunk-D7E7WCDF.js";
|
|
17
|
+
import {
|
|
15
18
|
resolvePackageRoot
|
|
16
19
|
} from "./chunk-IWHMRKLL.js";
|
|
17
20
|
import {
|
|
18
|
-
clioCacheDir
|
|
19
|
-
resolveClioDirs
|
|
21
|
+
clioCacheDir
|
|
20
22
|
} from "./chunk-BYP5D4HI.js";
|
|
21
23
|
import {
|
|
22
24
|
init_esm_shims
|
|
23
25
|
} from "./chunk-3R73A4XB.js";
|
|
24
26
|
|
|
25
|
-
// src/domains/mux/
|
|
27
|
+
// src/domains/mux/index.ts
|
|
26
28
|
init_esm_shims();
|
|
27
|
-
import { spawnSync } from "node:child_process";
|
|
28
|
-
import { createHash } from "node:crypto";
|
|
29
|
-
import {
|
|
30
|
-
cpSync,
|
|
31
|
-
mkdirSync,
|
|
32
|
-
mkdtempSync,
|
|
33
|
-
readdirSync,
|
|
34
|
-
readFileSync,
|
|
35
|
-
renameSync,
|
|
36
|
-
rmSync,
|
|
37
|
-
statSync,
|
|
38
|
-
writeFileSync
|
|
39
|
-
} from "node:fs";
|
|
40
|
-
import { homedir } from "node:os";
|
|
41
|
-
import { dirname, isAbsolute, join, relative } from "node:path";
|
|
42
29
|
|
|
43
|
-
// src/domains/mux/
|
|
30
|
+
// src/domains/mux/extension.ts
|
|
44
31
|
init_esm_shims();
|
|
45
32
|
|
|
46
|
-
// src/
|
|
33
|
+
// src/domains/mux/contract.ts
|
|
47
34
|
init_esm_shims();
|
|
48
|
-
var TOKEN_HEX = {
|
|
49
|
-
accent: "#46e5d0",
|
|
50
|
-
accentDeep: "#1fb7a6",
|
|
51
|
-
action: "#ff7e29",
|
|
52
|
-
success: "#57e389",
|
|
53
|
-
warning: "#ffb454",
|
|
54
|
-
error: "#ff5c66",
|
|
55
|
-
info: "#5ba8ff",
|
|
56
|
-
reason: "#9d8cff",
|
|
57
|
-
dim: "#6a7a85",
|
|
58
|
-
muted: "#8a99a4",
|
|
59
|
-
title: "#46e5d0",
|
|
60
|
-
frame: "#2f5d5a",
|
|
61
|
-
frameStrong: "#2aab9e"
|
|
62
|
-
};
|
|
63
|
-
function tokenHex(token2) {
|
|
64
|
-
return TOKEN_HEX[token2];
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// src/domains/mux/yazi/theme.ts
|
|
68
|
-
function renderYaziTheme() {
|
|
69
|
-
return `# Generated by Clio Coder. Changes are replaced when the managed profile regenerates.
|
|
70
|
-
|
|
71
|
-
[mgr]
|
|
72
|
-
cwd = { fg = "${tokenHex("accent")}" }
|
|
73
|
-
find_keyword = { fg = "${tokenHex("warning")}" }
|
|
74
|
-
marker_selected = { fg = "${tokenHex("success")}", bg = "${tokenHex("success")}" }
|
|
75
|
-
marker_copied = { fg = "${tokenHex("accent")}", bg = "${tokenHex("accent")}" }
|
|
76
|
-
marker_cut = { fg = "${tokenHex("error")}", bg = "${tokenHex("error")}" }
|
|
77
|
-
border_style = { fg = "${tokenHex("frame")}" }
|
|
78
35
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
inactive = { fg = "${tokenHex("accent")}" }
|
|
90
|
-
|
|
91
|
-
[status]
|
|
92
|
-
perm_sep = { fg = "${tokenHex("dim")}" }
|
|
93
|
-
`;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// src/domains/mux/yazi/profile.ts
|
|
97
|
-
var PROFILE_FILES = ["yazi.toml", "keymap.toml", "theme.toml", "init.lua"];
|
|
98
|
-
var PROFILE_PLUGIN_FILES = ["main.lua", "types.lua", "LICENSE", "README.md"];
|
|
99
|
-
var STAMP_FILE = "stamp.json";
|
|
100
|
-
function yaziProfileDir(cacheDir = resolveClioDirs().cache) {
|
|
101
|
-
return join(cacheDir, "yazi", "profile");
|
|
102
|
-
}
|
|
103
|
-
function userYaziConfigDir(env = process.env, home = homedir()) {
|
|
104
|
-
const xdg = env.XDG_CONFIG_HOME;
|
|
105
|
-
return xdg && isAbsolute(xdg) ? join(xdg, "yazi") : join(home, ".config", "yazi");
|
|
106
|
-
}
|
|
107
|
-
function resetYaziProfile(profileDir = yaziProfileDir()) {
|
|
108
|
-
rmSync(profileDir, { recursive: true, force: true });
|
|
109
|
-
}
|
|
110
|
-
function defaultAssetDir() {
|
|
111
|
-
return join(resolvePackageRoot(), "src", "domains", "mux", "yazi", "assets");
|
|
112
|
-
}
|
|
113
|
-
function yaziPin() {
|
|
114
|
-
return findPinnedTool("yazi")?.version ?? "unknown";
|
|
115
|
-
}
|
|
116
|
-
function sha256(input) {
|
|
117
|
-
return createHash("sha256").update(input).digest("hex");
|
|
118
|
-
}
|
|
119
|
-
function filesBelow(root, current = root) {
|
|
120
|
-
const files = [];
|
|
121
|
-
for (const entry of readdirSync(current, { withFileTypes: true }).sort(
|
|
122
|
-
(left, right) => left.name.localeCompare(right.name)
|
|
123
|
-
)) {
|
|
124
|
-
const path = join(current, entry.name);
|
|
125
|
-
if (entry.isDirectory()) files.push(...filesBelow(root, path));
|
|
126
|
-
else if (entry.isFile()) files.push(relative(root, path).replaceAll("\\", "/"));
|
|
127
|
-
}
|
|
128
|
-
return files;
|
|
129
|
-
}
|
|
130
|
-
function hashYaziAssetTree(assetDir) {
|
|
131
|
-
const hash = createHash("sha256");
|
|
132
|
-
for (const file of filesBelow(assetDir)) {
|
|
133
|
-
hash.update(file);
|
|
134
|
-
hash.update("\0");
|
|
135
|
-
hash.update(readFileSync(join(assetDir, file)));
|
|
136
|
-
hash.update("\0");
|
|
137
|
-
}
|
|
138
|
-
return hash.digest("hex");
|
|
36
|
+
// src/domains/mux/dock-controller.ts
|
|
37
|
+
init_esm_shims();
|
|
38
|
+
var DOCK_SPECS = {
|
|
39
|
+
workers: { slot: "workers", direction: "right", defaultShare: 0.34, minCells: 48 },
|
|
40
|
+
files: { slot: "files", direction: "down", defaultShare: 0.3, minCells: 12 }
|
|
41
|
+
};
|
|
42
|
+
var DOCK_MAX_SHARE = 0.5;
|
|
43
|
+
var SHARE_EPSILON = 0.02;
|
|
44
|
+
function ratioForDockShare(share) {
|
|
45
|
+
return 1 - share;
|
|
139
46
|
}
|
|
140
|
-
function
|
|
141
|
-
|
|
47
|
+
function clampDockShare(share) {
|
|
48
|
+
if (!Number.isFinite(share) || share <= 0) return DOCK_SPECS.workers.defaultShare;
|
|
49
|
+
return Math.min(DOCK_MAX_SHARE, share);
|
|
142
50
|
}
|
|
143
|
-
function
|
|
144
|
-
|
|
145
|
-
return `# Generated by Clio Coder. Changes are replaced when the managed profile regenerates.
|
|
146
|
-
|
|
147
|
-
[[mgr.prepend_keymap]]
|
|
148
|
-
on = "<C-y>"
|
|
149
|
-
run = ${JSON.stringify(command)}
|
|
150
|
-
desc = "Send the selection to Clio"
|
|
151
|
-
`;
|
|
51
|
+
function axisCells(rect, spec) {
|
|
52
|
+
return spec.direction === "right" ? rect.width : rect.height;
|
|
152
53
|
}
|
|
153
|
-
function
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const keymapToml = options.keymapToml ?? renderYaziKeymap(options.yaPath);
|
|
158
|
-
return {
|
|
159
|
-
dir: options.profileDir ?? yaziProfileDir(),
|
|
160
|
-
assetDir,
|
|
161
|
-
yaziToml,
|
|
162
|
-
keymapToml,
|
|
163
|
-
themeToml,
|
|
164
|
-
stamp: {
|
|
165
|
-
yaziVersion: options.yaziVersion ?? yaziPin(),
|
|
166
|
-
clioVersion: options.clioVersion ?? readClioVersion(),
|
|
167
|
-
yaPath: options.yaPath,
|
|
168
|
-
assetSha256: hashYaziAssetTree(assetDir),
|
|
169
|
-
themeSha256: sha256(themeToml)
|
|
170
|
-
}
|
|
54
|
+
function deriveSplitPath(root, anchorPaneId, dockPaneId) {
|
|
55
|
+
const contains = (node, paneId) => {
|
|
56
|
+
if (node.type === "pane") return node.paneId === paneId;
|
|
57
|
+
return contains(node.first, paneId) || contains(node.second, paneId);
|
|
171
58
|
};
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}
|
|
179
|
-
return
|
|
180
|
-
|
|
59
|
+
const walk = (node, path) => {
|
|
60
|
+
if (node.type !== "split") return null;
|
|
61
|
+
const dockFirst = contains(node.first, dockPaneId);
|
|
62
|
+
const dockSecond = contains(node.second, dockPaneId);
|
|
63
|
+
const anchorFirst = contains(node.first, anchorPaneId);
|
|
64
|
+
const anchorSecond = contains(node.second, anchorPaneId);
|
|
65
|
+
if (dockFirst && anchorSecond) return { path, dockIsSecond: false, direction: node.direction };
|
|
66
|
+
if (dockSecond && anchorFirst) return { path, dockIsSecond: true, direction: node.direction };
|
|
67
|
+
if (dockFirst && anchorFirst) return walk(node.first, [...path, false]);
|
|
68
|
+
if (dockSecond && anchorSecond) return walk(node.second, [...path, true]);
|
|
181
69
|
return null;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
function sameStamp(left, right) {
|
|
185
|
-
return left !== null && left.yaziVersion === right.yaziVersion && left.clioVersion === right.clioVersion && left.yaPath === right.yaPath && left.assetSha256 === right.assetSha256 && left.themeSha256 === right.themeSha256;
|
|
186
|
-
}
|
|
187
|
-
function profileFilesExist(dir) {
|
|
188
|
-
return PROFILE_FILES.every((file) => statSync(join(dir, file), { throwIfNoEntry: false })?.isFile()) && PROFILE_PLUGIN_FILES.every(
|
|
189
|
-
(file) => statSync(join(dir, "plugins", "git.yazi", file), { throwIfNoEntry: false })?.isFile() === true
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
function inspectYaziProfile(options) {
|
|
193
|
-
const inputs = expected(options);
|
|
194
|
-
const present = statSync(inputs.dir, { throwIfNoEntry: false })?.isDirectory() === true;
|
|
195
|
-
const current = present && profileFilesExist(inputs.dir) && sameStamp(readStamp(inputs.dir), inputs.stamp);
|
|
196
|
-
return {
|
|
197
|
-
dir: inputs.dir,
|
|
198
|
-
userConfigDir: userYaziConfigDir(),
|
|
199
|
-
state: current ? "current" : present ? "stale" : "missing",
|
|
200
|
-
stamp: inputs.stamp
|
|
201
70
|
};
|
|
71
|
+
return walk(root, []);
|
|
202
72
|
}
|
|
203
|
-
function
|
|
204
|
-
return
|
|
73
|
+
function containsRect(outer, inner) {
|
|
74
|
+
return outer.x <= inner.x && outer.y <= inner.y && outer.x + outer.width >= inner.x + inner.width && outer.y + outer.height >= inner.y + inner.height;
|
|
205
75
|
}
|
|
206
|
-
function
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
76
|
+
function observedDockShare(geometry, spec, anchorPaneId, dockPaneId) {
|
|
77
|
+
const anchor = geometry.panes.find((pane) => pane.paneId === anchorPaneId);
|
|
78
|
+
const dock = geometry.panes.find((pane) => pane.paneId === dockPaneId);
|
|
79
|
+
if (!anchor || !dock) return null;
|
|
80
|
+
let separating = null;
|
|
81
|
+
for (const split of geometry.splits) {
|
|
82
|
+
if (!containsRect(split.rect, anchor.rect) || !containsRect(split.rect, dock.rect)) continue;
|
|
83
|
+
if (!separating || split.rect.width * split.rect.height < separating.rect.width * separating.rect.height) {
|
|
84
|
+
separating = split;
|
|
215
85
|
}
|
|
216
|
-
});
|
|
217
|
-
}
|
|
218
|
-
var YAZI_CONFIG_ERROR_MARKERS = ["Failed to parse config", "Press <Enter> to continue with preset settings"];
|
|
219
|
-
function validatesWithYazi(dir, yaziPath) {
|
|
220
|
-
const scratchHome = mkdtempSync(join(dirname(dir), ".yazi-validation-"));
|
|
221
|
-
try {
|
|
222
|
-
const result = spawnSync(yaziPath, ["--debug"], {
|
|
223
|
-
cwd: scratchHome,
|
|
224
|
-
env: {
|
|
225
|
-
...process.env,
|
|
226
|
-
HOME: scratchHome,
|
|
227
|
-
XDG_CACHE_HOME: join(scratchHome, "cache"),
|
|
228
|
-
XDG_CONFIG_HOME: join(scratchHome, "config"),
|
|
229
|
-
YAZI_CONFIG_HOME: dir
|
|
230
|
-
},
|
|
231
|
-
encoding: "utf8",
|
|
232
|
-
timeout: 5e3
|
|
233
|
-
});
|
|
234
|
-
const output = `${result.stdout ?? ""}
|
|
235
|
-
${result.stderr ?? ""}`;
|
|
236
|
-
return result.error === void 0 && result.status === 0 && YAZI_CONFIG_ERROR_MARKERS.every((marker) => !output.includes(marker));
|
|
237
|
-
} catch {
|
|
238
|
-
return false;
|
|
239
|
-
} finally {
|
|
240
|
-
rmSync(scratchHome, { recursive: true, force: true });
|
|
241
86
|
}
|
|
87
|
+
if (!separating || separating.direction !== spec.direction) return null;
|
|
88
|
+
const dockIsSecond = spec.direction === "right" ? dock.rect.x > anchor.rect.x : dock.rect.y > anchor.rect.y;
|
|
89
|
+
return dockIsSecond ? 1 - separating.ratio : separating.ratio;
|
|
242
90
|
}
|
|
243
|
-
function
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
}
|
|
250
|
-
if (profileFilesExist(inputs.dir) && sameStamp(readStamp(inputs.dir), inputs.stamp)) {
|
|
251
|
-
return { dir: inputs.dir, stamp: inputs.stamp };
|
|
91
|
+
function planDockOpen(anchorRect, spec, requestedShare) {
|
|
92
|
+
const axis = axisCells(anchorRect, spec);
|
|
93
|
+
if (axis * DOCK_MAX_SHARE < spec.minCells) {
|
|
94
|
+
return {
|
|
95
|
+
refused: `the ${spec.slot} dock needs ${spec.minCells} cells and at most half of ${axis} is available`
|
|
96
|
+
};
|
|
252
97
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
if (!
|
|
264
|
-
|
|
265
|
-
return
|
|
98
|
+
const share = Math.max(clampDockShare(requestedShare ?? spec.defaultShare), spec.minCells / axis);
|
|
99
|
+
return { direction: spec.direction, ratio: ratioForDockShare(share), share };
|
|
100
|
+
}
|
|
101
|
+
function createDockController(options) {
|
|
102
|
+
const { client, anchorPaneId } = options;
|
|
103
|
+
const log = options.log ?? (() => void 0);
|
|
104
|
+
const bySlot = /* @__PURE__ */ new Map();
|
|
105
|
+
const applyShare = async (state, share) => {
|
|
106
|
+
const tree = await client.layoutExport({ tabId: state.tabId });
|
|
107
|
+
const derived = deriveSplitPath(tree.root, anchorPaneId, state.paneId);
|
|
108
|
+
if (!derived) {
|
|
109
|
+
log("debug", `mux ${state.slot} dock split path is gone from ${state.tabId}; leaving layout alone`);
|
|
110
|
+
return false;
|
|
266
111
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
112
|
+
if (derived.direction !== DOCK_SPECS[state.slot].direction) {
|
|
113
|
+
log("debug", `mux ${state.slot} dock split runs ${derived.direction}; declining the wrong-axis resize`);
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
const ratio = derived.dockIsSecond ? ratioForDockShare(share) : share;
|
|
117
|
+
await client.layoutSetSplitRatio({ tabId: state.tabId, path: derived.path, ratio });
|
|
118
|
+
state.targetShare = share;
|
|
119
|
+
state.lastAppliedShare = share;
|
|
120
|
+
return true;
|
|
121
|
+
};
|
|
122
|
+
return {
|
|
123
|
+
states() {
|
|
124
|
+
return [...bySlot.values()].map((state) => ({ ...state }));
|
|
125
|
+
},
|
|
126
|
+
stateFor(slot) {
|
|
127
|
+
const state = bySlot.get(slot);
|
|
128
|
+
return state ? { ...state } : null;
|
|
129
|
+
},
|
|
130
|
+
async open(slot, openOptions = {}) {
|
|
131
|
+
const existing = bySlot.get(slot);
|
|
132
|
+
if (existing) {
|
|
133
|
+
return { paneId: existing.paneId, tabId: existing.tabId, workspaceId: "" };
|
|
134
|
+
}
|
|
135
|
+
const spec = DOCK_SPECS[slot];
|
|
136
|
+
const geometry = await client.paneLayout(anchorPaneId);
|
|
137
|
+
const anchorRect = geometry.panes.find((pane2) => pane2.paneId === anchorPaneId)?.rect;
|
|
138
|
+
if (!anchorRect) {
|
|
139
|
+
log("debug", `mux ${slot} dock open found no anchor rect for ${anchorPaneId}`);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const plan = planDockOpen(anchorRect, spec, openOptions.share);
|
|
143
|
+
if ("refused" in plan) {
|
|
144
|
+
log("info", `mux ${slot} dock refused: ${plan.refused}`);
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const pane = await client.paneSplit({
|
|
148
|
+
direction: plan.direction,
|
|
149
|
+
targetPaneId: anchorPaneId,
|
|
150
|
+
ratio: plan.ratio,
|
|
151
|
+
focus: false,
|
|
152
|
+
...openOptions.cwd !== void 0 ? { cwd: openOptions.cwd } : {},
|
|
153
|
+
...openOptions.env ? { env: openOptions.env } : {}
|
|
154
|
+
});
|
|
155
|
+
const state = {
|
|
156
|
+
slot,
|
|
157
|
+
paneId: pane.paneId,
|
|
158
|
+
tabId: pane.tabId,
|
|
159
|
+
targetShare: plan.share,
|
|
160
|
+
lastAppliedShare: plan.share
|
|
161
|
+
};
|
|
162
|
+
bySlot.set(slot, state);
|
|
163
|
+
try {
|
|
164
|
+
const after = await client.paneLayout(anchorPaneId);
|
|
165
|
+
const dockRect = after.panes.find((entry) => entry.paneId === pane.paneId)?.rect;
|
|
166
|
+
if (dockRect && axisCells(dockRect, spec) < spec.minCells) {
|
|
167
|
+
const anchorAfter = after.panes.find((entry) => entry.paneId === anchorPaneId)?.rect;
|
|
168
|
+
const total = anchorAfter ? axisCells(anchorAfter, spec) + axisCells(dockRect, spec) : 0;
|
|
169
|
+
if (total > 0) await applyShare(state, Math.min(DOCK_MAX_SHARE, spec.minCells / total));
|
|
170
|
+
}
|
|
171
|
+
} catch (error) {
|
|
172
|
+
log("debug", `mux ${slot} dock converge skipped: ${error instanceof Error ? error.message : String(error)}`);
|
|
173
|
+
}
|
|
174
|
+
return { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
|
|
175
|
+
},
|
|
176
|
+
adopt(slot, ref) {
|
|
177
|
+
const spec = DOCK_SPECS[slot];
|
|
178
|
+
bySlot.set(slot, {
|
|
179
|
+
slot,
|
|
180
|
+
paneId: ref.paneId,
|
|
181
|
+
tabId: ref.tabId,
|
|
182
|
+
// The surviving pane's actual share is adopted lazily by the next
|
|
183
|
+
// layout observation; until then the default is the best guess.
|
|
184
|
+
targetShare: spec.defaultShare,
|
|
185
|
+
lastAppliedShare: spec.defaultShare
|
|
186
|
+
});
|
|
187
|
+
},
|
|
188
|
+
async resize(slot, share) {
|
|
189
|
+
const state = bySlot.get(slot);
|
|
190
|
+
if (!state) return false;
|
|
191
|
+
return await applyShare(state, Math.max(clampDockShare(share), 0.01));
|
|
192
|
+
},
|
|
193
|
+
noteLayoutUpdated(geometry) {
|
|
194
|
+
for (const state of bySlot.values()) {
|
|
195
|
+
if (state.tabId !== geometry.tabId) continue;
|
|
196
|
+
const observed = observedDockShare(geometry, DOCK_SPECS[state.slot], anchorPaneId, state.paneId);
|
|
197
|
+
if (observed === null) continue;
|
|
198
|
+
if (Math.abs(observed - state.targetShare) <= SHARE_EPSILON) continue;
|
|
199
|
+
if (Math.abs(observed - state.lastAppliedShare) <= SHARE_EPSILON) continue;
|
|
200
|
+
log("debug", `mux ${state.slot} dock resized by the user to ${(observed * 100).toFixed(0)}%`);
|
|
201
|
+
state.targetShare = observed;
|
|
202
|
+
state.lastAppliedShare = observed;
|
|
203
|
+
}
|
|
204
|
+
},
|
|
205
|
+
notePaneGone(paneId) {
|
|
206
|
+
for (const [slot, state] of bySlot) {
|
|
207
|
+
if (state.paneId === paneId) bySlot.delete(slot);
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
notePaneMoved(previousPaneId, paneId, tabId) {
|
|
211
|
+
for (const state of bySlot.values()) {
|
|
212
|
+
if (state.paneId !== previousPaneId) continue;
|
|
213
|
+
state.paneId = paneId;
|
|
214
|
+
state.tabId = tabId;
|
|
215
|
+
}
|
|
216
|
+
},
|
|
217
|
+
paneIds() {
|
|
218
|
+
return [...bySlot.values()].map((state) => state.paneId);
|
|
219
|
+
},
|
|
220
|
+
clear() {
|
|
221
|
+
bySlot.clear();
|
|
222
|
+
}
|
|
223
|
+
};
|
|
276
224
|
}
|
|
277
225
|
|
|
278
|
-
// src/domains/mux/index.ts
|
|
279
|
-
init_esm_shims();
|
|
280
|
-
|
|
281
|
-
// src/domains/mux/extension.ts
|
|
282
|
-
init_esm_shims();
|
|
283
|
-
|
|
284
|
-
// src/domains/mux/contract.ts
|
|
285
|
-
init_esm_shims();
|
|
286
|
-
|
|
287
226
|
// src/domains/mux/pane-registry.ts
|
|
288
227
|
init_esm_shims();
|
|
289
228
|
function createPaneRegistry() {
|
|
@@ -343,6 +282,10 @@ init_esm_shims();
|
|
|
343
282
|
var MUX_METHOD_MIN_PROTOCOL = {
|
|
344
283
|
"notification.show": 17,
|
|
345
284
|
"pane.rename": 17,
|
|
285
|
+
"pane.focus": 17,
|
|
286
|
+
"pane.zoom": 17,
|
|
287
|
+
"layout.export": 17,
|
|
288
|
+
"layout.set_split_ratio": 17,
|
|
346
289
|
"worktree.list": 10,
|
|
347
290
|
"worktree.create": 10,
|
|
348
291
|
"worktree.open": 10,
|
|
@@ -393,24 +336,31 @@ function muxErrorKind(wireCode) {
|
|
|
393
336
|
}
|
|
394
337
|
|
|
395
338
|
// src/domains/mux/contract.ts
|
|
396
|
-
var METADATA_SOURCE = "clio:mux";
|
|
397
|
-
var SELF_AGENT_SOURCE = "clio:coder";
|
|
398
|
-
var OWNER_TOKEN_KEY = "
|
|
399
|
-
var OWNER_TOKEN_VALUE = "clio:mux";
|
|
339
|
+
var METADATA_SOURCE = "clio-coder:mux";
|
|
340
|
+
var SELF_AGENT_SOURCE = "clio-coder:coder";
|
|
341
|
+
var OWNER_TOKEN_KEY = "clio_coder_owner";
|
|
342
|
+
var OWNER_TOKEN_VALUE = "clio-coder:mux";
|
|
343
|
+
var LEGACY_OWNER_TOKEN_KEY = "clio_owner";
|
|
344
|
+
var LEGACY_OWNER_TOKEN_VALUE = "clio:mux";
|
|
400
345
|
var TOKEN_VALUE_MAX = 80;
|
|
401
346
|
var DEGRADE_COOLDOWN_MS = 5e3;
|
|
402
|
-
function
|
|
347
|
+
function shellQuote(argv) {
|
|
403
348
|
return argv.map((arg) => `'${arg.replaceAll("'", `'\\''`)}'`).join(" ");
|
|
404
349
|
}
|
|
405
350
|
function token(value) {
|
|
406
351
|
if (typeof value !== "string" || value.length === 0) return null;
|
|
407
352
|
return value.length > TOKEN_VALUE_MAX ? value.slice(0, TOKEN_VALUE_MAX) : value;
|
|
408
353
|
}
|
|
354
|
+
function hasOwnedPaneToken(tokens) {
|
|
355
|
+
return tokens[OWNER_TOKEN_KEY] === OWNER_TOKEN_VALUE || tokens[LEGACY_OWNER_TOKEN_KEY] === LEGACY_OWNER_TOKEN_VALUE;
|
|
356
|
+
}
|
|
409
357
|
function createMuxRuntime(options) {
|
|
410
358
|
const { detection, client } = options;
|
|
411
359
|
const log = options.log ?? (() => void 0);
|
|
412
360
|
const now = options.now ?? Date.now;
|
|
413
361
|
const registry = createPaneRegistry();
|
|
362
|
+
const anchorPaneId = detection.self.paneId;
|
|
363
|
+
const docks = client !== null && anchorPaneId !== null && muxSupportsMethod(detection.server, "layout.export") ? createDockController({ client, anchorPaneId, log }) : null;
|
|
414
364
|
let healthy = client !== null;
|
|
415
365
|
let probeHealthAt = 0;
|
|
416
366
|
let stopped = false;
|
|
@@ -445,10 +395,27 @@ function createMuxRuntime(options) {
|
|
|
445
395
|
paneId,
|
|
446
396
|
source: METADATA_SOURCE,
|
|
447
397
|
...title === void 0 ? {} : { title },
|
|
448
|
-
tokens: {
|
|
398
|
+
tokens: {
|
|
399
|
+
[OWNER_TOKEN_KEY]: OWNER_TOKEN_VALUE,
|
|
400
|
+
[LEGACY_OWNER_TOKEN_KEY]: LEGACY_OWNER_TOKEN_VALUE,
|
|
401
|
+
...tokens
|
|
402
|
+
}
|
|
449
403
|
});
|
|
450
404
|
};
|
|
451
405
|
const onEvent = (event) => {
|
|
406
|
+
if (event.kind === "layout.updated") {
|
|
407
|
+
docks?.noteLayoutUpdated(event.geometry);
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
if (event.kind === "pane.moved") {
|
|
411
|
+
const held = registry.forget(event.previousPaneId);
|
|
412
|
+
if (held) {
|
|
413
|
+
registry.record({ ...held, ref: { paneId: event.paneId, tabId: event.tabId, workspaceId: event.workspaceId } });
|
|
414
|
+
docks?.notePaneMoved(event.previousPaneId, event.paneId, event.tabId);
|
|
415
|
+
}
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
docks?.notePaneGone(event.paneId);
|
|
452
419
|
const dropped = registry.forget(event.paneId);
|
|
453
420
|
if (dropped) {
|
|
454
421
|
log("debug", `mux pane ${event.paneId} left on ${event.kind}; dropped from the registry`);
|
|
@@ -470,32 +437,49 @@ function createMuxRuntime(options) {
|
|
|
470
437
|
return detection;
|
|
471
438
|
},
|
|
472
439
|
async openUtilityPane(request) {
|
|
440
|
+
const dockSlot = request.dock?.slot;
|
|
441
|
+
if (dockSlot && docks) {
|
|
442
|
+
const existing = docks.stateFor(dockSlot);
|
|
443
|
+
const held = existing ? registry.byPaneId(existing.paneId) : null;
|
|
444
|
+
if (held) return held.ref;
|
|
445
|
+
}
|
|
473
446
|
return await attempt(
|
|
474
447
|
"openUtilityPane",
|
|
475
448
|
async (live) => {
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
449
|
+
let ref;
|
|
450
|
+
if (request.dock && docks) {
|
|
451
|
+
const placed = await docks.open(request.dock.slot, {
|
|
452
|
+
...request.dock.share === void 0 ? {} : { share: request.dock.share },
|
|
453
|
+
cwd: request.cwd,
|
|
454
|
+
...request.env ? { env: request.env } : {}
|
|
455
|
+
});
|
|
456
|
+
if (placed === null) return null;
|
|
457
|
+
ref = placed;
|
|
458
|
+
} else {
|
|
459
|
+
const anchor = anchorPaneId ?? (await live.paneCurrent()).paneId;
|
|
460
|
+
const pane = await live.paneSplit({
|
|
461
|
+
direction: request.direction ?? "right",
|
|
462
|
+
targetPaneId: anchor,
|
|
463
|
+
cwd: request.cwd,
|
|
464
|
+
focus: false,
|
|
465
|
+
...request.env ? { env: request.env } : {}
|
|
466
|
+
});
|
|
467
|
+
ref = { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
|
|
468
|
+
}
|
|
485
469
|
const purpose = request.purpose ?? "utility";
|
|
486
470
|
registry.record(paneRecord(ref, { purpose, label: request.label, openedAt: now() }));
|
|
487
471
|
const title = request.title;
|
|
488
472
|
const titleSupported = title !== void 0 && muxSupportsMethod(detection.server, "pane.rename");
|
|
489
473
|
if (titleSupported) {
|
|
490
474
|
try {
|
|
491
|
-
await live.paneRename(
|
|
475
|
+
await live.paneRename(ref.paneId, title);
|
|
492
476
|
} catch {
|
|
493
477
|
}
|
|
494
478
|
}
|
|
495
|
-
await tagOwner(live,
|
|
479
|
+
await tagOwner(live, ref.paneId, { role: token(purpose) }, titleSupported ? title : void 0);
|
|
496
480
|
if (request.argv.length > 0) {
|
|
497
|
-
const redirect = request.stdoutPath ? ` > ${
|
|
498
|
-
await live.paneSendText(
|
|
481
|
+
const redirect = request.stdoutPath ? ` > ${shellQuote([request.stdoutPath])}` : "";
|
|
482
|
+
await live.paneSendText(ref.paneId, `exec ${shellQuote(request.argv)}${redirect}
|
|
499
483
|
`);
|
|
500
484
|
}
|
|
501
485
|
return ref;
|
|
@@ -510,6 +494,7 @@ function createMuxRuntime(options) {
|
|
|
510
494
|
async (live) => {
|
|
511
495
|
await live.paneClose(paneId);
|
|
512
496
|
registry.forget(paneId);
|
|
497
|
+
docks?.notePaneGone(paneId);
|
|
513
498
|
return true;
|
|
514
499
|
},
|
|
515
500
|
false
|
|
@@ -523,7 +508,7 @@ function createMuxRuntime(options) {
|
|
|
523
508
|
async (live) => {
|
|
524
509
|
const snapshot = await live.snapshot();
|
|
525
510
|
for (const pane of snapshot.panes) {
|
|
526
|
-
if (pane.tokens
|
|
511
|
+
if (!hasOwnedPaneToken(pane.tokens)) continue;
|
|
527
512
|
if (pane.tokens.role !== request.purpose) continue;
|
|
528
513
|
if (registry.owns(pane.paneId)) continue;
|
|
529
514
|
if (detection.self.workspaceId !== null && pane.workspaceId !== detection.self.workspaceId) continue;
|
|
@@ -531,6 +516,7 @@ function createMuxRuntime(options) {
|
|
|
531
516
|
registry.record(
|
|
532
517
|
paneRecord(ref, { purpose: request.purpose, label: request.label, openedAt: now(), adopted: true })
|
|
533
518
|
);
|
|
519
|
+
if (request.dock && docks) docks.adopt(request.dock, ref);
|
|
534
520
|
log("info", `mux adopted a ${request.purpose} pane left open by a previous session`);
|
|
535
521
|
return ref;
|
|
536
522
|
}
|
|
@@ -539,6 +525,59 @@ function createMuxRuntime(options) {
|
|
|
539
525
|
null
|
|
540
526
|
);
|
|
541
527
|
},
|
|
528
|
+
async focusPane(paneId) {
|
|
529
|
+
if (!registry.owns(paneId)) return false;
|
|
530
|
+
if (!muxSupportsMethod(detection.server, "pane.focus")) return false;
|
|
531
|
+
return await attempt(
|
|
532
|
+
"focusPane",
|
|
533
|
+
async (live) => {
|
|
534
|
+
await live.paneFocus(paneId);
|
|
535
|
+
return true;
|
|
536
|
+
},
|
|
537
|
+
false
|
|
538
|
+
);
|
|
539
|
+
},
|
|
540
|
+
async zoomPane(paneId, mode) {
|
|
541
|
+
if (!registry.owns(paneId)) return false;
|
|
542
|
+
if (!muxSupportsMethod(detection.server, "pane.zoom")) return false;
|
|
543
|
+
return await attempt(
|
|
544
|
+
"zoomPane",
|
|
545
|
+
async (live) => {
|
|
546
|
+
const result = await live.paneZoom(paneId, mode);
|
|
547
|
+
return result.changed;
|
|
548
|
+
},
|
|
549
|
+
false
|
|
550
|
+
);
|
|
551
|
+
},
|
|
552
|
+
async focusSelf() {
|
|
553
|
+
if (anchorPaneId === null || !muxSupportsMethod(detection.server, "pane.focus")) return false;
|
|
554
|
+
return await attempt(
|
|
555
|
+
"focusSelf",
|
|
556
|
+
async (live) => {
|
|
557
|
+
await live.paneFocus(anchorPaneId);
|
|
558
|
+
return true;
|
|
559
|
+
},
|
|
560
|
+
false
|
|
561
|
+
);
|
|
562
|
+
},
|
|
563
|
+
async unzoomSelf() {
|
|
564
|
+
if (anchorPaneId === null || !muxSupportsMethod(detection.server, "pane.zoom")) return false;
|
|
565
|
+
return await attempt(
|
|
566
|
+
"unzoomSelf",
|
|
567
|
+
async (live) => {
|
|
568
|
+
const result = await live.paneZoom(anchorPaneId, "off");
|
|
569
|
+
return result.changed;
|
|
570
|
+
},
|
|
571
|
+
false
|
|
572
|
+
);
|
|
573
|
+
},
|
|
574
|
+
async resizeDock(slot, share) {
|
|
575
|
+
if (!docks) return false;
|
|
576
|
+
return await attempt("resizeDock", () => docks.resize(slot, share), false);
|
|
577
|
+
},
|
|
578
|
+
docks() {
|
|
579
|
+
return docks?.states() ?? [];
|
|
580
|
+
},
|
|
542
581
|
async notify(request) {
|
|
543
582
|
if (!muxSupportsMethod(detection.server, "notification.show")) {
|
|
544
583
|
log("debug", `mux notify skipped, server protocol is below the notification.show floor: ${request.title}`);
|
|
@@ -621,15 +660,25 @@ function createMuxRuntime(options) {
|
|
|
621
660
|
subscription?.close();
|
|
622
661
|
subscription = null;
|
|
623
662
|
paneGoneHandlers.clear();
|
|
663
|
+
if (client && docks) {
|
|
664
|
+
for (const paneId of docks.paneIds()) {
|
|
665
|
+
await client.paneClose(paneId).catch(() => void 0);
|
|
666
|
+
registry.forget(paneId);
|
|
667
|
+
}
|
|
668
|
+
docks.clear();
|
|
669
|
+
}
|
|
624
670
|
if (client) await client.close().catch(() => void 0);
|
|
625
671
|
}
|
|
626
672
|
};
|
|
627
673
|
const start = async () => {
|
|
628
674
|
if (detection.mode === "none" || client === null) return;
|
|
629
675
|
try {
|
|
630
|
-
|
|
676
|
+
const kinds = ["pane.closed", "pane.exited"];
|
|
677
|
+
if (docks) kinds.push("pane.moved", "layout.updated");
|
|
678
|
+
subscription = await client.subscribe(kinds, onEvent, {
|
|
631
679
|
onResync: (snapshot) => {
|
|
632
680
|
const dropped = registry.reconcile(snapshot.panes.map((pane) => pane.paneId));
|
|
681
|
+
for (const record2 of dropped) docks?.notePaneGone(record2.ref.paneId);
|
|
633
682
|
if (dropped.length > 0) {
|
|
634
683
|
log("info", `mux reconciled ${dropped.length} pane(s) closed while the socket was down`);
|
|
635
684
|
}
|
|
@@ -644,8 +693,8 @@ function createMuxRuntime(options) {
|
|
|
644
693
|
|
|
645
694
|
// src/domains/mux/detect.ts
|
|
646
695
|
init_esm_shims();
|
|
647
|
-
import { homedir
|
|
648
|
-
import { join
|
|
696
|
+
import { homedir } from "node:os";
|
|
697
|
+
import { join } from "node:path";
|
|
649
698
|
|
|
650
699
|
// src/domains/mux/socket-client.ts
|
|
651
700
|
init_esm_shims();
|
|
@@ -817,21 +866,118 @@ function readSnapshot(value) {
|
|
|
817
866
|
tabs: readArray(source, "tabs").map(readTab)
|
|
818
867
|
};
|
|
819
868
|
}
|
|
820
|
-
|
|
869
|
+
function requireNumber(source, key, context) {
|
|
870
|
+
const value = source[key];
|
|
871
|
+
if (typeof value !== "number") {
|
|
872
|
+
throw new MuxError("protocol", `mux ${context} response is missing number field ${key}`);
|
|
873
|
+
}
|
|
874
|
+
return value;
|
|
875
|
+
}
|
|
876
|
+
function readRect(value, context) {
|
|
877
|
+
const source = asRecord(value);
|
|
878
|
+
if (!source) throw new MuxError("protocol", `mux ${context} rect is not an object`);
|
|
879
|
+
return {
|
|
880
|
+
x: requireNumber(source, "x", context),
|
|
881
|
+
y: requireNumber(source, "y", context),
|
|
882
|
+
width: requireNumber(source, "width", context),
|
|
883
|
+
height: requireNumber(source, "height", context)
|
|
884
|
+
};
|
|
885
|
+
}
|
|
886
|
+
function readSplitDirection(value, context) {
|
|
887
|
+
if (value === "right" || value === "down") return value;
|
|
888
|
+
throw new MuxError("protocol", `mux ${context} split direction is not right/down`);
|
|
889
|
+
}
|
|
890
|
+
function readTabGeometry(value) {
|
|
891
|
+
const source = asRecord(value);
|
|
892
|
+
if (!source) throw new MuxError("protocol", "mux layout snapshot is not an object");
|
|
893
|
+
return {
|
|
894
|
+
workspaceId: requireString(source, "workspace_id", "layout"),
|
|
895
|
+
tabId: requireString(source, "tab_id", "layout"),
|
|
896
|
+
zoomed: source.zoomed === true,
|
|
897
|
+
area: readRect(source.area, "layout"),
|
|
898
|
+
focusedPaneId: optionalString(source, "focused_pane_id"),
|
|
899
|
+
panes: readArray(source, "panes").map((entry) => {
|
|
900
|
+
const pane = asRecord(entry);
|
|
901
|
+
if (!pane) throw new MuxError("protocol", "mux layout pane entry is not an object");
|
|
902
|
+
return {
|
|
903
|
+
paneId: requireString(pane, "pane_id", "layout pane"),
|
|
904
|
+
focused: pane.focused === true,
|
|
905
|
+
rect: readRect(pane.rect, "layout pane")
|
|
906
|
+
};
|
|
907
|
+
}),
|
|
908
|
+
splits: readArray(source, "splits").map((entry) => {
|
|
909
|
+
const split = asRecord(entry);
|
|
910
|
+
if (!split) throw new MuxError("protocol", "mux layout split entry is not an object");
|
|
911
|
+
return {
|
|
912
|
+
direction: readSplitDirection(split.direction, "layout"),
|
|
913
|
+
ratio: requireNumber(split, "ratio", "layout split"),
|
|
914
|
+
rect: readRect(split.rect, "layout split")
|
|
915
|
+
};
|
|
916
|
+
})
|
|
917
|
+
};
|
|
918
|
+
}
|
|
919
|
+
function readLayoutNode(value) {
|
|
920
|
+
const source = asRecord(value);
|
|
921
|
+
if (!source) throw new MuxError("protocol", "mux layout node is not an object");
|
|
922
|
+
if (source.type === "pane") {
|
|
923
|
+
return { type: "pane", paneId: optionalString(source, "pane_id"), label: optionalString(source, "label") };
|
|
924
|
+
}
|
|
925
|
+
if (source.type === "split") {
|
|
926
|
+
return {
|
|
927
|
+
type: "split",
|
|
928
|
+
direction: readSplitDirection(source.direction, "layout tree"),
|
|
929
|
+
ratio: requireNumber(source, "ratio", "layout tree split"),
|
|
930
|
+
first: readLayoutNode(source.first),
|
|
931
|
+
second: readLayoutNode(source.second)
|
|
932
|
+
};
|
|
933
|
+
}
|
|
934
|
+
throw new MuxError("protocol", "mux layout node has an unknown type");
|
|
935
|
+
}
|
|
936
|
+
function readLayoutTree(value) {
|
|
937
|
+
const source = asRecord(value);
|
|
938
|
+
if (!source) throw new MuxError("protocol", "mux layout tree is not an object");
|
|
939
|
+
return {
|
|
940
|
+
workspaceId: requireString(source, "workspace_id", "layout tree"),
|
|
941
|
+
tabId: requireString(source, "tab_id", "layout tree"),
|
|
942
|
+
zoomed: source.zoomed === true,
|
|
943
|
+
focusedPaneId: optionalString(source, "focused_pane_id"),
|
|
944
|
+
root: readLayoutNode(source.root)
|
|
945
|
+
};
|
|
946
|
+
}
|
|
947
|
+
var PANE_LEAVE_KIND_BY_WIRE = {
|
|
821
948
|
pane_closed: "pane.closed",
|
|
822
949
|
pane_exited: "pane.exited"
|
|
823
950
|
};
|
|
824
951
|
function readEvent(line) {
|
|
825
952
|
const wireKind = line.event;
|
|
826
953
|
if (typeof wireKind !== "string") return null;
|
|
827
|
-
const kind = EVENT_KIND_BY_WIRE[wireKind];
|
|
828
|
-
if (!kind) return null;
|
|
829
954
|
const data = asRecord(line.data);
|
|
830
955
|
if (!data) return null;
|
|
831
|
-
const
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
956
|
+
const leaveKind = PANE_LEAVE_KIND_BY_WIRE[wireKind];
|
|
957
|
+
if (leaveKind) {
|
|
958
|
+
const paneId = data.pane_id;
|
|
959
|
+
const workspaceId = data.workspace_id;
|
|
960
|
+
if (typeof paneId !== "string" || typeof workspaceId !== "string") return null;
|
|
961
|
+
return { kind: leaveKind, paneId, workspaceId };
|
|
962
|
+
}
|
|
963
|
+
if (wireKind === "pane_moved") {
|
|
964
|
+
const pane = asRecord(data.pane);
|
|
965
|
+
const previousPaneId = data.previous_pane_id;
|
|
966
|
+
if (!pane || typeof previousPaneId !== "string") return null;
|
|
967
|
+
const paneId = pane.pane_id;
|
|
968
|
+
const tabId = pane.tab_id;
|
|
969
|
+
const workspaceId = pane.workspace_id;
|
|
970
|
+
if (typeof paneId !== "string" || typeof tabId !== "string" || typeof workspaceId !== "string") return null;
|
|
971
|
+
return { kind: "pane.moved", paneId, previousPaneId, tabId, workspaceId };
|
|
972
|
+
}
|
|
973
|
+
if (wireKind === "layout_updated") {
|
|
974
|
+
try {
|
|
975
|
+
return { kind: "layout.updated", geometry: readTabGeometry(data.layout) };
|
|
976
|
+
} catch {
|
|
977
|
+
return null;
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
return null;
|
|
835
981
|
}
|
|
836
982
|
function params(entries) {
|
|
837
983
|
const out = {};
|
|
@@ -1065,15 +1211,27 @@ function createMuxClient(options) {
|
|
|
1065
1211
|
},
|
|
1066
1212
|
async paneLayout(paneId) {
|
|
1067
1213
|
const result = await callObject("pane.layout", params({ pane_id: paneId }));
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1214
|
+
return readTabGeometry(result.layout);
|
|
1215
|
+
},
|
|
1216
|
+
async paneFocus(paneId) {
|
|
1217
|
+
await call("pane.focus", { pane_id: paneId });
|
|
1218
|
+
},
|
|
1219
|
+
async paneZoom(paneId, mode) {
|
|
1220
|
+
const result = await callObject("pane.zoom", { pane_id: paneId, mode });
|
|
1221
|
+
const zoom = asRecord(result.zoom);
|
|
1222
|
+
if (!zoom) throw new MuxError("protocol", "mux pane.zoom returned no zoom result");
|
|
1223
|
+
return { changed: zoom.changed === true, focusChanged: zoom.focus_changed === true };
|
|
1224
|
+
},
|
|
1225
|
+
async layoutExport(request = {}) {
|
|
1226
|
+
const result = await callObject("layout.export", params({ tab_id: request.tabId, pane_id: request.paneId }));
|
|
1227
|
+
return readLayoutTree(result.layout);
|
|
1228
|
+
},
|
|
1229
|
+
async layoutSetSplitRatio(request) {
|
|
1230
|
+
const result = await callObject(
|
|
1231
|
+
"layout.set_split_ratio",
|
|
1232
|
+
params({ tab_id: request.tabId, pane_id: request.paneId, path: [...request.path], ratio: request.ratio })
|
|
1233
|
+
);
|
|
1234
|
+
return readLayoutTree(result.layout);
|
|
1077
1235
|
},
|
|
1078
1236
|
async worktreeList(request = {}) {
|
|
1079
1237
|
const result = await callObject("worktree.list", params({ workspace_id: request.workspaceId, cwd: request.cwd }));
|
|
@@ -1186,9 +1344,9 @@ function createMuxClient(options) {
|
|
|
1186
1344
|
var PING_TIMEOUT_MS = 1e3;
|
|
1187
1345
|
function herdrConfigDir(env) {
|
|
1188
1346
|
const xdg = env.XDG_CONFIG_HOME;
|
|
1189
|
-
if (typeof xdg === "string" && xdg.length > 0) return
|
|
1190
|
-
const home = typeof env.HOME === "string" && env.HOME.length > 0 ? env.HOME :
|
|
1191
|
-
return
|
|
1347
|
+
if (typeof xdg === "string" && xdg.length > 0) return join(xdg, "herdr");
|
|
1348
|
+
const home = typeof env.HOME === "string" && env.HOME.length > 0 ? env.HOME : homedir();
|
|
1349
|
+
return join(home, ".config", "herdr");
|
|
1192
1350
|
}
|
|
1193
1351
|
function resolveSocketCandidates(env) {
|
|
1194
1352
|
const candidates = [];
|
|
@@ -1197,9 +1355,9 @@ function resolveSocketCandidates(env) {
|
|
|
1197
1355
|
const configDir = herdrConfigDir(env);
|
|
1198
1356
|
const session = env.HERDR_SESSION;
|
|
1199
1357
|
if (typeof session === "string" && session.length > 0) {
|
|
1200
|
-
candidates.push(
|
|
1358
|
+
candidates.push(join(configDir, "sessions", session, "herdr.sock"));
|
|
1201
1359
|
}
|
|
1202
|
-
candidates.push(
|
|
1360
|
+
candidates.push(join(configDir, "herdr.sock"));
|
|
1203
1361
|
return [...new Set(candidates)];
|
|
1204
1362
|
}
|
|
1205
1363
|
function readSelfLocation(env) {
|
|
@@ -1213,14 +1371,15 @@ function readSelfLocation(env) {
|
|
|
1213
1371
|
paneId: read("HERDR_PANE_ID")
|
|
1214
1372
|
};
|
|
1215
1373
|
}
|
|
1216
|
-
function none(reason, candidates = []) {
|
|
1374
|
+
function none(reason, candidates = [], refused = false) {
|
|
1217
1375
|
return {
|
|
1218
1376
|
mode: "none",
|
|
1219
1377
|
socketPath: null,
|
|
1220
1378
|
server: null,
|
|
1221
1379
|
self: { workspaceId: null, tabId: null, paneId: null },
|
|
1222
1380
|
candidates,
|
|
1223
|
-
reason
|
|
1381
|
+
reason,
|
|
1382
|
+
refused
|
|
1224
1383
|
};
|
|
1225
1384
|
}
|
|
1226
1385
|
async function detectMux(options = {}) {
|
|
@@ -1231,7 +1390,7 @@ async function detectMux(options = {}) {
|
|
|
1231
1390
|
return { detection: none("panes are turned off"), client: null };
|
|
1232
1391
|
}
|
|
1233
1392
|
if (enabled === "embedded") {
|
|
1234
|
-
|
|
1393
|
+
log("info", "interface.panes.enabled=embedded is not implemented yet; detecting a guest pane host instead");
|
|
1235
1394
|
}
|
|
1236
1395
|
if (env.HERDR_ENV !== "1") {
|
|
1237
1396
|
return { detection: none("HERDR_ENV is not 1, so Clio is not running inside a pane host"), client: null };
|
|
@@ -1250,7 +1409,8 @@ async function detectMux(options = {}) {
|
|
|
1250
1409
|
server,
|
|
1251
1410
|
self: readSelfLocation(env),
|
|
1252
1411
|
candidates,
|
|
1253
|
-
reason: `guest mode on ${socketPath} (herdr ${server.version}, protocol ${server.protocol})
|
|
1412
|
+
reason: `guest mode on ${socketPath} (herdr ${server.version}, protocol ${server.protocol})`,
|
|
1413
|
+
refused: false
|
|
1254
1414
|
},
|
|
1255
1415
|
client
|
|
1256
1416
|
};
|
|
@@ -1276,7 +1436,10 @@ async function createMuxBundle(_context, options = {}) {
|
|
|
1276
1436
|
...options.env ? { env: options.env } : {},
|
|
1277
1437
|
log
|
|
1278
1438
|
});
|
|
1279
|
-
log(
|
|
1439
|
+
log(
|
|
1440
|
+
detection.refused ? "warning" : detection.mode === "none" ? "debug" : "info",
|
|
1441
|
+
detection.refused ? `panes refused: ${detection.reason}` : `mux mode ${detection.mode}: ${detection.reason}`
|
|
1442
|
+
);
|
|
1280
1443
|
const runtime = createMuxRuntime({ detection, client, log });
|
|
1281
1444
|
const extension = {
|
|
1282
1445
|
async start() {
|
|
@@ -1298,9 +1461,9 @@ var MuxManifest = {
|
|
|
1298
1461
|
|
|
1299
1462
|
// src/domains/mux/viewer-command.ts
|
|
1300
1463
|
init_esm_shims();
|
|
1301
|
-
import { join as
|
|
1464
|
+
import { join as join2 } from "node:path";
|
|
1302
1465
|
function clioCliEntryPath() {
|
|
1303
|
-
return
|
|
1466
|
+
return join2(resolvePackageRoot(), "dist/cli/index.js");
|
|
1304
1467
|
}
|
|
1305
1468
|
function watchViewerCommand(selectionPath, options = {}) {
|
|
1306
1469
|
const layout = options.dirs === void 0 ? [] : [
|
|
@@ -1326,10 +1489,12 @@ function watchViewerCommand(selectionPath, options = {}) {
|
|
|
1326
1489
|
|
|
1327
1490
|
// src/domains/mux/yazi/event-stream.ts
|
|
1328
1491
|
init_esm_shims();
|
|
1329
|
-
import { closeSync, openSync, readSync, statSync
|
|
1492
|
+
import { closeSync, openSync, readSync, statSync } from "node:fs";
|
|
1330
1493
|
import { StringDecoder } from "node:string_decoder";
|
|
1331
1494
|
var YAZI_STREAM_POLL_MS = 250;
|
|
1332
1495
|
var YAZI_STREAM_MAX_BYTES = 1024 * 1024;
|
|
1496
|
+
var YAZI_PICK_EVENT = "clio-coder-pick";
|
|
1497
|
+
var LEGACY_YAZI_PICK_EVENT = "clio-pick";
|
|
1333
1498
|
function record(value) {
|
|
1334
1499
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1335
1500
|
}
|
|
@@ -1339,7 +1504,7 @@ function parseYaziEventLine(line) {
|
|
|
1339
1504
|
const third = second < 0 ? -1 : line.indexOf(",", second + 1);
|
|
1340
1505
|
if (first <= 0 || second <= first + 1 || third <= second + 1) return null;
|
|
1341
1506
|
const kind = line.slice(0, first);
|
|
1342
|
-
if (kind !== "cd" && kind !==
|
|
1507
|
+
if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) return null;
|
|
1343
1508
|
const receiver = line.slice(first + 1, second);
|
|
1344
1509
|
const sender = line.slice(second + 1, third);
|
|
1345
1510
|
try {
|
|
@@ -1351,7 +1516,7 @@ function parseYaziEventLine(line) {
|
|
|
1351
1516
|
return { kind, receiver, sender, tab: String(tab), cwd: body.url };
|
|
1352
1517
|
}
|
|
1353
1518
|
if (!Array.isArray(body) || !body.every((value) => typeof value === "string")) return null;
|
|
1354
|
-
return { kind, receiver, sender, values: body };
|
|
1519
|
+
return { kind: YAZI_PICK_EVENT, receiver, sender, values: body };
|
|
1355
1520
|
} catch {
|
|
1356
1521
|
return null;
|
|
1357
1522
|
}
|
|
@@ -1395,7 +1560,7 @@ function createYaziEventStream(options) {
|
|
|
1395
1560
|
stop("pane-gone");
|
|
1396
1561
|
return;
|
|
1397
1562
|
}
|
|
1398
|
-
const stat =
|
|
1563
|
+
const stat = statSync(options.path, { throwIfNoEntry: false });
|
|
1399
1564
|
if (!stat?.isFile()) {
|
|
1400
1565
|
stop("file-missing");
|
|
1401
1566
|
return;
|
|
@@ -1427,7 +1592,7 @@ function createYaziEventStream(options) {
|
|
|
1427
1592
|
const line = raw.endsWith("\r") ? raw.slice(0, -1) : raw;
|
|
1428
1593
|
if (line.length === 0) continue;
|
|
1429
1594
|
const kind = line.slice(0, line.indexOf(","));
|
|
1430
|
-
if (kind !== "cd" && kind !==
|
|
1595
|
+
if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) continue;
|
|
1431
1596
|
const event = parseYaziEventLine(line);
|
|
1432
1597
|
if (!event) {
|
|
1433
1598
|
state.malformedLines += 1;
|
|
@@ -1457,8 +1622,8 @@ function createYaziEventStream(options) {
|
|
|
1457
1622
|
init_esm_shims();
|
|
1458
1623
|
import { spawn } from "node:child_process";
|
|
1459
1624
|
import { randomUUID } from "node:crypto";
|
|
1460
|
-
import { mkdirSync
|
|
1461
|
-
import { join as
|
|
1625
|
+
import { mkdirSync, readdirSync, readFileSync, rmSync, statSync as statSync2, writeFileSync } from "node:fs";
|
|
1626
|
+
import { join as join3 } from "node:path";
|
|
1462
1627
|
function resolveYaziBinaries() {
|
|
1463
1628
|
const entry = findPinnedTool("yazi");
|
|
1464
1629
|
const status = entry ? toolStatus(entry) : null;
|
|
@@ -1477,11 +1642,33 @@ function runYa(file, args, env) {
|
|
|
1477
1642
|
}
|
|
1478
1643
|
function readOptional(path) {
|
|
1479
1644
|
try {
|
|
1480
|
-
return
|
|
1645
|
+
return readFileSync(path, "utf8");
|
|
1481
1646
|
} catch {
|
|
1482
1647
|
return "";
|
|
1483
1648
|
}
|
|
1484
1649
|
}
|
|
1650
|
+
var YAZI_STALE_TRANSPORT_MS = 24 * 60 * 60 * 1e3;
|
|
1651
|
+
function sweepStaleTransportFiles(sessionsDir, now = Date.now()) {
|
|
1652
|
+
let removed = 0;
|
|
1653
|
+
let entries;
|
|
1654
|
+
try {
|
|
1655
|
+
entries = readdirSync(sessionsDir);
|
|
1656
|
+
} catch {
|
|
1657
|
+
return 0;
|
|
1658
|
+
}
|
|
1659
|
+
for (const name of entries) {
|
|
1660
|
+
if (!/\.(stream|chooser|cwd)$/u.test(name)) continue;
|
|
1661
|
+
const path = join3(sessionsDir, name);
|
|
1662
|
+
try {
|
|
1663
|
+
if (now - statSync2(path).mtimeMs > YAZI_STALE_TRANSPORT_MS) {
|
|
1664
|
+
rmSync(path, { force: true });
|
|
1665
|
+
removed += 1;
|
|
1666
|
+
}
|
|
1667
|
+
} catch {
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
return removed;
|
|
1671
|
+
}
|
|
1485
1672
|
async function createYaziSession(options) {
|
|
1486
1673
|
const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
|
|
1487
1674
|
if (!binaries.yaziPath) {
|
|
@@ -1496,8 +1683,9 @@ async function createYaziSession(options) {
|
|
|
1496
1683
|
}
|
|
1497
1684
|
const cacheDir = options.cacheDir ?? clioCacheDir();
|
|
1498
1685
|
const sessionId = options.sessionId ?? randomUUID();
|
|
1499
|
-
const sessionsDir =
|
|
1500
|
-
|
|
1686
|
+
const sessionsDir = join3(cacheDir, "yazi", "sessions");
|
|
1687
|
+
mkdirSync(sessionsDir, { recursive: true });
|
|
1688
|
+
sweepStaleTransportFiles(sessionsDir);
|
|
1501
1689
|
const managedProfile = options.profileMode === "managed" ? (options.ensureProfile ?? ensureYaziProfile)({
|
|
1502
1690
|
yaPath: binaries.yaPath,
|
|
1503
1691
|
yaziPath: binaries.yaziPath,
|
|
@@ -1506,33 +1694,50 @@ async function createYaziSession(options) {
|
|
|
1506
1694
|
if (options.profileMode === "managed" && !managedProfile) {
|
|
1507
1695
|
return { status: "profile-error", reason: "Clio could not generate a valid managed Yazi profile" };
|
|
1508
1696
|
}
|
|
1509
|
-
const streamPath =
|
|
1510
|
-
const chooserPath =
|
|
1511
|
-
const cwdPath =
|
|
1697
|
+
const streamPath = join3(sessionsDir, `${sessionId}.stream`);
|
|
1698
|
+
const chooserPath = join3(sessionsDir, `${sessionId}.chooser`);
|
|
1699
|
+
const cwdPath = join3(sessionsDir, `${sessionId}.cwd`);
|
|
1512
1700
|
const token2 = options.mode === "companion" ? options.pickToken ?? randomUUID() : null;
|
|
1513
1701
|
const env = {
|
|
1514
1702
|
...managedProfile ? { YAZI_CONFIG_HOME: managedProfile.dir } : {},
|
|
1515
|
-
...token2 ?
|
|
1703
|
+
...token2 ? namingCompatibilityEnvironment("CLIO_CODER_YAZI_PICK_TOKEN", "CLIO_YAZI_PICK_TOKEN", token2) : {}
|
|
1516
1704
|
};
|
|
1517
1705
|
let argv;
|
|
1518
1706
|
let stdoutPath;
|
|
1519
1707
|
if (options.mode === "companion") {
|
|
1520
|
-
|
|
1521
|
-
argv = [
|
|
1708
|
+
writeFileSync(streamPath, "");
|
|
1709
|
+
argv = [
|
|
1710
|
+
binaries.yaziPath,
|
|
1711
|
+
"--local-events",
|
|
1712
|
+
`cd,${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`,
|
|
1713
|
+
"--remote-events",
|
|
1714
|
+
`${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`
|
|
1715
|
+
];
|
|
1522
1716
|
stdoutPath = streamPath;
|
|
1523
1717
|
} else {
|
|
1524
|
-
|
|
1525
|
-
|
|
1718
|
+
writeFileSync(chooserPath, "");
|
|
1719
|
+
writeFileSync(cwdPath, "");
|
|
1526
1720
|
argv = [binaries.yaziPath, options.cwd, "--chooser-file", chooserPath, "--cwd-file", cwdPath];
|
|
1527
1721
|
}
|
|
1722
|
+
const removeTransportFiles = () => {
|
|
1723
|
+
for (const path of [streamPath, chooserPath, cwdPath]) rmSync(path, { force: true });
|
|
1724
|
+
};
|
|
1528
1725
|
const pane = await options.mux.openUtilityPane({
|
|
1529
1726
|
argv,
|
|
1530
1727
|
cwd: options.cwd,
|
|
1531
|
-
label: "
|
|
1728
|
+
label: "files",
|
|
1729
|
+
title: "files",
|
|
1730
|
+
// The files dock: split down from the anchor at the configured share.
|
|
1731
|
+
// Degrades to a plain split inside the contract when the layout tier is
|
|
1732
|
+
// absent.
|
|
1733
|
+
dock: { slot: "files", ...options.dockShare === void 0 ? {} : { share: options.dockShare } },
|
|
1532
1734
|
...Object.keys(env).length > 0 ? { env } : {},
|
|
1533
1735
|
...stdoutPath ? { stdoutPath } : {}
|
|
1534
1736
|
});
|
|
1535
|
-
if (!pane)
|
|
1737
|
+
if (!pane) {
|
|
1738
|
+
removeTransportFiles();
|
|
1739
|
+
return { status: "unavailable", reason: "the pane host refused to open the files pane" };
|
|
1740
|
+
}
|
|
1536
1741
|
let paneCwd = options.cwd;
|
|
1537
1742
|
let instanceId = null;
|
|
1538
1743
|
let stream = null;
|
|
@@ -1545,6 +1750,7 @@ async function createYaziSession(options) {
|
|
|
1545
1750
|
if (chooserTimer) clearInterval(chooserTimer);
|
|
1546
1751
|
chooserTimer = null;
|
|
1547
1752
|
options.onStopped?.(reason);
|
|
1753
|
+
removeTransportFiles();
|
|
1548
1754
|
};
|
|
1549
1755
|
if (options.mode === "companion") {
|
|
1550
1756
|
stream = createYaziEventStream({
|
|
@@ -1560,7 +1766,9 @@ async function createYaziSession(options) {
|
|
|
1560
1766
|
options.onEvent(event);
|
|
1561
1767
|
}
|
|
1562
1768
|
});
|
|
1563
|
-
void stream.done.then((reason) =>
|
|
1769
|
+
void stream.done.then((reason) => {
|
|
1770
|
+
stop(reason);
|
|
1771
|
+
});
|
|
1564
1772
|
} else {
|
|
1565
1773
|
const pollChooser = () => {
|
|
1566
1774
|
if (stopped || alive()) return;
|
|
@@ -1618,14 +1826,8 @@ export {
|
|
|
1618
1826
|
resolveSocketCandidates,
|
|
1619
1827
|
detectMux,
|
|
1620
1828
|
watchViewerCommand,
|
|
1621
|
-
yaziProfileDir,
|
|
1622
|
-
userYaziConfigDir,
|
|
1623
|
-
resetYaziProfile,
|
|
1624
|
-
inspectCurrentYaziProfile,
|
|
1625
|
-
describeYaziProfile,
|
|
1626
|
-
ensureYaziProfile,
|
|
1627
1829
|
resolveYaziBinaries,
|
|
1628
1830
|
createYaziSession,
|
|
1629
1831
|
createMuxDomainModule
|
|
1630
1832
|
};
|
|
1631
|
-
//# sourceMappingURL=chunk-
|
|
1833
|
+
//# sourceMappingURL=chunk-KKOJXO6R.js.map
|