@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
@@ -1,4 +1,4 @@
1
- import { RESPONSE_SCHEMA_RUNTIME_ID } from "../core/response-schema.js";
1
+ import { RESPONSE_SCHEMA_RUNTIME_ID, type ResponseSchemaDialect } from "../core/response-schema.js";
2
2
  import type { ThinkingLevel } from "../domains/providers/index.js";
3
3
  import type { EngineModel } from "./types.js";
4
4
 
@@ -217,6 +217,34 @@ function patchLlamaCppResponseSchemaPayload(
217
217
  };
218
218
  }
219
219
 
220
+ /**
221
+ * Apply a JSON-schema response constraint in the dialect the runtime takes.
222
+ *
223
+ * Unlike the worker patcher above, this one is for a seam that treats native
224
+ * enforcement as an optimization: the caller looks the dialect up first and
225
+ * simply does not call this when there is none, so an unconstrained request
226
+ * still goes out and the prompt-level instruction carries it (issue #223).
227
+ * Returns undefined when the payload is not an object, which leaves it alone.
228
+ */
229
+ export function patchResponseSchemaPayloadForDialect(
230
+ payload: unknown,
231
+ dialect: ResponseSchemaDialect,
232
+ responseSchema: Record<string, unknown>,
233
+ schemaName: string,
234
+ ): unknown | undefined {
235
+ if (!isRecord(payload)) return undefined;
236
+ if (dialect === "llamacpp-json-object") {
237
+ return { ...payload, response_format: { type: "json_object", schema: responseSchema } };
238
+ }
239
+ return {
240
+ ...payload,
241
+ response_format: {
242
+ type: "json_schema",
243
+ json_schema: { name: schemaName, strict: true, schema: responseSchema },
244
+ },
245
+ };
246
+ }
247
+
220
248
  export interface WorkerPayloadPatchOptions {
221
249
  runtimeId: string;
222
250
  thinkingLevel?: ThinkingLevel;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The terminal-engine primitives a non-interactive surface needs, kept in a
3
+ * module of its own rather than behind ./tui.js.
4
+ *
5
+ * ./tui.js is the interactive layer's barrel: it carries the instrumented
6
+ * renderer and SelectList, and every consumer of it also pulls the interactive
7
+ * theme. A CLI command that only measures text and paints an alternate screen
8
+ * needs none of that, and reaching it through the barrel is not free. An edge
9
+ * from outside src/interactive/ to ./tui.js, static or dynamic, gives that
10
+ * module a reachability set the theme modules do not share, so the bundler
11
+ * peels it into a chunk of its own. That chunk lands in the Stage 0 instant
12
+ * shell closure, which tests/contracts/instant-shell-import-graph.test.ts holds
13
+ * to six chunks. Everything re-exported here is a pass-through to the external
14
+ * terminal engine, which is not bundled and so adds no chunk at all.
15
+ *
16
+ * The engine-boundary rule (rule1 in tests/boundaries/check-boundaries.ts) keeps
17
+ * terminal-engine value imports inside src/engine/, which is why this seam lives
18
+ * here and not in src/cli/.
19
+ */
20
+
21
+ export { ProcessTerminal, TuiAltScreen, truncateToWidth } from "@earendil-works/pi-tui";
package/src/engine/tui.ts CHANGED
@@ -18,6 +18,7 @@ export type {
18
18
  MarkdownTheme,
19
19
  OverlayHandle,
20
20
  OverlayOptions,
21
+ OverlayUnfocusOptions,
21
22
  ScrollViewScrollbar,
22
23
  SelectItem,
23
24
  SelectListLayoutOptions,
@@ -9,7 +9,6 @@
9
9
  * own worker runners before pi-agent model synthesis.
10
10
  */
11
11
 
12
- import { existsSync, readFileSync } from "node:fs";
13
12
  import path from "node:path";
14
13
  import { validateSettingsFile } from "../core/config.js";
15
14
  import {
@@ -29,6 +28,7 @@ import {
29
28
  resultContractRepairMessages,
30
29
  validateResultContract,
31
30
  } from "../domains/agents/result-contract.js";
31
+ import { nodeResultContractFilesystem } from "../domains/agents/result-contract-filesystem.js";
32
32
  import type { AgentProduct } from "../domains/agents/spec.js";
33
33
  import type { MiddlewareSnapshot } from "../domains/middleware/index.js";
34
34
  import { createMiddlewareToolChoiceControl } from "../domains/middleware/index.js";
@@ -258,18 +258,7 @@ function terminalContractViolation(
258
258
  // Repair rounds judge shape and grounding only. Network posture belongs to
259
259
  // the orchestrator's sealed validation, which runs again on the receipt.
260
260
  networkAllowed: true,
261
- filesystem: {
262
- readFile(filePath) {
263
- try {
264
- return readFileSync(filePath, "utf8");
265
- } catch {
266
- return null;
267
- }
268
- },
269
- pathExists(filePath) {
270
- return existsSync(filePath);
271
- },
272
- },
261
+ filesystem: nodeResultContractFilesystem(),
273
262
  });
274
263
  return validation.conformance === "pass" ? null : (validation.reason ?? "invalid result");
275
264
  }
@@ -26,6 +26,8 @@ export interface BootOptions {
26
26
  terminalLease?: TerminalLease;
27
27
  /** Strict effective settings snapshot shared by preflight, Stage 0, and hydration. */
28
28
  startupSettings?: Readonly<ClioSettings>;
29
+ /** `--with-panes` / `--no-panes`. The flag beats `panes.enabled` in both directions. */
30
+ panes?: "with" | "without";
29
31
  headless?: {
30
32
  prompt: string;
31
33
  images?: ReadonlyArray<ImageContent>;
@@ -8,6 +8,7 @@ import { installBusTracer } from "../core/bus-trace.js";
8
8
  import { type ClioSettings, readSettings, type SettingsMutator, updateSettings } from "../core/config.js";
9
9
  import { DEFAULT_DELEGATION_PERMISSION_TIMEOUT_MS } from "../core/defaults.js";
10
10
  import { loadDomains } from "../core/domain-loader.js";
11
+ import type { SafeEventBus } from "../core/event-bus.js";
11
12
  import { expandInlineFileReferencesAsync } from "../core/file-references.js";
12
13
  import { setGitCommitAttributionEnabled } from "../core/git-commit-attribution.js";
13
14
  import { configureGuardrails } from "../core/guardrails.js";
@@ -48,6 +49,7 @@ import { createDispatchDedupRegistration } from "../domains/dispatch/dedup.js";
48
49
  import { agentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
49
50
  import { readGateDecisionArtifacts, readPendingGateDecisions } from "../domains/dispatch/gate-decisions.js";
50
51
  import { createDispatchDomainModule } from "../domains/dispatch/index.js";
52
+ import { configureRunEventJournal } from "../domains/dispatch/run-event-journal.js";
51
53
  import { type ExtensionsContract, ExtensionsDomainModule } from "../domains/extensions/index.js";
52
54
  import { type InteropContract, InteropDomainModule } from "../domains/interop/index.js";
53
55
  import {
@@ -63,9 +65,13 @@ import {
63
65
  createTaskMemoryTelemetrySink,
64
66
  createTaskMemoryTrace,
65
67
  loadMemoryRecordsSync,
68
+ proposeInjectedTaskMemory,
69
+ readTaskMemorySpendSummary,
66
70
  renderTaskMemoryHandoffSource,
67
71
  seedTaskMemoryFromNewestHandoff,
72
+ type TaskMemoryEntry,
68
73
  type TaskMemoryModelClient,
74
+ type TaskMemoryStepUsage,
69
75
  taskMemoryBankSize,
70
76
  taskMemoryHandoffSeedOffer,
71
77
  taskMemoryTracePath,
@@ -88,21 +94,27 @@ import {
88
94
  writeMiddlewareDiagnosticToStderr,
89
95
  } from "../domains/middleware/index.js";
90
96
  import { createMemoryInterventionRegistration } from "../domains/middleware/memory-intervention.js";
97
+ import { announceMemoryStepEndpoint } from "../domains/middleware/memory-step-endpoint.js";
91
98
  import { createTaskBoardReminderRegistration } from "../domains/middleware/task-board-reminder.js";
92
99
  import { createTaskNudgeRegistration } from "../domains/middleware/task-nudge.js";
93
100
  import { createWatchdogRegistration } from "../domains/middleware/watchdog.js";
101
+ import type { MuxContract } from "../domains/mux/index.js";
94
102
  import type { ObservabilityContract } from "../domains/observability/index.js";
95
- import { ObservabilityDomainModule } from "../domains/observability/index.js";
103
+ import { ObservabilityDomainModule, recordBackgroundMemoryStep } from "../domains/observability/index.js";
96
104
  import type { PromptsContract } from "../domains/prompts/contract.js";
97
105
  import { createPromptsDomainModule } from "../domains/prompts/index.js";
98
106
  import type { ProvidersContract, TargetDescriptor, ThinkingLevel } from "../domains/providers/index.js";
99
107
  import {
100
108
  AGENT_ROLE_TOOLS_REQUIRED_REASON,
101
109
  applyModelCapabilityPatch,
110
+ canonicalEndpointKey,
102
111
  firstRuntimeResolutionError,
112
+ foregroundStreamUsage,
103
113
  isOrchestratorEligibleRuntime,
114
+ normalizeCostProvenance,
104
115
  ProvidersDomainModule,
105
116
  refineRuntimeTargetWithModelHints,
117
+ registerForegroundStream,
106
118
  resolveModelCapabilities,
107
119
  resolveModelRuntimeCapabilitiesForProviders,
108
120
  resolveRuntimeTarget,
@@ -110,6 +122,7 @@ import {
110
122
  targetRequiresAuth,
111
123
  VALID_THINKING_LEVELS,
112
124
  } from "../domains/providers/index.js";
125
+ import { memoryInterventionModelMaxTokens } from "../domains/providers/model-runtime-capabilities.js";
113
126
  import { getRuntimeRegistry } from "../domains/providers/registry.js";
114
127
  import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.js";
115
128
  import {
@@ -149,6 +162,7 @@ import {
149
162
  import { createTaskBoardStore } from "../domains/session/task-board.js";
150
163
  import { filterEntriesToActivePath } from "../domains/session/tree/active-path.js";
151
164
  import { type ShareContract, ShareDomainModule } from "../domains/share/index.js";
165
+ import { ToolchainDomainModule } from "../domains/toolchain/index.js";
152
166
  import { createUserTasksStore } from "../domains/user-tasks/store.js";
153
167
  import { type AcpSafeSettingsPatch, type AcpSafeSettingsSnapshot, serveClioAcpAgent } from "../engine/acp/server.js";
154
168
  import { createStdioServerTransport } from "../engine/acp/transport.js";
@@ -159,12 +173,13 @@ import {
159
173
  INTERACTIVE_LOOP_BLOCK_BUDGET,
160
174
  readOrchTurnToolCallBudget,
161
175
  } from "../engine/loop-guard.js";
162
- import { openSession, readSessionTailTurns, sessionCurrentPath, sessionPaths } from "../engine/session.js";
176
+ import { cwdHash, openSession, readSessionTailTurns, sessionCurrentPath, sessionPaths } from "../engine/session.js";
163
177
  import type { EngineModel } from "../engine/types.js";
164
178
  import { createChatLoop } from "../interactive/chat-loop.js";
165
179
  import { type RunIo, startInteractive } from "../interactive/index.js";
166
180
  import { buildModelReplayAgentMessagesFromTurns } from "../interactive/model-session-replay.js";
167
181
  import type { BootOptions } from "./boot-options.js";
182
+ import { resolvePanesEnablement } from "./panes-activation.js";
168
183
 
169
184
  export type { BootOptions, HeadlessSamplingOverrides } from "./boot-options.js";
170
185
 
@@ -268,6 +283,7 @@ function applyHeadlessSettingsOverlay(
268
283
  interface CompactionResolution {
269
284
  model: EngineModel;
270
285
  targetId: string;
286
+ endpointKey: string | null;
271
287
  apiKey?: string;
272
288
  }
273
289
 
@@ -310,11 +326,27 @@ export async function resolveApiKeyForTarget(
310
326
  return resolved.apiKey;
311
327
  }
312
328
 
329
+ /**
330
+ * The background memory role, resolved to the endpoint it would call.
331
+ *
332
+ * The endpoint key is what lets the middleware decline a step that would land
333
+ * on the same inference scheduler the chat target is streaming against (#229,
334
+ * #250), and it is the same key dispatch admission counts slots on.
335
+ */
336
+ interface BackgroundMemoryRoute {
337
+ client: TaskMemoryModelClient;
338
+ targetId: string;
339
+ wireModelId: string;
340
+ endpointKey: string | null;
341
+ modelMaxTokens(configuredMaxTokens: number): number;
342
+ }
343
+
313
344
  function createBackgroundMemoryModelClient(
314
345
  providers: ProvidersContract,
315
346
  settings: Readonly<ClioSettings>,
316
347
  timeoutMs: number,
317
- ): TaskMemoryModelClient | null {
348
+ bus: Pick<SafeEventBus, "emit"> | null,
349
+ ): BackgroundMemoryRoute | null {
318
350
  const targetId = settings.background.target?.trim();
319
351
  const wireModelId = settings.background.model?.trim();
320
352
  if (!targetId || !wireModelId) return null;
@@ -343,24 +375,63 @@ function createBackgroundMemoryModelClient(
343
375
  const model = resolved.target.runtime.synthesizeModel(resolved.target.target, resolved.target.wireModelId, kbHit);
344
376
  const refined = refineRuntimeTargetWithModelHints(resolved.target, model, providers.knowledgeBase);
345
377
  applyModelCapabilityPatch(model, refined.capabilities);
378
+ const costProvenance = normalizeCostProvenance(refined.costProvenance);
379
+ const endpointKey = canonicalEndpointKey(refined.target);
346
380
  return {
347
- async complete(request) {
348
- const apiKey = targetRequiresAuth(refined.target, refined.runtime)
349
- ? (await providers.auth.resolveForTarget(refined.target, refined.runtime, { signal: request.signal })).apiKey
350
- : LOCAL_API_KEY_FALLBACK;
351
- return completeEngineText({
352
- model,
353
- systemPrompt: request.systemPrompt,
354
- userPrompt: request.userPrompt,
355
- maxTokens: request.maxTokens,
356
- // Always off, never the operator's chat thinking level. A model that
357
- // reasons anyway still works: `completeEngineText` keeps only text
358
- // blocks, and the memory output budget leaves room for the preamble.
359
- thinkingLevel: "off",
360
- signal: request.signal,
361
- timeoutMs,
362
- ...(apiKey === undefined ? {} : { apiKey }),
363
- });
381
+ targetId,
382
+ wireModelId: refined.wireModelId,
383
+ endpointKey,
384
+ modelMaxTokens: (configuredMaxTokens) =>
385
+ memoryInterventionModelMaxTokens({
386
+ configuredMaxTokens,
387
+ thinkingMechanism: refined.modelRuntime.thinking.mechanism,
388
+ modelMaxTokens: refined.capabilityDecisions.maxTokens,
389
+ }),
390
+ client: {
391
+ // Wrapped at the layer that knows a request left the process: the step
392
+ // holds endpoint capacity while it is out and publishes the cache
393
+ // disturbance even when a timeout means the usage sink never sees it.
394
+ complete: announceMemoryStepEndpoint({ bus, endpointKey, targetId }, async (request) => {
395
+ const apiKey = targetRequiresAuth(refined.target, refined.runtime)
396
+ ? (await providers.auth.resolveForTarget(refined.target, refined.runtime, { signal: request.signal })).apiKey
397
+ : LOCAL_API_KEY_FALLBACK;
398
+ const startedAt = Date.now();
399
+ const completion = await completeEngineText({
400
+ model,
401
+ systemPrompt: request.systemPrompt,
402
+ userPrompt: request.userPrompt,
403
+ maxTokens: request.maxTokens,
404
+ // Always off, never the operator's chat thinking level. A model that
405
+ // reasons anyway still works: `completeEngineText` keeps only text
406
+ // blocks, and the memory output budget leaves room for the preamble.
407
+ thinkingLevel: "off",
408
+ signal: request.signal,
409
+ timeoutMs,
410
+ ...(apiKey === undefined ? {} : { apiKey }),
411
+ });
412
+ // The step is billed here whatever the policy later decides about the
413
+ // answer. A model that read a trajectory and chose silence spent the
414
+ // same prefill as one that produced a reminder.
415
+ return {
416
+ text: completion.text,
417
+ inputTokens: completion.inputTokens,
418
+ outputTokens: completion.outputTokens,
419
+ usage: {
420
+ targetId,
421
+ attributedModelId: refined.wireModelId,
422
+ input: completion.usage.input,
423
+ output: completion.usage.output,
424
+ cacheRead: completion.usage.cacheRead,
425
+ cacheWrite: completion.usage.cacheWrite,
426
+ reasoning: completion.usage.reasoning,
427
+ totalTokens: completion.usage.totalTokens,
428
+ costUsd: completion.usage.costUsd,
429
+ costProvenance,
430
+ durationMs: Date.now() - startedAt,
431
+ backend: completion.backend,
432
+ },
433
+ };
434
+ }),
364
435
  },
365
436
  };
366
437
  }
@@ -463,7 +534,7 @@ async function resolveCompactionModel(
463
534
  const model = synthesizeOrchestratorModel(providers, target, wireModelId);
464
535
  if (!model) return null;
465
536
  const apiKey = await resolveApiKeyForTarget(target, providers);
466
- const resolution: CompactionResolution = { model, targetId };
537
+ const resolution: CompactionResolution = { model, targetId, endpointKey: canonicalEndpointKey(target) };
467
538
  if (apiKey !== undefined) resolution.apiKey = apiKey;
468
539
  return resolution;
469
540
  }
@@ -591,12 +662,21 @@ async function runCompactionFlow(
591
662
  const entries = filterEntriesToActivePath(readSessionEntriesForCompact(meta.id), activeLeafTurnId);
592
663
  if (entries.length === 0) return null;
593
664
 
594
- const result = await compact({
595
- entries,
596
- model: resolved.model,
597
- ...(resolved.apiKey !== undefined ? { apiKey: resolved.apiKey } : {}),
598
- ...(instructions !== undefined ? { instructions } : {}),
599
- });
665
+ // A compaction summary is a full streamed request against the chat target.
666
+ // Hold the same canonical endpoint slot as an ordinary turn, /btw round, or
667
+ // pre-warm so dispatch admission and background memory see its real usage.
668
+ const releaseEndpointSlot = resolved.endpointKey === null ? () => {} : registerForegroundStream(resolved.endpointKey);
669
+ let result: CompactResult;
670
+ try {
671
+ result = await compact({
672
+ entries,
673
+ model: resolved.model,
674
+ ...(resolved.apiKey !== undefined ? { apiKey: resolved.apiKey } : {}),
675
+ ...(instructions !== undefined ? { instructions } : {}),
676
+ });
677
+ } finally {
678
+ releaseEndpointSlot();
679
+ }
600
680
  if (result.messagesSummarized === 0 || result.summary.length === 0) return null;
601
681
 
602
682
  const entry: Omit<CompactionSummaryEntry, "turnId" | "timestamp"> = {
@@ -776,6 +856,19 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
776
856
  let effectiveSettingsForDispatch: (() => Readonly<ClioSettings>) | null = null;
777
857
  let protectedArtifactStateForDispatch: (() => ProtectedArtifactState) | null = null;
778
858
 
859
+ // Panes are an interactive-surface projection. Headless, ACP, and worker boots
860
+ // gate detection off so they never resolve a socket path or open a descriptor.
861
+ // This mirrors the `interactive` predicate computed after the domains load.
862
+ const muxInteractive = !options.headless && options.acp === undefined && process.env.CLIO_CODER_INTERACTIVE === "1";
863
+ // The rung is settled before the config contract loads, off the settings the
864
+ // interactive entry point already read strictly (`src/cli/clio.ts:31`) and
865
+ // the `--with-panes` / `--no-panes` flag, which wins in both directions. This
866
+ // is why `panes.enabled` is a restart-scoped row: the decision runs once,
867
+ // here. An inactive rung loads nothing: the whole extension, mux domain
868
+ // included, lives behind the dynamic import below.
869
+ const muxEnablement = resolvePanesEnablement(options.panes, options.startupSettings?.panes.enabled);
870
+ const withPanes = muxInteractive && muxEnablement !== "off" ? await import("./with-panes.js") : null;
871
+
779
872
  const result = await loadDomains(
780
873
  [
781
874
  options.startupSettings ? createConfigDomainModule(options.startupSettings) : ConfigDomainModule,
@@ -795,6 +888,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
795
888
  ShareDomainModule,
796
889
  createContextDomainModule({ noContextFiles: options.noContextFiles === true }),
797
890
  ProvidersDomainModule,
891
+ ToolchainDomainModule,
798
892
  SafetyDomainModule,
799
893
  createPromptsDomainModule({
800
894
  noContextFiles: options.noContextFiles === true,
@@ -804,6 +898,16 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
804
898
  SessionDomainModule,
805
899
  ObservabilityDomainModule,
806
900
  SchedulingDomainModule,
901
+ ...(withPanes
902
+ ? [
903
+ withPanes.createMuxDomainModule({
904
+ enabled: muxEnablement,
905
+ log: (level, message) => {
906
+ if (level === "warning") bootStderr(`[mux] ${message}\n`);
907
+ },
908
+ }),
909
+ ]
910
+ : []),
807
911
  // Dispatch resolves worker targets through the session's effective
808
912
  // settings view once it exists (assigned below, after the config
809
913
  // contract loads); until then it falls back to the shared snapshot.
@@ -811,6 +915,11 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
811
915
  getSettings: () => effectiveSettingsForDispatch?.(),
812
916
  getProtectedArtifactState: () => protectedArtifactStateForDispatch?.() ?? { artifacts: [] },
813
917
  autonomyOverride: options.headless?.autonomy !== undefined,
918
+ // The domain owns the durable journal here, not the dispatch
919
+ // tool's event registry: `/run`, a watchdog run, and a model
920
+ // dispatch all have to leave the same transcript behind, and only
921
+ // the last of the three ever reaches that registry.
922
+ journalRunEvents: true,
814
923
  }),
815
924
  LifecycleDomainModule,
816
925
  ],
@@ -873,6 +982,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
873
982
  const resources = result.getContract<ResourcesContract>("resources");
874
983
  const extensions = result.getContract<ExtensionsContract>("extensions");
875
984
  const share = result.getContract<ShareContract>("share");
985
+ const mux = result.getContract<MuxContract>("mux");
876
986
  const contextDomain = result.getContract<ContextContract>("context");
877
987
  const interop = result.getContract<InteropContract>("interop");
878
988
  // Boot detection resolves paths only: no `--version` subprocess and no skill
@@ -973,7 +1083,13 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
973
1083
  // Guardrail policy (tool-call budgets, tool byte caps, dispatch ledger cap)
974
1084
  // resolves settings-first with env as emergency override; install the
975
1085
  // settings section before any guard registration or tool reads it.
976
- configureGuardrails((config?.get() ?? readSettings()).guardrails);
1086
+ const resolvedSettings = config?.get() ?? readSettings();
1087
+ configureGuardrails(resolvedSettings.guardrails);
1088
+
1089
+ // The run event journal resolves the same way for the same reason: the sink
1090
+ // sits on the dispatch event path, where reading settings.yaml would be both
1091
+ // a cost and a throw site, so the composition root installs the value once.
1092
+ configureRunEventJournal(resolvedSettings.panes.journal);
977
1093
 
978
1094
  // Guard registrations on the middleware contract, in order: loop guard,
979
1095
  // protected artifacts (last among guards so it absorbs protect_path effects
@@ -1079,6 +1195,53 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1079
1195
  // telemetry row says which silence happened; this says what the model wrote.
1080
1196
  const memoryTracePath = taskMemoryTracePath();
1081
1197
  const memoryTrace = memoryTracePath === null ? null : createTaskMemoryTrace(memoryTracePath);
1198
+ // The route the last resolved memory client would call, kept so the endpoint
1199
+ // check and the cost row read the same resolution the step itself used.
1200
+ let backgroundMemoryRoute: BackgroundMemoryRoute | null = null;
1201
+ /**
1202
+ * Account for one background memory step exactly as a `/btw` side question is
1203
+ * accounted for: the in-process cost tracker under its own label so `/cost`
1204
+ * shows it while the session lives, and one durable out-of-turn row so
1205
+ * `clio-coder usage report` can still see it afterwards.
1206
+ *
1207
+ * Accounting only. The client wrapper (`announceMemoryStepEndpoint`) holds the
1208
+ * endpoint slot and publishes the disturbance; it sees the timed-out and
1209
+ * thrown steps this sink never hears about because their usage stays null.
1210
+ */
1211
+ const recordBackgroundMemoryUsage = (usage: TaskMemoryStepUsage): void => {
1212
+ const meta = session?.current() ?? null;
1213
+ try {
1214
+ recordBackgroundMemoryStep({
1215
+ usage,
1216
+ stateDir: clioStateDir(),
1217
+ sessionId: meta?.id ?? null,
1218
+ // The identity the session ledger is filed under, so `usage report
1219
+ // --repo` selects these rows with the same hash it selects ledgers with.
1220
+ repoIdentity: meta ? meta.cwdHash || cwdHash(meta.cwd || process.cwd()) : null,
1221
+ ...(observability === undefined ? {} : { observability }),
1222
+ });
1223
+ } catch {
1224
+ // Accounting is bookkeeping. Its failure never reaches the memory step.
1225
+ }
1226
+ };
1227
+ const proposeInjectedMemoryEntries = (entries: ReadonlyArray<TaskMemoryEntry>): void => {
1228
+ const meta = session?.current() ?? null;
1229
+ void proposeInjectedTaskMemory(clioDataDir(), {
1230
+ sessionId: meta?.id ?? null,
1231
+ cwd: meta?.cwd || process.cwd(),
1232
+ entries,
1233
+ })
1234
+ .then((result) => {
1235
+ for (const error of result.errors) {
1236
+ process.stderr.write(`[clio:memory] proposed record not written for ${error}\n`);
1237
+ }
1238
+ })
1239
+ .catch((error: unknown) => {
1240
+ process.stderr.write(
1241
+ `[clio:memory] proposed records not written: ${error instanceof Error ? error.message : String(error)}\n`,
1242
+ );
1243
+ });
1244
+ };
1082
1245
  const memoryIntervention = createMemoryInterventionRegistration({
1083
1246
  bank: taskMemoryBank,
1084
1247
  telemetry: createTaskMemoryTelemetrySink(),
@@ -1093,10 +1256,28 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1093
1256
  },
1094
1257
  getModelClient: () => {
1095
1258
  const settings = effectiveSettingsForDispatch?.();
1096
- return settings === undefined
1097
- ? null
1098
- : createBackgroundMemoryModelClient(providers, settings, settings.memory.intervention.timeoutMs);
1259
+ backgroundMemoryRoute =
1260
+ settings === undefined
1261
+ ? null
1262
+ : createBackgroundMemoryModelClient(providers, settings, settings.memory.intervention.timeoutMs, bus);
1263
+ return backgroundMemoryRoute?.client ?? null;
1264
+ },
1265
+ getModelMaxTokens: (configuredMaxTokens) =>
1266
+ backgroundMemoryRoute?.modelMaxTokens(configuredMaxTokens) ?? configuredMaxTokens,
1267
+ // A single-slot local server serves one request at a time, so a memory step
1268
+ // started while the operator's turn is streaming either waits behind it or
1269
+ // makes the server swap the resident model out to answer. The chat loop
1270
+ // registers its stream on the endpoint it streams against, so the two are
1271
+ // compared by the same canonical key dispatch admission counts slots on.
1272
+ backgroundEndpointBusy: () => {
1273
+ const endpointKey = backgroundMemoryRoute?.endpointKey ?? null;
1274
+ if (endpointKey === null) return false;
1275
+ // This runs before the client wrapper registers the admitted step, so the
1276
+ // count contains other requests only and the step cannot refuse itself.
1277
+ return (foregroundStreamUsage()[endpointKey] ?? 0) > 0;
1099
1278
  },
1279
+ onStepUsage: (usage) => recordBackgroundMemoryUsage(usage),
1280
+ onInjectedEntries: (entries) => proposeInjectedMemoryEntries(entries),
1100
1281
  });
1101
1282
  middleware.registerHook(memoryIntervention);
1102
1283
  const unsubscribeMemoryLoop = bus.on(BusChannels.LoopBlocked, () => memoryIntervention.signalLoop());
@@ -1243,6 +1424,19 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1243
1424
  // Operator-initiated backgrounding is a TUI affordance: the registry is the
1244
1425
  // one object the dispatch tool and the keypress both hold.
1245
1426
  const dispatchBackground = createDispatchBackgroundRegistry();
1427
+ // One `PanesOperations` instance drives both the `panes` tool and the
1428
+ // `/panes` slash command, so the model and the operator cannot be told
1429
+ // different things about the same pane. It also owns the no-mux Yazi chooser,
1430
+ // while model tool registration below remains gated on a live pane host.
1431
+ const panes =
1432
+ withPanes && mux
1433
+ ? withPanes.createPanesRuntime({
1434
+ mux,
1435
+ getSettings: () => getCurrentSettings(),
1436
+ getDispatchSnapshot: () => dispatch.snapshot(),
1437
+ getCwd: () => process.cwd(),
1438
+ })
1439
+ : null;
1246
1440
  registerAllTools(toolRegistry, {
1247
1441
  ...(session
1248
1442
  ? {
@@ -1266,6 +1460,11 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1266
1460
  // provenance and compete winner handling agree with the approval surface.
1267
1461
  getAutonomy: resolveEffectiveAutonomy,
1268
1462
  ...(interactive ? { dispatchBackground } : {}),
1463
+ ...(mux ? { competeMuxWorktrees: mux } : {}),
1464
+ // Registered only when a pane host answered detection, so the tool is
1465
+ // absent from the prompt on a machine with none rather than present and
1466
+ // always refusing.
1467
+ ...(panes && mux?.mode !== "none" ? { panes } : {}),
1269
1468
  getCostCeilingUsd: () => result.getContract<SchedulingContract>("scheduling")?.ceilingUsd() ?? 0,
1270
1469
  ...(config ? { getWorkerRosters: () => config.get().workers.rosters } : {}),
1271
1470
  getSkillLoaderOptions: () => ({
@@ -1411,6 +1610,20 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1411
1610
  mutateSaved?.(saved);
1412
1611
  });
1413
1612
  };
1613
+ /**
1614
+ * A routing change at the scope the operator chose. "session" moves the live
1615
+ * route and leaves settings.yaml alone, so a swap that points at a dead
1616
+ * endpoint dies with the session that made it; "global" is the historical
1617
+ * write-through. Nothing on this path writes durably without a scope.
1618
+ */
1619
+ const applyRoutingAtScope = (patch: RoutingPatch, scope: "session" | "global"): void => {
1620
+ if (scope === "global") {
1621
+ updateSessionRouting(patch);
1622
+ return;
1623
+ }
1624
+ applyRoutingPatch(sessionRouting, patch);
1625
+ bumpSessionState();
1626
+ };
1414
1627
  const readAcpSafeSettings = (): AcpSafeSettingsSnapshot => {
1415
1628
  const settings = getCurrentSettings();
1416
1629
  return {
@@ -1569,6 +1782,12 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1569
1782
  }
1570
1783
 
1571
1784
  const chat = createChatLoop({
1785
+ // The pre-warm holds one slot on its endpoint while it runs, so dispatch
1786
+ // admission (#250) sees it exactly as it sees the orchestrator's own turn.
1787
+ registerPrewarmEndpointSlot: (runtime) => {
1788
+ const key = canonicalEndpointKey(runtime.runtimeResolution.target);
1789
+ return key === null ? null : registerForegroundStream(key);
1790
+ },
1572
1791
  getSettings: getCurrentSettings,
1573
1792
  providers,
1574
1793
  middleware,
@@ -1628,6 +1847,11 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1628
1847
  : {}),
1629
1848
  toolRegistry,
1630
1849
  hasAttachedDispatch: () => dispatchBackground.size() > 0,
1850
+ // The pre-warm buys latency for a person about to type the next turn. A
1851
+ // headless `run` submits its one prompt immediately and an unattended boot
1852
+ // never submits at all, so neither has latency to buy; the ACP surface has
1853
+ // an operator on the other end of the client and keeps it.
1854
+ isLatencySurface: () => interactive || acpMode,
1631
1855
  });
1632
1856
 
1633
1857
  // Coordinated shutdown (SIGINT/SIGTERM, TUI quit) must abort any in-flight
@@ -1872,6 +2096,20 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1872
2096
  ...(extensions ? { extensions } : {}),
1873
2097
  ...(interop ? { interop } : {}),
1874
2098
  ...(share ? { share } : {}),
2099
+ ...(mux ? { mux } : {}),
2100
+ ...(panes ? { panes } : {}),
2101
+ ...(panes ? { attachYaziBridge: (bridge) => panes.attachYazi(bridge) } : {}),
2102
+ // The interactive surface never imports the panes glue itself; the
2103
+ // factories arrive only on an active boot, through the same dynamic
2104
+ // import that loaded the mux domain.
2105
+ ...(withPanes
2106
+ ? {
2107
+ createMuxBridge: withPanes.createMuxBridge,
2108
+ createYaziBridge: withPanes.createYaziBridge,
2109
+ createWatchPane: withPanes.createWatchPaneController,
2110
+ }
2111
+ : {}),
2112
+ ...(panes ? { attachWatchPane: (controller) => panes.attachWatch(controller) } : {}),
1875
2113
  toolRegistry,
1876
2114
  ...(session ? { session } : {}),
1877
2115
  ...(session ? { readSessionEntries: readCurrentSessionEntries } : {}),
@@ -1891,6 +2129,10 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1891
2129
  bank,
1892
2130
  activity: memoryIntervention.recentActivity(),
1893
2131
  stepInFlight: memoryIntervention.stepInFlight(),
2132
+ // Folded from the telemetry ledger, which is durable across sessions,
2133
+ // so `/memory` answers what the tier has cost since it was turned on
2134
+ // rather than what it cost since this process started.
2135
+ spend: readTaskMemorySpendSummary(clioStateDir()),
1894
2136
  };
1895
2137
  },
1896
2138
  getTaskMemorySeedOffer,
@@ -1980,7 +2222,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1980
2222
  },
1981
2223
  }
1982
2224
  : {}),
1983
- onSetThinkingLevel: (level) => {
2225
+ onSetThinkingLevel: (level, scope) => {
1984
2226
  const current = getCurrentSettings();
1985
2227
  const nextLevel =
1986
2228
  resolveModelRuntimeCapabilitiesForProviders(
@@ -1989,7 +2231,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1989
2231
  current.orchestrator.model,
1990
2232
  level,
1991
2233
  )?.thinking.effectiveLevel ?? "off";
1992
- updateSessionRouting({ orchestrator: { thinkingLevel: nextLevel } });
2234
+ applyRoutingAtScope({ orchestrator: { thinkingLevel: nextLevel } }, scope ?? "global");
1993
2235
  },
1994
2236
  onCycleThinking: () => {
1995
2237
  const current = getCurrentSettings();
@@ -2006,7 +2248,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
2006
2248
  );
2007
2249
  updateSessionRouting({ orchestrator: { thinkingLevel: nextLevel } });
2008
2250
  },
2009
- onSelectModel: ({ target, model }) => {
2251
+ onSelectModel: ({ target, model }, scope) => {
2010
2252
  const registry = getRuntimeRegistry();
2011
2253
  const settings = getCurrentSettings();
2012
2254
  const descriptor = settings.targets.find((e) => e.id === target);
@@ -2023,7 +2265,9 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
2023
2265
  );
2024
2266
  }
2025
2267
  }
2026
- updateSessionRouting({ orchestrator: { target, model } });
2268
+ applyRoutingAtScope({ orchestrator: { target, model } }, scope);
2269
+ // Recents live in the state dir, not settings.yaml, and are how a swap
2270
+ // stays reachable in the picker. A session-scoped swap still earns one.
2027
2271
  rememberRecentModel(`${target}/${model}`, getCurrentSettings().modelSelector.recentLimit);
2028
2272
  },
2029
2273
  writeSettings: (next) => applySettingsBlob(next),