@iowarp/clio-coder 0.3.9 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (733) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/NOTICE +33 -0
  3. package/README.md +121 -16
  4. package/dist/{acp-7LOELQFP.js → acp-ZILU3AUO.js} +19 -18
  5. package/dist/{agents-FIBG2SHA.js → agents-HYWGBGQR.js} +53 -39
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-OI4LIH2I.js → auth-N3QT7CBO.js} +24 -21
  8. package/dist/{builtins-AD25UL3C.js → builtins-UJLMOVOV.js} +6 -6
  9. package/dist/{chunk-I4HZDVNP.js → chunk-2LEAKD4C.js} +2 -3
  10. package/dist/{chunk-465CC7FK.js → chunk-2NM363SV.js} +60 -64
  11. package/dist/{chunk-4H6ULJ3H.js → chunk-2VG7KLYV.js} +1046 -1370
  12. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  13. package/dist/{chunk-NZU6YDNV.js → chunk-3I5NY75V.js} +5 -5
  14. package/dist/{chunk-47CMYGET.js → chunk-3QSOM6PA.js} +2 -2
  15. package/dist/chunk-42FMPA75.js +101 -0
  16. package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
  17. package/dist/{chunk-IHKBWSXF.js → chunk-5QIAJV2D.js} +3 -3
  18. package/dist/chunk-5YHDIDBP.js +97 -0
  19. package/dist/chunk-6CCS4G3W.js +1529 -0
  20. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  21. package/dist/{chunk-BVDVID7E.js → chunk-6FN3E6KX.js} +6 -6
  22. package/dist/{chunk-DG4M6ZUE.js → chunk-6HMJX2VU.js} +59 -59
  23. package/dist/{chunk-3MRC2YSQ.js → chunk-6I5ILFOF.js} +3 -2
  24. package/dist/chunk-6NJQITNH.js +1412 -0
  25. package/dist/chunk-6VC4OV3Z.js +365 -0
  26. package/dist/{chunk-LU7P4LHA.js → chunk-72GZI5EV.js} +2 -2
  27. package/dist/{chunk-5T7RBWN2.js → chunk-74YWRRU5.js} +9 -8
  28. package/dist/{chunk-VPTUJU4P.js → chunk-7EPLI7VL.js} +2 -2
  29. package/dist/{chunk-CA42X6KT.js → chunk-7OBGU7UB.js} +7 -7
  30. package/dist/{chunk-56KB5IJP.js → chunk-7PWAODYW.js} +3 -3
  31. package/dist/chunk-7RY5VZPH.js +573 -0
  32. package/dist/{chunk-OEDBCISO.js → chunk-ABLSQ6JX.js} +3 -3
  33. package/dist/{chunk-5HFBWUMU.js → chunk-AFKWHWXF.js} +13 -23
  34. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  35. package/dist/{chunk-WXCJ7VME.js → chunk-AKB4GYDL.js} +7 -7
  36. package/dist/chunk-AP73CFDC.js +308 -0
  37. package/dist/{chunk-4LJX2PUC.js → chunk-BBTJOK6Y.js} +5 -5
  38. package/dist/{chunk-QQ7EKM72.js → chunk-BDPT6GTK.js} +13 -61
  39. package/dist/chunk-BJGUKIG4.js +302 -0
  40. package/dist/chunk-BMS5RKQY.js +27 -0
  41. package/dist/{chunk-TD7UE2L5.js → chunk-BTGG6BG2.js} +81 -40
  42. package/dist/chunk-BTK3SSSK.js +67 -0
  43. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  44. package/dist/chunk-BWW4HLO4.js +301 -0
  45. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  46. package/dist/{chunk-HJB5IUKP.js → chunk-C537JADH.js} +18 -18
  47. package/dist/{chunk-774ILSRL.js → chunk-CDNVLKUX.js} +5 -4
  48. package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
  49. package/dist/{chunk-AEYBF3TB.js → chunk-CWVRRIEI.js} +2 -2
  50. package/dist/chunk-D4CJV46V.js +462 -0
  51. package/dist/chunk-D7E7WCDF.js +27 -0
  52. package/dist/{chunk-5PVQ4SRS.js → chunk-E67WX76H.js} +10 -126
  53. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  54. package/dist/chunk-EIMVLWB3.js +1842 -0
  55. package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
  56. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  57. package/dist/{chunk-3DUR4WUA.js → chunk-FYUN5KZ3.js} +25 -25
  58. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  59. package/dist/chunk-GIZNH63R.js +40 -0
  60. package/dist/chunk-GPPB3JBE.js +688 -0
  61. package/dist/{chunk-B5XRQOLB.js → chunk-GVQJ5CCZ.js} +17 -11
  62. package/dist/chunk-HHV2GANA.js +88 -0
  63. package/dist/chunk-HJWWJ6IL.js +184 -0
  64. package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
  65. package/dist/chunk-HRQMFLJP.js +75 -0
  66. package/dist/{chunk-AD7Y7STJ.js → chunk-HUAS7ITX.js} +107 -97
  67. package/dist/{chunk-O6I4CIEU.js → chunk-I66EAJFY.js} +6 -6
  68. package/dist/{chunk-S4COXYBG.js → chunk-IG7BCQBA.js} +129 -106
  69. package/dist/{chunk-N3PBVRTZ.js → chunk-IXJT6DCX.js} +9 -7
  70. package/dist/chunk-J4HBWF6Y.js +2635 -0
  71. package/dist/chunk-J5LZHVIT.js +284 -0
  72. package/dist/{chunk-GAYUJ7LE.js → chunk-JA5QWE4Z.js} +544 -227
  73. package/dist/{chunk-B5CSFE7B.js → chunk-JIEGK6UF.js} +6 -174
  74. package/dist/{chunk-VKBMFOYV.js → chunk-JZWT5J3Y.js} +23 -27
  75. package/dist/chunk-K6BF4U2H.js +1785 -0
  76. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  77. package/dist/{chunk-YSEHGPCT.js → chunk-MA3H6DM5.js} +6 -6
  78. package/dist/{chunk-EBOC7MT3.js → chunk-MOPSG2X7.js} +9 -9
  79. package/dist/{chunk-KV2AOLDF.js → chunk-MQXIVJ35.js} +18 -29
  80. package/dist/{chunk-P3JGPQFL.js → chunk-N5UK64DP.js} +4 -4
  81. package/dist/chunk-NDDGJUXD.js +81 -0
  82. package/dist/chunk-NEKRRTYW.js +56 -0
  83. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  84. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  85. package/dist/{chunk-T3Z6VAAF.js → chunk-OJTRZGR3.js} +53 -92
  86. package/dist/{chunk-5DQRIYDZ.js → chunk-PBP4B7XR.js} +3 -3
  87. package/dist/{chunk-NQ6UCCOD.js → chunk-PJJ6MY27.js} +8 -8
  88. package/dist/chunk-PMZCIOCJ.js +25 -0
  89. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  90. package/dist/{chunk-7C6RYZGQ.js → chunk-PVAMAVBB.js} +5 -4
  91. package/dist/chunk-QDC3K2U3.js +262 -0
  92. package/dist/{chunk-JEQQR47K.js → chunk-QKIFBZKT.js} +173 -14
  93. package/dist/{chunk-R7LNVMCS.js → chunk-QMXC4JB7.js} +70 -78
  94. package/dist/chunk-QSNYB6ZV.js +195 -0
  95. package/dist/chunk-QTFGO774.js +644 -0
  96. package/dist/{chunk-ODFEOB4F.js → chunk-R23Z6K6I.js} +27 -9
  97. package/dist/{chunk-3UUY7R3Z.js → chunk-R32CLGZ6.js} +14 -14
  98. package/dist/chunk-R346GLFC.js +31 -0
  99. package/dist/chunk-RKSR6VSF.js +132 -0
  100. package/dist/{chunk-N5XKWMDW.js → chunk-SCYB3HA4.js} +73 -27
  101. package/dist/{chunk-PZ4I4JE2.js → chunk-SINK3QR6.js} +135 -125
  102. package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
  103. package/dist/chunk-T56WDKA5.js +183 -0
  104. package/dist/{chunk-ECUO3KDP.js → chunk-TD3PGPQA.js} +87 -26
  105. package/dist/{chunk-HKO36JWF.js → chunk-THYWACCR.js} +31 -3
  106. package/dist/{chunk-LXPJXFM5.js → chunk-TVH4ONAM.js} +18 -12
  107. package/dist/chunk-TVHHYFHE.js +255 -0
  108. package/dist/chunk-U2WB7TZS.js +271 -0
  109. package/dist/{chunk-NNNWO6F2.js → chunk-UAPGZHYC.js} +237 -33
  110. package/dist/{chunk-MIX5N5AC.js → chunk-UEDMSP56.js} +415 -160
  111. package/dist/{chunk-WIE7ZOSW.js → chunk-UXN6JT4W.js} +3 -3
  112. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  113. package/dist/{chunk-MV2VUEJC.js → chunk-VEGN6WIQ.js} +2 -2
  114. package/dist/chunk-VKFQTNDV.js +66 -0
  115. package/dist/{chunk-FALJGAWU.js → chunk-VKRH2TCS.js} +2 -2
  116. package/dist/{chunk-A2NJGIB3.js → chunk-VN3SHNBN.js} +2 -2
  117. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  118. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  119. package/dist/{chunk-EQ63NRB7.js → chunk-WNP7O5WZ.js} +3 -3
  120. package/dist/chunk-WR6U3OVP.js +45 -0
  121. package/dist/{chunk-TEO2TLVN.js → chunk-XKA2ICR3.js} +1051 -1196
  122. package/dist/{chunk-3V5AYSEQ.js → chunk-Y45G3AXC.js} +72 -65
  123. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  124. package/dist/chunk-YAKGTXEV.js +17 -0
  125. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  126. package/dist/{chunk-YW7UVM5V.js → chunk-ZAZB4JMW.js} +55 -11
  127. package/dist/{chunk-HCBCAYZU.js → chunk-ZJLUDYFY.js} +11 -11
  128. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  129. package/dist/{chunk-IFBNV6H6.js → chunk-ZW55JB7N.js} +3 -3
  130. package/dist/cli/index.js +48 -37
  131. package/dist/clio-IT3G3VQH.js +25 -0
  132. package/dist/{code-nav-LMW275PA.js → code-nav-RK6S7F6E.js} +8 -8
  133. package/dist/codewiki/build-worker.js +1 -1
  134. package/dist/{compile-cache-CVJMMODC.js → compile-cache-OQAVB7Y5.js} +3 -5
  135. package/dist/{components-ZFA3SAER.js → components-UBWCQSRW.js} +6 -6
  136. package/dist/{config-RXS5T3JT.js → config-3QZRWZJF.js} +73 -61
  137. package/dist/configure-FL7Y3KJF.js +54 -0
  138. package/dist/{context-MVOORGMF.js → context-5HE7ODYK.js} +61 -49
  139. package/dist/{context-I3BTOTCS.js → context-KYQFRVDC.js} +11 -11
  140. package/dist/{context-PALKKQYL.js → context-XNHL75JV.js} +43 -28
  141. package/dist/{context-clear-N2WOYZ2K.js → context-clear-N545L53A.js} +60 -48
  142. package/dist/{context-working-set-MIEVECVZ.js → context-working-set-QHKXSV2F.js} +15 -13
  143. package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-RGIE5PCT.js} +109 -72
  144. package/dist/{docs-7LQ23DLM.js → docs-5NAF6AU7.js} +7 -13
  145. package/dist/doctor-ZGPEGHIP.js +772 -0
  146. package/dist/{eval-IJ5VEZDJ.js → eval-GXLL44RD.js} +106 -86
  147. package/dist/eval-inventory-HBWSWQOK.js +315 -0
  148. package/dist/{evidence-L5APPXNV.js → evidence-HWLBRH3Q.js} +209 -51
  149. package/dist/{evolve-RGNKFJ52.js → evolve-FTZBMNVW.js} +57 -45
  150. package/dist/{extensions-7WYWUX5A.js → extensions-VHRBEID7.js} +7 -7
  151. package/dist/{fleet-6CNVBZZP.js → fleet-CKZHJWZJ.js} +215 -114
  152. package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-EXDXBMV6.js} +13 -12
  153. package/dist/fleet-decisions-OTHB6KRL.js +157 -0
  154. package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-YTEZUCUT.js} +20 -17
  155. package/dist/fleet-inspect-SS6YMDCK.js +445 -0
  156. package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-PBY4VYOM.js} +6 -9
  157. package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-KMEM5L3S.js} +25 -20
  158. package/dist/fleet-verify-QD5M7E7Q.js +178 -0
  159. package/dist/fleet-view-WAMJYNDT.js +94 -0
  160. package/dist/{init-VBN2ACVA.js → init-5XQRBOFV.js} +79 -66
  161. package/dist/install-NKNG7KD4.js +13 -0
  162. package/dist/interop-34TVO25M.js +116 -0
  163. package/dist/{library-JHGUMLY2.js → library-3QY6KF57.js} +25 -21
  164. package/dist/{memory-K4OQIYWG.js → memory-L4UTIIIW.js} +59 -47
  165. package/dist/{models-2NCZUWDD.js → models-ZVX3QOWE.js} +47 -37
  166. package/dist/{monitor-MMVTJABD.js → monitor-CEKVSYTS.js} +67 -57
  167. package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-77BAP6BC.js} +7633 -7699
  168. package/dist/panes-7STHOAUJ.js +103 -0
  169. package/dist/panes-SHAUIRXY.js +60 -0
  170. package/dist/{paths-DBXMZMDU.js → paths-L7LGY6RN.js} +6 -6
  171. package/dist/{reset-DD5JGOY3.js → reset-EOLM7GVE.js} +15 -14
  172. package/dist/resources-74GKTLSF.js +115 -0
  173. package/dist/{run-QEGNX7FL.js → run-HBAUJNNZ.js} +139 -98
  174. package/dist/{share-JKD3BQMW.js → share-G3APVLVP.js} +25 -21
  175. package/dist/{skills-LMQIKDOZ.js → skills-35HHUKCR.js} +37 -27
  176. package/dist/{skills-eval-I7X2774U.js → skills-eval-QN4HSHDC.js} +80 -73
  177. package/dist/skills-inventory-J357J34F.js +129 -0
  178. package/dist/slash-commands-JZZCQA32.js +79 -0
  179. package/dist/{steer-CF5TDANS.js → steer-XAVHJM22.js} +4 -4
  180. package/dist/{support-I7LOJLIF.js → support-U7QOWY26.js} +7 -7
  181. package/dist/{targets-RUSR6B5Z.js → targets-DSM6CY3M.js} +67 -59
  182. package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-JOPFUVEM.js} +15 -10
  183. package/dist/tools-MKNWVPBH.js +29 -0
  184. package/dist/{trace-ODOQIVIW.js → trace-ECQ7TIYZ.js} +194 -7
  185. package/dist/tui-primitives-K5PASC3O.js +17 -0
  186. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-N34PCTGJ.js} +6 -8
  187. package/dist/{upgrade-XANW3FXB.js → upgrade-H7TOM7YL.js} +37 -62
  188. package/dist/{usage-4H7ZRXQT.js → usage-X52N3IDJ.js} +70 -59
  189. package/dist/{verifiers-UZXNBZEB.js → verifiers-EJTVVSMA.js} +174 -14
  190. package/dist/{verify-BVKWTNDL.js → verify-YJL6XET2.js} +12 -11
  191. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-MPIFL3LL.js} +3 -4
  192. package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-4NDZTQ4B.js} +86 -75
  193. package/dist/with-panes-OBOBFIIR.js +818 -0
  194. package/dist/worker/entry.js +131 -91
  195. package/docs/README.md +3 -2
  196. package/docs/acp.md +25 -4
  197. package/docs/alcf-provider.md +1 -1
  198. package/docs/architecture.md +2 -2
  199. package/docs/artifact-versions.md +4 -1
  200. package/docs/built-in-agents.md +40 -32
  201. package/docs/capacity-and-scheduling.md +43 -5
  202. package/docs/commands-and-modes.md +39 -4
  203. package/docs/config-knobs-audit.md +3 -0
  204. package/docs/configuration-and-targets.md +138 -167
  205. package/docs/context-engine.md +1 -1
  206. package/docs/development-pipeline.md +19 -0
  207. package/docs/dispatch-typed-intent.md +385 -0
  208. package/docs/documentation-coverage.md +2 -2
  209. package/docs/documentation-guide.md +1 -1
  210. package/docs/environment-variables.md +3 -1
  211. package/docs/eval-runner.md +1 -1
  212. package/docs/evals-internal.md +1 -1
  213. package/docs/evidence-and-memory.md +2 -2
  214. package/docs/evolution.md +1 -1
  215. package/docs/exit-codes-and-output.md +3 -1
  216. package/docs/extensions-and-sharing.md +25 -1
  217. package/docs/fleet-demo-runbook.md +6 -3
  218. package/docs/fleet-dispatch.md +30 -7
  219. package/docs/installation-and-lifecycle.md +16 -3
  220. package/docs/middleware-and-components.md +1 -1
  221. package/docs/model-catalog.md +10 -1
  222. package/docs/observability.md +3 -3
  223. package/docs/proactive-memory.md +1 -1
  224. package/docs/prompt-envelope-and-tools.md +1 -1
  225. package/docs/provider-adapter-cookbook.md +1 -1
  226. package/docs/release-cut-checklist.md +164 -177
  227. package/docs/safety-model.md +2 -2
  228. package/docs/scientific-validation.md +3 -3
  229. package/docs/session-lifecycle.md +1 -1
  230. package/docs/skills-marketplace.md +1 -1
  231. package/docs/tool-usage.md +18 -8
  232. package/docs/trace-store.md +16 -11
  233. package/docs/troubleshooting.md +2 -2
  234. package/docs/tui-design.md +1 -1
  235. package/docs/worker-dispatch-mechanics.md +1 -1
  236. package/evals/README.md +5 -0
  237. package/evals/behavioral-corpus-grader.mjs +103 -0
  238. package/evals/behavioral-machinery-baseline.json +2276 -0
  239. package/evals/behavioral-machinery-driver.ts +250 -0
  240. package/evals/behavioral-machinery-support.ts +253 -0
  241. package/evals/behavioral-machinery.yaml +614 -0
  242. package/evals/behavioral-model-negative-control.yaml +68 -0
  243. package/evals/behavioral-model.yaml +216 -0
  244. package/evals/fixtures/behavioral-facts.txt +3 -0
  245. package/evals/fixtures/behavioral-main.ts +7 -0
  246. package/evals/fixtures/decoy/note.txt +2 -0
  247. package/evals/fixtures/private/credentials.txt +1 -0
  248. package/evals/tracked-metrics-baseline.yaml +229 -0
  249. package/evals/tracked-metrics-grader.mjs +129 -0
  250. package/package.json +8 -16
  251. package/skills/README.md +6 -6
  252. package/skills/coding/ast-grep/SKILL.md +8 -2
  253. package/skills/coding/coding-standards/SKILL.md +8 -2
  254. package/skills/coding/prototype/SKILL.md +8 -2
  255. package/skills/coding/tdd/SKILL.md +8 -2
  256. package/skills/context/context-handoff/SKILL.md +12 -3
  257. package/skills/context/context-handoff/evals.md +3 -3
  258. package/skills/context/context-prime/SKILL.md +8 -2
  259. package/skills/context/context-prime/evals.md +2 -2
  260. package/skills/git/file-ticket/SKILL.md +9 -4
  261. package/skills/git/file-ticket/evals.md +2 -2
  262. package/skills/git/fix-issue/SKILL.md +12 -5
  263. package/skills/git/fix-issue/evals.md +4 -4
  264. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  265. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  266. package/skills/git/ship/SKILL.md +9 -3
  267. package/skills/git/ship/evals.md +4 -4
  268. package/skills/git/worktree-create/SKILL.md +7 -2
  269. package/skills/git/worktree-create/evals.md +6 -6
  270. package/skills/git/worktree-merge/SKILL.md +7 -2
  271. package/skills/git/worktree-merge/evals.md +6 -6
  272. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  273. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  274. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  275. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  276. package/skills/meta/credentials/SKILL.md +9 -2
  277. package/skills/meta/find-skills/SKILL.md +8 -2
  278. package/skills/meta/herdr/SKILL.md +8 -2
  279. package/skills/meta/skill-craft/SKILL.md +21 -4
  280. package/skills/planning/architecture/SKILL.md +9 -3
  281. package/skills/planning/backlog/SKILL.md +8 -2
  282. package/skills/planning/prd/SKILL.md +8 -2
  283. package/skills/planning/product-intent/SKILL.md +8 -2
  284. package/skills/planning/tech-spec/SKILL.md +9 -3
  285. package/skills/registry.yaml +66 -66
  286. package/skills/research/arxiv-literature/SKILL.md +8 -2
  287. package/skills/research/experiment-protocol/SKILL.md +9 -2
  288. package/skills/research/scientific-debugging/SKILL.md +9 -2
  289. package/skills/research/scientific-debugging/evals.md +2 -2
  290. package/skills/research/scientific-modernization/SKILL.md +9 -2
  291. package/skills/skill-marketplace.json +257 -38
  292. package/skills/workflow/cut-it/SKILL.md +10 -2
  293. package/skills/workflow/design-council/SKILL.md +11 -2
  294. package/skills/workflow/grill-me/SKILL.md +8 -2
  295. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  296. package/src/cli/acp.ts +8 -4
  297. package/src/cli/argv.ts +25 -0
  298. package/src/cli/auth.ts +2 -2
  299. package/src/cli/bootstrap-generate.ts +5 -5
  300. package/src/cli/clio.ts +6 -1
  301. package/src/cli/config-inspect.ts +3 -3
  302. package/src/cli/configure-interop.ts +1 -1
  303. package/src/cli/configure.ts +50 -48
  304. package/src/cli/default-target.ts +1 -1
  305. package/src/cli/docs.ts +6 -6
  306. package/src/cli/doctor-naming.ts +323 -0
  307. package/src/cli/doctor-panes.ts +156 -0
  308. package/src/cli/doctor-toolchain.ts +78 -0
  309. package/src/cli/doctor.ts +34 -1
  310. package/src/cli/eval-inventory.ts +436 -0
  311. package/src/cli/eval.ts +13 -0
  312. package/src/cli/evidence-detail.ts +88 -0
  313. package/src/cli/evidence-inventory.ts +183 -0
  314. package/src/cli/evidence.ts +30 -5
  315. package/src/cli/fleet-decisions.ts +69 -0
  316. package/src/cli/fleet-inspect.ts +334 -0
  317. package/src/cli/fleet-preflight.ts +1 -1
  318. package/src/cli/fleet-verify.ts +133 -0
  319. package/src/cli/fleet-view.ts +827 -0
  320. package/src/cli/fleet.ts +154 -40
  321. package/src/cli/index.ts +14 -2
  322. package/src/cli/interop-inspect.ts +128 -0
  323. package/src/cli/interop.ts +34 -0
  324. package/src/cli/models.ts +3 -3
  325. package/src/cli/modes/print.ts +1 -1
  326. package/src/cli/panes.ts +35 -0
  327. package/src/cli/reset.ts +6 -3
  328. package/src/cli/run.ts +67 -13
  329. package/src/cli/share.ts +1 -1
  330. package/src/cli/skills-eval.ts +11 -11
  331. package/src/cli/skills-inventory.ts +185 -0
  332. package/src/cli/skills.ts +16 -13
  333. package/src/cli/targets.ts +23 -24
  334. package/src/cli/tools.ts +321 -0
  335. package/src/cli/trace-inspect.ts +252 -0
  336. package/src/cli/trace.ts +64 -2
  337. package/src/cli/uninstall.ts +2 -2
  338. package/src/cli/upgrade.ts +29 -34
  339. package/src/cli/usage.ts +2 -2
  340. package/src/cli/validate-model.ts +1 -1
  341. package/src/cli/verifiers-inspect.ts +347 -0
  342. package/src/cli/verifiers.ts +9 -0
  343. package/src/cli/wiki-generate.ts +5 -5
  344. package/src/core/bash-exec.ts +1 -1
  345. package/src/core/boot-trace.ts +3 -3
  346. package/src/core/bus-events.ts +4 -0
  347. package/src/core/bus-trace.ts +2 -2
  348. package/src/core/compile-cache.ts +1 -1
  349. package/src/core/config.ts +1070 -845
  350. package/src/core/defaults.ts +342 -463
  351. package/src/core/domain-loader.ts +6 -4
  352. package/src/core/event-bus.ts +1 -1
  353. package/src/core/file-references.ts +78 -88
  354. package/src/core/git-commit-attribution.ts +3 -9
  355. package/src/core/guardrails.ts +24 -4
  356. package/src/core/naming-compat.ts +45 -0
  357. package/src/core/naming-events.ts +62 -0
  358. package/src/core/recent-models.ts +1 -7
  359. package/src/core/residency-protection.ts +4 -8
  360. package/src/core/resolve-config-value.ts +1 -1
  361. package/src/core/response-model-id.ts +0 -14
  362. package/src/core/response-schema.ts +44 -4
  363. package/src/core/session-routing.ts +84 -74
  364. package/src/core/skill-activation.ts +18 -0
  365. package/src/core/termination.ts +4 -4
  366. package/src/core/theme-token-hex.ts +43 -0
  367. package/src/core/timers.ts +2 -12
  368. package/src/core/tool-names.ts +2 -1
  369. package/src/core/xdg.ts +1 -1
  370. package/src/domains/agents/catalog.ts +2 -12
  371. package/src/domains/agents/extension.ts +3 -3
  372. package/src/domains/agents/fleets/build-review.md +0 -3
  373. package/src/domains/agents/fleets/build-test.md +0 -3
  374. package/src/domains/agents/registry.ts +7 -7
  375. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  376. package/src/domains/agents/result-contract.ts +165 -36
  377. package/src/domains/agents/spec.ts +0 -11
  378. package/src/domains/config/classify.ts +37 -46
  379. package/src/domains/config/extension.ts +5 -5
  380. package/src/domains/config/keybindings.ts +48 -47
  381. package/src/domains/config/watcher.ts +1 -1
  382. package/src/domains/context/codewiki/indexer.ts +1 -1
  383. package/src/domains/context/extension.ts +3 -3
  384. package/src/domains/context/prompt-context.ts +1 -1
  385. package/src/domains/context/wiki/assemble.ts +2 -2
  386. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  387. package/src/domains/context/working-set/replay/report.ts +1 -1
  388. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  389. package/src/domains/dispatch/active-route-planner.ts +2 -2
  390. package/src/domains/dispatch/admission-error.ts +9 -0
  391. package/src/domains/dispatch/admission.ts +22 -21
  392. package/src/domains/dispatch/agent-candidates.ts +1 -1
  393. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  394. package/src/domains/dispatch/agent-ledger.ts +1 -1
  395. package/src/domains/dispatch/assignment.ts +5 -5
  396. package/src/domains/dispatch/capacity-lease.ts +23 -6
  397. package/src/domains/dispatch/code-step.ts +1 -1
  398. package/src/domains/dispatch/contract.ts +2 -2
  399. package/src/domains/dispatch/council-topology.ts +398 -0
  400. package/src/domains/dispatch/extension.ts +287 -111
  401. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  402. package/src/domains/dispatch/fleet-plan.ts +7 -2
  403. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  404. package/src/domains/dispatch/fleet-run.ts +59 -3
  405. package/src/domains/dispatch/gate-decisions.ts +36 -15
  406. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  407. package/src/domains/dispatch/gate-topology.ts +289 -0
  408. package/src/domains/dispatch/index.ts +19 -0
  409. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  410. package/src/domains/dispatch/intent.ts +85 -1
  411. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  412. package/src/domains/dispatch/path-scope.ts +0 -61
  413. package/src/domains/dispatch/placement.ts +2 -2
  414. package/src/domains/dispatch/receipt-findings.ts +1 -1
  415. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  416. package/src/domains/dispatch/reservation-store.ts +24 -27
  417. package/src/domains/dispatch/route-decision.ts +1 -1
  418. package/src/domains/dispatch/route-history.ts +1 -1
  419. package/src/domains/dispatch/route-policy.ts +1 -1
  420. package/src/domains/dispatch/route-readiness.ts +0 -28
  421. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  422. package/src/domains/dispatch/run-event-journal.ts +599 -0
  423. package/src/domains/dispatch/state.ts +45 -1
  424. package/src/domains/dispatch/tool-stats.ts +1 -1
  425. package/src/domains/dispatch/transport.ts +2 -19
  426. package/src/domains/dispatch/types.ts +16 -3
  427. package/src/domains/dispatch/validation.ts +33 -8
  428. package/src/domains/dispatch/worker-protocol.ts +2 -2
  429. package/src/domains/eval/artifacts/store.ts +5 -4
  430. package/src/domains/eval/compare/compare.ts +3 -16
  431. package/src/domains/eval/compare/thresholds.ts +0 -8
  432. package/src/domains/eval/execution-provenance.ts +1 -1
  433. package/src/domains/eval/inventory.ts +113 -0
  434. package/src/domains/eval/metrics/token-stream.ts +0 -7
  435. package/src/domains/eval/report.ts +1 -1
  436. package/src/domains/eval/runner.ts +1 -1
  437. package/src/domains/eval/runners/clio-run.ts +7 -6
  438. package/src/domains/eval/runners/external-command.ts +4 -3
  439. package/src/domains/eval/schema/artifact.ts +1 -1
  440. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  441. package/src/domains/eval/schema/behavioral.ts +7 -6
  442. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  443. package/src/domains/eval/schema/naming.ts +10 -0
  444. package/src/domains/eval/schema/serving.ts +31 -0
  445. package/src/domains/eval/schema/suite.ts +2 -2
  446. package/src/domains/eval/schema/validate.ts +9 -5
  447. package/src/domains/eval/schema/verdict.ts +4 -2
  448. package/src/domains/eval/store.ts +12 -2
  449. package/src/domains/eval/suites/run.ts +12 -6
  450. package/src/domains/eval/types.ts +1 -1
  451. package/src/domains/eval/workspaces/git.ts +1 -1
  452. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  453. package/src/domains/evidence/build.ts +13 -5
  454. package/src/domains/evidence/store.ts +6 -0
  455. package/src/domains/interop/consent.ts +7 -7
  456. package/src/domains/interop/extension.ts +1 -1
  457. package/src/domains/lifecycle/doctor.ts +27 -21
  458. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  459. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  460. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  461. package/src/domains/lifecycle/migrations/index.ts +20 -1
  462. package/src/domains/lifecycle/naming-history.ts +153 -0
  463. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  464. package/src/domains/lifecycle/naming-resources.ts +261 -0
  465. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  466. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  467. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  468. package/src/domains/memory/index.ts +0 -1
  469. package/src/domains/memory/task-memory-handoff.ts +6 -3
  470. package/src/domains/memory/task-memory-policy.ts +6 -10
  471. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  472. package/src/domains/middleware/index.ts +7 -0
  473. package/src/domains/middleware/marketplace-offer.ts +339 -0
  474. package/src/domains/middleware/memory-intervention.ts +33 -21
  475. package/src/domains/middleware/runtime.ts +2 -2
  476. package/src/domains/mux/contract.ts +566 -0
  477. package/src/domains/mux/detect.ts +182 -0
  478. package/src/domains/mux/dock-controller.ts +365 -0
  479. package/src/domains/mux/extension.ts +53 -0
  480. package/src/domains/mux/index.ts +116 -0
  481. package/src/domains/mux/manifest.ts +6 -0
  482. package/src/domains/mux/operations.ts +192 -0
  483. package/src/domains/mux/pane-registry.ts +90 -0
  484. package/src/domains/mux/protocol.ts +62 -0
  485. package/src/domains/mux/socket-client.ts +964 -0
  486. package/src/domains/mux/types.ts +265 -0
  487. package/src/domains/mux/viewer-command.ts +59 -0
  488. package/src/domains/mux/yazi/assets/init.lua +2 -0
  489. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  490. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  491. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  492. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  493. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  494. package/src/domains/mux/yazi/event-stream.ts +182 -0
  495. package/src/domains/mux/yazi/profile.ts +299 -0
  496. package/src/domains/mux/yazi/session.ts +251 -0
  497. package/src/domains/mux/yazi/theme.ts +30 -0
  498. package/src/domains/observability/cost.ts +21 -0
  499. package/src/domains/observability/extension.ts +1 -1
  500. package/src/domains/observability/index.ts +2 -0
  501. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  502. package/src/domains/observability/projection.ts +1 -1
  503. package/src/domains/observability/trace-store.ts +63 -11
  504. package/src/domains/prompts/compiler.ts +2 -2
  505. package/src/domains/prompts/extension.ts +3 -3
  506. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  507. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  508. package/src/domains/providers/endpoint-capacity.ts +154 -22
  509. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  510. package/src/domains/providers/extension.ts +25 -8
  511. package/src/domains/providers/index.ts +22 -0
  512. package/src/domains/providers/knowledge-base-path.ts +1 -1
  513. package/src/domains/providers/model-runtime-capabilities.ts +46 -2
  514. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  515. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  516. package/src/domains/providers/plugins.ts +1 -1
  517. package/src/domains/providers/resolver.ts +1 -1
  518. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  519. package/src/domains/providers/runtimes/builtins.ts +2 -0
  520. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  521. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  522. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  523. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  524. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  525. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  526. package/src/domains/providers/runtimes/protocol/litellm.ts +285 -0
  527. package/src/domains/providers/support.ts +1 -0
  528. package/src/domains/providers/target-model-cache.ts +124 -0
  529. package/src/domains/providers/types/knowledge-base.ts +13 -0
  530. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  531. package/src/domains/providers/types/target-descriptor.ts +3 -3
  532. package/src/domains/resources/extension.ts +1 -1
  533. package/src/domains/resources/index.ts +3 -0
  534. package/src/domains/resources/library.ts +6 -6
  535. package/src/domains/resources/prompts/loader.ts +1 -1
  536. package/src/domains/resources/skills/content-hash.ts +7 -6
  537. package/src/domains/resources/skills/evals.ts +1 -1
  538. package/src/domains/resources/skills/install.ts +36 -12
  539. package/src/domains/resources/skills/loader.ts +72 -13
  540. package/src/domains/resources/skills/marketplace.ts +21 -2
  541. package/src/domains/resources/skills/promotion.ts +214 -0
  542. package/src/domains/safety/action-classifier.ts +6 -0
  543. package/src/domains/safety/audit.ts +2 -2
  544. package/src/domains/safety/finish-contract.ts +2 -1
  545. package/src/domains/safety/run-effects.ts +1 -1
  546. package/src/domains/scheduling/extension.ts +4 -4
  547. package/src/domains/session/archive-readers.ts +9 -1
  548. package/src/domains/session/compaction/branch-summary.ts +4 -0
  549. package/src/domains/session/compaction/compact.ts +1 -1
  550. package/src/domains/session/compaction/tokens.ts +4 -0
  551. package/src/domains/session/context-accounting.ts +1 -1
  552. package/src/domains/session/decision-board.ts +1 -1
  553. package/src/domains/session/extension.ts +1 -1
  554. package/src/domains/session/handoff.ts +2 -2
  555. package/src/domains/session/prompt-manifest.ts +0 -5
  556. package/src/domains/session/protected-artifact-journal.ts +12 -6
  557. package/src/domains/session/retry.ts +1 -1
  558. package/src/domains/share/archive.ts +85 -36
  559. package/src/domains/toolchain/archive.ts +175 -0
  560. package/src/domains/toolchain/contract.ts +28 -0
  561. package/src/domains/toolchain/extension.ts +47 -0
  562. package/src/domains/toolchain/index.ts +39 -0
  563. package/src/domains/toolchain/install.ts +327 -0
  564. package/src/domains/toolchain/manifest.ts +8 -0
  565. package/src/domains/toolchain/paths.ts +34 -0
  566. package/src/domains/toolchain/registry.ts +265 -0
  567. package/src/domains/toolchain/remove.ts +218 -0
  568. package/src/domains/toolchain/resolve.ts +182 -0
  569. package/src/domains/toolchain/types.ts +113 -0
  570. package/src/domains/toolchain/version.ts +88 -0
  571. package/src/engine/acp/adapter.ts +3 -3
  572. package/src/engine/acp/event-mapper.ts +3 -3
  573. package/src/engine/acp/server.ts +440 -96
  574. package/src/engine/acp/tool-mediator.ts +2 -2
  575. package/src/engine/acp/types.ts +20 -2
  576. package/src/engine/alcf-oauth.ts +5 -5
  577. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  578. package/src/engine/api-registry.ts +1 -1
  579. package/src/engine/apis/llamacpp-residency.ts +1 -19
  580. package/src/engine/apis/lmstudio.ts +1 -6
  581. package/src/engine/apis/ollama-native.ts +3 -3
  582. package/src/engine/apis/openai-completions.ts +2 -2
  583. package/src/engine/apis/residency.ts +3 -9
  584. package/src/engine/claude/sdk-module.ts +87 -0
  585. package/src/engine/claude/sdk-runtime.ts +25 -17
  586. package/src/engine/claude/subprocess-runtime.ts +1 -1
  587. package/src/engine/claude/tool-safety.ts +4 -4
  588. package/src/engine/loop-guard.ts +0 -5
  589. package/src/engine/session.ts +14 -7
  590. package/src/engine/tui-primitives.ts +21 -0
  591. package/src/engine/tui.ts +1 -0
  592. package/src/engine/worker-events.ts +6 -6
  593. package/src/engine/worker-runtime.ts +16 -26
  594. package/src/entry/boot-options.ts +2 -0
  595. package/src/entry/orchestrator.ts +207 -90
  596. package/src/entry/panes-activation.ts +31 -0
  597. package/src/entry/with-panes.ts +20 -0
  598. package/src/interactive/application-controller.ts +21 -21
  599. package/src/interactive/bus-notices.ts +2 -2
  600. package/src/interactive/chat-loop.ts +8 -8
  601. package/src/interactive/chat-panel.ts +1 -1
  602. package/src/interactive/clio-editor.ts +105 -1
  603. package/src/interactive/context-activity.ts +8 -6
  604. package/src/interactive/context-meter.ts +3 -6
  605. package/src/interactive/context-overlay.ts +2 -1
  606. package/src/interactive/cost-overlay.ts +3 -1
  607. package/src/interactive/council-grid.ts +3 -5
  608. package/src/interactive/council.ts +11 -0
  609. package/src/interactive/dispatch-board.ts +56 -49
  610. package/src/interactive/editor-bash.ts +21 -0
  611. package/src/interactive/editor-steer.ts +9 -4
  612. package/src/interactive/editor-submit.ts +24 -18
  613. package/src/interactive/external-editor.ts +1 -1
  614. package/src/interactive/file-reference-completion.ts +360 -0
  615. package/src/interactive/footer/dashboard.ts +15 -17
  616. package/src/interactive/footer/notifications.ts +14 -8
  617. package/src/interactive/footer/widgets.ts +2 -44
  618. package/src/interactive/interactive-application.ts +229 -62
  619. package/src/interactive/interactive-event-projection.ts +1 -1
  620. package/src/interactive/interactive-input-runtime.ts +9 -2
  621. package/src/interactive/interactive-presentation.ts +21 -16
  622. package/src/interactive/interactive-shell.ts +2 -2
  623. package/src/interactive/interactive-slash-runtime.ts +99 -23
  624. package/src/interactive/interactive-subscriptions.ts +1 -1
  625. package/src/interactive/interactive-tickers.ts +1 -1
  626. package/src/interactive/keybinding-manager.ts +4 -4
  627. package/src/interactive/layout.ts +1 -1
  628. package/src/interactive/memory-overlay.ts +3 -2
  629. package/src/interactive/modal-marker.ts +151 -0
  630. package/src/interactive/mutation-preview.ts +1 -1
  631. package/src/interactive/mux-bridge.ts +214 -0
  632. package/src/interactive/overlay-frame.ts +62 -14
  633. package/src/interactive/overlay-general-openers.ts +7 -2
  634. package/src/interactive/overlay-key-routing.ts +21 -10
  635. package/src/interactive/overlay-lifecycle.ts +20 -4
  636. package/src/interactive/overlay-model-selectors.ts +43 -6
  637. package/src/interactive/overlay-permission-lifecycle.ts +90 -22
  638. package/src/interactive/overlay-transitions.ts +18 -4
  639. package/src/interactive/overlays/agents.ts +3 -2
  640. package/src/interactive/overlays/ask-user.ts +161 -41
  641. package/src/interactive/overlays/auth-dialog.ts +1 -0
  642. package/src/interactive/overlays/context-reset.ts +29 -4
  643. package/src/interactive/overlays/cwd-fallback.ts +29 -4
  644. package/src/interactive/overlays/decisions.ts +15 -13
  645. package/src/interactive/overlays/extensions.ts +1 -0
  646. package/src/interactive/overlays/fleet-run-approval.ts +4 -3
  647. package/src/interactive/overlays/handoff-review.ts +3 -2
  648. package/src/interactive/overlays/help-reference.ts +2 -0
  649. package/src/interactive/overlays/interop.ts +2 -1
  650. package/src/interactive/overlays/library-install-confirm.ts +2 -1
  651. package/src/interactive/overlays/library-tabs.ts +28 -0
  652. package/src/interactive/overlays/list-overlay.ts +10 -1
  653. package/src/interactive/overlays/message-picker.ts +2 -1
  654. package/src/interactive/overlays/model-scope.ts +86 -0
  655. package/src/interactive/overlays/model-selector.ts +40 -31
  656. package/src/interactive/overlays/prompts.ts +11 -4
  657. package/src/interactive/overlays/session-selector.ts +3 -2
  658. package/src/interactive/overlays/settings-sections.ts +30 -0
  659. package/src/interactive/overlays/settings.ts +849 -268
  660. package/src/interactive/overlays/side-question.ts +3 -2
  661. package/src/interactive/overlays/skills-hub.ts +11 -19
  662. package/src/interactive/overlays/tree-selector.ts +3 -2
  663. package/src/interactive/pane-policy.ts +46 -0
  664. package/src/interactive/panes-runtime.ts +318 -0
  665. package/src/interactive/permission-overlay.ts +2 -2
  666. package/src/interactive/renderers/compaction-summary.ts +29 -0
  667. package/src/interactive/renderers/retry-status.ts +12 -4
  668. package/src/interactive/renderers/tool-execution.ts +4 -4
  669. package/src/interactive/renderers/worker-entry.ts +122 -14
  670. package/src/interactive/session-transcript.ts +3 -3
  671. package/src/interactive/slash-autocomplete.ts +454 -165
  672. package/src/interactive/slash-commands.ts +521 -189
  673. package/src/interactive/slash-spec.ts +160 -17
  674. package/src/interactive/status/controller.ts +2 -2
  675. package/src/interactive/stream-pacing-policy.ts +1 -1
  676. package/src/interactive/tasks-overlay.ts +21 -13
  677. package/src/interactive/terminal-lease.ts +6 -7
  678. package/src/interactive/theme/tokens.ts +3 -14
  679. package/src/interactive/turn-context.ts +58 -13
  680. package/src/interactive/turn-persistence.ts +2 -2
  681. package/src/interactive/turn-prewarm.ts +2 -2
  682. package/src/interactive/turn-runtime.ts +8 -8
  683. package/src/interactive/turn-state.ts +1 -1
  684. package/src/interactive/view/artifacts.ts +120 -9
  685. package/src/interactive/view/view-overlay.ts +14 -10
  686. package/src/interactive/watch-pane.ts +180 -0
  687. package/src/interactive/welcome-dashboard.ts +15 -15
  688. package/src/interactive/worker-progress.ts +11 -5
  689. package/src/interactive/worker-receipts.ts +20 -2
  690. package/src/interactive/worker-stream.ts +6 -4
  691. package/src/interactive/yazi-bridge.ts +451 -0
  692. package/src/tools/ask-user.ts +3 -3
  693. package/src/tools/bash.ts +1 -1
  694. package/src/tools/bootstrap.ts +26 -2
  695. package/src/tools/builtin-tool-catalog.ts +16 -1
  696. package/src/tools/compete-worktrees.ts +108 -17
  697. package/src/tools/context/index.ts +15 -1
  698. package/src/tools/core-bootstrap.ts +2 -1
  699. package/src/tools/dispatch-admission.ts +18 -5
  700. package/src/tools/dispatch-arguments.ts +21 -21
  701. package/src/tools/dispatch-plan.ts +0 -11
  702. package/src/tools/dispatch-run-events.ts +145 -28
  703. package/src/tools/dispatch-runner.ts +40 -13
  704. package/src/tools/dispatch-types.ts +15 -3
  705. package/src/tools/dispatch.ts +2 -2
  706. package/src/tools/executables.ts +17 -14
  707. package/src/tools/find.ts +1 -6
  708. package/src/tools/monitor.ts +4 -4
  709. package/src/tools/observation.ts +54 -4
  710. package/src/tools/observers.ts +0 -33
  711. package/src/tools/panes-surface.ts +38 -0
  712. package/src/tools/panes.ts +112 -0
  713. package/src/tools/policy.ts +10 -1
  714. package/src/tools/presentation.ts +1 -0
  715. package/src/tools/task-worktree.ts +28 -7
  716. package/src/tools/verify/authoring.ts +3 -6
  717. package/src/tools/verify/frontend.ts +1 -1
  718. package/src/tools/web-fetch.ts +1 -1
  719. package/src/worker/entry.ts +4 -3
  720. package/src/worker/protocol.ts +16 -14
  721. package/src/worker/spec-contract.ts +2 -2
  722. package/src/worker/stdin-demux.ts +2 -2
  723. package/dist/chunk-D73KXYPF.js +0 -37
  724. package/dist/chunk-MLOK6ZOS.js +0 -2888
  725. package/dist/chunk-PNY46YEY.js +0 -1581
  726. package/dist/chunk-XDOQXGFO.js +0 -515
  727. package/dist/chunk-YKOFT37S.js +0 -279
  728. package/dist/clio-LT5V7SSZ.js +0 -26
  729. package/dist/configure-2WYWSCSD.js +0 -49
  730. package/dist/doctor-TWBWFK5V.js +0 -165
  731. package/src/engine/apis/degraded-inference.ts +0 -95
  732. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  733. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
