@iowarp/clio-coder 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +116 -16
  3. package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
  4. package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
  7. package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
  8. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  9. package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
  10. package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
  11. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  12. package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
  13. package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
  14. package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
  15. package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
  16. package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
  17. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  18. package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
  19. package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
  20. package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
  21. package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
  22. package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
  23. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  24. package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
  25. package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
  26. package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
  27. package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
  28. package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
  29. package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
  30. package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
  33. package/dist/chunk-AP73CFDC.js +308 -0
  34. package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
  35. package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
  36. package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
  37. package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
  38. package/dist/chunk-BTK3SSSK.js +67 -0
  39. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  40. package/dist/chunk-BWW4HLO4.js +301 -0
  41. package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
  42. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  43. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  44. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  45. package/dist/chunk-D7E7WCDF.js +27 -0
  46. package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
  47. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  48. package/dist/chunk-EIMVLWB3.js +1842 -0
  49. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  50. package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
  51. package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
  52. package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
  53. package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
  54. package/dist/chunk-HJWWJ6IL.js +184 -0
  55. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  56. package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
  57. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  58. package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
  59. package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
  60. package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
  61. package/dist/chunk-J5LZHVIT.js +284 -0
  62. package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
  63. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  64. package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
  65. package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
  66. package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
  67. package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
  68. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  69. package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
  70. package/dist/chunk-NDDGJUXD.js +81 -0
  71. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  72. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  73. package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
  74. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  75. package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
  76. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  77. package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
  78. package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
  79. package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
  80. package/dist/chunk-QTFGO774.js +644 -0
  81. package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
  82. package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
  83. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  84. package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
  85. package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
  86. package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
  87. package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
  88. package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
  89. package/dist/chunk-U2WB7TZS.js +271 -0
  90. package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
  91. package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
  92. package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
  93. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  94. package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
  95. package/dist/chunk-VKFQTNDV.js +66 -0
  96. package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
  97. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  98. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  99. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  100. package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
  101. package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
  102. package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
  103. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  104. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  105. package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
  106. package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
  107. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  108. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  109. package/dist/cli/index.js +36 -36
  110. package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
  111. package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
  112. package/dist/codewiki/build-worker.js +1 -1
  113. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  114. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  115. package/dist/{config-QZPCMYSO.js → config-3QZRWZJF.js} +53 -49
  116. package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
  117. package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
  118. package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
  119. package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
  120. package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
  121. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
  122. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
  123. package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
  124. package/dist/doctor-ZGPEGHIP.js +772 -0
  125. package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
  126. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
  127. package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
  128. package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
  129. package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
  130. package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
  131. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
  132. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
  133. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
  134. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
  135. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
  136. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
  137. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
  138. package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
  139. package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
  140. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  141. package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
  142. package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
  143. package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
  144. package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
  145. package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
  146. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
  147. package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
  148. package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
  149. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  150. package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
  151. package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
  152. package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
  153. package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
  154. package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
  155. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
  156. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
  157. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
  158. package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
  159. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  160. package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
  161. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
  162. package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
  163. package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
  164. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  165. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  166. package/dist/{upgrade-3XPP6OQL.js → upgrade-H7TOM7YL.js} +35 -62
  167. package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
  168. package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
  169. package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
  170. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
  171. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
  172. package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
  173. package/dist/worker/entry.js +57 -52
  174. package/docs/acp.md +1 -1
  175. package/docs/built-in-agents.md +40 -32
  176. package/docs/commands-and-modes.md +9 -3
  177. package/docs/config-knobs-audit.md +3 -0
  178. package/docs/configuration-and-targets.md +105 -164
  179. package/docs/environment-variables.md +2 -1
  180. package/docs/exit-codes-and-output.md +2 -0
  181. package/docs/fleet-demo-runbook.md +6 -3
  182. package/docs/fleet-dispatch.md +8 -6
  183. package/docs/installation-and-lifecycle.md +1 -1
  184. package/docs/release-cut-checklist.md +164 -177
  185. package/docs/trace-store.md +15 -10
  186. package/docs/troubleshooting.md +1 -1
  187. package/evals/README.md +5 -0
  188. package/evals/behavioral-corpus-grader.mjs +103 -0
  189. package/evals/behavioral-machinery-baseline.json +2276 -0
  190. package/evals/behavioral-machinery-driver.ts +250 -0
  191. package/evals/behavioral-machinery-support.ts +253 -0
  192. package/evals/behavioral-machinery.yaml +614 -0
  193. package/evals/behavioral-model-negative-control.yaml +68 -0
  194. package/evals/behavioral-model.yaml +216 -0
  195. package/evals/fixtures/behavioral-facts.txt +3 -0
  196. package/evals/fixtures/behavioral-main.ts +7 -0
  197. package/evals/fixtures/decoy/note.txt +2 -0
  198. package/evals/fixtures/private/credentials.txt +1 -0
  199. package/evals/tracked-metrics-baseline.yaml +229 -0
  200. package/evals/tracked-metrics-grader.mjs +129 -0
  201. package/package.json +5 -15
  202. package/skills/README.md +6 -6
  203. package/skills/coding/ast-grep/SKILL.md +8 -2
  204. package/skills/coding/coding-standards/SKILL.md +8 -2
  205. package/skills/coding/prototype/SKILL.md +8 -2
  206. package/skills/coding/tdd/SKILL.md +8 -2
  207. package/skills/context/context-handoff/SKILL.md +12 -3
  208. package/skills/context/context-handoff/evals.md +3 -3
  209. package/skills/context/context-prime/SKILL.md +8 -2
  210. package/skills/context/context-prime/evals.md +2 -2
  211. package/skills/git/file-ticket/SKILL.md +9 -4
  212. package/skills/git/file-ticket/evals.md +2 -2
  213. package/skills/git/fix-issue/SKILL.md +12 -5
  214. package/skills/git/fix-issue/evals.md +4 -4
  215. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  216. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  217. package/skills/git/ship/SKILL.md +9 -3
  218. package/skills/git/ship/evals.md +4 -4
  219. package/skills/git/worktree-create/SKILL.md +7 -2
  220. package/skills/git/worktree-create/evals.md +6 -6
  221. package/skills/git/worktree-merge/SKILL.md +7 -2
  222. package/skills/git/worktree-merge/evals.md +6 -6
  223. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  224. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  225. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  226. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  227. package/skills/meta/credentials/SKILL.md +9 -2
  228. package/skills/meta/find-skills/SKILL.md +8 -2
  229. package/skills/meta/herdr/SKILL.md +8 -2
  230. package/skills/meta/skill-craft/SKILL.md +21 -4
  231. package/skills/planning/architecture/SKILL.md +9 -3
  232. package/skills/planning/backlog/SKILL.md +8 -2
  233. package/skills/planning/prd/SKILL.md +8 -2
  234. package/skills/planning/product-intent/SKILL.md +8 -2
  235. package/skills/planning/tech-spec/SKILL.md +9 -3
  236. package/skills/registry.yaml +66 -66
  237. package/skills/research/arxiv-literature/SKILL.md +8 -2
  238. package/skills/research/experiment-protocol/SKILL.md +9 -2
  239. package/skills/research/scientific-debugging/SKILL.md +9 -2
  240. package/skills/research/scientific-debugging/evals.md +2 -2
  241. package/skills/research/scientific-modernization/SKILL.md +9 -2
  242. package/skills/skill-marketplace.json +257 -38
  243. package/skills/workflow/cut-it/SKILL.md +10 -2
  244. package/skills/workflow/design-council/SKILL.md +11 -2
  245. package/skills/workflow/grill-me/SKILL.md +8 -2
  246. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  247. package/src/cli/acp.ts +2 -2
  248. package/src/cli/auth.ts +2 -2
  249. package/src/cli/bootstrap-generate.ts +5 -5
  250. package/src/cli/clio.ts +6 -1
  251. package/src/cli/config-inspect.ts +3 -3
  252. package/src/cli/configure-interop.ts +1 -1
  253. package/src/cli/configure.ts +27 -27
  254. package/src/cli/default-target.ts +1 -1
  255. package/src/cli/docs.ts +6 -6
  256. package/src/cli/doctor-naming.ts +323 -0
  257. package/src/cli/doctor-panes.ts +46 -14
  258. package/src/cli/doctor-toolchain.ts +29 -8
  259. package/src/cli/doctor.ts +15 -1
  260. package/src/cli/eval-inventory.ts +8 -8
  261. package/src/cli/evidence-detail.ts +1 -1
  262. package/src/cli/evidence-inventory.ts +1 -1
  263. package/src/cli/fleet-decisions.ts +1 -1
  264. package/src/cli/fleet-inspect.ts +1 -1
  265. package/src/cli/fleet-preflight.ts +1 -1
  266. package/src/cli/fleet-verify.ts +1 -1
  267. package/src/cli/fleet-view.ts +40 -23
  268. package/src/cli/fleet.ts +8 -5
  269. package/src/cli/interop-inspect.ts +2 -2
  270. package/src/cli/models.ts +3 -3
  271. package/src/cli/modes/print.ts +1 -1
  272. package/src/cli/reset.ts +1 -1
  273. package/src/cli/run.ts +11 -15
  274. package/src/cli/share.ts +1 -1
  275. package/src/cli/skills-eval.ts +11 -11
  276. package/src/cli/targets.ts +23 -24
  277. package/src/cli/trace-inspect.ts +1 -1
  278. package/src/cli/trace.ts +41 -0
  279. package/src/cli/uninstall.ts +2 -2
  280. package/src/cli/upgrade.ts +29 -34
  281. package/src/cli/usage.ts +2 -2
  282. package/src/cli/validate-model.ts +1 -1
  283. package/src/cli/verifiers-inspect.ts +1 -1
  284. package/src/cli/wiki-generate.ts +5 -5
  285. package/src/core/bash-exec.ts +1 -1
  286. package/src/core/boot-trace.ts +3 -3
  287. package/src/core/bus-trace.ts +2 -2
  288. package/src/core/compile-cache.ts +1 -1
  289. package/src/core/config.ts +1062 -886
  290. package/src/core/defaults.ts +321 -528
  291. package/src/core/domain-loader.ts +6 -4
  292. package/src/core/event-bus.ts +1 -1
  293. package/src/core/file-references.ts +78 -88
  294. package/src/core/git-commit-attribution.ts +3 -9
  295. package/src/core/guardrails.ts +24 -4
  296. package/src/core/naming-compat.ts +45 -0
  297. package/src/core/naming-events.ts +62 -0
  298. package/src/core/recent-models.ts +1 -7
  299. package/src/core/residency-protection.ts +4 -8
  300. package/src/core/resolve-config-value.ts +1 -1
  301. package/src/core/response-model-id.ts +0 -14
  302. package/src/core/session-routing.ts +84 -74
  303. package/src/core/skill-activation.ts +18 -0
  304. package/src/core/termination.ts +4 -4
  305. package/src/core/timers.ts +2 -12
  306. package/src/domains/agents/catalog.ts +2 -12
  307. package/src/domains/agents/extension.ts +3 -3
  308. package/src/domains/agents/registry.ts +7 -7
  309. package/src/domains/agents/result-contract.ts +1 -1
  310. package/src/domains/agents/spec.ts +0 -11
  311. package/src/domains/config/classify.ts +35 -47
  312. package/src/domains/config/extension.ts +5 -5
  313. package/src/domains/config/keybindings.ts +48 -47
  314. package/src/domains/config/watcher.ts +1 -1
  315. package/src/domains/context/codewiki/indexer.ts +1 -1
  316. package/src/domains/context/extension.ts +3 -3
  317. package/src/domains/context/prompt-context.ts +1 -1
  318. package/src/domains/context/wiki/assemble.ts +2 -2
  319. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  320. package/src/domains/context/working-set/replay/report.ts +1 -1
  321. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  322. package/src/domains/dispatch/active-route-planner.ts +2 -2
  323. package/src/domains/dispatch/agent-candidates.ts +1 -1
  324. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  325. package/src/domains/dispatch/agent-ledger.ts +1 -1
  326. package/src/domains/dispatch/assignment.ts +5 -5
  327. package/src/domains/dispatch/capacity-lease.ts +2 -5
  328. package/src/domains/dispatch/code-step.ts +1 -1
  329. package/src/domains/dispatch/contract.ts +2 -2
  330. package/src/domains/dispatch/extension.ts +65 -61
  331. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  332. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  333. package/src/domains/dispatch/fleet-run.ts +0 -7
  334. package/src/domains/dispatch/gate-decisions.ts +25 -14
  335. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  336. package/src/domains/dispatch/path-scope.ts +0 -61
  337. package/src/domains/dispatch/placement.ts +2 -2
  338. package/src/domains/dispatch/receipt-findings.ts +1 -1
  339. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  340. package/src/domains/dispatch/reservation-store.ts +0 -23
  341. package/src/domains/dispatch/route-decision.ts +1 -1
  342. package/src/domains/dispatch/route-history.ts +1 -1
  343. package/src/domains/dispatch/route-policy.ts +1 -1
  344. package/src/domains/dispatch/route-readiness.ts +0 -28
  345. package/src/domains/dispatch/run-event-journal.ts +6 -5
  346. package/src/domains/dispatch/tool-stats.ts +1 -1
  347. package/src/domains/dispatch/transport.ts +2 -19
  348. package/src/domains/dispatch/types.ts +3 -3
  349. package/src/domains/dispatch/worker-protocol.ts +2 -2
  350. package/src/domains/eval/artifacts/store.ts +5 -4
  351. package/src/domains/eval/compare/thresholds.ts +0 -8
  352. package/src/domains/eval/execution-provenance.ts +1 -1
  353. package/src/domains/eval/metrics/token-stream.ts +0 -7
  354. package/src/domains/eval/report.ts +1 -1
  355. package/src/domains/eval/runner.ts +1 -1
  356. package/src/domains/eval/runners/clio-run.ts +7 -6
  357. package/src/domains/eval/runners/external-command.ts +4 -3
  358. package/src/domains/eval/schema/artifact.ts +1 -1
  359. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  360. package/src/domains/eval/schema/behavioral.ts +7 -6
  361. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  362. package/src/domains/eval/schema/naming.ts +10 -0
  363. package/src/domains/eval/schema/suite.ts +2 -2
  364. package/src/domains/eval/schema/validate.ts +9 -5
  365. package/src/domains/eval/schema/verdict.ts +4 -2
  366. package/src/domains/eval/store.ts +12 -2
  367. package/src/domains/eval/suites/run.ts +12 -6
  368. package/src/domains/eval/types.ts +1 -1
  369. package/src/domains/eval/workspaces/git.ts +1 -1
  370. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  371. package/src/domains/evidence/build.ts +13 -5
  372. package/src/domains/interop/consent.ts +7 -7
  373. package/src/domains/interop/extension.ts +1 -1
  374. package/src/domains/lifecycle/doctor.ts +27 -21
  375. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  376. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  377. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  378. package/src/domains/lifecycle/migrations/index.ts +20 -1
  379. package/src/domains/lifecycle/naming-history.ts +153 -0
  380. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  381. package/src/domains/lifecycle/naming-resources.ts +261 -0
  382. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  383. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  384. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  385. package/src/domains/memory/task-memory-handoff.ts +6 -3
  386. package/src/domains/middleware/index.ts +7 -0
  387. package/src/domains/middleware/marketplace-offer.ts +339 -0
  388. package/src/domains/middleware/runtime.ts +2 -2
  389. package/src/domains/mux/contract.ts +157 -25
  390. package/src/domains/mux/detect.ts +29 -5
  391. package/src/domains/mux/dock-controller.ts +365 -0
  392. package/src/domains/mux/extension.ts +7 -1
  393. package/src/domains/mux/index.ts +20 -0
  394. package/src/domains/mux/operations.ts +28 -0
  395. package/src/domains/mux/protocol.ts +19 -6
  396. package/src/domains/mux/socket-client.ts +167 -19
  397. package/src/domains/mux/types.ts +49 -6
  398. package/src/domains/mux/yazi/event-stream.ts +6 -4
  399. package/src/domains/mux/yazi/profile.ts +1 -1
  400. package/src/domains/mux/yazi/session.ts +26 -3
  401. package/src/domains/observability/extension.ts +1 -1
  402. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  403. package/src/domains/observability/projection.ts +1 -1
  404. package/src/domains/observability/trace-store.ts +22 -12
  405. package/src/domains/prompts/compiler.ts +2 -2
  406. package/src/domains/prompts/extension.ts +3 -3
  407. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  408. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  409. package/src/domains/providers/extension.ts +5 -5
  410. package/src/domains/providers/knowledge-base-path.ts +1 -1
  411. package/src/domains/providers/model-runtime-capabilities.ts +14 -2
  412. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  413. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  414. package/src/domains/providers/plugins.ts +1 -1
  415. package/src/domains/providers/resolver.ts +1 -1
  416. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  417. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  418. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  419. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  420. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  421. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  422. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  423. package/src/domains/providers/types/knowledge-base.ts +13 -0
  424. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  425. package/src/domains/providers/types/target-descriptor.ts +3 -3
  426. package/src/domains/resources/extension.ts +1 -1
  427. package/src/domains/resources/library.ts +6 -6
  428. package/src/domains/resources/prompts/loader.ts +1 -1
  429. package/src/domains/resources/skills/content-hash.ts +7 -6
  430. package/src/domains/resources/skills/evals.ts +1 -1
  431. package/src/domains/resources/skills/install.ts +36 -12
  432. package/src/domains/resources/skills/loader.ts +39 -13
  433. package/src/domains/resources/skills/marketplace.ts +21 -2
  434. package/src/domains/resources/skills/promotion.ts +214 -0
  435. package/src/domains/safety/audit.ts +2 -2
  436. package/src/domains/safety/finish-contract.ts +2 -1
  437. package/src/domains/safety/run-effects.ts +1 -1
  438. package/src/domains/scheduling/extension.ts +4 -4
  439. package/src/domains/session/archive-readers.ts +9 -1
  440. package/src/domains/session/compaction/branch-summary.ts +4 -0
  441. package/src/domains/session/compaction/compact.ts +1 -1
  442. package/src/domains/session/compaction/tokens.ts +4 -0
  443. package/src/domains/session/context-accounting.ts +1 -1
  444. package/src/domains/session/decision-board.ts +1 -1
  445. package/src/domains/session/extension.ts +1 -1
  446. package/src/domains/session/handoff.ts +2 -2
  447. package/src/domains/session/prompt-manifest.ts +0 -5
  448. package/src/domains/session/protected-artifact-journal.ts +12 -6
  449. package/src/domains/session/retry.ts +1 -1
  450. package/src/domains/share/archive.ts +85 -36
  451. package/src/domains/toolchain/install.ts +1 -1
  452. package/src/engine/acp/adapter.ts +3 -3
  453. package/src/engine/acp/event-mapper.ts +3 -3
  454. package/src/engine/acp/server.ts +27 -26
  455. package/src/engine/acp/tool-mediator.ts +2 -2
  456. package/src/engine/acp/types.ts +1 -1
  457. package/src/engine/alcf-oauth.ts +5 -5
  458. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  459. package/src/engine/api-registry.ts +1 -1
  460. package/src/engine/apis/llamacpp-residency.ts +1 -19
  461. package/src/engine/apis/lmstudio.ts +1 -6
  462. package/src/engine/apis/ollama-native.ts +3 -3
  463. package/src/engine/apis/openai-completions.ts +2 -2
  464. package/src/engine/apis/residency.ts +3 -9
  465. package/src/engine/claude/sdk-module.ts +1 -12
  466. package/src/engine/claude/sdk-runtime.ts +6 -6
  467. package/src/engine/claude/subprocess-runtime.ts +1 -1
  468. package/src/engine/claude/tool-safety.ts +4 -4
  469. package/src/engine/loop-guard.ts +0 -5
  470. package/src/engine/session.ts +14 -7
  471. package/src/engine/tui-primitives.ts +1 -1
  472. package/src/engine/worker-events.ts +6 -6
  473. package/src/engine/worker-runtime.ts +14 -13
  474. package/src/entry/orchestrator.ts +107 -88
  475. package/src/interactive/application-controller.ts +21 -21
  476. package/src/interactive/bus-notices.ts +2 -2
  477. package/src/interactive/chat-loop.ts +8 -8
  478. package/src/interactive/chat-panel.ts +1 -1
  479. package/src/interactive/clio-editor.ts +105 -1
  480. package/src/interactive/context-activity.ts +8 -6
  481. package/src/interactive/context-meter.ts +3 -6
  482. package/src/interactive/context-overlay.ts +1 -1
  483. package/src/interactive/cost-overlay.ts +1 -1
  484. package/src/interactive/council-grid.ts +2 -2
  485. package/src/interactive/dispatch-board.ts +30 -33
  486. package/src/interactive/editor-bash.ts +21 -0
  487. package/src/interactive/editor-steer.ts +9 -4
  488. package/src/interactive/editor-submit.ts +24 -18
  489. package/src/interactive/external-editor.ts +1 -1
  490. package/src/interactive/file-reference-completion.ts +360 -0
  491. package/src/interactive/footer/dashboard.ts +15 -17
  492. package/src/interactive/footer/notifications.ts +14 -8
  493. package/src/interactive/footer/widgets.ts +2 -44
  494. package/src/interactive/interactive-application.ts +79 -59
  495. package/src/interactive/interactive-event-projection.ts +1 -1
  496. package/src/interactive/interactive-input-runtime.ts +2 -2
  497. package/src/interactive/interactive-presentation.ts +21 -16
  498. package/src/interactive/interactive-shell.ts +2 -2
  499. package/src/interactive/interactive-slash-runtime.ts +63 -17
  500. package/src/interactive/interactive-subscriptions.ts +1 -1
  501. package/src/interactive/interactive-tickers.ts +1 -1
  502. package/src/interactive/keybinding-manager.ts +4 -4
  503. package/src/interactive/layout.ts +1 -1
  504. package/src/interactive/memory-overlay.ts +2 -2
  505. package/src/interactive/modal-marker.ts +2 -21
  506. package/src/interactive/mutation-preview.ts +1 -1
  507. package/src/interactive/overlay-frame.ts +4 -12
  508. package/src/interactive/overlay-general-openers.ts +6 -2
  509. package/src/interactive/overlay-key-routing.ts +7 -7
  510. package/src/interactive/overlay-lifecycle.ts +1 -1
  511. package/src/interactive/overlay-model-selectors.ts +3 -3
  512. package/src/interactive/overlays/agents.ts +2 -2
  513. package/src/interactive/overlays/ask-user.ts +25 -11
  514. package/src/interactive/overlays/context-reset.ts +28 -4
  515. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  516. package/src/interactive/overlays/decisions.ts +4 -2
  517. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  518. package/src/interactive/overlays/handoff-review.ts +2 -2
  519. package/src/interactive/overlays/interop.ts +1 -1
  520. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  521. package/src/interactive/overlays/message-picker.ts +1 -1
  522. package/src/interactive/overlays/model-selector.ts +39 -31
  523. package/src/interactive/overlays/prompts.ts +10 -4
  524. package/src/interactive/overlays/session-selector.ts +2 -2
  525. package/src/interactive/overlays/settings.ts +339 -293
  526. package/src/interactive/overlays/side-question.ts +2 -2
  527. package/src/interactive/overlays/skills-hub.ts +8 -8
  528. package/src/interactive/overlays/tree-selector.ts +2 -2
  529. package/src/interactive/panes-runtime.ts +36 -10
  530. package/src/interactive/permission-overlay.ts +2 -2
  531. package/src/interactive/renderers/retry-status.ts +12 -4
  532. package/src/interactive/renderers/tool-execution.ts +4 -4
  533. package/src/interactive/session-transcript.ts +3 -3
  534. package/src/interactive/slash-autocomplete.ts +454 -165
  535. package/src/interactive/slash-commands.ts +279 -183
  536. package/src/interactive/slash-spec.ts +160 -17
  537. package/src/interactive/status/controller.ts +2 -2
  538. package/src/interactive/stream-pacing-policy.ts +1 -1
  539. package/src/interactive/tasks-overlay.ts +20 -13
  540. package/src/interactive/terminal-lease.ts +6 -7
  541. package/src/interactive/turn-context.ts +11 -11
  542. package/src/interactive/turn-persistence.ts +2 -2
  543. package/src/interactive/turn-prewarm.ts +2 -2
  544. package/src/interactive/turn-runtime.ts +8 -8
  545. package/src/interactive/turn-state.ts +1 -1
  546. package/src/interactive/view/artifacts.ts +12 -9
  547. package/src/interactive/view/view-overlay.ts +13 -10
  548. package/src/interactive/watch-pane.ts +38 -10
  549. package/src/interactive/welcome-dashboard.ts +15 -15
  550. package/src/interactive/worker-progress.ts +4 -4
  551. package/src/interactive/worker-receipts.ts +1 -1
  552. package/src/interactive/worker-stream.ts +1 -4
  553. package/src/interactive/yazi-bridge.ts +12 -5
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/builtin-tool-catalog.ts +1 -1
  557. package/src/tools/compete-worktrees.ts +27 -17
  558. package/src/tools/context/index.ts +15 -1
  559. package/src/tools/dispatch-admission.ts +4 -2
  560. package/src/tools/dispatch-arguments.ts +1 -1
  561. package/src/tools/dispatch-plan.ts +0 -11
  562. package/src/tools/dispatch-run-events.ts +12 -10
  563. package/src/tools/dispatch-runner.ts +11 -6
  564. package/src/tools/dispatch.ts +1 -1
  565. package/src/tools/find.ts +1 -6
  566. package/src/tools/monitor.ts +4 -4
  567. package/src/tools/observers.ts +0 -33
  568. package/src/tools/task-worktree.ts +28 -7
  569. package/src/tools/verify/authoring.ts +3 -6
  570. package/src/tools/verify/frontend.ts +1 -1
  571. package/src/tools/web-fetch.ts +1 -1
  572. package/src/worker/entry.ts +4 -3
  573. package/src/worker/protocol.ts +16 -14
  574. package/src/worker/spec-contract.ts +2 -2
  575. package/src/worker/stdin-demux.ts +2 -2
  576. package/dist/chunk-GXNLGKAB.js +0 -571
  577. package/dist/chunk-VFA6GDY5.js +0 -1625
  578. package/dist/doctor-QOA5FNY5.js +0 -313
  579. package/src/engine/apis/degraded-inference.ts +0 -95
  580. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  581. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
