@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.
Files changed (581) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +116 -16
  3. package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
  4. package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
  7. package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
  8. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  9. package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
  10. package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
  11. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  12. package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
  13. package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
  14. package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
  15. package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
  16. package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
  17. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  18. package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
  19. package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
  20. package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
  21. package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
  22. package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
  23. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  24. package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
  25. package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
  26. package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
  27. package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
  28. package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
  29. package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
  30. package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
  33. package/dist/chunk-AP73CFDC.js +308 -0
  34. package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
  35. package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
  36. package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
  37. package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
  38. package/dist/chunk-BTK3SSSK.js +67 -0
  39. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  40. package/dist/chunk-BWW4HLO4.js +301 -0
  41. package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
  42. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  43. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  44. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  45. package/dist/chunk-D7E7WCDF.js +27 -0
  46. package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
  47. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  48. package/dist/chunk-EIMVLWB3.js +1842 -0
  49. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  50. package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
  51. package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
  52. package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
  53. package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
  54. package/dist/chunk-HJWWJ6IL.js +184 -0
  55. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  56. package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
  57. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  58. package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
  59. package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
  60. package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
  61. package/dist/chunk-J5LZHVIT.js +284 -0
  62. package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
  63. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  64. package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
  65. package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
  66. package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
  67. package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
  68. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  69. package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
  70. package/dist/chunk-NDDGJUXD.js +81 -0
  71. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  72. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  73. package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
  74. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  75. package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
  76. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  77. package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
  78. package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
  79. package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
  80. package/dist/chunk-QTFGO774.js +644 -0
  81. package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
  82. package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
  83. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  84. package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
  85. package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
  86. package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
  87. package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
  88. package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
  89. package/dist/chunk-U2WB7TZS.js +271 -0
  90. package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
  91. package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
  92. package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
  93. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  94. package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
  95. package/dist/chunk-VKFQTNDV.js +66 -0
  96. package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
  97. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  98. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  99. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  100. package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
  101. package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
  102. package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
  103. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  104. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  105. package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
  106. package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
  107. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  108. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  109. package/dist/cli/index.js +36 -36
  110. package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
  111. package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
  112. package/dist/codewiki/build-worker.js +1 -1
  113. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  114. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  115. package/dist/{config-QZPCMYSO.js → config-3QZRWZJF.js} +53 -49
  116. package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
  117. package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
  118. package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
  119. package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
  120. package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
  121. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
  122. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
  123. package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
  124. package/dist/doctor-ZGPEGHIP.js +772 -0
  125. package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
  126. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
  127. package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
  128. package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
  129. package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
  130. package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
  131. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
  132. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
  133. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
  134. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
  135. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
  136. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
  137. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
  138. package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
  139. package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
  140. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  141. package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
  142. package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
  143. package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
  144. package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
  145. package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
  146. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
  147. package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
  148. package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
  149. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  150. package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
  151. package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
  152. package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
  153. package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
  154. package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
  155. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
  156. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
  157. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
  158. package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
  159. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  160. package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
  161. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
  162. package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
  163. package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
  164. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  165. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  166. package/dist/{upgrade-3XPP6OQL.js → upgrade-H7TOM7YL.js} +35 -62
  167. package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
  168. package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
  169. package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
  170. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
  171. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
  172. package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
  173. package/dist/worker/entry.js +57 -52
  174. package/docs/acp.md +1 -1
  175. package/docs/built-in-agents.md +40 -32
  176. package/docs/commands-and-modes.md +9 -3
  177. package/docs/config-knobs-audit.md +3 -0
  178. package/docs/configuration-and-targets.md +105 -164
  179. package/docs/environment-variables.md +2 -1
  180. package/docs/exit-codes-and-output.md +2 -0
  181. package/docs/fleet-demo-runbook.md +6 -3
  182. package/docs/fleet-dispatch.md +8 -6
  183. package/docs/installation-and-lifecycle.md +1 -1
  184. package/docs/release-cut-checklist.md +164 -177
  185. package/docs/trace-store.md +15 -10
  186. package/docs/troubleshooting.md +1 -1
  187. package/evals/README.md +5 -0
  188. package/evals/behavioral-corpus-grader.mjs +103 -0
  189. package/evals/behavioral-machinery-baseline.json +2276 -0
  190. package/evals/behavioral-machinery-driver.ts +250 -0
  191. package/evals/behavioral-machinery-support.ts +253 -0
  192. package/evals/behavioral-machinery.yaml +614 -0
  193. package/evals/behavioral-model-negative-control.yaml +68 -0
  194. package/evals/behavioral-model.yaml +216 -0
  195. package/evals/fixtures/behavioral-facts.txt +3 -0
  196. package/evals/fixtures/behavioral-main.ts +7 -0
  197. package/evals/fixtures/decoy/note.txt +2 -0
  198. package/evals/fixtures/private/credentials.txt +1 -0
  199. package/evals/tracked-metrics-baseline.yaml +229 -0
  200. package/evals/tracked-metrics-grader.mjs +129 -0
  201. package/package.json +5 -15
  202. package/skills/README.md +6 -6
  203. package/skills/coding/ast-grep/SKILL.md +8 -2
  204. package/skills/coding/coding-standards/SKILL.md +8 -2
  205. package/skills/coding/prototype/SKILL.md +8 -2
  206. package/skills/coding/tdd/SKILL.md +8 -2
  207. package/skills/context/context-handoff/SKILL.md +12 -3
  208. package/skills/context/context-handoff/evals.md +3 -3
  209. package/skills/context/context-prime/SKILL.md +8 -2
  210. package/skills/context/context-prime/evals.md +2 -2
  211. package/skills/git/file-ticket/SKILL.md +9 -4
  212. package/skills/git/file-ticket/evals.md +2 -2
  213. package/skills/git/fix-issue/SKILL.md +12 -5
  214. package/skills/git/fix-issue/evals.md +4 -4
  215. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  216. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  217. package/skills/git/ship/SKILL.md +9 -3
  218. package/skills/git/ship/evals.md +4 -4
  219. package/skills/git/worktree-create/SKILL.md +7 -2
  220. package/skills/git/worktree-create/evals.md +6 -6
  221. package/skills/git/worktree-merge/SKILL.md +7 -2
  222. package/skills/git/worktree-merge/evals.md +6 -6
  223. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  224. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  225. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  226. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  227. package/skills/meta/credentials/SKILL.md +9 -2
  228. package/skills/meta/find-skills/SKILL.md +8 -2
  229. package/skills/meta/herdr/SKILL.md +8 -2
  230. package/skills/meta/skill-craft/SKILL.md +21 -4
  231. package/skills/planning/architecture/SKILL.md +9 -3
  232. package/skills/planning/backlog/SKILL.md +8 -2
  233. package/skills/planning/prd/SKILL.md +8 -2
  234. package/skills/planning/product-intent/SKILL.md +8 -2
  235. package/skills/planning/tech-spec/SKILL.md +9 -3
  236. package/skills/registry.yaml +66 -66
  237. package/skills/research/arxiv-literature/SKILL.md +8 -2
  238. package/skills/research/experiment-protocol/SKILL.md +9 -2
  239. package/skills/research/scientific-debugging/SKILL.md +9 -2
  240. package/skills/research/scientific-debugging/evals.md +2 -2
  241. package/skills/research/scientific-modernization/SKILL.md +9 -2
  242. package/skills/skill-marketplace.json +257 -38
  243. package/skills/workflow/cut-it/SKILL.md +10 -2
  244. package/skills/workflow/design-council/SKILL.md +11 -2
  245. package/skills/workflow/grill-me/SKILL.md +8 -2
  246. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  247. package/src/cli/acp.ts +2 -2
  248. package/src/cli/auth.ts +2 -2
  249. package/src/cli/bootstrap-generate.ts +5 -5
  250. package/src/cli/clio.ts +6 -1
  251. package/src/cli/config-inspect.ts +3 -3
  252. package/src/cli/configure-interop.ts +1 -1
  253. package/src/cli/configure.ts +27 -27
  254. package/src/cli/default-target.ts +1 -1
  255. package/src/cli/docs.ts +6 -6
  256. package/src/cli/doctor-naming.ts +323 -0
  257. package/src/cli/doctor-panes.ts +46 -14
  258. package/src/cli/doctor-toolchain.ts +29 -8
  259. package/src/cli/doctor.ts +15 -1
  260. package/src/cli/eval-inventory.ts +8 -8
  261. package/src/cli/evidence-detail.ts +1 -1
  262. package/src/cli/evidence-inventory.ts +1 -1
  263. package/src/cli/fleet-decisions.ts +1 -1
  264. package/src/cli/fleet-inspect.ts +1 -1
  265. package/src/cli/fleet-preflight.ts +1 -1
  266. package/src/cli/fleet-verify.ts +1 -1
  267. package/src/cli/fleet-view.ts +40 -23
  268. package/src/cli/fleet.ts +8 -5
  269. package/src/cli/interop-inspect.ts +2 -2
  270. package/src/cli/models.ts +3 -3
  271. package/src/cli/modes/print.ts +1 -1
  272. package/src/cli/reset.ts +1 -1
  273. package/src/cli/run.ts +11 -15
  274. package/src/cli/share.ts +1 -1
  275. package/src/cli/skills-eval.ts +11 -11
  276. package/src/cli/targets.ts +23 -24
  277. package/src/cli/trace-inspect.ts +1 -1
  278. package/src/cli/trace.ts +41 -0
  279. package/src/cli/uninstall.ts +2 -2
  280. package/src/cli/upgrade.ts +29 -34
  281. package/src/cli/usage.ts +2 -2
  282. package/src/cli/validate-model.ts +1 -1
  283. package/src/cli/verifiers-inspect.ts +1 -1
  284. package/src/cli/wiki-generate.ts +5 -5
  285. package/src/core/bash-exec.ts +1 -1
  286. package/src/core/boot-trace.ts +3 -3
  287. package/src/core/bus-trace.ts +2 -2
  288. package/src/core/compile-cache.ts +1 -1
  289. package/src/core/config.ts +1062 -886
  290. package/src/core/defaults.ts +321 -528
  291. package/src/core/domain-loader.ts +6 -4
  292. package/src/core/event-bus.ts +1 -1
  293. package/src/core/file-references.ts +78 -88
  294. package/src/core/git-commit-attribution.ts +3 -9
  295. package/src/core/guardrails.ts +24 -4
  296. package/src/core/naming-compat.ts +45 -0
  297. package/src/core/naming-events.ts +62 -0
  298. package/src/core/recent-models.ts +1 -7
  299. package/src/core/residency-protection.ts +4 -8
  300. package/src/core/resolve-config-value.ts +1 -1
  301. package/src/core/response-model-id.ts +0 -14
  302. package/src/core/session-routing.ts +84 -74
  303. package/src/core/skill-activation.ts +18 -0
  304. package/src/core/termination.ts +4 -4
  305. package/src/core/timers.ts +2 -12
  306. package/src/domains/agents/catalog.ts +2 -12
  307. package/src/domains/agents/extension.ts +3 -3
  308. package/src/domains/agents/registry.ts +7 -7
  309. package/src/domains/agents/result-contract.ts +1 -1
  310. package/src/domains/agents/spec.ts +0 -11
  311. package/src/domains/config/classify.ts +35 -47
  312. package/src/domains/config/extension.ts +5 -5
  313. package/src/domains/config/keybindings.ts +48 -47
  314. package/src/domains/config/watcher.ts +1 -1
  315. package/src/domains/context/codewiki/indexer.ts +1 -1
  316. package/src/domains/context/extension.ts +3 -3
  317. package/src/domains/context/prompt-context.ts +1 -1
  318. package/src/domains/context/wiki/assemble.ts +2 -2
  319. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  320. package/src/domains/context/working-set/replay/report.ts +1 -1
  321. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  322. package/src/domains/dispatch/active-route-planner.ts +2 -2
  323. package/src/domains/dispatch/agent-candidates.ts +1 -1
  324. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  325. package/src/domains/dispatch/agent-ledger.ts +1 -1
  326. package/src/domains/dispatch/assignment.ts +5 -5
  327. package/src/domains/dispatch/capacity-lease.ts +2 -5
  328. package/src/domains/dispatch/code-step.ts +1 -1
  329. package/src/domains/dispatch/contract.ts +2 -2
  330. package/src/domains/dispatch/extension.ts +65 -61
  331. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  332. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  333. package/src/domains/dispatch/fleet-run.ts +0 -7
  334. package/src/domains/dispatch/gate-decisions.ts +25 -14
  335. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  336. package/src/domains/dispatch/path-scope.ts +0 -61
  337. package/src/domains/dispatch/placement.ts +2 -2
  338. package/src/domains/dispatch/receipt-findings.ts +1 -1
  339. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  340. package/src/domains/dispatch/reservation-store.ts +0 -23
  341. package/src/domains/dispatch/route-decision.ts +1 -1
  342. package/src/domains/dispatch/route-history.ts +1 -1
  343. package/src/domains/dispatch/route-policy.ts +1 -1
  344. package/src/domains/dispatch/route-readiness.ts +0 -28
  345. package/src/domains/dispatch/run-event-journal.ts +6 -5
  346. package/src/domains/dispatch/tool-stats.ts +1 -1
  347. package/src/domains/dispatch/transport.ts +2 -19
  348. package/src/domains/dispatch/types.ts +3 -3
  349. package/src/domains/dispatch/worker-protocol.ts +2 -2
  350. package/src/domains/eval/artifacts/store.ts +5 -4
  351. package/src/domains/eval/compare/thresholds.ts +0 -8
  352. package/src/domains/eval/execution-provenance.ts +1 -1
  353. package/src/domains/eval/metrics/token-stream.ts +0 -7
  354. package/src/domains/eval/report.ts +1 -1
  355. package/src/domains/eval/runner.ts +1 -1
  356. package/src/domains/eval/runners/clio-run.ts +7 -6
  357. package/src/domains/eval/runners/external-command.ts +4 -3
  358. package/src/domains/eval/schema/artifact.ts +1 -1
  359. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  360. package/src/domains/eval/schema/behavioral.ts +7 -6
  361. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  362. package/src/domains/eval/schema/naming.ts +10 -0
  363. package/src/domains/eval/schema/suite.ts +2 -2
  364. package/src/domains/eval/schema/validate.ts +9 -5
  365. package/src/domains/eval/schema/verdict.ts +4 -2
  366. package/src/domains/eval/store.ts +12 -2
  367. package/src/domains/eval/suites/run.ts +12 -6
  368. package/src/domains/eval/types.ts +1 -1
  369. package/src/domains/eval/workspaces/git.ts +1 -1
  370. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  371. package/src/domains/evidence/build.ts +13 -5
  372. package/src/domains/interop/consent.ts +7 -7
  373. package/src/domains/interop/extension.ts +1 -1
  374. package/src/domains/lifecycle/doctor.ts +27 -21
  375. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  376. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  377. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  378. package/src/domains/lifecycle/migrations/index.ts +20 -1
  379. package/src/domains/lifecycle/naming-history.ts +153 -0
  380. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  381. package/src/domains/lifecycle/naming-resources.ts +261 -0
  382. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  383. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  384. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  385. package/src/domains/memory/task-memory-handoff.ts +6 -3
  386. package/src/domains/middleware/index.ts +7 -0
  387. package/src/domains/middleware/marketplace-offer.ts +339 -0
  388. package/src/domains/middleware/runtime.ts +2 -2
  389. package/src/domains/mux/contract.ts +157 -25
  390. package/src/domains/mux/detect.ts +29 -5
  391. package/src/domains/mux/dock-controller.ts +365 -0
  392. package/src/domains/mux/extension.ts +7 -1
  393. package/src/domains/mux/index.ts +20 -0
  394. package/src/domains/mux/operations.ts +28 -0
  395. package/src/domains/mux/protocol.ts +19 -6
  396. package/src/domains/mux/socket-client.ts +167 -19
  397. package/src/domains/mux/types.ts +49 -6
  398. package/src/domains/mux/yazi/event-stream.ts +6 -4
  399. package/src/domains/mux/yazi/profile.ts +1 -1
  400. package/src/domains/mux/yazi/session.ts +26 -3
  401. package/src/domains/observability/extension.ts +1 -1
  402. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  403. package/src/domains/observability/projection.ts +1 -1
  404. package/src/domains/observability/trace-store.ts +22 -12
  405. package/src/domains/prompts/compiler.ts +2 -2
  406. package/src/domains/prompts/extension.ts +3 -3
  407. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  408. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  409. package/src/domains/providers/extension.ts +5 -5
  410. package/src/domains/providers/knowledge-base-path.ts +1 -1
  411. package/src/domains/providers/model-runtime-capabilities.ts +14 -2
  412. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  413. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  414. package/src/domains/providers/plugins.ts +1 -1
  415. package/src/domains/providers/resolver.ts +1 -1
  416. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  417. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  418. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  419. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  420. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  421. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  422. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  423. package/src/domains/providers/types/knowledge-base.ts +13 -0
  424. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  425. package/src/domains/providers/types/target-descriptor.ts +3 -3
  426. package/src/domains/resources/extension.ts +1 -1
  427. package/src/domains/resources/library.ts +6 -6
  428. package/src/domains/resources/prompts/loader.ts +1 -1
  429. package/src/domains/resources/skills/content-hash.ts +7 -6
  430. package/src/domains/resources/skills/evals.ts +1 -1
  431. package/src/domains/resources/skills/install.ts +36 -12
  432. package/src/domains/resources/skills/loader.ts +39 -13
  433. package/src/domains/resources/skills/marketplace.ts +21 -2
  434. package/src/domains/resources/skills/promotion.ts +214 -0
  435. package/src/domains/safety/audit.ts +2 -2
  436. package/src/domains/safety/finish-contract.ts +2 -1
  437. package/src/domains/safety/run-effects.ts +1 -1
  438. package/src/domains/scheduling/extension.ts +4 -4
  439. package/src/domains/session/archive-readers.ts +9 -1
  440. package/src/domains/session/compaction/branch-summary.ts +4 -0
  441. package/src/domains/session/compaction/compact.ts +1 -1
  442. package/src/domains/session/compaction/tokens.ts +4 -0
  443. package/src/domains/session/context-accounting.ts +1 -1
  444. package/src/domains/session/decision-board.ts +1 -1
  445. package/src/domains/session/extension.ts +1 -1
  446. package/src/domains/session/handoff.ts +2 -2
  447. package/src/domains/session/prompt-manifest.ts +0 -5
  448. package/src/domains/session/protected-artifact-journal.ts +12 -6
  449. package/src/domains/session/retry.ts +1 -1
  450. package/src/domains/share/archive.ts +85 -36
  451. package/src/domains/toolchain/install.ts +1 -1
  452. package/src/engine/acp/adapter.ts +3 -3
  453. package/src/engine/acp/event-mapper.ts +3 -3
  454. package/src/engine/acp/server.ts +27 -26
  455. package/src/engine/acp/tool-mediator.ts +2 -2
  456. package/src/engine/acp/types.ts +1 -1
  457. package/src/engine/alcf-oauth.ts +5 -5
  458. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  459. package/src/engine/api-registry.ts +1 -1
  460. package/src/engine/apis/llamacpp-residency.ts +1 -19
  461. package/src/engine/apis/lmstudio.ts +1 -6
  462. package/src/engine/apis/ollama-native.ts +3 -3
  463. package/src/engine/apis/openai-completions.ts +2 -2
  464. package/src/engine/apis/residency.ts +3 -9
  465. package/src/engine/claude/sdk-module.ts +1 -12
  466. package/src/engine/claude/sdk-runtime.ts +6 -6
  467. package/src/engine/claude/subprocess-runtime.ts +1 -1
  468. package/src/engine/claude/tool-safety.ts +4 -4
  469. package/src/engine/loop-guard.ts +0 -5
  470. package/src/engine/session.ts +14 -7
  471. package/src/engine/tui-primitives.ts +1 -1
  472. package/src/engine/worker-events.ts +6 -6
  473. package/src/engine/worker-runtime.ts +14 -13
  474. package/src/entry/orchestrator.ts +107 -88
  475. package/src/interactive/application-controller.ts +21 -21
  476. package/src/interactive/bus-notices.ts +2 -2
  477. package/src/interactive/chat-loop.ts +8 -8
  478. package/src/interactive/chat-panel.ts +1 -1
  479. package/src/interactive/clio-editor.ts +105 -1
  480. package/src/interactive/context-activity.ts +8 -6
  481. package/src/interactive/context-meter.ts +3 -6
  482. package/src/interactive/context-overlay.ts +1 -1
  483. package/src/interactive/cost-overlay.ts +1 -1
  484. package/src/interactive/council-grid.ts +2 -2
  485. package/src/interactive/dispatch-board.ts +30 -33
  486. package/src/interactive/editor-bash.ts +21 -0
  487. package/src/interactive/editor-steer.ts +9 -4
  488. package/src/interactive/editor-submit.ts +24 -18
  489. package/src/interactive/external-editor.ts +1 -1
  490. package/src/interactive/file-reference-completion.ts +360 -0
  491. package/src/interactive/footer/dashboard.ts +15 -17
  492. package/src/interactive/footer/notifications.ts +14 -8
  493. package/src/interactive/footer/widgets.ts +2 -44
  494. package/src/interactive/interactive-application.ts +79 -59
  495. package/src/interactive/interactive-event-projection.ts +1 -1
  496. package/src/interactive/interactive-input-runtime.ts +2 -2
  497. package/src/interactive/interactive-presentation.ts +21 -16
  498. package/src/interactive/interactive-shell.ts +2 -2
  499. package/src/interactive/interactive-slash-runtime.ts +63 -17
  500. package/src/interactive/interactive-subscriptions.ts +1 -1
  501. package/src/interactive/interactive-tickers.ts +1 -1
  502. package/src/interactive/keybinding-manager.ts +4 -4
  503. package/src/interactive/layout.ts +1 -1
  504. package/src/interactive/memory-overlay.ts +2 -2
  505. package/src/interactive/modal-marker.ts +2 -21
  506. package/src/interactive/mutation-preview.ts +1 -1
  507. package/src/interactive/overlay-frame.ts +4 -12
  508. package/src/interactive/overlay-general-openers.ts +6 -2
  509. package/src/interactive/overlay-key-routing.ts +7 -7
  510. package/src/interactive/overlay-lifecycle.ts +1 -1
  511. package/src/interactive/overlay-model-selectors.ts +3 -3
  512. package/src/interactive/overlays/agents.ts +2 -2
  513. package/src/interactive/overlays/ask-user.ts +25 -11
  514. package/src/interactive/overlays/context-reset.ts +28 -4
  515. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  516. package/src/interactive/overlays/decisions.ts +4 -2
  517. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  518. package/src/interactive/overlays/handoff-review.ts +2 -2
  519. package/src/interactive/overlays/interop.ts +1 -1
  520. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  521. package/src/interactive/overlays/message-picker.ts +1 -1
  522. package/src/interactive/overlays/model-selector.ts +39 -31
  523. package/src/interactive/overlays/prompts.ts +10 -4
  524. package/src/interactive/overlays/session-selector.ts +2 -2
  525. package/src/interactive/overlays/settings.ts +339 -293
  526. package/src/interactive/overlays/side-question.ts +2 -2
  527. package/src/interactive/overlays/skills-hub.ts +8 -8
  528. package/src/interactive/overlays/tree-selector.ts +2 -2
  529. package/src/interactive/panes-runtime.ts +36 -10
  530. package/src/interactive/permission-overlay.ts +2 -2
  531. package/src/interactive/renderers/retry-status.ts +12 -4
  532. package/src/interactive/renderers/tool-execution.ts +4 -4
  533. package/src/interactive/session-transcript.ts +3 -3
  534. package/src/interactive/slash-autocomplete.ts +454 -165
  535. package/src/interactive/slash-commands.ts +279 -183
  536. package/src/interactive/slash-spec.ts +160 -17
  537. package/src/interactive/status/controller.ts +2 -2
  538. package/src/interactive/stream-pacing-policy.ts +1 -1
  539. package/src/interactive/tasks-overlay.ts +20 -13
  540. package/src/interactive/terminal-lease.ts +6 -7
  541. package/src/interactive/turn-context.ts +11 -11
  542. package/src/interactive/turn-persistence.ts +2 -2
  543. package/src/interactive/turn-prewarm.ts +2 -2
  544. package/src/interactive/turn-runtime.ts +8 -8
  545. package/src/interactive/turn-state.ts +1 -1
  546. package/src/interactive/view/artifacts.ts +12 -9
  547. package/src/interactive/view/view-overlay.ts +13 -10
  548. package/src/interactive/watch-pane.ts +38 -10
  549. package/src/interactive/welcome-dashboard.ts +15 -15
  550. package/src/interactive/worker-progress.ts +4 -4
  551. package/src/interactive/worker-receipts.ts +1 -1
  552. package/src/interactive/worker-stream.ts +1 -4
  553. package/src/interactive/yazi-bridge.ts +12 -5
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/builtin-tool-catalog.ts +1 -1
  557. package/src/tools/compete-worktrees.ts +27 -17
  558. package/src/tools/context/index.ts +15 -1
  559. package/src/tools/dispatch-admission.ts +4 -2
  560. package/src/tools/dispatch-arguments.ts +1 -1
  561. package/src/tools/dispatch-plan.ts +0 -11
  562. package/src/tools/dispatch-run-events.ts +12 -10
  563. package/src/tools/dispatch-runner.ts +11 -6
  564. package/src/tools/dispatch.ts +1 -1
  565. package/src/tools/find.ts +1 -6
  566. package/src/tools/monitor.ts +4 -4
  567. package/src/tools/observers.ts +0 -33
  568. package/src/tools/task-worktree.ts +28 -7
  569. package/src/tools/verify/authoring.ts +3 -6
  570. package/src/tools/verify/frontend.ts +1 -1
  571. package/src/tools/web-fetch.ts +1 -1
  572. package/src/worker/entry.ts +4 -3
  573. package/src/worker/protocol.ts +16 -14
  574. package/src/worker/spec-contract.ts +2 -2
  575. package/src/worker/stdin-demux.ts +2 -2
  576. package/dist/chunk-GXNLGKAB.js +0 -571
  577. package/dist/chunk-VFA6GDY5.js +0 -1625
  578. package/dist/doctor-QOA5FNY5.js +0 -313
  579. package/src/engine/apis/degraded-inference.ts +0 -95
  580. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  581. /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: 2,
