@iowarp/clio-coder 0.3.9 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (733) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/NOTICE +33 -0
  3. package/README.md +121 -16
  4. package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
  5. package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
  8. package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
  9. package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
  10. package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
  11. package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
  12. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  13. package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
  14. package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
  15. package/dist/chunk-42FMPA75.js +101 -0
  16. package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
  17. package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
  18. package/dist/chunk-5YHDIDBP.js +97 -0
  19. package/dist/chunk-6CCS4G3W.js +1529 -0
  20. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  21. package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
  22. package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
  23. package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
  24. package/dist/chunk-6NJQITNH.js +1412 -0
  25. package/dist/chunk-6VC4OV3Z.js +365 -0
  26. package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
  27. package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
  28. package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
  29. package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
  30. package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
  31. package/dist/chunk-7RY5VZPH.js +573 -0
  32. package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
  33. package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
  34. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  35. package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
  36. package/dist/chunk-AP73CFDC.js +308 -0
  37. package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
  38. package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
  39. package/dist/chunk-BJGUKIG4.js +302 -0
  40. package/dist/chunk-BMS5RKQY.js +27 -0
  41. package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
  42. package/dist/chunk-BTK3SSSK.js +67 -0
  43. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  44. package/dist/chunk-BWW4HLO4.js +301 -0
  45. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  46. package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
  47. package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
  48. package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
  49. package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
  50. package/dist/chunk-D4CJV46V.js +462 -0
  51. package/dist/chunk-D7E7WCDF.js +27 -0
  52. package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
  53. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  54. package/dist/chunk-EIMVLWB3.js +1842 -0
  55. package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
  56. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  57. package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
  58. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  59. package/dist/chunk-GIZNH63R.js +40 -0
  60. package/dist/chunk-GPPB3JBE.js +688 -0
  61. package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
  62. package/dist/chunk-HHV2GANA.js +88 -0
  63. package/dist/chunk-HJWWJ6IL.js +184 -0
  64. package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
  65. package/dist/chunk-HRQMFLJP.js +75 -0
  66. package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
  67. package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
  68. package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
  69. package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
  70. package/dist/chunk-J4HBWF6Y.js +2635 -0
  71. package/dist/chunk-J5LZHVIT.js +284 -0
  72. package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
  73. package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
  74. package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
  75. package/dist/chunk-K6BF4U2H.js +1785 -0
  76. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  77. package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
  78. package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
  79. package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
  80. package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
  81. package/dist/chunk-NDDGJUXD.js +81 -0
  82. package/dist/chunk-NEKRRTYW.js +56 -0
  83. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  84. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  85. package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
  86. package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
  87. package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
  88. package/dist/chunk-PMZCIOCJ.js +25 -0
  89. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  90. package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
  91. package/dist/chunk-QDC3K2U3.js +262 -0
  92. package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
  93. package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
  94. package/dist/chunk-QSNYB6ZV.js +195 -0
  95. package/dist/chunk-QTFGO774.js +644 -0
  96. package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
  97. package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
  98. package/dist/chunk-R346GLFC.js +31 -0
  99. package/dist/chunk-RKSR6VSF.js +132 -0
  100. package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
  101. package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
  102. package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
  103. package/dist/chunk-T56WDKA5.js +183 -0
  104. package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
  105. package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
  106. package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
  107. package/dist/chunk-TVHHYFHE.js +255 -0
  108. package/dist/chunk-U2WB7TZS.js +271 -0
  109. package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
  110. package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
  111. package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
  112. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  113. package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
  114. package/dist/chunk-VKFQTNDV.js +66 -0
  115. package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
  116. package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
  117. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  118. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  119. package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
  120. package/dist/chunk-WR6U3OVP.js +45 -0
  121. package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
  122. package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
  123. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  124. package/dist/chunk-YAKGTXEV.js +17 -0
  125. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  126. package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
  127. package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
  128. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  129. package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
  130. package/dist/cli/index.js +48 -37
  131. package/dist/clio-IT3G3VQH.js +25 -0
  132. package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
  133. package/dist/codewiki/build-worker.js +1 -1
  134. package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
  135. package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
  136. package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
  137. package/dist/configure-FL7Y3KJF.js +54 -0
  138. package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
  139. package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
  140. package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
  141. package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
  142. package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
  143. package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
  144. package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
  145. package/dist/doctor-ZGPEGHIP.js +772 -0
  146. package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
  147. package/dist/eval-inventory-HBWSWQOK.js +315 -0
  148. package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
  149. package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
  150. package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
  151. package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
  152. package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
  153. package/dist/fleet-decisions-OTHB6KRL.js +157 -0
  154. package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
  155. package/dist/fleet-inspect-SS6YMDCK.js +445 -0
  156. package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
  157. package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
  158. package/dist/fleet-verify-QD5M7E7Q.js +178 -0
  159. package/dist/fleet-view-WAMJYNDT.js +94 -0
  160. package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
  161. package/dist/install-NKNG7KD4.js +13 -0
  162. package/dist/interop-34TVO25M.js +116 -0
  163. package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
  164. package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
  165. package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
  166. package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
  167. package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
  168. package/dist/panes-7STHOAUJ.js +103 -0
  169. package/dist/panes-SHAUIRXY.js +60 -0
  170. package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
  171. package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
  172. package/dist/resources-74GKTLSF.js +115 -0
  173. package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
  174. package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
  175. package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
  176. package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
  177. package/dist/skills-inventory-J357J34F.js +129 -0
  178. package/dist/slash-commands-JZZCQA32.js +79 -0
  179. package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
  180. package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
  181. package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
  182. package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
  183. package/dist/tools-MKNWVPBH.js +29 -0
  184. package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
  185. package/dist/tui-primitives-K5PASC3O.js +17 -0
  186. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
  187. package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
  188. package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
  189. package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
  190. package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
  191. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
  192. package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
  193. package/dist/with-panes-OBOBFIIR.js +818 -0
  194. package/dist/worker/entry.js +131 -91
  195. package/docs/README.md +3 -2
  196. package/docs/acp.md +25 -4
  197. package/docs/alcf-provider.md +1 -1
  198. package/docs/architecture.md +2 -2
  199. package/docs/artifact-versions.md +4 -1
  200. package/docs/built-in-agents.md +40 -32
  201. package/docs/capacity-and-scheduling.md +43 -5
  202. package/docs/commands-and-modes.md +39 -4
  203. package/docs/config-knobs-audit.md +3 -0
  204. package/docs/configuration-and-targets.md +138 -167
  205. package/docs/context-engine.md +1 -1
  206. package/docs/development-pipeline.md +19 -0
  207. package/docs/dispatch-typed-intent.md +385 -0
  208. package/docs/documentation-coverage.md +2 -2
  209. package/docs/documentation-guide.md +1 -1
  210. package/docs/environment-variables.md +3 -1
  211. package/docs/eval-runner.md +1 -1
  212. package/docs/evals-internal.md +1 -1
  213. package/docs/evidence-and-memory.md +2 -2
  214. package/docs/evolution.md +1 -1
  215. package/docs/exit-codes-and-output.md +3 -1
  216. package/docs/extensions-and-sharing.md +25 -1
  217. package/docs/fleet-demo-runbook.md +6 -3
  218. package/docs/fleet-dispatch.md +30 -7
  219. package/docs/installation-and-lifecycle.md +16 -3
  220. package/docs/middleware-and-components.md +1 -1
  221. package/docs/model-catalog.md +10 -1
  222. package/docs/observability.md +3 -3
  223. package/docs/proactive-memory.md +1 -1
  224. package/docs/prompt-envelope-and-tools.md +1 -1
  225. package/docs/provider-adapter-cookbook.md +1 -1
  226. package/docs/release-cut-checklist.md +164 -177
  227. package/docs/safety-model.md +2 -2
  228. package/docs/scientific-validation.md +3 -3
  229. package/docs/session-lifecycle.md +1 -1
  230. package/docs/skills-marketplace.md +1 -1
  231. package/docs/tool-usage.md +18 -8
  232. package/docs/trace-store.md +16 -11
  233. package/docs/troubleshooting.md +2 -2
  234. package/docs/tui-design.md +1 -1
  235. package/docs/worker-dispatch-mechanics.md +1 -1
  236. package/evals/README.md +5 -0
  237. package/evals/behavioral-corpus-grader.mjs +103 -0
  238. package/evals/behavioral-machinery-baseline.json +2276 -0
  239. package/evals/behavioral-machinery-driver.ts +250 -0
  240. package/evals/behavioral-machinery-support.ts +253 -0
  241. package/evals/behavioral-machinery.yaml +614 -0
  242. package/evals/behavioral-model-negative-control.yaml +68 -0
  243. package/evals/behavioral-model.yaml +216 -0
  244. package/evals/fixtures/behavioral-facts.txt +3 -0
  245. package/evals/fixtures/behavioral-main.ts +7 -0
  246. package/evals/fixtures/decoy/note.txt +2 -0
  247. package/evals/fixtures/private/credentials.txt +1 -0
  248. package/evals/tracked-metrics-baseline.yaml +229 -0
  249. package/evals/tracked-metrics-grader.mjs +129 -0
  250. package/package.json +8 -16
  251. package/skills/README.md +6 -6
  252. package/skills/coding/ast-grep/SKILL.md +8 -2
  253. package/skills/coding/coding-standards/SKILL.md +8 -2
  254. package/skills/coding/prototype/SKILL.md +8 -2
  255. package/skills/coding/tdd/SKILL.md +8 -2
  256. package/skills/context/context-handoff/SKILL.md +12 -3
  257. package/skills/context/context-handoff/evals.md +3 -3
  258. package/skills/context/context-prime/SKILL.md +8 -2
  259. package/skills/context/context-prime/evals.md +2 -2
  260. package/skills/git/file-ticket/SKILL.md +9 -4
  261. package/skills/git/file-ticket/evals.md +2 -2
  262. package/skills/git/fix-issue/SKILL.md +12 -5
  263. package/skills/git/fix-issue/evals.md +4 -4
  264. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  265. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  266. package/skills/git/ship/SKILL.md +9 -3
  267. package/skills/git/ship/evals.md +4 -4
  268. package/skills/git/worktree-create/SKILL.md +7 -2
  269. package/skills/git/worktree-create/evals.md +6 -6
  270. package/skills/git/worktree-merge/SKILL.md +7 -2
  271. package/skills/git/worktree-merge/evals.md +6 -6
  272. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  273. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  274. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  275. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  276. package/skills/meta/credentials/SKILL.md +9 -2
  277. package/skills/meta/find-skills/SKILL.md +8 -2
  278. package/skills/meta/herdr/SKILL.md +8 -2
  279. package/skills/meta/skill-craft/SKILL.md +21 -4
  280. package/skills/planning/architecture/SKILL.md +9 -3
  281. package/skills/planning/backlog/SKILL.md +8 -2
  282. package/skills/planning/prd/SKILL.md +8 -2
  283. package/skills/planning/product-intent/SKILL.md +8 -2
  284. package/skills/planning/tech-spec/SKILL.md +9 -3
  285. package/skills/registry.yaml +66 -66
  286. package/skills/research/arxiv-literature/SKILL.md +8 -2
  287. package/skills/research/experiment-protocol/SKILL.md +9 -2
  288. package/skills/research/scientific-debugging/SKILL.md +9 -2
  289. package/skills/research/scientific-debugging/evals.md +2 -2
  290. package/skills/research/scientific-modernization/SKILL.md +9 -2
  291. package/skills/skill-marketplace.json +257 -38
  292. package/skills/workflow/cut-it/SKILL.md +10 -2
  293. package/skills/workflow/design-council/SKILL.md +11 -2
  294. package/skills/workflow/grill-me/SKILL.md +8 -2
  295. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  296. package/src/cli/acp.ts +8 -4
  297. package/src/cli/argv.ts +25 -0
  298. package/src/cli/auth.ts +2 -2
  299. package/src/cli/bootstrap-generate.ts +5 -5
  300. package/src/cli/clio.ts +6 -1
  301. package/src/cli/config-inspect.ts +3 -3
  302. package/src/cli/configure-interop.ts +1 -1
  303. package/src/cli/configure.ts +50 -48
  304. package/src/cli/default-target.ts +1 -1
  305. package/src/cli/docs.ts +6 -6
  306. package/src/cli/doctor-naming.ts +323 -0
  307. package/src/cli/doctor-panes.ts +156 -0
  308. package/src/cli/doctor-toolchain.ts +78 -0
  309. package/src/cli/doctor.ts +34 -1
  310. package/src/cli/eval-inventory.ts +436 -0
  311. package/src/cli/eval.ts +13 -0
  312. package/src/cli/evidence-detail.ts +88 -0
  313. package/src/cli/evidence-inventory.ts +183 -0
  314. package/src/cli/evidence.ts +30 -5
  315. package/src/cli/fleet-decisions.ts +69 -0
  316. package/src/cli/fleet-inspect.ts +334 -0
  317. package/src/cli/fleet-preflight.ts +1 -1
  318. package/src/cli/fleet-verify.ts +133 -0
  319. package/src/cli/fleet-view.ts +827 -0
  320. package/src/cli/fleet.ts +154 -40
  321. package/src/cli/index.ts +14 -2
  322. package/src/cli/interop-inspect.ts +128 -0
  323. package/src/cli/interop.ts +34 -0
  324. package/src/cli/models.ts +3 -3
  325. package/src/cli/modes/print.ts +1 -1
  326. package/src/cli/panes.ts +35 -0
  327. package/src/cli/reset.ts +6 -3
  328. package/src/cli/run.ts +67 -13
  329. package/src/cli/share.ts +1 -1
  330. package/src/cli/skills-eval.ts +11 -11
  331. package/src/cli/skills-inventory.ts +185 -0
  332. package/src/cli/skills.ts +16 -13
  333. package/src/cli/targets.ts +23 -24
  334. package/src/cli/tools.ts +321 -0
  335. package/src/cli/trace-inspect.ts +252 -0
  336. package/src/cli/trace.ts +64 -2
  337. package/src/cli/uninstall.ts +2 -2
  338. package/src/cli/upgrade.ts +29 -34
  339. package/src/cli/usage.ts +2 -2
  340. package/src/cli/validate-model.ts +1 -1
  341. package/src/cli/verifiers-inspect.ts +347 -0
  342. package/src/cli/verifiers.ts +9 -0
  343. package/src/cli/wiki-generate.ts +5 -5
  344. package/src/core/bash-exec.ts +1 -1
  345. package/src/core/boot-trace.ts +3 -3
  346. package/src/core/bus-events.ts +4 -0
  347. package/src/core/bus-trace.ts +2 -2
  348. package/src/core/compile-cache.ts +1 -1
  349. package/src/core/config.ts +1070 -845
  350. package/src/core/defaults.ts +342 -463
  351. package/src/core/domain-loader.ts +6 -4
  352. package/src/core/event-bus.ts +1 -1
  353. package/src/core/file-references.ts +78 -88
  354. package/src/core/git-commit-attribution.ts +3 -9
  355. package/src/core/guardrails.ts +24 -4
  356. package/src/core/naming-compat.ts +45 -0
  357. package/src/core/naming-events.ts +62 -0
  358. package/src/core/recent-models.ts +1 -7
  359. package/src/core/residency-protection.ts +4 -8
  360. package/src/core/resolve-config-value.ts +1 -1
  361. package/src/core/response-model-id.ts +0 -14
  362. package/src/core/response-schema.ts +44 -4
  363. package/src/core/session-routing.ts +84 -74
  364. package/src/core/skill-activation.ts +18 -0
  365. package/src/core/termination.ts +4 -4
  366. package/src/core/theme-token-hex.ts +43 -0
  367. package/src/core/timers.ts +2 -12
  368. package/src/core/tool-names.ts +2 -1
  369. package/src/core/xdg.ts +1 -1
  370. package/src/domains/agents/catalog.ts +2 -12
  371. package/src/domains/agents/extension.ts +3 -3
  372. package/src/domains/agents/fleets/build-review.md +0 -3
  373. package/src/domains/agents/fleets/build-test.md +0 -3
  374. package/src/domains/agents/registry.ts +7 -7
  375. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  376. package/src/domains/agents/result-contract.ts +165 -36
  377. package/src/domains/agents/spec.ts +0 -11
  378. package/src/domains/config/classify.ts +37 -46
  379. package/src/domains/config/extension.ts +5 -5
  380. package/src/domains/config/keybindings.ts +48 -47
  381. package/src/domains/config/watcher.ts +1 -1
  382. package/src/domains/context/codewiki/indexer.ts +1 -1
  383. package/src/domains/context/extension.ts +3 -3
  384. package/src/domains/context/prompt-context.ts +1 -1
  385. package/src/domains/context/wiki/assemble.ts +2 -2
  386. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  387. package/src/domains/context/working-set/replay/report.ts +1 -1
  388. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  389. package/src/domains/dispatch/active-route-planner.ts +2 -2
  390. package/src/domains/dispatch/admission-error.ts +9 -0
  391. package/src/domains/dispatch/admission.ts +22 -21
  392. package/src/domains/dispatch/agent-candidates.ts +1 -1
  393. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  394. package/src/domains/dispatch/agent-ledger.ts +1 -1
  395. package/src/domains/dispatch/assignment.ts +5 -5
  396. package/src/domains/dispatch/capacity-lease.ts +23 -6
  397. package/src/domains/dispatch/code-step.ts +1 -1
  398. package/src/domains/dispatch/contract.ts +2 -2
  399. package/src/domains/dispatch/council-topology.ts +398 -0
  400. package/src/domains/dispatch/extension.ts +287 -111
  401. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  402. package/src/domains/dispatch/fleet-plan.ts +7 -2
  403. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  404. package/src/domains/dispatch/fleet-run.ts +59 -3
  405. package/src/domains/dispatch/gate-decisions.ts +36 -15
  406. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  407. package/src/domains/dispatch/gate-topology.ts +289 -0
  408. package/src/domains/dispatch/index.ts +19 -0
  409. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  410. package/src/domains/dispatch/intent.ts +85 -1
  411. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  412. package/src/domains/dispatch/path-scope.ts +0 -61
  413. package/src/domains/dispatch/placement.ts +2 -2
  414. package/src/domains/dispatch/receipt-findings.ts +1 -1
  415. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  416. package/src/domains/dispatch/reservation-store.ts +24 -27
  417. package/src/domains/dispatch/route-decision.ts +1 -1
  418. package/src/domains/dispatch/route-history.ts +1 -1
  419. package/src/domains/dispatch/route-policy.ts +1 -1
  420. package/src/domains/dispatch/route-readiness.ts +0 -28
  421. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  422. package/src/domains/dispatch/run-event-journal.ts +599 -0
  423. package/src/domains/dispatch/state.ts +45 -1
  424. package/src/domains/dispatch/tool-stats.ts +1 -1
  425. package/src/domains/dispatch/transport.ts +2 -19
  426. package/src/domains/dispatch/types.ts +16 -3
  427. package/src/domains/dispatch/validation.ts +33 -8
  428. package/src/domains/dispatch/worker-protocol.ts +2 -2
  429. package/src/domains/eval/artifacts/store.ts +5 -4
  430. package/src/domains/eval/compare/compare.ts +3 -16
  431. package/src/domains/eval/compare/thresholds.ts +0 -8
  432. package/src/domains/eval/execution-provenance.ts +1 -1
  433. package/src/domains/eval/inventory.ts +113 -0
  434. package/src/domains/eval/metrics/token-stream.ts +0 -7
  435. package/src/domains/eval/report.ts +1 -1
  436. package/src/domains/eval/runner.ts +1 -1
  437. package/src/domains/eval/runners/clio-run.ts +7 -6
  438. package/src/domains/eval/runners/external-command.ts +4 -3
  439. package/src/domains/eval/schema/artifact.ts +1 -1
  440. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  441. package/src/domains/eval/schema/behavioral.ts +7 -6
  442. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  443. package/src/domains/eval/schema/naming.ts +10 -0
  444. package/src/domains/eval/schema/serving.ts +31 -0
  445. package/src/domains/eval/schema/suite.ts +2 -2
  446. package/src/domains/eval/schema/validate.ts +9 -5
  447. package/src/domains/eval/schema/verdict.ts +4 -2
  448. package/src/domains/eval/store.ts +12 -2
  449. package/src/domains/eval/suites/run.ts +12 -6
  450. package/src/domains/eval/types.ts +1 -1
  451. package/src/domains/eval/workspaces/git.ts +1 -1
  452. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  453. package/src/domains/evidence/build.ts +13 -5
  454. package/src/domains/evidence/store.ts +6 -0
  455. package/src/domains/interop/consent.ts +7 -7
  456. package/src/domains/interop/extension.ts +1 -1
  457. package/src/domains/lifecycle/doctor.ts +27 -21
  458. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  459. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  460. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  461. package/src/domains/lifecycle/migrations/index.ts +20 -1
  462. package/src/domains/lifecycle/naming-history.ts +153 -0
  463. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  464. package/src/domains/lifecycle/naming-resources.ts +261 -0
  465. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  466. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  467. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  468. package/src/domains/memory/index.ts +0 -1
  469. package/src/domains/memory/task-memory-handoff.ts +6 -3
  470. package/src/domains/memory/task-memory-policy.ts +6 -10
  471. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  472. package/src/domains/middleware/index.ts +7 -0
  473. package/src/domains/middleware/marketplace-offer.ts +339 -0
  474. package/src/domains/middleware/memory-intervention.ts +33 -21
  475. package/src/domains/middleware/runtime.ts +2 -2
  476. package/src/domains/mux/contract.ts +566 -0
  477. package/src/domains/mux/detect.ts +182 -0
  478. package/src/domains/mux/dock-controller.ts +365 -0
  479. package/src/domains/mux/extension.ts +53 -0
  480. package/src/domains/mux/index.ts +116 -0
  481. package/src/domains/mux/manifest.ts +6 -0
  482. package/src/domains/mux/operations.ts +192 -0
  483. package/src/domains/mux/pane-registry.ts +90 -0
  484. package/src/domains/mux/protocol.ts +62 -0
  485. package/src/domains/mux/socket-client.ts +964 -0
  486. package/src/domains/mux/types.ts +265 -0
  487. package/src/domains/mux/viewer-command.ts +59 -0
  488. package/src/domains/mux/yazi/assets/init.lua +2 -0
  489. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  490. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  491. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  492. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  493. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  494. package/src/domains/mux/yazi/event-stream.ts +182 -0
  495. package/src/domains/mux/yazi/profile.ts +299 -0
  496. package/src/domains/mux/yazi/session.ts +251 -0
  497. package/src/domains/mux/yazi/theme.ts +30 -0
  498. package/src/domains/observability/cost.ts +21 -0
  499. package/src/domains/observability/extension.ts +1 -1
  500. package/src/domains/observability/index.ts +2 -0
  501. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  502. package/src/domains/observability/projection.ts +1 -1
  503. package/src/domains/observability/trace-store.ts +63 -11
  504. package/src/domains/prompts/compiler.ts +2 -2
  505. package/src/domains/prompts/extension.ts +3 -3
  506. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  507. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  508. package/src/domains/providers/endpoint-capacity.ts +154 -22
  509. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  510. package/src/domains/providers/extension.ts +25 -8
  511. package/src/domains/providers/index.ts +22 -0
  512. package/src/domains/providers/knowledge-base-path.ts +1 -1
  513. package/src/domains/providers/model-runtime-capabilities.ts +46 -2
  514. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  515. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  516. package/src/domains/providers/plugins.ts +1 -1
  517. package/src/domains/providers/resolver.ts +1 -1
  518. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  519. package/src/domains/providers/runtimes/builtins.ts +2 -0
  520. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  521. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  522. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  523. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  524. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  525. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  526. package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
  527. package/src/domains/providers/support.ts +1 -0
  528. package/src/domains/providers/target-model-cache.ts +124 -0
  529. package/src/domains/providers/types/knowledge-base.ts +13 -0
  530. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  531. package/src/domains/providers/types/target-descriptor.ts +3 -3
  532. package/src/domains/resources/extension.ts +1 -1
  533. package/src/domains/resources/index.ts +3 -0
  534. package/src/domains/resources/library.ts +6 -6
  535. package/src/domains/resources/prompts/loader.ts +1 -1
  536. package/src/domains/resources/skills/content-hash.ts +7 -6
  537. package/src/domains/resources/skills/evals.ts +1 -1
  538. package/src/domains/resources/skills/install.ts +36 -12
  539. package/src/domains/resources/skills/loader.ts +72 -13
  540. package/src/domains/resources/skills/marketplace.ts +21 -2
  541. package/src/domains/resources/skills/promotion.ts +214 -0
  542. package/src/domains/safety/action-classifier.ts +6 -0
  543. package/src/domains/safety/audit.ts +2 -2
  544. package/src/domains/safety/finish-contract.ts +2 -1
  545. package/src/domains/safety/run-effects.ts +1 -1
  546. package/src/domains/scheduling/extension.ts +4 -4
  547. package/src/domains/session/archive-readers.ts +9 -1
  548. package/src/domains/session/compaction/branch-summary.ts +4 -0
  549. package/src/domains/session/compaction/compact.ts +1 -1
  550. package/src/domains/session/compaction/tokens.ts +4 -0
  551. package/src/domains/session/context-accounting.ts +1 -1
  552. package/src/domains/session/decision-board.ts +1 -1
  553. package/src/domains/session/extension.ts +1 -1
  554. package/src/domains/session/handoff.ts +2 -2
  555. package/src/domains/session/prompt-manifest.ts +0 -5
  556. package/src/domains/session/protected-artifact-journal.ts +12 -6
  557. package/src/domains/session/retry.ts +1 -1
  558. package/src/domains/share/archive.ts +85 -36
  559. package/src/domains/toolchain/archive.ts +175 -0
  560. package/src/domains/toolchain/contract.ts +28 -0
  561. package/src/domains/toolchain/extension.ts +47 -0
  562. package/src/domains/toolchain/index.ts +39 -0
  563. package/src/domains/toolchain/install.ts +327 -0
  564. package/src/domains/toolchain/manifest.ts +8 -0
  565. package/src/domains/toolchain/paths.ts +34 -0
  566. package/src/domains/toolchain/registry.ts +265 -0
  567. package/src/domains/toolchain/remove.ts +218 -0
  568. package/src/domains/toolchain/resolve.ts +182 -0
  569. package/src/domains/toolchain/types.ts +113 -0
  570. package/src/domains/toolchain/version.ts +88 -0
  571. package/src/engine/acp/adapter.ts +3 -3
  572. package/src/engine/acp/event-mapper.ts +3 -3
  573. package/src/engine/acp/server.ts +440 -96
  574. package/src/engine/acp/tool-mediator.ts +2 -2
  575. package/src/engine/acp/types.ts +20 -2
  576. package/src/engine/alcf-oauth.ts +5 -5
  577. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  578. package/src/engine/api-registry.ts +1 -1
  579. package/src/engine/apis/llamacpp-residency.ts +1 -19
  580. package/src/engine/apis/lmstudio.ts +1 -6
  581. package/src/engine/apis/ollama-native.ts +3 -3
  582. package/src/engine/apis/openai-completions.ts +2 -2
  583. package/src/engine/apis/residency.ts +3 -9
  584. package/src/engine/claude/sdk-module.ts +87 -0
  585. package/src/engine/claude/sdk-runtime.ts +25 -17
  586. package/src/engine/claude/subprocess-runtime.ts +1 -1
  587. package/src/engine/claude/tool-safety.ts +4 -4
  588. package/src/engine/loop-guard.ts +0 -5
  589. package/src/engine/session.ts +14 -7
  590. package/src/engine/tui-primitives.ts +21 -0
  591. package/src/engine/tui.ts +1 -0
  592. package/src/engine/worker-events.ts +6 -6
  593. package/src/engine/worker-runtime.ts +16 -26
  594. package/src/entry/boot-options.ts +2 -0
  595. package/src/entry/orchestrator.ts +207 -90
  596. package/src/entry/panes-activation.ts +31 -0
  597. package/src/entry/with-panes.ts +20 -0
  598. package/src/interactive/application-controller.ts +21 -21
  599. package/src/interactive/bus-notices.ts +2 -2
  600. package/src/interactive/chat-loop.ts +8 -8
  601. package/src/interactive/chat-panel.ts +1 -1
  602. package/src/interactive/clio-editor.ts +105 -1
  603. package/src/interactive/context-activity.ts +8 -6
  604. package/src/interactive/context-meter.ts +3 -6
  605. package/src/interactive/context-overlay.ts +2 -1
  606. package/src/interactive/cost-overlay.ts +3 -1
  607. package/src/interactive/council-grid.ts +3 -5
  608. package/src/interactive/council.ts +11 -0
  609. package/src/interactive/dispatch-board.ts +56 -49
  610. package/src/interactive/editor-bash.ts +21 -0
  611. package/src/interactive/editor-steer.ts +9 -4
  612. package/src/interactive/editor-submit.ts +24 -18
  613. package/src/interactive/external-editor.ts +1 -1
  614. package/src/interactive/file-reference-completion.ts +360 -0
  615. package/src/interactive/footer/dashboard.ts +15 -17
  616. package/src/interactive/footer/notifications.ts +14 -8
  617. package/src/interactive/footer/widgets.ts +2 -44
  618. package/src/interactive/interactive-application.ts +229 -62
  619. package/src/interactive/interactive-event-projection.ts +1 -1
  620. package/src/interactive/interactive-input-runtime.ts +9 -2
  621. package/src/interactive/interactive-presentation.ts +21 -16
  622. package/src/interactive/interactive-shell.ts +2 -2
  623. package/src/interactive/interactive-slash-runtime.ts +99 -23
  624. package/src/interactive/interactive-subscriptions.ts +1 -1
  625. package/src/interactive/interactive-tickers.ts +1 -1
  626. package/src/interactive/keybinding-manager.ts +4 -4
  627. package/src/interactive/layout.ts +1 -1
  628. package/src/interactive/memory-overlay.ts +3 -2
  629. package/src/interactive/modal-marker.ts +151 -0
  630. package/src/interactive/mutation-preview.ts +1 -1
  631. package/src/interactive/mux-bridge.ts +214 -0
  632. package/src/interactive/overlay-frame.ts +62 -14
  633. package/src/interactive/overlay-general-openers.ts +7 -2
  634. package/src/interactive/overlay-key-routing.ts +21 -10
  635. package/src/interactive/overlay-lifecycle.ts +20 -4
  636. package/src/interactive/overlay-model-selectors.ts +43 -6
  637. package/src/interactive/overlay-permission-lifecycle.ts +90 -22
  638. package/src/interactive/overlay-transitions.ts +18 -4
  639. package/src/interactive/overlays/agents.ts +3 -2
  640. package/src/interactive/overlays/ask-user.ts +161 -41
  641. package/src/interactive/overlays/auth-dialog.ts +1 -0
  642. package/src/interactive/overlays/context-reset.ts +29 -4
  643. package/src/interactive/overlays/cwd-fallback.ts +29 -4
  644. package/src/interactive/overlays/decisions.ts +15 -13
  645. package/src/interactive/overlays/extensions.ts +1 -0
  646. package/src/interactive/overlays/fleet-run-approval.ts +4 -3
  647. package/src/interactive/overlays/handoff-review.ts +3 -2
  648. package/src/interactive/overlays/help-reference.ts +2 -0
  649. package/src/interactive/overlays/interop.ts +2 -1
  650. package/src/interactive/overlays/library-install-confirm.ts +2 -1
  651. package/src/interactive/overlays/library-tabs.ts +28 -0
  652. package/src/interactive/overlays/list-overlay.ts +10 -1
  653. package/src/interactive/overlays/message-picker.ts +2 -1
  654. package/src/interactive/overlays/model-scope.ts +86 -0
  655. package/src/interactive/overlays/model-selector.ts +40 -31
  656. package/src/interactive/overlays/prompts.ts +11 -4
  657. package/src/interactive/overlays/session-selector.ts +3 -2
  658. package/src/interactive/overlays/settings-sections.ts +30 -0
  659. package/src/interactive/overlays/settings.ts +849 -268
  660. package/src/interactive/overlays/side-question.ts +3 -2
  661. package/src/interactive/overlays/skills-hub.ts +11 -19
  662. package/src/interactive/overlays/tree-selector.ts +3 -2
  663. package/src/interactive/pane-policy.ts +46 -0
  664. package/src/interactive/panes-runtime.ts +318 -0
  665. package/src/interactive/permission-overlay.ts +2 -2
  666. package/src/interactive/renderers/compaction-summary.ts +29 -0
  667. package/src/interactive/renderers/retry-status.ts +12 -4
  668. package/src/interactive/renderers/tool-execution.ts +4 -4
  669. package/src/interactive/renderers/worker-entry.ts +122 -14
  670. package/src/interactive/session-transcript.ts +3 -3
  671. package/src/interactive/slash-autocomplete.ts +454 -165
  672. package/src/interactive/slash-commands.ts +521 -189
  673. package/src/interactive/slash-spec.ts +160 -17
  674. package/src/interactive/status/controller.ts +2 -2
  675. package/src/interactive/stream-pacing-policy.ts +1 -1
  676. package/src/interactive/tasks-overlay.ts +21 -13
  677. package/src/interactive/terminal-lease.ts +6 -7
  678. package/src/interactive/theme/tokens.ts +3 -14
  679. package/src/interactive/turn-context.ts +58 -13
  680. package/src/interactive/turn-persistence.ts +2 -2
  681. package/src/interactive/turn-prewarm.ts +2 -2
  682. package/src/interactive/turn-runtime.ts +8 -8
  683. package/src/interactive/turn-state.ts +1 -1
  684. package/src/interactive/view/artifacts.ts +120 -9
  685. package/src/interactive/view/view-overlay.ts +14 -10
  686. package/src/interactive/watch-pane.ts +180 -0
  687. package/src/interactive/welcome-dashboard.ts +15 -15
  688. package/src/interactive/worker-progress.ts +11 -5
  689. package/src/interactive/worker-receipts.ts +20 -2
  690. package/src/interactive/worker-stream.ts +6 -4
  691. package/src/interactive/yazi-bridge.ts +451 -0
  692. package/src/tools/ask-user.ts +3 -3
  693. package/src/tools/bash.ts +1 -1
  694. package/src/tools/bootstrap.ts +26 -2
  695. package/src/tools/builtin-tool-catalog.ts +16 -1
  696. package/src/tools/compete-worktrees.ts +108 -17
  697. package/src/tools/context/index.ts +15 -1
  698. package/src/tools/core-bootstrap.ts +2 -1
  699. package/src/tools/dispatch-admission.ts +18 -5
  700. package/src/tools/dispatch-arguments.ts +21 -21
  701. package/src/tools/dispatch-plan.ts +0 -11
  702. package/src/tools/dispatch-run-events.ts +145 -28
  703. package/src/tools/dispatch-runner.ts +40 -13
  704. package/src/tools/dispatch-types.ts +15 -3
  705. package/src/tools/dispatch.ts +2 -2
  706. package/src/tools/executables.ts +17 -14
  707. package/src/tools/find.ts +1 -6
  708. package/src/tools/monitor.ts +4 -4
  709. package/src/tools/observation.ts +54 -4
  710. package/src/tools/observers.ts +0 -33
  711. package/src/tools/panes-surface.ts +38 -0
  712. package/src/tools/panes.ts +112 -0
  713. package/src/tools/policy.ts +10 -1
  714. package/src/tools/presentation.ts +1 -0
  715. package/src/tools/task-worktree.ts +28 -7
  716. package/src/tools/verify/authoring.ts +3 -6
  717. package/src/tools/verify/frontend.ts +1 -1
  718. package/src/tools/web-fetch.ts +1 -1
  719. package/src/worker/entry.ts +4 -3
  720. package/src/worker/protocol.ts +16 -14
  721. package/src/worker/spec-contract.ts +2 -2
  722. package/src/worker/stdin-demux.ts +2 -2
  723. package/dist/chunk-D73KXYPF.js +0 -37
  724. package/dist/chunk-MLOK6ZOS.js +0 -2888
  725. package/dist/chunk-PNY46YEY.js +0 -1581
  726. package/dist/chunk-XDOQXGFO.js +0 -515
  727. package/dist/chunk-YKOFT37S.js +0 -279
  728. package/dist/clio-LT5V7SSZ.js +0 -26
  729. package/dist/configure-2WYWSCSD.js +0 -49
  730. package/dist/doctor-TWBWFK5V.js +0 -165
  731. package/src/engine/apis/degraded-inference.ts +0 -95
  732. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  733. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
