@iowarp/clio-coder 0.4.9 → 0.5.0

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 (1172) hide show
  1. package/.claude-plugin/marketplace.json +11 -3
  2. package/CHANGELOG.md +153 -0
  3. package/CODE_OF_CONDUCT.md +10 -0
  4. package/CONTRIBUTING.md +208 -382
  5. package/NOTICE +8 -2
  6. package/README.md +199 -418
  7. package/ROADMAP.md +82 -0
  8. package/SECURITY.md +14 -11
  9. package/dist/acp-KS7ARGV6.js +132 -0
  10. package/dist/agents-YOGJ2YEJ.js +163 -0
  11. package/dist/assets/codewiki.json +1 -1
  12. package/dist/auth-CEDCO6O6.js +557 -0
  13. package/dist/background-YWTBPSQU.js +39 -0
  14. package/dist/builtins-GDYO4RTR.js +23 -0
  15. package/dist/chunk-27YTM2CV.js +175 -0
  16. package/dist/chunk-2AF6YC7Q.js +75 -0
  17. package/dist/chunk-2DTIWSAW.js +381 -0
  18. package/dist/chunk-2EMLKSCX.js +262 -0
  19. package/dist/chunk-2OJ3YZQP.js +665 -0
  20. package/dist/chunk-2VLYHHFT.js +35 -0
  21. package/dist/chunk-2WVPJF3Z.js +204 -0
  22. package/dist/chunk-33OASOS6.js +176 -0
  23. package/dist/chunk-3BD2LXYJ.js +19 -0
  24. package/dist/chunk-3JHUFKG7.js +30 -0
  25. package/dist/chunk-3JLTRPN7.js +711 -0
  26. package/dist/chunk-3LT34CAM.js +2796 -0
  27. package/dist/chunk-3O5JWP4L.js +1670 -0
  28. package/dist/chunk-3UW3KU4A.js +21 -0
  29. package/dist/chunk-4A6YRGV4.js +569 -0
  30. package/dist/chunk-4D2BRCZ3.js +67 -0
  31. package/dist/chunk-4SYHGVDE.js +668 -0
  32. package/dist/chunk-4VDHLCF5.js +66 -0
  33. package/dist/chunk-4WOOTKFD.js +637 -0
  34. package/dist/chunk-4WV4PI66.js +80 -0
  35. package/dist/chunk-53OXPRI6.js +195 -0
  36. package/dist/chunk-55RMDDFM.js +1347 -0
  37. package/dist/chunk-56XP4FJU.js +2025 -0
  38. package/dist/chunk-5B3RTYAK.js +123 -0
  39. package/dist/chunk-5CD243WE.js +45 -0
  40. package/dist/chunk-5JQR5B4D.js +709 -0
  41. package/dist/chunk-5KQEUIWM.js +597 -0
  42. package/dist/chunk-5LP5FNNR.js +915 -0
  43. package/dist/chunk-62UK7AGW.js +9344 -0
  44. package/dist/chunk-6CTHLZFB.js +563 -0
  45. package/dist/chunk-6EJYVCTN.js +23 -0
  46. package/dist/chunk-6OWUM2NC.js +12289 -0
  47. package/dist/chunk-6RJMYYIE.js +1023 -0
  48. package/dist/chunk-6W75D37F.js +643 -0
  49. package/dist/chunk-733ZBT5P.js +1721 -0
  50. package/dist/chunk-77DCC6JZ.js +3710 -0
  51. package/dist/chunk-7QXCO3AF.js +156 -0
  52. package/dist/chunk-7RET77VB.js +481 -0
  53. package/dist/chunk-A4MVRV4C.js +65 -0
  54. package/dist/chunk-ALJWT6O6.js +93 -0
  55. package/dist/chunk-AVSR2HKI.js +232 -0
  56. package/dist/chunk-B7GY6QER.js +42 -0
  57. package/dist/chunk-BFOSV5EZ.js +178 -0
  58. package/dist/chunk-BGOIM7NB.js +103 -0
  59. package/dist/chunk-BJH6WFIB.js +372 -0
  60. package/dist/chunk-BOBCCDJ6.js +1533 -0
  61. package/dist/chunk-BRCOSE7O.js +117 -0
  62. package/dist/chunk-BYFHHCFV.js +601 -0
  63. package/dist/chunk-C2CPOIH2.js +83 -0
  64. package/dist/chunk-C7AQTPCE.js +694 -0
  65. package/dist/chunk-CBAQPTDU.js +165 -0
  66. package/dist/chunk-CDQ2UC6W.js +125 -0
  67. package/dist/chunk-CN6SW5DC.js +177 -0
  68. package/dist/chunk-CRHPCPZP.js +132 -0
  69. package/dist/chunk-CTFPFW3H.js +44 -0
  70. package/dist/chunk-D3KWFOUT.js +103 -0
  71. package/dist/chunk-D65E25JG.js +185 -0
  72. package/dist/chunk-DCGHJQ2U.js +236 -0
  73. package/dist/chunk-DE2LU267.js +106 -0
  74. package/dist/chunk-DF6PI6GN.js +97 -0
  75. package/dist/chunk-DGC6X6XR.js +53 -0
  76. package/dist/chunk-DOUISWEE.js +526 -0
  77. package/dist/chunk-DR3TAEUA.js +188 -0
  78. package/dist/chunk-DVTBERFY.js +33 -0
  79. package/dist/chunk-DXSETN72.js +1051 -0
  80. package/dist/chunk-DZLR4UEH.js +128 -0
  81. package/dist/chunk-E6IPKW2E.js +77 -0
  82. package/dist/chunk-EG4ARXPC.js +139 -0
  83. package/dist/chunk-EKV4UBCM.js +652 -0
  84. package/dist/chunk-EOJPDNUP.js +1325 -0
  85. package/dist/chunk-EX57VVWW.js +4157 -0
  86. package/dist/chunk-EYTLV3W3.js +5937 -0
  87. package/dist/chunk-EZD2BXGP.js +475 -0
  88. package/dist/chunk-EZDCA34W.js +314 -0
  89. package/dist/chunk-FD2I4KBR.js +33 -0
  90. package/dist/chunk-FD3IAHQM.js +27 -0
  91. package/dist/chunk-FFYTC2KQ.js +416 -0
  92. package/dist/chunk-FGSQHUCK.js +110 -0
  93. package/dist/chunk-GCQFN7YI.js +32 -0
  94. package/dist/chunk-GGPF6LLE.js +38 -0
  95. package/dist/chunk-GGWI3OVM.js +215 -0
  96. package/dist/chunk-GLIQT7SU.js +172 -0
  97. package/dist/chunk-GN7QBEEI.js +95 -0
  98. package/dist/chunk-GRHOXDKB.js +1104 -0
  99. package/dist/chunk-HMN2C6YL.js +54 -0
  100. package/dist/chunk-HOEDA42N.js +310 -0
  101. package/dist/chunk-HOYZUKG7.js +192 -0
  102. package/dist/chunk-HQVN7G4F.js +1021 -0
  103. package/dist/chunk-HSQQFDB3.js +519 -0
  104. package/dist/chunk-I4ELN5BX.js +47 -0
  105. package/dist/chunk-I4Y4WKZR.js +386 -0
  106. package/dist/chunk-IFPDAD7R.js +797 -0
  107. package/dist/chunk-IN7DGBVS.js +582 -0
  108. package/dist/chunk-ISHUS7HC.js +396 -0
  109. package/dist/chunk-JPXLJSGR.js +191 -0
  110. package/dist/chunk-JQCLXSFI.js +69 -0
  111. package/dist/chunk-KBUTSJSR.js +61 -0
  112. package/dist/chunk-KW5HXKLJ.js +56 -0
  113. package/dist/chunk-L4APUGCT.js +139 -0
  114. package/dist/chunk-L7G7K4I2.js +505 -0
  115. package/dist/chunk-LAR7DX5E.js +1840 -0
  116. package/dist/chunk-LAVUQX3B.js +462 -0
  117. package/dist/chunk-LJRBX7QR.js +116 -0
  118. package/dist/chunk-LNOXCGN2.js +1864 -0
  119. package/dist/chunk-LTWH2ACR.js +23002 -0
  120. package/dist/chunk-LYJJ6546.js +661 -0
  121. package/dist/chunk-M2IPMWCN.js +457 -0
  122. package/dist/chunk-MGLRTOCK.js +101 -0
  123. package/dist/chunk-MZF5IKZT.js +160 -0
  124. package/dist/chunk-N24R6KWS.js +386 -0
  125. package/dist/chunk-NASYVWDB.js +604 -0
  126. package/dist/chunk-NBXFPI7U.js +195 -0
  127. package/dist/chunk-NDPF2N2L.js +400 -0
  128. package/dist/chunk-NFSK2VNU.js +446 -0
  129. package/dist/chunk-NG3QQSXY.js +43 -0
  130. package/dist/chunk-NOCSM22Y.js +63 -0
  131. package/dist/chunk-NVPXXW2H.js +1143 -0
  132. package/dist/chunk-O63U2I6I.js +30 -0
  133. package/dist/chunk-OJXOA6YU.js +98 -0
  134. package/dist/chunk-OPD7GL6F.js +1196 -0
  135. package/dist/chunk-OQ2EOAHA.js +14399 -0
  136. package/dist/chunk-OV62D6KO.js +688 -0
  137. package/dist/chunk-OZ76TLGU.js +740 -0
  138. package/dist/chunk-P4GNZPXO.js +1156 -0
  139. package/dist/chunk-PS6JAWJZ.js +78 -0
  140. package/dist/chunk-PXRCXGLK.js +1865 -0
  141. package/dist/chunk-QDUUOZ3S.js +108 -0
  142. package/dist/chunk-QG6I2T5E.js +1416 -0
  143. package/dist/chunk-QHSBROEW.js +308 -0
  144. package/dist/chunk-QNUQ7K7D.js +46 -0
  145. package/dist/chunk-QZTTRSJE.js +333 -0
  146. package/dist/chunk-R2UUNSNQ.js +1605 -0
  147. package/dist/chunk-R7FGRZNF.js +1794 -0
  148. package/dist/chunk-RNDCROSG.js +199 -0
  149. package/dist/chunk-S36CXHO2.js +302 -0
  150. package/dist/chunk-SJGS3GDI.js +575 -0
  151. package/dist/chunk-SQZHXUB3.js +510 -0
  152. package/dist/chunk-SUTLW6ND.js +686 -0
  153. package/dist/chunk-SYF7FVBL.js +179 -0
  154. package/dist/chunk-T2MDZES3.js +1577 -0
  155. package/dist/chunk-T33IYTZM.js +1146 -0
  156. package/dist/chunk-TDGYTWM6.js +49 -0
  157. package/dist/chunk-TGL5FZVD.js +132 -0
  158. package/dist/chunk-TGWZXJ7L.js +1205 -0
  159. package/dist/chunk-TKDRT2DF.js +114 -0
  160. package/dist/chunk-TV2EBCSQ.js +152 -0
  161. package/dist/chunk-U26XXPJS.js +367 -0
  162. package/dist/chunk-U5QU5ZOD.js +419 -0
  163. package/dist/chunk-U6YTUVOX.js +1011 -0
  164. package/dist/chunk-UCINIRHW.js +188 -0
  165. package/dist/chunk-UJD5MPP6.js +52 -0
  166. package/dist/chunk-URCXX7WJ.js +146 -0
  167. package/dist/chunk-UX2L5CUD.js +898 -0
  168. package/dist/chunk-UZVYEF57.js +114 -0
  169. package/dist/chunk-V35KZDUZ.js +218 -0
  170. package/dist/chunk-VESL6DQY.js +1058 -0
  171. package/dist/chunk-VKHLUZNO.js +986 -0
  172. package/dist/chunk-VOYUCAQF.js +584 -0
  173. package/dist/chunk-VYRQHORQ.js +414 -0
  174. package/dist/chunk-W53XSRQE.js +245 -0
  175. package/dist/chunk-X4CEFOSG.js +226 -0
  176. package/dist/chunk-XDHUDE5K.js +380 -0
  177. package/dist/chunk-XISLDHEL.js +1290 -0
  178. package/dist/chunk-XM34YQ2Y.js +169 -0
  179. package/dist/chunk-XMDBTYCH.js +661 -0
  180. package/dist/chunk-XS2QPZJE.js +449 -0
  181. package/dist/chunk-YBUECLAF.js +618 -0
  182. package/dist/chunk-YQ6XEFVK.js +332 -0
  183. package/dist/chunk-YYLCPDCC.js +990 -0
  184. package/dist/chunk-Z4GLJ6J4.js +1035 -0
  185. package/dist/chunk-ZARZ4POR.js +210 -0
  186. package/dist/chunk-ZJPORZTC.js +119 -0
  187. package/dist/chunk-ZNUZ3EXD.js +243 -0
  188. package/dist/chunk-ZPST2KQO.js +49 -0
  189. package/dist/chunk-ZR5YA6ZF.js +512 -0
  190. package/dist/chunk-ZU4JPCPR.js +319 -0
  191. package/dist/chunk-ZUKUCZYZ.js +39 -0
  192. package/dist/cli/index.js +56 -45
  193. package/dist/clio-K2PBVCEM.js +27 -0
  194. package/dist/clio-context-tools-GR4OHFSO.js +145 -0
  195. package/dist/code-nav-4X3OI6DK.js +715 -0
  196. package/dist/codewiki/build-worker.js +4 -4
  197. package/dist/compile-cache-YRB6QRO7.js +18 -0
  198. package/dist/components-RQOJ6NUR.js +675 -0
  199. package/dist/config-Q5J7UBAB.js +291 -0
  200. package/dist/config-XE7XYZLU.js +38 -0
  201. package/dist/config-graph-P3555574.js +175 -0
  202. package/dist/configure-KIJ32ZO6.js +104 -0
  203. package/dist/context-LFBQOSXT.js +344 -0
  204. package/dist/context-NNLBES2Y.js +82 -0
  205. package/dist/context-WBH3KSVR.js +302 -0
  206. package/dist/context-clear-YOHMQ6SQ.js +208 -0
  207. package/dist/context-index-X2N5UAIF.js +120 -0
  208. package/dist/context-map-HOSMGUG2.js +555 -0
  209. package/dist/context-working-set-MRAEVDNV.js +1564 -0
  210. package/dist/data-tool-JJPBGMQJ.js +2986 -0
  211. package/dist/detail-RHJOTGN4.js +139 -0
  212. package/dist/dispatch-runner-NC7PYNIO.js +2477 -0
  213. package/dist/docs-K4GBWRUX.js +342 -0
  214. package/dist/doctor-S5KZ2GTN.js +1138 -0
  215. package/dist/doctor-deep-2EJQSHIZ.js +130 -0
  216. package/dist/domain-loader-MB34FDPD.js +13 -0
  217. package/dist/eval-3D6M36N7.js +5220 -0
  218. package/dist/eval-inventory-SM3HNM47.js +260 -0
  219. package/dist/evals-FO6JEUCN.js +104 -0
  220. package/dist/evidence-6IYN52ET.js +262 -0
  221. package/dist/evidence-JVECPI3F.js +250 -0
  222. package/dist/evidence-XNVPPLVK.js +410 -0
  223. package/dist/evolve-TLPUDJDM.js +634 -0
  224. package/dist/extensions-ROZJ5X3J.js +311 -0
  225. package/dist/fleet-6RJWIOEO.js +284 -0
  226. package/dist/fleet-WKVBF5SZ.js +942 -0
  227. package/dist/fleet-commands-L6WFT7KZ.js +76 -0
  228. package/dist/fleet-decisions-BTQMWU5A.js +55 -0
  229. package/dist/fleet-graph-553DZ67Q.js +141 -0
  230. package/dist/fleet-inspect-236FZPRB.js +329 -0
  231. package/dist/fleet-new-CKUXP3CO.js +48 -0
  232. package/dist/fleet-preflight-NZQHABWO.js +95 -0
  233. package/dist/fleet-validate-7NLAE26R.js +96 -0
  234. package/dist/fleet-verify-E3RO6A5W.js +226 -0
  235. package/dist/fleet-view-KMZQY7YJ.js +144 -0
  236. package/dist/gui/client/assets/abnfDiagram-VCTEODGH-DPBWQwNn.js +1 -0
  237. package/dist/gui/client/assets/architecture-7GRP2DOG-D1w8FrFW.js +1 -0
  238. package/dist/gui/client/assets/architectureDiagram-5GKGNRK7-CVPgKd1-.js +36 -0
  239. package/dist/gui/client/assets/blockDiagram-I7D4REHJ-BLmnqkK5.js +129 -0
  240. package/dist/gui/client/assets/c4Diagram-7LVT6UL2-4AU9cfM7.js +38 -0
  241. package/dist/gui/client/assets/channel-DwFZ0m8S.js +1 -0
  242. package/dist/gui/client/assets/chunk-4HAMMTFA-EOWkKCav.js +62 -0
  243. package/dist/gui/client/assets/chunk-75Z2AOVW-CygeoIMl.js +2 -0
  244. package/dist/gui/client/assets/chunk-DU6HZSFF-s27fViLb.js +125 -0
  245. package/dist/gui/client/assets/chunk-F27PBJKO-BrHvwLsZ.js +1 -0
  246. package/dist/gui/client/assets/chunk-GMAD6QVW-DzPh-7jt.js +72 -0
  247. package/dist/gui/client/assets/chunk-GVQU2GXP-pIaQkIzm.js +1 -0
  248. package/dist/gui/client/assets/chunk-IMKFNOWR-BGJVE_Br.js +231 -0
  249. package/dist/gui/client/assets/chunk-L3NEJ4N5-B3YLuhww.js +1 -0
  250. package/dist/gui/client/assets/chunk-OSK3NFVY-BRj61HHU.js +10 -0
  251. package/dist/gui/client/assets/chunk-P2QGCYS3-Sno90KxP.js +1 -0
  252. package/dist/gui/client/assets/chunk-POPQ4Y6H-Cw8NTbxr.js +1 -0
  253. package/dist/gui/client/assets/chunk-PWAF6VOD-BIhHgz37.js +1 -0
  254. package/dist/gui/client/assets/chunk-SHT3W25Y-Cqv7npBj.js +168 -0
  255. package/dist/gui/client/assets/chunk-SVP7TREG-Hxzl6Dee.js +88 -0
  256. package/dist/gui/client/assets/chunk-TICWLB2K-CIFVyVP2.js +206 -0
  257. package/dist/gui/client/assets/classDiagram-ZZMXUADV-BJbAiI_w.js +1 -0
  258. package/dist/gui/client/assets/classDiagram-v2-VYDZK3BY-BJbAiI_w.js +1 -0
  259. package/dist/gui/client/assets/cynefin-OW5HDTMX-DecLWZ-y.js +1 -0
  260. package/dist/gui/client/assets/cynefinDiagram-5FMLGOSQ-CK-T2N-D.js +62 -0
  261. package/dist/gui/client/assets/dagre-GXQ25YYZ-C0dfg-OS.js +4 -0
  262. package/dist/gui/client/assets/diagram-S7CK7UJ4-EaJukVh-.js +30 -0
  263. package/dist/gui/client/assets/diagram-UQ7AKVKN-xcOucEtP.js +41 -0
  264. package/dist/gui/client/assets/diagram-VSXAHHWV-3AUJACMf.js +3 -0
  265. package/dist/gui/client/assets/diagram-VX7I27RA-TPknLqam.js +24 -0
  266. package/dist/gui/client/assets/diagram-Z3DM3KII-wa1q3YMF.js +24 -0
  267. package/dist/gui/client/assets/ebnfDiagram-PWID7BFC-JBCF2-s7.js +1 -0
  268. package/dist/gui/client/assets/erDiagram-RLTQ6QDP-CmXjXPc4.js +99 -0
  269. package/dist/gui/client/assets/eventmodeling-NTZA5JFV-D_1aJWYl.js +1 -0
  270. package/dist/gui/client/assets/flowDiagram-HODETNUW-BQtZlael.js +1 -0
  271. package/dist/gui/client/assets/framework-Bq-znqwW.js +9 -0
  272. package/dist/gui/client/assets/ganttDiagram-EL5Y4UJY-IPaL_kaa.js +292 -0
  273. package/dist/gui/client/assets/gitGraph-4MIJSDKK-Oy0Q3hoc.js +1 -0
  274. package/dist/gui/client/assets/gitGraphDiagram-WWUBYQGX-jtAuBmbc.js +106 -0
  275. package/dist/gui/client/assets/index-CuFuBEdL.css +1 -0
  276. package/dist/gui/client/assets/index-hMbEIsX0.js +87 -0
  277. package/dist/gui/client/assets/info-A6RAGUB7-UtEs1tv7.js +1 -0
  278. package/dist/gui/client/assets/infoDiagram-27XIBGKW-hlwR1pBW.js +2 -0
  279. package/dist/gui/client/assets/ishikawaDiagram-5VMMS53U-C6vMtfsd.js +70 -0
  280. package/dist/gui/client/assets/journeyDiagram-3NMN7TZE-EAwAl_PS.js +139 -0
  281. package/dist/gui/client/assets/kanban-definition-UXKFOSKX-CQOhRKHW.js +89 -0
  282. package/dist/gui/client/assets/line-DbcwGZTW.js +1 -0
  283. package/dist/gui/client/assets/mermaid-parser.core-C2QfVcHd.js +7 -0
  284. package/dist/gui/client/assets/mermaid.core-N9qUTre1.js +44 -0
  285. package/dist/gui/client/assets/mindmap-definition-YA3MSWOX-BR_FL9gK.js +96 -0
  286. package/dist/gui/client/assets/packet-AYTQ26CC-CbBJ2oAa.js +1 -0
  287. package/dist/gui/client/assets/pegDiagram-XKGWAZYB-BruU0IHM.js +1 -0
  288. package/dist/gui/client/assets/pie-WAS4IAKB-BWdSng4H.js +1 -0
  289. package/dist/gui/client/assets/pieDiagram-E7YTZNPT-CR3ljgdU.js +39 -0
  290. package/dist/gui/client/assets/quadrantDiagram-AXDQQJYC-C-boKslr.js +7 -0
  291. package/dist/gui/client/assets/radar-RG4KPBEZ-CGlOnAKG.js +1 -0
  292. package/dist/gui/client/assets/railroad-74A4TZTK-CDvuAlyC.js +1 -0
  293. package/dist/gui/client/assets/railroad-abnf-HS5TGJTU-CQUA9crC.js +1 -0
  294. package/dist/gui/client/assets/railroad-ebnf-LZEXJU2U-CD857gxq.js +1 -0
  295. package/dist/gui/client/assets/railroad-peg-WCYAUIDC-DUV4k35E.js +1 -0
  296. package/dist/gui/client/assets/railroadDiagram-O6MQD6OU-DMR4LXmA.js +1 -0
  297. package/dist/gui/client/assets/requirementDiagram-BXWQKSXE-DVltaF6c.js +84 -0
  298. package/dist/gui/client/assets/sankeyDiagram-P5KCCOFB-CHdNz472.js +40 -0
  299. package/dist/gui/client/assets/sequenceDiagram-WJ2MYXX4-DaMafIty.js +162 -0
  300. package/dist/gui/client/assets/stateDiagram-D77RDMKH-CEbBHqn3.js +1 -0
  301. package/dist/gui/client/assets/stateDiagram-v2-MP3YSRHH-B3JgDdFg.js +1 -0
  302. package/dist/gui/client/assets/swimlanes-42K2YHIH-BlPHndnJ.js +1 -0
  303. package/dist/gui/client/assets/swimlanesDiagram-VR7AAH4N-BPabHwsZ.js +8 -0
  304. package/dist/gui/client/assets/timeline-definition-24CTP7MA-E4Y1lPBI.js +120 -0
  305. package/dist/gui/client/assets/treeView-Q6P3EWNA-DrY0uhTN.js +1 -0
  306. package/dist/gui/client/assets/treemap-WGGIJYW6-CVotnLHf.js +1 -0
  307. package/dist/gui/client/assets/vennDiagram-4TSXK5OY-DJNrLIOF.js +34 -0
  308. package/dist/gui/client/assets/wardley-WFR3VGLG-ClOpAp5S.js +1 -0
  309. package/dist/gui/client/assets/wardleyDiagram-VM6X3IG4-qhMoKOXc.js +78 -0
  310. package/dist/gui/client/assets/xychartDiagram-S5SC5T6Z-CTuXoo9R.js +7 -0
  311. package/dist/gui/client/index.html +6 -0
  312. package/dist/gui/ops-worker.js +167 -0
  313. package/dist/gui/reads-worker.js +473 -0
  314. package/dist/gui/server.js +9780 -0
  315. package/dist/gui-QJS7XQMV.js +16 -0
  316. package/dist/init-DV5B6HQG.js +354 -0
  317. package/dist/install-6C45YXFP.js +19 -0
  318. package/dist/install-O7NSRU2W.js +13 -0
  319. package/dist/interactive-OXGYZYAS.js +22381 -0
  320. package/dist/interop-J7UOBOSF.js +254 -0
  321. package/dist/inventory-OEGIL6PY.js +144 -0
  322. package/dist/library-B3UPGY4V.js +83 -0
  323. package/dist/library-MXQA5DLT.js +309 -0
  324. package/dist/library-ROZAMUIL.js +496 -0
  325. package/dist/library-import-2LTWOVBD.js +190 -0
  326. package/dist/library-inventory-LJ3XHLWO.js +60 -0
  327. package/dist/library-validation-DARHHUNW.js +46 -0
  328. package/dist/mcp-2GSPYQ54.js +28 -0
  329. package/dist/memory-J3STUUIK.js +537 -0
  330. package/dist/models-Y3GMFJ2V.js +314 -0
  331. package/dist/monitor-LHNH577J.js +811 -0
  332. package/dist/orchestrator-DTAPXULA.js +12117 -0
  333. package/dist/panes-A743ONZ5.js +103 -0
  334. package/dist/panes-CTNO57ZY.js +76 -0
  335. package/dist/paths-3SBYJQDP.js +68 -0
  336. package/dist/preload-OJBMAIXF.js +140 -0
  337. package/dist/providers-CMETPZNS.js +232 -0
  338. package/dist/registry-37T4U6X2.js +15 -0
  339. package/dist/reset-O7EUCYWO.js +346 -0
  340. package/dist/resources-FY6XYFN2.js +189 -0
  341. package/dist/run-H64MEVTA.js +1067 -0
  342. package/dist/run-script-PQ5NRU3X.js +42 -0
  343. package/dist/settings-SNIQNXCW.js +73 -0
  344. package/dist/settings-controls-X6GMCPVG.js +202 -0
  345. package/dist/share-CAFMMQLM.js +299 -0
  346. package/dist/skills-ERKQUC7L.js +114 -0
  347. package/dist/skills-eval-CQ23MYQK.js +1099 -0
  348. package/dist/skills-inventory-TVUYJDVN.js +142 -0
  349. package/dist/slash-commands-ROG3KIFJ.js +107 -0
  350. package/dist/startup-background-KDWCQMWT.js +247 -0
  351. package/dist/steer-KKYXJSH4.js +77 -0
  352. package/dist/support-M3RCUUEL.js +40 -0
  353. package/dist/system-ZDW44ZGX.js +142 -0
  354. package/dist/target-runtimes-PWA22WVW.js +73 -0
  355. package/dist/targets-AJWA6E7Z.js +1207 -0
  356. package/dist/tasks-6L2JJRC5.js +39 -0
  357. package/dist/terminal-lease-YFUSDPAD.js +432 -0
  358. package/dist/tools-5XJUABRD.js +30 -0
  359. package/dist/trace-LA5MVR4Y.js +527 -0
  360. package/dist/tree-sitter-TQW3Y52T.js +4673 -0
  361. package/dist/tui-primitives-IUCVWLH5.js +19 -0
  362. package/dist/uninstall-SAWGGXAB.js +448 -0
  363. package/dist/upgrade-HSNSVTZG.js +300 -0
  364. package/dist/usage-XSILDHKF.js +1083 -0
  365. package/dist/verifiers-ECA5GIHL.js +633 -0
  366. package/dist/verify-R6QQCCEB.js +31 -0
  367. package/dist/version-PLZYB5KW.js +22 -0
  368. package/dist/web-fetch-PVZNMBOB.js +803 -0
  369. package/dist/wiki-generate-RP22WP5K.js +647 -0
  370. package/dist/with-panes-W3PAZPRF.js +629 -0
  371. package/dist/worker/entry.js +324 -284
  372. package/dist/workspace-check-3764ZKC2.js +83 -0
  373. package/docs/README.md +26 -10
  374. package/docs/architecture/acp.md +179 -12
  375. package/docs/architecture/artifact-placement.md +1 -1
  376. package/docs/architecture/capacity-and-scheduling.md +7 -8
  377. package/docs/architecture/context-engine.md +350 -95
  378. package/docs/architecture/model-catalog.md +18 -11
  379. package/docs/architecture/observability.md +1 -1
  380. package/docs/architecture/pi-boundary.md +59 -6
  381. package/docs/architecture/prompt-envelope-and-tools.md +147 -39
  382. package/docs/architecture/provider-adapter-cookbook.md +2 -2
  383. package/docs/architecture/safety-model.md +18 -4
  384. package/docs/architecture/trace-store.md +2 -2
  385. package/docs/architecture/tui-design.md +41 -81
  386. package/docs/architecture/worker-dispatch-mechanics.md +9 -1
  387. package/docs/gui/README.md +69 -0
  388. package/docs/gui/boundary-doctrine.md +104 -0
  389. package/docs/gui/chat-rendering-spec.md +1440 -0
  390. package/docs/gui/cli-surface-routing.md +148 -0
  391. package/docs/gui/delivery-order.md +53 -0
  392. package/docs/gui/event-bus-coverage.md +103 -0
  393. package/docs/gui/inspector-presentation.md +71 -0
  394. package/docs/gui/parity/01-cli-surface.md +74 -0
  395. package/docs/gui/parity/02-slash-and-surfaces.md +110 -0
  396. package/docs/gui/parity/03-domains-and-plan.md +69 -0
  397. package/docs/gui/performance-baseline.md +76 -0
  398. package/docs/gui/settings-write-surface.md +267 -0
  399. package/docs/gui/workflow-coverage.md +64 -0
  400. package/docs/guide/built-in-agents.md +1 -1
  401. package/docs/guide/commands-and-modes.md +256 -99
  402. package/docs/guide/configuration-and-targets.md +485 -124
  403. package/docs/guide/configuration-reference.md +165 -82
  404. package/docs/guide/doctor.md +127 -0
  405. package/docs/guide/environment-variables.md +1 -1
  406. package/docs/guide/exit-codes-and-output.md +3 -1
  407. package/docs/guide/extensions-and-sharing.md +3 -14
  408. package/docs/guide/fleet-dispatch.md +231 -45
  409. package/docs/guide/glossary.md +1 -1
  410. package/docs/guide/installation-and-lifecycle.md +27 -16
  411. package/docs/guide/interop.md +2 -2
  412. package/docs/guide/proactive-memory.md +154 -68
  413. package/docs/guide/resource-library.md +4 -0
  414. package/docs/guide/skills-marketplace.md +8 -4
  415. package/docs/guide/slurm.md +88 -0
  416. package/docs/guide/tool-usage.md +134 -11
  417. package/docs/guide/troubleshooting.md +4 -2
  418. package/docs/process/battletest-2026-09-20-fixes.md +161 -0
  419. package/docs/process/configure-tree-proposal.md +637 -0
  420. package/docs/process/documentation-coverage.md +8 -0
  421. package/docs/process/documentation-guide.md +18 -1
  422. package/docs/process/eval-runner.md +58 -14
  423. package/docs/process/performance-methodology.md +11 -3
  424. package/docs/process/release-cut-checklist.md +29 -3
  425. package/docs/process/tool-audit-v0.4.9.md +3 -0
  426. package/examples/extensions/README.md +1 -3
  427. package/examples/extensions/lab-status/clio-coder-extension.json +1 -1
  428. package/examples/extensions/measurements/clio-coder-extension.json +1 -1
  429. package/library/registry.yaml +30 -5
  430. package/library/skills/git/fix-issue/SKILL.md +2 -1
  431. package/library/skills/git/fix-issue/plugin.json +1 -1
  432. package/library/skills/git/ship/SKILL.md +2 -1
  433. package/library/skills/git/ship/plugin.json +1 -1
  434. package/library/skills/meta/clio-coder-test/SKILL.md +5 -6
  435. package/library/skills/meta/clio-coder-test/evals.md +2 -2
  436. package/library/skills/meta/clio-coder-test/references/test-map.md +2 -2
  437. package/library/skills/registry.yaml +9 -5
  438. package/library/skills/research/slurm-jobs/SKILL.md +110 -0
  439. package/library/skills/research/slurm-jobs/evals.md +39 -0
  440. package/library/skills/research/slurm-jobs/plugin.json +23 -0
  441. package/library/skills/skill-marketplace.json +18 -2
  442. package/package.json +15 -10
  443. package/src/cli/args.ts +59 -0
  444. package/src/cli/argv.ts +7 -0
  445. package/src/cli/clio.ts +9 -1
  446. package/src/cli/configure-controls.ts +136 -0
  447. package/src/cli/configure-onboarding.ts +24 -7
  448. package/src/cli/configure-quick.ts +32 -7
  449. package/src/cli/configure-target.ts +11 -1
  450. package/src/cli/configure.ts +253 -256
  451. package/src/cli/docs-server.ts +290 -0
  452. package/src/cli/docs.ts +60 -15
  453. package/src/cli/doctor-deep.ts +126 -0
  454. package/src/cli/doctor-hpc.ts +122 -0
  455. package/src/cli/doctor-slurm.ts +130 -0
  456. package/src/cli/doctor-task-worktrees.ts +88 -0
  457. package/src/cli/doctor.ts +165 -16
  458. package/src/cli/fleet-verify.ts +3 -2
  459. package/src/cli/gui.ts +111 -0
  460. package/src/cli/index.ts +14 -4
  461. package/src/cli/library.ts +2 -7
  462. package/src/cli/modes/json-stream.ts +4 -2
  463. package/src/cli/modes/print.ts +252 -25
  464. package/src/cli/run.ts +199 -71
  465. package/src/cli/skills.ts +25 -7
  466. package/src/cli/targets.ts +87 -9
  467. package/src/cli/uninstall.ts +28 -8
  468. package/src/cli/usage.ts +2 -1
  469. package/src/cli/workspace-check.ts +71 -0
  470. package/src/core/bash-exec.ts +8 -2
  471. package/src/core/bus-events.ts +32 -3
  472. package/src/core/cache-telemetry.ts +3 -2
  473. package/src/core/compile-cache.ts +11 -1
  474. package/src/core/config.ts +59 -6
  475. package/src/core/defaults.ts +27 -5
  476. package/src/core/diagnostics.ts +25 -0
  477. package/src/core/event-bus.ts +2 -1
  478. package/src/core/gateway-routing.ts +10 -3
  479. package/src/core/git-commit-attribution.ts +2 -1
  480. package/src/core/naming-compat.ts +6 -4
  481. package/src/core/package-root.ts +0 -9
  482. package/src/core/path-canonical.ts +143 -24
  483. package/src/core/residency-target-key.ts +2 -6
  484. package/src/core/run-overrides.ts +1 -1
  485. package/src/core/settings-awareness.ts +108 -0
  486. package/src/core/settings-controls.ts +673 -0
  487. package/src/core/settings-navigation.ts +116 -0
  488. package/src/core/theme-token-hex.ts +19 -9
  489. package/src/core/turn-constraints.ts +52 -0
  490. package/src/domains/agents/builtins/scout.md +7 -17
  491. package/src/domains/agents/catalog.ts +5 -1
  492. package/src/domains/agents/extension.ts +2 -1
  493. package/src/domains/agents/registry.ts +4 -3
  494. package/src/domains/agents/result-contract.ts +132 -1
  495. package/src/domains/config/classify.ts +11 -7
  496. package/src/domains/config/extension.ts +5 -1
  497. package/src/domains/config/keybindings.ts +2 -2
  498. package/src/domains/context/codewiki/coordinator.ts +10 -0
  499. package/src/domains/context/worker/snapshot.ts +6 -3
  500. package/src/domains/dispatch/active-route-planner.ts +2 -0
  501. package/src/domains/dispatch/agent-candidates.ts +5 -1
  502. package/src/domains/dispatch/capability-match.ts +1 -1
  503. package/src/domains/dispatch/contract.ts +28 -0
  504. package/src/domains/dispatch/event-pump.ts +37 -3
  505. package/src/domains/dispatch/extension.ts +391 -48
  506. package/src/domains/dispatch/failure-classification.ts +37 -2
  507. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  508. package/src/domains/dispatch/run-identity.ts +10 -3
  509. package/src/domains/dispatch/target-breaker.ts +163 -0
  510. package/src/domains/dispatch/types.ts +29 -2
  511. package/src/domains/dispatch/worker-model-loads.ts +66 -0
  512. package/src/domains/dispatch/worker-protocol.ts +20 -1
  513. package/src/domains/dispatch/worker-spawn.ts +28 -2
  514. package/src/domains/eval/artifacts/redact.ts +9 -0
  515. package/src/domains/eval/metrics/noop.ts +61 -0
  516. package/src/domains/eval/reports/junit.ts +5 -1
  517. package/src/domains/eval/reports/text.ts +7 -0
  518. package/src/domains/eval/runners/clio-run.ts +19 -8
  519. package/src/domains/eval/runners/external-command.ts +29 -4
  520. package/src/domains/eval/schema/adapter.ts +6 -2
  521. package/src/domains/eval/schema/suite.ts +2 -0
  522. package/src/domains/eval/schema/validate.ts +3 -0
  523. package/src/domains/eval/suites/run.ts +167 -26
  524. package/src/domains/evidence/detail.ts +3 -2
  525. package/src/domains/extensions/operator-runtime.ts +11 -4
  526. package/src/domains/gateway/mcp/client.ts +1 -1
  527. package/src/domains/lifecycle/doctor.ts +42 -26
  528. package/src/domains/lifecycle/migrations/2026-09-18-ollama-runtime-id.ts +38 -0
  529. package/src/domains/lifecycle/migrations/index.ts +2 -0
  530. package/src/domains/middleware/demo-guidance.ts +36 -0
  531. package/src/domains/middleware/dispatch-nudge.ts +1 -1
  532. package/src/domains/middleware/memory-intervention.ts +51 -4
  533. package/src/domains/middleware/runtime.ts +5 -4
  534. package/src/domains/middleware/skills-reminder.ts +29 -52
  535. package/src/domains/middleware/task-nudge.ts +1 -0
  536. package/src/domains/middleware/watchdog.ts +4 -0
  537. package/src/domains/observability/extension.ts +2 -1
  538. package/src/domains/observability/out-of-turn-usage.ts +3 -2
  539. package/src/domains/observability/projection.ts +3 -2
  540. package/src/domains/observability/worker-progress.ts +48 -0
  541. package/src/domains/prompts/compiler.ts +148 -52
  542. package/src/domains/prompts/contract.ts +3 -3
  543. package/src/domains/prompts/demo-guidance.ts +8 -0
  544. package/src/domains/prompts/extension.ts +12 -7
  545. package/src/domains/prompts/fragments/identity/clio.md +2 -1
  546. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -0
  547. package/src/domains/prompts/fragments/identity/self-awareness.md +4 -0
  548. package/src/domains/prompts/fragments/operating/contract.md +16 -7
  549. package/src/domains/prompts/fragments/operating/delegation.md +29 -13
  550. package/src/domains/prompts/fragments/operating/skills.md +18 -10
  551. package/src/domains/prompts/fragments/operating/worker.md +2 -0
  552. package/src/domains/providers/cache-deployment.ts +45 -2
  553. package/src/domains/providers/contract.ts +52 -11
  554. package/src/domains/providers/extension.ts +230 -53
  555. package/src/domains/providers/model-discovery.ts +22 -8
  556. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +5 -7
  557. package/src/domains/providers/plugins.ts +3 -4
  558. package/src/domains/providers/probe/fingerprint.ts +2 -2
  559. package/src/domains/providers/probe/reasoning.ts +9 -16
  560. package/src/domains/providers/probe/tool-call.ts +236 -0
  561. package/src/domains/providers/registry.ts +51 -8
  562. package/src/domains/providers/runtime-resolution.ts +60 -12
  563. package/src/domains/providers/runtimes/boot-manifest.ts +1 -1
  564. package/src/domains/providers/runtimes/builtins.ts +2 -2
  565. package/src/domains/providers/runtimes/common/lmstudio-http.ts +57 -41
  566. package/src/domains/providers/runtimes/common/local-synth.ts +3 -1
  567. package/src/domains/providers/runtimes/common/ollama-model-ids.ts +11 -0
  568. package/src/domains/providers/runtimes/common/probe-helpers.ts +53 -0
  569. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +3 -1
  570. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +7 -13
  571. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +7 -17
  572. package/src/domains/providers/runtimes/local-native/llamacpp.ts +1 -0
  573. package/src/domains/providers/runtimes/local-native/ollama.ts +211 -0
  574. package/src/domains/providers/runtimes/protocol/litellm.ts +77 -65
  575. package/src/domains/providers/support.ts +1 -1
  576. package/src/domains/providers/types/local-model-quirks.ts +2 -3
  577. package/src/domains/providers/types/runtime-descriptor.ts +23 -3
  578. package/src/domains/providers/types/target-descriptor.ts +15 -3
  579. package/src/domains/resources/collision.ts +7 -2
  580. package/src/domains/resources/index.ts +1 -0
  581. package/src/domains/resources/library-actions.ts +4 -2
  582. package/src/domains/resources/library-inventory.ts +6 -2
  583. package/src/domains/resources/prompts/loader.ts +20 -7
  584. package/src/domains/resources/skills/availability.ts +56 -0
  585. package/src/domains/resources/skills/loader.ts +20 -9
  586. package/src/domains/safety/action-classifier.ts +282 -31
  587. package/src/domains/safety/audit.ts +2 -1
  588. package/src/domains/safety/autonomy.ts +54 -11
  589. package/src/domains/safety/decision-presentation.ts +17 -4
  590. package/src/domains/safety/finish-contract-registration.ts +25 -1
  591. package/src/domains/safety/finish-contract.ts +20 -5
  592. package/src/domains/safety/path-policy.ts +6 -2
  593. package/src/domains/safety/policy-engine.ts +168 -48
  594. package/src/domains/safety/protected-artifacts.ts +527 -16
  595. package/src/domains/safety/read-scope.ts +120 -0
  596. package/src/domains/safety/skill-authority.ts +52 -16
  597. package/src/domains/scheduling/cluster.ts +14 -3
  598. package/src/domains/scheduling/contract.ts +7 -0
  599. package/src/domains/scheduling/extension.ts +20 -9
  600. package/src/domains/scheduling/local-capacity.ts +160 -0
  601. package/src/domains/session/context-accounting.ts +44 -31
  602. package/src/domains/session/context-ledger.ts +10 -3
  603. package/src/domains/session/entries.ts +4 -0
  604. package/src/domains/session/history.ts +1 -1
  605. package/src/domains/session/prompt-cache.ts +1 -0
  606. package/src/domains/session/prompt-manifest.ts +3 -1
  607. package/src/domains/session/retry.ts +4 -6
  608. package/src/domains/session/task-board.ts +19 -4
  609. package/src/domains/session/tree/preview.ts +3 -2
  610. package/src/engine/acp/commands.ts +653 -0
  611. package/src/engine/acp/server.ts +639 -20
  612. package/src/engine/acp/tool-mediator.ts +30 -7
  613. package/src/engine/acp/types.ts +58 -0
  614. package/src/engine/agent.ts +55 -10
  615. package/src/engine/ai.ts +11 -2
  616. package/src/engine/api-registry.ts +5 -4
  617. package/src/engine/apis/degraded-inference.ts +243 -0
  618. package/src/engine/apis/llamacpp-residency.ts +50 -6
  619. package/src/engine/apis/lmstudio-residency.ts +3 -5
  620. package/src/engine/apis/lmstudio.ts +137 -31
  621. package/src/engine/apis/ollama-http.ts +118 -0
  622. package/src/engine/apis/ollama-native.ts +216 -97
  623. package/src/engine/apis/openai-completions.ts +191 -189
  624. package/src/engine/apis/output-budget.ts +3 -1
  625. package/src/engine/apis/residency-lock.ts +2 -1
  626. package/src/engine/apis/residency.ts +339 -89
  627. package/src/engine/apis/sampling-overrides.ts +23 -2
  628. package/src/engine/apis/types.ts +1 -2
  629. package/src/engine/claude/tool-safety.ts +30 -5
  630. package/src/engine/context.ts +13 -0
  631. package/src/engine/env-api-keys.ts +2 -1
  632. package/src/engine/gemma-channel-filter.ts +3 -2
  633. package/src/engine/instrumented-tui.ts +25 -0
  634. package/src/engine/loop-guard.ts +172 -6
  635. package/src/engine/pi-mono-names.ts +16 -0
  636. package/src/engine/prewarm.ts +44 -15
  637. package/src/engine/provider-payload.ts +52 -14
  638. package/src/engine/session.ts +4 -2
  639. package/src/engine/worker-events.ts +9 -1
  640. package/src/engine/worker-runtime.ts +269 -42
  641. package/src/engine/worker-tools.ts +8 -3
  642. package/src/entry/boot-options.ts +23 -0
  643. package/src/entry/orchestrator.ts +207 -36
  644. package/src/interactive/assistant-generation-timing.ts +52 -0
  645. package/src/interactive/chat-loop-messages.ts +4 -1
  646. package/src/interactive/chat-loop.ts +59 -9
  647. package/src/interactive/chat-panel.ts +10 -1
  648. package/src/interactive/clio-editor.ts +51 -79
  649. package/src/interactive/context-meter.ts +1 -0
  650. package/src/interactive/context-overlay.ts +21 -8
  651. package/src/interactive/cost-overlay.ts +1 -1
  652. package/src/interactive/dispatch-board.ts +39 -8
  653. package/src/interactive/editor-bash.ts +0 -34
  654. package/src/interactive/editor-rails.ts +43 -0
  655. package/src/interactive/editor-submit.ts +34 -2
  656. package/src/interactive/footer/dashboard.ts +67 -38
  657. package/src/interactive/footer/demo-hints.ts +40 -0
  658. package/src/interactive/footer/key-hints.ts +21 -0
  659. package/src/interactive/footer/notifications.ts +1 -1
  660. package/src/interactive/footer/pages.ts +486 -0
  661. package/src/interactive/footer/system-metrics.ts +147 -0
  662. package/src/interactive/footer/widgets.ts +158 -63
  663. package/src/interactive/footer-panel.ts +29 -7
  664. package/src/interactive/interactive-application.ts +109 -21
  665. package/src/interactive/interactive-event-projection.ts +6 -2
  666. package/src/interactive/interactive-presentation.ts +25 -29
  667. package/src/interactive/interactive-slash-runtime.ts +32 -18
  668. package/src/interactive/interactive-subscriptions.ts +25 -5
  669. package/src/interactive/interactive-tickers.ts +21 -5
  670. package/src/interactive/keybinding-manager.ts +9 -0
  671. package/src/interactive/overlay-frame.ts +29 -7
  672. package/src/interactive/overlay-lifecycle.ts +5 -3
  673. package/src/interactive/overlay-model-selectors.ts +4 -0
  674. package/src/interactive/overlay-permission-lifecycle.ts +6 -5
  675. package/src/interactive/overlays/ask-user.ts +103 -110
  676. package/src/interactive/overlays/help-reference.ts +1 -0
  677. package/src/interactive/overlays/message-picker.ts +3 -29
  678. package/src/interactive/overlays/session-selector.ts +3 -2
  679. package/src/interactive/overlays/settings-sections.ts +2 -30
  680. package/src/interactive/overlays/settings.ts +310 -607
  681. package/src/interactive/permission-hint.ts +3 -3
  682. package/src/interactive/permission-overlay.ts +45 -27
  683. package/src/interactive/renderers/doctor-report.ts +43 -0
  684. package/src/interactive/renderers/tool-execution.ts +87 -62
  685. package/src/interactive/renderers/worker-entry.ts +76 -3
  686. package/src/interactive/side-question.ts +3 -1
  687. package/src/interactive/slash-commands.ts +78 -23
  688. package/src/interactive/startup-background.ts +131 -0
  689. package/src/interactive/startup-diagnostics.ts +16 -0
  690. package/src/interactive/status/state-machine.ts +16 -3
  691. package/src/interactive/status/types.ts +2 -0
  692. package/src/interactive/status/verbs.ts +1 -1
  693. package/src/interactive/terminal-lease.ts +26 -22
  694. package/src/interactive/theme/components.ts +1 -1
  695. package/src/interactive/theme/rules.ts +1 -1
  696. package/src/interactive/theme/tokens.ts +16 -10
  697. package/src/interactive/transcript-detail.ts +4 -0
  698. package/src/interactive/turn-context.ts +56 -20
  699. package/src/interactive/turn-middleware.ts +57 -9
  700. package/src/interactive/turn-prewarm.ts +121 -18
  701. package/src/interactive/turn-recovery.ts +10 -8
  702. package/src/interactive/turn-runtime.ts +74 -29
  703. package/src/interactive/turn-state.ts +3 -0
  704. package/src/interactive/welcome-art.ts +36 -0
  705. package/src/interactive/welcome-dashboard.ts +209 -49
  706. package/src/interactive/worker-replay.ts +4 -0
  707. package/src/interactive/worker-stream.ts +17 -2
  708. package/src/tools/agent-tools.ts +22 -1
  709. package/src/tools/builtin-tool-catalog.ts +2 -2
  710. package/src/tools/codewiki/code-nav.ts +1 -1
  711. package/src/tools/codewiki/shared.ts +39 -1
  712. package/src/tools/compete-worktrees.ts +8 -91
  713. package/src/tools/context/docs-engine.ts +44 -12
  714. package/src/tools/context/index.ts +126 -22
  715. package/src/tools/context/library.ts +1 -1
  716. package/src/tools/context/surface.ts +12 -7
  717. package/src/tools/core-bootstrap.ts +3 -0
  718. package/src/tools/dispatch-runner.ts +18 -0
  719. package/src/tools/dispatch-schema.ts +187 -206
  720. package/src/tools/edit.ts +46 -42
  721. package/src/tools/file-mutation-queue.ts +25 -26
  722. package/src/tools/gateway/clio-context-surface.ts +1 -1
  723. package/src/tools/gateway/index.ts +7 -3
  724. package/src/tools/gateway/mcp-capabilities.ts +5 -3
  725. package/src/tools/grep.ts +14 -2
  726. package/src/tools/ls.ts +1 -4
  727. package/src/tools/monitor.ts +14 -1
  728. package/src/tools/observation.ts +1 -3
  729. package/src/tools/path-utils.ts +51 -18
  730. package/src/tools/process-lease.ts +99 -0
  731. package/src/tools/read.ts +1 -1
  732. package/src/tools/registry.ts +71 -9
  733. package/src/tools/task-worktree.ts +296 -17
  734. package/src/tools/tasks.ts +29 -7
  735. package/src/tools/worker-evidence.ts +60 -1
  736. package/src/tools/worktree-root.ts +252 -0
  737. package/src/tools/write.ts +34 -30
  738. package/src/worker/entry.ts +18 -1
  739. package/src/worker/protocol.ts +54 -1
  740. package/src/worker/spec-contract.ts +22 -2
  741. package/dist/acp-ZWZCPS2A.js +0 -130
  742. package/dist/agents-LYSOWZUE.js +0 -150
  743. package/dist/auth-WBQGKWQ5.js +0 -551
  744. package/dist/background-BUMOBAQN.js +0 -37
  745. package/dist/builtins-ODRJOEDI.js +0 -22
  746. package/dist/chunk-2DRRZ57Q.js +0 -571
  747. package/dist/chunk-2JBZYUPY.js +0 -105
  748. package/dist/chunk-2VBWFXYE.js +0 -198
  749. package/dist/chunk-2X2R3UTH.js +0 -1018
  750. package/dist/chunk-32KJPXAM.js +0 -75
  751. package/dist/chunk-37LW32LZ.js +0 -32
  752. package/dist/chunk-3A3CUMKA.js +0 -54
  753. package/dist/chunk-3AND2EFU.js +0 -215
  754. package/dist/chunk-3RDHGNU7.js +0 -647
  755. package/dist/chunk-3SUDBGEI.js +0 -1323
  756. package/dist/chunk-3TQN67I2.js +0 -396
  757. package/dist/chunk-3U4BL2EV.js +0 -103
  758. package/dist/chunk-3UQADNG2.js +0 -302
  759. package/dist/chunk-434LRQ6Z.js +0 -13441
  760. package/dist/chunk-4ATBOFRP.js +0 -7802
  761. package/dist/chunk-4DNL43EZ.js +0 -139
  762. package/dist/chunk-4HFJKRGZ.js +0 -5250
  763. package/dist/chunk-555E2WVV.js +0 -322
  764. package/dist/chunk-5GZICIYO.js +0 -462
  765. package/dist/chunk-5PHVPU4G.js +0 -160
  766. package/dist/chunk-5RTEFNBP.js +0 -197
  767. package/dist/chunk-64XJW7NT.js +0 -380
  768. package/dist/chunk-6TKOFFGE.js +0 -1058
  769. package/dist/chunk-6UJ7RDI7.js +0 -1143
  770. package/dist/chunk-7FBCRWVT.js +0 -1801
  771. package/dist/chunk-7JSOSVLP.js +0 -283
  772. package/dist/chunk-7N3OLLSL.js +0 -637
  773. package/dist/chunk-7QQRPB2E.js +0 -915
  774. package/dist/chunk-A6DULIMH.js +0 -986
  775. package/dist/chunk-AB3QXXBC.js +0 -123
  776. package/dist/chunk-ACCECAH4.js +0 -49
  777. package/dist/chunk-AM6CEP2K.js +0 -2120
  778. package/dist/chunk-AUHVBIDW.js +0 -19
  779. package/dist/chunk-AY4XE6GN.js +0 -665
  780. package/dist/chunk-BBA2TAWV.js +0 -667
  781. package/dist/chunk-BFPHMSK7.js +0 -169
  782. package/dist/chunk-BMNVVKEW.js +0 -604
  783. package/dist/chunk-CKK25WN3.js +0 -72
  784. package/dist/chunk-CTGZCEI6.js +0 -33
  785. package/dist/chunk-DIAJYJYG.js +0 -446
  786. package/dist/chunk-DVNAPPXU.js +0 -27
  787. package/dist/chunk-DXVMLM3Z.js +0 -92
  788. package/dist/chunk-E3LEPLQ2.js +0 -68
  789. package/dist/chunk-EHZRAB4U.js +0 -63
  790. package/dist/chunk-EM2DIQAJ.js +0 -179
  791. package/dist/chunk-EM2WNQS2.js +0 -93
  792. package/dist/chunk-ETF4ROKH.js +0 -595
  793. package/dist/chunk-F2YM3JY4.js +0 -22513
  794. package/dist/chunk-FEBQWHJT.js +0 -1023
  795. package/dist/chunk-FPS4R2RN.js +0 -1975
  796. package/dist/chunk-GD55RTIW.js +0 -33
  797. package/dist/chunk-GJDRMBDI.js +0 -573
  798. package/dist/chunk-GREYLTZ5.js +0 -658
  799. package/dist/chunk-H2WSCZZT.js +0 -238
  800. package/dist/chunk-H6IUCY6Q.js +0 -117
  801. package/dist/chunk-H72DCH3E.js +0 -563
  802. package/dist/chunk-H7TXJR23.js +0 -705
  803. package/dist/chunk-HBJQQTKM.js +0 -40
  804. package/dist/chunk-HCVKSGNZ.js +0 -990
  805. package/dist/chunk-HVCAY2FH.js +0 -67
  806. package/dist/chunk-I47EJPYL.js +0 -1377
  807. package/dist/chunk-IALGWTLO.js +0 -36
  808. package/dist/chunk-IALZJE37.js +0 -1710
  809. package/dist/chunk-IC7JXLOM.js +0 -1577
  810. package/dist/chunk-IOSVTTCD.js +0 -108
  811. package/dist/chunk-IPTPMLA6.js +0 -475
  812. package/dist/chunk-IZZI3SKQ.js +0 -128
  813. package/dist/chunk-JABWPKFY.js +0 -27
  814. package/dist/chunk-JIYWMQZ5.js +0 -175
  815. package/dist/chunk-JKU34ACI.js +0 -693
  816. package/dist/chunk-JOBN2YQQ.js +0 -176
  817. package/dist/chunk-JOL2QRLE.js +0 -152
  818. package/dist/chunk-JTR3VSV3.js +0 -44
  819. package/dist/chunk-JU6MAMRJ.js +0 -362
  820. package/dist/chunk-JURMQWVJ.js +0 -15
  821. package/dist/chunk-K2BLQC5E.js +0 -262
  822. package/dist/chunk-K3XN4LZ4.js +0 -402
  823. package/dist/chunk-KIVFXGBM.js +0 -688
  824. package/dist/chunk-KKRXONXG.js +0 -43
  825. package/dist/chunk-KOAHT3N2.js +0 -395
  826. package/dist/chunk-KP5BPXR3.js +0 -73
  827. package/dist/chunk-KQ6IDQIB.js +0 -39
  828. package/dist/chunk-KRJQG47M.js +0 -1289
  829. package/dist/chunk-KW6OJ7IY.js +0 -221
  830. package/dist/chunk-L3NBWLSN.js +0 -314
  831. package/dist/chunk-L4RUTLRL.js +0 -59
  832. package/dist/chunk-LGTVWPRN.js +0 -47
  833. package/dist/chunk-LSQW6KZO.js +0 -200
  834. package/dist/chunk-LTR5QCLS.js +0 -446
  835. package/dist/chunk-LWJYOHT3.js +0 -165
  836. package/dist/chunk-M6YLF66Z.js +0 -2687
  837. package/dist/chunk-MJ4QEJVT.js +0 -185
  838. package/dist/chunk-MO65K5CH.js +0 -1148
  839. package/dist/chunk-MTOZEQHL.js +0 -637
  840. package/dist/chunk-MZDPF35R.js +0 -45
  841. package/dist/chunk-MZKYVIWW.js +0 -188
  842. package/dist/chunk-NBPA5QM6.js +0 -386
  843. package/dist/chunk-NMBEW4PP.js +0 -688
  844. package/dist/chunk-NPLLK3HO.js +0 -3610
  845. package/dist/chunk-NSYGPIVW.js +0 -39
  846. package/dist/chunk-NXTV5OI5.js +0 -1020
  847. package/dist/chunk-NYDG4QP4.js +0 -689
  848. package/dist/chunk-OA2GDACN.js +0 -146
  849. package/dist/chunk-PJI57EC6.js +0 -236
  850. package/dist/chunk-PJJBUGMR.js +0 -4484
  851. package/dist/chunk-PNJE7JPS.js +0 -50
  852. package/dist/chunk-PP23PZEV.js +0 -1347
  853. package/dist/chunk-PPIFDSBK.js +0 -409
  854. package/dist/chunk-PTFISXQO.js +0 -319
  855. package/dist/chunk-QB33Z5S7.js +0 -1865
  856. package/dist/chunk-QGNII5VC.js +0 -110
  857. package/dist/chunk-QH3ZTUOA.js +0 -113
  858. package/dist/chunk-QI72X67S.js +0 -481
  859. package/dist/chunk-QJMRYTCX.js +0 -56
  860. package/dist/chunk-QKHZZFKH.js +0 -98
  861. package/dist/chunk-RDKX2PME.js +0 -66
  862. package/dist/chunk-RL7LJYN4.js +0 -66
  863. package/dist/chunk-RPMNIFRY.js +0 -65
  864. package/dist/chunk-RQROVOV3.js +0 -670
  865. package/dist/chunk-S34A7BSP.js +0 -97
  866. package/dist/chunk-SJETVJHX.js +0 -119
  867. package/dist/chunk-SJMNU4ZS.js +0 -634
  868. package/dist/chunk-SL2RDHKO.js +0 -19
  869. package/dist/chunk-SLLG2G44.js +0 -85
  870. package/dist/chunk-SQAZN2V3.js +0 -2744
  871. package/dist/chunk-SQBT46OF.js +0 -814
  872. package/dist/chunk-SRCEQKQS.js +0 -165
  873. package/dist/chunk-TCUOGIL2.js +0 -52
  874. package/dist/chunk-TIWPKCVO.js +0 -42
  875. package/dist/chunk-U44YYLVV.js +0 -1529
  876. package/dist/chunk-UIU7MGZ3.js +0 -486
  877. package/dist/chunk-USBBEKHW.js +0 -177
  878. package/dist/chunk-VHKTOLEW.js +0 -1416
  879. package/dist/chunk-VPWGADBG.js +0 -3151
  880. package/dist/chunk-VQD7NH7Z.js +0 -356
  881. package/dist/chunk-VWFCAK34.js +0 -697
  882. package/dist/chunk-W5RM7YAH.js +0 -78
  883. package/dist/chunk-W72LLZAV.js +0 -243
  884. package/dist/chunk-WGRDABW7.js +0 -207
  885. package/dist/chunk-WWRV5RJI.js +0 -165
  886. package/dist/chunk-XCUDZQLX.js +0 -195
  887. package/dist/chunk-XFLSL7BT.js +0 -386
  888. package/dist/chunk-XJZEDCNT.js +0 -391
  889. package/dist/chunk-XLLEL3K7.js +0 -709
  890. package/dist/chunk-XNZWWDC3.js +0 -686
  891. package/dist/chunk-XRECG65F.js +0 -308
  892. package/dist/chunk-XTQ7MEJG.js +0 -457
  893. package/dist/chunk-XW2UZICE.js +0 -372
  894. package/dist/chunk-Y3M2T5RO.js +0 -891
  895. package/dist/chunk-YGDMBK7O.js +0 -567
  896. package/dist/chunk-YJCCMYYT.js +0 -125
  897. package/dist/chunk-YPQOPFP7.js +0 -797
  898. package/dist/chunk-YQYINEJI.js +0 -132
  899. package/dist/chunk-ZF6CV4WZ.js +0 -5614
  900. package/dist/chunk-ZKJU55MX.js +0 -326
  901. package/dist/chunk-ZKQ63XZ5.js +0 -1196
  902. package/dist/chunk-ZKVMDNAN.js +0 -962
  903. package/dist/chunk-ZST3FRCV.js +0 -132
  904. package/dist/clio-JUDCLNHC.js +0 -26
  905. package/dist/clio-context-tools-FT672MNZ.js +0 -136
  906. package/dist/code-nav-7OVCTP2Z.js +0 -688
  907. package/dist/compile-cache-WJEPUZEJ.js +0 -16
  908. package/dist/components-OZXZMDWU.js +0 -674
  909. package/dist/config-P3ZQVF63.js +0 -275
  910. package/dist/config-graph-GKAOBAS5.js +0 -160
  911. package/dist/configure-25LRYZJG.js +0 -86
  912. package/dist/context-72VQV7JX.js +0 -73
  913. package/dist/context-COWRWXP3.js +0 -286
  914. package/dist/context-WB3D474G.js +0 -344
  915. package/dist/context-clear-Y4LYMWC6.js +0 -192
  916. package/dist/context-index-W6A4V7OC.js +0 -120
  917. package/dist/context-map-DKL3QT6D.js +0 -555
  918. package/dist/context-working-set-TMZYVC7A.js +0 -1560
  919. package/dist/data-tool-KMBWKKWR.js +0 -2987
  920. package/dist/detail-4GLROGY5.js +0 -123
  921. package/dist/dispatch-runner-TR3LBP5P.js +0 -2446
  922. package/dist/docs-ZK777W2G.js +0 -101
  923. package/dist/doctor-WC4OV2OB.js +0 -814
  924. package/dist/eval-FUNWJNUJ.js +0 -5050
  925. package/dist/eval-inventory-CX24K2JT.js +0 -260
  926. package/dist/evals-L73EBHSU.js +0 -104
  927. package/dist/evidence-AVJ2RTHX.js +0 -392
  928. package/dist/evidence-P4NZOAK7.js +0 -233
  929. package/dist/evidence-Y55WKYHH.js +0 -246
  930. package/dist/evolve-MAWKRYWF.js +0 -617
  931. package/dist/extensions-PYQH3H47.js +0 -308
  932. package/dist/fleet-M4H2QBWT.js +0 -268
  933. package/dist/fleet-ULBXXRDR.js +0 -923
  934. package/dist/fleet-commands-7NNC4JZU.js +0 -76
  935. package/dist/fleet-decisions-EHEY7KPU.js +0 -52
  936. package/dist/fleet-graph-LQ2AHZT3.js +0 -136
  937. package/dist/fleet-inspect-5IGBIIYZ.js +0 -312
  938. package/dist/fleet-new-RCKGSRDV.js +0 -48
  939. package/dist/fleet-preflight-UTTNOKMG.js +0 -27
  940. package/dist/fleet-validate-YGILJKA6.js +0 -91
  941. package/dist/fleet-verify-AUWTCDKR.js +0 -210
  942. package/dist/fleet-view-TGUFCY5A.js +0 -127
  943. package/dist/init-GFN2Z7NF.js +0 -333
  944. package/dist/install-3RZDDP23.js +0 -13
  945. package/dist/install-6PIF6F6W.js +0 -19
  946. package/dist/interop-EF5JUWWK.js +0 -246
  947. package/dist/inventory-I6VJDDYF.js +0 -127
  948. package/dist/library-3J5IO2OJ.js +0 -75
  949. package/dist/library-IJTOFTDS.js +0 -307
  950. package/dist/library-Z3KZSHPE.js +0 -492
  951. package/dist/library-import-IMKFLDHX.js +0 -183
  952. package/dist/library-inventory-CQP5D6GU.js +0 -56
  953. package/dist/library-validation-33UTX7AI.js +0 -42
  954. package/dist/mcp-5FWZKUS6.js +0 -26
  955. package/dist/memory-36CWN67Y.js +0 -520
  956. package/dist/models-KQ6PQJJQ.js +0 -302
  957. package/dist/monitor-XX6ZD6KC.js +0 -785
  958. package/dist/orchestrator-SK6HDAOP.js +0 -42067
  959. package/dist/panes-L27QRXUH.js +0 -74
  960. package/dist/panes-LXZIWNOZ.js +0 -103
  961. package/dist/paths-7DJDU4P4.js +0 -67
  962. package/dist/preload-K2TDYI4Y.js +0 -124
  963. package/dist/registry-DESGAXWK.js +0 -11
  964. package/dist/reset-73VU3XNT.js +0 -345
  965. package/dist/resources-3BYJYVYL.js +0 -181
  966. package/dist/run-AR7PY6GW.js +0 -896
  967. package/dist/run-script-H2KUDIII.js +0 -41
  968. package/dist/settings-3VMBMWID.js +0 -72
  969. package/dist/share-HVWH4FPF.js +0 -293
  970. package/dist/skills-5TYEY75Q.js +0 -100
  971. package/dist/skills-eval-CK3MD63Z.js +0 -1083
  972. package/dist/skills-inventory-KSFYG3I6.js +0 -138
  973. package/dist/slash-commands-DMVHML7P.js +0 -98
  974. package/dist/steer-XCD6V3EW.js +0 -77
  975. package/dist/support-JAZL6VBR.js +0 -38
  976. package/dist/system-3TDQRMZZ.js +0 -116
  977. package/dist/targets-EZKHAYRN.js +0 -1117
  978. package/dist/tasks-SNEFHWYW.js +0 -36
  979. package/dist/terminal-lease-BNLFA4OF.js +0 -419
  980. package/dist/tools-7IM6BDCE.js +0 -28
  981. package/dist/trace-C3MBGD4S.js +0 -524
  982. package/dist/tree-sitter-AQUUOSYM.js +0 -4673
  983. package/dist/tui-primitives-36BY2774.js +0 -18
  984. package/dist/uninstall-WWLOSZ42.js +0 -432
  985. package/dist/upgrade-ETK2JNSJ.js +0 -297
  986. package/dist/usage-S2HOB7BZ.js +0 -1065
  987. package/dist/verifiers-QDTEVH7R.js +0 -632
  988. package/dist/verify-SUKUK6XM.js +0 -31
  989. package/dist/version-RFPKO6T7.js +0 -21
  990. package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +0 -1
  991. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +0 -1
  992. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +0 -36
  993. package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +0 -129
  994. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +0 -38
  995. package/dist/web/client/assets/channel-c4EeUUqA.js +0 -1
  996. package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +0 -62
  997. package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +0 -2
  998. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +0 -125
  999. package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +0 -1
  1000. package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +0 -72
  1001. package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +0 -1
  1002. package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +0 -231
  1003. package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +0 -1
  1004. package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +0 -10
  1005. package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +0 -1
  1006. package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +0 -1
  1007. package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +0 -1
  1008. package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +0 -168
  1009. package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +0 -88
  1010. package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +0 -206
  1011. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +0 -1
  1012. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +0 -1
  1013. package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +0 -1
  1014. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +0 -62
  1015. package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +0 -4
  1016. package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +0 -30
  1017. package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +0 -41
  1018. package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +0 -3
  1019. package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +0 -24
  1020. package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +0 -24
  1021. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +0 -1
  1022. package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +0 -99
  1023. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +0 -1
  1024. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +0 -1
  1025. package/dist/web/client/assets/framework-YGoR34M4.js +0 -9
  1026. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +0 -292
  1027. package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +0 -1
  1028. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +0 -106
  1029. package/dist/web/client/assets/index-CVcy0FAn.js +0 -75
  1030. package/dist/web/client/assets/index-Dsi52apB.css +0 -1
  1031. package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +0 -1
  1032. package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +0 -2
  1033. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +0 -70
  1034. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +0 -139
  1035. package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +0 -89
  1036. package/dist/web/client/assets/line-BIDAcEtX.js +0 -1
  1037. package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +0 -7
  1038. package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +0 -44
  1039. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +0 -96
  1040. package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +0 -1
  1041. package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +0 -1
  1042. package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +0 -1
  1043. package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +0 -39
  1044. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +0 -7
  1045. package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +0 -1
  1046. package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +0 -1
  1047. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +0 -1
  1048. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +0 -1
  1049. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +0 -1
  1050. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +0 -1
  1051. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +0 -84
  1052. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +0 -40
  1053. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +0 -162
  1054. package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +0 -1
  1055. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +0 -1
  1056. package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +0 -1
  1057. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +0 -8
  1058. package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +0 -120
  1059. package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +0 -1
  1060. package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +0 -1
  1061. package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +0 -34
  1062. package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +0 -1
  1063. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +0 -78
  1064. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +0 -7
  1065. package/dist/web/client/index.html +0 -6
  1066. package/dist/web/ops-worker.js +0 -37
  1067. package/dist/web/reads-worker.js +0 -1726
  1068. package/dist/web/server.js +0 -8499
  1069. package/dist/web-EMGUGGEI.js +0 -13
  1070. package/dist/web-fetch-6BRRVQON.js +0 -805
  1071. package/dist/wiki-generate-XHSJTDOP.js +0 -627
  1072. package/dist/with-panes-Z6BTEHMZ.js +0 -628
  1073. package/evals/README.md +0 -9
  1074. package/evals/behavioral-corpus-grader.mjs +0 -236
  1075. package/evals/behavioral-machinery-baseline.json +0 -2276
  1076. package/evals/behavioral-machinery-driver.ts +0 -250
  1077. package/evals/behavioral-machinery-support.ts +0 -254
  1078. package/evals/behavioral-machinery.yaml +0 -614
  1079. package/evals/behavioral-model-negative-control.yaml +0 -69
  1080. package/evals/behavioral-model.yaml +0 -482
  1081. package/evals/fixtures/behavioral-facts.txt +0 -3
  1082. package/evals/fixtures/behavioral-main.ts +0 -7
  1083. package/evals/fixtures/decoy/note.txt +0 -2
  1084. package/evals/fixtures/docs-retrieval.json +0 -102
  1085. package/evals/fixtures/private/credentials.txt +0 -1
  1086. package/evals/fixtures/scalar-decision.json +0 -17
  1087. package/evals/fixtures/scout-citation-pipeline.json +0 -55
  1088. package/evals/fixtures/source-explanation.json +0 -74
  1089. package/evals/fixtures/tool-arguments.json +0 -18
  1090. package/evals/fixtures/tool-surface/read.txt +0 -4
  1091. package/evals/fixtures/tool-surface/subdir/keep.txt +0 -1
  1092. package/evals/no-edit-memory-grader.mjs +0 -149
  1093. package/evals/scalar-decision-grader.py +0 -41
  1094. package/evals/scalar-decision-machinery.ts +0 -145
  1095. package/evals/source-explanation-grader.mjs +0 -118
  1096. package/evals/tool-surface-grader.mjs +0 -53
  1097. package/evals/tool-surface-model.yaml +0 -274
  1098. package/evals/tracked-metrics-baseline.yaml +0 -229
  1099. package/evals/tracked-metrics-grader.mjs +0 -129
  1100. package/src/cli/web.ts +0 -79
  1101. package/src/domains/providers/runtimes/local-native/ollama-native.ts +0 -122
  1102. /package/dist/assets/{web-notices → gui-notices}/@hono__node-server-LICENSE +0 -0
  1103. /package/dist/assets/{web-notices → gui-notices}/hono-LICENSE +0 -0
  1104. /package/dist/{web → gui}/client/THIRD_PARTY_LICENSES.md +0 -0
  1105. /package/dist/{web → gui}/client/assets/arc-Pry-7G1_.js +0 -0
  1106. /package/dist/{web → gui}/client/assets/array-BifhSqXX.js +0 -0
  1107. /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  1108. /package/dist/{web → gui}/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  1109. /package/dist/{web → gui}/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +0 -0
  1110. /package/dist/{web → gui}/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +0 -0
  1111. /package/dist/{web → gui}/client/assets/chunk-FOHPRMQF-CoA4358r.js +0 -0
  1112. /package/dist/{web → gui}/client/assets/chunk-JWPE2WC7-DVXcaiue.js +0 -0
  1113. /package/dist/{web → gui}/client/assets/chunk-XXDRQBXY-DqAYeljN.js +0 -0
  1114. /package/dist/{web → gui}/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +0 -0
  1115. /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  1116. /package/dist/{web → gui}/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  1117. /package/dist/{web → gui}/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +0 -0
  1118. /package/dist/{web → gui}/client/assets/cytoscape.esm-c2aL46s-.js +0 -0
  1119. /package/dist/{web → gui}/client/assets/dagre-C-rnJpZF.js +0 -0
  1120. /package/dist/{web → gui}/client/assets/defaultLocale-BFoDCU3G.js +0 -0
  1121. /package/dist/{web → gui}/client/assets/dist-v5Q1xZ2K.js +0 -0
  1122. /package/dist/{web → gui}/client/assets/graphlib-DS17s2tU.js +0 -0
  1123. /package/dist/{web → gui}/client/assets/init-C-OQMol4.js +0 -0
  1124. /package/dist/{web → gui}/client/assets/katex-ZlcWpGUi.js +0 -0
  1125. /package/dist/{web → gui}/client/assets/linear-SzVmGSw4.js +0 -0
  1126. /package/dist/{web → gui}/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  1127. /package/dist/{web → gui}/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  1128. /package/dist/{web → gui}/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  1129. /package/dist/{web → gui}/client/assets/ordinal-BDEzSJ7C.js +0 -0
  1130. /package/dist/{web → gui}/client/assets/path-fybaL0A-.js +0 -0
  1131. /package/dist/{web → gui}/client/assets/prism-bash-D6zCJ74D.js +0 -0
  1132. /package/dist/{web → gui}/client/assets/prism-c-04YixN25.js +0 -0
  1133. /package/dist/{web → gui}/client/assets/prism-clike-DapgWyxx.js +0 -0
  1134. /package/dist/{web → gui}/client/assets/prism-core-BtsZdCS6.js +0 -0
  1135. /package/dist/{web → gui}/client/assets/prism-cpp-C-lJbC-6.js +0 -0
  1136. /package/dist/{web → gui}/client/assets/prism-css-CPgOzxXp.js +0 -0
  1137. /package/dist/{web → gui}/client/assets/prism-diff-BF8m0_mq.js +0 -0
  1138. /package/dist/{web → gui}/client/assets/prism-docker-DkT6yOFj.js +0 -0
  1139. /package/dist/{web → gui}/client/assets/prism-fortran-Be5x3y1V.js +0 -0
  1140. /package/dist/{web → gui}/client/assets/prism-go-C_8qAH5n.js +0 -0
  1141. /package/dist/{web → gui}/client/assets/prism-ini-BESK3y0r.js +0 -0
  1142. /package/dist/{web → gui}/client/assets/prism-javascript-BnO-swvr.js +0 -0
  1143. /package/dist/{web → gui}/client/assets/prism-json-Dp_-W-Hv.js +0 -0
  1144. /package/dist/{web → gui}/client/assets/prism-jsx-D-D0NWtC.js +0 -0
  1145. /package/dist/{web → gui}/client/assets/prism-julia-DIjOgiAV.js +0 -0
  1146. /package/dist/{web → gui}/client/assets/prism-latex-DNMbqcH_.js +0 -0
  1147. /package/dist/{web → gui}/client/assets/prism-makefile-CRKWLQ8l.js +0 -0
  1148. /package/dist/{web → gui}/client/assets/prism-markdown-C0FPJ1Iz.js +0 -0
  1149. /package/dist/{web → gui}/client/assets/prism-markup-Cp04rIa1.js +0 -0
  1150. /package/dist/{web → gui}/client/assets/prism-matlab-D-nk08al.js +0 -0
  1151. /package/dist/{web → gui}/client/assets/prism-python-CfiSVtM6.js +0 -0
  1152. /package/dist/{web → gui}/client/assets/prism-r-QmNGR8LX.js +0 -0
  1153. /package/dist/{web → gui}/client/assets/prism-rust-Bu9N8X3N.js +0 -0
  1154. /package/dist/{web → gui}/client/assets/prism-shell-session-Be4UuYoM.js +0 -0
  1155. /package/dist/{web → gui}/client/assets/prism-sql-CYhVDMEE.js +0 -0
  1156. /package/dist/{web → gui}/client/assets/prism-toml-DKb54GAT.js +0 -0
  1157. /package/dist/{web → gui}/client/assets/prism-tsx-p6J2Kc_4.js +0 -0
  1158. /package/dist/{web → gui}/client/assets/prism-typescript-BMqONzxf.js +0 -0
  1159. /package/dist/{web → gui}/client/assets/prism-yaml-C0JHu8gr.js +0 -0
  1160. /package/dist/{web → gui}/client/assets/purify.es-ChwZkWde.js +0 -0
  1161. /package/dist/{web → gui}/client/assets/rolldown-runtime-hePW80VL.js +0 -0
  1162. /package/dist/{web → gui}/client/assets/rough.esm-Dy-Kn_BL.js +0 -0
  1163. /package/dist/{web → gui}/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +0 -0
  1164. /package/dist/{web → gui}/client/assets/src-B6xuSHsQ.js +0 -0
  1165. /package/dist/{web → gui}/client/clio-coder-logo.webp +0 -0
  1166. /package/dist/{web → gui}/client/icon-192.png +0 -0
  1167. /package/dist/{web → gui}/client/icon-512.png +0 -0
  1168. /package/dist/{web → gui}/client/manifest.webmanifest +0 -0
  1169. /package/dist/{web → gui}/client/offline.css +0 -0
  1170. /package/dist/{web → gui}/client/offline.html +0 -0
  1171. /package/dist/{web → gui}/client/offline.js +0 -0
  1172. /package/dist/{web → gui}/client/sw.js +0 -0