@@ -9,8 +9,11 @@
9
9
  * call.
10
10
  *
11
11
  * Embedded mode resolves to `none` until Phase 5 lands the session bootstrap.
12
- * Asking for it is not an error; it degrades with a reason the doctor surface
13
- * can print.
12
+ * Asking for it is not an error, but it is a refusal rather than a quiet
13
+ * degrade: the detection carries `refused: true`, the boot prints the reason on
14
+ * stderr, and doctor's mode row warns. A session that asked for panes and got
15
+ * none should never have to guess why, and `embedded` costs guest mode too, so
16
+ * the reason names `auto` as the rung that works today.
14
17
  */
15
18
 
16
19
  import { homedir } from "node:os";
@@ -32,6 +35,15 @@ export interface MuxDetection {
32
35
  candidates: ReadonlyArray<string>;
33
36
  /** Human-readable reason, always set; for `guest` it names the socket that answered. */
34
37
  reason: string;
38
+ /**
39
+ * True when the operator asked for a rung Clio cannot provide, as opposed to
40
+ * asking for panes on a machine that has no pane host. The two are both
41
+ * `none` and neither is an error, but only the first is a promise Clio broke:
42
+ * nothing about the environment would change the answer, and the operator has
43
+ * to be told, because they configured a mode and got no panes. Callers raise
44
+ * a refusal to a visible level; an ordinary `none` stays at debug.
45
+ */
46
+ refused: boolean;
35
47
  }
