@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,59 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+
3
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
4
+ import { settingsPath, withSettingsLock } from "../../../core/config.js";
5
+ import { safeResourceWrite } from "../../../core/safe-resource-write.js";
6
+ import type { Migration } from "./index.js";
7
+
8
+ /**
9
+ * `panes.agents` and `panes.keepFailed` are retired, and the schema refuses
10
+ * them by name rather than ignoring them. That refusal is right for a file
11
+ * written today and wrong as an upgrade experience: an operator whose settings
12
+ * predate 0.4.0 did nothing but keep a key two releases honored, and the first
13
+ * thing the new version would do is refuse to start.
14
+ *
15
+ * This is the sanctioned exception the settings lock exists for. It cannot go
16
+ * through `readSettings` or `updateSettings`, because those run the strict
17
+ * validator that rejects exactly the keys being removed, so it reads and writes
18
+ * the raw document under the same lock every other writer takes.
19
+ */
20
+ const RETIRED_PANE_KEYS = ["agents", "keepFailed"] as const;
21
+
22
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
23
+ return typeof value === "object" && value !== null && !Array.isArray(value);
24
+ }
25
+
26
+ const migration: Migration = {
27
+ id: "2026-09-01-retire-panes-knobs",
28
+ async up(): Promise<void> {
29
+ withSettingsLock(() => {
30
+ const path = settingsPath();
31
+ if (!existsSync(path)) return;
32
+ let parsed: unknown;
33
+ try {
34
+ parsed = parseYaml(readFileSync(path, "utf8"));
35
+ } catch {
36
+ // A document this cannot parse is one it must not rewrite: writing a
37
+ // re-serialized guess over an operator's malformed or transiently
38
+ // unreadable file would destroy the original they still have to fix.
39
+ // The strict reader already names the syntax error on the next boot.
40
+ return;
41
+ }
42
+ if (!isPlainObject(parsed)) return;
43
+ const panes = parsed.panes;
44
+ if (!isPlainObject(panes)) return;
45
+ const present = RETIRED_PANE_KEYS.filter((key) => key in panes);
46
+ // Rewriting is not free: the document is re-serialized from the parse, so
47
+ // comments and formatting the operator wrote do not survive. A file that
48
+ // never named these keys must therefore never be touched.
49
+ if (present.length === 0) return;
50
+ for (const key of present) delete panes[key];
51
+ // A `panes` map that held nothing but the retired knobs is left naming no
52
+ // setting at all, so it goes with them rather than staying as `panes: {}`.
53
+ if (Object.keys(panes).length === 0) delete parsed.panes;
54
+ safeResourceWrite(path, stringifyYaml(parsed), { encoding: "utf8", mode: 0o644 });
55
+ });
56
+ },
57
+ };
58
+
59
+ export default migration;
@@ -0,0 +1,338 @@
1
+ import { existsSync, mkdirSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
5
+ import { SettingsValidationError, settingsPath, validateSettings, withSettingsLock } from "../../../core/config.js";
6
+ import { safeResourceWrite } from "../../../core/safe-resource-write.js";
7
+ import type { Migration } from "./index.js";
8
+
9
+ export const SETTINGS_V2_MIGRATION_ID = "2026-09-01-settings-v2";
10
+
11
+ export interface SettingsV2MigrationReport {
12
+ fromVersion: 1;
13
+ toVersion: 2;
14
+ backupPath: string;
15
+ moved: string[];
16
+ dropped: string[];
17
+ notes: string[];
18
+ }
19
+
20
+ export class SettingsV2CollisionError extends Error {
21
+ readonly collisions: ReadonlyArray<string>;
22
+
23
+ constructor(collisions: ReadonlyArray<string>) {
24
+ super(
25
+ "settings v1 to v2 migration refused source/destination collisions:\n" +
26
+ collisions.map((collision) => ` ${collision}`).join("\n") +
27
+ "\nThe original settings.yaml was left untouched. Remove either each v1 source or its v2 destination, then re-run `clio-coder upgrade`.",
28
+ );
29
+ this.name = "SettingsV2CollisionError";
30
+ this.collisions = collisions;
31
+ }
32
+ }
33
+
34
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
35
+ return typeof value === "object" && value !== null && !Array.isArray(value);
36
+ }
37
+
38
+ function cloneValue<T>(value: T): T {
39
+ return structuredClone(value);
40
+ }
41
+
42
+ function segments(path: string): string[] {
43
+ return path.split(".");
44
+ }
45
+
46
+ function hasPath(root: Record<string, unknown>, path: string): boolean {
47
+ let current: unknown = root;
48
+ for (const segment of segments(path)) {
49
+ if (!isPlainObject(current) || !(segment in current)) return false;
50
+ current = current[segment];
51
+ }
52
+ return true;
53
+ }
54
+
55
+ function getPath(root: Record<string, unknown>, path: string): unknown {
56
+ let current: unknown = root;
57
+ for (const segment of segments(path)) {
58
+ if (!isPlainObject(current)) return undefined;
59
+ current = current[segment];
60
+ }
61
+ return current;
62
+ }
63
+
64
+ function setPath(root: Record<string, unknown>, path: string, value: unknown): void {
65
+ const parts = segments(path);
66
+ let current = root;
67
+ for (const segment of parts.slice(0, -1)) {
68
+ const child = current[segment];
69
+ if (isPlainObject(child)) current = child;
70
+ else {
71
+ const created: Record<string, unknown> = {};
72
+ current[segment] = created;
73
+ current = created;
74
+ }
75
+ }
76
+ const leaf = parts.at(-1);
77
+ if (leaf !== undefined) current[leaf] = value;
78
+ }
79
+
80
+ function deletePath(root: Record<string, unknown>, path: string): boolean {
81
+ const parts = segments(path);
82
+ const parents: Array<{ parent: Record<string, unknown>; key: string }> = [];
83
+ let current = root;
84
+ for (const segment of parts.slice(0, -1)) {
85
+ const child = current[segment];
86
+ if (!isPlainObject(child)) return false;
87
+ parents.push({ parent: current, key: segment });
88
+ current = child;
89
+ }
90
+ const leaf = parts.at(-1);
91
+ if (leaf === undefined || !(leaf in current)) return false;
92
+ delete current[leaf];
93
+ for (let index = parents.length - 1; index >= 0; index -= 1) {
94
+ const entry = parents[index];
95
+ if (entry === undefined) continue;
96
+ const child = entry.parent[entry.key];
97
+ if (isPlainObject(child) && Object.keys(child).length === 0) delete entry.parent[entry.key];
98
+ else break;
99
+ }
100
+ return true;
101
+ }
102
+
103
+ export interface SettingsV2DocumentTransform {
104
+ document: Record<string, unknown>;
105
+ moved: string[];
106
+ dropped: string[];
107
+ notes: string[];
108
+ collisions: string[];
109
+ }
110
+
111
+ type ValueTransform = (value: unknown, transform: SettingsV2DocumentTransform) => unknown;
112
+
113
+ function destinationConflict(root: Record<string, unknown>, path: string): string | null {
114
+ const parts = segments(path);
115
+ let current: Record<string, unknown> = root;
116
+ let traversed = "";
117
+ for (let index = 0; index < parts.length; index += 1) {
118
+ const segment = parts[index];
119
+ if (segment === undefined) return null;
120
+ traversed = traversed ? `${traversed}.${segment}` : segment;
121
+ if (!(segment in current)) return null;
122
+ const child = current[segment];
123
+ if (index === parts.length - 1) return traversed;
124
+ if (!isPlainObject(child)) return traversed;
125
+ current = child;
126
+ }
127
+ return null;
128
+ }
129
+
130
+ function move(
131
+ transform: SettingsV2DocumentTransform,
132
+ from: string,
133
+ to: string,
134
+ valueTransform: ValueTransform = cloneValue,
135
+ ): void {
136
+ if (!hasPath(transform.document, from)) return;
137
+ const conflict = destinationConflict(transform.document, to);
138
+ if (conflict !== null) {
139
+ transform.collisions.push(`${from} collides with ${conflict}`);
140
+ return;
141
+ }
142
+ setPath(transform.document, to, valueTransform(getPath(transform.document, from), transform));
143
+ deletePath(transform.document, from);
144
+ transform.moved.push(`${from} -> ${to}`);
145
+ }
146
+
147
+ function drop(transform: SettingsV2DocumentTransform, path: string, reason: string): void {
148
+ if (!deletePath(transform.document, path)) return;
149
+ transform.dropped.push(`${path}: ${reason}`);
150
+ }
151
+
152
+ function migrateRosters(value: unknown, transform: SettingsV2DocumentTransform): unknown {
153
+ const rosters = cloneValue(value);
154
+ if (!isPlainObject(rosters)) return rosters;
155
+ for (const [rosterName, roster] of Object.entries(rosters)) {
156
+ if (!isPlainObject(roster) || !Array.isArray(roster.members)) continue;
157
+ for (let index = 0; index < roster.members.length; index += 1) {
158
+ const member = roster.members[index];
159
+ if (!isPlainObject(member) || !("thinking" in member)) continue;
160
+ const from = `workers.rosters.${rosterName}.members[${index}].thinking`;
161
+ const to = `fleet.rosters.${rosterName}.members[${index}].thinkingLevel`;
162
+ if ("thinkingLevel" in member) {
163
+ transform.collisions.push(`${from} collides with ${to}`);
164
+ continue;
165
+ }
166
+ member.thinkingLevel = member.thinking;
167
+ delete member.thinking;
168
+ transform.moved.push(`${from} -> ${to}`);
169
+ }
170
+ }
171
+ return rosters;
172
+ }
173
+
174
+ function migrateFleetNodeAliases(transform: SettingsV2DocumentTransform): void {
175
+ const nodes = getPath(transform.document, "fleet.nodes");
176
+ if (!Array.isArray(nodes)) return;
177
+ for (let index = 0; index < nodes.length; index += 1) {
178
+ const node = nodes[index];
179
+ if (!isPlainObject(node) || !("clioEntry" in node)) continue;
180
+ const from = `fleet.nodes[${index}].clioEntry`;
181
+ const to = `fleet.nodes[${index}].clioCoderEntry`;
182
+ if ("clioCoderEntry" in node) {
183
+ delete node.clioEntry;
184
+ transform.dropped.push(`${from}: discarded because canonical ${to} was also present and wins`);
185
+ continue;
186
+ }
187
+ node.clioCoderEntry = node.clioEntry;
188
+ delete node.clioEntry;
189
+ transform.moved.push(`${from} -> ${to}`);
190
+ }
191
+ }
192
+
193
+ /** Pure in-memory transformation used by the lifecycle migration and archive import. */
194
+ export function migrateSettingsV1Document(raw: unknown): SettingsV2DocumentTransform {
195
+ if (!isPlainObject(raw)) throw new Error("settings v1 to v2 migration expected a YAML map at the document root");
196
+ const version = raw.version;
197
+ if (version !== undefined && version !== 1) {
198
+ throw new Error(`settings v1 to v2 migration expected version 1, got ${String(version)}`);
199
+ }
200
+ const transform: SettingsV2DocumentTransform = {
201
+ document: cloneValue(raw),
202
+ moved: [],
203
+ dropped: [],
204
+ notes: version === undefined ? ["version was absent; interpreted using the pre-v2 schema"] : [],
205
+ collisions: [],
206
+ };
207
+
208
+ const moves: ReadonlyArray<readonly [string, string, ValueTransform?]> = [
209
+ ["autonomy", "safety.autonomy"],
210
+ ["orchestrator.target", "chat.target"],
211
+ ["orchestrator.model", "chat.model"],
212
+ ["orchestrator.thinkingLevel", "chat.thinkingLevel"],
213
+ ["scope", "chat.modelPicker.cycleSet"],
214
+ ["modelSelector.favorites", "chat.modelPicker.favorites"],
215
+ ["modelSelector.recentLimit", "chat.modelPicker.recentLimit"],
216
+ ["defaults.maxTokens", "chat.maxOutputTokens"],
217
+ ["prewarm.enabled", "chat.prewarm"],
218
+ ["retry", "chat.retry"],
219
+ ["workers.default", "fleet.default"],
220
+ ["workers.profiles", "fleet.profiles"],
221
+ ["workers.rosters", "fleet.rosters", migrateRosters],
222
+ ["workers.agentBindings", "fleet.agentProfiles"],
223
+ ["routing.activeRoles", "fleet.adaptiveRouting.roles"],
224
+ ["routing.activePostures", "fleet.adaptiveRouting.postures"],
225
+ ["routing.agentAutomation.activeAgentRoles", "fleet.adaptiveRouting.agentRoles"],
226
+ ["budget.concurrency", "fleet.concurrency"],
227
+ ["workers.maxRetries", "fleet.retry.maxRetries"],
228
+ ["workers.resilienceCooldownMs", "fleet.retry.routeCooldownMs"],
229
+ ["workers.onPermission", "fleet.permissions.mode"],
230
+ ["workers.escalation", "fleet.permissions.escalation"],
231
+ ["guardrails.workerToolCallCap", "fleet.limits.toolCallsPerRun"],
232
+ ["guardrails.internalDispatchTimeoutMs", "fleet.limits.internalRunTimeoutMs"],
233
+ ["guardrails.maxDispatchRuns", "fleet.history.maxRuns"],
234
+ ["compaction.auto", "context.compaction.auto"],
235
+ ["compaction.threshold", "context.compaction.threshold"],
236
+ ["compaction.model", "context.compaction.model"],
237
+ ["compaction.systemPrompt", "context.compaction.systemPrompt"],
238
+ ["background.target", "context.memory.target"],
239
+ ["background.model", "context.memory.model"],
240
+ ["memory.intervention.enabled", "context.memory.enabled"],
241
+ ["memory.intervention.everyNTools", "context.memory.cadenceToolCalls"],
242
+ ["memory.intervention.windowSteps", "context.memory.trajectorySteps"],
243
+ ["memory.intervention.maxTokens", "context.memory.maxOutputTokens"],
244
+ ["memory.intervention.timeoutMs", "context.memory.timeoutMs"],
245
+ ["budget.sessionCeilingUsd", "safety.limits.sessionCostUsd"],
246
+ ["guardrails.turnToolCallBudget", "safety.limits.chatToolCallsPerTurn"],
247
+ ["guardrails.readMaxBytes", "safety.limits.readBytesPerCall"],
248
+ ["guardrails.observationTurnBudgetBytes", "safety.limits.observationBytesPerTurn"],
249
+ ["watchdog", "safety.review"],
250
+ ["terminal.outputVerbosity", "interface.outputDetail"],
251
+ ["terminal.smoothStreaming", "interface.smoothStreaming"],
252
+ ["terminal.tuiMode", "interface.mode"],
253
+ ["terminal.fullscreenScrollbar", "interface.fullscreenScrollbar"],
254
+ ["terminal.showTerminalProgress", "interface.terminalProgress"],
255
+ ["terminal.notify", "interface.desktopNotifications"],
256
+ ["panes.enabled", "interface.panes.enabled"],
257
+ ["panes.notifications", "interface.panes.notifications"],
258
+ ["panes.journal", "fleet.history.journal"],
259
+ ["panes.yazi.enabled", "interface.panes.files.enabled"],
260
+ ["panes.yazi.mode", "interface.panes.files.mode"],
261
+ ["panes.yazi.profile", "interface.panes.files.profile"],
262
+ ["panes.yazi.followCwd", "interface.panes.files.followCwd"],
263
+ ["keybindings", "interface.keybindings"],
264
+ ["skills.trustProjectCompatRoots", "integrations.projectResources.trustProjectImports"],
265
+ ["delegation.defaults", "integrations.externalAgents.defaults"],
266
+ ["delegation.agents", "integrations.externalAgents.entries"],
267
+ ["runtimePlugins", "integrations.runtimePlugins"],
268
+ ["library", "integrations.library"],
269
+ ["attribution.gitCommits", "integrations.git.commitAttribution"],
270
+ ];
271
+ for (const [from, to, valueTransform] of moves) move(transform, from, to, valueTransform);
272
+
273
+ drop(transform, "identity", "accepted and ignored; no behavior was lost");
274
+ drop(transform, "background.thinkingLevel", "unused; proactive memory always resolves thinking off");
275
+ drop(transform, "theme", "inactive; runtime rendering did not read it");
276
+ drop(transform, "compaction.excludeLastTurns", "legacy-mask only; context.workingSet.protectLastTurns remains");
277
+ // The keys v0.4.0 shipped moved above; what can remain under `panes` is the
278
+ // retired agents/keepFailed pair (normally already stripped by the
279
+ // retire-panes-knobs migration, which runs first) or unknown keys, none of
280
+ // which has a v2 home.
281
+ drop(
282
+ transform,
283
+ "panes",
284
+ "remaining panes keys have no v2 successor; the shipped keys moved to interface.panes.* and fleet.history.journal",
285
+ );
286
+ migrateFleetNodeAliases(transform);
287
+
288
+ if (transform.collisions.length > 0) throw new SettingsV2CollisionError(transform.collisions);
289
+ transform.document.version = 2;
290
+ const validated = validateSettings(transform.document);
291
+ if (validated.issues.length > 0) throw new SettingsValidationError(validated.issues);
292
+ return transform;
293
+ }
294
+
295
+ function reportPath(stateDir: string): string {
296
+ return join(stateDir, "migration-reports", `${SETTINGS_V2_MIGRATION_ID}.json`);
297
+ }
298
+
299
+ const migration: Migration = {
300
+ id: SETTINGS_V2_MIGRATION_ID,
301
+ async up(stateDir: string): Promise<void> {
302
+ withSettingsLock(() => {
303
+ const path = settingsPath();
304
+ if (!existsSync(path)) return;
305
+ let rawText: string;
306
+ let parsed: unknown;
307
+ try {
308
+ rawText = readFileSync(path, "utf8");
309
+ parsed = parseYaml(rawText);
310
+ } catch (error) {
311
+ throw new Error(
312
+ `settings v1 to v2 migration could not read and parse ${path}: ${error instanceof Error ? error.message : String(error)}`,
313
+ );
314
+ }
315
+ if (isPlainObject(parsed) && parsed.version === 2) return;
316
+ const transformed = migrateSettingsV1Document(parsed);
317
+ const backupPath = `${path}.v1.bak`;
318
+ safeResourceWrite(path, stringifyYaml(transformed.document), {
319
+ encoding: "utf8",
320
+ mode: 0o644,
321
+ backup: { path: backupPath },
322
+ });
323
+ const report: SettingsV2MigrationReport = {
324
+ fromVersion: 1,
325
+ toVersion: 2,
326
+ backupPath,
327
+ moved: transformed.moved,
328
+ dropped: transformed.dropped,
329
+ notes: transformed.notes,
330
+ };
331
+ const target = reportPath(stateDir);
332
+ mkdirSync(join(stateDir, "migration-reports"), { recursive: true });
333
+ safeResourceWrite(target, `${JSON.stringify(report, null, 2)}\n`, { encoding: "utf8", mode: 0o644 });
334
+ });
335
+ },
336
+ };
337
+
338
+ export default migration;
@@ -20,12 +20,22 @@
20
20
  * (core/safe-resource-write.ts) so readers never see a partial file.
