@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
@@ -0,0 +1,218 @@
1
+ import { readdirSync, rmdirSync, rmSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { toolchainRoot } from "./paths.js";
4
+ import { findPinnedTool } from "./registry.js";
5
+
6
+ /**
7
+ * Deleting vendored installs, and pruning the versions a pin bump superseded.
8
+ *
9
+ * Everything here only ever unlinks inside `<data>/tools/<id>/`, a directory
10
+ * Clio created by downloading it, so nothing an operator wrote is reachable
11
+ * from this file. That is what makes removal safe without a confirmation
12
+ * prompt: the worst outcome is a re-download of bytes the registry pins by
13
+ * checksum anyway.
14
+ *
15
+ * Version directories are the only thing considered. A name starting with `.`
16
+ * is an installer's staging or retired directory (`.<version>.incomplete-`,
17
+ * `.<version>.replaced-`), and a prune that raced an install and deleted one
18
+ * would corrupt that install. A full remove is different: it takes the whole
19
+ * `<id>` tree because no install of that tool is meant to survive it.
20
+ *
21
+ * A staging directory old enough to be dead is swept anyway. A killed install
22
+ * used to leave one behind permanently, invisible to every verb and reachable
23
+ * only by an operator who went reading under the data root.
24
+ */
25
+
26
+ export interface ToolRemoveOptions {
27
+ /** Vendor root override. Defaults to the data root's `tools` directory. */
28
+ root?: string;
29
+ /**
30
+ * How old a staging directory must be before it counts as abandoned.
31
+ * Defaults to `STALE_STAGING_MS`. Tests set it; nothing else should need to.
32
+ */
33
+ staleStagingMs?: number;
34
+ }
35
+
36
+ /**
37
+ * How long a staging directory may sit before a sweep treats it as dead.
38
+ *
39
+ * The window is far shorter than it looks. `installPinnedTool` downloads every
40
+ * asset and verifies every checksum *before* it creates the staging directory,
41
+ * so that directory's whole life is a handful of local file writes and two
42
+ * renames: sub-second normally, seconds on a struggling disk. An hour is twelve
43
+ * times the installer's own per-asset download timeout and orders of magnitude
44
+ * past the writes, which leaves no plausible live install inside it.
45
+ *
46
+ * The pid in the name is deliberately not consulted. Pids are reused, a pid
47
+ * belonging to another user answers a liveness probe with EPERM rather than an
48
+ * honest yes or no, and a data root shared over a network filesystem makes the
49
+ * number meaningless. Age is the one signal that means the same thing
50
+ * everywhere.
51
+ */
52
+ export const STALE_STAGING_MS = 3_600_000;
53
+
54
+ /** What one sweep of a tool's directory deleted, and what it could not. */
55
+ export interface ToolRemoveResult {
56
+ ok: boolean;
57
+ id: string;
58
+ /** `<root>/<id>`, whether or not it exists. */
59
+ dir: string;
60
+ /** Version directories this sweep deleted, oldest name first. */
61
+ removed: string[];
62
+ /** Version directories that survived a delete attempt, with the reason. */
63
+ failed: ReadonlyArray<{ version: string; error: string }>;
64
+ /** Abandoned staging directories this sweep collected, by name. */
65
+ staleStaging: string[];
66
+ message: string;
67
+ }
68
+
69
+ /** Version directories currently installed for a tool, sorted. */
70
+ export function installedToolVersions(id: string, options: ToolRemoveOptions = {}): string[] {
71
+ const dir = join(options.root ?? toolchainRoot(), id);
72
+ let names: string[];
73
+ try {
74
+ names = readdirSync(dir);
75
+ } catch {
76
+ // A tool nobody ever installed has no directory, which is not an error:
77
+ // the answer to "which versions are installed" is none.
78
+ return [];
79
+ }
80
+ return names
81
+ .filter((name) => !name.startsWith(".") && isDirectory(join(dir, name)))
82
+ .sort((a, b) => a.localeCompare(b));
83
+ }
84
+
85
+ /**
86
+ * Delete every vendored version of a tool, then the tool's own directory.
87
+ *
88
+ * A tool with nothing installed is a no-op that reports success: the operator
89
+ * asked for a state ("this tool is not vendored") that already holds, and
90
+ * failing them for it would make the verb unusable in a script.
91
+ */
92
+ export function removeTool(id: string, options: ToolRemoveOptions = {}): ToolRemoveResult {
93
+ if (findPinnedTool(id) === null) {
94
+ const dir = join(options.root ?? toolchainRoot(), id);
95
+ return { ok: false, id, dir, removed: [], failed: [], staleStaging: [], message: `unknown tool: ${id}` };
96
+ }
97
+ return removeVersions(id, null, options);
98
+ }
99
+
100
+ /**
101
+ * Delete every vendored version of a tool except `keep`.
102
+ *
103
+ * Called by the installer once a version is in place, so a pin bump leaves one
104
+ * version directory behind rather than one per version the machine ever ran.
105
+ * The kept version is not required to exist: pruning to a version that is not
106
+ * installed empties the tool, which is what `--force` recovery wants.
107
+ */
108
+ export function pruneSupersededVersions(id: string, keep: string, options: ToolRemoveOptions = {}): ToolRemoveResult {
109
+ return removeVersions(id, keep, options);
110
+ }
111
+
112
+ function removeVersions(id: string, keep: string | null, options: ToolRemoveOptions): ToolRemoveResult {
113
+ const root = options.root ?? toolchainRoot();
114
+ const dir = join(root, id);
115
+ const versions = installedToolVersions(id, { root }).filter((version) => version !== keep);
116
+ const removed: string[] = [];
117
+ const failed: { version: string; error: string }[] = [];
118
+ for (const version of versions) {
119
+ try {
120
+ rmSync(join(dir, version), { recursive: true, force: true });
121
+ removed.push(version);
122
+ } catch (error) {
123
+ failed.push({ version, error: error instanceof Error ? error.message : String(error) });
124
+ }
125
+ }
126
+ // Before the rmdir below, so an install killed weeks ago cannot keep the tool
127
+ // directory alive after every version of it is gone.
128
+ const staleStaging = sweepStaleStaging(dir, options.staleStagingMs ?? STALE_STAGING_MS);
129
+ if (keep === null && failed.length === 0) {
130
+ // The tool is gone, so its directory is litter. `rmdir` takes it only when
131
+ // it is empty, so a staging directory young enough to belong to a running
132
+ // installer makes this fail instead of destroying that install.
133
+ try {
134
+ rmdirSync(dir);
135
+ } catch {
136
+ // Either it was never there or something still lives in it. Neither
137
+ // changes what this call promised: no version of the tool remains.
138
+ }
139
+ }
140
+ return {
141
+ ok: failed.length === 0,
142
+ id,
143
+ dir,
144
+ removed,
145
+ failed,
146
+ staleStaging,
147
+ message: describeRemoval(id, dir, keep, removed, failed, staleStaging),
148
+ };
149
+ }
150
+
151
+ /**
152
+ * Delete the abandoned staging directories under one tool.
153
+ *
154
+ * Only names the installer produces are considered, so an operator who parked
155
+ * something of their own under `<data>/tools/<id>` with a leading dot keeps it.
156
+ * A directory whose age cannot be read is left alone: an unreadable stat is not
157
+ * evidence of death.
158
+ */
159
+ function sweepStaleStaging(dir: string, staleMs: number): string[] {
160
+ let names: string[];
161
+ try {
162
+ names = readdirSync(dir);
163
+ } catch {
164
+ return [];
165
+ }
166
+ const cutoff = Date.now() - staleMs;
167
+ const swept: string[] = [];
168
+ for (const name of names.sort((a, b) => a.localeCompare(b))) {
169
+ if (!STAGING_NAME.test(name)) continue;
170
+ const stat = statSync(join(dir, name), { throwIfNoEntry: false });
171
+ if (stat === undefined || !stat.isDirectory() || stat.mtimeMs > cutoff) continue;
172
+ try {
173
+ rmSync(join(dir, name), { recursive: true, force: true });
174
+ swept.push(name);
175
+ } catch {
176
+ // A staging directory that resists deletion is litter, not a failure:
177
+ // nothing resolves it, and reporting it would turn a successful install
178
+ // into a failed one over a directory the ladder never looks at.
179
+ }
180
+ }
181
+ return swept;
182
+ }
183
+
184
+ /** `.<version>.incomplete-<pid>-<t>` and `.<version>.replaced-<pid>-<t>`. */
185
+ const STAGING_NAME = /^\.[^/]+\.(?:incomplete|replaced)-\d+-[a-z0-9]+$/;
186
+
187
+ function describeRemoval(
188
+ id: string,
189
+ dir: string,
190
+ keep: string | null,
191
+ removed: ReadonlyArray<string>,
192
+ failed: ReadonlyArray<{ version: string; error: string }>,
193
+ staleStaging: ReadonlyArray<string>,
194
+ ): string {
195
+ // Reported as a suffix rather than as the headline: an abandoned staging
196
+ // directory is housekeeping, and the operator asked about versions.
197
+ const swept =
198
+ staleStaging.length === 0
199
+ ? ""
200
+ : `; swept ${staleStaging.length} abandoned install ${staleStaging.length === 1 ? "directory" : "directories"}`;
201
+ const trouble = failed.map((entry) => `${entry.version} (${entry.error})`).join(", ");
202
+ if (failed.length > 0) {
203
+ const done = removed.length > 0 ? `removed ${removed.join(", ")}; ` : "";
204
+ return `${done}could not remove ${id} ${trouble} under ${dir}${swept}`;
205
+ }
206
+ if (removed.length === 0) {
207
+ return keep === null
208
+ ? `${id} is not installed under ${dir}; nothing to remove${swept}`
209
+ : `${id} has no superseded versions under ${dir}${swept}`;
210
+ }
211
+ const what = `${id} ${removed.join(", ")}`;
212
+ const headline = keep === null ? `removed ${what} from ${dir}` : `pruned ${what} from ${dir}, keeping ${keep}`;
213
+ return `${headline}${swept}`;
214
+ }
215
+
216
+ function isDirectory(path: string): boolean {
217
+ return statSync(path, { throwIfNoEntry: false })?.isDirectory() === true;
218
+ }
@@ -0,0 +1,182 @@
1
+ import { statSync } from "node:fs";
2
+ import { delimiter, join } from "node:path";
3
+ import { toolVersionDir, vendoredBinaryPath } from "./paths.js";
4
+ import { currentToolPlatform, findPinnedTool, findPinnedToolByBinary, PINNED_TOOLS } from "./registry.js";
5
+ import type { PinnedTool, ToolPathCandidate, ToolResolution, ToolStatus } from "./types.js";
6
+ import { probeBinaryVersion, satisfiesMinimum } from "./version.js";
7
+
8
+ /**
9
+ * The shared resolution ladder: PATH, then the vendored pin, then nothing.
10
+ *
11
+ * PATH comes first because a tool the operator installed themselves is the one
12
+ * they maintain, and Clio downloading a second copy of a program already on the
13
+ * machine is a surprise. It only wins when its version clears the registry's
14
+ * floor, because the alternative is Clio driving a surface that release does not
15
+ * have and reporting the resulting failure as a bug in the feature.
16
+ *
17
+ * Nothing here downloads, spawns a server, or writes to disk. It is safe on the
18
+ * interactive startup path and inside doctor, both of which promise to create
19
+ * nothing.
20
+ */
21
+
22
+ /** First executable named `name` on PATH, or null. */
23
+ export function findExecutableOnPath(name: string): string | null {
24
+ const pathEnv = process.env.PATH;
25
+ if (!pathEnv) return null;
26
+ const candidates = process.platform === "win32" ? [`${name}.exe`, name] : [name];
27
+ for (const dir of pathEnv.split(delimiter)) {
28
+ if (!dir) continue;
29
+ for (const candidate of candidates) {
30
+ const full = join(dir, candidate);
31
+ const stat = statSync(full, { throwIfNoEntry: false });
32
+ if (stat?.isFile() && (process.platform === "win32" || (stat.mode & 0o111) !== 0)) return full;
33
+ }
34
+ }
35
+ return null;
36
+ }
37
+
38
+ /**
39
+ * Resolve one executable name through the ladder.
40
+ *
41
+ * A name that is not in the registry gets a plain PATH lookup: there is no pin
42
+ * to compare against and nothing vendored to fall back to, so the answer is
43
+ * whatever PATH says.
44
+ */
45
+ export function resolveToolBinary(name: string): ToolResolution {
46
+ const entry = findPinnedToolByBinary(name) ?? findPinnedTool(name);
47
+ if (entry === null) {
48
+ const found = findExecutableOnPath(name);
49
+ return {
50
+ source: found === null ? "none" : "path",
51
+ binaryPath: found,
52
+ version: null,
53
+ entry: null,
54
+ pathCandidate: found === null ? null : { path: found, version: null, satisfiesMinimum: true },
55
+ vendoredPath: null,
56
+ };
57
+ }
58
+ // An entry asked for by tool id resolves its primary binary; asked for by
59
+ // binary name it resolves that binary, so `ya` does not silently become `yazi`.
60
+ const binary = entry.binaries.includes(name) ? name : entry.primaryBinary;
61
+ return resolveEntryBinary(entry, binary);
62
+ }
63
+
64
+ /** The ladder for a known registry row and one of its binaries. */
65
+ export function resolveEntryBinary(entry: PinnedTool, binary: string): ToolResolution {
66
+ const pathCandidate = probePathCandidate(entry, binary);
67
+ const vendored = vendoredBinaryPath(entry.id, entry.version, binary);
68
+ const vendoredStat = statSync(vendored, { throwIfNoEntry: false });
69
+ const vendoredPath = vendoredStat?.isFile() ? vendored : null;
70
+
71
+ if (pathCandidate?.satisfiesMinimum) {
72
+ return {
73
+ source: "path",
74
+ binaryPath: pathCandidate.path,
75
+ version: pathCandidate.version,
76
+ entry,
77
+ pathCandidate,
78
+ vendoredPath,
79
+ };
80
+ }
81
+ if (vendoredPath !== null) {
82
+ return {
83
+ source: "vendored",
84
+ binaryPath: vendoredPath,
85
+ version: entry.version,
86
+ entry,
87
+ pathCandidate,
88
+ vendoredPath,
89
+ };
90
+ }
91
+ return { source: "none", binaryPath: null, version: null, entry, pathCandidate, vendoredPath: null };
92
+ }
93
+
94
+ /** Per-entry state for the CLI and doctor. */
95
+ export function toolStatus(entry: PinnedTool): ToolStatus {
96
+ const platform = currentToolPlatform();
97
+ const supported = platform !== null && entry.downloads[platform] !== undefined;
98
+ const resolution = resolveEntryBinary(entry, entry.primaryBinary);
99
+ return {
100
+ id: entry.id,
101
+ version: entry.version,
102
+ license: entry.license,
103
+ platform,
104
+ supported,
105
+ installed: resolution.vendoredPath !== null,
106
+ installDir: toolVersionDir(entry.id, entry.version),
107
+ resolution,
108
+ };
109
+ }
110
+
111
+ /** Per-entry state for every row, in registry order. */
112
+ export function toolStatuses(): ToolStatus[] {
113
+ return PINNED_TOOLS.map((entry) => toolStatus(entry));
114
+ }
115
+
116
+ /** The one command that fixes a tool Clio cannot resolve. */
117
+ export function installRemedy(id: string): string {
118
+ return `clio-coder tools install ${id}`;
119
+ }
120
+
121
+ /**
122
+ * What a rejected PATH copy was, and which floor it failed. Null when there is
123
+ * no PATH copy or when the one there was accepted.
124
+ *
125
+ * The floors are deliberately conservative: they sit at the pin for herdr and
126
+ * yazi because Clio drives socket and plugin surfaces verified against only
127
+ * that release. That is a defensible choice and a costly one, since it rejects
128
+ * binaries an operator installed themselves and that mostly work. The cost is
129
+ * only payable if the rejection is legible, so every renderer of a rejection
130
+ * names the path, the version found, and the floor it missed, and never reports
131
+ * a rejected copy as an absent one.
132
+ */
133
+ export function describeFloorRejection(status: ToolStatus): string | null {
134
+ const candidate = status.resolution.pathCandidate;
135
+ if (candidate === null || candidate.satisfiesMinimum) return null;
136
+ const floor = status.resolution.entry?.minimumVersion ?? status.version;
137
+ const found = candidate.version === null ? "an unreadable version" : candidate.version;
138
+ return `PATH copy ${candidate.path} is ${found}, below the ${floor} floor`;
139
+ }
140
+
141
+ /**
142
+ * One sentence describing where a tool resolved and how its version compares to
143
+ * the pin. Shared by `clio-coder tools status` and the doctor rows so the two
144
+ * cannot drift into describing the same machine differently.
145
+ */
146
+ export function describeResolution(status: ToolStatus): string {
147
+ const { resolution } = status;
148
+ const rejection = describeFloorRejection(status);
149
+ if (resolution.source === "path") {
150
+ const version = resolution.version ?? "unreadable version";
151
+ return `PATH ${resolution.binaryPath} (${version}, pin ${status.version})`;
152
+ }
153
+ if (resolution.source === "vendored") {
154
+ // The remedy is deliberately absent here. The rejection cost the operator
155
+ // nothing: Clio has a copy at the pin and is running it, and printing an
156
+ // install command that would change nothing is its own kind of dishonesty.
157
+ const rejected = rejection === null ? "" : `; ${rejection}, so Clio runs the vendored copy`;
158
+ return `vendored ${resolution.binaryPath} (${status.version})${rejected}`;
159
+ }
160
+ if (!status.supported) {
161
+ const platform = status.platform ?? `${process.platform}-${process.arch}`;
162
+ // No remedy either: there is no asset to install on this machine, so the
163
+ // rejection is the whole story and naming a command would be a dead end.
164
+ const rejected = rejection === null ? "" : `; ${rejection}`;
165
+ return `not installed and no pinned asset for this platform (${platform})${rejected}`;
166
+ }
167
+ if (rejection !== null) {
168
+ return `${rejection}, and nothing is vendored (install with \`${installRemedy(status.id)}\`)`;
169
+ }
170
+ return `not found (install with \`${installRemedy(status.id)}\`)`;
171
+ }
172
+
173
+ function probePathCandidate(entry: PinnedTool, binary: string): ToolPathCandidate | null {
174
+ const found = findExecutableOnPath(binary);
175
+ if (found === null) return null;
176
+ // The floor is a property of the tool, and only the primary binary is asked
177
+ // for its version, so a secondary binary inherits the primary's verdict from
178
+ // the same install root rather than being probed with flags it may not have.
179
+ const probeTarget = binary === entry.primaryBinary ? found : (findExecutableOnPath(entry.primaryBinary) ?? found);
180
+ const version = probeBinaryVersion(probeTarget, entry.versionArgs);
181
+ return { path: found, version, satisfiesMinimum: satisfiesMinimum(version, entry.minimumVersion) };
182
+ }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Shapes for the pinned external-tool registry.
3
+ *
4
+ * Clio uses a handful of third-party terminal programs (a pane multiplexer, a
5
+ * file manager, a transfer tool). None of them is a dependency of the product:
6
+ * every consumer degrades when the tool is absent. What the registry adds is a
7
+ * single place where each tool's exact version, download location, checksum,
8
+ * license, and acceptable PATH floor are written down, so an install is
9
+ * reproducible and an operator can see which copy Clio would actually run.
10
+ */
11
+
12
+ /** Platforms the registry can describe a download for. */
13
+ export type ToolPlatform = "linux-x64" | "linux-arm64" | "darwin-x64" | "darwin-arm64" | "win32-x64";
14
+
15
+ /** How a downloaded asset is packed. `raw` is a bare executable. */
16
+ export type ToolArchiveKind = "raw" | "zip" | "tar.gz";
17
+
18
+ /**
19
+ * One platform's asset for one pinned tool.
20
+ *
21
+ * `sha256` is the hash of the asset exactly as downloaded, before any
22
+ * unpacking, so the verification happens on the bytes that crossed the network
23
+ * rather than on whatever an extractor produced from them.
24
+ */
25
+ export interface PinnedToolDownload {
26
+ url: string;
27
+ sha256: string;
28
+ archive: ToolArchiveKind;
29
+ /**
30
+ * Binary name to its path inside the archive. A `raw` download has exactly
31
+ * one entry whose value is the empty string: the asset is the binary.
32
+ */
33
+ binaryMembers: Readonly<Record<string, string>>;
34
+ /**
35
+ * Files copied beside the binaries, given as paths inside the archive. This
36
+ * is where a tool's own LICENSE comes from when upstream ships it in the
37
+ * release asset. Each lands under its basename in the version directory.
38
+ */
39
+ documentMembers: ReadonlyArray<string>;
40
+ }
41
+
42
+ /**
43
+ * A document fetched separately from the asset, for tools whose release asset
44
+ * is a bare binary carrying no license text. Pinned by checksum like the asset.
45
+ */
46
+ export interface PinnedToolDocument {
47
+ name: string;
48
+ url: string;
49
+ sha256: string;
50
+ }
51
+
52
+ /** One row of the pinned table. */
53
+ export interface PinnedTool {
54
+ id: string;
55
+ version: string;
56
+ summary: string;
57
+ homepage: string;
58
+ /** SPDX identifier of the upstream license. */
59
+ license: string;
60
+ /** Every executable the install places, in the order they are reported. */
61
+ binaries: ReadonlyArray<string>;
62
+ /** The executable whose `--version` answers for the whole tool. */
63
+ primaryBinary: string;
64
+ /**
65
+ * Lowest version Clio accepts from a copy already on PATH. Below this the
66
+ * resolution ladder falls through to the vendored copy, because the surface
67
+ * Clio drives is only known to exist at or above this version.
68
+ */
69
+ minimumVersion: string;
70
+ /** Arguments that make the primary binary print its version. */
71
+ versionArgs: ReadonlyArray<string>;
72
+ downloads: Readonly<Partial<Record<ToolPlatform, PinnedToolDownload>>>;
73
+ /** Documents fetched alongside the asset. Usually empty. */
74
+ documents: ReadonlyArray<PinnedToolDocument>;
75
+ }
76
+
77
+ /** Where a resolved binary came from. */
78
+ export type ToolSource = "path" | "vendored" | "none";
79
+
80
+ /** What a PATH candidate looked like, kept even when it was rejected. */
81
+ export interface ToolPathCandidate {
82
+ path: string;
83
+ version: string | null;
84
+ satisfiesMinimum: boolean;
85
+ }
86
+
87
+ /** The answer of one trip down the resolution ladder. */
88
+ export interface ToolResolution {
89
+ source: ToolSource;
90
+ /** Absolute path of the binary Clio would run, or null when unresolved. */
91
+ binaryPath: string | null;
92
+ /** Version of the resolved binary when it could be read. */
93
+ version: string | null;
94
+ /** The registry row this resolution used, when the name is a pinned tool. */
95
+ entry: PinnedTool | null;
96
+ /** A PATH copy that was found, whether or not it was accepted. */
97
+ pathCandidate: ToolPathCandidate | null;
98
+ /** The vendored copy's path when the pinned version is installed. */
99
+ vendoredPath: string | null;
100
+ }
101
+
102
+ /** Per-entry state, the shape the CLI and doctor both render. */
103
+ export interface ToolStatus {
104
+ id: string;
105
+ version: string;
106
+ license: string;
107
+ platform: ToolPlatform | null;
108
+ /** False when the registry has no asset for the running platform. */
109
+ supported: boolean;
110
+ installed: boolean;
111
+ installDir: string;
112
+ resolution: ToolResolution;
113
+ }
@@ -0,0 +1,88 @@
1
+ import { spawnSync } from "node:child_process";
2
+
3
+ /**
4
+ * Version reading and comparison for third-party binaries.
5
+ *
6
+ * Every tool in the registry answers `--version` with something different:
7
+ * `herdr 0.8.2` on one line, `croc version 11.3.6`, and a six-line block from
8
+ * yazi whose version sits on the second line after a label. Nothing here tries
9
+ * to know those formats. The first dotted triple in the output is the version,
10
+ * which is true of all three and of every convention they might move to.
11
+ */
12
+
13
+ const VERSION_PATTERN = /(\d+)\.(\d+)\.(\d+)/;
14
+
15
+ /** How long a version probe may take before the binary is treated as unusable. */
16
+ const PROBE_TIMEOUT_MS = 2000;
17
+
18
+ /** The first dotted triple in some `--version` output. */
19
+ export function parseVersion(output: string): string | null {
20
+ const match = VERSION_PATTERN.exec(output);
21
+ if (!match) return null;
22
+ return `${match[1]}.${match[2]}.${match[3]}`;
23
+ }
24
+
25
+ /**
26
+ * Negative when `a` is older than `b`, zero when equal, positive when newer.
27
+ * Unparseable input sorts oldest, so an unreadable version never satisfies a
28
+ * minimum.
29
+ */
30
+ export function compareVersions(a: string, b: string): number {
31
+ const left = numericParts(a);
32
+ const right = numericParts(b);
33
+ for (let i = 0; i < 3; i += 1) {
34
+ const diff = (left[i] ?? 0) - (right[i] ?? 0);
35
+ if (diff !== 0) return diff;
36
+ }
37
+ return 0;
38
+ }
39
+
40
+ /** True when `found` is at least `minimum`. A null `found` never satisfies. */
41
+ export function satisfiesMinimum(found: string | null, minimum: string): boolean {
42
+ if (found === null) return false;
43
+ return compareVersions(found, minimum) >= 0;
44
+ }
45
+
46
+ /**
47
+ * Run a binary's version command and read the version out of it.
48
+ *
49
+ * Results are memoized per absolute path for the life of the process. The
50
+ * resolution ladder is consulted every time a pane preset or a doctor row wants
51
+ * a tool, and each miss would otherwise be a process spawn on the interactive
52
+ * path. A binary replaced under a running Clio keeps its first answer until
53
+ * restart, which is the same staleness every other PATH lookup here carries.
54
+ */
55
+ export function probeBinaryVersion(binaryPath: string, args: ReadonlyArray<string>): string | null {
56
+ const cached = probeCache.get(binaryPath);
57
+ if (cached !== undefined) return cached;
58
+ let version: string | null = null;
59
+ try {
60
+ const result = spawnSync(binaryPath, [...args], {
61
+ timeout: PROBE_TIMEOUT_MS,
62
+ encoding: "utf8",
63
+ // A version probe must never inherit a terminal or wait on input: some
64
+ // of these binaries are full-screen programs when given a tty.
65
+ stdio: ["ignore", "pipe", "pipe"],
66
+ });
67
+ if (result.error === undefined) {
68
+ version = parseVersion(`${result.stdout ?? ""}\n${result.stderr ?? ""}`);
69
+ }
70
+ } catch {
71
+ version = null;
72
+ }
73
+ probeCache.set(binaryPath, version);
74
+ return version;
75
+ }
76
+
77
+ /** Drop memoized probe results. Tests that swap binaries under a path need it. */
78
+ export function resetVersionProbeCache(): void {
79
+ probeCache.clear();
80
+ }
81
+
82
+ const probeCache = new Map<string, string | null>();
83
+
84
+ function numericParts(value: string): number[] {
85
+ const match = VERSION_PATTERN.exec(value);
86
+ if (!match) return [0, 0, 0];
87
+ return [Number(match[1]), Number(match[2]), Number(match[3])];
88
+ }
@@ -32,7 +32,7 @@ export interface AcpDelegationRunInput {
32
32
  dynamicPromptMessages?: ReadonlyArray<{ body: string }>;
33
33
  cwd: string;
34
34
  safety: SafetyContract;
35
- /** Session autonomy level applied by the mediator under clio-policy governance. */
35
+ /** Session autonomy level applied by the mediator under clio-coder-policy governance. */
36
36
  autonomy?: AutonomyLevel;
37
37
  signal?: AbortSignal;
38
38
  clientVersion?: string;
@@ -223,11 +223,11 @@ export function startAcpDelegationRun(input: AcpDelegationRunInput): AcpDelegati
223
223
  const mediator = new AcpToolMediator({
224
224
  safety: input.safety,
225
225
  cwd: input.cwd,
226
- toolGovernance: input.agent.toolGovernance ?? "clio-policy",
226
+ toolGovernance: input.agent.toolGovernance ?? "clio-coder-policy",
227
227
  ...(input.autonomy !== undefined ? { autonomy: input.autonomy } : {}),
228
228
  onPermissionResolved: (event) =>
229
229
  emit({
230
- type: "clio_permission_resolved",
230
+ type: "clio_coder_permission_resolved",
231
231
  payload: event,
232
232
  } as ClioWorkerEvent),
233
233
  });
@@ -74,7 +74,7 @@ export class AcpEventMapper {
74
74
  return this.mapToolUpdate(update as AcpToolCallUpdate);
75
75
  }
76
76
  if (kind === "plan") {
77
- return [{ type: "clio_plan_update", payload: update } as unknown as AgentEvent];
77
+ return [{ type: "clio_coder_plan_update", payload: update } as unknown as AgentEvent];
78
78
  }
79
79
  return [];
80
80
  }
@@ -116,7 +116,7 @@ export class AcpEventMapper {
116
116
  // operator surface. The descriptor composed from it here does.
117
117
  const action = describeCallAction(update.kind ?? title, update.rawInput);
118
118
  out.push({
119
- type: "clio_tool_start",
119
+ type: "clio_coder_tool_start",
120
120
  payload: {
121
121
  tool: update.kind ?? title,
122
122
  toolCallId,
@@ -145,7 +145,7 @@ export class AcpEventMapper {
145
145
  isError,
146
146
  } as unknown as AgentEvent);
147
147
  out.push({
148
- type: "clio_tool_finish",
148
+ type: "clio_coder_tool_finish",
149
149
  payload: {
150
150
  tool: update.kind ?? title,
151
151
  toolCallId,