66
+ right: 0,
67
67
  bottom: 1,
68
- left: 2,
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.workers.escalation ?? {
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.workers.resilienceCooldownMs ?? 15_000;
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: SettingsCenterRowId;
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().workers.profiles).sort();
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
- if (isRoutingPath(id)) return undefined;
1486
- const raw = getAtPath(DEFAULT_SETTINGS, id);
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["orchestrator"]["thinkingLevel"],
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
- export function buildSettingItems(
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.scope ?? [];
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.terminal;
1614
- const watchdog = settings.watchdog;
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.orchestrator.target,
1619
- settings.orchestrator.model,
1620
- settings.orchestrator.thinkingLevel,
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.workers.default.target,
1625
- settings.workers.default.model,
1626
- settings.workers.default.thinkingLevel,
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.workers.profiles ?? {}).length;
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().orchestrator.target ?? undefined)
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().workers.default.target ?? undefined)
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().background.target ?? undefined)
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.workers.escalation ?? SHIPPED_ESCALATION;
1661
- const resilienceCooldownMs = settings.workers.resilienceCooldownMs ?? SHIPPED_RESILIENCE_COOLDOWN_MS;
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 guardrails = settings.guardrails;
1664
- const routing = settings.routing;
1665
- const library = settings.library;
1666
- const activeAgentRoles = routing.agentAutomation.activeAgentRoles;
1667
- const favorites = settings.modelSelector?.favorites ?? [];
1668
- const agents = settings.delegation?.agents ?? [];
1669
- const keybindingCount = Object.keys(settings.keybindings ?? {}).length;
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.workers.onPermission ?? "deny", {
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.delegation.defaults.toolGovernance, {
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.skills.trustProjectCompatRoots), {
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.orchestrator.target ?? "(unset)", {
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.orchestrator.model ?? "(unset)", {
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.background.target ?? "(unset — rules-only)", {
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.background.model ?? "(unset)", {
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("background.thinkingLevel", backgroundThinking.display, {
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.intervention.everyNTools), {
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.intervention.windowSteps), {
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.intervention.maxTokens), {
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.intervention.timeoutMs), {
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.enabled), {
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.workers.default.target ?? "(unset)", {
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.workers.default.model ?? "(unset)", {
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.workers.maxRetries), {
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.activeRoles.length > 0 ? routing.activeRoles.join(", ") : "(none)", {
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.activeRoles.join(", "),
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.journal", String(panes.journal), { values: ["true", "false"] }),
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.modelSelector.recentLimit), {
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.budget.sessionCeilingUsd), {
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.defaults.maxTokens), {
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.budget.concurrency), {
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(guardrails.turnToolCallBudget), {
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(guardrails.workerToolCallCap), {
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(guardrails.maxDispatchRuns), {
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(guardrails.readMaxBytes), {
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(guardrails.observationTurnBudgetBytes), {
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(guardrails.internalDispatchTimeoutMs), {
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.showTerminalProgress), {
1916
+ settingItem("terminal.showTerminalProgress", String(terminal.terminalProgress), {
1906
1917
  values: ["false", "true"],
1907
1918
  }),
1908
- settingItem("terminal.outputVerbosity", terminal.outputVerbosity, {
1919
+ settingItem("terminal.outputVerbosity", terminal.outputDetail, {
1909
1920
  values: ["minimal", "default", "verbose"],
1910
1921
  }),
1911
- settingItem("terminal.tuiMode", terminal.tuiMode, {
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.notify), {
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.yazi.enabled), { values: ["true", "false"] }),
1929
- settingItem("panes.yazi.mode", panes.yazi.mode, { values: ["companion", "chooser"] }),
1930
- settingItem("panes.yazi.profile", panes.yazi.profile, { values: ["managed", "user"] }),
1931
- settingItem("panes.yazi.followCwd", String(panes.yazi.followCwd), { values: ["true", "false"] }),
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("runtimePlugins", settings.runtimePlugins.length > 0 ? settings.runtimePlugins.join(", ") : "(none)", {
1956
- submenu: editTextSubmenu("Edit runtime plugins comma-separated list", "Restart Clio to load changes."),
1957
- affordance: "free text",
1958
- }),
1959
- settingItem("attribution.gitCommits", settings.attribution.gitCommits ? "enabled" : "disabled", {
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("delegation.defaults.connectTimeoutMs", String(settings.delegation.defaults.connectTimeoutMs), {
1971
- submenu: editNumberSubmenu("Edit delegate connect timeout (ms)", "delegation.defaults.connectTimeoutMs"),
1972
- affordance: "free text",
1973
- }),
1974
- settingItem("delegation.defaults.turnTimeoutMs", String(settings.delegation.defaults.turnTimeoutMs), {
1975
- submenu: editNumberSubmenu("Edit delegate turn timeout (ms)", "delegation.defaults.turnTimeoutMs"),
1976
- affordance: "free text",
1977
- }),
1978
- settingItem("delegation.defaults.permissionTimeoutMs", String(settings.delegation.defaults.permissionTimeoutMs), {
1979
- submenu: editNumberSubmenu("Edit delegate permission timeout (ms)", "delegation.defaults.permissionTimeoutMs"),
1980
- affordance: "free text",
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.workers.profiles)
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.workers.default.target ? model : `${target}/${model}`;
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) => `workers.profiles.${name}.${field}`).join(" · "),
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().workers.profiles[name];
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().workers.profiles[name]?.target ?? undefined)
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.workers.agentBindings)
2177
+ return Object.entries(settings.fleet.agentProfiles)
2151
2178
  .sort(([a], [b]) => a.localeCompare(b))
2152
2179
  .map(([agentId, profileName]) => {
2153
- const missing = !settings.workers.profiles[profileName];
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.orchestrator.target === target.id ? "chat" : null,
2177
- settings.workers.default.target === target.id ? "fleet" : null,
2178
- settings.background.target === target.id ? "memory" : null,
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
- export function buildSettingsSections(items: readonly SettingsCenterItem[]): SettingsCenterSection[] {
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.delegation.agents = settings.delegation.agents.filter((agent) => agent.id !== id);
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.delegation.defaults);
2365
- if (settings.delegation.agents.some((agent) => agent.id === entry.id)) return;
2366
- settings.delegation.agents.push(entry);
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
- export function applySettingChange(settings: ClioSettings, id: string, value: string): void {
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.workers.onPermission = value;
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.delegation.defaults.toolGovernance = value;
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") settings.skills.trustProjectCompatRoots = value === "true";
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.attribution.gitCommits = value === "enabled";
2420
+ if (value === "enabled" || value === "disabled") settings.integrations.git.commitAttribution = value === "enabled";
2391
2421
  return;
2392
2422
  case "orchestrator.thinkingLevel":
2393
- settings.orchestrator.thinkingLevel = thinkingLevelFromChoiceLabel(value) ?? settings.orchestrator.thinkingLevel;
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.intervention.enabled = value === "true";
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
- const key = id.slice("memory.intervention.".length) as "everyNTools" | "windowSteps" | "maxTokens" | "timeoutMs";
2408
- settings.memory.intervention[key] = next;
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.workers.default.thinkingLevel =
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.workers.maxRetries = next;
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.panes.journal = value === "true";
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.yazi.enabled = value === "true";
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.yazi.mode = value;
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.yazi.profile = value;
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.yazi.followCwd = value === "true";
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.modelSelector.recentLimit = next;
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.defaults.maxTokens = next;
2497
+ settings.chat.maxOutputTokens = next;
2450
2498
  });
2451
2499
  return;
2452
2500
  case "budget.concurrency": {
2453
2501
  if (value === "auto") {
2454
- settings.budget.concurrency = "auto";
2502
+ settings.fleet.concurrency = "auto";
2455
2503
  return;
2456
2504
  }
2457
2505
  applyNonNegativeInteger(value, (next) => {
2458
- if (next >= 1) settings.budget.concurrency = next;
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.terminal.showTerminalProgress = value === "true";
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.terminal.outputVerbosity = value;
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.terminal.tuiMode = value;
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.terminal.fullscreenScrollbar = value;
2559
+ settings.interface.fullscreenScrollbar = value;
2517
2560
  }
2518
2561
  return;
2519
2562
  case "terminal.notify":
2520
- if (value === "true" || value === "false") settings.terminal.notify = value === "true";
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.watchdog.enabled = value === "true";
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.watchdog.target = trimmed;
2532
- else delete settings.watchdog.target;
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.watchdog.cadenceToolCalls;
2538
- else settings.watchdog.cadenceToolCalls = next;
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.terminal.smoothStreaming = value;
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.delegation.defaults.connectTimeoutMs = next;
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.delegation.defaults.turnTimeoutMs = next;
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.delegation.defaults.permissionTimeoutMs = next;
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.orchestrator.target) {
2569
- settings.orchestrator.model = target
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.orchestrator.target = target;
2614
+ settings.chat.target = target;
2574
2615
  return;
2575
2616
  }
2576
2617
  case "orchestrator.model":
2577
- settings.orchestrator.model = value === "(unset)" || value === "" ? null : value;
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.background.target) {
2582
- settings.background.model = target
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.background.target = target;
2627
+ settings.context.memory.target = target;
2587
2628
  return;
2588
2629
  }
2589
2630
  case "background.model":
2590
- settings.background.model = value === "(unset)" || value === "" ? null : value;
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.workers.default.target) {
2595
- settings.workers.default.model = target
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.workers.default.target = target;
2640
+ settings.fleet.default.target = target;
2600
2641
  return;
2601
2642
  }
2602
2643
  case "workers.default.model":
2603
- settings.workers.default.model = value === "(unset)" || value === "" ? null : value;
2644
+ settings.fleet.default.model = value === "(unset)" || value === "" ? null : value;
2604
2645
  return;
2605
2646
  case "scope":
2606
- settings.scope =
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.budget.sessionCeilingUsd = next;
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.workers.escalation = { ...(settings.workers.escalation ?? SHIPPED_ESCALATION), timeoutMs: next };
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.workers.escalation = { ...(settings.workers.escalation ?? SHIPPED_ESCALATION), fallback: value };
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.workers.resilienceCooldownMs = next;
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.routing.activeRoles = outcome.values as ActiveRoutingRole[];
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.routing.activePostures = outcome.values as ActiveRoutingPosture[];
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.enabled = value === "true";
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 !== null) settings.guardrails[id.slice("guardrails.".length) as keyof GuardrailValues] = 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.workers.profiles[summaryName] && ["target", "model", "thinkingLevel", "node"].includes(legacyField ?? "");
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.workers.profiles[name];
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.workers.agentBindings[agentId];
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("workers.profiles.") && path.split(".").length === 3;
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("orchestrator.") ? "now" : "next-dispatch";
2873
+ return path.startsWith("chat.") ? "now" : "next-dispatch";
2821
2874
  }
2822
- if (path.startsWith("workers.")) return "next-dispatch";
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
- export function createSettingsChangePlan(
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("workers.agentBindings."))
3631
- .map((leaf) => leaf.path.slice("workers.agentBindings.".length));
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("workers.profiles.").map((path) => path.slice("workers.profiles.".length));
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("orchestrator."))} · ${describe("fleet route", paths("workers.default."))} · ${describe("memory route", paths("background."))} · ${describe("profiles", profiles)} · `;
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, width));
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 help, and the list is the work. A fixed six-line ceiling spent
3793
- * a third of a 20-row body on prose, so the budget is what the body can spare
3794
- * once the list keeps six rows.
3795
- *
3796
- * The ceiling follows the scope note, which wraps rather than cuts: at 90
3797
- * columns that note needs two rows, and the flat four-line ceiling then paid
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, width: number): number {
3803
- const noteLines = wrapTextWithAnsi(this.footerNoteText(), Math.max(1, width)).length;
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
- margin,
4182
- visible: (terminalWidth) => {
4183
- const side = terminalWidth < ULTRA_NARROW_TERMINAL_WIDTH ? 0 : SETTINGS_OVERLAY_MARGIN.left;
4184
- margin.left = side;
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
- innerWidth < WIDE_LAYOUT_MIN_WIDTH
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
  }