@@ -1,7 +1,15 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { realpathSync } from "node:fs";
3
3
  import { isAbsolute, resolve as resolvePath } from "node:path";
4
- import { BusChannels, type LoopBlockedPayload } from "../../core/bus-events.js";
4
+ import {
5
+ BusChannels,
6
+ type DispatchCompletedPayload,
7
+ type DispatchEnqueuedPayload,
8
+ type DispatchFailedPayload,
9
+ type DispatchProgressPayload,
10
+ type DispatchStartedPayload,
11
+ type LoopBlockedPayload,
12
+ } from "../../core/bus-events.js";
5
13
  import { DEFAULT_DELEGATION_PERMISSION_TIMEOUT_MS } from "../../core/defaults.js";
6
14
  import type { SafeEventBus } from "../../core/event-bus.js";
7
15
  import { MAX_TIMER_DELAY_MS } from "../../core/timers.js";
@@ -33,6 +41,7 @@ import type {
33
41
  AcpToolKind,
34
42
  } from "./types.js";
35
43
  import {
44
+ ACP_AGENT_META_KEY,
36
45
  ACP_MAX_CHUNK_BYTES,
37
46
  ACP_MAX_RAW_RECORD_BYTES,
38
47
  ACP_MAX_STRING_BYTES,
@@ -68,10 +77,10 @@ export interface AcpSafeSettingsSnapshot extends AcpRoutingSnapshot {
68
77
  }
69
78
 
70
79
  export type AcpSafeSettingsPatch = Partial<{
71
- "orchestrator.target": string | null;
72
- "orchestrator.model": string | null;
73
- "orchestrator.thinkingLevel": AcpThinkingLevel;
74
- autonomy: AutonomyLevel;
80
+ "chat.target": string | null;
81
+ "chat.model": string | null;
82
+ "chat.thinkingLevel": AcpThinkingLevel;
83
+ "safety.autonomy": AutonomyLevel;
75
84
  }>;
76
85
 
77
86
  export interface AcpSettingsControl {
@@ -173,6 +182,25 @@ interface ActivePrompt {
173
182
  interface AcpToolCallSnapshot {
174
183
  rawInput: Record<string, unknown>;
175
184
  locations?: AcpToolCallLocation[];
185
+ /** Exact title and kind this call was announced under, replayed by later updates. */
186
+ title: string;
187
+ kind: AcpToolKind;
188
+ /**
189
+ * Delegated agents this call spawned, oldest first, bounded by
190
+ * {@link ACP_MAX_TOOL_CALL_AGENTS}. A dispatch tool that fans out reports one
191
+ * entry per run, which is what lets a client label the segment with the
192
+ * agents that actually ran under it rather than with the product name.
193
+ */
194
+ agents?: AcpAgentAttribution[];
195
+ }
196
+
197
+ /** One `clio-coder/agent` attribution entry. `role` names where the identity came from. */
198
+ interface AcpAgentAttribution {
199
+ version: 1;
200
+ role: "orchestrator" | "worker";
201
+ agentId: string;
202
+ runId?: string;
203
+ node?: string;
176
204
  }
177
205
 
178
206
  interface AcpServerUsage {
@@ -299,6 +327,74 @@ const ACP_MAX_TOOL_TITLE_BYTES = 512;
299
327
  const ACP_MAX_LIVE_TOOL_CALLS = 128;
300
328
  const ACP_MAX_REPLAY_TOOL_CALLS = 8192;
301
329
 
330
+ /**
331
+ * Bus channels this server is willing to forward over the opt-in
332
+ * `clio-coder/event` notification. Nothing outside this list is forwardable:
333
+ * the list is the allowlist, and a client's requested kinds are intersected
334
+ * with it rather than trusted. `safety.loopBlocked` was the first member; the
335
+ * dispatch lifecycle joined it so a client can draw a live fleet board from
336
+ * reported facts instead of inferring one from tool titles or timing.
337
+ */
338
+ const ACP_FORWARDABLE_EVENT_KINDS = [
339
+ "safety.loopBlocked",
340
+ "dispatch.enqueued",
341
+ "dispatch.started",
342
+ "dispatch.progress",
343
+ "dispatch.completed",
344
+ "dispatch.failed",
345
+ ] as const;
346
+
347
+ type AcpForwardableEventKind = (typeof ACP_FORWARDABLE_EVENT_KINDS)[number];
348
+
349
+ /** A client may name at most this many kinds; an over-long list refuses the whole opt-in. */
350
+ const ACP_MAX_REQUESTED_EVENT_KINDS = 16;
351
+
352
+ /**
353
+ * Sanitized, bounded preview of a dispatched task. The exact task is the
354
+ * operator's own prose and can be arbitrarily long, so what crosses is a
355
+ * control-character-stripped prefix carrying the standard truncation marker;
356
+ * the exact text never leaves the process.
357
+ */
358
+ const ACP_MAX_DISPATCH_TASK_PREVIEW_BYTES = 160;
359
+
360
+ /** Wire bound for the short identifiers a dispatch event carries. */
361
+ const ACP_MAX_DISPATCH_ID_BYTES = 128;
362
+
363
+ /**
364
+ * Progress events forwarded per run before the stream is capped. One run
365
+ * publishes one progress fact per worker event, which is unbounded; a client
366
+ * only needs enough to know the run is alive, so the cap is announced with a
367
+ * final `truncated` frame rather than by silently going quiet.
368
+ */
369
+ const ACP_MAX_DISPATCH_PROGRESS_EVENTS = 256;
370
+
371
+ /** Live dispatch runs whose progress counters this server tracks at once. */
372
+ const ACP_MAX_TRACKED_DISPATCH_RUNS = 512;
373
+
374
+ /** Delegated agents recorded against one tool call before further ones are dropped. */
375
+ const ACP_MAX_TOOL_CALL_AGENTS = 16;
376
+
377
+ /**
378
+ * Attribution for a frame this server produced on the main session. Every live
379
+ * frame carries it, so a client never has to decide whether an unattributed
380
+ * frame means "the orchestrator" or "identity unavailable".
381
+ */
382
+ const ORCHESTRATOR_ATTRIBUTION: AcpAgentAttribution = {
383
+ version: 1,
384
+ role: "orchestrator",
385
+ agentId: "orchestrator",
386
+ };
387
+
388
+ const ORCHESTRATOR_UPDATE_META: Record<string, unknown> = {
389
+ [ACP_AGENT_META_KEY]: [ORCHESTRATOR_ATTRIBUTION],
390
+ };
391
+
392
+ /** The `_meta` a tool-call frame carries: its own agents when it spawned any, else the orchestrator. */
393
+ function toolCallUpdateMeta(snapshot: AcpToolCallSnapshot | undefined): Record<string, unknown> {
394
+ if (snapshot?.agents === undefined || snapshot.agents.length === 0) return ORCHESTRATOR_UPDATE_META;
395
+ return { [ACP_AGENT_META_KEY]: [ORCHESTRATOR_ATTRIBUTION, ...snapshot.agents] };
396
+ }
397
+
302
398
  /** Depth past which `boundRawRecord` stops walking and elides the subtree. */
303
399
  const ACP_MAX_RAW_RECORD_DEPTH = 8;
304
400
 
@@ -580,21 +676,26 @@ function eventTextDelta(event: AcpEventRecord): string {
580
676
  }
581
677
 
582
678
  /**
583
- * The next unused `clio-tool-<n>`. The counter alone is not enough: an engine
584
- * that names its own calls `clio-tool-1` would otherwise collide with an alias
679
+ * The next unused `clio-coder-tool-<n>`. The counter alone is not enough: an engine
680
+ * that names its own calls `clio-coder-tool-1` would otherwise collide with an alias
585
681
  * this server minted, and two different calls sharing one wire id is the exact
586
682
  * failure aliasing exists to prevent.
587
683
  */
588
684
  function nextAliasToolCallId(active: ActivePrompt): string {
589
685
  for (;;) {
590
686
  active.toolCallSequence += 1;
591
- const alias = `clio-tool-${active.toolCallSequence}`;
687
+ const alias = `clio-coder-tool-${active.toolCallSequence}`;
592
688
  if (active.usedWireIds.has(alias)) continue;
593
689
  active.usedWireIds.add(alias);
594
690
  return alias;
595
691
  }
596
692
  }
597
693
 
694
+ function normalizeReleasedAliasToolCallId(engineId: string): string {
695
+ const legacy = /^clio-tool-([1-9]\d*)$/u.exec(engineId);
696
+ return legacy === null ? engineId : `clio-coder-tool-${legacy[1]}`;
697
+ }
698
+
598
699
  /** Records `wireId` as the newest wire id this engine id speaks under. */
599
700
  function pushWireId(active: ActivePrompt, engineId: string, wireId: string): string {
600
701
  const existing = active.toolCallWireIds.get(engineId);
@@ -609,9 +710,10 @@ function pushWireId(active: ActivePrompt, engineId: string, wireId: string): str
609
710
  * call travels under a per-prompt alias.
610
711
  */
611
712
  function mintWireId(active: ActivePrompt, engineId: string): string {
612
- const usable = utf8Bytes(engineId) <= ACP_MAX_TOOL_CALL_ID_BYTES && !active.usedWireIds.has(engineId);
613
- if (usable) active.usedWireIds.add(engineId);
614
- return pushWireId(active, engineId, usable ? engineId : nextAliasToolCallId(active));
713
+ const candidate = normalizeReleasedAliasToolCallId(engineId);
714
+ const usable = utf8Bytes(candidate) <= ACP_MAX_TOOL_CALL_ID_BYTES && !active.usedWireIds.has(candidate);
715
+ if (usable) active.usedWireIds.add(candidate);
716
+ return pushWireId(active, engineId, usable ? candidate : nextAliasToolCallId(active));
615
717
  }
616
718
 
617
719
  /**
@@ -691,8 +793,9 @@ function sendUpdate(
691
793
  sessionId: string,
692
794
  active: ActivePrompt,
693
795
  update: Record<string, unknown>,
796
+ meta: Record<string, unknown> = ORCHESTRATOR_UPDATE_META,
694
797
  ): void {
695
- const params: AcpSessionUpdateParams = { sessionId, update };
798
+ const params: AcpSessionUpdateParams = { sessionId, update, _meta: meta };
696
799
  active.updatesSent += 1;
697
800
  transport.notify("session/update", params);
698
801
  }
@@ -722,12 +825,18 @@ function settleOpenToolCalls(
722
825
  text: string,
723
826
  ): void {
724
827
  for (const toolCallId of active.openToolCalls) {
725
- sendUpdate(transport, sessionId, active, {
726
- sessionUpdate: "tool_call_update",
727
- toolCallId,
728
- status: "failed" satisfies AcpToolCallStatus,
729
- content: toolCallContent(text),
730
- });
828
+ sendUpdate(
829
+ transport,
830
+ sessionId,
831
+ active,
832
+ {
833
+ sessionUpdate: "tool_call_update",
834
+ toolCallId,
835
+ status: "failed" satisfies AcpToolCallStatus,
836
+ content: toolCallContent(text),
837
+ },
838
+ toolCallUpdateMeta(active.toolCallSnapshots.get(toolCallId)),
839
+ );
731
840
  // The sweep is a terminal update like any other, so a late end for a swept
732
841
  // id cannot reopen the call the client has already seen fail.
733
842
  active.terminalToolCalls.add(toolCallId);
@@ -794,13 +903,15 @@ function handleChatEvent(
794
903
  const snapshot: AcpToolCallSnapshot = {
795
904
  rawInput: boundRawRecord(event.args),
796
905
  ...(locations !== null ? { locations } : {}),
906
+ title: boundString(toolName ?? "tool", ACP_MAX_TOOL_TITLE_BYTES),
907
+ kind: toolKind(toolName),
797
908
  };
798
909
  active.toolCallSnapshots.set(toolCallId, snapshot);
799
910
  sendUpdate(transport, sessionId, active, {
800
911
  sessionUpdate: "tool_call",
801
912
  toolCallId,
802
- title: boundString(toolName ?? "tool", ACP_MAX_TOOL_TITLE_BYTES),
803
- kind: toolKind(toolName),
913
+ title: snapshot.title,
914
+ kind: snapshot.kind,
804
915
  status: "in_progress" satisfies AcpToolCallStatus,
805
916
  rawInput: snapshot.rawInput,
806
917
  ...(snapshot.locations !== undefined ? { locations: snapshot.locations } : {}),
@@ -826,15 +937,21 @@ function handleChatEvent(
826
937
  active.openToolCalls.delete(toolCallId);
827
938
  active.terminalToolCalls.add(toolCallId);
828
939
  const output = boundString(outputText(event.result), ACP_MAX_CHUNK_BYTES);
829
- sendUpdate(transport, sessionId, active, {
830
- sessionUpdate: "tool_call_update",
831
- toolCallId,
832
- title: boundString(toolName ?? "tool", ACP_MAX_TOOL_TITLE_BYTES),
833
- kind: toolKind(toolName),
834
- status: toolStatus(event),
835
- ...(output.length > 0 ? { content: toolCallContent(output) } : {}),
836
- rawOutput: boundRawRecord({ result: event.result, isError: event.isError === true }),
837
- });
940
+ sendUpdate(
941
+ transport,
942
+ sessionId,
943
+ active,
944
+ {
945
+ sessionUpdate: "tool_call_update",
946
+ toolCallId,
947
+ title: boundString(toolName ?? "tool", ACP_MAX_TOOL_TITLE_BYTES),
948
+ kind: toolKind(toolName),
949
+ status: toolStatus(event),
950
+ ...(output.length > 0 ? { content: toolCallContent(output) } : {}),
951
+ rawOutput: boundRawRecord({ result: event.result, isError: event.isError === true }),
952
+ },
953
+ toolCallUpdateMeta(active.toolCallSnapshots.get(toolCallId)),
954
+ );
838
955
  return;
839
956
  }
840
957
  if (event.type === "message_end") {
@@ -864,14 +981,14 @@ function handleChatEvent(
864
981
  if (last !== undefined) applyStopReason(active, last);
865
982
  return;
866
983
  }
867
- // Clio lifecycle events (agent_start, retry_status, clio_plan_update) have
984
+ // Clio lifecycle events (agent_start, retry_status, clio_coder_plan_update) have
868
985
  // no ACP v1 SessionUpdate equivalent. The prompt turn is bounded by the
869
986
  // session/prompt response, so emitting non-spec `progress` updates would
870
987
  // break strict clients. They are intentionally dropped. The same protocol
871
988
  // gap applies to routing advisories (external settings divergence, active
872
989
  // target removed): ACP v1 has no agent-initiated advisory channel, so the
873
990
  // orchestrator records those as `custom` session-ledger entries
874
- // (customType "clio.routing-notice") instead of inventing update kinds.
991
+ // (customType "clio-coder.routing-notice") instead of inventing update kinds.
875
992
  }
876
993
 
877
994
  const ACP_MAX_SESSION_ID_BYTES = 128;
@@ -1148,12 +1265,7 @@ function sessionResultMeta(
1148
1265
  };
1149
1266
  }
1150
1267
 
1151
- const ACP_SAFE_SETTINGS_KEYS = [
1152
- "orchestrator.target",
1153
- "orchestrator.model",
1154
- "orchestrator.thinkingLevel",
1155
- "autonomy",
1156
- ] as const;
1268
+ const ACP_SAFE_SETTINGS_KEYS = ["chat.target", "chat.model", "chat.thinkingLevel", "safety.autonomy"] as const;
1157
1269
  const ACP_THINKING_LEVELS = new Set<AcpThinkingLevel>(["off", "minimal", "low", "medium", "high", "xhigh", "max"]);
1158
1270
  const ACP_AUTONOMY_LEVELS = new Set<AutonomyLevel>(["read-only", "suggest", "auto-edit", "full-auto"]);
1159
1271
  const ACP_MAX_TARGETS = 64;
@@ -1177,12 +1289,12 @@ function safeSettingsProjection(snapshot: AcpSafeSettingsSnapshot): Record<strin
1177
1289
  const autonomy = ACP_AUTONOMY_LEVELS.has(snapshot.autonomy) ? snapshot.autonomy : DEFAULT_AUTONOMY_LEVEL;
1178
1290
  return {
1179
1291
  settings: {
1180
- orchestrator: {
1292
+ chat: {
1181
1293
  target: safeConfiguredIdentifier(snapshot.target, ACP_MAX_TARGET_ID_BYTES),
1182
1294
  model: safeConfiguredIdentifier(snapshot.model, ACP_MAX_MODEL_ID_BYTES),
1183
1295
  thinkingLevel,
1184
1296
  },
1185
- autonomy,
1297
+ safety: { autonomy },
1186
1298
  },
1187
1299
  editable: [...ACP_SAFE_SETTINGS_KEYS],
1188
1300
  };
@@ -1500,9 +1612,24 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1500
1612
  const sessions = new Map<string, AcpServerSession>();
1501
1613
  const workspaceInstanceId = randomUUID();
1502
1614
  let initialized = false;
1503
- let loopBlockedEventsEnabled = false;
1615
+ const enabledEventKinds = new Set<AcpForwardableEventKind>();
1504
1616
  let eventSequence = 0;
1617
+ /**
1618
+ * Per-run progress counters for the forwarded dispatch stream, insertion
1619
+ * ordered. A terminal event removes its run; the cap evicts the oldest live
1620
+ * run rather than refusing the newest, so a leaked run cannot starve the
1621
+ * board of the run an operator is actually watching.
1622
+ */
1623
+ const dispatchProgress = new Map<string, { count: number; capped: boolean }>();
1505
1624
  let activeSessionId: string | null = null;
1625
+ /**
1626
+ * The one session this process hosts, from the moment it is bound until it is
1627
+ * closed. Distinct from {@link activeSessionId}, which is only set while a
1628
+ * prompt is running: a detached dispatch run legitimately finishes after the
1629
+ * turn that started it, and a client keyed on the bound session still needs
1630
+ * that outcome so its board does not leave the run running forever.
1631
+ */
1632
+ let boundSessionId: string | null = null;
1506
1633
  let activePromptState: ActivePrompt | null = null;
1507
1634
  let sessionCreated = false;
1508
1635
  let promptSettled: Promise<void> | null = null;
@@ -1541,48 +1668,244 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1541
1668
  options.chat.cancel();
1542
1669
  },
1543
1670
  });
1544
- const unsubscribeLoopBlocked =
1545
- options.bus?.on(BusChannels.LoopBlocked, (payload: LoopBlockedPayload) => {
1546
- if (!initialized || !loopBlockedEventsEnabled || activeSessionId === null || activePromptState === null) return;
1547
- if (
1548
- !Number.isSafeInteger(payload.repeatCount) ||
1549
- payload.repeatCount < 1 ||
1550
- !Number.isSafeInteger(payload.blocksThisTurn) ||
1551
- payload.blocksThisTurn < 1 ||
1552
- !Number.isSafeInteger(payload.budget) ||
1553
- payload.budget < 1 ||
1554
- !(["block", "lockout", "stop"] as ReadonlyArray<string>).includes(payload.disposition) ||
1555
- payload.interrupted !== (payload.disposition === "stop")
1556
- ) {
1557
- return;
1558
- }
1559
- const tool = safeStoredString(payload.tool, 64).trim();
1560
- if (tool.length === 0) return;
1561
- eventSequence += 1;
1562
- try {
1563
- options.transport.notify("clio-coder/event", {
1564
- version: 1,
1565
- workspaceInstanceId,
1566
- sessionId: activeSessionId,
1567
- turnId: safeStoredIdentifier(payload.turnId, ACP_MAX_SESSION_ID_BYTES),
1568
- sequence: eventSequence,
1569
- kind: "safety.loopBlocked",
1570
- terminal: false,
1571
- payload: {
1572
- toolCallId: null,
1573
- tool,
1574
- repeatCount: payload.repeatCount,
1575
- blocksThisTurn: payload.blocksThisTurn,
1576
- budget: payload.budget,
1577
- disposition: payload.disposition,
1578
- interrupted: payload.interrupted,
1579
- shape: null,
1580
- },
1671
+ /**
1672
+ * Sends one frame of the opt-in stream. Every forwarded channel goes through
1673
+ * here so the envelope, the sequence, and the opt-in check cannot drift per
1674
+ * channel. Nothing is sent before a session exists: the envelope's
1675
+ * `sessionId` is the client's only way to bind a fact to what it is showing.
1676
+ */
1677
+ const forwardEvent = (
1678
+ kind: AcpForwardableEventKind,
1679
+ turnId: string | null,
1680
+ terminal: boolean,
1681
+ payload: Record<string, unknown>,
1682
+ ): void => {
1683
+ const sessionId = activeSessionId ?? boundSessionId;
1684
+ if (!initialized || !enabledEventKinds.has(kind) || sessionId === null) return;
1685
+ eventSequence += 1;
1686
+ try {
1687
+ options.transport.notify("clio-coder/event", {
1688
+ version: 1,
1689
+ workspaceInstanceId,
1690
+ sessionId,
1691
+ turnId,
1692
+ sequence: eventSequence,
1693
+ kind,
1694
+ terminal,
1695
+ payload,
1696
+ });
1697
+ } catch {
1698
+ options.diagnostics?.("failed to send an opted-in ACP event");
1699
+ }
1700
+ };
1701
+
1702
+ /**
1703
+ * The identity every dispatch frame carries. The exact task never crosses:
1704
+ * what goes on the wire is a control-character-stripped, byte-bounded prefix
1705
+ * carrying the standard truncation marker, so a client can label a run
1706
+ * without receiving the operator's prose. A run whose id or agent cannot be
1707
+ * represented safely is dropped rather than forwarded under a repaired
1708
+ * identity, because a board keyed on a rewritten id merges distinct runs.
1709
+ */
1710
+ const dispatchIdentity = (payload: {
1711
+ runId: string;
1712
+ agentId: string;
1713
+ task?: string | undefined;
1714
+ node?: string | undefined;
1715
+ }): { runId: string; agentId: string; taskPreview: string | null; node: string | null } | null => {
1716
+ const runId = safeStoredIdentifier(payload.runId, ACP_MAX_DISPATCH_ID_BYTES);
1717
+ const agentId = safeStoredIdentifier(payload.agentId, ACP_MAX_DISPATCH_ID_BYTES);
1718
+ if (runId === null || agentId === null) return null;
1719
+ const preview =
1720
+ payload.task === undefined ? "" : safeStoredString(payload.task, ACP_MAX_DISPATCH_TASK_PREVIEW_BYTES).trim();
1721
+ return {
1722
+ runId,
1723
+ agentId,
1724
+ taskPreview: preview.length === 0 ? null : preview,
1725
+ node: safeStoredIdentifier(payload.node, ACP_MAX_DISPATCH_ID_BYTES),
1726
+ };
1727
+ };
1728
+
1729
+ /** Forgets a run's progress counter and keeps the live map inside its cap. */
1730
+ const trackDispatchRun = (runId: string): { count: number; capped: boolean } => {
1731
+ const existing = dispatchProgress.get(runId);
1732
+ if (existing !== undefined) return existing;
1733
+ if (dispatchProgress.size >= ACP_MAX_TRACKED_DISPATCH_RUNS) {
1734
+ const oldest = dispatchProgress.keys().next();
1735
+ if (!oldest.done) dispatchProgress.delete(oldest.value);
1736
+ }
1737
+ const created = { count: 0, capped: false };
1738
+ dispatchProgress.set(runId, created);
1739
+ return created;
1740
+ };
1741
+
1742
+ const safeCount = (value: unknown): number | null =>
1743
+ typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : null;
1744
+
1745
+ const unsubscribeEvents: Array<() => void> = [];
1746
+ if (options.bus !== undefined) {
1747
+ const bus = options.bus;
1748
+ unsubscribeEvents.push(
1749
+ bus.on(BusChannels.LoopBlocked, (payload: LoopBlockedPayload) => {
1750
+ // Loop blocks describe the turn that is running, so unlike a dispatch
1751
+ // run they are meaningless outside one.
1752
+ if (activePromptState === null) return;
1753
+ if (
1754
+ !Number.isSafeInteger(payload.repeatCount) ||
1755
+ payload.repeatCount < 1 ||
1756
+ !Number.isSafeInteger(payload.blocksThisTurn) ||
1757
+ payload.blocksThisTurn < 1 ||
1758
+ !Number.isSafeInteger(payload.budget) ||
1759
+ payload.budget < 1 ||
1760
+ !(["block", "lockout", "stop"] as ReadonlyArray<string>).includes(payload.disposition) ||
1761
+ payload.interrupted !== (payload.disposition === "stop")
1762
+ ) {
1763
+ return;
1764
+ }
1765
+ const tool = safeStoredString(payload.tool, 64).trim();
1766
+ if (tool.length === 0) return;
1767
+ forwardEvent("safety.loopBlocked", safeStoredIdentifier(payload.turnId, ACP_MAX_SESSION_ID_BYTES), false, {
1768
+ toolCallId: null,
1769
+ tool,
1770
+ repeatCount: payload.repeatCount,
1771
+ blocksThisTurn: payload.blocksThisTurn,
1772
+ budget: payload.budget,
1773
+ disposition: payload.disposition,
1774
+ interrupted: payload.interrupted,
1775
+ shape: null,
1581
1776
  });
1582
- } catch {
1583
- options.diagnostics?.("failed to send an opted-in ACP event");
1584
- }
1585
- }) ?? (() => {});
1777
+ }),
1778
+ );
1779
+ unsubscribeEvents.push(
1780
+ bus.on(BusChannels.DispatchEnqueued, (payload: DispatchEnqueuedPayload) => {
1781
+ const identity = dispatchIdentity(payload);
1782
+ if (identity === null) return;
1783
+ trackDispatchRun(identity.runId);
1784
+ forwardEvent("dispatch.enqueued", null, false, {
1785
+ ...identity,
1786
+ origin: safeStoredIdentifier(payload.requestOrigin, 64),
1787
+ attempt: null,
1788
+ });
1789
+ }),
1790
+ );
1791
+ unsubscribeEvents.push(
1792
+ bus.on(BusChannels.DispatchStarted, (payload: DispatchStartedPayload) => {
1793
+ const identity = dispatchIdentity(payload);
1794
+ if (identity === null) return;
1795
+ trackDispatchRun(identity.runId);
1796
+ // A run started by a tool call this turn already put on the wire is
1797
+ // the one place the harness knows which agent produced a tool
1798
+ // segment. Record it and re-announce the call so a client can label
1799
+ // the segment while the worker is still running.
1800
+ attributeRunToToolCall(payload.parentToolCallId, identity);
1801
+ forwardEvent("dispatch.started", null, false, {
1802
+ ...identity,
1803
+ origin: safeStoredIdentifier(payload.requestOrigin, 64),
1804
+ attempt: safeCount(payload.attempt),
1805
+ });
1806
+ }),
1807
+ );
1808
+ unsubscribeEvents.push(
1809
+ bus.on(BusChannels.DispatchProgress, (payload: DispatchProgressPayload) => {
1810
+ const identity = dispatchIdentity(payload);
1811
+ if (identity === null) return;
1812
+ const state = trackDispatchRun(identity.runId);
1813
+ if (state.capped) return;
1814
+ state.count += 1;
1815
+ const capped = state.count > ACP_MAX_DISPATCH_PROGRESS_EVENTS;
1816
+ if (capped) state.capped = true;
1817
+ // The worker/ACP event that triggered this crossed a process boundary
1818
+ // and is typed `unknown`; none of it goes on the wire. What a board
1819
+ // needs is that the run is alive and roughly how much it has done.
1820
+ forwardEvent("dispatch.progress", null, false, {
1821
+ runId: identity.runId,
1822
+ agentId: identity.agentId,
1823
+ progressCount: state.count,
1824
+ truncated: capped,
1825
+ });
1826
+ }),
1827
+ );
1828
+ unsubscribeEvents.push(
1829
+ bus.on(BusChannels.DispatchCompleted, (payload: DispatchCompletedPayload) => {
1830
+ const identity = dispatchIdentity(payload);
1831
+ if (identity === null) return;
1832
+ dispatchProgress.delete(identity.runId);
1833
+ forwardEvent("dispatch.completed", null, true, {
1834
+ runId: identity.runId,
1835
+ agentId: identity.agentId,
1836
+ outcome: safeStoredIdentifier(payload.outcome, 64),
1837
+ outcomeCode: safeStoredIdentifier(payload.outcomeCode, 64),
1838
+ durationMs: safeCount(payload.durationMs),
1839
+ tokenCount: safeCount(payload.tokenCount),
1840
+ });
1841
+ }),
1842
+ );
1843
+ unsubscribeEvents.push(
1844
+ bus.on(BusChannels.DispatchFailed, (payload: DispatchFailedPayload) => {
1845
+ const identity = dispatchIdentity(payload);
1846
+ if (identity === null) return;
1847
+ dispatchProgress.delete(identity.runId);
1848
+ // `outcomeDetail` is free-form failure prose that legitimately quotes
1849
+ // paths, argv, and provider bodies. The taxonomy crosses; the prose
1850
+ // does not.
1851
+ forwardEvent("dispatch.failed", null, true, {
1852
+ runId: identity.runId,
1853
+ agentId: identity.agentId,
1854
+ outcome: safeStoredIdentifier(payload.outcome, 64),
1855
+ reason: safeStoredIdentifier(payload.reason, 64),
1856
+ durationMs: safeCount(payload.durationMs),
1857
+ });
1858
+ }),
1859
+ );
1860
+ }
1861
+ const unsubscribeEventStream = (): void => {
1862
+ for (const unsubscribe of unsubscribeEvents) unsubscribe();
1863
+ unsubscribeEvents.length = 0;
1864
+ dispatchProgress.clear();
1865
+ };
1866
+
1867
+ /**
1868
+ * Records a delegated agent against the tool call that spawned it and
1869
+ * re-announces that call so the attribution reaches the client while the
1870
+ * worker is running. Nothing is minted here: an id with no open call this
1871
+ * turn binds to nothing, exactly as on the permission path.
1872
+ */
1873
+ function attributeRunToToolCall(
1874
+ parentToolCallId: string | undefined,
1875
+ identity: { runId: string; agentId: string; node: string | null },
1876
+ ): void {
1877
+ const active = activePromptState;
1878
+ if (active === null || activeSessionId === null) return;
1879
+ if (parentToolCallId === undefined || parentToolCallId.length === 0) return;
1880
+ const wireId = openWireIdFor(active, parentToolCallId);
1881
+ if (wireId === null) return;
1882
+ const snapshot = active.toolCallSnapshots.get(wireId);
1883
+ if (snapshot === undefined) return;
1884
+ const agents = snapshot.agents ?? [];
1885
+ if (agents.length >= ACP_MAX_TOOL_CALL_AGENTS) return;
1886
+ if (agents.some((agent) => agent.runId === identity.runId)) return;
1887
+ agents.push({
1888
+ version: 1,
1889
+ role: "worker",
1890
+ agentId: identity.agentId,
1891
+ runId: identity.runId,
1892
+ ...(identity.node !== null ? { node: identity.node } : {}),
1893
+ });
1894
+ snapshot.agents = agents;
1895
+ sendUpdate(
1896
+ options.transport,
1897
+ activeSessionId,
1898
+ active,
1899
+ {
1900
+ sessionUpdate: "tool_call_update",
1901
+ toolCallId: wireId,
1902
+ title: snapshot.title,
1903
+ kind: snapshot.kind,
1904
+ status: "in_progress" satisfies AcpToolCallStatus,
1905
+ },
1906
+ toolCallUpdateMeta(snapshot),
1907
+ );
1908
+ }
1586
1909
 
1587
1910
  const requireInitialized = (): void => {
1588
1911
  if (!initialized) throw new AcpRequestError(-32000, "initialize must be called first", { code: "not_initialized" });
@@ -1671,15 +1994,21 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1671
1994
  const eventRequest =
1672
1995
  clientMeta !== null && isRecord(clientMeta["clio-coder/events"]) ? clientMeta["clio-coder/events"] : null;
1673
1996
  const requestedEventKinds = eventRequest !== null ? eventRequest.kinds : null;
1674
- loopBlockedEventsEnabled =
1997
+ // A malformed request refuses the whole opt-in rather than the offending
1998
+ // entry: a client that sent an unrepresentable kind does not know what it
1999
+ // asked for, and silently honouring the rest of its list hides that.
2000
+ enabledEventKinds.clear();
2001
+ if (
1675
2002
  eventRequest !== null &&
1676
2003
  eventRequest.version === 1 &&
1677
2004
  Array.isArray(requestedEventKinds) &&
1678
- requestedEventKinds.length <= 16 &&
1679
- requestedEventKinds.every(
1680
- (kind) => typeof kind === "string" && utf8Bytes(kind) <= 64 && !hasControlCharacters(kind),
1681
- ) &&
1682
- requestedEventKinds.includes("safety.loopBlocked");
2005
+ requestedEventKinds.length <= ACP_MAX_REQUESTED_EVENT_KINDS &&
2006
+ requestedEventKinds.every((kind) => typeof kind === "string" && utf8Bytes(kind) <= 64 && !hasControlCharacters(kind))
2007
+ ) {
2008
+ for (const kind of ACP_FORWARDABLE_EVENT_KINDS) {
2009
+ if (requestedEventKinds.includes(kind)) enabledEventKinds.add(kind);
2010
+ }
2011
+ }
1683
2012
  const canLoadSession =
1684
2013
  options.session !== undefined &&
1685
2014
  options.readSessionEntries !== undefined &&
@@ -1717,12 +2046,16 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1717
2046
  list: options.providers !== undefined,
1718
2047
  probe: options.providers !== undefined,
1719
2048
  },
2049
+ // Per-frame agent attribution on `session/update`. Announced so a
2050
+ // client can tell "this agent produced nothing" apart from "this
2051
+ // peer does not report identity at all".
2052
+ [ACP_AGENT_META_KEY]: { version: 1, meta: ACP_AGENT_META_KEY },
1720
2053
  ...(options.bus
1721
2054
  ? {
1722
2055
  "clio-coder/events": {
1723
2056
  version: 1,
1724
2057
  notification: "clio-coder/event",
1725
- kinds: ["safety.loopBlocked"],
2058
+ kinds: ACP_FORWARDABLE_EVENT_KINDS,
1726
2059
  workspaceInstanceId,
1727
2060
  },
1728
2061
  }
@@ -1730,7 +2063,15 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1730
2063
  ...(options.toolRegistry !== undefined ? { "clio-coder/tools": "mediated" } : {}),
1731
2064
  },
1732
2065
  },
1733
- authMethods: [],
2066
+ authMethods: [
2067
+ {
2068
+ id: "clio-login",
2069
+ name: "Clio Target Auth & Setup",
2070
+ description: "Configure models, API keys, and target endpoints in terminal",
2071
+ type: "terminal",
2072
+ args: ["auth", "login"],
2073
+ },
2074
+ ],
1734
2075
  } satisfies AcpInitializeResponse;
1735
2076
  });
