@iowarp/clio-coder 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +131 -0
- package/CONTRIBUTING.md +59 -36
- package/README.md +407 -375
- package/SECURITY.md +2 -1
- package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
- package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
- package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
- package/dist/chunk-2X4RYJTJ.js +39 -0
- package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/chunk-34BHNEE3.js +1846 -0
- package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
- package/dist/chunk-3KIPBMUA.js +308 -0
- package/dist/chunk-3M6DQK6S.js +362 -0
- package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
- package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
- package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
- package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
- package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
- package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/chunk-77QIVUZB.js +1334 -0
- package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
- package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
- package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
- package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
- package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
- package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-F2I26BDK.js +66 -0
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
- package/dist/chunk-HLAFFSEK.js +360 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
- package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
- package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
- package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
- package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
- package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
- package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
- package/dist/chunk-KPXDY6QF.js +47 -0
- package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
- package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
- package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
- package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/chunk-NMJXSHBJ.js +283 -0
- package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
- package/dist/chunk-PJX3WQUQ.js +42 -0
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
- package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
- package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
- package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
- package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
- package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
- package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
- package/dist/chunk-UXCU4E3T.js +303 -0
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
- package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
- package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
- package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
- package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
- package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
- package/dist/chunk-XQRY4DTA.js +657 -0
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
- package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
- package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +38 -37
- package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
- package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
- package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
- package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
- package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
- package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
- package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
- package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
- package/dist/doctor-LHBD36VU.js +773 -0
- package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
- package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
- package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
- package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
- package/dist/fleet-view-TWHJKCN6.js +96 -0
- package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
- package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
- package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
- package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
- package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
- package/dist/panes-IXKLOKA2.js +75 -0
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
- package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
- package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
- package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
- package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
- package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
- package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
- package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
- package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
- package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
- package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
- package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
- package/dist/worker/entry.js +83 -63
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
- package/docs/{observability.md → architecture/observability.md} +26 -13
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
- package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
- package/docs/guide/configuration-reference.md +1158 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
- package/docs/history/release-cut-checklist.md +207 -0
- package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +13 -21
- package/skills/README.md +51 -42
- package/skills/coding/ast-grep/SKILL.md +9 -3
- package/skills/coding/coding-standards/SKILL.md +9 -3
- package/skills/coding/prototype/SKILL.md +9 -3
- package/skills/coding/tdd/SKILL.md +9 -3
- package/skills/context/context-handoff/SKILL.md +13 -4
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +9 -3
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +10 -5
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +9 -3
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +10 -4
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +8 -3
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +8 -3
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
- package/skills/meta/clio-coder-test/SKILL.md +146 -0
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
- package/skills/meta/clio-coder-test/references/harness.md +102 -0
- package/skills/meta/clio-coder-test/references/test-map.md +96 -0
- package/skills/meta/credentials/SKILL.md +10 -3
- package/skills/meta/find-skills/SKILL.md +9 -3
- package/skills/meta/herdr/SKILL.md +9 -3
- package/skills/meta/skill-craft/SKILL.md +39 -16
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +9 -3
- package/skills/planning/prd/SKILL.md +9 -3
- package/skills/planning/product-intent/SKILL.md +9 -3
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +9 -3
- package/skills/research/experiment-protocol/SKILL.md +10 -3
- package/skills/research/scientific-debugging/SKILL.md +10 -3
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +10 -3
- package/skills/skill-marketplace.json +285 -66
- package/skills/workflow/cut-it/SKILL.md +11 -3
- package/skills/workflow/design-council/SKILL.md +12 -3
- package/skills/workflow/grill-me/SKILL.md +9 -3
- package/skills/workflow/workflow-distiller/SKILL.md +9 -3
- package/src/cli/acp.ts +2 -2
- package/src/cli/args.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +6 -6
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +68 -15
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -31
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +28 -20
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +31 -10
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/eval.ts +1 -2
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet-decisions.ts +1 -1
- package/src/cli/fleet-inspect.ts +1 -1
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +1 -1
- package/src/cli/fleet-view.ts +40 -23
- package/src/cli/fleet.ts +9 -6
- package/src/cli/index.ts +2 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/interop-inspect.ts +2 -2
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/panes.ts +19 -5
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +13 -17
- package/src/cli/share.ts +6 -2
- package/src/cli/skills-eval.ts +14 -14
- package/src/cli/targets.ts +25 -30
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +96 -4
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +1 -1
- package/src/cli/wiki-generate.ts +6 -6
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +132 -87
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-events.ts +51 -6
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1066 -886
- package/src/core/defaults.ts +326 -530
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +33 -52
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/prompt-hint.ts +9 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/timers.ts +2 -12
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/catalog.ts +14 -26
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +26 -4
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract.ts +1 -1
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +35 -47
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +56 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -6
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capability-match.ts +10 -0
- package/src/domains/dispatch/capacity-lease.ts +2 -5
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/extension.ts +169 -82
- package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +0 -7
- package/src/domains/dispatch/gate-decisions.ts +25 -14
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +220 -70
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +0 -23
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal.ts +9 -19
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +47 -40
- package/src/domains/dispatch/types.ts +58 -6
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +10 -4
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +20 -3
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +22 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +276 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +86 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +35 -4
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +30 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +195 -25
- package/src/domains/mux/detect.ts +23 -6
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +21 -1
- package/src/domains/mux/operations.ts +72 -5
- package/src/domains/mux/protocol.ts +19 -6
- package/src/domains/mux/socket-client.ts +167 -19
- package/src/domains/mux/types.ts +49 -6
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +79 -7
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/extension.ts +12 -4
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +15 -91
- package/src/domains/observability/trace-store.ts +65 -19
- package/src/domains/prompts/compiler.ts +75 -55
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +100 -12
- package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +11 -18
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +99 -23
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +671 -106
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +9 -4
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +87 -39
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +41 -18
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/share/archive.ts +249 -43
- package/src/domains/toolchain/install.ts +1 -1
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +89 -35
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +1 -1
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +4 -23
- package/src/engine/apis/lmstudio.ts +4 -9
- package/src/engine/apis/ollama-native.ts +9 -9
- package/src/engine/apis/openai-completions.ts +30 -27
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +10 -35
- package/src/engine/claude/sdk-module.ts +1 -12
- package/src/engine/claude/sdk-runtime.ts +6 -6
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -17
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +1 -1
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +54 -24
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +163 -120
- package/src/interactive/application-controller.ts +23 -22
- package/src/interactive/bus-notices.ts +10 -3
- package/src/interactive/chat-loop-messages.ts +3 -13
- package/src/interactive/chat-loop.ts +18 -9
- package/src/interactive/chat-panel.ts +37 -14
- package/src/interactive/chat-renderer.ts +71 -7
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +36 -44
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +15 -44
- package/src/interactive/interactive-application.ts +116 -61
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +6 -2
- package/src/interactive/interactive-presentation.ts +22 -17
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +65 -17
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +2 -2
- package/src/interactive/modal-marker.ts +2 -21
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/overlay-frame.ts +4 -12
- package/src/interactive/overlay-general-openers.ts +6 -2
- package/src/interactive/overlay-key-routing.ts +7 -7
- package/src/interactive/overlay-lifecycle.ts +1 -1
- package/src/interactive/overlay-model-selectors.ts +3 -3
- package/src/interactive/overlays/agents.ts +2 -2
- package/src/interactive/overlays/ask-user.ts +25 -11
- package/src/interactive/overlays/context-reset.ts +28 -4
- package/src/interactive/overlays/cwd-fallback.ts +28 -4
- package/src/interactive/overlays/decisions.ts +4 -2
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/interop.ts +1 -1
- package/src/interactive/overlays/library-install-confirm.ts +1 -1
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/model-selector.ts +39 -31
- package/src/interactive/overlays/prompts.ts +10 -4
- package/src/interactive/overlays/session-selector.ts +2 -2
- package/src/interactive/overlays/settings.ts +360 -303
- package/src/interactive/overlays/side-question.ts +2 -2
- package/src/interactive/overlays/skills-hub.ts +8 -8
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/panes-runtime.ts +145 -43
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +401 -190
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -24
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +41 -26
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +12 -9
- package/src/interactive/view/view-overlay.ts +13 -10
- package/src/interactive/watch-pane.ts +38 -10
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +4 -4
- package/src/interactive/worker-receipts.ts +1 -1
- package/src/interactive/worker-stream.ts +1 -4
- package/src/interactive/yazi-bridge.ts +72 -11
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +6 -6
- package/src/tools/bash.ts +2 -2
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +44 -13
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +6 -2
- package/src/tools/dispatch-plan.ts +48 -15
- package/src/tools/dispatch-run-events.ts +13 -11
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/find.ts +1 -6
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observation.ts +4 -5
- package/src/tools/observers.ts +0 -33
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +30 -7
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-36EJLSQQ.js +0 -814
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUCTJL45.js +0 -45
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-TZ3SGWZZ.js +0 -48
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/dist/fleet-view-ZCON35AG.js +0 -102
- package/dist/panes-HMABYVO4.js +0 -58
- package/docs/artifact-versions.md +0 -67
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/release-cut-checklist.md +0 -193
- package/docs/time-conventions.md +0 -101
- package/skills/meta/clio-test/SKILL.md +0 -133
- package/skills/meta/clio-test/references/harness.md +0 -126
- package/skills/meta/clio-test/references/test-map.md +0 -69
- package/src/engine/apis/degraded-inference.ts +0 -95
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createHookBudgetTracker, type HookBudgetStats, type HookBudgetTracker } from "./budget.js";
|
|
2
|
+
import type { MiddlewareRegistrationConflictTier, MiddlewareRegistrationOwner } from "./registrations.js";
|
|
2
3
|
import { listMiddlewareRuleDefinitions } from "./rules.js";
|
|
3
4
|
import {
|
|
4
5
|
MIDDLEWARE_HOOK_TEXT_MAX_CHARS,
|
|
@@ -90,6 +91,20 @@ export type MiddlewareDiagnostic =
|
|
|
90
91
|
steadyStateWarn: boolean;
|
|
91
92
|
/** Rolling-window stats (p50/p95/over-count) for diagnosis. */
|
|
92
93
|
stats: HookBudgetStats;
|
|
94
|
+
}
|
|
95
|
+
| {
|
|
96
|
+
/**
|
|
97
|
+
* An owned registration set offered an id already held by a builtin
|
|
98
|
+
* rule or a host registration (dropped), or a later host registration
|
|
99
|
+
* took an id an owner held (evicted). Bookkeeping only; nothing was
|
|
100
|
+
* evaluated.
|
|
101
|
+
*/
|
|
102
|
+
kind: "registration_conflict";
|
|
103
|
+
registrationId: string;
|
|
104
|
+
owner: MiddlewareRegistrationOwner;
|
|
105
|
+
generation: number;
|
|
106
|
+
conflictsWith: MiddlewareRegistrationConflictTier;
|
|
107
|
+
action: "dropped" | "evicted";
|
|
93
108
|
};
|
|
94
109
|
|
|
95
110
|
export type MiddlewareDiagnosticSink = (diagnostic: MiddlewareDiagnostic) => void;
|
|
@@ -102,10 +117,14 @@ export type MiddlewareDiagnosticSink = (diagnostic: MiddlewareDiagnostic) => voi
|
|
|
102
117
|
export function writeMiddlewareDiagnosticToStderr(diagnostic: MiddlewareDiagnostic): void {
|
|
103
118
|
if (diagnostic.kind === "hook_failed") {
|
|
104
119
|
process.stderr.write(
|
|
105
|
-
`[clio:middleware] registration '${diagnostic.registrationId}' failed on '${diagnostic.hook}': ${diagnostic.message}\n`,
|
|
120
|
+
`[clio-coder:middleware] registration '${diagnostic.registrationId}' failed on '${diagnostic.hook}': ${diagnostic.message}\n`,
|
|
106
121
|
);
|
|
107
122
|
return;
|
|
108
123
|
}
|
|
124
|
+
if (diagnostic.kind === "registration_conflict") {
|
|
125
|
+
process.stderr.write(`[clio-coder:middleware] ${formatRegistrationConflict(diagnostic)}\n`);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
109
128
|
// A single post-warmup spike is telemetry, not operator-facing noise: only
|
|
110
129
|
// consistent slowness prints, unless CLIO_CODER_HOOK_BUDGET_DEBUG=1 asks for all.
|
|
111
130
|
if (!diagnostic.steadyStateWarn && process.env.CLIO_CODER_HOOK_BUDGET_DEBUG !== "1") return;
|
|
@@ -115,11 +134,20 @@ export function writeMiddlewareDiagnosticToStderr(diagnostic: MiddlewareDiagnost
|
|
|
115
134
|
? ` (slow on ${stats.overCount}/${stats.window} recent ${diagnostic.hook} calls, p95 ${stats.p95Ms.toFixed(1)}ms)`
|
|
116
135
|
: "";
|
|
117
136
|
process.stderr.write(
|
|
118
|
-
`[clio:middleware] registration '${diagnostic.registrationId}' exceeded budget on '${diagnostic.hook}': ` +
|
|
137
|
+
`[clio-coder:middleware] registration '${diagnostic.registrationId}' exceeded budget on '${diagnostic.hook}': ` +
|
|
119
138
|
`${diagnostic.elapsedMs.toFixed(1)}ms > ${diagnostic.budgetMs}ms${trend}\n`,
|
|
120
139
|
);
|
|
121
140
|
}
|
|
122
141
|
|
|
142
|
+
/** One operator line for a registration_conflict diagnostic. */
|
|
143
|
+
export function formatRegistrationConflict(
|
|
144
|
+
diagnostic: Extract<MiddlewareDiagnostic, { kind: "registration_conflict" }>,
|
|
145
|
+
): string {
|
|
146
|
+
return diagnostic.action === "dropped"
|
|
147
|
+
? `${diagnostic.owner} registration '${diagnostic.registrationId}' (generation ${diagnostic.generation}) dropped: id is held by a ${diagnostic.conflictsWith} registration`
|
|
148
|
+
: `${diagnostic.owner} registration '${diagnostic.registrationId}' (generation ${diagnostic.generation}) evicted by a ${diagnostic.conflictsWith} registration with the same id`;
|
|
149
|
+
}
|
|
150
|
+
|
|
123
151
|
/**
|
|
124
152
|
* Wrap a declarative rule definition as a degenerate coded registration so a
|
|
125
153
|
* single ordered evaluation path serves both. The wrapped `evaluate` keeps the
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { createHookBudgetTracker, resolveHookBudgetsFromEnv, resolveHookBudgetTunablesFromEnv } from "./budget.js";
|
|
2
2
|
import type { MiddlewareContract } from "./contract.js";
|
|
3
|
+
import { createMiddlewareRegistrationTable } from "./registrations.js";
|
|
3
4
|
import { cloneMiddlewareRule, listMiddlewareRuleDefinitions, listMiddlewareRules } from "./rules.js";
|
|
4
5
|
import {
|
|
5
6
|
cloneMiddlewareEffect,
|
|
6
7
|
type MiddlewareDiagnosticSink,
|
|
7
|
-
type MiddlewareHookRegistration,
|
|
8
8
|
type MiddlewareRuleDefinition,
|
|
9
9
|
registrationFromRuleDefinition,
|
|
10
10
|
runMiddlewareRegistrations,
|
|
11
|
+
writeMiddlewareDiagnosticToStderr,
|
|
11
12
|
} from "./runtime.js";
|
|
12
13
|
import type { MiddlewareRule, MiddlewareSnapshot } from "./types.js";
|
|
13
14
|
|
|
@@ -39,15 +40,20 @@ export function createMiddlewareContractFromSnapshot(snapshot: MiddlewareSnapsho
|
|
|
39
40
|
if (builtin?.predicate !== undefined) definition.predicate = builtin.predicate;
|
|
40
41
|
return definition;
|
|
41
42
|
});
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
let diagnosticSink: MiddlewareDiagnosticSink | undefined;
|
|
44
|
+
// Workers never receive owned registrations; the table exists so the
|
|
45
|
+
// worker contract satisfies the same interface with the same semantics.
|
|
46
|
+
const table = createMiddlewareRegistrationTable({
|
|
47
|
+
fixed: definitions.map(registrationFromRuleDefinition),
|
|
48
|
+
diagnosticSink: () => diagnosticSink ?? writeMiddlewareDiagnosticToStderr,
|
|
49
|
+
});
|
|
44
50
|
const budgetTracker = createHookBudgetTracker({
|
|
45
51
|
budgets: resolveHookBudgetsFromEnv(),
|
|
46
52
|
...resolveHookBudgetTunablesFromEnv(),
|
|
47
53
|
});
|
|
48
|
-
let diagnosticSink: MiddlewareDiagnosticSink | undefined;
|
|
49
54
|
return {
|
|
50
55
|
runHook(input) {
|
|
56
|
+
const registrations = table.list();
|
|
51
57
|
return runMiddlewareRegistrations(input, registrations, {
|
|
52
58
|
budgetTracker,
|
|
53
59
|
...(diagnosticSink !== undefined ? { onDiagnostic: diagnosticSink } : {}),
|
|
@@ -60,12 +66,19 @@ export function createMiddlewareContractFromSnapshot(snapshot: MiddlewareSnapsho
|
|
|
60
66
|
return createMiddlewareSnapshot(definitions.map((definition) => definition.rule));
|
|
61
67
|
},
|
|
62
68
|
registerHook(registration) {
|
|
63
|
-
|
|
64
|
-
registeredIds.add(registration.id);
|
|
65
|
-
registrations.push(registration);
|
|
69
|
+
table.registerHook(registration);
|
|
66
70
|
},
|
|
67
71
|
setDiagnosticSink(sink) {
|
|
68
72
|
diagnosticSink = sink;
|
|
69
73
|
},
|
|
74
|
+
prepareRegistrationReplacement(owner, generation, registrations) {
|
|
75
|
+
return table.prepareReplacement(owner, generation, registrations);
|
|
76
|
+
},
|
|
77
|
+
replaceRegistrations(owner, generation, registrations) {
|
|
78
|
+
return table.replaceRegistrations(owner, generation, registrations);
|
|
79
|
+
},
|
|
80
|
+
ownedGeneration(owner) {
|
|
81
|
+
return table.ownedGeneration(owner);
|
|
82
|
+
},
|
|
70
83
|
};
|
|
71
84
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* fallback value rather than rejecting.
|
|
9
9
|
*
|
|
10
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 `
|
|
11
|
+
* created, tracked in `pane-registry.ts` and tagged with the `clio_coder_owner`
|
|
12
12
|
* metadata token so `clio doctor` can find orphans. The one documented
|
|
13
13
|
* exception is Clio's own hosting pane in guest mode, which `reportSelf`
|
|
14
14
|
* writes to under SA-3 of the v0.4.0 cycle plan.
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
import type { DomainContract } from "../../core/domain-loader.js";
|
|
27
27
|
import type { MuxDetection } from "./detect.js";
|
|
28
|
+
import { createDockController, type DockController, type DockSlot, type DockState } from "./dock-controller.js";
|
|
28
29
|
import { createPaneRegistry, type MuxPaneRegistry, paneRecord } from "./pane-registry.js";
|
|
29
30
|
import { muxSupportsMethod } from "./protocol.js";
|
|
30
31
|
import type {
|
|
@@ -46,12 +47,15 @@ import {
|
|
|
46
47
|
} from "./types.js";
|
|
47
48
|
|
|
48
49
|
/** Metadata source for everything Clio's pane layer writes. */
|
|
49
|
-
const METADATA_SOURCE = "clio:mux";
|
|
50
|
+
const METADATA_SOURCE = "clio-coder:mux";
|
|
50
51
|
/** Agent-authority source for Clio's own hosting pane, per SA-3. */
|
|
51
|
-
const SELF_AGENT_SOURCE = "clio:coder";
|
|
52
|
+
const SELF_AGENT_SOURCE = "clio-coder:coder";
|
|
52
53
|
/** Token every Clio-created pane carries so orphans are findable. */
|
|
53
|
-
const OWNER_TOKEN_KEY = "
|
|
54
|
-
const OWNER_TOKEN_VALUE = "clio:mux";
|
|
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";
|
|
55
59
|
/** herdr caps a metadata token value at 80 characters. */
|
|
56
60
|
const TOKEN_VALUE_MAX = 80;
|
|
57
61
|
/** How long `available()` stays false after a transport failure before probing again. */
|
|
@@ -71,6 +75,13 @@ export interface MuxOpenUtilityPaneRequest {
|
|
|
71
75
|
* such as Yazi reopen `/dev/tty` for their interface when stdout is not a tty.
|
|
72
76
|
*/
|
|
73
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 };
|
|
74
85
|
}
|
|
75
86
|
|
|
76
87
|
export interface MuxNotifyRequest {
|
|
@@ -99,7 +110,33 @@ export interface MuxContract extends DomainContract {
|
|
|
99
110
|
* This is what stops a restarted session's Enter-in-the-workers-view from
|
|
100
111
|
* opening a second watch pane beside the surviving one.
|
|
101
112
|
*/
|
|
102
|
-
adoptPane(request: { purpose: MuxPanePurpose; label: string }): Promise<MuxPaneRef | null>;
|
|
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
|
+
/**
|
|
123
|
+
* Bring keyboard focus back to Clio's own hosting pane. This is the return
|
|
124
|
+
* half of every explicit pane interaction: a pick in the files pane, a
|
|
125
|
+
* toggle that closed a pane the operator was looking at. False outside
|
|
126
|
+
* guest mode, without an anchor pane, or below the pane.focus floor.
|
|
127
|
+
*/
|
|
128
|
+
focusSelf(): Promise<boolean>;
|
|
129
|
+
/**
|
|
130
|
+
* Leave zoom on the tab that hosts Clio, so a dock split from the anchor is
|
|
131
|
+
* visible again. A zoomed tab hides every pane but one; opening or focusing
|
|
132
|
+
* the files pane behind a zoom would report success for a pane the operator
|
|
133
|
+
* cannot see. False when nothing was zoomed or the tier is absent.
|
|
134
|
+
*/
|
|
135
|
+
unzoomSelf(): Promise<boolean>;
|
|
136
|
+
/** Set a dock's share of its axis. False when the slot has no dock or the tier is absent. */
|
|
137
|
+
resizeDock(slot: DockSlot, share: number): Promise<boolean>;
|
|
138
|
+
/** Live dock geometry states, for `/panes` status. */
|
|
139
|
+
docks(): ReadonlyArray<DockState>;
|
|
103
140
|
notify(request: MuxNotifyRequest): Promise<void>;
|
|
104
141
|
/** Optional compete storage route. Protocol-gated with a native Git fallback at the caller. */
|
|
105
142
|
worktreeCreate(request: MuxWorktreeCreateRequest): Promise<MuxWorktreeCreatedResult | null>;
|
|
@@ -147,11 +184,25 @@ function token(value: string | undefined | null): string | null {
|
|
|
147
184
|
return value.length > TOKEN_VALUE_MAX ? value.slice(0, TOKEN_VALUE_MAX) : value;
|
|
148
185
|
}
|
|
149
186
|
|
|
187
|
+
function hasOwnedPaneToken(tokens: Readonly<Record<string, string>>): boolean {
|
|
188
|
+
return tokens[OWNER_TOKEN_KEY] === OWNER_TOKEN_VALUE || tokens[LEGACY_OWNER_TOKEN_KEY] === LEGACY_OWNER_TOKEN_VALUE;
|
|
189
|
+
}
|
|
190
|
+
|
|
150
191
|
export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
151
192
|
const { detection, client } = options;
|
|
152
193
|
const log = options.log ?? ((): void => undefined);
|
|
153
194
|
const now = options.now ?? Date.now;
|
|
154
195
|
const registry = createPaneRegistry();
|
|
196
|
+
const anchorPaneId = detection.self.paneId;
|
|
197
|
+
/**
|
|
198
|
+
* The managed dock tier needs an anchor to split from and the protocol-17
|
|
199
|
+
* layout methods to converge with. Absent either, dock requests degrade to
|
|
200
|
+
* plain utility splits and the rest of the tier answers false/empty.
|
|
201
|
+
*/
|
|
202
|
+
const docks: DockController | null =
|
|
203
|
+
client !== null && anchorPaneId !== null && muxSupportsMethod(detection.server, "layout.export")
|
|
204
|
+
? createDockController({ client, anchorPaneId, log })
|
|
205
|
+
: null;
|
|
155
206
|
|
|
156
207
|
let healthy = client !== null;
|
|
157
208
|
let probeHealthAt = 0;
|
|
@@ -201,11 +252,30 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
201
252
|
paneId,
|
|
202
253
|
source: METADATA_SOURCE,
|
|
203
254
|
...(title === undefined ? {} : { title }),
|
|
204
|
-
tokens: {
|
|
255
|
+
tokens: {
|
|
256
|
+
[OWNER_TOKEN_KEY]: OWNER_TOKEN_VALUE,
|
|
257
|
+
[LEGACY_OWNER_TOKEN_KEY]: LEGACY_OWNER_TOKEN_VALUE,
|
|
258
|
+
...tokens,
|
|
259
|
+
},
|
|
205
260
|
});
|
|
206
261
|
};
|
|
207
262
|
|
|
208
263
|
const onEvent = (event: MuxEvent): void => {
|
|
264
|
+
if (event.kind === "layout.updated") {
|
|
265
|
+
docks?.noteLayoutUpdated(event.geometry);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (event.kind === "pane.moved") {
|
|
269
|
+
// herdr rewrites the pane id on a move; the registry and dock state
|
|
270
|
+
// follow it so ownership is not lost to the user reorganizing.
|
|
271
|
+
const held = registry.forget(event.previousPaneId);
|
|
272
|
+
if (held) {
|
|
273
|
+
registry.record({ ...held, ref: { paneId: event.paneId, tabId: event.tabId, workspaceId: event.workspaceId } });
|
|
274
|
+
docks?.notePaneMoved(event.previousPaneId, event.paneId, event.tabId);
|
|
275
|
+
}
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
docks?.notePaneGone(event.paneId);
|
|
209
279
|
const dropped = registry.forget(event.paneId);
|
|
210
280
|
if (dropped) {
|
|
211
281
|
log("debug", `mux pane ${event.paneId} left on ${event.kind}; dropped from the registry`);
|
|
@@ -231,38 +301,57 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
231
301
|
},
|
|
232
302
|
|
|
233
303
|
async openUtilityPane(request: MuxOpenUtilityPaneRequest): Promise<MuxPaneRef | null> {
|
|
304
|
+
// Idempotence for docks: a slot that already has a pane answers with it.
|
|
305
|
+
const dockSlot = request.dock?.slot;
|
|
306
|
+
if (dockSlot && docks) {
|
|
307
|
+
const existing = docks.stateFor(dockSlot);
|
|
308
|
+
const held = existing ? registry.byPaneId(existing.paneId) : null;
|
|
309
|
+
if (held) return held.ref;
|
|
310
|
+
}
|
|
234
311
|
return await attempt(
|
|
235
312
|
"openUtilityPane",
|
|
236
313
|
async (live) => {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
314
|
+
let ref: MuxPaneRef;
|
|
315
|
+
if (request.dock && docks) {
|
|
316
|
+
const placed = await docks.open(request.dock.slot, {
|
|
317
|
+
...(request.dock.share === undefined ? {} : { share: request.dock.share }),
|
|
318
|
+
cwd: request.cwd,
|
|
319
|
+
...(request.env ? { env: request.env } : {}),
|
|
320
|
+
});
|
|
321
|
+
// A refusal (anchor too small) is an answer, not a failure.
|
|
322
|
+
if (placed === null) return null;
|
|
323
|
+
ref = placed;
|
|
324
|
+
} else {
|
|
325
|
+
const anchor = anchorPaneId ?? (await live.paneCurrent()).paneId;
|
|
326
|
+
const pane = await live.paneSplit({
|
|
327
|
+
direction: request.direction ?? "right",
|
|
328
|
+
targetPaneId: anchor,
|
|
329
|
+
cwd: request.cwd,
|
|
330
|
+
focus: false,
|
|
331
|
+
...(request.env ? { env: request.env } : {}),
|
|
332
|
+
});
|
|
333
|
+
ref = { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
|
|
334
|
+
}
|
|
246
335
|
const purpose = request.purpose ?? "utility";
|
|
247
336
|
registry.record(paneRecord(ref, { purpose, label: request.label, openedAt: now() }));
|
|
248
337
|
const title = request.title;
|
|
249
338
|
const titleSupported = title !== undefined && muxSupportsMethod(detection.server, "pane.rename");
|
|
250
339
|
if (titleSupported) {
|
|
251
340
|
try {
|
|
252
|
-
await live.paneRename(
|
|
341
|
+
await live.paneRename(ref.paneId, title);
|
|
253
342
|
} catch {
|
|
254
343
|
// Presentation is optional. A server that advertises the floor but
|
|
255
344
|
// lacks or refuses rename must not strand an otherwise healthy pane.
|
|
256
345
|
}
|
|
257
346
|
}
|
|
258
347
|
// The `role` token is what adoptPane finds again after a restart.
|
|
259
|
-
await tagOwner(live,
|
|
348
|
+
await tagOwner(live, ref.paneId, { role: token(purpose) }, titleSupported ? title : undefined);
|
|
260
349
|
if (request.argv.length > 0) {
|
|
261
350
|
// herdr has no argv parameter on pane.split, so the command goes in
|
|
262
351
|
// through the pane's shell. `exec` replaces the shell so the pane
|
|
263
352
|
// exits with the program and emits pane.exited for reconciliation.
|
|
264
353
|
const redirect = request.stdoutPath ? ` > ${shellQuote([request.stdoutPath])}` : "";
|
|
265
|
-
await live.paneSendText(
|
|
354
|
+
await live.paneSendText(ref.paneId, `exec ${shellQuote(request.argv)}${redirect}\n`);
|
|
266
355
|
}
|
|
267
356
|
return ref;
|
|
268
357
|
},
|
|
@@ -280,13 +369,18 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
280
369
|
async (live) => {
|
|
281
370
|
await live.paneClose(paneId);
|
|
282
371
|
registry.forget(paneId);
|
|
372
|
+
// Dock state must fall with the registry entry, not ride on the async
|
|
373
|
+
// pane.closed push: if the event subscription failed at start(), no
|
|
374
|
+
// push ever comes, and a slot pointing at a dead pane makes every
|
|
375
|
+
// later dock open return the corpse.
|
|
376
|
+
docks?.notePaneGone(paneId);
|
|
283
377
|
return true;
|
|
284
378
|
},
|
|
285
379
|
false,
|
|
286
380
|
);
|
|
287
381
|
},
|
|
288
382
|
|
|
289
|
-
async adoptPane(request: { purpose: MuxPanePurpose; label: string }): Promise<MuxPaneRef | null> {
|
|
383
|
+
async adoptPane(request: { purpose: MuxPanePurpose; label: string; dock?: DockSlot }): Promise<MuxPaneRef | null> {
|
|
290
384
|
const existing = registry.byPurpose(request.purpose);
|
|
291
385
|
if (existing) return existing.ref;
|
|
292
386
|
return await attempt(
|
|
@@ -294,7 +388,7 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
294
388
|
async (live) => {
|
|
295
389
|
const snapshot = await live.snapshot();
|
|
296
390
|
for (const pane of snapshot.panes) {
|
|
297
|
-
if (pane.tokens
|
|
391
|
+
if (!hasOwnedPaneToken(pane.tokens)) continue;
|
|
298
392
|
if (pane.tokens.role !== request.purpose) continue;
|
|
299
393
|
if (registry.owns(pane.paneId)) continue;
|
|
300
394
|
// Another workspace's pane belongs to another session's screen;
|
|
@@ -304,6 +398,9 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
304
398
|
registry.record(
|
|
305
399
|
paneRecord(ref, { purpose: request.purpose, label: request.label, openedAt: now(), adopted: true }),
|
|
306
400
|
);
|
|
401
|
+
// Crash recovery for a dock: the surviving pane takes the slot back so
|
|
402
|
+
// geometry management resumes instead of a second dock opening.
|
|
403
|
+
if (request.dock && docks) docks.adopt(request.dock, ref);
|
|
307
404
|
log("info", `mux adopted a ${request.purpose} pane left open by a previous session`);
|
|
308
405
|
return ref;
|
|
309
406
|
}
|
|
@@ -313,6 +410,68 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
313
410
|
);
|
|
314
411
|
},
|
|
315
412
|
|
|
413
|
+
async focusPane(paneId: string): Promise<boolean> {
|
|
414
|
+
// Ownership first: focusing the user's own panes stays off the table
|
|
415
|
+
// even though the wire allows it.
|
|
416
|
+
if (!registry.owns(paneId)) return false;
|
|
417
|
+
if (!muxSupportsMethod(detection.server, "pane.focus")) return false;
|
|
418
|
+
return await attempt(
|
|
419
|
+
"focusPane",
|
|
420
|
+
async (live) => {
|
|
421
|
+
await live.paneFocus(paneId);
|
|
422
|
+
return true;
|
|
423
|
+
},
|
|
424
|
+
false,
|
|
425
|
+
);
|
|
426
|
+
},
|
|
427
|
+
|
|
428
|
+
async zoomPane(paneId: string, mode: "on" | "off" | "toggle"): Promise<boolean> {
|
|
429
|
+
if (!registry.owns(paneId)) return false;
|
|
430
|
+
if (!muxSupportsMethod(detection.server, "pane.zoom")) return false;
|
|
431
|
+
return await attempt(
|
|
432
|
+
"zoomPane",
|
|
433
|
+
async (live) => {
|
|
434
|
+
const result = await live.paneZoom(paneId, mode);
|
|
435
|
+
// A toggle always changes state; on/off report false when already there.
|
|
436
|
+
return result.changed;
|
|
437
|
+
},
|
|
438
|
+
false,
|
|
439
|
+
);
|
|
440
|
+
},
|
|
441
|
+
|
|
442
|
+
async focusSelf(): Promise<boolean> {
|
|
443
|
+
if (anchorPaneId === null || !muxSupportsMethod(detection.server, "pane.focus")) return false;
|
|
444
|
+
return await attempt(
|
|
445
|
+
"focusSelf",
|
|
446
|
+
async (live) => {
|
|
447
|
+
await live.paneFocus(anchorPaneId);
|
|
448
|
+
return true;
|
|
449
|
+
},
|
|
450
|
+
false,
|
|
451
|
+
);
|
|
452
|
+
},
|
|
453
|
+
|
|
454
|
+
async unzoomSelf(): Promise<boolean> {
|
|
455
|
+
if (anchorPaneId === null || !muxSupportsMethod(detection.server, "pane.zoom")) return false;
|
|
456
|
+
return await attempt(
|
|
457
|
+
"unzoomSelf",
|
|
458
|
+
async (live) => {
|
|
459
|
+
const result = await live.paneZoom(anchorPaneId, "off");
|
|
460
|
+
return result.changed;
|
|
461
|
+
},
|
|
462
|
+
false,
|
|
463
|
+
);
|
|
464
|
+
},
|
|
465
|
+
|
|
466
|
+
async resizeDock(slot: DockSlot, share: number): Promise<boolean> {
|
|
467
|
+
if (!docks) return false;
|
|
468
|
+
return await attempt("resizeDock", () => docks.resize(slot, share), false);
|
|
469
|
+
},
|
|
470
|
+
|
|
471
|
+
docks(): ReadonlyArray<DockState> {
|
|
472
|
+
return docks?.states() ?? [];
|
|
473
|
+
},
|
|
474
|
+
|
|
316
475
|
async notify(request: MuxNotifyRequest): Promise<void> {
|
|
317
476
|
if (!muxSupportsMethod(detection.server, "notification.show")) {
|
|
318
477
|
log("debug", `mux notify skipped, server protocol is below the notification.show floor: ${request.title}`);
|
|
@@ -404,9 +563,17 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
404
563
|
subscription?.close();
|
|
405
564
|
subscription = null;
|
|
406
565
|
paneGoneHandlers.clear();
|
|
407
|
-
//
|
|
408
|
-
//
|
|
409
|
-
//
|
|
566
|
+
// Docks close with the session: a native application takes its windows
|
|
567
|
+
// with it. A crash never reaches this method, which is exactly what
|
|
568
|
+
// leaves dock panes behind for the next session's adoption path.
|
|
569
|
+
// Unmanaged utility panes are the operator's and stay open.
|
|
570
|
+
if (client && docks) {
|
|
571
|
+
for (const paneId of docks.paneIds()) {
|
|
572
|
+
await client.paneClose(paneId).catch(() => undefined);
|
|
573
|
+
registry.forget(paneId);
|
|
574
|
+
}
|
|
575
|
+
docks.clear();
|
|
576
|
+
}
|
|
410
577
|
if (client) await client.close().catch(() => undefined);
|
|
411
578
|
},
|
|
412
579
|
};
|
|
@@ -414,12 +581,15 @@ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
|
|
|
414
581
|
const start = async (): Promise<void> => {
|
|
415
582
|
if (detection.mode === "none" || client === null) return;
|
|
416
583
|
try {
|
|
417
|
-
|
|
584
|
+
const kinds: ("pane.closed" | "pane.exited" | "pane.moved" | "layout.updated")[] = ["pane.closed", "pane.exited"];
|
|
585
|
+
if (docks) kinds.push("pane.moved", "layout.updated");
|
|
586
|
+
subscription = await client.subscribe(kinds, onEvent, {
|
|
418
587
|
onResync: (snapshot) => {
|
|
419
588
|
// A reconnect means events were missed. The snapshot is the authority
|
|
420
589
|
// on which panes still exist, so anything Clio thinks it owns that is
|
|
421
590
|
// absent from it is gone.
|
|
422
591
|
const dropped = registry.reconcile(snapshot.panes.map((pane) => pane.paneId));
|
|
592
|
+
for (const record of dropped) docks?.notePaneGone(record.ref.paneId);
|
|
423
593
|
if (dropped.length > 0) {
|
|
424
594
|
log("info", `mux reconciled ${dropped.length} pane(s) closed while the socket was down`);
|
|
425
595
|
}
|
|
@@ -9,8 +9,11 @@
|
|
|
9
9
|
* call.
|
|
10
10
|
*
|
|
11
11
|
* Embedded mode resolves to `none` until Phase 5 lands the session bootstrap.
|
|
12
|
-
* Asking for it is not an error
|
|
13
|
-
*
|
|
12
|
+
* Asking for it is not an error, but it is a refusal rather than a quiet
|
|
13
|
+
* degrade: the detection carries `refused: true`, the boot prints the reason on
|
|
14
|
+
* stderr, and doctor's mode row warns. A session that asked for panes and got
|
|
15
|
+
* none should never have to guess why, and `embedded` costs guest mode too, so
|
|
16
|
+
* the reason names `auto` as the rung that works today.
|
|
14
17
|
*/
|
|
15
18
|
|
|
16
19
|
import { homedir } from "node:os";
|
|
@@ -32,6 +35,15 @@ export interface MuxDetection {
|
|
|
32
35
|
candidates: ReadonlyArray<string>;
|
|
33
36
|
/** Human-readable reason, always set; for `guest` it names the socket that answered. */
|
|
34
37
|
reason: string;
|
|
38
|
+
/**
|
|
39
|
+
* True when the operator asked for a rung Clio cannot provide, as opposed to
|
|
40
|
+
* asking for panes on a machine that has no pane host. The two are both
|
|
41
|
+
* `none` and neither is an error, but only the first is a promise Clio broke:
|
|
42
|
+
* nothing about the environment would change the answer, and the operator has
|
|
43
|
+
* to be told, because they configured a mode and got no panes. Callers raise
|
|
44
|
+
* a refusal to a visible level; an ordinary `none` stays at debug.
|
|
45
|
+
*/
|
|
46
|
+
refused: boolean;
|
|
35
47
|
}
|
|
36
48
|
|
|
37
49
|
export interface DetectMuxOptions {
|
|
@@ -83,7 +95,7 @@ function readSelfLocation(env: NodeJS.ProcessEnv): MuxSelfLocation {
|
|
|
83
95
|
};
|
|
84
96
|
}
|
|
85
97
|
|
|
86
|
-
function none(reason: string, candidates: ReadonlyArray<string> = []): MuxDetection {
|
|
98
|
+
function none(reason: string, candidates: ReadonlyArray<string> = [], refused = false): MuxDetection {
|
|
87
99
|
return {
|
|
88
100
|
mode: "none",
|
|
89
101
|
socketPath: null,
|
|
@@ -91,6 +103,7 @@ function none(reason: string, candidates: ReadonlyArray<string> = []): MuxDetect
|
|
|
91
103
|
self: { workspaceId: null, tabId: null, paneId: null },
|
|
92
104
|
candidates,
|
|
93
105
|
reason,
|
|
106
|
+
refused,
|
|
94
107
|
};
|
|
95
108
|
}
|
|
96
109
|
|
|
@@ -113,9 +126,12 @@ export async function detectMux(options: DetectMuxOptions = {}): Promise<MuxDete
|
|
|
113
126
|
return { detection: none("panes are turned off"), client: null };
|
|
114
127
|
}
|
|
115
128
|
if (enabled === "embedded") {
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
|
|
129
|
+
// Embedded mode (Clio owning the pane host) is not implemented yet. An
|
|
130
|
+
// operator who picked it wanted panes, so the rung degrades to guest
|
|
131
|
+
// detection instead of refusing everything; the notice below says which
|
|
132
|
+
// mode actually runs. When the guest ladder also fails, that failure is
|
|
133
|
+
// reported on its own terms.
|
|
134
|
+
log("info", "interface.panes.enabled=embedded is not implemented yet; detecting a guest pane host instead");
|
|
119
135
|
}
|
|
120
136
|
if (env.HERDR_ENV !== "1") {
|
|
121
137
|
return { detection: none("HERDR_ENV is not 1, so Clio is not running inside a pane host"), client: null };
|
|
@@ -137,6 +153,7 @@ export async function detectMux(options: DetectMuxOptions = {}): Promise<MuxDete
|
|
|
137
153
|
self: readSelfLocation(env),
|
|
138
154
|
candidates,
|
|
139
155
|
reason: `guest mode on ${socketPath} (herdr ${server.version}, protocol ${server.protocol})`,
|
|
156
|
+
refused: false,
|
|
140
157
|
},
|
|
141
158
|
client,
|
|
142
159
|
};
|