@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
@@ -0,0 +1,214 @@
1
+ /**
2
+ * The dispatch-to-pane-host bridge.
3
+ *
4
+ * Two responsibilities, both projections of state the session already owns:
5
+ *
6
+ * - **Terminal-run notifications.** A finished dispatch raises a pane-host
7
+ * toast per the `panes.notifications` policy, and a failure additionally
8
+ * leaves a persistent transcript notice, which unlike a toast remains
9
+ * auditable in the TUI and does not depend on the pane host being alive.
10
+ *
11
+ * - **Self-report (SA-3).** Clio's own hosting pane, in guest mode, carries
12
+ * the interactive status machine's phase as a semantic agent state, on a
13
+ * trailing-edge throttle: herdr answers one request per connection, and an
14
+ * operator turn passes through several phases inside one window, of which
15
+ * only the last is worth a wire call.
16
+ *
17
+ * What this bridge deliberately no longer does is open panes. The phase 3/4
18
+ * integration projected every dispatch onto a viewer pane in a hidden Fleet
19
+ * tab (an `agents` policy knob, a keep-failed close policy, resume adoption,
20
+ * role-vocabulary sidebar labels). All of it duplicated the native fleet
21
+ * surfaces into panes the operator had not asked for; the one pane that
22
+ * renders runs is now the operator-pulled watch pane (`watch-pane.ts`), and
23
+ * the policy line lives in `pane-policy.ts`.
24
+ */
25
+
26
+ import { type AgentStatusChangedPayload, BusChannels, type DispatchRunIdentity } from "../core/bus-events.js";
27
+ import type { SafeEventBus } from "../core/event-bus.js";
28
+ import type { MuxContract, MuxLog } from "../domains/mux/index.js";
29
+ import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
30
+
31
+ /** Trailing-edge window for the self-report; matches `WAIT_POLL_MS`. */
32
+ export const MUX_BRIDGE_THROTTLE_MS = 250;
33
+
34
+ /**
35
+ * A success worth a sound. Below it a finished run is one of many and a chime
36
+ * per run is noise; above it the operator has moved on and wants telling.
37
+ */
38
+ const LONG_RUN_MS = 60_000;
39
+
40
+ /** How much terminal detail may reach a toast body or a notice line. */
41
+ const DETAIL_MAX_CHARS = 96;
42
+
43
+ export type PanesNotificationsPolicy = "failures" | "all" | "off";
44
+
45
+ /** Terminal outcomes that read as failure for the notification policy. */
46
+ type BridgeRunOutcome = "succeeded" | "failed" | "canceled" | "timed_out";
47
+
48
+ export interface MuxBridgeDeps {
49
+ bus: SafeEventBus;
50
+ mux: MuxContract;
51
+ /** Read live so a `/settings` change takes effect on the next terminal run. */
52
+ notificationsPolicy: () => PanesNotificationsPolicy;
53
+ /** Persistent transcript notice; unlike a herdr toast, this remains auditable in the TUI. */
54
+ notice?: (level: "error", text: string) => void;
55
+ log?: MuxLog;
56
+ now?: () => number;
57
+ throttleMs?: number;
58
+ setTimeoutFn?: typeof setTimeout;
59
+ clearTimeoutFn?: typeof clearTimeout;
60
+ }
61
+
62
+ export interface MuxBridge {
63
+ /** Settle every in-flight notification and self-report. Tests await it. */
64
+ flush(): Promise<void>;
65
+ dispose(): void;
66
+ }
67
+
68
+ function isFailure(outcome: BridgeRunOutcome): boolean {
69
+ return outcome === "failed" || outcome === "timed_out";
70
+ }
71
+
72
+ /** Clio's own pane state (SA-3), mapped from the interactive status machine. */
73
+ function selfStateFor(phase: AgentStatusChangedPayload["phase"]): "working" | "blocked" | "idle" {
74
+ if (phase === "tool_blocked") return "blocked";
75
+ // `ended` is the settle step on the way back to idle, so both read idle.
76
+ return phase === "idle" || phase === "ended" ? "idle" : "working";
77
+ }
78
+
79
+ /**
80
+ * Clio's seven-member run outcome taxonomy narrowed to the four states the
81
+ * notification policy distinguishes. `stalled`, `denied_by_policy`,
82
+ * `spawn_failed`, and the synthetic `retry_denied` all read as failure, which
83
+ * is the safe direction: an unrecognized terminal state must not silently
84
+ * skip the failure notice.
85
+ */
86
+ function terminalOutcome(outcome: string): BridgeRunOutcome {
87
+ if (outcome === "succeeded") return "succeeded";
88
+ if (outcome === "canceled") return "canceled";
89
+ if (outcome === "timed_out") return "timed_out";
90
+ return "failed";
91
+ }
92
+
93
+ export function createMuxBridge(deps: MuxBridgeDeps): MuxBridge {
94
+ const log = deps.log ?? ((): void => undefined);
95
+ const now = deps.now ?? Date.now;
96
+ const throttleMs = deps.throttleMs ?? MUX_BRIDGE_THROTTLE_MS;
97
+ const setTimeoutFn = deps.setTimeoutFn ?? setTimeout;
98
+ const clearTimeoutFn = deps.clearTimeoutFn ?? clearTimeout;
99
+
100
+ /** Start stamps, so a terminal event without a duration still gets one. */
101
+ const startedAt = new Map<string, number>();
102
+ let disposed = false;
103
+ let timer: ReturnType<typeof setTimeout> | null = null;
104
+ /** Serializes wire work: notifies and self-reports must not interleave. */
105
+ let draining: Promise<void> = Promise.resolve();
106
+ /** Pending self-report state, or null when nothing changed since the last flush. */
107
+ let pendingSelf: "working" | "blocked" | "idle" | null = null;
108
+ /** The last state actually reported, so a repeated phase costs no wire call. */
109
+ let reportedSelf: "working" | "blocked" | "idle" | null = null;
110
+
111
+ const schedule = (): void => {
112
+ if (disposed || timer !== null) return;
113
+ timer = setTimeoutFn(() => {
114
+ timer = null;
115
+ void drainSelf();
116
+ }, throttleMs);
117
+ timer.unref?.();
118
+ };
119
+
120
+ const drainSelf = (): Promise<void> => {
121
+ draining = draining.then(async () => {
122
+ if (disposed) return;
123
+ const self = pendingSelf;
124
+ pendingSelf = null;
125
+ if (self !== null && self !== reportedSelf) {
126
+ reportedSelf = self;
127
+ await deps.mux.reportSelf({ state: self }).catch(() => false);
128
+ }
129
+ });
130
+ return draining;
131
+ };
132
+
133
+ const boundedDetail = (value: string | null | undefined): string | null => {
134
+ if (typeof value !== "string" || value.length === 0) return null;
135
+ return sanitizeCallTargetText(value).slice(0, DETAIL_MAX_CHARS);
136
+ };
137
+
138
+ const onTerminal = (
139
+ identity: DispatchRunIdentity,
140
+ rawOutcome: string,
141
+ fields: { durationMs?: number | undefined; detail?: string | null | undefined },
142
+ ): void => {
143
+ const outcome = terminalOutcome(rawOutcome);
144
+ const begun = startedAt.get(identity.runId);
145
+ startedAt.delete(identity.runId);
146
+ const policy = deps.notificationsPolicy();
147
+ const failed = isFailure(outcome);
148
+ const qualifies = policy === "all" || (policy === "failures" && failed);
149
+ if (!qualifies) return;
150
+ const detail = boundedDetail(fields.detail);
151
+ const durationMs =
152
+ typeof fields.durationMs === "number" ? fields.durationMs : begun === undefined ? null : now() - begun;
153
+ if (failed) {
154
+ deps.notice?.("error", `${identity.agentId} ${outcome} (${identity.runId})${detail ? `: ${detail}` : ""}`);
155
+ }
156
+ if (!deps.mux.available()) return;
157
+ draining = draining.then(async () => {
158
+ if (disposed) return;
159
+ try {
160
+ await deps.mux.notify({
161
+ title: `${identity.agentId} ${outcome}`,
162
+ ...(detail ? { body: detail } : {}),
163
+ // A failure interrupts; a long success announces. A short success
164
+ // in `all` mode gets the toast without the chime.
165
+ sound: failed ? "request" : durationMs !== null && durationMs >= LONG_RUN_MS ? "done" : "none",
166
+ });
167
+ } catch (error) {
168
+ // The contract swallows its own failures; anything arriving here is a
169
+ // bug rather than a dead socket, and must still not kill the chain.
170
+ log("debug", `mux bridge notify failed: ${error instanceof Error ? error.message : String(error)}`);
171
+ }
172
+ });
173
+ };
174
+
175
+ const unsubscribers = [
176
+ deps.bus.on(BusChannels.DispatchStarted, (payload) => {
177
+ startedAt.set(payload.runId, now());
178
+ }),
179
+ deps.bus.on(BusChannels.DispatchCompleted, (payload) => {
180
+ onTerminal(payload, payload.outcome, { durationMs: payload.durationMs, detail: payload.outcomeDetail });
181
+ }),
182
+ deps.bus.on(BusChannels.DispatchFailed, (payload) => {
183
+ onTerminal(payload, payload.reason, { durationMs: payload.durationMs, detail: payload.outcomeDetail });
184
+ }),
185
+ // SA-3. The interactive status machine is the one surface that already
186
+ // knows when a turn starts, when it ends, and when a tool call is parked
187
+ // on an approval, so the self-report rides its transitions rather than
188
+ // growing a second turn-lifecycle listener.
189
+ deps.bus.on(BusChannels.AgentStatusChanged, (payload) => {
190
+ const state = selfStateFor(payload.phase);
191
+ if (state === reportedSelf && pendingSelf === null) return;
192
+ pendingSelf = state;
193
+ schedule();
194
+ }),
195
+ ];
196
+
197
+ return {
198
+ flush(): Promise<void> {
199
+ if (timer !== null) {
200
+ clearTimeoutFn(timer);
201
+ timer = null;
202
+ }
203
+ return drainSelf();
204
+ },
205
+ dispose(): void {
206
+ if (disposed) return;
207
+ disposed = true;
208
+ if (timer !== null) clearTimeoutFn(timer);
209
+ timer = null;
210
+ for (const unsubscribe of unsubscribers) unsubscribe();
211
+ startedAt.clear();
212
+ },
213
+ };
214
+ }
@@ -4,12 +4,14 @@ import {
4
4
  type Component,
5
5
  type OverlayHandle,
6
6
  type OverlayOptions,
7
+ type OverlayUnfocusOptions,
7
8
  type SelectListTheme,
8
9
  type SettingsListTheme,
9
10
  type TUI,
10
11
  truncateToWidth,
11
12
  visibleWidth,
12
13
  } from "../engine/tui.js";
