@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
|
@@ -9,8 +9,11 @@
|
|
|
9
9
|
* call.
|
|
10
10
|
*
|
|
11
11
|
* Embedded mode resolves to `none` until Phase 5 lands the session bootstrap.
|
|
12
|
-
* Asking for it is not an error
|
|
13
|
-
*
|
|
12
|
+
* Asking for it is not an error, but it is a refusal rather than a quiet
|
|
13
|
+
* degrade: the detection carries `refused: true`, the boot prints the reason on
|
|
14
|
+
* stderr, and doctor's mode row warns. A session that asked for panes and got
|
|
15
|
+
* none should never have to guess why, and `embedded` costs guest mode too, so
|
|
16
|
+
* the reason names `auto` as the rung that works today.
|
|
14
17
|
*/
|
|
15
18
|
|
|
16
19
|
import { homedir } from "node:os";
|
|
@@ -32,6 +35,15 @@ export interface MuxDetection {
|
|
|
32
35
|
candidates: ReadonlyArray<string>;
|
|
33
36
|
/** Human-readable reason, always set; for `guest` it names the socket that answered. */
|
|
34
37
|
reason: string;
|
|
38
|
+
/**
|
|
39
|
+
* True when the operator asked for a rung Clio cannot provide, as opposed to
|
|
40
|
+
* asking for panes on a machine that has no pane host. The two are both
|
|
41
|
+
* `none` and neither is an error, but only the first is a promise Clio broke:
|
|
42
|
+
* nothing about the environment would change the answer, and the operator has
|
|
43
|
+
* to be told, because they configured a mode and got no panes. Callers raise
|
|
44
|
+
* a refusal to a visible level; an ordinary `none` stays at debug.
|
|
45
|
+
*/
|
|
46
|
+
refused: boolean;
|
|
35
47
|
}
|
|
36
48
|
|
|
37
49
|
export interface DetectMuxOptions {
|
|
@@ -83,7 +95,7 @@ function readSelfLocation(env: NodeJS.ProcessEnv): MuxSelfLocation {
|
|
|
83
95
|
};
|
|
84
96
|
}
|
|
85
97
|
|
|
86
|
-
function none(reason: string, candidates: ReadonlyArray<string> = []): MuxDetection {
|
|
98
|
+
function none(reason: string, candidates: ReadonlyArray<string> = [], refused = false): MuxDetection {
|
|
87
99
|
return {
|
|
88
100
|
mode: "none",
|
|
89
101
|
socketPath: null,
|
|
@@ -91,6 +103,7 @@ function none(reason: string, candidates: ReadonlyArray<string> = []): MuxDetect
|
|
|
91
103
|
self: { workspaceId: null, tabId: null, paneId: null },
|
|
92
104
|
candidates,
|
|
93
105
|
reason,
|
|
106
|
+
refused,
|
|
94
107
|
};
|
|
95
108
|
}
|
|
96
109
|
|
|
@@ -114,8 +127,18 @@ export async function detectMux(options: DetectMuxOptions = {}): Promise<MuxDete
|
|
|
114
127
|
}
|
|
115
128
|
if (enabled === "embedded") {
|
|
116
129
|
// Phase 5 owns the session bootstrap. Until then the honest answer is that
|
|
117
|
-
// Clio cannot provide panes, not that it failed to find them
|
|
118
|
-
|
|
130
|
+
// Clio cannot provide panes, not that it failed to find them, and the
|
|
131
|
+
// operator hears it: this degrade is marked a refusal so the boot says so
|
|
132
|
+
// out loud rather than logging a debug line nobody reads. The reason also
|
|
133
|
+
// names the rung that does work, because `embedded` costs guest mode too.
|
|
134
|
+
return {
|
|
135
|
+
detection: none(
|
|
136
|
+
"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.",
|
|
137
|
+
[],
|
|
138
|
+
true,
|
|
139
|
+
),
|
|
140
|
+
client: null,
|
|
141
|
+
};
|
|
119
142
|
}
|
|
120
143
|
if (env.HERDR_ENV !== "1") {
|
|
121
144
|
return { detection: none("HERDR_ENV is not 1, so Clio is not running inside a pane host"), client: null };
|
|
@@ -137,6 +160,7 @@ export async function detectMux(options: DetectMuxOptions = {}): Promise<MuxDete
|
|
|
137
160
|
self: readSelfLocation(env),
|
|
138
161
|
candidates,
|
|
139
162
|
reason: `guest mode on ${socketPath} (herdr ${server.version}, protocol ${server.protocol})`,
|
|
163
|
+
refused: false,
|
|
140
164
|
},
|
|
141
165
|
client,
|
|
142
166
|
};
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dock geometry and lifecycle: the managed tier of Clio-owned panes.
|
|
3
|
+
*
|
|
4
|
+
* A dock is a pane in a fixed position relative to Clio's anchor pane with a
|
|
5
|
+
* target share of the anchor's axis, a minimum size in cells, and a managed
|
|
6
|
+
* lifecycle. Two slots exist: `workers` to the right of the anchor and
|
|
7
|
+
* `files` below it. Ad-hoc utility panes are not docks and are never touched
|
|
8
|
+
* here.
|
|
9
|
+
*
|
|
10
|
+
* The controller owns geometry only. Ownership stays in the pane registry,
|
|
11
|
+
* error swallowing stays in the contract's `attempt` wrapper: every method
|
|
12
|
+
* here that talks to the socket may throw a `MuxError`, and the contract is
|
|
13
|
+
* the layer that turns that into a null/false answer.
|
|
14
|
+
*
|
|
15
|
+
* Three rules run through the reconciliation logic:
|
|
16
|
+
*
|
|
17
|
+
* 1. A user action is a decision. A resize observed via `layout.updated`
|
|
18
|
+
* that does not match what Clio last applied becomes the new target; a
|
|
19
|
+
* closed dock stays closed; a moved dock is followed to its new id.
|
|
20
|
+
* 2. Clio's own corrections must not read as user actions. Every applied
|
|
21
|
+
* share is remembered and an observation matching it (or the target)
|
|
22
|
+
* within {@link SHARE_EPSILON} is a no-op.
|
|
23
|
+
* 3. Opening never steals focus. Focus and zoom live on the contract and
|
|
24
|
+
* only ever run on explicit request.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
import type { MuxClient } from "./socket-client.js";
|
|
28
|
+
import type { MuxLayoutNode, MuxLog, MuxPaneRef, MuxRect, MuxTabGeometry } from "./types.js";
|
|
29
|
+
|
|
30
|
+
/** The two managed dock positions. */
|
|
31
|
+
export type DockSlot = "workers" | "files";
|
|
32
|
+
|
|
33
|
+
export interface DockSpec {
|
|
34
|
+
slot: DockSlot;
|
|
35
|
+
direction: "right" | "down";
|
|
36
|
+
/** Default share of the anchor's axis the dock takes when none is configured. */
|
|
37
|
+
defaultShare: number;
|
|
38
|
+
/** Floor in cells (columns for `right`, rows for `down`) below which a dock is useless. */
|
|
39
|
+
minCells: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Fixed per slot rather than heuristic: the workers viewer wants columns, the
|
|
44
|
+
* file pane wants rows, and a dock that wanders per terminal width would make
|
|
45
|
+
* the layout feel like weather.
|
|
46
|
+
*/
|
|
47
|
+
export const DOCK_SPECS: Readonly<Record<DockSlot, DockSpec>> = {
|
|
48
|
+
workers: { slot: "workers", direction: "right", defaultShare: 0.34, minCells: 48 },
|
|
49
|
+
files: { slot: "files", direction: "down", defaultShare: 0.3, minCells: 12 },
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/** A dock may never take more than half the axis, whatever the share asks. */
|
|
53
|
+
export const DOCK_MAX_SHARE = 0.5;
|
|
54
|
+
/** Observed-vs-applied share differences below this are rounding, not a user drag. */
|
|
55
|
+
export const SHARE_EPSILON = 0.02;
|
|
56
|
+
|
|
57
|
+
export interface DockState {
|
|
58
|
+
slot: DockSlot;
|
|
59
|
+
paneId: string;
|
|
60
|
+
tabId: string;
|
|
61
|
+
/** Share of the axis the dock should hold; user resizes overwrite it. */
|
|
62
|
+
targetShare: number;
|
|
63
|
+
/** What Clio last set, so its own correction is not adopted as a user drag. */
|
|
64
|
+
lastAppliedShare: number;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Wire ratio for a split where the dock is the `second` child: the anchor keeps the rest. */
|
|
68
|
+
export function ratioForDockShare(share: number): number {
|
|
69
|
+
return 1 - share;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Clamps a requested share into (0, DOCK_MAX_SHARE]. */
|
|
73
|
+
export function clampDockShare(share: number): number {
|
|
74
|
+
if (!Number.isFinite(share) || share <= 0) return DOCK_SPECS.workers.defaultShare;
|
|
75
|
+
return Math.min(DOCK_MAX_SHARE, share);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** The axis length in cells a spec's direction measures on a rect. */
|
|
79
|
+
function axisCells(rect: { width: number; height: number }, spec: DockSpec): number {
|
|
80
|
+
return spec.direction === "right" ? rect.width : rect.height;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Boolean path from the root to the split separating `anchorPaneId` from
|
|
85
|
+
* `dockPaneId`, plus which side the dock sits on. Null when the tree does not
|
|
86
|
+
* hold such a split, which is how a stale path is detected after user moves.
|
|
87
|
+
*/
|
|
88
|
+
export function deriveSplitPath(
|
|
89
|
+
root: MuxLayoutNode,
|
|
90
|
+
anchorPaneId: string,
|
|
91
|
+
dockPaneId: string,
|
|
92
|
+
): { path: ReadonlyArray<boolean>; dockIsSecond: boolean; direction: "right" | "down" } | null {
|
|
93
|
+
const contains = (node: MuxLayoutNode, paneId: string): boolean => {
|
|
94
|
+
if (node.type === "pane") return node.paneId === paneId;
|
|
95
|
+
return contains(node.first, paneId) || contains(node.second, paneId);
|
|
96
|
+
};
|
|
97
|
+
const walk = (
|
|
98
|
+
node: MuxLayoutNode,
|
|
99
|
+
path: boolean[],
|
|
100
|
+
): { path: boolean[]; dockIsSecond: boolean; direction: "right" | "down" } | null => {
|
|
101
|
+
if (node.type !== "split") return null;
|
|
102
|
+
const dockFirst = contains(node.first, dockPaneId);
|
|
103
|
+
const dockSecond = contains(node.second, dockPaneId);
|
|
104
|
+
const anchorFirst = contains(node.first, anchorPaneId);
|
|
105
|
+
const anchorSecond = contains(node.second, anchorPaneId);
|
|
106
|
+
if (dockFirst && anchorSecond) return { path, dockIsSecond: false, direction: node.direction };
|
|
107
|
+
if (dockSecond && anchorFirst) return { path, dockIsSecond: true, direction: node.direction };
|
|
108
|
+
if (dockFirst && anchorFirst) return walk(node.first, [...path, false]);
|
|
109
|
+
if (dockSecond && anchorSecond) return walk(node.second, [...path, true]);
|
|
110
|
+
return null;
|
|
111
|
+
};
|
|
112
|
+
return walk(root, []);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Whether `outer` contains `inner`, cell-inclusive. */
|
|
116
|
+
function containsRect(outer: MuxRect, inner: MuxRect): boolean {
|
|
117
|
+
return (
|
|
118
|
+
outer.x <= inner.x &&
|
|
119
|
+
outer.y <= inner.y &&
|
|
120
|
+
outer.x + outer.width >= inner.x + inner.width &&
|
|
121
|
+
outer.y + outer.height >= inner.y + inner.height
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The dock side's observed share at the split separating it from the anchor,
|
|
127
|
+
* from live geometry. The separating split is the smallest split rect holding
|
|
128
|
+
* both panes: split rects nest, so that is their lowest common ancestor. Its
|
|
129
|
+
* live ratio is read directly rather than summing pane cells, because the
|
|
130
|
+
* anchor's rect stops standing for its whole side the moment the user splits
|
|
131
|
+
* it for something else, and a cell sum then misreads an untouched dock as a
|
|
132
|
+
* resize. A separating split on the wrong axis measures nothing.
|
|
133
|
+
*/
|
|
134
|
+
export function observedDockShare(
|
|
135
|
+
geometry: MuxTabGeometry,
|
|
136
|
+
spec: DockSpec,
|
|
137
|
+
anchorPaneId: string,
|
|
138
|
+
dockPaneId: string,
|
|
139
|
+
): number | null {
|
|
140
|
+
const anchor = geometry.panes.find((pane) => pane.paneId === anchorPaneId);
|
|
141
|
+
const dock = geometry.panes.find((pane) => pane.paneId === dockPaneId);
|
|
142
|
+
if (!anchor || !dock) return null;
|
|
143
|
+
let separating: MuxTabGeometry["splits"][number] | null = null;
|
|
144
|
+
for (const split of geometry.splits) {
|
|
145
|
+
if (!containsRect(split.rect, anchor.rect) || !containsRect(split.rect, dock.rect)) continue;
|
|
146
|
+
if (!separating || split.rect.width * split.rect.height < separating.rect.width * separating.rect.height) {
|
|
147
|
+
separating = split;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (!separating || separating.direction !== spec.direction) return null;
|
|
151
|
+
// On opposite sides of the divider, the second child always starts past the
|
|
152
|
+
// first, so a coordinate compare says which side the dock holds.
|
|
153
|
+
const dockIsSecond = spec.direction === "right" ? dock.rect.x > anchor.rect.x : dock.rect.y > anchor.rect.y;
|
|
154
|
+
return dockIsSecond ? 1 - separating.ratio : separating.ratio;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface DockOpenPlan {
|
|
158
|
+
direction: "right" | "down";
|
|
159
|
+
/** Wire ratio for `pane.split`: the share the anchor keeps. */
|
|
160
|
+
ratio: number;
|
|
161
|
+
share: number;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Decides whether a dock fits beside the anchor and with what split ratio,
|
|
166
|
+
* from the anchor's current rect. Refusal happens here, before any split
|
|
167
|
+
* reaches the wire, so a too-small terminal never flashes a sliver pane.
|
|
168
|
+
*/
|
|
169
|
+
export function planDockOpen(
|
|
170
|
+
anchorRect: { width: number; height: number },
|
|
171
|
+
spec: DockSpec,
|
|
172
|
+
requestedShare?: number,
|
|
173
|
+
): DockOpenPlan | { refused: string } {
|
|
174
|
+
const axis = axisCells(anchorRect, spec);
|
|
175
|
+
if (axis * DOCK_MAX_SHARE < spec.minCells) {
|
|
176
|
+
return {
|
|
177
|
+
refused: `the ${spec.slot} dock needs ${spec.minCells} cells and at most half of ${axis} is available`,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const share = Math.max(clampDockShare(requestedShare ?? spec.defaultShare), spec.minCells / axis);
|
|
181
|
+
return { direction: spec.direction, ratio: ratioForDockShare(share), share };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export interface DockControllerOptions {
|
|
185
|
+
client: MuxClient;
|
|
186
|
+
anchorPaneId: string;
|
|
187
|
+
log?: MuxLog;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export interface DockController {
|
|
191
|
+
/** Live dock states, for status output. */
|
|
192
|
+
states(): ReadonlyArray<DockState>;
|
|
193
|
+
stateFor(slot: DockSlot): DockState | null;
|
|
194
|
+
/**
|
|
195
|
+
* Splits the anchor for a dock and converges it to its cell floor. Returns
|
|
196
|
+
* the new pane, or null when the anchor is too small. Throws MuxError on
|
|
197
|
+
* wire failure; the contract's attempt wrapper owns that.
|
|
198
|
+
*/
|
|
199
|
+
open(
|
|
200
|
+
slot: DockSlot,
|
|
201
|
+
options?: { share?: number; cwd?: string; env?: Readonly<Record<string, string>> },
|
|
202
|
+
): Promise<MuxPaneRef | null>;
|
|
203
|
+
/** Record an adopted pane (crash recovery) as this slot's dock. */
|
|
204
|
+
adopt(slot: DockSlot, ref: MuxPaneRef): void;
|
|
205
|
+
/** Set a dock's share explicitly, as `/panes` resize does. */
|
|
206
|
+
resize(slot: DockSlot, share: number): Promise<boolean>;
|
|
207
|
+
/** Feed a `layout.updated` push; user resizes become the new target. */
|
|
208
|
+
noteLayoutUpdated(geometry: MuxTabGeometry): void;
|
|
209
|
+
/** Feed a pane departure; a closed dock is a decision, not a fault. */
|
|
210
|
+
notePaneGone(paneId: string): void;
|
|
211
|
+
/** Feed a `pane.moved` id rewrite; the dock is followed to its new id. */
|
|
212
|
+
notePaneMoved(previousPaneId: string, paneId: string, tabId: string): void;
|
|
213
|
+
/** Pane ids of every live dock, for the contract's clean-exit sweep. */
|
|
214
|
+
paneIds(): ReadonlyArray<string>;
|
|
215
|
+
clear(): void;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
export function createDockController(options: DockControllerOptions): DockController {
|
|
219
|
+
const { client, anchorPaneId } = options;
|
|
220
|
+
const log = options.log ?? ((): void => undefined);
|
|
221
|
+
const bySlot = new Map<DockSlot, DockState>();
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Re-derives the split path from a fresh export and applies a ratio for the
|
|
225
|
+
* dock's share. The path is never cached: user splits and moves invalidate
|
|
226
|
+
* it silently, and one export per resize is cheap.
|
|
227
|
+
*/
|
|
228
|
+
const applyShare = async (state: DockState, share: number): Promise<boolean> => {
|
|
229
|
+
const tree = await client.layoutExport({ tabId: state.tabId });
|
|
230
|
+
const derived = deriveSplitPath(tree.root, anchorPaneId, state.paneId);
|
|
231
|
+
if (!derived) {
|
|
232
|
+
log("debug", `mux ${state.slot} dock split path is gone from ${state.tabId}; leaving layout alone`);
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
// After a user move the separating split can run the other axis, and the
|
|
236
|
+
// share would then set a height where minCells measures columns. Wrong-axis
|
|
237
|
+
// geometry is declined, not silently applied.
|
|
238
|
+
if (derived.direction !== DOCK_SPECS[state.slot].direction) {
|
|
239
|
+
log("debug", `mux ${state.slot} dock split runs ${derived.direction}; declining the wrong-axis resize`);
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
const ratio = derived.dockIsSecond ? ratioForDockShare(share) : share;
|
|
243
|
+
await client.layoutSetSplitRatio({ tabId: state.tabId, path: derived.path, ratio });
|
|
244
|
+
state.targetShare = share;
|
|
245
|
+
state.lastAppliedShare = share;
|
|
246
|
+
return true;
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
return {
|
|
250
|
+
states(): ReadonlyArray<DockState> {
|
|
251
|
+
return [...bySlot.values()].map((state) => ({ ...state }));
|
|
252
|
+
},
|
|
253
|
+
|
|
254
|
+
stateFor(slot: DockSlot): DockState | null {
|
|
255
|
+
const state = bySlot.get(slot);
|
|
256
|
+
return state ? { ...state } : null;
|
|
257
|
+
},
|
|
258
|
+
|
|
259
|
+
async open(slot, openOptions = {}): Promise<MuxPaneRef | null> {
|
|
260
|
+
const existing = bySlot.get(slot);
|
|
261
|
+
if (existing) {
|
|
262
|
+
return { paneId: existing.paneId, tabId: existing.tabId, workspaceId: "" };
|
|
263
|
+
}
|
|
264
|
+
const spec = DOCK_SPECS[slot];
|
|
265
|
+
const geometry = await client.paneLayout(anchorPaneId);
|
|
266
|
+
const anchorRect = geometry.panes.find((pane) => pane.paneId === anchorPaneId)?.rect;
|
|
267
|
+
if (!anchorRect) {
|
|
268
|
+
log("debug", `mux ${slot} dock open found no anchor rect for ${anchorPaneId}`);
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
const plan = planDockOpen(anchorRect, spec, openOptions.share);
|
|
272
|
+
if ("refused" in plan) {
|
|
273
|
+
log("info", `mux ${slot} dock refused: ${plan.refused}`);
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
const pane = await client.paneSplit({
|
|
277
|
+
direction: plan.direction,
|
|
278
|
+
targetPaneId: anchorPaneId,
|
|
279
|
+
ratio: plan.ratio,
|
|
280
|
+
focus: false,
|
|
281
|
+
...(openOptions.cwd !== undefined ? { cwd: openOptions.cwd } : {}),
|
|
282
|
+
...(openOptions.env ? { env: openOptions.env } : {}),
|
|
283
|
+
});
|
|
284
|
+
const state: DockState = {
|
|
285
|
+
slot,
|
|
286
|
+
paneId: pane.paneId,
|
|
287
|
+
tabId: pane.tabId,
|
|
288
|
+
targetShare: plan.share,
|
|
289
|
+
lastAppliedShare: plan.share,
|
|
290
|
+
};
|
|
291
|
+
bySlot.set(slot, state);
|
|
292
|
+
// Ratio-at-split lands on the anchor's old rect; prior splits or a
|
|
293
|
+
// resize since the read can leave the dock under its floor. One
|
|
294
|
+
// converge pass fixes it; failure to converge is not failure to open.
|
|
295
|
+
try {
|
|
296
|
+
const after = await client.paneLayout(anchorPaneId);
|
|
297
|
+
const dockRect = after.panes.find((entry) => entry.paneId === pane.paneId)?.rect;
|
|
298
|
+
if (dockRect && axisCells(dockRect, spec) < spec.minCells) {
|
|
299
|
+
const anchorAfter = after.panes.find((entry) => entry.paneId === anchorPaneId)?.rect;
|
|
300
|
+
const total = anchorAfter ? axisCells(anchorAfter, spec) + axisCells(dockRect, spec) : 0;
|
|
301
|
+
if (total > 0) await applyShare(state, Math.min(DOCK_MAX_SHARE, spec.minCells / total));
|
|
302
|
+
}
|
|
303
|
+
} catch (error) {
|
|
304
|
+
log("debug", `mux ${slot} dock converge skipped: ${error instanceof Error ? error.message : String(error)}`);
|
|
305
|
+
}
|
|
306
|
+
return { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
|
|
307
|
+
},
|
|
308
|
+
|
|
309
|
+
adopt(slot: DockSlot, ref: MuxPaneRef): void {
|
|
310
|
+
const spec = DOCK_SPECS[slot];
|
|
311
|
+
bySlot.set(slot, {
|
|
312
|
+
slot,
|
|
313
|
+
paneId: ref.paneId,
|
|
314
|
+
tabId: ref.tabId,
|
|
315
|
+
// The surviving pane's actual share is adopted lazily by the next
|
|
316
|
+
// layout observation; until then the default is the best guess.
|
|
317
|
+
targetShare: spec.defaultShare,
|
|
318
|
+
lastAppliedShare: spec.defaultShare,
|
|
319
|
+
});
|
|
320
|
+
},
|
|
321
|
+
|
|
322
|
+
async resize(slot: DockSlot, share: number): Promise<boolean> {
|
|
323
|
+
const state = bySlot.get(slot);
|
|
324
|
+
if (!state) return false;
|
|
325
|
+
return await applyShare(state, Math.max(clampDockShare(share), 0.01));
|
|
326
|
+
},
|
|
327
|
+
|
|
328
|
+
noteLayoutUpdated(geometry: MuxTabGeometry): void {
|
|
329
|
+
for (const state of bySlot.values()) {
|
|
330
|
+
if (state.tabId !== geometry.tabId) continue;
|
|
331
|
+
const observed = observedDockShare(geometry, DOCK_SPECS[state.slot], anchorPaneId, state.paneId);
|
|
332
|
+
if (observed === null) continue;
|
|
333
|
+
if (Math.abs(observed - state.targetShare) <= SHARE_EPSILON) continue;
|
|
334
|
+
if (Math.abs(observed - state.lastAppliedShare) <= SHARE_EPSILON) continue;
|
|
335
|
+
// The user dragged the divider. Their ratio is the target now, and a
|
|
336
|
+
// later terminal resize must not fight them back to the old one.
|
|
337
|
+
log("debug", `mux ${state.slot} dock resized by the user to ${(observed * 100).toFixed(0)}%`);
|
|
338
|
+
state.targetShare = observed;
|
|
339
|
+
state.lastAppliedShare = observed;
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
|
|
343
|
+
notePaneGone(paneId: string): void {
|
|
344
|
+
for (const [slot, state] of bySlot) {
|
|
345
|
+
if (state.paneId === paneId) bySlot.delete(slot);
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
|
|
349
|
+
notePaneMoved(previousPaneId: string, paneId: string, tabId: string): void {
|
|
350
|
+
for (const state of bySlot.values()) {
|
|
351
|
+
if (state.paneId !== previousPaneId) continue;
|
|
352
|
+
state.paneId = paneId;
|
|
353
|
+
state.tabId = tabId;
|
|
354
|
+
}
|
|
355
|
+
},
|
|
356
|
+
|
|
357
|
+
paneIds(): ReadonlyArray<string> {
|
|
358
|
+
return [...bySlot.values()].map((state) => state.paneId);
|
|
359
|
+
},
|
|
360
|
+
|
|
361
|
+
clear(): void {
|
|
362
|
+
bySlot.clear();
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
}
|
|
@@ -30,7 +30,13 @@ export async function createMuxBundle(
|
|
|
30
30
|
...(options.env ? { env: options.env } : {}),
|
|
31
31
|
log,
|
|
32
32
|
});
|
|
33
|
-
|
|
33
|
+
// A `none` that nobody asked for is background noise and stays at debug. A
|
|
34
|
+
// refusal is the operator's own setting being turned down, so it goes to
|
|
35
|
+
// `warning`, which the orchestrator routes to boot stderr.
|
|
36
|
+
log(
|
|
37
|
+
detection.refused ? "warning" : detection.mode === "none" ? "debug" : "info",
|
|
38
|
+
detection.refused ? `panes refused: ${detection.reason}` : `mux mode ${detection.mode}: ${detection.reason}`,
|
|
39
|
+
);
|
|
34
40
|
|
|
35
41
|
const runtime = createMuxRuntime({ detection, client, log });
|
|
36
42
|
|
package/src/domains/mux/index.ts
CHANGED
|
@@ -26,6 +26,20 @@ export type {
|
|
|
26
26
|
} from "./contract.js";
|
|
27
27
|
export { createMuxRuntime } from "./contract.js";
|
|
28
28
|
export { detectMux, type MuxDetection, type MuxEnablement, resolveSocketCandidates } from "./detect.js";
|
|
29
|
+
export {
|
|
30
|
+
clampDockShare,
|
|
31
|
+
DOCK_MAX_SHARE,
|
|
32
|
+
DOCK_SPECS,
|
|
33
|
+
type DockController,
|
|
34
|
+
type DockSlot,
|
|
35
|
+
type DockSpec,
|
|
36
|
+
type DockState,
|
|
37
|
+
deriveSplitPath,
|
|
38
|
+
observedDockShare,
|
|
39
|
+
planDockOpen,
|
|
40
|
+
ratioForDockShare,
|
|
41
|
+
SHARE_EPSILON,
|
|
42
|
+
} from "./dock-controller.js";
|
|
29
43
|
export type { MuxDomainOptions } from "./extension.js";
|
|
30
44
|
export { MuxManifest } from "./manifest.js";
|
|
31
45
|
export { createPaneRegistry, type MuxPaneRegistry, paneRecord } from "./pane-registry.js";
|
|
@@ -37,12 +51,15 @@ export {
|
|
|
37
51
|
type MuxErrorKind,
|
|
38
52
|
type MuxEvent,
|
|
39
53
|
type MuxEventKind,
|
|
54
|
+
type MuxLayoutNode,
|
|
55
|
+
type MuxLayoutTree,
|
|
40
56
|
type MuxLog,
|
|
41
57
|
type MuxMode,
|
|
42
58
|
type MuxNotificationSound,
|
|
43
59
|
type MuxPanePurpose,
|
|
44
60
|
type MuxPaneRecord,
|
|
45
61
|
type MuxPaneRef,
|
|
62
|
+
type MuxRect,
|
|
46
63
|
type MuxReportableAgentState,
|
|
47
64
|
MuxRequestTimeout,
|
|
48
65
|
type MuxSelfLocation,
|
|
@@ -50,12 +67,15 @@ export {
|
|
|
50
67
|
type MuxServerInfo,
|
|
51
68
|
type MuxSnapshot,
|
|
52
69
|
type MuxTab,
|
|
70
|
+
type MuxTabGeometry,
|
|
53
71
|
muxErrorKind,
|
|
54
72
|
} from "./types.js";
|
|
55
73
|
export { clioCliEntryPath, type ViewerCommandOptions, watchViewerCommand } from "./viewer-command.js";
|
|
56
74
|
export {
|
|
57
75
|
createYaziEventStream,
|
|
76
|
+
LEGACY_YAZI_PICK_EVENT,
|
|
58
77
|
parseYaziEventLine,
|
|
78
|
+
YAZI_PICK_EVENT,
|
|
59
79
|
YAZI_STREAM_MAX_BYTES,
|
|
60
80
|
YAZI_STREAM_POLL_MS,
|
|
61
81
|
type YaziCdEvent,
|
|
@@ -61,6 +61,8 @@ export interface PanesInventoryEntry {
|
|
|
61
61
|
export interface PanesEffectiveSettings {
|
|
62
62
|
enabled: string;
|
|
63
63
|
notifications: string;
|
|
64
|
+
/** Boot composition: off, workers, or cockpit. */
|
|
65
|
+
layout: string;
|
|
64
66
|
journal: boolean;
|
|
65
67
|
yazi: {
|
|
66
68
|
enabled: boolean;
|
|
@@ -70,6 +72,14 @@ export interface PanesEffectiveSettings {
|
|
|
70
72
|
};
|
|
71
73
|
}
|
|
72
74
|
|
|
75
|
+
/** One managed dock's live geometry, flattened for `/panes` status. */
|
|
76
|
+
export interface PanesDockStatus {
|
|
77
|
+
slot: "workers" | "files";
|
|
78
|
+
paneId: string;
|
|
79
|
+
/** Share of the axis the dock currently targets, 0..0.5. */
|
|
80
|
+
targetShare: number;
|
|
81
|
+
}
|
|
82
|
+
|
|
73
83
|
/** File-pane return-path state flattened for `/panes` and the model tool. */
|
|
74
84
|
export interface PanesYaziStatus {
|
|
75
85
|
mode: "companion" | "chooser" | "closed";
|
|
@@ -89,6 +99,8 @@ export interface PanesStatus {
|
|
|
89
99
|
server: { version: string; protocol: number } | null;
|
|
90
100
|
settings: PanesEffectiveSettings;
|
|
91
101
|
yazi: PanesYaziStatus;
|
|
102
|
+
/** Managed docks with live geometry; empty below the layout tier. */
|
|
103
|
+
docks: ReadonlyArray<PanesDockStatus>;
|
|
92
104
|
panes: ReadonlyArray<PanesInventoryEntry>;
|
|
93
105
|
}
|
|
94
106
|
|
|
@@ -109,6 +121,11 @@ export type PanesWatchResult =
|
|
|
109
121
|
* is: neither the domain nor the tool may import the interactive tree.
|
|
110
122
|
*/
|
|
111
123
|
export interface PanesWatchController {
|
|
124
|
+
/**
|
|
125
|
+
* Open (or adopt) the watch pane without retargeting it, for boot
|
|
126
|
+
* composition under `interface.panes.layout`. False when the host refused.
|
|
127
|
+
*/
|
|
128
|
+
ensureOpen(): Promise<boolean>;
|
|
112
129
|
/** Point the watch pane at a run, opening or adopting the pane first if needed. */
|
|
113
130
|
watch(runId: string): Promise<PanesWatchResult>;
|
|
114
131
|
/** Retarget only; false when no watch pane is open or the write failed. */
|
|
@@ -123,6 +140,11 @@ export type PanesOpenResult =
|
|
|
123
140
|
| { status: "refused"; reason: string }
|
|
124
141
|
| { status: "unavailable"; reason: string };
|
|
125
142
|
|
|
143
|
+
export type PanesZoomResult =
|
|
144
|
+
| { status: "zoomed"; paneId: string; label: string }
|
|
145
|
+
| { status: "not-found"; target: string }
|
|
146
|
+
| { status: "unavailable"; reason: string };
|
|
147
|
+
|
|
126
148
|
export type PanesCloseResult =
|
|
127
149
|
| { status: "closed"; closed: number; labels: ReadonlyArray<string> }
|
|
128
150
|
| { status: "not-found"; target: string }
|
|
@@ -156,6 +178,12 @@ export interface PanesOperations {
|
|
|
156
178
|
status(): PanesStatus;
|
|
157
179
|
show(target: string): Promise<PanesShowResult>;
|
|
158
180
|
open(request: { preset?: string; argv?: ReadonlyArray<string>; once?: boolean }): Promise<PanesOpenResult>;
|
|
181
|
+
/**
|
|
182
|
+
* Toggle zoom on one Clio-owned pane, matched like `close` (pane id, label
|
|
183
|
+
* substring, then purpose; newest first). Zooming steals focus, so this is
|
|
184
|
+
* operator-only and never reachable from the model tool.
|
|
185
|
+
*/
|
|
186
|
+
zoom(target: string): Promise<PanesZoomResult>;
|
|
159
187
|
close(target: string): Promise<PanesCloseResult>;
|
|
160
188
|
/** Bind the composer-facing Yazi bridge without rebuilding this shared object. */
|
|
161
189
|
attachYazi(controller: PanesYaziController): () => void;
|
|
@@ -7,14 +7,19 @@
|
|
|
7
7
|
* adds the worktree family: a herdr old
|
|
8
8
|
* enough to predate them answers `invalid_request`, and the honest response is
|
|
9
9
|
* to take the documented fallback rather than to log a failure per call.
|
|
10
|
-
* (`agent.focus` was gated here too until the per-run focus ladder was
|
|
11
|
-
* removed with the run viewer panes; nothing drives it any more.)
|
|
12
10
|
*
|
|
13
11
|
* The floors are protocol introductions checked against herdr's changelog and
|
|
14
|
-
* then re-verified with `herdr api schema --json`
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
12
|
+
* then re-verified with `herdr api schema --json` on the released artifacts
|
|
13
|
+
* themselves: 0.7.5 (protocol 17) and the pinned 0.8.2, whose hash-verified
|
|
14
|
+
* binary speaks protocol 20, not 21. Both schemas carry pane.focus,
|
|
15
|
+
* layout.export, and layout.set_split_ratio as method constants, so the whole
|
|
16
|
+
* dock tier floors at 17 alongside notification.show and pane.zoom. (An
|
|
17
|
+
* earlier attestation put these at 21 after reading a stray dev build that
|
|
18
|
+
* self-reported "0.8.2" while speaking protocol 21; on the real pin that
|
|
19
|
+
* floor gated the dock tier off entirely.) Worktrees arrived in protocol 10.
|
|
20
|
+
* 17 is the oldest schema actually read, not the oldest that might work.
|
|
21
|
+
* Lower one only after checking the schema of the release you are lowering
|
|
22
|
+
* it to.
|
|
18
23
|
*/
|
|
19
24
|
|
|
20
25
|
import type { MuxServerInfo } from "./types.js";
|
|
@@ -23,6 +28,10 @@ import type { MuxServerInfo } from "./types.js";
|
|
|
23
28
|
export type MuxGatedMethod =
|
|
24
29
|
| "notification.show"
|
|
25
30
|
| "pane.rename"
|
|
31
|
+
| "pane.focus"
|
|
32
|
+
| "pane.zoom"
|
|
33
|
+
| "layout.export"
|
|
34
|
+
| "layout.set_split_ratio"
|
|
26
35
|
| "worktree.list"
|
|
27
36
|
| "worktree.create"
|
|
28
37
|
| "worktree.open"
|
|
@@ -31,6 +40,10 @@ export type MuxGatedMethod =
|
|
|
31
40
|
export const MUX_METHOD_MIN_PROTOCOL: Readonly<Record<MuxGatedMethod, number>> = {
|
|
32
41
|
"notification.show": 17,
|
|
33
42
|
"pane.rename": 17,
|
|
43
|
+
"pane.focus": 17,
|
|
44
|
+
"pane.zoom": 17,
|
|
45
|
+
"layout.export": 17,
|
|
46
|
+
"layout.set_split_ratio": 17,
|
|
34
47
|
"worktree.list": 10,
|
|
35
48
|
"worktree.create": 10,
|
|
36
49
|
"worktree.open": 10,
|