@iowarp/clio-coder 0.4.1 → 0.4.3
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 +127 -0
- package/CONTRIBUTING.md +142 -52
- package/README.md +434 -473
- package/SECURITY.md +2 -1
- package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
- package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
- package/dist/builtins-IA7V7FUC.js +22 -0
- package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
- package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
- package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
- package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
- package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
- package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
- package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
- package/dist/chunk-3EBYEESD.js +314 -0
- package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
- package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
- package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
- package/dist/chunk-4UVU7BJ5.js +39 -0
- package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
- package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
- package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
- package/dist/chunk-5MEZN6CB.js +1334 -0
- package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
- package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
- package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
- package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
- package/dist/chunk-7DRAWPTZ.js +360 -0
- package/dist/chunk-7E7I3WLS.js +3762 -0
- package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
- package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
- package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
- package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
- package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
- package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
- package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
- package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
- package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
- package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
- package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
- package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
- package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
- package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
- package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
- package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
- package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
- package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
- package/dist/chunk-GYV6VZOC.js +26 -0
- package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
- package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
- package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
- package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
- package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
- package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
- package/dist/chunk-IJNZMHLA.js +101 -0
- package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
- package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
- package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
- package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
- package/dist/chunk-JEQ3XTHC.js +42 -0
- package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
- package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
- package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
- package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
- package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
- package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
- package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
- package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
- package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
- package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
- package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
- package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
- package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
- package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
- package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
- package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
- package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
- package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
- package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
- package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
- package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
- package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
- package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
- package/dist/chunk-R6Q67RJH.js +134 -0
- package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
- package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
- package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
- package/dist/chunk-SKHCAU7K.js +385 -0
- package/dist/chunk-SZAA6XDG.js +30 -0
- package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
- package/dist/chunk-UOIZ7DA4.js +41 -0
- package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
- package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
- package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
- package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
- package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
- package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
- package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
- package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
- package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
- package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
- package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
- package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
- package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
- package/dist/chunk-XRZT5WY5.js +47 -0
- package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
- package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
- package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
- package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
- package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
- package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
- package/dist/cli/index.js +41 -39
- package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
- package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
- package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
- package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
- package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
- package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
- package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
- package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
- package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
- package/dist/context-map-COB37XXN.js +505 -0
- package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
- package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
- package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
- package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
- package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
- package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
- package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
- package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
- package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
- package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
- package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
- package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
- package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
- package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
- package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
- package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
- package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
- package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
- package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
- package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
- package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
- package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
- package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
- package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
- package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
- package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
- package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
- package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
- package/dist/reset-EAJFFJVB.js +344 -0
- package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
- package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
- package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
- package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
- package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
- package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
- package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
- package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
- package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
- package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
- package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
- package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
- package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
- package/dist/uninstall-5PEVOE5B.js +408 -0
- package/dist/upgrade-M4WXY6KN.js +303 -0
- package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
- package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
- package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
- package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
- package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
- package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
- package/dist/worker/entry.js +90 -74
- package/docs/README.md +176 -81
- package/docs/{acp.md → architecture/acp.md} +36 -20
- package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
- package/docs/{architecture.md → architecture/architecture.md} +43 -22
- package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
- package/docs/architecture/artifact-versions.md +90 -0
- package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
- package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
- package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
- package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
- package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
- package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
- package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
- package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
- package/docs/{observability.md → architecture/observability.md} +38 -14
- package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
- package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
- package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
- package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
- package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
- package/docs/architecture/time-conventions.md +125 -0
- package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
- package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
- package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
- package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
- package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
- package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
- package/docs/guide/configuration-reference.md +1163 -0
- package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
- package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
- package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
- package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
- package/docs/{glossary.md → guide/glossary.md} +14 -11
- package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
- package/docs/guide/panes-and-files.md +290 -0
- package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
- package/docs/{resource-library.md → guide/resource-library.md} +13 -4
- package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
- package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
- package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
- package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
- package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
- package/docs/process/development-pipeline.md +152 -0
- package/docs/process/documentation-coverage.md +100 -0
- package/docs/process/documentation-guide.md +187 -0
- package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
- package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
- package/docs/{evolution.md → process/evolution.md} +2 -2
- package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
- package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
- package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
- package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
- package/evals/README.md +2 -2
- package/evals/behavioral-model.yaml +3 -2
- package/package.json +10 -8
- package/skills/README.md +52 -41
- package/skills/coding/ast-grep/SKILL.md +102 -31
- package/skills/coding/ast-grep/evals.md +26 -0
- package/skills/coding/coding-standards/SKILL.md +41 -6
- package/skills/coding/coding-standards/evals.md +23 -0
- package/skills/coding/prototype/SKILL.md +88 -29
- package/skills/coding/prototype/evals.md +19 -0
- package/skills/coding/tdd/SKILL.md +81 -54
- package/skills/coding/tdd/evals.md +20 -0
- package/skills/context/context-handoff/SKILL.md +44 -3
- package/skills/context/context-handoff/evals.md +44 -0
- package/skills/context/context-prime/SKILL.md +46 -16
- package/skills/context/context-prime/evals.md +45 -0
- package/skills/git/branch-closeout/SKILL.md +132 -0
- package/skills/git/branch-closeout/evals.md +133 -0
- package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
- package/skills/git/file-ticket/SKILL.md +78 -64
- package/skills/git/file-ticket/assets/issue-template.md +22 -0
- package/skills/git/file-ticket/evals.md +31 -26
- package/skills/git/file-ticket/references/issue-discovery.md +49 -0
- package/skills/git/fix-issue/SKILL.md +88 -65
- package/skills/git/fix-issue/evals.md +35 -31
- package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
- package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
- package/skills/git/resolve-merge-conflicts/evals.md +52 -25
- package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
- package/skills/git/ship/SKILL.md +103 -67
- package/skills/git/ship/assets/pr-template.md +21 -0
- package/skills/git/ship/evals.md +44 -28
- package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
- package/skills/git/worktree-create/SKILL.md +80 -50
- package/skills/git/worktree-create/evals.md +40 -33
- package/skills/git/worktree-create/references/worktree-setup.md +62 -66
- package/skills/git/worktree-merge/SKILL.md +112 -65
- package/skills/git/worktree-merge/evals.md +42 -34
- package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
- package/skills/meta/clio-coder-dev/SKILL.md +9 -5
- package/skills/meta/clio-coder-dev/evals.md +3 -2
- package/skills/meta/clio-coder-test/SKILL.md +102 -95
- package/skills/meta/clio-coder-test/evals.md +9 -4
- package/skills/meta/clio-coder-test/references/harness.md +100 -124
- package/skills/meta/clio-coder-test/references/test-map.md +77 -50
- package/skills/meta/credentials/SKILL.md +2 -2
- package/skills/meta/find-skills/SKILL.md +2 -2
- package/skills/meta/herdr/SKILL.md +2 -2
- package/skills/meta/skill-craft/SKILL.md +22 -16
- package/skills/planning/archify/SKILL.md +196 -0
- package/skills/planning/archify/evals.md +65 -0
- package/skills/planning/architecture/SKILL.md +62 -13
- package/skills/planning/architecture/evals.md +65 -0
- package/skills/planning/backlog/SKILL.md +131 -15
- package/skills/planning/backlog/evals.md +142 -0
- package/skills/planning/prd/SKILL.md +47 -7
- package/skills/planning/prd/evals.md +54 -0
- package/skills/planning/product-intent/SKILL.md +58 -3
- package/skills/planning/product-intent/evals.md +70 -0
- package/skills/planning/tech-spec/SKILL.md +54 -3
- package/skills/planning/tech-spec/evals.md +73 -0
- package/skills/registry.yaml +70 -62
- package/skills/remote.yaml +13 -0
- package/skills/research/arxiv-literature/SKILL.md +77 -19
- package/skills/research/arxiv-literature/evals.md +50 -0
- package/skills/research/experiment-protocol/SKILL.md +21 -2
- package/skills/research/experiment-protocol/evals.md +23 -0
- package/skills/research/scientific-debugging/SKILL.md +24 -2
- package/skills/research/scientific-debugging/evals.md +18 -0
- package/skills/research/scientific-modernization/SKILL.md +27 -2
- package/skills/research/scientific-modernization/evals.md +27 -0
- package/skills/skill-marketplace.json +97 -62
- package/skills/workflow/cut-it/SKILL.md +66 -6
- package/skills/workflow/cut-it/evals.md +101 -0
- package/skills/workflow/design-council/SKILL.md +118 -28
- package/skills/workflow/design-council/evals.md +161 -0
- package/skills/workflow/grill-me/SKILL.md +87 -11
- package/skills/workflow/grill-me/evals.md +153 -0
- package/skills/workflow/workflow-distiller/SKILL.md +77 -18
- package/skills/workflow/workflow-distiller/evals.md +118 -0
- package/src/cli/args.ts +2 -2
- package/src/cli/bootstrap-generate.ts +1 -1
- package/src/cli/config-inspect.ts +65 -12
- package/src/cli/configure-interop.ts +105 -13
- package/src/cli/configure-oauth.ts +57 -0
- package/src/cli/configure-onboarding.ts +980 -0
- package/src/cli/configure-target.ts +594 -0
- package/src/cli/configure.ts +1082 -532
- package/src/cli/context-map.ts +114 -0
- package/src/cli/context.ts +4 -0
- package/src/cli/docs.ts +22 -14
- package/src/cli/doctor-naming.ts +5 -5
- package/src/cli/doctor-toolchain.ts +3 -3
- package/src/cli/eval.ts +1 -2
- package/src/cli/extensions.ts +2 -1
- package/src/cli/fleet.ts +1 -1
- package/src/cli/index.ts +3 -1
- package/src/cli/internal-dispatch.ts +3 -4
- package/src/cli/lifecycle-presenter.ts +436 -0
- package/src/cli/models.ts +10 -2
- package/src/cli/modes/print.ts +5 -1
- package/src/cli/panes.ts +19 -5
- package/src/cli/reset.ts +228 -106
- package/src/cli/run.ts +9 -4
- package/src/cli/select.ts +664 -0
- package/src/cli/share.ts +5 -1
- package/src/cli/skills-eval.ts +3 -3
- package/src/cli/skills.ts +9 -2
- package/src/cli/targets.ts +5 -6
- package/src/cli/trace.ts +55 -4
- package/src/cli/uninstall.ts +233 -165
- package/src/cli/upgrade.ts +204 -149
- package/src/cli/usage.ts +86 -27
- package/src/cli/validate-model.ts +3 -3
- package/src/cli/wiki-generate.ts +1 -1
- package/src/core/artifact-paths.ts +1 -1
- package/src/core/bash-exec.ts +131 -86
- package/src/core/bus-events.ts +51 -6
- package/src/core/config.ts +61 -1
- package/src/core/defaults.ts +7 -4
- package/src/core/dispatch-outcome.ts +16 -0
- package/src/core/external-diagnostic.ts +44 -0
- package/src/core/gateway-routing.ts +157 -0
- package/src/core/guardrails.ts +10 -49
- package/src/core/prompt-hint.ts +9 -0
- package/src/core/safe-exec.ts +17 -2
- package/src/core/skill-activation.ts +89 -2
- package/src/domains/agents/builtins/architect.md +2 -3
- package/src/domains/agents/builtins/coder.md +3 -2
- package/src/domains/agents/builtins/debugger.md +2 -2
- package/src/domains/agents/builtins/documenter.md +2 -2
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/oracle.md +1 -1
- package/src/domains/agents/builtins/provenance.md +1 -1
- package/src/domains/agents/builtins/researcher.md +1 -1
- package/src/domains/agents/builtins/scout.md +1 -1
- package/src/domains/agents/builtins/tester.md +2 -2
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +1 -1
- package/src/domains/agents/builtins/world-knowledge.md +31 -0
- package/src/domains/agents/catalog.ts +13 -15
- package/src/domains/agents/contract.ts +2 -0
- package/src/domains/agents/extension.ts +23 -1
- package/src/domains/agents/result-contract.ts +70 -0
- package/src/domains/config/keybindings.ts +8 -0
- package/src/domains/context/extension.ts +0 -3
- package/src/domains/context/wiki/map-seed.ts +589 -0
- package/src/domains/context/wiki/plan.ts +2 -2
- package/src/domains/context/working-set/path-index.ts +1 -0
- package/src/domains/dispatch/admission.ts +29 -0
- package/src/domains/dispatch/agent-candidates.ts +10 -0
- package/src/domains/dispatch/budget-envelope.ts +86 -1
- package/src/domains/dispatch/capability-match.ts +11 -0
- package/src/domains/dispatch/capacity-lease.ts +17 -0
- package/src/domains/dispatch/contract.ts +11 -1
- package/src/domains/dispatch/extension.ts +237 -49
- package/src/domains/dispatch/host-verification.ts +435 -39
- package/src/domains/dispatch/intent-requirements.ts +10 -0
- package/src/domains/dispatch/intent.ts +18 -1
- package/src/domains/dispatch/path-scope.ts +235 -24
- package/src/domains/dispatch/run-event-journal.ts +4 -15
- package/src/domains/dispatch/state.ts +2 -3
- package/src/domains/dispatch/transport.ts +45 -21
- package/src/domains/dispatch/types.ts +58 -3
- package/src/domains/dispatch/worker-model-metadata.ts +38 -0
- package/src/domains/eval/artifacts/store.ts +5 -0
- package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
- package/src/domains/eval/metrics/token-stream.ts +201 -31
- package/src/domains/eval/metrics/tracked.ts +40 -4
- package/src/domains/eval/runners/clio-run.ts +5 -2
- package/src/domains/eval/schema/suite.ts +28 -0
- package/src/domains/eval/schema/verdict.ts +2 -2
- package/src/domains/eval/store.ts +8 -1
- package/src/domains/eval/suites/resolve.ts +13 -1
- package/src/domains/eval/suites/run.ts +24 -3
- package/src/domains/evidence/trust-status.ts +10 -1
- package/src/domains/extensions/contract.ts +15 -1
- package/src/domains/extensions/discovery.ts +238 -41
- package/src/domains/extensions/extension.ts +105 -6
- package/src/domains/extensions/index.ts +24 -0
- package/src/domains/extensions/integrity.ts +189 -0
- package/src/domains/extensions/manager.ts +17 -1
- package/src/domains/extensions/resource-path.ts +27 -0
- package/src/domains/extensions/resources.ts +18 -38
- package/src/domains/extensions/snapshot-store.ts +39 -0
- package/src/domains/extensions/snapshot.ts +180 -0
- package/src/domains/extensions/state.ts +385 -57
- package/src/domains/extensions/types.ts +118 -1
- package/src/domains/interop/registry.ts +6 -2
- package/src/domains/interop/types.ts +4 -0
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
- package/src/domains/lifecycle/migrations/index.ts +6 -0
- package/src/domains/lifecycle/naming-resources.ts +19 -4
- package/src/domains/lifecycle/naming-yazi.ts +10 -5
- package/src/domains/memory/task-memory-policy.ts +70 -26
- package/src/domains/memory/task-memory-telemetry.ts +1 -0
- package/src/domains/middleware/contract.ts +26 -0
- package/src/domains/middleware/extension.ts +24 -24
- package/src/domains/middleware/hook-receipts.ts +27 -4
- package/src/domains/middleware/hooks-io.ts +65 -32
- package/src/domains/middleware/hooks.ts +64 -0
- package/src/domains/middleware/index.ts +28 -5
- package/src/domains/middleware/marketplace-offer.ts +3 -35
- package/src/domains/middleware/memory-intervention.ts +127 -32
- package/src/domains/middleware/memory-step-endpoint.ts +3 -2
- package/src/domains/middleware/registrations.ts +326 -0
- package/src/domains/middleware/runtime.ts +28 -0
- package/src/domains/middleware/skills-reminder.ts +31 -2
- package/src/domains/middleware/snapshot.ts +20 -7
- package/src/domains/mux/contract.ts +38 -0
- package/src/domains/mux/detect.ts +6 -13
- package/src/domains/mux/index.ts +1 -1
- package/src/domains/mux/operations.ts +44 -5
- package/src/domains/mux/yazi/assets/yazi.toml +2 -2
- package/src/domains/mux/yazi/session.ts +53 -4
- package/src/domains/mux/yazi/theme.ts +117 -17
- package/src/domains/observability/compaction-usage.ts +118 -0
- package/src/domains/observability/contract.ts +10 -11
- package/src/domains/observability/cost.ts +1 -1
- package/src/domains/observability/extension.ts +17 -4
- package/src/domains/observability/out-of-turn-usage.ts +52 -21
- package/src/domains/observability/projection.ts +14 -90
- package/src/domains/observability/trace-store.ts +43 -7
- package/src/domains/prompts/compiler.ts +73 -53
- package/src/domains/prompts/contract.ts +15 -3
- package/src/domains/prompts/extension.ts +97 -9
- package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
- package/src/domains/prompts/fragments/identity/clio.md +6 -12
- package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
- package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
- package/src/domains/prompts/fragments/operating/contract.md +7 -15
- package/src/domains/prompts/fragments/operating/delegation.md +32 -34
- package/src/domains/prompts/fragments/operating/skills.md +10 -24
- package/src/domains/prompts/fragments/operating/worker.md +1 -8
- package/src/domains/providers/contract.ts +4 -1
- package/src/domains/providers/extension.ts +40 -9
- package/src/domains/providers/index.ts +1 -1
- package/src/domains/providers/model-capabilities.ts +9 -0
- package/src/domains/providers/model-discovery.ts +2 -0
- package/src/domains/providers/model-runtime-capabilities.ts +99 -25
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
- package/src/domains/providers/runtime-resolution.ts +31 -0
- package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
- package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
- package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
- package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
- package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
- package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
- package/src/domains/providers/support.ts +11 -5
- package/src/domains/providers/target-model-cache.ts +25 -2
- package/src/domains/providers/types/capability-flags.ts +2 -0
- package/src/domains/providers/types/cost-provenance.ts +19 -0
- package/src/domains/providers/types/local-model-quirks.ts +85 -37
- package/src/domains/providers/types/runtime-descriptor.ts +20 -1
- package/src/domains/providers/types/target-descriptor.ts +19 -0
- package/src/domains/resources/index.ts +3 -0
- package/src/domains/resources/skills/install.ts +72 -7
- package/src/domains/resources/skills/loader.ts +23 -19
- package/src/domains/resources/skills/marketplace.ts +63 -11
- package/src/domains/safety/autonomy.ts +15 -0
- package/src/domains/safety/call-target.ts +1 -1
- package/src/domains/safety/index.ts +1 -0
- package/src/domains/safety/loop-detector.ts +7 -4
- package/src/domains/safety/path-policy.ts +1 -1
- package/src/domains/safety/policy-engine.ts +34 -11
- package/src/domains/safety/protected-artifacts.ts +191 -88
- package/src/domains/safety/run-effects.ts +2 -22
- package/src/domains/safety/skill-authority.ts +55 -0
- package/src/domains/session/compaction/compact.ts +72 -22
- package/src/domains/session/entries.ts +6 -0
- package/src/domains/session/task-board.ts +10 -9
- package/src/domains/session/usage.ts +3 -3
- package/src/domains/share/archive.ts +164 -7
- package/src/engine/acp/server.ts +62 -9
- package/src/engine/agent.ts +13 -3
- package/src/engine/ai.ts +26 -8
- package/src/engine/antigravity/subprocess-runtime.ts +386 -120
- package/src/engine/api-registry.ts +3 -0
- package/src/engine/apis/llamacpp-residency.ts +3 -4
- package/src/engine/apis/lmstudio.ts +3 -3
- package/src/engine/apis/ollama-native.ts +6 -6
- package/src/engine/apis/openai-completions.ts +145 -39
- package/src/engine/apis/output-budget.ts +8 -18
- package/src/engine/apis/residency.ts +8 -27
- package/src/engine/external-subprocess.ts +114 -6
- package/src/engine/gemma-channel-filter.ts +19 -0
- package/src/engine/loop-guard.ts +92 -12
- package/src/engine/worker-runtime.ts +40 -11
- package/src/engine/worker-tools.ts +3 -1
- package/src/entry/background-model-metadata.ts +18 -0
- package/src/entry/compaction-prompt.ts +57 -0
- package/src/entry/extension-hook-sources.ts +28 -0
- package/src/entry/extension-reload.ts +309 -0
- package/src/entry/orchestrator.ts +464 -251
- package/src/entry/task-memory-lifecycle.ts +35 -0
- package/src/interactive/application-controller.ts +2 -1
- package/src/interactive/bus-notices.ts +8 -1
- package/src/interactive/chat-loop-messages.ts +16 -17
- package/src/interactive/chat-loop.ts +75 -3
- package/src/interactive/chat-panel.ts +36 -13
- package/src/interactive/chat-renderer.ts +72 -7
- package/src/interactive/cost-overlay.ts +26 -2
- package/src/interactive/dispatch-board.ts +6 -11
- package/src/interactive/footer/widgets.ts +13 -0
- package/src/interactive/interactive-application.ts +39 -4
- package/src/interactive/interactive-input-runtime.ts +4 -0
- package/src/interactive/interactive-presentation.ts +2 -2
- package/src/interactive/interactive-slash-runtime.ts +4 -1
- package/src/interactive/overlays/extensions.ts +9 -1
- package/src/interactive/overlays/help-reference.ts +13 -0
- package/src/interactive/overlays/settings.ts +27 -16
- package/src/interactive/panes-runtime.ts +111 -35
- package/src/interactive/prompt-cache-identity.ts +88 -0
- package/src/interactive/renderers/worker-entry.ts +32 -0
- package/src/interactive/slash-commands.ts +153 -20
- package/src/interactive/stream-pacing-policy.ts +0 -23
- package/src/interactive/theme/labels.ts +19 -13
- package/src/interactive/turn-context.ts +39 -20
- package/src/interactive/turn-recovery.ts +8 -0
- package/src/interactive/turn-runtime.ts +27 -11
- package/src/interactive/turn-state.ts +7 -0
- package/src/interactive/worker-receipts.ts +1 -0
- package/src/interactive/worker-stream.ts +6 -1
- package/src/interactive/yazi-bridge.ts +60 -6
- package/src/tools/agent-tools.ts +30 -1
- package/src/tools/artifact.ts +2 -2
- package/src/tools/ask-user.ts +3 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +52 -22
- package/src/tools/codewiki/code-nav-surface.ts +6 -0
- package/src/tools/codewiki/code-nav.ts +99 -13
- package/src/tools/context/docs-engine.ts +20 -7
- package/src/tools/context/index.ts +59 -21
- package/src/tools/core-bootstrap.ts +28 -6
- package/src/tools/credential-present.ts +1 -2
- package/src/tools/dispatch-arguments.ts +6 -1
- package/src/tools/dispatch-event-text.ts +10 -0
- package/src/tools/dispatch-plan.ts +49 -4
- package/src/tools/dispatch-run-events.ts +1 -1
- package/src/tools/dispatch-runner.ts +12 -0
- package/src/tools/dispatch-schema.ts +338 -0
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +9 -254
- package/src/tools/ledger.ts +3 -5
- package/src/tools/monitor-surface.ts +5 -13
- package/src/tools/observation.ts +4 -5
- package/src/tools/panes-surface.ts +4 -11
- package/src/tools/panes.ts +4 -2
- package/src/tools/policy.ts +15 -2
- package/src/tools/read.ts +5 -6
- package/src/tools/registry.ts +41 -12
- package/src/tools/result-shaping.ts +18 -14
- package/src/tools/steer-surface.ts +1 -1
- package/src/tools/tasks.ts +1 -1
- package/src/tools/truncate.ts +6 -5
- package/src/tools/verify/surface.ts +6 -12
- package/src/tools/web-fetch-surface.ts +1 -3
- package/src/tools/worker-evidence.ts +3 -1
- package/src/worker/spec-contract.ts +4 -0
- package/dist/builtins-UJLMOVOV.js +0 -17
- package/dist/chunk-5QIAJV2D.js +0 -48
- package/dist/chunk-JZWT5J3Y.js +0 -814
- package/dist/chunk-K7VKOLQQ.js +0 -15
- package/dist/chunk-PMZCIOCJ.js +0 -25
- package/dist/chunk-SUW5DORT.js +0 -819
- package/dist/chunk-UOV2BYIW.js +0 -107
- package/dist/chunk-WR6U3OVP.js +0 -45
- package/dist/chunk-Y45G3AXC.js +0 -1558
- package/dist/reset-EOLM7GVE.js +0 -230
- package/dist/uninstall-N34PCTGJ.js +0 -331
- package/dist/upgrade-H7TOM7YL.js +0 -323
- package/docs/artifact-versions.md +0 -67
- package/docs/development-pipeline.md +0 -121
- package/docs/documentation-coverage.md +0 -46
- package/docs/documentation-guide.md +0 -167
- package/docs/time-conventions.md +0 -101
|
@@ -368,6 +368,13 @@ function contextComposition(context: ContextEngineFacts): {
|
|
|
368
368
|
};
|
|
369
369
|
}
|
|
370
370
|
|
|
371
|
+
/** The live window after the percent; null when unknown or the row is too narrow to carry it. */
|
|
372
|
+
export function compactContextWindowLabel(context: ContextEngineFacts, width: number): string | null {
|
|
373
|
+
if (width < 72) return null;
|
|
374
|
+
const window = finiteNonNegative(context.ledger?.contextWindow ?? context.contextWindow);
|
|
375
|
+
return window > 0 ? formatFooterTokens(window) : null;
|
|
376
|
+
}
|
|
377
|
+
|
|
371
378
|
export function compactSecondaryLine(
|
|
372
379
|
context: ContextEngineFacts,
|
|
373
380
|
agent: AgentWorkFacts,
|
|
@@ -403,6 +410,12 @@ export function compactSecondaryLine(
|
|
|
403
410
|
} else {
|
|
404
411
|
left = buildSegmentedContextBar(theme, barCells, context.contextWindow ?? 0, contextBreakdownForBar(context));
|
|
405
412
|
}
|
|
413
|
+
// A percentage alone does not say whether the window is 128k or 1M, so at
|
|
414
|
+
// widths that can afford it the live window follows the percent. It comes
|
|
415
|
+
// from the ledger when one is bound (the layer that answered the window is
|
|
416
|
+
// also the layer that produced the percent) and from the facts otherwise.
|
|
417
|
+
const windowLabel = compactContextWindowLabel(context, safeWidth);
|
|
418
|
+
if (windowLabel) left = `${left} ${theme.fg("dim", "of")} ${theme.fg("muted", windowLabel)}`;
|
|
406
419
|
const maxRightWidth = Math.max(0, safeWidth - visibleWidth(left) - 1);
|
|
407
420
|
const right = buildMetricStrip(
|
|
408
421
|
theme,
|
|
@@ -46,6 +46,7 @@ import type { createMuxBridge } from "./mux-bridge.js";
|
|
|
46
46
|
import { createOverlayLifecycle, type OverlayLifecycleController, type OverlayState } from "./overlay-lifecycle.js";
|
|
47
47
|
import { interopOverlaySurface } from "./overlays/interop.js";
|
|
48
48
|
import { paneWatchDecision } from "./pane-policy.js";
|
|
49
|
+
import { describePanesLeftBehind } from "./panes-runtime.js";
|
|
49
50
|
import { writeInputWedgeDump } from "./render-trace.js";
|
|
50
51
|
import { settleChatBeforeSessionSwitch } from "./session-switch-settlement.js";
|
|
51
52
|
import { createSessionTranscript } from "./session-transcript.js";
|
|
@@ -54,9 +55,10 @@ import type {
|
|
|
54
55
|
InitCommandOptions,
|
|
55
56
|
RunIo,
|
|
56
57
|
SettingsAreaId,
|
|
58
|
+
SlashCommandContext,
|
|
57
59
|
TaskMemorySeedCommandResult,
|
|
58
60
|
} from "./slash-commands.js";
|
|
59
|
-
import { processAutoPacingAllowed
|
|
61
|
+
import { processAutoPacingAllowed } from "./stream-pacing-policy.js";
|
|
60
62
|
import type { TerminalLease } from "./terminal-lease.js";
|
|
61
63
|
import type { createWatchPaneController } from "./watch-pane.js";
|
|
62
64
|
import { createWorkspaceFacts } from "./workspace-facts.js";
|
|
@@ -121,6 +123,8 @@ export interface InteractiveDeps {
|
|
|
121
123
|
initialNotices?: ReadonlyArray<string>;
|
|
122
124
|
resources?: ResourcesContract;
|
|
123
125
|
extensions?: ExtensionsContract;
|
|
126
|
+
/** `/resources extensions reload` seam; the composition root supplies the coordinator. */
|
|
127
|
+
reloadExtensions?: SlashCommandContext["reloadExtensions"];
|
|
124
128
|
interop?: InteropContract;
|
|
125
129
|
share?: ShareContract;
|
|
126
130
|
/**
|
|
@@ -311,6 +315,8 @@ export interface KeyBindingDeps {
|
|
|
311
315
|
requestShutdown: () => void;
|
|
312
316
|
toggleStatus: () => void;
|
|
313
317
|
toggleDispatchBoard: () => void;
|
|
318
|
+
/** `/files` as a key: open the files pane when closed, close it when open. */
|
|
319
|
+
toggleFilesPane: () => void;
|
|
314
320
|
openTasks: () => void;
|
|
315
321
|
openDecisions: () => void;
|
|
316
322
|
backgroundDispatch: () => void;
|
|
@@ -396,6 +402,9 @@ function dispatchInteractiveAction(id: ClioKeybinding, deps: KeyBindingDeps): bo
|
|
|
396
402
|
case "clio-coder.dispatchBoard.toggle":
|
|
397
403
|
deps.toggleDispatchBoard();
|
|
398
404
|
return true;
|
|
405
|
+
case "clio-coder.files.toggle":
|
|
406
|
+
deps.toggleFilesPane();
|
|
407
|
+
return true;
|
|
399
408
|
case "clio-coder.tasks.open":
|
|
400
409
|
deps.openTasks();
|
|
401
410
|
return true;
|
|
@@ -430,6 +439,7 @@ export function routeInteractiveKey(data: string, deps: KeyBindingDeps): boolean
|
|
|
430
439
|
"clio-coder.thinking.cycle",
|
|
431
440
|
"clio-coder.session.tree",
|
|
432
441
|
"clio-coder.dispatchBoard.toggle",
|
|
442
|
+
"clio-coder.files.toggle",
|
|
433
443
|
"clio-coder.tasks.open",
|
|
434
444
|
"clio-coder.decisions.open",
|
|
435
445
|
"clio-coder.dispatch.background",
|
|
@@ -448,7 +458,7 @@ export function routeInteractiveKey(data: string, deps: KeyBindingDeps): boolean
|
|
|
448
458
|
}
|
|
449
459
|
|
|
450
460
|
export async function createInteractiveApplication(deps: InteractiveDeps): Promise<number> {
|
|
451
|
-
const initialSmoothStreaming =
|
|
461
|
+
const initialSmoothStreaming = deps.getSettings?.().interface.smoothStreaming ?? "off";
|
|
452
462
|
const initialAutoPacingAllowed = processAutoPacingAllowed(false);
|
|
453
463
|
const lease = deps.terminalLease;
|
|
454
464
|
const shell =
|
|
@@ -606,7 +616,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
606
616
|
getDraft: () => editor.getText(),
|
|
607
617
|
setDraft: (text) => editor.setText(text),
|
|
608
618
|
requestRender: () => tui.requestRender(),
|
|
609
|
-
notice: (level, text) => notify(level, text, `
|
|
619
|
+
notice: (level, text) => notify(level, text, `files:${level}`),
|
|
610
620
|
getCwd: () => process.cwd(),
|
|
611
621
|
getSettings: () =>
|
|
612
622
|
deps.getSettings?.().interface.panes.files ?? {
|
|
@@ -672,7 +682,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
672
682
|
appendTranscriptNotice: (level, text) => appendNotice(level, text, busNoticeSink),
|
|
673
683
|
refreshSettingsOverlay: () => overlayLifecycle.refreshSettingsOverlay(),
|
|
674
684
|
onConfigHotReload: (settings) => {
|
|
675
|
-
const mode =
|
|
685
|
+
const mode = settings.interface.smoothStreaming;
|
|
676
686
|
const autoAllowed = processAutoPacingAllowed(shell.hasObservedBackpressure());
|
|
677
687
|
chatRenderer.setSmoothStreamingMode(mode);
|
|
678
688
|
shell.setStreamPacingActive(mode === "on" || (mode === "auto" && autoAllowed));
|
|
@@ -702,6 +712,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
702
712
|
settleVisibleFrame: (reason) => chatRenderer.flushAndCommit(reason),
|
|
703
713
|
...(deps.resources ? { resources: deps.resources } : {}),
|
|
704
714
|
...(deps.extensions ? { extensions: deps.extensions } : {}),
|
|
715
|
+
...(deps.reloadExtensions ? { reloadExtensions: deps.reloadExtensions } : {}),
|
|
705
716
|
...(interopSurface ? { interop: interopSurface } : {}),
|
|
706
717
|
...(deps.agents ? { agents: deps.agents } : {}),
|
|
707
718
|
...(deps.share ? { share: deps.share } : {}),
|
|
@@ -1056,6 +1067,25 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
1056
1067
|
if (deps.onCycleScopedModelBackward?.() === false) announceEmptyScopedSet();
|
|
1057
1068
|
},
|
|
1058
1069
|
backgroundActiveDispatch,
|
|
1070
|
+
toggleFilesPane: () => {
|
|
1071
|
+
const panes = deps.panes;
|
|
1072
|
+
if (!panes) {
|
|
1073
|
+
notify(
|
|
1074
|
+
"info",
|
|
1075
|
+
"the files pane is inactive: this session started without panes. Restart with `clio-coder --with-panes`, or set interface.panes.enabled=auto",
|
|
1076
|
+
"files:info",
|
|
1077
|
+
);
|
|
1078
|
+
return;
|
|
1079
|
+
}
|
|
1080
|
+
void panes.files("toggle").then((result) => {
|
|
1081
|
+
if (result.status === "opened") {
|
|
1082
|
+
if (result.paneId !== null)
|
|
1083
|
+
notify("success", `files pane ${result.existing ? "focused" : "opened"}`, "files:open");
|
|
1084
|
+
} else if (result.status === "closed") notify("info", "files pane closed", "files:close");
|
|
1085
|
+
else if (result.status === "missing-binary") notify("warning", result.detail, "files:missing");
|
|
1086
|
+
else notify("warning", result.reason, "files:refused");
|
|
1087
|
+
});
|
|
1088
|
+
},
|
|
1059
1089
|
},
|
|
1060
1090
|
overlay: overlayLifecycle,
|
|
1061
1091
|
refreshFooter: () => footer.refresh(),
|
|
@@ -1137,6 +1167,11 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
|
|
|
1137
1167
|
},
|
|
1138
1168
|
cancelParkedCalls: (reason) => deps.toolRegistry?.cancelParkedCalls(reason),
|
|
1139
1169
|
onShutdown: async () => {
|
|
1170
|
+
// The terminal is already stopped here and the domains have not, so this
|
|
1171
|
+
// is the one moment a plain line about the pane host can both be read
|
|
1172
|
+
// and still see the registry that shutdown is about to forget.
|
|
1173
|
+
const leftBehind = mux && mux.mode !== "none" && mux.available() ? describePanesLeftBehind(mux) : null;
|
|
1174
|
+
if (leftBehind !== null) process.stderr.write(`${leftBehind}\n`);
|
|
1140
1175
|
try {
|
|
1141
1176
|
if (dumpInputWedgeOnTerminate) process.off("SIGTERM", dumpInputWedgeOnTerminate);
|
|
1142
1177
|
await deps.onShutdown();
|
|
@@ -21,6 +21,7 @@ export interface InteractiveInputKeyActionDeps {
|
|
|
21
21
|
requestShutdown: () => void;
|
|
22
22
|
toggleStatus: () => void;
|
|
23
23
|
toggleDispatchBoard: () => void;
|
|
24
|
+
toggleFilesPane: () => void;
|
|
24
25
|
openTasks: () => void;
|
|
25
26
|
openDecisions: () => void;
|
|
26
27
|
backgroundDispatch: () => void;
|
|
@@ -54,6 +55,8 @@ export interface InteractiveInputRuntimeDeps {
|
|
|
54
55
|
cycleScopedModelBackward(): void;
|
|
55
56
|
/** Convert the newest attached dispatch into a detached batch and notice the outcome. */
|
|
56
57
|
backgroundActiveDispatch(): void;
|
|
58
|
+
/** Toggle the files pane; the application decides what "inactive" says. */
|
|
59
|
+
toggleFilesPane(): void;
|
|
57
60
|
};
|
|
58
61
|
overlay: {
|
|
59
62
|
getState(): OverlayState;
|
|
@@ -154,6 +157,7 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
|
|
|
154
157
|
openTasks: deps.overlay.openTasksOverlayState,
|
|
155
158
|
openDecisions: deps.overlay.openDecisionsOverlayState,
|
|
156
159
|
backgroundDispatch: deps.actions.backgroundActiveDispatch,
|
|
160
|
+
toggleFilesPane: deps.actions.toggleFilesPane,
|
|
157
161
|
openModelSelector: deps.overlay.openModelOverlayState,
|
|
158
162
|
openTree: deps.overlay.openTreeOverlayState,
|
|
159
163
|
cycleScopedModelForward: () => {
|
|
@@ -37,7 +37,7 @@ import { createSlashCommandAutocompleteProvider } from "./slash-autocomplete.js"
|
|
|
37
37
|
import { parseSlashCommand, type RunIo } from "./slash-commands.js";
|
|
38
38
|
import { createStatusController, type StatusController, type TurnSummary } from "./status/index.js";
|
|
39
39
|
import type { SmoothStreamingMode } from "./stream-pacer.js";
|
|
40
|
-
import { processAutoPacingAllowed
|
|
40
|
+
import { processAutoPacingAllowed } from "./stream-pacing-policy.js";
|
|
41
41
|
import { formatTargetLabel } from "./theme/index.js";
|
|
42
42
|
import { createWelcomeDashboard, type WelcomeDashboardComponent } from "./welcome-dashboard.js";
|
|
43
43
|
import { readWorkerReceiptFacts } from "./worker-receipts.js";
|
|
@@ -452,7 +452,7 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
|
|
|
452
452
|
? {
|
|
453
453
|
streamIngress: deps.resolveStreamIngress,
|
|
454
454
|
getSmoothStreamingMode: () => {
|
|
455
|
-
const mode =
|
|
455
|
+
const mode = deps.getSettings?.().interface.smoothStreaming ?? "off";
|
|
456
456
|
const autoAllowed = processAutoPacingAllowed(deps.hasObservedBackpressure?.() ?? false);
|
|
457
457
|
deps.onSmoothStreamingMode?.(mode, mode === "on" || (mode === "auto" && autoAllowed));
|
|
458
458
|
return mode;
|
|
@@ -62,7 +62,7 @@ export interface InteractiveSlashSubmitExpansion {
|
|
|
62
62
|
pendingSkillRequests: PendingSkillRequest[];
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
type SlashChat = Pick<ChatLoop, "getSessionId" | "isStreaming" | "submit">;
|
|
65
|
+
type SlashChat = Pick<ChatLoop, "clearSkillSurface" | "getSessionId" | "isStreaming" | "submit">;
|
|
66
66
|
type SlashChatPanel = Pick<ChatPanel, "appendReplayBlock" | "appendUser" | "clearFoldOverrides">;
|
|
67
67
|
type UserTurnStatus = import("./chat-panel.js").UserTurnStatus;
|
|
68
68
|
type SlashResources = Pick<ResourcesContract, "prompts" | "expandPromptTemplate" | "reload">;
|
|
@@ -79,6 +79,7 @@ export interface InteractiveSlashRuntimeDeps {
|
|
|
79
79
|
chatPanel: SlashChatPanel;
|
|
80
80
|
resources?: SlashResources;
|
|
81
81
|
extensions?: SlashExtensions;
|
|
82
|
+
reloadExtensions?: SlashCommandContext["reloadExtensions"];
|
|
82
83
|
interop?: SlashCommandContext["interop"];
|
|
83
84
|
agents?: SlashAgents;
|
|
84
85
|
share?: SlashShare;
|
|
@@ -388,6 +389,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
388
389
|
listPrompts: () => deps.resources?.prompts(cwd()) ?? { items: [], diagnostics: [] },
|
|
389
390
|
...(resources ? { expandPromptTemplate: (text: string) => resources.expandPromptTemplate(text, cwd()) } : {}),
|
|
390
391
|
openSkillsHub: deps.openSkillsHub,
|
|
392
|
+
clearSkillSurface: () => deps.chat.clearSkillSurface(),
|
|
391
393
|
listExtensions: () => deps.extensions?.list(cwd(), { all: true }) ?? [],
|
|
392
394
|
listAgents: () => deps.agents?.listSpecs().filter((spec) => spec.audience !== "internal") ?? [],
|
|
393
395
|
listDelegationAgents: () => deps.getSettings?.().integrations.externalAgents.entries ?? [],
|
|
@@ -566,6 +568,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
|
|
|
566
568
|
openAgents: deps.openAgents,
|
|
567
569
|
openPrompts: deps.openPrompts,
|
|
568
570
|
openExtensions: deps.openExtensions,
|
|
571
|
+
...(deps.reloadExtensions ? { reloadExtensions: deps.reloadExtensions } : {}),
|
|
569
572
|
...(deps.openInterop ? { openInterop: deps.openInterop } : {}),
|
|
570
573
|
...(deps.interop ? { interop: deps.interop } : {}),
|
|
571
574
|
setEditorText: (text) => {
|
|
@@ -10,7 +10,15 @@ export const EXTENSIONS_EMPTY =
|
|
|
10
10
|
export function openExtensionsOverlay(tui: TUI, ctx: SlashCommandContext, onClose: () => void): OverlayHandle {
|
|
11
11
|
const list = ctx.listExtensions?.() ?? [];
|
|
12
12
|
const items: ListOverlayItem[] = list.map((ext) => {
|
|
13
|
-
const state = !ext.
|
|
13
|
+
const state = !ext.valid
|
|
14
|
+
? "invalid"
|
|
15
|
+
: !ext.compatible
|
|
16
|
+
? "incompatible"
|
|
17
|
+
: !ext.enabled
|
|
18
|
+
? "disabled"
|
|
19
|
+
: ext.loadable
|
|
20
|
+
? "active"
|
|
21
|
+
: `shadowed:${ext.overriddenBy ?? "higher"}`;
|
|
14
22
|
|
|
15
23
|
let meta = state;
|
|
16
24
|
if (state === "active") {
|
|
@@ -101,6 +101,19 @@ export function openHelpOverlay(
|
|
|
101
101
|
"**Tasks versus runs**: `/tasks` shows the agent's plan steps. Fleet runs are concrete delegated worker executions and remain in this board as recent terminal history.",
|
|
102
102
|
],
|
|
103
103
|
},
|
|
104
|
+
{
|
|
105
|
+
id: "topic-files-pane",
|
|
106
|
+
label: `${"panes & files".padEnd(30)}The files pane, the logs and shell panes, and what closes them`,
|
|
107
|
+
group: "Topics",
|
|
108
|
+
detail: () => [
|
|
109
|
+
"# Panes & files",
|
|
110
|
+
"**Where it works**: a session started inside a herdr pane with `clio-coder --with-panes` (or `interface.panes.enabled: auto`). Outside herdr `/files` still works as a full-screen pick that returns to the composer; `/panes open logs|shell` do not.",
|
|
111
|
+
"**Files pane**: `/files` or the Files toggle key (Alt+E by default) opens the file view below the session and moves the keyboard into it; the same key or command closes it. `/files pick` borrows it for one selection. It is off until `interface.panes.files.enabled` is `true`.",
|
|
112
|
+
"**Picking**: navigate, select with Space for several, then Ctrl+Y (or Enter in pick mode). The paths land in the composer as `@file` mentions and the keyboard returns to the composer.",
|
|
113
|
+
"**Logs and shell**: `/panes open logs` follows the newest dispatched run's journal; `/panes open shell` opens a shell in the workspace. A second open focuses the pane that is already there. `/panes close <name|all>` closes them; `/quit` closes the docks it manages (files, workers), leaves a shell or logs pane you opened, and prints which panes it left and how to close them.",
|
|
114
|
+
"**Engine**: the files pane runs a vendored file manager installed with `clio-coder tools install yazi`; `clio-coder doctor` and `/panes` say whether it resolved.",
|
|
115
|
+
],
|
|
116
|
+
},
|
|
104
117
|
{
|
|
105
118
|
id: "topic-steering-modes",
|
|
106
119
|
label: `${"steering modes".padEnd(30)}Interrupt, next slot, or end of turn: when a message lands mid-run`,
|
|
@@ -200,7 +200,7 @@ export const SETTINGS_LABELS_BY_ID = {
|
|
|
200
200
|
"panes.journal": "Run event journal",
|
|
201
201
|
"panes.yazi.enabled": "Files pane",
|
|
202
202
|
"panes.yazi.mode": "Files pane mode",
|
|
203
|
-
"panes.yazi.profile": "
|
|
203
|
+
"panes.yazi.profile": "Files pane profile",
|
|
204
204
|
"panes.yazi.followCwd": "Follow conversation cwd",
|
|
205
205
|
"panes.yazi.ratio": "Files dock share",
|
|
206
206
|
scope: "Model cycle set",
|
|
@@ -208,6 +208,7 @@ export const SETTINGS_LABELS_BY_ID = {
|
|
|
208
208
|
"modelSelector.favorites": "Pinned favorites",
|
|
209
209
|
"budget.sessionCeilingUsd": "Session ceiling (USD)",
|
|
210
210
|
"defaults.maxTokens": "Output budget (tokens)",
|
|
211
|
+
"context.toolResultMaxBytes": "Tool result cap (bytes)",
|
|
211
212
|
"budget.concurrency": "Fleet concurrency",
|
|
212
213
|
"guardrails.turnToolCallBudget": "Turn tool-call budget",
|
|
213
214
|
"guardrails.workerToolCallCap": "Worker tool-call cap",
|
|
@@ -326,6 +327,7 @@ export const SETTINGS_SECTION_ROWS = {
|
|
|
326
327
|
budget: [
|
|
327
328
|
"budget.sessionCeilingUsd",
|
|
328
329
|
"defaults.maxTokens",
|
|
330
|
+
"context.toolResultMaxBytes",
|
|
329
331
|
"budget.concurrency",
|
|
330
332
|
"guardrails.turnToolCallBudget",
|
|
331
333
|
"guardrails.workerToolCallCap",
|
|
@@ -414,9 +416,10 @@ const SETTINGS_DESCRIPTIONS_BY_ID = {
|
|
|
414
416
|
"panes.layout": "What composes itself at interactive boot: nothing, the workers dock, or workers plus files.",
|
|
415
417
|
"panes.workers.ratio": "Share of the width the workers dock takes, at most half.",
|
|
416
418
|
"panes.journal": "Whether every dispatched run's event tail is written to disk for `clio-coder fleet view`.",
|
|
417
|
-
"panes.yazi.enabled":
|
|
418
|
-
|
|
419
|
-
"panes.yazi.
|
|
419
|
+
"panes.yazi.enabled":
|
|
420
|
+
"Whether `/files`, its key, and `/panes open files` may open the files pane or the one-shot pick.",
|
|
421
|
+
"panes.yazi.mode": "Keep the files pane beside the conversation, or close it after one selection.",
|
|
422
|
+
"panes.yazi.profile": "Use Clio's managed, themed engine profile or the operator's own file-manager configuration.",
|
|
420
423
|
"panes.yazi.followCwd": "Push the conversation directory into an already-open companion pane.",
|
|
421
424
|
"panes.yazi.ratio": "Share of the height the files dock takes, at most half.",
|
|
422
425
|
scope: "Alt+J and Alt+K model cycle set.",
|
|
@@ -424,6 +427,7 @@ const SETTINGS_DESCRIPTIONS_BY_ID = {
|
|
|
424
427
|
"modelSelector.favorites": "Exact target/model refs pinned in /model.",
|
|
425
428
|
"budget.sessionCeilingUsd": "Per-session cost cap.",
|
|
426
429
|
"defaults.maxTokens": "Output tokens requested per turn, applied to every target.",
|
|
430
|
+
"context.toolResultMaxBytes": "Maximum bytes returned from one tool result before the full text spills to scratch.",
|
|
427
431
|
"budget.concurrency": "Parallel workers allowed during dispatch.",
|
|
428
432
|
"guardrails.turnToolCallBudget": "Soft per-turn tool-call budget for this chat loop.",
|
|
429
433
|
"guardrails.workerToolCallCap": "Lifetime ceiling on tool calls one dispatched worker may execute.",
|
|
@@ -475,6 +479,8 @@ const SETTINGS_HELP_BY_ID: Partial<Record<EditableSettingId, string>> = {
|
|
|
475
479
|
"read-only observes; suggest parks non-read calls; auto-edit edits, dispatches, and runs recognized commands; full-auto runs except command substitution and system-level changes. A confirmation marked exposure=outward parks for you at suggest and auto-edit.",
|
|
476
480
|
"defaults.maxTokens":
|
|
477
481
|
"Clamped down to each model's max-output cap and the remaining context window. Set 0 to use per-model caps only.",
|
|
482
|
+
"context.toolResultMaxBytes":
|
|
483
|
+
"The 192KB per-turn observation pool remains authoritative. Three full 64KB results consume it, so a fourth finds it filled. Whole number of at least 4096 bytes · default: 65536 (64KB).",
|
|
478
484
|
"compaction.threshold":
|
|
479
485
|
"pressure = estimated tokens ÷ context window. Higher keeps more history but risks overflow before a summary runs.",
|
|
480
486
|
"context.workingSet.enabled":
|
|
@@ -487,17 +493,17 @@ const SETTINGS_HELP_BY_ID: Partial<Record<EditableSettingId, string>> = {
|
|
|
487
493
|
"context.workingSet.minEvictableTokens":
|
|
488
494
|
"The floor sweep put marker break-even near 50 tokens; 200 is the churn guard. Whole number, 0 evicts anything · default: 200.",
|
|
489
495
|
"guardrails.turnToolCallBudget":
|
|
490
|
-
"Crossing it blocks further calls in the turn with a stop-and-summarize directive, and the hard interrupt ceiling sits a fixed margin above. A backstop against a model spraying unproductive calls, not a routine ceiling: a repo-wide audit legitimately runs dozens. Whole number of at least 1 · default: 60.
|
|
496
|
+
"Crossing it blocks further calls in the turn with a stop-and-summarize directive, and the hard interrupt ceiling sits a fixed margin above. A backstop against a model spraying unproductive calls, not a routine ceiling: a repo-wide audit legitimately runs dozens. Whole number of at least 1 · default: 60.",
|
|
491
497
|
"guardrails.workerToolCallCap":
|
|
492
|
-
"Bounds admitted calls, not attempts: a call the harness refuses never ran and never spends the cap. Dispatch takes the smaller of this and the agent recipe's own budget, so the recipe normally binds. Whole number of at least 1 · default: 150.
|
|
498
|
+
"Bounds admitted calls, not attempts: a call the harness refuses never ran and never spends the cap. Dispatch takes the smaller of this and the agent recipe's own budget, so the recipe normally binds. Whole number of at least 1 · default: 150.",
|
|
493
499
|
"guardrails.maxDispatchRuns":
|
|
494
|
-
"Runs leaving the ring also lose their event journal directory. Whole number of at least 1 · default: 1000.
|
|
500
|
+
"Runs leaving the ring also lose their event journal directory. Whole number of at least 1 · default: 1000.",
|
|
495
501
|
"guardrails.readMaxBytes":
|
|
496
|
-
"Clamped up to a 1KB floor at use. Whole number of bytes, at least 1 · default: 51200 (50KB).
|
|
502
|
+
"Clamped up to a 1KB floor at use. Whole number of bytes, at least 1 · default: 51200 (50KB).",
|
|
497
503
|
"guardrails.observationTurnBudgetBytes":
|
|
498
|
-
"One pool shared by every observation-producing tool in a turn, so a single verbose tool cannot starve the rest. Whole number of bytes, at least 1 · default: 196608 (192KB).
|
|
504
|
+
"One pool shared by every observation-producing tool in a turn, so a single verbose tool cannot starve the rest. Whole number of bytes, at least 1 · default: 196608 (192KB).",
|
|
499
505
|
"guardrails.internalDispatchTimeoutMs":
|
|
500
|
-
"Covers the wiki documenter and the bootstrap scout. Continuous output satisfies the heartbeat watchdog and a run mid-generation spends no tool calls, so this is the only guard that ends a degenerate generator. Healthy runs finish in minutes. Whole milliseconds of at least 1 · default: 900000 (15 minutes).
|
|
506
|
+
"Covers the wiki documenter and the bootstrap scout. Continuous output satisfies the heartbeat watchdog and a run mid-generation spends no tool calls, so this is the only guard that ends a degenerate generator. Healthy runs finish in minutes. Whole milliseconds of at least 1 · default: 900000 (15 minutes).",
|
|
501
507
|
"retry.streamStallMs":
|
|
502
508
|
"Measured from the last token received, not from the request, so a slow-but-alive stream is never aborted. The retry then follows the same enabled/maxRetries/delay settings above. Whole milliseconds · default: 180000 (three minutes).",
|
|
503
509
|
"library.catalog":
|
|
@@ -593,14 +599,11 @@ const SETTINGS_VALUE_HELP_BY_ID: Partial<Record<EditableSettingId, Record<string
|
|
|
593
599
|
true: "compact automatically before a turn crosses the threshold",
|
|
594
600
|
false: "context is only compacted when you run /context compact",
|
|
595
601
|
},
|
|
596
|
-
// `embedded` is a declared rung with no implementation behind it
|
|
597
|
-
//
|
|
598
|
-
// It stays selectable, because refusing it outright would break a settings
|
|
599
|
-
// file that names it, but nothing here lets an operator pick it believing
|
|
600
|
-
// they will get panes.
|
|
602
|
+
// `embedded` is a declared rung with no implementation behind it yet; it
|
|
603
|
+
// runs as `auto` until Clio can own a pane host, and the hint says so.
|
|
601
604
|
"panes.enabled": {
|
|
602
605
|
auto: "detect a herdr session and join it as a guest; no pane host, no panes",
|
|
603
|
-
embedded: "
|
|
606
|
+
embedded: "not implemented yet; behaves as auto (guest mode inside herdr) until Clio can own a pane host",
|
|
604
607
|
off: "never detect or open a pane",
|
|
605
608
|
},
|
|
606
609
|
"retry.enabled": {
|
|
@@ -1838,6 +1841,9 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
|
|
|
1838
1841
|
settingItem("defaults.maxTokens", String(settings.chat.maxOutputTokens), {
|
|
1839
1842
|
values: ["0", "4096", "8192", "16384", "32768", "65536", "131072"],
|
|
1840
1843
|
}),
|
|
1844
|
+
settingItem("context.toolResultMaxBytes", String(settings.context.toolResultMaxBytes), {
|
|
1845
|
+
values: ["4096", "8192", "16384", "32768", "65536", "131072"],
|
|
1846
|
+
}),
|
|
1841
1847
|
settingItem("budget.concurrency", String(settings.fleet.concurrency), {
|
|
1842
1848
|
values: ["auto", "1", "2", "4", "8"],
|
|
1843
1849
|
}),
|
|
@@ -2707,6 +2713,11 @@ function applySettingChange(settings: ClioSettings, id: string, value: string):
|
|
|
2707
2713
|
else settings.fleet.limits.internalRunTimeoutMs = next;
|
|
2708
2714
|
});
|
|
2709
2715
|
return;
|
|
2716
|
+
case "context.toolResultMaxBytes":
|
|
2717
|
+
applyNonNegativeInteger(value, (next) => {
|
|
2718
|
+
if (next >= 4096) settings.context.toolResultMaxBytes = next;
|
|
2719
|
+
});
|
|
2720
|
+
return;
|
|
2710
2721
|
case "context.workingSet.enabled":
|
|
2711
2722
|
if (value === "true" || value === "false") settings.context.workingSet.enabled = value === "true";
|
|
2712
2723
|
return;
|
|
@@ -27,6 +27,7 @@ import type { MuxContract, MuxPaneRecord } from "../domains/mux/index.js";
|
|
|
27
27
|
import {
|
|
28
28
|
PANES_PRESETS,
|
|
29
29
|
type PanesCloseResult,
|
|
30
|
+
type PanesFilesResult,
|
|
30
31
|
type PanesInventoryEntry,
|
|
31
32
|
type PanesOpenResult,
|
|
32
33
|
type PanesOperations,
|
|
@@ -36,6 +37,7 @@ import {
|
|
|
36
37
|
type PanesYaziController,
|
|
37
38
|
type PanesYaziStatus,
|
|
38
39
|
type PanesZoomResult,
|
|
40
|
+
resolvePanesPresetId,
|
|
39
41
|
} from "../domains/mux/operations.js";
|
|
40
42
|
import { resolveBinary } from "../tools/executables.js";
|
|
41
43
|
import { type PaneWatchSource, paneWatchDecision } from "./pane-policy.js";
|
|
@@ -54,7 +56,16 @@ export interface PanesRuntimeDeps {
|
|
|
54
56
|
newestJournalRunId?: () => string | null;
|
|
55
57
|
}
|
|
56
58
|
|
|
57
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Why there is no pane layer, in the operator's terms. Detection already
|
|
61
|
+
* knows (no `HERDR_ENV`, no socket, a refused rung); repeating that reason
|
|
62
|
+
* beside the refusal is what turns "unavailable" into a next step, and the
|
|
63
|
+
* `--with-panes` hint covers the session that never asked for panes.
|
|
64
|
+
*/
|
|
65
|
+
function unavailableReason(mux: MuxContract): string {
|
|
66
|
+
const reason = mux.detection().reason;
|
|
67
|
+
return `the pane layer is not available in this session: ${reason}. Start Clio inside a herdr session with \`clio-coder --with-panes\` to get panes`;
|
|
68
|
+
}
|
|
58
69
|
|
|
59
70
|
/** Fuzzy operator addressing shared by `close` and `zoom`: id, label, purpose; newest first. */
|
|
60
71
|
function matchOwnedPane(owned: ReadonlyArray<MuxPaneRecord>, target: string): MuxPaneRecord | null {
|
|
@@ -78,6 +89,27 @@ function inventory(records: ReadonlyArray<MuxPaneRecord>): ReadonlyArray<PanesIn
|
|
|
78
89
|
}));
|
|
79
90
|
}
|
|
80
91
|
|
|
92
|
+
/**
|
|
93
|
+
* The sentence `/quit` prints about the panes it did not close, or null when
|
|
94
|
+
* there are none.
|
|
95
|
+
*
|
|
96
|
+
* Policy (#272): docks close with the session and utility panes stay. A dock
|
|
97
|
+
* is a Clio surface (the files pane, the workers watch pane), so it goes the
|
|
98
|
+
* way a native application's windows go. A pane opened with `/panes open
|
|
99
|
+
* shell|logs|<argv>` is a terminal the operator may be typing in, and killing
|
|
100
|
+
* it on quit is the one thing a pane host must never do behind the operator's
|
|
101
|
+
* back. The next session does not adopt it either, so without this line the
|
|
102
|
+
* pane simply sat there with nothing naming it. Computed before the mux
|
|
103
|
+
* domain stops, because shutdown forgets its registry.
|
|
104
|
+
*/
|
|
105
|
+
export function describePanesLeftBehind(mux: Pick<MuxContract, "list" | "docks">): string | null {
|
|
106
|
+
const dockIds = new Set(mux.docks().map((dock) => dock.paneId));
|
|
107
|
+
const left = mux.list().filter((record) => !dockIds.has(record.ref.paneId));
|
|
108
|
+
if (left.length === 0) return null;
|
|
109
|
+
const named = left.map((record) => `${record.label} (${record.ref.paneId})`).join(", ");
|
|
110
|
+
return `Clio left ${left.length} ${left.length === 1 ? "pane" : "panes"} open in herdr: ${named}. Utility panes stay when a session ends; the docks closed with it. Next time run \`/panes close all\` before \`/quit\` to take them with you, or close ${left.length === 1 ? "it" : "them"} now with \`herdr pane close <paneId>\`.`;
|
|
111
|
+
}
|
|
112
|
+
|
|
81
113
|
export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
|
|
82
114
|
const probe = deps.resolveBinaryPath ?? resolveBinary;
|
|
83
115
|
const journalRoot = deps.journalRoot ?? runEventJournalRoot;
|
|
@@ -143,7 +175,7 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
|
|
|
143
175
|
};
|
|
144
176
|
|
|
145
177
|
const show = async (target: string, source: PaneWatchSource): Promise<PanesShowResult> => {
|
|
146
|
-
if (!deps.mux.available()) return { status: "unavailable", reason:
|
|
178
|
+
if (!deps.mux.available()) return { status: "unavailable", reason: unavailableReason(deps.mux) };
|
|
147
179
|
const match = matchRun(target);
|
|
148
180
|
if (match === null) {
|
|
149
181
|
// The candidate list is what turns a miss into a next step: it names
|
|
@@ -164,7 +196,58 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
|
|
|
164
196
|
return { status: "watching", runId: match.runId, agentId: match.agentId, opened: watched.opened };
|
|
165
197
|
};
|
|
166
198
|
|
|
199
|
+
/**
|
|
200
|
+
* The files pane's open half, shared by `/files`, `/panes open files`, the
|
|
201
|
+
* keybinding, and the model tool. The settings gate and the missing-engine
|
|
202
|
+
* message live here so every door says the same thing.
|
|
203
|
+
*/
|
|
204
|
+
const openFiles = async (once: boolean): Promise<Exclude<PanesFilesResult, { status: "closed" }>> => {
|
|
205
|
+
const preset = PANES_PRESETS[0];
|
|
206
|
+
if (!deps.getSettings().interface.panes.files.enabled) {
|
|
207
|
+
return { status: "refused", reason: "the files pane is disabled by interface.panes.files.enabled" };
|
|
208
|
+
}
|
|
209
|
+
if (!yaziController) {
|
|
210
|
+
return { status: "unavailable", reason: "the files pane return path is not ready" };
|
|
211
|
+
}
|
|
212
|
+
const pendingId = beginPendingOpen(preset.id);
|
|
213
|
+
try {
|
|
214
|
+
const result = await yaziController.open(once ? { once: true } : undefined);
|
|
215
|
+
if (result.status === "opened") {
|
|
216
|
+
return { status: "opened", paneId: result.paneId, existing: result.existing };
|
|
217
|
+
}
|
|
218
|
+
if (result.status === "missing-binary") {
|
|
219
|
+
return {
|
|
220
|
+
status: "missing-binary",
|
|
221
|
+
binary: result.binary,
|
|
222
|
+
installHint: preset.installHint,
|
|
223
|
+
// The engine's own resolution sentence, prefixed with the surface it
|
|
224
|
+
// serves: an operator who typed `/files` should not have to know the
|
|
225
|
+
// name of the program to read the answer.
|
|
226
|
+
detail: `the files pane engine is not available: ${result.detail}`,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
status: result.status === "profile-error" ? "refused" : "unavailable",
|
|
231
|
+
reason: result.reason,
|
|
232
|
+
};
|
|
233
|
+
} finally {
|
|
234
|
+
pendingOpens.delete(pendingId);
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
|
|
167
238
|
return {
|
|
239
|
+
async files(action): Promise<PanesFilesResult> {
|
|
240
|
+
if (action === "close") {
|
|
241
|
+
await yaziController?.close();
|
|
242
|
+
return { status: "closed" };
|
|
243
|
+
}
|
|
244
|
+
if (action === "toggle" && yaziController?.isOpen()) {
|
|
245
|
+
await yaziController.close();
|
|
246
|
+
return { status: "closed" };
|
|
247
|
+
}
|
|
248
|
+
return openFiles(action === "pick");
|
|
249
|
+
},
|
|
250
|
+
|
|
168
251
|
status(): PanesStatus {
|
|
169
252
|
const detection = deps.mux.detection();
|
|
170
253
|
const settings = deps.getSettings();
|
|
@@ -201,41 +284,31 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
|
|
|
201
284
|
async open(request: { preset?: string; argv?: ReadonlyArray<string>; once?: boolean }): Promise<PanesOpenResult> {
|
|
202
285
|
const cwd = deps.getCwd();
|
|
203
286
|
if (request.preset !== undefined) {
|
|
204
|
-
const
|
|
287
|
+
const presetId = resolvePanesPresetId(request.preset);
|
|
288
|
+
const preset = presetId === null ? undefined : PANES_PRESETS.find((entry) => entry.id === presetId);
|
|
205
289
|
if (!preset) {
|
|
206
290
|
return { status: "refused", reason: `unknown preset: ${request.preset}` };
|
|
207
291
|
}
|
|
208
|
-
if (preset.id === "
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
if (!yaziController) {
|
|
213
|
-
return { status: "unavailable", reason: "the files-pane return path is not ready" };
|
|
292
|
+
if (preset.id === "files") {
|
|
293
|
+
const result = await openFiles(request.once === true);
|
|
294
|
+
if (result.status === "opened") {
|
|
295
|
+
return { status: "opened", label: preset.id, paneId: result.paneId, existing: result.existing };
|
|
214
296
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
const result = await yaziController.open(request.once ? { once: true } : undefined);
|
|
218
|
-
if (result.status === "opened") {
|
|
219
|
-
return { status: "opened", label: preset.id, paneId: result.paneId };
|
|
220
|
-
}
|
|
221
|
-
if (result.status === "missing-binary") {
|
|
222
|
-
return {
|
|
223
|
-
status: "missing-binary",
|
|
224
|
-
preset: preset.id,
|
|
225
|
-
binary: result.binary,
|
|
226
|
-
installHint: preset.installHint,
|
|
227
|
-
detail: result.detail,
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
return {
|
|
231
|
-
status: result.status === "profile-error" ? "refused" : "unavailable",
|
|
232
|
-
reason: result.reason,
|
|
233
|
-
};
|
|
234
|
-
} finally {
|
|
235
|
-
pendingOpens.delete(pendingId);
|
|
297
|
+
if (result.status === "missing-binary") {
|
|
298
|
+
return { ...result, preset: preset.id };
|
|
236
299
|
}
|
|
300
|
+
return result;
|
|
301
|
+
}
|
|
302
|
+
if (!deps.mux.available()) return { status: "unavailable", reason: unavailableReason(deps.mux) };
|
|
303
|
+
// One pane per preset. A second `/panes open shell` is a request to
|
|
304
|
+
// see the shell that is already there, not to split the screen again;
|
|
305
|
+
// the pane host is asked for focus so the operator lands in it.
|
|
306
|
+
const live = deps.mux.list().find((record) => record.purpose === "utility" && record.label === preset.id);
|
|
307
|
+
if (live) {
|
|
308
|
+
await deps.mux.unzoomSelf();
|
|
309
|
+
await deps.mux.focusPane(live.ref.paneId);
|
|
310
|
+
return { status: "opened", label: preset.id, paneId: live.ref.paneId, existing: true };
|
|
237
311
|
}
|
|
238
|
-
if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
|
|
239
312
|
const binaryPath = probe(preset.binary);
|
|
240
313
|
if (binaryPath === null) {
|
|
241
314
|
return {
|
|
@@ -248,7 +321,10 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
|
|
|
248
321
|
}
|
|
249
322
|
const argv = presetArgv(preset.id, binaryPath);
|
|
250
323
|
if (argv === null) {
|
|
251
|
-
return {
|
|
324
|
+
return {
|
|
325
|
+
status: "refused",
|
|
326
|
+
reason: `no dispatched run has written a journal under ${journalRoot()} yet; the logs pane follows the newest run once one starts`,
|
|
327
|
+
};
|
|
252
328
|
}
|
|
253
329
|
const pendingId = beginPendingOpen(preset.id);
|
|
254
330
|
try {
|
|
@@ -259,7 +335,7 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
|
|
|
259
335
|
pendingOpens.delete(pendingId);
|
|
260
336
|
}
|
|
261
337
|
}
|
|
262
|
-
if (!deps.mux.available()) return { status: "unavailable", reason:
|
|
338
|
+
if (!deps.mux.available()) return { status: "unavailable", reason: unavailableReason(deps.mux) };
|
|
263
339
|
const argv = request.argv ?? [];
|
|
264
340
|
if (argv.length === 0) return { status: "refused", reason: "nothing to run" };
|
|
265
341
|
const label = argv[0] ?? "pane";
|
|
@@ -274,7 +350,7 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
|
|
|
274
350
|
},
|
|
275
351
|
|
|
276
352
|
async zoom(target: string): Promise<PanesZoomResult> {
|
|
277
|
-
if (!deps.mux.available()) return { status: "unavailable", reason:
|
|
353
|
+
if (!deps.mux.available()) return { status: "unavailable", reason: unavailableReason(deps.mux) };
|
|
278
354
|
const match = matchOwnedPane(deps.mux.list(), target.trim().length === 0 ? "watch" : target);
|
|
279
355
|
if (!match) return { status: "not-found", target: target.trim().length === 0 ? "watch" : target };
|
|
280
356
|
const changed = await deps.mux.zoomPane(match.ref.paneId, "toggle");
|
|
@@ -285,7 +361,7 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
|
|
|
285
361
|
},
|
|
286
362
|
|
|
287
363
|
async close(target: string): Promise<PanesCloseResult> {
|
|
288
|
-
if (!deps.mux.available()) return { status: "unavailable", reason:
|
|
364
|
+
if (!deps.mux.available()) return { status: "unavailable", reason: unavailableReason(deps.mux) };
|
|
289
365
|
const owned = deps.mux.list();
|
|
290
366
|
if (target === "all") {
|
|
291
367
|
const labels: string[] = [];
|