@iowarp/clio-coder 0.4.1 → 0.4.3

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 (604) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/CONTRIBUTING.md +142 -52
  3. package/README.md +434 -473
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
  6. package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
  9. package/dist/builtins-IA7V7FUC.js +22 -0
  10. package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
  11. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  12. package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
  13. package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
  14. package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
  15. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  16. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  17. package/dist/chunk-3EBYEESD.js +314 -0
  18. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  19. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  20. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  21. package/dist/chunk-4UVU7BJ5.js +39 -0
  22. package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
  23. package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
  24. package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
  25. package/dist/chunk-5MEZN6CB.js +1334 -0
  26. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  27. package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
  28. package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
  29. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  30. package/dist/chunk-7DRAWPTZ.js +360 -0
  31. package/dist/chunk-7E7I3WLS.js +3762 -0
  32. package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
  33. package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
  34. package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
  35. package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
  36. package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
  37. package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
  38. package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
  39. package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
  40. package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
  41. package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
  42. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  43. package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
  44. package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
  45. package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
  46. package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
  47. package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
  48. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  49. package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
  50. package/dist/chunk-GYV6VZOC.js +26 -0
  51. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  52. package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
  53. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  54. package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
  55. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  56. package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
  57. package/dist/chunk-IJNZMHLA.js +101 -0
  58. package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
  59. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  60. package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
  61. package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
  62. package/dist/chunk-JEQ3XTHC.js +42 -0
  63. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  64. package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
  65. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  66. package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
  67. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  68. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
  70. package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
  71. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  72. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  73. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  74. package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
  75. package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
  76. package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
  77. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  78. package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
  79. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  80. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  81. package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
  82. package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
  83. package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
  84. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  85. package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
  86. package/dist/chunk-R6Q67RJH.js +134 -0
  87. package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
  88. package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
  89. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  90. package/dist/chunk-SKHCAU7K.js +385 -0
  91. package/dist/chunk-SZAA6XDG.js +30 -0
  92. package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
  93. package/dist/chunk-UOIZ7DA4.js +41 -0
  94. package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
  95. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  96. package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
  97. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  98. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  99. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  100. package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
  101. package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
  102. package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
  103. package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
  104. package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
  105. package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
  106. package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
  107. package/dist/chunk-XRZT5WY5.js +47 -0
  108. package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
  109. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  110. package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
  111. package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
  112. package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
  113. package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
  114. package/dist/cli/index.js +41 -39
  115. package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
  116. package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
  117. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  118. package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
  119. package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
  120. package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
  121. package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
  122. package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
  123. package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
  126. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
  127. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  128. package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
  129. package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
  130. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
  131. package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
  132. package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
  133. package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
  134. package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
  135. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
  136. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
  137. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
  138. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
  139. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
  140. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
  141. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
  142. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
  143. package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
  144. package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
  145. package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
  146. package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
  147. package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
  148. package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
  149. package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
  150. package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
  151. package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
  152. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  153. package/dist/reset-EAJFFJVB.js +344 -0
  154. package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
  155. package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
  156. package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
  157. package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
  158. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
  159. package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
  160. package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
  161. package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
  162. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  163. package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
  164. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
  165. package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
  166. package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
  167. package/dist/uninstall-5PEVOE5B.js +408 -0
  168. package/dist/upgrade-M4WXY6KN.js +303 -0
  169. package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
  170. package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
  171. package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
  172. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  173. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
  174. package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
  175. package/dist/worker/entry.js +90 -74
  176. package/docs/README.md +176 -81
  177. package/docs/{acp.md → architecture/acp.md} +36 -20
  178. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  179. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  180. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
  181. package/docs/architecture/artifact-versions.md +90 -0
  182. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  183. package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
  184. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  185. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  186. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  187. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  188. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  189. package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
  190. package/docs/{observability.md → architecture/observability.md} +38 -14
  191. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  192. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
  193. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
  194. package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
  195. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  196. package/docs/architecture/time-conventions.md +125 -0
  197. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  198. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  199. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  200. package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
  201. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
  202. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
  203. package/docs/guide/configuration-reference.md +1163 -0
  204. package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
  205. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  206. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  207. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  208. package/docs/{glossary.md → guide/glossary.md} +14 -11
  209. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
  210. package/docs/guide/panes-and-files.md +290 -0
  211. package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
  212. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  213. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
  214. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  215. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  216. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  217. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  218. package/docs/process/development-pipeline.md +152 -0
  219. package/docs/process/documentation-coverage.md +100 -0
  220. package/docs/process/documentation-guide.md +187 -0
  221. package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
  222. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  223. package/docs/{evolution.md → process/evolution.md} +2 -2
  224. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  225. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  226. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  227. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  228. package/evals/README.md +2 -2
  229. package/evals/behavioral-model.yaml +3 -2
  230. package/package.json +10 -8
  231. package/skills/README.md +52 -41
  232. package/skills/coding/ast-grep/SKILL.md +102 -31
  233. package/skills/coding/ast-grep/evals.md +26 -0
  234. package/skills/coding/coding-standards/SKILL.md +41 -6
  235. package/skills/coding/coding-standards/evals.md +23 -0
  236. package/skills/coding/prototype/SKILL.md +88 -29
  237. package/skills/coding/prototype/evals.md +19 -0
  238. package/skills/coding/tdd/SKILL.md +81 -54
  239. package/skills/coding/tdd/evals.md +20 -0
  240. package/skills/context/context-handoff/SKILL.md +44 -3
  241. package/skills/context/context-handoff/evals.md +44 -0
  242. package/skills/context/context-prime/SKILL.md +46 -16
  243. package/skills/context/context-prime/evals.md +45 -0
  244. package/skills/git/branch-closeout/SKILL.md +132 -0
  245. package/skills/git/branch-closeout/evals.md +133 -0
  246. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  247. package/skills/git/file-ticket/SKILL.md +78 -64
  248. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  249. package/skills/git/file-ticket/evals.md +31 -26
  250. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  251. package/skills/git/fix-issue/SKILL.md +88 -65
  252. package/skills/git/fix-issue/evals.md +35 -31
  253. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  254. package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
  255. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  256. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  257. package/skills/git/ship/SKILL.md +103 -67
  258. package/skills/git/ship/assets/pr-template.md +21 -0
  259. package/skills/git/ship/evals.md +44 -28
  260. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  261. package/skills/git/worktree-create/SKILL.md +80 -50
  262. package/skills/git/worktree-create/evals.md +40 -33
  263. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  264. package/skills/git/worktree-merge/SKILL.md +112 -65
  265. package/skills/git/worktree-merge/evals.md +42 -34
  266. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  267. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  268. package/skills/meta/clio-coder-dev/evals.md +3 -2
  269. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  270. package/skills/meta/clio-coder-test/evals.md +9 -4
  271. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  272. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  273. package/skills/meta/credentials/SKILL.md +2 -2
  274. package/skills/meta/find-skills/SKILL.md +2 -2
  275. package/skills/meta/herdr/SKILL.md +2 -2
  276. package/skills/meta/skill-craft/SKILL.md +22 -16
  277. package/skills/planning/archify/SKILL.md +196 -0
  278. package/skills/planning/archify/evals.md +65 -0
  279. package/skills/planning/architecture/SKILL.md +62 -13
  280. package/skills/planning/architecture/evals.md +65 -0
  281. package/skills/planning/backlog/SKILL.md +131 -15
  282. package/skills/planning/backlog/evals.md +142 -0
  283. package/skills/planning/prd/SKILL.md +47 -7
  284. package/skills/planning/prd/evals.md +54 -0
  285. package/skills/planning/product-intent/SKILL.md +58 -3
  286. package/skills/planning/product-intent/evals.md +70 -0
  287. package/skills/planning/tech-spec/SKILL.md +54 -3
  288. package/skills/planning/tech-spec/evals.md +73 -0
  289. package/skills/registry.yaml +70 -62
  290. package/skills/remote.yaml +13 -0
  291. package/skills/research/arxiv-literature/SKILL.md +77 -19
  292. package/skills/research/arxiv-literature/evals.md +50 -0
  293. package/skills/research/experiment-protocol/SKILL.md +21 -2
  294. package/skills/research/experiment-protocol/evals.md +23 -0
  295. package/skills/research/scientific-debugging/SKILL.md +24 -2
  296. package/skills/research/scientific-debugging/evals.md +18 -0
  297. package/skills/research/scientific-modernization/SKILL.md +27 -2
  298. package/skills/research/scientific-modernization/evals.md +27 -0
  299. package/skills/skill-marketplace.json +97 -62
  300. package/skills/workflow/cut-it/SKILL.md +66 -6
  301. package/skills/workflow/cut-it/evals.md +101 -0
  302. package/skills/workflow/design-council/SKILL.md +118 -28
  303. package/skills/workflow/design-council/evals.md +161 -0
  304. package/skills/workflow/grill-me/SKILL.md +87 -11
  305. package/skills/workflow/grill-me/evals.md +153 -0
  306. package/skills/workflow/workflow-distiller/SKILL.md +77 -18
  307. package/skills/workflow/workflow-distiller/evals.md +118 -0
  308. package/src/cli/args.ts +2 -2
  309. package/src/cli/bootstrap-generate.ts +1 -1
  310. package/src/cli/config-inspect.ts +65 -12
  311. package/src/cli/configure-interop.ts +105 -13
  312. package/src/cli/configure-oauth.ts +57 -0
  313. package/src/cli/configure-onboarding.ts +980 -0
  314. package/src/cli/configure-target.ts +594 -0
  315. package/src/cli/configure.ts +1082 -532
  316. package/src/cli/context-map.ts +114 -0
  317. package/src/cli/context.ts +4 -0
  318. package/src/cli/docs.ts +22 -14
  319. package/src/cli/doctor-naming.ts +5 -5
  320. package/src/cli/doctor-toolchain.ts +3 -3
  321. package/src/cli/eval.ts +1 -2
  322. package/src/cli/extensions.ts +2 -1
  323. package/src/cli/fleet.ts +1 -1
  324. package/src/cli/index.ts +3 -1
  325. package/src/cli/internal-dispatch.ts +3 -4
  326. package/src/cli/lifecycle-presenter.ts +436 -0
  327. package/src/cli/models.ts +10 -2
  328. package/src/cli/modes/print.ts +5 -1
  329. package/src/cli/panes.ts +19 -5
  330. package/src/cli/reset.ts +228 -106
  331. package/src/cli/run.ts +9 -4
  332. package/src/cli/select.ts +664 -0
  333. package/src/cli/share.ts +5 -1
  334. package/src/cli/skills-eval.ts +3 -3
  335. package/src/cli/skills.ts +9 -2
  336. package/src/cli/targets.ts +5 -6
  337. package/src/cli/trace.ts +55 -4
  338. package/src/cli/uninstall.ts +233 -165
  339. package/src/cli/upgrade.ts +204 -149
  340. package/src/cli/usage.ts +86 -27
  341. package/src/cli/validate-model.ts +3 -3
  342. package/src/cli/wiki-generate.ts +1 -1
  343. package/src/core/artifact-paths.ts +1 -1
  344. package/src/core/bash-exec.ts +131 -86
  345. package/src/core/bus-events.ts +51 -6
  346. package/src/core/config.ts +61 -1
  347. package/src/core/defaults.ts +7 -4
  348. package/src/core/dispatch-outcome.ts +16 -0
  349. package/src/core/external-diagnostic.ts +44 -0
  350. package/src/core/gateway-routing.ts +157 -0
  351. package/src/core/guardrails.ts +10 -49
  352. package/src/core/prompt-hint.ts +9 -0
  353. package/src/core/safe-exec.ts +17 -2
  354. package/src/core/skill-activation.ts +89 -2
  355. package/src/domains/agents/builtins/architect.md +2 -3
  356. package/src/domains/agents/builtins/coder.md +3 -2
  357. package/src/domains/agents/builtins/debugger.md +2 -2
  358. package/src/domains/agents/builtins/documenter.md +2 -2
  359. package/src/domains/agents/builtins/git-master.md +1 -1
  360. package/src/domains/agents/builtins/oracle.md +1 -1
  361. package/src/domains/agents/builtins/provenance.md +1 -1
  362. package/src/domains/agents/builtins/researcher.md +1 -1
  363. package/src/domains/agents/builtins/scout.md +1 -1
  364. package/src/domains/agents/builtins/tester.md +2 -2
  365. package/src/domains/agents/builtins/verifier.md +2 -2
  366. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  367. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  368. package/src/domains/agents/catalog.ts +13 -15
  369. package/src/domains/agents/contract.ts +2 -0
  370. package/src/domains/agents/extension.ts +23 -1
  371. package/src/domains/agents/result-contract.ts +70 -0
  372. package/src/domains/config/keybindings.ts +8 -0
  373. package/src/domains/context/extension.ts +0 -3
  374. package/src/domains/context/wiki/map-seed.ts +589 -0
  375. package/src/domains/context/wiki/plan.ts +2 -2
  376. package/src/domains/context/working-set/path-index.ts +1 -0
  377. package/src/domains/dispatch/admission.ts +29 -0
  378. package/src/domains/dispatch/agent-candidates.ts +10 -0
  379. package/src/domains/dispatch/budget-envelope.ts +86 -1
  380. package/src/domains/dispatch/capability-match.ts +11 -0
  381. package/src/domains/dispatch/capacity-lease.ts +17 -0
  382. package/src/domains/dispatch/contract.ts +11 -1
  383. package/src/domains/dispatch/extension.ts +237 -49
  384. package/src/domains/dispatch/host-verification.ts +435 -39
  385. package/src/domains/dispatch/intent-requirements.ts +10 -0
  386. package/src/domains/dispatch/intent.ts +18 -1
  387. package/src/domains/dispatch/path-scope.ts +235 -24
  388. package/src/domains/dispatch/run-event-journal.ts +4 -15
  389. package/src/domains/dispatch/state.ts +2 -3
  390. package/src/domains/dispatch/transport.ts +45 -21
  391. package/src/domains/dispatch/types.ts +58 -3
  392. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  393. package/src/domains/eval/artifacts/store.ts +5 -0
  394. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  395. package/src/domains/eval/metrics/token-stream.ts +201 -31
  396. package/src/domains/eval/metrics/tracked.ts +40 -4
  397. package/src/domains/eval/runners/clio-run.ts +5 -2
  398. package/src/domains/eval/schema/suite.ts +28 -0
  399. package/src/domains/eval/schema/verdict.ts +2 -2
  400. package/src/domains/eval/store.ts +8 -1
  401. package/src/domains/eval/suites/resolve.ts +13 -1
  402. package/src/domains/eval/suites/run.ts +24 -3
  403. package/src/domains/evidence/trust-status.ts +10 -1
  404. package/src/domains/extensions/contract.ts +15 -1
  405. package/src/domains/extensions/discovery.ts +238 -41
  406. package/src/domains/extensions/extension.ts +105 -6
  407. package/src/domains/extensions/index.ts +24 -0
  408. package/src/domains/extensions/integrity.ts +189 -0
  409. package/src/domains/extensions/manager.ts +17 -1
  410. package/src/domains/extensions/resource-path.ts +27 -0
  411. package/src/domains/extensions/resources.ts +18 -38
  412. package/src/domains/extensions/snapshot-store.ts +39 -0
  413. package/src/domains/extensions/snapshot.ts +180 -0
  414. package/src/domains/extensions/state.ts +385 -57
  415. package/src/domains/extensions/types.ts +118 -1
  416. package/src/domains/interop/registry.ts +6 -2
  417. package/src/domains/interop/types.ts +4 -0
  418. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  419. package/src/domains/lifecycle/migrations/index.ts +6 -0
  420. package/src/domains/lifecycle/naming-resources.ts +19 -4
  421. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  422. package/src/domains/memory/task-memory-policy.ts +70 -26
  423. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  424. package/src/domains/middleware/contract.ts +26 -0
  425. package/src/domains/middleware/extension.ts +24 -24
  426. package/src/domains/middleware/hook-receipts.ts +27 -4
  427. package/src/domains/middleware/hooks-io.ts +65 -32
  428. package/src/domains/middleware/hooks.ts +64 -0
  429. package/src/domains/middleware/index.ts +28 -5
  430. package/src/domains/middleware/marketplace-offer.ts +3 -35
  431. package/src/domains/middleware/memory-intervention.ts +127 -32
  432. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  433. package/src/domains/middleware/registrations.ts +326 -0
  434. package/src/domains/middleware/runtime.ts +28 -0
  435. package/src/domains/middleware/skills-reminder.ts +31 -2
  436. package/src/domains/middleware/snapshot.ts +20 -7
  437. package/src/domains/mux/contract.ts +38 -0
  438. package/src/domains/mux/detect.ts +6 -13
  439. package/src/domains/mux/index.ts +1 -1
  440. package/src/domains/mux/operations.ts +44 -5
  441. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  442. package/src/domains/mux/yazi/session.ts +53 -4
  443. package/src/domains/mux/yazi/theme.ts +117 -17
  444. package/src/domains/observability/compaction-usage.ts +118 -0
  445. package/src/domains/observability/contract.ts +10 -11
  446. package/src/domains/observability/cost.ts +1 -1
  447. package/src/domains/observability/extension.ts +17 -4
  448. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  449. package/src/domains/observability/projection.ts +14 -90
  450. package/src/domains/observability/trace-store.ts +43 -7
  451. package/src/domains/prompts/compiler.ts +73 -53
  452. package/src/domains/prompts/contract.ts +15 -3
  453. package/src/domains/prompts/extension.ts +97 -9
  454. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  455. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  456. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  457. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  458. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  459. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  460. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  461. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  462. package/src/domains/providers/contract.ts +4 -1
  463. package/src/domains/providers/extension.ts +40 -9
  464. package/src/domains/providers/index.ts +1 -1
  465. package/src/domains/providers/model-capabilities.ts +9 -0
  466. package/src/domains/providers/model-discovery.ts +2 -0
  467. package/src/domains/providers/model-runtime-capabilities.ts +99 -25
  468. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
  469. package/src/domains/providers/runtime-resolution.ts +31 -0
  470. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  471. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  472. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  473. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  474. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  475. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  476. package/src/domains/providers/support.ts +11 -5
  477. package/src/domains/providers/target-model-cache.ts +25 -2
  478. package/src/domains/providers/types/capability-flags.ts +2 -0
  479. package/src/domains/providers/types/cost-provenance.ts +19 -0
  480. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  481. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  482. package/src/domains/providers/types/target-descriptor.ts +19 -0
  483. package/src/domains/resources/index.ts +3 -0
  484. package/src/domains/resources/skills/install.ts +72 -7
  485. package/src/domains/resources/skills/loader.ts +23 -19
  486. package/src/domains/resources/skills/marketplace.ts +63 -11
  487. package/src/domains/safety/autonomy.ts +15 -0
  488. package/src/domains/safety/call-target.ts +1 -1
  489. package/src/domains/safety/index.ts +1 -0
  490. package/src/domains/safety/loop-detector.ts +7 -4
  491. package/src/domains/safety/path-policy.ts +1 -1
  492. package/src/domains/safety/policy-engine.ts +34 -11
  493. package/src/domains/safety/protected-artifacts.ts +191 -88
  494. package/src/domains/safety/run-effects.ts +2 -22
  495. package/src/domains/safety/skill-authority.ts +55 -0
  496. package/src/domains/session/compaction/compact.ts +72 -22
  497. package/src/domains/session/entries.ts +6 -0
  498. package/src/domains/session/task-board.ts +10 -9
  499. package/src/domains/session/usage.ts +3 -3
  500. package/src/domains/share/archive.ts +164 -7
  501. package/src/engine/acp/server.ts +62 -9
  502. package/src/engine/agent.ts +13 -3
  503. package/src/engine/ai.ts +26 -8
  504. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  505. package/src/engine/api-registry.ts +3 -0
  506. package/src/engine/apis/llamacpp-residency.ts +3 -4
  507. package/src/engine/apis/lmstudio.ts +3 -3
  508. package/src/engine/apis/ollama-native.ts +6 -6
  509. package/src/engine/apis/openai-completions.ts +145 -39
  510. package/src/engine/apis/output-budget.ts +8 -18
  511. package/src/engine/apis/residency.ts +8 -27
  512. package/src/engine/external-subprocess.ts +114 -6
  513. package/src/engine/gemma-channel-filter.ts +19 -0
  514. package/src/engine/loop-guard.ts +92 -12
  515. package/src/engine/worker-runtime.ts +40 -11
  516. package/src/engine/worker-tools.ts +3 -1
  517. package/src/entry/background-model-metadata.ts +18 -0
  518. package/src/entry/compaction-prompt.ts +57 -0
  519. package/src/entry/extension-hook-sources.ts +28 -0
  520. package/src/entry/extension-reload.ts +309 -0
  521. package/src/entry/orchestrator.ts +464 -251
  522. package/src/entry/task-memory-lifecycle.ts +35 -0
  523. package/src/interactive/application-controller.ts +2 -1
  524. package/src/interactive/bus-notices.ts +8 -1
  525. package/src/interactive/chat-loop-messages.ts +16 -17
  526. package/src/interactive/chat-loop.ts +75 -3
  527. package/src/interactive/chat-panel.ts +36 -13
  528. package/src/interactive/chat-renderer.ts +72 -7
  529. package/src/interactive/cost-overlay.ts +26 -2
  530. package/src/interactive/dispatch-board.ts +6 -11
  531. package/src/interactive/footer/widgets.ts +13 -0
  532. package/src/interactive/interactive-application.ts +39 -4
  533. package/src/interactive/interactive-input-runtime.ts +4 -0
  534. package/src/interactive/interactive-presentation.ts +2 -2
  535. package/src/interactive/interactive-slash-runtime.ts +4 -1
  536. package/src/interactive/overlays/extensions.ts +9 -1
  537. package/src/interactive/overlays/help-reference.ts +13 -0
  538. package/src/interactive/overlays/settings.ts +27 -16
  539. package/src/interactive/panes-runtime.ts +111 -35
  540. package/src/interactive/prompt-cache-identity.ts +88 -0
  541. package/src/interactive/renderers/worker-entry.ts +32 -0
  542. package/src/interactive/slash-commands.ts +153 -20
  543. package/src/interactive/stream-pacing-policy.ts +0 -23
  544. package/src/interactive/theme/labels.ts +19 -13
  545. package/src/interactive/turn-context.ts +39 -20
  546. package/src/interactive/turn-recovery.ts +8 -0
  547. package/src/interactive/turn-runtime.ts +27 -11
  548. package/src/interactive/turn-state.ts +7 -0
  549. package/src/interactive/worker-receipts.ts +1 -0
  550. package/src/interactive/worker-stream.ts +6 -1
  551. package/src/interactive/yazi-bridge.ts +60 -6
  552. package/src/tools/agent-tools.ts +30 -1
  553. package/src/tools/artifact.ts +2 -2
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/bootstrap.ts +4 -0
  557. package/src/tools/builtin-tool-catalog.ts +52 -22
  558. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  559. package/src/tools/codewiki/code-nav.ts +99 -13
  560. package/src/tools/context/docs-engine.ts +20 -7
  561. package/src/tools/context/index.ts +59 -21
  562. package/src/tools/core-bootstrap.ts +28 -6
  563. package/src/tools/credential-present.ts +1 -2
  564. package/src/tools/dispatch-arguments.ts +6 -1
  565. package/src/tools/dispatch-event-text.ts +10 -0
  566. package/src/tools/dispatch-plan.ts +49 -4
  567. package/src/tools/dispatch-run-events.ts +1 -1
  568. package/src/tools/dispatch-runner.ts +12 -0
  569. package/src/tools/dispatch-schema.ts +338 -0
  570. package/src/tools/dispatch-types.ts +3 -0
  571. package/src/tools/dispatch.ts +9 -254
  572. package/src/tools/ledger.ts +3 -5
  573. package/src/tools/monitor-surface.ts +5 -13
  574. package/src/tools/observation.ts +4 -5
  575. package/src/tools/panes-surface.ts +4 -11
  576. package/src/tools/panes.ts +4 -2
  577. package/src/tools/policy.ts +15 -2
  578. package/src/tools/read.ts +5 -6
  579. package/src/tools/registry.ts +41 -12
  580. package/src/tools/result-shaping.ts +18 -14
  581. package/src/tools/steer-surface.ts +1 -1
  582. package/src/tools/tasks.ts +1 -1
  583. package/src/tools/truncate.ts +6 -5
  584. package/src/tools/verify/surface.ts +6 -12
  585. package/src/tools/web-fetch-surface.ts +1 -3
  586. package/src/tools/worker-evidence.ts +3 -1
  587. package/src/worker/spec-contract.ts +4 -0
  588. package/dist/builtins-UJLMOVOV.js +0 -17
  589. package/dist/chunk-5QIAJV2D.js +0 -48
  590. package/dist/chunk-JZWT5J3Y.js +0 -814
  591. package/dist/chunk-K7VKOLQQ.js +0 -15
  592. package/dist/chunk-PMZCIOCJ.js +0 -25
  593. package/dist/chunk-SUW5DORT.js +0 -819
  594. package/dist/chunk-UOV2BYIW.js +0 -107
  595. package/dist/chunk-WR6U3OVP.js +0 -45
  596. package/dist/chunk-Y45G3AXC.js +0 -1558
  597. package/dist/reset-EOLM7GVE.js +0 -230
  598. package/dist/uninstall-N34PCTGJ.js +0 -331
  599. package/dist/upgrade-H7TOM7YL.js +0 -323
  600. package/docs/artifact-versions.md +0 -67
  601. package/docs/development-pipeline.md +0 -121
  602. package/docs/documentation-coverage.md +0 -46
  603. package/docs/documentation-guide.md +0 -167
  604. package/docs/time-conventions.md +0 -101
