@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
@@ -37,7 +37,7 @@ export interface OpenSideQuestionOverlayOptions {
37
37
  const SIDE_QUESTION_OVERLAY_MIN_WIDTH = 44;
38
38
  const SIDE_QUESTION_OVERLAY_MAX_WIDTH = 100;
39
39
 
40
- export function sideQuestionOverlayWidth(columns: number): number {
40
+ function sideQuestionOverlayWidth(columns: number): number {
41
41
  return Math.max(SIDE_QUESTION_OVERLAY_MIN_WIDTH, Math.min(SIDE_QUESTION_OVERLAY_MAX_WIDTH, columns - 4));
42
42
  }
43
43
 
@@ -46,7 +46,7 @@ export function sideQuestionOverlayWidth(columns: number): number {
46
46
  * the question in dim above a rule, then the answer, then one status line that
47
47
  * says whether the round is still running, cancelled, or failed.
48
48
  */
49
- export function formatSideQuestionBody(
49
+ function formatSideQuestionBody(
50
50
  question: string,
51
51
  phase: SideQuestionOverlayPhase,
52
52
  width: number,
@@ -112,6 +112,7 @@ export function openSideQuestionOverlay(tui: TUI, options: OpenSideQuestionOverl
112
112
  const handle = showClioOverlayFrame(tui, body, {
113
113
  anchor: "center",
114
114
  width: sideQuestionOverlayWidth(options.columns),
115
+ markerId: "side-question",
115
116
  title: SIDE_QUESTION_OVERLAY_TITLE,
116
117
  // Esc means two things here and the footer names the live one: it aborts a
117
118
  // round that is still streaming, and it closes one that has settled.
@@ -26,6 +26,7 @@ import type { NoticeLevel } from "../command-output.js";
26
26
  import { clioTheme, GLYPH } from "../theme/index.js";
27
27
  import type { LibraryInstallConfirmSubject } from "./library-install-confirm.js";
28
28
  import { openLibraryInstallConfirmOverlay } from "./library-install-confirm.js";
29
+ import { isLibraryTab, LIBRARY_TABS } from "./library-tabs.js";
29
30
  import { type ListOverlayItem, type ListOverlayTab, openListOverlay } from "./list-overlay.js";
30
31
 
31
32
  /**
@@ -53,23 +54,13 @@ const GROUP_DIAGNOSTICS = "Diagnostics";
53
54
  const GROUP_INSTALLED = "Installed";
54
55
  const GROUP_AVAILABLE = "Available";
55
56
 
56
- /** The hub's tabs, in the order ←/→ walks them. `skill` is the original view. */
57
- export const LIBRARY_TABS: ReadonlyArray<{ id: LibraryEntryKind; label: string }> = [
58
- { id: "skill", label: "Skills" },
59
- { id: "agent", label: "Agents" },
60
- { id: "prompt", label: "Prompts" },
61
- { id: "fleet", label: "Fleets" },
62
- ];
57
+ export { isLibraryTab, LIBRARY_TABS };
63
58
 
64
59
  export const SKILLS_HUB_TITLE = "Skills Hub";
65
60
 
66
61
  /** Row id prefix for a library row, which is how an action tells the tabs apart. */
67
62
  export const LIBRARY_ROW_PREFIX = "library:";
68
63
 
69
- export function isLibraryTab(value: string): value is LibraryEntryKind {
70
- return LIBRARY_TABS.some((tab) => tab.id === value);
71
- }
72
-
73
64
  /** @internal exported for contract tests */
74
65
  export const SKILLS_HUB_EMPTY =
75
66
  "no skills installed and no local marketplace configured. install one with `clio-coder skills install <path|github-url>`, or point CLIO_CODER_SKILL_CATALOG_DIR at a skills/ catalog.";
@@ -122,7 +113,7 @@ interface LibraryTabContext {
122
113
  * approval preview instead, so this returns null for one and the caller routes
123
114
  * it there.
124
115
  */
125
- export function libraryUseInvocation(entry: Pick<LibraryEntry, "kind" | "name">): string | null {
116
+ function libraryUseInvocation(entry: Pick<LibraryEntry, "kind" | "name">): string | null {
126
117
  if (entry.kind === "fleet") return null;
127
118
  if (entry.kind === "agent") return `/run ${entry.name} `;
128
119
  if (entry.kind === "prompt") return `/${entry.name} `;
@@ -157,7 +148,7 @@ function skillBody(content: string): string {
157
148
  }
158
149
 
159
150
  /** @internal exported for contract tests */
160
- export function buildInstalledItems(list: ResourceList<Skill>): ListOverlayItem[] {
151
+ function buildInstalledItems(list: ResourceList<Skill>): ListOverlayItem[] {
161
152
  return list.items.map((skill) => {
162
153
  const theme = clioTheme();
163
154
  const flagged = list.diagnostics.some((diag) => diagnosticTouchesSkill(diag.path, skill));
@@ -191,7 +182,7 @@ export function buildInstalledItems(list: ResourceList<Skill>): ListOverlayItem[
191
182
  }
192
183
 
193
184
  /** @internal exported for contract tests */
194
- export function buildMarketplaceItems(
185
+ function buildMarketplaceItems(
195
186
  skills: ReadonlyArray<MarketplaceSkill>,
196
187
  installed: ReadonlySet<string>,
197
188
  ): ListOverlayItem[] {
@@ -224,7 +215,7 @@ export function buildMarketplaceItems(
224
215
  }
225
216
 
226
217
  /** @internal exported for contract tests */
227
- export function buildDiagnosticItems(
218
+ function buildDiagnosticItems(
228
219
  list: ResourceList<Skill>,
229
220
  marketplaceDiagnostics: ReadonlyArray<string> = [],
230
221
  ): ListOverlayItem[] {
@@ -261,7 +252,7 @@ export function buildDiagnosticItems(
261
252
  }
262
253
 
263
254
  /** @internal exported for contract tests */
264
- export function libraryRowId(entry: Pick<LibraryEntry, "kind" | "name">): string {
255
+ function libraryRowId(entry: Pick<LibraryEntry, "kind" | "name">): string {
265
256
  return `${LIBRARY_ROW_PREFIX}${libraryEntryRef(entry)}`;
266
257
  }
267
258
 
@@ -276,7 +267,7 @@ export function libraryRowId(entry: Pick<LibraryEntry, "kind" | "name">): string
276
267
  *
277
268
  * @internal exported for contract tests
278
269
  */
279
- export function buildLibraryItems(kind: LibraryEntryKind, context: LibraryTabContext): ListOverlayItem[] {
270
+ function buildLibraryItems(kind: LibraryEntryKind, context: LibraryTabContext): ListOverlayItem[] {
280
271
  const theme = clioTheme();
281
272
  return context.discovery.entries
282
273
  .filter((entry) => entry.kind === kind)
@@ -327,7 +318,7 @@ export function buildLibraryItems(kind: LibraryEntryKind, context: LibraryTabCon
327
318
  *
328
319
  * @internal exported for contract tests
329
320
  */
330
- export function buildLibraryDiagnosticItems(discovery: LibraryDiscoveryResult): ListOverlayItem[] {
321
+ function buildLibraryDiagnosticItems(discovery: LibraryDiscoveryResult): ListOverlayItem[] {
331
322
  const theme = clioTheme();
332
323
  return discovery.diagnostics
333
324
  .filter((message) => message !== MARKETPLACE_UNCONFIGURED)
@@ -369,7 +360,7 @@ export interface LibraryInstallRunner {
369
360
  *
370
361
  * @internal exported for contract tests
371
362
  */
372
- export async function runLibraryInstall(
363
+ async function runLibraryInstall(
373
364
  entry: LibraryEntry,
374
365
  runner: LibraryInstallRunner,
375
366
  options: { withRequirements: boolean },
@@ -557,6 +548,7 @@ export function openSkillsHub(tui: TUI, deps: SkillsHubDeps): OverlayHandle {
557
548
  };
558
549
 
559
550
  handle = openListOverlay(tui, {
551
+ markerId: "skills-hub",
560
552
  title: SKILLS_HUB_TITLE,
561
553
  items: [],
562
554
  tabs,
@@ -100,7 +100,7 @@ function fallbackPreview(node: TreeSnapshotNode): string {
100
100
  * of turns and the discarded branch had no route back. Returns null for a
101
101
  * session that was not forked.
102
102
  */
103
- export function forkParentLine(snapshot: TreeSnapshot, theme: ClioTheme): string | null {
103
+ function forkParentLine(snapshot: TreeSnapshot, theme: ClioTheme): string | null {
104
104
  const parentSessionId = snapshot.meta.parentSessionId;
105
105
  if (typeof parentSessionId !== "string" || parentSessionId.length === 0) return null;
106
106
  const parentTurnId = snapshot.meta.parentTurnId;
@@ -155,7 +155,7 @@ function flattenTreeSnapshot(snapshot: TreeSnapshot): TreeRow[] {
155
155
  const ROW_PREVIEW_BUDGET = 55;
156
156
 
157
157
  /** @internal */
158
- export function formatTreeRow(row: TreeRow, opts: { showTimestamps: boolean; width: number }): string {
158
+ function formatTreeRow(row: TreeRow, opts: { showTimestamps: boolean; width: number }): string {
159
159
  const theme = clioTheme();
160
160
  const indent = " ".repeat(row.depth);
161
161
  // The active tip is where the next message lands; it gets its own glyph so
@@ -416,6 +416,7 @@ export function openTreeOverlay(tui: TUI, deps: OpenTreeOverlayDeps): OverlayHan
416
416
  return showClioOverlayFrame(tui, box, {
417
417
  anchor: "center",
418
418
  width: TREE_OVERLAY_WIDTH,
419
+ markerId: "tree",
419
420
  title: "Session Tree",
420
421
  footerHint: () => view.getHint(),
421
422
  });
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The one decision function for opening a run-watching pane.
3
+ *
4
+ * Policy, stated whole: panes are pulled by the operator, never pushed by the
5
+ * fleet. A dispatch starting, detaching, backgrounding, or failing opens
6
+ * nothing; the native surfaces (transcript, Alt+W board, footer) already carry
7
+ * that state, and the v0.3/v0.4 behavior of opening a hidden viewer pane per
8
+ * dispatch produced panes nobody had asked for. A pane opens only when the
9
+ * operator names a run: Enter in the workers view, `/panes show`, or the
10
+ * `panes` tool acting on the conversation's behalf.
11
+ *
12
+ * The `dispatch` source is the seam for ever marking a dispatch watchable at
13
+ * enqueue time. It exists so the decision stays in this one function; today it
14
+ * always refuses, and any future exception must be argued here, not in a
15
+ * config key.
16
+ *
17
+ * This module is a leaf on purpose: `panes-runtime.ts` is a boundaries seam
18
+ * whose value closure must stay off the render graph, so the policy cannot
19
+ * live beside the dispatch board that shares its status vocabulary.
20
+ */
21
+
22
+ export type PaneWatchSource = "workers-view" | "slash" | "tool" | "dispatch";
23
+
24
+ /** Statuses with a live process behind them, in the dispatch board's vocabulary. */
25
+ const WATCHABLE_STATUSES = new Set(["running", "stale", "cancelling", "enqueued", "retrying"]);
26
+
27
+ export interface PaneWatchRequest {
28
+ source: PaneWatchSource;
29
+ /** The run's lifecycle status; anything unrecognized reads as terminal. */
30
+ runStatus: string;
31
+ }
32
+
33
+ export type PaneWatchDecision = { open: true } | { open: false; reason: string };
34
+
35
+ export function paneWatchDecision(request: PaneWatchRequest): PaneWatchDecision {
36
+ if (request.source === "dispatch") {
37
+ return { open: false, reason: "dispatches run headless; watch a run from the workers view or /panes show" };
38
+ }
39
+ if (!WATCHABLE_STATUSES.has(request.runStatus)) {
40
+ return {
41
+ open: false,
42
+ reason: `run is ${request.runStatus}; use \`clio-coder fleet view <runId>\` for the post-mortem`,
43
+ };
44
+ }
45
+ return { open: true };
46
+ }
@@ -0,0 +1,318 @@
1
+ /**
2
+ * The one implementation of `PanesOperations`, shared by `/panes` and the
3
+ * `panes` orchestrator tool.
4
+ *
5
+ * Two rules run through it. Presets probe their binary through the toolchain
6
+ * ladder *before* the pane is split: `openUtilityPane` delivers its command by
7
+ * sending `exec <argv>` into the pane's shell, so a binary that is not there
8
+ * kills the pane the instant it appears, and the operator sees a flicker
9
+ * instead of an install hint (phase 1 report, open question 3). And every
10
+ * mutation is scoped to panes Clio created, because the contract's registry
11
+ * refuses anything else.
12
+ *
13
+ * `show` targets running dispatches, not panes: it resolves a fuzzy agent id
14
+ * or run-id prefix against the live dispatch snapshot and points the shared
15
+ * watch pane at the match, under the one policy decision in
16
+ * `pane-policy.ts`. There is no per-run pane inventory to search any more.
17
+ */
18
+
19
+ import type { ClioSettings } from "../core/config.js";
20
+ import type { DispatchSnapshot } from "../domains/dispatch/contract.js";
21
+ import {
22
+ newestRunEventJournalRunId,
23
+ runEventJournalPath,
24
+ runEventJournalRoot,
25
+ } from "../domains/dispatch/run-event-journal.js";
26
+ import type { MuxContract, MuxPaneRecord } from "../domains/mux/index.js";
27
+ import {
28
+ PANES_PRESETS,
29
+ type PanesCloseResult,
30
+ type PanesInventoryEntry,
31
+ type PanesOpenResult,
32
+ type PanesOperations,
33
+ type PanesShowResult,
34
+ type PanesStatus,
35
+ type PanesWatchController,
36
+ type PanesYaziController,
37
+ type PanesYaziStatus,
38
+ type PanesZoomResult,
39
+ } from "../domains/mux/operations.js";
40
+ import { resolveBinary } from "../tools/executables.js";
41
+ import { type PaneWatchSource, paneWatchDecision } from "./pane-policy.js";
42
+
43
+ export interface PanesRuntimeDeps {
44
+ mux: MuxContract;
45
+ getSettings: () => Readonly<ClioSettings>;
46
+ /** Live dispatch state, used to turn a fuzzy agent id into a run id. */
47
+ getDispatchSnapshot: () => DispatchSnapshot;
48
+ getCwd: () => string;
49
+ /** Injection seam for tests; production uses the toolchain ladder. */
50
+ resolveBinaryPath?: (name: string) => string | null;
51
+ /** Journal root override for tests. */
52
+ journalRoot?: () => string;
53
+ /** Newest run whose journal exists, for the `logs` preset. */
54
+ newestJournalRunId?: () => string | null;
55
+ }
56
+
57
+ const UNAVAILABLE = "the pane layer is not available in this session";
58
+
59
+ /** Fuzzy operator addressing shared by `close` and `zoom`: id, label, purpose; newest first. */
60
+ function matchOwnedPane(owned: ReadonlyArray<MuxPaneRecord>, target: string): MuxPaneRecord | null {
61
+ const needle = target.trim().toLowerCase();
62
+ const newestFirst = [...owned].reverse();
63
+ return (
64
+ newestFirst.find((record) => record.ref.paneId.toLowerCase() === needle) ??
65
+ newestFirst.find((record) => record.label.toLowerCase().includes(needle)) ??
66
+ newestFirst.find((record) => record.purpose === needle) ??
67
+ null
68
+ );
69
+ }
70
+
71
+ function inventory(records: ReadonlyArray<MuxPaneRecord>): ReadonlyArray<PanesInventoryEntry> {
72
+ return records.map((record) => ({
73
+ paneId: record.ref.paneId,
74
+ tabId: record.ref.tabId,
75
+ purpose: record.purpose,
76
+ label: record.label,
77
+ adopted: record.adopted === true,
78
+ }));
79
+ }
80
+
81
+ export function createPanesRuntime(deps: PanesRuntimeDeps): PanesOperations {
82
+ const probe = deps.resolveBinaryPath ?? resolveBinary;
83
+ const journalRoot = deps.journalRoot ?? runEventJournalRoot;
84
+ let yaziController: PanesYaziController | null = null;
85
+ let watchController: PanesWatchController | null = null;
86
+ let nextPendingOpen = 0;
87
+ const pendingOpens = new Map<string, PanesInventoryEntry>();
88
+ const beginPendingOpen = (label: string): string => {
89
+ nextPendingOpen += 1;
90
+ const id = `pending:${nextPendingOpen}`;
91
+ pendingOpens.set(id, {
92
+ paneId: id,
93
+ tabId: "pending",
94
+ purpose: "utility",
95
+ label,
96
+ adopted: false,
97
+ pending: true,
98
+ });
99
+ return id;
100
+ };
101
+ const closedYaziStatus = (): PanesYaziStatus => ({
102
+ mode: "closed",
103
+ paneId: null,
104
+ paneCwd: null,
105
+ lastLineAt: null,
106
+ droppedLines: 0,
107
+ });
108
+
109
+ /**
110
+ * Resolve one operator- or model-supplied target to a live dispatched run.
111
+ *
112
+ * Fuzzy agent id first, then runId prefix, most recent run winning: "the
113
+ * tester" is what an operator types; a run id is what a tool call carries.
114
+ * Retrying runs count as live; the watch pane shows them coming back.
115
+ */
116
+ const matchRun = (target: string): { runId: string; agentId: string; status: string } | null => {
117
+ const needle = target.trim().toLowerCase();
118
+ if (needle.length === 0) return null;
119
+ const snapshot = deps.getDispatchSnapshot();
120
+ const live = [
121
+ ...snapshot.running.map((run) => ({ runId: run.runId, agentId: run.agentId, status: "running" })),
122
+ ...snapshot.retrying.map((run) => ({ runId: run.runId, agentId: run.agentId, status: "retrying" })),
123
+ ];
124
+ // Newest first, so "the tester" means the tester the operator just started.
125
+ const newestFirst = [...live].reverse();
126
+ const byAgent = newestFirst.find((run) => run.agentId.toLowerCase().includes(needle));
127
+ if (byAgent) return byAgent;
128
+ return newestFirst.find((run) => run.runId.toLowerCase().startsWith(needle)) ?? null;
129
+ };
130
+
131
+ /** argv for one preset, once its binary has been found. */
132
+ const presetArgv = (presetId: string, binaryPath: string): ReadonlyArray<string> | null => {
133
+ if (presetId === "shell") return [binaryPath, "-l"];
134
+ if (presetId === "logs") {
135
+ const runId = (deps.newestJournalRunId ?? (() => newestRunEventJournalRunId(journalRoot())))();
136
+ if (runId === null) return null;
137
+ // `-F` rather than `-f`: the journal is recreated when its run's
138
+ // directory is pruned, and a viewer following an inode would silently
139
+ // stop at that point.
140
+ return [binaryPath, "-n", "200", "-F", runEventJournalPath(runId, journalRoot())];
141
+ }
142
+ return null;
143
+ };
144
+
145
+ const show = async (target: string, source: PaneWatchSource): Promise<PanesShowResult> => {
146
+ if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
147
+ const match = matchRun(target);
148
+ if (match === null) {
149
+ // The candidate list is what turns a miss into a next step: it names
150
+ // the runs that are actually live right now.
151
+ const snapshot = deps.getDispatchSnapshot();
152
+ const candidates = [
153
+ ...new Set([...snapshot.running.map((run) => run.agentId), ...snapshot.retrying.map((run) => run.agentId)]),
154
+ ];
155
+ return { status: "not-found", target, candidates };
156
+ }
157
+ const decision = paneWatchDecision({ source, runStatus: match.status });
158
+ if (!decision.open) return { status: "refused", reason: decision.reason };
159
+ if (watchController === null) {
160
+ return { status: "unavailable", reason: "the watch pane is not wired in this session" };
161
+ }
162
+ const watched = await watchController.watch(match.runId);
163
+ if (watched.status !== "watching") return { status: "unavailable", reason: watched.reason };
164
+ return { status: "watching", runId: match.runId, agentId: match.agentId, opened: watched.opened };
165
+ };
166
+
167
+ return {
168
+ status(): PanesStatus {
169
+ const detection = deps.mux.detection();
170
+ const settings = deps.getSettings();
171
+ const panes = settings.interface.panes;
172
+ return {
173
+ mode: deps.mux.mode,
174
+ available: deps.mux.available(),
175
+ reason: detection.reason,
176
+ socketPath: detection.socketPath,
177
+ server: detection.server,
178
+ settings: {
179
+ enabled: panes.enabled,
180
+ notifications: panes.notifications,
181
+ layout: panes.layout,
182
+ journal: settings.fleet.history.journal,
183
+ yazi: { ...panes.files },
184
+ },
185
+ yazi: yaziController?.status() ?? closedYaziStatus(),
186
+ docks: deps.mux.docks().map((dock) => ({
187
+ slot: dock.slot,
188
+ paneId: dock.paneId,
189
+ targetShare: dock.targetShare,
190
+ })),
191
+ panes: [...inventory(deps.mux.list()), ...pendingOpens.values()],
192
+ };
193
+ },
194
+
195
+ show(target: string): Promise<PanesShowResult> {
196
+ // The slash command and the tool share this implementation; the policy
197
+ // treats both as operator pull, so the source only matters for logs.
198
+ return show(target, "slash");
199
+ },
200
+
201
+ async open(request: { preset?: string; argv?: ReadonlyArray<string>; once?: boolean }): Promise<PanesOpenResult> {
202
+ const cwd = deps.getCwd();
203
+ if (request.preset !== undefined) {
204
+ const preset = PANES_PRESETS.find((entry) => entry.id === request.preset);
205
+ if (!preset) {
206
+ return { status: "refused", reason: `unknown preset: ${request.preset}` };
207
+ }
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" };
214
+ }
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);
236
+ }
237
+ }
238
+ if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
239
+ const binaryPath = probe(preset.binary);
240
+ if (binaryPath === null) {
241
+ return {
242
+ status: "missing-binary",
243
+ preset: preset.id,
244
+ binary: preset.binary,
245
+ installHint: preset.installHint,
246
+ detail: `${preset.binary} was not found (install with \`${preset.installHint}\`)`,
247
+ };
248
+ }
249
+ const argv = presetArgv(preset.id, binaryPath);
250
+ if (argv === null) {
251
+ return { status: "refused", reason: `preset ${preset.id} has nothing to show yet` };
252
+ }
253
+ const pendingId = beginPendingOpen(preset.id);
254
+ try {
255
+ const ref = await deps.mux.openUtilityPane({ argv, cwd, label: preset.id });
256
+ if (ref === null) return { status: "unavailable", reason: `pane host refused to open ${preset.id}` };
257
+ return { status: "opened", label: preset.id, paneId: ref.paneId };
258
+ } finally {
259
+ pendingOpens.delete(pendingId);
260
+ }
261
+ }
262
+ if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
263
+ const argv = request.argv ?? [];
264
+ if (argv.length === 0) return { status: "refused", reason: "nothing to run" };
265
+ const label = argv[0] ?? "pane";
266
+ const pendingId = beginPendingOpen(label);
267
+ try {
268
+ const ref = await deps.mux.openUtilityPane({ argv, cwd, label });
269
+ if (ref === null) return { status: "unavailable", reason: `pane host refused to open ${label}` };
270
+ return { status: "opened", label, paneId: ref.paneId };
271
+ } finally {
272
+ pendingOpens.delete(pendingId);
273
+ }
274
+ },
275
+
276
+ async zoom(target: string): Promise<PanesZoomResult> {
277
+ if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
278
+ const match = matchOwnedPane(deps.mux.list(), target.trim().length === 0 ? "watch" : target);
279
+ if (!match) return { status: "not-found", target: target.trim().length === 0 ? "watch" : target };
280
+ const changed = await deps.mux.zoomPane(match.ref.paneId, "toggle");
281
+ if (!changed) {
282
+ return { status: "unavailable", reason: "the pane host does not support zoom (protocol below pane.zoom)" };
283
+ }
284
+ return { status: "zoomed", paneId: match.ref.paneId, label: match.label };
285
+ },
286
+
287
+ async close(target: string): Promise<PanesCloseResult> {
288
+ if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
289
+ const owned = deps.mux.list();
290
+ if (target === "all") {
291
+ const labels: string[] = [];
292
+ // Snapshot first: closing mutates the registry the list came from.
293
+ for (const record of [...owned]) {
294
+ if (await deps.mux.closePane(record.ref.paneId)) labels.push(record.label);
295
+ }
296
+ return { status: "closed", closed: labels.length, labels };
297
+ }
298
+ const match = matchOwnedPane(owned, target);
299
+ if (!match) return { status: "not-found", target };
300
+ const closed = await deps.mux.closePane(match.ref.paneId);
301
+ return closed ? { status: "closed", closed: 1, labels: [match.label] } : { status: "not-found", target };
302
+ },
303
+
304
+ attachYazi(controller: PanesYaziController): () => void {
305
+ yaziController = controller;
306
+ return () => {
307
+ if (yaziController === controller) yaziController = null;
308
+ };
309
+ },
310
+
311
+ attachWatch(controller: PanesWatchController): () => void {
312
+ watchController = controller;
313
+ return () => {
314
+ if (watchController === controller) watchController = null;
315
+ };
316
+ },
317
+ };
318
+ }
@@ -203,7 +203,7 @@ function wrapArtifactLine(value: string, max: number): string[] {
203
203
  return lines;
204
204
  }
205
205
 
206
- export function permissionDecisionPresentation(view: ApprovalRequestView): DecisionPresentation {
206
+ function permissionDecisionPresentation(view: ApprovalRequestView): DecisionPresentation {
207
207
  return classifyDecisionPresentation(
208
208
  decisionFactsForPermission({
209
209
  tool: view.tool,
@@ -307,7 +307,7 @@ function permissionInspectionLines(
307
307
  * 80-column one saw the command being authorized end mid-argument, both with
308
308
  * nothing marking the cut.
309
309
  */
310
- export function permissionOverlayLines(view: ApprovalRequestView, width: number): string[] {
310
+ function permissionOverlayLines(view: ApprovalRequestView, width: number): string[] {
311
311
  const content = Math.max(8, Math.floor(width));
312
312
  const presentation = permissionDecisionPresentation(view);
313
313
  // The parked call is awaiting a decision, not blocked: the raw rejection
@@ -49,6 +49,35 @@ export function renderCompactionSummaryLine(input: CompactionSummaryLineInput):
49
49
  return `[context engine] llm_summary: ${input.messagesSummarized} messages summarized to ${input.summaryChars} chars; ~${input.tokensBefore} tokens before${tail}`;
50
50
  }
51
51
 
52
+ /** Why the non-destructive stage had nothing to do before a summary ran. */
53
+ export type EvictionSkipReason = "all-protected" | "nothing-evictable" | "disabled";
54
+
55
+ export interface EvictionSkipLineInput {
56
+ reason: EvictionSkipReason;
57
+ /** Turn starts in the visible slice the policy was offered. */
58
+ turns: number;
59
+ protectLastTurns: number;
60
+ policyId: string;
61
+ }
62
+
63
+ /**
64
+ * One line saying the working-set stage was considered and declined, in the
65
+ * same `[context engine] working set:` voice its eviction notice uses. Without
66
+ * it a short session falls from the pressure threshold straight into the
67
+ * destructive summary with nothing in the transcript explaining why the cheap
68
+ * stage did not run (smoke pass 2, G1).
69
+ */
70
+ export function renderEvictionSkipLine(input: EvictionSkipLineInput): string {
71
+ const turnWord = input.turns === 1 ? "turn" : "turns";
72
+ const cause =
73
+ input.reason === "disabled"
74
+ ? "eviction is off (context.workingSet.enabled false)"
75
+ : input.reason === "all-protected"
76
+ ? `nothing evictable, all ${input.turns} ${turnWord} are inside the protected window (protectLastTurns ${input.protectLastTurns})`
77
+ : `nothing evictable by ${input.policyId} above the protected window (protectLastTurns ${input.protectLastTurns})`;
78
+ return `[context engine] working set: ${cause}; llm_summary runs instead`;
79
+ }
80
+
52
81
  export interface RenderCompactionSummaryOptions {
53
82
  /** Override the default markdown theme. Defaults to the local theme above. */
54
83
  theme?: MarkdownTheme;
@@ -1,13 +1,21 @@
1
1
  import type { RetryStatusPayload } from "../chat-loop.js";
2
2
  import { styleTaggedNotice } from "./notice.js";
3
3
 
4
- function shorten(value: string, limit: number): string {
5
- if (value.length <= limit) return value;
6
- return `${value.slice(0, Math.max(0, limit - 3))}...`;
4
+ const RETRY_ERROR_MAX_CHARS = 2_000;
5
+ const RETRY_ERROR_TRUNCATION_MARKER = "… [retry error truncated]";
6
+
7
+ function boundedRetryError(value: string): string {
8
+ const characters = Array.from(value);
9
+ if (characters.length <= RETRY_ERROR_MAX_CHARS) return value;
10
+ return `${characters.slice(0, RETRY_ERROR_MAX_CHARS).join("").trimEnd()}${RETRY_ERROR_TRUNCATION_MARKER}`;
7
11
  }
8
12
 
9
13
  function rawRetryStatus(status: RetryStatusPayload): string {
10
- const suffix = status.errorMessage ? `: ${shorten(status.errorMessage, 120)}` : "";
14
+ // Both live and replay renderers wrap this notice to their terminal width, so
15
+ // ordinary errors keep their complete remedy. Raw provider failures can also
16
+ // be an HTML proxy page, though; keep a generous ceiling so one retry does not
17
+ // turn that page into hundreds of transcript rows.
18
+ const suffix = status.errorMessage ? `: ${boundedRetryError(status.errorMessage)}` : "";
11
19
  if (status.phase === "waiting") {
12
20
  return `[retry] attempt ${status.attempt}/${status.maxAttempts} in ${status.seconds ?? 0}s${suffix}`;
13
21
  }
@@ -426,7 +426,7 @@ function ledgerTail(finished: ToolExecutionFinished): { facts: string; offload:
426
426
  if (details?.timedOut === true) parts.push("timed out");
427
427
  if (details?.outputCapped === true) parts.push("output capped");
428
428
  }
429
- if (finished.excludeFromContext === true) parts.push("excluded from context");
429
+ if (finished.excludeFromContext === true) parts.push("not sent to model");
430
430
  if (finished.evictedReason !== undefined) parts.push("evicted", finished.evictedReason);
431
431
  const offloadPath = executed ? offloadPathOf(finished) : null;
432
432
  return {
@@ -994,7 +994,7 @@ function toolUsageFact(result: unknown): string | null {
994
994
  function outputFacts(finished: ToolExecutionFinished): string[] {
995
995
  const parts: string[] = [];
996
996
  if (isNonExecutedOutcome(finished.outcome)) {
997
- if (finished.excludeFromContext === true) parts.push("excluded from context");
997
+ if (finished.excludeFromContext === true) parts.push("not sent to model");
998
998
  return parts;
999
999
  }
1000
1000
  const exitCode = structuredExitCode(finished) ?? (finished.toolName === "bash" && !finished.isError ? "0" : null);
@@ -1024,7 +1024,7 @@ function outputFacts(finished: ToolExecutionFinished): string[] {
1024
1024
  if (added.length > 0) parts.push(`added ${added.join(", ")}`);
1025
1025
  }
1026
1026
  if (isPlainObject(finished.result) && finished.result.terminate === true) parts.push("terminal result");
1027
- if (finished.excludeFromContext === true) parts.push("excluded from context");
1027
+ if (finished.excludeFromContext === true) parts.push("not sent to model");
1028
1028
  if (finished.evictedReason !== undefined) parts.push("evicted", finished.evictedReason);
1029
1029
  return parts;
1030
1030
  }
@@ -1379,7 +1379,7 @@ export function renderBashTranscriptExecution(
1379
1379
  const shownBytes = Buffer.byteLength(execution.output, "utf8");
1380
1380
  const totalBytes = execution.totalBytes ?? shownBytes;
1381
1381
  const args: Record<string, unknown> = { command: execution.command };
1382
- if (execution.excludeFromContext === true) args.context = "excluded from model context";
1382
+ if (execution.excludeFromContext === true) args.context = "not sent to model";
1383
1383
  const details = {
1384
1384
  resultSize: {
1385
1385
  bytes: totalBytes,