@iowarp/clio-coder 0.3.9 → 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 (416) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/NOTICE +33 -0
  3. package/README.md +7 -2
  4. package/dist/{acp-7LOELQFP.js → acp-G5WJBNCT.js} +13 -12
  5. package/dist/{agents-FIBG2SHA.js → agents-FMV2Q5G4.js} +39 -36
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-OI4LIH2I.js → auth-3IDSJEIK.js} +16 -15
  8. package/dist/{builtins-AD25UL3C.js → builtins-XCZWXSC7.js} +3 -3
  9. package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
  10. package/dist/{chunk-56KB5IJP.js → chunk-2OQE55CK.js} +3 -3
  11. package/dist/{chunk-N3PBVRTZ.js → chunk-32KWKNSF.js} +9 -7
  12. package/dist/{chunk-VKBMFOYV.js → chunk-36EJLSQQ.js} +23 -27
  13. package/dist/{chunk-465CC7FK.js → chunk-3BT2XMV4.js} +16 -13
  14. package/dist/{chunk-NQ6UCCOD.js → chunk-3URVFKWK.js} +7 -7
  15. package/dist/{chunk-WIE7ZOSW.js → chunk-3XML7CDN.js} +2 -2
  16. package/dist/chunk-42FMPA75.js +101 -0
  17. package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
  18. package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
  19. package/dist/{chunk-JEQQR47K.js → chunk-6DB53AJS.js} +168 -9
  20. package/dist/{chunk-KV2AOLDF.js → chunk-76ONBSIA.js} +5 -25
  21. package/dist/{chunk-FALJGAWU.js → chunk-7MCTRUCE.js} +2 -2
  22. package/dist/{chunk-5T7RBWN2.js → chunk-AB44T6BB.js} +5 -5
  23. package/dist/chunk-B7OBL7PK.js +1405 -0
  24. package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
  25. package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
  26. package/dist/{chunk-O6I4CIEU.js → chunk-BKFJHQCA.js} +6 -6
  27. package/dist/chunk-BKFM6EJV.js +462 -0
  28. package/dist/chunk-BMS5RKQY.js +27 -0
  29. package/dist/{chunk-MV2VUEJC.js → chunk-BPKCPIL7.js} +2 -2
  30. package/dist/{chunk-TEO2TLVN.js → chunk-BUMFYQFY.js} +964 -1120
  31. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  32. package/dist/chunk-C2LTL2W6.js +2447 -0
  33. package/dist/{chunk-EBOC7MT3.js → chunk-CODPRO7Q.js} +8 -8
  34. package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
  35. package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
  36. package/dist/{chunk-MIX5N5AC.js → chunk-DQITNCXG.js} +394 -154
  37. package/dist/{chunk-S4COXYBG.js → chunk-DYJP44XW.js} +129 -106
  38. package/dist/{chunk-N5XKWMDW.js → chunk-F4CKPOEQ.js} +6 -6
  39. package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
  40. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  41. package/dist/{chunk-7C6RYZGQ.js → chunk-GKF55TAZ.js} +3 -3
  42. package/dist/{chunk-B5XRQOLB.js → chunk-GR5G2PVF.js} +9 -8
  43. package/dist/{chunk-XDOQXGFO.js → chunk-GXNLGKAB.js} +64 -8
  44. package/dist/chunk-HHV2GANA.js +88 -0
  45. package/dist/{chunk-774ILSRL.js → chunk-HI63TFOG.js} +4 -3
  46. package/dist/{chunk-R7LNVMCS.js → chunk-HJJTYUHX.js} +64 -72
  47. package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
  48. package/dist/{chunk-CA42X6KT.js → chunk-HWHKMHUA.js} +6 -6
  49. package/dist/chunk-HZHHCK24.js +1631 -0
  50. package/dist/{chunk-HJB5IUKP.js → chunk-I5VEOC6I.js} +12 -12
  51. package/dist/chunk-IBEBSCYA.js +564 -0
  52. package/dist/chunk-IQ7KR472.js +362 -0
  53. package/dist/{chunk-4H6ULJ3H.js → chunk-J4W7KFM7.js} +921 -990
  54. package/dist/{chunk-4LJX2PUC.js → chunk-JDG2WCRO.js} +5 -5
  55. package/dist/{chunk-NZU6YDNV.js → chunk-K5C3NCBD.js} +4 -4
  56. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  57. package/dist/{chunk-NNNWO6F2.js → chunk-KFZI4NIL.js} +93 -3
  58. package/dist/chunk-KMVISBZR.js +132 -0
  59. package/dist/{chunk-BVDVID7E.js → chunk-LDQ2ZF2M.js} +2 -2
  60. package/dist/{chunk-OEDBCISO.js → chunk-LQ3DZAMX.js} +2 -2
  61. package/dist/{chunk-PZ4I4JE2.js → chunk-LY4S7GJC.js} +124 -116
  62. package/dist/{chunk-3DUR4WUA.js → chunk-MLKNTWH2.js} +19 -19
  63. package/dist/chunk-NEKRRTYW.js +56 -0
  64. package/dist/{chunk-5DQRIYDZ.js → chunk-NHCZP4K7.js} +2 -2
  65. package/dist/chunk-NHLBIGRH.js +1506 -0
  66. package/dist/chunk-NQQH3YT7.js +302 -0
  67. package/dist/chunk-NYS75XW5.js +15 -0
  68. package/dist/{chunk-TD7UE2L5.js → chunk-O4XIVISU.js} +7 -7
  69. package/dist/{chunk-WXCJ7VME.js → chunk-O6TL7WWY.js} +6 -6
  70. package/dist/chunk-OQBA45DZ.js +97 -0
  71. package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
  72. package/dist/chunk-PMZCIOCJ.js +25 -0
  73. package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
  74. package/dist/{chunk-HKO36JWF.js → chunk-QBJA7R7N.js} +31 -3
  75. package/dist/chunk-QDC3K2U3.js +262 -0
  76. package/dist/{chunk-5HFBWUMU.js → chunk-QLFS5GO2.js} +4 -4
  77. package/dist/{chunk-GAYUJ7LE.js → chunk-QLL7ILRG.js} +41 -32
  78. package/dist/{chunk-LXPJXFM5.js → chunk-QREDIESB.js} +7 -7
  79. package/dist/chunk-QSNYB6ZV.js +195 -0
  80. package/dist/chunk-R346GLFC.js +31 -0
  81. package/dist/{chunk-VPTUJU4P.js → chunk-SJ5ZKQ4S.js} +2 -2
  82. package/dist/{chunk-QQ7EKM72.js → chunk-SP2RXXYO.js} +6 -54
  83. package/dist/chunk-SUCTJL45.js +45 -0
  84. package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
  85. package/dist/chunk-T56WDKA5.js +183 -0
  86. package/dist/chunk-TVHHYFHE.js +255 -0
  87. package/dist/{chunk-IHKBWSXF.js → chunk-TZ3SGWZZ.js} +2 -2
  88. package/dist/{chunk-ECUO3KDP.js → chunk-U77AMWDL.js} +47 -7
  89. package/dist/{chunk-3UUY7R3Z.js → chunk-ULC6OTWO.js} +7 -7
  90. package/dist/{chunk-AEYBF3TB.js → chunk-UM7N4G5A.js} +2 -2
  91. package/dist/{chunk-3V5AYSEQ.js → chunk-UXMFQ54G.js} +43 -36
  92. package/dist/{chunk-YW7UVM5V.js → chunk-V5DHCITQ.js} +34 -1
  93. package/dist/{chunk-47CMYGET.js → chunk-VAZSBTKF.js} +2 -2
  94. package/dist/{chunk-3MRC2YSQ.js → chunk-VEO4AP2K.js} +2 -2
  95. package/dist/{chunk-PNY46YEY.js → chunk-VFA6GDY5.js} +47 -3
  96. package/dist/chunk-VO67MWHC.js +75 -0
  97. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  98. package/dist/{chunk-AD7Y7STJ.js → chunk-VYMXRQI6.js} +36 -22
  99. package/dist/{chunk-T3Z6VAAF.js → chunk-W5VSYASO.js} +19 -17
  100. package/dist/{chunk-5PVQ4SRS.js → chunk-WZR7K7ZX.js} +7 -123
  101. package/dist/{chunk-DG4M6ZUE.js → chunk-X3YGUTOB.js} +4 -4
  102. package/dist/chunk-X75E3D2N.js +686 -0
  103. package/dist/{chunk-P3JGPQFL.js → chunk-YDFRH54B.js} +4 -4
  104. package/dist/chunk-YJX4SHTD.js +40 -0
  105. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  106. package/dist/{chunk-YSEHGPCT.js → chunk-Z2RR6MAK.js} +3 -3
  107. package/dist/{chunk-HCBCAYZU.js → chunk-Z4TXYIEG.js} +5 -5
  108. package/dist/cli/index.js +47 -36
  109. package/dist/{clio-LT5V7SSZ.js → clio-2JXHBBY5.js} +7 -7
  110. package/dist/{code-nav-LMW275PA.js → code-nav-3YYRMYNF.js} +6 -6
  111. package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
  112. package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
  113. package/dist/{config-RXS5T3JT.js → config-QZPCMYSO.js} +58 -50
  114. package/dist/{configure-2WYWSCSD.js → configure-TEGEBYCA.js} +21 -19
  115. package/dist/{context-I3BTOTCS.js → context-AV7OEZ4D.js} +11 -11
  116. package/dist/{context-MVOORGMF.js → context-E6H5RNMC.js} +49 -41
  117. package/dist/{context-PALKKQYL.js → context-GSXUE4CT.js} +25 -23
  118. package/dist/{context-clear-N2WOYZ2K.js → context-clear-SHIBYK6T.js} +48 -40
  119. package/dist/{context-working-set-MIEVECVZ.js → context-working-set-5ZGKPGZQ.js} +11 -10
  120. package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-EFMJT4LD.js} +88 -60
  121. package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
  122. package/dist/doctor-QOA5FNY5.js +313 -0
  123. package/dist/{eval-IJ5VEZDJ.js → eval-TFBYQH4H.js} +66 -64
  124. package/dist/eval-inventory-SXH7PDKX.js +316 -0
  125. package/dist/{evidence-L5APPXNV.js → evidence-ERGESKGN.js} +198 -44
  126. package/dist/{evolve-RGNKFJ52.js → evolve-VDXTSYCJ.js} +46 -38
  127. package/dist/{extensions-7WYWUX5A.js → extensions-7BGBHN57.js} +6 -6
  128. package/dist/{fleet-6CNVBZZP.js → fleet-2RRVDF2V.js} +189 -101
  129. package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-VJ726XIA.js} +10 -10
  130. package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
  131. package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-JF5QOATM.js} +16 -15
  132. package/dist/fleet-inspect-VLY4S7QM.js +442 -0
  133. package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-AIZUEJOY.js} +6 -5
  134. package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-AJRPDMDV.js} +20 -18
  135. package/dist/fleet-verify-JFEL2L3H.js +175 -0
  136. package/dist/fleet-view-ZCON35AG.js +102 -0
  137. package/dist/{init-VBN2ACVA.js → init-DN2WWLFE.js} +64 -56
  138. package/dist/install-XGLBQY5E.js +13 -0
  139. package/dist/interop-OZBKXAYL.js +114 -0
  140. package/dist/{library-JHGUMLY2.js → library-YWZG7IMW.js} +19 -18
  141. package/dist/{memory-K4OQIYWG.js → memory-I4C4HMLW.js} +48 -40
  142. package/dist/{models-2NCZUWDD.js → models-CEYXJBO6.js} +30 -28
  143. package/dist/{monitor-MMVTJABD.js → monitor-NZ6GCI3P.js} +53 -47
  144. package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-GCGQ4N5I.js} +6311 -7145
  145. package/dist/panes-HMABYVO4.js +58 -0
  146. package/dist/panes-KY6W3V2E.js +103 -0
  147. package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
  148. package/dist/{reset-DD5JGOY3.js → reset-DQ6FGCSH.js} +13 -11
  149. package/dist/resources-BB3MVJMD.js +111 -0
  150. package/dist/{run-QEGNX7FL.js → run-H2GQDUER.js} +113 -82
  151. package/dist/{share-JKD3BQMW.js → share-GTJN6A5O.js} +18 -17
  152. package/dist/{skills-LMQIKDOZ.js → skills-L55TEW6R.js} +31 -24
  153. package/dist/{skills-eval-I7X2774U.js → skills-eval-XVXPH2JI.js} +61 -52
  154. package/dist/skills-inventory-S4MXPJFV.js +126 -0
  155. package/dist/slash-commands-ZSGASKJC.js +77 -0
  156. package/dist/{steer-CF5TDANS.js → steer-RZGSCY4R.js} +3 -3
  157. package/dist/{support-I7LOJLIF.js → support-PKEUNNQL.js} +4 -4
  158. package/dist/{targets-RUSR6B5Z.js → targets-NCPZ644J.js} +31 -29
  159. package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-44SV3YCN.js} +4 -4
  160. package/dist/tools-DAF3DI3C.js +27 -0
  161. package/dist/{trace-ODOQIVIW.js → trace-FYVW2MQA.js} +149 -7
  162. package/dist/tui-primitives-2AKXQNZK.js +13 -0
  163. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
  164. package/dist/{upgrade-XANW3FXB.js → upgrade-3XPP6OQL.js} +26 -24
  165. package/dist/{usage-4H7ZRXQT.js → usage-3NLHGTU2.js} +57 -49
  166. package/dist/{verifiers-UZXNBZEB.js → verifiers-SSQONKRT.js} +171 -12
  167. package/dist/{verify-BVKWTNDL.js → verify-3U6J7FZI.js} +9 -9
  168. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
  169. package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-CEHYGPGQ.js} +67 -59
  170. package/dist/with-panes-MKB46MPQ.js +782 -0
  171. package/dist/worker/entry.js +101 -66
  172. package/docs/README.md +3 -2
  173. package/docs/acp.md +24 -3
  174. package/docs/alcf-provider.md +1 -1
  175. package/docs/architecture.md +2 -2
  176. package/docs/artifact-versions.md +4 -1
  177. package/docs/built-in-agents.md +1 -1
  178. package/docs/capacity-and-scheduling.md +43 -5
  179. package/docs/commands-and-modes.md +31 -2
  180. package/docs/configuration-and-targets.md +40 -10
  181. package/docs/context-engine.md +1 -1
  182. package/docs/development-pipeline.md +19 -0
  183. package/docs/dispatch-typed-intent.md +385 -0
  184. package/docs/documentation-coverage.md +2 -2
  185. package/docs/documentation-guide.md +1 -1
  186. package/docs/environment-variables.md +1 -0
  187. package/docs/eval-runner.md +1 -1
  188. package/docs/evals-internal.md +1 -1
  189. package/docs/evidence-and-memory.md +2 -2
  190. package/docs/evolution.md +1 -1
  191. package/docs/exit-codes-and-output.md +1 -1
  192. package/docs/extensions-and-sharing.md +25 -1
  193. package/docs/fleet-dispatch.md +22 -1
  194. package/docs/installation-and-lifecycle.md +15 -2
  195. package/docs/middleware-and-components.md +1 -1
  196. package/docs/model-catalog.md +10 -1
  197. package/docs/observability.md +3 -3
  198. package/docs/proactive-memory.md +1 -1
  199. package/docs/prompt-envelope-and-tools.md +1 -1
  200. package/docs/provider-adapter-cookbook.md +1 -1
  201. package/docs/safety-model.md +2 -2
  202. package/docs/scientific-validation.md +3 -3
  203. package/docs/session-lifecycle.md +1 -1
  204. package/docs/skills-marketplace.md +1 -1
  205. package/docs/tool-usage.md +18 -8
  206. package/docs/trace-store.md +1 -1
  207. package/docs/troubleshooting.md +1 -1
  208. package/docs/tui-design.md +1 -1
  209. package/docs/worker-dispatch-mechanics.md +1 -1
  210. package/package.json +4 -2
  211. package/src/cli/acp.ts +6 -2
  212. package/src/cli/argv.ts +25 -0
  213. package/src/cli/configure.ts +23 -21
  214. package/src/cli/doctor-panes.ts +124 -0
  215. package/src/cli/doctor-toolchain.ts +57 -0
  216. package/src/cli/doctor.ts +20 -1
  217. package/src/cli/eval-inventory.ts +436 -0
  218. package/src/cli/eval.ts +13 -0
  219. package/src/cli/evidence-detail.ts +88 -0
  220. package/src/cli/evidence-inventory.ts +183 -0
  221. package/src/cli/evidence.ts +30 -5
  222. package/src/cli/fleet-decisions.ts +69 -0
  223. package/src/cli/fleet-inspect.ts +334 -0
  224. package/src/cli/fleet-verify.ts +133 -0
  225. package/src/cli/fleet-view.ts +810 -0
  226. package/src/cli/fleet.ts +148 -37
  227. package/src/cli/index.ts +14 -2
  228. package/src/cli/interop-inspect.ts +128 -0
  229. package/src/cli/interop.ts +34 -0
  230. package/src/cli/panes.ts +35 -0
  231. package/src/cli/reset.ts +5 -2
  232. package/src/cli/run.ts +58 -0
  233. package/src/cli/skills-inventory.ts +185 -0
  234. package/src/cli/skills.ts +16 -13
  235. package/src/cli/tools.ts +321 -0
  236. package/src/cli/trace-inspect.ts +252 -0
  237. package/src/cli/trace.ts +23 -2
  238. package/src/cli/verifiers-inspect.ts +347 -0
  239. package/src/cli/verifiers.ts +9 -0
  240. package/src/core/bus-events.ts +4 -0
  241. package/src/core/config.ts +49 -0
  242. package/src/core/defaults.ts +93 -7
  243. package/src/core/response-schema.ts +44 -4
  244. package/src/core/theme-token-hex.ts +43 -0
  245. package/src/core/tool-names.ts +2 -1
  246. package/src/core/xdg.ts +1 -1
  247. package/src/domains/agents/fleets/build-review.md +0 -3
  248. package/src/domains/agents/fleets/build-test.md +0 -3
  249. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  250. package/src/domains/agents/result-contract.ts +164 -35
  251. package/src/domains/config/classify.ts +3 -0
  252. package/src/domains/dispatch/admission-error.ts +9 -0
  253. package/src/domains/dispatch/admission.ts +22 -21
  254. package/src/domains/dispatch/capacity-lease.ts +21 -1
  255. package/src/domains/dispatch/council-topology.ts +398 -0
  256. package/src/domains/dispatch/extension.ts +222 -50
  257. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  258. package/src/domains/dispatch/fleet-plan.ts +7 -2
  259. package/src/domains/dispatch/fleet-run.ts +64 -1
  260. package/src/domains/dispatch/gate-decisions.ts +11 -1
  261. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  262. package/src/domains/dispatch/gate-topology.ts +289 -0
  263. package/src/domains/dispatch/index.ts +19 -0
  264. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  265. package/src/domains/dispatch/intent.ts +85 -1
  266. package/src/domains/dispatch/reservation-store.ts +24 -4
  267. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  268. package/src/domains/dispatch/run-event-journal.ts +598 -0
  269. package/src/domains/dispatch/state.ts +45 -1
  270. package/src/domains/dispatch/types.ts +13 -0
  271. package/src/domains/dispatch/validation.ts +33 -8
  272. package/src/domains/eval/compare/compare.ts +3 -16
  273. package/src/domains/eval/inventory.ts +113 -0
  274. package/src/domains/eval/schema/serving.ts +31 -0
  275. package/src/domains/evidence/store.ts +6 -0
  276. package/src/domains/memory/index.ts +0 -1
  277. package/src/domains/memory/task-memory-policy.ts +6 -10
  278. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  279. package/src/domains/middleware/memory-intervention.ts +33 -21
  280. package/src/domains/mux/contract.ts +434 -0
  281. package/src/domains/mux/detect.ts +158 -0
  282. package/src/domains/mux/extension.ts +47 -0
  283. package/src/domains/mux/index.ts +96 -0
  284. package/src/domains/mux/manifest.ts +6 -0
  285. package/src/domains/mux/operations.ts +164 -0
  286. package/src/domains/mux/pane-registry.ts +90 -0
  287. package/src/domains/mux/protocol.ts +49 -0
  288. package/src/domains/mux/socket-client.ts +816 -0
  289. package/src/domains/mux/types.ts +222 -0
  290. package/src/domains/mux/viewer-command.ts +59 -0
  291. package/src/domains/mux/yazi/assets/init.lua +2 -0
  292. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  293. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  294. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  295. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  296. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  297. package/src/domains/mux/yazi/event-stream.ts +180 -0
  298. package/src/domains/mux/yazi/profile.ts +299 -0
  299. package/src/domains/mux/yazi/session.ts +228 -0
  300. package/src/domains/mux/yazi/theme.ts +30 -0
  301. package/src/domains/observability/cost.ts +21 -0
  302. package/src/domains/observability/index.ts +2 -0
  303. package/src/domains/observability/trace-store.ts +42 -0
  304. package/src/domains/providers/endpoint-capacity.ts +154 -22
  305. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  306. package/src/domains/providers/extension.ts +20 -3
  307. package/src/domains/providers/index.ts +22 -0
  308. package/src/domains/providers/model-runtime-capabilities.ts +32 -0
  309. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  310. package/src/domains/providers/runtimes/builtins.ts +2 -0
  311. package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
  312. package/src/domains/providers/support.ts +1 -0
  313. package/src/domains/providers/target-model-cache.ts +124 -0
  314. package/src/domains/resources/index.ts +3 -0
  315. package/src/domains/resources/skills/loader.ts +33 -0
  316. package/src/domains/safety/action-classifier.ts +6 -0
  317. package/src/domains/toolchain/archive.ts +175 -0
  318. package/src/domains/toolchain/contract.ts +28 -0
  319. package/src/domains/toolchain/extension.ts +47 -0
  320. package/src/domains/toolchain/index.ts +39 -0
  321. package/src/domains/toolchain/install.ts +327 -0
  322. package/src/domains/toolchain/manifest.ts +8 -0
  323. package/src/domains/toolchain/paths.ts +34 -0
  324. package/src/domains/toolchain/registry.ts +265 -0
  325. package/src/domains/toolchain/remove.ts +218 -0
  326. package/src/domains/toolchain/resolve.ts +182 -0
  327. package/src/domains/toolchain/types.ts +113 -0
  328. package/src/domains/toolchain/version.ts +88 -0
  329. package/src/engine/acp/server.ts +413 -70
  330. package/src/engine/acp/types.ts +19 -1
  331. package/src/engine/claude/sdk-module.ts +98 -0
  332. package/src/engine/claude/sdk-runtime.ts +19 -11
  333. package/src/engine/tui-primitives.ts +21 -0
  334. package/src/engine/tui.ts +1 -0
  335. package/src/engine/worker-runtime.ts +2 -13
  336. package/src/entry/boot-options.ts +2 -0
  337. package/src/entry/orchestrator.ts +103 -5
  338. package/src/entry/panes-activation.ts +31 -0
  339. package/src/entry/with-panes.ts +20 -0
  340. package/src/interactive/context-overlay.ts +1 -0
  341. package/src/interactive/cost-overlay.ts +2 -0
  342. package/src/interactive/council-grid.ts +1 -3
  343. package/src/interactive/council.ts +11 -0
  344. package/src/interactive/dispatch-board.ts +26 -16
  345. package/src/interactive/interactive-application.ts +153 -6
  346. package/src/interactive/interactive-input-runtime.ts +7 -0
  347. package/src/interactive/interactive-slash-runtime.ts +36 -6
  348. package/src/interactive/memory-overlay.ts +1 -0
  349. package/src/interactive/modal-marker.ts +170 -0
  350. package/src/interactive/mux-bridge.ts +214 -0
  351. package/src/interactive/overlay-frame.ts +58 -2
  352. package/src/interactive/overlay-general-openers.ts +1 -0
  353. package/src/interactive/overlay-key-routing.ts +14 -3
  354. package/src/interactive/overlay-lifecycle.ts +19 -3
  355. package/src/interactive/overlay-model-selectors.ts +40 -3
  356. package/src/interactive/overlay-permission-lifecycle.ts +90 -22
  357. package/src/interactive/overlay-transitions.ts +18 -4
  358. package/src/interactive/overlays/agents.ts +1 -0
  359. package/src/interactive/overlays/ask-user.ts +136 -30
  360. package/src/interactive/overlays/auth-dialog.ts +1 -0
  361. package/src/interactive/overlays/context-reset.ts +1 -0
  362. package/src/interactive/overlays/cwd-fallback.ts +1 -0
  363. package/src/interactive/overlays/decisions.ts +11 -11
  364. package/src/interactive/overlays/extensions.ts +1 -0
  365. package/src/interactive/overlays/fleet-run-approval.ts +1 -0
  366. package/src/interactive/overlays/handoff-review.ts +1 -0
  367. package/src/interactive/overlays/help-reference.ts +2 -0
  368. package/src/interactive/overlays/interop.ts +1 -0
  369. package/src/interactive/overlays/library-install-confirm.ts +1 -0
  370. package/src/interactive/overlays/library-tabs.ts +28 -0
  371. package/src/interactive/overlays/list-overlay.ts +10 -1
  372. package/src/interactive/overlays/message-picker.ts +1 -0
  373. package/src/interactive/overlays/model-scope.ts +86 -0
  374. package/src/interactive/overlays/model-selector.ts +1 -0
  375. package/src/interactive/overlays/prompts.ts +1 -0
  376. package/src/interactive/overlays/session-selector.ts +1 -0
  377. package/src/interactive/overlays/settings-sections.ts +30 -0
  378. package/src/interactive/overlays/settings.ts +579 -44
  379. package/src/interactive/overlays/side-question.ts +1 -0
  380. package/src/interactive/overlays/skills-hub.ts +3 -11
  381. package/src/interactive/overlays/tree-selector.ts +1 -0
  382. package/src/interactive/pane-policy.ts +46 -0
  383. package/src/interactive/panes-runtime.ts +292 -0
  384. package/src/interactive/renderers/compaction-summary.ts +29 -0
  385. package/src/interactive/renderers/worker-entry.ts +122 -14
  386. package/src/interactive/slash-commands.ts +251 -15
  387. package/src/interactive/tasks-overlay.ts +1 -0
  388. package/src/interactive/theme/tokens.ts +3 -14
  389. package/src/interactive/turn-context.ts +47 -2
  390. package/src/interactive/view/artifacts.ts +109 -1
  391. package/src/interactive/view/view-overlay.ts +1 -0
  392. package/src/interactive/watch-pane.ts +152 -0
  393. package/src/interactive/worker-progress.ts +7 -1
  394. package/src/interactive/worker-receipts.ts +19 -1
  395. package/src/interactive/worker-stream.ts +5 -0
  396. package/src/interactive/yazi-bridge.ts +444 -0
  397. package/src/tools/bootstrap.ts +26 -2
  398. package/src/tools/builtin-tool-catalog.ts +15 -0
  399. package/src/tools/compete-worktrees.ts +83 -2
  400. package/src/tools/core-bootstrap.ts +2 -1
  401. package/src/tools/dispatch-admission.ts +14 -3
  402. package/src/tools/dispatch-arguments.ts +20 -20
  403. package/src/tools/dispatch-run-events.ts +134 -19
  404. package/src/tools/dispatch-runner.ts +29 -7
  405. package/src/tools/dispatch-types.ts +15 -3
  406. package/src/tools/dispatch.ts +1 -1
  407. package/src/tools/executables.ts +17 -14
  408. package/src/tools/observation.ts +54 -4
  409. package/src/tools/panes-surface.ts +38 -0
  410. package/src/tools/panes.ts +112 -0
  411. package/src/tools/policy.ts +10 -1
  412. package/src/tools/presentation.ts +1 -0
  413. package/dist/chunk-D73KXYPF.js +0 -37
  414. package/dist/chunk-MLOK6ZOS.js +0 -2888
  415. package/dist/chunk-YKOFT37S.js +0 -279
  416. package/dist/doctor-TWBWFK5V.js +0 -165
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Lazy loader for the optional `@anthropic-ai/claude-agent-sdk` package.
3
+ *
4
+ * The SDK's platform package ships a 224MB proprietary binary, so it lives in
5
+ * `optionalDependencies` and a default install skips it under
6
+ * `npm install --omit=optional`. Nothing may import it at module scope: boot,
7
+ * `doctor`, and every non-Claude runtime have to work on an install that never
8
+ * fetched it. The one value the runtime needs (`query`) is reached through the
9
+ * dynamic import below, at the moment a `claude-sdk` run actually starts, and a
10
+ * missing package surfaces as a typed error naming the package and the install
11
+ * command instead of an ESM resolution stack.
12
+ */
13
+ import type { query } from "@anthropic-ai/claude-agent-sdk";
14
+
15
+ /** The optional package this module resolves. */
16
+ export const CLAUDE_AGENT_SDK_PACKAGE = "@anthropic-ai/claude-agent-sdk";
17
+
18
+ /**
19
+ * Version the checkout pins in `optionalDependencies`. A contract test keeps
20
+ * the two in step so the install command quoted in the diagnostic never drifts
21
+ * from the version the runtime was built against.
22
+ */
23
+ export const CLAUDE_AGENT_SDK_VERSION = "0.3.186";
24
+
25
+ /** Exact command an operator can paste to make the Claude SDK runtime usable. */
26
+ export const CLAUDE_AGENT_SDK_INSTALL_COMMAND = `npm install ${CLAUDE_AGENT_SDK_PACKAGE}@${CLAUDE_AGENT_SDK_VERSION}`;
27
+
28
+ /** The slice of the SDK surface the worker runtime calls. */
29
+ export interface ClaudeAgentSdkModule {
30
+ query: typeof query;
31
+ }
32
+
33
+ /** Thrown when a `claude-sdk` run starts on an install that omitted the optional package. */
34
+ export class ClaudeAgentSdkUnavailableError extends Error {
35
+ readonly code = "CLAUDE_AGENT_SDK_UNAVAILABLE";
36
+ readonly packageName = CLAUDE_AGENT_SDK_PACKAGE;
37
+ readonly installCommand = CLAUDE_AGENT_SDK_INSTALL_COMMAND;
38
+
39
+ constructor(cause?: unknown) {
40
+ super(
41
+ `The claude-sdk runtime needs the optional package ${CLAUDE_AGENT_SDK_PACKAGE}, which is not installed. ` +
42
+ `Install it with \`${CLAUDE_AGENT_SDK_INSTALL_COMMAND}\` (or reinstall clio-coder without \`--omit=optional\`), ` +
43
+ `then select the target again. Every other runtime works without it.`,
44
+ cause === undefined ? undefined : { cause },
45
+ );
46
+ this.name = "ClaudeAgentSdkUnavailableError";
47
+ }
48
+ }
49
+
50
+ /** Resolution failures that mean "the package is not on disk" rather than "the package is broken". */
51
+ const MISSING_MODULE_CODES: ReadonlySet<string> = new Set([
52
+ "ERR_MODULE_NOT_FOUND",
53
+ "MODULE_NOT_FOUND",
54
+ "ERR_PACKAGE_PATH_NOT_EXPORTED",
55
+ ]);
56
+
57
+ function isMissingModuleError(error: unknown): boolean {
58
+ const code = (error as { code?: unknown } | null)?.code;
59
+ return typeof code === "string" && MISSING_MODULE_CODES.has(code);
60
+ }
61
+
62
+ export type ClaudeAgentSdkLoader = () => Promise<ClaudeAgentSdkModule>;
63
+
64
+ // The literal specifier is what keeps the SDK's types available here; the tsup
65
+ // `external` entry keeps esbuild from bundling it and leaves this as a real
66
+ // runtime `import()`.
67
+ const realLoader: ClaudeAgentSdkLoader = async () => await import("@anthropic-ai/claude-agent-sdk");
68
+
69
+ let loader: ClaudeAgentSdkLoader = realLoader;
70
+ let cached: ClaudeAgentSdkModule | null = null;
71
+
72
+ /**
73
+ * Swap the import used by {@link loadClaudeAgentSdk}. The absence of a 224MB
74
+ * optional package cannot be staged inside a normal test process, so the
75
+ * contract test intercepts the import here; passing `null` restores the real
76
+ * one and clears the cache.
77
+ */
78
+ export function setClaudeAgentSdkLoader(next: ClaudeAgentSdkLoader | null): void {
79
+ loader = next ?? realLoader;
80
+ cached = null;
81
+ }
82
+
83
+ /**
84
+ * Resolve the SDK, or fail with {@link ClaudeAgentSdkUnavailableError}. A load
85
+ * error that is not a resolution failure (a broken install, a throwing module
86
+ * top level) propagates unchanged, so a real fault is never mislabeled as an
87
+ * absent package.
88
+ */
89
+ export async function loadClaudeAgentSdk(): Promise<ClaudeAgentSdkModule> {
90
+ if (cached) return cached;
91
+ try {
92
+ cached = await loader();
93
+ return cached;
94
+ } catch (error) {
95
+ if (isMissingModuleError(error)) throw new ClaudeAgentSdkUnavailableError(error);
96
+ throw error;
97
+ }
98
+ }
@@ -1,15 +1,18 @@
1
- import {
2
- type CanUseTool,
3
- type EffortLevel,
4
- type HookCallback,
5
- type Options,
6
- type PermissionMode,
7
- type PermissionResult,
1
+ // Types only. `@anthropic-ai/claude-agent-sdk` is an optional dependency, so
2
+ // nothing here may reach it at module scope; the one value this runtime calls
3
+ // (`query`) comes from the lazy loader in ./sdk-module.js at run time.
4
+ import type {
5
+ CanUseTool,
6
+ EffortLevel,
7
+ HookCallback,
8
+ Options,
9
+ PermissionMode,
10
+ PermissionResult,
8
11
  query,
9
- type SDKMessage,
10
- type SDKResultMessage,
11
- type SDKUserMessage,
12
- type ThinkingConfig,
12
+ SDKMessage,
13
+ SDKResultMessage,
14
+ SDKUserMessage,
15
+ ThinkingConfig,
13
16
  } from "@anthropic-ai/claude-agent-sdk";
14
17
 
15
18
  import { readClioVersion } from "../../core/package-root.js";
@@ -19,6 +22,7 @@ import { isReserveAdmittedTool, resolveDeliveryTools } from "../loop-guard.js";
19
22
  import type { AgentEvent, AgentMessage, Usage } from "../types.js";
20
23
  import type { WorkerEventEmit, WorkerRunHandle, WorkerRunInput, WorkerRunResult } from "../worker-runtime.js";
21
24
  import { createWorkerSafety } from "../worker-tools.js";
25
+ import { loadClaudeAgentSdk } from "./sdk-module.js";
22
26
  import { isClaudeCodeSessionId } from "./session-id.js";
23
27
  import {
24
28
  type ClaudeToolPermissionDecision,
@@ -607,6 +611,10 @@ export function startClaudeSdkWorkerRun(input: WorkerRunInput, emit: WorkerEvent
607
611
 
608
612
  emit({ type: "agent_start" } as AgentEvent);
609
613
  try {
614
+ // First touch of the optional SDK. An install that omitted it fails
615
+ // here with a typed diagnostic naming the package and the install
616
+ // command, and lands in the catch below as an ordinary run failure.
617
+ const { query } = await loadClaudeAgentSdk();
610
618
  queryHandle = query({ prompt: buildClaudeSdkPrompt(input), options });
611
619
  for await (const sdkMessage of queryHandle) {
612
620
  if (sdkMessage.type === "system" && (sdkMessage as { subtype?: string }).subtype === "init") {
@@ -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>;
@@ -49,6 +49,7 @@ import { createDispatchDedupRegistration } from "../domains/dispatch/dedup.js";
49
49
  import { agentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
50
50
  import { readGateDecisionArtifacts, readPendingGateDecisions } from "../domains/dispatch/gate-decisions.js";
51
51
  import { createDispatchDomainModule } from "../domains/dispatch/index.js";
52
+ import { configureRunEventJournal } from "../domains/dispatch/run-event-journal.js";
52
53
  import { type ExtensionsContract, ExtensionsDomainModule } from "../domains/extensions/index.js";
53
54
  import { type InteropContract, InteropDomainModule } from "../domains/interop/index.js";
54
55
  import {
@@ -97,6 +98,7 @@ import { announceMemoryStepEndpoint } from "../domains/middleware/memory-step-en
97
98
  import { createTaskBoardReminderRegistration } from "../domains/middleware/task-board-reminder.js";
98
99
  import { createTaskNudgeRegistration } from "../domains/middleware/task-nudge.js";
99
100
  import { createWatchdogRegistration } from "../domains/middleware/watchdog.js";
101
+ import type { MuxContract } from "../domains/mux/index.js";
100
102
  import type { ObservabilityContract } from "../domains/observability/index.js";
101
103
  import { ObservabilityDomainModule, recordBackgroundMemoryStep } from "../domains/observability/index.js";
102
104
  import type { PromptsContract } from "../domains/prompts/contract.js";
@@ -120,6 +122,7 @@ import {
120
122
  targetRequiresAuth,
121
123
  VALID_THINKING_LEVELS,
122
124
  } from "../domains/providers/index.js";
125
+ import { memoryInterventionModelMaxTokens } from "../domains/providers/model-runtime-capabilities.js";
123
126
  import { getRuntimeRegistry } from "../domains/providers/registry.js";
124
127
  import { registerBuiltinRuntimes } from "../domains/providers/runtimes/builtins.js";
125
128
  import {
@@ -159,6 +162,7 @@ import {
159
162
  import { createTaskBoardStore } from "../domains/session/task-board.js";
160
163
  import { filterEntriesToActivePath } from "../domains/session/tree/active-path.js";
161
164
  import { type ShareContract, ShareDomainModule } from "../domains/share/index.js";
165
+ import { ToolchainDomainModule } from "../domains/toolchain/index.js";
162
166
  import { createUserTasksStore } from "../domains/user-tasks/store.js";
163
167
  import { type AcpSafeSettingsPatch, type AcpSafeSettingsSnapshot, serveClioAcpAgent } from "../engine/acp/server.js";
164
168
  import { createStdioServerTransport } from "../engine/acp/transport.js";
@@ -175,6 +179,7 @@ import { createChatLoop } from "../interactive/chat-loop.js";
175
179
  import { type RunIo, startInteractive } from "../interactive/index.js";
176
180
  import { buildModelReplayAgentMessagesFromTurns } from "../interactive/model-session-replay.js";
177
181
  import type { BootOptions } from "./boot-options.js";
182
+ import { resolvePanesEnablement } from "./panes-activation.js";
178
183
 
179
184
  export type { BootOptions, HeadlessSamplingOverrides } from "./boot-options.js";
180
185
 
@@ -333,6 +338,7 @@ interface BackgroundMemoryRoute {
333
338
  targetId: string;
334
339
  wireModelId: string;
335
340
  endpointKey: string | null;
341
+ modelMaxTokens(configuredMaxTokens: number): number;
336
342
  }
337
343
 
338
344
  function createBackgroundMemoryModelClient(
@@ -375,6 +381,12 @@ function createBackgroundMemoryModelClient(
375
381
  targetId,
376
382
  wireModelId: refined.wireModelId,
377
383
  endpointKey,
384
+ modelMaxTokens: (configuredMaxTokens) =>
385
+ memoryInterventionModelMaxTokens({
386
+ configuredMaxTokens,
387
+ thinkingMechanism: refined.modelRuntime.thinking.mechanism,
388
+ modelMaxTokens: refined.capabilityDecisions.maxTokens,
389
+ }),
378
390
  client: {
379
391
  // Wrapped at the layer that knows a request left the process: the step
380
392
  // holds endpoint capacity while it is out and publishes the cache
@@ -844,6 +856,19 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
844
856
  let effectiveSettingsForDispatch: (() => Readonly<ClioSettings>) | null = null;
845
857
  let protectedArtifactStateForDispatch: (() => ProtectedArtifactState) | null = null;
846
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
+
847
872
  const result = await loadDomains(
848
873
  [
849
874
  options.startupSettings ? createConfigDomainModule(options.startupSettings) : ConfigDomainModule,
@@ -863,6 +888,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
863
888
  ShareDomainModule,
864
889
  createContextDomainModule({ noContextFiles: options.noContextFiles === true }),
865
890
  ProvidersDomainModule,
891
+ ToolchainDomainModule,
866
892
  SafetyDomainModule,
867
893
  createPromptsDomainModule({
868
894
  noContextFiles: options.noContextFiles === true,
@@ -872,6 +898,16 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
872
898
  SessionDomainModule,
873
899
  ObservabilityDomainModule,
874
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
+ : []),
875
911
  // Dispatch resolves worker targets through the session's effective
876
912
  // settings view once it exists (assigned below, after the config
877
913
  // contract loads); until then it falls back to the shared snapshot.
@@ -879,6 +915,11 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
879
915
  getSettings: () => effectiveSettingsForDispatch?.(),
880
916
  getProtectedArtifactState: () => protectedArtifactStateForDispatch?.() ?? { artifacts: [] },
881
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,
882
923
  }),
883
924
  LifecycleDomainModule,
884
925
  ],
@@ -941,6 +982,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
941
982
  const resources = result.getContract<ResourcesContract>("resources");
942
983
  const extensions = result.getContract<ExtensionsContract>("extensions");
943
984
  const share = result.getContract<ShareContract>("share");
985
+ const mux = result.getContract<MuxContract>("mux");
944
986
  const contextDomain = result.getContract<ContextContract>("context");
945
987
  const interop = result.getContract<InteropContract>("interop");
946
988
  // Boot detection resolves paths only: no `--version` subprocess and no skill
@@ -1041,7 +1083,13 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1041
1083
  // Guardrail policy (tool-call budgets, tool byte caps, dispatch ledger cap)
1042
1084
  // resolves settings-first with env as emergency override; install the
1043
1085
  // settings section before any guard registration or tool reads it.
1044
- 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);
1045
1093
 
1046
1094
  // Guard registrations on the middleware contract, in order: loop guard,
1047
1095
  // protected artifacts (last among guards so it absorbs protect_path effects
@@ -1214,6 +1262,8 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1214
1262
  : createBackgroundMemoryModelClient(providers, settings, settings.memory.intervention.timeoutMs, bus);
1215
1263
  return backgroundMemoryRoute?.client ?? null;
1216
1264
  },
1265
+ getModelMaxTokens: (configuredMaxTokens) =>
1266
+ backgroundMemoryRoute?.modelMaxTokens(configuredMaxTokens) ?? configuredMaxTokens,
1217
1267
  // A single-slot local server serves one request at a time, so a memory step
1218
1268
  // started while the operator's turn is streaming either waits behind it or
1219
1269
  // makes the server swap the resident model out to answer. The chat loop
@@ -1374,6 +1424,19 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1374
1424
  // Operator-initiated backgrounding is a TUI affordance: the registry is the
1375
1425
  // one object the dispatch tool and the keypress both hold.
1376
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;
1377
1440
  registerAllTools(toolRegistry, {
1378
1441
  ...(session
1379
1442
  ? {
@@ -1397,6 +1460,11 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1397
1460
  // provenance and compete winner handling agree with the approval surface.
1398
1461
  getAutonomy: resolveEffectiveAutonomy,
1399
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 } : {}),
1400
1468
  getCostCeilingUsd: () => result.getContract<SchedulingContract>("scheduling")?.ceilingUsd() ?? 0,
1401
1469
  ...(config ? { getWorkerRosters: () => config.get().workers.rosters } : {}),
1402
1470
  getSkillLoaderOptions: () => ({
@@ -1542,6 +1610,20 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1542
1610
  mutateSaved?.(saved);
1543
1611
  });
1544
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
+ };
1545
1627
  const readAcpSafeSettings = (): AcpSafeSettingsSnapshot => {
1546
1628
  const settings = getCurrentSettings();
1547
1629
  return {
@@ -2014,6 +2096,20 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
2014
2096
  ...(extensions ? { extensions } : {}),
2015
2097
  ...(interop ? { interop } : {}),
2016
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) } : {}),
2017
2113
  toolRegistry,
2018
2114
  ...(session ? { session } : {}),
2019
2115
  ...(session ? { readSessionEntries: readCurrentSessionEntries } : {}),
@@ -2126,7 +2222,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
2126
2222
  },
2127
2223
  }
2128
2224
  : {}),
2129
- onSetThinkingLevel: (level) => {
2225
+ onSetThinkingLevel: (level, scope) => {
2130
2226
  const current = getCurrentSettings();
2131
2227
  const nextLevel =
2132
2228
  resolveModelRuntimeCapabilitiesForProviders(
@@ -2135,7 +2231,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
2135
2231
  current.orchestrator.model,
2136
2232
  level,
2137
2233
  )?.thinking.effectiveLevel ?? "off";
2138
- updateSessionRouting({ orchestrator: { thinkingLevel: nextLevel } });
2234
+ applyRoutingAtScope({ orchestrator: { thinkingLevel: nextLevel } }, scope ?? "global");
2139
2235
  },
2140
2236
  onCycleThinking: () => {
2141
2237
  const current = getCurrentSettings();
@@ -2152,7 +2248,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
2152
2248
  );
2153
2249
  updateSessionRouting({ orchestrator: { thinkingLevel: nextLevel } });
2154
2250
  },
2155
- onSelectModel: ({ target, model }) => {
2251
+ onSelectModel: ({ target, model }, scope) => {
2156
2252
  const registry = getRuntimeRegistry();
2157
2253
  const settings = getCurrentSettings();
2158
2254
  const descriptor = settings.targets.find((e) => e.id === target);
@@ -2169,7 +2265,9 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
2169
2265
  );
2170
2266
  }
2171
2267
  }
2172
- 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.
2173
2271
  rememberRecentModel(`${target}/${model}`, getCurrentSettings().modelSelector.recentLimit);
2174
2272
  },
2175
2273
  writeSettings: (next) => applySettingsBlob(next),
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Whether this boot activates the panes extension.
3
+ *
4
+ * The decision is made here, before any panes module loads, because the whole
5
+ * point of the activation model is that a plain boot never pays for the
6
+ * extension: no socket probe, no guest-mode detection, and none of the mux
7
+ * domain's code in the import closure. The orchestrator dynamically imports
8
+ * `src/entry/with-panes.ts` only when this resolves to an active rung, and a
9
+ * built-graph contract test (tests/contracts/instant-shell-import-graph.test.ts)
10
+ * pins that the default boot chunk carries no mux domain code.
11
+ *
12
+ * Precedence: the command-line flag wins in both directions, then the
13
+ * `panes.enabled` setting, then the shipped default of `off`.
14
+ */
15
+
16
+ /** Mirrors `MuxEnablement` in src/domains/mux/detect.ts without importing it. */
17
+ export type PanesEnablement = "auto" | "embedded" | "off";
18
+
19
+ export function resolvePanesEnablement(
20
+ flag: "with" | "without" | undefined,
21
+ setting: PanesEnablement | undefined,
22
+ ): PanesEnablement {
23
+ if (flag === "without") return "off";
24
+ if (flag === "with") {
25
+ // `--with-panes` on a settings file that names `embedded` honors the
26
+ // stronger setting; on `off` or absent settings it activates guest
27
+ // detection, which is the flag's promise.
28
+ return setting === "embedded" ? "embedded" : "auto";
29
+ }
30
+ return setting ?? "off";
31
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The panes extension's composition surface.
3
+ *
4
+ * This is the one module that statically imports panes-only code: the mux
5
+ * domain (socket client, contract, yazi session machinery) and the interactive
6
+ * glue built on it. The orchestrator imports it dynamically, and only when
7
+ * `resolvePanesEnablement` (src/entry/panes-activation.ts) says the extension
8
+ * is active, so a plain `clio-coder` boot never loads any of it. The built
9
+ * import graph is pinned by tests/contracts/instant-shell-import-graph.test.ts:
10
+ * the default boot chunk must carry no mux domain code.
11
+ *
12
+ * Everything re-exported here is a value the orchestrator wires; types cross
13
+ * the seam as type-only imports at the call sites and cost nothing.
14
+ */
15
+
16
+ export { createMuxDomainModule } from "../domains/mux/index.js";
17
+ export { createMuxBridge } from "../interactive/mux-bridge.js";
18
+ export { createPanesRuntime } from "../interactive/panes-runtime.js";
19
+ export { createWatchPaneController } from "../interactive/watch-pane.js";
20
+ export { createYaziBridge } from "../interactive/yazi-bridge.js";
@@ -330,6 +330,7 @@ export function openContextOverlay(
330
330
  const handle = showClioOverlayFrame(tui, text, {
331
331
  anchor: "center",
332
332
  width: CONTEXT_OVERLAY_WIDTH,
333
+ markerId: "context-view",
333
334
  title: "Context Window",
334
335
  footerHint: buildHint([]),
335
336
  });
@@ -374,6 +374,8 @@ export function openCostOverlay(
374
374
  const handle = showClioOverlayFrame(tui, body, {
375
375
  anchor: "center",
376
376
  width: COST_OVERLAY_WIDTH,
377
+ // Not derived from the title: that one carries the session id.
378
+ markerId: "cost",
377
379
  title: sessionId && sessionId.length > 0 ? `Session usage (${sessionId})` : "Session usage",
378
380
  footerHint: buildHint([]),
379
381
  });
@@ -14,6 +14,7 @@
14
14
  */
15
15
 
16
16
  import { truncateToWidth, wrapTextWithAnsi } from "../engine/tui.js";
17
+ import { COUNCIL_SYNTHESIS_LABEL } from "./council.js";
17
18
  import {
18
19
  type ClioTheme,
19
20
  type ClioToken,
@@ -38,9 +39,6 @@ export const COUNCIL_COLUMN_GUTTER = 2;
38
39
  /** Rows of a member's bounded answer tail a column shows before it defers to `/view`. */
39
40
  export const COUNCIL_ANSWER_ROWS = 4;
40
41
 
41
- /** The label the coordinator gives the synthesis run of every council group. */
42
- export const COUNCIL_SYNTHESIS_LABEL = "synthesis";
43
-
44
42
  /** One council run as the board draws it: the roster facts plus the run's presentation. */
45
43
  export interface CouncilMemberView {
46
44
  runId: string;
@@ -26,6 +26,17 @@ export type CouncilSynthesisMode = (typeof COUNCIL_SYNTHESIS_MODES)[number];
26
26
  /** Rounds the dispatch tool admits. The command enforces the same bound where the operator typed it. */
27
27
  export const COUNCIL_MAX_ROUNDS = 3;
28
28
 
29
+ /**
30
+ * The label the coordinator gives the synthesis run of every council group.
31
+ *
32
+ * It lives here rather than beside the board layout that draws it because it is
33
+ * council vocabulary, not presentation: the share path compares against it to
34
+ * decide whether a run seals the whole council or one voice, and that path must
35
+ * stay off the render module graph. See the header of
36
+ * `src/interactive/slash-commands.ts` for the closure budget that depends on it.
37
+ */
38
+ export const COUNCIL_SYNTHESIS_LABEL = "synthesis";
39
+
29
40
  export function isCouncilSynthesisMode(value: string): value is CouncilSynthesisMode {
30
41
  return COUNCIL_SYNTHESIS_MODES.some((mode) => mode === value);
31
42
  }