@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,9 @@
1
1
  import { BusChannels } from "../core/bus-events.js";
2
2
  import type { SafeEventBus } from "../core/event-bus.js";
3
+ import { normalizeClioCoderEventRecord, normalizeClioCoderEventType } from "../core/naming-events.js";
3
4
  import type { DispatchContract } from "../domains/dispatch/contract.js";
4
5
  import { durableAssistantTextFromEvent } from "../domains/dispatch/event-pump.js";
6
+ import { defaultRunEventJournal, type RunEventJournalSink } from "../domains/dispatch/run-event-journal.js";
5
7
  import type { RunReceipt } from "../domains/dispatch/types.js";
6
8
  import { assistantTextFromEvent } from "./dispatch-event-text.js";
7
9
  import { truncateUtf8 } from "./truncate-utf8.js";
@@ -60,27 +62,113 @@ function isRecord(value: unknown): value is Record<string, unknown> {
60
62
  }
61
63
 
62
64
  function eventDetail(event: unknown): string | undefined {
63
- const text = assistantTextFromEvent(event);
65
+ const normalized = isRecord(event) ? normalizeClioCoderEventRecord(event) : event;
66
+ const text = assistantTextFromEvent(normalized);
64
67
  if (text.length > 0) return truncateUtf8(text, RUN_TAIL_TEXT_LIMIT, "...");
65
- if (!isRecord(event)) return undefined;
66
- if (event.type === "clio_tool_finish" && isRecord(event.payload)) {
67
- const tool = typeof event.payload.tool === "string" ? event.payload.tool : "tool";
68
- const outcome = typeof event.payload.outcome === "string" ? event.payload.outcome : "";
68
+ if (!isRecord(normalized)) return undefined;
69
+ if (normalized.type === "clio_coder_tool_finish" && isRecord(normalized.payload)) {
70
+ const tool = typeof normalized.payload.tool === "string" ? normalized.payload.tool : "tool";
71
+ const outcome = typeof normalized.payload.outcome === "string" ? normalized.payload.outcome : "";
69
72
  return `${tool} ${outcome}`.trim();
70
73
  }
71
- if (event.type === "attempt_start") {
72
- const attempt = typeof event.attempt === "number" ? event.attempt : "?";
73
- const runId = typeof event.runId === "string" ? event.runId : "?";
74
- const reason = typeof event.reason === "string" ? event.reason : "retry";
74
+ if (normalized.type === "attempt_start") {
75
+ const attempt = typeof normalized.attempt === "number" ? normalized.attempt : "?";
76
+ const runId = typeof normalized.runId === "string" ? normalized.runId : "?";
77
+ const reason = typeof normalized.reason === "string" ? normalized.reason : "retry";
75
78
  return truncateUtf8(`attempt ${attempt} -> ${runId}: ${reason}`, RUN_TAIL_TEXT_LIMIT, "...");
76
79
  }
77
80
  return undefined;
78
81
  }
79
82
 
80
- export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
83
+ /**
84
+ * Project one worker/ACP event into the display tail, or null when the event is
85
+ * not tail-visible. Heartbeats and streaming `message_update` increments are
86
+ * noise on a transcript: the tail keeps message boundaries, not deltas.
87
+ *
88
+ * The durable journal writes exactly this projection, so a transcript read back
89
+ * by `clio-coder fleet view` and the monitor's live peek cannot disagree about
90
+ * what a run did. Both the registry below and the domain-owned journal bridge
91
+ * (src/domains/dispatch/run-event-journal-bridge.ts) call it.
92
+ */
93
+ export function runTailEntryFromEvent(event: unknown, at: string = new Date().toISOString()): RunTailEntry | null {
94
+ const type = isRecord(event) && typeof event.type === "string" ? normalizeClioCoderEventType(event.type) : "unknown";
95
+ if (type === "heartbeat" || type === "message_update") return null;
96
+ const entry: RunTailEntry = { at, type };
97
+ const detail = eventDetail(event);
98
+ if (detail !== undefined) entry.detail = detail;
99
+ return entry;
100
+ }
101
+
102
+ export interface DispatchRunEventRegistryOptions {
103
+ /**
104
+ * Durable tee for the display tail. Omitted takes the process-wide default
105
+ * journal (settings-gated by `panes.journal`); `null` turns it off for this
106
+ * registry. This is the one wiring choke point: every registry in the
107
+ * process is built by this factory, so the sink attaches here rather than at
108
+ * each of the three construction sites that call it.
109
+ */
110
+ journal?: RunEventJournalSink | null;
111
+ }
112
+
113
+ /** Outcome recorded for a run whose completion rejected before a receipt existed. */
114
+ const REGISTRY_FAILURE_OUTCOME = "failed";
115
+ /** Outcome recorded when a receipt settled without a readable outcome field. */
116
+ const REGISTRY_UNKNOWN_OUTCOME = "unknown";
117
+
118
+ function errorText(error: unknown): string {
119
+ return error instanceof Error ? error.message : String(error);
120
+ }
121
+
122
+ export function createDispatchRunEventRegistry(
123
+ options: DispatchRunEventRegistryOptions = {},
124
+ ): DispatchRunEventRegistry {
81
125
  const runTails = new Map<string, RunTailState>();
82
126
  const activeRuns = new Set<string>();
83
127
  const activeBatches = new Set<string>();
128
+ const journal: RunEventJournalSink | null = options.journal === undefined ? defaultRunEventJournal() : options.journal;
129
+
130
+ /**
131
+ * Seal one logical run in the journal. `logicalRunId` is the id an operator
132
+ * asked about; a retried run's receipt carries the terminal attempt's id
133
+ * instead, and that only ever appears as a field on the line.
134
+ */
135
+ const journalSeal = (logicalRunId: string, receipt: RunReceipt): void => {
136
+ if (journal === null || !isRecord(receipt)) return;
137
+ // Every field is read defensively. The journal sits on the completion path
138
+ // of every dispatch, and a receipt that is missing a block it is typed to
139
+ // have (a stubbed contract, a truncated read) must degrade the transcript,
140
+ // never reject the completion the caller is awaiting.
141
+ const digest = receipt.integrity?.digest;
142
+ const outcome = typeof receipt.outcome === "string" ? receipt.outcome : REGISTRY_UNKNOWN_OUTCOME;
143
+ journal.receipt(logicalRunId, {
144
+ outcome,
145
+ exitCode: typeof receipt.exitCode === "number" ? receipt.exitCode : null,
146
+ ...(typeof digest === "string" ? { digest } : {}),
147
+ ...(receipt.runId !== logicalRunId ? { attemptRunId: receipt.runId } : {}),
148
+ });
149
+ journal.terminal(logicalRunId, outcome, receipt.outcomeDetail ?? undefined);
150
+ };
151
+
152
+ /**
153
+ * Seal a batch's journals. `assignmentIds` are the logical work ids in
154
+ * admission order and `dispatchBatch` resolves one receipt per request, so
155
+ * equal lengths pair by index. Anything else pairs by the receipt's own run
156
+ * id and leaves unmatched assignments without a terminal line rather than
157
+ * inventing an outcome for them.
158
+ */
159
+ const sealBatchJournals = (assignmentIds: ReadonlyArray<string>, receipts: ReadonlyArray<RunReceipt>): void => {
160
+ if (journal === null || !Array.isArray(receipts)) return;
161
+ if (assignmentIds.length === receipts.length) {
162
+ for (const [index, runId] of assignmentIds.entries()) {
163
+ const receipt = receipts[index];
164
+ if (receipt !== undefined) journalSeal(runId, receipt);
165
+ }
166
+ return;
167
+ }
168
+ for (const receipt of receipts) {
169
+ if (receipt != null && typeof receipt.runId === "string") journalSeal(receipt.runId, receipt);
170
+ }
171
+ };
84
172
 
85
173
  const pruneRunTails = (): void => {
86
174
  while (runTails.size > RUN_TAIL_RUN_LIMIT) {
@@ -97,19 +185,20 @@ export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
97
185
  };
98
186
 
99
187
  const recordRunEvent = (runId: string, agentId: string, event: unknown): void => {
100
- const type = isRecord(event) && typeof event.type === "string" ? event.type : "unknown";
101
- if (type === "heartbeat" || type === "message_update") return;
188
+ const entry = runTailEntryFromEvent(event);
189
+ if (entry === null) return;
102
190
  const state = runTails.get(runId) ?? { agentId, entries: [], lastSeenAt: Date.now() };
103
191
  state.lastSeenAt = Date.now();
104
- const entry: RunTailEntry = { at: new Date().toISOString(), type };
105
- const detail = eventDetail(event);
106
- if (detail !== undefined) entry.detail = detail;
107
192
  state.entries.push(entry);
108
193
  if (state.entries.length > RUN_TAIL_ENTRY_LIMIT) {
109
194
  state.entries.splice(0, state.entries.length - RUN_TAIL_ENTRY_LIMIT);
110
195
  }
111
196
  runTails.set(runId, state);
112
197
  pruneRunTails();
198
+ // The journal is a tee of exactly this projection, appended after the
199
+ // in-memory tail is already updated so a sink that degrades cannot change
200
+ // what `eventTail` returns.
201
+ journal?.append(runId, entry);
113
202
  };
114
203
 
115
204
  const drainSingle = async (
@@ -172,6 +261,7 @@ export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
172
261
  throw new Error(`dispatch event registry: run '${handle.runId}' is already registered`);
173
262
  }
174
263
  activeRuns.add(handle.runId);
264
+ journal?.open(handle.runId, agentId);
175
265
  const summaryPromise = drainSingle(handle.runId, agentId, handle.events, bus);
176
266
  const completion = Promise.allSettled([summaryPromise, handle.finalPromise]).then(
177
267
  ([summaryResult, receiptResult]) => {
@@ -180,12 +270,24 @@ export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
180
270
  return { receipt: receiptResult.value, summary: summaryResult.value };
181
271
  },
182
272
  );
183
- void completion
184
- .finally(() => {
185
- activeRuns.delete(handle.runId);
186
- pruneRunTails();
187
- })
188
- .catch(() => {});
273
+ // One subscription, not a `.then().finally()` chain. Chaining pushes the
274
+ // tail release a microtask later than it used to land, and a caller that
275
+ // awaits `completion` and then reads `eventTail` observes the run as
276
+ // still active. Journal and release settle together in this handler.
277
+ const releaseSingle = (): void => {
278
+ activeRuns.delete(handle.runId);
279
+ pruneRunTails();
280
+ };
281
+ void completion.then(
282
+ ({ receipt }) => {
283
+ journalSeal(handle.runId, receipt);
284
+ releaseSingle();
285
+ },
286
+ (error: unknown) => {
287
+ journal?.terminal(handle.runId, REGISTRY_FAILURE_OUTCOME, errorText(error));
288
+ releaseSingle();
289
+ },
290
+ );
189
291
  return { runId: handle.runId, completion };
190
292
  },
191
293
  registerBatch(handle, agentIds, bus) {
@@ -204,6 +306,9 @@ export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
204
306
  }
205
307
  activeBatches.add(handle.batchId);
206
308
  for (const runId of handle.assignmentIds) activeRuns.add(runId);
309
+ for (const [index, runId] of handle.assignmentIds.entries()) {
310
+ journal?.open(runId, agentIds[index] ?? "unknown");
311
+ }
207
312
  const completion = Promise.allSettled([drainBatch(handle.batchId, handle.events, bus), handle.finalPromise]).then(
208
313
  ([summariesResult, receiptsResult]) => {
209
314
  if (summariesResult.status === "rejected") throw summariesResult.reason;
@@ -211,13 +316,25 @@ export function createDispatchRunEventRegistry(): DispatchRunEventRegistry {
211
316
  return { receipts: receiptsResult.value, summaries: summariesResult.value };
212
317
  },
213
318
  );
214
- void completion
215
- .finally(() => {
216
- activeBatches.delete(handle.batchId);
217
- for (const runId of handle.assignmentIds) activeRuns.delete(runId);
218
- pruneRunTails();
219
- })
220
- .catch(() => {});
319
+ // Single subscription for the same reason as registerSingle above.
320
+ const releaseBatch = (): void => {
321
+ activeBatches.delete(handle.batchId);
322
+ for (const runId of handle.assignmentIds) activeRuns.delete(runId);
323
+ pruneRunTails();
324
+ };
325
+ void completion.then(
326
+ ({ receipts }) => {
327
+ sealBatchJournals(handle.assignmentIds, receipts);
328
+ releaseBatch();
329
+ },
330
+ (error: unknown) => {
331
+ const detail = errorText(error);
332
+ for (const runId of handle.assignmentIds) {
333
+ journal?.terminal(runId, REGISTRY_FAILURE_OUTCOME, detail);
334
+ }
335
+ releaseBatch();
336
+ },
337
+ );
221
338
  for (const [index, runId] of handle.assignmentIds.entries()) {
222
339
  if (!runTails.has(runId)) {
223
340
  runTails.set(runId, {
@@ -40,6 +40,7 @@ import {
40
40
  REVIEWER_GATE_PROMPT,
41
41
  renderCouncilVoteMemberTask,
42
42
  } from "../domains/dispatch/gate-role-prompts.js";
43
+ import { narrowDispatchIntentToReadOnly } from "../domains/dispatch/intent.js";
43
44
  import { renderDispatchReviewerTask } from "../domains/dispatch/intent-requirements.js";
44
45
  import { UNVERIFIABLE_RECEIPT_VERIFICATION } from "../domains/dispatch/receipt-findings.js";
45
46
  import { type ReceiptIntegrityResult, verifyReceiptIntegrity } from "../domains/dispatch/receipt-integrity.js";
@@ -56,7 +57,8 @@ import {
56
57
  claimCompeteGroup,
57
58
  cleanupCompeteGroup,
58
59
  commitCandidateWork,
59
- createCandidateWorktree,
60
+ competeBranchForCandidate,
61
+ createCandidateWorktreeMapped,
60
62
  isGitRepository,
61
63
  loadCompeteGroup,
62
64
  markCompeteGroupCleanupReady,
@@ -65,7 +67,7 @@ import {
65
67
  protectedPathsChangedByCompeteBranch,
66
68
  recoverCleanupReadyCompeteGroups,
67
69
  registerCompeteGroupRun,
68
- removeCandidateWorktree,
70
+ removeCandidateWorktreeMapped,
69
71
  settleCompeteGroupRun,
70
72
  settleRecoveredCompeteDecision,
71
73
  } from "./compete-worktrees.js";
@@ -963,6 +965,8 @@ function recoverPendingGateEvidence(deps: DispatchToolDeps): void {
963
965
  const pick = judged?.ok ? judged.result.winner : null;
964
966
  const pickedSubject = pick === null ? undefined : record.subjects[pick - 1];
965
967
  const candidateReceipt = pickedSubject === undefined ? null : readVerifiedGateReceipt(deps, pickedSubject.runId);
968
+ const root = record.resourceRoot ?? process.cwd();
969
+ const pickedBranch = pick === null ? null : competeBranchForCandidate(root, record.group, pick);
966
970
  if (pickedSubject !== undefined && candidateReceipt === null) {
967
971
  throw new Error(
968
972
  `pending compete decision ${record.id} has no verified candidate receipt for ${pickedSubject.runId}`,
@@ -970,11 +974,10 @@ function recoverPendingGateEvidence(deps: DispatchToolDeps): void {
970
974
  }
971
975
  let blockedProtected: string[] = [];
972
976
  if (pick !== null && pickedSubject !== undefined && candidateReceipt !== null) {
973
- const root = record.resourceRoot ?? process.cwd();
974
977
  const protectedPaths = deps.dispatch.protectedArtifactState?.().artifacts.map((artifact) => artifact.path) ?? [];
975
978
  blockedProtected = protectedPathsChangedByCompeteBranch(
976
979
  root,
977
- `clio/compete/${record.group}/${pick}`,
980
+ pickedBranch ?? `clio-coder/compete/${record.group}/${pick}`,
978
981
  protectedPaths,
979
982
  );
980
983
  }
@@ -984,7 +987,7 @@ function recoverPendingGateEvidence(deps: DispatchToolDeps): void {
984
987
  candidateReceipt !== null &&
985
988
  !isPipelineStepFailure(candidateReceipt) &&
986
989
  blockedProtected.length === 0;
987
- if (validWinner && pick !== null && pickedSubject !== undefined) {
990
+ if (validWinner && pick !== null && pickedSubject !== undefined && pickedBranch !== null) {
988
991
  draft = {
989
992
  group: record.group,
990
993
  topology: "compete",
@@ -996,7 +999,7 @@ function recoverPendingGateEvidence(deps: DispatchToolDeps): void {
996
999
  winner: {
997
1000
  index: pick,
998
1001
  subject: pickedSubject,
999
- branch: `clio/compete/${record.group}/${pick}`,
1002
+ branch: pickedBranch,
1000
1003
  },
1001
1004
  };
1002
1005
  } else {
@@ -1255,10 +1258,14 @@ async function runCompete(
1255
1258
  // every branch and worktree created below is covered by finalization.
1256
1259
  ownership = claimCompeteGroup(requestedRoot, group);
1257
1260
  const root = ownership.root;
1258
- const createCandidate = deps.competeWorktrees?.createCandidate ?? createCandidateWorktree;
1259
1261
  for (let index = 1; index <= compete.candidates; index += 1) {
1260
1262
  throwIfStopped();
1261
- worktrees.push(createCandidate(ownership, index, "HEAD"));
1263
+ const customCreate = deps.competeWorktrees?.createCandidate;
1264
+ worktrees.push(
1265
+ await (customCreate
1266
+ ? customCreate(ownership, index, "HEAD")
1267
+ : createCandidateWorktreeMapped(ownership, index, "HEAD", deps.competeWorktrees?.mux)),
1268
+ );
1262
1269
  }
1263
1270
 
1264
1271
  if (timeoutMs !== undefined) {
@@ -1287,7 +1294,12 @@ async function runCompete(
1287
1294
  executionRole: "builder",
1288
1295
  cwd: worktree.path,
1289
1296
  protectedArtifactRemap: { sourceRoot: root, workerRoot: worktree.path },
1290
- gate: { role: "candidate", group, cycle: worktree.index },
1297
+ gate: {
1298
+ role: "candidate",
1299
+ group,
1300
+ cycle: worktree.index,
1301
+ ...(worktree.provenance ? { worktree: worktree.provenance } : {}),
1302
+ },
1291
1303
  ledger,
1292
1304
  competeStance: COMPETE_STANCES[(worktree.index - 1) % COMPETE_STANCES.length] as CompeteStance,
1293
1305
  };
@@ -1523,7 +1535,7 @@ async function runCompete(
1523
1535
  for (const worktree of worktrees) {
1524
1536
  if (worktree.index === winnerAtFinalization.index) continue;
1525
1537
  try {
1526
- removeCandidateWorktree(ownership, worktree, true);
1538
+ await removeCandidateWorktreeMapped(ownership, worktree, true, deps.competeWorktrees?.mux);
1527
1539
  } catch (err) {
1528
1540
  finalizationErrors.push(err);
1529
1541
  }
@@ -1540,8 +1552,13 @@ async function runCompete(
1540
1552
  finalizationErrors.push(err);
1541
1553
  }
1542
1554
  try {
1555
+ if (deps.competeWorktrees?.mux) {
1556
+ for (const worktree of worktrees) {
1557
+ await removeCandidateWorktreeMapped(ownership, worktree, true, deps.competeWorktrees.mux);
1558
+ }
1559
+ }
1543
1560
  const cleanupGroup = deps.competeWorktrees?.cleanupGroup ?? cleanupCompeteGroup;
1544
- cleanupGroup(ownership);
1561
+ await cleanupGroup(ownership);
1545
1562
  } catch (err) {
1546
1563
  finalizationErrors.push(err);
1547
1564
  }
@@ -1584,9 +1601,12 @@ function runApplyWinner(
1584
1601
  };
1585
1602
  }
1586
1603
  const branch = input.branch;
1587
- const match = /^clio\/compete\/([A-Za-z0-9][A-Za-z0-9._-]{0,127})\/([1-9]\d*)$/.exec(branch);
1604
+ const match = /^(?:clio-coder|clio)\/compete\/([A-Za-z0-9][A-Za-z0-9._-]{0,127})\/([1-9]\d*)$/.exec(branch);
1588
1605
  if (!match) {
1589
- return { kind: "error", message: "dispatch: apply_winner.branch must be a clio/compete/<group>/<n> branch" };
1606
+ return {
1607
+ kind: "error",
1608
+ message: "dispatch: apply_winner.branch must be a clio-coder/compete/<group>/<n> branch",
1609
+ };
1590
1610
  }
1591
1611
  const group = match[1] ?? "";
1592
1612
  const winnerIndex = Number.parseInt(match[2] ?? "", 10);
@@ -1885,6 +1905,13 @@ async function runCouncil(
1885
1905
  executionRole: "researcher",
1886
1906
  autonomy: "read-only",
1887
1907
  toolProfile: "council-read-only",
1908
+ // Admission already demoted the caller's declared write roots to
1909
+ // read roots for every planned member, and the resolved-plan pin
1910
+ // below carries that narrowed intent in. Repeat it here so the
1911
+ // no-plan fallback path lands on the same request: a member spread
1912
+ // from `base` would otherwise inherit a write scope its read-only
1913
+ // autonomy cannot grant, and the two paths would disagree.
1914
+ ...(base.intent === undefined ? {} : { intent: narrowDispatchIntentToReadOnly(base.intent) }),
1888
1915
  // A vote is a majority over the members' verdict fields, so a vote
1889
1916
  // council asks each member for one and seals the ballot it asked
1890
1917
  // for. The seated recipe is untouched: the ask is a task suffix and
@@ -3,7 +3,13 @@ import type { AgentSpec } from "../domains/agents/spec.js";
3
3
  import type { DispatchContract, DispatchRequest } from "../domains/dispatch/contract.js";
4
4
  import type { AgentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
5
5
  import type { AutonomyLevel } from "../domains/safety/autonomy.js";
6
- import type { cleanupCompeteGroup, createCandidateWorktree, mergeWinnerBranch } from "./compete-worktrees.js";
6
+ import type {
7
+ CandidateWorktree,
8
+ CompeteGroupOwnership,
9
+ CompeteMuxWorktrees,
10
+ cleanupCompeteGroup,
11
+ mergeWinnerBranch,
12
+ } from "./compete-worktrees.js";
7
13
  import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
8
14
  import type { DispatchPlanView, ResolvedDispatchPlanArtifact } from "./dispatch-plan.js";
9
15
  import type { DispatchRunEventRegistry } from "./dispatch-run-events.js";
@@ -83,9 +89,15 @@ export interface DispatchToolDeps {
83
89
  background?: DispatchBackgroundRegistry;
84
90
  /** Optional compete storage overrides for alternate backends and deterministic fault tests. */
85
91
  competeWorktrees?: {
86
- createCandidate?: typeof createCandidateWorktree;
87
- cleanupGroup?: typeof cleanupCompeteGroup;
92
+ createCandidate?: (
93
+ ownership: CompeteGroupOwnership,
94
+ index: number,
95
+ baseline: string,
96
+ ) => CandidateWorktree | Promise<CandidateWorktree>;
97
+ cleanupGroup?: (...args: Parameters<typeof cleanupCompeteGroup>) => void | Promise<void>;
88
98
  mergeWinner?: typeof mergeWinnerBranch;
99
+ /** Optional herdr route; every operation retains native Git fallback. */
100
+ mux?: CompeteMuxWorktrees;
89
101
  };
90
102
  getAgentCatalog?: () => string;
91
103
  getAgentSpecs: () => ReadonlyArray<AgentSpec>;
@@ -80,7 +80,7 @@ const DispatchIntentSchema = Type.Object(
80
80
  {
81
81
  additionalProperties: false,
82
82
  description:
83
- "Typed repository-relative path and output intent. Verification checks are declared ids from package scripts or .clio-coder/verifiers.yaml, not shell commands.",
83
+ "Typed repository-relative path and output intent. Declare it on every dispatch: declared paths select the project rules that apply to them and pin worker context, and omitting it falls back to reading path-like tokens out of your task and briefing text, which can miss an applicable rule. Verification checks are declared ids from package scripts or .clio-coder/verifiers.yaml, not shell commands. In a batch, per-task intent narrows the top-level intent and is refused if it reaches outside it.",
84
84
  },
85
85
  );
86
86
 
@@ -252,7 +252,7 @@ export function createDispatchTool(
252
252
  apply_winner: Type.Optional(
253
253
  Type.Object(
254
254
  {
255
- branch: Type.String({ description: "Preserved winner branch: clio/compete/<group>/<n>." }),
255
+ branch: Type.String({ description: "Preserved winner branch: clio-coder/compete/<group>/<n>." }),
256
256
  cwd: Type.Optional(Type.String({ description: "Repository root (default: current directory)." })),
257
257
  },
258
258
  {
@@ -1,17 +1,4 @@
1
- import { statSync } from "node:fs";
2
- import { delimiter, join } from "node:path";
3
-
4
- function findExecutableOnPath(name: string): string | null {
5
- const pathEnv = process.env.PATH;
6
- if (!pathEnv) return null;
7
- for (const dir of pathEnv.split(delimiter)) {
8
- if (!dir) continue;
9
- const candidate = join(dir, name);
10
- const stat = statSync(candidate, { throwIfNoEntry: false });
11
- if (stat?.isFile() && (stat.mode & 0o111) !== 0) return candidate;
12
- }
13
- return null;
14
- }
1
+ import { findExecutableOnPath, resolveToolBinary } from "../domains/toolchain/resolve.js";
15
2
 
16
3
  export function resolveFdBinary(): string | null {
17
4
  return findExecutableOnPath("fd") ?? findExecutableOnPath("fdfind");
@@ -20,3 +7,19 @@ export function resolveFdBinary(): string | null {
20
7
  export function resolveRgBinary(): string | null {
21
8
  return findExecutableOnPath("rg");
22
9
  }
10
+
11
+ /**
12
+ * Resolve any executable Clio might run, through the toolchain ladder.
13
+ *
14
+ * For a name in the pinned registry the answer is PATH when the copy there
15
+ * clears the pin's floor, then Clio's vendored copy, then null. For anything
16
+ * else it is a plain PATH lookup, which is what `resolveFdBinary` and
17
+ * `resolveRgBinary` above already do for the two search tools Clio never
18
+ * vendors.
19
+ *
20
+ * Callers that need to explain the answer (doctor, `clio-coder tools status`)
21
+ * want `resolveToolBinary` instead: this returns only the path to run.
22
+ */
23
+ export function resolveBinary(name: string): string | null {
24
+ return resolveToolBinary(name).binaryPath;
25
+ }
package/src/tools/find.ts CHANGED
@@ -31,12 +31,7 @@ type FindOrder = "path" | "mtime";
31
31
  // Build fd's argv. Ignore semantics (hidden files, .gitignore honoring,
32
32
  // generated-dir excludes, include_ignored) come entirely from the shared
33
33
  // ignore policy so grep and find never disagree about tree visibility.
34
- export function buildFdArgs(
35
- pattern: string,
36
- searchPath: string,
37
- maxResults: number,
38
- includeIgnored: boolean,
39
- ): string[] {
34
+ function buildFdArgs(pattern: string, searchPath: string, maxResults: number, includeIgnored: boolean): string[] {
40
35
  const args = ["--glob", "--color=never", ...fdIgnoreArgs(searchPath, includeIgnored)];
41
36
  args.push("--max-results", String(maxResults));
42
37
  let effectivePattern = pattern;
@@ -214,16 +214,16 @@ const TOOLS_MAX_BYTES = 8 * 1024;
214
214
  const TOOLS_ARGUMENTS_CHARS = 160;
215
215
 
216
216
  /**
217
- * Tail event types that describe one tool call. `clio_tool_finish` is the
217
+ * Tail event types that describe one tool call. `clio_coder_tool_finish` is the
218
218
  * authoritative per-call outcome (it distinguishes a permission block from a
219
219
  * command that ran and exited nonzero); the engine's own `tool_execution_end`
220
220
  * is kept only when the tail recorded a detail for it, since a bare type line
221
221
  * says nothing the finish event does not.
222
222
  */
223
223
  const TOOL_CALL_EVENT_TYPES: ReadonlySet<string> = new Set([
224
- "clio_tool_finish",
225
- "clio_permission_resolved",
226
- "clio_permission_escalated",
224
+ "clio_coder_tool_finish",
225
+ "clio_coder_permission_resolved",
226
+ "clio_coder_permission_escalated",
227
227
  ]);
228
228
 
229
229
  function toolCallLines(entries: ReadonlyArray<{ at: string; type: string; detail?: string }>): string[] {
@@ -70,9 +70,29 @@ export const OBSERVATION_TURN_BUDGET_ENV = GUARDRAIL_ENV_VARS.observationTurnBud
70
70
  const MIN_BUDGET_SLICE_BYTES = 1024;
71
71
  const BUDGET_TRACK_LIMIT = 256;
72
72
 
73
+ /**
74
+ * How many exhausted-pool notices one turn gets before the next such call fails
75
+ * terminally instead of returning a retryable notice.
76
+ *
77
+ * Smoke pass 2 (G2) watched a 9B local model re-issue the identical read about
78
+ * twenty times against the same 208-byte notice, until the unrelated tool-call
79
+ * budget stopped it. The notice cannot become un-retryable by wording alone: a
80
+ * `kind:"ok"` result is an invitation to try again.
81
+ *
82
+ * Three is the smallest count that still lets a model learn the shape from the
83
+ * notice itself. The pool is shared by six OBSERVE tools, so a model that reads,
84
+ * then greps narrower, then lists, has spent three honest attempts at the advice
85
+ * the notice gives. A fourth consecutive exhausted call is evidence the advice
86
+ * is not landing, and it fails. Waste is bounded at four calls out of the 60-call
87
+ * turn budget instead of twenty.
88
+ */
89
+ const MAX_EXHAUSTED_NOTICES_PER_TURN = 3;
90
+
73
91
  interface TurnBudgetState {
74
92
  usedBytes: number;
75
93
  lastSeenAt: number;
94
+ /** Consecutive exhausted-pool short-circuits; reset by any call that got a slice. */
95
+ exhaustedStreak: number;
76
96
  }
77
97
 
78
98
  const turnBudgets = new Map<string, TurnBudgetState>();
@@ -156,7 +176,7 @@ export function reserveObservation(selfCapBytes: number, options?: ToolInvokeOpt
156
176
  };
157
177
  }
158
178
  const limitBytes = observationTurnBudgetLimit();
159
- const state = turnBudgets.get(key) ?? { usedBytes: 0, lastSeenAt: Date.now() };
179
+ const state = turnBudgets.get(key) ?? { usedBytes: 0, lastSeenAt: Date.now(), exhaustedStreak: 0 };
160
180
  state.lastSeenAt = Date.now();
161
181
  turnBudgets.set(key, state);
162
182
  pruneBudgetMap();
@@ -174,6 +194,9 @@ export function reserveObservation(selfCapBytes: number, options?: ToolInvokeOpt
174
194
  settled: false,
175
195
  };
176
196
  }
197
+ // A call that got a slice is progress, so the exhausted streak starts over.
198
+ // Only an unbroken run of short-circuits reaches the terminal failure.
199
+ state.exhaustedStreak = 0;
177
200
  const callCapBytes = Math.min(selfCapBytes, remaining);
178
201
  return {
179
202
  key,
@@ -203,6 +226,7 @@ export function commitObservationReservation(reservation: ObservationReservation
203
226
  const state = turnBudgets.get(reservation.key) ?? {
204
227
  usedBytes: reservation.usedBeforeBytes,
205
228
  lastSeenAt: Date.now(),
229
+ exhaustedStreak: 0,
206
230
  };
207
231
  state.usedBytes += reservation.callCapBytes;
208
232
  state.lastSeenAt = Date.now();
@@ -237,6 +261,7 @@ function recordSpentBytes(reservation: ObservationReservation, bytes: number): v
237
261
  const state = turnBudgets.get(reservation.key) ?? {
238
262
  usedBytes: reservation.usedBeforeBytes + committedBytes,
239
263
  lastSeenAt: Date.now(),
264
+ exhaustedStreak: 0,
240
265
  };
241
266
  state.usedBytes = Math.max(0, state.usedBytes + bytes - committedBytes);
242
267
  state.lastSeenAt = Date.now();
@@ -252,10 +277,26 @@ function budgetDetails(reservation: ObservationReservation): ObservationBudgetDe
252
277
  };
253
278
  }
254
279
 
280
+ /** Count this short-circuit against the turn's run of them. Untracked calls never escalate. */
281
+ function bumpExhaustedStreak(key: string | null): number {
282
+ if (key === null) return 1;
283
+ const state = turnBudgets.get(key);
284
+ if (state === undefined) return 1;
285
+ state.exhaustedStreak += 1;
286
+ state.lastSeenAt = Date.now();
287
+ turnBudgets.set(key, state);
288
+ return state.exhaustedStreak;
289
+ }
290
+
255
291
  /**
256
292
  * Structured result for a call that found the turn pool already spent.
257
293
  * `subject` names what the call was about (a path, a pattern); `hint` names
258
294
  * the narrowing arguments the tool supports.
295
+ *
296
+ * The first few such calls get the notice, which states the numbers and the
297
+ * narrowing advice. Past MAX_EXHAUSTED_NOTICES_PER_TURN the call fails instead:
298
+ * nothing this turn can return content, so an `ok` result is an invitation to a
299
+ * retry loop the pool can never satisfy.
259
300
  */
260
301
  export function observationBudgetExhausted(input: {
261
302
  tool: string;
@@ -265,9 +306,18 @@ export function observationBudgetExhausted(input: {
265
306
  hint: string;
266
307
  }): ToolResult {
267
308
  const { tool, unit, reservation, subject, hint } = input;
268
- const output = `[observation budget exhausted for this turn before ${tool} ${subject}: ${formatSize(
269
- reservation.usedBeforeBytes,
270
- )} already returned of ${formatSize(reservation.limitBytes)}. ${hint}]`;
309
+ const streak = bumpExhaustedStreak(reservation.key);
310
+ const spent = `${formatSize(reservation.usedBeforeBytes)} already returned of ${formatSize(reservation.limitBytes)}`;
311
+ if (streak > MAX_EXHAUSTED_NOTICES_PER_TURN) {
312
+ const message =
313
+ `observation budget exhausted for this turn before ${tool} ${subject}: ${spent}. ` +
314
+ `This is the ${streak}th call to hit it, so no observation tool can return content until the ` +
315
+ `next turn. Do not retry this call and do not substitute another one. Re-plan with what you ` +
316
+ `already have: say what you found, name what is still unread, and propose the next step.`;
317
+ recordSpentBytes(reservation, byteLength(message));
318
+ return { kind: "error", message };
319
+ }
320
+ const output = `[observation budget exhausted for this turn before ${tool} ${subject}: ${spent}. ${hint}]`;
271
321
  const shownBytes = byteLength(output);
272
322
  recordSpentBytes(reservation, shownBytes);
273
323
  const budget = budgetDetails(reservation);
@@ -44,39 +44,6 @@ export interface FileMutationEvent {
44
44
  toolName: string;
45
45
  }
46
46
 
47
- /**
48
- * Defers file-mutation sinks off the after_tool hot path and coalesces rapid
49
- * events into one best-effort batch. Lifecycle-owned sinks that must drain at
50
- * shutdown should admit work synchronously instead of using this convenience.
51
- */
52
- export function coalescePathSink(sink: (paths: string[]) => void): (event: FileMutationEvent) => void {
53
- const pending = new Set<string>();
54
- let flushScheduled = false;
55
-
56
- const scheduleFlush = (): void => {
57
- if (flushScheduled) return;
58
- flushScheduled = true;
59
- setImmediate(() => {
60
- flushScheduled = false;
61
- if (pending.size === 0) return;
62
- const paths = [...pending];
63
- pending.clear();
64
- try {
65
- sink(paths);
66
- } catch {
67
- // Incremental indexing is best-effort and must not change tool execution.
68
- }
69
- if (pending.size > 0) scheduleFlush();
70
- });
71
- };
72
-
73
- return (event) => {
74
- if (event.paths.length === 0) return;
75
- for (const path of event.paths) pending.add(path);
76
- scheduleFlush();
77
- };
78
- }
79
-
80
47
  /** Notifies the caller after a successful file-mutating tool, for incremental indexing. */
81
48
  export function createFileMutationObserver(sink: (event: FileMutationEvent) => void): MiddlewareHookRegistration {
82
49
  return {