@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
|
@@ -151,7 +151,6 @@ const RECEIPT_REQUIRED_KEYS = [
|
|
|
151
151
|
"costUsd",
|
|
152
152
|
"compiledPromptHash",
|
|
153
153
|
"staticCompositionHash",
|
|
154
|
-
"clioVersion",
|
|
155
154
|
"piMonoVersion",
|
|
156
155
|
"platform",
|
|
157
156
|
"nodeVersion",
|
|
@@ -255,7 +254,7 @@ export function receiptFilePath(stateDir: string, runId: string): string {
|
|
|
255
254
|
return join(stateDir, "receipts", `${runId}.json`);
|
|
256
255
|
}
|
|
257
256
|
|
|
258
|
-
|
|
257
|
+
function runLedgerPath(stateDir: string): string {
|
|
259
258
|
return join(stateDir, "runs.json");
|
|
260
259
|
}
|
|
261
260
|
|
|
@@ -317,7 +316,7 @@ type ReadLedgerResult = { ok: true; envelope: RunEnvelope } | { ok: false; reaso
|
|
|
317
316
|
* the same file and ledger row, projected through the shared boundary so the
|
|
318
317
|
* receipt view spells its verdict exactly as the board and the CLI do.
|
|
319
318
|
*/
|
|
320
|
-
|
|
319
|
+
function receiptTrustDetail(stateDir: string, runId: string): string {
|
|
321
320
|
try {
|
|
322
321
|
const receipt = JSON.parse(readFileSync(receiptFilePath(stateDir, runId), "utf8")) as RunReceipt;
|
|
323
322
|
const ledger = readRunEnvelope(stateDir, runId);
|
|
@@ -335,7 +334,7 @@ function readRunEnvelope(stateDir: string, runId: string): ReadLedgerResult {
|
|
|
335
334
|
return { ok: false, reason: runs.length === 0 ? "run ledger not found" : "run not found in ledger" };
|
|
336
335
|
}
|
|
337
336
|
|
|
338
|
-
|
|
337
|
+
function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerifyResult {
|
|
339
338
|
const target = receiptFilePath(stateDir, runId);
|
|
340
339
|
let raw: string;
|
|
341
340
|
try {
|
|
@@ -358,6 +357,9 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
|
|
|
358
357
|
for (const key of RECEIPT_REQUIRED_KEYS) {
|
|
359
358
|
if (!(key in r)) return { ok: false, reason: `missing field: ${key}` };
|
|
360
359
|
}
|
|
360
|
+
if (!("clioCoderVersion" in r) && !("clioVersion" in r)) {
|
|
361
|
+
return { ok: false, reason: "missing field: clioCoderVersion" };
|
|
362
|
+
}
|
|
361
363
|
if (!isNonEmptyString(r.runId)) {
|
|
362
364
|
return { ok: false, reason: `runId invalid: ${String(r.runId)}` };
|
|
363
365
|
}
|
|
@@ -413,8 +415,9 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
|
|
|
413
415
|
if (!isIso8601(r.endedAt)) {
|
|
414
416
|
return { ok: false, reason: `endedAt not ISO-8601: ${String(r.endedAt)}` };
|
|
415
417
|
}
|
|
416
|
-
|
|
417
|
-
|
|
418
|
+
const clioCoderVersion = r.clioCoderVersion ?? r.clioVersion;
|
|
419
|
+
if (typeof clioCoderVersion !== "string" || clioCoderVersion.length === 0) {
|
|
420
|
+
return { ok: false, reason: "clioCoderVersion empty" };
|
|
418
421
|
}
|
|
419
422
|
if (!isNonEmptyString(r.piMonoVersion)) {
|
|
420
423
|
return { ok: false, reason: `piMonoVersion invalid: ${String(r.piMonoVersion)}` };
|
|
@@ -453,7 +456,7 @@ export function verifyReceiptFile(stateDir: string, runId: string): ReceiptVerif
|
|
|
453
456
|
|
|
454
457
|
const RECEIPT_FILE_FAILURE = /^(?:receipt file not found|read error:)/u;
|
|
455
458
|
const RECEIPT_CONTRACT_FAILURE =
|
|
456
|
-
/^(?:invalid json:|receipt is not an object|missing field:|runId invalid:|runId mismatch:|agentId invalid:|task invalid:|targetId invalid:|wireModelId invalid:|runtimeId invalid:|runtimeKind invalid:|exitCode out of range:|tokenCount out of range:|inputTokenCount out of range:|outputTokenCount out of range:|cacheReadTokenCount out of range:|cacheWriteTokenCount out of range:|costUsd out of range:|reasoningTokenCount out of range:|startedAt not ISO-8601:|endedAt not ISO-8601:|
|
|
459
|
+
/^(?:invalid json:|receipt is not an object|missing field:|runId invalid:|runId mismatch:|agentId invalid:|task invalid:|targetId invalid:|wireModelId invalid:|runtimeId invalid:|runtimeKind invalid:|exitCode out of range:|tokenCount out of range:|inputTokenCount out of range:|outputTokenCount out of range:|cacheReadTokenCount out of range:|cacheWriteTokenCount out of range:|costUsd out of range:|reasoningTokenCount out of range:|startedAt not ISO-8601:|endedAt not ISO-8601:|clioCoderVersion empty|piMonoVersion invalid:|platform invalid:|nodeVersion invalid:|toolCalls out of range:|toolStats\[|compiledPromptHash invalid:|staticCompositionHash invalid:|sessionId invalid:|integrity invalid|execution role invalid|routing intent invalid|route decision invalid)/u;
|
|
457
460
|
const LEDGER_FAILURE = /^(?:run ledger not found|run not found in ledger|ledger mismatch:)/u;
|
|
458
461
|
|
|
459
462
|
function receiptIntegrityDigest(value: unknown): string | null {
|
|
@@ -586,7 +589,7 @@ function splitLinesCapped(text: string, path?: string, maxLines = VIEW_ARTIFACT_
|
|
|
586
589
|
return [...lines.slice(0, maxLines), `[truncated, open file directly${path ? `: ${path}` : ""}]`];
|
|
587
590
|
}
|
|
588
591
|
|
|
589
|
-
|
|
592
|
+
async function loadJsonFileLines(path: string): Promise<ViewArtifactLoadResult> {
|
|
590
593
|
let canPrettyPrint = false;
|
|
591
594
|
try {
|
|
592
595
|
const info = await stat(path);
|
|
@@ -1569,7 +1572,7 @@ export function createDefaultArtifactProviders(deps: ArtifactProviderDeps): Arti
|
|
|
1569
1572
|
];
|
|
1570
1573
|
}
|
|
1571
1574
|
|
|
1572
|
-
|
|
1575
|
+
function sortViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
|
|
1573
1576
|
return [...artifacts].sort((a, b) => {
|
|
1574
1577
|
const time = b.timestamp - a.timestamp;
|
|
1575
1578
|
if (time !== 0) return time;
|
|
@@ -141,7 +141,7 @@ function isViewArtifactCategory(value: string): value is ViewArtifactCategory {
|
|
|
141
141
|
return VIEW_ARTIFACT_CATEGORY_SET.has(value as ViewArtifactCategory);
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
|
|
144
|
+
function parseViewFilterQuery(query: string): ViewFilterQuery {
|
|
145
145
|
const text = query.trim();
|
|
146
146
|
if (text.length === 0) return { kind: "text", text };
|
|
147
147
|
const colon = text.indexOf(":");
|
|
@@ -215,7 +215,7 @@ function formatLocalTime(timestamp: number): string {
|
|
|
215
215
|
return !Number.isFinite(timestamp) || timestamp <= 0 ? "unknown time" : clockLocal(timestamp);
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
-
|
|
218
|
+
function filterViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>, query: string): ViewArtifact[] {
|
|
219
219
|
const parsed = parseViewFilterQuery(query);
|
|
220
220
|
if (parsed.kind === "category") {
|
|
221
221
|
const categoryArtifacts = artifacts.filter((artifact) => artifact.category === parsed.category);
|
|
@@ -226,11 +226,11 @@ export function filterViewArtifacts(artifacts: ReadonlyArray<ViewArtifact>, quer
|
|
|
226
226
|
return fuzzyFilter([...artifacts], parsed.text, broadFilterText);
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
|
|
229
|
+
function artifactsInCategoryOrder(artifacts: ReadonlyArray<ViewArtifact>): ViewArtifact[] {
|
|
230
230
|
return VIEW_ARTIFACT_CATEGORIES.flatMap((category) => artifacts.filter((artifact) => artifact.category === category));
|
|
231
231
|
}
|
|
232
232
|
|
|
233
|
-
|
|
233
|
+
function initialViewSelection(artifacts: ReadonlyArray<ViewArtifact>, initialFilter = ""): number {
|
|
234
234
|
const filtered = filterViewArtifacts(artifacts, initialFilter);
|
|
235
235
|
const first = filtered[0];
|
|
236
236
|
if (!first) return 0;
|
|
@@ -252,7 +252,7 @@ export function initialViewSelection(artifacts: ReadonlyArray<ViewArtifact>, ini
|
|
|
252
252
|
return Math.max(0, artifactsInCategoryOrder(filtered).indexOf(selected));
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
-
|
|
255
|
+
function nextCategorySelection(
|
|
256
256
|
artifacts: ReadonlyArray<ViewArtifact>,
|
|
257
257
|
currentIndex: number,
|
|
258
258
|
direction: -1 | 1,
|
|
@@ -271,7 +271,7 @@ export function nextCategorySelection(
|
|
|
271
271
|
return safeCurrent;
|
|
272
272
|
}
|
|
273
273
|
|
|
274
|
-
|
|
274
|
+
function groupedViewRows(artifacts: ReadonlyArray<ViewArtifact>): RenderedViewRow[] {
|
|
275
275
|
const rows: RenderedViewRow[] = [];
|
|
276
276
|
for (const category of VIEW_ARTIFACT_CATEGORIES) {
|
|
277
277
|
const items = artifacts.filter((artifact) => artifact.category === category);
|
|
@@ -334,7 +334,7 @@ function verificationText(state: ViewVerificationState | undefined): string {
|
|
|
334
334
|
return `${GLYPH.error} verify fail ${state.detail}`;
|
|
335
335
|
}
|
|
336
336
|
|
|
337
|
-
|
|
337
|
+
function buildArtifactHeader(
|
|
338
338
|
artifact: ViewArtifact | undefined,
|
|
339
339
|
verification: ViewVerificationState | undefined,
|
|
340
340
|
width: number,
|
|
@@ -361,7 +361,7 @@ export function buildArtifactHeader(
|
|
|
361
361
|
}
|
|
362
362
|
|
|
363
363
|
/** Put verification on wrapped rows so a canonical receipt verdict is never reduced to a prefix. */
|
|
364
|
-
|
|
364
|
+
function buildArtifactHeaderLines(
|
|
365
365
|
artifact: ViewArtifact | undefined,
|
|
366
366
|
verification: ViewVerificationState | undefined,
|
|
367
367
|
width: number,
|
|
@@ -384,7 +384,7 @@ export function buildArtifactHeaderLines(
|
|
|
384
384
|
];
|
|
385
385
|
}
|
|
386
386
|
|
|
387
|
-
|
|
387
|
+
function viewFooterHint(focus: ViewPaneFocus, canVerify: boolean, innerWidth?: number): string {
|
|
388
388
|
// One pane at a time means Tab is how the other one is reached, so the
|
|
389
389
|
// narrow footer states it. The generic elider drops middle entries, and Tab
|
|
390
390
|
// sits in the middle.
|
|
@@ -527,6 +527,7 @@ export class ViewOverlayView implements Component {
|
|
|
527
527
|
private renderedContentLines(width: number): string[] {
|
|
528
528
|
const content = this.content;
|
|
529
529
|
if (!content) return [];
|
|
530
|
+
if (content.status === "error") return content.lines.flatMap((line) => wrapTextWithAnsi(line, Math.max(1, width)));
|
|
530
531
|
if (content.format !== "markdown") return content.lines;
|
|
531
532
|
if (content.renderedLines && content.renderWidth === width) return content.renderedLines;
|
|
532
533
|
const md = new Markdown(content.lines.join("\n"), 0, 0, markdownTheme(clioTheme()));
|
|
@@ -548,7 +549,9 @@ export class ViewOverlayView implements Component {
|
|
|
548
549
|
return this.fixedLines(lines, width, height);
|
|
549
550
|
}
|
|
550
551
|
if (this.artifactError) {
|
|
551
|
-
lines.push(
|
|
552
|
+
lines.push(
|
|
553
|
+
...wrapTextWithAnsi(theme.fg("error", this.artifactError), Math.max(1, width)).map((line) => padAnsi(line, width)),
|
|
554
|
+
);
|
|
552
555
|
return this.fixedLines(lines, width, height);
|
|
553
556
|
}
|
|
554
557
|
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
import { mkdirSync, renameSync, writeFileSync } from "node:fs";
|
|
22
22
|
import { dirname, join } from "node:path";
|
|
23
23
|
import { type ClioDirs, clioCacheDir, clioConfigDir, clioDataDir, clioStateDir } from "../core/xdg.js";
|
|
24
|
-
import type { MuxContract } from "../domains/mux/index.js";
|
|
24
|
+
import type { MuxContract, MuxPaneRef } from "../domains/mux/index.js";
|
|
25
25
|
import type { PanesWatchController, PanesWatchResult } from "../domains/mux/operations.js";
|
|
26
26
|
import { watchViewerCommand } from "../domains/mux/viewer-command.js";
|
|
27
27
|
|
|
@@ -38,6 +38,12 @@ function watchSelectionPath(stateDir: string = clioStateDir()): string {
|
|
|
38
38
|
export interface WatchPaneDeps {
|
|
39
39
|
mux: MuxContract;
|
|
40
40
|
getCwd: () => string;
|
|
41
|
+
/**
|
|
42
|
+
* Live workers-dock share, read at each open so a `/settings` edit applies
|
|
43
|
+
* to the next pane. Absent (tests, minimal wiring) the dock spec's default
|
|
44
|
+
* governs.
|
|
45
|
+
*/
|
|
46
|
+
getWorkersRatio?: () => number;
|
|
41
47
|
/** Selection-file override for tests. */
|
|
42
48
|
selectionPath?: string;
|
|
43
49
|
/** Resolved-layout override for tests. Production pins this process's four cached roots. */
|
|
@@ -78,7 +84,7 @@ export function createWatchPaneController(deps: WatchPaneDeps): PanesWatchContro
|
|
|
78
84
|
if (disposed || paneId !== null) return Promise.resolve(true);
|
|
79
85
|
if (adoptionInFlight !== null) return adoptionInFlight;
|
|
80
86
|
const attempt = Promise.resolve()
|
|
81
|
-
.then(() => deps.mux.adoptPane({ purpose: "watch", label: "watch" }))
|
|
87
|
+
.then(() => deps.mux.adoptPane({ purpose: "watch", label: "watch", dock: "workers" }))
|
|
82
88
|
.then((adopted) => {
|
|
83
89
|
if (!disposed && paneId === null && adopted !== null) paneId = adopted.paneId;
|
|
84
90
|
return true;
|
|
@@ -104,11 +110,40 @@ export function createWatchPaneController(deps: WatchPaneDeps): PanesWatchContro
|
|
|
104
110
|
}
|
|
105
111
|
};
|
|
106
112
|
|
|
113
|
+
/**
|
|
114
|
+
* The one place a watch pane is created: the workers dock slot, split right
|
|
115
|
+
* of Clio's pane at the configured share. On a host without the layout tier
|
|
116
|
+
* the dock request degrades inside the contract to a plain right split.
|
|
117
|
+
*/
|
|
118
|
+
const openPane = (): Promise<MuxPaneRef | null> =>
|
|
119
|
+
deps.mux.openUtilityPane({
|
|
120
|
+
argv: command(selectionPath, dirs),
|
|
121
|
+
cwd: deps.getCwd(),
|
|
122
|
+
label: "watch",
|
|
123
|
+
title: "clio-coder watch",
|
|
124
|
+
purpose: "watch",
|
|
125
|
+
dock: { slot: "workers", ...(deps.getWorkersRatio ? { share: deps.getWorkersRatio() } : {}) },
|
|
126
|
+
});
|
|
127
|
+
|
|
107
128
|
// Reclaim durable ownership for inventory and navigation immediately. The
|
|
108
129
|
// scan remains best effort and never opens a replacement pane on its own.
|
|
109
130
|
void adoptExistingPane();
|
|
110
131
|
|
|
111
132
|
return {
|
|
133
|
+
async ensureOpen(): Promise<boolean> {
|
|
134
|
+
// Boot composition: the pane exists and parks on the last selection
|
|
135
|
+
// (the viewer renders "no selection" until one is written). Adoption
|
|
136
|
+
// first, so a surviving dock is reused rather than doubled.
|
|
137
|
+
if (disposed) return false;
|
|
138
|
+
if (paneId !== null) return true;
|
|
139
|
+
await adoptExistingPane();
|
|
140
|
+
if (paneId !== null) return true;
|
|
141
|
+
const opened = await openPane();
|
|
142
|
+
if (opened === null) return false;
|
|
143
|
+
paneId = opened.paneId;
|
|
144
|
+
return true;
|
|
145
|
+
},
|
|
146
|
+
|
|
112
147
|
async watch(runId: string): Promise<PanesWatchResult> {
|
|
113
148
|
if (!writeSelection(runId)) {
|
|
114
149
|
return { status: "unavailable", reason: `cannot write the watch selection at ${selectionPath}` };
|
|
@@ -117,14 +152,7 @@ export function createWatchPaneController(deps: WatchPaneDeps): PanesWatchContro
|
|
|
117
152
|
const scanned = await adoptExistingPane();
|
|
118
153
|
if (!scanned) await adoptExistingPane();
|
|
119
154
|
if (paneId !== null) return { status: "watching", runId, paneId, opened: false };
|
|
120
|
-
const opened = await
|
|
121
|
-
argv: command(selectionPath, dirs),
|
|
122
|
-
cwd: deps.getCwd(),
|
|
123
|
-
label: "watch",
|
|
124
|
-
title: "clio watch",
|
|
125
|
-
purpose: "watch",
|
|
126
|
-
direction: "right",
|
|
127
|
-
});
|
|
155
|
+
const opened = await openPane();
|
|
128
156
|
if (opened === null) {
|
|
129
157
|
return { status: "unavailable", reason: "the pane host refused to open the watch pane" };
|
|
130
158
|
}
|
|
@@ -103,7 +103,7 @@ function findCurrentStatus(
|
|
|
103
103
|
statuses: ReadonlyArray<TargetStatus>,
|
|
104
104
|
settings: Readonly<ClioSettings> | undefined,
|
|
105
105
|
): TargetStatus | null {
|
|
106
|
-
const targetId = settings?.
|
|
106
|
+
const targetId = settings?.chat?.target ?? null;
|
|
107
107
|
if (!targetId) return null;
|
|
108
108
|
return statuses.find((status) => status.target.id === targetId) ?? null;
|
|
109
109
|
}
|
|
@@ -127,7 +127,7 @@ function selectedModelCapabilities(
|
|
|
127
127
|
providers: ProvidersContract,
|
|
128
128
|
): CapabilityFlags | null {
|
|
129
129
|
if (!status) return null;
|
|
130
|
-
const wireModelId = settings?.
|
|
130
|
+
const wireModelId = settings?.chat?.model ?? status.target.defaultModel ?? null;
|
|
131
131
|
const detectedReasoning =
|
|
132
132
|
wireModelId && typeof providers.getDetectedReasoning === "function"
|
|
133
133
|
? providers.getDetectedReasoning(status.target.id, wireModelId)
|
|
@@ -216,7 +216,7 @@ function handoffFacts(cwd: string): { handoffCount: number; handoffFreshness: st
|
|
|
216
216
|
}
|
|
217
217
|
}
|
|
218
218
|
|
|
219
|
-
|
|
219
|
+
function readWelcomeRepositoryFacts(cwd: string): WelcomeRepositoryFacts {
|
|
220
220
|
const codewiki = readCodewiki(cwd);
|
|
221
221
|
const wiki = codewiki ? wikiFactsFrom(cwd, wikiStaleness(cwd)) : { wikiPageCount: 0, wikiStatus: NO_WIKI_STATUS };
|
|
222
222
|
return {
|
|
@@ -255,7 +255,7 @@ async function readWelcomeRepositoryFactsAsync(cwd: string): Promise<WelcomeRepo
|
|
|
255
255
|
* guessed, because it decides whether the Wiki row exists at all and the whole
|
|
256
256
|
* point of a placeholder is that the banner never changes height.
|
|
257
257
|
*/
|
|
258
|
-
|
|
258
|
+
function placeholderRepositoryFacts(cwd: string): WelcomeRepositoryFacts {
|
|
259
259
|
return {
|
|
260
260
|
clioMdStatus: clioMdStatusFor(cwd),
|
|
261
261
|
hasCodewiki: existsSync(join(cwd, ".clio-coder", "codewiki.json")),
|
|
@@ -269,13 +269,13 @@ export function placeholderRepositoryFacts(cwd: string): WelcomeRepositoryFacts
|
|
|
269
269
|
};
|
|
270
270
|
}
|
|
271
271
|
|
|
272
|
-
|
|
272
|
+
function deriveWelcomeDashboardStats(deps: WelcomeDashboardDeps): WelcomeDashboardStats {
|
|
273
273
|
const settings = deps.getSettings?.();
|
|
274
274
|
const statuses = deps.providers.list();
|
|
275
275
|
const current = findCurrentStatus(statuses, settings);
|
|
276
276
|
// Left null when unset; formatTargetLabel owns the one spelling for that.
|
|
277
|
-
const targetLabel = current?.target.id ?? settings?.
|
|
278
|
-
const modelLabel = settings?.
|
|
277
|
+
const targetLabel = current?.target.id ?? settings?.chat?.target ?? null;
|
|
278
|
+
const modelLabel = settings?.chat?.model ?? current?.target.defaultModel ?? null;
|
|
279
279
|
const workspace = deps.getWorkspaceSnapshot?.() ?? null;
|
|
280
280
|
const cwd = workspace?.cwd ?? process.cwd();
|
|
281
281
|
const currentAvailable = current ? activeStatus(current) : false;
|
|
@@ -283,16 +283,16 @@ export function deriveWelcomeDashboardStats(deps: WelcomeDashboardDeps): Welcome
|
|
|
283
283
|
const thinkingLevel =
|
|
284
284
|
resolveModelRuntimeCapabilitiesForProviders(
|
|
285
285
|
deps.providers,
|
|
286
|
-
settings?.
|
|
287
|
-
settings?.
|
|
288
|
-
settings?.
|
|
286
|
+
settings?.chat?.target,
|
|
287
|
+
settings?.chat?.model,
|
|
288
|
+
settings?.chat?.thinkingLevel ?? "off",
|
|
289
289
|
)?.thinking.display ??
|
|
290
|
-
settings?.
|
|
290
|
+
settings?.chat?.thinkingLevel ??
|
|
291
291
|
"off";
|
|
292
292
|
|
|
293
|
-
const autonomy = settings?.autonomy ?? "auto-edit";
|
|
294
|
-
const toolProfile = settings?.
|
|
295
|
-
const threshold = settings?.compaction?.threshold;
|
|
293
|
+
const autonomy = settings?.safety.autonomy ?? "auto-edit";
|
|
294
|
+
const toolProfile = settings?.integrations.externalAgents?.defaults?.toolGovernance ?? "clio-coder-policy";
|
|
295
|
+
const threshold = settings?.context.compaction?.threshold;
|
|
296
296
|
const compactionThreshold =
|
|
297
297
|
typeof threshold === "number" && Number.isFinite(threshold) ? `${Math.round(threshold * 100)}%` : "80%";
|
|
298
298
|
|
|
@@ -376,7 +376,7 @@ function nextValue(stats: WelcomeDashboardStats): string {
|
|
|
376
376
|
* route answers, and what the context is ready for. Maturity caveats belong
|
|
377
377
|
* in the README, not in a line the operator reads on every turn.
|
|
378
378
|
*/
|
|
379
|
-
|
|
379
|
+
function buildWelcomeDashboardLines(
|
|
380
380
|
stats: WelcomeDashboardStats,
|
|
381
381
|
width: number,
|
|
382
382
|
mode: WelcomeDashboardMode = "launchpad",
|
|
@@ -164,9 +164,9 @@ function isThinkingEvent(event: Record<string, unknown>): boolean {
|
|
|
164
164
|
return assistantEvent?.type === "thinking_delta";
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
-
/** The action a `
|
|
167
|
+
/** The action a `clio_coder_tool_start`/`clio_coder_tool_finish` event names, or null when it is neither. */
|
|
168
168
|
function toolEventAction(event: Record<string, unknown>): WorkerAction | null {
|
|
169
|
-
if (event.type !== "
|
|
169
|
+
if (event.type !== "clio_coder_tool_start" && event.type !== "clio_coder_tool_finish") return null;
|
|
170
170
|
const payload = isRecord(event.payload) ? event.payload : null;
|
|
171
171
|
const tool = nonEmptyString(payload?.tool);
|
|
172
172
|
if (tool === undefined) return null;
|
|
@@ -363,7 +363,7 @@ export function createWorkerProgressFold(): WorkerProgressFold {
|
|
|
363
363
|
}
|
|
364
364
|
|
|
365
365
|
const action = toolEventAction(event);
|
|
366
|
-
if (action !== null && event.type === "
|
|
366
|
+
if (action !== null && event.type === "clio_coder_tool_start") {
|
|
367
367
|
if (action.toolCallId !== undefined) {
|
|
368
368
|
const duplicate = pendingActionsById.get(action.toolCallId);
|
|
369
369
|
if (duplicate !== undefined) removePendingAction(duplicate);
|
|
@@ -375,7 +375,7 @@ export function createWorkerProgressFold(): WorkerProgressFold {
|
|
|
375
375
|
touch();
|
|
376
376
|
setPhase("tool");
|
|
377
377
|
changed = true;
|
|
378
|
-
} else if (action !== null && event.type === "
|
|
378
|
+
} else if (action !== null && event.type === "clio_coder_tool_finish") {
|
|
379
379
|
// An id is authoritative when both sides carry it. If either side came
|
|
380
380
|
// from an older or incomplete producer, retain the historical name match.
|
|
381
381
|
const finished =
|
|
@@ -77,7 +77,7 @@ function contractKindFrom(receipt: Record<string, unknown>): WorkerPresentedResu
|
|
|
77
77
|
* by older versions of Clio are still valid history, so every field is read
|
|
78
78
|
* structurally and a missing one degrades the footer rather than the render.
|
|
79
79
|
*/
|
|
80
|
-
|
|
80
|
+
function workerReceiptFacts(receipt: Record<string, unknown>): WorkerReceiptFacts | null {
|
|
81
81
|
const outcome = optionalString(receipt.outcome);
|
|
82
82
|
if (outcome === undefined) return null;
|
|
83
83
|
const output = isRecord(receipt.output) ? receipt.output : null;
|
|
@@ -185,10 +185,7 @@ function finiteNumber(value: unknown): number | undefined {
|
|
|
185
185
|
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
-
|
|
189
|
-
runtimeKind: RunKind | undefined,
|
|
190
|
-
runtimeId: string | undefined,
|
|
191
|
-
): WorkerRunRuntimeKind {
|
|
188
|
+
function workerRuntimeKind(runtimeKind: RunKind | undefined, runtimeId: string | undefined): WorkerRunRuntimeKind {
|
|
192
189
|
if (runtimeKind === "acp-delegation") return "acp";
|
|
193
190
|
if (runtimeId === "claude-code") return "claude-code";
|
|
194
191
|
if (runtimeId === "claude-sdk") return "claude-sdk";
|
|
@@ -25,6 +25,8 @@ export interface YaziBridgeSettings {
|
|
|
25
25
|
mode: YaziSessionMode;
|
|
26
26
|
profile: YaziProfileMode;
|
|
27
27
|
followCwd: boolean;
|
|
28
|
+
/** Files-dock share of the height; absent leaves the dock spec's default. */
|
|
29
|
+
ratio?: number;
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
export interface YaziMentionBatch {
|
|
@@ -111,7 +113,7 @@ function readOptional(path: string): string {
|
|
|
111
113
|
* before the TUI lease is released. A missing or below-floor binary therefore
|
|
112
114
|
* leaves the screen intact and returns the shared doctor sentence verbatim.
|
|
113
115
|
*/
|
|
114
|
-
|
|
116
|
+
async function runYaziTerminalChooser(options: YaziTerminalChooserOptions): Promise<YaziTerminalChooserResult> {
|
|
115
117
|
const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
|
|
116
118
|
if (!binaries.yaziPath) {
|
|
117
119
|
return { status: "missing-binary", binary: "yazi", detail: binaries.missingYaziDetail };
|
|
@@ -217,7 +219,7 @@ function pathKind(path: string): "file" | "directory" | "other" {
|
|
|
217
219
|
}
|
|
218
220
|
|
|
219
221
|
/** Format one DDS or chooser batch for the composer without ever submitting it. */
|
|
220
|
-
|
|
222
|
+
function formatYaziMentions(
|
|
221
223
|
paths: ReadonlyArray<string>,
|
|
222
224
|
options: {
|
|
223
225
|
cwd: string;
|
|
@@ -328,7 +330,11 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
328
330
|
}
|
|
329
331
|
};
|
|
330
332
|
|
|
331
|
-
const start = async (
|
|
333
|
+
const start = async (
|
|
334
|
+
mode: YaziSessionMode,
|
|
335
|
+
profileMode: YaziProfileMode,
|
|
336
|
+
dockShare?: number,
|
|
337
|
+
): Promise<YaziBridgeOpenResult> => {
|
|
332
338
|
const mux = deps.mux;
|
|
333
339
|
if (!mux?.available()) return { status: "unavailable", reason: "the pane layer is not available" };
|
|
334
340
|
generation += 1;
|
|
@@ -341,6 +347,7 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
341
347
|
mode,
|
|
342
348
|
profileMode,
|
|
343
349
|
cwd: deps.getCwd(),
|
|
350
|
+
...(dockShare === undefined ? {} : { dockShare }),
|
|
344
351
|
pickToken: token,
|
|
345
352
|
onEvent: (event: YaziEvent) => {
|
|
346
353
|
if (disposed || ownGeneration !== generation) return;
|
|
@@ -379,7 +386,7 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
379
386
|
active = null;
|
|
380
387
|
deps.notice("warning", "the file-pane event stream did not start; reopening yazi in chooser mode");
|
|
381
388
|
void stale.close().finally(() => {
|
|
382
|
-
if (!disposed && ownGeneration === generation) void start("chooser", profileMode);
|
|
389
|
+
if (!disposed && ownGeneration === generation) void start("chooser", profileMode, dockShare);
|
|
383
390
|
});
|
|
384
391
|
}, deps.livenessMs ?? YAZI_LIVENESS_MS);
|
|
385
392
|
livenessTimer.unref();
|
|
@@ -419,7 +426,7 @@ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
|
|
|
419
426
|
}
|
|
420
427
|
return result;
|
|
421
428
|
}
|
|
422
|
-
return await start(mode, settings.profile);
|
|
429
|
+
return await start(mode, settings.profile, settings.ratio);
|
|
423
430
|
},
|
|
424
431
|
status(): Readonly<YaziBridgeStatus> {
|
|
425
432
|
const snapshot = active?.snapshot();
|
package/src/tools/ask-user.ts
CHANGED
|
@@ -261,7 +261,7 @@ function normalizeDecisions(value: unknown): { decisions?: AskUserDecision[]; er
|
|
|
261
261
|
return { decisions };
|
|
262
262
|
}
|
|
263
263
|
|
|
264
|
-
|
|
264
|
+
function normalizeAskUserCall(args: Record<string, unknown>): { call?: AskUserCall; error?: string } {
|
|
265
265
|
const rawAction = trimOptionalString(args.action)?.toLowerCase() ?? "ask";
|
|
266
266
|
if (rawAction !== "ask" && rawAction !== "complete") {
|
|
267
267
|
return { error: "action must be ask or complete" };
|
|
@@ -499,7 +499,7 @@ async function persistAskUserTranscript(
|
|
|
499
499
|
await mkdir(dir, { recursive: true });
|
|
500
500
|
if (!policy.transcriptPath) policy.transcriptPath = path.join(dir, transcriptFileName(policy));
|
|
501
501
|
const transcript = {
|
|
502
|
-
schema: "clio.ask_user.interview.v1",
|
|
502
|
+
schema: "clio-coder.ask_user.interview.v1",
|
|
503
503
|
id: policy.id,
|
|
504
504
|
status: policy.status,
|
|
505
505
|
startedAt: policy.startedAt,
|
|
@@ -595,7 +595,7 @@ async function completeInterview(
|
|
|
595
595
|
return okInterviewResult(policy, event);
|
|
596
596
|
}
|
|
597
597
|
|
|
598
|
-
|
|
598
|
+
async function finalizeAskUserInterview(
|
|
599
599
|
policy: AskUserToolPolicy,
|
|
600
600
|
reason: string,
|
|
601
601
|
options?: ToolInvokeOptions,
|
package/src/tools/bash.ts
CHANGED
|
@@ -48,7 +48,7 @@ export const BASH_DEFAULT_RESULT_DISPOSITION: ToolResultDisposition = {
|
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
/** Pure, idempotent normalization used by registry admission and direct calls. */
|
|
51
|
-
|
|
51
|
+
function normalizeBashArguments(args: Record<string, unknown>): Record<string, unknown> {
|
|
52
52
|
return args.output_policy === undefined ? { ...args, output_policy: "bounded" } : args;
|
|
53
53
|
}
|
|
54
54
|
|
|
@@ -95,7 +95,7 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
|
|
|
95
95
|
),
|
|
96
96
|
costLatency: "local_fast",
|
|
97
97
|
promptHint:
|
|
98
|
-
'Call context with scope="skills" to list installed and marketplace skills; when one matches the task, or the operator names a skill or asks how one works, suggest the operator run /skill <name> (a marketplace skill is offered for install) and never load it uninvited. When the user message carries a skill request, first load that skill via context (scope="skills", name=<skill>) before doing anything else. When an [evicted ...] marker names content you need, recall it with context(scope="recall", ref=...); re-read the file only when the marker says it changed.',
|
|
98
|
+
'Call context with scope="skills" to list installed and marketplace skills; when one matches the task, or the operator names a skill or asks how one works, suggest the operator run /skill <name> (a marketplace skill is offered for install) and never load it uninvited; a [Marketplace] reminder naming an uninstalled skill may instead be offered through ask_user with its exact options, and the harness performs any install. When the user message carries a skill request, first load that skill via context (scope="skills", name=<skill>) before doing anything else. When an [evicted ...] marker names content you need, recall it with context(scope="recall", ref=...); re-read the file only when the marker says it changed.',
|
|
99
99
|
},
|
|
100
100
|
[ToolNames.CredentialPresent]: {
|
|
101
101
|
objective: "Check whether a credential key is present without returning its value.",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Scratch git worktrees for the compete dispatch topology.
|
|
3
3
|
*
|
|
4
4
|
* Each candidate builds in its own worktree on its own branch
|
|
5
|
-
* (`clio/compete/<group>/<n>`), created from the repository HEAD under
|
|
5
|
+
* (`clio-coder/compete/<group>/<n>`), created from the repository HEAD under
|
|
6
6
|
* `<root>/.clio-coder/worktrees/<group>/candidate-<n>`. The path sits inside the
|
|
7
7
|
* project root because remote fleet nodes share the filesystem and doctor
|
|
8
8
|
* preflight verifies path parity only for the project root; `.clio-coder/` is
|
|
@@ -127,8 +127,9 @@ export interface CompeteRunAdmission {
|
|
|
127
127
|
|
|
128
128
|
const COMPETE_PARENT_SEGMENTS = [".clio-coder", "worktrees"] as const;
|
|
129
129
|
const COMPETE_MANIFEST_FILE = ".clio-coder-compete-owner.json";
|
|
130
|
-
const COMPETE_MANIFEST_KIND = "clio-compete-group";
|
|
131
|
-
const
|
|
130
|
+
const COMPETE_MANIFEST_KIND = "clio-coder-compete-group";
|
|
131
|
+
const LEGACY_COMPETE_MANIFEST_KIND = "clio-compete-group";
|
|
132
|
+
const COMPETE_COMMIT_IDENTITY = "clio-coder-compete";
|
|
132
133
|
|
|
133
134
|
const SAFE_GROUP = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;
|
|
134
135
|
const PROCESS_EXIT_GRACE_MS = 750;
|
|
@@ -324,7 +325,7 @@ function isCanonicalDirectoryAt(path: string): boolean {
|
|
|
324
325
|
* `relative()` makes the decision by path segment, so `/group-a2` can never
|
|
325
326
|
* be mistaken for a child of `/group-a` as it can with textual startsWith.
|
|
326
327
|
*/
|
|
327
|
-
|
|
328
|
+
function isCanonicalPathInside(parent: string, candidate: string): boolean {
|
|
328
329
|
return isCanonicalWorktreePathInside(parent, candidate);
|
|
329
330
|
}
|
|
330
331
|
|
|
@@ -333,7 +334,7 @@ function manifestFromUnknown(value: unknown): CompeteGroupManifest | null {
|
|
|
333
334
|
const manifest = value as Record<string, unknown>;
|
|
334
335
|
if (
|
|
335
336
|
manifest.version !== 2 ||
|
|
336
|
-
manifest.kind !== COMPETE_MANIFEST_KIND ||
|
|
337
|
+
(manifest.kind !== COMPETE_MANIFEST_KIND && manifest.kind !== LEGACY_COMPETE_MANIFEST_KIND) ||
|
|
337
338
|
typeof manifest.root !== "string" ||
|
|
338
339
|
typeof manifest.group !== "string" ||
|
|
339
340
|
typeof manifest.token !== "string" ||
|
|
@@ -417,10 +418,14 @@ export function isGitRepository(root: string): boolean {
|
|
|
417
418
|
}
|
|
418
419
|
}
|
|
419
420
|
|
|
420
|
-
function competeBranch(group: string, index: number): string {
|
|
421
|
+
function competeBranch(group: string, index: number, legacy = false): string {
|
|
421
422
|
validateGroup(group);
|
|
422
423
|
if (!Number.isInteger(index) || index < 1) throw new Error(`invalid compete candidate index ${index}`);
|
|
423
|
-
return
|
|
424
|
+
return `${legacy ? "clio" : "clio-coder"}/compete/${group}/${index}`;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
function competeBranchMatches(branch: string, group: string, index: number): boolean {
|
|
428
|
+
return branch === competeBranch(group, index) || branch === competeBranch(group, index, true);
|
|
424
429
|
}
|
|
425
430
|
|
|
426
431
|
/** Claim the group before creating a branch or candidate worktree. */
|
|
@@ -549,11 +554,7 @@ export function markCompeteGroupWinnerPreserved(
|
|
|
549
554
|
* baseline is a parameter rather than HEAD so every candidate in a compete
|
|
550
555
|
* transaction starts from the same approved state.
|
|
551
556
|
*/
|
|
552
|
-
|
|
553
|
-
ownership: CompeteGroupOwnership,
|
|
554
|
-
index: number,
|
|
555
|
-
baseline: string,
|
|
556
|
-
): CandidateWorktree {
|
|
557
|
+
function createCandidateWorktree(ownership: CompeteGroupOwnership, index: number, baseline: string): CandidateWorktree {
|
|
557
558
|
assertOwnership(ownership);
|
|
558
559
|
const branch = competeBranch(ownership.group, index);
|
|
559
560
|
const path = join(ownership.directory, `candidate-${index}`);
|
|
@@ -589,7 +590,7 @@ export async function createCandidateWorktreeMapped(
|
|
|
589
590
|
branch,
|
|
590
591
|
base: baseline,
|
|
591
592
|
path,
|
|
592
|
-
label: `clio compete ${ownership.group} candidate ${index}`,
|
|
593
|
+
label: `clio-coder compete ${ownership.group} candidate ${index}`,
|
|
593
594
|
focus: false,
|
|
594
595
|
})
|
|
595
596
|
.catch(() => null);
|
|
@@ -652,7 +653,7 @@ function exactGroupBranches(root: string, group: string): string[] {
|
|
|
652
653
|
const parts = branch.split("/");
|
|
653
654
|
return (
|
|
654
655
|
parts.length === 4 &&
|
|
655
|
-
parts[0] === "clio" &&
|
|
656
|
+
(parts[0] === "clio-coder" || parts[0] === "clio") &&
|
|
656
657
|
parts[1] === "compete" &&
|
|
657
658
|
parts[2] === group &&
|
|
658
659
|
/^\d+$/.test(parts[3] ?? "")
|
|
@@ -660,6 +661,16 @@ function exactGroupBranches(root: string, group: string): string[] {
|
|
|
660
661
|
});
|
|
661
662
|
}
|
|
662
663
|
|
|
664
|
+
/** Resolve a current candidate branch while retaining indefinite read support for released refs. */
|
|
665
|
+
export function competeBranchForCandidate(root: string, group: string, index: number): string {
|
|
666
|
+
const branches = exactGroupBranches(root, group);
|
|
667
|
+
return (
|
|
668
|
+
branches.find((branch) => branch === competeBranch(group, index)) ??
|
|
669
|
+
branches.find((branch) => branch === competeBranch(group, index, true)) ??
|
|
670
|
+
competeBranch(group, index)
|
|
671
|
+
);
|
|
672
|
+
}
|
|
673
|
+
|
|
663
674
|
function removeRegisteredWorktree(root: string, path: string): void {
|
|
664
675
|
try {
|
|
665
676
|
git(root, ["worktree", "remove", "--force", path]);
|
|
@@ -676,10 +687,9 @@ function removeCandidateWorktree(
|
|
|
676
687
|
): void {
|
|
677
688
|
assertOwnership(ownership);
|
|
678
689
|
const expectedPath = join(ownership.directory, `candidate-${worktree.index}`);
|
|
679
|
-
const expectedBranch = competeBranch(ownership.group, worktree.index);
|
|
680
690
|
if (
|
|
681
691
|
resolve(worktree.path) !== resolve(expectedPath) ||
|
|
682
|
-
worktree.branch
|
|
692
|
+
!competeBranchMatches(worktree.branch, ownership.group, worktree.index) ||
|
|
683
693
|
!isCanonicalPathInside(ownership.directory, worktree.path)
|
|
684
694
|
) {
|
|
685
695
|
throw new Error(`candidate ${worktree.index} does not belong to compete group ${ownership.group}`);
|
|
@@ -819,8 +829,8 @@ export function settleRecoveredCompeteDecision(
|
|
|
819
829
|
cleanupWorktreeGroup(ownership);
|
|
820
830
|
return null;
|
|
821
831
|
}
|
|
822
|
-
const winnerBranch = competeBranch(group, winnerIndex);
|
|
823
832
|
const branches = exactGroupBranches(ownership.root, group);
|
|
833
|
+
const winnerBranch = competeBranchForCandidate(ownership.root, group, winnerIndex);
|
|
824
834
|
const winnerPath = join(ownership.directory, `candidate-${winnerIndex}`);
|
|
825
835
|
if (
|
|
826
836
|
!branches.includes(winnerBranch) ||
|