36
48
 
37
49
  export interface DetectMuxOptions {
@@ -83,7 +95,7 @@ function readSelfLocation(env: NodeJS.ProcessEnv): MuxSelfLocation {
83
95
  };
84
96
  }
85
97
 
86
- function none(reason: string, candidates: ReadonlyArray<string> = []): MuxDetection {
98
+ function none(reason: string, candidates: ReadonlyArray<string> = [], refused = false): MuxDetection {
87
99
  return {
88
100
  mode: "none",
89
101
  socketPath: null,
@@ -91,6 +103,7 @@ function none(reason: string, candidates: ReadonlyArray<string> = []): MuxDetect
91
103
  self: { workspaceId: null, tabId: null, paneId: null },
92
104
  candidates,
93
105
  reason,
106
+ refused,
94
107
  };
95
108
  }
96
109
 
@@ -114,8 +127,18 @@ export async function detectMux(options: DetectMuxOptions = {}): Promise<MuxDete
114
127
  }
115
128
  if (enabled === "embedded") {
116
129
  // Phase 5 owns the session bootstrap. Until then the honest answer is that
117
- // Clio cannot provide panes, not that it failed to find them.
118
- return { detection: none("embedded mode is not implemented yet; it ships in phase 5"), client: null };
130
+ // Clio cannot provide panes, not that it failed to find them, and the
131
+ // operator hears it: this degrade is marked a refusal so the boot says so
132
+ // out loud rather than logging a debug line nobody reads. The reason also
133
+ // names the rung that does work, because `embedded` costs guest mode too.
134
+ return {
135
+ detection: none(
136
+ "embedded mode is not implemented yet; it ships in phase 5, so this session has no panes at all. Set panes.enabled=auto for guest mode inside a herdr session.",
137
+ [],
138
+ true,
139
+ ),
140
+ client: null,
141
+ };
119
142
  }
