@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
@@ -4,12 +4,16 @@ import { isAbsolute, resolve as resolvePath } from "node:path";
4
4
  import {
5
5
  type AccountabilityEvidenceReadyPayload,
6
6
  BusChannels,
7
+ type CompactionPayload,
8
+ type ContextWarningPayload,
7
9
  type DispatchCompletedPayload,
8
10
  type DispatchEnqueuedPayload,
9
11
  type DispatchFailedPayload,
10
12
  type DispatchProgressPayload,
11
13
  type DispatchStartedPayload,
12
14
  type LoopBlockedPayload,
15
+ type ProviderHealthPayload,
16
+ type ToolBudgetExceededPayload,
13
17
  } from "../../core/bus-events.js";
14
18
  import { DEFAULT_DELEGATION_PERMISSION_TIMEOUT_MS } from "../../core/defaults.js";
15
19
  import type { SafeEventBus } from "../../core/event-bus.js";
@@ -17,7 +21,10 @@ import { MAX_TIMER_DELAY_MS } from "../../core/timers.js";
17
21
  import { ToolNames } from "../../core/tool-names.js";
18
22
  import type { ProvidersContract } from "../../domains/providers/contract.js";
19
23
  import { isOrchestratorEligibleRuntime } from "../../domains/providers/eligibility.js";
24
+ import type { ClassifierCall } from "../../domains/safety/action-classifier.js";
20
25
  import { type AutonomyLevel, DEFAULT_AUTONOMY_LEVEL } from "../../domains/safety/autonomy.js";
