@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
@@ -3,6 +3,7 @@ import type { ClioSettings } from "../core/config.js";
3
3
  import type { SafeEventBus } from "../core/event-bus.js";
4
4
  import { expandInlineFileReferencesAsync } from "../core/file-references.js";
5
5
  import type { PendingSkillRequest } from "../core/skill-activation.js";
6
+ import { clioStateDir } from "../core/xdg.js";
6
7
  import type { AgentsContract } from "../domains/agents/contract.js";
7
8
  import type { ClioKeybinding } from "../domains/config/keybindings.js";
8
9
  import type { ContextState } from "../domains/context/index.js";
@@ -11,6 +12,8 @@ import type { ExtensionsContract } from "../domains/extensions/index.js";
11
12
  import type { InteropContract } from "../domains/interop/index.js";
12
13
  import type { TaskMemoryOperatorStatus } from "../domains/memory/index.js";
13
14
  import { openDetachedBatchViews } from "../domains/middleware/index.js";
15
+ import type { MuxContract } from "../domains/mux/index.js";
16
+ import type { PanesOperations, PanesWatchController } from "../domains/mux/operations.js";
14
17
  import type { ObservabilityContract } from "../domains/observability/index.js";
15
18
  import type { ProvidersContract, ThinkingLevel } from "../domains/providers/index.js";
16
19
  import type { ResourcesContract } from "../domains/resources/index.js";
@@ -39,8 +42,11 @@ import { createProcessInteractiveShell, getActiveRenderTrace } from "./interacti
39
42
  import { createInteractiveSlashRuntime, resolveAvailableThinkingLevels } from "./interactive-slash-runtime.js";
40
43
  import { createInteractiveSubscriptions } from "./interactive-subscriptions.js";
41
44
  import { createInteractiveTickers } from "./interactive-tickers.js";
45
+ import type { createMuxBridge } from "./mux-bridge.js";
42
46
  import { createOverlayLifecycle, type OverlayLifecycleController, type OverlayState } from "./overlay-lifecycle.js";
43
47
  import { interopOverlaySurface } from "./overlays/interop.js";
48
+ import { paneWatchDecision } from "./pane-policy.js";
49
+ import { writeInputWedgeDump } from "./render-trace.js";
44
50
  import { settleChatBeforeSessionSwitch } from "./session-switch-settlement.js";
45
51
  import { createSessionTranscript } from "./session-transcript.js";
