@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
@@ -3,7 +3,13 @@ import type { AgentSpec } from "../domains/agents/spec.js";
3
3
  import type { DispatchContract, DispatchRequest } from "../domains/dispatch/contract.js";
4
4
  import type { AgentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
5
5
  import type { AutonomyLevel } from "../domains/safety/autonomy.js";
6
- import type { cleanupCompeteGroup, createCandidateWorktree, mergeWinnerBranch } from "./compete-worktrees.js";
6
+ import type {
7
+ CandidateWorktree,
8
+ CompeteGroupOwnership,
9
+ CompeteMuxWorktrees,
10
+ cleanupCompeteGroup,
11
+ mergeWinnerBranch,
12
+ } from "./compete-worktrees.js";
7
13
  import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
8
14
  import type { DispatchPlanView, ResolvedDispatchPlanArtifact } from "./dispatch-plan.js";
9
15
  import type { DispatchRunEventRegistry } from "./dispatch-run-events.js";
@@ -83,9 +89,15 @@ export interface DispatchToolDeps {
83
89
  background?: DispatchBackgroundRegistry;
84
90
  /** Optional compete storage overrides for alternate backends and deterministic fault tests. */
85
91
  competeWorktrees?: {
86
- createCandidate?: typeof createCandidateWorktree;
87
- cleanupGroup?: typeof cleanupCompeteGroup;
92
+ createCandidate?: (
93
+ ownership: CompeteGroupOwnership,
94
+ index: number,
95
+ baseline: string,
96
+ ) => CandidateWorktree | Promise<CandidateWorktree>;
97
+ cleanupGroup?: (...args: Parameters<typeof cleanupCompeteGroup>) => void | Promise<void>;
88
98
  mergeWinner?: typeof mergeWinnerBranch;
99
+ /** Optional herdr route; every operation retains native Git fallback. */
100
+ mux?: CompeteMuxWorktrees;
89
101
  };
90
102
  getAgentCatalog?: () => string;
91
103
  getAgentSpecs: () => ReadonlyArray<AgentSpec>;
@@ -80,7 +80,7 @@ const DispatchIntentSchema = Type.Object(
80
80
  {
81
81
  additionalProperties: false,
82
82
  description:
83
- "Typed repository-relative path and output intent. Verification checks are declared ids from package scripts or .clio-coder/verifiers.yaml, not shell commands.",
83
+ "Typed repository-relative path and output intent. Declare it on every dispatch: declared paths select the project rules that apply to them and pin worker context, and omitting it falls back to reading path-like tokens out of your task and briefing text, which can miss an applicable rule. Verification checks are declared ids from package scripts or .clio-coder/verifiers.yaml, not shell commands. In a batch, per-task intent narrows the top-level intent and is refused if it reaches outside it.",
84
84
  },
85
85
  );
86
86
 
@@ -1,17 +1,4 @@
1
- import { statSync } from "node:fs";
2
- import { delimiter, join } from "node:path";
3
-
4
- function findExecutableOnPath(name: string): string | null {
5
- const pathEnv = process.env.PATH;
6
- if (!pathEnv) return null;
7
- for (const dir of pathEnv.split(delimiter)) {
8
- if (!dir) continue;
9
- const candidate = join(dir, name);
10
- const stat = statSync(candidate, { throwIfNoEntry: false });
11
- if (stat?.isFile() && (stat.mode & 0o111) !== 0) return candidate;
12
- }
13
- return null;
14
- }
1
+ import { findExecutableOnPath, resolveToolBinary } from "../domains/toolchain/resolve.js";
15
2
 
16
3
  export function resolveFdBinary(): string | null {
17
4
  return findExecutableOnPath("fd") ?? findExecutableOnPath("fdfind");
@@ -20,3 +7,19 @@ export function resolveFdBinary(): string | null {
20
7
  export function resolveRgBinary(): string | null {
21
8
  return findExecutableOnPath("rg");
22
9
  }
10
+
11
+ /**
12
+ * Resolve any executable Clio might run, through the toolchain ladder.
13
+ *
14
+ * For a name in the pinned registry the answer is PATH when the copy there
15
+ * clears the pin's floor, then Clio's vendored copy, then null. For anything
16
+ * else it is a plain PATH lookup, which is what `resolveFdBinary` and
17
+ * `resolveRgBinary` above already do for the two search tools Clio never
18
+ * vendors.
19
+ *
20
+ * Callers that need to explain the answer (doctor, `clio-coder tools status`)
21
+ * want `resolveToolBinary` instead: this returns only the path to run.
22
+ */
23
+ export function resolveBinary(name: string): string | null {
24
+ return resolveToolBinary(name).binaryPath;
25
+ }
@@ -70,9 +70,29 @@ export const OBSERVATION_TURN_BUDGET_ENV = GUARDRAIL_ENV_VARS.observationTurnBud
70
70
  const MIN_BUDGET_SLICE_BYTES = 1024;
71
71
  const BUDGET_TRACK_LIMIT = 256;
72
72
 
73
+ /**
74
+ * How many exhausted-pool notices one turn gets before the next such call fails
75
+ * terminally instead of returning a retryable notice.
76
+ *
77
+ * Smoke pass 2 (G2) watched a 9B local model re-issue the identical read about
78
+ * twenty times against the same 208-byte notice, until the unrelated tool-call
79
+ * budget stopped it. The notice cannot become un-retryable by wording alone: a
80
+ * `kind:"ok"` result is an invitation to try again.
81
+ *
82
+ * Three is the smallest count that still lets a model learn the shape from the
83
+ * notice itself. The pool is shared by six OBSERVE tools, so a model that reads,
84
+ * then greps narrower, then lists, has spent three honest attempts at the advice
85
+ * the notice gives. A fourth consecutive exhausted call is evidence the advice
86
+ * is not landing, and it fails. Waste is bounded at four calls out of the 60-call
87
+ * turn budget instead of twenty.
88
+ */
89
+ const MAX_EXHAUSTED_NOTICES_PER_TURN = 3;
90
+
73
91
  interface TurnBudgetState {
74
92
  usedBytes: number;
75
93
  lastSeenAt: number;
94
+ /** Consecutive exhausted-pool short-circuits; reset by any call that got a slice. */
95
+ exhaustedStreak: number;
76
96
  }
77
97
 
78
98
  const turnBudgets = new Map<string, TurnBudgetState>();
@@ -156,7 +176,7 @@ export function reserveObservation(selfCapBytes: number, options?: ToolInvokeOpt
156
176
  };
157
177
  }
158
178
  const limitBytes = observationTurnBudgetLimit();
159
- const state = turnBudgets.get(key) ?? { usedBytes: 0, lastSeenAt: Date.now() };
179
+ const state = turnBudgets.get(key) ?? { usedBytes: 0, lastSeenAt: Date.now(), exhaustedStreak: 0 };
160
180
  state.lastSeenAt = Date.now();
161
181
  turnBudgets.set(key, state);
162
182
  pruneBudgetMap();
@@ -174,6 +194,9 @@ export function reserveObservation(selfCapBytes: number, options?: ToolInvokeOpt
174
194
  settled: false,
175
195
  };
176
196
  }
197
+ // A call that got a slice is progress, so the exhausted streak starts over.
198
+ // Only an unbroken run of short-circuits reaches the terminal failure.
199
+ state.exhaustedStreak = 0;
177
200
  const callCapBytes = Math.min(selfCapBytes, remaining);
178
201
  return {
179
202
  key,
@@ -203,6 +226,7 @@ export function commitObservationReservation(reservation: ObservationReservation
203
226
  const state = turnBudgets.get(reservation.key) ?? {
204
227
  usedBytes: reservation.usedBeforeBytes,
205
228
  lastSeenAt: Date.now(),
229
+ exhaustedStreak: 0,
206
230
  };
207
231
  state.usedBytes += reservation.callCapBytes;
208
232
  state.lastSeenAt = Date.now();
@@ -237,6 +261,7 @@ function recordSpentBytes(reservation: ObservationReservation, bytes: number): v
237
261
  const state = turnBudgets.get(reservation.key) ?? {
238
262
  usedBytes: reservation.usedBeforeBytes + committedBytes,
239
263
  lastSeenAt: Date.now(),
264
+ exhaustedStreak: 0,
240
265
  };
241
266
  state.usedBytes = Math.max(0, state.usedBytes + bytes - committedBytes);
242
267
  state.lastSeenAt = Date.now();
@@ -252,10 +277,26 @@ function budgetDetails(reservation: ObservationReservation): ObservationBudgetDe
252
277
  };
253
278
  }
254
279
 
280
+ /** Count this short-circuit against the turn's run of them. Untracked calls never escalate. */
281
+ function bumpExhaustedStreak(key: string | null): number {
282
+ if (key === null) return 1;
283
+ const state = turnBudgets.get(key);
284
+ if (state === undefined) return 1;
285
+ state.exhaustedStreak += 1;
286
+ state.lastSeenAt = Date.now();
287
+ turnBudgets.set(key, state);
288
+ return state.exhaustedStreak;
289
+ }
290
+
255
291
  /**
256
292
  * Structured result for a call that found the turn pool already spent.
257
293
  * `subject` names what the call was about (a path, a pattern); `hint` names
258
294
  * the narrowing arguments the tool supports.
295
+ *
296
+ * The first few such calls get the notice, which states the numbers and the
297
+ * narrowing advice. Past MAX_EXHAUSTED_NOTICES_PER_TURN the call fails instead:
298
+ * nothing this turn can return content, so an `ok` result is an invitation to a
299
+ * retry loop the pool can never satisfy.
259
300
  */
260
301
  export function observationBudgetExhausted(input: {
261
302
  tool: string;
@@ -265,9 +306,18 @@ export function observationBudgetExhausted(input: {
265
306
  hint: string;
266
307
  }): ToolResult {
267
308
  const { tool, unit, reservation, subject, hint } = input;
268
- const output = `[observation budget exhausted for this turn before ${tool} ${subject}: ${formatSize(
269
- reservation.usedBeforeBytes,
270
- )} already returned of ${formatSize(reservation.limitBytes)}. ${hint}]`;
309
+ const streak = bumpExhaustedStreak(reservation.key);
310
+ const spent = `${formatSize(reservation.usedBeforeBytes)} already returned of ${formatSize(reservation.limitBytes)}`;
311
+ if (streak > MAX_EXHAUSTED_NOTICES_PER_TURN) {
312
+ const message =
313
+ `observation budget exhausted for this turn before ${tool} ${subject}: ${spent}. ` +
314
+ `This is the ${streak}th call to hit it, so no observation tool can return content until the ` +
315
+ `next turn. Do not retry this call and do not substitute another one. Re-plan with what you ` +
316
+ `already have: say what you found, name what is still unread, and propose the next step.`;
317
+ recordSpentBytes(reservation, byteLength(message));
318
+ return { kind: "error", message };
319
+ }
320
+ const output = `[observation budget exhausted for this turn before ${tool} ${subject}: ${spent}. ${hint}]`;
271
321
  const shownBytes = byteLength(output);
272
322
  recordSpentBytes(reservation, shownBytes);
273
323
  const budget = budgetDetails(reservation);
@@ -0,0 +1,38 @@
1
+ import { Type } from "typebox";
2
+ import { ToolNames } from "../core/tool-names.js";
3
+ import { PANES_PRESET_IDS } from "../domains/mux/operations.js";
4
+ import { StringEnum } from "../engine/ai.js";
5
+ import type { ToolSurface } from "./lazy-tool.js";
6
+
7
+ /**
8
+ * The model's door to the pane layer.
9
+ *
10
+ * There is no argv field, and there never will be. Arbitrary argv is
11
+ * operator-only through `/panes open`, which is what keeps this tool out of
12
+ * shell-escape territory (spec 4.8, risk register "tool misuse"). `preset` is a
13
+ * closed enum, so an argv string cannot arrive spelled as a preset name either.
14
+ */
15
+ export const panesToolSurface = {
16
+ name: ToolNames.Panes,
17
+ description:
18
+ "Look at, focus, and manage the terminal panes Clio owns beside this session. Use show to bring a dispatched run's live viewer pane to the front when the operator asks to see an agent (\"show me the tester\"). open starts one of the fixed utility presets; there is no way to run an arbitrary command. close removes a pane Clio created. list reports the current inventory and the pane layer's health.",
19
+ parameters: Type.Object({
20
+ action: StringEnum(["show", "open", "close", "list"], {
21
+ description:
22
+ "show focuses a run's viewer pane; open starts a preset utility pane; close removes a Clio-owned pane; list reports the inventory.",
23
+ }),
24
+ target: Type.Optional(
25
+ Type.String({
26
+ description:
27
+ 'action=show: an agent id or run id prefix, most recent match wins. action=close: a pane id, a pane label, an agent id, or "all".',
28
+ }),
29
+ ),
30
+ preset: Type.Optional(
31
+ StringEnum([...PANES_PRESET_IDS], {
32
+ description: "action=open: which fixed utility pane to start.",
33
+ }),
34
+ ),
35
+ }),
36
+ baseActionClass: "read",
37
+ executionMode: "sequential",
38
+ } satisfies ToolSurface;
@@ -0,0 +1,112 @@
1
+ import type { PanesOperations } from "../domains/mux/operations.js";
2
+ import { PANES_PRESET_IDS } from "../domains/mux/operations.js";
3
+ import { panesToolSurface } from "./panes-surface.js";
4
+ import type { ToolResult, ToolSpec } from "./registry.js";
5
+
6
+ /**
7
+ * The `panes` tool: the model's read-class door to the pane layer.
8
+ *
9
+ * It is registered only when the mux answered detection, so its presence in the
10
+ * prompt is itself the statement that panes exist in this session. Every action
11
+ * routes through the same `PanesOperations` the `/panes` slash command drives,
12
+ * so the two surfaces cannot describe the same pane differently.
13
+ *
14
+ * The one asymmetry with the operator's surface is deliberate: `open` accepts a
15
+ * preset and nothing else. A caller that fabricates an `argv` field gets a
16
+ * refusal rather than a shell.
17
+ */
18
+
19
+ export interface PanesToolDeps {
20
+ panes: PanesOperations;
21
+ }
22
+
23
+ function describeInventory(deps: PanesToolDeps): ToolResult {
24
+ const status = deps.panes.status();
25
+ const header = `panes mode=${status.mode} ${status.available ? "available" : "unavailable"}; notifications=${status.settings.notifications}`;
26
+ const rows = status.panes.map((pane) => `- ${pane.paneId} ${pane.purpose} ${pane.label}`);
27
+ return {
28
+ kind: "ok",
29
+ output: [header, ...(rows.length > 0 ? rows : ["- no Clio-owned panes"])].join("\n"),
30
+ details: { action: "list", mode: status.mode, available: status.available, panes: status.panes },
31
+ };
32
+ }
33
+
34
+ export function createPanesTool(deps: PanesToolDeps): ToolSpec {
35
+ return {
36
+ ...panesToolSurface,
37
+ async run(args): Promise<ToolResult> {
38
+ const action = typeof args.action === "string" ? args.action : "";
39
+ // An argv field never reaches the operations layer. Refusing loudly is
40
+ // better than ignoring it, because a model that believed it opened a
41
+ // command pane would report work it did not do.
42
+ if ("argv" in args) {
43
+ return {
44
+ kind: "error",
45
+ message:
46
+ "panes: argv panes are operator-only; use action=open with a preset, or ask the operator to run /panes open <command>",
47
+ };
48
+ }
49
+ const target = typeof args.target === "string" ? args.target.trim() : "";
50
+ if (action === "list") return describeInventory(deps);
51
+ if (action === "show") {
52
+ if (target.length === 0) return { kind: "error", message: "panes: action=show requires target" };
53
+ const result = await deps.panes.show(target);
54
+ if (result.status === "watching") {
55
+ return {
56
+ kind: "ok",
57
+ output: `the watch pane is now rendering ${result.agentId} (run ${result.runId}).`,
58
+ details: { action: "show", runId: result.runId, agentId: result.agentId },
59
+ };
60
+ }
61
+ if (result.status === "not-found") {
62
+ const known = result.candidates.length > 0 ? ` Live runs: ${result.candidates.join(", ")}.` : "";
63
+ return { kind: "error", message: `panes: no live run matches '${result.target}'.${known}` };
64
+ }
65
+ return { kind: "error", message: `panes: ${result.reason}` };
66
+ }
67
+ if (action === "open") {
68
+ const preset = typeof args.preset === "string" ? args.preset : "";
69
+ if (!(PANES_PRESET_IDS as ReadonlyArray<string>).includes(preset)) {
70
+ return {
71
+ kind: "error",
72
+ message: `panes: action=open requires preset, one of ${PANES_PRESET_IDS.join(", ")}`,
73
+ };
74
+ }
75
+ const result = await deps.panes.open({ preset });
76
+ if (result.status === "opened") {
77
+ return {
78
+ kind: "ok",
79
+ output:
80
+ result.paneId === null
81
+ ? `completed the ${result.label} chooser.`
82
+ : `opened the ${result.label} pane (${result.paneId}).`,
83
+ details: { action: "open", preset, paneId: result.paneId },
84
+ };
85
+ }
86
+ if (result.status === "missing-binary") {
87
+ return {
88
+ kind: "error",
89
+ message: `panes: ${result.detail}`,
90
+ };
91
+ }
92
+ return { kind: "error", message: `panes: ${result.reason}` };
93
+ }
94
+ if (action === "close") {
95
+ if (target.length === 0) return { kind: "error", message: "panes: action=close requires target" };
96
+ const result = await deps.panes.close(target);
97
+ if (result.status === "closed") {
98
+ return {
99
+ kind: "ok",
100
+ output: `closed ${result.closed} pane(s)${result.labels.length > 0 ? `: ${result.labels.join(", ")}` : ""}.`,
101
+ details: { action: "close", closed: result.closed },
102
+ };
103
+ }
104
+ if (result.status === "not-found") {
105
+ return { kind: "error", message: `panes: no Clio-owned pane matches '${result.target}'` };
106
+ }
107
+ return { kind: "error", message: `panes: ${result.reason}` };
108
+ }
109
+ return { kind: "error", message: `panes: action must be show, open, close, or list; got '${action}'` };
110
+ },
111
+ };
112
+ }
@@ -49,6 +49,10 @@ export const TOOL_PLANES: Readonly<Record<BuiltinToolName, PlaneExpectation>> =
49
49
  // review the board depends on. Sequential so two posts in one batch do not
50
50
  // interleave against the local post cap.
51
51
  [ToolNames.Ledger]: { plane: "orchestrate", actionClass: "read", executionMode: "sequential" },
52
+ // panes projects Clio's own runs onto a pane host and opens preset utility
53
+ // panes. It mutates no workspace, so it stays read class; sequential because
54
+ // two pane operations in one batch would race the same pane registry.
55
+ [ToolNames.Panes]: { plane: "orchestrate", actionClass: "read", executionMode: "sequential" },
52
56
  [ToolNames.WebFetch]: { plane: "retrieve", actionClass: "read", executionMode: "parallel" },
53
57
  [ToolNames.AskUser]: { plane: "interact", actionClass: "read", executionMode: "sequential" },
54
58
  [ToolNames.Artifact]: { plane: "artifact", actionClass: "write", executionMode: "sequential" },
@@ -75,6 +79,8 @@ const OBSERVE_ENVELOPE_SELF_CAPS: ReadonlyArray<[BuiltinToolName, () => number]>
75
79
  const SESSION_BOUND_TOOLS = new Set<ToolName>([]);
76
80
  const DISPATCH_BOUND_TOOLS = new Set<ToolName>([ToolNames.Dispatch, ToolNames.Monitor, ToolNames.Steer]);
77
81
  const INTERACTIVE_BOUND_TOOLS = new Set<ToolName>([ToolNames.AskUser]);
82
+ /** Registered only when a pane host answered detection and the mux is live. */
83
+ const PANES_BOUND_TOOLS = new Set<ToolName>([ToolNames.Panes]);
78
84
  /** The RETRIEVE plane, omitted wholesale by a hermetic run (tools/network-policy.ts). */
79
85
  const NETWORK_BOUND_TOOLS = new Set<ToolName>([ToolNames.WebFetch]);
80
86
 
@@ -82,8 +88,9 @@ export interface BuiltinToolPolicyOptions {
82
88
  includeSessionTools?: boolean;
83
89
  includeDispatchTools?: boolean;
84
90
  includeInteractiveTools?: boolean;
91
+ includePanesTools?: boolean;
85
92
  /**
86
- * Unlike the other three, this defaults to true: every registry registers
93
+ * Unlike the other four, this defaults to true: every registry registers
87
94
  * the network plane unless a run explicitly asked to be hermetic, so an
88
95
  * unset option must keep demanding it.
89
96
  */
@@ -132,12 +139,14 @@ function validateBuiltinToolPolicy(specs: ReadonlyArray<ToolSpec>, options: Buil
132
139
  const includeSessionTools = options.includeSessionTools ?? false;
133
140
  const includeDispatchTools = options.includeDispatchTools ?? false;
134
141
  const includeInteractiveTools = options.includeInteractiveTools ?? false;
142
+ const includePanesTools = options.includePanesTools ?? false;
135
143
  const includeNetworkTools = options.includeNetworkTools ?? true;
136
144
  const required = new Set<ToolName>(Object.values(ToolNames));
137
145
  for (const tool of [...required]) {
138
146
  if (!includeSessionTools && SESSION_BOUND_TOOLS.has(tool)) required.delete(tool);
139
147
  if (!includeDispatchTools && DISPATCH_BOUND_TOOLS.has(tool)) required.delete(tool);
140
148
  if (!includeInteractiveTools && INTERACTIVE_BOUND_TOOLS.has(tool)) required.delete(tool);
149
+ if (!includePanesTools && PANES_BOUND_TOOLS.has(tool)) required.delete(tool);
141
150
  if (!includeNetworkTools && NETWORK_BOUND_TOOLS.has(tool)) required.delete(tool);
142
151
  }
143
152
  for (const tool of required) {
@@ -67,6 +67,7 @@ export const TOOL_PRESENTATION: Readonly<Record<string, ToolPresentationPolicy>>
67
67
  [ToolNames.Steer]: FOLDED,
68
68
  [ToolNames.Tasks]: FOLDED,
69
69
  [ToolNames.Ledger]: FOLDED,
70
+ [ToolNames.Panes]: FOLDED,
70
71
  [ToolNames.WebFetch]: FOLDED,
71
72
  [ToolNames.AskUser]: FOLDED,
72
73
  [ToolNames.Artifact]: FOLDED,
@@ -1,37 +0,0 @@
1
- import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
- import {
3
- durableAssistantTextFromEvent
4
- } from "./chunk-TEO2TLVN.js";
5
- import {
6
- responseModelIdObservationFromRecord
7
- } from "./chunk-LXPJXFM5.js";
8
- import {
9
- init_esm_shims
10
- } from "./chunk-3R73A4XB.js";
11
-
12
- // src/tools/dispatch-event-text.ts
13
- init_esm_shims();
14
- function assistantTextFromEvent(event) {
15
- return durableAssistantTextFromEvent(event).trim();
16
- }
17
- function receiptResponseModelIdObservationLabel(receipt) {
18
- const responses = receipt.upstreamResponses ?? [];
19
- if (responses.length === 0) return null;
20
- const labels = responses.map((response) => {
21
- const observation = responseModelIdObservationFromRecord(
22
- response,
23
- "legacy-difference-only"
24
- );
25
- if (observation.state === "reported") return `reported:${observation.reportedModelId}`;
26
- if (observation.state === "not-reported") return "not-reported";
27
- if (observation.state === "not-observed") return "not-observed";
28
- return `legacy-difference-only:${observation.differingModelId ?? "none"}`;
29
- });
30
- return `response_model_id_observation=${labels.join(",")}`;
31
- }
32
-
33
- export {
34
- assistantTextFromEvent,
35
- receiptResponseModelIdObservationLabel
36
- };
37
- //# sourceMappingURL=chunk-D73KXYPF.js.map