@iowarp/clio-coder 0.3.8 → 0.4.0

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 (552) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/NOTICE +33 -0
  3. package/README.md +12 -3
  4. package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
  5. package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
  8. package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
  9. package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
  10. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  11. package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
  12. package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
  13. package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
  14. package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
  15. package/dist/chunk-3DPEIQKN.js +113 -0
  16. package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
  17. package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
  18. package/dist/chunk-42FMPA75.js +101 -0
  19. package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
  20. package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
  21. package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
  22. package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
  23. package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
  24. package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
  25. package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
  26. package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
  27. package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
  28. package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
  29. package/dist/chunk-BKFM6EJV.js +462 -0
  30. package/dist/chunk-BMS5RKQY.js +27 -0
  31. package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
  32. package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
  33. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  34. package/dist/chunk-C2LTL2W6.js +2447 -0
  35. package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
  36. package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
  37. package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
  38. package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
  39. package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
  40. package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
  41. package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
  42. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  43. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  44. package/dist/chunk-GKF55TAZ.js +391 -0
  45. package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
  46. package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
  47. package/dist/chunk-HHV2GANA.js +88 -0
  48. package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
  49. package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
  50. package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
  51. package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
  52. package/dist/chunk-HZHHCK24.js +1631 -0
  53. package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
  54. package/dist/chunk-IBEBSCYA.js +564 -0
  55. package/dist/chunk-IQ7KR472.js +362 -0
  56. package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
  57. package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
  58. package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
  59. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  60. package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
  61. package/dist/chunk-KMVISBZR.js +132 -0
  62. package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
  63. package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
  64. package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
  65. package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
  66. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  67. package/dist/chunk-NEKRRTYW.js +56 -0
  68. package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
  69. package/dist/chunk-NHLBIGRH.js +1506 -0
  70. package/dist/chunk-NQQH3YT7.js +302 -0
  71. package/dist/chunk-NYS75XW5.js +15 -0
  72. package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
  73. package/dist/{chunk-EMYUUSFG.js → chunk-O6TL7WWY.js} +6 -6
  74. package/dist/chunk-OQBA45DZ.js +97 -0
  75. package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
  76. package/dist/chunk-PMZCIOCJ.js +25 -0
  77. package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
  78. package/dist/{chunk-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
  79. package/dist/chunk-QDC3K2U3.js +262 -0
  80. package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
  81. package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
  82. package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
  83. package/dist/chunk-QSNYB6ZV.js +195 -0
  84. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  85. package/dist/chunk-RKKLTLYB.js +45 -0
  86. package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
  87. package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
  88. package/dist/chunk-SUCTJL45.js +45 -0
  89. package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
  90. package/dist/chunk-T56WDKA5.js +183 -0
  91. package/dist/chunk-TVHHYFHE.js +255 -0
  92. package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
  93. package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
  94. package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
  95. package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
  96. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  97. package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
  98. package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
  99. package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
  100. package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
  101. package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
  102. package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
  103. package/dist/chunk-VO67MWHC.js +75 -0
  104. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  105. package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
  106. package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
  107. package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
  108. package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
  109. package/dist/chunk-X75E3D2N.js +686 -0
  110. package/dist/{chunk-VAWNZU7Z.js → chunk-YDFRH54B.js} +4 -4
  111. package/dist/chunk-YJX4SHTD.js +40 -0
  112. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  113. package/dist/chunk-Z2RR6MAK.js +127 -0
  114. package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
  115. package/dist/cli/index.js +47 -36
  116. package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
  117. package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
  118. package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
  119. package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
  120. package/dist/{config-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
  121. package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
  122. package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
  123. package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
  124. package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
  125. package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
  126. package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
  127. package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
  128. package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
  129. package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
  130. package/dist/doctor-QOA5FNY5.js +313 -0
  131. package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
  132. package/dist/eval-inventory-SXH7PDKX.js +316 -0
  133. package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
  134. package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
  135. package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
  136. package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
  137. package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
  138. package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
  139. package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
  140. package/dist/fleet-inspect-VLY4S7QM.js +442 -0
  141. package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
  142. package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
  143. package/dist/fleet-verify-JFEL2L3H.js +175 -0
  144. package/dist/fleet-view-ZCON35AG.js +102 -0
  145. package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
  146. package/dist/install-XGLBQY5E.js +13 -0
  147. package/dist/interop-OZBKXAYL.js +114 -0
  148. package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
  149. package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
  150. package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
  151. package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
  152. package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
  153. package/dist/panes-HMABYVO4.js +58 -0
  154. package/dist/panes-KY6W3V2E.js +103 -0
  155. package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
  156. package/dist/{reset-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
  157. package/dist/resources-BB3MVJMD.js +111 -0
  158. package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
  159. package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
  160. package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
  161. package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
  162. package/dist/skills-inventory-S4MXPJFV.js +126 -0
  163. package/dist/slash-commands-ZSGASKJC.js +77 -0
  164. package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
  165. package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
  166. package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
  167. package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
  168. package/dist/tools-DAF3DI3C.js +27 -0
  169. package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
  170. package/dist/tui-primitives-2AKXQNZK.js +13 -0
  171. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
  172. package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
  173. package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
  174. package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
  175. package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
  176. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
  177. package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
  178. package/dist/with-panes-MKB46MPQ.js +782 -0
  179. package/dist/worker/entry.js +106 -75
  180. package/docs/README.md +3 -2
  181. package/docs/acp.md +24 -3
  182. package/docs/alcf-provider.md +1 -1
  183. package/docs/architecture.md +2 -2
  184. package/docs/artifact-versions.md +9 -1
  185. package/docs/built-in-agents.md +1 -1
  186. package/docs/capacity-and-scheduling.md +62 -3
  187. package/docs/commands-and-modes.md +31 -2
  188. package/docs/configuration-and-targets.md +69 -12
  189. package/docs/context-engine.md +63 -4
  190. package/docs/development-pipeline.md +19 -0
  191. package/docs/dispatch-typed-intent.md +385 -0
  192. package/docs/documentation-coverage.md +5 -5
  193. package/docs/documentation-guide.md +1 -1
  194. package/docs/environment-variables.md +3 -0
  195. package/docs/eval-runner.md +262 -11
  196. package/docs/evals-internal.md +72 -2
  197. package/docs/evidence-and-memory.md +12 -11
  198. package/docs/evolution.md +1 -1
  199. package/docs/exit-codes-and-output.md +1 -1
  200. package/docs/extensions-and-sharing.md +27 -1
  201. package/docs/fleet-dispatch.md +25 -4
  202. package/docs/installation-and-lifecycle.md +15 -2
  203. package/docs/middleware-and-components.md +1 -1
  204. package/docs/model-catalog.md +10 -1
  205. package/docs/observability.md +55 -4
  206. package/docs/proactive-memory.md +127 -14
  207. package/docs/prompt-envelope-and-tools.md +19 -1
  208. package/docs/provider-adapter-cookbook.md +1 -1
  209. package/docs/release-cut-checklist.md +19 -3
  210. package/docs/safety-model.md +2 -2
  211. package/docs/scientific-validation.md +3 -3
  212. package/docs/session-lifecycle.md +1 -1
  213. package/docs/skills-marketplace.md +1 -1
  214. package/docs/tool-usage.md +18 -8
  215. package/docs/trace-store.md +1 -1
  216. package/docs/troubleshooting.md +88 -1
  217. package/docs/tui-design.md +1 -1
  218. package/docs/worker-dispatch-mechanics.md +1 -1
  219. package/package.json +5 -2
  220. package/src/cli/acp.ts +6 -2
  221. package/src/cli/agents.ts +1 -1
  222. package/src/cli/argv.ts +25 -0
  223. package/src/cli/config-inspect.ts +33 -6
  224. package/src/cli/config.ts +1 -1
  225. package/src/cli/configure.ts +23 -21
  226. package/src/cli/doctor-panes.ts +124 -0
  227. package/src/cli/doctor-state-size.ts +82 -0
  228. package/src/cli/doctor-toolchain.ts +57 -0
  229. package/src/cli/doctor.ts +22 -1
  230. package/src/cli/eval-inventory.ts +436 -0
  231. package/src/cli/eval.ts +93 -16
  232. package/src/cli/evidence-detail.ts +88 -0
  233. package/src/cli/evidence-inventory.ts +183 -0
  234. package/src/cli/evidence.ts +30 -5
  235. package/src/cli/extensions.ts +5 -1
  236. package/src/cli/fleet-decisions.ts +69 -0
  237. package/src/cli/fleet-inspect.ts +334 -0
  238. package/src/cli/fleet-verify.ts +133 -0
  239. package/src/cli/fleet-view.ts +810 -0
  240. package/src/cli/fleet.ts +179 -39
  241. package/src/cli/index.ts +14 -2
  242. package/src/cli/interop-inspect.ts +128 -0
  243. package/src/cli/interop.ts +34 -0
  244. package/src/cli/panes.ts +35 -0
  245. package/src/cli/reset.ts +5 -2
  246. package/src/cli/run.ts +58 -0
  247. package/src/cli/skills-inventory.ts +185 -0
  248. package/src/cli/skills.ts +16 -13
  249. package/src/cli/targets.ts +44 -13
  250. package/src/cli/tools.ts +321 -0
  251. package/src/cli/trace-inspect.ts +252 -0
  252. package/src/cli/trace.ts +85 -5
  253. package/src/cli/usage.ts +63 -14
  254. package/src/cli/verifiers-inspect.ts +347 -0
  255. package/src/cli/verifiers.ts +9 -0
  256. package/src/core/bus-events.ts +33 -1
  257. package/src/core/cache-telemetry.ts +42 -0
  258. package/src/core/config.ts +67 -0
  259. package/src/core/defaults.ts +124 -8
  260. package/src/core/endpoint-key.ts +27 -0
  261. package/src/core/residency-target-key.ts +25 -0
  262. package/src/core/response-schema.ts +80 -6
  263. package/src/core/theme-token-hex.ts +43 -0
  264. package/src/core/tool-names.ts +2 -1
  265. package/src/core/xdg.ts +1 -1
  266. package/src/domains/agents/fleets/build-review.md +0 -3
  267. package/src/domains/agents/fleets/build-test.md +0 -3
  268. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  269. package/src/domains/agents/result-contract.ts +164 -35
  270. package/src/domains/config/classify.ts +6 -0
  271. package/src/domains/context/codewiki/coordinator.ts +12 -4
  272. package/src/domains/dispatch/admission-error.ts +9 -0
  273. package/src/domains/dispatch/admission.ts +52 -14
  274. package/src/domains/dispatch/capacity-lease.ts +118 -9
  275. package/src/domains/dispatch/contract.ts +11 -0
  276. package/src/domains/dispatch/council-topology.ts +398 -0
  277. package/src/domains/dispatch/execution-plan.ts +44 -4
  278. package/src/domains/dispatch/extension.ts +378 -82
  279. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  280. package/src/domains/dispatch/fleet-plan.ts +7 -2
  281. package/src/domains/dispatch/fleet-run.ts +87 -4
  282. package/src/domains/dispatch/gate-decisions.ts +11 -1
  283. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  284. package/src/domains/dispatch/gate-topology.ts +289 -0
  285. package/src/domains/dispatch/heartbeat.ts +32 -8
  286. package/src/domains/dispatch/index.ts +22 -0
  287. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  288. package/src/domains/dispatch/intent.ts +85 -1
  289. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  290. package/src/domains/dispatch/reservation-store.ts +139 -11
  291. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  292. package/src/domains/dispatch/run-event-journal.ts +598 -0
  293. package/src/domains/dispatch/state.ts +49 -1
  294. package/src/domains/dispatch/types.ts +13 -0
  295. package/src/domains/dispatch/validation.ts +33 -8
  296. package/src/domains/dispatch/worker-spawn.ts +25 -11
  297. package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
  298. package/src/domains/dispatch/write-boundary.ts +62 -1
  299. package/src/domains/eval/artifacts/store.ts +62 -0
  300. package/src/domains/eval/compare/behavioral.ts +224 -0
  301. package/src/domains/eval/compare/compare.ts +342 -2
  302. package/src/domains/eval/compare/envelope.ts +128 -0
  303. package/src/domains/eval/compare/gates.ts +24 -6
  304. package/src/domains/eval/compare/thresholds.ts +30 -3
  305. package/src/domains/eval/execution-provenance.ts +240 -0
  306. package/src/domains/eval/inventory.ts +113 -0
  307. package/src/domains/eval/metrics/aggregate.ts +136 -0
  308. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  309. package/src/domains/eval/metrics/tracked.ts +413 -0
  310. package/src/domains/eval/provenance.ts +117 -0
  311. package/src/domains/eval/reports/comparison.ts +128 -0
  312. package/src/domains/eval/reports/junit.ts +17 -3
  313. package/src/domains/eval/reports/markdown.ts +3 -3
  314. package/src/domains/eval/reports/text.ts +14 -0
  315. package/src/domains/eval/run-compare.ts +20 -0
  316. package/src/domains/eval/runners/clio-run.ts +127 -0
  317. package/src/domains/eval/runners/external-command.ts +28 -3
  318. package/src/domains/eval/schema/adapter.ts +111 -0
  319. package/src/domains/eval/schema/artifact.ts +20 -0
  320. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  321. package/src/domains/eval/schema/behavioral.ts +520 -0
  322. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  323. package/src/domains/eval/schema/serving.ts +105 -0
  324. package/src/domains/eval/schema/suite.ts +38 -8
  325. package/src/domains/eval/schema/validate.ts +58 -3
  326. package/src/domains/eval/schema/verdict.ts +237 -0
  327. package/src/domains/eval/suites/resolve.ts +2 -0
  328. package/src/domains/eval/suites/run.ts +264 -33
  329. package/src/domains/eval/verifiers/command.ts +2 -1
  330. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  331. package/src/domains/evidence/build.ts +2 -13
  332. package/src/domains/evidence/eval.ts +2 -12
  333. package/src/domains/evidence/findings-markdown.ts +33 -0
  334. package/src/domains/evidence/run-trust.ts +7 -113
  335. package/src/domains/evidence/store.ts +6 -0
  336. package/src/domains/evidence/trust-projection.ts +2 -2
  337. package/src/domains/extensions/compatibility.ts +285 -0
  338. package/src/domains/extensions/discovery.ts +38 -3
  339. package/src/domains/extensions/resources.ts +1 -1
  340. package/src/domains/extensions/state.ts +12 -3
  341. package/src/domains/extensions/types.ts +2 -0
  342. package/src/domains/lifecycle/doctor.ts +69 -1
  343. package/src/domains/memory/index.ts +14 -1
  344. package/src/domains/memory/task-bank-promotion.ts +64 -0
  345. package/src/domains/memory/task-memory-policy.ts +82 -17
  346. package/src/domains/memory/task-memory-spend.ts +131 -0
  347. package/src/domains/memory/task-memory-status.ts +7 -0
  348. package/src/domains/memory/task-memory-telemetry.ts +3 -0
  349. package/src/domains/middleware/index.ts +1 -0
  350. package/src/domains/middleware/memory-intervention.ts +97 -21
  351. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  352. package/src/domains/mux/contract.ts +434 -0
  353. package/src/domains/mux/detect.ts +158 -0
  354. package/src/domains/mux/extension.ts +47 -0
  355. package/src/domains/mux/index.ts +96 -0
  356. package/src/domains/mux/manifest.ts +6 -0
  357. package/src/domains/mux/operations.ts +164 -0
  358. package/src/domains/mux/pane-registry.ts +90 -0
  359. package/src/domains/mux/protocol.ts +49 -0
  360. package/src/domains/mux/socket-client.ts +816 -0
  361. package/src/domains/mux/types.ts +222 -0
  362. package/src/domains/mux/viewer-command.ts +59 -0
  363. package/src/domains/mux/yazi/assets/init.lua +2 -0
  364. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  365. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  366. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  367. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  368. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  369. package/src/domains/mux/yazi/event-stream.ts +180 -0
  370. package/src/domains/mux/yazi/profile.ts +299 -0
  371. package/src/domains/mux/yazi/session.ts +228 -0
  372. package/src/domains/mux/yazi/theme.ts +30 -0
  373. package/src/domains/observability/background-memory-usage.ts +140 -0
  374. package/src/domains/observability/cost.ts +22 -1
  375. package/src/domains/observability/index.ts +9 -0
  376. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  377. package/src/domains/observability/trace-store.ts +234 -2
  378. package/src/domains/prompts/compiler.ts +100 -13
  379. package/src/domains/providers/endpoint-capacity.ts +228 -0
  380. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  381. package/src/domains/providers/extension.ts +20 -3
  382. package/src/domains/providers/index.ts +32 -0
  383. package/src/domains/providers/model-runtime-capabilities.ts +32 -0
  384. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  385. package/src/domains/providers/runtime-resolution.ts +8 -1
  386. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  387. package/src/domains/providers/runtimes/builtins.ts +2 -0
  388. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  389. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  390. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  391. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  392. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  393. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  394. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  395. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  396. package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
  397. package/src/domains/providers/support.ts +1 -0
  398. package/src/domains/providers/target-model-cache.ts +124 -0
  399. package/src/domains/providers/types/capability-flags.ts +2 -0
  400. package/src/domains/providers/types/target-descriptor.ts +2 -0
  401. package/src/domains/resources/index.ts +3 -0
  402. package/src/domains/resources/prompts/loader.ts +95 -33
  403. package/src/domains/resources/skills/loader.ts +33 -0
  404. package/src/domains/safety/action-classifier.ts +6 -0
  405. package/src/domains/safety/call-target.ts +52 -0
  406. package/src/domains/safety/run-effects.ts +35 -4
  407. package/src/domains/session/context-accounting.ts +52 -1
  408. package/src/domains/session/context-ledger.ts +37 -13
  409. package/src/domains/session/index.ts +6 -0
  410. package/src/domains/session/prompt-cache.ts +140 -0
  411. package/src/domains/session/prompt-manifest.ts +42 -0
  412. package/src/domains/toolchain/archive.ts +175 -0
  413. package/src/domains/toolchain/contract.ts +28 -0
  414. package/src/domains/toolchain/extension.ts +47 -0
  415. package/src/domains/toolchain/index.ts +39 -0
  416. package/src/domains/toolchain/install.ts +327 -0
  417. package/src/domains/toolchain/manifest.ts +8 -0
  418. package/src/domains/toolchain/paths.ts +34 -0
  419. package/src/domains/toolchain/registry.ts +265 -0
  420. package/src/domains/toolchain/remove.ts +218 -0
  421. package/src/domains/toolchain/resolve.ts +182 -0
  422. package/src/domains/toolchain/types.ts +113 -0
  423. package/src/domains/toolchain/version.ts +88 -0
  424. package/src/engine/acp/adapter.ts +18 -3
  425. package/src/engine/acp/server.ts +413 -70
  426. package/src/engine/acp/types.ts +19 -1
  427. package/src/engine/ai.ts +35 -0
  428. package/src/engine/apis/llamacpp-residency.ts +55 -3
  429. package/src/engine/apis/lmstudio.ts +25 -5
  430. package/src/engine/apis/ollama-native.ts +2 -1
  431. package/src/engine/apis/openai-completions.ts +80 -17
  432. package/src/engine/apis/residency-lock.ts +3 -1
  433. package/src/engine/apis/residency.ts +34 -1
  434. package/src/engine/claude/sdk-module.ts +98 -0
  435. package/src/engine/claude/sdk-runtime.ts +19 -11
  436. package/src/engine/provider-payload.ts +29 -1
  437. package/src/engine/tui-primitives.ts +21 -0
  438. package/src/engine/tui.ts +1 -0
  439. package/src/engine/worker-runtime.ts +2 -13
  440. package/src/entry/boot-options.ts +2 -0
  441. package/src/entry/orchestrator.ts +279 -35
  442. package/src/entry/panes-activation.ts +31 -0
  443. package/src/entry/with-panes.ts +20 -0
  444. package/src/interactive/chat-loop-messages.ts +26 -7
  445. package/src/interactive/chat-loop.ts +318 -41
  446. package/src/interactive/chat-panel.ts +62 -8
  447. package/src/interactive/clio-editor.ts +45 -8
  448. package/src/interactive/context-activity.ts +5 -1
  449. package/src/interactive/context-meter.ts +1 -1
  450. package/src/interactive/context-overlay.ts +41 -10
  451. package/src/interactive/cost-overlay.ts +66 -6
  452. package/src/interactive/council-grid.ts +1 -3
  453. package/src/interactive/council.ts +11 -0
  454. package/src/interactive/dispatch-board.ts +102 -20
  455. package/src/interactive/fleet-run-preview.ts +41 -15
  456. package/src/interactive/handoff-round.ts +41 -2
  457. package/src/interactive/interactive-application.ts +177 -7
  458. package/src/interactive/interactive-input-runtime.ts +15 -0
  459. package/src/interactive/interactive-presentation.ts +4 -0
  460. package/src/interactive/interactive-shell.ts +20 -17
  461. package/src/interactive/interactive-slash-runtime.ts +63 -10
  462. package/src/interactive/memory-overlay.ts +9 -0
  463. package/src/interactive/modal-marker.ts +170 -0
  464. package/src/interactive/mutation-preview.ts +295 -0
  465. package/src/interactive/mux-bridge.ts +214 -0
  466. package/src/interactive/overlay-frame.ts +58 -2
  467. package/src/interactive/overlay-general-openers.ts +17 -0
  468. package/src/interactive/overlay-key-routing.ts +52 -3
  469. package/src/interactive/overlay-lifecycle.ts +56 -7
  470. package/src/interactive/overlay-model-selectors.ts +40 -3
  471. package/src/interactive/overlay-permission-lifecycle.ts +112 -24
  472. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  473. package/src/interactive/overlay-transitions.ts +18 -4
  474. package/src/interactive/overlays/agents.ts +1 -0
  475. package/src/interactive/overlays/ask-user.ts +227 -49
  476. package/src/interactive/overlays/auth-dialog.ts +1 -0
  477. package/src/interactive/overlays/context-reset.ts +1 -0
  478. package/src/interactive/overlays/cwd-fallback.ts +1 -0
  479. package/src/interactive/overlays/decisions.ts +11 -11
  480. package/src/interactive/overlays/extensions.ts +1 -0
  481. package/src/interactive/overlays/fleet-run-approval.ts +1 -0
  482. package/src/interactive/overlays/handoff-review.ts +1 -0
  483. package/src/interactive/overlays/help-reference.ts +6 -0
  484. package/src/interactive/overlays/interop.ts +1 -0
  485. package/src/interactive/overlays/library-install-confirm.ts +1 -0
  486. package/src/interactive/overlays/library-tabs.ts +28 -0
  487. package/src/interactive/overlays/list-overlay.ts +10 -1
  488. package/src/interactive/overlays/message-picker.ts +1 -0
  489. package/src/interactive/overlays/model-scope.ts +86 -0
  490. package/src/interactive/overlays/model-selector.ts +1 -0
  491. package/src/interactive/overlays/prompts.ts +12 -1
  492. package/src/interactive/overlays/session-selector.ts +1 -0
  493. package/src/interactive/overlays/settings-sections.ts +30 -0
  494. package/src/interactive/overlays/settings.ts +614 -45
  495. package/src/interactive/overlays/side-question.ts +1 -0
  496. package/src/interactive/overlays/skills-hub.ts +3 -11
  497. package/src/interactive/overlays/tree-selector.ts +1 -0
  498. package/src/interactive/pane-policy.ts +46 -0
  499. package/src/interactive/panes-runtime.ts +292 -0
  500. package/src/interactive/permission-hint.ts +34 -2
  501. package/src/interactive/permission-overlay.ts +159 -9
  502. package/src/interactive/prewarm.ts +197 -0
  503. package/src/interactive/render-trace.ts +162 -15
  504. package/src/interactive/renderers/compaction-summary.ts +29 -0
  505. package/src/interactive/renderers/tool-execution.ts +4 -0
  506. package/src/interactive/renderers/worker-entry.ts +122 -14
  507. package/src/interactive/side-question.ts +58 -1
  508. package/src/interactive/slash-commands.ts +251 -15
  509. package/src/interactive/status/controller.ts +11 -0
  510. package/src/interactive/status/state-machine.ts +54 -2
  511. package/src/interactive/status/types.ts +7 -0
  512. package/src/interactive/tasks-overlay.ts +1 -0
  513. package/src/interactive/terminal-lease.ts +2 -0
  514. package/src/interactive/theme/tokens.ts +3 -14
  515. package/src/interactive/turn-context.ts +346 -33
  516. package/src/interactive/turn-persistence.ts +14 -4
  517. package/src/interactive/turn-prewarm.ts +364 -0
  518. package/src/interactive/turn-queues.ts +7 -4
  519. package/src/interactive/turn-runtime.ts +8 -1
  520. package/src/interactive/turn-state.ts +23 -0
  521. package/src/interactive/view/artifacts.ts +109 -1
  522. package/src/interactive/view/view-overlay.ts +29 -3
  523. package/src/interactive/watch-pane.ts +152 -0
  524. package/src/interactive/worker-progress.ts +7 -1
  525. package/src/interactive/worker-receipts.ts +19 -1
  526. package/src/interactive/worker-stream.ts +5 -0
  527. package/src/interactive/yazi-bridge.ts +444 -0
  528. package/src/tools/ask-user.ts +43 -2
  529. package/src/tools/bootstrap.ts +26 -2
  530. package/src/tools/builtin-tool-catalog.ts +15 -0
  531. package/src/tools/compete-worktrees.ts +83 -2
  532. package/src/tools/core-bootstrap.ts +2 -1
  533. package/src/tools/dispatch-admission.ts +14 -3
  534. package/src/tools/dispatch-arguments.ts +20 -20
  535. package/src/tools/dispatch-plan.ts +17 -9
  536. package/src/tools/dispatch-run-events.ts +134 -19
  537. package/src/tools/dispatch-runner.ts +29 -7
  538. package/src/tools/dispatch-scout.ts +1 -1
  539. package/src/tools/dispatch-types.ts +15 -3
  540. package/src/tools/dispatch.ts +1 -1
  541. package/src/tools/executables.ts +17 -14
  542. package/src/tools/observation.ts +54 -4
  543. package/src/tools/panes-surface.ts +38 -0
  544. package/src/tools/panes.ts +112 -0
  545. package/src/tools/policy.ts +10 -1
  546. package/src/tools/presentation.ts +1 -0
  547. package/src/tools/registry.ts +16 -0
  548. package/dist/chunk-AOCYTWAV.js +0 -449
  549. package/dist/chunk-HLE42MG7.js +0 -37
  550. package/dist/chunk-HWUFFB6L.js +0 -83
  551. package/dist/chunk-JOZYP4GM.js +0 -279
  552. package/dist/doctor-M7YEDGAE.js +0 -91
@@ -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;
@@ -464,6 +466,15 @@ export class ClioOverlayFrame implements Component {
464
466
  * screen at 40x12. It learns the terminal height through the `visible`
465
467
  * predicate, which the engine evaluates with the live dimensions in the same
466
468
  * pass that renders the overlay.
469
+ *
470
+ * This is also where the modal marker is claimed and released. Every framed
471
+ * overlay is modal and every modal is framed: the only two overlays Clio shows
472
+ * without a frame are the context and task islands, and both pass
473
+ * `nonCapturing: true` straight to the engine. Hanging the marker here rather
474
+ * than on the overlay lifecycle therefore covers the nested frames the
475
+ * lifecycle's single `OverlayState` cannot see, and it cannot drift out of
476
+ * sync with what actually owns the keyboard, because the same call that takes
477
+ * the screen takes the marker.
467
478
  */
468
479
  export function showClioOverlayFrame(
469
480
  tui: TUI,
@@ -473,12 +484,21 @@ export function showClioOverlayFrame(
473
484
  footerHint?: string | ((innerWidth: number) => string | undefined);
474
485
  /** Border and title token; omitted leaves the informational frame. */
475
486
  tone?: OverlayTone;
487
+ /**
488
+ * Stable id for the modal marker, published on the terminal title while
489
+ * this overlay owns the keys. Required, and deliberately not defaulted
490
+ * from `title`: several titles carry a session id, a decision
491
+ * classification, or the active tab, and an id that moves with the
492
+ * content is not an identifier. Use `modalMarkerId(...)` where the title
493
+ * really is fixed and surface-specific.
494
+ */
495
+ markerId: string;
476
496
  },
477
497
  ): OverlayHandle {
478
- const { title, footerHint, tone, width, visible, maxHeight, margin, ...overlayOptions } = options;
498
+ const { title, footerHint, tone, width, visible, maxHeight, margin, markerId, ...overlayOptions } = options;
479
499
  const boxWidth = typeof width === "number" ? width : 0;
480
500
  const frame = new ClioOverlayFrame(child, title, footerHint, boxWidth, frameAlignForAnchor(options.anchor), tone);
481
- return tui.showOverlay(frame, {
501
+ const handle = tui.showOverlay(frame, {
482
502
  ...overlayOptions,
483
503
  ...(margin !== undefined ? { margin } : {}),
484
504
  width: "100%",
@@ -493,6 +513,42 @@ export function showClioOverlayFrame(
493
513
  return shown;
494
514
  },
495
515
  });
516
+ const marker = enterModal(markerId, modalMarkerSink(tui));
517
+ return {
518
+ hide(): void {
519
+ marker.release();
520
+ handle.hide();
521
+ },
522
+ setHidden(hidden: boolean): void {
523
+ marker.setActive(!hidden);
524
+ handle.setHidden(hidden);
525
+ },
526
+ isHidden: (): boolean => handle.isHidden(),
527
+ focus(): void {
528
+ marker.raise();
529
+ handle.focus();
530
+ },
531
+ // A pure passthrough on purpose. The engine hands focus to the next
532
+ // visible capturing overlay, which is another modal, so the stack is
533
+ // unchanged; the surface that gives the keyboard back to the composer
534
+ // does it by hiding, which `setHidden` already reports.
535
+ unfocus: (unfocusOptions?: OverlayUnfocusOptions): void =>
536
+ unfocusOptions ? handle.unfocus(unfocusOptions) : handle.unfocus(),
537
+ isFocused: (): boolean => handle.isFocused(),
538
+ };
539
+ }
540
+
541
+ /**
542
+ * The title sink behind a TUI, or null when there is none.
543
+ *
544
+ * The engine's `Terminal` declares `setTitle`, but the stub TUIs the overlay
545
+ * tests mount against are structural casts that carry only what the overlay
546
+ * under test reads. Probing for the method keeps the marker inert on those
547
+ * rather than throwing inside a render path.
548
+ */
549
+ function modalMarkerSink(tui: TUI): ModalMarkerSink | null {
550
+ const terminal: Partial<ModalMarkerSink> | undefined = tui.terminal;
551
+ return typeof terminal?.setTitle === "function" ? (terminal as ModalMarkerSink) : null;
496
552
  }
497
553
 
498
554
  /** 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 { foregroundStreamUsage } from "../domains/providers/index.js";
15
16
  import type { ContextLedger } from "../domains/session/context-ledger.js";
16
17
  import type { SessionMeta } from "../domains/session/index.js";
17
18
  import { foldSessionArtifacts } from "../domains/session/session-artifacts.js";
@@ -147,6 +148,11 @@ export function createOverlayGeneralOpeners(deps: OverlayGeneralOpenersDeps): Ov
147
148
  deps.transitions.state = "cost";
148
149
  deps.transitions.handle = openCostOverlayFactory(deps.tui, deps.observability, {
149
150
  sessionId: deps.getSessionId?.() ?? null,
151
+ ...(deps.readSessionEntries
152
+ ? {
153
+ getSessionEntries: () => deps.readSessionEntries?.() ?? [],
154
+ }
155
+ : {}),
150
156
  });
151
157
  deps.requestRender();
152
158
  };
@@ -328,6 +334,7 @@ export function createOverlayGeneralOpeners(deps: OverlayGeneralOpenersDeps): Ov
328
334
  deps.transitions.state = "dispatch-board";
329
335
  deps.dispatchBoard.resetSelection();
330
336
  deps.transitions.handle = showOverlayFrameFactory(deps.tui, deps.dispatchBoard, {
337
+ markerId: "dispatch-board",
331
338
  title: "Fleet Runs",
332
339
  footerHint: dispatchBoardHint,
333
340
  anchor: "center",
@@ -429,10 +436,20 @@ export function createOverlayGeneralOpeners(deps: OverlayGeneralOpenersDeps): Ov
429
436
  };
430
437
  const resolution = deps.dispatch.preview?.(request);
431
438
  if (!resolution) return null;
439
+ const foregroundHeld =
440
+ resolution.endpoint === undefined ? 0 : (foregroundStreamUsage()[resolution.endpoint.key] ?? 0);
432
441
  return {
433
442
  targetId: resolution.targetId,
434
443
  wireModelId: resolution.wireModelId,
435
444
  nodeId: resolution.node.id,
445
+ ...(resolution.endpoint !== undefined
446
+ ? {
447
+ endpoint: {
448
+ ...resolution.endpoint,
449
+ ...(foregroundHeld > 0 ? { foregroundHeld } : {}),
450
+ },
451
+ }
452
+ : {}),
436
453
  };
437
454
  },
438
455
  });
@@ -1,5 +1,6 @@
1
1
  import type { ClioKeybinding } from "../domains/config/keybindings.js";
2
2
  import { isKeyRelease, matchesKey } from "../engine/tui.js";
3
+ import { MUTATION_PREVIEW_KEY } from "./permission-hint.js";
3
4
 
4
5
  export type OverlayState =
5
6
  | "closed"
@@ -14,6 +15,7 @@ export type OverlayState =
14
15
  | "memory"
15
16
  | "view"
16
17
  | "model"
18
+ | "model-scope"
17
19
  | "settings"
18
20
  | "resume"
19
21
  | "tree"
@@ -47,6 +49,11 @@ export interface PermissionOverlayKeyDeps {
47
49
  * the call. Only the deletion keys in `isDraftEditKey` arrive here.
48
50
  */
49
51
  editDraft?: (data: string) => void;
52
+ /** Whether this card has a mutation the operator can read locally (issue #254). */
53
+ canInspectMutation?: () => boolean;
54
+ isInspectingMutation?: () => boolean;
55
+ toggleMutationInspection?: () => void;
56
+ scrollMutationInspection?: (delta: number) => void;
50
57
  }
51
58
 
52
59
  export interface DispatchBoardOverlayKeyDeps {
@@ -57,6 +64,12 @@ export interface DispatchBoardOverlayKeyDeps {
57
64
  cancelSelectedDispatch: () => void;
58
65
  /** Open or close the selected run's worker-progress detail. */
59
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;
60
73
  }
61
74
 
62
75
  interface CloseOverlayKeyDeps {
@@ -85,6 +98,18 @@ function isDraftEditKey(data: string): boolean {
85
98
  return !isKeyRelease(data) && DRAFT_EDIT_KEYS.some((key) => matchesKey(data, key));
86
99
  }
87
100
 
101
+ /** Rows one page key moves the open mutation. Matches the window the card renders. */
102
+ const MUTATION_PAGE_ROWS = 16;
103
+
104
+ /** How far a key scrolls the open mutation, or 0 when the key is not a scroll key. */
105
+ function mutationScrollDelta(data: string): number {
106
+ if (matchesKey(data, "up")) return -1;
107
+ if (matchesKey(data, "down")) return 1;
108
+ if (matchesKey(data, "pageUp")) return -MUTATION_PAGE_ROWS;
109
+ if (matchesKey(data, "pageDown")) return MUTATION_PAGE_ROWS;
110
+ return 0;
111
+ }
112
+
88
113
  /** Pure permission overlay key router: returns true when the input was consumed. */
89
114
  export function routePermissionOverlayKey(data: string, deps: PermissionOverlayKeyDeps): boolean {
90
115
  if (matchesKey(data, "enter") && !isKeyRelease(data)) {
@@ -98,6 +123,26 @@ export function routePermissionOverlayKey(data: string, deps: PermissionOverlayK
98
123
  deps.editDraft(data);
99
124
  return true;
100
125
  }
126
+ // Reading the mutation is the one thing this dialog does that is not an
127
+ // answer, so it toggles rather than navigating away: Enter, `s`, and Esc keep
128
+ // their meanings the whole time the mutation is on screen, and `v` is what
129
+ // puts it away. A card with nothing local to inspect leaves the key inert.
130
+ if (
131
+ matchesKey(data, MUTATION_PREVIEW_KEY) &&
132
+ !isKeyRelease(data) &&
133
+ (deps.canInspectMutation?.() ?? false) &&
134
+ deps.toggleMutationInspection
135
+ ) {
136
+ deps.toggleMutationInspection();
137
+ return true;
138
+ }
139
+ if ((deps.isInspectingMutation?.() ?? false) && deps.scrollMutationInspection && !isKeyRelease(data)) {
140
+ const delta = mutationScrollDelta(data);
141
+ if (delta !== 0) {
142
+ deps.scrollMutationInspection(delta);
143
+ return true;
144
+ }
145
+ }
101
146
  if (isEscapeKey(data)) {
102
147
  deps.cancelPermission();
103
148
  return true;
@@ -135,10 +180,11 @@ export function routeDispatchBoardOverlayKey(data: string, deps: DispatchBoardOv
135
180
  deps.cancelSelectedDispatch();
136
181
  return true;
137
182
  }
138
- // Worker progress is expanded detail the operator asks for. The default list
139
- // 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.
140
186
  if (matchesKey(data, "enter")) {
141
- deps.toggleSelectedDispatchDetail();
187
+ if (!deps.watchSelectedDispatch()) deps.toggleSelectedDispatchDetail();
142
188
  return true;
143
189
  }
144
190
  return false;
@@ -242,6 +288,9 @@ export function routeOverlayKey(
242
288
  if (overlayState === "memory") return false;
243
289
  if (overlayState === "view") return false;
244
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;
245
294
  // Settings owns Esc itself: its stack is sections → rows → detail, and a
246
295
  // router-level close made every Esc leave the overlay from wherever the
247
296
  // operator was, so a cancelled picker and a finished visit looked the same.
@@ -12,6 +12,7 @@ import { createOverlayTransitions } from "./overlay-transitions.js";
12
12
  import {
13
13
  createPermissionOverlayBody,
14
14
  PERMISSION_OVERLAY_WIDTH,
15
+ type PermissionOverlayBodyHandle,
15
16
  permissionOverlayHint,
16
17
  permissionOverlayPlacement,
17
18
  permissionOverlayTitle,
@@ -21,6 +22,7 @@ import {
21
22
  export * from "./overlay-key-routing.js";
22
23
 
23
24
  import type { OverlayState } from "./overlay-key-routing.js";
25
+ import type { PendingModelScope } from "./overlays/model-scope.js";
24
26
  import type { SettingsCenterRowId, SettingsSectionId } from "./overlays/settings.js";
25
27
 
26
28
  // Runtime lifecycle construction lives beside the pure modal key router so the
@@ -47,6 +49,7 @@ export type OverlayLifecycleApplicationDeps = Pick<
47
49
  | "onNewSession"
48
50
  | "onResumeSession"
49
51
  | "onSelectModel"
52
+ | "onSetThinkingLevel"
50
53
  | "providers"
51
54
  | "readSessionEntries"
52
55
  | "registerAskUserHandler"
@@ -107,6 +110,7 @@ export interface OverlayLifecycleRuntimeDeps {
107
110
  openAuthDialog?: typeof import("./overlays/auth-dialog.js").openAuthDialog;
108
111
  openAskUserOverlay?: typeof import("./overlays/ask-user.js").openAskUserOverlay;
109
112
  openModelOverlay?: typeof import("./overlays/model-selector.js").openModelOverlay;
113
+ openModelScopeOverlay?: typeof import("./overlays/model-scope.js").openModelScopeOverlay;
110
114
  openSettingsOverlay?: typeof import("./overlays/settings.js").openSettingsOverlay;
111
115
  openSessionOverlay?: typeof import("./overlays/session-selector.js").openSessionOverlay;
112
116
  openTreeOverlay?: typeof import("./overlays/tree-selector.js").openTreeOverlay;
@@ -150,6 +154,8 @@ export interface OverlayLifecycleController {
150
154
  startHandoffState(goal: string): void;
151
155
  startFleetRunState(name: string, vars: Readonly<Record<string, string>>): void;
152
156
  openModelOverlayState(): void;
157
+ /** `/model <pattern>` and the picker both land here: choose session or global before anything applies. */
158
+ openModelScopeState(ref: PendingModelScope): void;
153
159
  openSettingsOverlayState(section?: SettingsSectionId, rowId?: SettingsCenterRowId): void;
154
160
  openResumeOverlayState(): void;
155
161
  openTreeOverlayState(): void;
@@ -163,6 +169,12 @@ export interface OverlayLifecycleController {
163
169
  toggleDispatchBoardOverlay(): void;
164
170
  confirmPermission(): void;
165
171
  stopTurnFromPermission(): void;
172
+ /** Whether the live permission card has a mutation the operator can read here. */
173
+ canInspectMutation(): boolean;
174
+ /** Whether that mutation is currently open. */
175
+ isInspectingMutation(): boolean;
176
+ toggleMutationInspection(): void;
177
+ scrollMutationInspection(delta: number): void;
166
178
  cancelAskUser(): void;
167
179
  dispose(): void;
168
180
  }
@@ -189,6 +201,7 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
189
201
  openAuthDialog: openAuthDialogFactory,
190
202
  openAskUserOverlay: openAskUserOverlayFactory,
191
203
  openModelOverlay: openModelOverlayFactory,
204
+ openModelScopeOverlay: openModelScopeOverlayFactory,
192
205
  openSettingsOverlay: openSettingsOverlayFactory,
193
206
  openSessionOverlay: openSessionOverlayFactory,
194
207
  openTreeOverlay: openTreeOverlayFactory,
@@ -210,6 +223,16 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
210
223
  } = deps;
211
224
  let overlayPermission: OverlayPermissionLifecycle | null = null;
212
225
  let overlayAskUser: OverlayAskUserLifecycle | null = null;
226
+ /**
227
+ * The live permission card's body, held only while its dialog is on screen.
228
+ * The mutation text it can show lives here and nowhere else, so dropping the
229
+ * reference when the dialog closes drops the text with it.
230
+ */
231
+ let permissionBody: PermissionOverlayBodyHandle | null = null;
232
+ const inspectionHint = (): import("./permission-hint.js").PermissionInspectionHint => {
233
+ if (permissionBody === null || !permissionBody.canInspect()) return "none";
234
+ return permissionBody.isInspecting() ? "open" : "closed";
235
+ };
213
236
  const overlayTransitions = createOverlayTransitions({
214
237
  stopDispatchBoardTicker: () => interactiveTickers.stopDispatchBoardTicker(),
215
238
  renderContextIsland: () => interactiveTickers.renderContextIsland(),
@@ -217,7 +240,10 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
217
240
  requestRender: () => tui.requestRender(),
218
241
  cancelPendingAskUser: () => overlayAskUser?.cancelPending() ?? false,
219
242
  finishAuth: (dismiss) => overlayAuth.finish(dismiss),
220
- onPermissionOverlayClosed: () => overlayPermission?.onPermissionOverlayClosed(),
243
+ onPermissionOverlayClosed: () => {
244
+ permissionBody = null;
245
+ overlayPermission?.onPermissionOverlayClosed();
246
+ },
221
247
  onOverlayClosed: () => overlayPermission?.retryPending(),
222
248
  });
223
249
  const closeOverlay = overlayTransitions.close;
@@ -248,18 +274,28 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
248
274
  dispatch: deps.app.dispatch,
249
275
  getAutonomy: () => deps.app.getSettings?.().autonomy ?? "auto-edit",
250
276
  getOverlayState: () => overlayTransitions.state,
251
- openPermissionOverlay: (view) => {
252
- if (overlayTransitions.state !== "closed") return false;
253
- overlayTransitions.state = "permission-confirm";
254
- overlayTransitions.handle = showOverlayFrame(tui, createPermissionOverlayBody(view), {
277
+ openPermissionOverlay: (view, inspect) => {
278
+ if (overlayTransitions.state === "permission-confirm") return false;
279
+ const body = createPermissionOverlayBody(view, inspect);
280
+ permissionBody = body;
281
+ const handle = showOverlayFrame(tui, body, {
255
282
  ...permissionOverlayPlacement(tui, editor, footer.view),
256
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",
257
287
  title: permissionOverlayTitle(view),
258
288
  tone: permissionOverlayTone(view),
259
289
  // Read per frame: the footer names what Enter does right now, and
260
- // that depends on whether the composer holds a draft.
261
- footerHint: (innerWidth) => permissionOverlayHint(innerWidth, editor.getText().length > 0),
290
+ // that depends on whether the composer holds a draft and on whether
291
+ // the mutation is open.
292
+ footerHint: (innerWidth) => permissionOverlayHint(innerWidth, editor.getText().length > 0, inspectionHint()),
262
293
  });
294
+ if (!overlayTransitions.showPermission(handle)) {
295
+ handle.hide();
296
+ permissionBody = null;
297
+ return false;
298
+ }
263
299
  tui.requestRender();
264
300
  return true;
265
301
  },
@@ -308,10 +344,12 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
308
344
  ...(deps.app.writeSettings ? { writeSettings: deps.app.writeSettings } : {}),
309
345
  ...(deps.app.commitSetting ? { commitSetting: deps.app.commitSetting } : {}),
310
346
  ...(deps.app.onSelectModel ? { onSelectModel: deps.app.onSelectModel } : {}),
347
+ ...(deps.app.onSetThinkingLevel ? { onSetThinkingLevel: deps.app.onSetThinkingLevel } : {}),
311
348
  ...(deps.app.getFleetNodes ? { getFleetNodes: deps.app.getFleetNodes } : {}),
312
349
  connectTarget: (targetId) => overlayAuth.openConnectFlow(targetId),
313
350
  ...(deps.app.interop ? { getInteropProposals: interopProposalsFor(deps.app.interop) } : {}),
314
351
  ...(openModelOverlayFactory ? { openModelOverlay: openModelOverlayFactory } : {}),
352
+ ...(openModelScopeOverlayFactory ? { openModelScopeOverlay: openModelScopeOverlayFactory } : {}),
315
353
  ...(openSettingsOverlayFactory ? { openSettingsOverlay: openSettingsOverlayFactory } : {}),
316
354
  });
317
355
 
@@ -443,6 +481,7 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
443
481
  startFleetRunState,
444
482
  startHandoffState,
445
483
  openModelOverlayState: overlayModelSelectors.openModelOverlayState,
484
+ openModelScopeState: overlayModelSelectors.openModelScopeState,
446
485
  openSettingsOverlayState: overlayModelSelectors.openSettingsOverlayState,
447
486
  openResumeOverlayState,
448
487
  openTreeOverlayState,
@@ -464,6 +503,16 @@ export function createOverlayLifecycle(deps: OverlayLifecycleRuntimeDeps): Overl
464
503
  footer.refresh();
465
504
  tui.requestRender();
466
505
  },
506
+ canInspectMutation: () => permissionBody?.canInspect() ?? false,
507
+ isInspectingMutation: () => permissionBody?.isInspecting() ?? false,
508
+ toggleMutationInspection: () => {
509
+ permissionBody?.toggleInspect();
510
+ tui.requestRender();
511
+ },
512
+ scrollMutationInspection: (delta) => {
513
+ permissionBody?.scrollInspect(delta);
514
+ tui.requestRender();
515
+ },
467
516
  cancelAskUser: overlayAskUser.cancel,
468
517
  dispose: () => {
469
518
  overlayPermission?.dispose();
@@ -1,4 +1,5 @@
1
1
  import type { ClioSettings } from "../core/config.js";
2
+ import type { ThinkingLevel } from "../core/defaults.js";
2
3
  import type { SafeEventBus } from "../core/event-bus.js";
3
4
  import type { InteropProposal } from "../domains/interop/index.js";
4
5
  import type { ProvidersContract } from "../domains/providers/index.js";
@@ -7,6 +8,12 @@ import type { TUI } from "../engine/tui.js";
7
8
  import type { FooterDashboardPanel } from "./footer/dashboard.js";
8
9
  import type { InteractiveNoticeLevel } from "./interactive-subscriptions.js";
9
10
  import type { OverlayTransitions } from "./overlay-transitions.js";
11
+ import {
12
+ formatPendingModelScope,
13
+ type ModelScopeChoice,
14
+ openModelScopeOverlay,
15
+ type PendingModelScope,
16
+ } from "./overlays/model-scope.js";
10
17
  import { openModelOverlay } from "./overlays/model-selector.js";
11
18
  import { openSettingsOverlay, type SettingsCenterRowId, type SettingsSectionId } from "./overlays/settings.js";
12
19
 
@@ -21,7 +28,9 @@ export interface OverlayModelSelectorsDeps {
21
28
  getSettings?: () => Readonly<ClioSettings>;
22
29
  writeSettings?: (next: ClioSettings) => void;
23
30
  commitSetting?: (id: string, next: ClioSettings, scope: "session" | "global") => void;
24
- onSelectModel?: (ref: { target: string; model: string }) => void;
31
+ onSelectModel?: (ref: { target: string; model: string }, scope: ModelScopeChoice) => void;
32
+ /** Applied with the chosen scope when the swap named a thinking level. */
33
+ onSetThinkingLevel?: (level: ThinkingLevel, scope?: ModelScopeChoice) => void;
25
34
  /** Settings → Fleet shows live node placement health when the scheduler exposes it. */
26
35
  getFleetNodes?: () => ReadonlyArray<FleetNodeSnapshot>;
27
36
  /** Settings → Targets "connect" runs the auth flow over the open settings overlay. */
@@ -29,17 +38,21 @@ export interface OverlayModelSelectorsDeps {
29
38
  /** Settings → Advanced offers detected agents on the delegation.agents row. */
30
39
  getInteropProposals?: () => ReadonlyArray<InteropProposal>;
31
40
  openModelOverlay?: typeof openModelOverlay;
41
+ openModelScopeOverlay?: typeof openModelScopeOverlay;
32
42
  openSettingsOverlay?: typeof openSettingsOverlay;
33
43
  }
34
44
 
35
45
  export interface OverlayModelSelectors {
36
46
  openModelOverlayState(): void;
47
+ /** Ask where a resolved swap lands, then apply it. Nothing changes until the operator answers. */
48
+ openModelScopeState(ref: PendingModelScope): void;
37
49
  openSettingsOverlayState(section?: SettingsSectionId, rowId?: SettingsCenterRowId): void;
38
50
  refreshSettingsOverlay(): void;
39
51
  }
40
52
 
41
53
  export function createOverlayModelSelectors(deps: OverlayModelSelectorsDeps): OverlayModelSelectors {
42
54
  const openModel = deps.openModelOverlay ?? openModelOverlay;
55
+ const openModelScope = deps.openModelScopeOverlay ?? openModelScopeOverlay;
43
56
  const openSettings = deps.openSettingsOverlay ?? openSettingsOverlay;
44
57
  let settingsOverlayRefresh: (() => void) | null = null;
45
58
 
@@ -53,9 +66,11 @@ export function createOverlayModelSelectors(deps: OverlayModelSelectorsDeps): Ov
53
66
  ...(deps.getSettings ? { getSettings: deps.getSettings } : {}),
54
67
  providers: deps.providers,
55
68
  bus: deps.bus,
69
+ // The picker resolves what to run; the scope dialog resolves where it
70
+ // lands. Closing this overlay first keeps one modal on screen at a time.
56
71
  onSelect: (ref) => {
57
- deps.onSelectModel?.(ref);
58
- deps.refreshFooter();
72
+ deps.closeOverlay();
73
+ openModelScopeState(ref);
59
74
  },
60
75
  onToggleFavorite: (ref, favorite) => {
61
76
  if (!deps.getSettings || !deps.writeSettings) return;
@@ -76,6 +91,27 @@ export function createOverlayModelSelectors(deps: OverlayModelSelectorsDeps): Ov
76
91
  deps.tui.requestRender();
77
92
  };
78
93
 
94
+ const openModelScopeState = (ref: PendingModelScope): void => {
95
+ if (deps.transitions.state !== "closed") return;
96
+ deps.transitions.state = "model-scope";
97
+ deps.transitions.handle = openModelScope(deps.tui, {
98
+ ref,
99
+ onChoose: (scope) => {
100
+ deps.closeOverlay();
101
+ deps.onSelectModel?.({ target: ref.target, model: ref.model }, scope);
102
+ if (ref.thinkingLevel) deps.onSetThinkingLevel?.(ref.thinkingLevel, scope);
103
+ const swap = formatPendingModelScope(ref);
104
+ deps.notify("success", scope === "global" ? `active and saved globally: ${swap}` : `active this session: ${swap}`);
105
+ deps.refreshFooter();
106
+ },
107
+ onCancel: () => {
108
+ deps.closeOverlay();
109
+ deps.notify("info", "model unchanged");
110
+ },
111
+ });
112
+ deps.tui.requestRender();
113
+ };
114
+
79
115
  const openSettingsOverlayState = (section?: SettingsSectionId, rowId?: SettingsCenterRowId): void => {
80
116
  if (deps.transitions.state !== "closed" || !deps.getSettings || !deps.writeSettings) return;
81
117
  deps.transitions.state = "settings";
@@ -121,6 +157,7 @@ export function createOverlayModelSelectors(deps: OverlayModelSelectorsDeps): Ov
121
157
 
122
158
  return {
123
159
  openModelOverlayState,
160
+ openModelScopeState,
124
161
  openSettingsOverlayState,
125
162
  refreshSettingsOverlay: () => settingsOverlayRefresh?.(),
126
163
  };