46
52
  import type {
@@ -51,7 +57,9 @@ import type {
51
57
  } from "./slash-commands.js";
52
58
  import { processAutoPacingAllowed, resolveSmoothStreamingMode } from "./stream-pacing-policy.js";
53
59
  import type { TerminalLease } from "./terminal-lease.js";
60
+ import type { createWatchPaneController } from "./watch-pane.js";
54
61
  import { createWorkspaceFacts } from "./workspace-facts.js";
62
+ import type { createYaziBridge, YaziBridge } from "./yazi-bridge.js";
55
63
 
56
64
  export {
57
65
  IDLE_LEADER_STATE,
@@ -128,6 +136,36 @@ export interface InteractiveDeps {
128
136
  extensions?: ExtensionsContract;
129
137
  interop?: InteropContract;
130
138
  share?: ShareContract;
139
+ /**
140
+ * Pane layer. A `none` contract still reaches the interactive surface so the
141
+ * files preset can use its terminal chooser; every mux operation remains
142
+ * best-effort and never reaches a dispatch or a turn.
143
+ */
144
+ mux?: MuxContract;
145
+ /**
146
+ * Pane-layer operations behind `/panes` and the `panes` tool. Built by the
147
+ * composition root so the tool registry and this surface drive one instance.
148
+ */
149
+ panes?: PanesOperations;
150
+ /**
151
+ * Factory seam for the dispatch-to-pane bridge, so a contract test can drive
152
+ * it without a TUI. Production leaves it unset and gets `createMuxBridge`.
153
+ */
154
+ createMuxBridge?: typeof createMuxBridge;
155
+ /** Bind the file-pane return path after the composer and TUI exist. */
156
+ attachYaziBridge?: (bridge: YaziBridge) => () => void;
157
+ /**
158
+ * Watch-pane factory from the `--with-panes` composition root; absent on a
159
+ * plain boot. The controller it builds backs Enter in the workers view.
160
+ */
161
+ createWatchPane?: typeof createWatchPaneController;
162
+ /** Bind the watch controller into the shared PanesOperations for `/panes show`. */
163
+ attachWatchPane?: (controller: PanesWatchController) => () => void;
164
+ /**
165
+ * File-pane factory. Supplied by the `--with-panes` composition root (or a
166
+ * contract test); absent on a plain boot, which therefore loads no yazi code.
167
+ */
168
+ createYaziBridge?: typeof createYaziBridge;
131
169
  /**
132
170
  * Shared tool registry. When wired, the permission overlay opens automatically
133
171
  * whenever a tool call is parked waiting for operator confirmation, and the
@@ -171,12 +209,19 @@ export interface InteractiveDeps {
171
209
  registerAskUserHandler?: (handler: AskUserHandler) => () => void;
172
210
  /** Live CLIO-CODER.md and memory state for the footer Context quadrant. */
173
211
  getContextState?: (cwd?: string) => ContextState;
174
- /** Persist a thinking level set by `/thinking <level>` or `/model <pattern>:<level>`. */
175
- onSetThinkingLevel?: (level: ThinkingLevel) => void;
212
+ /**
213
+ * Persist a thinking level set by `/thinking <level>` or `/model <pattern>:<level>`.
214
+ * Scope "session" leaves settings.yaml alone; omitted means the historical
215
+ * write-through, which is what the Shift+Tab cycle and `/thinking` still want.
216
+ */
217
+ onSetThinkingLevel?: (level: ThinkingLevel, scope?: "session" | "global") => void;
176
218
  /** Persist the next thinking level when Shift+Tab is pressed. */
177
219
  onCycleThinking?: () => void;
178
- /** Persist the orchestrator target selected in /model. */
179
- onSelectModel?: (ref: { target: string; model: string }) => void;
220
+ /**
221
+ * Apply the orchestrator target selected in /model at the scope the operator
222
+ * chose. "session" routes this session only and never touches settings.yaml.
223
+ */
224
+ onSelectModel?: (ref: { target: string; model: string }, scope: "session" | "global") => void;
180
225
  /** Write handler the /settings overlay uses to persist cycled values. */
181
226
  writeSettings?: (next: ClioSettings) => void;
182
227
  /**
@@ -429,6 +474,21 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
429
474
  });
430
475
  const { terminal, tui } = shell;
431
476
  const renderTrace = getActiveRenderTrace();
477
+ // SIGTERM is the kill an operator reaches for when a pane stops answering, so
478
+ // it is where the always-on input-wedge ring has to land (#224). It writes
479
+ // synchronously from its own listener rather than from a termination hook: a
480
+ // session wedged badly enough to be killed may never reach the coordinator's
481
+ // asynchronous drain, and this dump has to survive that.
482
+ const dumpInputWedgeOnTerminate = renderTrace
483
+ ? (): void => {
484
+ try {
485
+ writeInputWedgeDump(clioStateDir(), renderTrace.snapshotInputWedge());
486
+ } catch {
487
+ // Best effort. The process is ending either way.
488
+ }
489
+ }
490
+ : null;
491
+ if (dumpInputWedgeOnTerminate) process.on("SIGTERM", dumpInputWedgeOnTerminate);
432
492
  const visibleEventIngress = new WeakMap<
433
493
  object,
434
494
  { sequence: number; traceSequence: number; generation: number; ingressAt: number }
@@ -498,6 +558,11 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
498
558
  getLeaderArmed: () => leaderArmed,
499
559
  getShutdownArmed: () => shutdownArmed,
500
560
  isAwaitingApproval: () => overlayLifecycle?.getState() === "permission-confirm",
561
+ getPermissionInspection: () => {
562
+ if (overlayLifecycle === undefined || overlayLifecycle === null) return "none";
563
+ if (!overlayLifecycle.canInspectMutation()) return "none";
564
+ return overlayLifecycle.isInspectingMutation() ? "open" : "closed";
565
+ },
501
566
  resolveVisibleEventSequence: (event) => visibleEventIngress.get(event)?.traceSequence ?? null,
502
567
  resolveStreamIngress: (event) => visibleEventIngress.get(event) ?? null,
503
568
  commitFrame: (reason) => shell.commitCurrentFrame(reason === "teardown" ? 300 : 30_000),
@@ -545,6 +610,31 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
545
610
  chatRenderer,
546
611
  io,
547
612
  } = presentation;
613
+ // The factory arrives only from an active `--with-panes` boot (or a test); a
614
+ // plain session has no deps.panes and no factory, and loads no yazi code.
615
+ const yaziBridge =
616
+ deps.panes && deps.createYaziBridge
617
+ ? deps.createYaziBridge({
618
+ ...(deps.mux ? { mux: deps.mux } : {}),
619
+ getDraft: () => editor.getText(),
620
+ setDraft: (text) => editor.setText(text),
621
+ requestRender: () => tui.requestRender(),
622
+ notice: (level, text) => notify(level, text, `yazi:${level}`),
623
+ getCwd: () => process.cwd(),
624
+ getSettings: () =>
625
+ deps.getSettings?.().panes.yazi ?? {
626
+ mode: "companion",
627
+ profile: "managed",
628
+ followCwd: true,
629
+ },
630
+ stopUi: () => tui.stop(),
631
+ startUi: () => {
632
+ tui.start();
633
+ tui.requestRender(true);
634
+ },
635
+ })
636
+ : null;
637
+ const detachYaziBridge = yaziBridge ? deps.attachYaziBridge?.(yaziBridge) : undefined;
548
638
  refreshPresentationFooter = () => footer.refresh();
549
639
  const agentProgress = createAgentProgress(terminal);
550
640
  // Desktop notifications are a protocol write on the terminal owner, issued
@@ -618,7 +708,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
618
708
  chat: deps.chat,
619
709
  chatPanel: {
620
710
  appendReplayBlock: (...args) => chatRenderer.mutate(() => chatPanel.appendReplayBlock(...args), "slash-output"),
621
- appendUser: (text) => chatRenderer.mutate(() => chatPanel.appendUser(text), "user-submit"),
711
+ appendUser: (text, status) => chatRenderer.mutate(() => chatPanel.appendUser(text, status), "user-submit"),
622
712
  clearFoldOverrides: () => chatRenderer.mutate(() => chatPanel.clearFoldOverrides(), "output-detail"),
623
713
  },
624
714
  beforeSemanticSubmit: () => chatRenderer.flush(),
@@ -659,7 +749,9 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
659
749
  openMemory: () => openMemoryOverlayState(),
660
750
  ...(deps.seedTaskMemory ? { seedTaskMemory: deps.seedTaskMemory } : {}),
661
751
  openView: (filter) => openViewOverlayState(filter),
752
+ ...(deps.panes ? { panes: deps.panes } : {}),
662
753
  openModel: () => openModelOverlayState(),
754
+ openModelScope: (ref) => openModelScopeState(ref),
663
755
  openSettings: (section, rowId) => openSettingsOverlayState(section, rowId),
664
756
  openResume: () => openResumeOverlayState(),
665
757
  startNewSession: () => startNewSession(),
@@ -767,6 +859,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
767
859
  openMemoryOverlayState,
768
860
  openViewOverlayState,
769
861
  openModelOverlayState,
862
+ openModelScopeState,
770
863
  openSettingsOverlayState,
771
864
  openResumeOverlayState,
772
865
  openTreeOverlayState,
@@ -844,6 +937,64 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
844
937
  };
845
938
  notify(outcome.ok ? "success" : "info", outcome.message, "dispatch:background");
846
939
  };
940
+ // Built only when a pane host answered detection, so a session with no
941
+ // panes subscribes to nothing and the bus handlers do not exist at all.
942
+ // The factories arrive from the `--with-panes` composition root (or a
943
+ // test); a plain session loads none of the bridge code.
944
+ const mux = deps.mux;
945
+ const muxBridge =
946
+ mux && mux.mode !== "none" && deps.createMuxBridge
947
+ ? deps.createMuxBridge({
948
+ bus: deps.bus,
949
+ mux,
950
+ notificationsPolicy: () => deps.getSettings?.().panes.notifications ?? "failures",
951
+ log: (level, message) => {
952
+ if (level === "warning") notify("warning", message, "mux:bridge");
953
+ },
954
+ notice: (level, text) => appendNotice(level, text, busNoticeSink),
955
+ })
956
+ : null;
957
+ // The workers-view watch pane: opened on Enter over a live run, retargeted
958
+ // by arrow keys through its selection file. `/panes show` and the panes
959
+ // tool drive the same controller through the shared operations object.
960
+ const watchPane =
961
+ mux && mux.mode !== "none" && deps.createWatchPane
962
+ ? deps.createWatchPane({ mux, getCwd: () => process.cwd() })
963
+ : null;
964
+ const detachWatchPane = watchPane ? deps.attachWatchPane?.(watchPane) : undefined;
965
+ const selectedWatchableRun = (): { runId: string; agentId: string } | null => {
966
+ if (!watchPane) return null;
967
+ const row = dispatchBoard.selectedRow();
968
+ if (!row) return null;
969
+ const decision = paneWatchDecision({ source: "workers-view", runStatus: row.status });
970
+ return decision.open ? { runId: row.runId, agentId: row.agentId } : null;
971
+ };
972
+ /**
973
+ * Enter in the workers view. True means the watch pane took the key; false
974
+ * (panes off, nothing watchable under the policy) falls back to the inline
975
+ * worker-progress detail, so a terminal run's Enter still expands its card.
976
+ */
977
+ const watchSelectedDispatch = (): boolean => {
978
+ const selected = selectedWatchableRun();
979
+ if (!watchPane || !selected) return false;
980
+ void watchPane.watch(selected.runId).then((result) => {
981
+ if (result.status === "watching") {
982
+ if (result.opened) {
983
+ notify("success", `watching ${selected.agentId} (${selected.runId}) in a pane`, "panes:watch");
984
+ }
985
+ } else {
986
+ notify("warning", result.reason, "panes:watch");
987
+ }
988
+ tui.requestRender();
989
+ });
990
+ return true;
991
+ };
992
+ /** Arrow keys: the watch pane follows the cursor, but only once it exists. */
993
+ const followBoardSelection = (): void => {
994
+ if (!watchPane?.isOpen()) return;
995
+ const selected = selectedWatchableRun();
996
+ if (selected) watchPane.follow(selected.runId);
997
+ };
847
998
  const interactiveSubscriptions = createInteractiveSubscriptions({
848
999
  bus: deps.bus,
849
1000
  refreshFooter: () => footer.refresh(),
@@ -894,7 +1045,18 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
894
1045
  onShutdownArmedChange: (armed) => {
895
1046
  shutdownArmed = armed;
896
1047
  },
897
- dispatchBoard,
1048
+ dispatchBoard: {
1049
+ selectPrevious: () => {
1050
+ dispatchBoard.selectPrevious();
1051
+ followBoardSelection();
1052
+ },
1053
+ selectNext: () => {
1054
+ dispatchBoard.selectNext();
1055
+ followBoardSelection();
1056
+ },
1057
+ toggleDetail: () => dispatchBoard.toggleDetail(),
1058
+ },
1059
+ watchSelectedDispatch,
898
1060
  steerSelectedDispatch,
899
1061
  cancelSelectedDispatch,
900
1062
  cancelActiveEditorBash: () => editorSubmit.cancelActiveEditorBash(),
@@ -933,7 +1095,14 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
933
1095
  disposeOverlay: overlayLifecycle.dispose,
934
1096
  stopAgentProgress: agentProgress.stop,
935
1097
  disposeChat: () => deps.chat.dispose(),
936
- disposeSubscriptions: interactiveSubscriptions.dispose,
1098
+ disposeSubscriptions: () => {
1099
+ detachYaziBridge?.();
1100
+ yaziBridge?.dispose();
1101
+ detachWatchPane?.();
1102
+ watchPane?.dispose();
1103
+ muxBridge?.dispose();
1104
+ interactiveSubscriptions.dispose();
1105
+ },
937
1106
  },
938
1107
  beforeStopUi: (() => {
939
1108
  let settlement: Promise<void> | null = null;
@@ -949,6 +1118,7 @@ export async function createInteractiveApplication(deps: InteractiveDeps): Promi
949
1118
  cancelParkedCalls: (reason) => deps.toolRegistry?.cancelParkedCalls(reason),
950
1119
  onShutdown: async () => {
951
1120
  try {
1121
+ if (dumpInputWedgeOnTerminate) process.off("SIGTERM", dumpInputWedgeOnTerminate);
952
1122
  await deps.onShutdown();
953
1123
  } finally {
954
1124
  if (lease) await lease.close();
@@ -60,6 +60,10 @@ export interface InteractiveInputRuntimeDeps {
60
60
  closeOverlay(): void;
61
61
  confirmPermission(): void;
62
62
  stopTurnFromPermission(): void;
63
+ canInspectMutation(): boolean;
64
+ isInspectingMutation(): boolean;
65
+ toggleMutationInspection(): void;
66
+ scrollMutationInspection(delta: number): void;
63
67
  cancelAskUser(): void;
64
68
  toggleFooterDashboardState(): void;
65
69
  toggleDispatchBoardOverlay(): void;
@@ -78,6 +82,8 @@ export interface InteractiveInputRuntimeDeps {
78
82
  selectNext(): void;
79
83
  toggleDetail(): void;
80
84
  };
85
+ /** Enter in the workers view; false falls through to the detail toggle. */
86
+ watchSelectedDispatch: () => boolean;
81
87
  steerSelectedDispatch: () => void;
82
88
  cancelSelectedDispatch: () => void;
83
89
  cancelActiveEditorBash: () => boolean;
@@ -213,6 +219,10 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
213
219
  confirmPermission: () => deps.overlay.confirmPermission(),
214
220
  stopTurnFromPermission: () => deps.overlay.stopTurnFromPermission(),
215
221
  composerHasDraft: () => deps.editor.getText().length > 0,
222
+ canInspectMutation: () => deps.overlay.canInspectMutation(),
223
+ isInspectingMutation: () => deps.overlay.isInspectingMutation(),
224
+ toggleMutationInspection: () => deps.overlay.toggleMutationInspection(),
225
+ scrollMutationInspection: (delta) => deps.overlay.scrollMutationInspection(delta),
216
226
  editDraft: (data) => {
217
227
  deps.editor.handleInput?.(data);
218
228
  deps.requestRender();
@@ -230,6 +240,11 @@ export function createInteractiveInputRuntime(deps: InteractiveInputRuntimeDeps)
230
240
  deps.dispatchBoard.toggleDetail();
231
241
  deps.requestRender();
232
242
  },
243
+ watchSelectedDispatch: () => {
244
+ const handled = deps.watchSelectedDispatch();
245
+ if (handled) deps.requestRender();
246
+ return handled;
247
+ },
233
248
  steerSelectedDispatch: deps.steerSelectedDispatch,
234
249
  cancelSelectedDispatch: deps.cancelSelectedDispatch,
235
250
  cancelAskUser: () => deps.overlay.cancelAskUser(),
@@ -99,6 +99,8 @@ export interface InteractivePresentationDeps {
99
99
  getShutdownArmed?: () => boolean;
100
100
  /** Whether a permission prompt owns the keyboard, for the composer's CONFIRM rail. */
101
101
  isAwaitingApproval?: () => boolean;
102
+ /** Whether that prompt has a mutation to inspect, and whether it is open (issue #254). */
103
+ getPermissionInspection?: () => import("./permission-hint.js").PermissionInspectionHint;
102
104
  getCwd?: () => string;
103
105
  resolveVisibleEventSequence?: (event: ChatLoopEvent) => number | null;
104
106
  resolveStreamIngress?: (
@@ -418,6 +420,8 @@ export function createInteractivePresentation(deps: InteractivePresentationDeps)
418
420
  },
419
421
  isStreaming: () => deps.chat.isStreaming(),
420
422
  ...(deps.isAwaitingApproval ? { isAwaitingApproval: deps.isAwaitingApproval } : {}),
423
+ ...(deps.getPermissionInspection ? { getPermissionInspection: deps.getPermissionInspection } : {}),
424
+ getTurnPreparation: () => deps.chat.turnPreparation().phase,
421
425
  willEnterSteer: (text) => willEnterSteerActiveWork(deps, text),
422
426
  getSubmitKeyLabel: () => formatKeyLabel(keybindings.getKeys("tui.input.submit")[0], "Enter"),
423
427
  getNewlineKeyLabel: () => formatKeyLabel(keybindings.getKeys("tui.input.newLine")[0], "Shift+Enter"),
@@ -158,9 +158,11 @@ export function createInteractiveShell<TTerminal extends Terminal, TTui extends
158
158
  }
159
159
 
160
160
  /**
161
- * Trace for the current process, created once when CLIO_CODER_RENDER_TRACE names a
162
- * file. The panel wires its render metrics into the same instance, so the
163
- * frame rows carry both the build cost and the write cost.
161
+ * Trace for the current process, created once per interactive shell. It writes
162
+ * a JSONL file when CLIO_CODER_RENDER_TRACE names one and otherwise keeps only
163
+ * its bounded input-wedge ring in memory. The panel wires its render metrics
164
+ * into the same instance, so the frame rows carry both the build cost and the
165
+ * write cost.
164
166
  */
165
167
  let activeRenderTrace: RenderTrace | null = null;
166
168
 
@@ -203,20 +205,21 @@ export function createProcessInteractiveShell(
203
205
  let restoreRoot: (() => void) | null = null;
204
206
  let backpressure: StdoutBackpressureGate | null = null;
205
207
  let observedBackpressure = false;
206
- if (tracePath) {
207
- let candidate: RenderTrace | null = null;
208
- try {
209
- candidate = createRenderTrace(tracePath);
210
- restoreStdout = traceProcessStdout(candidate);
211
- activeRenderTrace = candidate;
212
- } catch {
213
- // A diagnostics path must never prevent the interactive application from starting.
214
- restoreStdout?.();
215
- restoreStdout = null;
216
- void candidate?.close().catch(() => {});
217
- activeRenderTrace = null;
218
- }
219
- } else activeRenderTrace = null;
208
+ let candidate: RenderTrace | null = null;
209
+ try {
210
+ // A null path is the ring-only mode: no file, but the input-wedge ring still
211
+ // fills, because the operator who hits a wedge did not arm a trace before it
212
+ // happened (#224).
213
+ candidate = createRenderTrace(tracePath);
214
+ restoreStdout = traceProcessStdout(candidate);
215
+ activeRenderTrace = candidate;
216
+ } catch {
217
+ // A diagnostics path must never prevent the interactive application from starting.
218
+ restoreStdout?.();
219
+ restoreStdout = null;
220
+ void candidate?.close().catch(() => {});
221
+ activeRenderTrace = null;
222
+ }
220
223
  const trace = activeRenderTrace;
221
224
  if (trace && options.onFirstFrameCommit) trace.onFirstFrameCommit(options.onFirstFrameCommit);
222
225
  let firstFrameDelivered = false;
@@ -9,6 +9,7 @@ import type { AgentsContract } from "../domains/agents/contract.js";
9
9
  import type { DispatchContract } from "../domains/dispatch/contract.js";
10
10
  import { agentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
11
11
  import type { ExtensionsContract } from "../domains/extensions/index.js";
12
+ import type { PanesOperations } from "../domains/mux/operations.js";
12
13
  import {
13
14
  type ProvidersContract,
14
15
  type ResolvedThinkingCapability,
@@ -36,6 +37,7 @@ import { runOperatorRecall } from "./context-recall-command.js";
36
37
  import { renderSessionHtml } from "./export-html/index.js";
37
38
  import { dateLocal } from "./format-time.js";
38
39
  import type { OracleDigestSources } from "./oracle.js";
40
+ import type { PendingModelScope } from "./overlays/model-scope.js";
39
41
  import type { SettingsCenterRowId, SettingsSectionId } from "./overlays/settings.js";
40
42
  import {
41
43
  type ContextClearCommandOptions,
@@ -48,7 +50,7 @@ import {
48
50
  type SlashCommandDispatchResult,
49
51
  type TaskMemorySeedCommandResult,
50
52
  } from "./slash-commands.js";
51
- import { verifyReceiptFile } from "./view/artifacts.js";
53
+ import { verifyReceiptFileReport } from "./view/artifacts.js";
52
54
  import type { WorkerEntryState } from "./worker-stream.js";
53
55
 
54
56
  const EXPORT_RENDER_WIDTH = 100;
@@ -62,6 +64,7 @@ export interface InteractiveSlashSubmitExpansion {
62
64
 
63
65
  type SlashChat = Pick<ChatLoop, "getSessionId" | "isStreaming" | "submit">;
64
66
  type SlashChatPanel = Pick<ChatPanel, "appendReplayBlock" | "appendUser" | "clearFoldOverrides">;
67
+ type UserTurnStatus = import("./chat-panel.js").UserTurnStatus;
65
68
  type SlashResources = Pick<ResourcesContract, "prompts" | "expandPromptTemplate" | "reload">;
66
69
  type SlashExtensions = Pick<ExtensionsContract, "list">;
67
70
  type SlashAgents = Pick<AgentsContract, "getSpec" | "listSpecs">;
@@ -88,8 +91,8 @@ export interface InteractiveSlashRuntimeDeps {
88
91
  * making a value permanent stays the Settings overlay's explicit choice.
89
92
  */
90
93
  commitSetting?: (id: string, next: ClioSettings, scope: "session" | "global") => void;
91
- onSelectModel?: (ref: { target: string; model: string }) => void;
92
- onSetThinkingLevel?: (level: ThinkingLevel) => void;
94
+ onSelectModel?: (ref: { target: string; model: string }, scope: "session" | "global") => void;
95
+ onSetThinkingLevel?: (level: ThinkingLevel, scope?: "session" | "global") => void;
93
96
  onCompact?: (instructions: string | undefined) => Promise<void>;
94
97
  onInit?: (options: InitCommandOptions, io?: RunIo) => Promise<void>;
95
98
  onContextClear?: (options: ContextClearCommandOptions) => Promise<void>;
@@ -134,7 +137,14 @@ export interface InteractiveSlashRuntimeDeps {
134
137
  openMemory: () => void;
135
138
  seedTaskMemory?: () => TaskMemorySeedCommandResult;
136
139
  openView: (filter?: string) => void;
140
+ /** Pane-layer operations behind `/panes`. Absent when the mux resolved to `none`. */
141
+ panes?: PanesOperations;
137
142
  openModel: () => void;
143
+ /**
144
+ * Ask where a resolved `/model <pattern>` swap lands before anything applies.
145
+ * Absent on a host with no overlay layer, where the swap stays session-scoped.
146
+ */
147
+ openModelScope?: (ref: PendingModelScope) => void;
138
148
  openSettings: (section?: SettingsSectionId, rowId?: SettingsCenterRowId) => void;
139
149
  openResume: () => void;
140
150
  startNewSession: () => void;
@@ -199,6 +209,7 @@ export function resolveAvailableThinkingLevels(
199
209
  export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps): InteractiveSlashRuntime {
200
210
  let activeContextInit = false;
201
211
  let latestAdmission: Promise<void> = Promise.resolve();
212
+ let latestLocalOperation: Promise<void> = Promise.resolve();
202
213
  let activeAdmissionSignal: AbortSignal | undefined;
203
214
  const cwd = (): string => deps.getCwd?.() ?? process.cwd();
204
215
  const resources = deps.resources;
@@ -245,9 +256,13 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
245
256
  const willQueue = deps.chat.isStreaming();
246
257
  deps.recordSubmittedTurn();
247
258
  deps.refreshFooter();
248
- if (!willQueue) deps.chatPanel.appendUser(sub.text);
259
+ // The row is painted now, so the operator sees their prompt land, but
260
+ // it is marked pending until the durable append at admission: nothing
261
+ // is in the ledger yet, and a refused preflight must not leave a row
262
+ // that reads like a committed turn (issue #251).
263
+ let rowStatus: UserTurnStatus = "pending";
264
+ if (!willQueue) deps.chatPanel.appendUser(sub.text, () => rowStatus);
249
265
  deps.requestRender();
250
- deps.beforeSemanticSubmit?.();
251
266
  let acknowledgeAdmission = (): void => {};
252
267
  const admitted = new Promise<void>((resolve) => {
253
268
  acknowledgeAdmission = resolve;
@@ -257,7 +272,19 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
257
272
  ...(sub.workingContextPaths.length > 0 ? { workingContextPaths: sub.workingContextPaths } : {}),
258
273
  ...(sub.pendingSkillRequests.length > 0 ? { pendingSkillRequests: sub.pendingSkillRequests } : {}),
259
274
  ...(awaitAdmission && willQueue ? { steering: "end-of-turn" as const } : {}),
260
- ...(awaitAdmission ? { onAdmitted: acknowledgeAdmission } : {}),
275
+ ...(!willQueue
276
+ ? {
277
+ onPreparationVisible: async () => {
278
+ deps.beforeSemanticSubmit?.();
279
+ await deps.settleVisibleFrame?.("submit-preparing");
280
+ },
281
+ }
282
+ : {}),
283
+ onAdmitted: () => {
284
+ rowStatus = "committed";
285
+ deps.requestRender();
286
+ if (awaitAdmission) acknowledgeAdmission();
287
+ },
261
288
  });
262
289
  const settlement = turn
263
290
  .then(() => deps.settleVisibleFrame?.("submit-return"))
@@ -265,7 +292,13 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
265
292
  const msg = err instanceof Error ? err.message : String(err);
266
293
  deps.io.stderr(`[interactive] chat failed: ${msg}\n`);
267
294
  })
268
- .finally(deps.requestRender);
295
+ .finally(() => {
296
+ // Settlement without admission is a refusal: the probe failed, the
297
+ // overflow preflight blocked the request, or the submit became a
298
+ // steer. Say so on the row rather than leaving a phantom turn.
299
+ if (rowStatus === "pending") rowStatus = willQueue ? "committed" : "refused";
300
+ deps.requestRender();
301
+ });
269
302
  return awaitAdmission ? Promise.race([admitted, settlement]) : settlement;
270
303
  } catch (err) {
271
304
  const msg = err instanceof Error ? err.message : String(err);
@@ -413,6 +446,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
413
446
  return result;
414
447
  },
415
448
  openView: deps.openView,
449
+ ...(deps.panes ? { panes: deps.panes } : {}),
416
450
  setThinkingLevel: (level) => {
417
451
  const settings = deps.getSettings?.();
418
452
  if (!settings || !deps.onSetThinkingLevel) return { status: "unavailable" };
@@ -462,9 +496,20 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
462
496
  openModel: deps.openModel,
463
497
  providers: deps.providers,
464
498
  applyModelRef: (ref) => {
465
- deps.onSelectModel?.({ target: ref.target, model: ref.model });
466
- if (ref.thinkingLevel) deps.onSetThinkingLevel?.(ref.thinkingLevel);
499
+ // A mid-conversation swap used to rewrite the orchestrator role in
500
+ // settings.yaml with no prompt, so the next launch could come up on a
501
+ // dead endpoint (smoke pass 2, G3). The scope dialog owns the commit
502
+ // now, and it applies nothing until the operator answers.
503
+ if (deps.openModelScope) {
504
+ deps.openModelScope(ref);
505
+ return "pending";
506
+ }
507
+ // No overlay layer to ask with: session scope is the answer that cannot
508
+ // outlive the session that chose it.
509
+ deps.onSelectModel?.({ target: ref.target, model: ref.model }, "session");
510
+ if (ref.thinkingLevel) deps.onSetThinkingLevel?.(ref.thinkingLevel, "session");
467
511
  deps.requestRender();
512
+ return "applied";
468
513
  },
469
514
  openSettings: deps.openSettings,
470
515
  openResume: deps.openResume,
@@ -611,7 +656,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
611
656
  })
612
657
  .finally(deps.requestRender);
613
658
  },
614
- verifyReceipt: (runId) => verifyReceiptFile(deps.stateDir, runId),
659
+ verifyReceipt: (runId) => verifyReceiptFileReport(deps.stateDir, runId),
615
660
  ...(deps.listWorkerRuns ? { listWorkerRuns: deps.listWorkerRuns } : {}),
616
661
  // The user-turn path, minus expansion. A worker's answer is literal text:
617
662
  // running it through the prompt, skill, and @file expanders would let a
@@ -621,6 +666,9 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
621
666
  latestAdmission = admitChat(text, activeAdmissionSignal);
622
667
  void latestAdmission;
623
668
  },
669
+ runLocalOperation: (operation) => {
670
+ latestLocalOperation = latestLocalOperation.catch(() => undefined).then(operation);
671
+ },
624
672
  render: deps.requestRender,
625
673
  };
626
674
 
@@ -630,8 +678,12 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
630
678
  dispatchCommand: (text) => dispatchSlashCommand(parseSlashCommand(text), context),
631
679
  admitCommand: async (text, signal) => {
632
680
  signal?.throwIfAborted();
681
+ // Pane opens and focus changes mutate a remote registry. A following
682
+ // slash read must observe their settled state, just as the tool path does.
683
+ await latestLocalOperation;
633
684
  const command = parseSlashCommand(text);
634
685
  const before = latestAdmission;
686
+ const localBefore = latestLocalOperation;
635
687
  const previousSignal = activeAdmissionSignal;
636
688
  activeAdmissionSignal = signal;
637
689
  try {
@@ -640,6 +692,7 @@ export function createInteractiveSlashRuntime(deps: InteractiveSlashRuntimeDeps)
640
692
  activeAdmissionSignal = previousSignal;
641
693
  }
642
694
  if (latestAdmission !== before) await latestAdmission;
695
+ if (latestLocalOperation !== localBefore) await latestLocalOperation;
643
696
  },
644
697
  };
645
698
  }
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  describeTaskMemoryActivity,
3
+ formatTaskMemorySpend,
3
4
  type MemoryProposalResult,
4
5
  type MemoryRecord,
5
6
  type TaskMemoryActivityEvent,
@@ -38,6 +39,12 @@ export function formatMemoryStatusLine(status: TaskMemoryOperatorStatus, content
38
39
  theme.fg("muted", `last ${status.lastDecision ?? "none"}`),
39
40
  ];
40
41
  if (status.stepInFlight) units.push(theme.fg("reason", "step running"));
42
+ // Lifetime cost of the background plane, beside the state of the current
43
+ // session. The tier spent 137,205 tokens over 14 days on the operator's own
44
+ // machine before any surface said so (#229), and a hit rate is the one figure
45
+ // that says whether that spend is buying anything.
46
+ const spend = status.spend === null || status.spend === undefined ? "" : formatTaskMemorySpend(status.spend);
47
+ if (spend.length > 0) units.push(theme.fg("dim", spend));
41
48
  return fitUnits(theme, "", units, width);
42
49
  }
43
50
 
@@ -172,6 +179,7 @@ function memorySignature(status: TaskMemoryOperatorStatus, records: ReadonlyArra
172
179
  String(status.size),
173
180
  status.lastDecision ?? "none",
174
181
  status.stepInFlight ? "running" : "idle",
182
+ `${status.spend?.llmSteps ?? 0}:${status.spend?.injections ?? 0}:${status.spend?.totalTokens ?? 0}`,
175
183
  ];
176
184
  for (const record of records) parts.push(`r:${record.id}:${record.approved}:${record.rejectedAt ?? ""}`);
177
185
  for (const entry of bankEntries(status.bank)) {
@@ -350,6 +358,7 @@ export function openMemoryOverlay(
350
358
  const handle = showClioOverlayFrame(tui, view, {
351
359
  anchor: "center",
352
360
  width: MEMORY_OVERLAY_WIDTH,
361
+ markerId: "memory",
353
362
  title: () => "Memory",
354
363
  footerHint: () => view.getHint(),
355
364
  });