@@ -368,6 +368,13 @@ function contextComposition(context: ContextEngineFacts): {
368
368
  };
369
369
  }
370
370
 
371
+ /** The live window after the percent; null when unknown or the row is too narrow to carry it. */
372
+ export function compactContextWindowLabel(context: ContextEngineFacts, width: number): string | null {
373
+ if (width < 72) return null;
374
+ const window = finiteNonNegative(context.ledger?.contextWindow ?? context.contextWindow);
375
+ return window > 0 ? formatFooterTokens(window) : null;
376
+ }
377
+
371
378
  export function compactSecondaryLine(
372
379
  context: ContextEngineFacts,
373
380
  agent: AgentWorkFacts,
@@ -403,6 +410,12 @@ export function compactSecondaryLine(
403
410
  } else {
404
411
  left = buildSegmentedContextBar(theme, barCells, context.contextWindow ?? 0, contextBreakdownForBar(context));
405
412
  }
413
+ // A percentage alone does not say whether the window is 128k or 1M, so at
414
+ // widths that can afford it the live window follows the percent. It comes
415
+ // from the ledger when one is bound (the layer that answered the window is
416
+ // also the layer that produced the percent) and from the facts otherwise.
417
+ const windowLabel = compactContextWindowLabel(context, safeWidth);
418
+ if (windowLabel) left = `${left} ${theme.fg("dim", "of")} ${theme.fg("muted", windowLabel)}`;
406
419
  const maxRightWidth = Math.max(0, safeWidth - visibleWidth(left) - 1);
407
420
  const right = buildMetricStrip(
408
421
  theme,
@@ -46,6 +46,7 @@ import type { createMuxBridge } from "./mux-bridge.js";
46
46
  import { createOverlayLifecycle, type OverlayLifecycleController, type OverlayState } from "./overlay-lifecycle.js";
47
47
  import { interopOverlaySurface } from "./overlays/interop.js";
48
48
  import { paneWatchDecision } from "./pane-policy.js";
49
+ import { describePanesLeftBehind } from "./panes-runtime.js";
49
50
  import { writeInputWedgeDump } from "./render-trace.js";
50
51
  import { settleChatBeforeSessionSwitch } from "./session-switch-settlement.js";
51
52
  import { createSessionTranscript } from "./session-transcript.js";
@@ -54,9 +55,10 @@ import type {
54
55
  InitCommandOptions,
55
56
  RunIo,
56
57
  SettingsAreaId,
58
+ SlashCommandContext,
57
59
  TaskMemorySeedCommandResult,
58
60
  } from "./slash-commands.js";
59
- import { processAutoPacingAllowed, resolveSmoothStreamingMode } from "./stream-pacing-policy.js";
61
+ import { processAutoPacingAllowed } from "./stream-pacing-policy.js";
60
62
  import type { TerminalLease } from "./terminal-lease.js";
61
63
  import type { createWatchPaneController } from "./watch-pane.js";
62
64
  import { createWorkspaceFacts } from "./workspace-facts.js";
@@ -121,6 +123,8 @@ export interface InteractiveDeps {
121
123
  initialNotices?: ReadonlyArray<string>;
122
124
  resources?: ResourcesContract;
123
125
  extensions?: ExtensionsContract;
126
+ /** `/resources extensions reload` seam; the composition root supplies the coordinator. */
127
+ reloadExtensions?: SlashCommandContext["reloadExtensions"];
124
128
  interop?: InteropContract;
125
129
  share?: ShareContract;
126
130
  /**
@@ -311,6 +315,8 @@ export interface KeyBindingDeps {
311
315
  requestShutdown: () => void;
312
316
  toggleStatus: () => void;
313
317
  toggleDispatchBoard: () => void;
318
+ /** `/files` as a key: open the files pane when closed, close it when open. */
319
+ toggleFilesPane: () => void;
314
320
  openTasks: () => void;
315
321
  openDecisions: () => void;
316
322
  backgroundDispatch: () => void;
@@ -396,6 +402,9 @@ function dispatchInteractiveAction(id: ClioKeybinding, deps: KeyBindingDeps): bo
396
402
  case "clio-coder.dispatchBoard.toggle":
397
403
  deps.toggleDispatchBoard();
398
404
  return true;
405
+ case "clio-coder.files.toggle":
406
+ deps.toggleFilesPane();
407
+ return true;
399
408
  case "clio-coder.tasks.open":
400
409
  deps.openTasks();
401
410
  return true;
@@ -430,6 +439,7 @@ export function routeInteractiveKey(data: string, deps: KeyBindingDeps): boolean
430
439
  "clio-coder.thinking.cycle",
431
440
  "clio-coder.session.tree",
432
441
  "clio-coder.dispatchBoard.toggle",
442
+ "clio-coder.files.toggle",
433
443
  "clio-coder.tasks.open",
434
444
  "clio-coder.decisions.open",
435
445
  "clio-coder.dispatch.background",
@@ -448,7 +458,7 @@ export function routeInteractiveKey(data: string, deps: KeyBindingDeps): boolean
448
458
  }
449
459
 
450
460
  export async function createInteractiveApplication(deps: InteractiveDeps): Promise<number> {
451
- const initialSmoothStreaming = resolveSmoothStreamingMode(deps.getSettings?.().interface.smoothStreaming ?? "off");
461
+ const initialSmoothStreaming = deps.getSettings?.().interface.smoothStreaming ?? "off";
452
462
  const initialAutoPacingAllowed = processAutoPacingAllowed(false);
453
463
  const lease = deps.terminalLease;
454
464
  const shell =
@@ -606,7 +616,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
606
616
  getDraft: () => editor.getText(),
607
617
  setDraft: (text) => editor.setText(text),
608
618
  requestRender: () => tui.requestRender(),
609
- notice: (level, text) => notify(level, text, `yazi:${level}`),
619
+ notice: (level, text) => notify(level, text, `files:${level}`),
610
620
  getCwd: () => process.cwd(),
611
621
  getSettings: () =>
612
622
  deps.getSettings?.().interface.panes.files ?? {
@@ -672,7 +682,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
672
682
  appendTranscriptNotice: (level, text) => appendNotice(level, text, busNoticeSink),
673
683
  refreshSettingsOverlay: () => overlayLifecycle.refreshSettingsOverlay(),
674
684
  onConfigHotReload: (settings) => {
675
- const mode = resolveSmoothStreamingMode(settings.interface.smoothStreaming);
685
+ const mode = settings.interface.smoothStreaming;
676
686
  const autoAllowed = processAutoPacingAllowed(shell.hasObservedBackpressure());
677
687
  chatRenderer.setSmoothStreamingMode(mode);
678
688
  shell.setStreamPacingActive(mode === "on" || (mode === "auto" && autoAllowed));
@@ -702,6 +712,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
702
712
  settleVisibleFrame: (reason) => chatRenderer.flushAndCommit(reason),
703
713
  ...(deps.resources ? { resources: deps.resources } : {}),
704
714
  ...(deps.extensions ? { extensions: deps.extensions } : {}),
715
+ ...(deps.reloadExtensions ? { reloadExtensions: deps.reloadExtensions } : {}),
705
716
  ...(interopSurface ? { interop: interopSurface } : {}),
706
717
  ...(deps.agents ? { agents: deps.agents } : {}),
707
718
  ...(deps.share ? { share: deps.share } : {}),
@@ -1056,6 +1067,25 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
1056
1067
  if (deps.onCycleScopedModelBackward?.() === false) announceEmptyScopedSet();
1057
1068
  },
1058
1069
  backgroundActiveDispatch,
1070
+ toggleFilesPane: () => {
1071
+ const panes = deps.panes;
1072
+ if (!panes) {
1073
+ notify(
1074
+ "info",
1075
+ "the files pane is inactive: this session started without panes. Restart with `clio-coder --with-panes`, or set interface.panes.enabled=auto",
1076
+ "files:info",
1077
+ );
1078
+ return;
1079
+ }
1080
+ void panes.files("toggle").then((result) => {
1081
+ if (result.status === "opened") {
1082
+ if (result.paneId !== null)
1083
+ notify("success", `files pane ${result.existing ? "focused" : "opened"}`, "files:open");
1084
+ } else if (result.status === "closed") notify("info", "files pane closed", "files:close");
1085
+ else if (result.status === "missing-binary") notify("warning", result.detail, "files:missing");
1086
+ else notify("warning", result.reason, "files:refused");
1087
+ });
1088
+ },
1059
1089
  },
1060
1090
  overlay: overlayLifecycle,
1061
1091
  refreshFooter: () => footer.refresh(),
@@ -1137,6 +1167,11 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
1137
1167
  },
1138
1168
  cancelParkedCalls: (reason) => deps.toolRegistry?.cancelParkedCalls(reason),
1139
1169
  onShutdown: async () => {
1170
+ // The terminal is already stopped here and the domains have not, so this
1171
+ // is the one moment a plain line about the pane host can both be read
1172
+ // and still see the registry that shutdown is about to forget.
1173
+ const leftBehind = mux && mux.mode !== "none" && mux.available() ? describePanesLeftBehind(mux) : null;
1174
+ if (leftBehind !== null) process.stderr.write(`${leftBehind}\n`);
1140
1175
  try {
1141
1176
  if (dumpInputWedgeOnTerminate) process.off("SIGTERM", dumpInputWedgeOnTerminate);
1142
1177
  await deps.onShutdown();
@@ -21,6 +21,7 @@ export interface InteractiveInputKeyActionDeps {
21
21
  requestShutdown: () => void;
22
22
  toggleStatus: () => void;
23
23
  toggleDispatchBoard: () => void;
24
+ toggleFilesPane: () => void;
24
25
  openTasks: () => void;
25
26
  openDecisions: () => void;
26
27
  backgroundDispatch: () => void;
@@ -54,6 +55,8 @@ export interface InteractiveInputRuntimeDeps {
54
55
  cycleScopedModelBackward(): void;
55
56
  /** Convert the newest attached dispatch into a detached batch and notice the outcome. */
56
57
  backgroundActiveDispatch(): void;
58
+ /** Toggle the files pane; the application decides what "inactive" says. */
59
+ toggleFilesPane(): void;
57
60
  };
58
61
  overlay: {
59
62
  getState(): OverlayState;
@@ -154,6 +157,7 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
154
157
  openTasks: deps.overlay.openTasksOverlayState,
155
158
  openDecisions: deps.overlay.openDecisionsOverlayState,
156
159
  backgroundDispatch: deps.actions.backgroundActiveDispatch,
160
+ toggleFilesPane: deps.actions.toggleFilesPane,
157
161
  openModelSelector: deps.overlay.openModelOverlayState,
158
162
  openTree: deps.overlay.openTreeOverlayState,
159
163
  cycleScopedModelForward: () => {
@@ -37,7 +37,7 @@ import { createSlashCommandAutocompleteProvider } from "./slash-autocomplete.js"
37
37
  import { parseSlashCommand, type RunIo } from "./slash-commands.js";
38
38
  import { createStatusController, type StatusController, type TurnSummary } from "./status/index.js";
39
39
  import type { SmoothStreamingMode } from "./stream-pacer.js";
40
- import { processAutoPacingAllowed, resolveSmoothStreamingMode } from "./stream-pacing-policy.js";
40
+ import { processAutoPacingAllowed } from "./stream-pacing-policy.js";
41
41
  import { formatTargetLabel } from "./theme/index.js";
42
42
  import { createWelcomeDashboard, type WelcomeDashboardComponent } from "./welcome-dashboard.js";
43
43
  import { readWorkerReceiptFacts } from "./worker-receipts.js";
@@ -452,7 +452,7 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
452
452
  ? {
453
453
  streamIngress: deps.resolveStreamIngress,
454
454
  getSmoothStreamingMode: () => {
455
- const mode = resolveSmoothStreamingMode(deps.getSettings?.().interface.smoothStreaming ?? "off");
455
+ const mode = deps.getSettings?.().interface.smoothStreaming ?? "off";
456
456
  const autoAllowed = processAutoPacingAllowed(deps.hasObservedBackpressure?.() ?? false);
457
457
  deps.onSmoothStreamingMode?.(mode, mode === "on" || (mode === "auto" && autoAllowed));
458
458
  return mode;
@@ -62,7 +62,7 @@ export interface InteractiveSlashSubmitExpansion {
62
62
  pendingSkillRequests: PendingSkillRequest[];
63
63
  }
64
64
 
65
- type SlashChat = Pick<ChatLoop, "getSessionId" | "isStreaming" | "submit">;
65
+ type SlashChat = Pick<ChatLoop, "clearSkillSurface" | "getSessionId" | "isStreaming" | "submit">;
66
66
  type SlashChatPanel = Pick<ChatPanel, "appendReplayBlock" | "appendUser" | "clearFoldOverrides">;
67
67
  type UserTurnStatus = import("./chat-panel.js").UserTurnStatus;
68
68
  type SlashResources = Pick<ResourcesContract, "prompts" | "expandPromptTemplate" | "reload">;
@@ -79,6 +79,7 @@ export interface InteractiveSlashRuntimeDeps {
79
79
  chatPanel: SlashChatPanel;
80
80
  resources?: SlashResources;
81
81
  extensions?: SlashExtensions;
82
+ reloadExtensions?: SlashCommandContext["reloadExtensions"];
82
83
  interop?: SlashCommandContext["interop"];
83
84
  agents?: SlashAgents;
84
85
  share?: SlashShare;
@@ -388,6 +389,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
388
389
  listPrompts: () => deps.resources?.prompts(cwd()) ?? { items: [], diagnostics: [] },
389
390
  ...(resources ? { expandPromptTemplate: (text: string) => resources.expandPromptTemplate(text, cwd()) } : {}),
390
391
  openSkillsHub: deps.openSkillsHub,
392
+ clearSkillSurface: () => deps.chat.clearSkillSurface(),
391
393
  listExtensions: () => deps.extensions?.list(cwd(), { all: true }) ?? [],
392
394
  listAgents: () => deps.agents?.listSpecs().filter((spec) => spec.audience !== "internal") ?? [],
393
395
  listDelegationAgents: () => deps.getSettings?.().integrations.externalAgents.entries ?? [],
@@ -566,6 +568,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
566
568
  openAgents: deps.openAgents,
567
569
  openPrompts: deps.openPrompts,
568
570
  openExtensions: deps.openExtensions,
571
+ ...(deps.reloadExtensions ? { reloadExtensions: deps.reloadExtensions } : {}),
569
572
  ...(deps.openInterop ? { openInterop: deps.openInterop } : {}),
570
573
  ...(deps.interop ? { interop: deps.interop } : {}),
571
574
  setEditorText: (text) => {
@@ -10,7 +10,15 @@ export const EXTENSIONS_EMPTY =
10
10
  export function openExtensionsOverlay(tui: TUI, ctx: SlashCommandContext, onClose: () => void): OverlayHandle {
11
11
  const list = ctx.listExtensions?.() ?? [];
12
12
  const items: ListOverlayItem[] = list.map((ext) => {
13
- const state = !ext.enabled ? "disabled" : ext.effective ? "active" : `shadowed:${ext.overriddenBy ?? "higher"}`;
13
+ const state = !ext.valid
14
+ ? "invalid"
15
+ : !ext.compatible
16
+ ? "incompatible"
17
+ : !ext.enabled
18
+ ? "disabled"
19
+ : ext.loadable
20
+ ? "active"
21
+ : `shadowed:${ext.overriddenBy ?? "higher"}`;
14
22
 
15
23
  let meta = state;
16
24
  if (state === "active") {
@@ -101,6 +101,19 @@ export function openHelpOverlay(
101
101
  "**Tasks versus runs**: `/tasks` shows the agent's plan steps. Fleet runs are concrete delegated worker executions and remain in this board as recent terminal history.",
102
102
  ],
103
103
  },
104
+ {
105
+ id: "topic-files-pane",
106
+ label: `${"panes & files".padEnd(30)}The files pane, the logs and shell panes, and what closes them`,
107
+ group: "Topics",
108
+ detail: () => [
109
+ "# Panes & files",
110
+ "**Where it works**: a session started inside a herdr pane with `clio-coder --with-panes` (or `interface.panes.enabled: auto`). Outside herdr `/files` still works as a full-screen pick that returns to the composer; `/panes open logs|shell` do not.",
111
+ "**Files pane**: `/files` or the Files toggle key (Alt+E by default) opens the file view below the session and moves the keyboard into it; the same key or command closes it. `/files pick` borrows it for one selection. It is off until `interface.panes.files.enabled` is `true`.",
112
+ "**Picking**: navigate, select with Space for several, then Ctrl+Y (or Enter in pick mode). The paths land in the composer as `@file` mentions and the keyboard returns to the composer.",
113
+ "**Logs and shell**: `/panes open logs` follows the newest dispatched run's journal; `/panes open shell` opens a shell in the workspace. A second open focuses the pane that is already there. `/panes close <name|all>` closes them; `/quit` closes the docks it manages (files, workers), leaves a shell or logs pane you opened, and prints which panes it left and how to close them.",
114
+ "**Engine**: the files pane runs a vendored file manager installed with `clio-coder tools install yazi`; `clio-coder doctor` and `/panes` say whether it resolved.",
115
+ ],
116
+ },
104
117
  {
105
118
  id: "topic-steering-modes",
106
119
  label: `${"steering modes".padEnd(30)}Interrupt, next slot, or end of turn: when a message lands mid-run`,
@@ -200,7 +200,7 @@ export const SETTINGS_LABELS_BY_ID = {
200
200
  "panes.journal": "Run event journal",
201
201
  "panes.yazi.enabled": "Files pane",
202
202
  "panes.yazi.mode": "Files pane mode",
203
- "panes.yazi.profile": "Yazi profile",
203
+ "panes.yazi.profile": "Files pane profile",
204
204
  "panes.yazi.followCwd": "Follow conversation cwd",
205
205
  "panes.yazi.ratio": "Files dock share",
206
206
  scope: "Model cycle set",
@@ -208,6 +208,7 @@ export const SETTINGS_LABELS_BY_ID = {
208
208
  "modelSelector.favorites": "Pinned favorites",
209
209
  "budget.sessionCeilingUsd": "Session ceiling (USD)",
210
210
  "defaults.maxTokens": "Output budget (tokens)",
211
+ "context.toolResultMaxBytes": "Tool result cap (bytes)",
211
212
  "budget.concurrency": "Fleet concurrency",
212
213
  "guardrails.turnToolCallBudget": "Turn tool-call budget",
213
214
  "guardrails.workerToolCallCap": "Worker tool-call cap",
@@ -326,6 +327,7 @@ export const SETTINGS_SECTION_ROWS = {
326
327
  budget: [
327
328
  "budget.sessionCeilingUsd",
328
329
  "defaults.maxTokens",
330
+ "context.toolResultMaxBytes",
329
331
  "budget.concurrency",
330
332
  "guardrails.turnToolCallBudget",
331
333
  "guardrails.workerToolCallCap",
@@ -414,9 +416,10 @@ const SETTINGS_DESCRIPTIONS_BY_ID = {
414
416
  "panes.layout": "What composes itself at interactive boot: nothing, the workers dock, or workers plus files.",
415
417
  "panes.workers.ratio": "Share of the width the workers dock takes, at most half.",
416
418
  "panes.journal": "Whether every dispatched run's event tail is written to disk for `clio-coder fleet view`.",
417
- "panes.yazi.enabled": "Whether `/panes open yazi` may open the files pane or one-shot chooser.",
418
- "panes.yazi.mode": "Keep Yazi beside the conversation, or close it after one selection.",
419
- "panes.yazi.profile": "Use Clio's managed pick profile or leave the operator's Yazi profile untouched.",
419
+ "panes.yazi.enabled":
420
+ "Whether `/files`, its key, and `/panes open files` may open the files pane or the one-shot pick.",
421
+ "panes.yazi.mode": "Keep the files pane beside the conversation, or close it after one selection.",
422
+ "panes.yazi.profile": "Use Clio's managed, themed engine profile or the operator's own file-manager configuration.",
420
423
  "panes.yazi.followCwd": "Push the conversation directory into an already-open companion pane.",
421
424
  "panes.yazi.ratio": "Share of the height the files dock takes, at most half.",
422
425
  scope: "Alt+J and Alt+K model cycle set.",
@@ -424,6 +427,7 @@ const SETTINGS_DESCRIPTIONS_BY_ID = {
424
427
  "modelSelector.favorites": "Exact target/model refs pinned in /model.",
425
428
  "budget.sessionCeilingUsd": "Per-session cost cap.",
426
429
  "defaults.maxTokens": "Output tokens requested per turn, applied to every target.",
430
+ "context.toolResultMaxBytes": "Maximum bytes returned from one tool result before the full text spills to scratch.",
427
431
  "budget.concurrency": "Parallel workers allowed during dispatch.",
428
432
  "guardrails.turnToolCallBudget": "Soft per-turn tool-call budget for this chat loop.",
429
433
  "guardrails.workerToolCallCap": "Lifetime ceiling on tool calls one dispatched worker may execute.",
@@ -475,6 +479,8 @@ const SETTINGS_HELP_BY_ID: Partial<Record<EditableSettingId, string>> = {
475
479
  "read-only observes; suggest parks non-read calls; auto-edit edits, dispatches, and runs recognized commands; full-auto runs except command substitution and system-level changes. A confirmation marked exposure=outward parks for you at suggest and auto-edit.",
476
480
  "defaults.maxTokens":
477
481
  "Clamped down to each model's max-output cap and the remaining context window. Set 0 to use per-model caps only.",
482
+ "context.toolResultMaxBytes":
483
+ "The 192KB per-turn observation pool remains authoritative. Three full 64KB results consume it, so a fourth finds it filled. Whole number of at least 4096 bytes · default: 65536 (64KB).",
478
484
  "compaction.threshold":
479
485
  "pressure = estimated tokens ÷ context window. Higher keeps more history but risks overflow before a summary runs.",
480
486
  "context.workingSet.enabled":
@@ -487,17 +493,17 @@ const SETTINGS_HELP_BY_ID: Partial<Record<EditableSettingId, string>> = {
487
493
  "context.workingSet.minEvictableTokens":
488
494
  "The floor sweep put marker break-even near 50 tokens; 200 is the churn guard. Whole number, 0 evicts anything · default: 200.",
489
495
  "guardrails.turnToolCallBudget":
490
- "Crossing it blocks further calls in the turn with a stop-and-summarize directive, and the hard interrupt ceiling sits a fixed margin above. A backstop against a model spraying unproductive calls, not a routine ceiling: a repo-wide audit legitimately runs dozens. Whole number of at least 1 · default: 60. Env override CLIO_CODER_TURN_TOOL_CALL_BUDGET beats this value.",
496
+ "Crossing it blocks further calls in the turn with a stop-and-summarize directive, and the hard interrupt ceiling sits a fixed margin above. A backstop against a model spraying unproductive calls, not a routine ceiling: a repo-wide audit legitimately runs dozens. Whole number of at least 1 · default: 60.",
491
497
  "guardrails.workerToolCallCap":
492
- "Bounds admitted calls, not attempts: a call the harness refuses never ran and never spends the cap. Dispatch takes the smaller of this and the agent recipe's own budget, so the recipe normally binds. Whole number of at least 1 · default: 150. Env override CLIO_CODER_WORKER_TOOL_CALL_CAP beats this value.",
498
+ "Bounds admitted calls, not attempts: a call the harness refuses never ran and never spends the cap. Dispatch takes the smaller of this and the agent recipe's own budget, so the recipe normally binds. Whole number of at least 1 · default: 150.",
493
499
  "guardrails.maxDispatchRuns":
494
- "Runs leaving the ring also lose their event journal directory. Whole number of at least 1 · default: 1000. Env override CLIO_CODER_MAX_DISPATCH_RUNS beats this value.",
500
+ "Runs leaving the ring also lose their event journal directory. Whole number of at least 1 · default: 1000.",
495
501
  "guardrails.readMaxBytes":
496
- "Clamped up to a 1KB floor at use. Whole number of bytes, at least 1 · default: 51200 (50KB). Env override CLIO_CODER_READ_MAX_BYTES beats this value.",
502
+ "Clamped up to a 1KB floor at use. Whole number of bytes, at least 1 · default: 51200 (50KB).",
497
503
  "guardrails.observationTurnBudgetBytes":
498
- "One pool shared by every observation-producing tool in a turn, so a single verbose tool cannot starve the rest. Whole number of bytes, at least 1 · default: 196608 (192KB). Env override CLIO_CODER_OBSERVATION_TURN_BUDGET_BYTES beats this value.",
504
+ "One pool shared by every observation-producing tool in a turn, so a single verbose tool cannot starve the rest. Whole number of bytes, at least 1 · default: 196608 (192KB).",
499
505
  "guardrails.internalDispatchTimeoutMs":
500
- "Covers the wiki documenter and the bootstrap scout. Continuous output satisfies the heartbeat watchdog and a run mid-generation spends no tool calls, so this is the only guard that ends a degenerate generator. Healthy runs finish in minutes. Whole milliseconds of at least 1 · default: 900000 (15 minutes). Env override CLIO_CODER_INTERNAL_DISPATCH_TIMEOUT_MS beats this value.",
506
+ "Covers the wiki documenter and the bootstrap scout. Continuous output satisfies the heartbeat watchdog and a run mid-generation spends no tool calls, so this is the only guard that ends a degenerate generator. Healthy runs finish in minutes. Whole milliseconds of at least 1 · default: 900000 (15 minutes).",
501
507
  "retry.streamStallMs":
502
508
  "Measured from the last token received, not from the request, so a slow-but-alive stream is never aborted. The retry then follows the same enabled/maxRetries/delay settings above. Whole milliseconds · default: 180000 (three minutes).",
503
509
  "library.catalog":
@@ -593,14 +599,11 @@ const SETTINGS_VALUE_HELP_BY_ID: Partial<Record<EditableSettingId, Record<string
593
599
  true: "compact automatically before a turn crosses the threshold",
594
600
  false: "context is only compacted when you run /context compact",
595
601
  },
596
- // `embedded` is a declared rung with no implementation behind it, and a row
597
- // that offered it beside two working values read as a third working value.
598
- // It stays selectable, because refusing it outright would break a settings
599
- // file that names it, but nothing here lets an operator pick it believing
600
- // they will get panes.
602
+ // `embedded` is a declared rung with no implementation behind it yet; it
603
+ // runs as `auto` until Clio can own a pane host, and the hint says so.
601
604
  "panes.enabled": {
602
605
  auto: "detect a herdr session and join it as a guest; no pane host, no panes",
603
- embedded: "NOT IMPLEMENTED (ships in phase 5): this session gets no panes at all, guest mode included",
606
+ embedded: "not implemented yet; behaves as auto (guest mode inside herdr) until Clio can own a pane host",
604
607
  off: "never detect or open a pane",
605
608
  },
606
609
  "retry.enabled": {
@@ -1838,6 +1841,9 @@ function buildSettingItems(settings: Readonly<ClioSettings>, options?: BuildSett
1838
1841
  settingItem("defaults.maxTokens", String(settings.chat.maxOutputTokens), {
1839
1842
  values: ["0", "4096", "8192", "16384", "32768", "65536", "131072"],
1840
1843
  }),
1844
+ settingItem("context.toolResultMaxBytes", String(settings.context.toolResultMaxBytes), {
1845
+ values: ["4096", "8192", "16384", "32768", "65536", "131072"],
1846
+ }),
1841
1847
  settingItem("budget.concurrency", String(settings.fleet.concurrency), {
1842
1848
  values: ["auto", "1", "2", "4", "8"],
1843
1849
  }),
@@ -2707,6 +2713,11 @@ function applySettingChange(settings: ClioSettings, id: string, value: string):
2707
2713
  else settings.fleet.limits.internalRunTimeoutMs = next;
2708
2714
  });
2709
2715
  return;
2716
+ case "context.toolResultMaxBytes":
2717
+ applyNonNegativeInteger(value, (next) => {
2718
+ if (next >= 4096) settings.context.toolResultMaxBytes = next;
2719
+ });
2720
+ return;
2710
2721
  case "context.workingSet.enabled":
2711
2722
  if (value === "true" || value === "false") settings.context.workingSet.enabled = value === "true";
2712
2723
  return;
@@ -27,6 +27,7 @@ import type { MuxContract, MuxPaneRecord } from "../domains/mux/index.js";
27
27
  import {
28
28
  PANES_PRESETS,
29
29
  type PanesCloseResult,
30
+ type PanesFilesResult,
30
31
  type PanesInventoryEntry,
31
32
  type PanesOpenResult,
32
33
  type PanesOperations,
@@ -36,6 +37,7 @@ import {
36
37
  type PanesYaziController,
37
38
  type PanesYaziStatus,
38
39
  type PanesZoomResult,
40
+ resolvePanesPresetId,
39
41
  } from "../domains/mux/operations.js";
40
42
  import { resolveBinary } from "../tools/executables.js";
41
43
  import { type PaneWatchSource, paneWatchDecision } from "./pane-policy.js";
@@ -54,7 +56,16 @@ export interface PanesRuntimeDeps {
54
56
  newestJournalRunId?: () => string | null;
55
57
  }
56
58
 
57
- const UNAVAILABLE = "the pane layer is not available in this session";
59
+ /**
60
+ * Why there is no pane layer, in the operator's terms. Detection already
61
+ * knows (no `HERDR_ENV`, no socket, a refused rung); repeating that reason
62
+ * beside the refusal is what turns "unavailable" into a next step, and the
63
+ * `--with-panes` hint covers the session that never asked for panes.
64
+ */
65
+ function unavailableReason(mux: MuxContract): string {
66
+ const reason = mux.detection().reason;
67
+ return `the pane layer is not available in this session: ${reason}. Start Clio inside a herdr session with \`clio-coder --with-panes\` to get panes`;
68
+ }
58
69
 
59
70
  /** Fuzzy operator addressing shared by `close` and `zoom`: id, label, purpose; newest first. */
60
71
  function matchOwnedPane(owned: ReadonlyArray<MuxPaneRecord>, target: string): MuxPaneRecord | null {
@@ -78,6 +89,27 @@ function inventory(records: ReadonlyArray<MuxPaneRecord>): ReadonlyArray<PanesIn
78
89
  }));
79
90
  }
80
91
 
92
+ /**
93
+ * The sentence `/quit` prints about the panes it did not close, or null when
94
+ * there are none.
95
+ *
96
+ * Policy (#272): docks close with the session and utility panes stay. A dock
97
+ * is a Clio surface (the files pane, the workers watch pane), so it goes the
98
+ * way a native application's windows go. A pane opened with `/panes open
99
+ * shell|logs|<argv>` is a terminal the operator may be typing in, and killing
100
+ * it on quit is the one thing a pane host must never do behind the operator's
101
+ * back. The next session does not adopt it either, so without this line the
102
+ * pane simply sat there with nothing naming it. Computed before the mux
103
+ * domain stops, because shutdown forgets its registry.
104
+ */
105
+ export function describePanesLeftBehind(mux: Pick<MuxContract, "list" | "docks">): string | null {
106
+ const dockIds = new Set(mux.docks().map((dock) => dock.paneId));
107
+ const left = mux.list().filter((record) => !dockIds.has(record.ref.paneId));
108
+ if (left.length === 0) return null;
109
+ const named = left.map((record) => `${record.label} (${record.ref.paneId})`).join(", ");
110
+ return `Clio left ${left.length} ${left.length === 1 ? "pane" : "panes"} open in herdr: ${named}. Utility panes stay when a session ends; the docks closed with it. Next time run \`/panes close all\` before \`/quit\` to take them with you, or close ${left.length === 1 ? "it" : "them"} now with \`herdr pane close <paneId>\`.`;
111
+ }
112
+
81
113
  export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
82
114
  const probe = deps.resolveBinaryPath ?? resolveBinary;
83
115
  const journalRoot = deps.journalRoot ?? runEventJournalRoot;
@@ -143,7 +175,7 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
143
175
  };
144
176
 
145
177
  const show = async (target: string, source: PaneWatchSource): Promise<PanesShowResult> => {
146
- if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
178
+ if (!deps.mux.available()) return { status: "unavailable", reason: unavailableReason(deps.mux) };
147
179
  const match = matchRun(target);
148
180
  if (match === null) {
149
181
  // The candidate list is what turns a miss into a next step: it names
@@ -164,7 +196,58 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
164
196
  return { status: "watching", runId: match.runId, agentId: match.agentId, opened: watched.opened };
165
197
  };
166
198
 
199
+ /**
200
+ * The files pane's open half, shared by `/files`, `/panes open files`, the
201
+ * keybinding, and the model tool. The settings gate and the missing-engine
202
+ * message live here so every door says the same thing.
203
+ */
204
+ const openFiles = async (once: boolean): Promise<Exclude<PanesFilesResult, { status: "closed" }>> => {
205
+ const preset = PANES_PRESETS[0];
206
+ if (!deps.getSettings().interface.panes.files.enabled) {
207
+ return { status: "refused", reason: "the files pane is disabled by interface.panes.files.enabled" };
208
+ }
209
+ if (!yaziController) {
210
+ return { status: "unavailable", reason: "the files pane return path is not ready" };
211
+ }
212
+ const pendingId = beginPendingOpen(preset.id);
213
+ try {
214
+ const result = await yaziController.open(once ? { once: true } : undefined);
215
+ if (result.status === "opened") {
216
+ return { status: "opened", paneId: result.paneId, existing: result.existing };
217
+ }
218
+ if (result.status === "missing-binary") {
219
+ return {
220
+ status: "missing-binary",
221
+ binary: result.binary,
222
+ installHint: preset.installHint,
223
+ // The engine's own resolution sentence, prefixed with the surface it
224
+ // serves: an operator who typed `/files` should not have to know the
225
+ // name of the program to read the answer.
226
+ detail: `the files pane engine is not available: ${result.detail}`,
227
+ };
228
+ }
229
+ return {
230
+ status: result.status === "profile-error" ? "refused" : "unavailable",
231
+ reason: result.reason,
232
+ };
233
+ } finally {
234
+ pendingOpens.delete(pendingId);
235
+ }
236
+ };
237
+
167
238
  return {
239
+ async files(action): Promise<PanesFilesResult> {
240
+ if (action === "close") {
241
+ await yaziController?.close();
242
+ return { status: "closed" };
243
+ }
244
+ if (action === "toggle" && yaziController?.isOpen()) {
245
+ await yaziController.close();
246
+ return { status: "closed" };
247
+ }
248
+ return openFiles(action === "pick");
249
+ },
250
+
168
251
  status(): PanesStatus {
169
252
  const detection = deps.mux.detection();
170
253
  const settings = deps.getSettings();
@@ -201,41 +284,31 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
201
284
  async open(request: { preset?: string; argv?: ReadonlyArray<string>; once?: boolean }): Promise<PanesOpenResult> {
202
285
  const cwd = deps.getCwd();
203
286
  if (request.preset !== undefined) {
204
- const preset = PANES_PRESETS.find((entry) => entry.id === request.preset);
287
+ const presetId = resolvePanesPresetId(request.preset);
288
+ const preset = presetId === null ? undefined : PANES_PRESETS.find((entry) => entry.id === presetId);
205
289
  if (!preset) {
206
290
  return { status: "refused", reason: `unknown preset: ${request.preset}` };
207
291
  }
208
- if (preset.id === "yazi") {
209
- if (!deps.getSettings().interface.panes.files.enabled) {
210
- return { status: "refused", reason: "the files pane is disabled by panes.yazi.enabled" };
211
- }
212
- if (!yaziController) {
213
- return { status: "unavailable", reason: "the files-pane return path is not ready" };
292
+ if (preset.id === "files") {
293
+ const result = await openFiles(request.once === true);
294
+ if (result.status === "opened") {
295
+ return { status: "opened", label: preset.id, paneId: result.paneId, existing: result.existing };
214
296
  }
215
- const pendingId = beginPendingOpen(preset.id);
216
- try {
217
- const result = await yaziController.open(request.once ? { once: true } : undefined);
218
- if (result.status === "opened") {
219
- return { status: "opened", label: preset.id, paneId: result.paneId };
220
- }
221
- if (result.status === "missing-binary") {
222
- return {
223
- status: "missing-binary",
224
- preset: preset.id,
225
- binary: result.binary,
226
- installHint: preset.installHint,
227
- detail: result.detail,
228
- };
229
- }
230
- return {
231
- status: result.status === "profile-error" ? "refused" : "unavailable",
232
- reason: result.reason,
233
- };
234
- } finally {
235
- pendingOpens.delete(pendingId);
297
+ if (result.status === "missing-binary") {
298
+ return { ...result, preset: preset.id };
236
299
  }
300
+ return result;
301
+ }
302
+ if (!deps.mux.available()) return { status: "unavailable", reason: unavailableReason(deps.mux) };
303
+ // One pane per preset. A second `/panes open shell` is a request to
304
+ // see the shell that is already there, not to split the screen again;
305
+ // the pane host is asked for focus so the operator lands in it.
306
+ const live = deps.mux.list().find((record) => record.purpose === "utility" && record.label === preset.id);
307
+ if (live) {
308
+ await deps.mux.unzoomSelf();
309
+ await deps.mux.focusPane(live.ref.paneId);
310
+ return { status: "opened", label: preset.id, paneId: live.ref.paneId, existing: true };
237
311
  }
238
- if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
239
312
  const binaryPath = probe(preset.binary);
240
313
  if (binaryPath === null) {
241
314
  return {
@@ -248,7 +321,10 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
248
321
  }
249
322
  const argv = presetArgv(preset.id, binaryPath);
250
323
  if (argv === null) {
251
- return { status: "refused", reason: `preset ${preset.id} has nothing to show yet` };
324
+ return {
325
+ status: "refused",
326
+ reason: `no dispatched run has written a journal under ${journalRoot()} yet; the logs pane follows the newest run once one starts`,
327
+ };
252
328
  }
253
329
  const pendingId = beginPendingOpen(preset.id);
254
330
  try {
@@ -259,7 +335,7 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
259
335
  pendingOpens.delete(pendingId);
260
336
  }
261
337
  }
262
- if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
338
+ if (!deps.mux.available()) return { status: "unavailable", reason: unavailableReason(deps.mux) };
263
339
  const argv = request.argv ?? [];
264
340
  if (argv.length === 0) return { status: "refused", reason: "nothing to run" };
265
341
  const label = argv[0] ?? "pane";
@@ -274,7 +350,7 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
274
350
  },
275
351
 
276
352
  async zoom(target: string): Promise<PanesZoomResult> {
277
- if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
353
+ if (!deps.mux.available()) return { status: "unavailable", reason: unavailableReason(deps.mux) };
278
354
  const match = matchOwnedPane(deps.mux.list(), target.trim().length === 0 ? "watch" : target);
279
355
  if (!match) return { status: "not-found", target: target.trim().length === 0 ? "watch" : target };
280
356
  const changed = await deps.mux.zoomPane(match.ref.paneId, "toggle");
@@ -285,7 +361,7 @@ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
285
361
  },
286
362
 
287
363
  async close(target: string): Promise<PanesCloseResult> {
288
- if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
364
+ if (!deps.mux.available()) return { status: "unavailable", reason: unavailableReason(deps.mux) };
289
365
  const owned = deps.mux.list();
290
366
  if (target === "all") {
291
367
  const labels: string[] = [];