@@ -4,6 +4,7 @@ import type { SafeEventBus } from "../core/event-bus.js";
4
4
  import { parseCouncilReport, parseOracleResult } from "../domains/agents/index.js";
5
5
  import type { AgentSpec } from "../domains/agents/spec.js";
6
6
  import type { ContextInitOptions } from "../domains/context/init-options.js";
7
+ import { AdmissionCanceledError } from "../domains/dispatch/admission-error.js";
7
8
  import type { DispatchContract, DispatchRequest } from "../domains/dispatch/contract.js";
8
9
  import { type AgentRoleFactsResolver, requestExecutionRole } from "../domains/dispatch/execution-role.js";
9
10
  import type { RunReceipt } from "../domains/dispatch/types.js";
@@ -11,6 +12,14 @@ import type { JobThinkingLevel } from "../domains/dispatch/validation.js";
11
12
  import type { ReceiptIntegrityOutcome } from "../domains/evidence/trust-status.js";
12
13
  import type { InstalledExtension } from "../domains/extensions/index.js";
13
14
  import type { InteropAgentId, InteropProposal, InteropReport } from "../domains/interop/index.js";
15
+ import {
16
+ isPanesPresetId,
17
+ PANES_PRESET_IDS,
18
+ PANES_PRESETS,
19
+ type PanesOperations,
20
+ type PanesPresetId,
21
+ type PanesStatus,
22
+ } from "../domains/mux/operations.js";
14
23
  import type { ProvidersContract, ResolvedModelRef } from "../domains/providers/index.js";