26
+ import { describeCallTarget } from "../../domains/safety/call-target.js";
27
+ import type { DecisionPresentation, TrustedDecisionFacts } from "../../domains/safety/decision-presentation.js";
21
28
  import {
22
29
  classifyDecisionPresentation,
23
30
  decisionFactsForPermission,
@@ -29,6 +36,7 @@ import { askUserExposure } from "../../tools/ask-user.js";
29
36
  import type { ToolRegistry } from "../../tools/registry.js";
30
37
  import { toolResultPresentationText } from "../../tools/result-disposition.js";
31
38
  import type { AgentMessage } from "../types.js";
39
+ import type { AcpCommandCatalog, AcpCommandControl } from "./commands.js";
32
40
  import { ACP_TURN_FAILED_MESSAGE, AcpRequestError, AcpTimeoutError, acpErrorMessage } from "./errors.js";
33
41
  import type { AcpJsonRpcPeerTransport } from "./transport.js";
34
42
  import type {
@@ -43,11 +51,19 @@ import type {
43
51
  } from "./types.js";
44
52
  import {
45
53
  ACP_AGENT_META_KEY,
54
+ ACP_COMMANDS_INVOKE_METHOD,
55
+ ACP_COMMANDS_LIST_METHOD,
56
+ ACP_COMMANDS_META_KEY,
57
+ ACP_DECISION_META_KEY,
46
58
  ACP_MAX_CHUNK_BYTES,
59
+ ACP_MAX_RAW_DIFF_BYTES,
47
60
  ACP_MAX_RAW_RECORD_BYTES,
48
61
  ACP_MAX_STRING_BYTES,
49
62
  ACP_MAX_TOOL_CALL_ID_BYTES,
63
+ ACP_MAX_TOOL_PROGRESS_FRAMES_PER_CALL,
64
+ ACP_MIN_TOOL_PROGRESS_INTERVAL_MS,
50
65
  ACP_SESSION_META_KEY,
66
+ ACP_TOOL_PROGRESS_META_KEY,
51
67
  ACP_USAGE_META_KEY,
52
68
  } from "./types.js";
53
69
 
@@ -62,9 +78,42 @@ export interface AcpServerChat {
62
78
  getSessionId(): string | null;
63
79
  /** Replace provider context and the next persisted parent for a new or loaded session. */
64
80
  resetForSession?(leafTurnId: string | null, replayMessages?: ReadonlyArray<AgentMessage>): void;
81
+ /**
82
+ * Mid-run guidance: queue `text` on the engine's steering queue, where the
83
+ * inner loop drains it between tool batches. False means nothing was
84
+ * streaming to steer, which the wire reports as a refusal rather than as a
85
+ * silent success.
86
+ */
87
+ steer?(text: string): boolean;
88
+ /** Queue `text` on the follow-up queue, drained when the whole run settles. */
89
+ queueFollowUp?(text: string): boolean;
90
+ queuedMessages?(): { steer: ReadonlyArray<string>; followUp: ReadonlyArray<string> };
91
+ /** Drain both queues and hand back the texts so a client can restore them. */
92
+ clearQueuedFollowUps?(): string[];
93
+ /** Why an interrupt would be refused right now, or null when it would cancel the run. */
94
+ interruptRefusal?(): string | null;
65
95
  dispose?(): void;
66
96
  }
67
97
 
98
+ /**
99
+ * The fleet controls the ACP steering surface reaches. Narrowed to the two
100
+ * operations an external client may perform on a worker it did not start, so a
101
+ * client cannot enqueue, route, or re-plan dispatch work through this server.
102
+ */
103
+ export interface AcpDispatchControl {
104
+ /**
105
+ * Queue operator guidance on a running worker's open stdin. Throws with an
106
+ * operator-facing message for every refusal; delivery itself is confirmed
107
+ * later and out of band, so a return here means queued, never delivered.
108
+ */
109
+ steer(runId: string, text: string): void;
110
+ abort(runId: string): void;
111
+ snapshot(): {
112
+ running: ReadonlyArray<{ runId: string; runtimeKind: string }>;
113
+ retrying: ReadonlyArray<{ runId: string }>;
114
+ };
115
+ }
116
+
68
117
  export interface AcpRoutingSnapshot {
69
118
  target: string | null;
70
119
  model: string | null;
@@ -95,6 +144,14 @@ export interface ClioAcpServerOptions {
95
144
  session?: SessionContract;
96
145
  providers?: ProvidersContract;
97
146
  settings?: AcpSettingsControl;
147
+ /** Wired only by the composition root; absent means `clio-coder/dispatch/steer` refuses. */
148
+ dispatch?: AcpDispatchControl;
149
+ /**
150
+ * The 13 wire-shaped operator commands. Absent means the catalog is not
151
+ * announced and both command methods refuse, which is what an embedder that
152
+ * wired no fleet, bus, or provider contract must observe.
153
+ */
154
+ commands?: AcpCommandControl;
98
155
  toolRegistry?: ToolRegistry;
99
156
  bus?: SafeEventBus;
100
157
  autonomy?: () => AutonomyLevel;
@@ -114,6 +171,13 @@ export interface ClioAcpServerOptions {
114
171
  * unstructured stderr tail (CONTRACT C001 §6). Defaults to dropping it.
115
172
  */
116
173
  diagnostics?: (line: string) => void;
174
+ /**
175
+ * Clock the tool-progress interval floor measures against. Injectable
176
+ * because the floor and the per-call frame ceiling are otherwise only
177
+ * observable by spending {@link ACP_MIN_TOOL_PROGRESS_INTERVAL_MS} of real
178
+ * time per frame, which puts a 64-frame ceiling sixteen seconds away.
179
+ */
180
+ now?: () => number;
117
181
  }
118
182
 
119
183
  interface AcpServerSession {
@@ -177,6 +241,21 @@ interface ActivePrompt {
177
241
  /** Most recent wire id a `tool_call` was actually emitted for, open or not. */
178
242
  lastEmittedToolCallId: string | null;
179
243
  toolCallSequence: number;
244
+ /** Opt-in state and per-call counters for the non-terminal progress stream. */
245
+ toolProgress: AcpToolProgressState;
246
+ }
247
+
248
+ /**
249
+ * What one turn has already streamed for each running tool call. The payload a
250
+ * tool reports is cumulative, so the last text sent is kept as well as the
251
+ * counters: an unchanged snapshot is a re-send of a frame the client already
252
+ * rendered and carries nothing it does not have. Bounded by the turn's tool
253
+ * calls and dies with the turn.
254
+ */
255
+ interface AcpToolProgressState {
256
+ enabled: boolean;
257
+ now: () => number;
258
+ calls: Map<string, { frames: number; lastSentAt: number; lastText: string }>;
180
259
  }
181
260
 
182
261
  /** What one emitted `tool_call` put on the wire that its permission request must repeat. */
@@ -323,7 +402,7 @@ const ACP_TRUNCATION_SUFFIX = "…[truncated]";
323
402
 
324
403
  const ACP_TRUNCATION_SUFFIX_BYTES = Buffer.byteLength(ACP_TRUNCATION_SUFFIX, "utf8");
325
404
 
326
- /** Workbench's frozen bounds for standard ACP tool-call presentation fields. */
405
+ /** Frozen bounds for standard ACP tool-call presentation fields. */
327
406
  const ACP_MAX_LOCATION_PATH_BYTES = 4 * 1024;
328
407
  const ACP_MAX_TOOL_TITLE_BYTES = 512;
329
408
 
@@ -340,7 +419,16 @@ const ACP_MAX_REPLAY_TOOL_CALLS = 8192;
340
419
  * reported facts instead of inferring one from tool titles or timing;
341
420
  * `accountability.evidenceReady` follows a run's terminal event once its
342
421
  * evidence bundle has landed, so the board can show first-pass success and a
343
- * finding count without reading Clio's state tree.
422
+ * finding count without reading Clio's state tree. The last four are the
423
+ * session's own health: without them a client can only infer that context was
424
+ * compacted, that the window is close to full, that the loop guard stopped a
425
+ * turn on volume rather than repetition, or that a target went down, by
426
+ * watching timing and tool titles.
427
+ *
428
+ * Every kind here is the literal `BusChannels` value of the channel it
429
+ * forwards. That is the invariant: a kind is never renamed on the way out, so
430
+ * `grep` finds the producer from the wire frame and a client's kind list and
431
+ * Clio's own channel table cannot drift into two vocabularies.
344
432
  */
345
433
  const ACP_FORWARDABLE_EVENT_KINDS = [
346
434
  "safety.loopBlocked",
@@ -350,6 +438,10 @@ const ACP_FORWARDABLE_EVENT_KINDS = [
350
438
  "dispatch.completed",
351
439
  "dispatch.failed",
352
440
  "accountability.evidenceReady",
441
+ "compaction.end",
442
+ "context.warning",
443
+ "safety.toolBudgetExceeded",
444
+ "provider.health",
353
445
  ] as const;
354
446
 
355
447
  type AcpForwardableEventKind = (typeof ACP_FORWARDABLE_EVENT_KINDS)[number];
@@ -371,6 +463,13 @@ const ACP_MAX_DISPATCH_ID_BYTES = 128;
371
463
  const ACP_MAX_EVIDENCE_TAGS = 32;
372
464
  const ACP_MAX_EVIDENCE_TAG_BYTES = 64;
373
465
 
466
+ /**
467
+ * The one forwarded payload field that is a sentence rather than an
468
+ * identifier: the context-window warning is Clio's own operator copy, so it is
469
+ * bounded to a banner's worth and stripped rather than refused.
470
+ */
471
+ const ACP_MAX_EVENT_TEXT_BYTES = 256;
472
+
374
473
  /**
375
474
  * Progress events forwarded per run before the stream is capped. One run
376
475
  * publishes one progress fact per worker event, which is unbounded; a client
@@ -456,16 +555,33 @@ function chunkText(text: string, maxBytes: number): string[] {
456
555
  return chunks;
457
556
  }
458
557
 
459
- function boundRawValue(value: unknown, depth: number): unknown {
460
- if (typeof value === "string") return boundString(value, ACP_MAX_STRING_BYTES);
558
+ /**
559
+ * The string cap for the value sitting at `key` inside a record sitting at
560
+ * `parentKey`. Everything gets {@link ACP_MAX_STRING_BYTES}; the single
561
+ * exception is the rendered diff an `edit` or `write` result carries, which the
562
+ * engine has already capped for exactly this purpose. The match is on the whole
563
+ * two-segment path and not on the key alone, so a tool that happens to report a
564
+ * top-level `diff` string does not widen itself into the exception.
565
+ */
566
+ function rawStringBytes(key: string | undefined, parentKey: string | undefined): number {
567
+ return key === "diff" && parentKey === "details" ? ACP_MAX_RAW_DIFF_BYTES : ACP_MAX_STRING_BYTES;
568
+ }
569
+
570
+ function boundRawValue(value: unknown, depth: number, key?: string, parentKey?: string): unknown {
571
+ if (typeof value === "string") return boundString(value, rawStringBytes(key, parentKey));
461
572
  if (Array.isArray(value)) {
462
573
  if (depth >= ACP_MAX_RAW_RECORD_DEPTH) return "[depth]";
574
+ // A member inherits no path: `details.diff` names one string, not a list
575
+ // of them, and a thousand-entry array of wide strings is the payload the
576
+ // record cap exists to stop.
463
577
  return value.map((entry) => boundRawValue(entry, depth + 1));
464
578
  }
465
579
  if (isRecord(value)) {
466
580
  if (depth >= ACP_MAX_RAW_RECORD_DEPTH) return "[depth]";
467
581
  const bounded: Record<string, unknown> = {};
468
- for (const [key, entry] of Object.entries(value)) bounded[key] = boundRawValue(entry, depth + 1);
582
+ for (const [entryKey, entry] of Object.entries(value)) {
583
+ bounded[entryKey] = boundRawValue(entry, depth + 1, entryKey, key);
584
+ }
469
585
  return bounded;
470
586
  }
471
587
  return value;
@@ -536,7 +652,7 @@ export function emptyUsage(): AcpServerUsage {
536
652
  return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, reasoning: 0, totalTokens: 0, costUsd: 0 };
537
653
  }
538
654
 
539
- function createActivePromptState(): ActivePrompt {
655
+ function createActivePromptState(toolProgress?: { enabled: boolean; now: () => number }): ActivePrompt {
540
656
  return {
541
657
  cancelled: false,
542
658
  permissionExpired: false,
@@ -556,6 +672,11 @@ function createActivePromptState(): ActivePrompt {
556
672
  toolCallSnapshots: new Map<string, AcpToolCallSnapshot>(),
557
673
  lastEmittedToolCallId: null,
558
674
  toolCallSequence: 0,
675
+ toolProgress: {
676
+ enabled: toolProgress?.enabled === true,
677
+ now: toolProgress?.now ?? Date.now,
678
+ calls: new Map<string, { frames: number; lastSentAt: number; lastText: string }>(),
679
+ },
559
680
  };
560
681
  }
561
682
 
@@ -873,6 +994,53 @@ function settleOpenToolCalls(
873
994
  active.openToolCalls.clear();
874
995
  }
875
996
 
997
+ /**
998
+ * Streams one running tool's cumulative output as a non-terminal
999
+ * `tool_call_update`. Nothing here mints a wire id: a frame is an update to a
1000
+ * call the client already rendered, so an event naming a call that was never
1001
+ * emitted or has already finished is dropped rather than announcing progress
1002
+ * for a `tool_call` the client has no row for.
1003
+ *
1004
+ * The three refusals below are the whole cost control. The tool's own throttle
1005
+ * bounds the rate but not the total, the payload is cumulative so a repeat
1006
+ * carries nothing new, and a client is holding per-call state that a long
1007
+ * stream would otherwise grow without a stated end.
1008
+ */
1009
+ function sendToolProgress(
1010
+ event: AcpEventRecord,
1011
+ transport: AcpJsonRpcPeerTransport,
1012
+ sessionId: string,
1013
+ active: ActivePrompt,
1014
+ ): void {
1015
+ const progress = active.toolProgress;
1016
+ if (!progress.enabled) return;
1017
+ const engineId = eventString(event, "toolCallId");
1018
+ const toolCallId = engineId === undefined ? null : openWireIdFor(active, engineId);
1019
+ if (toolCallId === null) return;
1020
+ const text = boundString(outputText(event.partialResult), ACP_MAX_CHUNK_BYTES);
1021
+ if (text.length === 0) return;
1022
+ const sent = progress.calls.get(toolCallId);
1023
+ const sentAt = progress.now();
1024
+ if (sent !== undefined) {
1025
+ if (sent.frames >= ACP_MAX_TOOL_PROGRESS_FRAMES_PER_CALL) return;
1026
+ if (text === sent.lastText) return;
1027
+ if (sentAt - sent.lastSentAt < ACP_MIN_TOOL_PROGRESS_INTERVAL_MS) return;
1028
+ }
1029
+ progress.calls.set(toolCallId, { frames: (sent?.frames ?? 0) + 1, lastSentAt: sentAt, lastText: text });
1030
+ sendUpdate(
1031
+ transport,
1032
+ sessionId,
1033
+ active,
1034
+ {
1035
+ sessionUpdate: "tool_call_update",
1036
+ toolCallId,
1037
+ status: "in_progress" satisfies AcpToolCallStatus,
1038
+ content: toolCallContent(text),
1039
+ },
1040
+ toolCallUpdateMeta(active.toolCallSnapshots.get(toolCallId)),
1041
+ );
1042
+ }
1043
+
876
1044
  function handleChatEvent(
877
1045
  rawEvent: AcpServerEvent,
878
1046
  transport: AcpJsonRpcPeerTransport,
@@ -947,6 +1115,10 @@ function handleChatEvent(
947
1115
  });
948
1116
  return;
949
1117
  }
1118
+ if (event.type === "tool_execution_update") {
1119
+ sendToolProgress(event, transport, sessionId, active);
1120
+ return;
1121
+ }
950
1122
  if (event.type === "tool_execution_end") {
951
1123
  const toolName = eventString(event, "toolName");
952
1124
  const toolCallId = endToolCallId(active, eventString(event, "toolCallId"));
@@ -1299,14 +1471,14 @@ const ACP_THINKING_LEVELS = new Set<AcpThinkingLevel>(["off", "minimal", "low",
1299
1471
  const ACP_AUTONOMY_LEVELS = new Set<AutonomyLevel>(["read-only", "suggest", "auto-edit", "full-auto"]);
1300
1472
  const ACP_MAX_TARGETS = 64;
1301
1473
  const ACP_MAX_TARGET_MODELS = 64;
1302
- // Workbench's frozen reader ceiling is 256 KiB per JSON-RPC line. Reserve
1474
+ // The frozen client reader ceiling is 256 KiB per JSON-RPC line. Reserve
1303
1475
  // 16 KiB for the response envelope/request id and keep this result a stable
1304
1476
  // prefix of whole targets/model ids.
1305
1477
  const ACP_MAX_TARGET_LIST_RESULT_BYTES = 240 * 1024;
1306
1478
  const ACP_EMPTY_TRUNCATED_TARGET_LIST_BYTES = utf8Bytes(
1307
1479
  JSON.stringify({ targets: [], _meta: { "clio-coder/truncated": true } }),
1308
1480
  );
1309
- // Session summaries share the same Workbench JSON-RPC line ceiling. Keep a
1481
+ // Session summaries share the same JSON-RPC line ceiling. Keep a
1310
1482
  // stable newest-first prefix of whole rows and reserve 16 KiB for the envelope.
1311
1483
  const ACP_MAX_SESSION_LIST_RESULT_BYTES = 240 * 1024;
1312
1484
  const ACP_EMPTY_TRUNCATED_SESSION_LIST_BYTES = utf8Bytes(
@@ -1386,6 +1558,73 @@ interface AcpPermissionBridge {
1386
1558
  cancelPending(reason: string): void;
1387
1559
  }
1388
1560
 
1561
+ /**
1562
+ * The closed set of option ids a `session/request_permission` from this server
1563
+ * offers, announced at initialize. Exactly one grants; the other two deny and
1564
+ * differ only in what happens to the rest of the turn. A client that returns
1565
+ * anything outside this list is denied, so minting `allow-always` cannot buy a
1566
+ * grant this server never offered.
1567
+ */
1568
+ const ACP_PERMISSION_OPTION_IDS = ["allow-once", "reject-once", "reject-and-stop"] as const;
1569
+
1570
+ /** Bound for one line of decision copy. The longest of them is well under this. */
1571
+ const ACP_MAX_DECISION_COPY_BYTES = 512;
1572
+
1573
+ function decisionCopy(value: string): string {
1574
+ return boundString(safeStoredString(value, ACP_MAX_DECISION_COPY_BYTES), ACP_MAX_DECISION_COPY_BYTES);
1575
+ }
1576
+
1577
+ /**
1578
+ * The classification the server already performed to label the two options,
1579
+ * attached to the ask instead of discarded. Everything here is host-derived:
1580
+ * the copy is generated from enforced policy facts, and the one caller-shaped
1581
+ * value, the call target, is rendered from the tool's own field allowlist and
1582
+ * sanitized before it is bounded. No model-authored prose reaches this record,
1583
+ * which is what lets a client render it as an authority statement rather than
1584
+ * as tool output.
1585
+ */
1586
+ function decisionMeta(
1587
+ facts: TrustedDecisionFacts,
1588
+ presentation: DecisionPresentation,
1589
+ call: ClassifierCall,
1590
+ ): Record<string, unknown> {
1591
+ const axis =
1592
+ facts.axis.kind === "safety-net"
1593
+ ? { kind: facts.axis.kind, ruleId: decisionCopy(facts.axis.ruleId) }
1594
+ : facts.axis.kind === "autonomy"
1595
+ ? { kind: facts.axis.kind, level: decisionCopy(facts.axis.level) }
1596
+ : { kind: facts.axis.kind };
1597
+ const origin =
1598
+ facts.origin.kind === "worker"
1599
+ ? {
1600
+ kind: facts.origin.kind,
1601
+ agentId: decisionCopy(facts.origin.agentId),
1602
+ runId: decisionCopy(facts.origin.runId),
1603
+ }
1604
+ : { kind: facts.origin.kind };
1605
+ const target = decisionCopy(describeCallTarget(call.tool, call.args));
1606
+ return {
1607
+ [ACP_DECISION_META_KEY]: {
1608
+ version: 1,
1609
+ tier: presentation.tier,
1610
+ tierLabel: decisionCopy(presentation.tierLabel),
1611
+ title: decisionCopy(presentation.title),
1612
+ semanticToken: presentation.semanticToken,
1613
+ authorizationCopy: decisionCopy(presentation.authorizationCopy),
1614
+ consequenceCopy: decisionCopy(presentation.consequenceCopy),
1615
+ reversibilityCopy: decisionCopy(presentation.reversibilityCopy),
1616
+ requestedByCopy: decisionCopy(presentation.requestedByCopy),
1617
+ actionClass: facts.actionClass ?? "unknown",
1618
+ axis,
1619
+ origin,
1620
+ exposure: facts.exposure,
1621
+ affectedScope: facts.affectedScope,
1622
+ reversibility: facts.reversibility,
1623
+ ...(target.length > 0 ? { target } : {}),
1624
+ },
1625
+ };
1626
+ }
1627
+
1389
1628
  function installPermissionBridge(input: {
1390
1629
  transport: AcpJsonRpcPeerTransport;
1391
1630
  toolRegistry: ToolRegistry | undefined;
@@ -1416,19 +1655,23 @@ function installPermissionBridge(input: {
1416
1655
  const queuedRequestDetails = new Map<string, { tool: string; actionClass: string }>();
1417
1656
  const unregister = input.toolRegistry.onPermissionRequired((call, decision, meta) => {
1418
1657
  if (queuedRequestIds.has(meta.requestId)) return;
1419
- const presentation = classifyDecisionPresentation(
1420
- decisionFactsForPermission({
1421
- tool: call.tool,
1422
- actionClass: decision.classification.actionClass,
1423
- axis: meta.axis.startsWith("net:")
1424
- ? { kind: "safety-net", ruleId: meta.axis.slice("net:".length) || "unknown" }
1425
- : { kind: "autonomy", level: meta.axis.slice("autonomy:".length) || DEFAULT_AUTONOMY_LEVEL },
1426
- origin: { kind: "main" },
1427
- ...(call.tool === ToolNames.AskUser ? { exposure: askUserExposure(call.args) } : {}),
1428
- }),
1429
- );
1658
+ // The facts are kept, not just the presentation built from them. The ask
1659
+ // used to throw away everything but two label strings, leaving a client to
1660
+ // re-derive the tier and the consequence from a tool name it cannot
1661
+ // classify.
1662
+ const facts = decisionFactsForPermission({
1663
+ tool: call.tool,
1664
+ actionClass: decision.classification.actionClass,
1665
+ axis: meta.axis.startsWith("net:")
1666
+ ? { kind: "safety-net", ruleId: meta.axis.slice("net:".length) || "unknown" }
1667
+ : { kind: "autonomy", level: meta.axis.slice("autonomy:".length) || DEFAULT_AUTONOMY_LEVEL },
1668
+ origin: { kind: "main" },
1669
+ ...(call.tool === ToolNames.AskUser ? { exposure: askUserExposure(call.args) } : {}),
1670
+ });
1671
+ const presentation = classifyDecisionPresentation(facts);
1430
1672
  const approveAction = presentation.requiredActions.find((action) => action.id === "approve-once");
1431
1673
  const denyAction = presentation.requiredActions.find((action) => action.id === "deny");
1674
+ const stopAction = presentation.requiredActions.find((action) => action.id === "stop");
1432
1675
  queuedRequestIds.add(meta.requestId);
1433
1676
  queuedRequestDetails.set(meta.requestId, {
1434
1677
  tool: call.tool,
@@ -1555,7 +1798,19 @@ function installPermissionBridge(input: {
1555
1798
  name: denyAction?.label ?? "Deny this request",
1556
1799
  kind: "reject_once",
1557
1800
  },
1801
+ // The TUI's third action, which the wire had no
1802
+ // equivalent for. It is `reject_once` and not
1803
+ // `reject_always`: it grants no standing denial, it
1804
+ // ends this run. A client that renders only the spec
1805
+ // kinds shows it as a second deny, which is a true
1806
+ // reading of what it does.
1807
+ {
1808
+ optionId: "reject-and-stop",
1809
+ name: stopAction?.label ?? "Deny and stop",
1810
+ kind: "reject_once",
1811
+ },
1558
1812
  ],
1813
+ _meta: decisionMeta(facts, presentation, call),
1559
1814
  },
1560
1815
  input.permissionTimeoutMs,
1561
1816
  ),
@@ -1586,6 +1841,21 @@ function installPermissionBridge(input: {
1586
1841
  input.toolRegistry?.cancelParkedCalls(reason);
1587
1842
  return;
1588
1843
  }
1844
+ // Deny-and-stop is the TUI's `s` action on the wire: it denies
1845
+ // every parked request from this turn and ends the run, not just
1846
+ // the one the operator is looking at. It orders like the client
1847
+ // cancellation above rather than like a plain denial, because a
1848
+ // parked call released before the prompt aborts can start another
1849
+ // model request while the abort is in flight.
1850
+ if (answer.outcome === "selected" && answer.optionId === "reject-and-stop") {
1851
+ const reason = "ACP client denied this tool call and stopped the run";
1852
+ input.cancelActivePrompt(reason);
1853
+ emitResolution({ status: "denied", decidedBy: "acp-client", reason });
1854
+ queuedRequestIds.clear();
1855
+ queuedRequestDetails.clear();
1856
+ input.toolRegistry?.cancelParkedCalls(reason);
1857
+ return;
1858
+ }
1589
1859
  if (answer.outcome === "selected" && answer.optionId === "allow-once") {
1590
1860
  emitResolution({ status: "granted", decidedBy: "acp-client" });
1591
1861
  await input.toolRegistry?.resumeParkedCalls({
@@ -1649,11 +1919,69 @@ function installPermissionBridge(input: {
1649
1919
  /** How long transport close waits for an in-flight prompt handler to settle. */
1650
1920
  const ACP_PROMPT_SETTLE_BOUND_MS = 5000;
1651
1921
 
1922
+ /**
1923
+ * Where a steer lands. `interrupt` is deliberately not admitted here: the
1924
+ * engine's interrupt mode cancels the run and resubmits the text as a fresh
1925
+ * prompt, and ACP binds a turn to the `session/prompt` request/response pair,
1926
+ * so that second turn would have no request to carry its stop reason. A client
1927
+ * that wants it cancels through `clio-coder/session/interrupt` and prompts again.
1928
+ */
1929
+ const ACP_STEERING_MODES = ["next-slot", "end-of-turn"] as const;
1930
+ type AcpSteeringMode = (typeof ACP_STEERING_MODES)[number];
1931
+
1932
+ /** Model-facing steer prose. Wider than a label, far under the transport's line bound. */
1933
+ const ACP_MAX_STEER_TEXT_BYTES = 16 * 1024;
1934
+ /** Host-authored context a client may attach to an interrupt, echoed into the cancel reason. */
1935
+ const ACP_MAX_INTERRUPT_REASON_BYTES = 256;
1936
+ /** Queue entries read back in one response; a deeper queue is reported truncated. */
1937
+ const ACP_MAX_QUEUED_MESSAGES = 64;
1938
+
1939
+ /**
1940
+ * Steer text is model-facing prose, not an identifier, so newlines and tabs are
1941
+ * content and are admitted where {@link requireBoundedClientString} would refuse
1942
+ * the whole message. The remaining C0 controls are still refused rather than
1943
+ * stripped: a steer the model saw shortened or rewritten would disagree with the
1944
+ * text the client sent and with the copy its own UI is showing.
1945
+ */
1946
+ function requireSteerText(value: unknown, name: string, maxBytes: number): string {
1947
+ if (typeof value !== "string" || value.trim().length === 0) {
1948
+ throw new AcpRequestError(-32602, `${name} is required`, { code: "invalid_params" });
1949
+ }
1950
+ if (utf8Bytes(value) > maxBytes || hasControlCharacters(value.replace(/[\n\r\t]/g, " "))) {
1951
+ throw new AcpRequestError(-32602, `${name} is invalid`, { code: "invalid_params" });
1952
+ }
1953
+ return value;
1954
+ }
1955
+
1956
+ /** Bounded read-back of one engine queue, in enqueue order. */
1957
+ function boundedQueueTexts(texts: ReadonlyArray<string>): string[] {
1958
+ return texts.slice(0, ACP_MAX_QUEUED_MESSAGES).map((text) => boundString(text, ACP_MAX_STEER_TEXT_BYTES));
1959
+ }
1960
+
1961
+ /**
1962
+ * Refusal codes for `clio-coder/dispatch/steer`. `DispatchContract.steer` reports
1963
+ * every refusal as an operator-facing Error, so the wire gets the classification
1964
+ * and the prose goes to the stderr tail: the message legitimately quotes a
1965
+ * runtime id and a worker path, and neither belongs in a client's UI.
1966
+ */
1967
+ function dispatchSteerReason(message: string): string {
1968
+ if (message.includes("empty message")) return "empty-message";
1969
+ if (message.includes("does not support live steering")) return "steering-unsupported";
1970
+ if (message.includes("has no input channel")) return "no-input-channel";
1971
+ if (message.includes("no longer accepts input")) return "input-closed";
1972
+ if (message.includes("cannot be steered")) return "run-terminating";
1973
+ if (message.includes("is not active")) return "run-not-active";
1974
+ return "steer-failed";
1975
+ }
1976
+
1652
1977
  export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<number> {
1653
1978
  const sessions = new Map<string, AcpServerSession>();
1654
1979
  const workspaceInstanceId = randomUUID();
1655
1980
  let initialized = false;
1656
1981
  const enabledEventKinds = new Set<AcpForwardableEventKind>();
1982
+ /** Negotiated at initialize and read when each prompt builds its turn state. */
1983
+ let toolProgressEnabled = false;
1984
+ const now = options.now ?? Date.now;
1657
1985
  let eventSequence = 0;
1658
1986
  /**
1659
1987
  * Per-run progress counters for the forwarded dispatch stream, insertion
@@ -1925,6 +2253,63 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1925
2253
  });
1926
2254
  }),
1927
2255
  );
2256
+ unsubscribeEvents.push(
2257
+ bus.on(BusChannels.CompactionEnd, (payload: CompactionPayload) => {
2258
+ // Only the end fires: a client that drew a "compacting" state from
2259
+ // the begin channel would have to guess when to clear it, and the
2260
+ // fact a context meter needs is that the window was just cut.
2261
+ const trigger = safeStoredIdentifier(payload.trigger, 64);
2262
+ if (trigger === null) return;
2263
+ forwardEvent("compaction.end", null, false, { trigger });
2264
+ }),
2265
+ );
2266
+ unsubscribeEvents.push(
2267
+ bus.on(BusChannels.ContextWarning, (payload: ContextWarningPayload) => {
2268
+ // Transition-only upstream, so this is a level edge, not a poll:
2269
+ // `warning: null` is the clear and has to cross as itself rather than
2270
+ // be dropped, or a client's banner never comes down.
2271
+ if (payload.warning !== null && typeof payload.warning !== "string") return;
2272
+ const warning = payload.warning === null ? null : safeStoredString(payload.warning, ACP_MAX_EVENT_TEXT_BYTES);
2273
+ forwardEvent("context.warning", null, false, { warning: warning === "" ? null : warning });
2274
+ }),
2275
+ );
2276
+ unsubscribeEvents.push(
2277
+ bus.on(BusChannels.ToolBudgetExceeded, (payload: ToolBudgetExceededPayload) => {
2278
+ // Bound to the turn that is running, like `safety.loopBlocked`: the
2279
+ // budget it names is per-turn and means nothing outside one.
2280
+ if (activePromptState === null) return;
2281
+ const callsThisTurn = safeCount(payload.callsThisTurn);
2282
+ const softBudget = safeCount(payload.softBudget);
2283
+ const hardCeiling = safeCount(payload.hardCeiling);
2284
+ const tool = safeStoredString(payload.tool, 64).trim();
2285
+ if (callsThisTurn === null || softBudget === null || hardCeiling === null || tool.length === 0) return;
2286
+ forwardEvent(
2287
+ "safety.toolBudgetExceeded",
2288
+ safeStoredIdentifier(payload.turnId, ACP_MAX_SESSION_ID_BYTES),
2289
+ payload.interrupted === true,
2290
+ { tool, callsThisTurn, softBudget, hardCeiling, interrupted: payload.interrupted === true },
2291
+ );
2292
+ }),
2293
+ );
2294
+ unsubscribeEvents.push(
2295
+ bus.on(BusChannels.ProviderHealth, (payload: ProviderHealthPayload) => {
2296
+ // `status.lastError` is provider prose that legitimately quotes URLs,
2297
+ // response bodies, and credentials-adjacent detail, so it stays behind
2298
+ // exactly as `dispatch.failed`'s `outcomeDetail` does. What crosses is
2299
+ // the taxonomy a retry-visibility row needs.
2300
+ const targetId = safeStoredIdentifier(payload.id, ACP_MAX_TARGET_ID_BYTES);
2301
+ const status = payload.status?.health?.status;
2302
+ if (targetId === null || !(["healthy", "degraded", "unknown", "down"] as ReadonlyArray<unknown>).includes(status)) {
2303
+ return;
2304
+ }
2305
+ forwardEvent("provider.health", null, false, {
2306
+ targetId,
2307
+ status,
2308
+ available: payload.status.available === true,
2309
+ latencyMs: safeCount(payload.status.health.latencyMs),
2310
+ });
2311
+ }),
2312
+ );
1928
2313
  }
1929
2314
  const unsubscribeEventStream = (): void => {
1930
2315
  for (const unsubscribe of unsubscribeEvents) unsubscribe();
@@ -2077,6 +2462,15 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2077
2462
  if (requestedEventKinds.includes(kind)) enabledEventKinds.add(kind);
2078
2463
  }
2079
2464
  }
2465
+ // Repeated in-progress frames for one call are only useful to a client
2466
+ // that collapses them onto the row it already drew. One that appends
2467
+ // every frame it receives would grow a tool segment by a full output
2468
+ // snapshot several times a second, so nothing streams until it asks.
2469
+ const toolProgressRequest =
2470
+ clientMeta !== null && isRecord(clientMeta[ACP_TOOL_PROGRESS_META_KEY])
2471
+ ? clientMeta[ACP_TOOL_PROGRESS_META_KEY]
2472
+ : null;
2473
+ toolProgressEnabled = toolProgressRequest !== null && toolProgressRequest.version === 1;
2080
2474
  const canLoadSession =
2081
2475
  options.session !== undefined &&
2082
2476
  options.readSessionEntries !== undefined &&
@@ -2114,10 +2508,49 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2114
2508
  list: options.providers !== undefined,
2115
2509
  probe: options.providers !== undefined,
2116
2510
  },
2511
+ ...(options.commands !== undefined ? { [ACP_COMMANDS_META_KEY]: options.commands.capability } : {}),
2512
+ // Steering is announced, never negotiated: every method here is
2513
+ // namespaced and additive, so a client that ignores this block
2514
+ // keeps the exact v1 surface it had. `main` and `dispatch` report
2515
+ // which queues this build actually wired, because an embedder may
2516
+ // pass a chat that cannot steer and a server with no fleet.
2517
+ "clio-coder/steering": {
2518
+ version: 1,
2519
+ main: options.chat.steer !== undefined,
2520
+ dispatch: options.dispatch !== undefined,
2521
+ modes: ACP_STEERING_MODES,
2522
+ interrupt: true,
2523
+ methods: {
2524
+ steer: "clio-coder/session/steer",
2525
+ queue: "clio-coder/session/queue",
2526
+ clear: "clio-coder/session/queue_clear",
2527
+ interrupt: "clio-coder/session/interrupt",
2528
+ dispatch: "clio-coder/dispatch/steer",
2529
+ },
2530
+ },
2117
2531
  // Per-frame agent attribution on `session/update`. Announced so a
2118
2532
  // client can tell "this agent produced nothing" apart from "this
2119
2533
  // peer does not report identity at all".
2120
2534
  [ACP_AGENT_META_KEY]: { version: 1, meta: ACP_AGENT_META_KEY },
2535
+ // The bounds are announced, not just applied: a client sizing a
2536
+ // progress buffer needs to know where the stream stops, and a
2537
+ // client that never receives a second frame has to be able to
2538
+ // tell "the tool printed once" from "the floor suppressed it".
2539
+ [ACP_TOOL_PROGRESS_META_KEY]: {
2540
+ version: 1,
2541
+ minIntervalMs: ACP_MIN_TOOL_PROGRESS_INTERVAL_MS,
2542
+ maxFramesPerCall: ACP_MAX_TOOL_PROGRESS_FRAMES_PER_CALL,
2543
+ maxContentBytes: ACP_MAX_CHUNK_BYTES,
2544
+ },
2545
+ ...(options.toolRegistry !== undefined
2546
+ ? {
2547
+ [ACP_DECISION_META_KEY]: {
2548
+ version: 1,
2549
+ meta: ACP_DECISION_META_KEY,
2550
+ options: ACP_PERMISSION_OPTION_IDS,
2551
+ },
2552
+ }
2553
+ : {}),
2121
2554
  ...(options.bus
2122
2555
  ? {
2123
2556
  "clio-coder/events": {
@@ -2432,6 +2865,44 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2432
2865
  }
2433
2866
  });
2434
2867
 
2868
+ // The catalog is rebuilt from `commandReference()` on every call and a
2869
+ // palette legitimately re-reads it after a reload, so it is memoized against
2870
+ // a client that polls. Availability is fixed by the host callbacks wired
2871
+ // when this server is created; session/route changes do not alter that wiring.
2872
+ let commandCatalog: AcpCommandCatalog | null = null;
2873
+
2874
+ options.transport.onRequest(ACP_COMMANDS_LIST_METHOD, (params) => {
2875
+ requireInitialized();
2876
+ assertParamKeys(params, new Set());
2877
+ if (options.commands === undefined) {
2878
+ throw new AcpRequestError(-32000, "operator commands are unavailable", { code: "internal_error" });
2879
+ }
2880
+ commandCatalog ??= options.commands.catalog();
2881
+ return commandCatalog;
2882
+ });
2883
+
2884
+ options.transport.onRequest(ACP_COMMANDS_INVOKE_METHOD, (params) => {
2885
+ requireInitialized();
2886
+ const request = assertParamKeys(params, new Set(["sessionId", "command", "argv"]));
2887
+ const session = getSession(request);
2888
+ if (options.commands === undefined) {
2889
+ throw new AcpRequestError(-32000, "operator commands are unavailable", { code: "internal_error" });
2890
+ }
2891
+ // Four of the thirteen put a user turn into the session. Doing that while
2892
+ // a prompt is in flight is the steering path, not the submit path: the
2893
+ // turn already running owns the stopReason, and a second unrequested
2894
+ // submission folds content into it that the client never asked for. Those
2895
+ // four are refused here and the client is told to use
2896
+ // `clio-coder/session/steer` instead; the other nine are unaffected.
2897
+ if (session.activePrompt !== null && options.commands.injectsUserTurn(request.command)) {
2898
+ throw new AcpRequestError(-32000, "this command submits a user turn and a prompt is active", {
2899
+ code: "prompt_active",
2900
+ reason: "steer-instead",
2901
+ });
2902
+ }
2903
+ return options.commands.invoke({ command: request.command, argv: request.argv });
2904
+ });
2905
+
2435
2906
  options.transport.onRequest("clio-coder/targets/list", (params) => {
2436
2907
  requireInitialized();
2437
2908
  assertParamKeys(params, new Set());
@@ -2528,6 +2999,154 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2528
2999
  if (session) cancelSession(session, "prompt cancelled");
2529
3000
  });
2530
3001
 
3002
+ /**
3003
+ * Windows in which a steer must not be queued, or null when it may be.
3004
+ *
3005
+ * The engine resubmits a steer it never drained as a fresh prompt
3006
+ * (`resubmitStrandedSteers`). In a terminal that is the right answer; here it
3007
+ * is a prompt-shaped turn the client never requested, whose stop reason has
3008
+ * no request to ride home on. The two windows where stranding is certain are
3009
+ * knowable from the session, so the server refuses in them and says why,
3010
+ * rather than accepting a steer that would come back as an unrequested turn.
3011
+ */
3012
+ const steerRefusal = (session: AcpServerSession): string | null => {
3013
+ if (session.activePrompt === null) {
3014
+ return "no prompt is active on this session; send session/prompt instead of steering";
3015
+ }
3016
+ if (session.activePrompt.cancelled) {
3017
+ return "this prompt is cancelled and its queues are being cleared; prompt again once it returns";
3018
+ }
3019
+ if (!options.chat.isStreaming()) {
3020
+ return "the run is not streaming, so the engine has no slot to drain this steer into";
3021
+ }
3022
+ return null;
3023
+ };
3024
+
3025
+ options.transport.onRequest("clio-coder/session/steer", (params) => {
3026
+ requireInitialized();
3027
+ const request = assertParamKeys(params, new Set(["sessionId", "text", "mode"]));
3028
+ const session = getSession(request);
3029
+ const text = requireSteerText(request.text, "text", ACP_MAX_STEER_TEXT_BYTES);
3030
+ if (
3031
+ request.mode !== undefined &&
3032
+ (typeof request.mode !== "string" || !(ACP_STEERING_MODES as ReadonlyArray<string>).includes(request.mode))
3033
+ ) {
3034
+ throw new AcpRequestError(-32602, "invalid steering mode", { code: "invalid_params" });
3035
+ }
3036
+ const mode = (request.mode ?? "next-slot") as AcpSteeringMode;
3037
+ const queue = mode === "next-slot" ? "steer" : "follow-up";
3038
+ const enqueue = mode === "next-slot" ? options.chat.steer : options.chat.queueFollowUp;
3039
+ if (enqueue === undefined) {
3040
+ return { accepted: false, queue, refusal: "this agent build does not expose the engine steering queues" };
3041
+ }
3042
+ const refusal = steerRefusal(session);
3043
+ if (refusal !== null) return { accepted: false, queue, refusal };
3044
+ // The engine's own admission is the last word: it refuses a steer whose
3045
+ // run stopped streaming between the check above and this call.
3046
+ if (!enqueue.call(options.chat, text)) {
3047
+ return { accepted: false, queue, refusal: "the engine refused the message; the run is no longer accepting input" };
3048
+ }
3049
+ return { accepted: true, queue };
3050
+ });
3051
+
3052
+ options.transport.onRequest("clio-coder/session/queue", (params) => {
3053
+ requireInitialized();
3054
+ const request = assertParamKeys(params, new Set(["sessionId"]));
3055
+ getSession(request);
3056
+ // An empty pair of lists is a fact about the queues, so a build that
3057
+ // cannot read them refuses instead of reporting one it did not observe.
3058
+ if (options.chat.queuedMessages === undefined) {
3059
+ throw new AcpRequestError(-32000, "queue inspection is unavailable", { code: "internal_error" });
3060
+ }
3061
+ const queued = options.chat.queuedMessages();
3062
+ return { steer: boundedQueueTexts(queued.steer), followUp: boundedQueueTexts(queued.followUp) };
3063
+ });
3064
+
3065
+ options.transport.onRequest("clio-coder/session/queue_clear", (params) => {
3066
+ requireInitialized();
3067
+ const request = assertParamKeys(params, new Set(["sessionId"]));
3068
+ getSession(request);
3069
+ if (options.chat.clearQueuedFollowUps === undefined) {
3070
+ throw new AcpRequestError(-32000, "queue clearing is unavailable", { code: "internal_error" });
3071
+ }
3072
+ // Both queues drain together, exactly as Alt+Q does in the terminal: the
3073
+ // returned texts are what the client now owns and must re-send to deliver.
3074
+ return { restored: boundedQueueTexts(options.chat.clearQueuedFollowUps()) };
3075
+ });
3076
+
3077
+ options.transport.onRequest("clio-coder/session/interrupt", (params) => {
3078
+ requireInitialized();
3079
+ const request = assertParamKeys(params, new Set(["sessionId", "reason"]));
3080
+ const session = getSession(request);
3081
+ const reason =
3082
+ request.reason === undefined
3083
+ ? null
3084
+ : requireBoundedClientString(request.reason, "reason", ACP_MAX_INTERRUPT_REASON_BYTES);
3085
+ if (session.activePrompt === null) {
3086
+ return { cancelled: false, refusal: "no prompt is active on this session" };
3087
+ }
3088
+ // An attached dispatch or a parked permission ask refuses the interrupt in
3089
+ // the terminal too. Honour that here instead of cancelling anyway: the
3090
+ // client gets the reason to show, and `session/cancel` remains the
3091
+ // unconditional stop for a client that means to pay the cost.
3092
+ const refusal = options.chat.interruptRefusal?.() ?? null;
3093
+ if (refusal !== null) return { cancelled: false, refusal };
3094
+ // Cancel only. The outstanding `session/prompt` returns
3095
+ // `stopReason: "cancelled"`, and the next prompt is the client's to send;
3096
+ // a server-side resubmit would start a turn with no request to answer.
3097
+ cancelSession(session, reason === null ? "prompt interrupted by client" : `client interrupt: ${reason}`);
3098
+ return { cancelled: true };
3099
+ });
3100
+
3101
+ options.transport.onRequest("clio-coder/dispatch/steer", (params) => {
3102
+ requireInitialized();
3103
+ const request = assertParamKeys(params, new Set(["sessionId", "runId", "action", "message"]));
3104
+ getSession(request);
3105
+ const runId = requireBoundedClientString(request.runId, "runId", ACP_MAX_DISPATCH_ID_BYTES);
3106
+ if (request.action !== "guide" && request.action !== "cancel") {
3107
+ throw new AcpRequestError(-32602, "action must be guide or cancel", { code: "invalid_params" });
3108
+ }
3109
+ if (request.action === "cancel" && request.message !== undefined) {
3110
+ // An abort carries no operator text anywhere in dispatch, so accepting
3111
+ // one here would promise the worker a message it never receives.
3112
+ throw new AcpRequestError(-32602, "cancel carries no message", { code: "invalid_params" });
3113
+ }
3114
+ const dispatch = options.dispatch;
3115
+ if (dispatch === undefined) return { accepted: false, reason: "dispatch-unavailable" };
3116
+ if (request.action === "cancel") {
3117
+ // `abort` reports nothing, so the fact has to be established before it
3118
+ // is claimed: an abort against an id this fleet never ran would poison
3119
+ // that control root for a future attempt and still answer "accepted".
3120
+ let live = false;
3121
+ try {
3122
+ const snapshot = dispatch.snapshot();
3123
+ live = snapshot.running.some((run) => run.runId === runId) || snapshot.retrying.some((run) => run.runId === runId);
3124
+ } catch {
3125
+ return { accepted: false, reason: "fleet-unavailable" };
3126
+ }
3127
+ if (!live) return { accepted: false, reason: "run-not-active" };
3128
+ try {
3129
+ dispatch.abort(runId);
3130
+ } catch {
3131
+ return { accepted: false, reason: "cancel-failed" };
3132
+ }
3133
+ return { accepted: true };
3134
+ }
3135
+ const message = requireSteerText(request.message, "message", ACP_MAX_STEER_TEXT_BYTES);
3136
+ try {
3137
+ dispatch.steer(runId, message);
3138
+ } catch (err) {
3139
+ const detail = err instanceof Error ? err.message : String(err);
3140
+ options.diagnostics?.(`dispatch steer refused: ${acpErrorMessage(detail)}`);
3141
+ return { accepted: false, reason: dispatchSteerReason(detail) };
3142
+ }
3143
+ // Queued, not delivered. The frame is on the worker's stdin; the worker
3144
+ // acknowledges acceptance later with `clio_coder_steer_received`, and that
3145
+ // ack's `sequence` never returns through this contract, so no sequence is
3146
+ // reported rather than a guessed one.
3147
+ return { accepted: true };
3148
+ });
3149
+
2531
3150
  options.transport.onRequest("session/close", async (params) => {
2532
3151
  requireInitialized();
2533
3152
  const id = sessionIdOf(params);
@@ -2571,7 +3190,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2571
3190
  });
2572
3191
  }
2573
3192
  if (options.session?.current()?.id !== session.id && options.session) options.session.resume(session.id);
2574
- const active = createActivePromptState();
3193
+ const active = createActivePromptState({ enabled: toolProgressEnabled, now });
2575
3194
  session.activePrompt = active;
2576
3195
  activePromptState = active;
2577
3196
  activeSessionId = session.id;