120
143
  if (env.HERDR_ENV !== "1") {
121
144
  return { detection: none("HERDR_ENV is not 1, so Clio is not running inside a pane host"), client: null };
@@ -137,6 +160,7 @@ export async function detectMux(options: DetectMuxOptions = {}): Promise<MuxDete
137
160
  self: readSelfLocation(env),
138
161
  candidates,
139
162
  reason: `guest mode on ${socketPath} (herdr ${server.version}, protocol ${server.protocol})`,
163
+ refused: false,
140
164
  },
141
165
  client,
142
166
  };
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Dock geometry and lifecycle: the managed tier of Clio-owned panes.
3
+ *
4
+ * A dock is a pane in a fixed position relative to Clio's anchor pane with a
5
+ * target share of the anchor's axis, a minimum size in cells, and a managed
6
+ * lifecycle. Two slots exist: `workers` to the right of the anchor and
7
+ * `files` below it. Ad-hoc utility panes are not docks and are never touched
8
+ * here.
9
+ *
10
+ * The controller owns geometry only. Ownership stays in the pane registry,
11
+ * error swallowing stays in the contract's `attempt` wrapper: every method
12
+ * here that talks to the socket may throw a `MuxError`, and the contract is
13
+ * the layer that turns that into a null/false answer.
14
+ *
15
+ * Three rules run through the reconciliation logic:
16
+ *
17
+ * 1. A user action is a decision. A resize observed via `layout.updated`
18
+ * that does not match what Clio last applied becomes the new target; a
19
+ * closed dock stays closed; a moved dock is followed to its new id.
20
+ * 2. Clio's own corrections must not read as user actions. Every applied
21
+ * share is remembered and an observation matching it (or the target)
22
+ * within {@link SHARE_EPSILON} is a no-op.
23
+ * 3. Opening never steals focus. Focus and zoom live on the contract and
24
+ * only ever run on explicit request.
25
+ */
26
+
27
+ import type { MuxClient } from "./socket-client.js";
28
+ import type { MuxLayoutNode, MuxLog, MuxPaneRef, MuxRect, MuxTabGeometry } from "./types.js";
29
+
30
+ /** The two managed dock positions. */
31
+ export type DockSlot = "workers" | "files";
32
+
33
+ export interface DockSpec {
34
+ slot: DockSlot;
35
+ direction: "right" | "down";
36
+ /** Default share of the anchor's axis the dock takes when none is configured. */
37
+ defaultShare: number;
38
+ /** Floor in cells (columns for `right`, rows for `down`) below which a dock is useless. */
39
+ minCells: number;
40
+ }
41
+
42
+ /**
43
+ * Fixed per slot rather than heuristic: the workers viewer wants columns, the
44
+ * file pane wants rows, and a dock that wanders per terminal width would make
45
+ * the layout feel like weather.
46
+ */
47
+ export const DOCK_SPECS: Readonly<Record<DockSlot, DockSpec>> = {
48
+ workers: { slot: "workers", direction: "right", defaultShare: 0.34, minCells: 48 },
49
+ files: { slot: "files", direction: "down", defaultShare: 0.3, minCells: 12 },
50
+ };
51
+
52
+ /** A dock may never take more than half the axis, whatever the share asks. */
53
+ export const DOCK_MAX_SHARE = 0.5;
54
+ /** Observed-vs-applied share differences below this are rounding, not a user drag. */
55
+ export const SHARE_EPSILON = 0.02;
56
+
57
+ export interface DockState {
58
+ slot: DockSlot;
59
+ paneId: string;
60
+ tabId: string;
61
+ /** Share of the axis the dock should hold; user resizes overwrite it. */
62
+ targetShare: number;
63
+ /** What Clio last set, so its own correction is not adopted as a user drag. */
64
+ lastAppliedShare: number;
65
+ }
66
+
67
+ /** Wire ratio for a split where the dock is the `second` child: the anchor keeps the rest. */
68
+ export function ratioForDockShare(share: number): number {
69
+ return 1 - share;
70
+ }
71
+
72
+ /** Clamps a requested share into (0, DOCK_MAX_SHARE]. */
73
+ export function clampDockShare(share: number): number {
74
+ if (!Number.isFinite(share) || share <= 0) return DOCK_SPECS.workers.defaultShare;
75
+ return Math.min(DOCK_MAX_SHARE, share);
76
+ }
77
+
78
+ /** The axis length in cells a spec's direction measures on a rect. */
79
+ function axisCells(rect: { width: number; height: number }, spec: DockSpec): number {
80
+ return spec.direction === "right" ? rect.width : rect.height;
81
+ }
82
+
83
+ /**
84
+ * Boolean path from the root to the split separating `anchorPaneId` from
85
+ * `dockPaneId`, plus which side the dock sits on. Null when the tree does not
86
+ * hold such a split, which is how a stale path is detected after user moves.
87
+ */
88
+ export function deriveSplitPath(
89
+ root: MuxLayoutNode,
90
+ anchorPaneId: string,
91
+ dockPaneId: string,
92
+ ): { path: ReadonlyArray<boolean>; dockIsSecond: boolean; direction: "right" | "down" } | null {
93
+ const contains = (node: MuxLayoutNode, paneId: string): boolean => {
94
+ if (node.type === "pane") return node.paneId === paneId;
95
+ return contains(node.first, paneId) || contains(node.second, paneId);
96
+ };
97
+ const walk = (
98
+ node: MuxLayoutNode,
99
+ path: boolean[],
100
+ ): { path: boolean[]; dockIsSecond: boolean; direction: "right" | "down" } | null => {
101
+ if (node.type !== "split") return null;
102
+ const dockFirst = contains(node.first, dockPaneId);
103
+ const dockSecond = contains(node.second, dockPaneId);
104
+ const anchorFirst = contains(node.first, anchorPaneId);
105
+ const anchorSecond = contains(node.second, anchorPaneId);
106
+ if (dockFirst && anchorSecond) return { path, dockIsSecond: false, direction: node.direction };
107
+ if (dockSecond && anchorFirst) return { path, dockIsSecond: true, direction: node.direction };
108
+ if (dockFirst && anchorFirst) return walk(node.first, [...path, false]);
109
+ if (dockSecond && anchorSecond) return walk(node.second, [...path, true]);
110
+ return null;
111
+ };
112
+ return walk(root, []);
113
+ }
114
+
115
+ /** Whether `outer` contains `inner`, cell-inclusive. */
116
+ function containsRect(outer: MuxRect, inner: MuxRect): boolean {
117
+ return (
118
+ outer.x <= inner.x &&
119
+ outer.y <= inner.y &&
120
+ outer.x + outer.width >= inner.x + inner.width &&
121
+ outer.y + outer.height >= inner.y + inner.height
122
+ );
123
+ }
124
+
125
+ /**
126
+ * The dock side's observed share at the split separating it from the anchor,
127
+ * from live geometry. The separating split is the smallest split rect holding
128
+ * both panes: split rects nest, so that is their lowest common ancestor. Its
129
+ * live ratio is read directly rather than summing pane cells, because the
130
+ * anchor's rect stops standing for its whole side the moment the user splits
131
+ * it for something else, and a cell sum then misreads an untouched dock as a
132
+ * resize. A separating split on the wrong axis measures nothing.
133
+ */
134
+ export function observedDockShare(
135
+ geometry: MuxTabGeometry,
136
+ spec: DockSpec,
137
+ anchorPaneId: string,
138
+ dockPaneId: string,
139
+ ): number | null {
140
+ const anchor = geometry.panes.find((pane) => pane.paneId === anchorPaneId);
141
+ const dock = geometry.panes.find((pane) => pane.paneId === dockPaneId);
142
+ if (!anchor || !dock) return null;
143
+ let separating: MuxTabGeometry["splits"][number] | null = null;
144
+ for (const split of geometry.splits) {
145
+ if (!containsRect(split.rect, anchor.rect) || !containsRect(split.rect, dock.rect)) continue;
146
+ if (!separating || split.rect.width * split.rect.height < separating.rect.width * separating.rect.height) {
147
+ separating = split;
148
+ }
149
+ }
150
+ if (!separating || separating.direction !== spec.direction) return null;
151
+ // On opposite sides of the divider, the second child always starts past the
152
+ // first, so a coordinate compare says which side the dock holds.
153
+ const dockIsSecond = spec.direction === "right" ? dock.rect.x > anchor.rect.x : dock.rect.y > anchor.rect.y;
154
+ return dockIsSecond ? 1 - separating.ratio : separating.ratio;
155
+ }
156
+
157
+ export interface DockOpenPlan {
158
+ direction: "right" | "down";
159
+ /** Wire ratio for `pane.split`: the share the anchor keeps. */
160
+ ratio: number;
161
+ share: number;
162
+ }
163
+
164
+ /**
165
+ * Decides whether a dock fits beside the anchor and with what split ratio,
166
+ * from the anchor's current rect. Refusal happens here, before any split
167
+ * reaches the wire, so a too-small terminal never flashes a sliver pane.
168
+ */
169
+ export function planDockOpen(
170
+ anchorRect: { width: number; height: number },
171
+ spec: DockSpec,
172
+ requestedShare?: number,
173
+ ): DockOpenPlan | { refused: string } {
174
+ const axis = axisCells(anchorRect, spec);
175
+ if (axis * DOCK_MAX_SHARE < spec.minCells) {
176
+ return {
177
+ refused: `the ${spec.slot} dock needs ${spec.minCells} cells and at most half of ${axis} is available`,
178
+ };
179
+ }
180
+ const share = Math.max(clampDockShare(requestedShare ?? spec.defaultShare), spec.minCells / axis);
181
+ return { direction: spec.direction, ratio: ratioForDockShare(share), share };
182
+ }
183
+
184
+ export interface DockControllerOptions {
185
+ client: MuxClient;
186
+ anchorPaneId: string;
187
+ log?: MuxLog;
188
+ }
189
+
190
+ export interface DockController {
191
+ /** Live dock states, for status output. */
192
+ states(): ReadonlyArray<DockState>;
193
+ stateFor(slot: DockSlot): DockState | null;
194
+ /**
195
+ * Splits the anchor for a dock and converges it to its cell floor. Returns
196
+ * the new pane, or null when the anchor is too small. Throws MuxError on
197
+ * wire failure; the contract's attempt wrapper owns that.
198
+ */
199
+ open(
200
+ slot: DockSlot,
201
+ options?: { share?: number; cwd?: string; env?: Readonly<Record<string, string>> },
202
+ ): Promise<MuxPaneRef | null>;
203
+ /** Record an adopted pane (crash recovery) as this slot's dock. */
204
+ adopt(slot: DockSlot, ref: MuxPaneRef): void;
205
+ /** Set a dock's share explicitly, as `/panes` resize does. */
206
+ resize(slot: DockSlot, share: number): Promise<boolean>;
207
+ /** Feed a `layout.updated` push; user resizes become the new target. */
208
+ noteLayoutUpdated(geometry: MuxTabGeometry): void;
209
+ /** Feed a pane departure; a closed dock is a decision, not a fault. */
210
+ notePaneGone(paneId: string): void;
211
+ /** Feed a `pane.moved` id rewrite; the dock is followed to its new id. */
212
+ notePaneMoved(previousPaneId: string, paneId: string, tabId: string): void;
213
+ /** Pane ids of every live dock, for the contract's clean-exit sweep. */
214
+ paneIds(): ReadonlyArray<string>;
215
+ clear(): void;
216
+ }
217
+
218
+ export function createDockController(options: DockControllerOptions): DockController {
219
+ const { client, anchorPaneId } = options;
220
+ const log = options.log ?? ((): void => undefined);
221
+ const bySlot = new Map<DockSlot, DockState>();
222
+
223
+ /**
224
+ * Re-derives the split path from a fresh export and applies a ratio for the
225
+ * dock's share. The path is never cached: user splits and moves invalidate
226
+ * it silently, and one export per resize is cheap.
227
+ */
228
+ const applyShare = async (state: DockState, share: number): Promise<boolean> => {
229
+ const tree = await client.layoutExport({ tabId: state.tabId });
230
+ const derived = deriveSplitPath(tree.root, anchorPaneId, state.paneId);
231
+ if (!derived) {
232
+ log("debug", `mux ${state.slot} dock split path is gone from ${state.tabId}; leaving layout alone`);
233
+ return false;
234
+ }
235
+ // After a user move the separating split can run the other axis, and the
236
+ // share would then set a height where minCells measures columns. Wrong-axis
237
+ // geometry is declined, not silently applied.
238
+ if (derived.direction !== DOCK_SPECS[state.slot].direction) {
239
+ log("debug", `mux ${state.slot} dock split runs ${derived.direction}; declining the wrong-axis resize`);
240
+ return false;
241
+ }
242
+ const ratio = derived.dockIsSecond ? ratioForDockShare(share) : share;
243
+ await client.layoutSetSplitRatio({ tabId: state.tabId, path: derived.path, ratio });
244
+ state.targetShare = share;
245
+ state.lastAppliedShare = share;
246
+ return true;
247
+ };
248
+
249
+ return {
250
+ states(): ReadonlyArray<DockState> {
251
+ return [...bySlot.values()].map((state) => ({ ...state }));
252
+ },
253
+
254
+ stateFor(slot: DockSlot): DockState | null {
255
+ const state = bySlot.get(slot);
256
+ return state ? { ...state } : null;
257
+ },
258
+
259
+ async open(slot, openOptions = {}): Promise<MuxPaneRef | null> {
260
+ const existing = bySlot.get(slot);
261
+ if (existing) {
262
+ return { paneId: existing.paneId, tabId: existing.tabId, workspaceId: "" };
263
+ }
264
+ const spec = DOCK_SPECS[slot];
265
+ const geometry = await client.paneLayout(anchorPaneId);
266
+ const anchorRect = geometry.panes.find((pane) => pane.paneId === anchorPaneId)?.rect;
267
+ if (!anchorRect) {
268
+ log("debug", `mux ${slot} dock open found no anchor rect for ${anchorPaneId}`);
269
+ return null;
270
+ }
271
+ const plan = planDockOpen(anchorRect, spec, openOptions.share);
272
+ if ("refused" in plan) {
273
+ log("info", `mux ${slot} dock refused: ${plan.refused}`);
274
+ return null;
275
+ }
276
+ const pane = await client.paneSplit({
277
+ direction: plan.direction,
278
+ targetPaneId: anchorPaneId,
279
+ ratio: plan.ratio,
280
+ focus: false,
281
+ ...(openOptions.cwd !== undefined ? { cwd: openOptions.cwd } : {}),
282
+ ...(openOptions.env ? { env: openOptions.env } : {}),
283
+ });
284
+ const state: DockState = {
285
+ slot,
286
+ paneId: pane.paneId,
287
+ tabId: pane.tabId,
288
+ targetShare: plan.share,
289
+ lastAppliedShare: plan.share,
290
+ };
291
+ bySlot.set(slot, state);
292
+ // Ratio-at-split lands on the anchor's old rect; prior splits or a
293
+ // resize since the read can leave the dock under its floor. One
294
+ // converge pass fixes it; failure to converge is not failure to open.
295
+ try {
296
+ const after = await client.paneLayout(anchorPaneId);
297
+ const dockRect = after.panes.find((entry) => entry.paneId === pane.paneId)?.rect;
298
+ if (dockRect && axisCells(dockRect, spec) < spec.minCells) {
299
+ const anchorAfter = after.panes.find((entry) => entry.paneId === anchorPaneId)?.rect;
300
+ const total = anchorAfter ? axisCells(anchorAfter, spec) + axisCells(dockRect, spec) : 0;
301
+ if (total > 0) await applyShare(state, Math.min(DOCK_MAX_SHARE, spec.minCells / total));
302
+ }
303
+ } catch (error) {
304
+ log("debug", `mux ${slot} dock converge skipped: ${error instanceof Error ? error.message : String(error)}`);
305
+ }
306
+ return { paneId: pane.paneId, tabId: pane.tabId, workspaceId: pane.workspaceId };
307
+ },
308
+
309
+ adopt(slot: DockSlot, ref: MuxPaneRef): void {
310
+ const spec = DOCK_SPECS[slot];
311
+ bySlot.set(slot, {
312
+ slot,
313
+ paneId: ref.paneId,
314
+ tabId: ref.tabId,
315
+ // The surviving pane's actual share is adopted lazily by the next
316
+ // layout observation; until then the default is the best guess.
317
+ targetShare: spec.defaultShare,
318
+ lastAppliedShare: spec.defaultShare,
319
+ });
320
+ },
321
+
322
+ async resize(slot: DockSlot, share: number): Promise<boolean> {
323
+ const state = bySlot.get(slot);
324
+ if (!state) return false;
325
+ return await applyShare(state, Math.max(clampDockShare(share), 0.01));
326
+ },
327
+
328
+ noteLayoutUpdated(geometry: MuxTabGeometry): void {
329
+ for (const state of bySlot.values()) {
330
+ if (state.tabId !== geometry.tabId) continue;
331
+ const observed = observedDockShare(geometry, DOCK_SPECS[state.slot], anchorPaneId, state.paneId);
332
+ if (observed === null) continue;
333
+ if (Math.abs(observed - state.targetShare) <= SHARE_EPSILON) continue;
334
+ if (Math.abs(observed - state.lastAppliedShare) <= SHARE_EPSILON) continue;
335
+ // The user dragged the divider. Their ratio is the target now, and a
336
+ // later terminal resize must not fight them back to the old one.
337
+ log("debug", `mux ${state.slot} dock resized by the user to ${(observed * 100).toFixed(0)}%`);
338
+ state.targetShare = observed;
339
+ state.lastAppliedShare = observed;
340
+ }
341
+ },
342
+
343
+ notePaneGone(paneId: string): void {
344
+ for (const [slot, state] of bySlot) {
345
+ if (state.paneId === paneId) bySlot.delete(slot);
346
+ }
347
+ },
348
+
349
+ notePaneMoved(previousPaneId: string, paneId: string, tabId: string): void {
350
+ for (const state of bySlot.values()) {
351
+ if (state.paneId !== previousPaneId) continue;
352
+ state.paneId = paneId;
353
+ state.tabId = tabId;
354
+ }
355
+ },
356
+
357
+ paneIds(): ReadonlyArray<string> {
358
+ return [...bySlot.values()].map((state) => state.paneId);
359
+ },
360
+
361
+ clear(): void {
362
+ bySlot.clear();
363
+ },
364
+ };
365
+ }
@@ -30,7 +30,13 @@ export async function createMuxBundle(
30
30
  ...(options.env ? { env: options.env } : {}),
31
31
  log,
32
32
  });
