@iowarp/clio-coder 0.4.0 → 0.4.2

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 (751) hide show
  1. package/CHANGELOG.md +131 -0
  2. package/CONTRIBUTING.md +59 -36
  3. package/README.md +407 -375
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-G5WJBNCT.js → acp-TMDQZDIG.js} +14 -14
  6. package/dist/{agents-FMV2Q5G4.js → agents-5N5NG3XG.js} +45 -34
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-3IDSJEIK.js → auth-Z5CCBXKQ.js} +22 -21
  9. package/dist/{builtins-XCZWXSC7.js → builtins-K6TNDT24.js} +6 -6
  10. package/dist/{chunk-GR5G2PVF.js → chunk-2HFQNRV3.js} +15 -10
  11. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  12. package/dist/{chunk-HJJTYUHX.js → chunk-2NHR3NAY.js} +168 -1406
  13. package/dist/chunk-2X4RYJTJ.js +39 -0
  14. package/dist/{chunk-UXMFQ54G.js → chunk-2Z2IKEXI.js} +39 -43
  15. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  16. package/dist/chunk-34BHNEE3.js +1846 -0
  17. package/dist/{chunk-YJX4SHTD.js → chunk-35MSIRKH.js} +9 -4
  18. package/dist/chunk-3EBYEESD.js +314 -0
  19. package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
  20. package/dist/chunk-3KIPBMUA.js +308 -0
  21. package/dist/chunk-3M6DQK6S.js +362 -0
  22. package/dist/{chunk-BPKCPIL7.js → chunk-462T4EGZ.js} +3 -3
  23. package/dist/{chunk-QLFS5GO2.js → chunk-4JDLP6ZS.js} +44 -37
  24. package/dist/{chunk-LDQ2ZF2M.js → chunk-4O6MANBS.js} +6 -6
  25. package/dist/{chunk-O6TL7WWY.js → chunk-54ODD65L.js} +6 -6
  26. package/dist/{chunk-JDG2WCRO.js → chunk-5KW52TEP.js} +5 -5
  27. package/dist/{chunk-NHLBIGRH.js → chunk-5PFYMY2V.js} +41 -18
  28. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  29. package/dist/chunk-77QIVUZB.js +1334 -0
  30. package/dist/{chunk-HWHKMHUA.js → chunk-7BHIY2MW.js} +9 -15
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-VAZSBTKF.js → chunk-AZ4WMN4W.js} +2 -2
  33. package/dist/{chunk-B7OBL7PK.js → chunk-B74PXLU7.js} +21 -11
  34. package/dist/{chunk-CY6FY24N.js → chunk-B7HM5Z7T.js} +15 -15
  35. package/dist/{chunk-ULC6OTWO.js → chunk-BO7Y52RY.js} +88 -27
  36. package/dist/chunk-BTK3SSSK.js +67 -0
  37. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  38. package/dist/{chunk-DQITNCXG.js → chunk-BYMNWQ7O.js} +149 -159
  39. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  40. package/dist/{chunk-Z4TXYIEG.js → chunk-CRFOIAX3.js} +10 -10
  41. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  42. package/dist/{chunk-3BT2XMV4.js → chunk-CYZW7JHJ.js} +53 -60
  43. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  44. package/dist/chunk-D7E7WCDF.js +27 -0
  45. package/dist/{chunk-X3YGUTOB.js → chunk-DYHAXKHD.js} +90 -62
  46. package/dist/{chunk-QBJA7R7N.js → chunk-DZAW46HP.js} +3 -3
  47. package/dist/{chunk-MLKNTWH2.js → chunk-DZEK6CJN.js} +22 -22
  48. package/dist/{chunk-K5C3NCBD.js → chunk-E7GT7O5N.js} +5 -5
  49. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  50. package/dist/chunk-F2I26BDK.js +66 -0
  51. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  52. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  53. package/dist/{chunk-32KWKNSF.js → chunk-FVDGR2ZL.js} +4 -4
  54. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  55. package/dist/{chunk-SJ5ZKQ4S.js → chunk-HIICAHCJ.js} +2 -2
  56. package/dist/chunk-HJWWJ6IL.js +184 -0
  57. package/dist/{chunk-WZR7K7ZX.js → chunk-HKMD33FO.js} +32 -83
  58. package/dist/chunk-HLAFFSEK.js +360 -0
  59. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  60. package/dist/{chunk-KFZI4NIL.js → chunk-I64IFBLB.js} +152 -31
  61. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  62. package/dist/{chunk-BUMFYQFY.js → chunk-I66ZTYNP.js} +543 -267
  63. package/dist/{chunk-2OQE55CK.js → chunk-I7XBWTYH.js} +2 -2
  64. package/dist/{chunk-GKF55TAZ.js → chunk-IDNA72AH.js} +104 -3
  65. package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
  66. package/dist/{chunk-J4W7KFM7.js → chunk-IKSLQ4XV.js} +5439 -3475
  67. package/dist/{chunk-6DB53AJS.js → chunk-IMXMHHMQ.js} +171 -30
  68. package/dist/{chunk-AB44T6BB.js → chunk-JBCS7CRR.js} +8 -7
  69. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  70. package/dist/{chunk-SP2RXXYO.js → chunk-JWJGP5DQ.js} +10 -10
  71. package/dist/{chunk-HZHHCK24.js → chunk-KKOJXO6R.js} +527 -325
  72. package/dist/chunk-KPXDY6QF.js +47 -0
  73. package/dist/{chunk-LQ3DZAMX.js → chunk-LJID3DYZ.js} +8 -2
  74. package/dist/{chunk-7MCTRUCE.js → chunk-M2DAX4F6.js} +2 -2
  75. package/dist/{chunk-VEO4AP2K.js → chunk-M2WXEHER.js} +4 -3
  76. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  77. package/dist/{chunk-YDFRH54B.js → chunk-MCMZMDAC.js} +4 -4
  78. package/dist/{chunk-J5Q24KAG.js → chunk-MNJGS2IN.js} +5 -6
  79. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  80. package/dist/chunk-NDDGJUXD.js +81 -0
  81. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  82. package/dist/chunk-NMJXSHBJ.js +283 -0
  83. package/dist/{chunk-VYMXRQI6.js → chunk-O3YUNJZ2.js} +88 -100
  84. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  85. package/dist/{chunk-Z2RR6MAK.js → chunk-P75RZCJW.js} +28 -6
  86. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  87. package/dist/{chunk-DYJP44XW.js → chunk-PGF63K6I.js} +2 -2
  88. package/dist/chunk-PJX3WQUQ.js +42 -0
  89. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  90. package/dist/{chunk-2JDWVJND.js → chunk-Q4XWMHX6.js} +5 -7
  91. package/dist/{chunk-W5VSYASO.js → chunk-QQLGQY2A.js} +46 -87
  92. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  93. package/dist/{chunk-C2LTL2W6.js → chunk-RLYRBIYQ.js} +463 -180
  94. package/dist/{chunk-4ZG3XFUR.js → chunk-S66XZJOF.js} +14 -23
  95. package/dist/{chunk-I5VEOC6I.js → chunk-SSEYRH53.js} +13 -14
  96. package/dist/chunk-SZAA6XDG.js +30 -0
  97. package/dist/{chunk-CODPRO7Q.js → chunk-TPEQIQIE.js} +7 -7
  98. package/dist/{chunk-QLL7ILRG.js → chunk-UBRFI4HS.js} +1151 -614
  99. package/dist/{chunk-O4XIVISU.js → chunk-UH347SHR.js} +227 -47
  100. package/dist/{chunk-OQBA45DZ.js → chunk-UH632ZYL.js} +2 -2
  101. package/dist/chunk-UXCU4E3T.js +303 -0
  102. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  103. package/dist/{chunk-IQ7KR472.js → chunk-VIA6RFQZ.js} +8 -13
  104. package/dist/{chunk-V5DHCITQ.js → chunk-VKPAQYEB.js} +49 -19
  105. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  106. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  107. package/dist/{chunk-3XML7CDN.js → chunk-W4YEMFBX.js} +3 -3
  108. package/dist/{chunk-U77AMWDL.js → chunk-W6NIE6OW.js} +44 -23
  109. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  110. package/dist/{chunk-QREDIESB.js → chunk-X7IARSHT.js} +15 -9
  111. package/dist/{chunk-3URVFKWK.js → chunk-XE3PCIXH.js} +5 -5
  112. package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
  113. package/dist/{chunk-F4CKPOEQ.js → chunk-XOXV5GKE.js} +119 -38
  114. package/dist/chunk-XQRY4DTA.js +657 -0
  115. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  116. package/dist/{chunk-NQQH3YT7.js → chunk-YJISEZKC.js} +3 -3
  117. package/dist/{chunk-X75E3D2N.js → chunk-ZGNYYXQ6.js} +18 -16
  118. package/dist/{chunk-LY4S7GJC.js → chunk-ZNT2M6TG.js} +20 -18
  119. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  120. package/dist/{chunk-IBEBSCYA.js → chunk-ZW4HH5JJ.js} +43 -34
  121. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  122. package/dist/cli/index.js +38 -37
  123. package/dist/{clio-2JXHBBY5.js → clio-7VB377CC.js} +12 -13
  124. package/dist/{code-nav-3YYRMYNF.js → code-nav-YVLCYA7V.js} +86 -18
  125. package/dist/codewiki/build-worker.js +1 -1
  126. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  127. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  128. package/dist/{config-QZPCMYSO.js → config-4HVOS65E.js} +112 -63
  129. package/dist/{configure-TEGEBYCA.js → configure-PIWO7B24.js} +25 -22
  130. package/dist/{context-E6H5RNMC.js → context-IYEHL3WQ.js} +53 -47
  131. package/dist/{context-GSXUE4CT.js → context-KQYIWPWT.js} +68 -42
  132. package/dist/{context-AV7OEZ4D.js → context-N6ZE3LGJ.js} +11 -11
  133. package/dist/{context-clear-SHIBYK6T.js → context-clear-G4OGZJDS.js} +53 -47
  134. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-BWLF6LJP.js} +12 -11
  135. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-2QQAITS3.js} +67 -58
  136. package/dist/{docs-23KQS3XK.js → docs-PD3EXDKU.js} +20 -25
  137. package/dist/doctor-LHBD36VU.js +773 -0
  138. package/dist/{eval-TFBYQH4H.js → eval-C45FYRJ6.js} +68 -49
  139. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-6DEJPLBF.js} +7 -8
  140. package/dist/{evidence-ERGESKGN.js → evidence-6SHONYAF.js} +50 -44
  141. package/dist/{evolve-VDXTSYCJ.js → evolve-KRKMV72X.js} +49 -43
  142. package/dist/{extensions-7BGBHN57.js → extensions-KPZ2UHBB.js} +8 -6
  143. package/dist/{fleet-2RRVDF2V.js → fleet-IVTCKDHT.js} +93 -79
  144. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EDWL3IT7.js} +10 -9
  145. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-YP3YEFGK.js} +6 -6
  146. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-ZFWKHY2M.js} +19 -15
  147. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-FVUNCBML.js} +50 -45
  148. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-UN5XED4R.js} +5 -9
  149. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-XOWC4HSX.js} +22 -17
  150. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-UN3SODEL.js} +48 -43
  151. package/dist/fleet-view-TWHJKCN6.js +96 -0
  152. package/dist/{init-DN2WWLFE.js → init-T2QORQ3Y.js} +72 -66
  153. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  154. package/dist/{interop-OZBKXAYL.js → interop-IN5I2A66.js} +13 -11
  155. package/dist/{library-YWZG7IMW.js → library-LSCATDLZ.js} +23 -18
  156. package/dist/{memory-I4C4HMLW.js → memory-HYOKAGGJ.js} +51 -45
  157. package/dist/{models-CEYXJBO6.js → models-2GPMFYCM.js} +42 -33
  158. package/dist/{monitor-NZ6GCI3P.js → monitor-E4ASVUJH.js} +56 -50
  159. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-DDMPR3PY.js} +2676 -1507
  160. package/dist/{panes-KY6W3V2E.js → panes-E3RUXOW5.js} +5 -5
  161. package/dist/panes-IXKLOKA2.js +75 -0
  162. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  163. package/dist/{reset-DQ6FGCSH.js → reset-OAQP3W4O.js} +7 -8
  164. package/dist/{resources-BB3MVJMD.js → resources-OTRSN34L.js} +23 -17
  165. package/dist/{run-H2GQDUER.js → run-5DEYH5QK.js} +95 -84
  166. package/dist/{share-GTJN6A5O.js → share-IHWTLO3M.js} +26 -19
  167. package/dist/{skills-L55TEW6R.js → skills-IYMXMKW4.js} +25 -20
  168. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-DROHSJAR.js} +63 -65
  169. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-D7X4L4ZX.js} +21 -16
  170. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-QBM7UZ3B.js} +38 -33
  171. package/dist/{steer-RZGSCY4R.js → steer-Z5DO23FJ.js} +3 -3
  172. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  173. package/dist/{targets-NCPZ644J.js → targets-P2FUC4IL.js} +64 -61
  174. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-YREJ3JX2.js} +15 -10
  175. package/dist/{tools-DAF3DI3C.js → tools-5B7RO6MV.js} +10 -8
  176. package/dist/{trace-FYVW2MQA.js → trace-YMGMUM6A.js} +101 -8
  177. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  178. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  179. package/dist/{upgrade-3XPP6OQL.js → upgrade-PXK3S2YM.js} +36 -61
  180. package/dist/{usage-3NLHGTU2.js → usage-ME5MPXGX.js} +58 -53
  181. package/dist/{verifiers-SSQONKRT.js → verifiers-BVZ7IWOO.js} +10 -9
  182. package/dist/{verify-3U6J7FZI.js → verify-5K7ZKQFC.js} +9 -8
  183. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPARV2K7.js} +2 -3
  184. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-F5W5QTYY.js} +74 -70
  185. package/dist/{with-panes-MKB46MPQ.js → with-panes-BYOJCLAM.js} +78 -246
  186. package/dist/worker/entry.js +83 -63
  187. package/docs/README.md +176 -81
  188. package/docs/{acp.md → architecture/acp.md} +36 -20
  189. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  190. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  191. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
  192. package/docs/architecture/artifact-versions.md +90 -0
  193. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  194. package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
  195. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  196. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  197. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  198. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  199. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  200. package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
  201. package/docs/{observability.md → architecture/observability.md} +26 -13
  202. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  203. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
  204. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
  205. package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
  206. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  207. package/docs/architecture/time-conventions.md +125 -0
  208. package/docs/{trace-store.md → architecture/trace-store.md} +26 -13
  209. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  210. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  211. package/docs/{built-in-agents.md → guide/built-in-agents.md} +70 -46
  212. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +73 -62
  213. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -444
  214. package/docs/guide/configuration-reference.md +1158 -0
  215. package/docs/{environment-variables.md → guide/environment-variables.md} +31 -27
  216. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +8 -3
  217. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  218. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +47 -49
  219. package/docs/{glossary.md → guide/glossary.md} +14 -11
  220. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +45 -14
  221. package/docs/guide/panes-and-files.md +290 -0
  222. package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
  223. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  224. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
  225. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  226. package/docs/{troubleshooting.md → guide/troubleshooting.md} +10 -5
  227. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +13 -10
  228. package/docs/history/release-cut-checklist.md +207 -0
  229. package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
  230. package/docs/process/documentation-coverage.md +100 -0
  231. package/docs/process/documentation-guide.md +187 -0
  232. package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
  233. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  234. package/docs/{evolution.md → process/evolution.md} +2 -2
  235. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +17 -10
  236. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  237. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  238. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  239. package/evals/README.md +5 -0
  240. package/evals/behavioral-corpus-grader.mjs +103 -0
  241. package/evals/behavioral-machinery-baseline.json +2276 -0
  242. package/evals/behavioral-machinery-driver.ts +250 -0
  243. package/evals/behavioral-machinery-support.ts +253 -0
  244. package/evals/behavioral-machinery.yaml +614 -0
  245. package/evals/behavioral-model-negative-control.yaml +68 -0
  246. package/evals/behavioral-model.yaml +216 -0
  247. package/evals/fixtures/behavioral-facts.txt +3 -0
  248. package/evals/fixtures/behavioral-main.ts +7 -0
  249. package/evals/fixtures/decoy/note.txt +2 -0
  250. package/evals/fixtures/private/credentials.txt +1 -0
  251. package/evals/tracked-metrics-baseline.yaml +229 -0
  252. package/evals/tracked-metrics-grader.mjs +129 -0
  253. package/package.json +13 -21
  254. package/skills/README.md +51 -42
  255. package/skills/coding/ast-grep/SKILL.md +9 -3
  256. package/skills/coding/coding-standards/SKILL.md +9 -3
  257. package/skills/coding/prototype/SKILL.md +9 -3
  258. package/skills/coding/tdd/SKILL.md +9 -3
  259. package/skills/context/context-handoff/SKILL.md +13 -4
  260. package/skills/context/context-handoff/evals.md +3 -3
  261. package/skills/context/context-prime/SKILL.md +9 -3
  262. package/skills/context/context-prime/evals.md +2 -2
  263. package/skills/git/file-ticket/SKILL.md +10 -5
  264. package/skills/git/file-ticket/evals.md +2 -2
  265. package/skills/git/fix-issue/SKILL.md +12 -5
  266. package/skills/git/fix-issue/evals.md +4 -4
  267. package/skills/git/resolve-merge-conflicts/SKILL.md +9 -3
  268. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  269. package/skills/git/ship/SKILL.md +10 -4
  270. package/skills/git/ship/evals.md +4 -4
  271. package/skills/git/worktree-create/SKILL.md +8 -3
  272. package/skills/git/worktree-create/evals.md +6 -6
  273. package/skills/git/worktree-merge/SKILL.md +8 -3
  274. package/skills/git/worktree-merge/evals.md +6 -6
  275. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +22 -12
  276. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +5 -4
  277. package/skills/meta/clio-coder-test/SKILL.md +146 -0
  278. package/skills/meta/{clio-test → clio-coder-test}/evals.md +10 -5
  279. package/skills/meta/clio-coder-test/references/harness.md +102 -0
  280. package/skills/meta/clio-coder-test/references/test-map.md +96 -0
  281. package/skills/meta/credentials/SKILL.md +10 -3
  282. package/skills/meta/find-skills/SKILL.md +9 -3
  283. package/skills/meta/herdr/SKILL.md +9 -3
  284. package/skills/meta/skill-craft/SKILL.md +39 -16
  285. package/skills/planning/architecture/SKILL.md +9 -3
  286. package/skills/planning/backlog/SKILL.md +9 -3
  287. package/skills/planning/prd/SKILL.md +9 -3
  288. package/skills/planning/product-intent/SKILL.md +9 -3
  289. package/skills/planning/tech-spec/SKILL.md +9 -3
  290. package/skills/registry.yaml +66 -66
  291. package/skills/research/arxiv-literature/SKILL.md +9 -3
  292. package/skills/research/experiment-protocol/SKILL.md +10 -3
  293. package/skills/research/scientific-debugging/SKILL.md +10 -3
  294. package/skills/research/scientific-debugging/evals.md +2 -2
  295. package/skills/research/scientific-modernization/SKILL.md +10 -3
  296. package/skills/skill-marketplace.json +285 -66
  297. package/skills/workflow/cut-it/SKILL.md +11 -3
  298. package/skills/workflow/design-council/SKILL.md +12 -3
  299. package/skills/workflow/grill-me/SKILL.md +9 -3
  300. package/skills/workflow/workflow-distiller/SKILL.md +9 -3
  301. package/src/cli/acp.ts +2 -2
  302. package/src/cli/args.ts +2 -2
  303. package/src/cli/auth.ts +2 -2
  304. package/src/cli/bootstrap-generate.ts +6 -6
  305. package/src/cli/clio.ts +6 -1
  306. package/src/cli/config-inspect.ts +68 -15
  307. package/src/cli/configure-interop.ts +1 -1
  308. package/src/cli/configure.ts +27 -31
  309. package/src/cli/default-target.ts +1 -1
  310. package/src/cli/docs.ts +28 -20
  311. package/src/cli/doctor-naming.ts +323 -0
  312. package/src/cli/doctor-panes.ts +46 -14
  313. package/src/cli/doctor-toolchain.ts +31 -10
  314. package/src/cli/doctor.ts +15 -1
  315. package/src/cli/eval-inventory.ts +8 -8
  316. package/src/cli/eval.ts +1 -2
  317. package/src/cli/evidence-detail.ts +1 -1
  318. package/src/cli/evidence-inventory.ts +1 -1
  319. package/src/cli/extensions.ts +2 -1
  320. package/src/cli/fleet-decisions.ts +1 -1
  321. package/src/cli/fleet-inspect.ts +1 -1
  322. package/src/cli/fleet-preflight.ts +1 -1
  323. package/src/cli/fleet-verify.ts +1 -1
  324. package/src/cli/fleet-view.ts +40 -23
  325. package/src/cli/fleet.ts +9 -6
  326. package/src/cli/index.ts +2 -1
  327. package/src/cli/internal-dispatch.ts +3 -4
  328. package/src/cli/interop-inspect.ts +2 -2
  329. package/src/cli/models.ts +3 -3
  330. package/src/cli/modes/print.ts +1 -1
  331. package/src/cli/panes.ts +19 -5
  332. package/src/cli/reset.ts +1 -1
  333. package/src/cli/run.ts +13 -17
  334. package/src/cli/share.ts +6 -2
  335. package/src/cli/skills-eval.ts +14 -14
  336. package/src/cli/targets.ts +25 -30
  337. package/src/cli/trace-inspect.ts +1 -1
  338. package/src/cli/trace.ts +96 -4
  339. package/src/cli/uninstall.ts +2 -2
  340. package/src/cli/upgrade.ts +29 -34
  341. package/src/cli/usage.ts +2 -2
  342. package/src/cli/validate-model.ts +1 -1
  343. package/src/cli/verifiers-inspect.ts +1 -1
  344. package/src/cli/wiki-generate.ts +6 -6
  345. package/src/core/artifact-paths.ts +1 -1
  346. package/src/core/bash-exec.ts +132 -87
  347. package/src/core/boot-trace.ts +3 -3
  348. package/src/core/bus-events.ts +51 -6
  349. package/src/core/bus-trace.ts +2 -2
  350. package/src/core/compile-cache.ts +1 -1
  351. package/src/core/config.ts +1066 -886
  352. package/src/core/defaults.ts +326 -530
  353. package/src/core/dispatch-outcome.ts +16 -0
  354. package/src/core/domain-loader.ts +6 -4
  355. package/src/core/event-bus.ts +1 -1
  356. package/src/core/file-references.ts +78 -88
  357. package/src/core/git-commit-attribution.ts +3 -9
  358. package/src/core/guardrails.ts +33 -52
  359. package/src/core/naming-compat.ts +45 -0
  360. package/src/core/naming-events.ts +62 -0
  361. package/src/core/prompt-hint.ts +9 -0
  362. package/src/core/recent-models.ts +1 -7
  363. package/src/core/residency-protection.ts +4 -8
  364. package/src/core/resolve-config-value.ts +1 -1
  365. package/src/core/response-model-id.ts +0 -14
  366. package/src/core/session-routing.ts +84 -74
  367. package/src/core/skill-activation.ts +18 -0
  368. package/src/core/termination.ts +4 -4
  369. package/src/core/timers.ts +2 -12
  370. package/src/domains/agents/builtins/architect.md +2 -3
  371. package/src/domains/agents/builtins/coder.md +3 -2
  372. package/src/domains/agents/builtins/debugger.md +2 -2
  373. package/src/domains/agents/builtins/documenter.md +2 -2
  374. package/src/domains/agents/builtins/git-master.md +1 -1
  375. package/src/domains/agents/builtins/oracle.md +1 -1
  376. package/src/domains/agents/builtins/provenance.md +1 -1
  377. package/src/domains/agents/builtins/researcher.md +1 -1
  378. package/src/domains/agents/builtins/scout.md +1 -1
  379. package/src/domains/agents/builtins/tester.md +2 -2
  380. package/src/domains/agents/builtins/verifier.md +2 -2
  381. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  382. package/src/domains/agents/catalog.ts +14 -26
  383. package/src/domains/agents/contract.ts +2 -0
  384. package/src/domains/agents/extension.ts +26 -4
  385. package/src/domains/agents/registry.ts +7 -7
  386. package/src/domains/agents/result-contract.ts +1 -1
  387. package/src/domains/agents/spec.ts +0 -11
  388. package/src/domains/config/classify.ts +35 -47
  389. package/src/domains/config/extension.ts +5 -5
  390. package/src/domains/config/keybindings.ts +56 -47
  391. package/src/domains/config/watcher.ts +1 -1
  392. package/src/domains/context/codewiki/indexer.ts +1 -1
  393. package/src/domains/context/extension.ts +3 -6
  394. package/src/domains/context/prompt-context.ts +1 -1
  395. package/src/domains/context/wiki/assemble.ts +2 -2
  396. package/src/domains/context/working-set/path-index.ts +1 -0
  397. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  398. package/src/domains/context/working-set/replay/report.ts +1 -1
  399. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  400. package/src/domains/dispatch/active-route-planner.ts +2 -2
  401. package/src/domains/dispatch/agent-candidates.ts +1 -1
  402. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  403. package/src/domains/dispatch/agent-ledger.ts +1 -1
  404. package/src/domains/dispatch/assignment.ts +5 -5
  405. package/src/domains/dispatch/capability-match.ts +10 -0
  406. package/src/domains/dispatch/capacity-lease.ts +2 -5
  407. package/src/domains/dispatch/code-step.ts +1 -1
  408. package/src/domains/dispatch/contract.ts +2 -2
  409. package/src/domains/dispatch/extension.ts +169 -82
  410. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  411. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  412. package/src/domains/dispatch/fleet-run.ts +0 -7
  413. package/src/domains/dispatch/gate-decisions.ts +25 -14
  414. package/src/domains/dispatch/host-verification.ts +435 -39
  415. package/src/domains/dispatch/intent-requirements.ts +10 -0
  416. package/src/domains/dispatch/intent.ts +18 -1
  417. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  418. package/src/domains/dispatch/path-scope.ts +220 -70
  419. package/src/domains/dispatch/placement.ts +2 -2
  420. package/src/domains/dispatch/receipt-findings.ts +1 -1
  421. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  422. package/src/domains/dispatch/reservation-store.ts +0 -23
  423. package/src/domains/dispatch/route-decision.ts +1 -1
  424. package/src/domains/dispatch/route-history.ts +1 -1
  425. package/src/domains/dispatch/route-policy.ts +1 -1
  426. package/src/domains/dispatch/route-readiness.ts +0 -28
  427. package/src/domains/dispatch/run-event-journal.ts +9 -19
  428. package/src/domains/dispatch/state.ts +2 -3
  429. package/src/domains/dispatch/tool-stats.ts +1 -1
  430. package/src/domains/dispatch/transport.ts +47 -40
  431. package/src/domains/dispatch/types.ts +58 -6
  432. package/src/domains/dispatch/worker-protocol.ts +2 -2
  433. package/src/domains/eval/artifacts/store.ts +10 -4
  434. package/src/domains/eval/compare/thresholds.ts +0 -8
  435. package/src/domains/eval/execution-provenance.ts +1 -1
  436. package/src/domains/eval/metrics/token-stream.ts +0 -7
  437. package/src/domains/eval/report.ts +1 -1
  438. package/src/domains/eval/runner.ts +1 -1
  439. package/src/domains/eval/runners/clio-run.ts +7 -6
  440. package/src/domains/eval/runners/external-command.ts +4 -3
  441. package/src/domains/eval/schema/artifact.ts +1 -1
  442. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  443. package/src/domains/eval/schema/behavioral.ts +7 -6
  444. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  445. package/src/domains/eval/schema/naming.ts +10 -0
  446. package/src/domains/eval/schema/suite.ts +2 -2
  447. package/src/domains/eval/schema/validate.ts +9 -5
  448. package/src/domains/eval/schema/verdict.ts +4 -2
  449. package/src/domains/eval/store.ts +20 -3
  450. package/src/domains/eval/suites/run.ts +12 -6
  451. package/src/domains/eval/types.ts +1 -1
  452. package/src/domains/eval/workspaces/git.ts +1 -1
  453. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  454. package/src/domains/evidence/build.ts +13 -5
  455. package/src/domains/evidence/trust-status.ts +10 -1
  456. package/src/domains/extensions/contract.ts +15 -1
  457. package/src/domains/extensions/discovery.ts +238 -41
  458. package/src/domains/extensions/extension.ts +105 -6
  459. package/src/domains/extensions/index.ts +24 -0
  460. package/src/domains/extensions/integrity.ts +189 -0
  461. package/src/domains/extensions/manager.ts +17 -1
  462. package/src/domains/extensions/resource-path.ts +27 -0
  463. package/src/domains/extensions/resources.ts +18 -38
  464. package/src/domains/extensions/snapshot-store.ts +39 -0
  465. package/src/domains/extensions/snapshot.ts +180 -0
  466. package/src/domains/extensions/state.ts +385 -57
  467. package/src/domains/extensions/types.ts +118 -1
  468. package/src/domains/interop/consent.ts +7 -7
  469. package/src/domains/interop/extension.ts +1 -1
  470. package/src/domains/lifecycle/doctor.ts +27 -21
  471. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  472. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  473. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  474. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  475. package/src/domains/lifecycle/migrations/index.ts +22 -1
  476. package/src/domains/lifecycle/naming-history.ts +153 -0
  477. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  478. package/src/domains/lifecycle/naming-resources.ts +276 -0
  479. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  480. package/src/domains/lifecycle/naming-yazi.ts +86 -0
  481. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  482. package/src/domains/memory/task-memory-handoff.ts +6 -3
  483. package/src/domains/middleware/contract.ts +26 -0
  484. package/src/domains/middleware/extension.ts +24 -24
  485. package/src/domains/middleware/hook-receipts.ts +27 -4
  486. package/src/domains/middleware/hooks-io.ts +65 -32
  487. package/src/domains/middleware/hooks.ts +64 -0
  488. package/src/domains/middleware/index.ts +35 -4
  489. package/src/domains/middleware/marketplace-offer.ts +339 -0
  490. package/src/domains/middleware/registrations.ts +326 -0
  491. package/src/domains/middleware/runtime.ts +30 -2
  492. package/src/domains/middleware/snapshot.ts +20 -7
  493. package/src/domains/mux/contract.ts +195 -25
  494. package/src/domains/mux/detect.ts +23 -6
  495. package/src/domains/mux/dock-controller.ts +365 -0
  496. package/src/domains/mux/extension.ts +7 -1
  497. package/src/domains/mux/index.ts +21 -1
  498. package/src/domains/mux/operations.ts +72 -5
  499. package/src/domains/mux/protocol.ts +19 -6
  500. package/src/domains/mux/socket-client.ts +167 -19
  501. package/src/domains/mux/types.ts +49 -6
  502. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  503. package/src/domains/mux/yazi/event-stream.ts +6 -4
  504. package/src/domains/mux/yazi/profile.ts +1 -1
  505. package/src/domains/mux/yazi/session.ts +79 -7
  506. package/src/domains/mux/yazi/theme.ts +117 -17
  507. package/src/domains/observability/contract.ts +10 -11
  508. package/src/domains/observability/extension.ts +12 -4
  509. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  510. package/src/domains/observability/projection.ts +15 -91
  511. package/src/domains/observability/trace-store.ts +65 -19
  512. package/src/domains/prompts/compiler.ts +75 -55
  513. package/src/domains/prompts/contract.ts +15 -3
  514. package/src/domains/prompts/extension.ts +100 -12
  515. package/src/domains/prompts/fragments/identity/clio-worker.md +2 -4
  516. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  517. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  518. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  519. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  520. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  521. package/src/domains/prompts/fragments/operating/skills.md +11 -18
  522. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  523. package/src/domains/providers/extension.ts +5 -5
  524. package/src/domains/providers/index.ts +1 -1
  525. package/src/domains/providers/knowledge-base-path.ts +1 -1
  526. package/src/domains/providers/model-runtime-capabilities.ts +99 -23
  527. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  528. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +671 -106
  529. package/src/domains/providers/plugins.ts +1 -1
  530. package/src/domains/providers/resolver.ts +1 -1
  531. package/src/domains/providers/runtime-resolution.ts +31 -0
  532. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  533. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  534. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  535. package/src/domains/providers/runtimes/common/probe-helpers.ts +9 -4
  536. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  537. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  538. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  539. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  540. package/src/domains/providers/types/cost-provenance.ts +19 -0
  541. package/src/domains/providers/types/knowledge-base.ts +13 -0
  542. package/src/domains/providers/types/local-model-quirks.ts +87 -39
  543. package/src/domains/providers/types/target-descriptor.ts +3 -3
  544. package/src/domains/resources/extension.ts +1 -1
  545. package/src/domains/resources/library.ts +6 -6
  546. package/src/domains/resources/prompts/loader.ts +1 -1
  547. package/src/domains/resources/skills/content-hash.ts +7 -6
  548. package/src/domains/resources/skills/evals.ts +1 -1
  549. package/src/domains/resources/skills/install.ts +36 -12
  550. package/src/domains/resources/skills/loader.ts +41 -18
  551. package/src/domains/resources/skills/marketplace.ts +21 -2
  552. package/src/domains/resources/skills/promotion.ts +214 -0
  553. package/src/domains/safety/audit.ts +2 -2
  554. package/src/domains/safety/call-target.ts +1 -1
  555. package/src/domains/safety/finish-contract.ts +2 -1
  556. package/src/domains/safety/loop-detector.ts +7 -4
  557. package/src/domains/safety/run-effects.ts +1 -1
  558. package/src/domains/scheduling/extension.ts +4 -4
  559. package/src/domains/session/archive-readers.ts +9 -1
  560. package/src/domains/session/compaction/branch-summary.ts +4 -0
  561. package/src/domains/session/compaction/compact.ts +1 -1
  562. package/src/domains/session/compaction/tokens.ts +4 -0
  563. package/src/domains/session/context-accounting.ts +1 -1
  564. package/src/domains/session/decision-board.ts +1 -1
  565. package/src/domains/session/extension.ts +1 -1
  566. package/src/domains/session/handoff.ts +2 -2
  567. package/src/domains/session/prompt-manifest.ts +0 -5
  568. package/src/domains/session/protected-artifact-journal.ts +12 -6
  569. package/src/domains/session/retry.ts +1 -1
  570. package/src/domains/session/task-board.ts +10 -9
  571. package/src/domains/share/archive.ts +249 -43
  572. package/src/domains/toolchain/install.ts +1 -1
  573. package/src/engine/acp/adapter.ts +3 -3
  574. package/src/engine/acp/event-mapper.ts +3 -3
  575. package/src/engine/acp/server.ts +89 -35
  576. package/src/engine/acp/tool-mediator.ts +2 -2
  577. package/src/engine/acp/types.ts +1 -1
  578. package/src/engine/alcf-oauth.ts +5 -5
  579. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  580. package/src/engine/api-registry.ts +1 -1
  581. package/src/engine/apis/llamacpp-residency.ts +4 -23
  582. package/src/engine/apis/lmstudio.ts +4 -9
  583. package/src/engine/apis/ollama-native.ts +9 -9
  584. package/src/engine/apis/openai-completions.ts +30 -27
  585. package/src/engine/apis/output-budget.ts +8 -18
  586. package/src/engine/apis/residency.ts +10 -35
  587. package/src/engine/claude/sdk-module.ts +1 -12
  588. package/src/engine/claude/sdk-runtime.ts +6 -6
  589. package/src/engine/claude/subprocess-runtime.ts +1 -1
  590. package/src/engine/claude/tool-safety.ts +4 -4
  591. package/src/engine/gemma-channel-filter.ts +19 -0
  592. package/src/engine/loop-guard.ts +92 -17
  593. package/src/engine/session.ts +14 -7
  594. package/src/engine/tui-primitives.ts +1 -1
  595. package/src/engine/worker-events.ts +6 -6
  596. package/src/engine/worker-runtime.ts +54 -24
  597. package/src/engine/worker-tools.ts +3 -1
  598. package/src/entry/extension-hook-sources.ts +28 -0
  599. package/src/entry/extension-reload.ts +309 -0
  600. package/src/entry/orchestrator.ts +163 -120
  601. package/src/interactive/application-controller.ts +23 -22
  602. package/src/interactive/bus-notices.ts +10 -3
  603. package/src/interactive/chat-loop-messages.ts +3 -13
  604. package/src/interactive/chat-loop.ts +18 -9
  605. package/src/interactive/chat-panel.ts +37 -14
  606. package/src/interactive/chat-renderer.ts +71 -7
  607. package/src/interactive/clio-editor.ts +105 -1
  608. package/src/interactive/context-activity.ts +8 -6
  609. package/src/interactive/context-meter.ts +3 -6
  610. package/src/interactive/context-overlay.ts +1 -1
  611. package/src/interactive/cost-overlay.ts +1 -1
  612. package/src/interactive/council-grid.ts +2 -2
  613. package/src/interactive/dispatch-board.ts +36 -44
  614. package/src/interactive/editor-bash.ts +21 -0
  615. package/src/interactive/editor-steer.ts +9 -4
  616. package/src/interactive/editor-submit.ts +24 -18
  617. package/src/interactive/external-editor.ts +1 -1
  618. package/src/interactive/file-reference-completion.ts +360 -0
  619. package/src/interactive/footer/dashboard.ts +15 -17
  620. package/src/interactive/footer/notifications.ts +14 -8
  621. package/src/interactive/footer/widgets.ts +15 -44
  622. package/src/interactive/interactive-application.ts +116 -61
  623. package/src/interactive/interactive-event-projection.ts +1 -1
  624. package/src/interactive/interactive-input-runtime.ts +6 -2
  625. package/src/interactive/interactive-presentation.ts +22 -17
  626. package/src/interactive/interactive-shell.ts +2 -2
  627. package/src/interactive/interactive-slash-runtime.ts +65 -17
  628. package/src/interactive/interactive-subscriptions.ts +1 -1
  629. package/src/interactive/interactive-tickers.ts +1 -1
  630. package/src/interactive/keybinding-manager.ts +4 -4
  631. package/src/interactive/layout.ts +1 -1
  632. package/src/interactive/memory-overlay.ts +2 -2
  633. package/src/interactive/modal-marker.ts +2 -21
  634. package/src/interactive/mutation-preview.ts +1 -1
  635. package/src/interactive/overlay-frame.ts +4 -12
  636. package/src/interactive/overlay-general-openers.ts +6 -2
  637. package/src/interactive/overlay-key-routing.ts +7 -7
  638. package/src/interactive/overlay-lifecycle.ts +1 -1
  639. package/src/interactive/overlay-model-selectors.ts +3 -3
  640. package/src/interactive/overlays/agents.ts +2 -2
  641. package/src/interactive/overlays/ask-user.ts +25 -11
  642. package/src/interactive/overlays/context-reset.ts +28 -4
  643. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  644. package/src/interactive/overlays/decisions.ts +4 -2
  645. package/src/interactive/overlays/extensions.ts +9 -1
  646. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  647. package/src/interactive/overlays/handoff-review.ts +2 -2
  648. package/src/interactive/overlays/help-reference.ts +13 -0
  649. package/src/interactive/overlays/interop.ts +1 -1
  650. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  651. package/src/interactive/overlays/message-picker.ts +1 -1
  652. package/src/interactive/overlays/model-selector.ts +39 -31
  653. package/src/interactive/overlays/prompts.ts +10 -4
  654. package/src/interactive/overlays/session-selector.ts +2 -2
  655. package/src/interactive/overlays/settings.ts +360 -303
  656. package/src/interactive/overlays/side-question.ts +2 -2
  657. package/src/interactive/overlays/skills-hub.ts +8 -8
  658. package/src/interactive/overlays/tree-selector.ts +2 -2
  659. package/src/interactive/panes-runtime.ts +145 -43
  660. package/src/interactive/permission-overlay.ts +2 -2
  661. package/src/interactive/prompt-cache-identity.ts +88 -0
  662. package/src/interactive/renderers/retry-status.ts +12 -4
  663. package/src/interactive/renderers/tool-execution.ts +4 -4
  664. package/src/interactive/session-transcript.ts +3 -3
  665. package/src/interactive/slash-autocomplete.ts +454 -165
  666. package/src/interactive/slash-commands.ts +401 -190
  667. package/src/interactive/slash-spec.ts +160 -17
  668. package/src/interactive/status/controller.ts +2 -2
  669. package/src/interactive/stream-pacing-policy.ts +1 -24
  670. package/src/interactive/tasks-overlay.ts +20 -13
  671. package/src/interactive/terminal-lease.ts +6 -7
  672. package/src/interactive/turn-context.ts +41 -26
  673. package/src/interactive/turn-persistence.ts +2 -2
  674. package/src/interactive/turn-prewarm.ts +2 -2
  675. package/src/interactive/turn-runtime.ts +8 -8
  676. package/src/interactive/turn-state.ts +1 -1
  677. package/src/interactive/view/artifacts.ts +12 -9
  678. package/src/interactive/view/view-overlay.ts +13 -10
  679. package/src/interactive/watch-pane.ts +38 -10
  680. package/src/interactive/welcome-dashboard.ts +15 -15
  681. package/src/interactive/worker-progress.ts +4 -4
  682. package/src/interactive/worker-receipts.ts +1 -1
  683. package/src/interactive/worker-stream.ts +1 -4
  684. package/src/interactive/yazi-bridge.ts +72 -11
  685. package/src/tools/agent-tools.ts +30 -1
  686. package/src/tools/artifact.ts +2 -2
  687. package/src/tools/ask-user.ts +6 -6
  688. package/src/tools/bash.ts +2 -2
  689. package/src/tools/bootstrap.ts +4 -0
  690. package/src/tools/builtin-tool-catalog.ts +52 -22
  691. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  692. package/src/tools/codewiki/code-nav.ts +99 -13
  693. package/src/tools/compete-worktrees.ts +27 -17
  694. package/src/tools/context/docs-engine.ts +20 -7
  695. package/src/tools/context/index.ts +44 -13
  696. package/src/tools/core-bootstrap.ts +28 -6
  697. package/src/tools/credential-present.ts +1 -2
  698. package/src/tools/dispatch-admission.ts +4 -2
  699. package/src/tools/dispatch-arguments.ts +6 -2
  700. package/src/tools/dispatch-plan.ts +48 -15
  701. package/src/tools/dispatch-run-events.ts +13 -11
  702. package/src/tools/dispatch-runner.ts +11 -6
  703. package/src/tools/dispatch-schema.ts +338 -0
  704. package/src/tools/dispatch-types.ts +3 -0
  705. package/src/tools/dispatch.ts +9 -254
  706. package/src/tools/find.ts +1 -6
  707. package/src/tools/ledger.ts +3 -5
  708. package/src/tools/monitor-surface.ts +5 -13
  709. package/src/tools/monitor.ts +4 -4
  710. package/src/tools/observation.ts +4 -5
  711. package/src/tools/observers.ts +0 -33
  712. package/src/tools/panes-surface.ts +4 -11
  713. package/src/tools/panes.ts +4 -2
  714. package/src/tools/policy.ts +15 -2
  715. package/src/tools/read.ts +5 -6
  716. package/src/tools/registry.ts +30 -7
  717. package/src/tools/result-shaping.ts +18 -14
  718. package/src/tools/steer-surface.ts +1 -1
  719. package/src/tools/task-worktree.ts +28 -7
  720. package/src/tools/tasks.ts +1 -1
  721. package/src/tools/truncate.ts +6 -5
  722. package/src/tools/verify/authoring.ts +3 -6
  723. package/src/tools/verify/frontend.ts +1 -1
  724. package/src/tools/verify/surface.ts +6 -12
  725. package/src/tools/web-fetch-surface.ts +1 -3
  726. package/src/tools/web-fetch.ts +1 -1
  727. package/src/worker/entry.ts +4 -3
  728. package/src/worker/protocol.ts +16 -14
  729. package/src/worker/spec-contract.ts +2 -2
  730. package/src/worker/stdin-demux.ts +2 -2
  731. package/dist/chunk-36EJLSQQ.js +0 -814
  732. package/dist/chunk-GXNLGKAB.js +0 -571
  733. package/dist/chunk-K7VKOLQQ.js +0 -15
  734. package/dist/chunk-PMZCIOCJ.js +0 -25
  735. package/dist/chunk-SUCTJL45.js +0 -45
  736. package/dist/chunk-SUW5DORT.js +0 -819
  737. package/dist/chunk-TZ3SGWZZ.js +0 -48
  738. package/dist/chunk-UOV2BYIW.js +0 -107
  739. package/dist/chunk-VFA6GDY5.js +0 -1625
  740. package/dist/doctor-QOA5FNY5.js +0 -313
  741. package/dist/fleet-view-ZCON35AG.js +0 -102
  742. package/dist/panes-HMABYVO4.js +0 -58
  743. package/docs/artifact-versions.md +0 -67
  744. package/docs/documentation-coverage.md +0 -46
  745. package/docs/documentation-guide.md +0 -167
  746. package/docs/release-cut-checklist.md +0 -193
  747. package/docs/time-conventions.md +0 -101
  748. package/skills/meta/clio-test/SKILL.md +0 -133
  749. package/skills/meta/clio-test/references/harness.md +0 -126
  750. package/skills/meta/clio-test/references/test-map.md +0 -69
  751. package/src/engine/apis/degraded-inference.ts +0 -95
