@iowarp/clio-coder 0.3.9 → 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 +92 -0
- package/NOTICE +33 -0
- package/README.md +121 -16
- package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
- package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
- package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
- package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
- package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/chunk-42FMPA75.js +101 -0
- package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
- package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
- package/dist/chunk-5YHDIDBP.js +97 -0
- package/dist/chunk-6CCS4G3W.js +1529 -0
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
- package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/chunk-6NJQITNH.js +1412 -0
- package/dist/chunk-6VC4OV3Z.js +365 -0
- package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
- package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
- package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
- package/dist/chunk-7RY5VZPH.js +573 -0
- package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
- package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
- package/dist/chunk-BJGUKIG4.js +302 -0
- package/dist/chunk-BMS5RKQY.js +27 -0
- package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
- 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-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
- package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
- package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
- package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
- package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/chunk-D4CJV46V.js +462 -0
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
- package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
- package/dist/chunk-GIZNH63R.js +40 -0
- package/dist/chunk-GPPB3JBE.js +688 -0
- package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
- package/dist/chunk-HHV2GANA.js +88 -0
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
- package/dist/chunk-HRQMFLJP.js +75 -0
- package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
- package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
- package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
- package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
- package/dist/chunk-J4HBWF6Y.js +2635 -0
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
- package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
- package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
- package/dist/chunk-K6BF4U2H.js +1785 -0
- package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
- package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
- package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
- package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/chunk-NEKRRTYW.js +56 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
- package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
- package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
- package/dist/chunk-PMZCIOCJ.js +25 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
- package/dist/chunk-QDC3K2U3.js +262 -0
- package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
- package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
- package/dist/chunk-QSNYB6ZV.js +195 -0
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
- package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
- package/dist/chunk-R346GLFC.js +31 -0
- package/dist/chunk-RKSR6VSF.js +132 -0
- package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
- package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
- package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
- package/dist/chunk-T56WDKA5.js +183 -0
- package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
- package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
- package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
- package/dist/chunk-TVHHYFHE.js +255 -0
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
- package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
- package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
- package/dist/chunk-WR6U3OVP.js +45 -0
- package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
- package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/chunk-YAKGTXEV.js +17 -0
- package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
- package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
- package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
- package/dist/cli/index.js +48 -37
- package/dist/clio-IT3G3VQH.js +25 -0
- package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
- package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
- package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
- package/dist/configure-FL7Y3KJF.js +54 -0
- package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
- package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
- package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
- package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
- package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
- package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
- package/dist/eval-inventory-HBWSWQOK.js +315 -0
- package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
- package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
- package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
- package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
- package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
- package/dist/fleet-decisions-OTHB6KRL.js +157 -0
- package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
- package/dist/fleet-inspect-SS6YMDCK.js +445 -0
- package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
- package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
- package/dist/fleet-verify-QD5M7E7Q.js +178 -0
- package/dist/fleet-view-WAMJYNDT.js +94 -0
- package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
- package/dist/install-NKNG7KD4.js +13 -0
- package/dist/interop-34TVO25M.js +116 -0
- package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
- package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
- package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
- package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
- package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
- package/dist/panes-7STHOAUJ.js +103 -0
- package/dist/panes-SHAUIRXY.js +60 -0
- package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
- package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
- package/dist/resources-74GKTLSF.js +115 -0
- package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
- package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
- package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
- package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
- package/dist/skills-inventory-J357J34F.js +129 -0
- package/dist/slash-commands-JZZCQA32.js +79 -0
- package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
- package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
- package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
- package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
- package/dist/tools-MKNWVPBH.js +29 -0
- package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
- package/dist/tui-primitives-K5PASC3O.js +17 -0
- package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
- package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
- package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
- package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
- package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
- package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
- package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
- package/dist/with-panes-OBOBFIIR.js +818 -0
- package/dist/worker/entry.js +131 -91
- package/docs/README.md +3 -2
- package/docs/acp.md +25 -4
- package/docs/alcf-provider.md +1 -1
- package/docs/architecture.md +2 -2
- package/docs/artifact-versions.md +4 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/capacity-and-scheduling.md +43 -5
- package/docs/commands-and-modes.md +39 -4
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +138 -167
- package/docs/context-engine.md +1 -1
- package/docs/development-pipeline.md +19 -0
- package/docs/dispatch-typed-intent.md +385 -0
- package/docs/documentation-coverage.md +2 -2
- package/docs/documentation-guide.md +1 -1
- package/docs/environment-variables.md +3 -1
- package/docs/eval-runner.md +1 -1
- package/docs/evals-internal.md +1 -1
- package/docs/evidence-and-memory.md +2 -2
- package/docs/evolution.md +1 -1
- package/docs/exit-codes-and-output.md +3 -1
- package/docs/extensions-and-sharing.md +25 -1
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +30 -7
- package/docs/installation-and-lifecycle.md +16 -3
- package/docs/middleware-and-components.md +1 -1
- package/docs/model-catalog.md +10 -1
- package/docs/observability.md +3 -3
- package/docs/proactive-memory.md +1 -1
- package/docs/prompt-envelope-and-tools.md +1 -1
- package/docs/provider-adapter-cookbook.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/safety-model.md +2 -2
- package/docs/scientific-validation.md +3 -3
- package/docs/session-lifecycle.md +1 -1
- package/docs/skills-marketplace.md +1 -1
- package/docs/tool-usage.md +18 -8
- package/docs/trace-store.md +16 -11
- package/docs/troubleshooting.md +2 -2
- package/docs/tui-design.md +1 -1
- package/docs/worker-dispatch-mechanics.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 +8 -16
- 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 +8 -4
- package/src/cli/argv.ts +25 -0
- 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 +50 -48
- 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 +156 -0
- package/src/cli/doctor-toolchain.ts +78 -0
- package/src/cli/doctor.ts +34 -1
- package/src/cli/eval-inventory.ts +436 -0
- package/src/cli/eval.ts +13 -0
- package/src/cli/evidence-detail.ts +88 -0
- package/src/cli/evidence-inventory.ts +183 -0
- package/src/cli/evidence.ts +30 -5
- package/src/cli/fleet-decisions.ts +69 -0
- package/src/cli/fleet-inspect.ts +334 -0
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +133 -0
- package/src/cli/fleet-view.ts +827 -0
- package/src/cli/fleet.ts +154 -40
- package/src/cli/index.ts +14 -2
- package/src/cli/interop-inspect.ts +128 -0
- package/src/cli/interop.ts +34 -0
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +35 -0
- package/src/cli/reset.ts +6 -3
- package/src/cli/run.ts +67 -13
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/skills-inventory.ts +185 -0
- package/src/cli/skills.ts +16 -13
- package/src/cli/targets.ts +23 -24
- package/src/cli/tools.ts +321 -0
- package/src/cli/trace-inspect.ts +252 -0
- package/src/cli/trace.ts +64 -2
- 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 +347 -0
- package/src/cli/verifiers.ts +9 -0
- 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-events.ts +4 -0
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1070 -845
- package/src/core/defaults.ts +342 -463
- 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/response-schema.ts +44 -4
- 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/theme-token-hex.ts +43 -0
- package/src/core/timers.ts +2 -12
- package/src/core/tool-names.ts +2 -1
- package/src/core/xdg.ts +1 -1
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/fleets/build-review.md +0 -3
- package/src/domains/agents/fleets/build-test.md +0 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract-filesystem.ts +32 -0
- package/src/domains/agents/result-contract.ts +165 -36
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +37 -46
- 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/admission-error.ts +9 -0
- package/src/domains/dispatch/admission.ts +22 -21
- 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 +23 -6
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/council-topology.ts +398 -0
- package/src/domains/dispatch/extension.ts +287 -111
- package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
- package/src/domains/dispatch/fleet-plan.ts +7 -2
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +59 -3
- package/src/domains/dispatch/gate-decisions.ts +36 -15
- package/src/domains/dispatch/gate-role-prompts.ts +9 -0
- package/src/domains/dispatch/gate-topology.ts +289 -0
- package/src/domains/dispatch/index.ts +19 -0
- package/src/domains/dispatch/intent-compatibility.ts +330 -0
- package/src/domains/dispatch/intent.ts +85 -1
- 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 +24 -27
- 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-bridge.ts +149 -0
- package/src/domains/dispatch/run-event-journal.ts +599 -0
- package/src/domains/dispatch/state.ts +45 -1
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +16 -3
- package/src/domains/dispatch/validation.ts +33 -8
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/compare.ts +3 -16
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/inventory.ts +113 -0
- 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/serving.ts +31 -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/evidence/store.ts +6 -0
- 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/index.ts +0 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/memory/task-memory-policy.ts +6 -10
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/memory-intervention.ts +33 -21
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +566 -0
- package/src/domains/mux/detect.ts +182 -0
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +53 -0
- package/src/domains/mux/index.ts +116 -0
- package/src/domains/mux/manifest.ts +6 -0
- package/src/domains/mux/operations.ts +192 -0
- package/src/domains/mux/pane-registry.ts +90 -0
- package/src/domains/mux/protocol.ts +62 -0
- package/src/domains/mux/socket-client.ts +964 -0
- package/src/domains/mux/types.ts +265 -0
- package/src/domains/mux/viewer-command.ts +59 -0
- package/src/domains/mux/yazi/assets/init.lua +2 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
- package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
- package/src/domains/mux/yazi/assets/yazi.toml +17 -0
- package/src/domains/mux/yazi/event-stream.ts +182 -0
- package/src/domains/mux/yazi/profile.ts +299 -0
- package/src/domains/mux/yazi/session.ts +251 -0
- package/src/domains/mux/yazi/theme.ts +30 -0
- package/src/domains/observability/cost.ts +21 -0
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/index.ts +2 -0
- 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 +63 -11
- 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/endpoint-capacity.ts +154 -22
- package/src/domains/providers/endpoint-slots-store.ts +189 -0
- package/src/domains/providers/extension.ts +25 -8
- package/src/domains/providers/index.ts +22 -0
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +46 -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/boot-manifest.ts +1 -0
- package/src/domains/providers/runtimes/builtins.ts +2 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +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 +285 -0
- package/src/domains/providers/support.ts +1 -0
- package/src/domains/providers/target-model-cache.ts +124 -0
- 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/index.ts +3 -0
- 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 +72 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/action-classifier.ts +6 -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/archive.ts +175 -0
- package/src/domains/toolchain/contract.ts +28 -0
- package/src/domains/toolchain/extension.ts +47 -0
- package/src/domains/toolchain/index.ts +39 -0
- package/src/domains/toolchain/install.ts +327 -0
- package/src/domains/toolchain/manifest.ts +8 -0
- package/src/domains/toolchain/paths.ts +34 -0
- package/src/domains/toolchain/registry.ts +265 -0
- package/src/domains/toolchain/remove.ts +218 -0
- package/src/domains/toolchain/resolve.ts +182 -0
- package/src/domains/toolchain/types.ts +113 -0
- package/src/domains/toolchain/version.ts +88 -0
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +440 -96
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +20 -2
- 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 +87 -0
- package/src/engine/claude/sdk-runtime.ts +25 -17
- 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 +21 -0
- package/src/engine/tui.ts +1 -0
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +16 -26
- package/src/entry/boot-options.ts +2 -0
- package/src/entry/orchestrator.ts +207 -90
- package/src/entry/panes-activation.ts +31 -0
- package/src/entry/with-panes.ts +20 -0
- 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 +2 -1
- package/src/interactive/cost-overlay.ts +3 -1
- package/src/interactive/council-grid.ts +3 -5
- package/src/interactive/council.ts +11 -0
- package/src/interactive/dispatch-board.ts +56 -49
- 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 +229 -62
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +9 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +99 -23
- 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 +3 -2
- package/src/interactive/modal-marker.ts +151 -0
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/mux-bridge.ts +214 -0
- package/src/interactive/overlay-frame.ts +62 -14
- package/src/interactive/overlay-general-openers.ts +7 -2
- package/src/interactive/overlay-key-routing.ts +21 -10
- package/src/interactive/overlay-lifecycle.ts +20 -4
- package/src/interactive/overlay-model-selectors.ts +43 -6
- package/src/interactive/overlay-permission-lifecycle.ts +90 -22
- package/src/interactive/overlay-transitions.ts +18 -4
- package/src/interactive/overlays/agents.ts +3 -2
- package/src/interactive/overlays/ask-user.ts +161 -41
- package/src/interactive/overlays/auth-dialog.ts +1 -0
- package/src/interactive/overlays/context-reset.ts +29 -4
- package/src/interactive/overlays/cwd-fallback.ts +29 -4
- package/src/interactive/overlays/decisions.ts +15 -13
- package/src/interactive/overlays/extensions.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +4 -3
- package/src/interactive/overlays/handoff-review.ts +3 -2
- package/src/interactive/overlays/help-reference.ts +2 -0
- package/src/interactive/overlays/interop.ts +2 -1
- package/src/interactive/overlays/library-install-confirm.ts +2 -1
- package/src/interactive/overlays/library-tabs.ts +28 -0
- package/src/interactive/overlays/list-overlay.ts +10 -1
- package/src/interactive/overlays/message-picker.ts +2 -1
- package/src/interactive/overlays/model-scope.ts +86 -0
- package/src/interactive/overlays/model-selector.ts +40 -31
- package/src/interactive/overlays/prompts.ts +11 -4
- package/src/interactive/overlays/session-selector.ts +3 -2
- package/src/interactive/overlays/settings-sections.ts +30 -0
- package/src/interactive/overlays/settings.ts +849 -268
- package/src/interactive/overlays/side-question.ts +3 -2
- package/src/interactive/overlays/skills-hub.ts +11 -19
- package/src/interactive/overlays/tree-selector.ts +3 -2
- package/src/interactive/pane-policy.ts +46 -0
- package/src/interactive/panes-runtime.ts +318 -0
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/compaction-summary.ts +29 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/renderers/worker-entry.ts +122 -14
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +521 -189
- 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 +21 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/theme/tokens.ts +3 -14
- package/src/interactive/turn-context.ts +58 -13
- 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 +120 -9
- package/src/interactive/view/view-overlay.ts +14 -10
- package/src/interactive/watch-pane.ts +180 -0
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +11 -5
- package/src/interactive/worker-receipts.ts +20 -2
- package/src/interactive/worker-stream.ts +6 -4
- package/src/interactive/yazi-bridge.ts +451 -0
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +26 -2
- package/src/tools/builtin-tool-catalog.ts +16 -1
- package/src/tools/compete-worktrees.ts +108 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/core-bootstrap.ts +2 -1
- package/src/tools/dispatch-admission.ts +18 -5
- package/src/tools/dispatch-arguments.ts +21 -21
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +145 -28
- package/src/tools/dispatch-runner.ts +40 -13
- package/src/tools/dispatch-types.ts +15 -3
- package/src/tools/dispatch.ts +2 -2
- package/src/tools/executables.ts +17 -14
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +54 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +38 -0
- package/src/tools/panes.ts +112 -0
- package/src/tools/policy.ts +10 -1
- package/src/tools/presentation.ts +1 -0
- 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-D73KXYPF.js +0 -37
- package/dist/chunk-MLOK6ZOS.js +0 -2888
- package/dist/chunk-PNY46YEY.js +0 -1581
- package/dist/chunk-XDOQXGFO.js +0 -515
- package/dist/chunk-YKOFT37S.js +0 -279
- package/dist/clio-LT5V7SSZ.js +0 -26
- package/dist/configure-2WYWSCSD.js +0 -49
- package/dist/doctor-TWBWFK5V.js +0 -165
- 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
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pane layer's cross-domain surface.
|
|
3
|
+
*
|
|
4
|
+
* Every method is best-effort. A mux failure never fails a dispatch, never
|
|
5
|
+
* throws at a caller, and never blocks the event loop on a dead socket: it logs
|
|
6
|
+
* and degrades to `available() === false`, which the consumers read as "use the
|
|
7
|
+
* native fleet surfaces instead". That is why every method here returns a
|
|
8
|
+
* fallback value rather than rejecting.
|
|
9
|
+
*
|
|
10
|
+
* Two ownership rules run through the whole file. Clio acts only on panes it
|
|
11
|
+
* created, tracked in `pane-registry.ts` and tagged with the `clio_coder_owner`
|
|
12
|
+
* metadata token so `clio doctor` can find orphans. The one documented
|
|
13
|
+
* exception is Clio's own hosting pane in guest mode, which `reportSelf`
|
|
14
|
+
* writes to under SA-3 of the v0.4.0 cycle plan.
|
|
15
|
+
*
|
|
16
|
+
* What is deliberately absent: per-run viewer panes. The v0.4.0 phase 3/4
|
|
17
|
+
* integration opened a pane per dispatched run in a hidden Fleet tab, with a
|
|
18
|
+
* focus ladder, run-state reporting, and resume adoption keyed on run ids. All
|
|
19
|
+
* of that projected fleet state the native surfaces already show onto panes
|
|
20
|
+
* nobody had asked for. The one run-viewing surface is now the workers-view
|
|
21
|
+
* watch pane (src/interactive/watch-pane.ts): a single utility pane following
|
|
22
|
+
* a selection file, opened on operator demand and retargeted by file writes
|
|
23
|
+
* that never touch this socket.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import type { DomainContract } from "../../core/domain-loader.js";
|
|
27
|
+
import type { MuxDetection } from "./detect.js";
|
|
28
|
+
import { createDockController, type DockController, type DockSlot, type DockState } from "./dock-controller.js";
|
|
29
|
+
import { createPaneRegistry, type MuxPaneRegistry, paneRecord } from "./pane-registry.js";
|
|
30
|
+
import { muxSupportsMethod } from "./protocol.js";
|
|
31
|
+
import type {
|
|
32
|
+
MuxClient,
|
|
33
|
+
MuxSubscription,
|
|
34
|
+
MuxWorktreeCreatedResult,
|
|
35
|
+
MuxWorktreeCreateRequest,
|
|
36
|
+
} from "./socket-client.js";
|
|
37
|
+
import {
|
|
38
|
+
MuxError,
|
|
39
|
+
type MuxEvent,
|
|
40
|
+
type MuxLog,
|
|
41
|
+
type MuxMode,
|
|
42
|
+
type MuxNotificationSound,
|
|
43
|
+
type MuxPanePurpose,
|
|
44
|
+
type MuxPaneRecord,
|
|
45
|
+
type MuxPaneRef,
|
|
46
|
+
type MuxSelfReport,
|
|
47
|
+
} from "./types.js";
|
|
48
|
+
|
|
49
|
+
/** Metadata source for everything Clio's pane layer writes. */
|
|
50
|
+
const METADATA_SOURCE = "clio-coder:mux";
|
|
51
|
+
/** Agent-authority source for Clio's own hosting pane, per SA-3. */
|
|
52
|
+
const SELF_AGENT_SOURCE = "clio-coder:coder";
|
|
53
|
+
/** Token every Clio-created pane carries so orphans are findable. */
|
|
54
|
+
const OWNER_TOKEN_KEY = "clio_coder_owner";
|
|
55
|
+
const OWNER_TOKEN_VALUE = "clio-coder:mux";
|
|
56
|
+
/** Old-host cleanup bridge; ownership readers retain this indefinitely. */
|
|
57
|
+
const LEGACY_OWNER_TOKEN_KEY = "clio_owner";
|
|
58
|
+
const LEGACY_OWNER_TOKEN_VALUE = "clio:mux";
|
|
59
|
+
/** herdr caps a metadata token value at 80 characters. */
|
|
60
|
+
const TOKEN_VALUE_MAX = 80;
|
|
61
|
+
/** How long `available()` stays false after a transport failure before probing again. */
|
|
62
|
+
const DEGRADE_COOLDOWN_MS = 5_000;
|
|
63
|
+
|
|
64
|
+
export interface MuxOpenUtilityPaneRequest {
|
|
65
|
+
argv: ReadonlyArray<string>;
|
|
66
|
+
cwd: string;
|
|
67
|
+
label: string;
|
|
68
|
+
/** Operator-facing pane title. Omitted when the caller wants the shell default. */
|
|
69
|
+
title?: string;
|
|
70
|
+
purpose?: MuxPanePurpose;
|
|
71
|
+
direction?: "right" | "down";
|
|
72
|
+
env?: Readonly<Record<string, string>>;
|
|
73
|
+
/**
|
|
74
|
+
* Absolute path the pane's stdout is redirected into. Full-screen programs
|
|
75
|
+
* such as Yazi reopen `/dev/tty` for their interface when stdout is not a tty.
|
|
76
|
+
*/
|
|
77
|
+
stdoutPath?: string;
|
|
78
|
+
/**
|
|
79
|
+
* Managed placement: the pane becomes this slot's dock, split from the
|
|
80
|
+
* anchor with the slot's direction and sized to `share` of the axis
|
|
81
|
+
* (clamped, cell-floored). Requires the layout tier (protocol 17); below
|
|
82
|
+
* the floor the request degrades to a plain split and `direction` applies.
|
|
83
|
+
*/
|
|
84
|
+
dock?: { slot: DockSlot; share?: number };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface MuxNotifyRequest {
|
|
88
|
+
title: string;
|
|
89
|
+
body?: string;
|
|
90
|
+
sound?: MuxNotificationSound;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface MuxContract extends DomainContract {
|
|
94
|
+
readonly mode: MuxMode;
|
|
95
|
+
/** `mode !== "none"` and the socket is currently healthy. */
|
|
96
|
+
available(): boolean;
|
|
97
|
+
/**
|
|
98
|
+
* The rung detection resolved to, with the socket it answered on and the
|
|
99
|
+
* protocol recorded from the handshake. `/panes` and `clio-coder doctor`
|
|
100
|
+
* print it; the notify and worktree paths gate on its protocol.
|
|
101
|
+
*/
|
|
102
|
+
detection(): Readonly<MuxDetection>;
|
|
103
|
+
openUtilityPane(request: MuxOpenUtilityPaneRequest): Promise<MuxPaneRef | null>;
|
|
104
|
+
/** Close one Clio-created pane by pane id. Refuses a pane Clio did not create. */
|
|
105
|
+
closePane(paneId: string): Promise<boolean>;
|
|
106
|
+
/**
|
|
107
|
+
* Re-adopt one pane of the given purpose that outlived the process that made
|
|
108
|
+
* it. A fresh `session.snapshot` is scanned for a pane carrying Clio's owner
|
|
109
|
+
* token and a matching `role` token; the first hit is recorded and returned.
|
|
110
|
+
* This is what stops a restarted session's Enter-in-the-workers-view from
|
|
111
|
+
* opening a second watch pane beside the surviving one.
|
|
112
|
+
*/
|
|
113
|
+
adoptPane(request: { purpose: MuxPanePurpose; label: string; dock?: DockSlot }): Promise<MuxPaneRef | null>;
|
|
114
|
+
/**
|
|
115
|
+
* Focus one Clio-created pane, switching the user's view to it (pane.focus
|
|
116
|
+
* moves the focused tab too). Explicit-request only; refuses foreign panes
|
|
117
|
+
* and servers below the pane.focus floor.
|
|
118
|
+
*/
|
|
119
|
+
focusPane(paneId: string): Promise<boolean>;
|
|
120
|
+
/** Zoom one Clio-created pane on, off, or toggled. Zooming steals focus; same rule as focusPane. */
|
|
121
|
+
zoomPane(paneId: string, mode: "on" | "off" | "toggle"): Promise<boolean>;
|
|
122
|
+
/** Set a dock's share of its axis. False when the slot has no dock or the tier is absent. */
|
|
123
|
+
resizeDock(slot: DockSlot, share: number): Promise<boolean>;
|
|
124
|
+
/** Live dock geometry states, for `/panes` status. */
|
|
125
|
+
docks(): ReadonlyArray<DockState>;
|
|
126
|
+
notify(request: MuxNotifyRequest): Promise<void>;
|
|
127
|
+
/** Optional compete storage route. Protocol-gated with a native Git fallback at the caller. */
|
|
128
|
+
worktreeCreate(request: MuxWorktreeCreateRequest): Promise<MuxWorktreeCreatedResult | null>;
|
|
129
|
+
/** Remove a herdr worktree workspace. False tells the caller to use native Git cleanup. */
|
|
130
|
+
worktreeRemove(workspaceId: string, options?: { force?: boolean }): Promise<boolean>;
|
|
131
|
+
/**
|
|
132
|
+
* Called when a pane Clio owns leaves, whether the user closed it or the
|
|
133
|
+
* program in it exited. Callers record it and do not reopen: a closed pane
|
|
134
|
+
* is a decision, not a fault.
|
|
135
|
+
*/
|
|
136
|
+
onPaneGone(handler: (record: MuxPaneRecord) => void): () => void;
|
|
137
|
+
/** Panes Clio created, with their purpose. */
|
|
138
|
+
list(): ReadonlyArray<MuxPaneRecord>;
|
|
139
|
+
/**
|
|
140
|
+
* Report Clio's own state on its hosting pane (SA-3). Returns false when
|
|
141
|
+
* there is no pane to report on, which is every mode but guest.
|
|
142
|
+
*/
|
|
143
|
+
reportSelf(report: MuxSelfReport): Promise<boolean>;
|
|
144
|
+
shutdown(): Promise<void>;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export interface MuxRuntimeOptions {
|
|
148
|
+
detection: MuxDetection;
|
|
149
|
+
client: MuxClient | null;
|
|
150
|
+
log?: MuxLog;
|
|
151
|
+
now?: () => number;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/** The contract plus the lifecycle handles the domain extension drives. */
|
|
155
|
+
export interface MuxRuntime {
|
|
156
|
+
contract: MuxContract;
|
|
157
|
+
start(): Promise<void>;
|
|
158
|
+
stop(): Promise<void>;
|
|
159
|
+
/** Test seam: the registry the contract reconciles against. */
|
|
160
|
+
registry: MuxPaneRegistry;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** POSIX single-quoting, so an argv element with spaces or quotes survives the shell. */
|
|
164
|
+
function shellQuote(argv: ReadonlyArray<string>): string {
|
|
165
|
+
return argv.map((arg) => `'${arg.replaceAll("'", `'\\''`)}'`).join(" ");
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function token(value: string | undefined | null): string | null {
|
|
169
|
+
if (typeof value !== "string" || value.length === 0) return null;
|
|
170
|
+
return value.length > TOKEN_VALUE_MAX ? value.slice(0, TOKEN_VALUE_MAX) : value;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function hasOwnedPaneToken(tokens: Readonly<Record<string, string>>): boolean {
|
|
174
|
+
return tokens[OWNER_TOKEN_KEY] === OWNER_TOKEN_VALUE || tokens[LEGACY_OWNER_TOKEN_KEY] === LEGACY_OWNER_TOKEN_VALUE;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
178
|
+
const { detection, client } = options;
|
|
179
|
+
const log = options.log ?? ((): void => undefined);
|
|
180
|
+
const now = options.now ?? Date.now;
|
|
181
|
+
const registry = createPaneRegistry();
|
|
182
|
+
const anchorPaneId = detection.self.paneId;
|
|
183
|
+
/**
|
|
184
|
+
* The managed dock tier needs an anchor to split from and the protocol-17
|
|
185
|
+
* layout methods to converge with. Absent either, dock requests degrade to
|
|
186
|
+
* plain utility splits and the rest of the tier answers false/empty.
|
|
187
|
+
*/
|
|
188
|
+
const docks: DockController | null =
|
|
189
|
+
client !== null && anchorPaneId !== null && muxSupportsMethod(detection.server, "layout.export")
|
|
190
|
+
? createDockController({ client, anchorPaneId, log })
|
|
191
|
+
: null;
|
|
192
|
+
|
|
193
|
+
let healthy = client !== null;
|
|
194
|
+
let probeHealthAt = 0;
|
|
195
|
+
let stopped = false;
|
|
196
|
+
let subscription: MuxSubscription | null = null;
|
|
197
|
+
const paneGoneHandlers = new Set<(record: MuxPaneRecord) => void>();
|
|
198
|
+
|
|
199
|
+
const degrade = (what: string, error: unknown): void => {
|
|
200
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
201
|
+
const transport = error instanceof MuxError && (error.kind === "transport" || error.kind === "timeout");
|
|
202
|
+
if (transport) {
|
|
203
|
+
healthy = false;
|
|
204
|
+
probeHealthAt = now() + DEGRADE_COOLDOWN_MS;
|
|
205
|
+
}
|
|
206
|
+
log(transport ? "warning" : "debug", `mux ${what} failed: ${message}`);
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
const usable = (): boolean => {
|
|
210
|
+
if (stopped || client === null || detection.mode === "none") return false;
|
|
211
|
+
return healthy || now() >= probeHealthAt;
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Runs one mux interaction and swallows everything it can throw. The fallback
|
|
216
|
+
* is what the caller sees when the pane layer is not there, which is the same
|
|
217
|
+
* value it sees in `none` mode.
|
|
218
|
+
*/
|
|
219
|
+
const attempt = async <T>(what: string, run: (live: MuxClient) => Promise<T>, fallback: T): Promise<T> => {
|
|
220
|
+
if (!usable() || client === null) return fallback;
|
|
221
|
+
try {
|
|
222
|
+
const value = await run(client);
|
|
223
|
+
healthy = true;
|
|
224
|
+
return value;
|
|
225
|
+
} catch (error) {
|
|
226
|
+
degrade(what, error);
|
|
227
|
+
return fallback;
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
const tagOwner = async (
|
|
232
|
+
live: MuxClient,
|
|
233
|
+
paneId: string,
|
|
234
|
+
tokens: Readonly<Record<string, string | null>>,
|
|
235
|
+
title?: string,
|
|
236
|
+
): Promise<void> => {
|
|
237
|
+
await live.paneReportMetadata({
|
|
238
|
+
paneId,
|
|
239
|
+
source: METADATA_SOURCE,
|
|
240
|
+
...(title === undefined ? {} : { title }),
|
|
241
|
+
tokens: {
|
|
242
|
+
[OWNER_TOKEN_KEY]: OWNER_TOKEN_VALUE,
|
|
243
|
+
[LEGACY_OWNER_TOKEN_KEY]: LEGACY_OWNER_TOKEN_VALUE,
|
|
244
|
+
...tokens,
|
|
245
|
+
},
|
|
246
|
+
});
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
const onEvent = (event: MuxEvent): void => {
|
|
250
|
+
if (event.kind === "layout.updated") {
|
|
251
|
+
docks?.noteLayoutUpdated(event.geometry);
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (event.kind === "pane.moved") {
|
|
255
|
+
// herdr rewrites the pane id on a move; the registry and dock state
|
|
256
|
+
// follow it so ownership is not lost to the user reorganizing.
|
|
257
|
+
const held = registry.forget(event.previousPaneId);
|
|
258
|
+
if (held) {
|
|
259
|
+
registry.record({ ...held, ref: { paneId: event.paneId, tabId: event.tabId, workspaceId: event.workspaceId } });
|
|
260
|
+
docks?.notePaneMoved(event.previousPaneId, event.paneId, event.tabId);
|
|
261
|
+
}
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
docks?.notePaneGone(event.paneId);
|
|
265
|
+
const dropped = registry.forget(event.paneId);
|
|
266
|
+
if (dropped) {
|
|
267
|
+
log("debug", `mux pane ${event.paneId} left on ${event.kind}; dropped from the registry`);
|
|
268
|
+
for (const handler of paneGoneHandlers) {
|
|
269
|
+
try {
|
|
270
|
+
handler(dropped);
|
|
271
|
+
} catch (error) {
|
|
272
|
+
log("debug", `mux pane-gone handler threw: ${error instanceof Error ? error.message : String(error)}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
const contract: MuxContract = {
|
|
279
|
+
mode: detection.mode,
|
|
280
|
+
|
|
281
|
+
available(): boolean {
|
|
282
|
+
return usable();
|
|
283
|
+
},
|
|
284
|
+
|
|
285
|
+
detection(): Readonly<MuxDetection> {
|
|
286
|
+
return detection;
|
|
287
|
+
},
|
|
288
|
+
|
|
289
|
+
async openUtilityPane(request: MuxOpenUtilityPaneRequest): Promise<MuxPaneRef | null> {
|
|
290
|
+
// Idempotence for docks: a slot that already has a pane answers with it.
|
|
291
|
+
const dockSlot = request.dock?.slot;
|
|
292
|
+
if (dockSlot && docks) {
|
|
293
|
+
const existing = docks.stateFor(dockSlot);
|
|
294
|
+
const held = existing ? registry.byPaneId(existing.paneId) : null;
|
|
295
|
+
if (held) return held.ref;
|
|
296
|
+
}
|
|
297
|
+
return await attempt(
|
|
298
|
+
"openUtilityPane",
|
|
299
|
+
async (live) => {
|
|
300
|
+
let ref: MuxPaneRef;
|
|
301
|
+
if (request.dock && docks) {
|
|
302
|
+
const placed = await docks.open(request.dock.slot, {
|
|
303
|
+
...(request.dock.share === undefined ? {} : { share: request.dock.share }),
|
|
304
|
+
cwd: request.cwd,
|
|
305
|
+
...(request.env ? { env: request.env } : {}),
|
|
306
|
+
});
|
|
307
|
+
// A refusal (anchor too small) is an answer, not a failure.
|
|
308
|
+
if (placed === null) return null;
|
|
309
|
+
ref = placed;
|
|
310
|
+
} else {
|
|
311
|
+
const anchor = anchorPaneId ?? (await live.paneCurrent()).paneId;
|
|
312
|
+
const pane = await live.paneSplit({
|
|
313
|
+
direction: request.direction ?? "right",
|
|
314
|
+
targetPaneId: anchor,
|
|
315
|
+
cwd: request.cwd,
|
|
316
|
+
focus: false,
|
|
317
|
+
...(request.env ? { env: request.env } : {}),
|
|
318
|
+
});
|
|
319
|
+
ref = { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
|
|
320
|
+
}
|
|
321
|
+
const purpose = request.purpose ?? "utility";
|
|
322
|
+
registry.record(paneRecord(ref, { purpose, label: request.label, openedAt: now() }));
|
|
323
|
+
const title = request.title;
|
|
324
|
+
const titleSupported = title !== undefined && muxSupportsMethod(detection.server, "pane.rename");
|
|
325
|
+
if (titleSupported) {
|
|
326
|
+
try {
|
|
327
|
+
await live.paneRename(ref.paneId, title);
|
|
328
|
+
} catch {
|
|
329
|
+
// Presentation is optional. A server that advertises the floor but
|
|
330
|
+
// lacks or refuses rename must not strand an otherwise healthy pane.
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// The `role` token is what adoptPane finds again after a restart.
|
|
334
|
+
await tagOwner(live, ref.paneId, { role: token(purpose) }, titleSupported ? title : undefined);
|
|
335
|
+
if (request.argv.length > 0) {
|
|
336
|
+
// herdr has no argv parameter on pane.split, so the command goes in
|
|
337
|
+
// through the pane's shell. `exec` replaces the shell so the pane
|
|
338
|
+
// exits with the program and emits pane.exited for reconciliation.
|
|
339
|
+
const redirect = request.stdoutPath ? ` > ${shellQuote([request.stdoutPath])}` : "";
|
|
340
|
+
await live.paneSendText(ref.paneId, `exec ${shellQuote(request.argv)}${redirect}\n`);
|
|
341
|
+
}
|
|
342
|
+
return ref;
|
|
343
|
+
},
|
|
344
|
+
null,
|
|
345
|
+
);
|
|
346
|
+
},
|
|
347
|
+
|
|
348
|
+
async closePane(paneId: string): Promise<boolean> {
|
|
349
|
+
// The ownership rule, restated for the operator-facing path: `/panes
|
|
350
|
+
// close` addresses panes by id and must refuse anything the registry
|
|
351
|
+
// does not hold.
|
|
352
|
+
if (!registry.owns(paneId)) return false;
|
|
353
|
+
return await attempt(
|
|
354
|
+
"closePane",
|
|
355
|
+
async (live) => {
|
|
356
|
+
await live.paneClose(paneId);
|
|
357
|
+
registry.forget(paneId);
|
|
358
|
+
// Dock state must fall with the registry entry, not ride on the async
|
|
359
|
+
// pane.closed push: if the event subscription failed at start(), no
|
|
360
|
+
// push ever comes, and a slot pointing at a dead pane makes every
|
|
361
|
+
// later dock open return the corpse.
|
|
362
|
+
docks?.notePaneGone(paneId);
|
|
363
|
+
return true;
|
|
364
|
+
},
|
|
365
|
+
false,
|
|
366
|
+
);
|
|
367
|
+
},
|
|
368
|
+
|
|
369
|
+
async adoptPane(request: { purpose: MuxPanePurpose; label: string; dock?: DockSlot }): Promise<MuxPaneRef | null> {
|
|
370
|
+
const existing = registry.byPurpose(request.purpose);
|
|
371
|
+
if (existing) return existing.ref;
|
|
372
|
+
return await attempt(
|
|
373
|
+
"adoptPane",
|
|
374
|
+
async (live) => {
|
|
375
|
+
const snapshot = await live.snapshot();
|
|
376
|
+
for (const pane of snapshot.panes) {
|
|
377
|
+
if (!hasOwnedPaneToken(pane.tokens)) continue;
|
|
378
|
+
if (pane.tokens.role !== request.purpose) continue;
|
|
379
|
+
if (registry.owns(pane.paneId)) continue;
|
|
380
|
+
// Another workspace's pane belongs to another session's screen;
|
|
381
|
+
// adopting it would retarget a surface the operator cannot see.
|
|
382
|
+
if (detection.self.workspaceId !== null && pane.workspaceId !== detection.self.workspaceId) continue;
|
|
383
|
+
const ref: MuxPaneRef = { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
|
|
384
|
+
registry.record(
|
|
385
|
+
paneRecord(ref, { purpose: request.purpose, label: request.label, openedAt: now(), adopted: true }),
|
|
386
|
+
);
|
|
387
|
+
// Crash recovery for a dock: the surviving pane takes the slot back so
|
|
388
|
+
// geometry management resumes instead of a second dock opening.
|
|
389
|
+
if (request.dock && docks) docks.adopt(request.dock, ref);
|
|
390
|
+
log("info", `mux adopted a ${request.purpose} pane left open by a previous session`);
|
|
391
|
+
return ref;
|
|
392
|
+
}
|
|
393
|
+
return null;
|
|
394
|
+
},
|
|
395
|
+
null,
|
|
396
|
+
);
|
|
397
|
+
},
|
|
398
|
+
|
|
399
|
+
async focusPane(paneId: string): Promise<boolean> {
|
|
400
|
+
// Ownership first: focusing the user's own panes stays off the table
|
|
401
|
+
// even though the wire allows it.
|
|
402
|
+
if (!registry.owns(paneId)) return false;
|
|
403
|
+
if (!muxSupportsMethod(detection.server, "pane.focus")) return false;
|
|
404
|
+
return await attempt(
|
|
405
|
+
"focusPane",
|
|
406
|
+
async (live) => {
|
|
407
|
+
await live.paneFocus(paneId);
|
|
408
|
+
return true;
|
|
409
|
+
},
|
|
410
|
+
false,
|
|
411
|
+
);
|
|
412
|
+
},
|
|
413
|
+
|
|
414
|
+
async zoomPane(paneId: string, mode: "on" | "off" | "toggle"): Promise<boolean> {
|
|
415
|
+
if (!registry.owns(paneId)) return false;
|
|
416
|
+
if (!muxSupportsMethod(detection.server, "pane.zoom")) return false;
|
|
417
|
+
return await attempt(
|
|
418
|
+
"zoomPane",
|
|
419
|
+
async (live) => {
|
|
420
|
+
const result = await live.paneZoom(paneId, mode);
|
|
421
|
+
// A toggle always changes state; on/off report false when already there.
|
|
422
|
+
return result.changed;
|
|
423
|
+
},
|
|
424
|
+
false,
|
|
425
|
+
);
|
|
426
|
+
},
|
|
427
|
+
|
|
428
|
+
async resizeDock(slot: DockSlot, share: number): Promise<boolean> {
|
|
429
|
+
if (!docks) return false;
|
|
430
|
+
return await attempt("resizeDock", () => docks.resize(slot, share), false);
|
|
431
|
+
},
|
|
432
|
+
|
|
433
|
+
docks(): ReadonlyArray<DockState> {
|
|
434
|
+
return docks?.states() ?? [];
|
|
435
|
+
},
|
|
436
|
+
|
|
437
|
+
async notify(request: MuxNotifyRequest): Promise<void> {
|
|
438
|
+
if (!muxSupportsMethod(detection.server, "notification.show")) {
|
|
439
|
+
log("debug", `mux notify skipped, server protocol is below the notification.show floor: ${request.title}`);
|
|
440
|
+
return;
|
|
441
|
+
}
|
|
442
|
+
await attempt(
|
|
443
|
+
"notify",
|
|
444
|
+
async (live) => {
|
|
445
|
+
const result = await live.notificationShow({
|
|
446
|
+
title: request.title,
|
|
447
|
+
...(request.body ? { body: request.body } : {}),
|
|
448
|
+
...(request.sound ? { sound: request.sound } : {}),
|
|
449
|
+
});
|
|
450
|
+
// A suppressed toast is the operator's own herdr config talking
|
|
451
|
+
// (disabled, rate limited, no foreground client). Reporting it as a
|
|
452
|
+
// warning would turn their setting into Clio's error.
|
|
453
|
+
if (!result.shown) log("debug", `mux notify not shown (${result.reason}): ${request.title}`);
|
|
454
|
+
return undefined;
|
|
455
|
+
},
|
|
456
|
+
undefined,
|
|
457
|
+
);
|
|
458
|
+
},
|
|
459
|
+
|
|
460
|
+
async worktreeCreate(request: MuxWorktreeCreateRequest): Promise<MuxWorktreeCreatedResult | null> {
|
|
461
|
+
if (!muxSupportsMethod(detection.server, "worktree.create")) {
|
|
462
|
+
log("debug", "mux worktree.create skipped, server protocol is below the worktree floor");
|
|
463
|
+
return null;
|
|
464
|
+
}
|
|
465
|
+
return await attempt("worktreeCreate", (live) => live.worktreeCreate(request), null);
|
|
466
|
+
},
|
|
467
|
+
|
|
468
|
+
async worktreeRemove(workspaceId: string, removeOptions = {}): Promise<boolean> {
|
|
469
|
+
if (!muxSupportsMethod(detection.server, "worktree.remove")) {
|
|
470
|
+
log("debug", "mux worktree.remove skipped, server protocol is below the worktree floor");
|
|
471
|
+
return false;
|
|
472
|
+
}
|
|
473
|
+
return await attempt(
|
|
474
|
+
"worktreeRemove",
|
|
475
|
+
async (live) => {
|
|
476
|
+
await live.worktreeRemove(workspaceId, removeOptions);
|
|
477
|
+
return true;
|
|
478
|
+
},
|
|
479
|
+
false,
|
|
480
|
+
);
|
|
481
|
+
},
|
|
482
|
+
|
|
483
|
+
onPaneGone(handler: (record: MuxPaneRecord) => void): () => void {
|
|
484
|
+
paneGoneHandlers.add(handler);
|
|
485
|
+
return () => {
|
|
486
|
+
paneGoneHandlers.delete(handler);
|
|
487
|
+
};
|
|
488
|
+
},
|
|
489
|
+
|
|
490
|
+
list(): ReadonlyArray<MuxPaneRecord> {
|
|
491
|
+
return registry.list();
|
|
492
|
+
},
|
|
493
|
+
|
|
494
|
+
async reportSelf(report: MuxSelfReport): Promise<boolean> {
|
|
495
|
+
const paneId = detection.self.paneId;
|
|
496
|
+
if (detection.mode !== "guest" || !paneId) return false;
|
|
497
|
+
return await attempt(
|
|
498
|
+
"reportSelf",
|
|
499
|
+
async (live) => {
|
|
500
|
+
await live.paneReportAgent({
|
|
501
|
+
paneId,
|
|
502
|
+
source: SELF_AGENT_SOURCE,
|
|
503
|
+
agent: "clio-coder",
|
|
504
|
+
state: report.state,
|
|
505
|
+
...(report.message ? { message: report.message } : {}),
|
|
506
|
+
});
|
|
507
|
+
if (report.tokens || report.stateLabels || report.ttlMs !== undefined) {
|
|
508
|
+
await live.paneReportMetadata({
|
|
509
|
+
paneId,
|
|
510
|
+
source: METADATA_SOURCE,
|
|
511
|
+
...(report.tokens ? { tokens: report.tokens } : {}),
|
|
512
|
+
...(report.stateLabels ? { stateLabels: report.stateLabels } : {}),
|
|
513
|
+
...(report.ttlMs !== undefined ? { ttlMs: report.ttlMs } : {}),
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
return true;
|
|
517
|
+
},
|
|
518
|
+
false,
|
|
519
|
+
);
|
|
520
|
+
},
|
|
521
|
+
|
|
522
|
+
async shutdown(): Promise<void> {
|
|
523
|
+
if (stopped) return;
|
|
524
|
+
stopped = true;
|
|
525
|
+
subscription?.close();
|
|
526
|
+
subscription = null;
|
|
527
|
+
paneGoneHandlers.clear();
|
|
528
|
+
// Docks close with the session: a native application takes its windows
|
|
529
|
+
// with it. A crash never reaches this method, which is exactly what
|
|
530
|
+
// leaves dock panes behind for the next session's adoption path.
|
|
531
|
+
// Unmanaged utility panes are the operator's and stay open.
|
|
532
|
+
if (client && docks) {
|
|
533
|
+
for (const paneId of docks.paneIds()) {
|
|
534
|
+
await client.paneClose(paneId).catch(() => undefined);
|
|
535
|
+
registry.forget(paneId);
|
|
536
|
+
}
|
|
537
|
+
docks.clear();
|
|
538
|
+
}
|
|
539
|
+
if (client) await client.close().catch(() => undefined);
|
|
540
|
+
},
|
|
541
|
+
};
|
|
542
|
+
|
|
543
|
+
const start = async (): Promise<void> => {
|
|
544
|
+
if (detection.mode === "none" || client === null) return;
|
|
545
|
+
try {
|
|
546
|
+
const kinds: ("pane.closed" | "pane.exited" | "pane.moved" | "layout.updated")[] = ["pane.closed", "pane.exited"];
|
|
547
|
+
if (docks) kinds.push("pane.moved", "layout.updated");
|
|
548
|
+
subscription = await client.subscribe(kinds, onEvent, {
|
|
549
|
+
onResync: (snapshot) => {
|
|
550
|
+
// A reconnect means events were missed. The snapshot is the authority
|
|
551
|
+
// on which panes still exist, so anything Clio thinks it owns that is
|
|
552
|
+
// absent from it is gone.
|
|
553
|
+
const dropped = registry.reconcile(snapshot.panes.map((pane) => pane.paneId));
|
|
554
|
+
for (const record of dropped) docks?.notePaneGone(record.ref.paneId);
|
|
555
|
+
if (dropped.length > 0) {
|
|
556
|
+
log("info", `mux reconciled ${dropped.length} pane(s) closed while the socket was down`);
|
|
557
|
+
}
|
|
558
|
+
},
|
|
559
|
+
});
|
|
560
|
+
} catch (error) {
|
|
561
|
+
degrade("event subscription", error);
|
|
562
|
+
}
|
|
563
|
+
};
|
|
564
|
+
|
|
565
|
+
return { contract, start, stop: contract.shutdown, registry };
|
|
566
|
+
}
|