@iowarp/clio-coder 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +116 -16
- package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
- package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
- package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
- package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
- package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
- package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
- package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
- package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
- package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
- package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
- package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
- package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
- package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
- package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
- package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
- package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
- package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
- package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
- package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
- package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
- package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
- package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
- package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
- package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
- package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
- package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
- package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
- package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
- package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
- package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +36 -36
- package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
- 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-3QZRWZJF.js} +53 -49
- package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
- package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
- package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
- package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
- package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
- package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
- package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
- package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
- package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
- package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
- package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
- package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
- package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
- package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
- package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
- package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
- package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
- package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
- package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
- 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-H7TOM7YL.js} +35 -62
- package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
- package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
- package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
- package/dist/worker/entry.js +57 -52
- package/docs/acp.md +1 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/commands-and-modes.md +9 -3
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +105 -164
- package/docs/environment-variables.md +2 -1
- package/docs/exit-codes-and-output.md +2 -0
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +8 -6
- package/docs/installation-and-lifecycle.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/trace-store.md +15 -10
- package/docs/troubleshooting.md +1 -1
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +5 -15
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -27
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +29 -8
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -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 +8 -5
- 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/reset.ts +1 -1
- package/src/cli/run.ts +11 -15
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/targets.ts +23 -24
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +41 -0
- 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 +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1062 -886
- package/src/core/defaults.ts +321 -528
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/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/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- 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 +48 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capacity-lease.ts +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 +65 -61
- 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/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +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 +6 -5
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +3 -3
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -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 +12 -2
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +20 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +157 -25
- package/src/domains/mux/detect.ts +29 -5
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +20 -0
- package/src/domains/mux/operations.ts +28 -0
- 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/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +26 -3
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +22 -12
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +14 -2
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/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 +39 -13
- 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/finish-contract.ts +2 -1
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/share/archive.ts +85 -36
- package/src/domains/toolchain/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 +27 -26
- 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 +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +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/loop-guard.ts +0 -5
- 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 +14 -13
- package/src/entry/orchestrator.ts +107 -88
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +30 -33
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +2 -44
- package/src/interactive/interactive-application.ts +79 -59
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +2 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +63 -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/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- 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 +339 -293
- 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 +36 -10
- package/src/interactive/permission-overlay.ts +2 -2
- 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 +279 -183
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +11 -11
- 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 +12 -5
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/builtin-tool-catalog.ts +1 -1
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +1 -1
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +12 -10
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
|
@@ -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-J5LZHVIT.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
|
-
|
|
79
|
-
[mode]
|
|
80
|
-
normal_main = { bg = "${tokenHex("accent")}" }
|
|
81
|
-
normal_alt = { fg = "${tokenHex("accent")}" }
|
|
82
|
-
select_main = { bg = "${tokenHex("action")}" }
|
|
83
|
-
select_alt = { fg = "${tokenHex("action")}" }
|
|
84
|
-
unset_main = { bg = "${tokenHex("error")}" }
|
|
85
|
-
unset_alt = { fg = "${tokenHex("error")}" }
|
|
86
35
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
|
205
|
-
}
|
|
206
|
-
function describeYaziProfile(inspection) {
|
|
207
|
-
return `${inspection.dir} (${inspection.state}); user config ${inspection.userConfigDir} is separate and untouched`;
|
|
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;
|
|
208
75
|
}
|
|
209
|
-
function
|
|
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,37 @@ 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 resizeDock(slot, share) {
|
|
553
|
+
if (!docks) return false;
|
|
554
|
+
return await attempt("resizeDock", () => docks.resize(slot, share), false);
|
|
555
|
+
},
|
|
556
|
+
docks() {
|
|
557
|
+
return docks?.states() ?? [];
|
|
558
|
+
},
|
|
542
559
|
async notify(request) {
|
|
543
560
|
if (!muxSupportsMethod(detection.server, "notification.show")) {
|
|
544
561
|
log("debug", `mux notify skipped, server protocol is below the notification.show floor: ${request.title}`);
|
|
@@ -621,15 +638,25 @@ function createMuxRuntime(options) {
|
|
|
621
638
|
subscription?.close();
|
|
622
639
|
subscription = null;
|
|
623
640
|
paneGoneHandlers.clear();
|
|
641
|
+
if (client && docks) {
|
|
642
|
+
for (const paneId of docks.paneIds()) {
|
|
643
|
+
await client.paneClose(paneId).catch(() => void 0);
|
|
644
|
+
registry.forget(paneId);
|
|
645
|
+
}
|
|
646
|
+
docks.clear();
|
|
647
|
+
}
|
|
624
648
|
if (client) await client.close().catch(() => void 0);
|
|
625
649
|
}
|
|
626
650
|
};
|
|
627
651
|
const start = async () => {
|
|
628
652
|
if (detection.mode === "none" || client === null) return;
|
|
629
653
|
try {
|
|
630
|
-
|
|
654
|
+
const kinds = ["pane.closed", "pane.exited"];
|
|
655
|
+
if (docks) kinds.push("pane.moved", "layout.updated");
|
|
656
|
+
subscription = await client.subscribe(kinds, onEvent, {
|
|
631
657
|
onResync: (snapshot) => {
|
|
632
658
|
const dropped = registry.reconcile(snapshot.panes.map((pane) => pane.paneId));
|
|
659
|
+
for (const record2 of dropped) docks?.notePaneGone(record2.ref.paneId);
|
|
633
660
|
if (dropped.length > 0) {
|
|
634
661
|
log("info", `mux reconciled ${dropped.length} pane(s) closed while the socket was down`);
|
|
635
662
|
}
|
|
@@ -644,8 +671,8 @@ function createMuxRuntime(options) {
|
|
|
644
671
|
|
|
645
672
|
// src/domains/mux/detect.ts
|
|
646
673
|
init_esm_shims();
|
|
647
|
-
import { homedir
|
|
648
|
-
import { join
|
|
674
|
+
import { homedir } from "node:os";
|
|
675
|
+
import { join } from "node:path";
|
|
649
676
|
|
|
650
677
|
// src/domains/mux/socket-client.ts
|
|
651
678
|
init_esm_shims();
|
|
@@ -817,21 +844,118 @@ function readSnapshot(value) {
|
|
|
817
844
|
tabs: readArray(source, "tabs").map(readTab)
|
|
818
845
|
};
|
|
819
846
|
}
|
|
820
|
-
|
|
847
|
+
function requireNumber(source, key, context) {
|
|
848
|
+
const value = source[key];
|
|
849
|
+
if (typeof value !== "number") {
|
|
850
|
+
throw new MuxError("protocol", `mux ${context} response is missing number field ${key}`);
|
|
851
|
+
}
|
|
852
|
+
return value;
|
|
853
|
+
}
|
|
854
|
+
function readRect(value, context) {
|
|
855
|
+
const source = asRecord(value);
|
|
856
|
+
if (!source) throw new MuxError("protocol", `mux ${context} rect is not an object`);
|
|
857
|
+
return {
|
|
858
|
+
x: requireNumber(source, "x", context),
|
|
859
|
+
y: requireNumber(source, "y", context),
|
|
860
|
+
width: requireNumber(source, "width", context),
|
|
861
|
+
height: requireNumber(source, "height", context)
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
function readSplitDirection(value, context) {
|
|
865
|
+
if (value === "right" || value === "down") return value;
|
|
866
|
+
throw new MuxError("protocol", `mux ${context} split direction is not right/down`);
|
|
867
|
+
}
|
|
868
|
+
function readTabGeometry(value) {
|
|
869
|
+
const source = asRecord(value);
|
|
870
|
+
if (!source) throw new MuxError("protocol", "mux layout snapshot is not an object");
|
|
871
|
+
return {
|
|
872
|
+
workspaceId: requireString(source, "workspace_id", "layout"),
|
|
873
|
+
tabId: requireString(source, "tab_id", "layout"),
|
|
874
|
+
zoomed: source.zoomed === true,
|
|
875
|
+
area: readRect(source.area, "layout"),
|
|
876
|
+
focusedPaneId: optionalString(source, "focused_pane_id"),
|
|
877
|
+
panes: readArray(source, "panes").map((entry) => {
|
|
878
|
+
const pane = asRecord(entry);
|
|
879
|
+
if (!pane) throw new MuxError("protocol", "mux layout pane entry is not an object");
|
|
880
|
+
return {
|
|
881
|
+
paneId: requireString(pane, "pane_id", "layout pane"),
|
|
882
|
+
focused: pane.focused === true,
|
|
883
|
+
rect: readRect(pane.rect, "layout pane")
|
|
884
|
+
};
|
|
885
|
+
}),
|
|
886
|
+
splits: readArray(source, "splits").map((entry) => {
|
|
887
|
+
const split = asRecord(entry);
|
|
888
|
+
if (!split) throw new MuxError("protocol", "mux layout split entry is not an object");
|
|
889
|
+
return {
|
|
890
|
+
direction: readSplitDirection(split.direction, "layout"),
|
|
891
|
+
ratio: requireNumber(split, "ratio", "layout split"),
|
|
892
|
+
rect: readRect(split.rect, "layout split")
|
|
893
|
+
};
|
|
894
|
+
})
|
|
895
|
+
};
|
|
896
|
+
}
|
|
897
|
+
function readLayoutNode(value) {
|
|
898
|
+
const source = asRecord(value);
|
|
899
|
+
if (!source) throw new MuxError("protocol", "mux layout node is not an object");
|
|
900
|
+
if (source.type === "pane") {
|
|
901
|
+
return { type: "pane", paneId: optionalString(source, "pane_id"), label: optionalString(source, "label") };
|
|
902
|
+
}
|
|
903
|
+
if (source.type === "split") {
|
|
904
|
+
return {
|
|
905
|
+
type: "split",
|
|
906
|
+
direction: readSplitDirection(source.direction, "layout tree"),
|
|
907
|
+
ratio: requireNumber(source, "ratio", "layout tree split"),
|
|
908
|
+
first: readLayoutNode(source.first),
|
|
909
|
+
second: readLayoutNode(source.second)
|
|
910
|
+
};
|
|
911
|
+
}
|
|
912
|
+
throw new MuxError("protocol", "mux layout node has an unknown type");
|
|
913
|
+
}
|
|
914
|
+
function readLayoutTree(value) {
|
|
915
|
+
const source = asRecord(value);
|
|
916
|
+
if (!source) throw new MuxError("protocol", "mux layout tree is not an object");
|
|
917
|
+
return {
|
|
918
|
+
workspaceId: requireString(source, "workspace_id", "layout tree"),
|
|
919
|
+
tabId: requireString(source, "tab_id", "layout tree"),
|
|
920
|
+
zoomed: source.zoomed === true,
|
|
921
|
+
focusedPaneId: optionalString(source, "focused_pane_id"),
|
|
922
|
+
root: readLayoutNode(source.root)
|
|
923
|
+
};
|
|
924
|
+
}
|
|
925
|
+
var PANE_LEAVE_KIND_BY_WIRE = {
|
|
821
926
|
pane_closed: "pane.closed",
|
|
822
927
|
pane_exited: "pane.exited"
|
|
823
928
|
};
|
|
824
929
|
function readEvent(line) {
|
|
825
930
|
const wireKind = line.event;
|
|
826
931
|
if (typeof wireKind !== "string") return null;
|
|
827
|
-
const kind = EVENT_KIND_BY_WIRE[wireKind];
|
|
828
|
-
if (!kind) return null;
|
|
829
932
|
const data = asRecord(line.data);
|
|
830
933
|
if (!data) return null;
|
|
831
|
-
const
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
934
|
+
const leaveKind = PANE_LEAVE_KIND_BY_WIRE[wireKind];
|
|
935
|
+
if (leaveKind) {
|
|
936
|
+
const paneId = data.pane_id;
|
|
937
|
+
const workspaceId = data.workspace_id;
|
|
938
|
+
if (typeof paneId !== "string" || typeof workspaceId !== "string") return null;
|
|
939
|
+
return { kind: leaveKind, paneId, workspaceId };
|
|
940
|
+
}
|
|
941
|
+
if (wireKind === "pane_moved") {
|
|
942
|
+
const pane = asRecord(data.pane);
|
|
943
|
+
const previousPaneId = data.previous_pane_id;
|
|
944
|
+
if (!pane || typeof previousPaneId !== "string") return null;
|
|
945
|
+
const paneId = pane.pane_id;
|
|
946
|
+
const tabId = pane.tab_id;
|
|
947
|
+
const workspaceId = pane.workspace_id;
|
|
948
|
+
if (typeof paneId !== "string" || typeof tabId !== "string" || typeof workspaceId !== "string") return null;
|
|
949
|
+
return { kind: "pane.moved", paneId, previousPaneId, tabId, workspaceId };
|
|
950
|
+
}
|
|
951
|
+
if (wireKind === "layout_updated") {
|
|
952
|
+
try {
|
|
953
|
+
return { kind: "layout.updated", geometry: readTabGeometry(data.layout) };
|
|
954
|
+
} catch {
|
|
955
|
+
return null;
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
return null;
|
|
835
959
|
}
|
|
836
960
|
function params(entries) {
|
|
837
961
|
const out = {};
|
|
@@ -1065,15 +1189,27 @@ function createMuxClient(options) {
|
|
|
1065
1189
|
},
|
|
1066
1190
|
async paneLayout(paneId) {
|
|
1067
1191
|
const result = await callObject("pane.layout", params({ pane_id: paneId }));
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1192
|
+
return readTabGeometry(result.layout);
|
|
1193
|
+
},
|
|
1194
|
+
async paneFocus(paneId) {
|
|
1195
|
+
await call("pane.focus", { pane_id: paneId });
|
|
1196
|
+
},
|
|
1197
|
+
async paneZoom(paneId, mode) {
|
|
1198
|
+
const result = await callObject("pane.zoom", { pane_id: paneId, mode });
|
|
1199
|
+
const zoom = asRecord(result.zoom);
|
|
1200
|
+
if (!zoom) throw new MuxError("protocol", "mux pane.zoom returned no zoom result");
|
|
1201
|
+
return { changed: zoom.changed === true, focusChanged: zoom.focus_changed === true };
|
|
1202
|
+
},
|
|
1203
|
+
async layoutExport(request = {}) {
|
|
1204
|
+
const result = await callObject("layout.export", params({ tab_id: request.tabId, pane_id: request.paneId }));
|
|
1205
|
+
return readLayoutTree(result.layout);
|
|
1206
|
+
},
|
|
1207
|
+
async layoutSetSplitRatio(request) {
|
|
1208
|
+
const result = await callObject(
|
|
1209
|
+
"layout.set_split_ratio",
|
|
1210
|
+
params({ tab_id: request.tabId, pane_id: request.paneId, path: [...request.path], ratio: request.ratio })
|
|
1211
|
+
);
|
|
1212
|
+
return readLayoutTree(result.layout);
|
|
1077
1213
|
},
|
|
1078
1214
|
async worktreeList(request = {}) {
|
|
1079
1215
|
const result = await callObject("worktree.list", params({ workspace_id: request.workspaceId, cwd: request.cwd }));
|
|
@@ -1186,9 +1322,9 @@ function createMuxClient(options) {
|
|
|
1186
1322
|
var PING_TIMEOUT_MS = 1e3;
|
|
1187
1323
|
function herdrConfigDir(env) {
|
|
1188
1324
|
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
|
|
1325
|
+
if (typeof xdg === "string" && xdg.length > 0) return join(xdg, "herdr");
|
|
1326
|
+
const home = typeof env.HOME === "string" && env.HOME.length > 0 ? env.HOME : homedir();
|
|
1327
|
+
return join(home, ".config", "herdr");
|
|
1192
1328
|
}
|
|
1193
1329
|
function resolveSocketCandidates(env) {
|
|
1194
1330
|
const candidates = [];
|
|
@@ -1197,9 +1333,9 @@ function resolveSocketCandidates(env) {
|
|
|
1197
1333
|
const configDir = herdrConfigDir(env);
|
|
1198
1334
|
const session = env.HERDR_SESSION;
|
|
1199
1335
|
if (typeof session === "string" && session.length > 0) {
|
|
1200
|
-
candidates.push(
|
|
1336
|
+
candidates.push(join(configDir, "sessions", session, "herdr.sock"));
|
|
1201
1337
|
}
|
|
1202
|
-
candidates.push(
|
|
1338
|
+
candidates.push(join(configDir, "herdr.sock"));
|
|
1203
1339
|
return [...new Set(candidates)];
|
|
1204
1340
|
}
|
|
1205
1341
|
function readSelfLocation(env) {
|
|
@@ -1213,14 +1349,15 @@ function readSelfLocation(env) {
|
|
|
1213
1349
|
paneId: read("HERDR_PANE_ID")
|
|
1214
1350
|
};
|
|
1215
1351
|
}
|
|
1216
|
-
function none(reason, candidates = []) {
|
|
1352
|
+
function none(reason, candidates = [], refused = false) {
|
|
1217
1353
|
return {
|
|
1218
1354
|
mode: "none",
|
|
1219
1355
|
socketPath: null,
|
|
1220
1356
|
server: null,
|
|
1221
1357
|
self: { workspaceId: null, tabId: null, paneId: null },
|
|
1222
1358
|
candidates,
|
|
1223
|
-
reason
|
|
1359
|
+
reason,
|
|
1360
|
+
refused
|
|
1224
1361
|
};
|
|
1225
1362
|
}
|
|
1226
1363
|
async function detectMux(options = {}) {
|
|
@@ -1231,7 +1368,14 @@ async function detectMux(options = {}) {
|
|
|
1231
1368
|
return { detection: none("panes are turned off"), client: null };
|
|
1232
1369
|
}
|
|
1233
1370
|
if (enabled === "embedded") {
|
|
1234
|
-
return {
|
|
1371
|
+
return {
|
|
1372
|
+
detection: none(
|
|
1373
|
+
"embedded mode is not implemented yet; it ships in phase 5, so this session has no panes at all. Set panes.enabled=auto for guest mode inside a herdr session.",
|
|
1374
|
+
[],
|
|
1375
|
+
true
|
|
1376
|
+
),
|
|
1377
|
+
client: null
|
|
1378
|
+
};
|
|
1235
1379
|
}
|
|
1236
1380
|
if (env.HERDR_ENV !== "1") {
|
|
1237
1381
|
return { detection: none("HERDR_ENV is not 1, so Clio is not running inside a pane host"), client: null };
|
|
@@ -1250,7 +1394,8 @@ async function detectMux(options = {}) {
|
|
|
1250
1394
|
server,
|
|
1251
1395
|
self: readSelfLocation(env),
|
|
1252
1396
|
candidates,
|
|
1253
|
-
reason: `guest mode on ${socketPath} (herdr ${server.version}, protocol ${server.protocol})
|
|
1397
|
+
reason: `guest mode on ${socketPath} (herdr ${server.version}, protocol ${server.protocol})`,
|
|
1398
|
+
refused: false
|
|
1254
1399
|
},
|
|
1255
1400
|
client
|
|
1256
1401
|
};
|
|
@@ -1276,7 +1421,10 @@ async function createMuxBundle(_context, options = {}) {
|
|
|
1276
1421
|
...options.env ? { env: options.env } : {},
|
|
1277
1422
|
log
|
|
1278
1423
|
});
|
|
1279
|
-
log(
|
|
1424
|
+
log(
|
|
1425
|
+
detection.refused ? "warning" : detection.mode === "none" ? "debug" : "info",
|
|
1426
|
+
detection.refused ? `panes refused: ${detection.reason}` : `mux mode ${detection.mode}: ${detection.reason}`
|
|
1427
|
+
);
|
|
1280
1428
|
const runtime = createMuxRuntime({ detection, client, log });
|
|
1281
1429
|
const extension = {
|
|
1282
1430
|
async start() {
|
|
@@ -1298,9 +1446,9 @@ var MuxManifest = {
|
|
|
1298
1446
|
|
|
1299
1447
|
// src/domains/mux/viewer-command.ts
|
|
1300
1448
|
init_esm_shims();
|
|
1301
|
-
import { join as
|
|
1449
|
+
import { join as join2 } from "node:path";
|
|
1302
1450
|
function clioCliEntryPath() {
|
|
1303
|
-
return
|
|
1451
|
+
return join2(resolvePackageRoot(), "dist/cli/index.js");
|
|
1304
1452
|
}
|
|
1305
1453
|
function watchViewerCommand(selectionPath, options = {}) {
|
|
1306
1454
|
const layout = options.dirs === void 0 ? [] : [
|
|
@@ -1326,10 +1474,12 @@ function watchViewerCommand(selectionPath, options = {}) {
|
|
|
1326
1474
|
|
|
1327
1475
|
// src/domains/mux/yazi/event-stream.ts
|
|
1328
1476
|
init_esm_shims();
|
|
1329
|
-
import { closeSync, openSync, readSync, statSync
|
|
1477
|
+
import { closeSync, openSync, readSync, statSync } from "node:fs";
|
|
1330
1478
|
import { StringDecoder } from "node:string_decoder";
|
|
1331
1479
|
var YAZI_STREAM_POLL_MS = 250;
|
|
1332
1480
|
var YAZI_STREAM_MAX_BYTES = 1024 * 1024;
|
|
1481
|
+
var YAZI_PICK_EVENT = "clio-coder-pick";
|
|
1482
|
+
var LEGACY_YAZI_PICK_EVENT = "clio-pick";
|
|
1333
1483
|
function record(value) {
|
|
1334
1484
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
1335
1485
|
}
|
|
@@ -1339,7 +1489,7 @@ function parseYaziEventLine(line) {
|
|
|
1339
1489
|
const third = second < 0 ? -1 : line.indexOf(",", second + 1);
|
|
1340
1490
|
if (first <= 0 || second <= first + 1 || third <= second + 1) return null;
|
|
1341
1491
|
const kind = line.slice(0, first);
|
|
1342
|
-
if (kind !== "cd" && kind !==
|
|
1492
|
+
if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) return null;
|
|
1343
1493
|
const receiver = line.slice(first + 1, second);
|
|
1344
1494
|
const sender = line.slice(second + 1, third);
|
|
1345
1495
|
try {
|
|
@@ -1351,7 +1501,7 @@ function parseYaziEventLine(line) {
|
|
|
1351
1501
|
return { kind, receiver, sender, tab: String(tab), cwd: body.url };
|
|
1352
1502
|
}
|
|
1353
1503
|
if (!Array.isArray(body) || !body.every((value) => typeof value === "string")) return null;
|
|
1354
|
-
return { kind, receiver, sender, values: body };
|
|
1504
|
+
return { kind: YAZI_PICK_EVENT, receiver, sender, values: body };
|
|
1355
1505
|
} catch {
|
|
1356
1506
|
return null;
|
|
1357
1507
|
}
|
|
@@ -1395,7 +1545,7 @@ function createYaziEventStream(options) {
|
|
|
1395
1545
|
stop("pane-gone");
|
|
1396
1546
|
return;
|
|
1397
1547
|
}
|
|
1398
|
-
const stat =
|
|
1548
|
+
const stat = statSync(options.path, { throwIfNoEntry: false });
|
|
1399
1549
|
if (!stat?.isFile()) {
|
|
1400
1550
|
stop("file-missing");
|
|
1401
1551
|
return;
|
|
@@ -1427,7 +1577,7 @@ function createYaziEventStream(options) {
|
|
|
1427
1577
|
const line = raw.endsWith("\r") ? raw.slice(0, -1) : raw;
|
|
1428
1578
|
if (line.length === 0) continue;
|
|
1429
1579
|
const kind = line.slice(0, line.indexOf(","));
|
|
1430
|
-
if (kind !== "cd" && kind !==
|
|
1580
|
+
if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) continue;
|
|
1431
1581
|
const event = parseYaziEventLine(line);
|
|
1432
1582
|
if (!event) {
|
|
1433
1583
|
state.malformedLines += 1;
|
|
@@ -1457,8 +1607,8 @@ function createYaziEventStream(options) {
|
|
|
1457
1607
|
init_esm_shims();
|
|
1458
1608
|
import { spawn } from "node:child_process";
|
|
1459
1609
|
import { randomUUID } from "node:crypto";
|
|
1460
|
-
import { mkdirSync
|
|
1461
|
-
import { join as
|
|
1610
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
1611
|
+
import { join as join3 } from "node:path";
|
|
1462
1612
|
function resolveYaziBinaries() {
|
|
1463
1613
|
const entry = findPinnedTool("yazi");
|
|
1464
1614
|
const status = entry ? toolStatus(entry) : null;
|
|
@@ -1477,7 +1627,7 @@ function runYa(file, args, env) {
|
|
|
1477
1627
|
}
|
|
1478
1628
|
function readOptional(path) {
|
|
1479
1629
|
try {
|
|
1480
|
-
return
|
|
1630
|
+
return readFileSync(path, "utf8");
|
|
1481
1631
|
} catch {
|
|
1482
1632
|
return "";
|
|
1483
1633
|
}
|
|
@@ -1496,8 +1646,8 @@ async function createYaziSession(options) {
|
|
|
1496
1646
|
}
|
|
1497
1647
|
const cacheDir = options.cacheDir ?? clioCacheDir();
|
|
1498
1648
|
const sessionId = options.sessionId ?? randomUUID();
|
|
1499
|
-
const sessionsDir =
|
|
1500
|
-
|
|
1649
|
+
const sessionsDir = join3(cacheDir, "yazi", "sessions");
|
|
1650
|
+
mkdirSync(sessionsDir, { recursive: true });
|
|
1501
1651
|
const managedProfile = options.profileMode === "managed" ? (options.ensureProfile ?? ensureYaziProfile)({
|
|
1502
1652
|
yaPath: binaries.yaPath,
|
|
1503
1653
|
yaziPath: binaries.yaziPath,
|
|
@@ -1506,29 +1656,39 @@ async function createYaziSession(options) {
|
|
|
1506
1656
|
if (options.profileMode === "managed" && !managedProfile) {
|
|
1507
1657
|
return { status: "profile-error", reason: "Clio could not generate a valid managed Yazi profile" };
|
|
1508
1658
|
}
|
|
1509
|
-
const streamPath =
|
|
1510
|
-
const chooserPath =
|
|
1511
|
-
const cwdPath =
|
|
1659
|
+
const streamPath = join3(sessionsDir, `${sessionId}.stream`);
|
|
1660
|
+
const chooserPath = join3(sessionsDir, `${sessionId}.chooser`);
|
|
1661
|
+
const cwdPath = join3(sessionsDir, `${sessionId}.cwd`);
|
|
1512
1662
|
const token2 = options.mode === "companion" ? options.pickToken ?? randomUUID() : null;
|
|
1513
1663
|
const env = {
|
|
1514
1664
|
...managedProfile ? { YAZI_CONFIG_HOME: managedProfile.dir } : {},
|
|
1515
|
-
...token2 ?
|
|
1665
|
+
...token2 ? namingCompatibilityEnvironment("CLIO_CODER_YAZI_PICK_TOKEN", "CLIO_YAZI_PICK_TOKEN", token2) : {}
|
|
1516
1666
|
};
|
|
1517
1667
|
let argv;
|
|
1518
1668
|
let stdoutPath;
|
|
1519
1669
|
if (options.mode === "companion") {
|
|
1520
|
-
|
|
1521
|
-
argv = [
|
|
1670
|
+
writeFileSync(streamPath, "");
|
|
1671
|
+
argv = [
|
|
1672
|
+
binaries.yaziPath,
|
|
1673
|
+
"--local-events",
|
|
1674
|
+
`cd,${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`,
|
|
1675
|
+
"--remote-events",
|
|
1676
|
+
`${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`
|
|
1677
|
+
];
|
|
1522
1678
|
stdoutPath = streamPath;
|
|
1523
1679
|
} else {
|
|
1524
|
-
|
|
1525
|
-
|
|
1680
|
+
writeFileSync(chooserPath, "");
|
|
1681
|
+
writeFileSync(cwdPath, "");
|
|
1526
1682
|
argv = [binaries.yaziPath, options.cwd, "--chooser-file", chooserPath, "--cwd-file", cwdPath];
|
|
1527
1683
|
}
|
|
1528
1684
|
const pane = await options.mux.openUtilityPane({
|
|
1529
1685
|
argv,
|
|
1530
1686
|
cwd: options.cwd,
|
|
1531
1687
|
label: "yazi",
|
|
1688
|
+
// The files dock: split down from the anchor at the configured share.
|
|
1689
|
+
// Degrades to a plain split inside the contract when the layout tier is
|
|
1690
|
+
// absent.
|
|
1691
|
+
dock: { slot: "files", ...options.dockShare === void 0 ? {} : { share: options.dockShare } },
|
|
1532
1692
|
...Object.keys(env).length > 0 ? { env } : {},
|
|
1533
1693
|
...stdoutPath ? { stdoutPath } : {}
|
|
1534
1694
|
});
|
|
@@ -1618,14 +1778,8 @@ export {
|
|
|
1618
1778
|
resolveSocketCandidates,
|
|
1619
1779
|
detectMux,
|
|
1620
1780
|
watchViewerCommand,
|
|
1621
|
-
yaziProfileDir,
|
|
1622
|
-
userYaziConfigDir,
|
|
1623
|
-
resetYaziProfile,
|
|
1624
|
-
inspectCurrentYaziProfile,
|
|
1625
|
-
describeYaziProfile,
|
|
1626
|
-
ensureYaziProfile,
|
|
1627
1781
|
resolveYaziBinaries,
|
|
1628
1782
|
createYaziSession,
|
|
1629
1783
|
createMuxDomainModule
|
|
1630
1784
|
};
|
|
1631
|
-
//# sourceMappingURL=chunk-
|
|
1785
|
+
//# sourceMappingURL=chunk-K6BF4U2H.js.map
|