@@ -1,7 +1,8 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
2
  import {
3
- parseTomlDocument
4
- } from "./chunk-LCGCVYZ4.js";
3
+ ensureYaziProfile,
4
+ yaziProfileDir
5
+ } from "./chunk-3M6DQK6S.js";
5
6
  import {
6
7
  describeResolution,
7
8
  resolveToolBinary,
@@ -11,279 +12,217 @@ import {
11
12
  findPinnedTool
12
13
  } from "./chunk-QDC3K2U3.js";
13
14
  import {
14
- readClioVersion,
15
+ namingCompatibilityEnvironment
16
+ } from "./chunk-D7E7WCDF.js";
17
+ import {
15
18
  resolvePackageRoot
16
19
  } from "./chunk-IWHMRKLL.js";
17
20
  import {
18
- clioCacheDir,
19
- resolveClioDirs
21
+ clioCacheDir
20
22
  } from "./chunk-BYP5D4HI.js";
21
23
  import {
22
24
  init_esm_shims
23
25
  } from "./chunk-3R73A4XB.js";
24
26
 
25
- // src/domains/mux/yazi/profile.ts
27
+ // src/domains/mux/index.ts
26
28
  init_esm_shims();
27
- import { spawnSync } from "node:child_process";
28
- import { createHash } from "node:crypto";
29
- import {
30
- cpSync,
31
- mkdirSync,
32
- mkdtempSync,
33
- readdirSync,
34
- readFileSync,
35
- renameSync,
36
- rmSync,
37
- statSync,
38
- writeFileSync
39
- } from "node:fs";
40
- import { homedir } from "node:os";
41
- import { dirname, isAbsolute, join, relative } from "node:path";
42
29
 
43
- // src/domains/mux/yazi/theme.ts
30
+ // src/domains/mux/extension.ts
44
31
  init_esm_shims();
45
32
 
46
- // src/core/theme-token-hex.ts
33
+ // src/domains/mux/contract.ts
47
34
  init_esm_shims();
48
- var TOKEN_HEX = {
49
- accent: "#46e5d0",
50
- accentDeep: "#1fb7a6",
51
- action: "#ff7e29",
52
- success: "#57e389",
53
- warning: "#ffb454",
54
- error: "#ff5c66",
55
- info: "#5ba8ff",
56
- reason: "#9d8cff",
57
- dim: "#6a7a85",
58
- muted: "#8a99a4",
59
- title: "#46e5d0",
60
- frame: "#2f5d5a",
61
- frameStrong: "#2aab9e"
62
- };
63
- function tokenHex(token2) {
64
- return TOKEN_HEX[token2];
65
- }
66
-
67
- // src/domains/mux/yazi/theme.ts
68
- function renderYaziTheme() {
69
- return `# Generated by Clio Coder. Changes are replaced when the managed profile regenerates.
70
-
71
- [mgr]
72
- cwd = { fg = "${tokenHex("accent")}" }
73
- find_keyword = { fg = "${tokenHex("warning")}" }
74
- marker_selected = { fg = "${tokenHex("success")}", bg = "${tokenHex("success")}" }
75
- marker_copied = { fg = "${tokenHex("accent")}", bg = "${tokenHex("accent")}" }
76
- marker_cut = { fg = "${tokenHex("error")}", bg = "${tokenHex("error")}" }
77
- border_style = { fg = "${tokenHex("frame")}" }
78
35
 
79
- [mode]
80
- normal_main = { bg = "${tokenHex("accent")}" }
81
- normal_alt = { fg = "${tokenHex("accent")}" }
82
- select_main = { bg = "${tokenHex("action")}" }
83
- select_alt = { fg = "${tokenHex("action")}" }
84
- unset_main = { bg = "${tokenHex("error")}" }
85
- unset_alt = { fg = "${tokenHex("error")}" }
86
-
87
- [tabs]
88
- active = { bg = "${tokenHex("accent")}" }
89
- inactive = { fg = "${tokenHex("accent")}" }
90
-
91
- [status]
92
- perm_sep = { fg = "${tokenHex("dim")}" }
93
- `;
94
- }
95
-
96
- // src/domains/mux/yazi/profile.ts
97
- var PROFILE_FILES = ["yazi.toml", "keymap.toml", "theme.toml", "init.lua"];
98
- var PROFILE_PLUGIN_FILES = ["main.lua", "types.lua", "LICENSE", "README.md"];
99
- var STAMP_FILE = "stamp.json";
100
- function yaziProfileDir(cacheDir = resolveClioDirs().cache) {
101
- return join(cacheDir, "yazi", "profile");
102
- }
103
- function userYaziConfigDir(env = process.env, home = homedir()) {
104
- const xdg = env.XDG_CONFIG_HOME;
105
- return xdg && isAbsolute(xdg) ? join(xdg, "yazi") : join(home, ".config", "yazi");
106
- }
107
- function resetYaziProfile(profileDir = yaziProfileDir()) {
108
- rmSync(profileDir, { recursive: true, force: true });
109
- }
110
- function defaultAssetDir() {
111
- return join(resolvePackageRoot(), "src", "domains", "mux", "yazi", "assets");
112
- }
113
- function yaziPin() {
114
- return findPinnedTool("yazi")?.version ?? "unknown";
115
- }
116
- function sha256(input) {
117
- return createHash("sha256").update(input).digest("hex");
118
- }
119
- function filesBelow(root, current = root) {
120
- const files = [];
121
- for (const entry of readdirSync(current, { withFileTypes: true }).sort(
122
- (left, right) => left.name.localeCompare(right.name)
123
- )) {
124
- const path = join(current, entry.name);
125
- if (entry.isDirectory()) files.push(...filesBelow(root, path));
126
- else if (entry.isFile()) files.push(relative(root, path).replaceAll("\\", "/"));
127
- }
128
- return files;
129
- }
130
- function hashYaziAssetTree(assetDir) {
131
- const hash = createHash("sha256");
132
- for (const file of filesBelow(assetDir)) {
133
- hash.update(file);
134
- hash.update("\0");
135
- hash.update(readFileSync(join(assetDir, file)));
136
- hash.update("\0");
137
- }
138
- return hash.digest("hex");
36
+ // src/domains/mux/dock-controller.ts
37
+ init_esm_shims();
38
+ var DOCK_SPECS = {
39
+ workers: { slot: "workers", direction: "right", defaultShare: 0.34, minCells: 48 },
40
+ files: { slot: "files", direction: "down", defaultShare: 0.3, minCells: 12 }
41
+ };
42
+ var DOCK_MAX_SHARE = 0.5;
43
+ var SHARE_EPSILON = 0.02;
44
+ function ratioForDockShare(share) {
45
+ return 1 - share;
139
46
  }
140
- function shellQuote(value) {
141
- return `'${value.replaceAll("'", `'\\''`)}'`;
47
+ function clampDockShare(share) {
48
+ if (!Number.isFinite(share) || share <= 0) return DOCK_SPECS.workers.defaultShare;
49
+ return Math.min(DOCK_MAX_SHARE, share);
142
50
  }
143
- function renderYaziKeymap(yaPath) {
144
- const command = `shell -- ${shellQuote(yaPath)} pub-to "$YAZI_ID" clio-pick --list "$CLIO_YAZI_PICK_TOKEN" %s`;
145
- return `# Generated by Clio Coder. Changes are replaced when the managed profile regenerates.
146
-
147
- [[mgr.prepend_keymap]]
148
- on = "<C-y>"
149
- run = ${JSON.stringify(command)}
150
- desc = "Send the selection to Clio"
151
- `;
51
+ function axisCells(rect, spec) {
52
+ return spec.direction === "right" ? rect.width : rect.height;
152
53
  }
153
- function expected(options) {
154
- const assetDir = options.assetDir ?? defaultAssetDir();
155
- const themeToml = options.themeToml ?? renderYaziTheme();
156
- const yaziToml = options.yaziToml ?? readFileSync(join(assetDir, "yazi.toml"), "utf8");
157
- const keymapToml = options.keymapToml ?? renderYaziKeymap(options.yaPath);
158
- return {
159
- dir: options.profileDir ?? yaziProfileDir(),
160
- assetDir,
161
- yaziToml,
162
- keymapToml,
163
- themeToml,
164
- stamp: {
165
- yaziVersion: options.yaziVersion ?? yaziPin(),
166
- clioVersion: options.clioVersion ?? readClioVersion(),
167
- yaPath: options.yaPath,
168
- assetSha256: hashYaziAssetTree(assetDir),
169
- themeSha256: sha256(themeToml)
170
- }
54
+ function deriveSplitPath(root, anchorPaneId, dockPaneId) {
55
+ const contains = (node, paneId) => {
56
+ if (node.type === "pane") return node.paneId === paneId;
57
+ return contains(node.first, paneId) || contains(node.second, paneId);
171
58
  };
172
- }
173
- function readStamp(dir) {
174
- try {
175
- const value = JSON.parse(readFileSync(join(dir, STAMP_FILE), "utf8"));
176
- if (typeof value.yaziVersion !== "string" || typeof value.clioVersion !== "string" || typeof value.yaPath !== "string" || typeof value.assetSha256 !== "string" || typeof value.themeSha256 !== "string") {
177
- return null;
178
- }
179
- return value;
180
- } catch {
59
+ const walk = (node, path) => {
60
+ if (node.type !== "split") return null;
61
+ const dockFirst = contains(node.first, dockPaneId);
62
+ const dockSecond = contains(node.second, dockPaneId);
63
+ const anchorFirst = contains(node.first, anchorPaneId);
64
+ const anchorSecond = contains(node.second, anchorPaneId);
65
+ if (dockFirst && anchorSecond) return { path, dockIsSecond: false, direction: node.direction };
66
+ if (dockSecond && anchorFirst) return { path, dockIsSecond: true, direction: node.direction };
67
+ if (dockFirst && anchorFirst) return walk(node.first, [...path, false]);
68
+ if (dockSecond && anchorSecond) return walk(node.second, [...path, true]);
181
69
  return null;
182
- }
183
- }
184
- function sameStamp(left, right) {
185
- return left !== null && left.yaziVersion === right.yaziVersion && left.clioVersion === right.clioVersion && left.yaPath === right.yaPath && left.assetSha256 === right.assetSha256 && left.themeSha256 === right.themeSha256;
186
- }
187
- function profileFilesExist(dir) {
188
- return PROFILE_FILES.every((file) => statSync(join(dir, file), { throwIfNoEntry: false })?.isFile()) && PROFILE_PLUGIN_FILES.every(
189
- (file) => statSync(join(dir, "plugins", "git.yazi", file), { throwIfNoEntry: false })?.isFile() === true
190
- );
191
- }
192
- function inspectYaziProfile(options) {
193
- const inputs = expected(options);
194
- const present = statSync(inputs.dir, { throwIfNoEntry: false })?.isDirectory() === true;
195
- const current = present && profileFilesExist(inputs.dir) && sameStamp(readStamp(inputs.dir), inputs.stamp);
196
- return {
197
- dir: inputs.dir,
198
- userConfigDir: userYaziConfigDir(),
199
- state: current ? "current" : present ? "stale" : "missing",
200
- stamp: inputs.stamp
201
70
  };
71
+ return walk(root, []);
202
72
  }
203
- function inspectCurrentYaziProfile() {
204
- return inspectYaziProfile({ yaPath: resolveToolBinary("ya").binaryPath ?? "(unresolved)" });
73
+ function containsRect(outer, inner) {
74
+ return outer.x <= inner.x && outer.y <= inner.y && outer.x + outer.width >= inner.x + inner.width && outer.y + outer.height >= inner.y + inner.height;
205
75
  }
206
- function describeYaziProfile(inspection) {
207
- return `${inspection.dir} (${inspection.state}); user config ${inspection.userConfigDir} is separate and untouched`;
208
- }
209
- function parseGenerated(dir) {
210
- return ["yazi.toml", "keymap.toml", "theme.toml"].every((file) => {
211
- try {
212
- return parseTomlDocument(readFileSync(join(dir, file), "utf8")) !== null;
213
- } catch {
214
- return false;
76
+ function observedDockShare(geometry, spec, anchorPaneId, dockPaneId) {
77
+ const anchor = geometry.panes.find((pane) => pane.paneId === anchorPaneId);
78
+ const dock = geometry.panes.find((pane) => pane.paneId === dockPaneId);
79
+ if (!anchor || !dock) return null;
80
+ let separating = null;
81
+ for (const split of geometry.splits) {
82
+ if (!containsRect(split.rect, anchor.rect) || !containsRect(split.rect, dock.rect)) continue;
83
+ if (!separating || split.rect.width * split.rect.height < separating.rect.width * separating.rect.height) {
84
+ separating = split;
215
85
  }
216
- });
217
- }
218
- var YAZI_CONFIG_ERROR_MARKERS = ["Failed to parse config", "Press <Enter> to continue with preset settings"];
219
- function validatesWithYazi(dir, yaziPath) {
220
- const scratchHome = mkdtempSync(join(dirname(dir), ".yazi-validation-"));
221
- try {
222
- const result = spawnSync(yaziPath, ["--debug"], {
223
- cwd: scratchHome,
224
- env: {
225
- ...process.env,
226
- HOME: scratchHome,
227
- XDG_CACHE_HOME: join(scratchHome, "cache"),
228
- XDG_CONFIG_HOME: join(scratchHome, "config"),
229
- YAZI_CONFIG_HOME: dir
230
- },
231
- encoding: "utf8",
232
- timeout: 5e3
233
- });
234
- const output = `${result.stdout ?? ""}
235
- ${result.stderr ?? ""}`;
236
- return result.error === void 0 && result.status === 0 && YAZI_CONFIG_ERROR_MARKERS.every((marker) => !output.includes(marker));
237
- } catch {
238
- return false;
239
- } finally {
240
- rmSync(scratchHome, { recursive: true, force: true });
241
86
  }
87
+ if (!separating || separating.direction !== spec.direction) return null;
88
+ const dockIsSecond = spec.direction === "right" ? dock.rect.x > anchor.rect.x : dock.rect.y > anchor.rect.y;
89
+ return dockIsSecond ? 1 - separating.ratio : separating.ratio;
242
90
  }
243
- function ensureYaziProfile(options) {
244
- let inputs;
245
- try {
246
- inputs = expected({ ...options, profileDir: options.profileDir ?? yaziProfileDir(clioCacheDir()) });
247
- } catch {
248
- return null;
249
- }
250
- if (profileFilesExist(inputs.dir) && sameStamp(readStamp(inputs.dir), inputs.stamp)) {
251
- return { dir: inputs.dir, stamp: inputs.stamp };
91
+ function planDockOpen(anchorRect, spec, requestedShare) {
92
+ const axis = axisCells(anchorRect, spec);
93
+ if (axis * DOCK_MAX_SHARE < spec.minCells) {
94
+ return {
95
+ refused: `the ${spec.slot} dock needs ${spec.minCells} cells and at most half of ${axis} is available`
96
+ };
252
97
  }
253
- mkdirSync(dirname(inputs.dir), { recursive: true });
254
- const staging = mkdtempSync(join(dirname(inputs.dir), ".profile-"));
255
- try {
256
- cpSync(join(inputs.assetDir, "init.lua"), join(staging, "init.lua"));
257
- cpSync(join(inputs.assetDir, "plugins"), join(staging, "plugins"), { recursive: true });
258
- writeFileSync(join(staging, "yazi.toml"), inputs.yaziToml);
259
- writeFileSync(join(staging, "keymap.toml"), inputs.keymapToml);
260
- writeFileSync(join(staging, "theme.toml"), inputs.themeToml);
261
- writeFileSync(join(staging, STAMP_FILE), `${JSON.stringify(inputs.stamp, null, 2)}
262
- `);
263
- if (!parseGenerated(staging) || !validatesWithYazi(staging, options.yaziPath)) {
264
- rmSync(inputs.dir, { recursive: true, force: true });
265
- return null;
98
+ const share = Math.max(clampDockShare(requestedShare ?? spec.defaultShare), spec.minCells / axis);
99
+ return { direction: spec.direction, ratio: ratioForDockShare(share), share };
100
+ }
101
+ function createDockController(options) {
102
+ const { client, anchorPaneId } = options;
103
+ const log = options.log ?? (() => void 0);
104
+ const bySlot = /* @__PURE__ */ new Map();
105
+ const applyShare = async (state, share) => {
106
+ const tree = await client.layoutExport({ tabId: state.tabId });
107
+ const derived = deriveSplitPath(tree.root, anchorPaneId, state.paneId);
108
+ if (!derived) {
109
+ log("debug", `mux ${state.slot} dock split path is gone from ${state.tabId}; leaving layout alone`);
110
+ return false;
266
111
  }
267
- rmSync(inputs.dir, { recursive: true, force: true });
268
- renameSync(staging, inputs.dir);
269
- return { dir: inputs.dir, stamp: inputs.stamp };
270
- } catch {
271
- rmSync(inputs.dir, { recursive: true, force: true });
272
- return null;
273
- } finally {
274
- rmSync(staging, { recursive: true, force: true });
275
- }
112
+ if (derived.direction !== DOCK_SPECS[state.slot].direction) {
113
+ log("debug", `mux ${state.slot} dock split runs ${derived.direction}; declining the wrong-axis resize`);
114
+ return false;
115
+ }
116
+ const ratio = derived.dockIsSecond ? ratioForDockShare(share) : share;
117
+ await client.layoutSetSplitRatio({ tabId: state.tabId, path: derived.path, ratio });
118
+ state.targetShare = share;
119
+ state.lastAppliedShare = share;
120
+ return true;
121
+ };
122
+ return {
123
+ states() {
124
+ return [...bySlot.values()].map((state) => ({ ...state }));
125
+ },
126
+ stateFor(slot) {
127
+ const state = bySlot.get(slot);
128
+ return state ? { ...state } : null;
129
+ },
130
+ async open(slot, openOptions = {}) {
131
+ const existing = bySlot.get(slot);
132
+ if (existing) {
133
+ return { paneId: existing.paneId, tabId: existing.tabId, workspaceId: "" };
134
+ }
135
+ const spec = DOCK_SPECS[slot];
136
+ const geometry = await client.paneLayout(anchorPaneId);
137
+ const anchorRect = geometry.panes.find((pane2) => pane2.paneId === anchorPaneId)?.rect;
138
+ if (!anchorRect) {
139
+ log("debug", `mux ${slot} dock open found no anchor rect for ${anchorPaneId}`);
140
+ return null;
141
+ }
142
+ const plan = planDockOpen(anchorRect, spec, openOptions.share);
143
+ if ("refused" in plan) {
144
+ log("info", `mux ${slot} dock refused: ${plan.refused}`);
145
+ return null;
146
+ }
147
+ const pane = await client.paneSplit({
148
+ direction: plan.direction,
149
+ targetPaneId: anchorPaneId,
150
+ ratio: plan.ratio,
151
+ focus: false,
152
+ ...openOptions.cwd !== void 0 ? { cwd: openOptions.cwd } : {},
153
+ ...openOptions.env ? { env: openOptions.env } : {}
154
+ });
155
+ const state = {
156
+ slot,
157
+ paneId: pane.paneId,
158
+ tabId: pane.tabId,
159
+ targetShare: plan.share,
160
+ lastAppliedShare: plan.share
161
+ };
162
+ bySlot.set(slot, state);
163
+ try {
164
+ const after = await client.paneLayout(anchorPaneId);
165
+ const dockRect = after.panes.find((entry) => entry.paneId === pane.paneId)?.rect;
166
+ if (dockRect && axisCells(dockRect, spec) < spec.minCells) {
167
+ const anchorAfter = after.panes.find((entry) => entry.paneId === anchorPaneId)?.rect;
168
+ const total = anchorAfter ? axisCells(anchorAfter, spec) + axisCells(dockRect, spec) : 0;
169
+ if (total > 0) await applyShare(state, Math.min(DOCK_MAX_SHARE, spec.minCells / total));
170
+ }
171
+ } catch (error) {
172
+ log("debug", `mux ${slot} dock converge skipped: ${error instanceof Error ? error.message : String(error)}`);
173
+ }
174
+ return { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
175
+ },
176
+ adopt(slot, ref) {
177
+ const spec = DOCK_SPECS[slot];
178
+ bySlot.set(slot, {
179
+ slot,
180
+ paneId: ref.paneId,
181
+ tabId: ref.tabId,
182
+ // The surviving pane's actual share is adopted lazily by the next
183
+ // layout observation; until then the default is the best guess.
184
+ targetShare: spec.defaultShare,
185
+ lastAppliedShare: spec.defaultShare
186
+ });
187
+ },
188
+ async resize(slot, share) {
189
+ const state = bySlot.get(slot);
190
+ if (!state) return false;
191
+ return await applyShare(state, Math.max(clampDockShare(share), 0.01));
192
+ },
193
+ noteLayoutUpdated(geometry) {
194
+ for (const state of bySlot.values()) {
195
+ if (state.tabId !== geometry.tabId) continue;
196
+ const observed = observedDockShare(geometry, DOCK_SPECS[state.slot], anchorPaneId, state.paneId);
197
+ if (observed === null) continue;
198
+ if (Math.abs(observed - state.targetShare) <= SHARE_EPSILON) continue;
199
+ if (Math.abs(observed - state.lastAppliedShare) <= SHARE_EPSILON) continue;
200
+ log("debug", `mux ${state.slot} dock resized by the user to ${(observed * 100).toFixed(0)}%`);
201
+ state.targetShare = observed;
202
+ state.lastAppliedShare = observed;
203
+ }
204
+ },
205
+ notePaneGone(paneId) {
206
+ for (const [slot, state] of bySlot) {
207
+ if (state.paneId === paneId) bySlot.delete(slot);
208
+ }
209
+ },
210
+ notePaneMoved(previousPaneId, paneId, tabId) {
211
+ for (const state of bySlot.values()) {
212
+ if (state.paneId !== previousPaneId) continue;
213
+ state.paneId = paneId;
214
+ state.tabId = tabId;
215
+ }
216
+ },
217
+ paneIds() {
218
+ return [...bySlot.values()].map((state) => state.paneId);
219
+ },
220
+ clear() {
221
+ bySlot.clear();
222
+ }
223
+ };
276
224
  }
277
225
 
278
- // src/domains/mux/index.ts
279
- init_esm_shims();
280
-
281
- // src/domains/mux/extension.ts
282
- init_esm_shims();
283
-
284
- // src/domains/mux/contract.ts
285
- init_esm_shims();
286
-
287
226
  // src/domains/mux/pane-registry.ts
288
227
  init_esm_shims();
289
228
  function createPaneRegistry() {
@@ -343,6 +282,10 @@ init_esm_shims();
343
282
  var MUX_METHOD_MIN_PROTOCOL = {
344
283
  "notification.show": 17,
345
284
  "pane.rename": 17,
285
+ "pane.focus": 17,
286
+ "pane.zoom": 17,
287
+ "layout.export": 17,
288
+ "layout.set_split_ratio": 17,
346
289
  "worktree.list": 10,
347
290
  "worktree.create": 10,
348
291
  "worktree.open": 10,
@@ -393,24 +336,31 @@ function muxErrorKind(wireCode) {
393
336
  }
394
337
 
395
338
  // src/domains/mux/contract.ts
396
- var METADATA_SOURCE = "clio:mux";
397
- var SELF_AGENT_SOURCE = "clio:coder";
398
- var OWNER_TOKEN_KEY = "clio_owner";
399
- var OWNER_TOKEN_VALUE = "clio:mux";
339
+ var METADATA_SOURCE = "clio-coder:mux";
340
+ var SELF_AGENT_SOURCE = "clio-coder:coder";
341
+ var OWNER_TOKEN_KEY = "clio_coder_owner";
342
+ var OWNER_TOKEN_VALUE = "clio-coder:mux";
343
+ var LEGACY_OWNER_TOKEN_KEY = "clio_owner";
344
+ var LEGACY_OWNER_TOKEN_VALUE = "clio:mux";
400
345
  var TOKEN_VALUE_MAX = 80;
401
346
  var DEGRADE_COOLDOWN_MS = 5e3;
402
- function shellQuote2(argv) {
347
+ function shellQuote(argv) {
403
348
  return argv.map((arg) => `'${arg.replaceAll("'", `'\\''`)}'`).join(" ");
404
349
  }
405
350
  function token(value) {
406
351
  if (typeof value !== "string" || value.length === 0) return null;
407
352
  return value.length > TOKEN_VALUE_MAX ? value.slice(0, TOKEN_VALUE_MAX) : value;
408
353
  }
354
+ function hasOwnedPaneToken(tokens) {
355
+ return tokens[OWNER_TOKEN_KEY] === OWNER_TOKEN_VALUE || tokens[LEGACY_OWNER_TOKEN_KEY] === LEGACY_OWNER_TOKEN_VALUE;
356
+ }
409
357
  function createMuxRuntime(options) {
410
358
  const { detection, client } = options;
411
359
  const log = options.log ?? (() => void 0);
412
360
  const now = options.now ?? Date.now;
413
361
  const registry = createPaneRegistry();
362
+ const anchorPaneId = detection.self.paneId;
363
+ const docks = client !== null && anchorPaneId !== null && muxSupportsMethod(detection.server, "layout.export") ? createDockController({ client, anchorPaneId, log }) : null;
414
364
  let healthy = client !== null;
415
365
  let probeHealthAt = 0;
416
366
  let stopped = false;
@@ -445,10 +395,27 @@ function createMuxRuntime(options) {
445
395
  paneId,
446
396
  source: METADATA_SOURCE,
447
397
  ...title === void 0 ? {} : { title },
448
- tokens: { [OWNER_TOKEN_KEY]: OWNER_TOKEN_VALUE, ...tokens }
398
+ tokens: {
399
+ [OWNER_TOKEN_KEY]: OWNER_TOKEN_VALUE,
400
+ [LEGACY_OWNER_TOKEN_KEY]: LEGACY_OWNER_TOKEN_VALUE,
401
+ ...tokens
402
+ }
449
403
  });
450
404
  };
451
405
  const onEvent = (event) => {
406
+ if (event.kind === "layout.updated") {
407
+ docks?.noteLayoutUpdated(event.geometry);
408
+ return;
409
+ }
410
+ if (event.kind === "pane.moved") {
411
+ const held = registry.forget(event.previousPaneId);
412
+ if (held) {
413
+ registry.record({ ...held, ref: { paneId: event.paneId, tabId: event.tabId, workspaceId: event.workspaceId } });
414
+ docks?.notePaneMoved(event.previousPaneId, event.paneId, event.tabId);
415
+ }
416
+ return;
417
+ }
418
+ docks?.notePaneGone(event.paneId);
452
419
  const dropped = registry.forget(event.paneId);
453
420
  if (dropped) {
454
421
  log("debug", `mux pane ${event.paneId} left on ${event.kind}; dropped from the registry`);
@@ -470,32 +437,49 @@ function createMuxRuntime(options) {
470
437
  return detection;
471
438
  },
472
439
  async openUtilityPane(request) {
440
+ const dockSlot = request.dock?.slot;
441
+ if (dockSlot && docks) {
442
+ const existing = docks.stateFor(dockSlot);
443
+ const held = existing ? registry.byPaneId(existing.paneId) : null;
444
+ if (held) return held.ref;
445
+ }
473
446
  return await attempt(
474
447
  "openUtilityPane",
475
448
  async (live) => {
476
- const anchor = detection.self.paneId ?? (await live.paneCurrent()).paneId;
477
- const pane = await live.paneSplit({
478
- direction: request.direction ?? "right",
479
- targetPaneId: anchor,
480
- cwd: request.cwd,
481
- focus: false,
482
- ...request.env ? { env: request.env } : {}
483
- });
484
- const ref = { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
449
+ let ref;
450
+ if (request.dock && docks) {
451
+ const placed = await docks.open(request.dock.slot, {
452
+ ...request.dock.share === void 0 ? {} : { share: request.dock.share },
453
+ cwd: request.cwd,
454
+ ...request.env ? { env: request.env } : {}
455
+ });
456
+ if (placed === null) return null;
457
+ ref = placed;
458
+ } else {
459
+ const anchor = anchorPaneId ?? (await live.paneCurrent()).paneId;
460
+ const pane = await live.paneSplit({
461
+ direction: request.direction ?? "right",
462
+ targetPaneId: anchor,
463
+ cwd: request.cwd,
464
+ focus: false,
465
+ ...request.env ? { env: request.env } : {}
466
+ });
467
+ ref = { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
468
+ }
485
469
  const purpose = request.purpose ?? "utility";
486
470
  registry.record(paneRecord(ref, { purpose, label: request.label, openedAt: now() }));
487
471
  const title = request.title;
488
472
  const titleSupported = title !== void 0 && muxSupportsMethod(detection.server, "pane.rename");
489
473
  if (titleSupported) {
490
474
  try {
491
- await live.paneRename(pane.paneId, title);
475
+ await live.paneRename(ref.paneId, title);
492
476
  } catch {
493
477
  }
494
478
  }
495
- await tagOwner(live, pane.paneId, { role: token(purpose) }, titleSupported ? title : void 0);
479
+ await tagOwner(live, ref.paneId, { role: token(purpose) }, titleSupported ? title : void 0);
496
480
  if (request.argv.length > 0) {
497
- const redirect = request.stdoutPath ? ` > ${shellQuote2([request.stdoutPath])}` : "";
498
- await live.paneSendText(pane.paneId, `exec ${shellQuote2(request.argv)}${redirect}
481
+ const redirect = request.stdoutPath ? ` > ${shellQuote([request.stdoutPath])}` : "";
482
+ await live.paneSendText(ref.paneId, `exec ${shellQuote(request.argv)}${redirect}
499
483
  `);
500
484
  }
501
485
  return ref;
@@ -510,6 +494,7 @@ function createMuxRuntime(options) {
510
494
  async (live) => {
511
495
  await live.paneClose(paneId);
512
496
  registry.forget(paneId);
497
+ docks?.notePaneGone(paneId);
513
498
  return true;
514
499
  },
515
500
  false
@@ -523,7 +508,7 @@ function createMuxRuntime(options) {
523
508
  async (live) => {
524
509
  const snapshot = await live.snapshot();
525
510
  for (const pane of snapshot.panes) {
526
- if (pane.tokens[OWNER_TOKEN_KEY] !== OWNER_TOKEN_VALUE) continue;
511
+ if (!hasOwnedPaneToken(pane.tokens)) continue;
527
512
  if (pane.tokens.role !== request.purpose) continue;
528
513
  if (registry.owns(pane.paneId)) continue;
529
514
  if (detection.self.workspaceId !== null && pane.workspaceId !== detection.self.workspaceId) continue;
@@ -531,6 +516,7 @@ function createMuxRuntime(options) {
531
516
  registry.record(
532
517
  paneRecord(ref, { purpose: request.purpose, label: request.label, openedAt: now(), adopted: true })
533
518
  );
519
+ if (request.dock && docks) docks.adopt(request.dock, ref);
534
520
  log("info", `mux adopted a ${request.purpose} pane left open by a previous session`);
535
521
  return ref;
536
522
  }
@@ -539,6 +525,59 @@ function createMuxRuntime(options) {
539
525
  null
540
526
  );
541
527
  },
528
+ async focusPane(paneId) {
529
+ if (!registry.owns(paneId)) return false;
530
+ if (!muxSupportsMethod(detection.server, "pane.focus")) return false;
531
+ return await attempt(
532
+ "focusPane",
533
+ async (live) => {
534
+ await live.paneFocus(paneId);
535
+ return true;
536
+ },
537
+ false
538
+ );
539
+ },
540
+ async zoomPane(paneId, mode) {
541
+ if (!registry.owns(paneId)) return false;
542
+ if (!muxSupportsMethod(detection.server, "pane.zoom")) return false;
543
+ return await attempt(
544
+ "zoomPane",
545
+ async (live) => {
546
+ const result = await live.paneZoom(paneId, mode);
547
+ return result.changed;
548
+ },
549
+ false
550
+ );
551
+ },
552
+ async focusSelf() {
553
+ if (anchorPaneId === null || !muxSupportsMethod(detection.server, "pane.focus")) return false;
554
+ return await attempt(
555
+ "focusSelf",
556
+ async (live) => {
557
+ await live.paneFocus(anchorPaneId);
558
+ return true;
559
+ },
560
+ false
561
+ );
562
+ },
563
+ async unzoomSelf() {
564
+ if (anchorPaneId === null || !muxSupportsMethod(detection.server, "pane.zoom")) return false;
565
+ return await attempt(
566
+ "unzoomSelf",
567
+ async (live) => {
568
+ const result = await live.paneZoom(anchorPaneId, "off");
569
+ return result.changed;
570
+ },
571
+ false
572
+ );
573
+ },
574
+ async resizeDock(slot, share) {
575
+ if (!docks) return false;
576
+ return await attempt("resizeDock", () => docks.resize(slot, share), false);
577
+ },
578
+ docks() {
579
+ return docks?.states() ?? [];
580
+ },
542
581
  async notify(request) {
543
582
  if (!muxSupportsMethod(detection.server, "notification.show")) {
544
583
  log("debug", `mux notify skipped, server protocol is below the notification.show floor: ${request.title}`);
@@ -621,15 +660,25 @@ function createMuxRuntime(options) {
621
660
  subscription?.close();
622
661
  subscription = null;
623
662
  paneGoneHandlers.clear();
663
+ if (client && docks) {
664
+ for (const paneId of docks.paneIds()) {
665
+ await client.paneClose(paneId).catch(() => void 0);
666
+ registry.forget(paneId);
667
+ }
668
+ docks.clear();
669
+ }
624
670
  if (client) await client.close().catch(() => void 0);
625
671
  }
626
672
  };
627
673
  const start = async () => {
628
674
  if (detection.mode === "none" || client === null) return;
629
675
  try {
630
- subscription = await client.subscribe(["pane.closed", "pane.exited"], onEvent, {
676
+ const kinds = ["pane.closed", "pane.exited"];
677
+ if (docks) kinds.push("pane.moved", "layout.updated");
678
+ subscription = await client.subscribe(kinds, onEvent, {
631
679
  onResync: (snapshot) => {
632
680
  const dropped = registry.reconcile(snapshot.panes.map((pane) => pane.paneId));
681
+ for (const record2 of dropped) docks?.notePaneGone(record2.ref.paneId);
633
682
  if (dropped.length > 0) {
634
683
  log("info", `mux reconciled ${dropped.length} pane(s) closed while the socket was down`);
635
684
  }
@@ -644,8 +693,8 @@ function createMuxRuntime(options) {
644
693
 
645
694
  // src/domains/mux/detect.ts
646
695
  init_esm_shims();
647
- import { homedir as homedir2 } from "node:os";
648
- import { join as join2 } from "node:path";
696
+ import { homedir } from "node:os";
697
+ import { join } from "node:path";
649
698
 
650
699
  // src/domains/mux/socket-client.ts
651
700
  init_esm_shims();
@@ -817,21 +866,118 @@ function readSnapshot(value) {
817
866
  tabs: readArray(source, "tabs").map(readTab)
818
867
  };
819
868
  }
820
- var EVENT_KIND_BY_WIRE = {
869
+ function requireNumber(source, key, context) {
870
+ const value = source[key];
871
+ if (typeof value !== "number") {
872
+ throw new MuxError("protocol", `mux ${context} response is missing number field ${key}`);
873
+ }
874
+ return value;
875
+ }
876
+ function readRect(value, context) {
877
+ const source = asRecord(value);
878
+ if (!source) throw new MuxError("protocol", `mux ${context} rect is not an object`);
879
+ return {
880
+ x: requireNumber(source, "x", context),
881
+ y: requireNumber(source, "y", context),
882
+ width: requireNumber(source, "width", context),
883
+ height: requireNumber(source, "height", context)
884
+ };
885
+ }
886
+ function readSplitDirection(value, context) {
887
+ if (value === "right" || value === "down") return value;
888
+ throw new MuxError("protocol", `mux ${context} split direction is not right/down`);
889
+ }
890
+ function readTabGeometry(value) {
891
+ const source = asRecord(value);
892
+ if (!source) throw new MuxError("protocol", "mux layout snapshot is not an object");
893
+ return {
894
+ workspaceId: requireString(source, "workspace_id", "layout"),
895
+ tabId: requireString(source, "tab_id", "layout"),
896
+ zoomed: source.zoomed === true,
897
+ area: readRect(source.area, "layout"),
898
+ focusedPaneId: optionalString(source, "focused_pane_id"),
899
+ panes: readArray(source, "panes").map((entry) => {
900
+ const pane = asRecord(entry);
901
+ if (!pane) throw new MuxError("protocol", "mux layout pane entry is not an object");
902
+ return {
903
+ paneId: requireString(pane, "pane_id", "layout pane"),
904
+ focused: pane.focused === true,
905
+ rect: readRect(pane.rect, "layout pane")
906
+ };
907
+ }),
908
+ splits: readArray(source, "splits").map((entry) => {
909
+ const split = asRecord(entry);
910
+ if (!split) throw new MuxError("protocol", "mux layout split entry is not an object");
911
+ return {
912
+ direction: readSplitDirection(split.direction, "layout"),
913
+ ratio: requireNumber(split, "ratio", "layout split"),
914
+ rect: readRect(split.rect, "layout split")
915
+ };
916
+ })
917
+ };
918
+ }
919
+ function readLayoutNode(value) {
920
+ const source = asRecord(value);
921
+ if (!source) throw new MuxError("protocol", "mux layout node is not an object");
922
+ if (source.type === "pane") {
923
+ return { type: "pane", paneId: optionalString(source, "pane_id"), label: optionalString(source, "label") };
924
+ }
925
+ if (source.type === "split") {
926
+ return {
927
+ type: "split",
928
+ direction: readSplitDirection(source.direction, "layout tree"),
929
+ ratio: requireNumber(source, "ratio", "layout tree split"),
930
+ first: readLayoutNode(source.first),
931
+ second: readLayoutNode(source.second)
932
+ };
933
+ }
934
+ throw new MuxError("protocol", "mux layout node has an unknown type");
935
+ }
936
+ function readLayoutTree(value) {
937
+ const source = asRecord(value);
938
+ if (!source) throw new MuxError("protocol", "mux layout tree is not an object");
939
+ return {
940
+ workspaceId: requireString(source, "workspace_id", "layout tree"),
941
+ tabId: requireString(source, "tab_id", "layout tree"),
942
+ zoomed: source.zoomed === true,
943
+ focusedPaneId: optionalString(source, "focused_pane_id"),
944
+ root: readLayoutNode(source.root)
945
+ };
946
+ }
947
+ var PANE_LEAVE_KIND_BY_WIRE = {
821
948
  pane_closed: "pane.closed",
822
949
  pane_exited: "pane.exited"
823
950
  };
824
951
  function readEvent(line) {
825
952
  const wireKind = line.event;
826
953
  if (typeof wireKind !== "string") return null;
827
- const kind = EVENT_KIND_BY_WIRE[wireKind];
828
- if (!kind) return null;
829
954
  const data = asRecord(line.data);
830
955
  if (!data) return null;
831
- const paneId = data.pane_id;
832
- const workspaceId = data.workspace_id;
833
- if (typeof paneId !== "string" || typeof workspaceId !== "string") return null;
834
- return { kind, paneId, workspaceId };
956
+ const leaveKind = PANE_LEAVE_KIND_BY_WIRE[wireKind];
957
+ if (leaveKind) {
958
+ const paneId = data.pane_id;
959
+ const workspaceId = data.workspace_id;
960
+ if (typeof paneId !== "string" || typeof workspaceId !== "string") return null;
961
+ return { kind: leaveKind, paneId, workspaceId };
962
+ }
963
+ if (wireKind === "pane_moved") {
964
+ const pane = asRecord(data.pane);
965
+ const previousPaneId = data.previous_pane_id;
966
+ if (!pane || typeof previousPaneId !== "string") return null;
967
+ const paneId = pane.pane_id;
968
+ const tabId = pane.tab_id;
969
+ const workspaceId = pane.workspace_id;
970
+ if (typeof paneId !== "string" || typeof tabId !== "string" || typeof workspaceId !== "string") return null;
971
+ return { kind: "pane.moved", paneId, previousPaneId, tabId, workspaceId };
972
+ }
973
+ if (wireKind === "layout_updated") {
974
+ try {
975
+ return { kind: "layout.updated", geometry: readTabGeometry(data.layout) };
976
+ } catch {
977
+ return null;
978
+ }
979
+ }
980
+ return null;
835
981
  }
836
982
  function params(entries) {
837
983
  const out = {};
@@ -1065,15 +1211,27 @@ function createMuxClient(options) {
1065
1211
  },
1066
1212
  async paneLayout(paneId) {
1067
1213
  const result = await callObject("pane.layout", params({ pane_id: paneId }));
1068
- const layout = asRecord(result.layout);
1069
- if (!layout) throw new MuxError("protocol", "mux pane.layout returned no layout");
1070
- const ids = [];
1071
- for (const entry of readArray(layout, "panes")) {
1072
- const pane = asRecord(entry);
1073
- const id = pane ? pane.pane_id : void 0;
1074
- if (typeof id === "string") ids.push(id);
1075
- }
1076
- return ids;
1214
+ return readTabGeometry(result.layout);
1215
+ },
1216
+ async paneFocus(paneId) {
1217
+ await call("pane.focus", { pane_id: paneId });
1218
+ },
1219
+ async paneZoom(paneId, mode) {
1220
+ const result = await callObject("pane.zoom", { pane_id: paneId, mode });
1221
+ const zoom = asRecord(result.zoom);
1222
+ if (!zoom) throw new MuxError("protocol", "mux pane.zoom returned no zoom result");
1223
+ return { changed: zoom.changed === true, focusChanged: zoom.focus_changed === true };
1224
+ },
1225
+ async layoutExport(request = {}) {
1226
+ const result = await callObject("layout.export", params({ tab_id: request.tabId, pane_id: request.paneId }));
1227
+ return readLayoutTree(result.layout);
1228
+ },
1229
+ async layoutSetSplitRatio(request) {
1230
+ const result = await callObject(
1231
+ "layout.set_split_ratio",
1232
+ params({ tab_id: request.tabId, pane_id: request.paneId, path: [...request.path], ratio: request.ratio })
1233
+ );
1234
+ return readLayoutTree(result.layout);
1077
1235
  },
1078
1236
  async worktreeList(request = {}) {
1079
1237
  const result = await callObject("worktree.list", params({ workspace_id: request.workspaceId, cwd: request.cwd }));
@@ -1186,9 +1344,9 @@ function createMuxClient(options) {
1186
1344
  var PING_TIMEOUT_MS = 1e3;
1187
1345
  function herdrConfigDir(env) {
1188
1346
  const xdg = env.XDG_CONFIG_HOME;
1189
- if (typeof xdg === "string" && xdg.length > 0) return join2(xdg, "herdr");
1190
- const home = typeof env.HOME === "string" && env.HOME.length > 0 ? env.HOME : homedir2();
1191
- return join2(home, ".config", "herdr");
1347
+ if (typeof xdg === "string" && xdg.length > 0) return join(xdg, "herdr");
1348
+ const home = typeof env.HOME === "string" && env.HOME.length > 0 ? env.HOME : homedir();
1349
+ return join(home, ".config", "herdr");
1192
1350
  }
1193
1351
  function resolveSocketCandidates(env) {
1194
1352
  const candidates = [];
@@ -1197,9 +1355,9 @@ function resolveSocketCandidates(env) {
1197
1355
  const configDir = herdrConfigDir(env);
1198
1356
  const session = env.HERDR_SESSION;
1199
1357
  if (typeof session === "string" && session.length > 0) {
1200
- candidates.push(join2(configDir, "sessions", session, "herdr.sock"));
1358
+ candidates.push(join(configDir, "sessions", session, "herdr.sock"));
1201
1359
  }
1202
- candidates.push(join2(configDir, "herdr.sock"));
1360
+ candidates.push(join(configDir, "herdr.sock"));
1203
1361
  return [...new Set(candidates)];
1204
1362
  }
1205
1363
  function readSelfLocation(env) {
@@ -1213,14 +1371,15 @@ function readSelfLocation(env) {
1213
1371
  paneId: read("HERDR_PANE_ID")
1214
1372
  };
1215
1373
  }
1216
- function none(reason, candidates = []) {
1374
+ function none(reason, candidates = [], refused = false) {
1217
1375
  return {
1218
1376
  mode: "none",
1219
1377
  socketPath: null,
1220
1378
  server: null,
1221
1379
  self: { workspaceId: null, tabId: null, paneId: null },
1222
1380
  candidates,
1223
- reason
1381
+ reason,
1382
+ refused
1224
1383
  };
1225
1384
  }
1226
1385
  async function detectMux(options = {}) {
@@ -1231,7 +1390,7 @@ async function detectMux(options = {}) {
1231
1390
  return { detection: none("panes are turned off"), client: null };
1232
1391
  }
1233
1392
  if (enabled === "embedded") {
1234
- return { detection: none("embedded mode is not implemented yet; it ships in phase 5"), client: null };
1393
+ log("info", "interface.panes.enabled=embedded is not implemented yet; detecting a guest pane host instead");
1235
1394
  }
1236
1395
  if (env.HERDR_ENV !== "1") {
1237
1396
  return { detection: none("HERDR_ENV is not 1, so Clio is not running inside a pane host"), client: null };
@@ -1250,7 +1409,8 @@ async function detectMux(options = {}) {
1250
1409
  server,
1251
1410
  self: readSelfLocation(env),
1252
1411
  candidates,
1253
- reason: `guest mode on ${socketPath} (herdr ${server.version}, protocol ${server.protocol})`
1412
+ reason: `guest mode on ${socketPath} (herdr ${server.version}, protocol ${server.protocol})`,
1413
+ refused: false
1254
1414
  },
1255
1415
  client
1256
1416
  };
@@ -1276,7 +1436,10 @@ async function createMuxBundle(_context, options = {}) {
1276
1436
  ...options.env ? { env: options.env } : {},
1277
1437
  log
1278
1438
  });
1279
- log(detection.mode === "none" ? "debug" : "info", `mux mode ${detection.mode}: ${detection.reason}`);
1439
+ log(
1440
+ detection.refused ? "warning" : detection.mode === "none" ? "debug" : "info",
1441
+ detection.refused ? `panes refused: ${detection.reason}` : `mux mode ${detection.mode}: ${detection.reason}`
1442
+ );
1280
1443
  const runtime = createMuxRuntime({ detection, client, log });
1281
1444
  const extension = {
1282
1445
  async start() {
@@ -1298,9 +1461,9 @@ var MuxManifest = {
1298
1461
 
1299
1462
  // src/domains/mux/viewer-command.ts
1300
1463
  init_esm_shims();
1301
- import { join as join3 } from "node:path";
1464
+ import { join as join2 } from "node:path";
1302
1465
  function clioCliEntryPath() {
1303
- return join3(resolvePackageRoot(), "dist/cli/index.js");
1466
+ return join2(resolvePackageRoot(), "dist/cli/index.js");
1304
1467
  }
1305
1468
  function watchViewerCommand(selectionPath, options = {}) {
1306
1469
  const layout = options.dirs === void 0 ? [] : [
@@ -1326,10 +1489,12 @@ function watchViewerCommand(selectionPath, options = {}) {
1326
1489
 
1327
1490
  // src/domains/mux/yazi/event-stream.ts
1328
1491
  init_esm_shims();
1329
- import { closeSync, openSync, readSync, statSync as statSync2 } from "node:fs";
1492
+ import { closeSync, openSync, readSync, statSync } from "node:fs";
1330
1493
  import { StringDecoder } from "node:string_decoder";
1331
1494
  var YAZI_STREAM_POLL_MS = 250;
1332
1495
  var YAZI_STREAM_MAX_BYTES = 1024 * 1024;
1496
+ var YAZI_PICK_EVENT = "clio-coder-pick";
1497
+ var LEGACY_YAZI_PICK_EVENT = "clio-pick";
1333
1498
  function record(value) {
1334
1499
  return typeof value === "object" && value !== null && !Array.isArray(value);
1335
1500
  }
@@ -1339,7 +1504,7 @@ function parseYaziEventLine(line) {
1339
1504
  const third = second < 0 ? -1 : line.indexOf(",", second + 1);
1340
1505
  if (first <= 0 || second <= first + 1 || third <= second + 1) return null;
1341
1506
  const kind = line.slice(0, first);
1342
- if (kind !== "cd" && kind !== "clio-pick") return null;
1507
+ if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) return null;
1343
1508
  const receiver = line.slice(first + 1, second);
1344
1509
  const sender = line.slice(second + 1, third);
1345
1510
  try {
@@ -1351,7 +1516,7 @@ function parseYaziEventLine(line) {
1351
1516
  return { kind, receiver, sender, tab: String(tab), cwd: body.url };
1352
1517
  }
1353
1518
  if (!Array.isArray(body) || !body.every((value) => typeof value === "string")) return null;
1354
- return { kind, receiver, sender, values: body };
1519
+ return { kind: YAZI_PICK_EVENT, receiver, sender, values: body };
1355
1520
  } catch {
1356
1521
  return null;
1357
1522
  }
@@ -1395,7 +1560,7 @@ function createYaziEventStream(options) {
1395
1560
  stop("pane-gone");
1396
1561
  return;
1397
1562
  }
1398
- const stat = statSync2(options.path, { throwIfNoEntry: false });
1563
+ const stat = statSync(options.path, { throwIfNoEntry: false });
1399
1564
  if (!stat?.isFile()) {
1400
1565
  stop("file-missing");
1401
1566
  return;
@@ -1427,7 +1592,7 @@ function createYaziEventStream(options) {
1427
1592
  const line = raw.endsWith("\r") ? raw.slice(0, -1) : raw;
1428
1593
  if (line.length === 0) continue;
1429
1594
  const kind = line.slice(0, line.indexOf(","));
1430
- if (kind !== "cd" && kind !== "clio-pick") continue;
1595
+ if (kind !== "cd" && kind !== YAZI_PICK_EVENT && kind !== LEGACY_YAZI_PICK_EVENT) continue;
1431
1596
  const event = parseYaziEventLine(line);
1432
1597
  if (!event) {
1433
1598
  state.malformedLines += 1;
@@ -1457,8 +1622,8 @@ function createYaziEventStream(options) {
1457
1622
  init_esm_shims();
1458
1623
  import { spawn } from "node:child_process";
1459
1624
  import { randomUUID } from "node:crypto";
1460
- import { mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "node:fs";
1461
- import { join as join4 } from "node:path";
1625
+ import { mkdirSync, readdirSync, readFileSync, rmSync, statSync as statSync2, writeFileSync } from "node:fs";
1626
+ import { join as join3 } from "node:path";
1462
1627
  function resolveYaziBinaries() {
1463
1628
  const entry = findPinnedTool("yazi");
1464
1629
  const status = entry ? toolStatus(entry) : null;
@@ -1477,11 +1642,33 @@ function runYa(file, args, env) {
1477
1642
  }
1478
1643
  function readOptional(path) {
1479
1644
  try {
1480
- return readFileSync2(path, "utf8");
1645
+ return readFileSync(path, "utf8");
1481
1646
  } catch {
1482
1647
  return "";
1483
1648
  }
1484
1649
  }
1650
+ var YAZI_STALE_TRANSPORT_MS = 24 * 60 * 60 * 1e3;
1651
+ function sweepStaleTransportFiles(sessionsDir, now = Date.now()) {
1652
+ let removed = 0;
1653
+ let entries;
1654
+ try {
1655
+ entries = readdirSync(sessionsDir);
1656
+ } catch {
1657
+ return 0;
1658
+ }
1659
+ for (const name of entries) {
1660
+ if (!/\.(stream|chooser|cwd)$/u.test(name)) continue;
1661
+ const path = join3(sessionsDir, name);
1662
+ try {
1663
+ if (now - statSync2(path).mtimeMs > YAZI_STALE_TRANSPORT_MS) {
1664
+ rmSync(path, { force: true });
1665
+ removed += 1;
1666
+ }
1667
+ } catch {
1668
+ }
1669
+ }
1670
+ return removed;
1671
+ }
1485
1672
  async function createYaziSession(options) {
1486
1673
  const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
1487
1674
  if (!binaries.yaziPath) {
@@ -1496,8 +1683,9 @@ async function createYaziSession(options) {
1496
1683
  }
1497
1684
  const cacheDir = options.cacheDir ?? clioCacheDir();
1498
1685
  const sessionId = options.sessionId ?? randomUUID();
1499
- const sessionsDir = join4(cacheDir, "yazi", "sessions");
1500
- mkdirSync2(sessionsDir, { recursive: true });
1686
+ const sessionsDir = join3(cacheDir, "yazi", "sessions");
1687
+ mkdirSync(sessionsDir, { recursive: true });
1688
+ sweepStaleTransportFiles(sessionsDir);
1501
1689
  const managedProfile = options.profileMode === "managed" ? (options.ensureProfile ?? ensureYaziProfile)({
1502
1690
  yaPath: binaries.yaPath,
1503
1691
  yaziPath: binaries.yaziPath,
@@ -1506,33 +1694,50 @@ async function createYaziSession(options) {
1506
1694
  if (options.profileMode === "managed" && !managedProfile) {
1507
1695
  return { status: "profile-error", reason: "Clio could not generate a valid managed Yazi profile" };
1508
1696
  }
1509
- const streamPath = join4(sessionsDir, `${sessionId}.stream`);
1510
- const chooserPath = join4(sessionsDir, `${sessionId}.chooser`);
1511
- const cwdPath = join4(sessionsDir, `${sessionId}.cwd`);
1697
+ const streamPath = join3(sessionsDir, `${sessionId}.stream`);
1698
+ const chooserPath = join3(sessionsDir, `${sessionId}.chooser`);
1699
+ const cwdPath = join3(sessionsDir, `${sessionId}.cwd`);
1512
1700
  const token2 = options.mode === "companion" ? options.pickToken ?? randomUUID() : null;
1513
1701
  const env = {
1514
1702
  ...managedProfile ? { YAZI_CONFIG_HOME: managedProfile.dir } : {},
1515
- ...token2 ? { CLIO_YAZI_PICK_TOKEN: token2 } : {}
1703
+ ...token2 ? namingCompatibilityEnvironment("CLIO_CODER_YAZI_PICK_TOKEN", "CLIO_YAZI_PICK_TOKEN", token2) : {}
1516
1704
  };
1517
1705
  let argv;
1518
1706
  let stdoutPath;
1519
1707
  if (options.mode === "companion") {
1520
- writeFileSync2(streamPath, "");
1521
- argv = [binaries.yaziPath, "--local-events", "cd,clio-pick", "--remote-events", "clio-pick"];
1708
+ writeFileSync(streamPath, "");
1709
+ argv = [
1710
+ binaries.yaziPath,
1711
+ "--local-events",
1712
+ `cd,${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`,
1713
+ "--remote-events",
1714
+ `${YAZI_PICK_EVENT},${LEGACY_YAZI_PICK_EVENT}`
1715
+ ];
1522
1716
  stdoutPath = streamPath;
1523
1717
  } else {
1524
- writeFileSync2(chooserPath, "");
1525
- writeFileSync2(cwdPath, "");
1718
+ writeFileSync(chooserPath, "");
1719
+ writeFileSync(cwdPath, "");
1526
1720
  argv = [binaries.yaziPath, options.cwd, "--chooser-file", chooserPath, "--cwd-file", cwdPath];
1527
1721
  }
1722
+ const removeTransportFiles = () => {
1723
+ for (const path of [streamPath, chooserPath, cwdPath]) rmSync(path, { force: true });
1724
+ };
1528
1725
  const pane = await options.mux.openUtilityPane({
1529
1726
  argv,
1530
1727
  cwd: options.cwd,
1531
- label: "yazi",
1728
+ label: "files",
1729
+ title: "files",
1730
+ // The files dock: split down from the anchor at the configured share.
1731
+ // Degrades to a plain split inside the contract when the layout tier is
1732
+ // absent.
1733
+ dock: { slot: "files", ...options.dockShare === void 0 ? {} : { share: options.dockShare } },
1532
1734
  ...Object.keys(env).length > 0 ? { env } : {},
1533
1735
  ...stdoutPath ? { stdoutPath } : {}
1534
1736
  });
1535
- if (!pane) return { status: "unavailable", reason: "pane host refused to open yazi" };
1737
+ if (!pane) {
1738
+ removeTransportFiles();
1739
+ return { status: "unavailable", reason: "the pane host refused to open the files pane" };
1740
+ }
1536
1741
  let paneCwd = options.cwd;
1537
1742
  let instanceId = null;
1538
1743
  let stream = null;
@@ -1545,6 +1750,7 @@ async function createYaziSession(options) {
1545
1750
  if (chooserTimer) clearInterval(chooserTimer);
1546
1751
  chooserTimer = null;
1547
1752
  options.onStopped?.(reason);
1753
+ removeTransportFiles();
1548
1754
  };
1549
1755
  if (options.mode === "companion") {
1550
1756
  stream = createYaziEventStream({
@@ -1560,7 +1766,9 @@ async function createYaziSession(options) {
1560
1766
  options.onEvent(event);
1561
1767
  }
1562
1768
  });
1563
- void stream.done.then((reason) => stop(reason));
1769
+ void stream.done.then((reason) => {
1770
+ stop(reason);
1771
+ });
1564
1772
  } else {
1565
1773
  const pollChooser = () => {
1566
1774
  if (stopped || alive()) return;
@@ -1618,14 +1826,8 @@ export {
1618
1826
  resolveSocketCandidates,
1619
1827
  detectMux,
1620
1828
  watchViewerCommand,
1621
- yaziProfileDir,
1622
- userYaziConfigDir,
1623
- resetYaziProfile,
1624
- inspectCurrentYaziProfile,
1625
- describeYaziProfile,
1626
- ensureYaziProfile,
1627
1829
  resolveYaziBinaries,
1628
1830
  createYaziSession,
1629
1831
  createMuxDomainModule
1630
1832
  };
1631
- //# sourceMappingURL=chunk-HZHHCK24.js.map
1833
+ //# sourceMappingURL=chunk-KKOJXO6R.js.map