@iowarp/clio-coder 0.4.0 → 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 (581) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +116 -16
  3. package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
  4. package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
  7. package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
  8. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  9. package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
  10. package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
  11. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  12. package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
  13. package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
  14. package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
  15. package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
  16. package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
  17. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  18. package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
  19. package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
  20. package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
  21. package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
  22. package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
  23. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  24. package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
  25. package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
  26. package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
  27. package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
  28. package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
  29. package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
  30. package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
  33. package/dist/chunk-AP73CFDC.js +308 -0
  34. package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
  35. package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
  36. package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
  37. package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
  38. package/dist/chunk-BTK3SSSK.js +67 -0
  39. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  40. package/dist/chunk-BWW4HLO4.js +301 -0
  41. package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
  42. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  43. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  44. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  45. package/dist/chunk-D7E7WCDF.js +27 -0
  46. package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
  47. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  48. package/dist/chunk-EIMVLWB3.js +1842 -0
  49. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  50. package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
  51. package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
  52. package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
  53. package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
  54. package/dist/chunk-HJWWJ6IL.js +184 -0
  55. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  56. package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
  57. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  58. package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
  59. package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
  60. package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
  61. package/dist/chunk-J5LZHVIT.js +284 -0
  62. package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
  63. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  64. package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
  65. package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
  66. package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
  67. package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
  68. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  69. package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
  70. package/dist/chunk-NDDGJUXD.js +81 -0
  71. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  72. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  73. package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
  74. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  75. package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
  76. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  77. package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
  78. package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
  79. package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
  80. package/dist/chunk-QTFGO774.js +644 -0
  81. package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
  82. package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
  83. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  84. package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
  85. package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
  86. package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
  87. package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
  88. package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
  89. package/dist/chunk-U2WB7TZS.js +271 -0
  90. package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
  91. package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
  92. package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
  93. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  94. package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
  95. package/dist/chunk-VKFQTNDV.js +66 -0
  96. package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
  97. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  98. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  99. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  100. package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
  101. package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
  102. package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
  103. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  104. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  105. package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
  106. package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
  107. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  108. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  109. package/dist/cli/index.js +36 -36
  110. package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
  111. package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
  112. package/dist/codewiki/build-worker.js +1 -1
  113. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  114. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  115. package/dist/{config-QZPCMYSO.js → config-3QZRWZJF.js} +53 -49
  116. package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
  117. package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
  118. package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
  119. package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
  120. package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
  121. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
  122. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
  123. package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
  124. package/dist/doctor-ZGPEGHIP.js +772 -0
  125. package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
  126. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
  127. package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
  128. package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
  129. package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
  130. package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
  131. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
  132. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
  133. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
  134. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
  135. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
  136. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
  137. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
  138. package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
  139. package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
  140. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  141. package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
  142. package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
  143. package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
  144. package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
  145. package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
  146. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
  147. package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
  148. package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
  149. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  150. package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
  151. package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
  152. package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
  153. package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
  154. package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
  155. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
  156. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
  157. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
  158. package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
  159. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  160. package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
  161. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
  162. package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
  163. package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
  164. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  165. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  166. package/dist/{upgrade-3XPP6OQL.js → upgrade-H7TOM7YL.js} +35 -62
  167. package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
  168. package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
  169. package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
  170. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
  171. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
  172. package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
  173. package/dist/worker/entry.js +57 -52
  174. package/docs/acp.md +1 -1
  175. package/docs/built-in-agents.md +40 -32
  176. package/docs/commands-and-modes.md +9 -3
  177. package/docs/config-knobs-audit.md +3 -0
  178. package/docs/configuration-and-targets.md +105 -164
  179. package/docs/environment-variables.md +2 -1
  180. package/docs/exit-codes-and-output.md +2 -0
  181. package/docs/fleet-demo-runbook.md +6 -3
  182. package/docs/fleet-dispatch.md +8 -6
  183. package/docs/installation-and-lifecycle.md +1 -1
  184. package/docs/release-cut-checklist.md +164 -177
  185. package/docs/trace-store.md +15 -10
  186. package/docs/troubleshooting.md +1 -1
  187. package/evals/README.md +5 -0
  188. package/evals/behavioral-corpus-grader.mjs +103 -0
  189. package/evals/behavioral-machinery-baseline.json +2276 -0
  190. package/evals/behavioral-machinery-driver.ts +250 -0
  191. package/evals/behavioral-machinery-support.ts +253 -0
  192. package/evals/behavioral-machinery.yaml +614 -0
  193. package/evals/behavioral-model-negative-control.yaml +68 -0
  194. package/evals/behavioral-model.yaml +216 -0
  195. package/evals/fixtures/behavioral-facts.txt +3 -0
  196. package/evals/fixtures/behavioral-main.ts +7 -0
  197. package/evals/fixtures/decoy/note.txt +2 -0
  198. package/evals/fixtures/private/credentials.txt +1 -0
  199. package/evals/tracked-metrics-baseline.yaml +229 -0
  200. package/evals/tracked-metrics-grader.mjs +129 -0
  201. package/package.json +5 -15
  202. package/skills/README.md +6 -6
  203. package/skills/coding/ast-grep/SKILL.md +8 -2
  204. package/skills/coding/coding-standards/SKILL.md +8 -2
  205. package/skills/coding/prototype/SKILL.md +8 -2
  206. package/skills/coding/tdd/SKILL.md +8 -2
  207. package/skills/context/context-handoff/SKILL.md +12 -3
  208. package/skills/context/context-handoff/evals.md +3 -3
  209. package/skills/context/context-prime/SKILL.md +8 -2
  210. package/skills/context/context-prime/evals.md +2 -2
  211. package/skills/git/file-ticket/SKILL.md +9 -4
  212. package/skills/git/file-ticket/evals.md +2 -2
  213. package/skills/git/fix-issue/SKILL.md +12 -5
  214. package/skills/git/fix-issue/evals.md +4 -4
  215. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  216. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  217. package/skills/git/ship/SKILL.md +9 -3
  218. package/skills/git/ship/evals.md +4 -4
  219. package/skills/git/worktree-create/SKILL.md +7 -2
  220. package/skills/git/worktree-create/evals.md +6 -6
  221. package/skills/git/worktree-merge/SKILL.md +7 -2
  222. package/skills/git/worktree-merge/evals.md +6 -6
  223. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  224. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  225. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  226. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  227. package/skills/meta/credentials/SKILL.md +9 -2
  228. package/skills/meta/find-skills/SKILL.md +8 -2
  229. package/skills/meta/herdr/SKILL.md +8 -2
  230. package/skills/meta/skill-craft/SKILL.md +21 -4
  231. package/skills/planning/architecture/SKILL.md +9 -3
  232. package/skills/planning/backlog/SKILL.md +8 -2
  233. package/skills/planning/prd/SKILL.md +8 -2
  234. package/skills/planning/product-intent/SKILL.md +8 -2
  235. package/skills/planning/tech-spec/SKILL.md +9 -3
  236. package/skills/registry.yaml +66 -66
  237. package/skills/research/arxiv-literature/SKILL.md +8 -2
  238. package/skills/research/experiment-protocol/SKILL.md +9 -2
  239. package/skills/research/scientific-debugging/SKILL.md +9 -2
  240. package/skills/research/scientific-debugging/evals.md +2 -2
  241. package/skills/research/scientific-modernization/SKILL.md +9 -2
  242. package/skills/skill-marketplace.json +257 -38
  243. package/skills/workflow/cut-it/SKILL.md +10 -2
  244. package/skills/workflow/design-council/SKILL.md +11 -2
  245. package/skills/workflow/grill-me/SKILL.md +8 -2
  246. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  247. package/src/cli/acp.ts +2 -2
  248. package/src/cli/auth.ts +2 -2
  249. package/src/cli/bootstrap-generate.ts +5 -5
  250. package/src/cli/clio.ts +6 -1
  251. package/src/cli/config-inspect.ts +3 -3
  252. package/src/cli/configure-interop.ts +1 -1
  253. package/src/cli/configure.ts +27 -27
  254. package/src/cli/default-target.ts +1 -1
  255. package/src/cli/docs.ts +6 -6
  256. package/src/cli/doctor-naming.ts +323 -0
  257. package/src/cli/doctor-panes.ts +46 -14
  258. package/src/cli/doctor-toolchain.ts +29 -8
  259. package/src/cli/doctor.ts +15 -1
  260. package/src/cli/eval-inventory.ts +8 -8
  261. package/src/cli/evidence-detail.ts +1 -1
  262. package/src/cli/evidence-inventory.ts +1 -1
  263. package/src/cli/fleet-decisions.ts +1 -1
  264. package/src/cli/fleet-inspect.ts +1 -1
  265. package/src/cli/fleet-preflight.ts +1 -1
  266. package/src/cli/fleet-verify.ts +1 -1
  267. package/src/cli/fleet-view.ts +40 -23
  268. package/src/cli/fleet.ts +8 -5
  269. package/src/cli/interop-inspect.ts +2 -2
  270. package/src/cli/models.ts +3 -3
  271. package/src/cli/modes/print.ts +1 -1
  272. package/src/cli/reset.ts +1 -1
  273. package/src/cli/run.ts +11 -15
  274. package/src/cli/share.ts +1 -1
  275. package/src/cli/skills-eval.ts +11 -11
  276. package/src/cli/targets.ts +23 -24
  277. package/src/cli/trace-inspect.ts +1 -1
  278. package/src/cli/trace.ts +41 -0
  279. package/src/cli/uninstall.ts +2 -2
  280. package/src/cli/upgrade.ts +29 -34
  281. package/src/cli/usage.ts +2 -2
  282. package/src/cli/validate-model.ts +1 -1
  283. package/src/cli/verifiers-inspect.ts +1 -1
  284. package/src/cli/wiki-generate.ts +5 -5
  285. package/src/core/bash-exec.ts +1 -1
  286. package/src/core/boot-trace.ts +3 -3
  287. package/src/core/bus-trace.ts +2 -2
  288. package/src/core/compile-cache.ts +1 -1
  289. package/src/core/config.ts +1062 -886
  290. package/src/core/defaults.ts +321 -528
  291. package/src/core/domain-loader.ts +6 -4
  292. package/src/core/event-bus.ts +1 -1
  293. package/src/core/file-references.ts +78 -88
  294. package/src/core/git-commit-attribution.ts +3 -9
  295. package/src/core/guardrails.ts +24 -4
  296. package/src/core/naming-compat.ts +45 -0
  297. package/src/core/naming-events.ts +62 -0
  298. package/src/core/recent-models.ts +1 -7
  299. package/src/core/residency-protection.ts +4 -8
  300. package/src/core/resolve-config-value.ts +1 -1
  301. package/src/core/response-model-id.ts +0 -14
  302. package/src/core/session-routing.ts +84 -74
  303. package/src/core/skill-activation.ts +18 -0
  304. package/src/core/termination.ts +4 -4
  305. package/src/core/timers.ts +2 -12
  306. package/src/domains/agents/catalog.ts +2 -12
  307. package/src/domains/agents/extension.ts +3 -3
  308. package/src/domains/agents/registry.ts +7 -7
  309. package/src/domains/agents/result-contract.ts +1 -1
  310. package/src/domains/agents/spec.ts +0 -11
  311. package/src/domains/config/classify.ts +35 -47
  312. package/src/domains/config/extension.ts +5 -5
  313. package/src/domains/config/keybindings.ts +48 -47
  314. package/src/domains/config/watcher.ts +1 -1
  315. package/src/domains/context/codewiki/indexer.ts +1 -1
  316. package/src/domains/context/extension.ts +3 -3
  317. package/src/domains/context/prompt-context.ts +1 -1
  318. package/src/domains/context/wiki/assemble.ts +2 -2
  319. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  320. package/src/domains/context/working-set/replay/report.ts +1 -1
  321. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  322. package/src/domains/dispatch/active-route-planner.ts +2 -2
  323. package/src/domains/dispatch/agent-candidates.ts +1 -1
  324. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  325. package/src/domains/dispatch/agent-ledger.ts +1 -1
  326. package/src/domains/dispatch/assignment.ts +5 -5
  327. package/src/domains/dispatch/capacity-lease.ts +2 -5
  328. package/src/domains/dispatch/code-step.ts +1 -1
  329. package/src/domains/dispatch/contract.ts +2 -2
  330. package/src/domains/dispatch/extension.ts +65 -61
  331. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  332. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  333. package/src/domains/dispatch/fleet-run.ts +0 -7
  334. package/src/domains/dispatch/gate-decisions.ts +25 -14
  335. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  336. package/src/domains/dispatch/path-scope.ts +0 -61
  337. package/src/domains/dispatch/placement.ts +2 -2
  338. package/src/domains/dispatch/receipt-findings.ts +1 -1
  339. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  340. package/src/domains/dispatch/reservation-store.ts +0 -23
  341. package/src/domains/dispatch/route-decision.ts +1 -1
  342. package/src/domains/dispatch/route-history.ts +1 -1
  343. package/src/domains/dispatch/route-policy.ts +1 -1
  344. package/src/domains/dispatch/route-readiness.ts +0 -28
  345. package/src/domains/dispatch/run-event-journal.ts +6 -5
  346. package/src/domains/dispatch/tool-stats.ts +1 -1
  347. package/src/domains/dispatch/transport.ts +2 -19
  348. package/src/domains/dispatch/types.ts +3 -3
  349. package/src/domains/dispatch/worker-protocol.ts +2 -2
  350. package/src/domains/eval/artifacts/store.ts +5 -4
  351. package/src/domains/eval/compare/thresholds.ts +0 -8
  352. package/src/domains/eval/execution-provenance.ts +1 -1
  353. package/src/domains/eval/metrics/token-stream.ts +0 -7
  354. package/src/domains/eval/report.ts +1 -1
  355. package/src/domains/eval/runner.ts +1 -1
  356. package/src/domains/eval/runners/clio-run.ts +7 -6
  357. package/src/domains/eval/runners/external-command.ts +4 -3
  358. package/src/domains/eval/schema/artifact.ts +1 -1
  359. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  360. package/src/domains/eval/schema/behavioral.ts +7 -6
  361. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  362. package/src/domains/eval/schema/naming.ts +10 -0
  363. package/src/domains/eval/schema/suite.ts +2 -2
  364. package/src/domains/eval/schema/validate.ts +9 -5
  365. package/src/domains/eval/schema/verdict.ts +4 -2
  366. package/src/domains/eval/store.ts +12 -2
  367. package/src/domains/eval/suites/run.ts +12 -6
  368. package/src/domains/eval/types.ts +1 -1
  369. package/src/domains/eval/workspaces/git.ts +1 -1
  370. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  371. package/src/domains/evidence/build.ts +13 -5
  372. package/src/domains/interop/consent.ts +7 -7
  373. package/src/domains/interop/extension.ts +1 -1
  374. package/src/domains/lifecycle/doctor.ts +27 -21
  375. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  376. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  377. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  378. package/src/domains/lifecycle/migrations/index.ts +20 -1
  379. package/src/domains/lifecycle/naming-history.ts +153 -0
  380. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  381. package/src/domains/lifecycle/naming-resources.ts +261 -0
  382. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  383. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  384. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  385. package/src/domains/memory/task-memory-handoff.ts +6 -3
  386. package/src/domains/middleware/index.ts +7 -0
  387. package/src/domains/middleware/marketplace-offer.ts +339 -0
  388. package/src/domains/middleware/runtime.ts +2 -2
  389. package/src/domains/mux/contract.ts +157 -25
  390. package/src/domains/mux/detect.ts +29 -5
  391. package/src/domains/mux/dock-controller.ts +365 -0
  392. package/src/domains/mux/extension.ts +7 -1
  393. package/src/domains/mux/index.ts +20 -0
  394. package/src/domains/mux/operations.ts +28 -0
  395. package/src/domains/mux/protocol.ts +19 -6
  396. package/src/domains/mux/socket-client.ts +167 -19
  397. package/src/domains/mux/types.ts +49 -6
  398. package/src/domains/mux/yazi/event-stream.ts +6 -4
  399. package/src/domains/mux/yazi/profile.ts +1 -1
  400. package/src/domains/mux/yazi/session.ts +26 -3
  401. package/src/domains/observability/extension.ts +1 -1
  402. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  403. package/src/domains/observability/projection.ts +1 -1
  404. package/src/domains/observability/trace-store.ts +22 -12
  405. package/src/domains/prompts/compiler.ts +2 -2
  406. package/src/domains/prompts/extension.ts +3 -3
  407. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  408. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  409. package/src/domains/providers/extension.ts +5 -5
  410. package/src/domains/providers/knowledge-base-path.ts +1 -1
  411. package/src/domains/providers/model-runtime-capabilities.ts +14 -2
  412. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  413. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  414. package/src/domains/providers/plugins.ts +1 -1
  415. package/src/domains/providers/resolver.ts +1 -1
  416. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  417. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  418. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  419. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  420. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  421. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  422. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  423. package/src/domains/providers/types/knowledge-base.ts +13 -0
  424. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  425. package/src/domains/providers/types/target-descriptor.ts +3 -3
  426. package/src/domains/resources/extension.ts +1 -1
  427. package/src/domains/resources/library.ts +6 -6
  428. package/src/domains/resources/prompts/loader.ts +1 -1
  429. package/src/domains/resources/skills/content-hash.ts +7 -6
  430. package/src/domains/resources/skills/evals.ts +1 -1
  431. package/src/domains/resources/skills/install.ts +36 -12
  432. package/src/domains/resources/skills/loader.ts +39 -13
  433. package/src/domains/resources/skills/marketplace.ts +21 -2
  434. package/src/domains/resources/skills/promotion.ts +214 -0
  435. package/src/domains/safety/audit.ts +2 -2
  436. package/src/domains/safety/finish-contract.ts +2 -1
  437. package/src/domains/safety/run-effects.ts +1 -1
  438. package/src/domains/scheduling/extension.ts +4 -4
  439. package/src/domains/session/archive-readers.ts +9 -1
  440. package/src/domains/session/compaction/branch-summary.ts +4 -0
  441. package/src/domains/session/compaction/compact.ts +1 -1
  442. package/src/domains/session/compaction/tokens.ts +4 -0
  443. package/src/domains/session/context-accounting.ts +1 -1
  444. package/src/domains/session/decision-board.ts +1 -1
  445. package/src/domains/session/extension.ts +1 -1
  446. package/src/domains/session/handoff.ts +2 -2
  447. package/src/domains/session/prompt-manifest.ts +0 -5
  448. package/src/domains/session/protected-artifact-journal.ts +12 -6
  449. package/src/domains/session/retry.ts +1 -1
  450. package/src/domains/share/archive.ts +85 -36
  451. package/src/domains/toolchain/install.ts +1 -1
  452. package/src/engine/acp/adapter.ts +3 -3
  453. package/src/engine/acp/event-mapper.ts +3 -3
  454. package/src/engine/acp/server.ts +27 -26
  455. package/src/engine/acp/tool-mediator.ts +2 -2
  456. package/src/engine/acp/types.ts +1 -1
  457. package/src/engine/alcf-oauth.ts +5 -5
  458. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  459. package/src/engine/api-registry.ts +1 -1
  460. package/src/engine/apis/llamacpp-residency.ts +1 -19
  461. package/src/engine/apis/lmstudio.ts +1 -6
  462. package/src/engine/apis/ollama-native.ts +3 -3
  463. package/src/engine/apis/openai-completions.ts +2 -2
  464. package/src/engine/apis/residency.ts +3 -9
  465. package/src/engine/claude/sdk-module.ts +1 -12
  466. package/src/engine/claude/sdk-runtime.ts +6 -6
  467. package/src/engine/claude/subprocess-runtime.ts +1 -1
  468. package/src/engine/claude/tool-safety.ts +4 -4
  469. package/src/engine/loop-guard.ts +0 -5
  470. package/src/engine/session.ts +14 -7
  471. package/src/engine/tui-primitives.ts +1 -1
  472. package/src/engine/worker-events.ts +6 -6
  473. package/src/engine/worker-runtime.ts +14 -13
  474. package/src/entry/orchestrator.ts +107 -88
  475. package/src/interactive/application-controller.ts +21 -21
  476. package/src/interactive/bus-notices.ts +2 -2
  477. package/src/interactive/chat-loop.ts +8 -8
  478. package/src/interactive/chat-panel.ts +1 -1
  479. package/src/interactive/clio-editor.ts +105 -1
  480. package/src/interactive/context-activity.ts +8 -6
  481. package/src/interactive/context-meter.ts +3 -6
  482. package/src/interactive/context-overlay.ts +1 -1
  483. package/src/interactive/cost-overlay.ts +1 -1
  484. package/src/interactive/council-grid.ts +2 -2
  485. package/src/interactive/dispatch-board.ts +30 -33
  486. package/src/interactive/editor-bash.ts +21 -0
  487. package/src/interactive/editor-steer.ts +9 -4
  488. package/src/interactive/editor-submit.ts +24 -18
  489. package/src/interactive/external-editor.ts +1 -1
  490. package/src/interactive/file-reference-completion.ts +360 -0
  491. package/src/interactive/footer/dashboard.ts +15 -17
  492. package/src/interactive/footer/notifications.ts +14 -8
  493. package/src/interactive/footer/widgets.ts +2 -44
  494. package/src/interactive/interactive-application.ts +79 -59
  495. package/src/interactive/interactive-event-projection.ts +1 -1
  496. package/src/interactive/interactive-input-runtime.ts +2 -2
  497. package/src/interactive/interactive-presentation.ts +21 -16
  498. package/src/interactive/interactive-shell.ts +2 -2
  499. package/src/interactive/interactive-slash-runtime.ts +63 -17
  500. package/src/interactive/interactive-subscriptions.ts +1 -1
  501. package/src/interactive/interactive-tickers.ts +1 -1
  502. package/src/interactive/keybinding-manager.ts +4 -4
  503. package/src/interactive/layout.ts +1 -1
  504. package/src/interactive/memory-overlay.ts +2 -2
  505. package/src/interactive/modal-marker.ts +2 -21
  506. package/src/interactive/mutation-preview.ts +1 -1
  507. package/src/interactive/overlay-frame.ts +4 -12
  508. package/src/interactive/overlay-general-openers.ts +6 -2
  509. package/src/interactive/overlay-key-routing.ts +7 -7
  510. package/src/interactive/overlay-lifecycle.ts +1 -1
  511. package/src/interactive/overlay-model-selectors.ts +3 -3
  512. package/src/interactive/overlays/agents.ts +2 -2
  513. package/src/interactive/overlays/ask-user.ts +25 -11
  514. package/src/interactive/overlays/context-reset.ts +28 -4
  515. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  516. package/src/interactive/overlays/decisions.ts +4 -2
  517. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  518. package/src/interactive/overlays/handoff-review.ts +2 -2
  519. package/src/interactive/overlays/interop.ts +1 -1
  520. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  521. package/src/interactive/overlays/message-picker.ts +1 -1
  522. package/src/interactive/overlays/model-selector.ts +39 -31
  523. package/src/interactive/overlays/prompts.ts +10 -4
  524. package/src/interactive/overlays/session-selector.ts +2 -2
  525. package/src/interactive/overlays/settings.ts +339 -293
  526. package/src/interactive/overlays/side-question.ts +2 -2
  527. package/src/interactive/overlays/skills-hub.ts +8 -8
  528. package/src/interactive/overlays/tree-selector.ts +2 -2
  529. package/src/interactive/panes-runtime.ts +36 -10
  530. package/src/interactive/permission-overlay.ts +2 -2
  531. package/src/interactive/renderers/retry-status.ts +12 -4
  532. package/src/interactive/renderers/tool-execution.ts +4 -4
  533. package/src/interactive/session-transcript.ts +3 -3
  534. package/src/interactive/slash-autocomplete.ts +454 -165
  535. package/src/interactive/slash-commands.ts +279 -183
  536. package/src/interactive/slash-spec.ts +160 -17
  537. package/src/interactive/status/controller.ts +2 -2
  538. package/src/interactive/stream-pacing-policy.ts +1 -1
  539. package/src/interactive/tasks-overlay.ts +20 -13
  540. package/src/interactive/terminal-lease.ts +6 -7
  541. package/src/interactive/turn-context.ts +11 -11
  542. package/src/interactive/turn-persistence.ts +2 -2
  543. package/src/interactive/turn-prewarm.ts +2 -2
  544. package/src/interactive/turn-runtime.ts +8 -8
  545. package/src/interactive/turn-state.ts +1 -1
  546. package/src/interactive/view/artifacts.ts +12 -9
  547. package/src/interactive/view/view-overlay.ts +13 -10
  548. package/src/interactive/watch-pane.ts +38 -10
  549. package/src/interactive/welcome-dashboard.ts +15 -15
  550. package/src/interactive/worker-progress.ts +4 -4
  551. package/src/interactive/worker-receipts.ts +1 -1
  552. package/src/interactive/worker-stream.ts +1 -4
  553. package/src/interactive/yazi-bridge.ts +12 -5
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/builtin-tool-catalog.ts +1 -1
  557. package/src/tools/compete-worktrees.ts +27 -17
  558. package/src/tools/context/index.ts +15 -1
  559. package/src/tools/dispatch-admission.ts +4 -2
  560. package/src/tools/dispatch-arguments.ts +1 -1
  561. package/src/tools/dispatch-plan.ts +0 -11
  562. package/src/tools/dispatch-run-events.ts +12 -10
  563. package/src/tools/dispatch-runner.ts +11 -6
  564. package/src/tools/dispatch.ts +1 -1
  565. package/src/tools/find.ts +1 -6
  566. package/src/tools/monitor.ts +4 -4
  567. package/src/tools/observers.ts +0 -33
  568. package/src/tools/task-worktree.ts +28 -7
  569. package/src/tools/verify/authoring.ts +3 -6
  570. package/src/tools/verify/frontend.ts +1 -1
  571. package/src/tools/web-fetch.ts +1 -1
  572. package/src/worker/entry.ts +4 -3
  573. package/src/worker/protocol.ts +16 -14
  574. package/src/worker/spec-contract.ts +2 -2
  575. package/src/worker/stdin-demux.ts +2 -2
  576. package/dist/chunk-GXNLGKAB.js +0 -571
  577. package/dist/chunk-VFA6GDY5.js +0 -1625
  578. package/dist/doctor-QOA5FNY5.js +0 -313
  579. package/src/engine/apis/degraded-inference.ts +0 -95
  580. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  581. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
