@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
@@ -70,7 +70,7 @@ const KEEP_ALIVE_INTERVAL_MS = 1 << 30;
70
70
  * before the keep-alive anchor. Keeping that seam explicit prevents an
71
71
  * extraction from silently changing initialization order.
72
72
  */
73
- export function createInteractiveShell<TTerminal extends Terminal, TTui extends InteractiveShellTui>(
73
+ function createInteractiveShell<TTerminal extends Terminal, TTui extends InteractiveShellTui>(
74
74
  deps: InteractiveShellDeps<TTerminal, TTui>,
75
75
  ): InteractiveShell<TTerminal, TTui> {
76
76
  const terminal = deps.createTerminal();
@@ -175,7 +175,7 @@ export function getActiveRenderTrace(): RenderTrace | null {
175
175
  * model state. After the finite pre-render bound, exactly one caller-supplied
176
176
  * final frame is still issued; a post-render drain wait is likewise bounded.
177
177
  */
178
- export async function settleLatestInteractiveFrame(
178
+ async function settleLatestInteractiveFrame(
179
179
  gate: Pick<StdoutBackpressureGate, "whenWritable"> | null,
180
180
  timeoutMs: number,
181
181
  renderFrame: () => Promise<number>,
@@ -9,6 +9,7 @@ import type { AgentsContract } from "../domains/agents/contract.js";
9
9
  import type { DispatchContract } from "../domains/dispatch/contract.js";
10
10
  import { agentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
11
11
  import type { ExtensionsContract } from "../domains/extensions/index.js";
12
+ import type { PanesOperations } from "../domains/mux/operations.js";
12
13
  import {
13
14
  type ProvidersContract,
14
15
  type ResolvedThinkingCapability,
@@ -36,7 +37,7 @@ import { runOperatorRecall } from "./context-recall-command.js";
36
37
  import { renderSessionHtml } from "./export-html/index.js";
37
38
  import { dateLocal } from "./format-time.js";
38
39
  import type { OracleDigestSources } from "./oracle.js";
39
- import type { SettingsCenterRowId, SettingsSectionId } from "./overlays/settings.js";
40
+ import type { PendingModelScope } from "./overlays/model-scope.js";
40
41
  import {
41
42
  type ContextClearCommandOptions,
42
43
  type CouncilDispatchOutcome,
@@ -44,11 +45,12 @@ import {
44
45
  type InitCommandOptions,
45
46
  parseSlashCommand,
46
47
  type RunIo,
48
+ type SettingsAreaId,
47
49
  type SlashCommandContext,
48
50
  type SlashCommandDispatchResult,
49
51
  type TaskMemorySeedCommandResult,
50
52
  } from "./slash-commands.js";
51
- import { verifyReceiptFile } from "./view/artifacts.js";
53
+ import { verifyReceiptFileReport } from "./view/artifacts.js";
52
54
  import type { WorkerEntryState } from "./worker-stream.js";
53
55
 
54
56
  const EXPORT_RENDER_WIDTH = 100;
@@ -89,8 +91,8 @@ export interface InteractiveSlashRuntimeDeps {
89
91
  * making a value permanent stays the Settings overlay's explicit choice.
90
92
  */
91
93
  commitSetting?: (id: string, next: ClioSettings, scope: "session" | "global") => void;
92
- onSelectModel?: (ref: { target: string; model: string }) => void;
93
- onSetThinkingLevel?: (level: ThinkingLevel) => void;
94
+ onSelectModel?: (ref: { target: string; model: string }, scope: "session" | "global") => void;
95
+ onSetThinkingLevel?: (level: ThinkingLevel, scope?: "session" | "global") => void;
94
96
  onCompact?: (instructions: string | undefined) => Promise<void>;
95
97
  onInit?: (options: InitCommandOptions, io?: RunIo) => Promise<void>;
96
98
  onContextClear?: (options: ContextClearCommandOptions) => Promise<void>;
@@ -135,8 +137,16 @@ export interface InteractiveSlashRuntimeDeps {
135
137
  openMemory: () => void;
136
138
  seedTaskMemory?: () => TaskMemorySeedCommandResult;
137
139
  openView: (filter?: string) => void;
140
+ /** Pane-layer operations behind `/panes`. Absent when the mux resolved to `none`. */
141
+ panes?: PanesOperations;
138
142
  openModel: () => void;
139
- openSettings: (section?: SettingsSectionId, rowId?: SettingsCenterRowId) => void;
143
+ /**
144
+ * Ask where a resolved `/model <pattern>` swap lands before anything applies.
145
+ * Absent on a host with no overlay layer, where the swap stays session-scoped.
146
+ */
147
+ openModelScope?: (ref: PendingModelScope) => void;
148
+ openSettings: (area?: SettingsAreaId, group?: string) => void;
149
+ openFleetRuns?: () => void;
140
150
  openResume: () => void;
141
151
  startNewSession: () => void;
142
152
  openTree: () => void;
@@ -165,11 +175,7 @@ export interface InteractiveSlashRuntime {
165
175
  }
166
176
 
167
177
  /** Owns slash-command context construction and its asynchronous command state. */
168
- const OUTPUT_VERBOSITIES: ReadonlyArray<ClioSettings["terminal"]["outputVerbosity"]> = [
169
- "minimal",
170
- "default",
171
- "verbose",
172
- ];
178
+ const OUTPUT_VERBOSITIES: ReadonlyArray<ClioSettings["interface"]["outputDetail"]> = ["minimal", "default", "verbose"];
173
179
 
174
180
  /** Thinking capability of the active orchestrator target and model, or null when unresolved. */
175
181
  export function resolveThinkingCapability(
@@ -178,9 +184,9 @@ export function resolveThinkingCapability(
178
184
  ): ResolvedThinkingCapability | null {
179
185
  const resolved = resolveModelRuntimeCapabilitiesForProviders(
180
186
  providers,
181
- settings.orchestrator.target,
182
- settings.orchestrator.model,
183
- settings.orchestrator.thinkingLevel ?? "off",
187
+ settings.chat.target,
188
+ settings.chat.model,
189
+ settings.chat.thinkingLevel ?? "off",
184
190
  );
185
191
  return resolved?.thinking ?? null;
186
192
  }
@@ -200,6 +206,7 @@ export function resolveAvailableThinkingLevels(
200
206
  export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps): InteractiveSlashRuntime {
201
207
  let activeContextInit = false;
202
208
  let latestAdmission: Promise<void> = Promise.resolve();
209
+ let latestLocalOperation: Promise<void> = Promise.resolve();
203
210
  let activeAdmissionSignal: AbortSignal | undefined;
204
211
  const cwd = (): string => deps.getCwd?.() ?? process.cwd();
205
212
  const resources = deps.resources;
@@ -360,7 +367,8 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
360
367
  deps.requestRender();
361
368
  }
362
369
  };
363
- const context: SlashCommandContext = {
370
+ let context: SlashCommandContext;
371
+ context = {
364
372
  io: deps.io,
365
373
  notice: appendCommandNotice,
366
374
  echoOperatorCommand: (text) => {
@@ -382,7 +390,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
382
390
  openSkillsHub: deps.openSkillsHub,
383
391
  listExtensions: () => deps.extensions?.list(cwd(), { all: true }) ?? [],
384
392
  listAgents: () => deps.agents?.listSpecs().filter((spec) => spec.audience !== "internal") ?? [],
385
- listDelegationAgents: () => deps.getSettings?.().delegation.agents ?? [],
393
+ listDelegationAgents: () => deps.getSettings?.().integrations.externalAgents.entries ?? [],
386
394
  exportShareArchive: (outPath) => {
387
395
  if (!deps.share) throw new Error("share domain is not loaded");
388
396
  const path = resolve(outPath);
@@ -413,7 +421,8 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
413
421
  oracleBriefing: oracleBriefingSources,
414
422
  startHandoff: deps.startHandoff,
415
423
  ...(deps.startFleetRun ? { startFleetRun: deps.startFleetRun } : {}),
416
- ...(deps.getSettings ? { getWorkerRosters: () => deps.getSettings?.().workers.rosters ?? {} } : {}),
424
+ ...(deps.openFleetRuns ? { openFleetRuns: deps.openFleetRuns } : {}),
425
+ ...(deps.getSettings ? { getWorkerRosters: () => deps.getSettings?.().fleet.rosters ?? {} } : {}),
417
426
  ...(deps.runCouncilDispatch ? { runCouncilDispatch: deps.runCouncilDispatch } : {}),
418
427
  openContextView: deps.openContextView,
419
428
  openTasks: deps.openTasks,
@@ -436,6 +445,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
436
445
  return result;
437
446
  },
438
447
  openView: deps.openView,
448
+ ...(deps.panes ? { panes: deps.panes } : {}),
439
449
  setThinkingLevel: (level) => {
440
450
  const settings = deps.getSettings?.();
441
451
  if (!settings || !deps.onSetThinkingLevel) return { status: "unavailable" };
@@ -456,24 +466,53 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
456
466
  // has no mandate to do.
457
467
  if (deps.commitSetting) {
458
468
  const next = structuredClone(settings) as ClioSettings;
459
- next.orchestrator.thinkingLevel = match;
460
- deps.commitSetting("orchestrator.thinkingLevel", next, "session");
469
+ next.chat.thinkingLevel = match;
470
+ deps.commitSetting("chat.thinkingLevel", next, "session");
461
471
  } else {
462
472
  deps.onSetThinkingLevel(match);
463
473
  }
464
474
  deps.refreshFooter();
465
475
  return { status: "applied", level: match, display: labelFor(match) };
466
476
  },
477
+ thinkingLevelChoices: () => {
478
+ const settings = deps.getSettings?.();
479
+ if (!settings) return [];
480
+ const thinking = resolveThinkingCapability(deps.providers, settings);
481
+ return (thinking?.supportedLevels ?? (["off"] as ReadonlyArray<ThinkingLevel>)).map((value) => ({
482
+ value,
483
+ label: thinkingLevelChoiceLabel(thinking?.mechanism ?? null, value),
484
+ }));
485
+ },
486
+ openThinkingPicker: () => {
487
+ const choices = context.thinkingLevelChoices?.() ?? [];
488
+ if (choices.length === 0) {
489
+ appendCommandNotice("error", "thinking level cannot be set right now");
490
+ return;
491
+ }
492
+ void deps
493
+ .openAskUser([
494
+ {
495
+ question: "Choose the thinking level for this chat.",
496
+ header: "Thinking",
497
+ options: choices.map(({ label }) => ({ label })),
498
+ },
499
+ ])
500
+ .then((result) => {
501
+ const answer = result.cancelled ? undefined : result.answers[0]?.answer;
502
+ const selected = choices.find(({ label }) => label === answer);
503
+ if (selected) dispatchSlashCommand({ kind: "thinking-set", level: selected.value }, context);
504
+ });
505
+ },
467
506
  setOutputVerbosity: (verbosity) => {
468
507
  if (!deps.getSettings || !(deps.commitSetting || deps.writeSettings)) return { status: "unavailable" };
469
508
  const requested = verbosity.trim().toLowerCase();
470
509
  const match = OUTPUT_VERBOSITIES.find((candidate) => candidate === requested);
471
510
  if (!match) return { status: "unsupported", verbosity, supported: OUTPUT_VERBOSITIES };
472
511
  const next = structuredClone(deps.getSettings()) as ClioSettings;
473
- next.terminal.outputVerbosity = match;
512
+ next.interface.outputDetail = match;
474
513
  // Session scope: /output changes this session and leaves settings.yaml
475
514
  // alone. Saving it as the default is what Settings → Terminal is for.
476
- if (deps.commitSetting) deps.commitSetting("terminal.outputVerbosity", next, "session");
515
+ if (deps.commitSetting) deps.commitSetting("interface.outputDetail", next, "session");
477
516
  else deps.writeSettings?.(next);
478
517
  // `/output` is also the explicit reset action for transcript folds. Do
479
518
  // this even when the requested level already matches the current one;
@@ -482,12 +521,41 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
482
521
  deps.refreshFooter();
483
522
  return { status: "applied", verbosity: match };
484
523
  },
524
+ openOutputPicker: () => {
525
+ void deps
526
+ .openAskUser([
527
+ {
528
+ question: "Choose transcript detail for this session.",
529
+ header: "Output",
530
+ options: OUTPUT_VERBOSITIES.map((value) => ({
531
+ label: `${value[0]?.toUpperCase()}${value.slice(1)}`,
532
+ })),
533
+ },
534
+ ])
535
+ .then((result) => {
536
+ if (result.cancelled) return;
537
+ const answer = result.answers[0]?.answer.toLowerCase();
538
+ const selected = OUTPUT_VERBOSITIES.find((value) => value === answer);
539
+ if (selected) dispatchSlashCommand({ kind: "output-set", verbosity: selected }, context);
540
+ });
541
+ },
485
542
  openModel: deps.openModel,
486
543
  providers: deps.providers,
487
544
  applyModelRef: (ref) => {
488
- deps.onSelectModel?.({ target: ref.target, model: ref.model });
489
- if (ref.thinkingLevel) deps.onSetThinkingLevel?.(ref.thinkingLevel);
545
+ // A mid-conversation swap used to rewrite the orchestrator role in
546
+ // settings.yaml with no prompt, so the next launch could come up on a
547
+ // dead endpoint (smoke pass 2, G3). The scope dialog owns the commit
548
+ // now, and it applies nothing until the operator answers.
549
+ if (deps.openModelScope) {
550
+ deps.openModelScope(ref);
551
+ return "pending";
552
+ }
553
+ // No overlay layer to ask with: session scope is the answer that cannot
554
+ // outlive the session that chose it.
555
+ deps.onSelectModel?.({ target: ref.target, model: ref.model }, "session");
556
+ if (ref.thinkingLevel) deps.onSetThinkingLevel?.(ref.thinkingLevel, "session");
490
557
  deps.requestRender();
558
+ return "applied";
491
559
  },
492
560
  openSettings: deps.openSettings,
493
561
  openResume: deps.openResume,
@@ -634,7 +702,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
634
702
  })
635
703
  .finally(deps.requestRender);
636
704
  },
637
- verifyReceipt: (runId) => verifyReceiptFile(deps.stateDir, runId),
705
+ verifyReceipt: (runId) => verifyReceiptFileReport(deps.stateDir, runId),
638
706
  ...(deps.listWorkerRuns ? { listWorkerRuns: deps.listWorkerRuns } : {}),
639
707
  // The user-turn path, minus expansion. A worker's answer is literal text:
640
708
  // running it through the prompt, skill, and @file expanders would let a
@@ -644,6 +712,9 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
644
712
  latestAdmission = admitChat(text, activeAdmissionSignal);
645
713
  void latestAdmission;
646
714
  },
715
+ runLocalOperation: (operation) => {
716
+ latestLocalOperation = latestLocalOperation.catch(() => undefined).then(operation);
717
+ },
647
718
  render: deps.requestRender,
648
719
  };
649
720
 
@@ -653,8 +724,12 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
653
724
  dispatchCommand: (text) => dispatchSlashCommand(parseSlashCommand(text), context),
654
725
  admitCommand: async (text, signal) => {
655
726
  signal?.throwIfAborted();
727
+ // Pane opens and focus changes mutate a remote registry. A following
728
+ // slash read must observe their settled state, just as the tool path does.
729
+ await latestLocalOperation;
656
730
  const command = parseSlashCommand(text);
657
731
  const before = latestAdmission;
732
+ const localBefore = latestLocalOperation;
658
733
  const previousSignal = activeAdmissionSignal;
659
734
  activeAdmissionSignal = signal;
660
735
  try {
@@ -663,6 +738,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
663
738
  activeAdmissionSignal = previousSignal;
664
739
  }
665
740
  if (latestAdmission !== before) await latestAdmission;
741
+ if (latestLocalOperation !== localBefore) await latestLocalOperation;
666
742
  },
667
743
  };
668
744
  }
@@ -88,7 +88,7 @@ export function createInteractiveSubscriptions(deps: InteractiveSubscriptionsDep
88
88
  BusChannels.DispatchProgress,
89
89
  folded((payload) => {
90
90
  const workerEvent = payload.event as { type?: unknown } | null | undefined;
91
- if (workerEvent?.type === "clio_steer_received") {
91
+ if (workerEvent?.type === "clio_coder_steer_received") {
92
92
  deps.notify("success", `steer received by ${payload.agentId} (${payload.runId})`, `steer:${payload.runId}`);
93
93
  }
94
94
  return workers.progress(payload);
@@ -34,7 +34,7 @@ export interface InteractiveTickersDeps {
34
34
  clearScheduledInterval?: (handle: InteractiveTickerHandle) => void;
35
35
  }
36
36
 
37
- export function formatTaskBoardIslandLines(board: TaskBoardSnapshot): string[] {
37
+ function formatTaskBoardIslandLines(board: TaskBoardSnapshot): string[] {
38
38
  const theme = clioTheme();
39
39
  const counts = taskBoardCounts(board);
40
40
  const active = board.tasks.find((task) => task.status === "active");
@@ -18,7 +18,7 @@
18
18
  * so editor/select components honor overrides out of the box.
19
19
  *
20
20
  * User overrides go through `validateKeybindings` first. Unmappable strings
21
- * (e.g. `clio.exit: "banana"`) are dropped so they cannot silently replace
21
+ * (e.g. `clio-coder.exit: "banana"`) are dropped so they cannot silently replace
22
22
  * the default binding; they still surface through `invalidBindings()` so
23
23
  * `/settings` and the boot stderr notice can point at the offending entry.
24
24
  */
@@ -184,7 +184,7 @@ interface ValidationResult {
184
184
  }
185
185
 
186
186
  /**
187
- * Normalize and validate the raw `settings.keybindings` block. Invalid
187
+ * Normalize and validate the raw `settings.interface.keybindings` block. Invalid
188
188
  * entries are dropped from the returned `valid` config so pi-tui keeps
189
189
  * the default binding in effect; callers render `invalid` as a diagnostic.
190
190
  */
@@ -472,14 +472,14 @@ function buildManager(
472
472
  * Build a `ClioKeybindingManager` from the provided settings snapshot. The
473
473
  * resulting manager is also installed as pi-tui's global so editor and
474
474
  * select components pick up the same overrides. Callers are expected to
475
- * recreate the manager if `settings.keybindings` is replaced wholesale;
475
+ * recreate the manager if `settings.interface.keybindings` is replaced wholesale;
476
476
  * partial live updates should instead go through `manager` state.
477
477
  */
478
478
  export function createKeybindingManager(
479
479
  settings: Readonly<ClioSettings>,
480
480
  env: NodeJS.ProcessEnv | Readonly<Record<string, string | undefined>> = process.env,
481
481
  ): ClioKeybindingManager {
482
- const { valid, invalid } = validateKeybindings(settings.keybindings ?? {});
482
+ const { valid, invalid } = validateKeybindings(settings.interface.keybindings ?? {});
483
483
  const inner = new KeybindingsManager(CLIO_KEYBINDINGS, valid);
484
484
  setKeybindings(inner);
485
485
  return buildManager(inner, invalid, detectPlatformKeybindingWarnings(valid, detectTerminalKeySupport(env)));
@@ -20,7 +20,7 @@ export interface FullscreenLayout {
20
20
  transcript: ScrollView;
21
21
  }
22
22
 
23
- export function buildFullscreenLayout(
23
+ function buildFullscreenLayout(
24
24
  parts: LayoutParts,
25
25
  options: Pick<LayoutOptions, "fullscreenScrollbar"> = {},
26
26
  ): FullscreenLayout {
@@ -29,7 +29,7 @@ const EMPTY_MESSAGE = "no approved lessons, task-bank entries, or memory steps c
29
29
  * row of its own until it finishes, and an operator who cannot see it in flight
30
30
  * reads an unchanged bank as an idle memory agent.
31
31
  */
32
- export function formatMemoryStatusLine(status: TaskMemoryOperatorStatus, contentWidth: number): string {
32
+ function formatMemoryStatusLine(status: TaskMemoryOperatorStatus, contentWidth: number): string {
33
33
  const theme = clioTheme();
34
34
  const width = Math.max(1, Math.floor(contentWidth));
35
35
  const units = [
@@ -145,7 +145,7 @@ function activityItems(events: ReadonlyArray<TaskMemoryActivityEvent>, group: st
145
145
  * section titles and they are the only place a reader learns that a class is
146
146
  * empty: a group with no rows renders no header at all.
147
147
  */
148
- export function buildMemoryOverlayItems(
148
+ function buildMemoryOverlayItems(
149
149
  status: TaskMemoryOperatorStatus,
150
150
  records: ReadonlyArray<MemoryRecord>,
151
151
  ): ListOverlayItem[] {
@@ -358,6 +358,7 @@ export function openMemoryOverlay(
358
358
  const handle = showClioOverlayFrame(tui, view, {
359
359
  anchor: "center",
360
360
  width: MEMORY_OVERLAY_WIDTH,
361
+ markerId: "memory",
361
362
  title: () => "Memory",
362
363
  footerHint: () => view.getHint(),
363
364
  });
@@ -0,0 +1,151 @@
1
+ /**
2
+ * The outward signal that a modal overlay owns the keyboard.
3
+ *
4
+ * Every framed Clio overlay captures input for as long as it is up, and until
5
+ * now it announced that only by being on screen. An external driver feeding
6
+ * keys into the pane, and herdr deciding whether the pane is idle, working, or
7
+ * blocked, had to infer modality from whatever the overlay happened to draw:
8
+ * its box title, its hint row, a footer pill. Those are per-overlay strings
9
+ * that move on every reskin, and the tall modals cover the very rows a screen
10
+ * scraper reads, so the signal is weakest exactly when a modal is largest.
11
+ *
12
+ * The marker publishes the fact out of band instead, as an OSC 0 terminal
13
+ * title. Three properties make the title the reliable channel here:
14
+ *
15
+ * 1. It is not screen content. No overlay can composite over it, no
16
+ * transcript line can counterfeit it, and no terminal height changes
17
+ * whether it is readable.
18
+ * 2. herdr already consumes it. `region = "osc_title"` is a first-class
19
+ * detection region (herdr `src/detect/manifest.rs`), fed from the pane's
20
+ * own emulator, and its rules outrank every screen rule.
21
+ * 3. Clio has never written a title, so the channel carries exactly one
22
+ * meaning and nothing else contends for it.
23
+ *
24
+ * The grammar is fixed and machine-first:
25
+ *
26
+ * clio no modal owns the keys
27
+ * clio [modal:permission-confirm] one modal, named
28
+ * clio [modal:library-install+2] top modal named, two more beneath it
29
+ *
30
+ * Nothing is written until the first modal opens, so a Clio that never opens
31
+ * an overlay leaves the pane's inherited title alone. From the first modal
32
+ * onward the title toggles between the marker and the bare base, which is what
33
+ * makes the absence of a marker a positive statement rather than an unknown.
34
+ */
35
+
36
+ /** The write side of a terminal title. `ProcessTerminal` satisfies it structurally. */
37
+ export interface ModalMarkerSink {
38
+ setTitle(title: string): void;
39
+ }
40
+
41
+ /** What the title reads when nothing modal owns the keyboard. */
42
+ export const MODAL_MARKER_BASE_TITLE = "clio";
43
+
44
+ /**
45
+ * The one regular expression an external reader needs. Exported so Clio's own
46
+ * contract test and herdr's manifest rule are written against the same shape
47
+ * rather than two hand-copied spellings of it.
48
+ */
49
+ export const MODAL_MARKER_TITLE_PATTERN = /^clio \[modal:([a-z0-9][a-z0-9-]*)(?:\+([1-9]\d*))?\]$/u;
50
+
51
+ /** Render the title for a modal stack, outermost first. */
52
+ function formatModalMarkerTitle(stack: readonly string[]): string {
53
+ const top = stack.at(-1);
54
+ if (top === undefined) return MODAL_MARKER_BASE_TITLE;
55
+ const beneath = stack.length - 1;
56
+ return `${MODAL_MARKER_BASE_TITLE} [modal:${top}${beneath > 0 ? `+${beneath}` : ""}]`;
57
+ }
58
+
59
+ /** One modal's claim on the keyboard, released when the overlay goes away. */
60
+ export interface ModalMarkerHandle {
61
+ /** Drop this modal from the stack. Idempotent; a second call is inert. */
62
+ release(): void;
63
+ /**
64
+ * Whether this modal currently owns keys. The engine's `setHidden` takes a
65
+ * visible overlay out of the focus order without destroying it, which is how
66
+ * a surface that shells out to a child process gets off the screen, so a
67
+ * hidden modal must stop claiming the keyboard without leaving the stack.
68
+ */
69
+ setActive(active: boolean): void;
70
+ /** Bring this modal back to the top of the stack, as `handle.focus()` does on screen. */
71
+ raise(): void;
72
+ }
73
+
74
+ interface ModalMarkerRegistry {
75
+ /**
76
+ * Push a modal. The sink is taken from the caller rather than installed at
77
+ * startup so the marker has no lifecycle of its own: it exists exactly when
78
+ * an overlay exists, and a stub terminal with no `setTitle` makes the whole
79
+ * mechanism inert instead of throwing.
80
+ */
81
+ enter(id: string, sink?: ModalMarkerSink | null): ModalMarkerHandle;
82
+ /** The ids that currently own keys, outermost first. */
83
+ stack(): readonly string[];
84
+ }
85
+
86
+ interface ModalMarkerEntry {
87
+ readonly id: string;
88
+ active: boolean;
89
+ }
90
+
91
+ function createModalMarkerRegistry(): ModalMarkerRegistry {
92
+ const entries: ModalMarkerEntry[] = [];
93
+ let sink: ModalMarkerSink | null = null;
94
+ let published: string | null = null;
95
+
96
+ function activeIds(): string[] {
97
+ return entries.filter((entry) => entry.active).map((entry) => entry.id);
98
+ }
99
+
100
+ function publish(): void {
101
+ if (sink === null) return;
102
+ const title = formatModalMarkerTitle(activeIds());
103
+ // Before the first marker there is no stale claim to clear, so the pane
104
+ // keeps whatever title the shell or the multiplexer gave it.
105
+ if (published === null && title === MODAL_MARKER_BASE_TITLE) return;
106
+ if (title === published) return;
107
+ published = title;
108
+ sink.setTitle(title);
109
+ }
110
+
111
+ function enter(id: string, nextSink?: ModalMarkerSink | null): ModalMarkerHandle {
112
+ if (nextSink) sink = nextSink;
113
+ const entry: ModalMarkerEntry = { id, active: true };
114
+ entries.push(entry);
115
+ publish();
116
+ let released = false;
117
+ return {
118
+ release(): void {
119
+ if (released) return;
120
+ released = true;
121
+ const index = entries.indexOf(entry);
122
+ if (index !== -1) entries.splice(index, 1);
123
+ publish();
124
+ },
125
+ setActive(active: boolean): void {
126
+ if (released || entry.active === active) return;
127
+ entry.active = active;
128
+ publish();
129
+ },
130
+ raise(): void {
131
+ if (released) return;
132
+ entry.active = true;
133
+ const index = entries.indexOf(entry);
134
+ if (index !== -1 && index !== entries.length - 1) {
135
+ entries.splice(index, 1);
136
+ entries.push(entry);
137
+ }
138
+ publish();
139
+ },
140
+ };
141
+ }
142
+
143
+ return { enter, stack: (): readonly string[] => activeIds() };
144
+ }
145
+
146
+ const registry = createModalMarkerRegistry();
147
+
148
+ /** Push a modal onto the process-wide stack. See {@link ModalMarkerRegistry.enter}. */
149
+ export function enterModal(id: string, sink?: ModalMarkerSink | null): ModalMarkerHandle {
150
+ return registry.enter(id, sink);
151
+ }
@@ -96,7 +96,7 @@ function canonicalJson(value: unknown): string {
96
96
  * anything else about the arguments does, which is the point: a call that
97
97
  * differs from the previewed one cannot inherit its preview.
98
98
  */
99
- export function callArgumentsDigest(args: Record<string, unknown> | undefined): string {
99
+ function callArgumentsDigest(args: Record<string, unknown> | undefined): string {
100
100
  return createHash("sha256")
101
101
  .update(canonicalJson(args ?? {}), "utf8")
102
102
  .digest("hex")