33
- log(detection.mode === "none" ? "debug" : "info", `mux mode ${detection.mode}: ${detection.reason}`);
33
+ // A `none` that nobody asked for is background noise and stays at debug. A
34
+ // refusal is the operator's own setting being turned down, so it goes to
35
+ // `warning`, which the orchestrator routes to boot stderr.
36
+ log(
37
+ detection.refused ? "warning" : detection.mode === "none" ? "debug" : "info",
38
+ detection.refused ? `panes refused: ${detection.reason}` : `mux mode ${detection.mode}: ${detection.reason}`,
39
+ );
34
40
 
35
41
  const runtime = createMuxRuntime({ detection, client, log });
36
42
 
@@ -26,6 +26,20 @@ export type {
26
26
  } from "./contract.js";
27
27
  export { createMuxRuntime } from "./contract.js";
28
28
  export { detectMux, type MuxDetection, type MuxEnablement, resolveSocketCandidates } from "./detect.js";
29
+ export {
30
+ clampDockShare,
31
+ DOCK_MAX_SHARE,
32
+ DOCK_SPECS,
33
+ type DockController,
34
+ type DockSlot,
35
+ type DockSpec,
36
+ type DockState,
37
+ deriveSplitPath,
38
+ observedDockShare,
39
+ planDockOpen,
40
+ ratioForDockShare,
41
+ SHARE_EPSILON,
42
+ } from "./dock-controller.js";
29
43
  export type { MuxDomainOptions } from "./extension.js";