@@ -36,14 +36,18 @@ import {
36
36
  MuxError,
37
37
  type MuxEvent,
38
38
  type MuxEventKind,
39
+ type MuxLayoutNode,
40
+ type MuxLayoutTree,
39
41
  type MuxLog,
40
42
  type MuxNotificationSound,
41
43
  type MuxPane,
44
+ type MuxRect,
42
45
  type MuxReportableAgentState,
43
46
  MuxRequestTimeout,
44
47
  type MuxServerInfo,
45
48
  type MuxSnapshot,
46
49
  type MuxTab,
50
+ type MuxTabGeometry,
47
51
  type MuxWorktree,
48
52
  type MuxWorktreeSource,
49
53
  muxErrorKind,
@@ -192,8 +196,32 @@ export interface MuxClient {
192
196
  /** Set the pane's operator-facing label. Available on herdr protocol 17. */
193
197
  paneRename(paneId: string, label: string): Promise<void>;
194
198
  paneClose(paneId: string): Promise<void>;
195
- /** Pane ids sharing a tab with `paneId`, read off the tab's layout snapshot. */
196
- paneLayout(paneId?: string): Promise<ReadonlyArray<string>>;
199
+ /**
200
+ * Cell-precise geometry of the tab holding `paneId` (the server's focused
201
+ * pane when omitted): outer area, pane rects, and live split ratios.
202
+ */
203
+ paneLayout(paneId?: string): Promise<MuxTabGeometry>;
204
+ /**
205
+ * Focus a pane. This switches the focused tab as well as the pane (verified
206
+ * on 0.8.2), so it is only ever driven by an explicit "show me" request,
207
+ * never by background bookkeeping.
208
+ */
209
+ paneFocus(paneId: string): Promise<void>;
210
+ /** Zoom a pane. Zooming an unfocused pane steals focus; same rule as paneFocus. */
211
+ paneZoom(paneId: string, mode: "on" | "off" | "toggle"): Promise<{ changed: boolean; focusChanged: boolean }>;
212
+ /** Portable layout tree for a tab, or the tab holding `paneId`. */
213
+ layoutExport(request?: { tabId?: string; paneId?: string }): Promise<MuxLayoutTree>;
214
+ /**
215
+ * Set one split's ratio, addressed by a boolean path from the root split
216
+ * (`false` descends first, `true` second; `[]` is the root). Returns the
217
+ * updated tree.
218
+ */
219
+ layoutSetSplitRatio(request: {
220
+ tabId?: string;
221
+ paneId?: string;
222
+ path: ReadonlyArray<boolean>;
223
+ ratio: number;
224
+ }): Promise<MuxLayoutTree>;
197
225
  worktreeList(request?: MuxWorktreeListRequest): Promise<MuxWorktreeListResult>;
198
226
  worktreeCreate(request: MuxWorktreeCreateRequest): Promise<MuxWorktreeCreatedResult>;
199
227
  worktreeOpen(request: MuxWorktreeOpenRequest): Promise<MuxWorktreeOpenedResult>;
@@ -410,8 +438,93 @@ function readSnapshot(value: unknown): MuxSnapshot {
410
438
  };
411
439
  }
412
440
 
441
+ function requireNumber(source: Record<string, unknown>, key: string, context: string): number {
442
+ const value = source[key];
443
+ if (typeof value !== "number") {
444
+ throw new MuxError("protocol", `mux ${context} response is missing number field ${key}`);
445
+ }
446
+ return value;
447
+ }
448
+
449
+ function readRect(value: unknown, context: string): MuxRect {
450
+ const source = asRecord(value);
451
+ if (!source) throw new MuxError("protocol", `mux ${context} rect is not an object`);
452
+ return {
453
+ x: requireNumber(source, "x", context),
454
+ y: requireNumber(source, "y", context),
455
+ width: requireNumber(source, "width", context),
456
+ height: requireNumber(source, "height", context),
457
+ };
458
+ }
459
+
460
+ function readSplitDirection(value: unknown, context: string): "right" | "down" {
461
+ if (value === "right" || value === "down") return value;
462
+ throw new MuxError("protocol", `mux ${context} split direction is not right/down`);
463
+ }
464
+
465
+ /** Parses a `PaneLayoutSnapshot`: the shape `pane.layout` and `layout_updated` both carry. */
466
+ function readTabGeometry(value: unknown): MuxTabGeometry {
467
+ const source = asRecord(value);
468
+ if (!source) throw new MuxError("protocol", "mux layout snapshot is not an object");
469
+ return {
470
+ workspaceId: requireString(source, "workspace_id", "layout"),
471
+ tabId: requireString(source, "tab_id", "layout"),
472
+ zoomed: source.zoomed === true,
473
+ area: readRect(source.area, "layout"),
474
+ focusedPaneId: optionalString(source, "focused_pane_id"),
475
+ panes: readArray(source, "panes").map((entry) => {
476
+ const pane = asRecord(entry);
477
+ if (!pane) throw new MuxError("protocol", "mux layout pane entry is not an object");
478
+ return {
479
+ paneId: requireString(pane, "pane_id", "layout pane"),
480
+ focused: pane.focused === true,
481
+ rect: readRect(pane.rect, "layout pane"),
482
+ };
483
+ }),
484
+ splits: readArray(source, "splits").map((entry) => {
485
+ const split = asRecord(entry);
486
+ if (!split) throw new MuxError("protocol", "mux layout split entry is not an object");
487
+ return {
488
+ direction: readSplitDirection(split.direction, "layout"),
489
+ ratio: requireNumber(split, "ratio", "layout split"),
490
+ rect: readRect(split.rect, "layout split"),
491
+ };
492
+ }),
493
+ };
494
+ }
495
+
496
+ function readLayoutNode(value: unknown): MuxLayoutNode {
497
+ const source = asRecord(value);
498
+ if (!source) throw new MuxError("protocol", "mux layout node is not an object");
499
+ if (source.type === "pane") {
500
+ return { type: "pane", paneId: optionalString(source, "pane_id"), label: optionalString(source, "label") };
501
+ }
502
+ if (source.type === "split") {
503
+ return {
504
+ type: "split",
505
+ direction: readSplitDirection(source.direction, "layout tree"),
506
+ ratio: requireNumber(source, "ratio", "layout tree split"),
507
+ first: readLayoutNode(source.first),
508
+ second: readLayoutNode(source.second),
509
+ };
510
+ }
511
+ throw new MuxError("protocol", "mux layout node has an unknown type");
512
+ }
513
+
514
+ function readLayoutTree(value: unknown): MuxLayoutTree {
515
+ const source = asRecord(value);
516
+ if (!source) throw new MuxError("protocol", "mux layout tree is not an object");
517
+ return {
518
+ workspaceId: requireString(source, "workspace_id", "layout tree"),
519
+ tabId: requireString(source, "tab_id", "layout tree"),
520
+ zoomed: source.zoomed === true,
521
+ focusedPaneId: optionalString(source, "focused_pane_id"),
522
+ root: readLayoutNode(source.root),
523
+ };
524
+ }
525
+
413
526
  /** herdr names lifecycle event kinds with underscores on the wire and dots in subscriptions. */
414
- const EVENT_KIND_BY_WIRE: Readonly<Record<string, MuxEventKind>> = {
527
+ const PANE_LEAVE_KIND_BY_WIRE: Readonly<Record<string, "pane.closed" | "pane.exited">> = {
415
528
  pane_closed: "pane.closed",
416
529
  pane_exited: "pane.exited",
417
530
  };
@@ -419,14 +532,37 @@ const EVENT_KIND_BY_WIRE: Readonly<Record<string, MuxEventKind>> = {
419
532
  function readEvent(line: Record<string, unknown>): MuxEvent | null {
420
533
  const wireKind = line.event;
421
534
  if (typeof wireKind !== "string") return null;
422
- const kind = EVENT_KIND_BY_WIRE[wireKind];
423
- if (!kind) return null;
424
535
  const data = asRecord(line.data);
425
536
  if (!data) return null;
426
- const paneId = data.pane_id;
427
- const workspaceId = data.workspace_id;
428
- if (typeof paneId !== "string" || typeof workspaceId !== "string") return null;
429
- return { kind, paneId, workspaceId };
537
+ const leaveKind = PANE_LEAVE_KIND_BY_WIRE[wireKind];
538
+ if (leaveKind) {
539
+ const paneId = data.pane_id;
540
+ const workspaceId = data.workspace_id;
541
+ if (typeof paneId !== "string" || typeof workspaceId !== "string") return null;
542
+ return { kind: leaveKind, paneId, workspaceId };
543
+ }
544
+ if (wireKind === "pane_moved") {
545
+ // The move rewrites the pane id; the payload carries the new pane record
546
+ // plus the id it replaced, and consumers continue from the new one.
547
+ const pane = asRecord(data.pane);
548
+ const previousPaneId = data.previous_pane_id;
549
+ if (!pane || typeof previousPaneId !== "string") return null;
550
+ const paneId = pane.pane_id;
551
+ const tabId = pane.tab_id;
552
+ const workspaceId = pane.workspace_id;
553
+ if (typeof paneId !== "string" || typeof tabId !== "string" || typeof workspaceId !== "string") return null;
554
+ return { kind: "pane.moved", paneId, previousPaneId, tabId, workspaceId };
555
+ }
556
+ if (wireKind === "layout_updated") {
557
+ // The push already carries the full tab geometry, so a consumer never
558
+ // has to answer a layout event with a layout request.
559
+ try {
560
+ return { kind: "layout.updated", geometry: readTabGeometry(data.layout) };
561
+ } catch {
562
+ return null;
563
+ }
564
+ }
565
+ return null;
430
566
  }
431
567
 
432
568
  /** Drops undefined entries so an optional field is absent rather than `null` on the wire. */
@@ -693,17 +829,29 @@ export function createMuxClient(options: MuxClientOptions): MuxClient {
693
829
  async paneClose(paneId: string): Promise<void> {
694
830
  await call("pane.close", { pane_id: paneId });
695
831
  },
696
- async paneLayout(paneId?: string): Promise<ReadonlyArray<string>> {
832
+ async paneLayout(paneId?: string): Promise<MuxTabGeometry> {
697
833
  const result = await callObject("pane.layout", params({ pane_id: paneId }));
698
- const layout = asRecord(result.layout);
699
- if (!layout) throw new MuxError("protocol", "mux pane.layout returned no layout");
700
- const ids: string[] = [];
701
- for (const entry of readArray(layout, "panes")) {
702
- const pane = asRecord(entry);
703
- const id = pane ? pane.pane_id : undefined;
704
- if (typeof id === "string") ids.push(id);
705
- }
706
- return ids;
834
+ return readTabGeometry(result.layout);
835
+ },
836
+ async paneFocus(paneId: string): Promise<void> {
837
+ await call("pane.focus", { pane_id: paneId });
838
+ },
839
+ async paneZoom(paneId: string, mode: "on" | "off" | "toggle"): Promise<{ changed: boolean; focusChanged: boolean }> {
840
+ const result = await callObject("pane.zoom", { pane_id: paneId, mode });
841
+ const zoom = asRecord(result.zoom);
842
+ if (!zoom) throw new MuxError("protocol", "mux pane.zoom returned no zoom result");
843
+ return { changed: zoom.changed === true, focusChanged: zoom.focus_changed === true };
844
+ },
845
+ async layoutExport(request = {}): Promise<MuxLayoutTree> {
846
+ const result = await callObject("layout.export", params({ tab_id: request.tabId, pane_id: request.paneId }));
847
+ return readLayoutTree(result.layout);
848
+ },
849
+ async layoutSetSplitRatio(request): Promise<MuxLayoutTree> {
850
+ const result = await callObject(
851
+ "layout.set_split_ratio",
852
+ params({ tab_id: request.tabId, pane_id: request.paneId, path: [...request.path], ratio: request.ratio }),
853
+ );
854
+ return readLayoutTree(result.layout);
707
855
  },
708
856
  async worktreeList(request = {}): Promise<MuxWorktreeListResult> {
709
857
  const result = await callObject("worktree.list", params({ workspace_id: request.workspaceId, cwd: request.cwd }));
@@ -97,14 +97,57 @@ export interface MuxSnapshot {
97
97
  tabs: ReadonlyArray<MuxTab>;
98
98
  }
99
99
 
100
- /** Lifecycle event kinds Phase 1 subscribes to. */
101
- export type MuxEventKind = "pane.closed" | "pane.exited";
100
+ /** Lifecycle event kinds the pane layer can subscribe to. */
101
+ export type MuxEventKind = "pane.closed" | "pane.exited" | "pane.moved" | "layout.updated";
102
102
 
103
- /** One pushed lifecycle event. */
104
- export interface MuxEvent {
105
- kind: MuxEventKind;
106
- paneId: string;
103
+ /**
104
+ * One pushed lifecycle event. A discriminated union because the payloads
105
+ * differ: pane leave events carry the pane, a move carries the id rewrite
106
+ * herdr performs, and a layout update carries the whole tab geometry so a
107
+ * consumer does not have to turn around and fetch what the push already said.
108
+ */
109
+ export type MuxEvent =
110
+ | { kind: "pane.closed" | "pane.exited"; paneId: string; workspaceId: string }
111
+ | { kind: "pane.moved"; paneId: string; previousPaneId: string; tabId: string; workspaceId: string }
112
+ | { kind: "layout.updated"; geometry: MuxTabGeometry };
113
+
114
+ /** One rectangle in terminal cells, as herdr's layout snapshots report them. */
115
+ export interface MuxRect {
116
+ x: number;
117
+ y: number;
118
+ width: number;
119
+ height: number;
120
+ }
121
+
122
+ /**
123
+ * Cell-precise geometry of one tab: the outer area, every pane's rect, and
124
+ * every split with its live ratio. This is what dock sizing converges on.
125
+ */
126
+ export interface MuxTabGeometry {
127
+ workspaceId: string;
128
+ tabId: string;
129
+ zoomed: boolean;
130
+ area: MuxRect;
131
+ focusedPaneId: string | null;
132
+ panes: ReadonlyArray<{ paneId: string; focused: boolean; rect: MuxRect }>;
133
+ splits: ReadonlyArray<{ direction: "right" | "down"; ratio: number; rect: MuxRect }>;
134
+ }
135
+
136
+ /**
137
+ * One node of a portable tab layout tree, as `layout.export` describes it.
138
+ * Split ratio is the share of the axis the `first` child keeps.
139
+ */
140
+ export type MuxLayoutNode =
141
+ | { type: "pane"; paneId: string | null; label: string | null }
142
+ | { type: "split"; direction: "right" | "down"; ratio: number; first: MuxLayoutNode; second: MuxLayoutNode };
143
+
144
+ /** A whole tab's portable layout tree. */
145
+ export interface MuxLayoutTree {
107
146
  workspaceId: string;
147
+ tabId: string;
148
+ zoomed: boolean;
149
+ focusedPaneId: string | null;
150
+ root: MuxLayoutNode;
108
151
  }
109
152
 
110
153
  /** Where Clio's own pane lives, read from the herdr environment. */
@@ -3,6 +3,8 @@ import { StringDecoder } from "node:string_decoder";
3
3
 
4
4
  export const YAZI_STREAM_POLL_MS = 250;
5
5
  export const YAZI_STREAM_MAX_BYTES = 1024 * 1024;
6
+ export const YAZI_PICK_EVENT = "clio-coder-pick";
7
+ export const LEGACY_YAZI_PICK_EVENT = "clio-pick";
6
8
 
7
9
  export interface YaziCdEvent {
8
10
  kind: "cd";
@@ -13,7 +15,7 @@ export interface YaziCdEvent {
13
15
  }
14
16
 
15
17
  export interface YaziPickEvent {
16
- kind: "clio-pick";
18
+ kind: typeof YAZI_PICK_EVENT;
17
19
  receiver: string;
18
20
  sender: string;
19
21
  values: ReadonlyArray<string>;
@@ -61,7 +63,7 @@ export function parseYaziEventLine(line: string): YaziEvent | null {
61
63
  const third = second < 0 ? -1 : line.indexOf(",", second + 1);
62
64
  if (first <= 0 || second <= first + 1 || third <= second + 1) return null;
63
65
  const kind = line.slice(0, first);
64
- if (kind !== "cd" && kind !== "clio-pick") return null;
66
+ if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) return null;
65
67
  const receiver = line.slice(first + 1, second);
66
68
  const sender = line.slice(second + 1, third);
67
69
  try {
@@ -73,7 +75,7 @@ export function parseYaziEventLine(line: string): YaziEvent | null {
73
75
  return { kind, receiver, sender, tab: String(tab), cwd: body.url };
74
76
  }
75
77
  if (!Array.isArray(body) || !body.every((value) => typeof value === "string")) return null;
76
- return { kind, receiver, sender, values: body };
78
+ return { kind: YAZI_PICK_EVENT, receiver, sender, values: body };
77
79
  } catch {
78
80
  return null;
79
81
  }
@@ -152,7 +154,7 @@ export function createYaziEventStream(options: YaziEventStreamOptions): YaziEven
152
154
  const line = raw.endsWith("\r") ? raw.slice(0, -1) : raw;
153
155
  if (line.length === 0) continue;
154
156
  const kind = line.slice(0, line.indexOf(","));
155
- if (kind !== "cd" && kind !== "clio-pick") continue;
157
+ if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) continue;
156
158
  const event = parseYaziEventLine(line);
157
159
  if (!event) {
158
160
  state.malformedLines += 1;
@@ -119,7 +119,7 @@ function shellQuote(value: string): string {
119
119
 
120
120
  /** Render the one Clio key chord, with an absolute `ya` path for vendored installs. */
121
121
  export function renderYaziKeymap(yaPath: string): string {
122
- const command = `shell -- ${shellQuote(yaPath)} pub-to "$YAZI_ID" clio-pick --list "$CLIO_YAZI_PICK_TOKEN" %s`;
122
+ const command = `shell -- ${shellQuote(yaPath)} pub-to "$YAZI_ID" clio-coder-pick --list "$CLIO_CODER_YAZI_PICK_TOKEN" %s`;
123
123
  return `# Generated by Clio Coder. Changes are replaced when the managed profile regenerates.
124
124
 
125
125
  [[mgr.prepend_keymap]]
@@ -2,12 +2,20 @@ import { spawn } from "node:child_process";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
4
  import { join } from "node:path";
5
+ import { namingCompatibilityEnvironment } from "../../../core/naming-compat.js";
5
6
  import { clioCacheDir } from "../../../core/xdg.js";
6
7
  import { findPinnedTool } from "../../toolchain/registry.js";
7
8
  import { describeResolution, resolveToolBinary, toolStatus } from "../../toolchain/resolve.js";
8
9
  import type { MuxContract } from "../contract.js";
9
10
  import type { MuxPaneRef } from "../types.js";
10
- import { createYaziEventStream, YAZI_STREAM_POLL_MS, type YaziEvent, type YaziEventStream } from "./event-stream.js";
11
+ import {
12
+ createYaziEventStream,
13
+ LEGACY_YAZI_PICK_EVENT,
14
+ YAZI_PICK_EVENT,
15
+ YAZI_STREAM_POLL_MS,
16
+ type YaziEvent,
17
+ type YaziEventStream,
18
+ } from "./event-stream.js";
11
19
  import { ensureYaziProfile, type YaziProfile, yaziProfileDir } from "./profile.js";
12
20
 
13
21
  export type YaziSessionMode = "companion" | "chooser";
@@ -55,6 +63,11 @@ export interface YaziSessionOptions {
55
63
  mode: YaziSessionMode;
56
64
  profileMode: YaziProfileMode;
57
65
  cwd: string;
66
+ /**
67
+ * Files-dock share of the height. Set by the interactive bridge from
68
+ * `interface.panes.files.ratio`; absent it, the dock spec's default governs.
69
+ */
70
+ dockShare?: number;
58
71
  onEvent: (event: YaziEvent) => void;
59
72
  onChooser: (result: YaziChooserResult) => void;
60
73
  onStopped?: (reason: string) => void;
@@ -130,13 +143,19 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
130
143
  const token = options.mode === "companion" ? (options.pickToken ?? randomUUID()) : null;
131
144
  const env: Record<string, string> = {
132
145
  ...(managedProfile ? { YAZI_CONFIG_HOME: managedProfile.dir } : {}),
133
- ...(token ? { CLIO_YAZI_PICK_TOKEN: token } : {}),
146
+ ...(token ? namingCompatibilityEnvironment("CLIO_CODER_YAZI_PICK_TOKEN", "CLIO_YAZI_PICK_TOKEN", token) : {}),
134
147
  };
135
148
  let argv: ReadonlyArray<string>;
136
149
  let stdoutPath: string | undefined;
137
150
  if (options.mode === "companion") {
138
151
  writeFileSync(streamPath, "");
139
- argv = [binaries.yaziPath, "--local-events", "cd,clio-pick", "--remote-events", "clio-pick"];
152
+ argv = [
153
+ binaries.yaziPath,
154
+ "--local-events",
155
+ `cd,${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`,
156
+ "--remote-events",
157
+ `${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`,
158
+ ];
140
159
  stdoutPath = streamPath;
141
160
  } else {
142
161
  writeFileSync(chooserPath, "");
@@ -148,6 +167,10 @@ export async function createYaziSession(options: YaziSessionOptions): Promise<Ya
148
167
  argv,
149
168
  cwd: options.cwd,
150
169
  label: "yazi",
170
+ // The files dock: split down from the anchor at the configured share.
171
+ // Degrades to a plain split inside the contract when the layout tier is
172
+ // absent.
173
+ dock: { slot: "files", ...(options.dockShare === undefined ? {} : { share: options.dockShare }) },
151
174
  ...(Object.keys(env).length > 0 ? { env } : {}),
152
175
  ...(stdoutPath ? { stdoutPath } : {}),
153
176
  });
@@ -96,7 +96,7 @@ async function buildAndIndexEvidence(
96
96
  });
97
97
  } catch (error) {
98
98
  const message = error instanceof Error ? error.message : String(error);
99
- process.stderr.write(`[clio:evidence] auto-build failed for run ${runId}: ${message}\n`);
99
+ process.stderr.write(`[clio-coder:evidence] auto-build failed for run ${runId}: ${message}\n`);
100
100
  hooks.onFailed(runId, message);
101
101
  }
102
102
  }
@@ -130,7 +130,7 @@ export function appendOutOfTurnUsageRow(stateDir: string, row: OutOfTurnUsageRow
130
130
  closeSync(fd);
131
131
  }
132
132
  } catch (error) {
133
- process.stderr.write(`[clio:usage] out-of-turn usage row not written: ${messageOf(error)}\n`);
133
+ process.stderr.write(`[clio-coder:usage] out-of-turn usage row not written: ${messageOf(error)}\n`);
134
134
  return;
135
135
  }
136
136
  appendsSinceBoundCheck += 1;
@@ -139,7 +139,7 @@ export function appendOutOfTurnUsageRow(stateDir: string, row: OutOfTurnUsageRow
139
139
  try {
140
140
  boundOutOfTurnUsageFile(path);
141
141
  } catch (error) {
142
- process.stderr.write(`[clio:usage] out-of-turn usage ring not bounded: ${messageOf(error)}\n`);
142
+ process.stderr.write(`[clio-coder:usage] out-of-turn usage ring not bounded: ${messageOf(error)}\n`);
143
143
  }
144
144
  }
145
145
 
@@ -167,7 +167,7 @@ export function createObservabilityProjection(bus: SafeEventBus, deps: Projectio
167
167
  listener(snapshot);
168
168
  } catch (error) {
169
169
  const message = error instanceof Error ? (error.stack ?? error.message) : String(error);
170
- console.error(`[clio:observability] projection listener crashed: ${message}`);
170
+ console.error(`[clio-coder:observability] projection listener crashed: ${message}`);
171
171
  }
172
172
  }
173
173
  }
@@ -19,6 +19,7 @@ import type {
19
19
  DispatchProgressPayload,
20
20
  DispatchStartedPayload,
21
21
  } from "../../core/bus-events.js";
22
+ import { normalizeClioCoderEventType } from "../../core/naming-events.js";
22
23
  import { processAlive, processBirthToken } from "../../core/process-identity.js";
23
24
  import { createRedactionTally, redactSecretsText } from "../evidence/redact.js";
24
25
 
@@ -110,7 +111,7 @@ function requireSqlite(): DatabaseSyncConstructor {
110
111
  * Exported for the contract test, which drives it with a load that emits both
111
112
  * warnings; production has exactly one caller.
112
113
  */
113
- export function loadWithSqliteWarningSuppressed<T>(load: () => T): T {
114
+ function loadWithSqliteWarningSuppressed<T>(load: () => T): T {
114
115
  if (warningTracingRequested()) return load();
115
116
  const emitWarning = process.emitWarning;
116
117
  const forward = emitWarning.bind(process) as (...args: unknown[]) => void;
@@ -1201,7 +1202,7 @@ export class TraceReader {
1201
1202
  }
1202
1203
 
1203
1204
  events(runId: string, afterRowid = 0, limit = TRACE_EVENT_POLL_LIMIT): TraceEventRow[] {
1204
- return this.db
1205
+ const rows = this.db
1205
1206
  .prepare(`SELECT rowid, event_id, run_id, phase_id, parent_id, type, name, payload_json,
1206
1207
  tokens, started_at, ended_at FROM events
1207
1208
  WHERE run_id = ? AND rowid > ? ORDER BY rowid LIMIT ?`)
@@ -1210,6 +1211,7 @@ export class TraceReader {
1210
1211
  Math.max(0, Math.trunc(afterRowid)),
1211
1212
  clampInt(limit, 1, TRACE_EVENT_POLL_LIMIT),
1212
1213
  ) as unknown as TraceEventRow[];
1214
+ return rows.map((row) => ({ ...row, type: normalizeClioCoderEventType(row.type) }));
1213
1215
  }
1214
1216
 
1215
1217
  /**
@@ -1221,9 +1223,17 @@ export class TraceReader {
1221
1223
  * on the way to counting them.
1222
1224
  */
1223
1225
  eventKindCounts(runId: string): Array<{ type: string; count: number }> {
1224
- return this.db
1226
+ const rows = this.db
1225
1227
  .prepare("SELECT type, COUNT(*) AS count FROM events WHERE run_id=? GROUP BY type ORDER BY count DESC, type")
1226
1228
  .all(runId) as unknown as Array<{ type: string; count: number }>;
1229
+ const counts = new Map<string, number>();
1230
+ for (const row of rows) {
1231
+ const type = normalizeClioCoderEventType(row.type);
1232
+ counts.set(type, (counts.get(type) ?? 0) + row.count);
1233
+ }
1234
+ return [...counts]
1235
+ .map(([type, count]) => ({ type, count }))
1236
+ .sort((left, right) => right.count - left.count || left.type.localeCompare(right.type));
1227
1237
  }
1228
1238
 
1229
1239
  /** Total events and the wall span they cover, without reading one of them. */
@@ -1273,7 +1283,7 @@ export class TraceReader {
1273
1283
  }
1274
1284
 
1275
1285
  select(sql: string): Record<string, SQLInputValue>[] {
1276
- assertSelectOnly(sql);
1286
+ assertTraceSelectOnly(sql);
1277
1287
  return this.db.prepare(sql).all() as Record<string, SQLInputValue>[];
1278
1288
  }
1279
1289
  }
@@ -1301,7 +1311,7 @@ export function createDispatchTraceMirror(
1301
1311
  path: string,
1302
1312
  options: { warn?: (message: string) => void; now?: () => string } = {},
1303
1313
  ): DispatchTraceMirror {
1304
- const warn = options.warn ?? ((message: string) => process.stderr.write(`[clio:trace] ${message}\n`));
1314
+ const warn = options.warn ?? ((message: string) => process.stderr.write(`[clio-coder:trace] ${message}\n`));
1305
1315
  const now = options.now ?? (() => new Date().toISOString());
1306
1316
  let store: TraceStore | null = null;
1307
1317
  let chain: Promise<void> = Promise.resolve();
@@ -1408,7 +1418,7 @@ function recordProgress(
1408
1418
  ): void {
1409
1419
  if (!isRecord(payload.event)) return;
1410
1420
  const event = payload.event;
1411
- const type = typeof event.type === "string" ? event.type : "progress";
1421
+ const type = typeof event.type === "string" ? normalizeClioCoderEventType(event.type) : "progress";
1412
1422
  const toolCallId = stringValue(event.toolCallId) ?? stringValue(event.tool_call_id);
1413
1423
  if (
1414
1424
  type === "message_end" &&
@@ -1442,7 +1452,7 @@ function recordProgress(
1442
1452
  });
1443
1453
  }
1444
1454
  }
1445
- if ((type === "tool_execution_start" || type === "clio_tool_start") && toolCallId !== null) {
1455
+ if ((type === "tool_execution_start" || type === "clio_coder_tool_start") && toolCallId !== null) {
1446
1456
  starts.set(`${payload.runId}:${toolCallId}`, {
1447
1457
  toolCallId,
1448
1458
  tool: stringValue(event.toolName) ?? stringValue(event.tool) ?? "tool",
@@ -1451,7 +1461,7 @@ function recordProgress(
1451
1461
  });
1452
1462
  return;
1453
1463
  }
1454
- if ((type === "tool_execution_end" || type === "clio_tool_finish") && toolCallId !== null) {
1464
+ if ((type === "tool_execution_end" || type === "clio_coder_tool_finish") && toolCallId !== null) {
1455
1465
  const key = `${payload.runId}:${toolCallId}`;
1456
1466
  const start = starts.get(key);
1457
1467
  // One clock frame per row. The worker measures `durationMs` on its own
@@ -1537,12 +1547,12 @@ function recordFailure(store: TraceStore, input: DispatchFailedPayload, at: stri
1537
1547
  function isCriticalTraceEvent(channel: string, raw: unknown): boolean {
1538
1548
  if (channel !== "dispatch.progress") return true;
1539
1549
  if (!isRecord(raw) || !isRecord(raw.event)) return false;
1540
- const type = raw.event.type;
1550
+ const type = typeof raw.event.type === "string" ? normalizeClioCoderEventType(raw.event.type) : raw.event.type;
1541
1551
  return (
1542
1552
  type === "tool_execution_start" ||
1543
1553
  type === "tool_execution_end" ||
1544
- type === "clio_tool_start" ||
1545
- type === "clio_tool_finish" ||
1554
+ type === "clio_coder_tool_start" ||
1555
+ type === "clio_coder_tool_finish" ||
1546
1556
  type === "message_end" ||
1547
1557
  type === "attempt_start"
1548
1558
  );
@@ -1659,7 +1669,7 @@ function sha256(value: string): string {
1659
1669
  return createHash("sha256").update(value, "utf8").digest("hex");
1660
1670
  }
1661
1671
 
1662
- function assertSelectOnly(sql: string): void {
1672
+ export function assertTraceSelectOnly(sql: string): void {
1663
1673
  const trimmed = sql.trim();
1664
1674
  if (!/^(SELECT|WITH)\b/i.test(trimmed)) throw new Error("trace sql accepts SELECT or read-only WITH queries only");
1665
1675
  if (trimmed.includes(";")) throw new Error("trace sql accepts exactly one statement");
@@ -180,7 +180,7 @@ function lookupFragment(table: FragmentTable, id: string, role: string): LoadedF
180
180
  * section and the dispatch worker safety-posture message must describe the
181
181
  * same enforced behavior, so neither side duplicates this switch.
182
182
  */
183
- export function safetyOneLiner(level: string): string {
183
+ function safetyOneLiner(level: string): string {
184
184
  switch (level) {
185
185
  case "read-only":
186
186
  return "inspect and answer; mutating calls are auto-denied, so propose changes instead.";
@@ -653,7 +653,7 @@ export function compileWorker(table: FragmentTable, inputs: WorkerPromptInputs):
653
653
  if (inputs.hasBoundSkills && !inputs.hasCanonicalContext) {
654
654
  throw new Error("prompts/compiler: bound skills require canonical context in the final attached tool surface");
655
655
  }
656
- const identity = lookupFragment(table, "identity.clio-worker", "worker identity");
656
+ const identity = lookupFragment(table, "identity.clio-coder-worker", "worker identity");
657
657
  const operatingContract = lookupFragment(table, "operating.contract", "operating contract");
658
658
  const workerContract = lookupFragment(table, "operating.worker", "worker contract");
659
659
  const safety = lookupFragment(table, `safety.${inputs.autonomy}`, "safety");
@@ -62,7 +62,7 @@ export function createPromptsBundle(
62
62
  table = loadFragments();
63
63
  } catch (err) {
64
64
  const msg = err instanceof Error ? err.message : String(err);
65
- process.stderr.write(`[clio:prompts] reload failed: ${msg}\n`);
65
+ process.stderr.write(`[clio-coder:prompts] reload failed: ${msg}\n`);
66
66
  }
67
67
  }
68
68
 
@@ -81,7 +81,7 @@ export function createPromptsBundle(
81
81
  }
82
82
  const configContract = config();
83
83
  const settings: Readonly<ClioSettings> | undefined = configContract?.get();
84
- const safety = input.autonomy ?? settings?.autonomy ?? "auto-edit";
84
+ const safety = input.autonomy ?? settings?.safety.autonomy ?? "auto-edit";
85
85
  const cwd = input.cwd ?? process.cwd();
86
86
  let contextFiles = "";
87
87
  let projectPreload: ProjectPreloadClass | null = null;
@@ -147,7 +147,7 @@ export function createPromptsBundle(
147
147
  table = loadFragments();
148
148
  } catch (err) {
149
149
  const msg = err instanceof Error ? err.message : String(err);
150
- process.stderr.write(`[clio:prompts] initial load failed: ${msg}\n`);
150
+ process.stderr.write(`[clio-coder:prompts] initial load failed: ${msg}\n`);
151
151
  table = { byId: new Map(), rootDir: "" };
152
152
  }
153
153
  unsubscribeHotReload = context.bus.on(BusChannels.ConfigHotReload, (payload: unknown) => {
@@ -1,5 +1,5 @@
1
1
  ---
2
- id: identity.clio-worker
2
+ id: identity.clio-coder-worker
3
3
  version: 1
4
4
  description: Identity for a bounded Clio fleet worker
5
5
  ---