@iowarp/clio-coder 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -0
- package/README.md +116 -16
- package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
- package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
- package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
- package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
- package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
- package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
- package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
- package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
- package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
- package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
- package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
- package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
- package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
- package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
- package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
- package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
- package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
- package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
- package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
- package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
- package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
- package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
- package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
- package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
- package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
- package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
- package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
- package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
- package/dist/chunk-AP73CFDC.js +308 -0
- package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
- package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
- package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
- package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
- package/dist/chunk-BTK3SSSK.js +67 -0
- package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
- package/dist/chunk-BWW4HLO4.js +301 -0
- package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
- package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
- package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
- package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
- package/dist/chunk-D7E7WCDF.js +27 -0
- package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
- package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
- package/dist/chunk-EIMVLWB3.js +1842 -0
- package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
- package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
- package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
- package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
- package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
- package/dist/chunk-HJWWJ6IL.js +184 -0
- package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
- package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
- package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
- package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
- package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
- package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
- package/dist/chunk-J5LZHVIT.js +284 -0
- package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
- package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
- package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
- package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
- package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
- package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
- package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
- package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
- package/dist/chunk-NDDGJUXD.js +81 -0
- package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
- package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
- package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
- package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
- package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
- package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
- package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
- package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
- package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
- package/dist/chunk-QTFGO774.js +644 -0
- package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
- package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
- package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
- package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
- package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
- package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
- package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
- package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
- package/dist/chunk-U2WB7TZS.js +271 -0
- package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
- package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
- package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
- package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
- package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
- package/dist/chunk-VKFQTNDV.js +66 -0
- package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
- package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
- package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
- package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
- package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
- package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
- package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
- package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
- package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
- package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
- package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
- package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
- package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
- package/dist/cli/index.js +36 -36
- package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
- package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
- package/dist/codewiki/build-worker.js +1 -1
- package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
- package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
- package/dist/{config-QZPCMYSO.js → config-3QZRWZJF.js} +53 -49
- package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
- package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
- package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
- package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
- package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
- package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
- package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
- package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
- package/dist/doctor-ZGPEGHIP.js +772 -0
- package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
- package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
- package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
- package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
- package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
- package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
- package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
- package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
- package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
- package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
- package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
- package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
- package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
- package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
- package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
- package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
- package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
- package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
- package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
- package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
- package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
- package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
- package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
- package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
- package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
- package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
- package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
- package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
- package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
- package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
- package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
- package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
- package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
- package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
- package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
- package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
- package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
- package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
- package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
- package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
- package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
- package/dist/{upgrade-3XPP6OQL.js → upgrade-H7TOM7YL.js} +35 -62
- package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
- package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
- package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
- package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
- package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
- package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
- package/dist/worker/entry.js +57 -52
- package/docs/acp.md +1 -1
- package/docs/built-in-agents.md +40 -32
- package/docs/commands-and-modes.md +9 -3
- package/docs/config-knobs-audit.md +3 -0
- package/docs/configuration-and-targets.md +105 -164
- package/docs/environment-variables.md +2 -1
- package/docs/exit-codes-and-output.md +2 -0
- package/docs/fleet-demo-runbook.md +6 -3
- package/docs/fleet-dispatch.md +8 -6
- package/docs/installation-and-lifecycle.md +1 -1
- package/docs/release-cut-checklist.md +164 -177
- package/docs/trace-store.md +15 -10
- package/docs/troubleshooting.md +1 -1
- package/evals/README.md +5 -0
- package/evals/behavioral-corpus-grader.mjs +103 -0
- package/evals/behavioral-machinery-baseline.json +2276 -0
- package/evals/behavioral-machinery-driver.ts +250 -0
- package/evals/behavioral-machinery-support.ts +253 -0
- package/evals/behavioral-machinery.yaml +614 -0
- package/evals/behavioral-model-negative-control.yaml +68 -0
- package/evals/behavioral-model.yaml +216 -0
- package/evals/fixtures/behavioral-facts.txt +3 -0
- package/evals/fixtures/behavioral-main.ts +7 -0
- package/evals/fixtures/decoy/note.txt +2 -0
- package/evals/fixtures/private/credentials.txt +1 -0
- package/evals/tracked-metrics-baseline.yaml +229 -0
- package/evals/tracked-metrics-grader.mjs +129 -0
- package/package.json +5 -15
- package/skills/README.md +6 -6
- package/skills/coding/ast-grep/SKILL.md +8 -2
- package/skills/coding/coding-standards/SKILL.md +8 -2
- package/skills/coding/prototype/SKILL.md +8 -2
- package/skills/coding/tdd/SKILL.md +8 -2
- package/skills/context/context-handoff/SKILL.md +12 -3
- package/skills/context/context-handoff/evals.md +3 -3
- package/skills/context/context-prime/SKILL.md +8 -2
- package/skills/context/context-prime/evals.md +2 -2
- package/skills/git/file-ticket/SKILL.md +9 -4
- package/skills/git/file-ticket/evals.md +2 -2
- package/skills/git/fix-issue/SKILL.md +12 -5
- package/skills/git/fix-issue/evals.md +4 -4
- package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
- package/skills/git/resolve-merge-conflicts/evals.md +2 -2
- package/skills/git/ship/SKILL.md +9 -3
- package/skills/git/ship/evals.md +4 -4
- package/skills/git/worktree-create/SKILL.md +7 -2
- package/skills/git/worktree-create/evals.md +6 -6
- package/skills/git/worktree-merge/SKILL.md +7 -2
- package/skills/git/worktree-merge/evals.md +6 -6
- package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
- package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
- package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
- package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
- package/skills/meta/credentials/SKILL.md +9 -2
- package/skills/meta/find-skills/SKILL.md +8 -2
- package/skills/meta/herdr/SKILL.md +8 -2
- package/skills/meta/skill-craft/SKILL.md +21 -4
- package/skills/planning/architecture/SKILL.md +9 -3
- package/skills/planning/backlog/SKILL.md +8 -2
- package/skills/planning/prd/SKILL.md +8 -2
- package/skills/planning/product-intent/SKILL.md +8 -2
- package/skills/planning/tech-spec/SKILL.md +9 -3
- package/skills/registry.yaml +66 -66
- package/skills/research/arxiv-literature/SKILL.md +8 -2
- package/skills/research/experiment-protocol/SKILL.md +9 -2
- package/skills/research/scientific-debugging/SKILL.md +9 -2
- package/skills/research/scientific-debugging/evals.md +2 -2
- package/skills/research/scientific-modernization/SKILL.md +9 -2
- package/skills/skill-marketplace.json +257 -38
- package/skills/workflow/cut-it/SKILL.md +10 -2
- package/skills/workflow/design-council/SKILL.md +11 -2
- package/skills/workflow/grill-me/SKILL.md +8 -2
- package/skills/workflow/workflow-distiller/SKILL.md +8 -2
- package/src/cli/acp.ts +2 -2
- package/src/cli/auth.ts +2 -2
- package/src/cli/bootstrap-generate.ts +5 -5
- package/src/cli/clio.ts +6 -1
- package/src/cli/config-inspect.ts +3 -3
- package/src/cli/configure-interop.ts +1 -1
- package/src/cli/configure.ts +27 -27
- package/src/cli/default-target.ts +1 -1
- package/src/cli/docs.ts +6 -6
- package/src/cli/doctor-naming.ts +323 -0
- package/src/cli/doctor-panes.ts +46 -14
- package/src/cli/doctor-toolchain.ts +29 -8
- package/src/cli/doctor.ts +15 -1
- package/src/cli/eval-inventory.ts +8 -8
- package/src/cli/evidence-detail.ts +1 -1
- package/src/cli/evidence-inventory.ts +1 -1
- package/src/cli/fleet-decisions.ts +1 -1
- package/src/cli/fleet-inspect.ts +1 -1
- package/src/cli/fleet-preflight.ts +1 -1
- package/src/cli/fleet-verify.ts +1 -1
- package/src/cli/fleet-view.ts +40 -23
- package/src/cli/fleet.ts +8 -5
- package/src/cli/interop-inspect.ts +2 -2
- package/src/cli/models.ts +3 -3
- package/src/cli/modes/print.ts +1 -1
- package/src/cli/reset.ts +1 -1
- package/src/cli/run.ts +11 -15
- package/src/cli/share.ts +1 -1
- package/src/cli/skills-eval.ts +11 -11
- package/src/cli/targets.ts +23 -24
- package/src/cli/trace-inspect.ts +1 -1
- package/src/cli/trace.ts +41 -0
- package/src/cli/uninstall.ts +2 -2
- package/src/cli/upgrade.ts +29 -34
- package/src/cli/usage.ts +2 -2
- package/src/cli/validate-model.ts +1 -1
- package/src/cli/verifiers-inspect.ts +1 -1
- package/src/cli/wiki-generate.ts +5 -5
- package/src/core/bash-exec.ts +1 -1
- package/src/core/boot-trace.ts +3 -3
- package/src/core/bus-trace.ts +2 -2
- package/src/core/compile-cache.ts +1 -1
- package/src/core/config.ts +1062 -886
- package/src/core/defaults.ts +321 -528
- package/src/core/domain-loader.ts +6 -4
- package/src/core/event-bus.ts +1 -1
- package/src/core/file-references.ts +78 -88
- package/src/core/git-commit-attribution.ts +3 -9
- package/src/core/guardrails.ts +24 -4
- package/src/core/naming-compat.ts +45 -0
- package/src/core/naming-events.ts +62 -0
- package/src/core/recent-models.ts +1 -7
- package/src/core/residency-protection.ts +4 -8
- package/src/core/resolve-config-value.ts +1 -1
- package/src/core/response-model-id.ts +0 -14
- package/src/core/session-routing.ts +84 -74
- package/src/core/skill-activation.ts +18 -0
- package/src/core/termination.ts +4 -4
- package/src/core/timers.ts +2 -12
- package/src/domains/agents/catalog.ts +2 -12
- package/src/domains/agents/extension.ts +3 -3
- package/src/domains/agents/registry.ts +7 -7
- package/src/domains/agents/result-contract.ts +1 -1
- package/src/domains/agents/spec.ts +0 -11
- package/src/domains/config/classify.ts +35 -47
- package/src/domains/config/extension.ts +5 -5
- package/src/domains/config/keybindings.ts +48 -47
- package/src/domains/config/watcher.ts +1 -1
- package/src/domains/context/codewiki/indexer.ts +1 -1
- package/src/domains/context/extension.ts +3 -3
- package/src/domains/context/prompt-context.ts +1 -1
- package/src/domains/context/wiki/assemble.ts +2 -2
- package/src/domains/context/working-set/replay/metrics.ts +0 -4
- package/src/domains/context/working-set/replay/report.ts +1 -1
- package/src/domains/context/working-set/replay/synthetic.ts +2 -2
- package/src/domains/dispatch/active-route-planner.ts +2 -2
- package/src/domains/dispatch/agent-candidates.ts +1 -1
- package/src/domains/dispatch/agent-ledger-store.ts +1 -1
- package/src/domains/dispatch/agent-ledger.ts +1 -1
- package/src/domains/dispatch/assignment.ts +5 -5
- package/src/domains/dispatch/capacity-lease.ts +2 -5
- package/src/domains/dispatch/code-step.ts +1 -1
- package/src/domains/dispatch/contract.ts +2 -2
- package/src/domains/dispatch/extension.ts +65 -61
- package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
- package/src/domains/dispatch/fleet-preflight.ts +8 -17
- package/src/domains/dispatch/fleet-run.ts +0 -7
- package/src/domains/dispatch/gate-decisions.ts +25 -14
- package/src/domains/dispatch/joint-route-resolver.ts +1 -1
- package/src/domains/dispatch/path-scope.ts +0 -61
- package/src/domains/dispatch/placement.ts +2 -2
- package/src/domains/dispatch/receipt-findings.ts +1 -1
- package/src/domains/dispatch/receipt-integrity.ts +20 -8
- package/src/domains/dispatch/reservation-store.ts +0 -23
- package/src/domains/dispatch/route-decision.ts +1 -1
- package/src/domains/dispatch/route-history.ts +1 -1
- package/src/domains/dispatch/route-policy.ts +1 -1
- package/src/domains/dispatch/route-readiness.ts +0 -28
- package/src/domains/dispatch/run-event-journal.ts +6 -5
- package/src/domains/dispatch/tool-stats.ts +1 -1
- package/src/domains/dispatch/transport.ts +2 -19
- package/src/domains/dispatch/types.ts +3 -3
- package/src/domains/dispatch/worker-protocol.ts +2 -2
- package/src/domains/eval/artifacts/store.ts +5 -4
- package/src/domains/eval/compare/thresholds.ts +0 -8
- package/src/domains/eval/execution-provenance.ts +1 -1
- package/src/domains/eval/metrics/token-stream.ts +0 -7
- package/src/domains/eval/report.ts +1 -1
- package/src/domains/eval/runner.ts +1 -1
- package/src/domains/eval/runners/clio-run.ts +7 -6
- package/src/domains/eval/runners/external-command.ts +4 -3
- package/src/domains/eval/schema/artifact.ts +1 -1
- package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
- package/src/domains/eval/schema/behavioral.ts +7 -6
- package/src/domains/eval/schema/execution-envelope.ts +4 -2
- package/src/domains/eval/schema/naming.ts +10 -0
- package/src/domains/eval/schema/suite.ts +2 -2
- package/src/domains/eval/schema/validate.ts +9 -5
- package/src/domains/eval/schema/verdict.ts +4 -2
- package/src/domains/eval/store.ts +12 -2
- package/src/domains/eval/suites/run.ts +12 -6
- package/src/domains/eval/types.ts +1 -1
- package/src/domains/eval/workspaces/git.ts +1 -1
- package/src/domains/eval/workspaces/temp-copy.ts +1 -1
- package/src/domains/evidence/build.ts +13 -5
- package/src/domains/interop/consent.ts +7 -7
- package/src/domains/interop/extension.ts +1 -1
- package/src/domains/lifecycle/doctor.ts +27 -21
- package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
- package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
- package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
- package/src/domains/lifecycle/migrations/index.ts +20 -1
- package/src/domains/lifecycle/naming-history.ts +153 -0
- package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
- package/src/domains/lifecycle/naming-resources.ts +261 -0
- package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
- package/src/domains/lifecycle/naming-yazi.ts +81 -0
- package/src/domains/lifecycle/upgrade-notice.ts +1 -1
- package/src/domains/memory/task-memory-handoff.ts +6 -3
- package/src/domains/middleware/index.ts +7 -0
- package/src/domains/middleware/marketplace-offer.ts +339 -0
- package/src/domains/middleware/runtime.ts +2 -2
- package/src/domains/mux/contract.ts +157 -25
- package/src/domains/mux/detect.ts +29 -5
- package/src/domains/mux/dock-controller.ts +365 -0
- package/src/domains/mux/extension.ts +7 -1
- package/src/domains/mux/index.ts +20 -0
- package/src/domains/mux/operations.ts +28 -0
- package/src/domains/mux/protocol.ts +19 -6
- package/src/domains/mux/socket-client.ts +167 -19
- package/src/domains/mux/types.ts +49 -6
- package/src/domains/mux/yazi/event-stream.ts +6 -4
- package/src/domains/mux/yazi/profile.ts +1 -1
- package/src/domains/mux/yazi/session.ts +26 -3
- package/src/domains/observability/extension.ts +1 -1
- package/src/domains/observability/out-of-turn-usage.ts +2 -2
- package/src/domains/observability/projection.ts +1 -1
- package/src/domains/observability/trace-store.ts +22 -12
- package/src/domains/prompts/compiler.ts +2 -2
- package/src/domains/prompts/extension.ts +3 -3
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
- package/src/domains/prompts/fragments/operating/skills.md +25 -18
- package/src/domains/providers/extension.ts +5 -5
- package/src/domains/providers/knowledge-base-path.ts +1 -1
- package/src/domains/providers/model-runtime-capabilities.ts +14 -2
- package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
- package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
- package/src/domains/providers/plugins.ts +1 -1
- package/src/domains/providers/resolver.ts +1 -1
- package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
- package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
- package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
- package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
- package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
- package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
- package/src/domains/providers/types/knowledge-base.ts +13 -0
- package/src/domains/providers/types/local-model-quirks.ts +2 -2
- package/src/domains/providers/types/target-descriptor.ts +3 -3
- package/src/domains/resources/extension.ts +1 -1
- package/src/domains/resources/library.ts +6 -6
- package/src/domains/resources/prompts/loader.ts +1 -1
- package/src/domains/resources/skills/content-hash.ts +7 -6
- package/src/domains/resources/skills/evals.ts +1 -1
- package/src/domains/resources/skills/install.ts +36 -12
- package/src/domains/resources/skills/loader.ts +39 -13
- package/src/domains/resources/skills/marketplace.ts +21 -2
- package/src/domains/resources/skills/promotion.ts +214 -0
- package/src/domains/safety/audit.ts +2 -2
- package/src/domains/safety/finish-contract.ts +2 -1
- package/src/domains/safety/run-effects.ts +1 -1
- package/src/domains/scheduling/extension.ts +4 -4
- package/src/domains/session/archive-readers.ts +9 -1
- package/src/domains/session/compaction/branch-summary.ts +4 -0
- package/src/domains/session/compaction/compact.ts +1 -1
- package/src/domains/session/compaction/tokens.ts +4 -0
- package/src/domains/session/context-accounting.ts +1 -1
- package/src/domains/session/decision-board.ts +1 -1
- package/src/domains/session/extension.ts +1 -1
- package/src/domains/session/handoff.ts +2 -2
- package/src/domains/session/prompt-manifest.ts +0 -5
- package/src/domains/session/protected-artifact-journal.ts +12 -6
- package/src/domains/session/retry.ts +1 -1
- package/src/domains/share/archive.ts +85 -36
- package/src/domains/toolchain/install.ts +1 -1
- package/src/engine/acp/adapter.ts +3 -3
- package/src/engine/acp/event-mapper.ts +3 -3
- package/src/engine/acp/server.ts +27 -26
- package/src/engine/acp/tool-mediator.ts +2 -2
- package/src/engine/acp/types.ts +1 -1
- package/src/engine/alcf-oauth.ts +5 -5
- package/src/engine/antigravity/subprocess-runtime.ts +2 -2
- package/src/engine/api-registry.ts +1 -1
- package/src/engine/apis/llamacpp-residency.ts +1 -19
- package/src/engine/apis/lmstudio.ts +1 -6
- package/src/engine/apis/ollama-native.ts +3 -3
- package/src/engine/apis/openai-completions.ts +2 -2
- package/src/engine/apis/residency.ts +3 -9
- package/src/engine/claude/sdk-module.ts +1 -12
- package/src/engine/claude/sdk-runtime.ts +6 -6
- package/src/engine/claude/subprocess-runtime.ts +1 -1
- package/src/engine/claude/tool-safety.ts +4 -4
- package/src/engine/loop-guard.ts +0 -5
- package/src/engine/session.ts +14 -7
- package/src/engine/tui-primitives.ts +1 -1
- package/src/engine/worker-events.ts +6 -6
- package/src/engine/worker-runtime.ts +14 -13
- package/src/entry/orchestrator.ts +107 -88
- package/src/interactive/application-controller.ts +21 -21
- package/src/interactive/bus-notices.ts +2 -2
- package/src/interactive/chat-loop.ts +8 -8
- package/src/interactive/chat-panel.ts +1 -1
- package/src/interactive/clio-editor.ts +105 -1
- package/src/interactive/context-activity.ts +8 -6
- package/src/interactive/context-meter.ts +3 -6
- package/src/interactive/context-overlay.ts +1 -1
- package/src/interactive/cost-overlay.ts +1 -1
- package/src/interactive/council-grid.ts +2 -2
- package/src/interactive/dispatch-board.ts +30 -33
- package/src/interactive/editor-bash.ts +21 -0
- package/src/interactive/editor-steer.ts +9 -4
- package/src/interactive/editor-submit.ts +24 -18
- package/src/interactive/external-editor.ts +1 -1
- package/src/interactive/file-reference-completion.ts +360 -0
- package/src/interactive/footer/dashboard.ts +15 -17
- package/src/interactive/footer/notifications.ts +14 -8
- package/src/interactive/footer/widgets.ts +2 -44
- package/src/interactive/interactive-application.ts +79 -59
- package/src/interactive/interactive-event-projection.ts +1 -1
- package/src/interactive/interactive-input-runtime.ts +2 -2
- package/src/interactive/interactive-presentation.ts +21 -16
- package/src/interactive/interactive-shell.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +63 -17
- package/src/interactive/interactive-subscriptions.ts +1 -1
- package/src/interactive/interactive-tickers.ts +1 -1
- package/src/interactive/keybinding-manager.ts +4 -4
- package/src/interactive/layout.ts +1 -1
- package/src/interactive/memory-overlay.ts +2 -2
- package/src/interactive/modal-marker.ts +2 -21
- package/src/interactive/mutation-preview.ts +1 -1
- package/src/interactive/overlay-frame.ts +4 -12
- package/src/interactive/overlay-general-openers.ts +6 -2
- package/src/interactive/overlay-key-routing.ts +7 -7
- package/src/interactive/overlay-lifecycle.ts +1 -1
- package/src/interactive/overlay-model-selectors.ts +3 -3
- package/src/interactive/overlays/agents.ts +2 -2
- package/src/interactive/overlays/ask-user.ts +25 -11
- package/src/interactive/overlays/context-reset.ts +28 -4
- package/src/interactive/overlays/cwd-fallback.ts +28 -4
- package/src/interactive/overlays/decisions.ts +4 -2
- package/src/interactive/overlays/fleet-run-approval.ts +3 -3
- package/src/interactive/overlays/handoff-review.ts +2 -2
- package/src/interactive/overlays/interop.ts +1 -1
- package/src/interactive/overlays/library-install-confirm.ts +1 -1
- package/src/interactive/overlays/message-picker.ts +1 -1
- package/src/interactive/overlays/model-selector.ts +39 -31
- package/src/interactive/overlays/prompts.ts +10 -4
- package/src/interactive/overlays/session-selector.ts +2 -2
- package/src/interactive/overlays/settings.ts +339 -293
- package/src/interactive/overlays/side-question.ts +2 -2
- package/src/interactive/overlays/skills-hub.ts +8 -8
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/panes-runtime.ts +36 -10
- package/src/interactive/permission-overlay.ts +2 -2
- package/src/interactive/renderers/retry-status.ts +12 -4
- package/src/interactive/renderers/tool-execution.ts +4 -4
- package/src/interactive/session-transcript.ts +3 -3
- package/src/interactive/slash-autocomplete.ts +454 -165
- package/src/interactive/slash-commands.ts +279 -183
- package/src/interactive/slash-spec.ts +160 -17
- package/src/interactive/status/controller.ts +2 -2
- package/src/interactive/stream-pacing-policy.ts +1 -1
- package/src/interactive/tasks-overlay.ts +20 -13
- package/src/interactive/terminal-lease.ts +6 -7
- package/src/interactive/turn-context.ts +11 -11
- package/src/interactive/turn-persistence.ts +2 -2
- package/src/interactive/turn-prewarm.ts +2 -2
- package/src/interactive/turn-runtime.ts +8 -8
- package/src/interactive/turn-state.ts +1 -1
- package/src/interactive/view/artifacts.ts +12 -9
- package/src/interactive/view/view-overlay.ts +13 -10
- package/src/interactive/watch-pane.ts +38 -10
- package/src/interactive/welcome-dashboard.ts +15 -15
- package/src/interactive/worker-progress.ts +4 -4
- package/src/interactive/worker-receipts.ts +1 -1
- package/src/interactive/worker-stream.ts +1 -4
- package/src/interactive/yazi-bridge.ts +12 -5
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/builtin-tool-catalog.ts +1 -1
- package/src/tools/compete-worktrees.ts +27 -17
- package/src/tools/context/index.ts +15 -1
- package/src/tools/dispatch-admission.ts +4 -2
- package/src/tools/dispatch-arguments.ts +1 -1
- package/src/tools/dispatch-plan.ts +0 -11
- package/src/tools/dispatch-run-events.ts +12 -10
- package/src/tools/dispatch-runner.ts +11 -6
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/find.ts +1 -6
- package/src/tools/monitor.ts +4 -4
- package/src/tools/observers.ts +0 -33
- package/src/tools/task-worktree.ts +28 -7
- package/src/tools/verify/authoring.ts +3 -6
- package/src/tools/verify/frontend.ts +1 -1
- package/src/tools/web-fetch.ts +1 -1
- package/src/worker/entry.ts +4 -3
- package/src/worker/protocol.ts +16 -14
- package/src/worker/spec-contract.ts +2 -2
- package/src/worker/stdin-demux.ts +2 -2
- package/dist/chunk-GXNLGKAB.js +0 -571
- package/dist/chunk-VFA6GDY5.js +0 -1625
- package/dist/doctor-QOA5FNY5.js +0 -313
- package/src/engine/apis/degraded-inference.ts +0 -95
- /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
- /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
|
@@ -36,14 +36,18 @@ import {
|
|
|
36
36
|
MuxError,
|
|
37
37
|
type MuxEvent,
|
|
38
38
|
type MuxEventKind,
|
|
39
|
+
type MuxLayoutNode,
|
|
40
|
+
type MuxLayoutTree,
|
|
39
41
|
type MuxLog,
|
|
40
42
|
type MuxNotificationSound,
|
|
41
43
|
type MuxPane,
|
|
44
|
+
type MuxRect,
|
|
42
45
|
type MuxReportableAgentState,
|
|
43
46
|
MuxRequestTimeout,
|
|
44
47
|
type MuxServerInfo,
|
|
45
48
|
type MuxSnapshot,
|
|
46
49
|
type MuxTab,
|
|
50
|
+
type MuxTabGeometry,
|
|
47
51
|
type MuxWorktree,
|
|
48
52
|
type MuxWorktreeSource,
|
|
49
53
|
muxErrorKind,
|
|
@@ -192,8 +196,32 @@ export interface MuxClient {
|
|
|
192
196
|
/** Set the pane's operator-facing label. Available on herdr protocol 17. */
|
|
193
197
|
paneRename(paneId: string, label: string): Promise<void>;
|
|
194
198
|
paneClose(paneId: string): Promise<void>;
|
|
195
|
-
/**
|
|
196
|
-
|
|
199
|
+
/**
|
|
200
|
+
* Cell-precise geometry of the tab holding `paneId` (the server's focused
|
|
201
|
+
* pane when omitted): outer area, pane rects, and live split ratios.
|
|
202
|
+
*/
|
|
203
|
+
paneLayout(paneId?: string): Promise<MuxTabGeometry>;
|
|
204
|
+
/**
|
|
205
|
+
* Focus a pane. This switches the focused tab as well as the pane (verified
|
|
206
|
+
* on 0.8.2), so it is only ever driven by an explicit "show me" request,
|
|
207
|
+
* never by background bookkeeping.
|
|
208
|
+
*/
|
|
209
|
+
paneFocus(paneId: string): Promise<void>;
|
|
210
|
+
/** Zoom a pane. Zooming an unfocused pane steals focus; same rule as paneFocus. */
|
|
211
|
+
paneZoom(paneId: string, mode: "on" | "off" | "toggle"): Promise<{ changed: boolean; focusChanged: boolean }>;
|
|
212
|
+
/** Portable layout tree for a tab, or the tab holding `paneId`. */
|
|
213
|
+
layoutExport(request?: { tabId?: string; paneId?: string }): Promise<MuxLayoutTree>;
|
|
214
|
+
/**
|
|
215
|
+
* Set one split's ratio, addressed by a boolean path from the root split
|
|
216
|
+
* (`false` descends first, `true` second; `[]` is the root). Returns the
|
|
217
|
+
* updated tree.
|
|
218
|
+
*/
|
|
219
|
+
layoutSetSplitRatio(request: {
|
|
220
|
+
tabId?: string;
|
|
221
|
+
paneId?: string;
|
|
222
|
+
path: ReadonlyArray<boolean>;
|
|
223
|
+
ratio: number;
|
|
224
|
+
}): Promise<MuxLayoutTree>;
|
|
197
225
|
worktreeList(request?: MuxWorktreeListRequest): Promise<MuxWorktreeListResult>;
|
|
198
226
|
worktreeCreate(request: MuxWorktreeCreateRequest): Promise<MuxWorktreeCreatedResult>;
|
|
199
227
|
worktreeOpen(request: MuxWorktreeOpenRequest): Promise<MuxWorktreeOpenedResult>;
|
|
@@ -410,8 +438,93 @@ function readSnapshot(value: unknown): MuxSnapshot {
|
|
|
410
438
|
};
|
|
411
439
|
}
|
|
412
440
|
|
|
441
|
+
function requireNumber(source: Record<string, unknown>, key: string, context: string): number {
|
|
442
|
+
const value = source[key];
|
|
443
|
+
if (typeof value !== "number") {
|
|
444
|
+
throw new MuxError("protocol", `mux ${context} response is missing number field ${key}`);
|
|
445
|
+
}
|
|
446
|
+
return value;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
function readRect(value: unknown, context: string): MuxRect {
|
|
450
|
+
const source = asRecord(value);
|
|
451
|
+
if (!source) throw new MuxError("protocol", `mux ${context} rect is not an object`);
|
|
452
|
+
return {
|
|
453
|
+
x: requireNumber(source, "x", context),
|
|
454
|
+
y: requireNumber(source, "y", context),
|
|
455
|
+
width: requireNumber(source, "width", context),
|
|
456
|
+
height: requireNumber(source, "height", context),
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
function readSplitDirection(value: unknown, context: string): "right" | "down" {
|
|
461
|
+
if (value === "right" || value === "down") return value;
|
|
462
|
+
throw new MuxError("protocol", `mux ${context} split direction is not right/down`);
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/** Parses a `PaneLayoutSnapshot`: the shape `pane.layout` and `layout_updated` both carry. */
|
|
466
|
+
function readTabGeometry(value: unknown): MuxTabGeometry {
|
|
467
|
+
const source = asRecord(value);
|
|
468
|
+
if (!source) throw new MuxError("protocol", "mux layout snapshot is not an object");
|
|
469
|
+
return {
|
|
470
|
+
workspaceId: requireString(source, "workspace_id", "layout"),
|
|
471
|
+
tabId: requireString(source, "tab_id", "layout"),
|
|
472
|
+
zoomed: source.zoomed === true,
|
|
473
|
+
area: readRect(source.area, "layout"),
|
|
474
|
+
focusedPaneId: optionalString(source, "focused_pane_id"),
|
|
475
|
+
panes: readArray(source, "panes").map((entry) => {
|
|
476
|
+
const pane = asRecord(entry);
|
|
477
|
+
if (!pane) throw new MuxError("protocol", "mux layout pane entry is not an object");
|
|
478
|
+
return {
|
|
479
|
+
paneId: requireString(pane, "pane_id", "layout pane"),
|
|
480
|
+
focused: pane.focused === true,
|
|
481
|
+
rect: readRect(pane.rect, "layout pane"),
|
|
482
|
+
};
|
|
483
|
+
}),
|
|
484
|
+
splits: readArray(source, "splits").map((entry) => {
|
|
485
|
+
const split = asRecord(entry);
|
|
486
|
+
if (!split) throw new MuxError("protocol", "mux layout split entry is not an object");
|
|
487
|
+
return {
|
|
488
|
+
direction: readSplitDirection(split.direction, "layout"),
|
|
489
|
+
ratio: requireNumber(split, "ratio", "layout split"),
|
|
490
|
+
rect: readRect(split.rect, "layout split"),
|
|
491
|
+
};
|
|
492
|
+
}),
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
function readLayoutNode(value: unknown): MuxLayoutNode {
|
|
497
|
+
const source = asRecord(value);
|
|
498
|
+
if (!source) throw new MuxError("protocol", "mux layout node is not an object");
|
|
499
|
+
if (source.type === "pane") {
|
|
500
|
+
return { type: "pane", paneId: optionalString(source, "pane_id"), label: optionalString(source, "label") };
|
|
501
|
+
}
|
|
502
|
+
if (source.type === "split") {
|
|
503
|
+
return {
|
|
504
|
+
type: "split",
|
|
505
|
+
direction: readSplitDirection(source.direction, "layout tree"),
|
|
506
|
+
ratio: requireNumber(source, "ratio", "layout tree split"),
|
|
507
|
+
first: readLayoutNode(source.first),
|
|
508
|
+
second: readLayoutNode(source.second),
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
throw new MuxError("protocol", "mux layout node has an unknown type");
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
function readLayoutTree(value: unknown): MuxLayoutTree {
|
|
515
|
+
const source = asRecord(value);
|
|
516
|
+
if (!source) throw new MuxError("protocol", "mux layout tree is not an object");
|
|
517
|
+
return {
|
|
518
|
+
workspaceId: requireString(source, "workspace_id", "layout tree"),
|
|
519
|
+
tabId: requireString(source, "tab_id", "layout tree"),
|
|
520
|
+
zoomed: source.zoomed === true,
|
|
521
|
+
focusedPaneId: optionalString(source, "focused_pane_id"),
|
|
522
|
+
root: readLayoutNode(source.root),
|
|
523
|
+
};
|
|
524
|
+
}
|
|
525
|
+
|
|
413
526
|
/** herdr names lifecycle event kinds with underscores on the wire and dots in subscriptions. */
|
|
414
|
-
const
|
|
527
|
+
const PANE_LEAVE_KIND_BY_WIRE: Readonly<Record<string, "pane.closed" | "pane.exited">> = {
|
|
415
528
|
pane_closed: "pane.closed",
|
|
416
529
|
pane_exited: "pane.exited",
|
|
417
530
|
};
|
|
@@ -419,14 +532,37 @@ const EVENT_KIND_BY_WIRE: Readonly<Record<string, MuxEventKind>> = {
|
|
|
419
532
|
function readEvent(line: Record<string, unknown>): MuxEvent | null {
|
|
420
533
|
const wireKind = line.event;
|
|
421
534
|
if (typeof wireKind !== "string") return null;
|
|
422
|
-
const kind = EVENT_KIND_BY_WIRE[wireKind];
|
|
423
|
-
if (!kind) return null;
|
|
424
535
|
const data = asRecord(line.data);
|
|
425
536
|
if (!data) return null;
|
|
426
|
-
const
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
537
|
+
const leaveKind = PANE_LEAVE_KIND_BY_WIRE[wireKind];
|
|
538
|
+
if (leaveKind) {
|
|
539
|
+
const paneId = data.pane_id;
|
|
540
|
+
const workspaceId = data.workspace_id;
|
|
541
|
+
if (typeof paneId !== "string" || typeof workspaceId !== "string") return null;
|
|
542
|
+
return { kind: leaveKind, paneId, workspaceId };
|
|
543
|
+
}
|
|
544
|
+
if (wireKind === "pane_moved") {
|
|
545
|
+
// The move rewrites the pane id; the payload carries the new pane record
|
|
546
|
+
// plus the id it replaced, and consumers continue from the new one.
|
|
547
|
+
const pane = asRecord(data.pane);
|
|
548
|
+
const previousPaneId = data.previous_pane_id;
|
|
549
|
+
if (!pane || typeof previousPaneId !== "string") return null;
|
|
550
|
+
const paneId = pane.pane_id;
|
|
551
|
+
const tabId = pane.tab_id;
|
|
552
|
+
const workspaceId = pane.workspace_id;
|
|
553
|
+
if (typeof paneId !== "string" || typeof tabId !== "string" || typeof workspaceId !== "string") return null;
|
|
554
|
+
return { kind: "pane.moved", paneId, previousPaneId, tabId, workspaceId };
|
|
555
|
+
}
|
|
556
|
+
if (wireKind === "layout_updated") {
|
|
557
|
+
// The push already carries the full tab geometry, so a consumer never
|
|
558
|
+
// has to answer a layout event with a layout request.
|
|
559
|
+
try {
|
|
560
|
+
return { kind: "layout.updated", geometry: readTabGeometry(data.layout) };
|
|
561
|
+
} catch {
|
|
562
|
+
return null;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
return null;
|
|
430
566
|
}
|
|
431
567
|
|
|
432
568
|
/** Drops undefined entries so an optional field is absent rather than `null` on the wire. */
|
|
@@ -693,17 +829,29 @@ export function createMuxClient(options: MuxClientOptions): MuxClient {
|
|
|
693
829
|
async paneClose(paneId: string): Promise<void> {
|
|
694
830
|
await call("pane.close", { pane_id: paneId });
|
|
695
831
|
},
|
|
696
|
-
async paneLayout(paneId?: string): Promise<
|
|
832
|
+
async paneLayout(paneId?: string): Promise<MuxTabGeometry> {
|
|
697
833
|
const result = await callObject("pane.layout", params({ pane_id: paneId }));
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
834
|
+
return readTabGeometry(result.layout);
|
|
835
|
+
},
|
|
836
|
+
async paneFocus(paneId: string): Promise<void> {
|
|
837
|
+
await call("pane.focus", { pane_id: paneId });
|
|
838
|
+
},
|
|
839
|
+
async paneZoom(paneId: string, mode: "on" | "off" | "toggle"): Promise<{ changed: boolean; focusChanged: boolean }> {
|
|
840
|
+
const result = await callObject("pane.zoom", { pane_id: paneId, mode });
|
|
841
|
+
const zoom = asRecord(result.zoom);
|
|
842
|
+
if (!zoom) throw new MuxError("protocol", "mux pane.zoom returned no zoom result");
|
|
843
|
+
return { changed: zoom.changed === true, focusChanged: zoom.focus_changed === true };
|
|
844
|
+
},
|
|
845
|
+
async layoutExport(request = {}): Promise<MuxLayoutTree> {
|
|
846
|
+
const result = await callObject("layout.export", params({ tab_id: request.tabId, pane_id: request.paneId }));
|
|
847
|
+
return readLayoutTree(result.layout);
|
|
848
|
+
},
|
|
849
|
+
async layoutSetSplitRatio(request): Promise<MuxLayoutTree> {
|
|
850
|
+
const result = await callObject(
|
|
851
|
+
"layout.set_split_ratio",
|
|
852
|
+
params({ tab_id: request.tabId, pane_id: request.paneId, path: [...request.path], ratio: request.ratio }),
|
|
853
|
+
);
|
|
854
|
+
return readLayoutTree(result.layout);
|
|
707
855
|
},
|
|
708
856
|
async worktreeList(request = {}): Promise<MuxWorktreeListResult> {
|
|
709
857
|
const result = await callObject("worktree.list", params({ workspace_id: request.workspaceId, cwd: request.cwd }));
|
package/src/domains/mux/types.ts
CHANGED
|
@@ -97,14 +97,57 @@ export interface MuxSnapshot {
|
|
|
97
97
|
tabs: ReadonlyArray<MuxTab>;
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
/** Lifecycle event kinds
|
|
101
|
-
export type MuxEventKind = "pane.closed" | "pane.exited";
|
|
100
|
+
/** Lifecycle event kinds the pane layer can subscribe to. */
|
|
101
|
+
export type MuxEventKind = "pane.closed" | "pane.exited" | "pane.moved" | "layout.updated";
|
|
102
102
|
|
|
103
|
-
/**
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
/**
|
|
104
|
+
* One pushed lifecycle event. A discriminated union because the payloads
|
|
105
|
+
* differ: pane leave events carry the pane, a move carries the id rewrite
|
|
106
|
+
* herdr performs, and a layout update carries the whole tab geometry so a
|
|
107
|
+
* consumer does not have to turn around and fetch what the push already said.
|
|
108
|
+
*/
|
|
109
|
+
export type MuxEvent =
|
|
110
|
+
| { kind: "pane.closed" | "pane.exited"; paneId: string; workspaceId: string }
|
|
111
|
+
| { kind: "pane.moved"; paneId: string; previousPaneId: string; tabId: string; workspaceId: string }
|
|
112
|
+
| { kind: "layout.updated"; geometry: MuxTabGeometry };
|
|
113
|
+
|
|
114
|
+
/** One rectangle in terminal cells, as herdr's layout snapshots report them. */
|
|
115
|
+
export interface MuxRect {
|
|
116
|
+
x: number;
|
|
117
|
+
y: number;
|
|
118
|
+
width: number;
|
|
119
|
+
height: number;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Cell-precise geometry of one tab: the outer area, every pane's rect, and
|
|
124
|
+
* every split with its live ratio. This is what dock sizing converges on.
|
|
125
|
+
*/
|
|
126
|
+
export interface MuxTabGeometry {
|
|
127
|
+
workspaceId: string;
|
|
128
|
+
tabId: string;
|
|
129
|
+
zoomed: boolean;
|
|
130
|
+
area: MuxRect;
|
|
131
|
+
focusedPaneId: string | null;
|
|
132
|
+
panes: ReadonlyArray<{ paneId: string; focused: boolean; rect: MuxRect }>;
|
|
133
|
+
splits: ReadonlyArray<{ direction: "right" | "down"; ratio: number; rect: MuxRect }>;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* One node of a portable tab layout tree, as `layout.export` describes it.
|
|
138
|
+
* Split ratio is the share of the axis the `first` child keeps.
|
|
139
|
+
*/
|
|
140
|
+
export type MuxLayoutNode =
|
|
141
|
+
| { type: "pane"; paneId: string | null; label: string | null }
|
|
142
|
+
| { type: "split"; direction: "right" | "down"; ratio: number; first: MuxLayoutNode; second: MuxLayoutNode };
|
|
143
|
+
|
|
144
|
+
/** A whole tab's portable layout tree. */
|
|
145
|
+
export interface MuxLayoutTree {
|
|
107
146
|
workspaceId: string;
|
|
147
|
+
tabId: string;
|
|
148
|
+
zoomed: boolean;
|
|
149
|
+
focusedPaneId: string | null;
|
|
150
|
+
root: MuxLayoutNode;
|
|
108
151
|
}
|
|
109
152
|
|
|
110
153
|
/** Where Clio's own pane lives, read from the herdr environment. */
|
|
@@ -3,6 +3,8 @@ import { StringDecoder } from "node:string_decoder";
|
|
|
3
3
|
|
|
4
4
|
export const YAZI_STREAM_POLL_MS = 250;
|
|
5
5
|
export const YAZI_STREAM_MAX_BYTES = 1024 * 1024;
|
|
6
|
+
export const YAZI_PICK_EVENT = "clio-coder-pick";
|
|
7
|
+
export const LEGACY_YAZI_PICK_EVENT = "clio-pick";
|
|
6
8
|
|
|
7
9
|
export interface YaziCdEvent {
|
|
8
10
|
kind: "cd";
|
|
@@ -13,7 +15,7 @@ export interface YaziCdEvent {
|
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
export interface YaziPickEvent {
|
|
16
|
-
kind:
|
|
18
|
+
kind: typeof YAZI_PICK_EVENT;
|
|
17
19
|
receiver: string;
|
|
18
20
|
sender: string;
|
|
19
21
|
values: ReadonlyArray<string>;
|
|
@@ -61,7 +63,7 @@ export function parseYaziEventLine(line: string): YaziEvent | null {
|
|
|
61
63
|
const third = second < 0 ? -1 : line.indexOf(",", second + 1);
|
|
62
64
|
if (first <= 0 || second <= first + 1 || third <= second + 1) return null;
|
|
63
65
|
const kind = line.slice(0, first);
|
|
64
|
-
if (kind !== "cd" && kind !==
|
|
66
|
+
if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) return null;
|
|
65
67
|
const receiver = line.slice(first + 1, second);
|
|
66
68
|
const sender = line.slice(second + 1, third);
|
|
67
69
|
try {
|
|
@@ -73,7 +75,7 @@ export function parseYaziEventLine(line: string): YaziEvent | null {
|
|
|
73
75
|
return { kind, receiver, sender, tab: String(tab), cwd: body.url };
|
|
74
76
|
}
|
|
75
77
|
if (!Array.isArray(body) || !body.every((value) => typeof value === "string")) return null;
|
|
76
|
-
return { kind, receiver, sender, values: body };
|
|
78
|
+
return { kind: YAZI_PICK_EVENT, receiver, sender, values: body };
|
|
77
79
|
} catch {
|
|
78
80
|
return null;
|
|
79
81
|
}
|
|
@@ -152,7 +154,7 @@ export function createYaziEventStream(options: YaziEventStreamOptions): YaziEven
|
|
|
152
154
|
const line = raw.endsWith("\r") ? raw.slice(0, -1) : raw;
|
|
153
155
|
if (line.length === 0) continue;
|
|
154
156
|
const kind = line.slice(0, line.indexOf(","));
|
|
155
|
-
if (kind !== "cd" && kind !==
|
|
157
|
+
if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) continue;
|
|
156
158
|
const event = parseYaziEventLine(line);
|
|
157
159
|
if (!event) {
|
|
158
160
|
state.malformedLines += 1;
|
|
@@ -119,7 +119,7 @@ function shellQuote(value: string): string {
|
|
|
119
119
|
|
|
120
120
|
/** Render the one Clio key chord, with an absolute `ya` path for vendored installs. */
|
|
121
121
|
export function renderYaziKeymap(yaPath: string): string {
|
|
122
|
-
const command = `shell -- ${shellQuote(yaPath)} pub-to "$YAZI_ID" clio-pick --list "$
|
|
122
|
+
const command = `shell -- ${shellQuote(yaPath)} pub-to "$YAZI_ID" clio-coder-pick --list "$CLIO_CODER_YAZI_PICK_TOKEN" %s`;
|
|
123
123
|
return `# Generated by Clio Coder. Changes are replaced when the managed profile regenerates.
|
|
124
124
|
|
|
125
125
|
[[mgr.prepend_keymap]]
|
|
@@ -2,12 +2,20 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
+
import { namingCompatibilityEnvironment } from "../../../core/naming-compat.js";
|
|
5
6
|
import { clioCacheDir } from "../../../core/xdg.js";
|
|
6
7
|
import { findPinnedTool } from "../../toolchain/registry.js";
|
|
7
8
|
import { describeResolution, resolveToolBinary, toolStatus } from "../../toolchain/resolve.js";
|
|
8
9
|
import type { MuxContract } from "../contract.js";
|
|
9
10
|
import type { MuxPaneRef } from "../types.js";
|
|
10
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
createYaziEventStream,
|
|
13
|
+
LEGACY_YAZI_PICK_EVENT,
|
|
14
|
+
YAZI_PICK_EVENT,
|
|
15
|
+
YAZI_STREAM_POLL_MS,
|
|
16
|
+
type YaziEvent,
|
|
17
|
+
type YaziEventStream,
|
|
18
|
+
} from "./event-stream.js";
|
|
11
19
|
import { ensureYaziProfile, type YaziProfile, yaziProfileDir } from "./profile.js";
|
|
12
20
|
|
|
13
21
|
export type YaziSessionMode = "companion" | "chooser";
|
|
@@ -55,6 +63,11 @@ export interface YaziSessionOptions {
|
|
|
55
63
|
mode: YaziSessionMode;
|
|
56
64
|
profileMode: YaziProfileMode;
|
|
57
65
|
cwd: string;
|
|
66
|
+
/**
|
|
67
|
+
* Files-dock share of the height. Set by the interactive bridge from
|
|
68
|
+
* `interface.panes.files.ratio`; absent it, the dock spec's default governs.
|
|
69
|
+
*/
|
|
70
|
+
dockShare?: number;
|
|
58
71
|
onEvent: (event: YaziEvent) => void;
|
|
59
72
|
onChooser: (result: YaziChooserResult) => void;
|
|
60
73
|
onStopped?: (reason: string) => void;
|
|
@@ -130,13 +143,19 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
130
143
|
const token = options.mode === "companion" ? (options.pickToken ?? randomUUID()) : null;
|
|
131
144
|
const env: Record<string, string> = {
|
|
132
145
|
...(managedProfile ? { YAZI_CONFIG_HOME: managedProfile.dir } : {}),
|
|
133
|
-
...(token ?
|
|
146
|
+
...(token ? namingCompatibilityEnvironment("CLIO_CODER_YAZI_PICK_TOKEN", "CLIO_YAZI_PICK_TOKEN", token) : {}),
|
|
134
147
|
};
|
|
135
148
|
let argv: ReadonlyArray<string>;
|
|
136
149
|
let stdoutPath: string | undefined;
|
|
137
150
|
if (options.mode === "companion") {
|
|
138
151
|
writeFileSync(streamPath, "");
|
|
139
|
-
argv = [
|
|
152
|
+
argv = [
|
|
153
|
+
binaries.yaziPath,
|
|
154
|
+
"--local-events",
|
|
155
|
+
`cd,${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`,
|
|
156
|
+
"--remote-events",
|
|
157
|
+
`${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`,
|
|
158
|
+
];
|
|
140
159
|
stdoutPath = streamPath;
|
|
141
160
|
} else {
|
|
142
161
|
writeFileSync(chooserPath, "");
|
|
@@ -148,6 +167,10 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
|
|
|
148
167
|
argv,
|
|
149
168
|
cwd: options.cwd,
|
|
150
169
|
label: "yazi",
|
|
170
|
+
// The files dock: split down from the anchor at the configured share.
|
|
171
|
+
// Degrades to a plain split inside the contract when the layout tier is
|
|
172
|
+
// absent.
|
|
173
|
+
dock: { slot: "files", ...(options.dockShare === undefined ? {} : { share: options.dockShare }) },
|
|
151
174
|
...(Object.keys(env).length > 0 ? { env } : {}),
|
|
152
175
|
...(stdoutPath ? { stdoutPath } : {}),
|
|
153
176
|
});
|
|
@@ -96,7 +96,7 @@ async function buildAndIndexEvidence(
|
|
|
96
96
|
});
|
|
97
97
|
} catch (error) {
|
|
98
98
|
const message = error instanceof Error ? error.message : String(error);
|
|
99
|
-
process.stderr.write(`[clio:evidence] auto-build failed for run ${runId}: ${message}\n`);
|
|
99
|
+
process.stderr.write(`[clio-coder:evidence] auto-build failed for run ${runId}: ${message}\n`);
|
|
100
100
|
hooks.onFailed(runId, message);
|
|
101
101
|
}
|
|
102
102
|
}
|
|
@@ -130,7 +130,7 @@ export function appendOutOfTurnUsageRow(stateDir: string, row: OutOfTurnUsageRow
|
|
|
130
130
|
closeSync(fd);
|
|
131
131
|
}
|
|
132
132
|
} catch (error) {
|
|
133
|
-
process.stderr.write(`[clio:usage] out-of-turn usage row not written: ${messageOf(error)}\n`);
|
|
133
|
+
process.stderr.write(`[clio-coder:usage] out-of-turn usage row not written: ${messageOf(error)}\n`);
|
|
134
134
|
return;
|
|
135
135
|
}
|
|
136
136
|
appendsSinceBoundCheck += 1;
|
|
@@ -139,7 +139,7 @@ export function appendOutOfTurnUsageRow(stateDir: string, row: OutOfTurnUsageRow
|
|
|
139
139
|
try {
|
|
140
140
|
boundOutOfTurnUsageFile(path);
|
|
141
141
|
} catch (error) {
|
|
142
|
-
process.stderr.write(`[clio:usage] out-of-turn usage ring not bounded: ${messageOf(error)}\n`);
|
|
142
|
+
process.stderr.write(`[clio-coder:usage] out-of-turn usage ring not bounded: ${messageOf(error)}\n`);
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
|
|
@@ -167,7 +167,7 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
|
|
|
167
167
|
listener(snapshot);
|
|
168
168
|
} catch (error) {
|
|
169
169
|
const message = error instanceof Error ? (error.stack ?? error.message) : String(error);
|
|
170
|
-
console.error(`[clio:observability] projection listener crashed: ${message}`);
|
|
170
|
+
console.error(`[clio-coder:observability] projection listener crashed: ${message}`);
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
}
|
|
@@ -19,6 +19,7 @@ import type {
|
|
|
19
19
|
DispatchProgressPayload,
|
|
20
20
|
DispatchStartedPayload,
|
|
21
21
|
} from "../../core/bus-events.js";
|
|
22
|
+
import { normalizeClioCoderEventType } from "../../core/naming-events.js";
|
|
22
23
|
import { processAlive, processBirthToken } from "../../core/process-identity.js";
|
|
23
24
|
import { createRedactionTally, redactSecretsText } from "../evidence/redact.js";
|
|
24
25
|
|
|
@@ -110,7 +111,7 @@ function requireSqlite(): DatabaseSyncConstructor {
|
|
|
110
111
|
* Exported for the contract test, which drives it with a load that emits both
|
|
111
112
|
* warnings; production has exactly one caller.
|
|
112
113
|
*/
|
|
113
|
-
|
|
114
|
+
function loadWithSqliteWarningSuppressed<T>(load: () => T): T {
|
|
114
115
|
if (warningTracingRequested()) return load();
|
|
115
116
|
const emitWarning = process.emitWarning;
|
|
116
117
|
const forward = emitWarning.bind(process) as (...args: unknown[]) => void;
|
|
@@ -1201,7 +1202,7 @@ export class TraceReader {
|
|
|
1201
1202
|
}
|
|
1202
1203
|
|
|
1203
1204
|
events(runId: string, afterRowid = 0, limit = TRACE_EVENT_POLL_LIMIT): TraceEventRow[] {
|
|
1204
|
-
|
|
1205
|
+
const rows = this.db
|
|
1205
1206
|
.prepare(`SELECT rowid, event_id, run_id, phase_id, parent_id, type, name, payload_json,
|
|
1206
1207
|
tokens, started_at, ended_at FROM events
|
|
1207
1208
|
WHERE run_id = ? AND rowid > ? ORDER BY rowid LIMIT ?`)
|
|
@@ -1210,6 +1211,7 @@ export class TraceReader {
|
|
|
1210
1211
|
Math.max(0, Math.trunc(afterRowid)),
|
|
1211
1212
|
clampInt(limit, 1, TRACE_EVENT_POLL_LIMIT),
|
|
1212
1213
|
) as unknown as TraceEventRow[];
|
|
1214
|
+
return rows.map((row) => ({ ...row, type: normalizeClioCoderEventType(row.type) }));
|
|
1213
1215
|
}
|
|
1214
1216
|
|
|
1215
1217
|
/**
|
|
@@ -1221,9 +1223,17 @@ export class TraceReader {
|
|
|
1221
1223
|
* on the way to counting them.
|
|
1222
1224
|
*/
|
|
1223
1225
|
eventKindCounts(runId: string): Array<{ type: string; count: number }> {
|
|
1224
|
-
|
|
1226
|
+
const rows = this.db
|
|
1225
1227
|
.prepare("SELECT type, COUNT(*) AS count FROM events WHERE run_id=? GROUP BY type ORDER BY count DESC, type")
|
|
1226
1228
|
.all(runId) as unknown as Array<{ type: string; count: number }>;
|
|
1229
|
+
const counts = new Map<string, number>();
|
|
1230
|
+
for (const row of rows) {
|
|
1231
|
+
const type = normalizeClioCoderEventType(row.type);
|
|
1232
|
+
counts.set(type, (counts.get(type) ?? 0) + row.count);
|
|
1233
|
+
}
|
|
1234
|
+
return [...counts]
|
|
1235
|
+
.map(([type, count]) => ({ type, count }))
|
|
1236
|
+
.sort((left, right) => right.count - left.count || left.type.localeCompare(right.type));
|
|
1227
1237
|
}
|
|
1228
1238
|
|
|
1229
1239
|
/** Total events and the wall span they cover, without reading one of them. */
|
|
@@ -1273,7 +1283,7 @@ export class TraceReader {
|
|
|
1273
1283
|
}
|
|
1274
1284
|
|
|
1275
1285
|
select(sql: string): Record<string, SQLInputValue>[] {
|
|
1276
|
-
|
|
1286
|
+
assertTraceSelectOnly(sql);
|
|
1277
1287
|
return this.db.prepare(sql).all() as Record<string, SQLInputValue>[];
|
|
1278
1288
|
}
|
|
1279
1289
|
}
|
|
@@ -1301,7 +1311,7 @@ export function createDispatchTraceMirror(
|
|
|
1301
1311
|
path: string,
|
|
1302
1312
|
options: { warn?: (message: string) => void; now?: () => string } = {},
|
|
1303
1313
|
): DispatchTraceMirror {
|
|
1304
|
-
const warn = options.warn ?? ((message: string) => process.stderr.write(`[clio:trace] ${message}\n`));
|
|
1314
|
+
const warn = options.warn ?? ((message: string) => process.stderr.write(`[clio-coder:trace] ${message}\n`));
|
|
1305
1315
|
const now = options.now ?? (() => new Date().toISOString());
|
|
1306
1316
|
let store: TraceStore | null = null;
|
|
1307
1317
|
let chain: Promise<void> = Promise.resolve();
|
|
@@ -1408,7 +1418,7 @@ function recordProgress(
|
|
|
1408
1418
|
): void {
|
|
1409
1419
|
if (!isRecord(payload.event)) return;
|
|
1410
1420
|
const event = payload.event;
|
|
1411
|
-
const type = typeof event.type === "string" ? event.type : "progress";
|
|
1421
|
+
const type = typeof event.type === "string" ? normalizeClioCoderEventType(event.type) : "progress";
|
|
1412
1422
|
const toolCallId = stringValue(event.toolCallId) ?? stringValue(event.tool_call_id);
|
|
1413
1423
|
if (
|
|
1414
1424
|
type === "message_end" &&
|
|
@@ -1442,7 +1452,7 @@ function recordProgress(
|
|
|
1442
1452
|
});
|
|
1443
1453
|
}
|
|
1444
1454
|
}
|
|
1445
|
-
if ((type === "tool_execution_start" || type === "
|
|
1455
|
+
if ((type === "tool_execution_start" || type === "clio_coder_tool_start") && toolCallId !== null) {
|
|
1446
1456
|
starts.set(`${payload.runId}:${toolCallId}`, {
|
|
1447
1457
|
toolCallId,
|
|
1448
1458
|
tool: stringValue(event.toolName) ?? stringValue(event.tool) ?? "tool",
|
|
@@ -1451,7 +1461,7 @@ function recordProgress(
|
|
|
1451
1461
|
});
|
|
1452
1462
|
return;
|
|
1453
1463
|
}
|
|
1454
|
-
if ((type === "tool_execution_end" || type === "
|
|
1464
|
+
if ((type === "tool_execution_end" || type === "clio_coder_tool_finish") && toolCallId !== null) {
|
|
1455
1465
|
const key = `${payload.runId}:${toolCallId}`;
|
|
1456
1466
|
const start = starts.get(key);
|
|
1457
1467
|
// One clock frame per row. The worker measures `durationMs` on its own
|
|
@@ -1537,12 +1547,12 @@ function recordFailure(store: TraceStore, input: DispatchFailedPayload, at: stri
|
|
|
1537
1547
|
function isCriticalTraceEvent(channel: string, raw: unknown): boolean {
|
|
1538
1548
|
if (channel !== "dispatch.progress") return true;
|
|
1539
1549
|
if (!isRecord(raw) || !isRecord(raw.event)) return false;
|
|
1540
|
-
const type = raw.event.type;
|
|
1550
|
+
const type = typeof raw.event.type === "string" ? normalizeClioCoderEventType(raw.event.type) : raw.event.type;
|
|
1541
1551
|
return (
|
|
1542
1552
|
type === "tool_execution_start" ||
|
|
1543
1553
|
type === "tool_execution_end" ||
|
|
1544
|
-
type === "
|
|
1545
|
-
type === "
|
|
1554
|
+
type === "clio_coder_tool_start" ||
|
|
1555
|
+
type === "clio_coder_tool_finish" ||
|
|
1546
1556
|
type === "message_end" ||
|
|
1547
1557
|
type === "attempt_start"
|
|
1548
1558
|
);
|
|
@@ -1659,7 +1669,7 @@ function sha256(value: string): string {
|
|
|
1659
1669
|
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
1660
1670
|
}
|
|
1661
1671
|
|
|
1662
|
-
function
|
|
1672
|
+
export function assertTraceSelectOnly(sql: string): void {
|
|
1663
1673
|
const trimmed = sql.trim();
|
|
1664
1674
|
if (!/^(SELECT|WITH)\b/i.test(trimmed)) throw new Error("trace sql accepts SELECT or read-only WITH queries only");
|
|
1665
1675
|
if (trimmed.includes(";")) throw new Error("trace sql accepts exactly one statement");
|
|
@@ -180,7 +180,7 @@ function lookupFragment(table: FragmentTable, id: string, role: string): LoadedF
|
|
|
180
180
|
* section and the dispatch worker safety-posture message must describe the
|
|
181
181
|
* same enforced behavior, so neither side duplicates this switch.
|
|
182
182
|
*/
|
|
183
|
-
|
|
183
|
+
function safetyOneLiner(level: string): string {
|
|
184
184
|
switch (level) {
|
|
185
185
|
case "read-only":
|
|
186
186
|
return "inspect and answer; mutating calls are auto-denied, so propose changes instead.";
|
|
@@ -653,7 +653,7 @@ export function compileWorker(table: FragmentTable, inputs: WorkerPromptInputs):
|
|
|
653
653
|
if (inputs.hasBoundSkills && !inputs.hasCanonicalContext) {
|
|
654
654
|
throw new Error("prompts/compiler: bound skills require canonical context in the final attached tool surface");
|
|
655
655
|
}
|
|
656
|
-
const identity = lookupFragment(table, "identity.clio-worker", "worker identity");
|
|
656
|
+
const identity = lookupFragment(table, "identity.clio-coder-worker", "worker identity");
|
|
657
657
|
const operatingContract = lookupFragment(table, "operating.contract", "operating contract");
|
|
658
658
|
const workerContract = lookupFragment(table, "operating.worker", "worker contract");
|
|
659
659
|
const safety = lookupFragment(table, `safety.${inputs.autonomy}`, "safety");
|
|
@@ -62,7 +62,7 @@ export function createPromptsBundle(
|
|
|
62
62
|
table = loadFragments();
|
|
63
63
|
} catch (err) {
|
|
64
64
|
const msg = err instanceof Error ? err.message : String(err);
|
|
65
|
-
process.stderr.write(`[clio:prompts] reload failed: ${msg}\n`);
|
|
65
|
+
process.stderr.write(`[clio-coder:prompts] reload failed: ${msg}\n`);
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -81,7 +81,7 @@ export function createPromptsBundle(
|
|
|
81
81
|
}
|
|
82
82
|
const configContract = config();
|
|
83
83
|
const settings: Readonly<ClioSettings> | undefined = configContract?.get();
|
|
84
|
-
const safety = input.autonomy ?? settings?.autonomy ?? "auto-edit";
|
|
84
|
+
const safety = input.autonomy ?? settings?.safety.autonomy ?? "auto-edit";
|
|
85
85
|
const cwd = input.cwd ?? process.cwd();
|
|
86
86
|
let contextFiles = "";
|
|
87
87
|
let projectPreload: ProjectPreloadClass | null = null;
|
|
@@ -147,7 +147,7 @@ export function createPromptsBundle(
|
|
|
147
147
|
table = loadFragments();
|
|
148
148
|
} catch (err) {
|
|
149
149
|
const msg = err instanceof Error ? err.message : String(err);
|
|
150
|
-
process.stderr.write(`[clio:prompts] initial load failed: ${msg}\n`);
|
|
150
|
+
process.stderr.write(`[clio-coder:prompts] initial load failed: ${msg}\n`);
|
|
151
151
|
table = { byId: new Map(), rootDir: "" };
|
|
152
152
|
}
|
|
153
153
|
unsubscribeHotReload = context.bus.on(BusChannels.ConfigHotReload, (payload: unknown) => {
|