30
44
  export { MuxManifest } from "./manifest.js";
31
45
  export { createPaneRegistry, type MuxPaneRegistry, paneRecord } from "./pane-registry.js";
@@ -37,12 +51,15 @@ export {
37
51
  type MuxErrorKind,
38
52
  type MuxEvent,
39
53
  type MuxEventKind,
54
+ type MuxLayoutNode,
55
+ type MuxLayoutTree,
40
56
  type MuxLog,
41
57
  type MuxMode,
42
58
  type MuxNotificationSound,
43
59
  type MuxPanePurpose,
44
60
  type MuxPaneRecord,
45
61
  type MuxPaneRef,
62
+ type MuxRect,
46
63
  type MuxReportableAgentState,
47
64
  MuxRequestTimeout,
48
65
  type MuxSelfLocation,
@@ -50,12 +67,15 @@ export {
50
67
  type MuxServerInfo,
51
68
  type MuxSnapshot,
52
69
  type MuxTab,
70
+ type MuxTabGeometry,
53
71
  muxErrorKind,
54
72
  } from "./types.js";
55
73
  export { clioCliEntryPath, type ViewerCommandOptions, watchViewerCommand } from "./viewer-command.js";
56
74
  export {
57
75
  createYaziEventStream,
76
+ LEGACY_YAZI_PICK_EVENT,
58
77
  parseYaziEventLine,
78
+ YAZI_PICK_EVENT,
59
79
  YAZI_STREAM_MAX_BYTES,
60
80
  YAZI_STREAM_POLL_MS,
61
81
  type YaziCdEvent,
@@ -61,6 +61,8 @@ export interface PanesInventoryEntry {
61
61
  export interface PanesEffectiveSettings {
62
62
  enabled: string;
63
63
  notifications: string;
64
+ /** Boot composition: off, workers, or cockpit. */
65
+ layout: string;
64
66
  journal: boolean;
65
67
  yazi: {
66
68
  enabled: boolean;
@@ -70,6 +72,14 @@ export interface PanesEffectiveSettings {
70
72
  };
71
73
  }
72
74
 
75
+ /** One managed dock's live geometry, flattened for `/panes` status. */
76
+ export interface PanesDockStatus {
77
+ slot: "workers" | "files";
78
+ paneId: string;
79
+ /** Share of the axis the dock currently targets, 0..0.5. */
80
+ targetShare: number;
81
+ }
82
+
73
83
  /** File-pane return-path state flattened for `/panes` and the model tool. */
74
84
  export interface PanesYaziStatus {
75
85
  mode: "companion" | "chooser" | "closed";
@@ -89,6 +99,8 @@ export interface PanesStatus {
89
99
  server: { version: string; protocol: number } | null;
90
100
  settings: PanesEffectiveSettings;
91
101
  yazi: PanesYaziStatus;
102
+ /** Managed docks with live geometry; empty below the layout tier. */
103
+ docks: ReadonlyArray<PanesDockStatus>;
92
104
  panes: ReadonlyArray<PanesInventoryEntry>;
93
105
  }
94
106
 
@@ -109,6 +121,11 @@ export type PanesWatchResult =
109
121
  * is: neither the domain nor the tool may import the interactive tree.
110
122
  */
111
123
  export interface PanesWatchController {
124
+ /**
125
+ * Open (or adopt) the watch pane without retargeting it, for boot
126
+ * composition under `interface.panes.layout`. False when the host refused.
127
+ */
128
+ ensureOpen(): Promise<boolean>;
112
129
  /** Point the watch pane at a run, opening or adopting the pane first if needed. */
113
130
  watch(runId: string): Promise<PanesWatchResult>;
114
131
  /** Retarget only; false when no watch pane is open or the write failed. */
@@ -123,6 +140,11 @@ export type PanesOpenResult =
123
140
  | { status: "refused"; reason: string }
124
141
  | { status: "unavailable"; reason: string };
125
142
 
143
+ export type PanesZoomResult =
144
+ | { status: "zoomed"; paneId: string; label: string }
145
+ | { status: "not-found"; target: string }
146
+ | { status: "unavailable"; reason: string };
147
+
126
148
  export type PanesCloseResult =
127
149
  | { status: "closed"; closed: number; labels: ReadonlyArray<string> }
128
150
  | { status: "not-found"; target: string }
@@ -156,6 +178,12 @@ export interface PanesOperations {
156
178
  status(): PanesStatus;
157
179
  show(target: string): Promise<PanesShowResult>;
158
180
  open(request: { preset?: string; argv?: ReadonlyArray<string>; once?: boolean }): Promise<PanesOpenResult>;
181
+ /**
182
+ * Toggle zoom on one Clio-owned pane, matched like `close` (pane id, label
183
+ * substring, then purpose; newest first). Zooming steals focus, so this is
184
+ * operator-only and never reachable from the model tool.
185
+ */
186
+ zoom(target: string): Promise<PanesZoomResult>;
159
187
  close(target: string): Promise<PanesCloseResult>;
160
188
  /** Bind the composer-facing Yazi bridge without rebuilding this shared object. */
161
189
  attachYazi(controller: PanesYaziController): () => void;
@@ -7,14 +7,19 @@
7
7
  * adds the worktree family: a herdr old
8
8
  * enough to predate them answers `invalid_request`, and the honest response is
9
9
  * to take the documented fallback rather than to log a failure per call.
10
- * (`agent.focus` was gated here too until the per-run focus ladder was
11
- * removed with the run viewer panes; nothing drives it any more.)
12
10
  *
13
11
  * The floors are protocol introductions checked against herdr's changelog and
14
- * then re-verified with `herdr api schema --json` from PATH 0.7.5/protocol 17
15
- * and pinned 0.8.2/protocol 21. Worktrees arrived in protocol 10; notification.show
16
- * arrived in 17. Lower one only after checking the schema of
17
- * the release you are lowering it to.
12
+ * then re-verified with `herdr api schema --json` on the released artifacts
13
+ * themselves: 0.7.5 (protocol 17) and the pinned 0.8.2, whose hash-verified
14
+ * binary speaks protocol 20, not 21. Both schemas carry pane.focus,
15
+ * layout.export, and layout.set_split_ratio as method constants, so the whole
16
+ * dock tier floors at 17 alongside notification.show and pane.zoom. (An
17
+ * earlier attestation put these at 21 after reading a stray dev build that
18
+ * self-reported "0.8.2" while speaking protocol 21; on the real pin that
19
+ * floor gated the dock tier off entirely.) Worktrees arrived in protocol 10.
20
+ * 17 is the oldest schema actually read, not the oldest that might work.
21
+ * Lower one only after checking the schema of the release you are lowering
22
+ * it to.
18
23
  */
19
24
 
20
25
  import type { MuxServerInfo } from "./types.js";
@@ -23,6 +28,10 @@ import type { MuxServerInfo } from "./types.js";
23
28
  export type MuxGatedMethod =
24
29
  | "notification.show"
25
30
  | "pane.rename"
31
+ | "pane.focus"
32
+ | "pane.zoom"
33
+ | "layout.export"
34
+ | "layout.set_split_ratio"
26
35
  | "worktree.list"
27
36
  | "worktree.create"
28
37
  | "worktree.open"
@@ -31,6 +40,10 @@ export type MuxGatedMethod =
31
40
  export const MUX_METHOD_MIN_PROTOCOL: Readonly<Record<MuxGatedMethod, number>> = {
32
41
  "notification.show": 17,
33
42
  "pane.rename": 17,
43
+ "pane.focus": 17,
44
+ "pane.zoom": 17,
45
+ "layout.export": 17,
46
+ "layout.set_split_ratio": 17,
34
47
  "worktree.list": 10,
35
48
  "worktree.create": 10,
36
49
  "worktree.open": 10,