@iowarp/clio-coder 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +131 -0
- package/CONTRIBUTING.md +59 -36
- package/README.md +407 -375
- package/SECURITY.md +2 -1
- package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
- package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
- package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/chunk-34BHNEE3.js +1846 -0
- package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/chunk-3KIPBMUA.js +308 -0
- package/dist/chunk-3M6DQK6S.js +362 -0
- package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
- package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
- package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
- package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
- package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
- package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
- package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
- package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
- package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-F2I26BDK.js +66 -0
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
- package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
- package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
- package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
- package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
- package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
- package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/chunk-NMJXSHBJ.js +283 -0
- package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
- package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
- package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
- package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
- package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
- package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
- package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
- package/dist/chunk-UXCU4E3T.js +303 -0
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
- package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
- package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
- package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
- package/dist/chunk-XQRY4DTA.js +657 -0
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
- package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
- package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +38 -37
- package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
- package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
- package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
- package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
- package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
- package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
- package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
- package/dist/doctor-LHBD36VU.js +773 -0
- package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
- package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
- package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
- package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
- package/dist/fleet-view-TWHJKCN6.js +96 -0
- package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
- package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
- package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
- package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
- package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
- package/dist/panes-IXKLOKA2.js +75 -0
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
- package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
- package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
- package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
- package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
- package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
- package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
- package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
- package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
- package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
- package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
- package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
- package/dist/worker/entry.js +83 -63
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
- package/docs/history/release-cut-checklist.md +207 -0
- package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +13 -21
- package/skills/README.md +51 -42
- package/skills/coding/ast-grep/SKILL.md +9 -3
- package/skills/coding/coding-standards/SKILL.md +9 -3
- package/skills/coding/prototype/SKILL.md +9 -3
- package/skills/coding/tdd/SKILL.md +9 -3
- package/skills/context/context-handoff/SKILL.md +13 -4
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +9 -3
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +10 -5
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +9 -3
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +10 -4
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +8 -3
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +8 -3
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
- package/skills/meta/clio-coder-test/SKILL.md +146 -0
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
- package/skills/meta/clio-coder-test/references/harness.md +102 -0
- package/skills/meta/clio-coder-test/references/test-map.md +96 -0
- package/skills/meta/credentials/SKILL.md +10 -3
- package/skills/meta/find-skills/SKILL.md +9 -3
- package/skills/meta/herdr/SKILL.md +9 -3
- package/skills/meta/skill-craft/SKILL.md +39 -16
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +9 -3
- package/skills/planning/prd/SKILL.md +9 -3
- package/skills/planning/product-intent/SKILL.md +9 -3
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +9 -3
- package/skills/research/experiment-protocol/SKILL.md +10 -3
- package/skills/research/scientific-debugging/SKILL.md +10 -3
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +10 -3
- package/skills/skill-marketplace.json +285 -66
- package/skills/workflow/cut-it/SKILL.md +11 -3
- package/skills/workflow/design-council/SKILL.md +12 -3
- package/skills/workflow/grill-me/SKILL.md +9 -3
- package/skills/workflow/workflow-distiller/SKILL.md +9 -3
- package/src/cli/acp.ts +2 -2
- package/src/cli/args.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +6 -6
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +68 -15
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -31
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +28 -20
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +31 -10
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/eval.ts +1 -2
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet-decisions.ts +1 -1
- package/src/cli/fleet-inspect.ts +1 -1
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +1 -1
- package/src/cli/fleet-view.ts +40 -23
- package/src/cli/fleet.ts +9 -6
- package/src/cli/index.ts +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/interop-inspect.ts +2 -2
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +19 -5
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +13 -17
- package/src/cli/share.ts +6 -2
- package/src/cli/skills-eval.ts +14 -14
- package/src/cli/targets.ts +25 -30
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +96 -4
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +1 -1
- package/src/cli/wiki-generate.ts +6 -6
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +132 -87
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +51 -6
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1066 -886
- package/src/core/defaults.ts +326 -530
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +33 -52
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/prompt-hint.ts +9 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/timers.ts +2 -12
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +14 -26
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +26 -4
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract.ts +1 -1
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +35 -47
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +56 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -6
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capability-match.ts +10 -0
- package/src/domains/dispatch/capacity-lease.ts +2 -5
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/extension.ts +169 -82
- package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +0 -7
- package/src/domains/dispatch/gate-decisions.ts +25 -14
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +220 -70
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +0 -23
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal.ts +9 -19
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +47 -40
- package/src/domains/dispatch/types.ts +58 -6
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +10 -4
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +20 -3
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +22 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +276 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +86 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +35 -4
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +30 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +195 -25
- package/src/domains/mux/detect.ts +23 -6
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +21 -1
- package/src/domains/mux/operations.ts +72 -5
- package/src/domains/mux/protocol.ts +19 -6
- package/src/domains/mux/socket-client.ts +167 -19
- package/src/domains/mux/types.ts +49 -6
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +79 -7
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/extension.ts +12 -4
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +15 -91
- package/src/domains/observability/trace-store.ts +65 -19
- package/src/domains/prompts/compiler.ts +75 -55
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +100 -12
- package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +11 -18
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +99 -23
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +671 -106
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +9 -4
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +87 -39
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +41 -18
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +249 -43
- package/src/domains/toolchain/install.ts +1 -1
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +89 -35
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +1 -1
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +4 -23
- package/src/engine/apis/lmstudio.ts +4 -9
- package/src/engine/apis/ollama-native.ts +9 -9
- package/src/engine/apis/openai-completions.ts +30 -27
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +10 -35
- package/src/engine/claude/sdk-module.ts +1 -12
- package/src/engine/claude/sdk-runtime.ts +6 -6
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -17
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +1 -1
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +54 -24
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +163 -120
- package/src/interactive/application-controller.ts +23 -22
- package/src/interactive/bus-notices.ts +10 -3
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +18 -9
- package/src/interactive/chat-panel.ts +37 -14
- package/src/interactive/chat-renderer.ts +71 -7
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +36 -44
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +15 -44
- package/src/interactive/interactive-application.ts +116 -61
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +6 -2
- package/src/interactive/interactive-presentation.ts +22 -17
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +65 -17
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +2 -2
- package/src/interactive/modal-marker.ts +2 -21
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/overlay-frame.ts +4 -12
- package/src/interactive/overlay-general-openers.ts +6 -2
- package/src/interactive/overlay-key-routing.ts +7 -7
- package/src/interactive/overlay-lifecycle.ts +1 -1
- package/src/interactive/overlay-model-selectors.ts +3 -3
- package/src/interactive/overlays/agents.ts +2 -2
- package/src/interactive/overlays/ask-user.ts +25 -11
- package/src/interactive/overlays/context-reset.ts +28 -4
- package/src/interactive/overlays/cwd-fallback.ts +28 -4
- package/src/interactive/overlays/decisions.ts +4 -2
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/interop.ts +1 -1
- package/src/interactive/overlays/library-install-confirm.ts +1 -1
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/model-selector.ts +39 -31
- package/src/interactive/overlays/prompts.ts +10 -4
- package/src/interactive/overlays/session-selector.ts +2 -2
- package/src/interactive/overlays/settings.ts +360 -303
- package/src/interactive/overlays/side-question.ts +2 -2
- package/src/interactive/overlays/skills-hub.ts +8 -8
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/panes-runtime.ts +145 -43
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +401 -190
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -24
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +41 -26
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +12 -9
- package/src/interactive/view/view-overlay.ts +13 -10
- package/src/interactive/watch-pane.ts +38 -10
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +4 -4
- package/src/interactive/worker-receipts.ts +1 -1
- package/src/interactive/worker-stream.ts +1 -4
- package/src/interactive/yazi-bridge.ts +72 -11
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +6 -6
- package/src/tools/bash.ts +2 -2
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +44 -13
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +6 -2
- package/src/tools/dispatch-plan.ts +48 -15
- package/src/tools/dispatch-run-events.ts +13 -11
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/find.ts +1 -6
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +4 -5
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +30 -7
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-36EJLSQQ.js +0 -814
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUCTJL45.js +0 -45
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-TZ3SGWZZ.js +0 -48
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/dist/fleet-view-ZCON35AG.js +0 -102
- package/dist/panes-HMABYVO4.js +0 -58
- package/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/release-cut-checklist.md +0 -193
- package/docs/time-conventions.md +0 -101
- package/skills/meta/clio-test/SKILL.md +0 -133
- package/skills/meta/clio-test/references/harness.md +0 -126
- package/skills/meta/clio-test/references/test-map.md +0 -69
- package/src/engine/apis/degraded-inference.ts +0 -95
|
@@ -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,
|
|
@@ -93,4 +113,4 @@ export {
|
|
|
93
113
|
type YaziSessionOptions,
|
|
94
114
|
type YaziSessionSnapshot,
|
|
95
115
|
} from "./yazi/session.js";
|
|
96
|
-
export { renderYaziTheme } from "./yazi/theme.js";
|
|
116
|
+
export { renderHerdrThemeBlock, renderYaziTheme } from "./yazi/theme.js";
|
|
@@ -14,13 +14,19 @@
|
|
|
14
14
|
* shell-escape territory (spec 4.8, and the risk register's "tool misuse" row).
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* Utility pane presets, in the order `/panes open` lists them.
|
|
19
|
+
*
|
|
20
|
+
* The files preset is a Clio Coder surface named for what it does; yazi is
|
|
21
|
+
* the engine behind it and shows up only in the install command, because
|
|
22
|
+
* that is the registry id an operator types.
|
|
23
|
+
*/
|
|
18
24
|
export const PANES_PRESETS = [
|
|
19
25
|
{
|
|
20
|
-
id: "
|
|
26
|
+
id: "files",
|
|
21
27
|
/** Probed through the toolchain resolution ladder before the pane is split. */
|
|
22
28
|
binary: "yazi",
|
|
23
|
-
summary: "file
|
|
29
|
+
summary: "file view rooted at the workspace; picks land in the composer",
|
|
24
30
|
/** Printed verbatim when the probe finds nothing. */
|
|
25
31
|
installHint: "clio-coder tools install yazi",
|
|
26
32
|
},
|
|
@@ -42,10 +48,23 @@ export type PanesPresetId = (typeof PANES_PRESETS)[number]["id"];
|
|
|
42
48
|
|
|
43
49
|
export const PANES_PRESET_IDS: ReadonlyArray<PanesPresetId> = PANES_PRESETS.map((preset) => preset.id);
|
|
44
50
|
|
|
45
|
-
|
|
51
|
+
function isPanesPresetId(value: string): value is PanesPresetId {
|
|
46
52
|
return PANES_PRESETS.some((preset) => preset.id === value);
|
|
47
53
|
}
|
|
48
54
|
|
|
55
|
+
/**
|
|
56
|
+
* Retired preset spellings that still parse. The files preset shipped as
|
|
57
|
+
* `yazi` in 0.4.0 and 0.4.1, so an operator's muscle memory and any script
|
|
58
|
+
* that says `/panes open yazi` keeps working and lands on the same pane.
|
|
59
|
+
*/
|
|
60
|
+
export const PANES_PRESET_ALIASES: Readonly<Record<string, PanesPresetId>> = { yazi: "files" };
|
|
61
|
+
|
|
62
|
+
/** The canonical preset id for an operator-typed name, or null when it is not a preset. */
|
|
63
|
+
export function resolvePanesPresetId(value: string): PanesPresetId | null {
|
|
64
|
+
if (isPanesPresetId(value)) return value;
|
|
65
|
+
return PANES_PRESET_ALIASES[value] ?? null;
|
|
66
|
+
}
|
|
67
|
+
|
|
49
68
|
/** One pane Clio owns, flattened for display. */
|
|
50
69
|
export interface PanesInventoryEntry {
|
|
51
70
|
paneId: string;
|
|
@@ -61,6 +80,8 @@ export interface PanesInventoryEntry {
|
|
|
61
80
|
export interface PanesEffectiveSettings {
|
|
62
81
|
enabled: string;
|
|
63
82
|
notifications: string;
|
|
83
|
+
/** Boot composition: off, workers, or cockpit. */
|
|
84
|
+
layout: string;
|
|
64
85
|
journal: boolean;
|
|
65
86
|
yazi: {
|
|
66
87
|
enabled: boolean;
|
|
@@ -70,6 +91,14 @@ export interface PanesEffectiveSettings {
|
|
|
70
91
|
};
|
|
71
92
|
}
|
|
72
93
|
|
|
94
|
+
/** One managed dock's live geometry, flattened for `/panes` status. */
|
|
95
|
+
export interface PanesDockStatus {
|
|
96
|
+
slot: "workers" | "files";
|
|
97
|
+
paneId: string;
|
|
98
|
+
/** Share of the axis the dock currently targets, 0..0.5. */
|
|
99
|
+
targetShare: number;
|
|
100
|
+
}
|
|
101
|
+
|
|
73
102
|
/** File-pane return-path state flattened for `/panes` and the model tool. */
|
|
74
103
|
export interface PanesYaziStatus {
|
|
75
104
|
mode: "companion" | "chooser" | "closed";
|
|
@@ -89,6 +118,8 @@ export interface PanesStatus {
|
|
|
89
118
|
server: { version: string; protocol: number } | null;
|
|
90
119
|
settings: PanesEffectiveSettings;
|
|
91
120
|
yazi: PanesYaziStatus;
|
|
121
|
+
/** Managed docks with live geometry; empty below the layout tier. */
|
|
122
|
+
docks: ReadonlyArray<PanesDockStatus>;
|
|
92
123
|
panes: ReadonlyArray<PanesInventoryEntry>;
|
|
93
124
|
}
|
|
94
125
|
|
|
@@ -109,6 +140,11 @@ export type PanesWatchResult =
|
|
|
109
140
|
* is: neither the domain nor the tool may import the interactive tree.
|
|
110
141
|
*/
|
|
111
142
|
export interface PanesWatchController {
|
|
143
|
+
/**
|
|
144
|
+
* Open (or adopt) the watch pane without retargeting it, for boot
|
|
145
|
+
* composition under `interface.panes.layout`. False when the host refused.
|
|
146
|
+
*/
|
|
147
|
+
ensureOpen(): Promise<boolean>;
|
|
112
148
|
/** Point the watch pane at a run, opening or adopting the pane first if needed. */
|
|
113
149
|
watch(runId: string): Promise<PanesWatchResult>;
|
|
114
150
|
/** Retarget only; false when no watch pane is open or the write failed. */
|
|
@@ -118,11 +154,17 @@ export interface PanesWatchController {
|
|
|
118
154
|
}
|
|
119
155
|
|
|
120
156
|
export type PanesOpenResult =
|
|
121
|
-
|
|
157
|
+
/** `existing` is true when the preset already had a live pane and it was focused instead of split again. */
|
|
158
|
+
| { status: "opened"; label: string; paneId: string | null; existing?: boolean }
|
|
122
159
|
| { status: "missing-binary"; preset: string; binary: string; installHint: string; detail: string }
|
|
123
160
|
| { status: "refused"; reason: string }
|
|
124
161
|
| { status: "unavailable"; reason: string };
|
|
125
162
|
|
|
163
|
+
export type PanesZoomResult =
|
|
164
|
+
| { status: "zoomed"; paneId: string; label: string }
|
|
165
|
+
| { status: "not-found"; target: string }
|
|
166
|
+
| { status: "unavailable"; reason: string };
|
|
167
|
+
|
|
126
168
|
export type PanesCloseResult =
|
|
127
169
|
| { status: "closed"; closed: number; labels: ReadonlyArray<string> }
|
|
128
170
|
| { status: "not-found"; target: string }
|
|
@@ -144,9 +186,21 @@ export interface PanesYaziController {
|
|
|
144
186
|
| { status: "profile-error"; reason: string }
|
|
145
187
|
| { status: "unavailable"; reason: string }
|
|
146
188
|
>;
|
|
189
|
+
/** Close the files pane if it is open; false when nothing was open. */
|
|
190
|
+
close(): Promise<boolean>;
|
|
191
|
+
/** True while a files pane the host still reports is open. */
|
|
192
|
+
isOpen(): boolean;
|
|
147
193
|
status(): Readonly<PanesYaziStatus>;
|
|
148
194
|
}
|
|
149
195
|
|
|
196
|
+
/** What `/files` and the files keybinding settle to. */
|
|
197
|
+
export type PanesFilesResult =
|
|
198
|
+
| { status: "opened"; paneId: string | null; existing: boolean }
|
|
199
|
+
| { status: "closed" }
|
|
200
|
+
| { status: "missing-binary"; binary: string; installHint: string; detail: string }
|
|
201
|
+
| { status: "refused"; reason: string }
|
|
202
|
+
| { status: "unavailable"; reason: string };
|
|
203
|
+
|
|
150
204
|
/**
|
|
151
205
|
* The operations both callers drive. The tool sees a narrower door: its schema
|
|
152
206
|
* has no argv field at all, and `open` refuses one even if a caller fabricates
|
|
@@ -156,7 +210,20 @@ export interface PanesOperations {
|
|
|
156
210
|
status(): PanesStatus;
|
|
157
211
|
show(target: string): Promise<PanesShowResult>;
|
|
158
212
|
open(request: { preset?: string; argv?: ReadonlyArray<string>; once?: boolean }): Promise<PanesOpenResult>;
|
|
213
|
+
/**
|
|
214
|
+
* Toggle zoom on one Clio-owned pane, matched like `close` (pane id, label
|
|
215
|
+
* substring, then purpose; newest first). Zooming steals focus, so this is
|
|
216
|
+
* operator-only and never reachable from the model tool.
|
|
217
|
+
*/
|
|
218
|
+
zoom(target: string): Promise<PanesZoomResult>;
|
|
159
219
|
close(target: string): Promise<PanesCloseResult>;
|
|
220
|
+
/**
|
|
221
|
+
* The files pane as one operator verb. `toggle` opens it when closed and
|
|
222
|
+
* closes it when open, which is what a keybinding needs; `open` and
|
|
223
|
+
* `close` are the explicit halves; `pick` borrows the pane for one
|
|
224
|
+
* selection and closes it afterwards.
|
|
225
|
+
*/
|
|
226
|
+
files(action: "toggle" | "open" | "close" | "pick"): Promise<PanesFilesResult>;
|
|
160
227
|
/** Bind the composer-facing Yazi bridge without rebuilding this shared object. */
|
|
161
228
|
attachYazi(controller: PanesYaziController): () => void;
|
|
162
229
|
/** Bind the workers-view watch controller; `show` routes runs through it. */
|
|
@@ -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,
|