15
24
  import { resolveModelReference } from "../domains/providers/index.js";
16
25
  import type {
@@ -27,13 +36,13 @@ import type { NoticeLevel } from "./command-output.js";
27
36
  import {
28
37
  buildCouncilDispatchArgs,
29
38
  COUNCIL_MAX_ROUNDS,
39
+ COUNCIL_SYNTHESIS_LABEL,
30
40
  COUNCIL_SYNTHESIS_MODES,
31
41
  type CouncilCommandOptions,
32
42
  type CouncilRosters,
33
43
  isCouncilSynthesisMode,
34
44
  resolveCouncilRoster,
35
45
  } from "./council.js";
36
- import { COUNCIL_SYNTHESIS_LABEL } from "./council-grid.js";
37
46
  import {
38
47
  formatOracleAnswer,
39
48
  ORACLE_AGENT_ID,
@@ -41,8 +50,7 @@ import {
41
50
  type OracleDigestSources,
42
51
  packOracleDigest,
43
52
  } from "./oracle.js";
44
- import { SETTINGS_SECTIONS, type SettingsCenterRowId, type SettingsSectionId } from "./overlays/settings.js";
45
- import { isLibraryTab, LIBRARY_TABS } from "./overlays/skills-hub.js";
53
+ import { isLibraryTab, LIBRARY_TABS } from "./overlays/library-tabs.js";
46
54
  import type { CommandArgsSpec, CommandPositionalSpec, ParsedArgs } from "./slash-spec.js";
47
55
  import { matchFromSpec, usageLine } from "./slash-spec.js";
48
56
  import {
@@ -60,14 +68,43 @@ import type { WorkerEntryState } from "./worker-stream.js";
60
68
  * one user-facing slash command: how it parses, which SlashCommand kinds it
61
69
  * produces, and how those kinds execute. Adding a new command is one entry
62
70
  * rather than extending two parallel switches.
71
+ *
72
+ * This module is a CLI seam, which constrains what it may import.
73
+ * `src/cli/run.ts` reaches `parseSlashCommand` here so a headless
74
+ * `clio-coder run "/typo"` refuses the token by the same shape test and the same
75
+ * registry membership the editor uses; a second copy of the parser would drift
76
+ * from this one on the first command added. That makes the CLI a reacher of
77
+ * everything this file statically imports, so nothing here may reach the
78
+ * interactive render graph: no theme, no overlay frame, no overlay module, no
79
+ * `../engine/tui.js`. Those modules share one bundle chunk with the instant
80
+ * shell's Stage 0 closure, and a second, disjoint reacher makes esbuild split
81
+ * it, which is a startup-latency regression rather than a style problem. The
82
+ * parse-time data tables the registry needs live in leaves for that reason:
83
+ * `./overlays/library-tabs.js` and `COUNCIL_SYNTHESIS_LABEL` in
84
+ * `./council.js`. Import from those, not from overlays that re-export them.
85
+ *
86
+ * Boundaries rule6 in `tests/boundaries/check-boundaries.ts` refuses a violation
87
+ * at lint time; `tests/contracts/instant-shell-import-graph.test.ts` is the
88
+ * measurement it protects.
63
89
  */
64
90
 
65
- type ShareCommandVariant =
66
- | { kind: "share"; action: "export"; path: string }
67
- | { kind: "share"; action: "import"; path: string; dryRun: boolean; force: boolean }
68
- /** Put a finished worker run's answer into the main agent's context. Bare `/share` takes the newest one. */
69
- | { kind: "share"; action: "worker-run"; runId?: string }
70
- | { kind: "share"; action: "usage"; subcommand?: "export" | "import"; error?: string };
91
+ /** Put a finished worker run's answer into the main agent's context. Bare `/share` takes the newest one. */
92
+ type ShareCommandVariant = { kind: "share"; runId?: string };
93
+ type ArchiveCommandVariant =
94
+ | { kind: "archive-export"; path: string }
95
+ | { kind: "archive-import"; path: string; dryRun: boolean; force: boolean }
96
+ | { kind: "archive-usage"; subcommand?: "export" | "import"; error?: string };
97
+
98
+ export const SETTINGS_AREA_IDS = [
99
+ "chat",
100
+ "fleet",
101
+ "targets",
102
+ "context",
103
+ "safety",
104
+ "interface",
105
+ "integrations",
106
+ ] as const;
107
+ export type SettingsAreaId = (typeof SETTINGS_AREA_IDS)[number];
71
108
 
72
109
  type SlashCommandVariant =
73
110
  | { kind: "quit" }
@@ -78,12 +115,10 @@ type SlashCommandVariant =
78
115
  /** `ref` is the turnId an `[evicted ...]` marker names. */
79
116
  | { kind: "context-recall"; ref: string }
80
117
  | { kind: "skill-selector" }
81
- | { kind: "library"; tab?: LibraryEntryKind }
118
+ | { kind: "resources"; family?: "skills" | "prompts" | "extensions"; tab?: LibraryEntryKind }
82
119
  | { kind: "skill-invocation"; text: string }
83
- | { kind: "prompts" }
84
- | { kind: "extensions" }
85
- | { kind: "interop" }
86
120
  | ShareCommandVariant
121
+ | ArchiveCommandVariant
87
122
  /** `source` is the line the operator typed, echoed above the run's transcript block. */
88
123
  | { kind: "run"; agentId: string; task: string; options: RunCommandOptions; source: string }
89
124
  | { kind: "run-usage" }
@@ -102,7 +137,8 @@ type SlashCommandVariant =
102
137
  /** `/fleet run <name>`: compile the plan, show it for approval, dispatch on accept. */
103
138
  | { kind: "fleet-run"; name: string; vars: Record<string, string> }
104
139
  | { kind: "fleet-run-usage"; reason?: string }
105
- | { kind: "agents" }
140
+ | { kind: "fleet" }
141
+ | { kind: "agents"; connect?: boolean }
106
142
  | { kind: "cost" }
107
143
  | { kind: "context-view" }
108
144
  | { kind: "tasks" }
@@ -116,11 +152,22 @@ type SlashCommandVariant =
116
152
  | { kind: "view"; filter?: string }
117
153
  | { kind: "view-verify"; runId: string }
118
154
  | { kind: "view-usage" }
155
+ /** `/panes`: mode, health, pane inventory, effective settings. */
156
+ | { kind: "panes" }
157
+ | { kind: "panes-show"; target: string }
158
+ /** A preset the model may also ask for, or operator-only argv. Never both. */
159
+ | { kind: "panes-open"; preset?: PanesPresetId; argv?: ReadonlyArray<string>; once?: boolean }
160
+ /** Toggle zoom on a Clio-owned pane; the bare form targets the watch pane. */
161
+ | { kind: "panes-zoom"; target: string }
162
+ | { kind: "panes-close"; target: string }
163
+ | { kind: "panes-usage"; reason?: string }
119
164
  | { kind: "thinking-set"; level: string }
165
+ | { kind: "thinking-picker" }
120
166
  | { kind: "output-set"; verbosity: string }
167
+ | { kind: "output-picker" }
121
168
  | { kind: "model" }
122
169
  | { kind: "model-set"; pattern: string }
123
- | { kind: "settings"; section?: SettingsSectionId; rowId?: SettingsCenterRowId }
170
+ | { kind: "settings"; area?: SettingsAreaId; group?: string }
124
171
  | { kind: "resume" }
125
172
  | { kind: "new" }
126
173
  | { kind: "tree" }
@@ -258,21 +305,27 @@ async function runAttributed(
258
305
  progressBus?.emit(BusChannels.DispatchProgress, { runId: handle.runId, agentId: request.agentId, event });
259
306
  }
260
307
  const receipt = await handle.finalPromise;
261
- if (receipt.exitCode !== 0 || receipt.failureMessage) {
308
+ if (receipt.outcome === "canceled") {
309
+ notice("warn", `${command} aborted: ${receipt.outcomeDetail ?? "operator abort"}`);
310
+ } else if (receipt.exitCode !== 0 || receipt.failureMessage) {
262
311
  const failure = receipt.failureMessage ? ` ${receipt.failureMessage}` : "";
263
312
  notice("error", `${command} failed: exit=${receipt.exitCode}${failure}`);
264
313
  }
265
314
  if (share) shareReceipt(request.agentId, receipt, deps);
266
315
  } catch (err) {
267
316
  const msg = err instanceof Error ? err.message : String(err);
268
- notice("error", `${command} failed: ${msg}`);
317
+ if (err instanceof AdmissionCanceledError) {
318
+ notice("warn", `${command} aborted: ${msg.replace(/^dispatch:\s*/u, "")}`);
319
+ } else {
320
+ notice("error", `${command} failed: ${msg}`);
321
+ }
269
322
  }
270
323
  }
271
324
 
272
325
  /**
273
326
  * Dispatches /run through the dispatch contract and streams events to stdout.
274
327
  * Target + model are resolved by the dispatch domain from request overrides,
275
- * worker profiles, recipe hints, and `settings.workers.default`.
328
+ * worker profiles, recipe hints, and `settings.fleet.default`.
276
329
  */
277
330
  export async function handleRun(
278
331
  agentId: string,
@@ -629,20 +682,36 @@ export interface SlashCommandContext {
629
682
  seedTaskMemory?: () => TaskMemorySeedCommandResult;
630
683
  /** Open `/view`, the full observability artifact viewer. */
631
684
  openView: (filter?: string) => void;
685
+ /**
686
+ * The pane layer's operator surface. It remains present when mux resolves to
687
+ * `none` because the Yazi preset can borrow the terminal for one selection;
688
+ * absent only when the host did not compose pane operations at all.
689
+ */
690
+ panes?: PanesOperations;
691
+ /** Serialize a local async command so the next admitted slash command observes its committed state. */
692
+ runLocalOperation?: (operation: () => Promise<void>) => void;
632
693
  /**
633
694
  * Apply a thinking level named on the command line. Returns why it was
634
695
  * refused so the caller can say so, because the level the operator typed may
635
696
  * not be one the active target supports.
636
697
  */
637
698
  setThinkingLevel?: (level: string) => SetThinkingLevelResult;
699
+ thinkingLevelChoices?: () => ReadonlyArray<{ value: string; label: string }>;
700
+ openThinkingPicker?: () => void;
638
701
  /** Apply a transcript verbosity named on the command line; refused values are reported by the caller. */
639
702
  setOutputVerbosity?: (verbosity: string) => SetOutputVerbosityResult;
703
+ openOutputPicker?: () => void;
640
704
  openModel: () => void;
641
705
  /** Live providers contract used by `/model <pattern>` to resolve directly. */
642
706
  providers: ProvidersContract;
643
- /** Apply a resolved model reference to settings (and optionally thinking level). */
644
- applyModelRef: (ref: ResolvedModelRef) => void;
645
- openSettings: (section?: SettingsSectionId, rowId?: SettingsCenterRowId) => void;
707
+ /**
708
+ * Apply a resolved model reference, or hand it to the scope dialog. "pending"
709
+ * means the operator has yet to choose session or global and nothing has
710
+ * changed; the dialog reports the outcome itself.
711
+ */
712
+ applyModelRef: (ref: ResolvedModelRef) => "applied" | "pending";
713
+ openSettings: (area?: SettingsAreaId, group?: string) => void;
714
+ openFleetRuns?: () => void;
646
715
  openResume: () => void;
647
716
  startNewSession: () => void;
648
717
  openTree: () => void;
@@ -662,10 +731,16 @@ export interface SlashCommandContext {
662
731
  runCompact: (instructions: string | undefined) => void;
663
732
  /**
664
733
  * Escape hatch for the `view verify` entry: verify a receipt file on disk
665
- * and emit a single status line. Kept on the context so the registry does
734
+ * and emit an actionable verification block. Kept on the context so the registry does
666
735
  * not import the overlay module.
667
736
  */
668
- verifyReceipt: (runId: string) => ReceiptIntegrityOutcome;
737
+ verifyReceipt: (runId: string) => ReceiptIntegrityOutcome & {
738
+ receiptPath?: string;
739
+ sealedDigest?: string | null;
740
+ trustSummary?: string | null;
741
+ compromised?: boolean;
742
+ checks?: ReadonlyArray<{ name: string; ok: boolean; evidence: string }>;
743
+ };
669
744
  /**
670
745
  * Handles the "unknown" case: append the text to the chat panel as a user
671
746
  * turn, submit to the chat loop, and schedule a re-render. Handlers for
@@ -677,6 +752,24 @@ export interface SlashCommandContext {
677
752
  render: () => void;
678
753
  }
679
754
 
755
+ type SlashReceiptVerification = ReturnType<SlashCommandContext["verifyReceipt"]>;
756
+
757
+ /** Compact multiline receipt verification for the composer notice surface. */
758
+ function formatReceiptVerificationBlock(runId: string, result: SlashReceiptVerification): string {
759
+ const status = result.ok ? (result.compromised ? "compromised" : "ok") : result.retired ? "retired" : "fail";
760
+ const lines = [
761
+ `verify ${status} ${runId}`,
762
+ `receipt ${result.receiptPath ?? "unavailable"}`,
763
+ `digest ${result.sealedDigest ?? "unavailable"}`,
764
+ `evidence ${result.trustSummary ?? (!result.ok ? result.reason : "trust status unavailable")}`,
765
+ ];
766
+ if (result.checks && result.checks.length > 0) {
767
+ lines.push("checks");
768
+ for (const check of result.checks) lines.push(` ${check.ok ? "✓" : "✗"} ${check.name}: ${check.evidence}`);
769
+ }
770
+ return lines.join("\n");
771
+ }
772
+
680
773
  /** The one operator-authored turn used by slash and overlay handoff paths. */
681
774
  export function formatUserTaskHandoff(task: Pick<UserTask, "id" | "title" | "note">): string {
682
775
  const note = task.note ? ` ${task.note}.` : "";
@@ -684,7 +777,7 @@ export function formatUserTaskHandoff(task: Pick<UserTask, "id" | "title" | "not
684
777
  }
685
778
 
686
779
  /** The verb a command performs, in the order /help lists the groups. */
687
- export const SLASH_COMMAND_GROUPS = ["Run", "Inspect", "Configure", "Sessions"] as const;
780
+ export const SLASH_COMMAND_GROUPS = ["Work", "Inspect", "Configure", "Session"] as const;
688
781
  export type SlashCommandGroup = (typeof SLASH_COMMAND_GROUPS)[number];
689
782
 
690
783
  export interface BuiltinSlashCommand {
@@ -711,8 +804,8 @@ function isRunThinkingLevel(value: string): value is JobThinkingLevel {
711
804
  return RUN_THINKING_LEVELS.some((level) => level === value);
712
805
  }
713
806
 
714
- function isSettingsSectionId(value: string): value is SettingsSectionId {
715
- return SETTINGS_SECTIONS.some((section) => section.id === value);
807
+ function isSettingsAreaId(value: string): value is SettingsAreaId {
808
+ return SETTINGS_AREA_IDS.some((area) => area === value);
716
809
  }
717
810
 
718
811
  /** `/context compact` alone keeps a free-form optional instruction tail. */
@@ -739,37 +832,51 @@ function fromArgsOrUsage(name: string, command: SlashCommand): (parsed: ParsedAr
739
832
  return (parsed) => (parsed.error ? { kind: "usage-error", command: name, reason: parsed.error } : command);
740
833
  }
741
834
 
742
- /**
743
- * A configuration-shaped command that is a shortcut into one settings section.
744
- * It parses to the same `settings` command `/settings <section>` produces, so
745
- * the settings entry dispatches it and this entry owns no kind of its own.
746
- */
747
- function settingsDeepLink(
748
- name: string,
749
- section: SettingsSectionId,
750
- description: string,
751
- rowId?: SettingsCenterRowId,
752
- ): BuiltinSlashCommand {
753
- return {
754
- name,
755
- description,
756
- group: "Configure",
757
- kinds: [],
758
- args: {},
759
- fromArgs: fromArgsOrUsage(name, { kind: "settings", section, ...(rowId ? { rowId } : {}) }),
760
- handle: () => undefined,
761
- };
762
- }
763
-
764
835
  function usageNotice(entry: BuiltinSlashCommand, subcommand?: string): string {
765
836
  return usageLine(entry, subcommand).trim();
766
837
  }
767
838
 
839
+ /**
840
+ * `/panes` output, as plain lines. Pure so the contract test asserts the text
841
+ * an operator reads rather than the object behind it, and so the registry keeps
842
+ * its promise not to reach a renderer.
843
+ */
844
+ function formatPanesStatus(status: PanesStatus): ReadonlyArray<string> {
845
+ const server = status.server ? `pane host ${status.server.version}, protocol ${status.server.protocol}` : "no server";
846
+ const lines = [
847
+ `panes: mode=${status.mode} ${status.available ? "available" : "unavailable"} (${server})`,
848
+ ` ${status.reason}`,
849
+ ...(status.socketPath ? [` socket ${status.socketPath}`] : []),
850
+ ` settings: enabled=${status.settings.enabled} notifications=${status.settings.notifications} layout=${status.settings.layout} journal=${status.settings.journal}`,
851
+ ` files: enabled=${status.settings.yazi.enabled} mode=${status.settings.yazi.mode} profile=${status.settings.yazi.profile} followCwd=${status.settings.yazi.followCwd}`,
852
+ ` file pane: mode=${status.yazi.mode} pane=${status.yazi.paneId ?? "none"} cwd=${status.yazi.paneCwd ?? "unknown"} lastLine=${status.yazi.lastLineAt === null ? "never" : new Date(status.yazi.lastLineAt).toISOString()} dropped=${status.yazi.droppedLines}`,
853
+ ];
854
+ if (status.docks.length > 0) {
855
+ lines.push(
856
+ ` docks: ${status.docks
857
+ .map((dock) => `${dock.slot}=${dock.paneId} @${(dock.targetShare * 100).toFixed(0)}%`)
858
+ .join(", ")}`,
859
+ );
860
+ }
861
+ if (status.panes.length === 0) {
862
+ lines.push(" no Clio-owned panes");
863
+ } else {
864
+ lines.push(` ${status.panes.length} Clio-owned pane(s):`);
865
+ for (const pane of status.panes) {
866
+ const adopted = pane.adopted ? " adopted" : "";
867
+ const pending = pane.pending ? " opening" : "";
868
+ lines.push(` ${pane.paneId} ${pane.purpose} ${pane.label}${adopted}${pending}`);
869
+ }
870
+ }
871
+ lines.push(` presets: ${PANES_PRESETS.map((preset) => `${preset.id} (${preset.summary})`).join(", ")}`);
872
+ return lines;
873
+ }
874
+
768
875
  export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
769
876
  {
770
877
  name: "quit",
771
878
  description: "Exit Clio Coder",
772
- group: "Sessions",
879
+ group: "Session",
773
880
  kinds: ["quit"],
774
881
  args: {},
775
882
  fromArgs: fromArgsOrUsage("quit", { kind: "quit" }),
@@ -795,7 +902,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
795
902
  {
796
903
  name: "skill",
797
904
  description: "Open the Skills Hub or invoke a skill",
798
- group: "Run",
905
+ group: "Work",
799
906
  kinds: ["skill-selector", "skill-invocation"],
800
907
  args: {
801
908
  positionals: [
@@ -822,65 +929,74 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
822
929
  },
823
930
  },
824
931
  {
825
- name: "library",
826
- description: "Open the Skills Hub on a resource library tab",
827
- group: "Run",
828
- kinds: ["library"],
829
- args: { positionals: [{ name: "kind", required: false }] },
932
+ name: "resources",
933
+ description: "Browse skills, prompts, libraries, and extensions",
934
+ group: "Inspect",
935
+ kinds: ["resources"],
936
+ subcommandDescriptions: {
937
+ skills: "Browse installed skills",
938
+ prompts: "Browse prompt templates",
939
+ library: "Browse resource libraries",
940
+ extensions: "Browse installed extensions",
941
+ },
942
+ args: {
943
+ subcommands: {
944
+ skills: {},
945
+ prompts: {},
946
+ library: { positionals: [{ name: "kind", required: false }] },
947
+ extensions: {},
948
+ },
949
+ },
830
950
  fromArgs(parsed) {
831
- if (parsed.error) return { kind: "usage-error", command: "library", reason: parsed.error };
951
+ if (parsed.error) return { kind: "usage-error", command: "resources", reason: parsed.error };
952
+ if (parsed.subcommand === undefined || parsed.subcommand === "skills")
953
+ return { kind: "resources", family: "skills" };
954
+ if (parsed.subcommand === "prompts" || parsed.subcommand === "extensions")
955
+ return { kind: "resources", family: parsed.subcommand };
832
956
  const tab = parsed.positionals[0];
833
- if (tab === undefined) return { kind: "library" };
957
+ if (tab === undefined) return { kind: "resources" };
834
958
  if (!isLibraryTab(tab)) {
835
959
  const known = LIBRARY_TABS.map((entry) => entry.id).join(", ");
836
- return { kind: "usage-error", command: "library", reason: `Unknown kind: ${tab} (one of ${known})` };
960
+ return { kind: "usage-error", command: "resources", reason: `Unknown kind: ${tab} (one of ${known})` };
837
961
  }
838
- return { kind: "library", tab };
962
+ return { kind: "resources", tab };
839
963
  },
840
964
  handle(command, ctx) {
841
- if (command.kind === "library") ctx.openSkillsHub?.(command.tab);
842
- },
843
- },
844
- {
845
- name: "prompts",
846
- description: "List prompt templates",
847
- group: "Inspect",
848
- kinds: ["prompts"],
849
- args: {},
850
- fromArgs: fromArgsOrUsage("prompts", { kind: "prompts" }),
851
- handle(_command, ctx) {
852
- ctx.openPrompts();
965
+ if (command.kind !== "resources") return;
966
+ if (command.family === "prompts") ctx.openPrompts();
967
+ else if (command.family === "extensions") ctx.openExtensions();
968
+ else ctx.openSkillsHub?.(command.tab);
853
969
  },
854
970
  },
855
971
  {
856
- name: "extensions",
857
- description: "List installed extensions",
858
- group: "Inspect",
859
- kinds: ["extensions"],
860
- args: {},
861
- fromArgs: fromArgsOrUsage("extensions", { kind: "extensions" }),
862
- handle(_command, ctx) {
863
- ctx.openExtensions?.();
972
+ name: "share",
973
+ description: "Share a worker result with the main agent",
974
+ group: "Work",
975
+ kinds: ["share"],
976
+ args: { positionals: [{ name: "run-id", required: false }] },
977
+ fromArgs(parsed) {
978
+ const retiredArchiveVerb = parsed.positionals[0];
979
+ if (retiredArchiveVerb === "export" || retiredArchiveVerb === "import") {
980
+ return {
981
+ kind: "usage-error",
982
+ command: "share",
983
+ reason: `/share ${retiredArchiveVerb} is retired and did not run; use /archive ${retiredArchiveVerb}`,
984
+ };
985
+ }
986
+ if (parsed.error) return { kind: "usage-error", command: "share", reason: parsed.error };
987
+ return { kind: "share", ...(parsed.positionals[0] ? { runId: parsed.positionals[0] } : {}) };
864
988
  },
865
- },
866
- {
867
- name: "interop",
868
- description: "Review other coding agents detected on this machine",
869
- group: "Inspect",
870
- kinds: ["interop"],
871
- args: {},
872
- fromArgs: fromArgsOrUsage("interop", { kind: "interop" }),
873
- handle(_command, ctx) {
874
- ctx.openInterop?.();
989
+ handle(command, ctx) {
990
+ if (command.kind === "share") shareWorkerRun(command.runId, ctx);
875
991
  },
876
992
  },
877
993
  {
878
- name: "share",
879
- description: "Share a worker result with the main agent, or export and import Clio archives",
880
- group: "Sessions",
881
- kinds: ["share"],
994
+ name: "archive",
995
+ description: "Export or import a full Clio archive",
996
+ group: "Session",
997
+ kinds: ["archive-export", "archive-import", "archive-usage"],
998
+ subcommandDescriptions: { export: "Export a full Clio archive", import: "Import a full Clio archive" },
882
999
  args: {
883
- positionals: [{ name: "runId", required: false }],
884
1000
  subcommands: {
885
1001
  export: {
886
1002
  positionals: [{ name: "path", required: true }],
@@ -895,56 +1011,43 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
895
1011
  const subcommand = parsed.subcommand === "export" || parsed.subcommand === "import" ? parsed.subcommand : undefined;
896
1012
  if (parsed.error) {
897
1013
  return {
898
- kind: "share",
899
- action: "usage",
1014
+ kind: "archive-usage",
900
1015
  ...(subcommand !== undefined ? { subcommand } : {}),
901
1016
  error: parsed.error,
902
1017
  };
903
1018
  }
904
1019
  const path = parsed.positionals[0];
905
- if (subcommand === "export" && path !== undefined) return { kind: "share", action: "export", path };
1020
+ if (subcommand === "export" && path !== undefined) return { kind: "archive-export", path };
906
1021
  if (subcommand === "import" && path !== undefined) {
907
1022
  return {
908
- kind: "share",
909
- action: "import",
1023
+ kind: "archive-import",
910
1024
  path,
911
1025
  dryRun: parsed.flags.has("--dry-run"),
912
1026
  force: parsed.flags.has("--force"),
913
1027
  };
914
1028
  }
915
- // No subcommand means the worker-result sense of the word, with or
916
- // without a run id. `export` and `import` are the archive senses and are
917
- // matched above, so neither reading can swallow the other.
918
- if (subcommand === undefined) {
919
- return { kind: "share", action: "worker-run", ...(path !== undefined ? { runId: path } : {}) };
920
- }
921
- return { kind: "share", action: "usage", ...(subcommand !== undefined ? { subcommand } : {}) };
1029
+ return { kind: "archive-usage", ...(subcommand !== undefined ? { subcommand } : {}) };
922
1030
  },
923
1031
  handle(command, ctx) {
924
- if (command.kind !== "share") return;
925
- if (command.action === "worker-run") {
926
- shareWorkerRun(command.runId, ctx);
927
- return;
928
- }
929
- if (command.action === "usage") {
930
- const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === "share");
1032
+ if (command.kind === "archive-usage") {
1033
+ const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === "archive");
931
1034
  if (!entry) return;
932
1035
  const usage = usageNotice(entry, command.subcommand);
933
1036
  ctx.notice("info", command.error ? `${command.error}\n${usage}` : usage);
934
1037
  return;
935
1038
  }
936
- if (command.action === "export") {
1039
+ if (command.kind === "archive-export") {
937
1040
  if (!ctx.exportShareArchive) {
938
- ctx.notice("error", "share export is not wired");
1041
+ ctx.notice("error", "archive export is not wired");
939
1042
  return;
940
1043
  }
941
1044
  const result = ctx.exportShareArchive(command.path);
942
1045
  ctx.notice("success", `exported ${result.fileCount} item(s) to ${result.path}`);
943
1046
  return;
944
1047
  }
945
- if (command.action === "import") {
1048
+ if (command.kind === "archive-import") {
946
1049
  if (!ctx.importShareArchive) {
947
- ctx.notice("error", "share import is not wired");
1050
+ ctx.notice("error", "archive import is not wired");
948
1051
  return;
949
1052
  }
950
1053
  const plan = ctx.importShareArchive(command.path, { dryRun: command.dryRun, force: command.force });
@@ -965,7 +1068,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
965
1068
  {
966
1069
  name: "run",
967
1070
  description: "Run a fleet agent",
968
- group: "Run",
1071
+ group: "Work",
969
1072
  kinds: ["run", "run-usage"],
970
1073
  args: {
971
1074
  parseFlagsBeforeRest: true,
@@ -1056,7 +1159,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1056
1159
  {
1057
1160
  name: "delegate",
1058
1161
  description: "Run an ACP delegation agent",
1059
- group: "Run",
1162
+ group: "Work",
1060
1163
  kinds: ["delegate", "delegate-usage"],
1061
1164
  args: {
1062
1165
  parseFlagsBeforeRest: true,
@@ -1103,7 +1206,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1103
1206
  {
1104
1207
  name: "btw",
1105
1208
  description: "Ask a side question that never enters the session transcript",
1106
- group: "Run",
1209
+ group: "Work",
1107
1210
  kinds: ["btw", "btw-usage"],
1108
1211
  args: {
1109
1212
  positionals: [{ name: "question", required: true, rest: true }],
@@ -1126,7 +1229,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1126
1229
  {
1127
1230
  name: "oracle",
1128
1231
  description: "Ask a read-only advisor to challenge a question against this session's settled decisions",
1129
- group: "Run",
1232
+ group: "Work",
1130
1233
  kinds: ["oracle", "oracle-usage"],
1131
1234
  args: {
1132
1235
  positionals: [{ name: "question", required: true, rest: true }],
@@ -1152,7 +1255,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1152
1255
  {
1153
1256
  name: "council",
1154
1257
  description: "Ask a roster of read-only members the same task, with an optional vote or judge synthesis",
1155
- group: "Run",
1258
+ group: "Work",
1156
1259
  kinds: ["council", "council-usage"],
1157
1260
  args: {
1158
1261
  parseFlagsBeforeRest: true,
@@ -1204,16 +1307,24 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1204
1307
  },
1205
1308
  {
1206
1309
  name: "agents",
1207
- description: "List Clio agents and ACP delegation agents",
1310
+ description: "List agents or connect a detected external agent",
1208
1311
  group: "Inspect",
1209
1312
  kinds: ["agents"],
1210
- args: {},
1211
- fromArgs: fromArgsOrUsage("agents", { kind: "agents" }),
1212
- handle(_command, ctx) {
1213
- ctx.openAgents();
1313
+ subcommandDescriptions: {
1314
+ list: "List native and external agents",
1315
+ connect: "Review detected external-agent proposals",
1316
+ },
1317
+ args: { subcommands: { list: {}, connect: {} } },
1318
+ fromArgs(parsed) {
1319
+ if (parsed.error) return { kind: "usage-error", command: "agents", reason: parsed.error };
1320
+ return { kind: "agents", ...(parsed.subcommand === "connect" ? { connect: true } : {}) };
1321
+ },
1322
+ handle(command, ctx) {
1323
+ if (command.kind !== "agents") return;
1324
+ if (command.connect) ctx.openInterop?.();
1325
+ else ctx.openAgents();
1214
1326
  },
1215
1327
  },
1216
- settingsDeepLink("targets", "targets", "Open Settings → Targets: health, use, connect, probe, remove"),
1217
1328
  {
1218
1329
  name: "cost",
1219
1330
  description: "Show session token and cost totals",
@@ -1298,9 +1409,9 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1298
1409
  },
1299
1410
  {
1300
1411
  name: "fleet",
1301
- description: "Open Settings Fleet, or run a fleet contract with an approval preview",
1302
- group: "Configure",
1303
- kinds: ["fleet-run", "fleet-run-usage"],
1412
+ description: "Open Fleet Runs or run a fleet contract with an approval preview",
1413
+ group: "Work",
1414
+ kinds: ["fleet", "fleet-run", "fleet-run-usage"],
1304
1415
  subcommandDescriptions: { run: "Preview and run a repo-owned fleet contract" },
1305
1416
  args: {
1306
1417
  subcommands: {
@@ -1310,17 +1421,9 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1310
1421
  },
1311
1422
  },
1312
1423
  },
1313
- /**
1314
- * `/fleet` alone keeps the settings deep link it has always been, and
1315
- * only `run` parses as a command of its own, so an operator who types
1316
- * `/fleet` out of habit still lands in Settings → Fleet. Anything else
1317
- * on the line stays the usage error every other deep link reports.
1318
- */
1319
1424
  fromArgs(parsed) {
1320
1425
  if (parsed.subcommand !== "run") {
1321
- return parsed.error
1322
- ? { kind: "usage-error", command: "fleet", reason: parsed.error }
1323
- : { kind: "settings", section: "fleet" };
1426
+ return parsed.error ? { kind: "usage-error", command: "fleet", reason: parsed.error } : { kind: "fleet" };
1324
1427
  }
1325
1428
  if (parsed.error) return { kind: "fleet-run-usage", reason: parsed.error };
1326
1429
  const name = parsed.positionals[0] ?? "";
@@ -1335,6 +1438,11 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1335
1438
  return { kind: "fleet-run", name, vars };
1336
1439
  },
1337
1440
  handle(command, ctx) {
1441
+ if (command.kind === "fleet") {
1442
+ if (ctx.openFleetRuns) ctx.openFleetRuns();
1443
+ else ctx.notice("error", "Fleet Runs is not wired in this session");
1444
+ return;
1445
+ }
1338
1446
  if (command.kind === "fleet-run-usage") {
1339
1447
  const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === "fleet");
1340
1448
  const usage = entry ? usageNotice(entry, "run") : "usage: /fleet run <name> [--var key=value ...]";
@@ -1505,32 +1613,178 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1505
1613
  }
1506
1614
  if (command.kind !== "view-verify") return;
1507
1615
  const result = ctx.verifyReceipt(command.runId);
1616
+ const block = formatReceiptVerificationBlock(command.runId, result);
1508
1617
  if (result.ok) {
1509
- ctx.notice("success", `verify ok ${command.runId}`);
1618
+ ctx.notice(result.compromised ? "warn" : "success", block);
1510
1619
  } else if (result.retired !== undefined) {
1511
1620
  // A retired seal is the expected state of a run from the previous
1512
1621
  // release, so it is a warning that names the versions, never the
1513
1622
  // failure a tampered receipt gets.
1514
- ctx.notice("warn", `verify retired ${command.runId} ${result.reason}`);
1623
+ ctx.notice("warn", block);
1515
1624
  } else {
1516
- ctx.notice("error", `verify fail ${command.runId} ${result.reason}`);
1625
+ ctx.notice("error", block);
1626
+ }
1627
+ },
1628
+ },
1629
+ {
1630
+ name: "panes",
1631
+ description: "Inspect the pane layer, watch a live run in a pane, or open a utility pane",
1632
+ group: "Inspect",
1633
+ kinds: ["panes", "panes-show", "panes-open", "panes-zoom", "panes-close", "panes-usage"],
1634
+ args: {
1635
+ subcommands: {
1636
+ show: { positionals: [{ name: "run-or-agent", required: true }] },
1637
+ // A rest positional, so an argv pane keeps its own flags: the parser
1638
+ // would otherwise refuse `--follow` as an unknown flag of `/panes`.
1639
+ open: { positionals: [{ name: "preset-or-argv", required: true, rest: true }] },
1640
+ zoom: { positionals: [{ name: "target", required: false }] },
1641
+ close: { positionals: [{ name: "target", required: false }] },
1642
+ },
1643
+ },
1644
+ subcommandDescriptions: {
1645
+ show: "watch a live run or agent in the watch pane",
1646
+ open: `open a utility pane (${PANES_PRESET_IDS.join(", ")}, or a command)`,
1647
+ zoom: "toggle zoom on a Clio-owned pane (default: the watch pane)",
1648
+ close: "close a Clio-owned pane, or all of them",
1649
+ },
1650
+ fromArgs(parsed) {
1651
+ if (parsed.error) return { kind: "panes-usage", reason: parsed.error };
1652
+ if (parsed.subcommand === "show") {
1653
+ return { kind: "panes-show", target: parsed.positionals[0] ?? "" };
1654
+ }
1655
+ if (parsed.subcommand === "open") {
1656
+ const rest = (parsed.rest ?? "").trim();
1657
+ if (rest.length === 0) return { kind: "panes-usage", reason: "Missing required argument: preset-or-argv" };
1658
+ const argv = rest.split(/\s+/).filter((token) => token.length > 0);
1659
+ const first = argv[0] ?? "";
1660
+ // A bare preset name is a preset; anything else is operator argv,
1661
+ // which the tool surface deliberately cannot ask for.
1662
+ if (argv.length === 1 && isPanesPresetId(first)) return { kind: "panes-open", preset: first };
1663
+ if (argv.length === 2 && first === "yazi" && argv[1] === "--once") {
1664
+ return { kind: "panes-open", preset: "yazi", once: true };
1665
+ }
1666
+ return { kind: "panes-open", argv };
1667
+ }
1668
+ if (parsed.subcommand === "zoom") {
1669
+ return { kind: "panes-zoom", target: parsed.positionals[0] ?? "" };
1670
+ }
1671
+ if (parsed.subcommand === "close") {
1672
+ return { kind: "panes-close", target: parsed.positionals[0] ?? "all" };
1673
+ }
1674
+ if (parsed.positionals.length > 0) {
1675
+ return { kind: "panes-usage", reason: `Unexpected argument: ${parsed.positionals[0]}` };
1676
+ }
1677
+ return { kind: "panes" };
1678
+ },
1679
+ handle(command, ctx) {
1680
+ const entry = BUILTIN_SLASH_COMMANDS.find((candidate) => candidate.name === "panes");
1681
+ if (command.kind === "panes-usage") {
1682
+ // usageNotice trims the leading newline usageLine carries, so the reason
1683
+ // and the usage line need their own separator or they run together as
1684
+ // `Missing required argument: run-or-agentusage: /panes show ...`.
1685
+ if (entry) ctx.notice("info", command.reason ? `${command.reason}\n${usageNotice(entry)}` : usageNotice(entry));
1686
+ return;
1687
+ }
1688
+ const panes = ctx.panes;
1689
+ if (!panes) {
1690
+ // Inactive by choice, not unavailable: the operations object exists in
1691
+ // every `--with-panes` session, even one where no pane host answered.
1692
+ ctx.notice(
1693
+ "info",
1694
+ "panes are inactive: this session started without them. Restart with `clio-coder --with-panes`, or set panes.enabled=auto",
1695
+ );
1696
+ return;
1697
+ }
1698
+ const runLocal = ctx.runLocalOperation ?? ((operation: () => Promise<void>) => void operation());
1699
+ if (command.kind === "panes") {
1700
+ runLocal(async () => {
1701
+ for (const line of formatPanesStatus(panes.status())) ctx.io.stdout(`${line}\n`);
1702
+ ctx.render();
1703
+ });
1704
+ return;
1705
+ }
1706
+ if (command.kind === "panes-show") {
1707
+ runLocal(async () => {
1708
+ const result = await panes.show(command.target);
1709
+ if (result.status === "watching") {
1710
+ ctx.notice("success", `watching ${result.agentId} (${result.runId})${result.opened ? " in a new pane" : ""}`);
1711
+ } else if (result.status === "not-found") {
1712
+ const known = result.candidates.length > 0 ? `; live runs: ${result.candidates.join(", ")}` : "";
1713
+ ctx.notice("warn", `no live run matches ${result.target}${known}`);
1714
+ } else {
1715
+ ctx.notice("warn", result.reason);
1716
+ }
1717
+ });
1718
+ return;
1719
+ }
1720
+ if (command.kind === "panes-open") {
1721
+ runLocal(async () => {
1722
+ const result = await panes.open({
1723
+ ...(command.preset ? { preset: command.preset } : {}),
1724
+ ...(command.argv ? { argv: command.argv } : {}),
1725
+ ...(command.once ? { once: true } : {}),
1726
+ });
1727
+ if (result.status === "opened") {
1728
+ // The in-terminal chooser has already restored the TUI by the
1729
+ // time this resolves. A pick emitted its composer notice; an empty
1730
+ // chooser was cancellation and deliberately stays silent.
1731
+ if (result.paneId !== null) ctx.notice("success", `opened pane ${result.label} (${result.paneId})`);
1732
+ } else if (result.status === "missing-binary") {
1733
+ // This is a synchronous slash-surface line, not a transient pane-host
1734
+ // notification. It remains visible when no pane was ever created and
1735
+ // reuses the exact doctor/tools diagnostic including the install hint.
1736
+ ctx.io.stdout(`${result.detail}\n`);
1737
+ ctx.render();
1738
+ } else {
1739
+ ctx.notice("warn", result.reason);
1740
+ }
1741
+ });
1742
+ return;
1517
1743
  }
1744
+ if (command.kind === "panes-zoom") {
1745
+ runLocal(async () => {
1746
+ const result = await panes.zoom(command.target);
1747
+ if (result.status === "zoomed") {
1748
+ ctx.notice("success", `toggled zoom on ${result.label} (${result.paneId})`);
1749
+ } else if (result.status === "not-found") {
1750
+ ctx.notice("warn", `no Clio-owned pane matches ${result.target}`);
1751
+ } else {
1752
+ ctx.notice("warn", result.reason);
1753
+ }
1754
+ });
1755
+ return;
1756
+ }
1757
+ if (command.kind !== "panes-close") return;
1758
+ runLocal(async () => {
1759
+ const result = await panes.close(command.target);
1760
+ if (result.status === "closed") {
1761
+ const what = result.labels.length > 0 ? `: ${result.labels.join(", ")}` : "";
1762
+ ctx.notice(result.closed > 0 ? "success" : "info", `closed ${result.closed} pane(s)${what}`);
1763
+ } else if (result.status === "not-found") {
1764
+ ctx.notice("warn", `no Clio-owned pane matches ${result.target}`);
1765
+ } else {
1766
+ ctx.notice("warn", result.reason);
1767
+ }
1768
+ });
1518
1769
  },
1519
1770
  },
1520
1771
  {
1521
1772
  name: "thinking",
1522
- description: "Set the chat thinking level, or open Settings → Orchestrator",
1773
+ description: "Set the chat thinking level",
1523
1774
  group: "Configure",
1524
- kinds: ["thinking-set"],
1775
+ kinds: ["thinking-set", "thinking-picker"],
1525
1776
  args: { positionals: [{ name: "level", required: false }] },
1526
1777
  fromArgs(parsed) {
1527
1778
  if (parsed.error) return { kind: "usage-error", command: "thinking", reason: parsed.error };
1528
1779
  const level = parsed.positionals[0];
1529
- return level
1530
- ? { kind: "thinking-set", level }
1531
- : { kind: "settings", section: "orchestrator", rowId: "orchestrator.thinkingLevel" };
1780
+ return level ? { kind: "thinking-set", level } : { kind: "thinking-picker" };
1532
1781
  },
1533
1782
  handle(command, ctx) {
1783
+ if (command.kind === "thinking-picker") {
1784
+ if (ctx.openThinkingPicker) ctx.openThinkingPicker();
1785
+ else ctx.notice("error", "thinking picker is not wired in this session");
1786
+ return;
1787
+ }
1534
1788
  if (command.kind !== "thinking-set") return;
1535
1789
  const result = ctx.setThinkingLevel?.(command.level) ?? { status: "unavailable" as const };
1536
1790
  if (result.status === "applied") {
@@ -1545,18 +1799,21 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1545
1799
  },
1546
1800
  {
1547
1801
  name: "output",
1548
- description: "Set transcript detail (minimal, default, verbose), or open Settings → Terminal",
1802
+ description: "Set transcript detail to minimal, default, or verbose",
1549
1803
  group: "Configure",
1550
- kinds: ["output-set"],
1804
+ kinds: ["output-set", "output-picker"],
1551
1805
  args: { positionals: [{ name: "verbosity", required: false }] },
1552
1806
  fromArgs(parsed) {
1553
1807
  if (parsed.error) return { kind: "usage-error", command: "output", reason: parsed.error };
1554
1808
  const verbosity = parsed.positionals[0];
1555
- return verbosity
1556
- ? { kind: "output-set", verbosity }
1557
- : { kind: "settings", section: "terminal", rowId: "terminal.outputVerbosity" };
1809
+ return verbosity ? { kind: "output-set", verbosity } : { kind: "output-picker" };
1558
1810
  },
1559
1811
  handle(command, ctx) {
1812
+ if (command.kind === "output-picker") {
1813
+ if (ctx.openOutputPicker) ctx.openOutputPicker();
1814
+ else ctx.notice("error", "output picker is not wired in this session");
1815
+ return;
1816
+ }
1560
1817
  if (command.kind !== "output-set") return;
1561
1818
  const result = ctx.setOutputVerbosity?.(command.verbosity) ?? { status: "unavailable" as const };
1562
1819
  if (result.status === "applied") {
@@ -1604,43 +1861,49 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1604
1861
  return;
1605
1862
  }
1606
1863
  if (result.warning) ctx.notice("warn", result.warning);
1607
- ctx.applyModelRef(result.ref);
1608
- const suffix = result.ref.thinkingLevel ? ` thinking=${result.ref.thinkingLevel}` : "";
1609
- ctx.notice("success", `active: ${result.ref.target}/${result.ref.model}${suffix}`);
1864
+ // "pending" means the scope dialog is up: it says what landed and
1865
+ // where, so announcing a swap here would be announcing a choice the
1866
+ // operator has not made yet.
1867
+ if (ctx.applyModelRef(result.ref) === "applied") {
1868
+ const suffix = result.ref.thinkingLevel ? ` thinking=${result.ref.thinkingLevel}` : "";
1869
+ ctx.notice("success", `active this session: ${result.ref.target}/${result.ref.model}${suffix}`);
1870
+ }
1610
1871
  ctx.render();
1611
1872
  })();
1612
1873
  },
1613
1874
  },
1614
- settingsDeepLink(
1615
- "scoped-models",
1616
- "models",
1617
- "Open Settings → Models: the Alt+J / Alt+K cycle set and favorites",
1618
- "scope",
1619
- ),
1620
1875
  {
1621
1876
  name: "settings",
1622
1877
  description: "Open interactive settings",
1623
1878
  group: "Configure",
1624
1879
  kinds: ["settings"],
1625
- args: { positionals: [{ name: "section", required: false }] },
1880
+ args: {
1881
+ positionals: [
1882
+ { name: "area", required: false },
1883
+ { name: "group", required: false },
1884
+ ],
1885
+ },
1626
1886
  fromArgs(parsed) {
1627
1887
  if (parsed.error) return { kind: "usage-error", command: "settings", reason: parsed.error };
1628
- const section = parsed.positionals[0];
1629
- if (section === undefined) return { kind: "settings" };
1630
- if (!isSettingsSectionId(section)) {
1631
- const known = SETTINGS_SECTIONS.map((entry) => entry.id).join(", ");
1632
- return { kind: "usage-error", command: "settings", reason: `Unknown section: ${section} (one of ${known})` };
1888
+ const area = parsed.positionals[0];
1889
+ if (area === undefined) return { kind: "settings" };
1890
+ if (!isSettingsAreaId(area)) {
1891
+ return {
1892
+ kind: "usage-error",
1893
+ command: "settings",
1894
+ reason: `Unknown area: ${area} (one of ${SETTINGS_AREA_IDS.join(", ")})`,
1895
+ };
1633
1896
  }
1634
- return { kind: "settings", section };
1897
+ return { kind: "settings", area, ...(parsed.positionals[1] ? { group: parsed.positionals[1] } : {}) };
1635
1898
  },
1636
1899
  handle(command, ctx) {
1637
- if (command.kind === "settings") ctx.openSettings(command.section, command.rowId);
1900
+ if (command.kind === "settings") ctx.openSettings(command.area, command.group);
1638
1901
  },
1639
1902
  },
1640
1903
  {
1641
1904
  name: "resume",
1642
1905
  description: "Resume a past session",
1643
- group: "Sessions",
1906
+ group: "Session",
1644
1907
  kinds: ["resume"],
1645
1908
  args: {},
1646
1909
  fromArgs: fromArgsOrUsage("resume", { kind: "resume" }),
@@ -1651,7 +1914,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1651
1914
  {
1652
1915
  name: "new",
1653
1916
  description: "Start a fresh session",
1654
- group: "Sessions",
1917
+ group: "Session",
1655
1918
  kinds: ["new"],
1656
1919
  args: {},
1657
1920
  fromArgs: fromArgsOrUsage("new", { kind: "new" }),
@@ -1662,7 +1925,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1662
1925
  {
1663
1926
  name: "handoff",
1664
1927
  description: "Hand this session's working state to a fresh session for a stated goal",
1665
- group: "Sessions",
1928
+ group: "Session",
1666
1929
  kinds: ["handoff", "handoff-usage"],
1667
1930
  args: {
1668
1931
  positionals: [{ name: "goal", required: true, rest: true }],
@@ -1685,7 +1948,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1685
1948
  {
1686
1949
  name: "tree",
1687
1950
  description: "Open session tree navigator",
1688
- group: "Sessions",
1951
+ group: "Session",
1689
1952
  kinds: ["tree"],
1690
1953
  args: {},
1691
1954
  fromArgs: fromArgsOrUsage("tree", { kind: "tree" }),
@@ -1696,7 +1959,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1696
1959
  {
1697
1960
  name: "fork",
1698
1961
  description: "Fork from an assistant turn",
1699
- group: "Sessions",
1962
+ group: "Session",
1700
1963
  kinds: ["fork"],
1701
1964
  args: {},
1702
1965
  fromArgs: fromArgsOrUsage("fork", { kind: "fork" }),
@@ -1707,7 +1970,7 @@ export const BUILTIN_SLASH_COMMANDS: ReadonlyArray<BuiltinSlashCommand> = [
1707
1970
  {
1708
1971
  name: "export",
1709
1972
  description: "Export a self-contained HTML transcript by default; a .md path writes Markdown",
1710
- group: "Sessions",
1973
+ group: "Session",
1711
1974
  kinds: ["export"],
1712
1975
  args: {
1713
1976
  positionals: [{ name: "path", required: false }],
@@ -1779,6 +2042,32 @@ const COMMAND_SHAPED_TOKEN = /^[A-Za-z][A-Za-z0-9:-]*$/u;
1779
2042
  */
1780
2043
  const COMMAND_ESCAPE = "\\/";
1781
2044
 
2045
+ const RETIRED_COMMAND_HINTS: Readonly<Record<string, string>> = Object.freeze({
2046
+ status: "Use the footer or Alt+U for status; /cost, /context, and /fleet inspect their own domains.",
2047
+ receipts: "Use /view or /view verify <run-id>.",
2048
+ "context-init": "Use /context init.",
2049
+ "context-clear": "Use /context reset for project context or /new for a fresh session.",
2050
+ "context-view": "Use /context.",
2051
+ compact: "Use /context compact [instructions].",
2052
+ skills: "Use /skill or /resources skills.",
2053
+ exit: "Use /quit.",
2054
+ config: "Use /settings.",
2055
+ ctx: "Use /context.",
2056
+ models: "Use /model.",
2057
+ clear: "Use /new for a fresh session or /context reset for project context.",
2058
+ library: "Use /resources library [kind].",
2059
+ prompts: "Use /resources prompts.",
2060
+ extensions: "Use /resources extensions.",
2061
+ interop: "Use /agents connect.",
2062
+ targets: "Use /settings targets.",
2063
+ "scoped-models": "Use /settings chat model-picker.",
2064
+ });
2065
+
2066
+ function retiredCommandHint(token: string): string | undefined {
2067
+ if (/^skills?:[^\s]+$/u.test(token)) return "Use /skill <name> [task].";
2068
+ return RETIRED_COMMAND_HINTS[token];
2069
+ }
2070
+
1782
2071
  /** Pure slash-command parser: no I/O, no side effects. Walks the registry in order. */
1783
2072
  export function parseSlashCommand(input: string): SlashCommand {
1784
2073
  const trimmed = input.trim();
@@ -1808,6 +2097,12 @@ export function dispatchSlashCommand(command: SlashCommand, ctx: SlashCommandCon
1808
2097
  return "accepted";
1809
2098
  }
1810
2099
  if (command.kind === "unknown-command") {
2100
+ const retiredHint = retiredCommandHint(command.token);
2101
+ if (retiredHint) {
2102
+ ctx.notice("error", `/${command.token} is retired and did not run. ${retiredHint}`);
2103
+ ctx.render();
2104
+ return "rejected";
2105
+ }
1811
2106
  // The registry does not own the token, but a prompt template might. The
1812
2107
  // parser stays pure, so the lookup happens here, and only for a spelling
1813
2108
  // that matched no command: `/name` is how every other agent invokes the
@@ -1849,18 +2144,55 @@ export interface CommandReferenceEntry {
1849
2144
  subcommandDescriptions?: Readonly<Record<string, string>>;
1850
2145
  }
1851
2146
 
2147
+ const COMMAND_ORDER = [
2148
+ "run",
2149
+ "fleet",
2150
+ "delegate",
2151
+ "council",
2152
+ "oracle",
2153
+ "btw",
2154
+ "share",
2155
+ "skill",
2156
+ "agents",
2157
+ "tasks",
2158
+ "context",
2159
+ "memory",
2160
+ "view",
2161
+ "panes",
2162
+ "cost",
2163
+ "decisions",
2164
+ "resources",
2165
+ "help",
2166
+ "model",
2167
+ "thinking",
2168
+ "output",
2169
+ "settings",
2170
+ "new",
2171
+ "resume",
2172
+ "handoff",
2173
+ "fork",
2174
+ "tree",
2175
+ "export",
2176
+ "archive",
2177
+ "quit",
2178
+ ] as const;
2179
+ const COMMAND_ORDER_INDEX = new Map<string, number>(COMMAND_ORDER.map((name, index) => [name, index]));
2180
+
1852
2181
  export function commandReference(): ReadonlyArray<CommandReferenceEntry> {
1853
- return BUILTIN_SLASH_COMMANDS.filter((entry) => entry.hidden !== true).map((entry) => {
1854
- const usage = usageLine(entry)
1855
- .replace(/^\nusage:\s*/, "")
1856
- .replace(/\n$/, "");
1857
- return {
1858
- name: entry.name,
1859
- usage,
1860
- description: entry.description,
1861
- group: entry.group,
1862
- ...(entry.args ? { args: entry.args } : {}),
1863
- ...(entry.subcommandDescriptions ? { subcommandDescriptions: entry.subcommandDescriptions } : {}),
1864
- };
1865
- });
2182
+ return BUILTIN_SLASH_COMMANDS.filter((entry) => entry.hidden !== true)
2183
+ .slice()
2184
+ .sort((a, b) => (COMMAND_ORDER_INDEX.get(a.name) ?? 99) - (COMMAND_ORDER_INDEX.get(b.name) ?? 99))
2185
+ .map((entry) => {
2186
+ const usage = usageLine(entry)
2187
+ .replace(/^\nusage:\s*/, "")
2188
+ .replace(/\n$/, "");
2189
+ return {
2190
+ name: entry.name,
2191
+ usage,
2192
+ description: entry.description,
2193
+ group: entry.group,
2194
+ ...(entry.args ? { args: entry.args } : {}),
2195
+ ...(entry.subcommandDescriptions ? { subcommandDescriptions: entry.subcommandDescriptions } : {}),
2196
+ };
2197
+ });
1866
2198
  }