14
+ import { enterModal, type ModalMarkerSink } from "./modal-marker.js";
13
15
  import { type ClioToken, clioTheme, padAnsi, screenTitle, selectListTheme, settingsListTheme } from "./theme/index.js";
14
16
 
15
17
  export const IDENTITY = (text: string): string => text;
@@ -131,7 +133,7 @@ export interface HintEntry {
131
133
  * dropped `[Enter] use`, which is the only way to commit. The commit key and
132
134
  * the way out are what a narrow footer is for.
133
135
  */
134
- export function isCriticalHintKey(key: string): boolean {
136
+ function isCriticalHintKey(key: string): boolean {
135
137
  const canonical = canonicalizeKey(key);
136
138
  // `type` joins the commit key and the way out because on a list of a hundred
137
139
  // models, typing is how a reader reaches the row they want at all; the
@@ -188,7 +190,7 @@ export function fitHintEntries(entries: ReadonlyArray<HintEntry>, maxWidth: numb
188
190
  */
189
191
  export const FILTER_HINT: HintEntry = { key: "type", verb: "filter" };
190
192
 
191
- export function canonicalizeKey(key: string): string {
193
+ function canonicalizeKey(key: string): string {
192
194
  const trimmed = key.trim();
193
195
  if (trimmed === "R") return "R";
194
196
  const lower = trimmed.toLowerCase();
@@ -238,7 +240,7 @@ export function buildResponsiveHint(
238
240
  * labels but recovers the key, which is all the critical-key classification
239
241
  * needs, so a plain-string overlay gets the same protection as a structured one.
240
242
  */
241
- export function elideHint(hint: string, maxCleanWidth: number): string {
243
+ function elideHint(hint: string, maxCleanWidth: number): string {
242
244
  const parts = hint.split(" · ");
243
245
  if (parts.length <= 2) return hint;
244
246
  const entries: HintEntry[] = parts.map((part) => {
@@ -295,14 +297,6 @@ export function diagnosticSeverityToken(severity: RuntimeResolutionDiagnostic["s
295
297
  return severity === "error" ? "error" : severity === "warning" ? "warning" : "muted";
296
298
  }
297
299
 
298
- export function runtimeResolutionDiagnosticLine(diagnostic: RuntimeResolutionDiagnostic, width: number): string {
299
- return clioTheme().fg(diagnosticSeverityToken(diagnostic.severity), fitDiagnosticLine(diagnostic, width));
300
- }
301
-
302
- function fitDiagnosticLine(diagnostic: RuntimeResolutionDiagnostic, width: number): string {
303
- return padAnsi(formatRuntimeResolutionDiagnostic(diagnostic), Math.max(1, width));
304
- }
305
-
306
300
  export type FrameAlign = "left" | "center" | "right";
307
301
 
308
302
  /**
@@ -311,7 +305,7 @@ export type FrameAlign = "left" | "center" | "right";
311
305
  * row and places the box itself; this is what the box would have been anchored
312
306
  * to if the engine were still doing the placing.
313
307
  */
314
- export function frameAlignForAnchor(anchor: OverlayOptions["anchor"]): FrameAlign {
308
+ function frameAlignForAnchor(anchor: OverlayOptions["anchor"]): FrameAlign {
315
309
  if (anchor === undefined) return "center";
316
310
  if (anchor === "left-center" || anchor.endsWith("-left")) return "left";
317
311
  if (anchor === "right-center" || anchor.endsWith("-right")) return "right";
@@ -464,6 +458,15 @@ export class ClioOverlayFrame implements Component {
464
458
  * screen at 40x12. It learns the terminal height through the `visible`
465
459
  * predicate, which the engine evaluates with the live dimensions in the same
466
460
  * pass that renders the overlay.
461
+ *
462
+ * This is also where the modal marker is claimed and released. Every framed
463
+ * overlay is modal and every modal is framed: the only two overlays Clio shows
464
+ * without a frame are the context and task islands, and both pass
465
+ * `nonCapturing: true` straight to the engine. Hanging the marker here rather
466
+ * than on the overlay lifecycle therefore covers the nested frames the
467
+ * lifecycle's single `OverlayState` cannot see, and it cannot drift out of
468
+ * sync with what actually owns the keyboard, because the same call that takes
469
+ * the screen takes the marker.
467
470
  */
468
471
  export function showClioOverlayFrame(
469
472
  tui: TUI,
@@ -473,12 +476,21 @@ export function showClioOverlayFrame(
473
476
  footerHint?: string | ((innerWidth: number) => string | undefined);
474
477
  /** Border and title token; omitted leaves the informational frame. */
475
478
  tone?: OverlayTone;
479
+ /**
480
+ * Stable id for the modal marker, published on the terminal title while
481
+ * this overlay owns the keys. Required, and deliberately not defaulted
482
+ * from `title`: several titles carry a session id, a decision
483
+ * classification, or the active tab, and an id that moves with the
484
+ * content is not an identifier. Use `modalMarkerId(...)` where the title
485
+ * really is fixed and surface-specific.
486
+ */
487
+ markerId: string;
476
488
  },
477
489
  ): OverlayHandle {
478
- const { title, footerHint, tone, width, visible, maxHeight, margin, ...overlayOptions } = options;
490
+ const { title, footerHint, tone, width, visible, maxHeight, margin, markerId, ...overlayOptions } = options;
479
491
  const boxWidth = typeof width === "number" ? width : 0;
480
492
  const frame = new ClioOverlayFrame(child, title, footerHint, boxWidth, frameAlignForAnchor(options.anchor), tone);
481
- return tui.showOverlay(frame, {
493
+ const handle = tui.showOverlay(frame, {
482
494
  ...overlayOptions,
483
495
  ...(margin !== undefined ? { margin } : {}),
484
496
  width: "100%",
@@ -493,6 +505,42 @@ export function showClioOverlayFrame(
493
505
  return shown;
494
506
  },
495
507
  });
508
+ const marker = enterModal(markerId, modalMarkerSink(tui));
509
+ return {
510
+ hide(): void {
511
+ marker.release();
512
+ handle.hide();
513
+ },
514
+ setHidden(hidden: boolean): void {
515
+ marker.setActive(!hidden);
516
+ handle.setHidden(hidden);
517
+ },
518
+ isHidden: (): boolean => handle.isHidden(),
519
+ focus(): void {
520
+ marker.raise();
521
+ handle.focus();
522
+ },
523
+ // A pure passthrough on purpose. The engine hands focus to the next
524
+ // visible capturing overlay, which is another modal, so the stack is
525
+ // unchanged; the surface that gives the keyboard back to the composer
526
+ // does it by hiding, which `setHidden` already reports.
527
+ unfocus: (unfocusOptions?: OverlayUnfocusOptions): void =>
528
+ unfocusOptions ? handle.unfocus(unfocusOptions) : handle.unfocus(),
529
+ isFocused: (): boolean => handle.isFocused(),
530
+ };
531
+ }
532
+
533
+ /**
534
+ * The title sink behind a TUI, or null when there is none.
535
+ *
536
+ * The engine's `Terminal` declares `setTitle`, but the stub TUIs the overlay
537
+ * tests mount against are structural casts that carry only what the overlay
538
+ * under test reads. Probing for the method keeps the marker inert on those
539
+ * rather than throwing inside a render path.
540
+ */
541
+ function modalMarkerSink(tui: TUI): ModalMarkerSink | null {
542
+ const terminal: Partial<ModalMarkerSink> | undefined = tui.terminal;
543
+ return typeof terminal?.setTitle === "function" ? (terminal as ModalMarkerSink) : null;
496
544
  }
497
545
 
498
546
  /** Rows from an overlay size value, matching how the engine reads one. */
@@ -12,6 +12,7 @@ import {
12
12
  proposeMemoryPromotion,
13
13
  } from "../domains/memory/index.js";
14
14
  import type { ObservabilityContract } from "../domains/observability/index.js";
15
+ import { renderCostAggregate } from "../domains/observability/index.js";
15
16
  import { foregroundStreamUsage } from "../domains/providers/index.js";
16
17
  import type { ContextLedger } from "../domains/session/context-ledger.js";
17
18
  import type { SessionMeta } from "../domains/session/index.js";
@@ -334,6 +335,7 @@ export function createOverlayGeneralOpeners(deps: OverlayGeneralOpenersDeps): Ov
334
335
  deps.transitions.state = "dispatch-board";
335
336
  deps.dispatchBoard.resetSelection();
336
337
  deps.transitions.handle = showOverlayFrameFactory(deps.tui, deps.dispatchBoard, {
338
+ markerId: "dispatch-board",
337
339
  title: "Fleet Runs",
338
340
  footerHint: dispatchBoardHint,
339
341
  anchor: "center",
@@ -485,7 +487,7 @@ export function createOverlayGeneralOpeners(deps: OverlayGeneralOpenersDeps): Ov
485
487
  fleetRootId,
486
488
  dispatch: deps.dispatch,
487
489
  agents: { getSpec: (agentId) => agents.getSpec(agentId) },
488
- attributionEnabled: deps.getSettings?.().attribution.gitCommits ?? true,
490
+ attributionEnabled: deps.getSettings?.().integrations.git.commitAttribution ?? true,
489
491
  vars: preview.vars,
490
492
  onStepDispatched: (event) => {
491
493
  deps.setFleetRunPhase?.(event.assignmentId, { wave: event.waveIndex, stepId: event.stepId });
@@ -495,7 +497,10 @@ export function createOverlayGeneralOpeners(deps: OverlayGeneralOpenersDeps): Ov
495
497
  .then((outcome) => {
496
498
  deps.notify(
497
499
  outcome.cleanRun ? "success" : "warning",
498
- `fleet ${preview.name}: ${outcome.succeededStepCount}/${outcome.requiredStepCount} steps succeeded, cost $${outcome.totalCostUsd.toFixed(4)}`,
500
+ // `totalCost` rather than the bare `totalCostUsd` sum: a run whose
501
+ // receipts were all unpriced reads as not measured instead of as a
502
+ // measured $0.0000 nobody put a number on.
503
+ `fleet ${preview.name}: ${outcome.succeededStepCount}/${outcome.requiredStepCount} steps succeeded, cost ${renderCostAggregate(outcome.totalCost)}`,
499
504
  "fleet-run:settled",
500
505
  );
501
506
  })
@@ -15,6 +15,7 @@ export type OverlayState =
15
15
  | "memory"
16
16
  | "view"
17
17
  | "model"
18
+ | "model-scope"
18
19
  | "settings"
19
20
  | "resume"
20
21
  | "tree"
@@ -63,6 +64,12 @@ export interface DispatchBoardOverlayKeyDeps {
63
64
  cancelSelectedDispatch: () => void;
64
65
  /** Open or close the selected run's worker-progress detail. */
65
66
  toggleSelectedDispatchDetail: () => void;
67
+ /**
68
+ * Open or retarget the watch pane for the selected run. True when the pane
69
+ * layer took the key; false hands Enter back to the inline detail toggle,
70
+ * which is the whole behavior when panes are off or the run is terminal.
71
+ */
72
+ watchSelectedDispatch: () => boolean;
66
73
  }
67
74
 
68
75
  interface CloseOverlayKeyDeps {
@@ -104,7 +111,7 @@ function mutationScrollDelta(data: string): number {
104
111
  }
105
112
 
106
113
  /** Pure permission overlay key router: returns true when the input was consumed. */
107
- export function routePermissionOverlayKey(data: string, deps: PermissionOverlayKeyDeps): boolean {
114
+ function routePermissionOverlayKey(data: string, deps: PermissionOverlayKeyDeps): boolean {
108
115
  if (matchesKey(data, "enter") && !isKeyRelease(data)) {
109
116
  // Consumed either way: with a draft the press changes nothing, and the
110
117
  // composer rail says what clears it. Letting it fall through would hand
@@ -151,7 +158,7 @@ export function routePermissionOverlayKey(data: string, deps: PermissionOverlayK
151
158
  }
152
159
 
153
160
  /** Pure overlay key router for the dispatch board. */
154
- export function routeDispatchBoardOverlayKey(data: string, deps: DispatchBoardOverlayKeyDeps): boolean {
161
+ function routeDispatchBoardOverlayKey(data: string, deps: DispatchBoardOverlayKeyDeps): boolean {
155
162
  if (isEscapeKey(data)) {
156
163
  deps.closeOverlay();
157
164
  return true;
@@ -173,10 +180,11 @@ export function routeDispatchBoardOverlayKey(data: string, deps: DispatchBoardOv
173
180
  deps.cancelSelectedDispatch();
174
181
  return true;
175
182
  }
176
- // Worker progress is expanded detail the operator asks for. The default list
177
- // stays compact so a fan-out of scouts costs one card each.
183
+ // Enter on a live run enters it: the watch pane opens (or retargets) and
184
+ // renders the run's stream beside the board. Where panes are off, absent,
185
+ // or the run is terminal, Enter keeps its inline worker-progress detail.
178
186
  if (matchesKey(data, "enter")) {
179
- deps.toggleSelectedDispatchDetail();
187
+ if (!deps.watchSelectedDispatch()) deps.toggleSelectedDispatchDetail();
180
188
  return true;
181
189
  }
182
190
  return false;
@@ -239,11 +247,11 @@ export function routeOverlayKey(
239
247
  ): boolean {
240
248
  if (overlayState === "closed") return false;
241
249
  if (
242
- (overlayState === "dispatch-board" && matches(data, "clio.dispatchBoard.toggle")) ||
243
- (overlayState === "tasks" && matches(data, "clio.tasks.open")) ||
244
- (overlayState === "tree" && matches(data, "clio.session.tree")) ||
245
- (overlayState === "model" && matches(data, "clio.model.select")) ||
246
- (overlayState === "help" && matches(data, "clio.leader"))
250
+ (overlayState === "dispatch-board" && matches(data, "clio-coder.dispatchBoard.toggle")) ||
251
+ (overlayState === "tasks" && matches(data, "clio-coder.tasks.open")) ||
252
+ (overlayState === "tree" && matches(data, "clio-coder.session.tree")) ||
253
+ (overlayState === "model" && matches(data, "clio-coder.model.select")) ||
254
+ (overlayState === "help" && matches(data, "clio-coder.leader"))
247
255
  ) {
248
256
  deps.closeOverlay();
249
257
  return true;
@@ -280,6 +288,9 @@ export function routeOverlayKey(
280
288
  if (overlayState === "memory") return false;
281
289
  if (overlayState === "view") return false;
282
290
  if (overlayState === "model") return routeModelOverlayKey(data, deps);
291
+ // The scope dialog owns Esc itself: cancelling it must leave the model where
292
+ // it was, and a router-level close cannot say that to the caller waiting on it.
293
+ if (overlayState === "model-scope") return false;
283
294
  // Settings owns Esc itself: its stack is sections → rows → detail, and a
284
295
  // router-level close made every Esc leave the overlay from wherever the
285
296
  // operator was, so a cancelled picker and a finished visit looked the same.
@@ -22,6 +22,7 @@ import {
22
22
  export * from "./overlay-key-routing.js";
23
23
 
24
24
  import type { OverlayState } from "./overlay-key-routing.js";
25
+ import type { PendingModelScope } from "./overlays/model-scope.js";
25
26
  import type { SettingsCenterRowId, SettingsSectionId } from "./overlays/settings.js";
26
27
 
27
28
  // Runtime lifecycle construction lives beside the pure modal key router so the
@@ -48,6 +49,7 @@ export type OverlayLifecycleApplicationDeps = Pick<
48
49
  | "onNewSession"
49
50
  | "onResumeSession"
50
51
  | "onSelectModel"
52
+ | "onSetThinkingLevel"
51
53
  | "providers"
52
54
  | "readSessionEntries"
53
55
  | "registerAskUserHandler"
@@ -108,6 +110,7 @@ export interface OverlayLifecycleRuntimeDeps {
108
110
  openAuthDialog?: typeof import("./overlays/auth-dialog.js").openAuthDialog;
109
111
  openAskUserOverlay?: typeof import("./overlays/ask-user.js").openAskUserOverlay;
110
112
  openModelOverlay?: typeof import("./overlays/model-selector.js").openModelOverlay;
113
+ openModelScopeOverlay?: typeof import("./overlays/model-scope.js").openModelScopeOverlay;
111
114
  openSettingsOverlay?: typeof import("./overlays/settings.js").openSettingsOverlay;
112
115
  openSessionOverlay?: typeof import("./overlays/session-selector.js").openSessionOverlay;
113
116
  openTreeOverlay?: typeof import("./overlays/tree-selector.js").openTreeOverlay;
@@ -151,6 +154,8 @@ export interface OverlayLifecycleController {
151
154
  startHandoffState(goal: string): void;
152
155
  startFleetRunState(name: string, vars: Readonly<Record<string, string>>): void;
153
156
  openModelOverlayState(): void;
157
+ /** `/model <pattern>` and the picker both land here: choose session or global before anything applies. */
158
+ openModelScopeState(ref: PendingModelScope): void;
154
159
  openSettingsOverlayState(section?: SettingsSectionId, rowId?: SettingsCenterRowId): void;
155
160
  openResumeOverlayState(): void;
156
161
  openTreeOverlayState(): void;
@@ -196,6 +201,7 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
196
201
  openAuthDialog: openAuthDialogFactory,
197
202
  openAskUserOverlay: openAskUserOverlayFactory,
198
203
  openModelOverlay: openModelOverlayFactory,
204
+ openModelScopeOverlay: openModelScopeOverlayFactory,
199
205
  openSettingsOverlay: openSettingsOverlayFactory,
200
206
  openSessionOverlay: openSessionOverlayFactory,
201
207
  openTreeOverlay: openTreeOverlayFactory,
@@ -266,16 +272,18 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
266
272
  ...(deps.app.toolRegistry ? { toolRegistry: deps.app.toolRegistry } : {}),
267
273
  bus: deps.app.bus,
268
274
  dispatch: deps.app.dispatch,
269
- getAutonomy: () => deps.app.getSettings?.().autonomy ?? "auto-edit",
275
+ getAutonomy: () => deps.app.getSettings?.().safety.autonomy ?? "auto-edit",
270
276
  getOverlayState: () => overlayTransitions.state,
271
277
  openPermissionOverlay: (view, inspect) => {
272
- if (overlayTransitions.state !== "closed") return false;
273
- overlayTransitions.state = "permission-confirm";
278
+ if (overlayTransitions.state === "permission-confirm") return false;
274
279
  const body = createPermissionOverlayBody(view, inspect);
275
280
  permissionBody = body;
276
- overlayTransitions.handle = showOverlayFrame(tui, body, {
281
+ const handle = showOverlayFrame(tui, body, {
277
282
  ...permissionOverlayPlacement(tui, editor, footer.view),
278
283
  width: PERMISSION_OVERLAY_WIDTH,
284
+ // Not derived from the title: that one is classified per decision
285
+ // axis and is one of five strings for the same modal.
286
+ markerId: "permission-confirm",
279
287
  title: permissionOverlayTitle(view),
280
288
  tone: permissionOverlayTone(view),
281
289
  // Read per frame: the footer names what Enter does right now, and
@@ -283,6 +291,11 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
283
291
  // the mutation is open.
284
292
  footerHint: (innerWidth) => permissionOverlayHint(innerWidth, editor.getText().length > 0, inspectionHint()),
285
293
  });
294
+ if (!overlayTransitions.showPermission(handle)) {
295
+ handle.hide();
296
+ permissionBody = null;
297
+ return false;
298
+ }
286
299
  tui.requestRender();
287
300
  return true;
288
301
  },
@@ -331,10 +344,12 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
331
344
  ...(deps.app.writeSettings ? { writeSettings: deps.app.writeSettings } : {}),
332
345
  ...(deps.app.commitSetting ? { commitSetting: deps.app.commitSetting } : {}),
333
346
  ...(deps.app.onSelectModel ? { onSelectModel: deps.app.onSelectModel } : {}),
347
+ ...(deps.app.onSetThinkingLevel ? { onSetThinkingLevel: deps.app.onSetThinkingLevel } : {}),
334
348
  ...(deps.app.getFleetNodes ? { getFleetNodes: deps.app.getFleetNodes } : {}),
335
349
  connectTarget: (targetId) => overlayAuth.openConnectFlow(targetId),
336
350
  ...(deps.app.interop ? { getInteropProposals: interopProposalsFor(deps.app.interop) } : {}),
337
351
  ...(openModelOverlayFactory ? { openModelOverlay: openModelOverlayFactory } : {}),
352
+ ...(openModelScopeOverlayFactory ? { openModelScopeOverlay: openModelScopeOverlayFactory } : {}),
338
353
  ...(openSettingsOverlayFactory ? { openSettingsOverlay: openSettingsOverlayFactory } : {}),
339
354
  });
340
355
 
@@ -466,6 +481,7 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
466
481
  startFleetRunState,
467
482
  startHandoffState,
468
483
  openModelOverlayState: overlayModelSelectors.openModelOverlayState,
484
+ openModelScopeState: overlayModelSelectors.openModelScopeState,
469
485
  openSettingsOverlayState: overlayModelSelectors.openSettingsOverlayState,
470
486
  openResumeOverlayState,
471
487
  openTreeOverlayState,