@@ -1,11 +1,29 @@
1
+ import {
2
+ applyControlValue,
3
+ controlInstructions,
4
+ formatControlValue,
5
+ SETTING_CONTROLS,
6
+ SETTINGS_DESCRIPTIONS_BY_ID,
7
+ SETTINGS_HELP_BY_ID,
8
+ SETTINGS_LABELS_BY_ID,
9
+ SETTINGS_VALUE_HELP_BY_ID,
10
+ type SettingControl,
11
+ settingControl,
12
+ settingsV2PathForRow,
13
+ } from "../../core/settings-controls.js";
14
+ import { settingsChangeKind } from "../../domains/config/classify.js";
15
+
16
+ export { SETTINGS_LABELS_BY_ID } from "../../core/settings-controls.js";
17
+
1
18
  import {
2
19
  bindAgentProfileInSettings,
3
20
  type ClioSettings,
4
21
  removeFleetProfileFromSettings,
5
22
  removeTargetFromSettings,
6
- SETTINGS_V1_PATH_MOVES,
23
+ SettingsValidationError,
7
24
  setFleetProfileInSettings,
8
25
  useTargetInSettings,
26
+ validateSettings,
9
27
  } from "../../core/config.js";
10
28
  import {
11
29
  ACTIVE_ROUTING_POSTURES,
@@ -17,8 +35,17 @@ import {
17
35
  type WorkerEscalationSettings,
18
36
  } from "../../core/defaults.js";
19
37
  import { getAtPath, isRoutingPath } from "../../core/session-routing.js";
38
+ import {
39
+ resolveSettingsSection,
40
+ SETTINGS_SECTIONS,
41
+ type SettingsSectionId,
42
+ type SettingsSectionName,
43
+ settingsGroupForPath,
44
+ settingsSectionForPath,
45
+ } from "../../core/settings-navigation.js";
20
46
  import { MAX_TIMER_DELAY_MS } from "../../core/timers.js";
21
47
  import { capacityLeaseUsage } from "../../domains/dispatch/capacity-lease.js";
48
+ import type { RouteBreakerView } from "../../domains/dispatch/contract.js";
22
49
  import {
23
50
  delegationEntryForKind,
24
51
  type InteropAgentId,
@@ -39,6 +66,7 @@ import {
39
66
  thinkingLevelFromChoiceLabel,
40
67
  } from "../../domains/providers/index.js";
41
68
  import type { FleetNodeSnapshot } from "../../domains/scheduling/cluster.js";
69
+ import { describeLocalCapacity } from "../../domains/scheduling/local-capacity.js";
42
70
  import {
43
71
  type Component,
44
72
  getKeybindings,
@@ -58,7 +86,6 @@ import { localKey } from "../keyboard-owner.js";
58
86
  import { buildHint, DEFAULT_SELECT_THEME, showClioOverlayFrame } from "../overlay-frame.js";
59
87
  import { barSep, clioTheme, GLYPH, padAnsi, rule, screenTitle } from "../theme/index.js";
60
88
  import { modelsForTarget } from "./model-selector.js";
61
- import { SETTINGS_SECTIONS, type SettingsSectionId } from "./settings-sections.js";
62
89
 
63
90
  export const SETTINGS_OVERLAY_WIDTH = "100%";
64
91
  export const SETTINGS_OVERLAY_MAX_HEIGHT = "100%";
@@ -146,526 +173,36 @@ const RESTART_REQUIRED_IDS = new Set<string>([
146
173
 
147
174
  export { SETTINGS_SECTIONS, type SettingsSectionId };
148
175
 
149
- const SETTINGS_SECTION_DESCRIPTIONS = {
150
- safety: "How freely Clio acts, how a worker's approval ask resolves, and how delegated agents' tools are governed.",
151
- orchestrator: "Interactive chat routing, prompt pre-warm, and the optional proactive-memory model plane.",
152
- fleet: "Defaults, profiles, agent bindings, and route activation for dispatched workers, and where they run.",
153
- targets: "Configured inference targets: which one chat and the fleet use, and whether each answers.",
154
- models: "The /model picker, favorites, and configured model cycling.",
155
- budget: "Cost ceiling, per-turn output budget, worker concurrency, and the guardrail backstops.",
156
- compaction: "When and how the context window is evicted and summarized under pressure.",
157
- retry: "Automatic recovery from transient provider, network, and stalled-stream errors.",
158
- terminal: "Terminal integration and the Clio color palette.",
159
- watchdog: "The opt-in turn-end verifier run, where it is routed, and whether it also fires mid-turn.",
160
- advanced:
161
- "Commit provenance, runtime plugins, delegation timeouts, the resource library, and links to other surfaces.",
162
- } as const satisfies Record<SettingsSectionId, string>;
163
-
164
- export const SETTINGS_LABELS_BY_ID = {
165
- autonomy: "Autonomy level",
166
- // Labels follow the CLI's post-rename vocabulary: the config surface is the
167
- // fleet, and `worker` is the runtime entity the descriptions still name. A
168
- // section headed Fleet whose rows read "Worker profiles" and "Worker
169
- // retries" made one setting look like two subsystems.
170
- "workers.onPermission": "Fleet approvals routing",
171
- "workers.escalation.timeoutMs": "Escalation timeout (ms)",
172
- "workers.escalation.fallback": "Escalation fallback",
173
- "delegation.defaults.toolGovernance": "Delegation governance",
174
- "skills.trustProjectCompatRoots": "Trust project skill roots",
175
- "attribution.gitCommits": "Clio commit provenance",
176
- safetyNet: "Safety net",
177
- "orchestrator.thinkingLevel": "Thinking level",
178
- "orchestrator.target": "Target",
179
- "orchestrator.model": "Model",
180
- "background.target": "Memory target",
181
- "background.model": "Memory model",
182
- "memory.intervention.enabled": "Proactive memory",
183
- "memory.intervention.everyNTools": "Memory cadence (tools)",
184
- "memory.intervention.windowSteps": "Memory trajectory steps",
185
- "memory.intervention.maxTokens": "Memory reminder tokens",
186
- "memory.intervention.timeoutMs": "Memory timeout (ms)",
187
- "prewarm.enabled": "Prompt pre-warm",
188
- "workers.default.target": "Default target",
189
- "workers.default.model": "Default model",
190
- "workers.default.thinkingLevel": "Default thinking level",
191
- "workers.profiles": "Add profile",
192
- "workers.agentBindings": "Add agent route",
193
- "workers.maxRetries": "Fleet retries",
194
- "workers.resilienceCooldownMs": "Resilience cooldown (ms)",
195
- "routing.activeRoles": "Active routing roles",
196
- "routing.activePostures": "Active routing postures",
197
- "routing.agentAutomation.activeAgentRoles": "Active agent routes",
198
- "panes.enabled": "Panes",
199
- "panes.notifications": "Pane notifications",
200
- "panes.layout": "Boot layout",
201
- "panes.workers.ratio": "Workers dock share",
202
- "panes.journal": "Run event journal",
203
- "panes.yazi.enabled": "Files pane",
204
- "panes.yazi.mode": "Files pane mode",
205
- "panes.yazi.profile": "Files pane profile",
206
- "panes.yazi.followCwd": "Follow conversation cwd",
207
- "panes.yazi.ratio": "Files dock share",
208
- scope: "Model cycle set",
209
- "modelSelector.recentLimit": "Recent models kept",
210
- "modelSelector.favorites": "Pinned favorites",
211
- "budget.sessionCeilingUsd": "Session ceiling (USD)",
212
- "defaults.maxTokens": "Output budget (tokens)",
213
- "context.toolResultMaxBytes": "Tool result cap (bytes)",
214
- "budget.concurrency": "Fleet concurrency",
215
- "guardrails.turnToolCallBudget": "Turn tool-call budget",
216
- "guardrails.workerToolCallCap": "Worker tool-call cap",
217
- "guardrails.maxDispatchRuns": "Run ledger retention",
218
- "guardrails.readMaxBytes": "Read byte cap",
219
- "guardrails.observationTurnBudgetBytes": "Observation byte pool",
220
- "guardrails.internalDispatchTimeoutMs": "Internal dispatch timeout (ms)",
221
- "compaction.auto": "Auto-compact",
222
- "compaction.threshold": "Compaction threshold",
223
- "context.workingSet.enabled": "Working-set eviction",
224
- "context.workingSet.policy": "Eviction policy",
225
- "context.workingSet.target": "Eviction target pressure",
226
- "context.workingSet.protectLastTurns": "Turns protected from eviction",
227
- "context.workingSet.minEvictableTokens": "Minimum evictable tokens",
228
- "retry.enabled": "Retry transient errors",
229
- "retry.maxRetries": "Max retries",
230
- "retry.baseDelayMs": "Base delay (ms)",
231
- "retry.maxDelayMs": "Max delay (ms)",
232
- "retry.streamStallMs": "Stream stall timeout (ms)",
233
- "retry.firstTokenStallMs": "First token timeout (ms)",
234
- "terminal.showTerminalProgress": "Terminal progress badges",
235
- "terminal.outputVerbosity": "Output style",
236
- "terminal.tuiMode": "TUI mode",
237
- "terminal.fullscreenScrollbar": "Fullscreen scrollbar",
238
- "terminal.smoothStreaming": "Smooth streaming",
239
- "terminal.notify": "Desktop notifications",
240
- "watchdog.enabled": "Turn-end watchdog",
241
- "watchdog.target": "Watchdog target",
242
- "watchdog.cadenceToolCalls": "Watchdog cadence (tools)",
243
- runtimePlugins: "Runtime plugins",
244
- "compaction.model": "Compaction model",
245
- "compaction.systemPrompt": "Compaction prompt",
246
- "delegation.defaults.connectTimeoutMs": "Delegate connect (ms)",
247
- "delegation.defaults.turnTimeoutMs": "Delegate turn (ms)",
248
- "delegation.defaults.permissionTimeoutMs": "Delegate permission (ms)",
249
- targets: "Configured targets",
250
- keybindings: "Keybinding overrides",
251
- "delegation.agents": "Delegation agents",
252
- "library.catalog": "Library catalog path",
253
- "library.remote": "Library remote",
254
- "library.confirmedRemote": "Confirmed library remote",
255
- "library.sync": "Library sync",
256
- } as const;
176
+ const SETTINGS_SECTION_DESCRIPTIONS = Object.fromEntries(
177
+ SETTINGS_SECTIONS.map((section) => [section.id, section.description]),
178
+ ) as Record<SettingsSectionId, string>;
257
179
 
258
180
  /**
259
181
  * Entry rows (one per fleet profile field, agent binding, target, fleet node)
260
182
  * are keyed by the config path they edit; fleet node rows are read-only status.
261
183
  */
262
184
  type EntrySettingId =
185
+ | `setting.${string}`
263
186
  | `workers.profiles.${string}`
264
187
  | `workers.agentBindings.${string}`
265
188
  | `targets.${string}`
266
189
  | `fleet.nodes.${string}`
267
190
  | `fleet.endpoints.${string}`;
268
191
  export type EditableSettingId = keyof typeof SETTINGS_LABELS_BY_ID | EntrySettingId;
269
- type FleetGroupHeaderId =
270
- `fleet.group.${"defaults" | "profiles" | "agent-routes" | "route-activation" | "placement" | "panes"}`;
271
- type TerminalGroupHeaderId = "terminal.group.files-pane";
272
- type BudgetGroupHeaderId = "budget.group.guardrails";
273
- type CompactionGroupHeaderId = "compaction.group.working-set";
274
- type AdvancedGroupHeaderId = "advanced.group.library";
275
- type GroupHeaderId =
276
- | FleetGroupHeaderId
277
- | TerminalGroupHeaderId
278
- | BudgetGroupHeaderId
279
- | CompactionGroupHeaderId
280
- | AdvancedGroupHeaderId;
192
+ type GroupHeaderId = `settings.group.${string}`;
281
193
  type TargetsCtaId = "targets.add-cta";
282
- export type SettingsCenterRowId = EditableSettingId | GroupHeaderId | TargetsCtaId;
194
+ export type SettingsCenterRowId =
195
+ | EditableSettingId
196
+ | GroupHeaderId
197
+ | TargetsCtaId
198
+ | "maintenance.diagnostics"
199
+ | "maintenance.editor";
283
200
  const REMOVE_PROFILE_CHOICE = "(remove profile)";
284
201
  const UNBIND_CHOICE = "(unbind)";
285
202
  const AUTO_PLACEMENT_CHOICE = "(auto placement)";
286
203
  const PROFILE_FIELD_SEPARATOR = " -> ";
287
204
  const PROFILE_SUMMARY_VALUE_BUDGET = 26;
288
205
 
289
- export const SETTINGS_SECTION_ROWS = {
290
- safety: [
291
- "autonomy",
292
- "workers.onPermission",
293
- "workers.escalation.timeoutMs",
294
- "workers.escalation.fallback",
295
- "delegation.defaults.toolGovernance",
296
- "skills.trustProjectCompatRoots",
297
- "safetyNet",
298
- ],
299
- orchestrator: [
300
- "orchestrator.thinkingLevel",
301
- "orchestrator.target",
302
- "orchestrator.model",
303
- "background.target",
304
- "background.model",
305
- "memory.intervention.enabled",
306
- "memory.intervention.everyNTools",
307
- "memory.intervention.windowSteps",
308
- "memory.intervention.maxTokens",
309
- "memory.intervention.timeoutMs",
310
- "prewarm.enabled",
311
- ],
312
- fleet: [
313
- "workers.default.target",
314
- "workers.default.model",
315
- "workers.default.thinkingLevel",
316
- "workers.maxRetries",
317
- "workers.resilienceCooldownMs",
318
- "workers.profiles",
319
- "workers.agentBindings",
320
- "routing.activeRoles",
321
- "routing.activePostures",
322
- "routing.agentAutomation.activeAgentRoles",
323
- "panes.enabled",
324
- "panes.notifications",
325
- "panes.layout",
326
- "panes.workers.ratio",
327
- "panes.journal",
328
- ],
329
- models: ["scope", "modelSelector.recentLimit", "modelSelector.favorites"],
330
- budget: [
331
- "budget.sessionCeilingUsd",
332
- "defaults.maxTokens",
333
- "context.toolResultMaxBytes",
334
- "budget.concurrency",
335
- "guardrails.turnToolCallBudget",
336
- "guardrails.workerToolCallCap",
337
- "guardrails.maxDispatchRuns",
338
- "guardrails.readMaxBytes",
339
- "guardrails.observationTurnBudgetBytes",
340
- "guardrails.internalDispatchTimeoutMs",
341
- ],
342
- compaction: [
343
- "compaction.auto",
344
- "compaction.threshold",
345
- "context.workingSet.enabled",
346
- "context.workingSet.policy",
347
- "context.workingSet.target",
348
- "context.workingSet.protectLastTurns",
349
- "context.workingSet.minEvictableTokens",
350
- ],
351
- retry: [
352
- "retry.enabled",
353
- "retry.maxRetries",
354
- "retry.baseDelayMs",
355
- "retry.maxDelayMs",
356
- "retry.streamStallMs",
357
- "retry.firstTokenStallMs",
358
- ],
359
- terminal: [
360
- "terminal.showTerminalProgress",
361
- "terminal.outputVerbosity",
362
- "terminal.tuiMode",
363
- "terminal.fullscreenScrollbar",
364
- "terminal.smoothStreaming",
365
- "terminal.notify",
366
- "panes.yazi.enabled",
367
- "panes.yazi.mode",
368
- "panes.yazi.profile",
369
- "panes.yazi.followCwd",
370
- "panes.yazi.ratio",
371
- ],
372
- watchdog: ["watchdog.enabled", "watchdog.target", "watchdog.cadenceToolCalls"],
373
- advanced: [
374
- "runtimePlugins",
375
- "attribution.gitCommits",
376
- "compaction.model",
377
- "compaction.systemPrompt",
378
- "delegation.defaults.connectTimeoutMs",
379
- "delegation.defaults.turnTimeoutMs",
380
- "delegation.defaults.permissionTimeoutMs",
381
- "keybindings",
382
- "delegation.agents",
383
- "library.catalog",
384
- "library.remote",
385
- "library.confirmedRemote",
386
- "library.sync",
387
- ],
388
- targets: ["targets"],
389
- } as const satisfies Record<SettingsSectionId, readonly EditableSettingId[]>;
390
-
391
- const SETTINGS_DESCRIPTIONS_BY_ID = {
392
- autonomy: "How freely Clio acts; the safety net always applies.",
393
- "workers.onPermission":
394
- "How a worker resolves an approval ask: deny the call, fail the run, or escalate to this session.",
395
- "workers.escalation.timeoutMs": "How long an escalated worker approval waits for you before the fallback applies.",
396
- "workers.escalation.fallback": "What an escalated approval becomes when nobody answers inside the timeout.",
397
- "delegation.defaults.toolGovernance": "Tool policy for delegated external agents.",
398
- "skills.trustProjectCompatRoots": "Whether third-party project skill roots are loaded.",
399
- "attribution.gitCommits":
400
- "Add evidence-backed assistance, testing, review, and contributor trailers to commits created through Clio.",
401
- safetyNet: "Always-on rails; tuned in .clio-coder/safety.yaml.",
402
- "orchestrator.thinkingLevel": "Reasoning budget for the chat loop.",
403
- "orchestrator.target": "Active chat target id.",
404
- "orchestrator.model": "Active chat wire model id.",
405
- "background.target": "Optional target for LLM memory steps; unset keeps rules-only memory.",
406
- "background.model": "Small non-reasoning model used only for task memory steps.",
407
- "memory.intervention.enabled": "Master switch for rules-only and model-backed task memory.",
408
- "memory.intervention.everyNTools": "Maximum tool executions between prompted memory steps.",
409
- "memory.intervention.windowSteps": "Recent completed tool steps visible to the memory policy.",
410
- "memory.intervention.maxTokens": "Hard cap for one visible memory reminder.",
411
- "memory.intervention.timeoutMs": "Hard deadline for one background-model memory call.",
412
- "prewarm.enabled": "Send the next turn's known prefix ahead of time so a local server has already prefilled it.",
413
- "workers.default.target": "Default /run target id.",
414
- "workers.default.model": "Default /run wire model id.",
415
- "workers.default.thinkingLevel": "Reasoning budget for dispatched workers.",
416
- "workers.profiles": "Named target/model/thinking choices that native workers can use. Enter adds one.",
417
- "workers.agentBindings": "Pins native Clio agents, including shadow agents, to worker profiles. Enter adds one.",
418
- "workers.maxRetries": "Automatic retries for a retryable worker outcome.",
419
- "workers.resilienceCooldownMs":
420
- "How long a failing target, runtime, and model route is skipped before it is tried again.",
421
- "routing.activeRoles": "Execution roles whose joint route selection may act instead of only shadowing.",
422
- "routing.activePostures": "Route postures whose selection may act instead of only shadowing.",
423
- "routing.agentAutomation.activeAgentRoles": "Exact agent and execution-role pairs whose agent choice may act.",
424
- "panes.enabled": "Default panes activation for new sessions; `--with-panes` / `--no-panes` beat it.",
425
- "panes.notifications": "Which terminal run states raise a pane-host toast.",
426
- "panes.layout": "What composes itself at interactive boot: nothing, the workers dock, or workers plus files.",
427
- "panes.workers.ratio": "Share of the width the workers dock takes, at most half.",
428
- "panes.journal": "Whether every dispatched run's event tail is written to disk for `clio-coder fleet view`.",
429
- "panes.yazi.enabled":
430
- "Whether `/files`, its key, and `/panes open files` may open the files pane or the one-shot pick.",
431
- "panes.yazi.mode": "Keep the files pane beside the conversation, or close it after one selection.",
432
- "panes.yazi.profile": "Use Clio's managed, themed engine profile or the operator's own file-manager configuration.",
433
- "panes.yazi.followCwd": "Push the conversation directory into an already-open companion pane.",
434
- "panes.yazi.ratio": "Share of the height the files dock takes, at most half.",
435
- scope: "Configured model-cycle action set.",
436
- "modelSelector.recentLimit": "How many recently used models /model remembers.",
437
- "modelSelector.favorites": "Exact target/model refs pinned in /model.",
438
- "budget.sessionCeilingUsd": "Per-session cost cap.",
439
- "defaults.maxTokens": "Output tokens requested per turn, applied to every target.",
440
- "context.toolResultMaxBytes": "Maximum bytes returned from one tool result before the full text spills to scratch.",
441
- "budget.concurrency": "Parallel workers allowed during dispatch.",
442
- "guardrails.turnToolCallBudget": "Soft per-turn tool-call budget for this chat loop.",
443
- "guardrails.workerToolCallCap": "Lifetime ceiling on tool calls one dispatched worker may execute.",
444
- "guardrails.maxDispatchRuns": "How many finished runs the dispatch ledger keeps before the oldest are dropped.",
445
- "guardrails.readMaxBytes": "Per-call byte cap for the read tool.",
446
- "guardrails.observationTurnBudgetBytes": "Shared per-turn byte pool across every observation-producing tool.",
447
- "guardrails.internalDispatchTimeoutMs": "Wall-clock cap for one internal generator dispatch.",
448
- "compaction.auto": "Auto-compact before a turn when context crosses the threshold.",
449
- "compaction.threshold": "Pressure at which compaction masks stale observations, then summarizes.",
450
- "context.workingSet.enabled": "Non-destructive eviction of stale tool results before a summary is ever needed.",
451
- "context.workingSet.policy": "Which candidates the eviction pass selects.",
452
- "context.workingSet.target": "Context pressure an applied eviction batch brings the session down to.",
453
- "context.workingSet.protectLastTurns": "Recent user turns whose observations are never evicted.",
454
- "context.workingSet.minEvictableTokens":
455
- "Results below this token estimate stay; the marker would cost more than it saves.",
456
- "retry.enabled": "Retry transient provider errors on the next submit.",
457
- "retry.maxRetries": "Retry attempts after the initial failure.",
458
- "retry.baseDelayMs": "Initial retry delay in milliseconds.",
459
- "retry.maxDelayMs": "Maximum retry delay in milliseconds.",
460
- "retry.streamStallMs": "Silence on an in-flight stream past this long is treated as a wedged backend.",
461
- "retry.firstTokenStallMs": "Silence allowed before a call's first token, for backends that load the model on demand.",
462
- "terminal.showTerminalProgress": "Emit OSC 9;4 progress badges during agent turns.",
463
- "terminal.outputVerbosity": "How much reasoning, tool input, and live tool output appears in the transcript.",
464
- "terminal.tuiMode": "Use regular terminal scrollback or a fullscreen transcript with a sticky composer and footer.",
465
- "terminal.fullscreenScrollbar": "When the draggable transcript scrollbar is visible in fullscreen mode.",
466
- "terminal.smoothStreaming": "Presentation-only pacing for streamed assistant text and thinking.",
467
- "terminal.notify":
468
- "Content-free desktop notification when a turn ends, a detached batch settles, or an approval parks.",
469
- "watchdog.enabled": "When enabled, a turn that changed the tree is reviewed by one read-only verifier run.",
470
- "watchdog.target": "Set target to route the run at a cheap local model; blank uses the session's active target.",
471
- "watchdog.cadenceToolCalls": "Also fire every N tool calls inside a turn; blank fires at turn end only.",
472
- runtimePlugins: "npm packages exporting clioRuntimes: RuntimeDescriptor[].",
473
- "compaction.model": "Dedicated summarization model; blank uses the orchestrator.",
474
- "compaction.systemPrompt": "Path to a compaction prompt override; blank uses the built-in.",
475
- "delegation.defaults.connectTimeoutMs": "How long to wait for a delegated agent to connect.",
476
- "delegation.defaults.turnTimeoutMs": "How long a single delegated turn may run.",
477
- "delegation.defaults.permissionTimeoutMs": "How long a delegated permission ask may wait.",
478
- targets: "Inference targets available for chat and workers. Add one with `clio-coder targets add`.",
479
- keybindings: "Custom key overrides layered on the defaults.",
480
- "delegation.agents": "External ACP agents available to /delegate.",
481
- "library.catalog": "Path to the private resource catalog; blank uses the one in your config directory.",
482
- "library.remote": "Git remote the catalog syncs with; blank keeps the library entirely local.",
483
- "library.confirmedRemote": "The remote you confirmed. Sync refuses until it matches library.remote.",
484
- "library.sync": "Whether `clio-coder library sync` and `push` may talk to the remote at all.",
485
- } as const satisfies Record<EditableSettingId, string>;
486
-
487
- /** Longer, optional guidance shown beneath the one-line description when there is room. */
488
- const SETTINGS_HELP_BY_ID: Partial<Record<EditableSettingId, string>> = {
489
- autonomy:
490
- "read-only observes; suggest parks non-read calls; auto-edit edits, dispatches, and runs recognized commands; full-auto runs except command substitution and system-level changes. A confirmation marked exposure=outward parks for you at suggest and auto-edit.",
491
- "defaults.maxTokens":
492
- "Clamped down to each model's max-output cap and the remaining context window. Set 0 to use per-model caps only.",
493
- "context.toolResultMaxBytes":
494
- "The 192KB per-turn observation pool remains authoritative. Three full 64KB results consume it, so a fourth finds it filled. Whole number of at least 4096 bytes · default: 65536 (64KB).",
495
- "compaction.threshold":
496
- "pressure = estimated tokens ÷ context window. Higher keeps more history but risks overflow before a summary runs.",
497
- "context.workingSet.enabled":
498
- "Eviction moves stale tool-result bodies and thinking blocks out of the model's working set and records a ledger entry; history is never rewritten. Off skips eviction and goes straight to summary compaction. Legal values: true, false · default: true.",
499
- "context.workingSet.policy":
500
- "structural-v1 selects by message structure; age-horizon is the older age-based rule. Legal values: structural-v1, age-horizon · default: structural-v1.",
501
- "context.workingSet.target":
502
- "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.",
503
- "context.workingSet.protectLastTurns": "Counted in user turns. Whole number of at least 1 · default: 6.",
504
- "context.workingSet.minEvictableTokens":
505
- "The floor sweep put marker break-even near 50 tokens; 200 is the churn guard. Whole number, 0 evicts anything · default: 200.",
506
- "guardrails.turnToolCallBudget":
507
- "Crossing it blocks further calls in the turn with a stop-and-summarize directive, and the hard interrupt ceiling sits a fixed margin above. A backstop against a model spraying unproductive calls, not a routine ceiling: a repo-wide audit legitimately runs dozens. Whole number of at least 1 · default: 60.",
508
- "guardrails.workerToolCallCap":
509
- "Bounds admitted calls, not attempts: a call the harness refuses never ran and never spends the cap. Dispatch takes the smaller of this and the agent recipe's own budget, so the recipe normally binds. Whole number of at least 1 · default: 150.",
510
- "guardrails.maxDispatchRuns":
511
- "Runs leaving the ring also lose their event journal directory. Whole number of at least 1 · default: 1000.",
512
- "guardrails.readMaxBytes":
513
- "Clamped up to a 1KB floor at use. Whole number of bytes, at least 1 · default: 51200 (50KB).",
514
- "guardrails.observationTurnBudgetBytes":
515
- "One pool shared by every observation-producing tool in a turn, so a single verbose tool cannot starve the rest. Whole number of bytes, at least 1 · default: 196608 (192KB).",
516
- "guardrails.internalDispatchTimeoutMs":
517
- "Covers the wiki documenter and the bootstrap scout. Continuous output satisfies the heartbeat watchdog and a run mid-generation spends no tool calls, so this is the only guard that ends a degenerate generator. Healthy runs finish in minutes. Whole milliseconds of at least 1 · default: 900000 (15 minutes).",
518
- "retry.streamStallMs":
519
- "Measured from the last token received, not from the request, so a slow-but-alive stream is never aborted. The retry then follows the same enabled/maxRetries/delay settings above. Whole milliseconds · default: 180000 (three minutes).",
520
- "retry.firstTokenStallMs":
521
- "Measured from the request until the first token. A local server that slept reloads the model and prefills cold first, so this window is longer than the stream stall timeout; the larger of the two applies. 0 never aborts a call that has not started streaming. Whole milliseconds · default: 600000 (ten minutes).",
522
- "library.catalog":
523
- "Absolute path, or blank for the catalog in your config directory. The catalog is the index `clio-coder library` reads; installed resources land in the usual skill and resource roots either way. Default: blank.",
524
- "library.remote":
525
- "A Git remote URL, or blank to keep the library local. Setting it is not enough to sync: the remote must also be confirmed, and library.sync must be true. Default: blank.",
526
- "library.confirmedRemote":
527
- "Written by the confirm flow, not by hand, because confirming a remote here would be the record confirming itself. Sync refuses with library_remote_unconfirmed until this equals library.remote. Default: blank.",
528
- "library.sync":
529
- "Off means `clio-coder library sync` and `push` refuse before touching the network, whatever the remote says. Legal values: true, false · default: false.",
530
- "budget.concurrency":
531
- "auto allows four local workers. A fixed number caps how many workers run at once; the default is one.",
532
- "skills.trustProjectCompatRoots":
533
- "Project roots like .claude/skills and .codex/skills are untrusted by default; enabling exposes them to the model.",
534
- "attribution.gitCommits":
535
- "Role trailers are added only when Clio has trusted evidence for that role. Disabling leaves subsequent commit messages entirely unchanged.",
536
- "workers.onPermission":
537
- "deny turns the ask into a tool denial and the run continues; fail stops the run as permission_required; escalate forwards the ask to you and falls back per workers.escalation on timeout.",
538
- "workers.escalation.timeoutMs":
539
- "Only the escalate posture reads it, and it is what keeps that posture non-stall: a headless session has no operator to answer, so the fallback always governs there. Whole milliseconds of at least 1; default: 120000 (two minutes).",
540
- "workers.escalation.fallback":
541
- "deny turns the unanswered ask into a tool denial and the run continues; fail ends the run as permission_required. Legal values: deny, fail · default: deny.",
542
- "workers.resilienceCooldownMs":
543
- "Applied per target, runtime, and wire model after a failure class that trips the breaker; a clean run clears it immediately. Whole milliseconds, 0 disables the cooldown; default: 15000.",
544
- "routing.activeRoles":
545
- "Joint route selection stays shadow-only, recording what it would have picked, unless both the execution role and the requested posture are named as active. Legal values: researcher, verifier, reviewer, judge · default: none active.",
546
- "routing.activePostures":
547
- "Manual pins are exact rather than adaptive, so manual is never an activated posture. Legal values: quality, balanced, latency, economy · default: none active.",
548
- "routing.agentAutomation.activeAgentRoles":
549
- "Exact agentId and executionRole pairs, because independent agent and role lists would authorize their whole cross-product. Execution roles: builder, researcher, verifier, reviewer, judge; the agentId `auto` is reserved. Edit the pairs in settings.yaml; default: none active.",
550
- "prewarm.enabled":
551
- "Fires at session start, after a resume rebuilds the message array, and after a compaction settles, never while a turn or dispatch is running. Local-native targets and interactive sessions only, whatever this says. Legal values: true, false · default: true.",
552
- "workers.agentBindings":
553
- "Bind base, custom, and shadow native agents such as scout, researcher, and provenance to profiles. ACP delegation agents cannot be bound.",
554
- "delegation.defaults.toolGovernance":
555
- "clio-coder-policy gates the agent through Clio's safety net; agent-managed trusts the agent; deny-all blocks every tool.",
556
- scope:
557
- "Choose target-level or exact target/model refs. Explicit model-cycle bindings step the chat target through this list.",
558
- runtimePlugins: "Comma-separated package names, loaded at startup. Restart Clio after changing.",
559
- "terminal.notify":
560
- "OSC 777, or OSC 9 on iTerm2, Windows Terminal, and ConEmu. Interactive TTY runs only; the body never carries prompt text, file paths, or model output.",
561
- "watchdog.enabled":
562
- "The verifier run is briefed with the turn's coalesced diff and the task board's current scope; its blockers become one transcript notice and nothing else. Headless and ACP runs never fire it.",
563
- "watchdog.target":
564
- "A watchdog run costs a worker run per mutating turn, so routing it at a local target keeps the review cheap. Leave blank to reuse whatever the session is already talking to.",
565
- "watchdog.cadenceToolCalls":
566
- "Mid-turn firing is how scope drift becomes visible before the turn ends. Leave blank and the watchdog fires at turn end only.",
567
- keybindings:
568
- "Alt+O cycles Output style: Compact, Standard, Detailed. Use /view for full reasoning and action details. Shift+Tab changes model thinking effort.",
569
- };
570
-
571
- /** Per-value meaning, surfaced for the current value of an enum knob. */
572
- const SETTINGS_VALUE_HELP_BY_ID: Partial<Record<EditableSettingId, Record<string, string>>> = {
573
- autonomy: {
574
- "read-only": "observe and answer only; never edits files or runs commands",
575
- suggest:
576
- "propose every edit and command for your approval; confirmations marked exposure=outward (filing an issue or PR, pushing, releasing) park here as well",
577
- "auto-edit":
578
- "edits and dispatches run; recognized commands (tests, lint, build, .clio-coder/safety.yaml entries) run; other commands ask, as do confirmations marked exposure=outward (filing an issue or PR, pushing, releasing)",
579
- "full-auto":
580
- "runs without approval prompts, outward-facing confirmations included, except command substitution and system-level changes; hard blocks always apply",
581
- },
582
- "workers.onPermission": {
583
- deny: "a worker permission ask becomes a tool denial; the run continues",
584
- fail: "the run ends immediately as permission_required",
585
- escalate:
586
- "the ask is forwarded to this session's operator; on timeout it falls back to deny or fail per workers.escalation",
587
- },
588
- "workers.escalation.fallback": {
589
- deny: "an unanswered escalation becomes a tool denial and the run continues",
590
- fail: "an unanswered escalation ends the run as permission_required",
591
- },
592
- "prewarm.enabled": {
593
- true: "prefill the next turn's known prefix on local-native targets",
594
- false: "never send a pre-warm request; the first turn pays the whole prefill",
595
- },
596
- "context.workingSet.enabled": {
597
- true: "evict stale observations non-destructively before summarizing",
598
- false: "skip eviction and go straight to summary compaction",
599
- },
600
- "context.workingSet.policy": {
601
- "structural-v1": "select eviction candidates by message structure",
602
- "age-horizon": "the older rule: select by age alone",
603
- },
604
- "library.sync": {
605
- true: "allow `clio-coder library sync` and `push` to reach the confirmed remote",
606
- false: "refuse every library network operation",
607
- },
608
- "delegation.defaults.toolGovernance": {
609
- "clio-coder-policy": "Clio's safety policy gates the delegated agent's tools",
610
- "agent-managed": "the external agent governs its own tools",
611
- "deny-all": "block every tool the delegated agent requests",
612
- },
613
- "compaction.auto": {
614
- true: "compact automatically before a turn crosses the threshold",
615
- false: "context is only compacted when you run /context compact",
616
- },
617
- // `embedded` is a declared rung with no implementation behind it yet; it
618
- // refuses until Clio can own a pane host, and the hint says so.
619
- "panes.enabled": {
620
- auto: "detect a herdr session and join it as a guest; no pane host, no panes",
621
- embedded: "not implemented yet; use auto or guest",
622
- off: "never detect or open a pane",
623
- },
624
- "retry.enabled": {
625
- true: "retry transient provider errors automatically",
626
- false: "surface transient errors immediately without retrying",
627
- },
628
- "skills.trustProjectCompatRoots": {
629
- true: "load skills from .claude/.codex/.github/etc. project roots",
630
- false: "ignore third-party project skill roots",
631
- },
632
- "attribution.gitCommits": {
633
- enabled: "add only the Clio role trailers justified by trusted evidence",
634
- disabled: "leave every subsequent commit message byte-for-byte unchanged",
635
- },
636
- "terminal.showTerminalProgress": {
637
- true: "emit OSC 9;4 taskbar/tab progress badges during turns",
638
- false: "no terminal progress badges",
639
- },
640
- "terminal.outputVerbosity": {
641
- compact: "quiet action summaries, answers, and visible failures",
642
- standard: "short reasoning and change previews, clear action outcomes",
643
- detailed: "larger bounded previews; full content is available in /view",
644
- },
645
- "terminal.tuiMode": {
646
- regular: "preserve terminal scrollback and render the composer below the transcript",
647
- fullscreen: "use the alternate screen with an independently scrollable transcript and sticky composer/footer",
648
- },
649
- "terminal.fullscreenScrollbar": {
650
- hidden: "never draw the fullscreen transcript scrollbar",
651
- auto: "show the scrollbar while scrolling or dragging",
652
- always: "reserve the rightmost column for the scrollbar",
653
- },
654
- "terminal.notify": {
655
- true: "post a content-free desktop notification on turn end, batch settlement, and a parked approval",
656
- false: "never post a desktop notification",
657
- },
658
- "watchdog.enabled": {
659
- true: "review every mutating turn with one read-only verifier run",
660
- false: "no verifier run; a turn ends without a second opinion",
661
- },
662
- "terminal.smoothStreaming": {
663
- off: "preserve the current immediate 16ms-coalesced streaming behavior",
664
- auto: "pace only on a capable local TTY without accessibility or backpressure risk",
665
- on: "request grapheme-safe pacing; stdout backpressure still pauses presentation",
666
- },
667
- };
668
-
669
206
  export type SettingSubmenuBuilder = NonNullable<SettingItem["submenu"]>;
670
207
  type SettingsCenterLane = "sections" | "rows";
671
208
  /**
@@ -752,6 +289,8 @@ interface BuildSettingItemsOptions {
752
289
  requestRefresh?: () => void;
753
290
  /** Live fleet node snapshots (scheduling.fleet.list()); absent hides the node rows. */
754
291
  getFleetNodes?: () => ReadonlyArray<FleetNodeSnapshot>;
292
+ /** Live in-process dispatch breaker state per route; absent shows no breaker state. */
293
+ getRouteBreakers?: () => ReadonlyArray<RouteBreakerView>;
755
294
  /** Run the API-key / OAuth connect flow for a target; absent hides the action. */
756
295
  connectTarget?: (targetId: string) => Promise<void> | void;
757
296
  /** The connect/probe operation currently acting on a target, if any. */
@@ -1474,14 +1013,7 @@ function targetActionsSubmenu(targetId: string, options: BuildSettingItemsOption
1474
1013
  }
1475
1014
 
1476
1015
  function sectionForSetting(id: EditableSettingId): SettingsSectionId {
1477
- if (id.startsWith("workers.profiles.") || id.startsWith("workers.agentBindings.") || id.startsWith("fleet.nodes.")) {
1478
- return "fleet";
1479
- }
1480
- if (id.startsWith("targets.")) return "targets";
1481
- for (const section of SETTINGS_SECTIONS) {
1482
- if ((SETTINGS_SECTION_ROWS[section.id] as readonly EditableSettingId[]).includes(id)) return section.id;
1483
- }
1484
- return "safety";
1016
+ return settingsSectionForPath(settingsV2PathForRow(id));
1485
1017
  }
1486
1018
 
1487
1019
  function cycleAffordance(values: readonly string[]): string {
@@ -1502,36 +1034,12 @@ function defaultValueFor(id: EditableSettingId): string | undefined {
1502
1034
  return String(raw);
1503
1035
  }
1504
1036
 
1505
- const SETTINGS_CENTER_V2_PATH_OVERRIDES: Readonly<Record<string, string>> = {
1506
- "workers.profiles": "fleet.profiles",
1507
- "workers.agentBindings": "fleet.agentProfiles",
1508
- "routing.agentAutomation.activeAgentRoles": "fleet.adaptiveRouting.agentRoles",
1509
- "panes.enabled": "interface.panes.enabled",
1510
- "panes.notifications": "interface.panes.notifications",
1511
- "panes.journal": "fleet.history.journal",
1512
- "panes.yazi.enabled": "interface.panes.files.enabled",
1513
- "panes.yazi.mode": "interface.panes.files.mode",
1514
- "panes.yazi.profile": "interface.panes.files.profile",
1515
- "panes.yazi.followCwd": "interface.panes.files.followCwd",
1516
- "panes.yazi.ratio": "interface.panes.files.ratio",
1517
- "panes.layout": "interface.panes.layout",
1518
- "panes.workers.ratio": "interface.panes.workers.ratio",
1519
- "delegation.agents": "integrations.externalAgents.entries",
1520
- keybindings: "interface.keybindings",
1521
- };
1522
-
1523
- /** Keep the existing Center navigation while showing and persisting only canonical v2 paths. */
1524
- function settingsV2PathForRow(id: EditableSettingId): string {
1525
- if (id.startsWith("workers.profiles.")) return `fleet.profiles.${id.slice("workers.profiles.".length)}`;
1526
- if (id.startsWith("workers.agentBindings.")) return `fleet.agentProfiles.${id.slice("workers.agentBindings.".length)}`;
1527
- const override = SETTINGS_CENTER_V2_PATH_OVERRIDES[id];
1528
- if (override !== undefined) return override;
1529
- for (const [v1Path, v2Path] of SETTINGS_V1_PATH_MOVES) {
1530
- if (v1Path === id) return v2Path;
1531
- if (v1Path === `${id}[]` && v2Path.endsWith("[]")) return v2Path.slice(0, -2);
1532
- }
1533
- return id;
1534
- }
1037
+ export const SETTINGS_SECTION_ROWS = Object.fromEntries(
1038
+ SETTINGS_SECTIONS.map((section) => [
1039
+ section.id,
1040
+ (Object.keys(SETTINGS_LABELS_BY_ID) as EditableSettingId[]).filter((id) => sectionForSetting(id) === section.id),
1041
+ ]),
1042
+ ) as unknown as Record<SettingsSectionId, readonly EditableSettingId[]>;
1535
1043
 
1536
1044
  function settingItem(
1537
1045
  id: EditableSettingId,
@@ -1581,7 +1089,7 @@ function settingItem(
1581
1089
  */
1582
1090
  function groupHeader(
1583
1091
  id: GroupHeaderId,
1584
- section: SettingsSectionId,
1092
+ section: SettingsSectionName,
1585
1093
  label: string,
1586
1094
  description: string,
1587
1095
  ): SettingsCenterItem {
@@ -1590,7 +1098,7 @@ function groupHeader(
1590
1098
  label,
1591
1099
  currentValue: "",
1592
1100
  description,
1593
- section,
1101
+ section: resolveSettingsSection(section) ?? "advanced",
1594
1102
  configPath: id,
1595
1103
  affordance: "group heading",
1596
1104
  scope: "live",
@@ -1600,14 +1108,6 @@ function groupHeader(
1600
1108
  };
1601
1109
  }
1602
1110
 
1603
- function fleetGroupHeader(id: FleetGroupHeaderId, label: string): SettingsCenterItem {
1604
- return groupHeader(id, "fleet", label, `${label} in the Fleet workbench.`);
1605
- }
1606
-
1607
- function terminalGroupHeader(id: TerminalGroupHeaderId, label: string): SettingsCenterItem {
1608
- return groupHeader(id, "terminal", label, `${label} behavior in the terminal.`);
1609
- }
1610
-
1611
1111
  function targetAddCta(): SettingsCenterItem {
1612
1112
  return {
1613
1113
  id: "targets.add-cta",
@@ -1642,10 +1142,83 @@ function thinkingChoices(
1642
1142
 
1643
1143
  /**
1644
1144
  * Surface every configurable knob. Editable knobs carry values/submenus;
1645
- * read-only pointer rows (targets, keybindings, favorites, safety net) name the
1145
+ * read-only pointer rows (maintenance and safety net) name the
1646
1146
  * surface that owns them so the Center has no dead-but-tappable rows.
1647
1147
  */
1648
- function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSettingItemsOptions): SettingsCenterItem[] {
1148
+ function commonControlItem(control: SettingControl, live: () => Readonly<ClioSettings>): SettingsCenterItem {
1149
+ const id = `setting.${control.path}` as const;
1150
+ return {
1151
+ id,
1152
+ label: control.label,
1153
+ description: control.description,
1154
+ help: controlInstructions(control),
1155
+ section: settingsSectionForPath(control.path),
1156
+ configPath: control.path,
1157
+ currentValue: "",
1158
+ affordance: control.readOnly ? "managed by its confirmation flow" : "edit with validation",
1159
+ scope: settingsChangeKind(control.path) === "restartRequired" ? "restart" : "live",
1160
+ defaultValue: formatControlValue(getAtPath(DEFAULT_SETTINGS, control.path)),
1161
+ readOnly: control.readOnly,
1162
+ presentationKind: "setting",
1163
+ valueSegments: [],
1164
+ ...(control.choices || control.kind === "boolean"
1165
+ ? { values: [...(control.choices ?? ["true", "false"])] }
1166
+ : {
1167
+ submenu: (current, done) => {
1168
+ const input = new Input();
1169
+ input.setValue(current);
1170
+ input.focused = true;
1171
+ const wrapper = new SubmenuWrapper(
1172
+ control.label,
1173
+ input,
1174
+ buildHint([{ key: "Enter", verb: "review" }], "back"),
1175
+ controlInstructions(control),
1176
+ );
1177
+ input.onSubmit = (value) => {
1178
+ try {
1179
+ applyControlValue(structuredClone(live()), control.path, value);
1180
+ done(value);
1181
+ } catch (error) {
1182
+ wrapper.setProblem(error instanceof Error ? error.message : String(error));
1183
+ }
1184
+ };
1185
+ input.onEscape = () => done();
1186
+ return wrapper;
1187
+ },
1188
+ }),
1189
+ };
1190
+ }
1191
+
1192
+ function maintenanceRows(): SettingsCenterItem[] {
1193
+ return [
1194
+ {
1195
+ id: "maintenance.diagnostics" as const,
1196
+ label: "Diagnostics",
1197
+ currentValue: "clio-coder configure --section diagnostics",
1198
+ description: "Inspect version and directories, run doctor, or read settings.yaml from the configure wizard.",
1199
+ },
1200
+ {
1201
+ id: "maintenance.editor" as const,
1202
+ label: "All settings",
1203
+ currentValue: "clio-coder configure --edit",
1204
+ description: "Open the complete settings.yaml in your editor, validate the draft, and review before saving.",
1205
+ },
1206
+ ].map((row) => ({
1207
+ ...row,
1208
+ configPath: row.id,
1209
+ valueSegments: [],
1210
+ section: "advanced",
1211
+ affordance: "run in a terminal",
1212
+ scope: "restart",
1213
+ readOnly: true,
1214
+ presentationKind: "status",
1215
+ }));
1216
+ }
1217
+
1218
+ export function buildSettingItems(
1219
+ settings: Readonly<ClioSettings>,
1220
+ options?: BuildSettingItemsOptions,
1221
+ ): SettingsCenterItem[] {
1649
1222
  const live = options?.getSettings ?? ((): Readonly<ClioSettings> => settings);
1650
1223
  const scopeList = settings.chat.modelPicker.cycleSet ?? [];
1651
1224
  const scopeText = scopeList.length > 0 ? scopeList.join(", ") : "(empty)";
@@ -1703,7 +1276,8 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1703
1276
  const favorites = settings.chat.modelPicker?.favorites ?? [];
1704
1277
  const agents = settings.integrations.externalAgents?.entries ?? [];
1705
1278
  const keybindingCount = Object.keys(settings.interface.keybindings ?? {}).length;
1706
- return [
1279
+ const items: SettingsCenterItem[] = [
1280
+ ...maintenanceRows(),
1707
1281
  settingItem("autonomy", settings.safety.autonomy, {
1708
1282
  values: ["read-only", "suggest", "auto-edit", "full-auto"],
1709
1283
  }),
@@ -1764,7 +1338,6 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1764
1338
  settingItem("prewarm.enabled", String(settings.chat.prewarm), {
1765
1339
  values: ["true", "false"],
1766
1340
  }),
1767
- fleetGroupHeader("fleet.group.defaults", "Defaults"),
1768
1341
  settingItem("workers.default.target", settings.fleet.default.target ?? "(unset)", {
1769
1342
  submenu: targetSubmenu,
1770
1343
  affordance: options?.providers ? "opens picker" : "free text",
@@ -1783,7 +1356,6 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1783
1356
  submenu: editNumberSubmenu("Edit resilience cooldown (ms)", "workers.resilienceCooldownMs"),
1784
1357
  affordance: "free text",
1785
1358
  }),
1786
- fleetGroupHeader("fleet.group.profiles", "Profiles"),
1787
1359
  ...fleetProfileRows(settings, live, options),
1788
1360
  settingItem("workers.profiles", "", {
1789
1361
  label: "Add profile",
@@ -1792,7 +1364,6 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1792
1364
  presentationKind: "action",
1793
1365
  valueSegments: [],
1794
1366
  }),
1795
- fleetGroupHeader("fleet.group.agent-routes", "Agent routes"),
1796
1367
  ...agentBindingRows(settings, live),
1797
1368
  settingItem("workers.agentBindings", "", {
1798
1369
  label: "Add agent route",
@@ -1801,7 +1372,6 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1801
1372
  presentationKind: profileCount > 0 ? "action" : "read-only-fact",
1802
1373
  valueSegments: [],
1803
1374
  }),
1804
- fleetGroupHeader("fleet.group.route-activation", "Route activation"),
1805
1375
  settingItem("routing.activeRoles", routing.roles.length > 0 ? routing.roles.join(", ") : "(none)", {
1806
1376
  submenu: editEnumListSubmenu("Edit active routing roles", ACTIVE_ROUTING_ROLES),
1807
1377
  affordance: `free text from ${ACTIVE_ROUTING_ROLES.join(", ")}`,
@@ -1819,11 +1389,9 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1819
1389
  : "(none)",
1820
1390
  { affordance: "edit settings.yaml", readOnly: true },
1821
1391
  ),
1822
- fleetGroupHeader("fleet.group.placement", "Placement"),
1823
1392
  ...fleetNodeRows(options?.getFleetNodes?.() ?? []),
1824
1393
  ...fleetEndpointRows(options?.providers),
1825
- fleetGroupHeader("fleet.group.panes", "Panes"),
1826
- settingItem("panes.enabled", panes.enabled, { values: ["auto", "embedded", "off"] }),
1394
+ settingItem("panes.enabled", panes.enabled, { values: ["auto", "off"] }),
1827
1395
  settingItem("panes.notifications", panes.notifications, { values: ["failures", "all", "off"] }),
1828
1396
  settingItem("panes.layout", panes.layout, { values: ["off", "workers", "cockpit"] }),
1829
1397
  settingItem("panes.workers.ratio", formatThreshold(panes.workers.ratio, "0.34"), {
@@ -1864,12 +1432,6 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1864
1432
  settingItem("budget.concurrency", String(settings.fleet.concurrency), {
1865
1433
  values: ["auto", "1", "2", "4", "8"],
1866
1434
  }),
1867
- groupHeader(
1868
- "budget.group.guardrails",
1869
- "budget",
1870
- "Guardrails",
1871
- "Numeric backstops that bound runaway agent behavior.",
1872
- ),
1873
1435
  settingItem("guardrails.turnToolCallBudget", String(safetyLimits.chatToolCallsPerTurn), {
1874
1436
  submenu: editNumberSubmenu("Edit turn tool-call budget", "guardrails.turnToolCallBudget"),
1875
1437
  affordance: "free text",
@@ -1900,12 +1462,6 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1900
1462
  settingItem("compaction.threshold", formatThreshold(compaction.threshold), {
1901
1463
  values: ["0.7", "0.8", "0.85", "0.9"],
1902
1464
  }),
1903
- groupHeader(
1904
- "compaction.group.working-set",
1905
- "compaction",
1906
- "Working set",
1907
- "The non-destructive eviction layer that runs before a summary is needed.",
1908
- ),
1909
1465
  settingItem("context.workingSet.enabled", String(workingSet.enabled), {
1910
1466
  values: ["true", "false"],
1911
1467
  }),
@@ -1957,7 +1513,6 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1957
1513
  settingItem("terminal.notify", String(terminal.desktopNotifications), {
1958
1514
  values: ["false", "true"],
1959
1515
  }),
1960
- terminalGroupHeader("terminal.group.files-pane", "Files pane"),
1961
1516
  settingItem("panes.yazi.enabled", String(panes.files.enabled), { values: ["true", "false"] }),
1962
1517
  settingItem("panes.yazi.mode", panes.files.mode, { values: ["companion", "chooser"] }),
1963
1518
  settingItem("panes.yazi.profile", panes.files.profile, { values: ["managed", "user"] }),
@@ -2039,12 +1594,6 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
2039
1594
  settingItem("delegation.agents", agents.length > 0 ? `${agents.length} agent(s)` : "(none)", {
2040
1595
  ...delegationAgentsAffordance(agents, options?.getInteropProposals?.() ?? []),
2041
1596
  }),
2042
- groupHeader(
2043
- "advanced.group.library",
2044
- "advanced",
2045
- "Library",
2046
- "The private resource catalog and the remote it may sync with.",
2047
- ),
2048
1597
  settingItem("library.catalog", library.catalog ?? "(config directory)", {
2049
1598
  submenu: editTextSubmenu("Edit library catalog path; blank uses the config directory"),
2050
1599
  affordance: "free text",
@@ -2065,6 +1614,51 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
2065
1614
  values: ["true", "false"],
2066
1615
  }),
2067
1616
  ];
1617
+ for (const item of items) {
1618
+ const control = settingControl(item.configPath);
1619
+ if (
1620
+ control?.kind === "number" ||
1621
+ item.configPath === "fleet.concurrency" ||
1622
+ ["modelSelector.favorites", "keybindings", "routing.agentAutomation.activeAgentRoles"].includes(item.id)
1623
+ ) {
1624
+ if (control) {
1625
+ const replacement = commonControlItem(control, live);
1626
+ const value = getAtPath(settings, control.path);
1627
+ Object.assign(item, replacement, {
1628
+ id: item.id,
1629
+ currentValue: formatControlValue(value),
1630
+ editValue:
1631
+ value == null
1632
+ ? ""
1633
+ : control.kind === "list"
1634
+ ? (value as string[]).join(", ")
1635
+ : typeof value === "object"
1636
+ ? JSON.stringify(value)
1637
+ : String(value),
1638
+ });
1639
+ }
1640
+ }
1641
+ }
1642
+ const paths = new Set(items.map((item) => item.configPath));
1643
+ return [
1644
+ ...items,
1645
+ ...SETTING_CONTROLS.filter(
1646
+ (control) => !paths.has(control.path) || control.path === "integrations.externalAgents.entries",
1647
+ ).map((control) => {
1648
+ const item = commonControlItem(control, live);
1649
+ const value = getAtPath(settings, control.path);
1650
+ item.currentValue = formatControlValue(value);
1651
+ item.editValue =
1652
+ value == null
1653
+ ? ""
1654
+ : control.kind === "list"
1655
+ ? (value as string[]).join(", ")
1656
+ : typeof value === "object"
1657
+ ? JSON.stringify(value)
1658
+ : String(value);
1659
+ return item;
1660
+ }),
1661
+ ];
2068
1662
  }
2069
1663
 
2070
1664
  function fleetProfileRows(
@@ -2217,12 +1811,39 @@ function agentBindingRows(settings: Readonly<ClioSettings>, live: () => Readonly
2217
1811
  });
2218
1812
  }
2219
1813
 
2220
- function targetRows(
1814
+ /** One short phrase for a route's breaker, keyed by the model it serves. */
1815
+ function routeBreakerPhrase(route: RouteBreakerView): string {
1816
+ switch (route.state) {
1817
+ case "open":
1818
+ return `${route.wireModelId} open ${Math.ceil(route.remainingMs / 1000)}s after ${route.reason}`;
1819
+ case "half-open":
1820
+ return `${route.wireModelId} half-open after ${route.reason}`;
1821
+ case "probing":
1822
+ return `${route.wireModelId} probing after ${route.reason}`;
1823
+ case "closed":
1824
+ return `${route.wireModelId} ${route.consecutiveFailures} failure${route.consecutiveFailures === 1 ? "" : "s"} (${route.reason})`;
1825
+ }
1826
+ }
1827
+
1828
+ /** The health cell a tripped route takes over: open first, then a probe in flight, then half-open. */
1829
+ function routeBreakerSegment(routes: ReadonlyArray<RouteBreakerView>): SettingsValueSegment | null {
1830
+ const open = routes.filter((route) => route.state === "open");
1831
+ if (open.length > 0) {
1832
+ const remainingMs = Math.max(...open.map((route) => route.remainingMs));
1833
+ return { text: `○ open ${Math.ceil(remainingMs / 1000)}s`, tone: "unhealthy" };
1834
+ }
1835
+ if (routes.some((route) => route.state === "probing")) return { text: "◐ probing", tone: "degraded" };
1836
+ if (routes.some((route) => route.state === "half-open")) return { text: "◐ half-open", tone: "degraded" };
1837
+ return null;
1838
+ }
1839
+
1840
+ export function targetRows(
2221
1841
  settings: Readonly<ClioSettings>,
2222
1842
  options: BuildSettingItemsOptions | undefined,
2223
1843
  ): SettingsCenterItem[] {
2224
1844
  const providers = options?.providers;
2225
1845
  const statuses = new Map(providers?.list().map((status) => [status.target.id, status] as const) ?? []);
1846
+ const breakers = options?.getRouteBreakers?.() ?? [];
2226
1847
  return settings.targets.map((target) => {
2227
1848
  const status = statuses.get(target.id);
2228
1849
  const roles = [
@@ -2240,7 +1861,9 @@ function targetRows(
2240
1861
  tone: "activity",
2241
1862
  }
2242
1863
  : null;
2243
- const liveHealth = activitySegment ?? healthSegment;
1864
+ const routes = breakers.filter((route) => route.targetId === target.id);
1865
+ const liveHealth = activitySegment ?? routeBreakerSegment(routes) ?? healthSegment;
1866
+ const breakerText = routes.length > 0 ? ` · Breaker: ${routes.map(routeBreakerPhrase).join("; ")}` : "";
2244
1867
  const runtime = status?.runtime?.id ?? target.runtime;
2245
1868
  const latency =
2246
1869
  status?.health.latencyMs === null || status?.health.latencyMs === undefined ? "—" : `${status.health.latencyMs} ms`;
@@ -2253,11 +1876,11 @@ function targetRows(
2253
1876
  { text: ` ${runtime}`, tone: "neutral" as const },
2254
1877
  { text: ` ${latency}`, tone: "neutral" as const },
2255
1878
  ];
2256
- const value = `${health} · ${target.id} · ${roleText} · ${runtime} · ${latency}`;
1879
+ const value = `${health} · ${target.id} · ${roleText} · ${runtime} · ${latency}${breakerText}`;
2257
1880
  const item = settingItem(`targets.${target.id}`, value, {
2258
1881
  label: target.id,
2259
1882
  description: `URL: ${target.url ?? "(none)"} · Default model: ${target.defaultModel ?? "(none)"}`,
2260
- help: `Last probe: ${lastProbe} · Failure reason: ${failureReason}`,
1883
+ help: `Last probe: ${lastProbe} · Failure reason: ${failureReason}${breakerText}`,
2261
1884
  submenu: targetActionsSubmenu(target.id, options),
2262
1885
  affordance: options?.connectTarget ? "Enter: use, connect, probe, remove" : "Enter: use, probe, remove",
2263
1886
  presentationKind: "status",
@@ -2292,9 +1915,11 @@ function targetHealthSegment(status: TargetHealth["status"]): SettingsValueSegme
2292
1915
  }
2293
1916
 
2294
1917
  /** Read-only placement rows: where dispatched workers run, from the live scheduler snapshot. */
2295
- function fleetNodeRows(nodes: ReadonlyArray<FleetNodeSnapshot>): SettingsCenterItem[] {
1918
+ export function fleetNodeRows(nodes: ReadonlyArray<FleetNodeSnapshot>): SettingsCenterItem[] {
2296
1919
  return nodes.map((node) => {
2297
- const busy = node.maxWorkers > 0 ? `${node.activeWorkers}/${node.maxWorkers} busy` : `${node.activeWorkers} busy`;
1920
+ const bound =
1921
+ node.capacityBound === null ? null : describeLocalCapacity({ limit: node.maxWorkers, bound: node.capacityBound });
1922
+ const busy = `${node.maxWorkers > 0 ? `${node.activeWorkers}/${node.maxWorkers} busy` : `${node.activeWorkers} busy`}${bound ? ` · ${bound}` : ""}`;
2298
1923
  return settingItem(`fleet.nodes.${node.id}`, `${node.state} · ${busy}`, {
2299
1924
  label: `node ${node.id}`,
2300
1925
  description: `${node.kind} · ${node.host}${node.stateReason ? ` · ${node.stateReason}` : ""}${node.lastSeenAt ? ` · seen ${clockLocal(node.lastSeenAt)}` : ""}`,
@@ -2341,12 +1966,29 @@ function fleetEndpointRows(providers: ProvidersContract | undefined): SettingsCe
2341
1966
  });
2342
1967
  }
2343
1968
 
2344
- function buildSettingsSections(items: readonly SettingsCenterItem[]): SettingsCenterSection[] {
2345
- return SETTINGS_SECTIONS.map((section) => ({
2346
- id: section.id,
2347
- label: section.label,
2348
- items: items.filter((item) => item.section === section.id),
2349
- }));
1969
+ export function buildSettingsSections(items: readonly SettingsCenterItem[]): SettingsCenterSection[] {
1970
+ return SETTINGS_SECTIONS.map((section) => {
1971
+ const rows = items.filter(
1972
+ (item) => item.section === section.id && (item.id === "targets" || item.presentationKind !== "group-header"),
1973
+ );
1974
+ if (section.id === "targets") return { id: section.id, label: section.label, items: rows };
1975
+ const groups = new Map<string, SettingsCenterItem[]>();
1976
+ for (const item of rows) {
1977
+ const group = settingsGroupForPath(item.configPath ?? item.id);
1978
+ const entries = groups.get(group) ?? [];
1979
+ entries.push(item);
1980
+ groups.set(group, entries);
1981
+ }
1982
+ return {
1983
+ id: section.id,
1984
+ label: section.label,
1985
+ items: [...groups].flatMap(([label, entries], index) =>
1986
+ label
1987
+ ? [groupHeader(`settings.group.${section.id}.${index}`, section.id, label, section.description), ...entries]
1988
+ : entries,
1989
+ ),
1990
+ };
1991
+ });
2350
1992
  }
2351
1993
 
2352
1994
  function refreshSettingItemsInPlace(items: SettingsCenterItem[], next: readonly SettingsCenterItem[]): void {
@@ -2422,6 +2064,15 @@ function applyDelegationAgentChange(settings: ClioSettings, value: string): void
2422
2064
  }
2423
2065
 
2424
2066
  function applySettingChange(settings: ClioSettings, id: string, value: string): void {
2067
+ if (
2068
+ id.startsWith("setting.") ||
2069
+ settingControl(settingsV2PathForRow(id))?.kind === "number" ||
2070
+ id === "budget.concurrency" ||
2071
+ ["modelSelector.favorites", "keybindings", "routing.agentAutomation.activeAgentRoles"].includes(id)
2072
+ ) {
2073
+ applyControlValue(settings, settingsV2PathForRow(id), value);
2074
+ return;
2075
+ }
2425
2076
  if (applyEntrySettingChange(settings, id, value)) return;
2426
2077
  switch (id) {
2427
2078
  case "autonomy":
@@ -2847,7 +2498,9 @@ function changedLeafPaths(before: Readonly<ClioSettings>, after: Readonly<ClioSe
2847
2498
  const visit = (a: unknown, b: unknown, path: string): void => {
2848
2499
  if (a === b) return;
2849
2500
  const profileLeaf = path.startsWith("fleet.profiles.") && path.split(".").length === 3;
2850
- if (!isRecord(a) || !isRecord(b) || profileLeaf) {
2501
+ // These editable JSON maps contain user keys, including dots; commit the collection atomically.
2502
+ const collectionLeaf = path === "interface.keybindings" || path === "fleet.rosters";
2503
+ if (!isRecord(a) || !isRecord(b) || profileLeaf || collectionLeaf) {
2851
2504
  if (JSON.stringify(a) !== JSON.stringify(b)) out.push(path);
2852
2505
  return;
2853
2506
  }
@@ -2867,7 +2520,7 @@ type DeepReadonly<T> = T extends (...args: never[]) => unknown
2867
2520
  ? { readonly [K in keyof T]: DeepReadonly<T[K]> }
2868
2521
  : T;
2869
2522
 
2870
- export type SettingsPropagationTiming = "now" | "next-dispatch" | "next-session";
2523
+ export type SettingsPropagationTiming = "now" | "next-request" | "next-dispatch" | "next-session";
2871
2524
 
2872
2525
  export interface SettingsChangePlan {
2873
2526
  readonly rowId: EditableSettingId;
@@ -2909,11 +2562,13 @@ function propagationTiming(
2909
2562
  return path.startsWith("chat.") ? "now" : "next-dispatch";
2910
2563
  }
2911
2564
  if (path.startsWith("fleet.")) return "next-dispatch";
2565
+ if (settingsChangeKind(path) === "nextTurn" && !isRoutingPath(path)) return "next-request";
2912
2566
  return "now";
2913
2567
  }
2914
2568
 
2915
2569
  function impactFor(propagation: SettingsChangePlan["propagation"]): string {
2916
2570
  const timings = new Set(propagation.map((entry) => entry.timing));
2571
+ if (timings.has("next-request")) return "takes effect on the next relevant request or explicit open";
2917
2572
  if (timings.has("now") && timings.has("next-dispatch"))
2918
2573
  return "takes effect for chat now and fleet routing at the next dispatch";
2919
2574
  if (timings.has("next-session")) return "takes effect next session";
@@ -2921,17 +2576,18 @@ function impactFor(propagation: SettingsChangePlan["propagation"]): string {
2921
2576
  return "takes effect now";
2922
2577
  }
2923
2578
 
2924
- function createSettingsChangePlan(
2579
+ export function createSettingsChangePlan(
2925
2580
  settings: Readonly<ClioSettings>,
2926
2581
  item: Pick<SettingsCenterItem, "id" | "label" | "currentValue" | "scope">,
2927
2582
  selectedValue: string,
2928
2583
  sessionDestinationAvailable = true,
2929
2584
  ): SettingsChangePlan | null {
2930
- if (item.id.startsWith("fleet.group.")) return null;
2931
2585
  const rowId = item.id as EditableSettingId;
2932
2586
  const original = structuredClone(settings);
2933
2587
  const proposed = structuredClone(original);
2934
2588
  applySettingChange(proposed, rowId, selectedValue);
2589
+ const validation = validateSettings(proposed);
2590
+ if (validation.issues.length) throw new SettingsValidationError(validation.issues);
2935
2591
  const paths = changedLeafPaths(original, proposed);
2936
2592
  if (paths.length === 0) return null;
2937
2593
  const restartRequired = item.scope === "restart";
@@ -3357,7 +3013,8 @@ export class SettingsCenter implements Component {
3357
3013
  };
3358
3014
  }
3359
3015
 
3360
- setSelection(sectionId: SettingsSectionId, rowIndex: number, lane: SettingsCenterLane = "rows"): void {
3016
+ setSelection(sectionName: SettingsSectionName, rowIndex: number, lane: SettingsCenterLane = "rows"): void {
3017
+ const sectionId = resolveSettingsSection(sectionName) ?? SETTINGS_SECTIONS[0].id;
3361
3018
  if (this.sections().some((section) => section.id === sectionId)) this.selectedSectionId = sectionId;
3362
3019
  const section = this.currentSection();
3363
3020
  if (section) this.setRowIndex(section, this.selectableRowIndex(section, rowIndex));
@@ -3685,7 +3342,13 @@ export class SettingsCenter implements Component {
3685
3342
  }
3686
3343
 
3687
3344
  private prepareScopeConfirm(item: SettingsCenterItem, value: string): void {
3688
- const plan = this.options.prepareChange(item, value);
3345
+ let plan: SettingsChangePlan | null;
3346
+ try {
3347
+ plan = this.options.prepareChange(item, value);
3348
+ } catch (error) {
3349
+ this.showChangeError(item, value, error);
3350
+ return;
3351
+ }
3689
3352
  if (!plan) {
3690
3353
  this.submenuComponent = null;
3691
3354
  this.pendingValue = null;
@@ -3695,6 +3358,41 @@ export class SettingsCenter implements Component {
3695
3358
  this.openScopeConfirm(plan);
3696
3359
  }
3697
3360
 
3361
+ private showChangeError(item: SettingsCenterItem, value: string, error: unknown): void {
3362
+ const list = new SettingsSelectList(
3363
+ [
3364
+ { value: "edit", label: "Edit value" },
3365
+ { value: "cancel", label: "Cancel" },
3366
+ ],
3367
+ 2,
3368
+ DEFAULT_SELECT_THEME,
3369
+ );
3370
+ list.onSelect = (choice) => {
3371
+ this.submenuComponent = null;
3372
+ if (choice.value === "edit") {
3373
+ if (item.submenu)
3374
+ this.submenuComponent = item.submenu(value, (next) => {
3375
+ this.submenuComponent = null;
3376
+ if (next !== undefined) this.prepareScopeConfirm(item, next);
3377
+ this.options.requestRender?.();
3378
+ });
3379
+ else this.activateSelectedItem();
3380
+ }
3381
+ this.options.requestRender?.();
3382
+ };
3383
+ list.onCancel = () => {
3384
+ this.submenuComponent = null;
3385
+ this.options.requestRender?.();
3386
+ };
3387
+ this.submenuComponent = new SubmenuWrapper(
3388
+ "Change not saved",
3389
+ list,
3390
+ buildHint([{ key: "Enter", verb: "choose" }], "back"),
3391
+ error instanceof Error ? error.message : String(error),
3392
+ );
3393
+ this.options.requestRender?.();
3394
+ }
3395
+
3698
3396
  /** Hold one immutable plan while the operator chooses its destination. */
3699
3397
  private openScopeConfirm(plan: SettingsChangePlan): void {
3700
3398
  const options = plan.sessionCapable
@@ -3709,7 +3407,13 @@ export class SettingsCenter implements Component {
3709
3407
  ];
3710
3408
  const list = new SettingsSelectList(options, options.length, DEFAULT_SELECT_THEME);
3711
3409
  const finish = (chosen: "session" | "global" | "cancel"): void => {
3712
- if (chosen === "session" || chosen === "global") this.options.onApply(plan, chosen);
3410
+ try {
3411
+ if (chosen === "session" || chosen === "global") this.options.onApply(plan, chosen);
3412
+ } catch (error) {
3413
+ const item = this.items.find((entry) => entry.id === plan.rowId);
3414
+ if (item) this.showChangeError(item, plan.selectedValue, error);
3415
+ return;
3416
+ }
3713
3417
  this.submenuComponent = null;
3714
3418
  this.pendingValue = null;
3715
3419
  this.options.requestRender?.();
@@ -3915,13 +3619,7 @@ export class SettingsCenter implements Component {
3915
3619
  const theme = clioTheme();
3916
3620
  const filtering = this.effectiveFilterQuery().length > 0;
3917
3621
  const rows: Array<{ line: string; sectionId: SettingsSectionId | null }> = [];
3918
- let previousGroup: string | null = null;
3919
3622
  for (const section of this.sections()) {
3920
- const group = SETTINGS_SECTIONS.find((entry) => entry.id === section.id)?.group;
3921
- if (group && group !== previousGroup) {
3922
- rows.push({ line: theme.style("accentDeep", group, { bold: true }), sectionId: null });
3923
- previousGroup = group;
3924
- }
3925
3623
  const selected = section.id === this.selectedSectionId;
3926
3624
  const cursor = selected && this.level === "sections" ? theme.fg("accent", `${GLYPH.cursor} `) : " ";
3927
3625
  const matchCount = section.items.filter((item) => this.isSelectableRow(item)).length;
@@ -4124,6 +3822,7 @@ export class SettingsCenter implements Component {
4124
3822
  }
4125
3823
 
4126
3824
  private footerScopeNote(item: SettingsCenterItem): string {
3825
+ if (item.id.startsWith("maintenance.")) return `Run in a terminal: ${item.currentValue}`;
4127
3826
  if (item.id === "targets.add-cta") return "Run the command shown to open the accepted add wizard";
4128
3827
  if (item.submenu && (item.presentationKind === "status" || item.presentationKind === "action"))
4129
3828
  return "Enter opens actions · nothing changes until an action is confirmed";
@@ -4184,10 +3883,11 @@ export interface OpenSettingsOverlayDeps {
4184
3883
  notice?: (level: SettingsNoticeLevel, text: string, key?: string) => void;
4185
3884
  onClose: () => void;
4186
3885
  /** Open focused on this section (deep link from `/settings <section>`). */
4187
- section?: SettingsSectionId;
3886
+ section?: SettingsSectionName;
4188
3887
  /** Optional semantic row anchor for command deep links. */
4189
3888
  rowId?: SettingsCenterRowId;
4190
3889
  getFleetNodes?: BuildSettingItemsOptions["getFleetNodes"];
3890
+ getRouteBreakers?: BuildSettingItemsOptions["getRouteBreakers"];
4191
3891
  connectTarget?: BuildSettingItemsOptions["connectTarget"];
4192
3892
  getInteropProposals?: BuildSettingItemsOptions["getInteropProposals"];
4193
3893
  }
@@ -4229,6 +3929,7 @@ export function openSettingsOverlay(tui: TUI, deps: OpenSettingsOverlayDeps): Se
4229
3929
  };
4230
3930
  if (deps.providers) buildOptions.providers = deps.providers;
4231
3931
  if (deps.getFleetNodes) buildOptions.getFleetNodes = deps.getFleetNodes;
3932
+ if (deps.getRouteBreakers) buildOptions.getRouteBreakers = deps.getRouteBreakers;
4232
3933
  if (deps.connectTarget) buildOptions.connectTarget = deps.connectTarget;
4233
3934
  if (deps.getInteropProposals) buildOptions.getInteropProposals = deps.getInteropProposals;
4234
3935
  const items = buildSettingItems(deps.getSettings(), buildOptions);
@@ -4247,7 +3948,9 @@ export function openSettingsOverlay(tui: TUI, deps: OpenSettingsOverlayDeps): Se
4247
3948
  requestRender: () => tui.requestRender(),
4248
3949
  });
4249
3950
  if (deps.section) {
4250
- const sectionItems = buildSettingsSections(items).find((section) => section.id === deps.section)?.items ?? [];
3951
+ const sectionItems =
3952
+ buildSettingsSections(items).find((section) => section.id === resolveSettingsSection(deps.section ?? ""))?.items ??
3953
+ [];
4251
3954
  const rowIndex = deps.rowId ? sectionItems.findIndex((item) => item.id === deps.rowId) : -1;
4252
3955
  center.setSelection(deps.section, rowIndex >= 0 ? rowIndex : 0);
4253
3956
  }