@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
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
type ClioSettings,
|
|
4
4
|
removeFleetProfileFromSettings,
|
|
5
5
|
removeTargetFromSettings,
|
|
6
|
+
SETTINGS_V1_PATH_MOVES,
|
|
6
7
|
setFleetProfileInSettings,
|
|
7
8
|
useTargetInSettings,
|
|
8
9
|
} from "../../core/config.js";
|
|
@@ -15,7 +16,6 @@ import {
|
|
|
15
16
|
THINKING_LEVELS,
|
|
16
17
|
type WorkerEscalationSettings,
|
|
17
18
|
} from "../../core/defaults.js";
|
|
18
|
-
import type { GuardrailValues } from "../../core/guardrails.js";
|
|
19
19
|
import { getAtPath, isRoutingPath } from "../../core/session-routing.js";
|
|
20
20
|
import { MAX_TIMER_DELAY_MS } from "../../core/timers.js";
|
|
21
21
|
import { capacityLeaseUsage } from "../../domains/dispatch/capacity-lease.js";
|
|
@@ -63,9 +63,9 @@ export const SETTINGS_OVERLAY_WIDTH = "100%";
|
|
|
63
63
|
export const SETTINGS_OVERLAY_MAX_HEIGHT = "100%";
|
|
64
64
|
export const SETTINGS_OVERLAY_MARGIN = {
|
|
65
65
|
top: 1,
|
|
66
|
-
right:
|
|
66
|
+
right: 0,
|
|
67
67
|
bottom: 1,
|
|
68
|
-
left:
|
|
68
|
+
left: 0,
|
|
69
69
|
} as const;
|
|
70
70
|
|
|
71
71
|
const SECTION_LANE_WIDTH = 24;
|
|
@@ -90,16 +90,6 @@ const ULTRAWIDE_LAYOUT_MIN_WIDTH = 112;
|
|
|
90
90
|
*/
|
|
91
91
|
const WIDE_LAYOUT_MIN_WIDTH = 72;
|
|
92
92
|
const DROP_PATH_COLUMN_WIDTH = 52;
|
|
93
|
-
/**
|
|
94
|
-
* Terminal width below which Settings drops its two-cell side margins.
|
|
95
|
-
*
|
|
96
|
-
* The engine composites an overlay only across the columns its region covers,
|
|
97
|
-
* and a left/right margin shrinks that region, so at 40 columns four of them
|
|
98
|
-
* kept showing the transcript beside a modal that owns the keyboard. Above this
|
|
99
|
-
* width the margins are cheap and the box reads better inset; below it the
|
|
100
|
-
* overlay claims every terminal column instead.
|
|
101
|
-
*/
|
|
102
|
-
const ULTRA_NARROW_TERMINAL_WIDTH = 60;
|
|
103
93
|
/** Shown when no runtime is resolvable, so it offers the full vocabulary. */
|
|
104
94
|
const FALLBACK_THINKING_VALUES: ReadonlyArray<string> = THINKING_LEVELS;
|
|
105
95
|
const ROW_GAP = " ";
|
|
@@ -108,11 +98,11 @@ const ROW_GAP = " ";
|
|
|
108
98
|
* the row that shows them and the mutation that writes them both need a
|
|
109
99
|
* definite shipped value to fall back to.
|
|
110
100
|
*/
|
|
111
|
-
const SHIPPED_ESCALATION: WorkerEscalationSettings = DEFAULT_SETTINGS.
|
|
101
|
+
const SHIPPED_ESCALATION: WorkerEscalationSettings = DEFAULT_SETTINGS.fleet.permissions.escalation ?? {
|
|
112
102
|
timeoutMs: 120_000,
|
|
113
103
|
fallback: "deny",
|
|
114
104
|
};
|
|
115
|
-
const SHIPPED_RESILIENCE_COOLDOWN_MS = DEFAULT_SETTINGS.
|
|
105
|
+
const SHIPPED_RESILIENCE_COOLDOWN_MS = DEFAULT_SETTINGS.fleet.retry.routeCooldownMs ?? 15_000;
|
|
116
106
|
/**
|
|
117
107
|
* The product's cut marker, as the help center and every list overlay use it.
|
|
118
108
|
*
|
|
@@ -187,7 +177,6 @@ export const SETTINGS_LABELS_BY_ID = {
|
|
|
187
177
|
"orchestrator.model": "Model",
|
|
188
178
|
"background.target": "Memory target",
|
|
189
179
|
"background.model": "Memory model",
|
|
190
|
-
"background.thinkingLevel": "Memory thinking level",
|
|
191
180
|
"memory.intervention.enabled": "Proactive memory",
|
|
192
181
|
"memory.intervention.everyNTools": "Memory cadence (tools)",
|
|
193
182
|
"memory.intervention.windowSteps": "Memory trajectory steps",
|
|
@@ -206,11 +195,14 @@ export const SETTINGS_LABELS_BY_ID = {
|
|
|
206
195
|
"routing.agentAutomation.activeAgentRoles": "Active agent routes",
|
|
207
196
|
"panes.enabled": "Panes",
|
|
208
197
|
"panes.notifications": "Pane notifications",
|
|
198
|
+
"panes.layout": "Boot layout",
|
|
199
|
+
"panes.workers.ratio": "Workers dock share",
|
|
209
200
|
"panes.journal": "Run event journal",
|
|
210
201
|
"panes.yazi.enabled": "Files pane",
|
|
211
202
|
"panes.yazi.mode": "Files pane mode",
|
|
212
203
|
"panes.yazi.profile": "Yazi profile",
|
|
213
204
|
"panes.yazi.followCwd": "Follow conversation cwd",
|
|
205
|
+
"panes.yazi.ratio": "Files dock share",
|
|
214
206
|
scope: "Model cycle set",
|
|
215
207
|
"modelSelector.recentLimit": "Recent models kept",
|
|
216
208
|
"modelSelector.favorites": "Pinned favorites",
|
|
@@ -224,7 +216,6 @@ export const SETTINGS_LABELS_BY_ID = {
|
|
|
224
216
|
"guardrails.observationTurnBudgetBytes": "Observation byte pool",
|
|
225
217
|
"guardrails.internalDispatchTimeoutMs": "Internal dispatch timeout (ms)",
|
|
226
218
|
"compaction.auto": "Auto-compact",
|
|
227
|
-
"compaction.excludeLastTurns": "Protected recent turns",
|
|
228
219
|
"compaction.threshold": "Compaction threshold",
|
|
229
220
|
"context.workingSet.enabled": "Working-set eviction",
|
|
230
221
|
"context.workingSet.policy": "Eviction policy",
|
|
@@ -245,7 +236,6 @@ export const SETTINGS_LABELS_BY_ID = {
|
|
|
245
236
|
"watchdog.enabled": "Turn-end watchdog",
|
|
246
237
|
"watchdog.target": "Watchdog target",
|
|
247
238
|
"watchdog.cadenceToolCalls": "Watchdog cadence (tools)",
|
|
248
|
-
theme: "Theme",
|
|
249
239
|
runtimePlugins: "Runtime plugins",
|
|
250
240
|
"compaction.model": "Compaction model",
|
|
251
241
|
"compaction.systemPrompt": "Compaction prompt",
|
|
@@ -308,7 +298,6 @@ export const SETTINGS_SECTION_ROWS = {
|
|
|
308
298
|
"orchestrator.model",
|
|
309
299
|
"background.target",
|
|
310
300
|
"background.model",
|
|
311
|
-
"background.thinkingLevel",
|
|
312
301
|
"memory.intervention.enabled",
|
|
313
302
|
"memory.intervention.everyNTools",
|
|
314
303
|
"memory.intervention.windowSteps",
|
|
@@ -329,6 +318,8 @@ export const SETTINGS_SECTION_ROWS = {
|
|
|
329
318
|
"routing.agentAutomation.activeAgentRoles",
|
|
330
319
|
"panes.enabled",
|
|
331
320
|
"panes.notifications",
|
|
321
|
+
"panes.layout",
|
|
322
|
+
"panes.workers.ratio",
|
|
332
323
|
"panes.journal",
|
|
333
324
|
],
|
|
334
325
|
models: ["scope", "modelSelector.recentLimit", "modelSelector.favorites"],
|
|
@@ -346,7 +337,6 @@ export const SETTINGS_SECTION_ROWS = {
|
|
|
346
337
|
compaction: [
|
|
347
338
|
"compaction.auto",
|
|
348
339
|
"compaction.threshold",
|
|
349
|
-
"compaction.excludeLastTurns",
|
|
350
340
|
"context.workingSet.enabled",
|
|
351
341
|
"context.workingSet.policy",
|
|
352
342
|
"context.workingSet.target",
|
|
@@ -361,11 +351,11 @@ export const SETTINGS_SECTION_ROWS = {
|
|
|
361
351
|
"terminal.fullscreenScrollbar",
|
|
362
352
|
"terminal.smoothStreaming",
|
|
363
353
|
"terminal.notify",
|
|
364
|
-
"theme",
|
|
365
354
|
"panes.yazi.enabled",
|
|
366
355
|
"panes.yazi.mode",
|
|
367
356
|
"panes.yazi.profile",
|
|
368
357
|
"panes.yazi.followCwd",
|
|
358
|
+
"panes.yazi.ratio",
|
|
369
359
|
],
|
|
370
360
|
watchdog: ["watchdog.enabled", "watchdog.target", "watchdog.cadenceToolCalls"],
|
|
371
361
|
advanced: [
|
|
@@ -402,7 +392,6 @@ const SETTINGS_DESCRIPTIONS_BY_ID = {
|
|
|
402
392
|
"orchestrator.model": "Active chat wire model id.",
|
|
403
393
|
"background.target": "Optional target for LLM memory steps; unset keeps rules-only memory.",
|
|
404
394
|
"background.model": "Small non-reasoning model used only for task memory steps.",
|
|
405
|
-
"background.thinkingLevel": "Unused: memory steps always request thinking off.",
|
|
406
395
|
"memory.intervention.enabled": "Master switch for rules-only and model-backed task memory.",
|
|
407
396
|
"memory.intervention.everyNTools": "Maximum tool executions between prompted memory steps.",
|
|
408
397
|
"memory.intervention.windowSteps": "Recent completed tool steps visible to the memory policy.",
|
|
@@ -422,11 +411,14 @@ const SETTINGS_DESCRIPTIONS_BY_ID = {
|
|
|
422
411
|
"routing.agentAutomation.activeAgentRoles": "Exact agent and execution-role pairs whose agent choice may act.",
|
|
423
412
|
"panes.enabled": "Default panes activation for new sessions; `--with-panes` / `--no-panes` beat it.",
|
|
424
413
|
"panes.notifications": "Which terminal run states raise a pane-host toast.",
|
|
414
|
+
"panes.layout": "What composes itself at interactive boot: nothing, the workers dock, or workers plus files.",
|
|
415
|
+
"panes.workers.ratio": "Share of the width the workers dock takes, at most half.",
|
|
425
416
|
"panes.journal": "Whether every dispatched run's event tail is written to disk for `clio-coder fleet view`.",
|
|
426
417
|
"panes.yazi.enabled": "Whether `/panes open yazi` may open the files pane or one-shot chooser.",
|
|
427
418
|
"panes.yazi.mode": "Keep Yazi beside the conversation, or close it after one selection.",
|
|
428
419
|
"panes.yazi.profile": "Use Clio's managed pick profile or leave the operator's Yazi profile untouched.",
|
|
429
420
|
"panes.yazi.followCwd": "Push the conversation directory into an already-open companion pane.",
|
|
421
|
+
"panes.yazi.ratio": "Share of the height the files dock takes, at most half.",
|
|
430
422
|
scope: "Alt+J and Alt+K model cycle set.",
|
|
431
423
|
"modelSelector.recentLimit": "How many recently used models /model remembers.",
|
|
432
424
|
"modelSelector.favorites": "Exact target/model refs pinned in /model.",
|
|
@@ -440,7 +432,6 @@ const SETTINGS_DESCRIPTIONS_BY_ID = {
|
|
|
440
432
|
"guardrails.observationTurnBudgetBytes": "Shared per-turn byte pool across every observation-producing tool.",
|
|
441
433
|
"guardrails.internalDispatchTimeoutMs": "Wall-clock cap for one internal generator dispatch.",
|
|
442
434
|
"compaction.auto": "Auto-compact before a turn when context crosses the threshold.",
|
|
443
|
-
"compaction.excludeLastTurns": "Recent user turns protected from observation masking.",
|
|
444
435
|
"compaction.threshold": "Pressure at which compaction masks stale observations, then summarizes.",
|
|
445
436
|
"context.workingSet.enabled": "Non-destructive eviction of stale tool results before a summary is ever needed.",
|
|
446
437
|
"context.workingSet.policy": "Which candidates the eviction pass selects.",
|
|
@@ -463,7 +454,6 @@ const SETTINGS_DESCRIPTIONS_BY_ID = {
|
|
|
463
454
|
"watchdog.enabled": "When enabled, a turn that changed the tree is reviewed by one read-only verifier run.",
|
|
464
455
|
"watchdog.target": "Set target to route the run at a cheap local model; blank uses the session's active target.",
|
|
465
456
|
"watchdog.cadenceToolCalls": "Also fire every N tool calls inside a turn; blank fires at turn end only.",
|
|
466
|
-
theme: "Color palette. Clio ships a single tuned palette.",
|
|
467
457
|
runtimePlugins: "npm packages exporting clioRuntimes: RuntimeDescriptor[].",
|
|
468
458
|
"compaction.model": "Dedicated summarization model; blank uses the orchestrator.",
|
|
469
459
|
"compaction.systemPrompt": "Path to a compaction prompt override; blank uses the built-in.",
|
|
@@ -493,8 +483,7 @@ const SETTINGS_HELP_BY_ID: Partial<Record<EditableSettingId, string>> = {
|
|
|
493
483
|
"structural-v1 selects by message structure; age-horizon is the older age-based rule. Legal values: structural-v1, age-horizon · default: structural-v1.",
|
|
494
484
|
"context.workingSet.target":
|
|
495
485
|
"An applied eviction batch keeps evicting until pressure reaches this ratio, so it sits below compaction.threshold. Greater than 0 and less than 1 · default: 0.6.",
|
|
496
|
-
"context.workingSet.protectLastTurns":
|
|
497
|
-
"Counted in user turns, the same unit compaction.excludeLastTurns uses. Whole number of at least 1 · default: 6.",
|
|
486
|
+
"context.workingSet.protectLastTurns": "Counted in user turns. Whole number of at least 1 · default: 6.",
|
|
498
487
|
"context.workingSet.minEvictableTokens":
|
|
499
488
|
"The floor sweep put marker break-even near 50 tokens; 200 is the churn guard. Whole number, 0 evicts anything · default: 200.",
|
|
500
489
|
"guardrails.turnToolCallBudget":
|
|
@@ -543,7 +532,7 @@ const SETTINGS_HELP_BY_ID: Partial<Record<EditableSettingId, string>> = {
|
|
|
543
532
|
"workers.agentBindings":
|
|
544
533
|
"Bind base, custom, and shadow native agents such as scout, researcher, and provenance to profiles. ACP delegation agents cannot be bound.",
|
|
545
534
|
"delegation.defaults.toolGovernance":
|
|
546
|
-
"clio-policy gates the agent through Clio's safety net; agent-managed trusts the agent; deny-all blocks every tool.",
|
|
535
|
+
"clio-coder-policy gates the agent through Clio's safety net; agent-managed trusts the agent; deny-all blocks every tool.",
|
|
547
536
|
scope: "Choose target-level or exact target/model refs. Alt+J / Alt+K step the chat target through this list.",
|
|
548
537
|
runtimePlugins: "Comma-separated package names, loaded at startup. Restart Clio after changing.",
|
|
549
538
|
"terminal.notify":
|
|
@@ -596,7 +585,7 @@ const SETTINGS_VALUE_HELP_BY_ID: Partial<Record<EditableSettingId, Record<string
|
|
|
596
585
|
false: "refuse every library network operation",
|
|
597
586
|
},
|
|
598
587
|
"delegation.defaults.toolGovernance": {
|
|
599
|
-
"clio-policy": "Clio's safety policy gates the delegated agent's tools",
|
|
588
|
+
"clio-coder-policy": "Clio's safety policy gates the delegated agent's tools",
|
|
600
589
|
"agent-managed": "the external agent governs its own tools",
|
|
601
590
|
"deny-all": "block every tool the delegated agent requests",
|
|
602
591
|
},
|
|
@@ -604,6 +593,16 @@ const SETTINGS_VALUE_HELP_BY_ID: Partial<Record<EditableSettingId, Record<string
|
|
|
604
593
|
true: "compact automatically before a turn crosses the threshold",
|
|
605
594
|
false: "context is only compacted when you run /context compact",
|
|
606
595
|
},
|
|
596
|
+
// `embedded` is a declared rung with no implementation behind it, and a row
|
|
597
|
+
// that offered it beside two working values read as a third working value.
|
|
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.
|
|
601
|
+
"panes.enabled": {
|
|
602
|
+
auto: "detect a herdr session and join it as a guest; no pane host, no panes",
|
|
603
|
+
embedded: "NOT IMPLEMENTED (ships in phase 5): this session gets no panes at all, guest mode included",
|
|
604
|
+
off: "never detect or open a pane",
|
|
605
|
+
},
|
|
607
606
|
"retry.enabled": {
|
|
608
607
|
true: "retry transient provider errors automatically",
|
|
609
608
|
false: "surface transient errors immediately without retrying",
|
|
@@ -678,7 +677,7 @@ export interface SettingsCenterItem extends SettingItem {
|
|
|
678
677
|
label: string;
|
|
679
678
|
description: string;
|
|
680
679
|
section: SettingsSectionId;
|
|
681
|
-
configPath:
|
|
680
|
+
configPath: string;
|
|
682
681
|
affordance: string;
|
|
683
682
|
scope: SettingScope;
|
|
684
683
|
readOnly: boolean;
|
|
@@ -776,7 +775,7 @@ function delegationAgentsAffordance(
|
|
|
776
775
|
submenu: selectListSubmenu(
|
|
777
776
|
"Delegation agents",
|
|
778
777
|
choices,
|
|
779
|
-
"An added peer runs under clio-policy governance and inherits projectContext: none.",
|
|
778
|
+
"An added peer runs under clio-coder-policy governance and inherits projectContext: none.",
|
|
780
779
|
),
|
|
781
780
|
};
|
|
782
781
|
}
|
|
@@ -930,6 +929,9 @@ const NUMBER_SETTING_RULES = {
|
|
|
930
929
|
"guardrails.readMaxBytes": { min: 1, integer: true },
|
|
931
930
|
"guardrails.observationTurnBudgetBytes": { min: 1, integer: true },
|
|
932
931
|
"guardrails.internalDispatchTimeoutMs": { min: 1, integer: true },
|
|
932
|
+
// The config validator's bounds for both dock shares; half the axis is the cap.
|
|
933
|
+
"panes.workers.ratio": { min: 0.05, max: 0.5, integer: false },
|
|
934
|
+
"panes.yazi.ratio": { min: 0.05, max: 0.5, integer: false },
|
|
933
935
|
} as const satisfies Partial<Record<EditableSettingId, NumberSettingRule>>;
|
|
934
936
|
|
|
935
937
|
export type NumberSettingId = keyof typeof NUMBER_SETTING_RULES;
|
|
@@ -965,16 +967,6 @@ function parseNumberSetting(value: string, rule: NumberSettingRule): NumberSetti
|
|
|
965
967
|
return { value: parsed };
|
|
966
968
|
}
|
|
967
969
|
|
|
968
|
-
/**
|
|
969
|
-
* The reason a number row would refuse `value`, or null when it would apply.
|
|
970
|
-
* This is the same check the editor and `applySettingChange` run, exposed so a
|
|
971
|
-
* caller that bypasses the editor can still name the bound it hit.
|
|
972
|
-
*/
|
|
973
|
-
export function describeNumberSettingRefusal(id: NumberSettingId, value: string): string | null {
|
|
974
|
-
const outcome = parseNumberSetting(value, NUMBER_SETTING_RULES[id]);
|
|
975
|
-
return "refusal" in outcome ? outcome.refusal : null;
|
|
976
|
-
}
|
|
977
|
-
|
|
978
970
|
function numberSettingNote(rule: NumberSettingRule): string {
|
|
979
971
|
const noun = rule.integer ? "a whole number" : "a number";
|
|
980
972
|
const clears = rule.allowBlank === true ? "; blank clears it" : "";
|
|
@@ -1368,7 +1360,7 @@ function profileTargetChoices(
|
|
|
1368
1360
|
}
|
|
1369
1361
|
|
|
1370
1362
|
function profileNameChoices(live: () => Readonly<ClioSettings>): Array<{ value: string; label: string }> {
|
|
1371
|
-
const names = Object.keys(live().
|
|
1363
|
+
const names = Object.keys(live().fleet.profiles).sort();
|
|
1372
1364
|
return names.map((name) => ({ value: name, label: name }));
|
|
1373
1365
|
}
|
|
1374
1366
|
|
|
@@ -1482,13 +1474,45 @@ function scopeForId(id: EditableSettingId): SettingScope {
|
|
|
1482
1474
|
|
|
1483
1475
|
/** Shipped default as a display string, for the "default: X" hint and the modified marker. */
|
|
1484
1476
|
function defaultValueFor(id: EditableSettingId): string | undefined {
|
|
1485
|
-
|
|
1486
|
-
|
|
1477
|
+
const path = settingsV2PathForRow(id);
|
|
1478
|
+
if (isRoutingPath(path)) return undefined;
|
|
1479
|
+
const raw = getAtPath(DEFAULT_SETTINGS, path);
|
|
1487
1480
|
if (raw === null || raw === undefined || typeof raw === "object") return undefined;
|
|
1488
1481
|
if (id === "attribution.gitCommits") return raw === true ? "enabled" : "disabled";
|
|
1489
1482
|
return String(raw);
|
|
1490
1483
|
}
|
|
1491
1484
|
|
|
1485
|
+
const SETTINGS_CENTER_V2_PATH_OVERRIDES: Readonly<Record<string, string>> = {
|
|
1486
|
+
"workers.profiles": "fleet.profiles",
|
|
1487
|
+
"workers.agentBindings": "fleet.agentProfiles",
|
|
1488
|
+
"routing.agentAutomation.activeAgentRoles": "fleet.adaptiveRouting.agentRoles",
|
|
1489
|
+
"panes.enabled": "interface.panes.enabled",
|
|
1490
|
+
"panes.notifications": "interface.panes.notifications",
|
|
1491
|
+
"panes.journal": "fleet.history.journal",
|
|
1492
|
+
"panes.yazi.enabled": "interface.panes.files.enabled",
|
|
1493
|
+
"panes.yazi.mode": "interface.panes.files.mode",
|
|
1494
|
+
"panes.yazi.profile": "interface.panes.files.profile",
|
|
1495
|
+
"panes.yazi.followCwd": "interface.panes.files.followCwd",
|
|
1496
|
+
"panes.yazi.ratio": "interface.panes.files.ratio",
|
|
1497
|
+
"panes.layout": "interface.panes.layout",
|
|
1498
|
+
"panes.workers.ratio": "interface.panes.workers.ratio",
|
|
1499
|
+
"delegation.agents": "integrations.externalAgents.entries",
|
|
1500
|
+
keybindings: "interface.keybindings",
|
|
1501
|
+
};
|
|
1502
|
+
|
|
1503
|
+
/** Keep the existing Center navigation while showing and persisting only canonical v2 paths. */
|
|
1504
|
+
function settingsV2PathForRow(id: EditableSettingId): string {
|
|
1505
|
+
if (id.startsWith("workers.profiles.")) return `fleet.profiles.${id.slice("workers.profiles.".length)}`;
|
|
1506
|
+
if (id.startsWith("workers.agentBindings.")) return `fleet.agentProfiles.${id.slice("workers.agentBindings.".length)}`;
|
|
1507
|
+
const override = SETTINGS_CENTER_V2_PATH_OVERRIDES[id];
|
|
1508
|
+
if (override !== undefined) return override;
|
|
1509
|
+
for (const [v1Path, v2Path] of SETTINGS_V1_PATH_MOVES) {
|
|
1510
|
+
if (v1Path === id) return v2Path;
|
|
1511
|
+
if (v1Path === `${id}[]` && v2Path.endsWith("[]")) return v2Path.slice(0, -2);
|
|
1512
|
+
}
|
|
1513
|
+
return id;
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1492
1516
|
function settingItem(
|
|
1493
1517
|
id: EditableSettingId,
|
|
1494
1518
|
currentValue: string,
|
|
@@ -1511,7 +1535,7 @@ function settingItem(
|
|
|
1511
1535
|
currentValue,
|
|
1512
1536
|
description: options.description ?? SETTINGS_DESCRIPTIONS_BY_ID[id as keyof typeof SETTINGS_LABELS_BY_ID],
|
|
1513
1537
|
section: sectionForSetting(id),
|
|
1514
|
-
configPath: id,
|
|
1538
|
+
configPath: settingsV2PathForRow(id),
|
|
1515
1539
|
affordance: options.affordance ?? (options.values ? cycleAffordance(options.values) : "opens picker"),
|
|
1516
1540
|
scope: scopeForId(id),
|
|
1517
1541
|
readOnly: options.readOnly ?? false,
|
|
@@ -1584,7 +1608,7 @@ function thinkingChoices(
|
|
|
1584
1608
|
providers: ProvidersContract | undefined,
|
|
1585
1609
|
target: string | null,
|
|
1586
1610
|
model: string | null,
|
|
1587
|
-
level: ClioSettings["
|
|
1611
|
+
level: ClioSettings["chat"]["thinkingLevel"],
|
|
1588
1612
|
): { display: string; values: readonly string[] } {
|
|
1589
1613
|
const resolved = providers
|
|
1590
1614
|
? resolveModelRuntimeCapabilitiesForProviders(providers, target, model, level ?? "off")?.thinking
|
|
@@ -1601,37 +1625,28 @@ function thinkingChoices(
|
|
|
1601
1625
|
* read-only pointer rows (targets, keybindings, favorites, safety net) name the
|
|
1602
1626
|
* surface that owns them so the Center has no dead-but-tappable rows.
|
|
1603
1627
|
*/
|
|
1604
|
-
|
|
1605
|
-
settings: Readonly<ClioSettings>,
|
|
1606
|
-
options?: BuildSettingItemsOptions,
|
|
1607
|
-
): SettingsCenterItem[] {
|
|
1628
|
+
function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSettingItemsOptions): SettingsCenterItem[] {
|
|
1608
1629
|
const live = options?.getSettings ?? ((): Readonly<ClioSettings> => settings);
|
|
1609
|
-
const scopeList = settings.
|
|
1630
|
+
const scopeList = settings.chat.modelPicker.cycleSet ?? [];
|
|
1610
1631
|
const scopeText = scopeList.length > 0 ? scopeList.join(", ") : "(empty)";
|
|
1611
|
-
const compaction = settings.compaction;
|
|
1612
|
-
const retry = settings.retry;
|
|
1613
|
-
const terminal = settings.
|
|
1614
|
-
const watchdog = settings.
|
|
1615
|
-
const panes = settings.panes;
|
|
1632
|
+
const compaction = settings.context.compaction;
|
|
1633
|
+
const retry = settings.chat.retry;
|
|
1634
|
+
const terminal = settings.interface;
|
|
1635
|
+
const watchdog = settings.safety.review;
|
|
1636
|
+
const panes = settings.interface.panes;
|
|
1616
1637
|
const orchestratorThinking = thinkingChoices(
|
|
1617
1638
|
options?.providers,
|
|
1618
|
-
settings.
|
|
1619
|
-
settings.
|
|
1620
|
-
settings.
|
|
1639
|
+
settings.chat.target,
|
|
1640
|
+
settings.chat.model,
|
|
1641
|
+
settings.chat.thinkingLevel,
|
|
1621
1642
|
);
|
|
1622
1643
|
const workerThinking = thinkingChoices(
|
|
1623
1644
|
options?.providers,
|
|
1624
|
-
settings.
|
|
1625
|
-
settings.
|
|
1626
|
-
settings.
|
|
1627
|
-
);
|
|
1628
|
-
const backgroundThinking = thinkingChoices(
|
|
1629
|
-
options?.providers,
|
|
1630
|
-
settings.background.target,
|
|
1631
|
-
settings.background.model,
|
|
1632
|
-
settings.background.thinkingLevel,
|
|
1645
|
+
settings.fleet.default.target,
|
|
1646
|
+
settings.fleet.default.model,
|
|
1647
|
+
settings.fleet.default.thinkingLevel,
|
|
1633
1648
|
);
|
|
1634
|
-
const profileCount = Object.keys(settings.
|
|
1649
|
+
const profileCount = Object.keys(settings.fleet.profiles ?? {}).length;
|
|
1635
1650
|
const addProfileSubmenu = chainSubmenus(
|
|
1636
1651
|
textInputSubmenu("New profile name"),
|
|
1637
1652
|
() => selectListSubmenu("Select the profile's target", profileTargetChoices(live, options?.providers)),
|
|
@@ -1644,34 +1659,35 @@ export function buildSettingItems(
|
|
|
1644
1659
|
);
|
|
1645
1660
|
const targetSubmenu = options?.providers ? selectTargetSubmenu(options.providers) : editTextSubmenu("Type target id");
|
|
1646
1661
|
const orchestratorModelSubmenu = options?.providers
|
|
1647
|
-
? selectModelSubmenu(options.providers, () => live().
|
|
1662
|
+
? selectModelSubmenu(options.providers, () => live().chat.target ?? undefined)
|
|
1648
1663
|
: editTextSubmenu("Type model name");
|
|
1649
1664
|
const workerModelSubmenu = options?.providers
|
|
1650
|
-
? selectModelSubmenu(options.providers, () => live().
|
|
1665
|
+
? selectModelSubmenu(options.providers, () => live().fleet.default.target ?? undefined)
|
|
1651
1666
|
: editTextSubmenu("Type model name");
|
|
1652
1667
|
const backgroundTargetSubmenu = options?.providers
|
|
1653
1668
|
? selectOptionalBackgroundTargetSubmenu(options.providers)
|
|
1654
1669
|
: editTextSubmenu("Type memory target id", "Leave blank for rules-only memory.");
|
|
1655
1670
|
const backgroundModelSubmenu = options?.providers
|
|
1656
|
-
? selectModelSubmenu(options.providers, () => live().
|
|
1671
|
+
? selectModelSubmenu(options.providers, () => live().context.memory.target ?? undefined)
|
|
1657
1672
|
: editTextSubmenu("Type memory model name");
|
|
1658
1673
|
// Both are optional in the settings type, so the row falls back to the
|
|
1659
1674
|
// shipped value rather than rendering a blank for a key that is in force.
|
|
1660
|
-
const escalation = settings.
|
|
1661
|
-
const resilienceCooldownMs = settings.
|
|
1675
|
+
const escalation = settings.fleet.permissions.escalation ?? SHIPPED_ESCALATION;
|
|
1676
|
+
const resilienceCooldownMs = settings.fleet.retry.routeCooldownMs ?? SHIPPED_RESILIENCE_COOLDOWN_MS;
|
|
1662
1677
|
const workingSet = settings.context.workingSet;
|
|
1663
|
-
const
|
|
1664
|
-
const
|
|
1665
|
-
const
|
|
1666
|
-
const
|
|
1667
|
-
const
|
|
1668
|
-
const
|
|
1669
|
-
const
|
|
1678
|
+
const safetyLimits = settings.safety.limits;
|
|
1679
|
+
const fleetLimits = settings.fleet.limits;
|
|
1680
|
+
const routing = settings.fleet.adaptiveRouting;
|
|
1681
|
+
const library = settings.integrations.library;
|
|
1682
|
+
const activeAgentRoles = routing.agentRoles;
|
|
1683
|
+
const favorites = settings.chat.modelPicker?.favorites ?? [];
|
|
1684
|
+
const agents = settings.integrations.externalAgents?.entries ?? [];
|
|
1685
|
+
const keybindingCount = Object.keys(settings.interface.keybindings ?? {}).length;
|
|
1670
1686
|
return [
|
|
1671
|
-
settingItem("autonomy", settings.autonomy, {
|
|
1687
|
+
settingItem("autonomy", settings.safety.autonomy, {
|
|
1672
1688
|
values: ["read-only", "suggest", "auto-edit", "full-auto"],
|
|
1673
1689
|
}),
|
|
1674
|
-
settingItem("workers.onPermission", settings.
|
|
1690
|
+
settingItem("workers.onPermission", settings.fleet.permissions.mode ?? "deny", {
|
|
1675
1691
|
values: ["deny", "fail", "escalate"],
|
|
1676
1692
|
}),
|
|
1677
1693
|
settingItem("workers.escalation.timeoutMs", String(escalation.timeoutMs), {
|
|
@@ -1681,10 +1697,10 @@ export function buildSettingItems(
|
|
|
1681
1697
|
settingItem("workers.escalation.fallback", escalation.fallback, {
|
|
1682
1698
|
values: ["deny", "fail"],
|
|
1683
1699
|
}),
|
|
1684
|
-
settingItem("delegation.defaults.toolGovernance", settings.
|
|
1685
|
-
values: ["clio-policy", "agent-managed", "deny-all"],
|
|
1700
|
+
settingItem("delegation.defaults.toolGovernance", settings.integrations.externalAgents.defaults.toolGovernance, {
|
|
1701
|
+
values: ["clio-coder-policy", "agent-managed", "deny-all"],
|
|
1686
1702
|
}),
|
|
1687
|
-
settingItem("skills.trustProjectCompatRoots", String(settings.
|
|
1703
|
+
settingItem("skills.trustProjectCompatRoots", String(settings.integrations.projectResources.trustProjectImports), {
|
|
1688
1704
|
values: ["false", "true"],
|
|
1689
1705
|
}),
|
|
1690
1706
|
settingItem("safetyNet", "always on", {
|
|
@@ -1694,56 +1710,53 @@ export function buildSettingItems(
|
|
|
1694
1710
|
settingItem("orchestrator.thinkingLevel", orchestratorThinking.display, {
|
|
1695
1711
|
values: orchestratorThinking.values,
|
|
1696
1712
|
}),
|
|
1697
|
-
settingItem("orchestrator.target", settings.
|
|
1713
|
+
settingItem("orchestrator.target", settings.chat.target ?? "(unset)", {
|
|
1698
1714
|
submenu: targetSubmenu,
|
|
1699
1715
|
affordance: options?.providers ? "opens picker" : "free text",
|
|
1700
1716
|
}),
|
|
1701
|
-
settingItem("orchestrator.model", settings.
|
|
1717
|
+
settingItem("orchestrator.model", settings.chat.model ?? "(unset)", {
|
|
1702
1718
|
submenu: orchestratorModelSubmenu,
|
|
1703
1719
|
affordance: options?.providers ? "opens picker" : "free text",
|
|
1704
1720
|
}),
|
|
1705
|
-
settingItem("background.target", settings.
|
|
1721
|
+
settingItem("background.target", settings.context.memory.target ?? "(unset — rules-only)", {
|
|
1706
1722
|
submenu: backgroundTargetSubmenu,
|
|
1707
1723
|
affordance: options?.providers ? "opens picker" : "free text",
|
|
1708
1724
|
}),
|
|
1709
|
-
settingItem("background.model", settings.
|
|
1725
|
+
settingItem("background.model", settings.context.memory.model ?? "(unset)", {
|
|
1710
1726
|
submenu: backgroundModelSubmenu,
|
|
1711
1727
|
affordance: options?.providers ? "opens picker" : "free text",
|
|
1712
1728
|
}),
|
|
1713
|
-
settingItem("
|
|
1714
|
-
values: backgroundThinking.values,
|
|
1715
|
-
}),
|
|
1716
|
-
settingItem("memory.intervention.enabled", String(settings.memory.intervention.enabled), {
|
|
1729
|
+
settingItem("memory.intervention.enabled", String(settings.context.memory.enabled), {
|
|
1717
1730
|
values: ["true", "false"],
|
|
1718
1731
|
}),
|
|
1719
|
-
settingItem("memory.intervention.everyNTools", String(settings.memory.
|
|
1732
|
+
settingItem("memory.intervention.everyNTools", String(settings.context.memory.cadenceToolCalls), {
|
|
1720
1733
|
values: ["5", "10", "20", "30"],
|
|
1721
1734
|
}),
|
|
1722
|
-
settingItem("memory.intervention.windowSteps", String(settings.memory.
|
|
1735
|
+
settingItem("memory.intervention.windowSteps", String(settings.context.memory.trajectorySteps), {
|
|
1723
1736
|
values: ["4", "8", "12", "20"],
|
|
1724
1737
|
}),
|
|
1725
|
-
settingItem("memory.intervention.maxTokens", String(settings.memory.
|
|
1738
|
+
settingItem("memory.intervention.maxTokens", String(settings.context.memory.maxOutputTokens), {
|
|
1726
1739
|
values: ["100", "200", "400", "800"],
|
|
1727
1740
|
}),
|
|
1728
|
-
settingItem("memory.intervention.timeoutMs", String(settings.memory.
|
|
1741
|
+
settingItem("memory.intervention.timeoutMs", String(settings.context.memory.timeoutMs), {
|
|
1729
1742
|
values: ["5000", "10000", "20000", "30000", "60000"],
|
|
1730
1743
|
}),
|
|
1731
|
-
settingItem("prewarm.enabled", String(settings.prewarm
|
|
1744
|
+
settingItem("prewarm.enabled", String(settings.chat.prewarm), {
|
|
1732
1745
|
values: ["true", "false"],
|
|
1733
1746
|
}),
|
|
1734
1747
|
fleetGroupHeader("fleet.group.defaults", "Defaults"),
|
|
1735
|
-
settingItem("workers.default.target", settings.
|
|
1748
|
+
settingItem("workers.default.target", settings.fleet.default.target ?? "(unset)", {
|
|
1736
1749
|
submenu: targetSubmenu,
|
|
1737
1750
|
affordance: options?.providers ? "opens picker" : "free text",
|
|
1738
1751
|
}),
|
|
1739
|
-
settingItem("workers.default.model", settings.
|
|
1752
|
+
settingItem("workers.default.model", settings.fleet.default.model ?? "(unset)", {
|
|
1740
1753
|
submenu: workerModelSubmenu,
|
|
1741
1754
|
affordance: options?.providers ? "opens picker" : "free text",
|
|
1742
1755
|
}),
|
|
1743
1756
|
settingItem("workers.default.thinkingLevel", workerThinking.display, {
|
|
1744
1757
|
values: workerThinking.values,
|
|
1745
1758
|
}),
|
|
1746
|
-
settingItem("workers.maxRetries", String(settings.
|
|
1759
|
+
settingItem("workers.maxRetries", String(settings.fleet.retry.maxRetries), {
|
|
1747
1760
|
values: ["0", "1", "2", "3", "5", "8"],
|
|
1748
1761
|
}),
|
|
1749
1762
|
settingItem("workers.resilienceCooldownMs", String(resilienceCooldownMs), {
|
|
@@ -1769,20 +1782,16 @@ export function buildSettingItems(
|
|
|
1769
1782
|
valueSegments: [],
|
|
1770
1783
|
}),
|
|
1771
1784
|
fleetGroupHeader("fleet.group.route-activation", "Route activation"),
|
|
1772
|
-
settingItem("routing.activeRoles", routing.
|
|
1785
|
+
settingItem("routing.activeRoles", routing.roles.length > 0 ? routing.roles.join(", ") : "(none)", {
|
|
1773
1786
|
submenu: editEnumListSubmenu("Edit active routing roles", ACTIVE_ROUTING_ROLES),
|
|
1774
1787
|
affordance: `free text from ${ACTIVE_ROUTING_ROLES.join(", ")}`,
|
|
1775
|
-
editValue: routing.
|
|
1788
|
+
editValue: routing.roles.join(", "),
|
|
1789
|
+
}),
|
|
1790
|
+
settingItem("routing.activePostures", routing.postures.length > 0 ? routing.postures.join(", ") : "(none)", {
|
|
1791
|
+
submenu: editEnumListSubmenu("Edit active routing postures", ACTIVE_ROUTING_POSTURES),
|
|
1792
|
+
affordance: `free text from ${ACTIVE_ROUTING_POSTURES.join(", ")}`,
|
|
1793
|
+
editValue: routing.postures.join(", "),
|
|
1776
1794
|
}),
|
|
1777
|
-
settingItem(
|
|
1778
|
-
"routing.activePostures",
|
|
1779
|
-
routing.activePostures.length > 0 ? routing.activePostures.join(", ") : "(none)",
|
|
1780
|
-
{
|
|
1781
|
-
submenu: editEnumListSubmenu("Edit active routing postures", ACTIVE_ROUTING_POSTURES),
|
|
1782
|
-
affordance: `free text from ${ACTIVE_ROUTING_POSTURES.join(", ")}`,
|
|
1783
|
-
editValue: routing.activePostures.join(", "),
|
|
1784
|
-
},
|
|
1785
|
-
),
|
|
1786
1795
|
settingItem(
|
|
1787
1796
|
"routing.agentAutomation.activeAgentRoles",
|
|
1788
1797
|
activeAgentRoles.length > 0
|
|
@@ -1796,7 +1805,12 @@ export function buildSettingItems(
|
|
|
1796
1805
|
fleetGroupHeader("fleet.group.panes", "Panes"),
|
|
1797
1806
|
settingItem("panes.enabled", panes.enabled, { values: ["auto", "embedded", "off"] }),
|
|
1798
1807
|
settingItem("panes.notifications", panes.notifications, { values: ["failures", "all", "off"] }),
|
|
1799
|
-
settingItem("panes.
|
|
1808
|
+
settingItem("panes.layout", panes.layout, { values: ["off", "workers", "cockpit"] }),
|
|
1809
|
+
settingItem("panes.workers.ratio", formatThreshold(panes.workers.ratio, "0.34"), {
|
|
1810
|
+
submenu: editNumberSubmenu("Edit workers dock share (0.05–0.5)", "panes.workers.ratio"),
|
|
1811
|
+
affordance: "free text",
|
|
1812
|
+
}),
|
|
1813
|
+
settingItem("panes.journal", String(settings.fleet.history.journal), { values: ["true", "false"] }),
|
|
1800
1814
|
settingItem("targets", "", {
|
|
1801
1815
|
description: "Live inference target inventory and routing roles.",
|
|
1802
1816
|
affordance: "column heading",
|
|
@@ -1810,21 +1824,21 @@ export function buildSettingItems(
|
|
|
1810
1824
|
submenu: scopedModelsSubmenu(scopeList, options?.providers),
|
|
1811
1825
|
affordance: "opens provider-backed checklist",
|
|
1812
1826
|
}),
|
|
1813
|
-
settingItem("modelSelector.recentLimit", String(settings.
|
|
1827
|
+
settingItem("modelSelector.recentLimit", String(settings.chat.modelPicker.recentLimit), {
|
|
1814
1828
|
values: ["6", "12", "20", "50"],
|
|
1815
1829
|
}),
|
|
1816
1830
|
settingItem("modelSelector.favorites", favorites.length > 0 ? `${favorites.length} pinned` : "(none)", {
|
|
1817
1831
|
affordance: "manage in /model",
|
|
1818
1832
|
readOnly: true,
|
|
1819
1833
|
}),
|
|
1820
|
-
settingItem("budget.sessionCeilingUsd", String(settings.
|
|
1834
|
+
settingItem("budget.sessionCeilingUsd", String(settings.safety.limits.sessionCostUsd), {
|
|
1821
1835
|
submenu: editNumberSubmenu("Edit session cost ceiling USD", "budget.sessionCeilingUsd"),
|
|
1822
1836
|
affordance: "free text",
|
|
1823
1837
|
}),
|
|
1824
|
-
settingItem("defaults.maxTokens", String(settings.
|
|
1838
|
+
settingItem("defaults.maxTokens", String(settings.chat.maxOutputTokens), {
|
|
1825
1839
|
values: ["0", "4096", "8192", "16384", "32768", "65536", "131072"],
|
|
1826
1840
|
}),
|
|
1827
|
-
settingItem("budget.concurrency", String(settings.
|
|
1841
|
+
settingItem("budget.concurrency", String(settings.fleet.concurrency), {
|
|
1828
1842
|
values: ["auto", "1", "2", "4", "8"],
|
|
1829
1843
|
}),
|
|
1830
1844
|
groupHeader(
|
|
@@ -1833,27 +1847,27 @@ export function buildSettingItems(
|
|
|
1833
1847
|
"Guardrails",
|
|
1834
1848
|
"Numeric backstops that bound runaway agent behavior.",
|
|
1835
1849
|
),
|
|
1836
|
-
settingItem("guardrails.turnToolCallBudget", String(
|
|
1850
|
+
settingItem("guardrails.turnToolCallBudget", String(safetyLimits.chatToolCallsPerTurn), {
|
|
1837
1851
|
submenu: editNumberSubmenu("Edit turn tool-call budget", "guardrails.turnToolCallBudget"),
|
|
1838
1852
|
affordance: "free text",
|
|
1839
1853
|
}),
|
|
1840
|
-
settingItem("guardrails.workerToolCallCap", String(
|
|
1854
|
+
settingItem("guardrails.workerToolCallCap", String(fleetLimits.toolCallsPerRun), {
|
|
1841
1855
|
submenu: editNumberSubmenu("Edit worker tool-call cap", "guardrails.workerToolCallCap"),
|
|
1842
1856
|
affordance: "free text",
|
|
1843
1857
|
}),
|
|
1844
|
-
settingItem("guardrails.maxDispatchRuns", String(
|
|
1858
|
+
settingItem("guardrails.maxDispatchRuns", String(settings.fleet.history.maxRuns), {
|
|
1845
1859
|
submenu: editNumberSubmenu("Edit run ledger retention", "guardrails.maxDispatchRuns"),
|
|
1846
1860
|
affordance: "free text",
|
|
1847
1861
|
}),
|
|
1848
|
-
settingItem("guardrails.readMaxBytes", String(
|
|
1862
|
+
settingItem("guardrails.readMaxBytes", String(safetyLimits.readBytesPerCall), {
|
|
1849
1863
|
submenu: editNumberSubmenu("Edit read byte cap", "guardrails.readMaxBytes"),
|
|
1850
1864
|
affordance: "free text",
|
|
1851
1865
|
}),
|
|
1852
|
-
settingItem("guardrails.observationTurnBudgetBytes", String(
|
|
1866
|
+
settingItem("guardrails.observationTurnBudgetBytes", String(safetyLimits.observationBytesPerTurn), {
|
|
1853
1867
|
submenu: editNumberSubmenu("Edit observation byte pool", "guardrails.observationTurnBudgetBytes"),
|
|
1854
1868
|
affordance: "free text",
|
|
1855
1869
|
}),
|
|
1856
|
-
settingItem("guardrails.internalDispatchTimeoutMs", String(
|
|
1870
|
+
settingItem("guardrails.internalDispatchTimeoutMs", String(fleetLimits.internalRunTimeoutMs), {
|
|
1857
1871
|
submenu: editNumberSubmenu("Edit internal dispatch timeout (ms)", "guardrails.internalDispatchTimeoutMs"),
|
|
1858
1872
|
affordance: "free text",
|
|
1859
1873
|
}),
|
|
@@ -1863,9 +1877,6 @@ export function buildSettingItems(
|
|
|
1863
1877
|
settingItem("compaction.threshold", formatThreshold(compaction.threshold), {
|
|
1864
1878
|
values: ["0.7", "0.8", "0.85", "0.9"],
|
|
1865
1879
|
}),
|
|
1866
|
-
settingItem("compaction.excludeLastTurns", String(compaction.excludeLastTurns), {
|
|
1867
|
-
values: ["3", "6", "10", "15"],
|
|
1868
|
-
}),
|
|
1869
1880
|
groupHeader(
|
|
1870
1881
|
"compaction.group.working-set",
|
|
1871
1882
|
"compaction",
|
|
@@ -1902,13 +1913,13 @@ export function buildSettingItems(
|
|
|
1902
1913
|
settingItem("retry.streamStallMs", String(retry.streamStallMs), {
|
|
1903
1914
|
values: ["60000", "120000", "180000", "300000", "600000"],
|
|
1904
1915
|
}),
|
|
1905
|
-
settingItem("terminal.showTerminalProgress", String(terminal.
|
|
1916
|
+
settingItem("terminal.showTerminalProgress", String(terminal.terminalProgress), {
|
|
1906
1917
|
values: ["false", "true"],
|
|
1907
1918
|
}),
|
|
1908
|
-
settingItem("terminal.outputVerbosity", terminal.
|
|
1919
|
+
settingItem("terminal.outputVerbosity", terminal.outputDetail, {
|
|
1909
1920
|
values: ["minimal", "default", "verbose"],
|
|
1910
1921
|
}),
|
|
1911
|
-
settingItem("terminal.tuiMode", terminal.
|
|
1922
|
+
settingItem("terminal.tuiMode", terminal.mode, {
|
|
1912
1923
|
values: ["regular", "fullscreen"],
|
|
1913
1924
|
}),
|
|
1914
1925
|
settingItem("terminal.fullscreenScrollbar", terminal.fullscreenScrollbar, {
|
|
@@ -1917,18 +1928,18 @@ export function buildSettingItems(
|
|
|
1917
1928
|
settingItem("terminal.smoothStreaming", terminal.smoothStreaming, {
|
|
1918
1929
|
values: ["off", "auto", "on"],
|
|
1919
1930
|
}),
|
|
1920
|
-
settingItem("terminal.notify", String(terminal.
|
|
1931
|
+
settingItem("terminal.notify", String(terminal.desktopNotifications), {
|
|
1921
1932
|
values: ["false", "true"],
|
|
1922
1933
|
}),
|
|
1923
|
-
settingItem("theme", settings.theme, {
|
|
1924
|
-
affordance: "single clio-coder palette",
|
|
1925
|
-
readOnly: true,
|
|
1926
|
-
}),
|
|
1927
1934
|
terminalGroupHeader("terminal.group.files-pane", "Files pane"),
|
|
1928
|
-
settingItem("panes.yazi.enabled", String(panes.
|
|
1929
|
-
settingItem("panes.yazi.mode", panes.
|
|
1930
|
-
settingItem("panes.yazi.profile", panes.
|
|
1931
|
-
settingItem("panes.yazi.followCwd", String(panes.
|
|
1935
|
+
settingItem("panes.yazi.enabled", String(panes.files.enabled), { values: ["true", "false"] }),
|
|
1936
|
+
settingItem("panes.yazi.mode", panes.files.mode, { values: ["companion", "chooser"] }),
|
|
1937
|
+
settingItem("panes.yazi.profile", panes.files.profile, { values: ["managed", "user"] }),
|
|
1938
|
+
settingItem("panes.yazi.followCwd", String(panes.files.followCwd), { values: ["true", "false"] }),
|
|
1939
|
+
settingItem("panes.yazi.ratio", formatThreshold(panes.files.ratio, "0.3"), {
|
|
1940
|
+
submenu: editNumberSubmenu("Edit files dock share (0.05–0.5)", "panes.yazi.ratio"),
|
|
1941
|
+
affordance: "free text",
|
|
1942
|
+
}),
|
|
1932
1943
|
settingItem("watchdog.enabled", String(watchdog.enabled), {
|
|
1933
1944
|
values: ["false", "true"],
|
|
1934
1945
|
}),
|
|
@@ -1952,11 +1963,15 @@ export function buildSettingItems(
|
|
|
1952
1963
|
editValue: watchdog.cadenceToolCalls === undefined ? "" : String(watchdog.cadenceToolCalls),
|
|
1953
1964
|
},
|
|
1954
1965
|
),
|
|
1955
|
-
settingItem(
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
|
|
1959
|
-
|
|
1966
|
+
settingItem(
|
|
1967
|
+
"runtimePlugins",
|
|
1968
|
+
settings.integrations.runtimePlugins.length > 0 ? settings.integrations.runtimePlugins.join(", ") : "(none)",
|
|
1969
|
+
{
|
|
1970
|
+
submenu: editTextSubmenu("Edit runtime plugins comma-separated list", "Restart Clio to load changes."),
|
|
1971
|
+
affordance: "free text",
|
|
1972
|
+
},
|
|
1973
|
+
),
|
|
1974
|
+
settingItem("attribution.gitCommits", settings.integrations.git.commitAttribution ? "enabled" : "disabled", {
|
|
1960
1975
|
values: ["enabled", "disabled"],
|
|
1961
1976
|
}),
|
|
1962
1977
|
settingItem("compaction.model", compaction.model ?? "(orchestrator target)", {
|
|
@@ -1967,18 +1982,30 @@ export function buildSettingItems(
|
|
|
1967
1982
|
submenu: editTextSubmenu("Edit compaction prompt path; blank uses the built-in"),
|
|
1968
1983
|
affordance: "free text",
|
|
1969
1984
|
}),
|
|
1970
|
-
settingItem(
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
settingItem(
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1985
|
+
settingItem(
|
|
1986
|
+
"delegation.defaults.connectTimeoutMs",
|
|
1987
|
+
String(settings.integrations.externalAgents.defaults.connectTimeoutMs),
|
|
1988
|
+
{
|
|
1989
|
+
submenu: editNumberSubmenu("Edit delegate connect timeout (ms)", "delegation.defaults.connectTimeoutMs"),
|
|
1990
|
+
affordance: "free text",
|
|
1991
|
+
},
|
|
1992
|
+
),
|
|
1993
|
+
settingItem(
|
|
1994
|
+
"delegation.defaults.turnTimeoutMs",
|
|
1995
|
+
String(settings.integrations.externalAgents.defaults.turnTimeoutMs),
|
|
1996
|
+
{
|
|
1997
|
+
submenu: editNumberSubmenu("Edit delegate turn timeout (ms)", "delegation.defaults.turnTimeoutMs"),
|
|
1998
|
+
affordance: "free text",
|
|
1999
|
+
},
|
|
2000
|
+
),
|
|
2001
|
+
settingItem(
|
|
2002
|
+
"delegation.defaults.permissionTimeoutMs",
|
|
2003
|
+
String(settings.integrations.externalAgents.defaults.permissionTimeoutMs),
|
|
2004
|
+
{
|
|
2005
|
+
submenu: editNumberSubmenu("Edit delegate permission timeout (ms)", "delegation.defaults.permissionTimeoutMs"),
|
|
2006
|
+
affordance: "free text",
|
|
2007
|
+
},
|
|
2008
|
+
),
|
|
1982
2009
|
settingItem("keybindings", keybindingCount > 0 ? `${keybindingCount} override(s)` : "(defaults)", {
|
|
1983
2010
|
affordance: "edit settings.yaml",
|
|
1984
2011
|
readOnly: true,
|
|
@@ -2020,7 +2047,7 @@ function fleetProfileRows(
|
|
|
2020
2047
|
options: BuildSettingItemsOptions | undefined,
|
|
2021
2048
|
): SettingsCenterItem[] {
|
|
2022
2049
|
const providers = options?.providers;
|
|
2023
|
-
return Object.entries(settings.
|
|
2050
|
+
return Object.entries(settings.fleet.profiles)
|
|
2024
2051
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
2025
2052
|
.map(([name, profile]) => {
|
|
2026
2053
|
const thinking = thinkingChoices(providers, profile.target, profile.model, profile.thinkingLevel);
|
|
@@ -2030,7 +2057,7 @@ function fleetProfileRows(
|
|
|
2030
2057
|
const summary = `${target}/${model} ${thinking.display} ${placement}`;
|
|
2031
2058
|
const compactThinking = truncateProfileFact(thinking.display, 7);
|
|
2032
2059
|
const compactPlacement = truncateProfileFact(placement, 7);
|
|
2033
|
-
const route = target === settings.
|
|
2060
|
+
const route = target === settings.fleet.default.target ? model : `${target}/${model}`;
|
|
2034
2061
|
const routeBudget = Math.max(
|
|
2035
2062
|
8,
|
|
2036
2063
|
PROFILE_SUMMARY_VALUE_BUDGET -
|
|
@@ -2042,7 +2069,7 @@ function fleetProfileRows(
|
|
|
2042
2069
|
return settingItem(`workers.profiles.${name}`, summary, {
|
|
2043
2070
|
label: name,
|
|
2044
2071
|
description: `Profile ${name}. Enter to edit its target, model, thinking level, placement, or remove it.`,
|
|
2045
|
-
help: ["target", "model", "thinkingLevel", "node"].map((field) => `
|
|
2072
|
+
help: ["target", "model", "thinkingLevel", "node"].map((field) => `fleet.profiles.${name}.${field}`).join(" · "),
|
|
2046
2073
|
submenu: profileWorkbenchSubmenu(name, settings, live, options),
|
|
2047
2074
|
affordance: "Enter: drill into profile fields",
|
|
2048
2075
|
valueSegments: [
|
|
@@ -2078,7 +2105,7 @@ function profileWorkbenchSubmenu(
|
|
|
2078
2105
|
done();
|
|
2079
2106
|
return;
|
|
2080
2107
|
}
|
|
2081
|
-
const profile = live().
|
|
2108
|
+
const profile = live().fleet.profiles[name];
|
|
2082
2109
|
if (!profile) {
|
|
2083
2110
|
done();
|
|
2084
2111
|
return;
|
|
@@ -2099,7 +2126,7 @@ function profileWorkbenchSubmenu(
|
|
|
2099
2126
|
}
|
|
2100
2127
|
if (field === "model") {
|
|
2101
2128
|
const submenu = options?.providers
|
|
2102
|
-
? selectModelSubmenu(options.providers, () => live().
|
|
2129
|
+
? selectModelSubmenu(options.providers, () => live().fleet.profiles[name]?.target ?? undefined)
|
|
2103
2130
|
: editTextSubmenu("Type model name");
|
|
2104
2131
|
active = submenu(profile.model ?? "(unset)", finish);
|
|
2105
2132
|
return;
|
|
@@ -2147,10 +2174,10 @@ function profileNodeChoices(
|
|
|
2147
2174
|
}
|
|
2148
2175
|
|
|
2149
2176
|
function agentBindingRows(settings: Readonly<ClioSettings>, live: () => Readonly<ClioSettings>): SettingsCenterItem[] {
|
|
2150
|
-
return Object.entries(settings.
|
|
2177
|
+
return Object.entries(settings.fleet.agentProfiles)
|
|
2151
2178
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
2152
2179
|
.map(([agentId, profileName]) => {
|
|
2153
|
-
const missing = !settings.
|
|
2180
|
+
const missing = !settings.fleet.profiles[profileName];
|
|
2154
2181
|
return settingItem(`workers.agentBindings.${agentId}`, profileName, {
|
|
2155
2182
|
label: `${agentId} · profile`,
|
|
2156
2183
|
description: missing
|
|
@@ -2173,9 +2200,9 @@ function targetRows(
|
|
|
2173
2200
|
return settings.targets.map((target) => {
|
|
2174
2201
|
const status = statuses.get(target.id);
|
|
2175
2202
|
const roles = [
|
|
2176
|
-
settings.
|
|
2177
|
-
settings.
|
|
2178
|
-
settings.
|
|
2203
|
+
settings.chat.target === target.id ? "chat" : null,
|
|
2204
|
+
settings.fleet.default.target === target.id ? "fleet" : null,
|
|
2205
|
+
settings.context.memory.target === target.id ? "memory" : null,
|
|
2179
2206
|
].filter((role) => role !== null);
|
|
2180
2207
|
const health = status?.health.status ?? "unknown";
|
|
2181
2208
|
const operation = options?.getTargetOperation?.(target.id) ?? null;
|
|
@@ -2288,7 +2315,7 @@ function fleetEndpointRows(providers: ProvidersContract | undefined): SettingsCe
|
|
|
2288
2315
|
});
|
|
2289
2316
|
}
|
|
2290
2317
|
|
|
2291
|
-
|
|
2318
|
+
function buildSettingsSections(items: readonly SettingsCenterItem[]): SettingsCenterSection[] {
|
|
2292
2319
|
return SETTINGS_SECTIONS.map((section) => ({
|
|
2293
2320
|
id: section.id,
|
|
2294
2321
|
label: section.label,
|
|
@@ -2355,48 +2382,48 @@ function applyNumberSetting(id: NumberSettingId, value: string, set: (next: numb
|
|
|
2355
2382
|
function applyDelegationAgentChange(settings: ClioSettings, value: string): void {
|
|
2356
2383
|
if (value.startsWith(DELEGATION_REMOVE_PREFIX)) {
|
|
2357
2384
|
const id = value.slice(DELEGATION_REMOVE_PREFIX.length);
|
|
2358
|
-
settings.
|
|
2385
|
+
settings.integrations.externalAgents.entries = settings.integrations.externalAgents.entries.filter(
|
|
2386
|
+
(agent) => agent.id !== id,
|
|
2387
|
+
);
|
|
2359
2388
|
return;
|
|
2360
2389
|
}
|
|
2361
2390
|
if (!value.startsWith(DELEGATION_ADD_PREFIX)) return;
|
|
2362
2391
|
const kind = interopAgentKind(value.slice(DELEGATION_ADD_PREFIX.length) as InteropAgentId);
|
|
2363
2392
|
if (kind?.acp === undefined) return;
|
|
2364
|
-
const entry = delegationEntryForKind(kind, settings.
|
|
2365
|
-
if (settings.
|
|
2366
|
-
settings.
|
|
2393
|
+
const entry = delegationEntryForKind(kind, settings.integrations.externalAgents.defaults);
|
|
2394
|
+
if (settings.integrations.externalAgents.entries.some((agent) => agent.id === entry.id)) return;
|
|
2395
|
+
settings.integrations.externalAgents.entries.push(entry);
|
|
2367
2396
|
}
|
|
2368
2397
|
|
|
2369
|
-
|
|
2398
|
+
function applySettingChange(settings: ClioSettings, id: string, value: string): void {
|
|
2370
2399
|
if (applyEntrySettingChange(settings, id, value)) return;
|
|
2371
2400
|
switch (id) {
|
|
2372
2401
|
case "autonomy":
|
|
2373
2402
|
if (value === "read-only" || value === "suggest" || value === "auto-edit" || value === "full-auto")
|
|
2374
|
-
settings.autonomy = value;
|
|
2403
|
+
settings.safety.autonomy = value;
|
|
2375
2404
|
return;
|
|
2376
2405
|
case "workers.onPermission":
|
|
2377
|
-
if (value === "deny" || value === "fail" || value === "escalate") settings.
|
|
2406
|
+
if (value === "deny" || value === "fail" || value === "escalate") settings.fleet.permissions.mode = value;
|
|
2378
2407
|
return;
|
|
2379
2408
|
case "delegation.defaults.toolGovernance":
|
|
2380
|
-
if (value === "clio-policy" || value === "agent-managed" || value === "deny-all")
|
|
2381
|
-
settings.
|
|
2409
|
+
if (value === "clio-coder-policy" || value === "agent-managed" || value === "deny-all")
|
|
2410
|
+
settings.integrations.externalAgents.defaults.toolGovernance = value;
|
|
2382
2411
|
return;
|
|
2383
2412
|
case "delegation.agents":
|
|
2384
2413
|
applyDelegationAgentChange(settings, value);
|
|
2385
2414
|
return;
|
|
2386
2415
|
case "skills.trustProjectCompatRoots":
|
|
2387
|
-
if (value === "true" || value === "false")
|
|
2416
|
+
if (value === "true" || value === "false")
|
|
2417
|
+
settings.integrations.projectResources.trustProjectImports = value === "true";
|
|
2388
2418
|
return;
|
|
2389
2419
|
case "attribution.gitCommits":
|
|
2390
|
-
if (value === "enabled" || value === "disabled") settings.
|
|
2420
|
+
if (value === "enabled" || value === "disabled") settings.integrations.git.commitAttribution = value === "enabled";
|
|
2391
2421
|
return;
|
|
2392
2422
|
case "orchestrator.thinkingLevel":
|
|
2393
|
-
settings.
|
|
2394
|
-
return;
|
|
2395
|
-
case "background.thinkingLevel":
|
|
2396
|
-
settings.background.thinkingLevel = thinkingLevelFromChoiceLabel(value) ?? settings.background.thinkingLevel;
|
|
2423
|
+
settings.chat.thinkingLevel = thinkingLevelFromChoiceLabel(value) ?? settings.chat.thinkingLevel;
|
|
2397
2424
|
return;
|
|
2398
2425
|
case "memory.intervention.enabled":
|
|
2399
|
-
if (value === "true" || value === "false") settings.memory.
|
|
2426
|
+
if (value === "true" || value === "false") settings.context.memory.enabled = value === "true";
|
|
2400
2427
|
return;
|
|
2401
2428
|
case "memory.intervention.everyNTools":
|
|
2402
2429
|
case "memory.intervention.windowSteps":
|
|
@@ -2404,123 +2431,139 @@ export function applySettingChange(settings: ClioSettings, id: string, value: st
|
|
|
2404
2431
|
case "memory.intervention.timeoutMs":
|
|
2405
2432
|
applyNonNegativeInteger(value, (next) => {
|
|
2406
2433
|
if (next >= 1) {
|
|
2407
|
-
|
|
2408
|
-
|
|
2434
|
+
// The v1 row ids are the presentation vocabulary; the v2 fields they
|
|
2435
|
+
// write have their own names.
|
|
2436
|
+
const key = (
|
|
2437
|
+
{
|
|
2438
|
+
"memory.intervention.everyNTools": "cadenceToolCalls",
|
|
2439
|
+
"memory.intervention.windowSteps": "trajectorySteps",
|
|
2440
|
+
"memory.intervention.maxTokens": "maxOutputTokens",
|
|
2441
|
+
"memory.intervention.timeoutMs": "timeoutMs",
|
|
2442
|
+
} as const
|
|
2443
|
+
)[id];
|
|
2444
|
+
if (key) settings.context.memory[key] = next;
|
|
2409
2445
|
}
|
|
2410
2446
|
});
|
|
2411
2447
|
return;
|
|
2412
2448
|
case "workers.default.thinkingLevel":
|
|
2413
|
-
settings.
|
|
2414
|
-
thinkingLevelFromChoiceLabel(value) ?? settings.workers.default.thinkingLevel;
|
|
2449
|
+
settings.fleet.default.thinkingLevel = thinkingLevelFromChoiceLabel(value) ?? settings.fleet.default.thinkingLevel;
|
|
2415
2450
|
return;
|
|
2416
2451
|
case "workers.maxRetries":
|
|
2417
2452
|
applyNonNegativeInteger(value, (next) => {
|
|
2418
|
-
settings.
|
|
2453
|
+
settings.fleet.retry.maxRetries = next;
|
|
2419
2454
|
});
|
|
2420
2455
|
return;
|
|
2421
2456
|
case "panes.enabled":
|
|
2422
|
-
if (value === "auto" || value === "embedded" || value === "off") settings.panes.enabled = value;
|
|
2457
|
+
if (value === "auto" || value === "embedded" || value === "off") settings.interface.panes.enabled = value;
|
|
2423
2458
|
return;
|
|
2424
2459
|
case "panes.notifications":
|
|
2425
|
-
if (value === "failures" || value === "all" || value === "off") settings.panes.notifications = value;
|
|
2460
|
+
if (value === "failures" || value === "all" || value === "off") settings.interface.panes.notifications = value;
|
|
2461
|
+
return;
|
|
2462
|
+
case "panes.layout":
|
|
2463
|
+
if (value === "off" || value === "workers" || value === "cockpit") settings.interface.panes.layout = value;
|
|
2464
|
+
return;
|
|
2465
|
+
case "panes.workers.ratio":
|
|
2466
|
+
applyNumberSetting(id, value, (next) => {
|
|
2467
|
+
if (next !== null) settings.interface.panes.workers.ratio = next;
|
|
2468
|
+
});
|
|
2469
|
+
return;
|
|
2470
|
+
case "panes.yazi.ratio":
|
|
2471
|
+
applyNumberSetting(id, value, (next) => {
|
|
2472
|
+
if (next !== null) settings.interface.panes.files.ratio = next;
|
|
2473
|
+
});
|
|
2426
2474
|
return;
|
|
2427
2475
|
case "panes.journal":
|
|
2428
|
-
if (value === "true" || value === "false") settings.
|
|
2476
|
+
if (value === "true" || value === "false") settings.fleet.history.journal = value === "true";
|
|
2429
2477
|
return;
|
|
2430
2478
|
case "panes.yazi.enabled":
|
|
2431
|
-
if (value === "true" || value === "false") settings.panes.
|
|
2479
|
+
if (value === "true" || value === "false") settings.interface.panes.files.enabled = value === "true";
|
|
2432
2480
|
return;
|
|
2433
2481
|
case "panes.yazi.mode":
|
|
2434
|
-
if (value === "companion" || value === "chooser") settings.panes.
|
|
2482
|
+
if (value === "companion" || value === "chooser") settings.interface.panes.files.mode = value;
|
|
2435
2483
|
return;
|
|
2436
2484
|
case "panes.yazi.profile":
|
|
2437
|
-
if (value === "managed" || value === "user") settings.panes.
|
|
2485
|
+
if (value === "managed" || value === "user") settings.interface.panes.files.profile = value;
|
|
2438
2486
|
return;
|
|
2439
2487
|
case "panes.yazi.followCwd":
|
|
2440
|
-
if (value === "true" || value === "false") settings.panes.
|
|
2488
|
+
if (value === "true" || value === "false") settings.interface.panes.files.followCwd = value === "true";
|
|
2441
2489
|
return;
|
|
2442
2490
|
case "modelSelector.recentLimit":
|
|
2443
2491
|
applyNonNegativeInteger(value, (next) => {
|
|
2444
|
-
if (next >= 1) settings.
|
|
2492
|
+
if (next >= 1) settings.chat.modelPicker.recentLimit = next;
|
|
2445
2493
|
});
|
|
2446
2494
|
return;
|
|
2447
2495
|
case "defaults.maxTokens":
|
|
2448
2496
|
applyNonNegativeInteger(value, (next) => {
|
|
2449
|
-
settings.
|
|
2497
|
+
settings.chat.maxOutputTokens = next;
|
|
2450
2498
|
});
|
|
2451
2499
|
return;
|
|
2452
2500
|
case "budget.concurrency": {
|
|
2453
2501
|
if (value === "auto") {
|
|
2454
|
-
settings.
|
|
2502
|
+
settings.fleet.concurrency = "auto";
|
|
2455
2503
|
return;
|
|
2456
2504
|
}
|
|
2457
2505
|
applyNonNegativeInteger(value, (next) => {
|
|
2458
|
-
if (next >= 1) settings.
|
|
2506
|
+
if (next >= 1) settings.fleet.concurrency = next;
|
|
2459
2507
|
});
|
|
2460
2508
|
return;
|
|
2461
2509
|
}
|
|
2462
2510
|
case "compaction.auto":
|
|
2463
|
-
if (value === "true" || value === "false") settings.compaction.auto = value === "true";
|
|
2464
|
-
return;
|
|
2465
|
-
case "compaction.excludeLastTurns":
|
|
2466
|
-
applyNonNegativeInteger(value, (next) => {
|
|
2467
|
-
if (next > 0) settings.compaction.excludeLastTurns = next;
|
|
2468
|
-
});
|
|
2511
|
+
if (value === "true" || value === "false") settings.context.compaction.auto = value === "true";
|
|
2469
2512
|
return;
|
|
2470
2513
|
case "compaction.threshold": {
|
|
2471
2514
|
const parsed = Number(value);
|
|
2472
|
-
if (Number.isFinite(parsed) && parsed >= 0 && parsed <= 1) settings.compaction.threshold = parsed;
|
|
2515
|
+
if (Number.isFinite(parsed) && parsed >= 0 && parsed <= 1) settings.context.compaction.threshold = parsed;
|
|
2473
2516
|
return;
|
|
2474
2517
|
}
|
|
2475
2518
|
case "compaction.model": {
|
|
2476
2519
|
const trimmed = value.trim();
|
|
2477
|
-
if (trimmed) settings.compaction.model = trimmed;
|
|
2478
|
-
else delete settings.compaction.model;
|
|
2520
|
+
if (trimmed) settings.context.compaction.model = trimmed;
|
|
2521
|
+
else delete settings.context.compaction.model;
|
|
2479
2522
|
return;
|
|
2480
2523
|
}
|
|
2481
2524
|
case "compaction.systemPrompt": {
|
|
2482
2525
|
const trimmed = value.trim();
|
|
2483
|
-
if (trimmed) settings.compaction.systemPrompt = trimmed;
|
|
2484
|
-
else delete settings.compaction.systemPrompt;
|
|
2526
|
+
if (trimmed) settings.context.compaction.systemPrompt = trimmed;
|
|
2527
|
+
else delete settings.context.compaction.systemPrompt;
|
|
2485
2528
|
return;
|
|
2486
2529
|
}
|
|
2487
2530
|
case "retry.enabled":
|
|
2488
|
-
if (value === "true" || value === "false") settings.retry.enabled = value === "true";
|
|
2531
|
+
if (value === "true" || value === "false") settings.chat.retry.enabled = value === "true";
|
|
2489
2532
|
return;
|
|
2490
2533
|
case "retry.maxRetries":
|
|
2491
2534
|
applyNonNegativeInteger(value, (next) => {
|
|
2492
|
-
settings.retry.maxRetries = next;
|
|
2535
|
+
settings.chat.retry.maxRetries = next;
|
|
2493
2536
|
});
|
|
2494
2537
|
return;
|
|
2495
2538
|
case "retry.baseDelayMs":
|
|
2496
2539
|
applyNonNegativeInteger(value, (next) => {
|
|
2497
|
-
settings.retry.baseDelayMs = next;
|
|
2540
|
+
settings.chat.retry.baseDelayMs = next;
|
|
2498
2541
|
});
|
|
2499
2542
|
return;
|
|
2500
2543
|
case "retry.maxDelayMs":
|
|
2501
2544
|
applyNonNegativeInteger(value, (next) => {
|
|
2502
|
-
settings.retry.maxDelayMs = next;
|
|
2545
|
+
settings.chat.retry.maxDelayMs = next;
|
|
2503
2546
|
});
|
|
2504
2547
|
return;
|
|
2505
2548
|
case "terminal.showTerminalProgress":
|
|
2506
|
-
if (value === "true" || value === "false") settings.
|
|
2549
|
+
if (value === "true" || value === "false") settings.interface.terminalProgress = value === "true";
|
|
2507
2550
|
return;
|
|
2508
2551
|
case "terminal.outputVerbosity":
|
|
2509
|
-
if (value === "minimal" || value === "default" || value === "verbose") settings.
|
|
2552
|
+
if (value === "minimal" || value === "default" || value === "verbose") settings.interface.outputDetail = value;
|
|
2510
2553
|
return;
|
|
2511
2554
|
case "terminal.tuiMode":
|
|
2512
|
-
if (value === "regular" || value === "fullscreen") settings.
|
|
2555
|
+
if (value === "regular" || value === "fullscreen") settings.interface.mode = value;
|
|
2513
2556
|
return;
|
|
2514
2557
|
case "terminal.fullscreenScrollbar":
|
|
2515
2558
|
if (value === "hidden" || value === "auto" || value === "always") {
|
|
2516
|
-
settings.
|
|
2559
|
+
settings.interface.fullscreenScrollbar = value;
|
|
2517
2560
|
}
|
|
2518
2561
|
return;
|
|
2519
2562
|
case "terminal.notify":
|
|
2520
|
-
if (value === "true" || value === "false") settings.
|
|
2563
|
+
if (value === "true" || value === "false") settings.interface.desktopNotifications = value === "true";
|
|
2521
2564
|
return;
|
|
2522
2565
|
case "watchdog.enabled":
|
|
2523
|
-
if (value === "true" || value === "false") settings.
|
|
2566
|
+
if (value === "true" || value === "false") settings.safety.review.enabled = value === "true";
|
|
2524
2567
|
return;
|
|
2525
2568
|
// Both watchdog options are absent-by-default, and an empty submission is
|
|
2526
2569
|
// how the operator says "go back to the default" from a text row. Deleting
|
|
@@ -2528,82 +2571,80 @@ export function applySettingChange(settings: ClioSettings, id: string, value: st
|
|
|
2528
2571
|
// config validator accepts.
|
|
2529
2572
|
case "watchdog.target": {
|
|
2530
2573
|
const trimmed = value.trim();
|
|
2531
|
-
if (trimmed) settings.
|
|
2532
|
-
else delete settings.
|
|
2574
|
+
if (trimmed) settings.safety.review.target = trimmed;
|
|
2575
|
+
else delete settings.safety.review.target;
|
|
2533
2576
|
return;
|
|
2534
2577
|
}
|
|
2535
2578
|
case "watchdog.cadenceToolCalls":
|
|
2536
2579
|
applyNumberSetting("watchdog.cadenceToolCalls", value, (next) => {
|
|
2537
|
-
if (next === null) delete settings.
|
|
2538
|
-
else settings.
|
|
2580
|
+
if (next === null) delete settings.safety.review.cadenceToolCalls;
|
|
2581
|
+
else settings.safety.review.cadenceToolCalls = next;
|
|
2539
2582
|
});
|
|
2540
2583
|
return;
|
|
2541
2584
|
case "terminal.smoothStreaming":
|
|
2542
|
-
if (value === "off" || value === "auto" || value === "on") settings.
|
|
2585
|
+
if (value === "off" || value === "auto" || value === "on") settings.interface.smoothStreaming = value;
|
|
2543
2586
|
return;
|
|
2544
2587
|
case "runtimePlugins":
|
|
2545
|
-
settings.runtimePlugins = value
|
|
2588
|
+
settings.integrations.runtimePlugins = value
|
|
2546
2589
|
.split(",")
|
|
2547
2590
|
.map((entry) => entry.trim())
|
|
2548
2591
|
.filter(Boolean);
|
|
2549
2592
|
return;
|
|
2550
2593
|
case "delegation.defaults.connectTimeoutMs":
|
|
2551
2594
|
applyNumberSetting("delegation.defaults.connectTimeoutMs", value, (next) => {
|
|
2552
|
-
if (next !== null) settings.
|
|
2595
|
+
if (next !== null) settings.integrations.externalAgents.defaults.connectTimeoutMs = next;
|
|
2553
2596
|
});
|
|
2554
2597
|
return;
|
|
2555
2598
|
case "delegation.defaults.turnTimeoutMs":
|
|
2556
2599
|
applyNumberSetting("delegation.defaults.turnTimeoutMs", value, (next) => {
|
|
2557
|
-
if (next !== null) settings.
|
|
2600
|
+
if (next !== null) settings.integrations.externalAgents.defaults.turnTimeoutMs = next;
|
|
2558
2601
|
});
|
|
2559
2602
|
return;
|
|
2560
2603
|
case "delegation.defaults.permissionTimeoutMs":
|
|
2561
2604
|
applyNumberSetting("delegation.defaults.permissionTimeoutMs", value, (next) => {
|
|
2562
|
-
if (next !== null) settings.
|
|
2605
|
+
if (next !== null) settings.integrations.externalAgents.defaults.permissionTimeoutMs = next;
|
|
2563
2606
|
});
|
|
2564
2607
|
return;
|
|
2565
2608
|
case "orchestrator.target": {
|
|
2566
2609
|
const target = value === "(unset)" || value === "" ? null : value;
|
|
2567
2610
|
// Switching targets re-bases the model on the new target default.
|
|
2568
|
-
if (target !== settings.
|
|
2569
|
-
settings.
|
|
2570
|
-
? (settings.targets.find((entry) => entry.id === target)?.defaultModel ?? null)
|
|
2571
|
-
: null;
|
|
2611
|
+
if (target !== settings.chat.target) {
|
|
2612
|
+
settings.chat.model = target ? (settings.targets.find((entry) => entry.id === target)?.defaultModel ?? null) : null;
|
|
2572
2613
|
}
|
|
2573
|
-
settings.
|
|
2614
|
+
settings.chat.target = target;
|
|
2574
2615
|
return;
|
|
2575
2616
|
}
|
|
2576
2617
|
case "orchestrator.model":
|
|
2577
|
-
settings.
|
|
2618
|
+
settings.chat.model = value === "(unset)" || value === "" ? null : value;
|
|
2578
2619
|
return;
|
|
2579
2620
|
case "background.target": {
|
|
2580
2621
|
const target = value.startsWith("(unset") || value === "" ? null : value;
|
|
2581
|
-
if (target !== settings.
|
|
2582
|
-
settings.
|
|
2622
|
+
if (target !== settings.context.memory.target) {
|
|
2623
|
+
settings.context.memory.model = target
|
|
2583
2624
|
? (settings.targets.find((entry) => entry.id === target)?.defaultModel ?? null)
|
|
2584
2625
|
: null;
|
|
2585
2626
|
}
|
|
2586
|
-
settings.
|
|
2627
|
+
settings.context.memory.target = target;
|
|
2587
2628
|
return;
|
|
2588
2629
|
}
|
|
2589
2630
|
case "background.model":
|
|
2590
|
-
settings.
|
|
2631
|
+
settings.context.memory.model = value === "(unset)" || value === "" ? null : value;
|
|
2591
2632
|
return;
|
|
2592
2633
|
case "workers.default.target": {
|
|
2593
2634
|
const target = value === "(unset)" || value === "" ? null : value;
|
|
2594
|
-
if (target !== settings.
|
|
2595
|
-
settings.
|
|
2635
|
+
if (target !== settings.fleet.default.target) {
|
|
2636
|
+
settings.fleet.default.model = target
|
|
2596
2637
|
? (settings.targets.find((entry) => entry.id === target)?.defaultModel ?? null)
|
|
2597
2638
|
: null;
|
|
2598
2639
|
}
|
|
2599
|
-
settings.
|
|
2640
|
+
settings.fleet.default.target = target;
|
|
2600
2641
|
return;
|
|
2601
2642
|
}
|
|
2602
2643
|
case "workers.default.model":
|
|
2603
|
-
settings.
|
|
2644
|
+
settings.fleet.default.model = value === "(unset)" || value === "" ? null : value;
|
|
2604
2645
|
return;
|
|
2605
2646
|
case "scope":
|
|
2606
|
-
settings.
|
|
2647
|
+
settings.chat.modelPicker.cycleSet =
|
|
2607
2648
|
parseScopedModelSelection(value) ??
|
|
2608
2649
|
value
|
|
2609
2650
|
.split(",")
|
|
@@ -2612,37 +2653,43 @@ export function applySettingChange(settings: ClioSettings, id: string, value: st
|
|
|
2612
2653
|
return;
|
|
2613
2654
|
case "budget.sessionCeilingUsd":
|
|
2614
2655
|
applyNumberSetting("budget.sessionCeilingUsd", value, (next) => {
|
|
2615
|
-
if (next !== null) settings.
|
|
2656
|
+
if (next !== null) settings.safety.limits.sessionCostUsd = next;
|
|
2616
2657
|
});
|
|
2617
2658
|
return;
|
|
2618
2659
|
case "workers.escalation.timeoutMs":
|
|
2619
2660
|
applyNumberSetting("workers.escalation.timeoutMs", value, (next) => {
|
|
2620
2661
|
if (next === null) return;
|
|
2621
|
-
settings.
|
|
2662
|
+
settings.fleet.permissions.escalation = {
|
|
2663
|
+
...(settings.fleet.permissions.escalation ?? SHIPPED_ESCALATION),
|
|
2664
|
+
timeoutMs: next,
|
|
2665
|
+
};
|
|
2622
2666
|
});
|
|
2623
2667
|
return;
|
|
2624
2668
|
case "workers.escalation.fallback": {
|
|
2625
2669
|
if (value !== "deny" && value !== "fail") return;
|
|
2626
|
-
settings.
|
|
2670
|
+
settings.fleet.permissions.escalation = {
|
|
2671
|
+
...(settings.fleet.permissions.escalation ?? SHIPPED_ESCALATION),
|
|
2672
|
+
fallback: value,
|
|
2673
|
+
};
|
|
2627
2674
|
return;
|
|
2628
2675
|
}
|
|
2629
2676
|
case "workers.resilienceCooldownMs":
|
|
2630
2677
|
applyNumberSetting("workers.resilienceCooldownMs", value, (next) => {
|
|
2631
|
-
if (next !== null) settings.
|
|
2678
|
+
if (next !== null) settings.fleet.retry.routeCooldownMs = next;
|
|
2632
2679
|
});
|
|
2633
2680
|
return;
|
|
2634
2681
|
case "routing.activeRoles": {
|
|
2635
2682
|
const outcome = parseEnumListSetting(value, ACTIVE_ROUTING_ROLES);
|
|
2636
|
-
if ("values" in outcome) settings.
|
|
2683
|
+
if ("values" in outcome) settings.fleet.adaptiveRouting.roles = outcome.values as ActiveRoutingRole[];
|
|
2637
2684
|
return;
|
|
2638
2685
|
}
|
|
2639
2686
|
case "routing.activePostures": {
|
|
2640
2687
|
const outcome = parseEnumListSetting(value, ACTIVE_ROUTING_POSTURES);
|
|
2641
|
-
if ("values" in outcome) settings.
|
|
2688
|
+
if ("values" in outcome) settings.fleet.adaptiveRouting.postures = outcome.values as ActiveRoutingPosture[];
|
|
2642
2689
|
return;
|
|
2643
2690
|
}
|
|
2644
2691
|
case "prewarm.enabled":
|
|
2645
|
-
if (value === "true" || value === "false") settings.prewarm
|
|
2692
|
+
if (value === "true" || value === "false") settings.chat.prewarm = value === "true";
|
|
2646
2693
|
return;
|
|
2647
2694
|
case "guardrails.turnToolCallBudget":
|
|
2648
2695
|
case "guardrails.workerToolCallCap":
|
|
@@ -2651,7 +2698,13 @@ export function applySettingChange(settings: ClioSettings, id: string, value: st
|
|
|
2651
2698
|
case "guardrails.observationTurnBudgetBytes":
|
|
2652
2699
|
case "guardrails.internalDispatchTimeoutMs":
|
|
2653
2700
|
applyNumberSetting(id, value, (next) => {
|
|
2654
|
-
if (next
|
|
2701
|
+
if (next === null) return;
|
|
2702
|
+
if (id === "guardrails.turnToolCallBudget") settings.safety.limits.chatToolCallsPerTurn = next;
|
|
2703
|
+
else if (id === "guardrails.workerToolCallCap") settings.fleet.limits.toolCallsPerRun = next;
|
|
2704
|
+
else if (id === "guardrails.maxDispatchRuns") settings.fleet.history.maxRuns = next;
|
|
2705
|
+
else if (id === "guardrails.readMaxBytes") settings.safety.limits.readBytesPerCall = next;
|
|
2706
|
+
else if (id === "guardrails.observationTurnBudgetBytes") settings.safety.limits.observationBytesPerTurn = next;
|
|
2707
|
+
else settings.fleet.limits.internalRunTimeoutMs = next;
|
|
2655
2708
|
});
|
|
2656
2709
|
return;
|
|
2657
2710
|
case "context.workingSet.enabled":
|
|
@@ -2679,18 +2732,18 @@ export function applySettingChange(settings: ClioSettings, id: string, value: st
|
|
|
2679
2732
|
return;
|
|
2680
2733
|
case "retry.streamStallMs":
|
|
2681
2734
|
applyNonNegativeInteger(value, (next) => {
|
|
2682
|
-
settings.retry.streamStallMs = next;
|
|
2735
|
+
settings.chat.retry.streamStallMs = next;
|
|
2683
2736
|
});
|
|
2684
2737
|
return;
|
|
2685
2738
|
case "library.catalog":
|
|
2686
2739
|
case "library.remote": {
|
|
2687
2740
|
const key = id.slice("library.".length) as "catalog" | "remote";
|
|
2688
2741
|
const trimmed = value.trim();
|
|
2689
|
-
settings.library[key] = trimmed.length > 0 ? trimmed : null;
|
|
2742
|
+
settings.integrations.library[key] = trimmed.length > 0 ? trimmed : null;
|
|
2690
2743
|
return;
|
|
2691
2744
|
}
|
|
2692
2745
|
case "library.sync":
|
|
2693
|
-
if (value === "true" || value === "false") settings.library.sync = value === "true";
|
|
2746
|
+
if (value === "true" || value === "false") settings.integrations.library.sync = value === "true";
|
|
2694
2747
|
return;
|
|
2695
2748
|
}
|
|
2696
2749
|
}
|
|
@@ -2711,11 +2764,11 @@ function applyEntrySettingChange(settings: ClioSettings, id: string, value: stri
|
|
|
2711
2764
|
const legacySegments = id.split(".");
|
|
2712
2765
|
const legacyField = legacySegments.at(-1);
|
|
2713
2766
|
const usesLegacyField =
|
|
2714
|
-
!settings.
|
|
2767
|
+
!settings.fleet.profiles[summaryName] && ["target", "model", "thinkingLevel", "node"].includes(legacyField ?? "");
|
|
2715
2768
|
const field = usesLegacyField ? legacyField : encoded.shift();
|
|
2716
2769
|
const name = usesLegacyField ? legacySegments.slice(2, -1).join(".") : summaryName;
|
|
2717
2770
|
const fieldValue = usesLegacyField ? value : encoded.join(PROFILE_FIELD_SEPARATOR);
|
|
2718
|
-
const profile = settings.
|
|
2771
|
+
const profile = settings.fleet.profiles[name];
|
|
2719
2772
|
if (!profile) return true;
|
|
2720
2773
|
if (value === REMOVE_PROFILE_CHOICE) {
|
|
2721
2774
|
removeFleetProfileFromSettings(settings, name);
|
|
@@ -2733,7 +2786,7 @@ function applyEntrySettingChange(settings: ClioSettings, id: string, value: stri
|
|
|
2733
2786
|
}
|
|
2734
2787
|
if (id.startsWith("workers.agentBindings.")) {
|
|
2735
2788
|
const agentId = id.slice("workers.agentBindings.".length);
|
|
2736
|
-
if (value === UNBIND_CHOICE) delete settings.
|
|
2789
|
+
if (value === UNBIND_CHOICE) delete settings.fleet.agentProfiles[agentId];
|
|
2737
2790
|
else bindAgentProfileInSettings(settings, agentId, value);
|
|
2738
2791
|
return true;
|
|
2739
2792
|
}
|
|
@@ -2757,7 +2810,7 @@ function changedLeafPaths(before: Readonly<ClioSettings>, after: Readonly<ClioSe
|
|
|
2757
2810
|
v !== null && typeof v === "object" && !Array.isArray(v);
|
|
2758
2811
|
const visit = (a: unknown, b: unknown, path: string): void => {
|
|
2759
2812
|
if (a === b) return;
|
|
2760
|
-
const profileLeaf = path.startsWith("
|
|
2813
|
+
const profileLeaf = path.startsWith("fleet.profiles.") && path.split(".").length === 3;
|
|
2761
2814
|
if (!isRecord(a) || !isRecord(b) || profileLeaf) {
|
|
2762
2815
|
if (JSON.stringify(a) !== JSON.stringify(b)) out.push(path);
|
|
2763
2816
|
return;
|
|
@@ -2817,9 +2870,9 @@ function propagationTiming(
|
|
|
2817
2870
|
if (restartRequired) return "next-session";
|
|
2818
2871
|
if (id.startsWith("targets.")) {
|
|
2819
2872
|
if (selectedValue === "remove") return "next-dispatch";
|
|
2820
|
-
return path.startsWith("
|
|
2873
|
+
return path.startsWith("chat.") ? "now" : "next-dispatch";
|
|
2821
2874
|
}
|
|
2822
|
-
if (path.startsWith("
|
|
2875
|
+
if (path.startsWith("fleet.")) return "next-dispatch";
|
|
2823
2876
|
return "now";
|
|
2824
2877
|
}
|
|
2825
2878
|
|
|
@@ -2832,7 +2885,7 @@ function impactFor(propagation: SettingsChangePlan["propagation"]): string {
|
|
|
2832
2885
|
return "takes effect now";
|
|
2833
2886
|
}
|
|
2834
2887
|
|
|
2835
|
-
|
|
2888
|
+
function createSettingsChangePlan(
|
|
2836
2889
|
settings: Readonly<ClioSettings>,
|
|
2837
2890
|
item: Pick<SettingsCenterItem, "id" | "label" | "currentValue" | "scope">,
|
|
2838
2891
|
selectedValue: string,
|
|
@@ -3627,8 +3680,8 @@ export class SettingsCenter implements Component {
|
|
|
3627
3680
|
list.onCancel = () => finish("cancel");
|
|
3628
3681
|
const title = (width: number): string => formatScopeConfirmTitle(plan, width);
|
|
3629
3682
|
const affectedBindings = plan.leaves
|
|
3630
|
-
.filter((leaf) => leaf.path.startsWith("
|
|
3631
|
-
.map((leaf) => leaf.path.slice("
|
|
3683
|
+
.filter((leaf) => leaf.path.startsWith("fleet.agentProfiles."))
|
|
3684
|
+
.map((leaf) => leaf.path.slice("fleet.agentProfiles.".length));
|
|
3632
3685
|
const bindingPreflight =
|
|
3633
3686
|
plan.selectedValue === REMOVE_PROFILE_CHOICE
|
|
3634
3687
|
? `Affected agent routes: ${affectedBindings.length > 0 ? affectedBindings.join(", ") : "none"} · `
|
|
@@ -3637,10 +3690,10 @@ export class SettingsCenter implements Component {
|
|
|
3637
3690
|
if (!plan.rowId.startsWith("targets.") || plan.selectedValue !== "remove") return "";
|
|
3638
3691
|
const paths = (prefix: string): string[] =>
|
|
3639
3692
|
plan.leaves.filter((leaf) => leaf.path.startsWith(prefix)).map((leaf) => leaf.path);
|
|
3640
|
-
const profiles = paths("
|
|
3693
|
+
const profiles = paths("fleet.profiles.").map((path) => path.slice("fleet.profiles.".length));
|
|
3641
3694
|
const describe = (label: string, affected: readonly string[]): string =>
|
|
3642
3695
|
`Affected ${label}: ${affected.length > 0 ? affected.join(", ") : "none"}`;
|
|
3643
|
-
return `${describe("chat route", paths("
|
|
3696
|
+
return `${describe("chat route", paths("chat."))} · ${describe("fleet route", paths("fleet.default."))} · ${describe("memory route", paths("context.memory."))} · ${describe("profiles", profiles)} · `;
|
|
3644
3697
|
})();
|
|
3645
3698
|
const note = `${bindingPreflight}${targetRemovalPreflight}Affects ${plan.leaves.map((leaf) => leaf.path).join(", ")} · ${plan.impact}`;
|
|
3646
3699
|
this.submenuComponent = new SubmenuWrapper(title, list, buildHint([{ key: "Enter", verb: "choose" }], "back"), note);
|
|
@@ -3772,7 +3825,7 @@ export class SettingsCenter implements Component {
|
|
|
3772
3825
|
if (this.sections().length === 0) return [...head, ...this.emptyFilterLines(width, available)];
|
|
3773
3826
|
// A detail page owns the work area, and the footer describes the row the
|
|
3774
3827
|
// operator has already left, so it is suppressed while a submenu is open.
|
|
3775
|
-
const footer = this.submenuComponent ? [] : this.renderFooter(width, this.footerBudget(available
|
|
3828
|
+
const footer = this.submenuComponent ? [] : this.renderFooter(width, this.footerBudget(available));
|
|
3776
3829
|
const contentHeight = Math.max(1, available - footer.length);
|
|
3777
3830
|
const leftWidth = Math.min(SECTION_LANE_WIDTH, Math.max(16, Math.floor(width * 0.28)));
|
|
3778
3831
|
const separator = barSep(clioTheme());
|
|
@@ -3789,19 +3842,15 @@ export class SettingsCenter implements Component {
|
|
|
3789
3842
|
}
|
|
3790
3843
|
|
|
3791
3844
|
/**
|
|
3792
|
-
* The footer is
|
|
3793
|
-
*
|
|
3794
|
-
*
|
|
3795
|
-
*
|
|
3796
|
-
*
|
|
3797
|
-
*
|
|
3798
|
-
* for the second row out of the explanation above it. The note buys its own
|
|
3799
|
-
* rows instead. A note that fits on one line leaves the ceiling at four, so
|
|
3800
|
-
* every width above the wrap point renders exactly as it did.
|
|
3845
|
+
* The footer is the selected setting's detail surface at two-lane widths, so
|
|
3846
|
+
* it may use every row the list does not need. A fixed four-line ceiling left
|
|
3847
|
+
* a dozen blank body rows at an 80-column terminal while cutting the autonomy
|
|
3848
|
+
* explanation after its first sentence. Keeping six list rows makes the full
|
|
3849
|
+
* prose reachable when height is available and still degrades to no footer on
|
|
3850
|
+
* a short terminal.
|
|
3801
3851
|
*/
|
|
3802
|
-
private footerBudget(bodyHeight: number
|
|
3803
|
-
|
|
3804
|
-
return Math.min(2 + noteLines + 1, Math.max(0, bodyHeight - 6));
|
|
3852
|
+
private footerBudget(bodyHeight: number): number {
|
|
3853
|
+
return Math.max(0, bodyHeight - 6);
|
|
3805
3854
|
}
|
|
3806
3855
|
|
|
3807
3856
|
private renderSectionLane(width: number, height: number): string[] {
|
|
@@ -4169,26 +4218,22 @@ export function openSettingsOverlay(tui: TUI, deps: OpenSettingsOverlayDeps): Se
|
|
|
4169
4218
|
center.refreshItems();
|
|
4170
4219
|
tui.requestRender();
|
|
4171
4220
|
};
|
|
4172
|
-
// The engine composites an overlay across the columns its region covers, and
|
|
4173
|
-
// side margins shrink that region, so this margin is re-read every frame and
|
|
4174
|
-
// drops to zero on an ultra-narrow terminal rather than leaving transcript
|
|
4175
|
-
// columns beside a modal that owns the keyboard.
|
|
4176
|
-
const margin: { top: number; right: number; bottom: number; left: number } = { ...SETTINGS_OVERLAY_MARGIN };
|
|
4177
4221
|
const handle = showClioOverlayFrame(tui, center, {
|
|
4178
4222
|
anchor: "top-left",
|
|
4179
4223
|
width: SETTINGS_OVERLAY_WIDTH,
|
|
4180
4224
|
maxHeight: SETTINGS_OVERLAY_MAX_HEIGHT,
|
|
4181
|
-
|
|
4182
|
-
|
|
4183
|
-
|
|
4184
|
-
|
|
4185
|
-
margin.right = side;
|
|
4186
|
-
return true;
|
|
4187
|
-
},
|
|
4225
|
+
// A capturing overlay must own every horizontal cell. Leaving even a
|
|
4226
|
+
// two-column compositor margin exposes arbitrary transcript and footer
|
|
4227
|
+
// fragments beside the frame, where they read as modal content.
|
|
4228
|
+
margin: SETTINGS_OVERLAY_MARGIN,
|
|
4188
4229
|
markerId: "settings",
|
|
4189
4230
|
title: "Settings",
|
|
4190
|
-
footerHint: (innerWidth) =>
|
|
4191
|
-
|
|
4231
|
+
footerHint: (innerWidth) => {
|
|
4232
|
+
// The submenu renders its own authoritative choose/back legend. Keeping
|
|
4233
|
+
// the parent row controls in the outer border at the same time advertises
|
|
4234
|
+
// actions (preview, open, filter) that this input depth does not route.
|
|
4235
|
+
if (center.getSelection().submenuOpen) return undefined;
|
|
4236
|
+
return innerWidth < WIDE_LAYOUT_MIN_WIDTH
|
|
4192
4237
|
? buildHint(
|
|
4193
4238
|
[
|
|
4194
4239
|
{ key: "↑↓", verb: "move" },
|
|
@@ -4205,7 +4250,8 @@ export function openSettingsOverlay(tui: TUI, deps: OpenSettingsOverlayDeps): Se
|
|
|
4205
4250
|
{ key: "/", verb: "filter" },
|
|
4206
4251
|
],
|
|
4207
4252
|
"back",
|
|
4208
|
-
)
|
|
4253
|
+
);
|
|
4254
|
+
},
|
|
4209
4255
|
});
|
|
4210
4256
|
return Object.assign(handle, { refreshRows });
|
|
4211
4257
|
}
|