21
21
  * 2. Migrations are authored against the shapes the code has on the day they
22
22
  * are needed, never against stale pre-release shapes.
23
+ * 3. A migration that repairs settings.yaml into a shape the strict reader
24
+ * accepts runs before any migration that reads settings through
25
+ * `readSettings`, because that reader throws on the very document the
26
+ * repair exists to fix. The registry order below is that order, and it is
27
+ * deliberately not the id order: ids are stable identifiers, and the
28
+ * manifest replays by id membership rather than by position, so a home that
29
+ * already applied one of these is unaffected by where the other sits.
23
30
  */
24
31
 
25
32
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
26
33
  import { join } from "node:path";
27
34
 
28
35
  import lmStudioRuntimeId from "./2026-08-18-lmstudio-runtime-id.js";
36
+ import clioCoderNaming from "./2026-09-01-clio-coder-naming.js";
37
+ import retirePanesKnobs from "./2026-09-01-retire-panes-knobs.js";
38
+ import settingsV2 from "./2026-09-01-settings-v2.js";
29
39
 
30
40
  export interface Migration {
31
41
  id: string;
@@ -45,7 +55,16 @@ export interface MigrationRunResult {
45
55
  available: string[];
46
56
  }
47
57
 
48
- const REGISTRY: ReadonlyArray<Migration> = Object.freeze([lmStudioRuntimeId]);
58
+ // Settings v2 owns the complete v1 rewrite, including the already-retired pane
59
+ // keys, and must run before either older migration reaches the strict v2 reader.
60
+ // `retirePanesKnobs` remains registered for homes that already recorded the v2
61
+ // migration independently and for manifest continuity; it is a no-op on v2.
62
+ const REGISTRY: ReadonlyArray<Migration> = Object.freeze([
63
+ settingsV2,
64
+ clioCoderNaming,
65
+ retirePanesKnobs,
66
+ lmStudioRuntimeId,
67
+ ]);
49
68
 
50
69
  export function listMigrations(): ReadonlyArray<Migration> {
51
70
  return REGISTRY;
@@ -0,0 +1,153 @@
1
+ import { existsSync, lstatSync, readdirSync, readFileSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ import { TraceReader } from "../observability/trace-store.js";
5
+
6
+ const HISTORY_FILE_LIMIT = 10_000;
7
+ const HISTORY_FILE_BYTE_LIMIT = 8 * 1024 * 1024;
8
+ const HISTORY_SUFFIXES = [".json", ".jsonl", ".ndjson"] as const;
9
+ const LEGACY_EVENT_TYPES = [
10
+ "clio_permission_escalated",
11
+ "clio_permission_resolved",
12
+ "clio_plan_update",
13
+ "clio_run_outcome",
14
+ "clio_safety_decision",
15
+ "clio_skill_activation",
16
+ "clio_steer_received",
17
+ "clio_tool_activity",
18
+ "clio_tool_finish",
19
+ "clio_tool_start",
20
+ "clio_usage",
21
+ "clio_verification",
22
+ "clio_write_record_downgraded",
23
+ ] as const;
24
+ const LEGACY_HISTORY_LITERALS = [
25
+ ...LEGACY_EVENT_TYPES,
26
+ "clio.eval.",
27
+ '"clio-run"',
28
+ "clio.runReceipt.integrity",
29
+ "clio.gateDecision.integrity",
30
+ "clio.gateDecision.pending",
31
+ "clio.protectedArtifact.pending",
32
+ "clio.ask_user.interview.v1",
33
+ "clio.share.v1",
34
+ "clio-context-replay-v2",
35
+ "identity.clio-worker",
36
+ ] as const;
37
+
38
+ export type NamingHistoryArea = "trace" | "sessions" | "evals" | "evidence" | "receipts";
39
+
40
+ export interface NamingHistoryCount {
41
+ area: NamingHistoryArea;
42
+ legacyIdentifiers: number;
43
+ filesInspected: number;
44
+ filesSkipped: number;
45
+ error: string | null;
46
+ }
47
+
48
+ export interface InspectNamingHistoryOptions {
49
+ stateDir: string;
50
+ dataDir: string;
51
+ }
52
+
53
+ function countLegacyHistoryText(text: string): number {
54
+ let count = 0;
55
+ for (const literal of LEGACY_HISTORY_LITERALS) {
56
+ let offset = 0;
57
+ for (;;) {
58
+ const found = text.indexOf(literal, offset);
59
+ if (found === -1) break;
60
+ count += 1;
61
+ offset = found + literal.length;
62
+ }
63
+ }
64
+ count += text.match(/"clio"\s*:/gu)?.length ?? 0;
65
+ count += text.match(/"clioVersion"\s*:/gu)?.length ?? 0;
66
+ count += text.match(/"clioCommit"\s*:/gu)?.length ?? 0;
67
+ return count;
68
+ }
69
+
70
+ function inspectTextTree(area: Exclude<NamingHistoryArea, "trace">, root: string): NamingHistoryCount {
71
+ const result: NamingHistoryCount = {
72
+ area,
73
+ legacyIdentifiers: 0,
74
+ filesInspected: 0,
75
+ filesSkipped: 0,
76
+ error: null,
77
+ };
78
+ if (!existsSync(root)) return result;
79
+ const pending = [root];
80
+ try {
81
+ while (pending.length > 0 && result.filesInspected + result.filesSkipped < HISTORY_FILE_LIMIT) {
82
+ const directory = pending.pop();
83
+ if (directory === undefined) break;
84
+ for (const entry of readdirSync(directory, { withFileTypes: true }).sort((left, right) =>
85
+ left.name.localeCompare(right.name),
86
+ )) {
87
+ const path = join(directory, entry.name);
88
+ if (entry.isSymbolicLink()) {
89
+ result.filesSkipped += 1;
90
+ continue;
91
+ }
92
+ if (entry.isDirectory()) {
93
+ pending.push(path);
94
+ continue;
95
+ }
96
+ if (!entry.isFile() || !HISTORY_SUFFIXES.some((suffix) => entry.name.endsWith(suffix))) continue;
97
+ const stats = lstatSync(path);
98
+ if (!stats.isFile() || stats.size > HISTORY_FILE_BYTE_LIMIT) {
99
+ result.filesSkipped += 1;
100
+ continue;
101
+ }
102
+ result.legacyIdentifiers += countLegacyHistoryText(readFileSync(path, "utf8"));
103
+ result.filesInspected += 1;
104
+ }
105
+ }
106
+ if (pending.length > 0) result.filesSkipped += pending.length;
107
+ } catch (error) {
108
+ result.error = error instanceof Error ? error.message : String(error);
109
+ }
110
+ return result;
111
+ }
112
+
113
+ function inspectTrace(path: string): NamingHistoryCount {
114
+ const result: NamingHistoryCount = {
115
+ area: "trace",
116
+ legacyIdentifiers: 0,
117
+ filesInspected: 0,
118
+ filesSkipped: 0,
119
+ error: null,
120
+ };
121
+ if (!existsSync(path)) return result;
122
+ try {
123
+ if (!statSync(path).isFile()) {
124
+ result.filesSkipped = 1;
125
+ return result;
126
+ }
127
+ const reader = new TraceReader(path);
128
+ try {
129
+ const placeholders = LEGACY_EVENT_TYPES.map(() => "?").join(",");
130
+ const row = reader.db
131
+ .prepare(`SELECT COUNT(*) AS count FROM events WHERE type IN (${placeholders})`)
132
+ .get(...LEGACY_EVENT_TYPES) as { count: number | bigint };
133
+ result.legacyIdentifiers = Number(row.count);
134
+ result.filesInspected = 1;
135
+ } finally {
136
+ reader.close();
137
+ }
138
+ } catch (error) {
139
+ result.error = error instanceof Error ? error.message : String(error);
140
+ }
141
+ return result;
142
+ }
143
+
144
+ /** Count released legacy identifiers without mutating immutable or sealed history. */
145
+ export function inspectNamingHistory(options: InspectNamingHistoryOptions): NamingHistoryCount[] {
146
+ return [
147
+ inspectTrace(join(options.stateDir, "trace.sqlite")),
148
+ inspectTextTree("sessions", join(options.stateDir, "sessions")),
149
+ inspectTextTree("evals", join(options.dataDir, "evals")),
150
+ inspectTextTree("evidence", join(options.dataDir, "evidence")),
151
+ inspectTextTree("receipts", join(options.stateDir, "receipts")),
152
+ ];
153
+ }
@@ -0,0 +1,104 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ import { safeResourceWrite } from "../../core/safe-resource-write.js";
5
+
6
+ export const MUTABLE_NAMING_BACKUP_SUFFIX = ".pre-clio-coder-naming.bak";
7
+
8
+ const MUTABLE_STATE_FILES = [
9
+ "dispatch-admission.json",
10
+ "dispatch-verification-memo.json",
11
+ "endpoint-slots.json",
12
+ "fleet-preflight.json",
13
+ "interop.json",
14
+ ] as const;
15
+
16
+ export interface MutableNamingCounts {
17
+ lifecycle: number;
18
+ toolGovernance: number;
19
+ source: number;
20
+ }
21
+
22
+ export interface MutableNamingStateReport {
23
+ path: string;
24
+ changed: boolean;
25
+ backupPath: string | null;
26
+ counts: MutableNamingCounts;
27
+ error: string | null;
28
+ }
29
+
30
+ function isRecord(value: unknown): value is Record<string, unknown> {
31
+ return typeof value === "object" && value !== null && !Array.isArray(value);
32
+ }
33
+
34
+ /** Field-aware transform: user text and unknown string values are never searched or replaced. */
35
+ function transformMutableNamingState(value: unknown): { value: unknown; counts: MutableNamingCounts } {
36
+ const next = structuredClone(value);
37
+ const counts: MutableNamingCounts = { lifecycle: 0, toolGovernance: 0, source: 0 };
38
+ const visit = (current: unknown): void => {
39
+ if (Array.isArray(current)) {
40
+ for (const entry of current) visit(entry);
41
+ return;
42
+ }
43
+ if (!isRecord(current)) return;
44
+ for (const [key, entry] of Object.entries(current)) {
45
+ if (key === "lifecycle" && entry === "clio-managed") {
46
+ current[key] = "clio-coder-managed";
47
+ counts.lifecycle += 1;
48
+ continue;
49
+ }
50
+ if (key === "toolGovernance" && entry === "clio-policy") {
51
+ current[key] = "clio-coder-policy";
52
+ counts.toolGovernance += 1;
53
+ continue;
54
+ }
55
+ if (key === "source" && entry === "clio") {
56
+ current[key] = "clio-coder";
57
+ counts.source += 1;
58
+ continue;
59
+ }
60
+ visit(entry);
61
+ }
62
+ };
63
+ visit(next);
64
+ return { value: next, counts };
65
+ }
66
+
67
+ function total(counts: MutableNamingCounts): number {
68
+ return counts.lifecycle + counts.toolGovernance + counts.source;
69
+ }
70
+
71
+ /**
72
+ * Rewrite only the audited mutable, unsealed JSON allowlist. Run/session
73
+ * ledgers, receipts, evidence, evals, trace, gate decisions, protected
74
+ * artifacts, and exported archives are deliberately unreachable here.
75
+ */
76
+ export function migrateMutableNamingState(stateDir: string): MutableNamingStateReport[] {
77
+ const reports: MutableNamingStateReport[] = [];
78
+ for (const name of MUTABLE_STATE_FILES) {
79
+ const path = join(stateDir, name);
80
+ if (!existsSync(path)) continue;
81
+ try {
82
+ const parsed: unknown = JSON.parse(readFileSync(path, "utf8"));
83
+ const transformed = transformMutableNamingState(parsed);
84
+ const changed = total(transformed.counts) > 0;
85
+ const backupPath = changed ? `${path}${MUTABLE_NAMING_BACKUP_SUFFIX}` : null;
86
+ if (changed) {
87
+ safeResourceWrite(path, `${JSON.stringify(transformed.value, null, 2)}\n`, {
88
+ encoding: "utf8",
89
+ backup: { path: backupPath as string },
90
+ });
91
+ }
92
+ reports.push({ path, changed, backupPath, counts: transformed.counts, error: null });
93
+ } catch (error) {
94
+ reports.push({
95
+ path,
96
+ changed: false,
97
+ backupPath: null,
98
+ counts: { lifecycle: 0, toolGovernance: 0, source: 0 },
99
+ error: error instanceof Error ? error.message : String(error),
100
+ });
101
+ }
102
+ }
103
+ return reports;
104
+ }