@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
@@ -18,7 +18,13 @@ import {
18
18
  } from "../../engine/tui.js";
19
19
  import type { AskUserAnswer, AskUserQuestion, AskUserResult } from "../../tools/ask-user.js";
20
20
  import { ASK_USER_OTHER_LABEL, cancelledAskUserResult } from "../../tools/ask-user.js";
21
- import { buildHint, DEFAULT_SELECT_THEME, type HintEntry, showClioOverlayFrame } from "../overlay-frame.js";
21
+ import {
22
+ buildHint,
23
+ DEFAULT_SELECT_THEME,
24
+ type HintEntry,
25
+ type OverlayEscVerb,
26
+ showClioOverlayFrame,
27
+ } from "../overlay-frame.js";
22
28
  import { type ClioToken, clioTheme, dotSep, GLYPH, screenTitle } from "../theme/index.js";
23
29
  import { nextContentScrollOffset, type ViewScrollAction } from "../view/view-overlay.js";
24
30
 
@@ -91,6 +97,8 @@ const MIN_VISIBLE_OPTIONS = 3;
91
97
  /** Interview rows spent on chrome before an option row: strip, header, blanks, status, one question row. */
92
98
  const INTERVIEW_CHROME_ROWS = 7;
93
99
  const MAX_VISIBLE_OPTIONS = 12;
100
+ /** Below this the second column is too narrow to wrap a sentence into. */
101
+ const MIN_DESCRIPTION_COLUMN = 28;
94
102
  const ELLIPSIS = "…";
95
103
 
96
104
  /**
@@ -102,7 +110,7 @@ const ELLIPSIS = "…";
102
110
  * should not take the screen. A round that follows an answered one has captured
103
111
  * answers to keep on screen, which is the full surface's whole job.
104
112
  */