1736
2077
 
@@ -1767,6 +2108,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1767
2108
  };
1768
2109
  sessionCreated = true;
1769
2110
  sessions.set(id, session);
2111
+ boundSessionId = id;
1770
2112
  // NewSessionResponse is { sessionId, modes?, models?, _meta? }; cwd is not a
1771
2113
  // schema field. Clio runs a single-session-per-process server pinned to the
1772
2114
  // launch cwd, so no extra fields are needed.
@@ -1840,6 +2182,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1840
2182
  };
1841
2183
  sessionCreated = true;
1842
2184
  sessions.set(id, session);
2185
+ boundSessionId = id;
1843
2186
  for (const replayParams of replay.params) options.transport.notify("session/update", replayParams);
1844
2187
  return {
1845
2188
  _meta: {
@@ -1976,7 +2319,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1976
2319
  throw new AcpRequestError(-32602, "patch contains an unknown setting", { code: "invalid_params" });
1977
2320
  }
1978
2321
  switch (key) {
1979
- case "orchestrator.target": {
2322
+ case "chat.target": {
1980
2323
  if (value === null) {
1981
2324
  patch[key] = null;
1982
2325
  break;
@@ -1991,16 +2334,16 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
1991
2334
  patch[key] = target;
1992
2335
  break;
1993
2336
  }
1994
- case "orchestrator.model":
2337
+ case "chat.model":
1995
2338
  patch[key] = value === null ? null : requireBoundedClientString(value, key, ACP_MAX_MODEL_ID_BYTES);
1996
2339
  break;
1997
- case "orchestrator.thinkingLevel":
2340
+ case "chat.thinkingLevel":
1998
2341
  if (typeof value !== "string" || !ACP_THINKING_LEVELS.has(value as AcpThinkingLevel)) {
1999
2342
  throw new AcpRequestError(-32602, "invalid thinking level", { code: "invalid_params" });
2000
2343
  }
2001
2344
  patch[key] = value as AcpThinkingLevel;
2002
2345
  break;
2003
- case "autonomy":
2346
+ case "safety.autonomy":
2004
2347
  if (typeof value !== "string" || !ACP_AUTONOMY_LEVELS.has(value as AutonomyLevel)) {
2005
2348
  throw new AcpRequestError(-32602, "invalid autonomy level", { code: "invalid_params" });
2006
2349
  }
@@ -2009,8 +2352,8 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2009
2352
  }
2010
2353
  }
2011
2354
  const current = options.settings.read();
2012
- const nextTarget = patch["orchestrator.target"] === undefined ? current.target : patch["orchestrator.target"];
2013
- const nextModel = patch["orchestrator.model"] === undefined ? current.model : patch["orchestrator.model"];
2355
+ const nextTarget = patch["chat.target"] === undefined ? current.target : patch["chat.target"];
2356
+ const nextModel = patch["chat.model"] === undefined ? current.model : patch["chat.model"];
2014
2357
  if (nextTarget === null && nextModel !== null) {
2015
2358
  throw new AcpRequestError(-32602, "model requires a configured target", { code: "invalid_params" });
2016
2359
  }
@@ -2134,6 +2477,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2134
2477
  }
2135
2478
  if (options.session?.current()?.id === session.id) await options.session.close();
2136
2479
  sessions.delete(session.id);
2480
+ if (boundSessionId === session.id) boundSessionId = null;
2137
2481
  closedSessionIds.add(session.id);
2138
2482
  return {};
2139
2483
  });
@@ -2230,7 +2574,7 @@ export async function serveClioAcpAgent(options: ClioAcpServerOptions): Promise<
2230
2574
  return await new Promise<number>((resolve) => {
2231
2575
  options.transport.onClose(() => {
2232
2576
  permission.unregister();
2233
- unsubscribeLoopBlocked();
2577
+ unsubscribeEventStream();
2234
2578
  permission.cancelPending("ACP transport closed");
2235
2579
  for (const session of sessions.values()) cancelSession(session, "ACP transport closed");
2236
2580
  const inFlight = promptSettled;