@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,566 @@
1
+ /**
2
+ * The pane layer's cross-domain surface.
3
+ *
4
+ * Every method is best-effort. A mux failure never fails a dispatch, never
5
+ * throws at a caller, and never blocks the event loop on a dead socket: it logs
6
+ * and degrades to `available() === false`, which the consumers read as "use the
7
+ * native fleet surfaces instead". That is why every method here returns a
8
+ * fallback value rather than rejecting.
9
+ *
10
+ * Two ownership rules run through the whole file. Clio acts only on panes it
11
+ * created, tracked in `pane-registry.ts` and tagged with the `clio_coder_owner`
12
+ * metadata token so `clio doctor` can find orphans. The one documented
13
+ * exception is Clio's own hosting pane in guest mode, which `reportSelf`
14
+ * writes to under SA-3 of the v0.4.0 cycle plan.
15
+ *
16
+ * What is deliberately absent: per-run viewer panes. The v0.4.0 phase 3/4
17
+ * integration opened a pane per dispatched run in a hidden Fleet tab, with a
18
+ * focus ladder, run-state reporting, and resume adoption keyed on run ids. All
19
+ * of that projected fleet state the native surfaces already show onto panes
20
+ * nobody had asked for. The one run-viewing surface is now the workers-view
21
+ * watch pane (src/interactive/watch-pane.ts): a single utility pane following
22
+ * a selection file, opened on operator demand and retargeted by file writes
23
+ * that never touch this socket.
24
+ */
25
+
26
+ import type { DomainContract } from "../../core/domain-loader.js";
27
+ import type { MuxDetection } from "./detect.js";
28
+ import { createDockController, type DockController, type DockSlot, type DockState } from "./dock-controller.js";
29
+ import { createPaneRegistry, type MuxPaneRegistry, paneRecord } from "./pane-registry.js";
30
+ import { muxSupportsMethod } from "./protocol.js";
31
+ import type {
32
+ MuxClient,
33
+ MuxSubscription,
34
+ MuxWorktreeCreatedResult,
35
+ MuxWorktreeCreateRequest,
36
+ } from "./socket-client.js";
37
+ import {
38
+ MuxError,
39
+ type MuxEvent,
40
+ type MuxLog,
41
+ type MuxMode,
42
+ type MuxNotificationSound,
43
+ type MuxPanePurpose,
44
+ type MuxPaneRecord,
45
+ type MuxPaneRef,
46
+ type MuxSelfReport,
47
+ } from "./types.js";
48
+
49
+ /** Metadata source for everything Clio's pane layer writes. */
50
+ const METADATA_SOURCE = "clio-coder:mux";
51
+ /** Agent-authority source for Clio's own hosting pane, per SA-3. */
52
+ const SELF_AGENT_SOURCE = "clio-coder:coder";
53
+ /** Token every Clio-created pane carries so orphans are findable. */
54
+ const OWNER_TOKEN_KEY = "clio_coder_owner";
55
+ const OWNER_TOKEN_VALUE = "clio-coder:mux";
56
+ /** Old-host cleanup bridge; ownership readers retain this indefinitely. */
57
+ const LEGACY_OWNER_TOKEN_KEY = "clio_owner";
58
+ const LEGACY_OWNER_TOKEN_VALUE = "clio:mux";
59
+ /** herdr caps a metadata token value at 80 characters. */
60
+ const TOKEN_VALUE_MAX = 80;
61
+ /** How long `available()` stays false after a transport failure before probing again. */
62
+ const DEGRADE_COOLDOWN_MS = 5_000;
63
+
64
+ export interface MuxOpenUtilityPaneRequest {
65
+ argv: ReadonlyArray<string>;
66
+ cwd: string;
67
+ label: string;
68
+ /** Operator-facing pane title. Omitted when the caller wants the shell default. */
69
+ title?: string;
70
+ purpose?: MuxPanePurpose;
71
+ direction?: "right" | "down";
72
+ env?: Readonly<Record<string, string>>;
73
+ /**
74
+ * Absolute path the pane's stdout is redirected into. Full-screen programs
75
+ * such as Yazi reopen `/dev/tty` for their interface when stdout is not a tty.
76
+ */
77
+ stdoutPath?: string;
78
+ /**
79
+ * Managed placement: the pane becomes this slot's dock, split from the
80
+ * anchor with the slot's direction and sized to `share` of the axis
81
+ * (clamped, cell-floored). Requires the layout tier (protocol 17); below
82
+ * the floor the request degrades to a plain split and `direction` applies.
83
+ */
84
+ dock?: { slot: DockSlot; share?: number };
85
+ }
86
+
87
+ export interface MuxNotifyRequest {
88
+ title: string;
89
+ body?: string;
90
+ sound?: MuxNotificationSound;
91
+ }
92
+
93
+ export interface MuxContract extends DomainContract {
94
+ readonly mode: MuxMode;
95
+ /** `mode !== "none"` and the socket is currently healthy. */
96
+ available(): boolean;
97
+ /**
98
+ * The rung detection resolved to, with the socket it answered on and the
99
+ * protocol recorded from the handshake. `/panes` and `clio-coder doctor`
100
+ * print it; the notify and worktree paths gate on its protocol.
101
+ */
102
+ detection(): Readonly<MuxDetection>;
103
+ openUtilityPane(request: MuxOpenUtilityPaneRequest): Promise<MuxPaneRef | null>;
104
+ /** Close one Clio-created pane by pane id. Refuses a pane Clio did not create. */
105
+ closePane(paneId: string): Promise<boolean>;
106
+ /**
107
+ * Re-adopt one pane of the given purpose that outlived the process that made
108
+ * it. A fresh `session.snapshot` is scanned for a pane carrying Clio's owner
109
+ * token and a matching `role` token; the first hit is recorded and returned.
110
+ * This is what stops a restarted session's Enter-in-the-workers-view from
111
+ * opening a second watch pane beside the surviving one.
112
+ */
113
+ adoptPane(request: { purpose: MuxPanePurpose; label: string; dock?: DockSlot }): Promise<MuxPaneRef | null>;
114
+ /**
115
+ * Focus one Clio-created pane, switching the user's view to it (pane.focus
116
+ * moves the focused tab too). Explicit-request only; refuses foreign panes
117
+ * and servers below the pane.focus floor.
118
+ */
119
+ focusPane(paneId: string): Promise<boolean>;
120
+ /** Zoom one Clio-created pane on, off, or toggled. Zooming steals focus; same rule as focusPane. */
121
+ zoomPane(paneId: string, mode: "on" | "off" | "toggle"): Promise<boolean>;
122
+ /** Set a dock's share of its axis. False when the slot has no dock or the tier is absent. */
123
+ resizeDock(slot: DockSlot, share: number): Promise<boolean>;
124
+ /** Live dock geometry states, for `/panes` status. */
125
+ docks(): ReadonlyArray<DockState>;
126
+ notify(request: MuxNotifyRequest): Promise<void>;
127
+ /** Optional compete storage route. Protocol-gated with a native Git fallback at the caller. */
128
+ worktreeCreate(request: MuxWorktreeCreateRequest): Promise<MuxWorktreeCreatedResult | null>;
129
+ /** Remove a herdr worktree workspace. False tells the caller to use native Git cleanup. */
130
+ worktreeRemove(workspaceId: string, options?: { force?: boolean }): Promise<boolean>;
131
+ /**
132
+ * Called when a pane Clio owns leaves, whether the user closed it or the
133
+ * program in it exited. Callers record it and do not reopen: a closed pane
134
+ * is a decision, not a fault.
135
+ */
136
+ onPaneGone(handler: (record: MuxPaneRecord) => void): () => void;
137
+ /** Panes Clio created, with their purpose. */
138
+ list(): ReadonlyArray<MuxPaneRecord>;
139
+ /**
140
+ * Report Clio's own state on its hosting pane (SA-3). Returns false when
141
+ * there is no pane to report on, which is every mode but guest.
142
+ */
143
+ reportSelf(report: MuxSelfReport): Promise<boolean>;
144
+ shutdown(): Promise<void>;
145
+ }
146
+
147
+ export interface MuxRuntimeOptions {
148
+ detection: MuxDetection;
149
+ client: MuxClient | null;
150
+ log?: MuxLog;
151
+ now?: () => number;
152
+ }
153
+
154
+ /** The contract plus the lifecycle handles the domain extension drives. */
155
+ export interface MuxRuntime {
156
+ contract: MuxContract;
157
+ start(): Promise<void>;
158
+ stop(): Promise<void>;
159
+ /** Test seam: the registry the contract reconciles against. */
160
+ registry: MuxPaneRegistry;
161
+ }
162
+
163
+ /** POSIX single-quoting, so an argv element with spaces or quotes survives the shell. */
164
+ function shellQuote(argv: ReadonlyArray<string>): string {
165
+ return argv.map((arg) => `'${arg.replaceAll("'", `'\\''`)}'`).join(" ");
166
+ }
167
+
168
+ function token(value: string | undefined | null): string | null {
169
+ if (typeof value !== "string" || value.length === 0) return null;
170
+ return value.length > TOKEN_VALUE_MAX ? value.slice(0, TOKEN_VALUE_MAX) : value;
171
+ }
172
+
173
+ function hasOwnedPaneToken(tokens: Readonly<Record<string, string>>): boolean {
174
+ return tokens[OWNER_TOKEN_KEY] === OWNER_TOKEN_VALUE || tokens[LEGACY_OWNER_TOKEN_KEY] === LEGACY_OWNER_TOKEN_VALUE;
175
+ }
176
+
177
+ export function createMuxRuntime(options: MuxRuntimeOptions): MuxRuntime {
178
+ const { detection, client } = options;
179
+ const log = options.log ?? ((): void => undefined);
180
+ const now = options.now ?? Date.now;
181
+ const registry = createPaneRegistry();
182
+ const anchorPaneId = detection.self.paneId;
183
+ /**
184
+ * The managed dock tier needs an anchor to split from and the protocol-17
185
+ * layout methods to converge with. Absent either, dock requests degrade to
186
+ * plain utility splits and the rest of the tier answers false/empty.
187
+ */
188
+ const docks: DockController | null =
189
+ client !== null && anchorPaneId !== null && muxSupportsMethod(detection.server, "layout.export")
190
+ ? createDockController({ client, anchorPaneId, log })
191
+ : null;
192
+
193
+ let healthy = client !== null;
194
+ let probeHealthAt = 0;
195
+ let stopped = false;
196
+ let subscription: MuxSubscription | null = null;
197
+ const paneGoneHandlers = new Set<(record: MuxPaneRecord) => void>();
198
+
199
+ const degrade = (what: string, error: unknown): void => {
200
+ const message = error instanceof Error ? error.message : String(error);
201
+ const transport = error instanceof MuxError && (error.kind === "transport" || error.kind === "timeout");
202
+ if (transport) {
203
+ healthy = false;
204
+ probeHealthAt = now() + DEGRADE_COOLDOWN_MS;
205
+ }
206
+ log(transport ? "warning" : "debug", `mux ${what} failed: ${message}`);
207
+ };
208
+
209
+ const usable = (): boolean => {
210
+ if (stopped || client === null || detection.mode === "none") return false;
211
+ return healthy || now() >= probeHealthAt;
212
+ };
213
+
214
+ /**
215
+ * Runs one mux interaction and swallows everything it can throw. The fallback
216
+ * is what the caller sees when the pane layer is not there, which is the same
217
+ * value it sees in `none` mode.
218
+ */
219
+ const attempt = async <T>(what: string, run: (live: MuxClient) => Promise<T>, fallback: T): Promise<T> => {
220
+ if (!usable() || client === null) return fallback;
221
+ try {
222
+ const value = await run(client);
223
+ healthy = true;
224
+ return value;
225
+ } catch (error) {
226
+ degrade(what, error);
227
+ return fallback;
228
+ }
229
+ };
230
+
231
+ const tagOwner = async (
232
+ live: MuxClient,
233
+ paneId: string,
234
+ tokens: Readonly<Record<string, string | null>>,
235
+ title?: string,
236
+ ): Promise<void> => {
237
+ await live.paneReportMetadata({
238
+ paneId,
239
+ source: METADATA_SOURCE,
240
+ ...(title === undefined ? {} : { title }),
241
+ tokens: {
242
+ [OWNER_TOKEN_KEY]: OWNER_TOKEN_VALUE,
243
+ [LEGACY_OWNER_TOKEN_KEY]: LEGACY_OWNER_TOKEN_VALUE,
244
+ ...tokens,
245
+ },
246
+ });
247
+ };
248
+
249
+ const onEvent = (event: MuxEvent): void => {
250
+ if (event.kind === "layout.updated") {
251
+ docks?.noteLayoutUpdated(event.geometry);
252
+ return;
253
+ }
254
+ if (event.kind === "pane.moved") {
255
+ // herdr rewrites the pane id on a move; the registry and dock state
256
+ // follow it so ownership is not lost to the user reorganizing.
257
+ const held = registry.forget(event.previousPaneId);
258
+ if (held) {
259
+ registry.record({ ...held, ref: { paneId: event.paneId, tabId: event.tabId, workspaceId: event.workspaceId } });
260
+ docks?.notePaneMoved(event.previousPaneId, event.paneId, event.tabId);
261
+ }
262
+ return;
263
+ }
264
+ docks?.notePaneGone(event.paneId);
265
+ const dropped = registry.forget(event.paneId);
266
+ if (dropped) {
267
+ log("debug", `mux pane ${event.paneId} left on ${event.kind}; dropped from the registry`);
268
+ for (const handler of paneGoneHandlers) {
269
+ try {
270
+ handler(dropped);
271
+ } catch (error) {
272
+ log("debug", `mux pane-gone handler threw: ${error instanceof Error ? error.message : String(error)}`);
273
+ }
274
+ }
275
+ }
276
+ };
277
+
278
+ const contract: MuxContract = {
279
+ mode: detection.mode,
280
+
281
+ available(): boolean {
282
+ return usable();
283
+ },
284
+
285
+ detection(): Readonly<MuxDetection> {
286
+ return detection;
287
+ },
288
+
289
+ async openUtilityPane(request: MuxOpenUtilityPaneRequest): Promise<MuxPaneRef | null> {
290
+ // Idempotence for docks: a slot that already has a pane answers with it.
291
+ const dockSlot = request.dock?.slot;
292
+ if (dockSlot && docks) {
293
+ const existing = docks.stateFor(dockSlot);
294
+ const held = existing ? registry.byPaneId(existing.paneId) : null;
295
+ if (held) return held.ref;
296
+ }
297
+ return await attempt(
298
+ "openUtilityPane",
299
+ async (live) => {
300
+ let ref: MuxPaneRef;
301
+ if (request.dock && docks) {
302
+ const placed = await docks.open(request.dock.slot, {
303
+ ...(request.dock.share === undefined ? {} : { share: request.dock.share }),
304
+ cwd: request.cwd,
305
+ ...(request.env ? { env: request.env } : {}),
306
+ });
307
+ // A refusal (anchor too small) is an answer, not a failure.
308
+ if (placed === null) return null;
309
+ ref = placed;
310
+ } else {
311
+ const anchor = anchorPaneId ?? (await live.paneCurrent()).paneId;
312
+ const pane = await live.paneSplit({
313
+ direction: request.direction ?? "right",
314
+ targetPaneId: anchor,
315
+ cwd: request.cwd,
316
+ focus: false,
317
+ ...(request.env ? { env: request.env } : {}),
318
+ });
319
+ ref = { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
320
+ }
321
+ const purpose = request.purpose ?? "utility";
322
+ registry.record(paneRecord(ref, { purpose, label: request.label, openedAt: now() }));
323
+ const title = request.title;
324
+ const titleSupported = title !== undefined && muxSupportsMethod(detection.server, "pane.rename");
325
+ if (titleSupported) {
326
+ try {
327
+ await live.paneRename(ref.paneId, title);
328
+ } catch {
329
+ // Presentation is optional. A server that advertises the floor but
330
+ // lacks or refuses rename must not strand an otherwise healthy pane.
331
+ }
332
+ }
333
+ // The `role` token is what adoptPane finds again after a restart.
334
+ await tagOwner(live, ref.paneId, { role: token(purpose) }, titleSupported ? title : undefined);
335
+ if (request.argv.length > 0) {
336
+ // herdr has no argv parameter on pane.split, so the command goes in
337
+ // through the pane's shell. `exec` replaces the shell so the pane
338
+ // exits with the program and emits pane.exited for reconciliation.
339
+ const redirect = request.stdoutPath ? ` > ${shellQuote([request.stdoutPath])}` : "";
340
+ await live.paneSendText(ref.paneId, `exec ${shellQuote(request.argv)}${redirect}\n`);
341
+ }
342
+ return ref;
343
+ },
344
+ null,
345
+ );
346
+ },
347
+
348
+ async closePane(paneId: string): Promise<boolean> {
349
+ // The ownership rule, restated for the operator-facing path: `/panes
350
+ // close` addresses panes by id and must refuse anything the registry
351
+ // does not hold.
352
+ if (!registry.owns(paneId)) return false;
353
+ return await attempt(
354
+ "closePane",
355
+ async (live) => {
356
+ await live.paneClose(paneId);
357
+ registry.forget(paneId);
358
+ // Dock state must fall with the registry entry, not ride on the async
359
+ // pane.closed push: if the event subscription failed at start(), no
360
+ // push ever comes, and a slot pointing at a dead pane makes every
361
+ // later dock open return the corpse.
362
+ docks?.notePaneGone(paneId);
363
+ return true;
364
+ },
365
+ false,
366
+ );
367
+ },
368
+
369
+ async adoptPane(request: { purpose: MuxPanePurpose; label: string; dock?: DockSlot }): Promise<MuxPaneRef | null> {
370
+ const existing = registry.byPurpose(request.purpose);
371
+ if (existing) return existing.ref;
372
+ return await attempt(
373
+ "adoptPane",
374
+ async (live) => {
375
+ const snapshot = await live.snapshot();
376
+ for (const pane of snapshot.panes) {
377
+ if (!hasOwnedPaneToken(pane.tokens)) continue;
378
+ if (pane.tokens.role !== request.purpose) continue;
379
+ if (registry.owns(pane.paneId)) continue;
380
+ // Another workspace's pane belongs to another session's screen;
381
+ // adopting it would retarget a surface the operator cannot see.
382
+ if (detection.self.workspaceId !== null && pane.workspaceId !== detection.self.workspaceId) continue;
383
+ const ref: MuxPaneRef = { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
384
+ registry.record(
385
+ paneRecord(ref, { purpose: request.purpose, label: request.label, openedAt: now(), adopted: true }),
386
+ );
387
+ // Crash recovery for a dock: the surviving pane takes the slot back so
388
+ // geometry management resumes instead of a second dock opening.
389
+ if (request.dock && docks) docks.adopt(request.dock, ref);
390
+ log("info", `mux adopted a ${request.purpose} pane left open by a previous session`);
391
+ return ref;
392
+ }
393
+ return null;
394
+ },
395
+ null,
396
+ );
397
+ },
398
+
399
+ async focusPane(paneId: string): Promise<boolean> {
400
+ // Ownership first: focusing the user's own panes stays off the table
401
+ // even though the wire allows it.
402
+ if (!registry.owns(paneId)) return false;
403
+ if (!muxSupportsMethod(detection.server, "pane.focus")) return false;
404
+ return await attempt(
405
+ "focusPane",
406
+ async (live) => {
407
+ await live.paneFocus(paneId);
408
+ return true;
409
+ },
410
+ false,
411
+ );
412
+ },
413
+
414
+ async zoomPane(paneId: string, mode: "on" | "off" | "toggle"): Promise<boolean> {
415
+ if (!registry.owns(paneId)) return false;
416
+ if (!muxSupportsMethod(detection.server, "pane.zoom")) return false;
417
+ return await attempt(
418
+ "zoomPane",
419
+ async (live) => {
420
+ const result = await live.paneZoom(paneId, mode);
421
+ // A toggle always changes state; on/off report false when already there.
422
+ return result.changed;
423
+ },
424
+ false,
425
+ );
426
+ },
427
+
428
+ async resizeDock(slot: DockSlot, share: number): Promise<boolean> {
429
+ if (!docks) return false;
430
+ return await attempt("resizeDock", () => docks.resize(slot, share), false);
431
+ },
432
+
433
+ docks(): ReadonlyArray<DockState> {
434
+ return docks?.states() ?? [];
435
+ },
436
+
437
+ async notify(request: MuxNotifyRequest): Promise<void> {
438
+ if (!muxSupportsMethod(detection.server, "notification.show")) {
439
+ log("debug", `mux notify skipped, server protocol is below the notification.show floor: ${request.title}`);
440
+ return;
441
+ }
442
+ await attempt(
443
+ "notify",
444
+ async (live) => {
445
+ const result = await live.notificationShow({
446
+ title: request.title,
447
+ ...(request.body ? { body: request.body } : {}),
448
+ ...(request.sound ? { sound: request.sound } : {}),
449
+ });
450
+ // A suppressed toast is the operator's own herdr config talking
451
+ // (disabled, rate limited, no foreground client). Reporting it as a
452
+ // warning would turn their setting into Clio's error.
453
+ if (!result.shown) log("debug", `mux notify not shown (${result.reason}): ${request.title}`);
454
+ return undefined;
455
+ },
456
+ undefined,
457
+ );
458
+ },
459
+
460
+ async worktreeCreate(request: MuxWorktreeCreateRequest): Promise<MuxWorktreeCreatedResult | null> {
461
+ if (!muxSupportsMethod(detection.server, "worktree.create")) {
462
+ log("debug", "mux worktree.create skipped, server protocol is below the worktree floor");
463
+ return null;
464
+ }
465
+ return await attempt("worktreeCreate", (live) => live.worktreeCreate(request), null);
466
+ },
467
+
468
+ async worktreeRemove(workspaceId: string, removeOptions = {}): Promise<boolean> {
469
+ if (!muxSupportsMethod(detection.server, "worktree.remove")) {
470
+ log("debug", "mux worktree.remove skipped, server protocol is below the worktree floor");
471
+ return false;
472
+ }
473
+ return await attempt(
474
+ "worktreeRemove",
475
+ async (live) => {
476
+ await live.worktreeRemove(workspaceId, removeOptions);
477
+ return true;
478
+ },
479
+ false,
480
+ );
481
+ },
482
+
483
+ onPaneGone(handler: (record: MuxPaneRecord) => void): () => void {
484
+ paneGoneHandlers.add(handler);
485
+ return () => {
486
+ paneGoneHandlers.delete(handler);
487
+ };
488
+ },
489
+
490
+ list(): ReadonlyArray<MuxPaneRecord> {
491
+ return registry.list();
492
+ },
493
+
494
+ async reportSelf(report: MuxSelfReport): Promise<boolean> {
495
+ const paneId = detection.self.paneId;
496
+ if (detection.mode !== "guest" || !paneId) return false;
497
+ return await attempt(
498
+ "reportSelf",
499
+ async (live) => {
500
+ await live.paneReportAgent({
501
+ paneId,
502
+ source: SELF_AGENT_SOURCE,
503
+ agent: "clio-coder",
504
+ state: report.state,
505
+ ...(report.message ? { message: report.message } : {}),
506
+ });
507
+ if (report.tokens || report.stateLabels || report.ttlMs !== undefined) {
508
+ await live.paneReportMetadata({
509
+ paneId,
510
+ source: METADATA_SOURCE,
511
+ ...(report.tokens ? { tokens: report.tokens } : {}),
512
+ ...(report.stateLabels ? { stateLabels: report.stateLabels } : {}),
513
+ ...(report.ttlMs !== undefined ? { ttlMs: report.ttlMs } : {}),
514
+ });
515
+ }
516
+ return true;
517
+ },
518
+ false,
519
+ );
520
+ },
521
+
522
+ async shutdown(): Promise<void> {
523
+ if (stopped) return;
524
+ stopped = true;
525
+ subscription?.close();
526
+ subscription = null;
527
+ paneGoneHandlers.clear();
528
+ // Docks close with the session: a native application takes its windows
529
+ // with it. A crash never reaches this method, which is exactly what
530
+ // leaves dock panes behind for the next session's adoption path.
531
+ // Unmanaged utility panes are the operator's and stay open.
532
+ if (client && docks) {
533
+ for (const paneId of docks.paneIds()) {
534
+ await client.paneClose(paneId).catch(() => undefined);
535
+ registry.forget(paneId);
536
+ }
537
+ docks.clear();
538
+ }
539
+ if (client) await client.close().catch(() => undefined);
540
+ },
541
+ };
542
+
543
+ const start = async (): Promise<void> => {
544
+ if (detection.mode === "none" || client === null) return;
545
+ try {
546
+ const kinds: ("pane.closed" | "pane.exited" | "pane.moved" | "layout.updated")[] = ["pane.closed", "pane.exited"];
547
+ if (docks) kinds.push("pane.moved", "layout.updated");
548
+ subscription = await client.subscribe(kinds, onEvent, {
549
+ onResync: (snapshot) => {
550
+ // A reconnect means events were missed. The snapshot is the authority
551
+ // on which panes still exist, so anything Clio thinks it owns that is
552
+ // absent from it is gone.
553
+ const dropped = registry.reconcile(snapshot.panes.map((pane) => pane.paneId));
554
+ for (const record of dropped) docks?.notePaneGone(record.ref.paneId);
555
+ if (dropped.length > 0) {
556
+ log("info", `mux reconciled ${dropped.length} pane(s) closed while the socket was down`);
557
+ }
558
+ },
559
+ });
560
+ } catch (error) {
561
+ degrade("event subscription", error);
562
+ }
563
+ };
564
+
565
+ return { contract, start, stop: contract.shutdown, registry };
566
+ }