105
- export function askUserSurface(questions: ReadonlyArray<AskUserQuestion>, priorRounds = 0): AskUserSurface {
113
+ function askUserSurface(questions: ReadonlyArray<AskUserQuestion>, priorRounds = 0): AskUserSurface {
106
114
  if (priorRounds > 0 || questions.length !== 1) return "interview";
107
115
  const question = questions[0];
108
116
  if (!question) return "interview";
@@ -237,6 +245,16 @@ function fitLine(text: string, width: number): string {
237
245
  return truncateToWidth(text, safeWidth, ELLIPSIS, true);
238
246
  }
239
247
 
248
+ /** Wrap a prose value inside the columns left by its one-time row label. */
249
+ function wrapLabeledValue(prefix: string, value: string, width: number): string[] {
250
+ const safeWidth = Math.max(1, width);
251
+ const prefixWidth = visibleWidth(prefix);
252
+ const valueWidth = Math.max(1, safeWidth - prefixWidth);
253
+ return wrapTextWithAnsi(value, valueWidth).map((line, index) =>
254
+ fitLine(`${index === 0 ? prefix : " ".repeat(prefixWidth)}${line}`, safeWidth),
255
+ );
256
+ }
257
+
240
258
  function compactTitle(question: AskUserQuestion): string {
241
259
  return (question.header ?? question.question).replace(/\s+/g, " ").trim();
242
260
  }
@@ -390,7 +408,8 @@ class AskUserOverlayView implements Component {
390
408
 
391
409
  this.contentOverflows = false;
392
410
  const controlLines = this.renderControlLines(safeWidth);
393
- const statusLines = this.status.length > 0 ? ["", fitLine(clioTheme().fg("dim", this.status), safeWidth)] : [];
411
+ const statusLines =
412
+ this.status.length > 0 ? ["", ...wrapTextWithAnsi(clioTheme().fg("dim", this.status), safeWidth)] : [];
394
413
  const headerLine = this.renderQuestionHeader(question, safeWidth);
395
414
  const headerLines = headerLine.length > 0 ? [headerLine] : [];
396
415
  const bottom = [...statusLines, "", ...controlLines];
@@ -418,7 +437,7 @@ class AskUserOverlayView implements Component {
418
437
  private renderInterview(question: AskUserQuestion, width: number, maxRows: number): string[] {
419
438
  const theme = clioTheme();
420
439
  const controlLines = this.renderControlLines(width);
421
- const statusLines = this.status.length > 0 ? ["", fitLine(theme.fg("dim", this.status), width)] : [];
440
+ const statusLines = this.status.length > 0 ? ["", ...wrapTextWithAnsi(theme.fg("dim", this.status), width)] : [];
422
441
  const headerLine = this.renderQuestionHeader(question, width);
423
442
  const headerLines = headerLine.length > 0 ? [headerLine] : [];
424
443
  const stripLines = [this.renderQuestionStrip(width), ""];
@@ -511,16 +530,24 @@ class AskUserOverlayView implements Component {
511
530
  this.presentation.requiredActions.find((action) => action.id === "record-answer")?.label.toLowerCase() ??
512
531
  "record answer";
513
532
  if (state.mode === "text") {
533
+ // Esc means two different things depending on what is behind the field.
534
+ // A question with options has a list to fall back to, so the key goes
535
+ // back; a question without one has nothing behind it and the key still
536
+ // leaves the interview. The footer says which one this is.
537
+ const escapeVerb: OverlayEscVerb = questionHasOptions(question) ? "back" : "close";
514
538
  return this.questions.length > 1
515
- ? this.withScrollHint([
516
- { key: "Enter", verb: recordAnswer },
517
- { key: "Alt+Left/Right", verb: "question" },
518
- ])
519
- : this.withScrollHint([{ key: "Enter", verb: recordAnswer }]);
539
+ ? this.withScrollHint(
540
+ [
541
+ { key: "Enter", verb: recordAnswer },
542
+ { key: "Alt+Left/Right", verb: "question" },
543
+ ],
544
+ escapeVerb,
545
+ )
546
+ : this.withScrollHint([{ key: "Enter", verb: recordAnswer }], escapeVerb);
520
547
  }
521
548
  // The classified action label distinguishes recording an answer from
522
- // granting authority. Esc keeps the product's one word for the way out,
523
- // since it closes the prompt and the interview together.
549
+ // granting authority. Esc on the option list is the way out of the whole
550
+ // interview, which is the one place the product spells `close`.
524
551
  // `t` is on every select footer because the operator cannot tell from a
525
552
  // label whether the option needs a figure attached until they read it.
526
553
  const addText: HintEntry = { key: "t", verb: "add text", short: "text" };
@@ -558,9 +585,9 @@ class AskUserOverlayView implements Component {
558
585
  * scroll. A footer that always advertised PgUp would be advertising a key that
559
586
  * does nothing on most rounds.
560
587
  */
561
- private withScrollHint(entries: ReadonlyArray<HintEntry>): string {
562
- if (this.surface !== "interview" || !this.contentOverflows) return buildHint(entries);
563
- return buildHint([...entries, { key: "PgUp/PgDn", verb: "scroll" }]);
588
+ private withScrollHint(entries: ReadonlyArray<HintEntry>, esc: OverlayEscVerb = "close"): string {
589
+ if (this.surface !== "interview" || !this.contentOverflows) return buildHint(entries, esc);
590
+ return buildHint([...entries, { key: "PgUp/PgDn", verb: "scroll" }], esc);
564
591
  }
565
592
 
566
593
  private setSurface(next: AskUserSurface): void {
@@ -590,11 +617,14 @@ class AskUserOverlayView implements Component {
590
617
  const lines = [
591
618
  screenTitle(theme, "Interview"),
592
619
  "",
593
- theme.fg(
594
- "muted",
595
- this.history.length > 0
596
- ? "Answer sent. Waiting for Clio to prepare the next interview question."
597
- : "Waiting for Clio to prepare the interview.",
620
+ ...wrapTextWithAnsi(
621
+ theme.fg(
622
+ "muted",
623
+ this.history.length > 0
624
+ ? "Answer sent. Waiting for Clio to prepare the next interview question."
625
+ : "Waiting for Clio to prepare the interview.",
626
+ ),
627
+ width,
598
628
  ),
599
629
  ];
600
630
  if (this.history.length > 0) {
@@ -602,7 +632,7 @@ class AskUserOverlayView implements Component {
602
632
  for (let index = 0; index < this.history.length; index += 1) {
603
633
  const answer = this.history[index];
604
634
  if (!answer) continue;
605
- lines.push(fitLine(`${theme.fg("dim", `${index + 1}.`)} ${theme.fg("muted", answer.answer)}`, width));
635
+ lines.push(...wrapLabeledValue(`${theme.fg("dim", `${index + 1}.`)} `, theme.fg("muted", answer.answer), width));
606
636
  }
607
637
  }
608
638
  return lines.map((line) => fitLine(line, width)).slice(0, maxRows);
@@ -751,7 +781,7 @@ class AskUserOverlayView implements Component {
751
781
  for (let index = 0; index < this.history.length; index += 1) {
752
782
  const answer = this.history[index];
753
783
  if (!answer) continue;
754
- rows.push(fitLine(`${theme.fg("dim", `${index + 1}.`)} ${theme.fg("muted", answer.answer)}`, width));
784
+ rows.push(...wrapLabeledValue(`${theme.fg("dim", `${index + 1}.`)} `, theme.fg("muted", answer.answer), width));
755
785
  }
756
786
  // A round of one question needs no per-question roll: the strip already
757
787
  // names the round and the question is on screen above this.
@@ -759,7 +789,7 @@ class AskUserOverlayView implements Component {
759
789
  for (let index = 0; index < this.questions.length; index += 1) {
760
790
  const answer = this.states[index]?.answer.trim();
761
791
  const value = answer && answer.length > 0 ? theme.fg("muted", answer) : theme.fg("dim", "pending");
762
- rows.push(fitLine(`${theme.fg("dim", `Q${index + 1}`)} ${value}`, width));
792
+ rows.push(...wrapLabeledValue(`${theme.fg("dim", `Q${index + 1}`)} `, value, width));
763
793
  }
764
794
  }
765
795
  if (rows.length === 0) return [];
@@ -784,17 +814,29 @@ class AskUserOverlayView implements Component {
784
814
  0,
785
815
  items.findIndex((item) => item.value === selectedItem.value),
786
816
  );
787
- const visibleCount = Math.min(this.maxVisibleOptions(), Math.max(1, items.length));
817
+ const primaryColumnWidth = this.primaryColumnWidth(items, width);
818
+ const acceptKey = question.multi_select === true ? "Space" : "Enter";
819
+ // The focused option's description wraps in full, so the rows it needs come
820
+ // out of the list rather than out of the sentence. Options the operator
821
+ // cannot currently read are what a windowed list is for, and one arrow key
822
+ // brings any of them back; a cut explanation has no such recovery.
823
+ const focusedRows = this.renderOptionRow(
824
+ items[selectedIndex] as SelectItem,
825
+ true,
826
+ width,
827
+ primaryColumnWidth,
828
+ acceptKey,
829
+ ).length;
830
+ const budget = Math.max(1, this.maxVisibleOptions() - (focusedRows - 1));
831
+ const visibleCount = Math.min(budget, Math.max(1, items.length));
788
832
  const start = Math.max(0, Math.min(selectedIndex - Math.floor(visibleCount / 2), items.length - visibleCount));
789
833
  const end = Math.min(items.length, start + visibleCount);
790
- const primaryColumnWidth = this.primaryColumnWidth(items, width);
791
834
  const lines: string[] = [];
792
835
 
793
- const acceptKey = question.multi_select === true ? "Space" : "Enter";
794
836
  for (let index = start; index < end; index += 1) {
795
837
  const item = items[index];
796
838
  if (!item) continue;
797
- lines.push(this.renderOptionRow(item, index === selectedIndex, width, primaryColumnWidth, acceptKey));
839
+ lines.push(...this.renderOptionRow(item, index === selectedIndex, width, primaryColumnWidth, acceptKey));
798
840
  }
799
841
 
800
842
  if (start > 0 || end < items.length) {
@@ -809,13 +851,22 @@ class AskUserOverlayView implements Component {
809
851
  return Math.max(1, Math.min(bounded, Math.max(1, width - 4)));
810
852
  }
811
853
 
854
+ /**
855
+ * One option, as the rows it needs.
856
+ *
857
+ * The focused option's description wraps under its own column and is never
858
+ * cut: a description is what the operator is choosing between, and half of
859
+ * one reads as the whole thing. An unfocused row stays a one-line table cell
860
+ * whose ellipsis says there is more, which the operator reads by moving to
861
+ * it.
862
+ */
812
863
  private renderOptionRow(
813
864
  item: SelectItem,
814
865
  selected: boolean,
815
866
  width: number,
816
867
  primaryColumnWidth: number,
817
868
  acceptKey: string,
818
- ): string {
869
+ ): string[] {
819
870
  const theme = clioTheme();
820
871
  const prefix = selected ? theme.fg("accent", `${GLYPH.cursor} `) : " ";
821
872
  // The key that answers rides on the focused row. An operator whose eyes are
@@ -825,22 +876,40 @@ class AskUserOverlayView implements Component {
825
876
  const available = Math.max(1, width - 2 - visibleWidth(affordance));
826
877
  const description = item.description?.replace(/[\r\n]+/g, " ").trim();
827
878
 
828
- let body: string;
829
- if (description && width > 40) {
830
- const labelWidth = Math.max(1, Math.min(primaryColumnWidth - 2, available - 4));
831
- const label = truncateToWidth(item.label, labelWidth, ELLIPSIS, false);
832
- const spacing = " ".repeat(Math.max(1, primaryColumnWidth - visibleWidth(label)));
833
- const descriptionWidth = Math.max(1, available - visibleWidth(label) - visibleWidth(spacing));
834
- const desc = truncateToWidth(description, descriptionWidth, ELLIPSIS, false);
835
- body = selected
836
- ? theme.style("accent", `${label}${spacing}${desc}`, { bold: true })
837
- : `${label}${theme.fg("muted", `${spacing}${desc}`)}`;
838
- } else {
879
+ if (!description || width <= 40) {
839
880
  const label = truncateToWidth(item.label, available, ELLIPSIS, false);
840
- body = selected ? theme.style("accent", label, { bold: true }) : label;
881
+ const body = selected ? theme.style("accent", label, { bold: true }) : label;
882
+ return [fitLine(`${prefix}${body}${affordance}`, width)];
841
883
  }
842
884
 
843
- return fitLine(`${prefix}${body}${affordance}`, width);
885
+ const labelWidth = Math.max(1, Math.min(primaryColumnWidth - 2, available - 4));
886
+ const label = truncateToWidth(item.label, labelWidth, ELLIPSIS, false);
887
+ const spacing = " ".repeat(Math.max(1, primaryColumnWidth - visibleWidth(label)));
888
+ const descriptionWidth = Math.max(1, available - visibleWidth(label) - visibleWidth(spacing));
889
+ if (!selected) {
890
+ const desc = truncateToWidth(description, descriptionWidth, ELLIPSIS, false);
891
+ return [fitLine(`${prefix}${label}${theme.fg("muted", `${spacing}${desc}`)}`, width)];
892
+ }
893
+ // A gutter this narrow wraps a sentence into slivers and breaks words, so
894
+ // below the floor the description drops to its own full-width lines under
895
+ // the label instead of squeezing into the second column.
896
+ if (descriptionWidth < MIN_DESCRIPTION_COLUMN) {
897
+ const indent = " ";
898
+ const body = theme.style("accent", label, { bold: true });
899
+ return [
900
+ fitLine(`${prefix}${body}${affordance}`, width),
901
+ ...wrapTextWithAnsi(description, Math.max(1, width - indent.length)).map((line) =>
902
+ fitLine(`${indent}${theme.style("accent", line, { bold: true })}`, width),
903
+ ),
904
+ ];
905
+ }
906
+ const wrapped = wrapTextWithAnsi(description, descriptionWidth);
907
+ const head = wrapped[0] ?? "";
908
+ const indent = " ".repeat(visibleWidth(prefix) + visibleWidth(label) + visibleWidth(spacing));
909
+ return [
910
+ fitLine(`${prefix}${theme.style("accent", `${label}${spacing}${head}`, { bold: true })}${affordance}`, width),
911
+ ...wrapped.slice(1).map((line) => fitLine(`${indent}${theme.style("accent", line, { bold: true })}`, width)),
912
+ ];
844
913
  }
845
914
 
846
915
  private ensureControl(): void {
@@ -889,7 +958,7 @@ class AskUserOverlayView implements Component {
889
958
  state.answer = questionHasOptions(question) ? answerText(question, state.selected, state.customAnswer) : answer;
890
959
  this.finishIfCompleteOrAdvance();
891
960
  };
892
- activeInput.onEscape = () => this.cancel();
961
+ activeInput.onEscape = () => this.escapeFromTextInput(question, state);
893
962
  this.input = activeInput;
894
963
  this.list = null;
895
964
  }
@@ -960,6 +1029,53 @@ class AskUserOverlayView implements Component {
960
1029
  return 0;
961
1030
  }
962
1031
 
1032
+ /**
1033
+ * Esc in the text field.
1034
+ *
1035
+ * The field used to resolve the whole round as cancelled, which made a typed
1036
+ * draft unrecoverable: a single-question round had no other question to answer
1037
+ * first, so the only way off `t` was to abandon the interview (issue #260). A
1038
+ * question with options has a surface behind the field, so Esc goes back to it
1039
+ * and drops the draft. A question with no options has nothing behind it, so Esc
1040
+ * keeps its old meaning and leaves the interview; the footer says which.
1041
+ *
1042
+ * The draft is dropped rather than parked because Esc is the discard gesture.
1043
+ * It never reached `answer`, `options`, or `value` in the first place, since
1044
+ * only a submit writes those, so #228's clearing rule holds either way.
1045
+ */
1046
+ private escapeFromTextInput(question: AskUserQuestion, state: QuestionState): void {
1047
+ if (!questionHasOptions(question)) {
1048
+ this.cancel();
1049
+ return;
1050
+ }
1051
+ state.inputValue = "";
1052
+ state.mode = "select";
1053
+ this.status = "";
1054
+ this.rebuildSelectList(question, state);
1055
+ this.deps.requestRender();
1056
+ }
1057
+
1058
+ /**
1059
+ * Leave a question the operator is walking away from on its option list.
1060
+ *
1061
+ * The mode used to belong to the question for the rest of the round, so a
1062
+ * question opened with `t` came back as a prefilled field however the operator
1063
+ * returned to it, and the option list was gone for good. Navigating away is not
1064
+ * the discard gesture, so the draft stays in `inputValue` and `t` finds it
1065
+ * again; what does not survive is the field being the thing that greets them.
1066
+ *
1067
+ * A question whose value was actually submitted keeps its field, because
1068
+ * coming back to a recorded figure is how it gets revised (issue #228).
1069
+ */
1070
+ private parkTextMode(): void {
1071
+ const question = this.currentQuestion();
1072
+ const state = this.currentState();
1073
+ if (!question || !state) return;
1074
+ if (state.mode !== "text" || !questionHasOptions(question)) return;
1075
+ if (state.rawValue.length > 0) return;
1076
+ state.mode = "select";
1077
+ }
1078
+
963
1079
  private openTextInput(nextStatus: string): void {
964
1080
  const state = this.currentState();
965
1081
  const question = this.currentQuestion();
@@ -1077,6 +1193,7 @@ class AskUserOverlayView implements Component {
1077
1193
  private goToRelativeQuestion(delta: -1 | 1): void {
1078
1194
  if (this.questions.length <= 1) return;
1079
1195
  this.syncActiveControl();
1196
+ this.parkTextMode();
1080
1197
  this.index = (this.index + delta + this.questions.length) % this.questions.length;
1081
1198
  this.status = "";
1082
1199
  this.resetContentScroll();
@@ -1128,6 +1245,9 @@ export function openAskUserOverlay(tui: TUI, deps: OpenAskUserOverlayDeps): AskU
1128
1245
  // the terminal has left after the margins.
1129
1246
  ...(geometry.maxInnerRows > 0 ? { maxHeight: geometry.maxInnerRows + ASK_USER_FRAME_ROWS } : {}),
1130
1247
  margin: geometry.margin,
1248
+ // Not derived from the title: this modal swaps between a waiting title
1249
+ // and a classified decision title without ever changing hands.
1250
+ markerId: "ask-user",
1131
1251
  title: () => (view.isDecisionPending() ? view.decisionTitle() : ASK_USER_WAITING_TITLE),
1132
1252
  tone: () => (view.isDecisionPending() ? view.decisionTone() : undefined),
1133
1253
  footerHint: () => view.footerHint(),
@@ -211,6 +211,7 @@ export function openAuthDialog(tui: TUI, title: string, onCancel: () => void): A
211
211
  const handle = showClioOverlayFrame(tui, box, {
212
212
  anchor: "center",
213
213
  width: AUTH_DIALOG_WIDTH,
214
+ markerId: "auth",
214
215
  title: "Authentication",
215
216
  footerHint: getHint,
216
217
  });
@@ -1,4 +1,5 @@
1
1
  import {
2
+ type Component,
2
3
  type OverlayHandle,
3
4
  type SelectItem,
4
5
  SelectList,
@@ -6,6 +7,7 @@ import {
6
7
  type TUI,
7
8
  truncateToWidth,
8
9
  visibleWidth,
10
+ wrapTextWithAnsi,
9
11
  } from "../../engine/tui.js";
10
12
  import { buildHint, DEFAULT_SELECT_THEME, FocusBox, showClioOverlayFrame } from "../overlay-frame.js";
11
13
  import type { ContextClearCommandOptions } from "../slash-commands.js";
@@ -29,7 +31,7 @@ export function contextResetOptions(choice: ContextResetMutationChoice): Context
29
31
  }
30
32
 
31
33
  /** Three intentional outcomes, ordered with the least destructive action first. */
32
- export function buildContextResetItems(): SelectItem[] {
34
+ function buildContextResetItems(): SelectItem[] {
33
35
  return [
34
36
  {
35
37
  value: "preserve-clio-md",
@@ -67,6 +69,10 @@ function buildSelectPresentation(items: ReadonlyArray<SelectItem>): {
67
69
  truncatePrimary: ({ text, maxWidth, item, isSelected }) => {
68
70
  const label = singleLine(text);
69
71
  const description = descriptions.get(item.value) ?? "";
72
+ // The focused description is rendered in full below the list. Keeping
73
+ // only its label here prevents the same explanation appearing once cut
74
+ // and once wrapped on the same decision surface.
75
+ if (isSelected) return truncateToWidth(label, maxWidth, ELLIPSIS, true);
70
76
  if (description.length === 0 || maxWidth < 44) {
71
77
  return truncateToWidth(label, maxWidth, ELLIPSIS, true);
72
78
  }
@@ -76,13 +82,31 @@ function buildSelectPresentation(items: ReadonlyArray<SelectItem>): {
76
82
  const spacing = " ".repeat(Math.max(1, labelWidth + 2 - visibleWidth(fittedLabel)));
77
83
  const descriptionWidth = Math.max(1, maxWidth - visibleWidth(fittedLabel) - visibleWidth(spacing));
78
84
  const fittedDescription = truncateToWidth(description, descriptionWidth, ELLIPSIS, true);
79
- const body = `${fittedLabel}${spacing}${fittedDescription}`;
80
- return isSelected ? body : `${fittedLabel}${clioTheme().fg("muted", `${spacing}${fittedDescription}`)}`;
85
+ return `${fittedLabel}${clioTheme().fg("muted", `${spacing}${fittedDescription}`)}`;
81
86
  },
82
87
  },
83
88
  };
84
89
  }
85
90
 
91
+ function describedSelect(list: SelectList, choices: ReadonlyArray<SelectItem>): Component {
92
+ return {
93
+ render(width: number): string[] {
94
+ const rows = list.render(width);
95
+ const selected = list.getSelectedItem();
96
+ const description = choices.find((choice) => choice.value === selected?.value)?.description;
97
+ if (!description) return rows;
98
+ const indent = " ";
99
+ const wrapped = wrapTextWithAnsi(
100
+ clioTheme().fg("muted", singleLine(description)),
101
+ Math.max(1, width - visibleWidth(indent)),
102
+ ).map((line) => `${indent}${line}`);
103
+ return [...rows, ...wrapped];
104
+ },
105
+ handleInput: (data: string) => list.handleInput(data),
106
+ invalidate: () => list.invalidate(),
107
+ };
108
+ }
109
+
86
110
  /** Open the `/context reset` choice dialog. Cancel paths never reach onReset. */
87
111
  export function openContextResetOverlay(tui: TUI, deps: OpenContextResetOverlayDeps): OverlayHandle {
88
112
  const choices = buildContextResetItems();
@@ -99,9 +123,10 @@ export function openContextResetOverlay(tui: TUI, deps: OpenContextResetOverlayD
99
123
  deps.onCancel();
100
124
  };
101
125
 
102
- return showClioOverlayFrame(tui, new FocusBox(list), {
126
+ return showClioOverlayFrame(tui, new FocusBox(describedSelect(list, choices)), {
103
127
  anchor: "center",
104
128
  width: CONTEXT_RESET_OVERLAY_WIDTH,
129
+ markerId: "context-reset",
105
130
  title: "Reset Project Context",
106
131
  footerHint: buildHint([{ key: "Enter", verb: "select" }]),
107
132
  });
@@ -11,6 +11,7 @@
11
11
  */
12
12
 
13
13
  import {
14
+ type Component,
14
15
  type OverlayHandle,
15
16
  type SelectItem,
16
17
  SelectList,
@@ -18,6 +19,7 @@ import {
18
19
  type TUI,
19
20
  truncateToWidth,
20
21
  visibleWidth,
22
+ wrapTextWithAnsi,
21
23
  } from "../../engine/tui.js";
22
24
  import { buildHint, DEFAULT_SELECT_THEME, FocusBox, showClioOverlayFrame } from "../overlay-frame.js";
23
25
  import { clioTheme } from "../theme/index.js";
@@ -69,6 +71,10 @@ function buildSelectPresentation(items: ReadonlyArray<SelectItem>): {
69
71
  truncatePrimary: ({ text, maxWidth, item, isSelected }) => {
70
72
  const label = singleLine(text);
71
73
  const description = descriptions.get(item.value) ?? "";
74
+ // The selected explanation is the recovery decision the operator is
75
+ // reading, so it renders in full beneath the list instead of appearing
76
+ // here as an ellipsized fragment.
77
+ if (isSelected) return truncateToWidth(label, maxWidth, ELLIPSIS, true);
72
78
  if (description.length === 0 || maxWidth < 32) {
73
79
  return truncateToWidth(label, maxWidth, ELLIPSIS, true);
74
80
  }
@@ -80,18 +86,36 @@ function buildSelectPresentation(items: ReadonlyArray<SelectItem>): {
80
86
  const spacing = " ".repeat(Math.max(1, labelWidth + 2 - visibleWidth(fittedLabel)));
81
87
  const descWidth = Math.max(1, maxWidth - visibleWidth(fittedLabel) - visibleWidth(spacing));
82
88
  const fittedDescription = truncateToWidth(description, descWidth, ELLIPSIS, true);
83
- const body = `${fittedLabel}${spacing}${fittedDescription}`;
84
- return isSelected ? body : `${fittedLabel}${theme.fg("muted", `${spacing}${fittedDescription}`)}`;
89
+ return `${fittedLabel}${theme.fg("muted", `${spacing}${fittedDescription}`)}`;
85
90
  },
86
91
  },
87
92
  };
88
93
  }
89
94
 
95
+ function describedSelect(list: SelectList, choices: ReadonlyArray<SelectItem>): Component {
96
+ return {
97
+ render(width: number): string[] {
98
+ const rows = list.render(width);
99
+ const selected = list.getSelectedItem();
100
+ const description = choices.find((choice) => choice.value === selected?.value)?.description;
101
+ if (!description) return rows;
102
+ const indent = " ";
103
+ const wrapped = wrapTextWithAnsi(
104
+ clioTheme().fg("muted", singleLine(description)),
105
+ Math.max(1, width - visibleWidth(indent)),
106
+ ).map((line) => `${indent}${line}`);
107
+ return [...rows, ...wrapped];
108
+ },
109
+ handleInput: (data: string) => list.handleInput(data),
110
+ invalidate: () => list.invalidate(),
111
+ };
112
+ }
113
+
90
114
  /**
91
115
  * Pure builder. Exposed so tests can assert row shape without booting the TUI.
92
116
  * Two rows: Continue (uses process cwd) and Cancel (returns to picker).
93
117
  */
94
- export function buildCwdFallbackItems(args: {
118
+ function buildCwdFallbackItems(args: {
95
119
  currentCwd: string;
96
120
  sessionCwd: string;
97
121
  reason: CwdFallbackReason;
@@ -131,10 +155,11 @@ export function openCwdFallbackOverlay(tui: TUI, deps: OpenCwdFallbackOverlayDep
131
155
  deps.onCancel();
132
156
  deps.onClose();
133
157
  };
134
- const box = new FocusBox(list);
158
+ const box = new FocusBox(describedSelect(list, items));
135
159
  return showClioOverlayFrame(tui, box, {
136
160
  anchor: "center",
137
161
  width: CWD_FALLBACK_OVERLAY_WIDTH,
162
+ markerId: "cwd-fallback",
138
163
  title: "Session Working Directory",
139
164
  footerHint: buildHint([{ key: "Enter", verb: "select" }]),
140
165
  });
@@ -94,27 +94,26 @@ function decisionLines(decision: DecisionRecord, selected: boolean, expanded: bo
94
94
  const label = decision.status === "superseded" ? theme.fg("dim", labelText) : theme.fg("muted", labelText);
95
95
  const value = decision.status === "superseded" ? theme.fg("dim", decision.value) : decision.value;
96
96
  const lines = [fitLine(`${cursor} ${status} ${label}${theme.fg("dim", ":")} ${value}`, width)];
97
+ // The indent belongs to the container, so this text wraps inside what is left
98
+ // of the row. Wrapping to the full width and then indenting cost every line
99
+ // its last six columns to a cut that landed mid-sentence.
100
+ const indent = " ";
101
+ const indented = Math.max(1, width - indent.length);
102
+ const wrapIndented = (text: string): string[] =>
103
+ wrapTextWithAnsi(text, indented).map((line) => fitLine(`${indent}${line}`, width));
97
104
  if (decision.status === "superseded" && decision.correction) {
98
- lines.push(fitLine(` ${theme.fg("dim", "correction")} ${theme.fg("muted", decision.correction)}`, width));
105
+ lines.push(...wrapIndented(`${theme.fg("dim", "correction")} ${theme.fg("muted", decision.correction)}`));
99
106
  }
100
107
  if (selected && expanded) {
101
108
  if (decision.source_question) {
102
- lines.push(
103
- ...wrapTextWithAnsi(`${theme.fg("dim", "question")} ${theme.fg("muted", decision.source_question)}`, width).map(
104
- (line) => fitLine(` ${line}`, width),
105
- ),
106
- );
109
+ lines.push(...wrapIndented(`${theme.fg("dim", "question")} ${theme.fg("muted", decision.source_question)}`));
107
110
  }
108
- lines.push(
109
- ...wrapTextWithAnsi(`${theme.fg("dim", "answer")} ${theme.fg("muted", decision.value)}`, width).map((line) =>
110
- fitLine(` ${line}`, width),
111
- ),
112
- );
111
+ lines.push(...wrapIndented(`${theme.fg("dim", "answer")} ${theme.fg("muted", decision.value)}`));
113
112
  }
114
113
  return lines;
115
114
  }
116
115
 
117
- export function formatDecisionsOverlayBodyLines(
116
+ function formatDecisionsOverlayBodyLines(
118
117
  interviews: ReadonlyArray<DecisionLedgerEntry>,
119
118
  selectedIndex = 0,
120
119
  expandedKey: string | null = null,
@@ -184,7 +183,9 @@ class DecisionsOverlayBody implements Component {
184
183
  ),
185
184
  );
186
185
  }
187
- if (this.status) body.push("", fitLine(clioTheme().fg("warning", this.status), width));
186
+ if (this.status) {
187
+ body.push("", ...wrapTextWithAnsi(clioTheme().fg("warning", this.status), Math.max(1, width)));
188
+ }
188
189
  return body;
189
190
  }
190
191
 
@@ -296,6 +297,7 @@ export function openDecisionsOverlay(
296
297
  return showClioOverlayFrame(tui, body, {
297
298
  anchor: "center",
298
299
  width: DECISIONS_OVERLAY_WIDTH,
300
+ markerId: "decisions",
299
301
  title: () => "Decisions",
300
302
  footerHint: () => body.footerHint(),
301
303
  });
@@ -45,6 +45,7 @@ export function openExtensionsOverlay(tui: TUI, ctx: SlashCommandContext, onClos
45
45
  });
46
46
 
47
47
  return openListOverlay(tui, {
48
+ markerId: "extensions",
48
49
  title: "Extensions Reference",
49
50
  items,
50
51
  filterable: true,
@@ -51,14 +51,14 @@ export interface OpenFleetRunApprovalOverlayOptions {
51
51
  }
52
52
 
53
53
  /** The declared boundary as one phrase: an empty allowlist is a claim, not an absence. */
54
- export function formatWriteBoundary(writes: ReadonlyArray<string> | undefined): string {
54
+ function formatWriteBoundary(writes: ReadonlyArray<string> | undefined): string {
55
55
  if (writes === undefined) return "writes unenforced";
56
56
  if (writes.length === 0) return "writes nothing";
57
57
  return `writes ${writes.join(", ")}`;
58
58
  }
59
59
 
60
60
  /** One step as its facts: kind, who runs it, where, its scope, and its boundary. */
61
- export function formatFleetRunPreviewStep(step: FleetRunPreviewStep): string {
61
+ function formatFleetRunPreviewStep(step: FleetRunPreviewStep): string {
62
62
  const loop = step.loop === undefined ? "" : ` (${step.loop.loopId} ${step.loop.role} ${step.loop.attempt})`;
63
63
  if (step.kind === "code") {
64
64
  const gate = step.gate === undefined ? "" : ` · gate path ${step.gate.path}`;
@@ -95,7 +95,7 @@ function formatBudgetLine(preview: FleetRunPreview): string {
95
95
  * Render the body. Waves in order, each step with its facts, then the argv a
96
96
  * code step will actually run, and last the budget the run is admitted under.
97
97
  */
98
- export function formatFleetRunApprovalBody(subject: FleetRunApprovalSubject, width: number, scroll: number): string[] {
98
+ function formatFleetRunApprovalBody(subject: FleetRunApprovalSubject, width: number, scroll: number): string[] {
99
99
  const theme = clioTheme();
100
100
  const contentWidth = Math.max(1, Math.floor(width));
101
101
  const rows: string[] = [];
@@ -191,6 +191,7 @@ export function openFleetRunApprovalOverlay(tui: TUI, options: OpenFleetRunAppro
191
191
  const handle = showClioOverlayFrame(tui, focus, {
192
192
  anchor: "center",
193
193
  width: fleetRunApprovalOverlayWidth(options.columns),
194
+ markerId: "fleet-run-approval",
194
195
  title: FLEET_RUN_APPROVAL_OVERLAY_TITLE,
195
196
  footerHint: buildResponsiveHint(
196
197
  [...(acceptable ? [{ key: "Enter", verb: "dispatch" }] : []), { key: "↑↓", verb: "scroll" }],
@@ -27,7 +27,7 @@ const HANDOFF_REVIEW_MAX_WIDTH = 100;
27
27
  /** Rows of document shown at once. Anything longer scrolls. */
28
28
  export const HANDOFF_REVIEW_VISIBLE_ROWS = 20;
29
29
 
30
- export function handoffReviewOverlayWidth(columns: number): number {
30
+ function handoffReviewOverlayWidth(columns: number): number {
31
31
  return Math.max(HANDOFF_REVIEW_MIN_WIDTH, Math.min(HANDOFF_REVIEW_MAX_WIDTH, columns - 4));
32
32
  }
33
33
 
@@ -57,7 +57,7 @@ export interface HandoffReviewOverlaySession extends OverlayHandle {
57
57
  * Render the body. Pure so the layout is testable without a TUI: the goal, a
58
58
  * rule, then the scrolled document window.
59
59
  */
60
- export function formatHandoffReviewBody(goal: string, document: string, width: number, scroll: number): string[] {
60
+ function formatHandoffReviewBody(goal: string, document: string, width: number, scroll: number): string[] {
61
61
  const theme = clioTheme();
62
62
  const contentWidth = Math.max(1, Math.floor(width));
63
63
  const lines: string[] = [];
@@ -163,6 +163,7 @@ export function openHandoffReviewOverlay(
163
163
  const handle = showClioOverlayFrame(tui, focus, {
164
164
  anchor: "center",
165
165
  width: handoffReviewOverlayWidth(options.columns),
166
+ markerId: "handoff-review",
166
167
  title: HANDOFF_REVIEW_OVERLAY_TITLE,
167
168
  footerHint: buildResponsiveHint(
168
169
  [
@@ -94,6 +94,7 @@ export function openHelpOverlay(
94
94
  detail: () => [
95
95
  "# Fleet runs & steering",
96
96
  "**Fleet Runs board**: open it with the configured Dispatch Board key (Alt+W by default). Use Up/Down or `j`/`k` to select a live or recent run.",
97
+ "**Enter**: on a live run in a `--with-panes` session, Enter opens (or retargets) the watch pane beside Clio, rendering that run's stream; the arrow keys then move it between runs. On a finished run, or without panes, Enter toggles the inline worker-progress detail instead.",
97
98
  "**Steer**: press `s` on a live native run to close the board and prefill `@<runId> `. Add guidance and submit it normally. The first notice means queued; a received notice confirms worker delivery.",
98
99
  "**Cancel**: press `x` on a running, stale, queued, or retry-waiting run. The row changes to cancelling while the worker or retry is being stopped.",
99
100
  "**Capabilities**: ACP delegation runs cannot accept live steering. The board footer only advertises actions supported by the selected row.",
@@ -140,6 +141,7 @@ export function openHelpOverlay(
140
141
  const items = [...commands, ...keys, ...topics];
141
142
 
142
143
  return openListOverlay(tui, {
144
+ markerId: "help",
143
145
  title: "Help Center",
144
146
  items,
145
147
  filterable: true,