@iowarp/clio-coder 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/NOTICE +33 -0
  3. package/README.md +12 -3
  4. package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
  5. package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
  8. package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
  9. package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
  10. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  11. package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
  12. package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
  13. package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
  14. package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
  15. package/dist/chunk-3DPEIQKN.js +113 -0
  16. package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
  17. package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
  18. package/dist/chunk-42FMPA75.js +101 -0
  19. package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
  20. package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
  21. package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
  22. package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
  23. package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
  24. package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
  25. package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
  26. package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
  27. package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
  28. package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
  29. package/dist/chunk-BKFM6EJV.js +462 -0
  30. package/dist/chunk-BMS5RKQY.js +27 -0
  31. package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
  32. package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
  33. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  34. package/dist/chunk-C2LTL2W6.js +2447 -0
  35. package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
  36. package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
  37. package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
  38. package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
  39. package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
  40. package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
  41. package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
  42. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  43. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  44. package/dist/chunk-GKF55TAZ.js +391 -0
  45. package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
  46. package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
  47. package/dist/chunk-HHV2GANA.js +88 -0
  48. package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
  49. package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
  50. package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
  51. package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
  52. package/dist/chunk-HZHHCK24.js +1631 -0
  53. package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
  54. package/dist/chunk-IBEBSCYA.js +564 -0
  55. package/dist/chunk-IQ7KR472.js +362 -0
  56. package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
  57. package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
  58. package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
  59. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  60. package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
  61. package/dist/chunk-KMVISBZR.js +132 -0
  62. package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
  63. package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
  64. package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
  65. package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
  66. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  67. package/dist/chunk-NEKRRTYW.js +56 -0
  68. package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
  69. package/dist/chunk-NHLBIGRH.js +1506 -0
  70. package/dist/chunk-NQQH3YT7.js +302 -0
  71. package/dist/chunk-NYS75XW5.js +15 -0
  72. package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
  73. package/dist/{chunk-EMYUUSFG.js → chunk-O6TL7WWY.js} +6 -6
  74. package/dist/chunk-OQBA45DZ.js +97 -0
  75. package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
  76. package/dist/chunk-PMZCIOCJ.js +25 -0
  77. package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
  78. package/dist/{chunk-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
  79. package/dist/chunk-QDC3K2U3.js +262 -0
  80. package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
  81. package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
  82. package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
  83. package/dist/chunk-QSNYB6ZV.js +195 -0
  84. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  85. package/dist/chunk-RKKLTLYB.js +45 -0
  86. package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
  87. package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
  88. package/dist/chunk-SUCTJL45.js +45 -0
  89. package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
  90. package/dist/chunk-T56WDKA5.js +183 -0
  91. package/dist/chunk-TVHHYFHE.js +255 -0
  92. package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
  93. package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
  94. package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
  95. package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
  96. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  97. package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
  98. package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
  99. package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
  100. package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
  101. package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
  102. package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
  103. package/dist/chunk-VO67MWHC.js +75 -0
  104. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  105. package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
  106. package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
  107. package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
  108. package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
  109. package/dist/chunk-X75E3D2N.js +686 -0
  110. package/dist/{chunk-VAWNZU7Z.js → chunk-YDFRH54B.js} +4 -4
  111. package/dist/chunk-YJX4SHTD.js +40 -0
  112. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  113. package/dist/chunk-Z2RR6MAK.js +127 -0
  114. package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
  115. package/dist/cli/index.js +47 -36
  116. package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
  117. package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
  118. package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
  119. package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
  120. package/dist/{config-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
  121. package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
  122. package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
  123. package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
  124. package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
  125. package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
  126. package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
  127. package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
  128. package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
  129. package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
  130. package/dist/doctor-QOA5FNY5.js +313 -0
  131. package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
  132. package/dist/eval-inventory-SXH7PDKX.js +316 -0
  133. package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
  134. package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
  135. package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
  136. package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
  137. package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
  138. package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
  139. package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
  140. package/dist/fleet-inspect-VLY4S7QM.js +442 -0
  141. package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
  142. package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
  143. package/dist/fleet-verify-JFEL2L3H.js +175 -0
  144. package/dist/fleet-view-ZCON35AG.js +102 -0
  145. package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
  146. package/dist/install-XGLBQY5E.js +13 -0
  147. package/dist/interop-OZBKXAYL.js +114 -0
  148. package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
  149. package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
  150. package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
  151. package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
  152. package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
  153. package/dist/panes-HMABYVO4.js +58 -0
  154. package/dist/panes-KY6W3V2E.js +103 -0
  155. package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
  156. package/dist/{reset-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
  157. package/dist/resources-BB3MVJMD.js +111 -0
  158. package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
  159. package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
  160. package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
  161. package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
  162. package/dist/skills-inventory-S4MXPJFV.js +126 -0
  163. package/dist/slash-commands-ZSGASKJC.js +77 -0
  164. package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
  165. package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
  166. package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
  167. package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
  168. package/dist/tools-DAF3DI3C.js +27 -0
  169. package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
  170. package/dist/tui-primitives-2AKXQNZK.js +13 -0
  171. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
  172. package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
  173. package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
  174. package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
  175. package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
  176. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
  177. package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
  178. package/dist/with-panes-MKB46MPQ.js +782 -0
  179. package/dist/worker/entry.js +106 -75
  180. package/docs/README.md +3 -2
  181. package/docs/acp.md +24 -3
  182. package/docs/alcf-provider.md +1 -1
  183. package/docs/architecture.md +2 -2
  184. package/docs/artifact-versions.md +9 -1
  185. package/docs/built-in-agents.md +1 -1
  186. package/docs/capacity-and-scheduling.md +62 -3
  187. package/docs/commands-and-modes.md +31 -2
  188. package/docs/configuration-and-targets.md +69 -12
  189. package/docs/context-engine.md +63 -4
  190. package/docs/development-pipeline.md +19 -0
  191. package/docs/dispatch-typed-intent.md +385 -0
  192. package/docs/documentation-coverage.md +5 -5
  193. package/docs/documentation-guide.md +1 -1
  194. package/docs/environment-variables.md +3 -0
  195. package/docs/eval-runner.md +262 -11
  196. package/docs/evals-internal.md +72 -2
  197. package/docs/evidence-and-memory.md +12 -11
  198. package/docs/evolution.md +1 -1
  199. package/docs/exit-codes-and-output.md +1 -1
  200. package/docs/extensions-and-sharing.md +27 -1
  201. package/docs/fleet-dispatch.md +25 -4
  202. package/docs/installation-and-lifecycle.md +15 -2
  203. package/docs/middleware-and-components.md +1 -1
  204. package/docs/model-catalog.md +10 -1
  205. package/docs/observability.md +55 -4
  206. package/docs/proactive-memory.md +127 -14
  207. package/docs/prompt-envelope-and-tools.md +19 -1
  208. package/docs/provider-adapter-cookbook.md +1 -1
  209. package/docs/release-cut-checklist.md +19 -3
  210. package/docs/safety-model.md +2 -2
  211. package/docs/scientific-validation.md +3 -3
  212. package/docs/session-lifecycle.md +1 -1
  213. package/docs/skills-marketplace.md +1 -1
  214. package/docs/tool-usage.md +18 -8
  215. package/docs/trace-store.md +1 -1
  216. package/docs/troubleshooting.md +88 -1
  217. package/docs/tui-design.md +1 -1
  218. package/docs/worker-dispatch-mechanics.md +1 -1
  219. package/package.json +5 -2
  220. package/src/cli/acp.ts +6 -2
  221. package/src/cli/agents.ts +1 -1
  222. package/src/cli/argv.ts +25 -0
  223. package/src/cli/config-inspect.ts +33 -6
  224. package/src/cli/config.ts +1 -1
  225. package/src/cli/configure.ts +23 -21
  226. package/src/cli/doctor-panes.ts +124 -0
  227. package/src/cli/doctor-state-size.ts +82 -0
  228. package/src/cli/doctor-toolchain.ts +57 -0
  229. package/src/cli/doctor.ts +22 -1
  230. package/src/cli/eval-inventory.ts +436 -0
  231. package/src/cli/eval.ts +93 -16
  232. package/src/cli/evidence-detail.ts +88 -0
  233. package/src/cli/evidence-inventory.ts +183 -0
  234. package/src/cli/evidence.ts +30 -5
  235. package/src/cli/extensions.ts +5 -1
  236. package/src/cli/fleet-decisions.ts +69 -0
  237. package/src/cli/fleet-inspect.ts +334 -0
  238. package/src/cli/fleet-verify.ts +133 -0
  239. package/src/cli/fleet-view.ts +810 -0
  240. package/src/cli/fleet.ts +179 -39
  241. package/src/cli/index.ts +14 -2
  242. package/src/cli/interop-inspect.ts +128 -0
  243. package/src/cli/interop.ts +34 -0
  244. package/src/cli/panes.ts +35 -0
  245. package/src/cli/reset.ts +5 -2
  246. package/src/cli/run.ts +58 -0
  247. package/src/cli/skills-inventory.ts +185 -0
  248. package/src/cli/skills.ts +16 -13
  249. package/src/cli/targets.ts +44 -13
  250. package/src/cli/tools.ts +321 -0
  251. package/src/cli/trace-inspect.ts +252 -0
  252. package/src/cli/trace.ts +85 -5
  253. package/src/cli/usage.ts +63 -14
  254. package/src/cli/verifiers-inspect.ts +347 -0
  255. package/src/cli/verifiers.ts +9 -0
  256. package/src/core/bus-events.ts +33 -1
  257. package/src/core/cache-telemetry.ts +42 -0
  258. package/src/core/config.ts +67 -0
  259. package/src/core/defaults.ts +124 -8
  260. package/src/core/endpoint-key.ts +27 -0
  261. package/src/core/residency-target-key.ts +25 -0
  262. package/src/core/response-schema.ts +80 -6
  263. package/src/core/theme-token-hex.ts +43 -0
  264. package/src/core/tool-names.ts +2 -1
  265. package/src/core/xdg.ts +1 -1
  266. package/src/domains/agents/fleets/build-review.md +0 -3
  267. package/src/domains/agents/fleets/build-test.md +0 -3
  268. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  269. package/src/domains/agents/result-contract.ts +164 -35
  270. package/src/domains/config/classify.ts +6 -0
  271. package/src/domains/context/codewiki/coordinator.ts +12 -4
  272. package/src/domains/dispatch/admission-error.ts +9 -0
  273. package/src/domains/dispatch/admission.ts +52 -14
  274. package/src/domains/dispatch/capacity-lease.ts +118 -9
  275. package/src/domains/dispatch/contract.ts +11 -0
  276. package/src/domains/dispatch/council-topology.ts +398 -0
  277. package/src/domains/dispatch/execution-plan.ts +44 -4
  278. package/src/domains/dispatch/extension.ts +378 -82
  279. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  280. package/src/domains/dispatch/fleet-plan.ts +7 -2
  281. package/src/domains/dispatch/fleet-run.ts +87 -4
  282. package/src/domains/dispatch/gate-decisions.ts +11 -1
  283. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  284. package/src/domains/dispatch/gate-topology.ts +289 -0
  285. package/src/domains/dispatch/heartbeat.ts +32 -8
  286. package/src/domains/dispatch/index.ts +22 -0
  287. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  288. package/src/domains/dispatch/intent.ts +85 -1
  289. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  290. package/src/domains/dispatch/reservation-store.ts +139 -11
  291. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  292. package/src/domains/dispatch/run-event-journal.ts +598 -0
  293. package/src/domains/dispatch/state.ts +49 -1
  294. package/src/domains/dispatch/types.ts +13 -0
  295. package/src/domains/dispatch/validation.ts +33 -8
  296. package/src/domains/dispatch/worker-spawn.ts +25 -11
  297. package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
  298. package/src/domains/dispatch/write-boundary.ts +62 -1
  299. package/src/domains/eval/artifacts/store.ts +62 -0
  300. package/src/domains/eval/compare/behavioral.ts +224 -0
  301. package/src/domains/eval/compare/compare.ts +342 -2
  302. package/src/domains/eval/compare/envelope.ts +128 -0
  303. package/src/domains/eval/compare/gates.ts +24 -6
  304. package/src/domains/eval/compare/thresholds.ts +30 -3
  305. package/src/domains/eval/execution-provenance.ts +240 -0
  306. package/src/domains/eval/inventory.ts +113 -0
  307. package/src/domains/eval/metrics/aggregate.ts +136 -0
  308. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  309. package/src/domains/eval/metrics/tracked.ts +413 -0
  310. package/src/domains/eval/provenance.ts +117 -0
  311. package/src/domains/eval/reports/comparison.ts +128 -0
  312. package/src/domains/eval/reports/junit.ts +17 -3
  313. package/src/domains/eval/reports/markdown.ts +3 -3
  314. package/src/domains/eval/reports/text.ts +14 -0
  315. package/src/domains/eval/run-compare.ts +20 -0
  316. package/src/domains/eval/runners/clio-run.ts +127 -0
  317. package/src/domains/eval/runners/external-command.ts +28 -3
  318. package/src/domains/eval/schema/adapter.ts +111 -0
  319. package/src/domains/eval/schema/artifact.ts +20 -0
  320. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  321. package/src/domains/eval/schema/behavioral.ts +520 -0
  322. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  323. package/src/domains/eval/schema/serving.ts +105 -0
  324. package/src/domains/eval/schema/suite.ts +38 -8
  325. package/src/domains/eval/schema/validate.ts +58 -3
  326. package/src/domains/eval/schema/verdict.ts +237 -0
  327. package/src/domains/eval/suites/resolve.ts +2 -0
  328. package/src/domains/eval/suites/run.ts +264 -33
  329. package/src/domains/eval/verifiers/command.ts +2 -1
  330. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  331. package/src/domains/evidence/build.ts +2 -13
  332. package/src/domains/evidence/eval.ts +2 -12
  333. package/src/domains/evidence/findings-markdown.ts +33 -0
  334. package/src/domains/evidence/run-trust.ts +7 -113
  335. package/src/domains/evidence/store.ts +6 -0
  336. package/src/domains/evidence/trust-projection.ts +2 -2
  337. package/src/domains/extensions/compatibility.ts +285 -0
  338. package/src/domains/extensions/discovery.ts +38 -3
  339. package/src/domains/extensions/resources.ts +1 -1
  340. package/src/domains/extensions/state.ts +12 -3
  341. package/src/domains/extensions/types.ts +2 -0
  342. package/src/domains/lifecycle/doctor.ts +69 -1
  343. package/src/domains/memory/index.ts +14 -1
  344. package/src/domains/memory/task-bank-promotion.ts +64 -0
  345. package/src/domains/memory/task-memory-policy.ts +82 -17
  346. package/src/domains/memory/task-memory-spend.ts +131 -0
  347. package/src/domains/memory/task-memory-status.ts +7 -0
  348. package/src/domains/memory/task-memory-telemetry.ts +3 -0
  349. package/src/domains/middleware/index.ts +1 -0
  350. package/src/domains/middleware/memory-intervention.ts +97 -21
  351. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  352. package/src/domains/mux/contract.ts +434 -0
  353. package/src/domains/mux/detect.ts +158 -0
  354. package/src/domains/mux/extension.ts +47 -0
  355. package/src/domains/mux/index.ts +96 -0
  356. package/src/domains/mux/manifest.ts +6 -0
  357. package/src/domains/mux/operations.ts +164 -0
  358. package/src/domains/mux/pane-registry.ts +90 -0
  359. package/src/domains/mux/protocol.ts +49 -0
  360. package/src/domains/mux/socket-client.ts +816 -0
  361. package/src/domains/mux/types.ts +222 -0
  362. package/src/domains/mux/viewer-command.ts +59 -0
  363. package/src/domains/mux/yazi/assets/init.lua +2 -0
  364. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  365. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  366. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  367. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  368. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  369. package/src/domains/mux/yazi/event-stream.ts +180 -0
  370. package/src/domains/mux/yazi/profile.ts +299 -0
  371. package/src/domains/mux/yazi/session.ts +228 -0
  372. package/src/domains/mux/yazi/theme.ts +30 -0
  373. package/src/domains/observability/background-memory-usage.ts +140 -0
  374. package/src/domains/observability/cost.ts +22 -1
  375. package/src/domains/observability/index.ts +9 -0
  376. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  377. package/src/domains/observability/trace-store.ts +234 -2
  378. package/src/domains/prompts/compiler.ts +100 -13
  379. package/src/domains/providers/endpoint-capacity.ts +228 -0
  380. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  381. package/src/domains/providers/extension.ts +20 -3
  382. package/src/domains/providers/index.ts +32 -0
  383. package/src/domains/providers/model-runtime-capabilities.ts +32 -0
  384. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  385. package/src/domains/providers/runtime-resolution.ts +8 -1
  386. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  387. package/src/domains/providers/runtimes/builtins.ts +2 -0
  388. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  389. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  390. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  391. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  392. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  393. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  394. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  395. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  396. package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
  397. package/src/domains/providers/support.ts +1 -0
  398. package/src/domains/providers/target-model-cache.ts +124 -0
  399. package/src/domains/providers/types/capability-flags.ts +2 -0
  400. package/src/domains/providers/types/target-descriptor.ts +2 -0
  401. package/src/domains/resources/index.ts +3 -0
  402. package/src/domains/resources/prompts/loader.ts +95 -33
  403. package/src/domains/resources/skills/loader.ts +33 -0
  404. package/src/domains/safety/action-classifier.ts +6 -0
  405. package/src/domains/safety/call-target.ts +52 -0
  406. package/src/domains/safety/run-effects.ts +35 -4
  407. package/src/domains/session/context-accounting.ts +52 -1
  408. package/src/domains/session/context-ledger.ts +37 -13
  409. package/src/domains/session/index.ts +6 -0
  410. package/src/domains/session/prompt-cache.ts +140 -0
  411. package/src/domains/session/prompt-manifest.ts +42 -0
  412. package/src/domains/toolchain/archive.ts +175 -0
  413. package/src/domains/toolchain/contract.ts +28 -0
  414. package/src/domains/toolchain/extension.ts +47 -0
  415. package/src/domains/toolchain/index.ts +39 -0
  416. package/src/domains/toolchain/install.ts +327 -0
  417. package/src/domains/toolchain/manifest.ts +8 -0
  418. package/src/domains/toolchain/paths.ts +34 -0
  419. package/src/domains/toolchain/registry.ts +265 -0
  420. package/src/domains/toolchain/remove.ts +218 -0
  421. package/src/domains/toolchain/resolve.ts +182 -0
  422. package/src/domains/toolchain/types.ts +113 -0
  423. package/src/domains/toolchain/version.ts +88 -0
  424. package/src/engine/acp/adapter.ts +18 -3
  425. package/src/engine/acp/server.ts +413 -70
  426. package/src/engine/acp/types.ts +19 -1
  427. package/src/engine/ai.ts +35 -0
  428. package/src/engine/apis/llamacpp-residency.ts +55 -3
  429. package/src/engine/apis/lmstudio.ts +25 -5
  430. package/src/engine/apis/ollama-native.ts +2 -1
  431. package/src/engine/apis/openai-completions.ts +80 -17
  432. package/src/engine/apis/residency-lock.ts +3 -1
  433. package/src/engine/apis/residency.ts +34 -1
  434. package/src/engine/claude/sdk-module.ts +98 -0
  435. package/src/engine/claude/sdk-runtime.ts +19 -11
  436. package/src/engine/provider-payload.ts +29 -1
  437. package/src/engine/tui-primitives.ts +21 -0
  438. package/src/engine/tui.ts +1 -0
  439. package/src/engine/worker-runtime.ts +2 -13
  440. package/src/entry/boot-options.ts +2 -0
  441. package/src/entry/orchestrator.ts +279 -35
  442. package/src/entry/panes-activation.ts +31 -0
  443. package/src/entry/with-panes.ts +20 -0
  444. package/src/interactive/chat-loop-messages.ts +26 -7
  445. package/src/interactive/chat-loop.ts +318 -41
  446. package/src/interactive/chat-panel.ts +62 -8
  447. package/src/interactive/clio-editor.ts +45 -8
  448. package/src/interactive/context-activity.ts +5 -1
  449. package/src/interactive/context-meter.ts +1 -1
  450. package/src/interactive/context-overlay.ts +41 -10
  451. package/src/interactive/cost-overlay.ts +66 -6
  452. package/src/interactive/council-grid.ts +1 -3
  453. package/src/interactive/council.ts +11 -0
  454. package/src/interactive/dispatch-board.ts +102 -20
  455. package/src/interactive/fleet-run-preview.ts +41 -15
  456. package/src/interactive/handoff-round.ts +41 -2
  457. package/src/interactive/interactive-application.ts +177 -7
  458. package/src/interactive/interactive-input-runtime.ts +15 -0
  459. package/src/interactive/interactive-presentation.ts +4 -0
  460. package/src/interactive/interactive-shell.ts +20 -17
  461. package/src/interactive/interactive-slash-runtime.ts +63 -10
  462. package/src/interactive/memory-overlay.ts +9 -0
  463. package/src/interactive/modal-marker.ts +170 -0
  464. package/src/interactive/mutation-preview.ts +295 -0
  465. package/src/interactive/mux-bridge.ts +214 -0
  466. package/src/interactive/overlay-frame.ts +58 -2
  467. package/src/interactive/overlay-general-openers.ts +17 -0
  468. package/src/interactive/overlay-key-routing.ts +52 -3
  469. package/src/interactive/overlay-lifecycle.ts +56 -7
  470. package/src/interactive/overlay-model-selectors.ts +40 -3
  471. package/src/interactive/overlay-permission-lifecycle.ts +112 -24
  472. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  473. package/src/interactive/overlay-transitions.ts +18 -4
  474. package/src/interactive/overlays/agents.ts +1 -0
  475. package/src/interactive/overlays/ask-user.ts +227 -49
  476. package/src/interactive/overlays/auth-dialog.ts +1 -0
  477. package/src/interactive/overlays/context-reset.ts +1 -0
  478. package/src/interactive/overlays/cwd-fallback.ts +1 -0
  479. package/src/interactive/overlays/decisions.ts +11 -11
  480. package/src/interactive/overlays/extensions.ts +1 -0
  481. package/src/interactive/overlays/fleet-run-approval.ts +1 -0
  482. package/src/interactive/overlays/handoff-review.ts +1 -0
  483. package/src/interactive/overlays/help-reference.ts +6 -0
  484. package/src/interactive/overlays/interop.ts +1 -0
  485. package/src/interactive/overlays/library-install-confirm.ts +1 -0
  486. package/src/interactive/overlays/library-tabs.ts +28 -0
  487. package/src/interactive/overlays/list-overlay.ts +10 -1
  488. package/src/interactive/overlays/message-picker.ts +1 -0
  489. package/src/interactive/overlays/model-scope.ts +86 -0
  490. package/src/interactive/overlays/model-selector.ts +1 -0
  491. package/src/interactive/overlays/prompts.ts +12 -1
  492. package/src/interactive/overlays/session-selector.ts +1 -0
  493. package/src/interactive/overlays/settings-sections.ts +30 -0
  494. package/src/interactive/overlays/settings.ts +614 -45
  495. package/src/interactive/overlays/side-question.ts +1 -0
  496. package/src/interactive/overlays/skills-hub.ts +3 -11
  497. package/src/interactive/overlays/tree-selector.ts +1 -0
  498. package/src/interactive/pane-policy.ts +46 -0
  499. package/src/interactive/panes-runtime.ts +292 -0
  500. package/src/interactive/permission-hint.ts +34 -2
  501. package/src/interactive/permission-overlay.ts +159 -9
  502. package/src/interactive/prewarm.ts +197 -0
  503. package/src/interactive/render-trace.ts +162 -15
  504. package/src/interactive/renderers/compaction-summary.ts +29 -0
  505. package/src/interactive/renderers/tool-execution.ts +4 -0
  506. package/src/interactive/renderers/worker-entry.ts +122 -14
  507. package/src/interactive/side-question.ts +58 -1
  508. package/src/interactive/slash-commands.ts +251 -15
  509. package/src/interactive/status/controller.ts +11 -0
  510. package/src/interactive/status/state-machine.ts +54 -2
  511. package/src/interactive/status/types.ts +7 -0
  512. package/src/interactive/tasks-overlay.ts +1 -0
  513. package/src/interactive/terminal-lease.ts +2 -0
  514. package/src/interactive/theme/tokens.ts +3 -14
  515. package/src/interactive/turn-context.ts +346 -33
  516. package/src/interactive/turn-persistence.ts +14 -4
  517. package/src/interactive/turn-prewarm.ts +364 -0
  518. package/src/interactive/turn-queues.ts +7 -4
  519. package/src/interactive/turn-runtime.ts +8 -1
  520. package/src/interactive/turn-state.ts +23 -0
  521. package/src/interactive/view/artifacts.ts +109 -1
  522. package/src/interactive/view/view-overlay.ts +29 -3
  523. package/src/interactive/watch-pane.ts +152 -0
  524. package/src/interactive/worker-progress.ts +7 -1
  525. package/src/interactive/worker-receipts.ts +19 -1
  526. package/src/interactive/worker-stream.ts +5 -0
  527. package/src/interactive/yazi-bridge.ts +444 -0
  528. package/src/tools/ask-user.ts +43 -2
  529. package/src/tools/bootstrap.ts +26 -2
  530. package/src/tools/builtin-tool-catalog.ts +15 -0
  531. package/src/tools/compete-worktrees.ts +83 -2
  532. package/src/tools/core-bootstrap.ts +2 -1
  533. package/src/tools/dispatch-admission.ts +14 -3
  534. package/src/tools/dispatch-arguments.ts +20 -20
  535. package/src/tools/dispatch-plan.ts +17 -9
  536. package/src/tools/dispatch-run-events.ts +134 -19
  537. package/src/tools/dispatch-runner.ts +29 -7
  538. package/src/tools/dispatch-scout.ts +1 -1
  539. package/src/tools/dispatch-types.ts +15 -3
  540. package/src/tools/dispatch.ts +1 -1
  541. package/src/tools/executables.ts +17 -14
  542. package/src/tools/observation.ts +54 -4
  543. package/src/tools/panes-surface.ts +38 -0
  544. package/src/tools/panes.ts +112 -0
  545. package/src/tools/policy.ts +10 -1
  546. package/src/tools/presentation.ts +1 -0
  547. package/src/tools/registry.ts +16 -0
  548. package/dist/chunk-AOCYTWAV.js +0 -449
  549. package/dist/chunk-HLE42MG7.js +0 -37
  550. package/dist/chunk-HWUFFB6L.js +0 -83
  551. package/dist/chunk-JOZYP4GM.js +0 -279
  552. package/dist/doctor-M7YEDGAE.js +0 -91
@@ -0,0 +1,444 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { mkdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
4
+ import { isAbsolute, join, relative, resolve } from "node:path";
5
+ import { clioCacheDir } from "../core/xdg.js";
6
+ import type { MuxContract } from "../domains/mux/index.js";
7
+ import type { YaziEvent } from "../domains/mux/yazi/event-stream.js";
8
+ import { ensureYaziProfile, yaziProfileDir } from "../domains/mux/yazi/profile.js";
9
+ import {
10
+ createYaziSession,
11
+ resolveYaziBinaries,
12
+ type YaziProfileMode,
13
+ type YaziResolvedBinaries,
14
+ type YaziSession,
15
+ type YaziSessionMode,
16
+ type YaziSessionOpenResult,
17
+ type YaziSessionOptions,
18
+ } from "../domains/mux/yazi/session.js";
19
+
20
+ export const YAZI_PICK_MAX_PATHS = 32;
21
+ export const YAZI_PICK_MAX_CHARS = 4096;
22
+ export const YAZI_LIVENESS_MS = 5000;
23
+
24
+ export interface YaziBridgeSettings {
25
+ mode: YaziSessionMode;
26
+ profile: YaziProfileMode;
27
+ followCwd: boolean;
28
+ }
29
+
30
+ export interface YaziMentionBatch {
31
+ text: string;
32
+ inserted: number;
33
+ mentions: number;
34
+ plainPaths: number;
35
+ duplicates: number;
36
+ truncated: number;
37
+ }
38
+
39
+ export interface YaziBridgeStatus {
40
+ mode: YaziSessionMode | "closed";
41
+ paneId: string | null;
42
+ paneCwd: string | null;
43
+ lastLineAt: number | null;
44
+ droppedLines: number;
45
+ }
46
+
47
+ export type YaziBridgeOpenResult =
48
+ | { status: "opened"; mode: YaziSessionMode; paneId: string | null; existing: boolean }
49
+ | Exclude<YaziSessionOpenResult, { status: "opened" }>;
50
+
51
+ export interface YaziBridge {
52
+ open(options?: { once?: boolean }): Promise<YaziBridgeOpenResult>;
53
+ status(): Readonly<YaziBridgeStatus>;
54
+ dispose(): void;
55
+ }
56
+
57
+ export interface YaziBridgeDeps {
58
+ mux?: MuxContract;
59
+ getDraft: () => string;
60
+ setDraft: (text: string) => void;
61
+ requestRender: () => void;
62
+ notice: (level: "info" | "warning", text: string) => void;
63
+ getCwd: () => string;
64
+ getSettings?: () => Readonly<YaziBridgeSettings>;
65
+ openSession?: (options: YaziSessionOptions) => Promise<YaziSessionOpenResult>;
66
+ /** TUI lease used only by the no-mux, in-terminal chooser. */
67
+ stopUi?: () => void;
68
+ startUi?: () => void;
69
+ runTerminalChooser?: (options: { cwd: string; profileMode: YaziProfileMode }) => Promise<YaziTerminalChooserResult>;
70
+ statPath?: (path: string) => "file" | "directory" | "other";
71
+ livenessMs?: number;
72
+ pickToken?: () => string;
73
+ }
74
+
75
+ export type YaziTerminalChooserResult =
76
+ | { status: "chosen"; choice: { paths: ReadonlyArray<string>; cwd: string } }
77
+ | { status: "cancelled" }
78
+ | { status: "missing-binary"; binary: "yazi" | "ya"; detail: string }
79
+ | { status: "profile-error"; reason: string }
80
+ | { status: "unavailable"; reason: string };
81
+
82
+ export interface YaziTerminalChooserOptions {
83
+ cwd: string;
84
+ profileMode: YaziProfileMode;
85
+ stopUi: () => void;
86
+ startUi: () => void;
87
+ requestRender: () => void;
88
+ cacheDir?: string;
89
+ sessionId?: string;
90
+ resolveBinaries?: () => YaziResolvedBinaries;
91
+ ensureProfile?: typeof ensureYaziProfile;
92
+ spawnYazi?: (
93
+ file: string,
94
+ args: ReadonlyArray<string>,
95
+ options: { cwd: string; env: Readonly<NodeJS.ProcessEnv> },
96
+ ) => { error?: Error };
97
+ }
98
+
99
+ function readOptional(path: string): string {
100
+ try {
101
+ return readFileSync(path, "utf8");
102
+ } catch {
103
+ return "";
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Run Yazi as a full-screen chooser when no pane host is usable.
109
+ *
110
+ * Resolution, profile generation, and chooser-file truncation all happen
111
+ * before the TUI lease is released. A missing or below-floor binary therefore
112
+ * leaves the screen intact and returns the shared doctor sentence verbatim.
113
+ */
114
+ export async function runYaziTerminalChooser(options: YaziTerminalChooserOptions): Promise<YaziTerminalChooserResult> {
115
+ const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
116
+ if (!binaries.yaziPath) {
117
+ return { status: "missing-binary", binary: "yazi", detail: binaries.missingYaziDetail };
118
+ }
119
+ if (options.profileMode === "managed" && !binaries.yaPath) {
120
+ return {
121
+ status: "missing-binary",
122
+ binary: "ya",
123
+ detail: "the Yazi helper `ya` is not available; install the complete pinned Yazi tool",
124
+ };
125
+ }
126
+
127
+ const cacheDir = options.cacheDir ?? clioCacheDir();
128
+ const sessionsDir = join(cacheDir, "yazi", "sessions");
129
+ mkdirSync(sessionsDir, { recursive: true });
130
+ const sessionId = options.sessionId ?? randomUUID();
131
+ const chooserPath = join(sessionsDir, `${sessionId}.chooser`);
132
+ const cwdPath = join(sessionsDir, `${sessionId}.cwd`);
133
+ const profile =
134
+ options.profileMode === "managed"
135
+ ? (options.ensureProfile ?? ensureYaziProfile)({
136
+ yaPath: binaries.yaPath as string,
137
+ yaziPath: binaries.yaziPath,
138
+ profileDir: yaziProfileDir(cacheDir),
139
+ })
140
+ : null;
141
+ if (options.profileMode === "managed" && !profile) {
142
+ return { status: "profile-error", reason: "Clio could not generate a valid managed Yazi profile" };
143
+ }
144
+ writeFileSync(chooserPath, "");
145
+ writeFileSync(cwdPath, "");
146
+
147
+ const args = [options.cwd, "--chooser-file", chooserPath, "--cwd-file", cwdPath] as const;
148
+ const env = { ...process.env, ...(profile ? { YAZI_CONFIG_HOME: profile.dir } : {}) };
149
+ let processError: Error | undefined;
150
+ options.stopUi();
151
+ try {
152
+ const result = options.spawnYazi
153
+ ? options.spawnYazi(binaries.yaziPath, args, { cwd: options.cwd, env })
154
+ : spawnSync(binaries.yaziPath, args, { cwd: options.cwd, env, stdio: "inherit" });
155
+ processError = result.error;
156
+ } catch (error) {
157
+ processError = error instanceof Error ? error : new Error(String(error));
158
+ } finally {
159
+ options.startUi();
160
+ options.requestRender();
161
+ }
162
+ if (processError) return { status: "unavailable", reason: `yazi chooser failed: ${processError.message}` };
163
+
164
+ const paths = readOptional(chooserPath)
165
+ .split("\n")
166
+ .filter((path) => path.length > 0);
167
+ if (paths.length === 0) return { status: "cancelled" };
168
+ return {
169
+ status: "chosen",
170
+ choice: { paths, cwd: readOptional(cwdPath).trim() || options.cwd },
171
+ };
172
+ }
173
+
174
+ function containsAsciiWhitespace(value: string): boolean {
175
+ for (const character of value) {
176
+ const code = character.charCodeAt(0);
177
+ if (code === 32 || (code >= 9 && code <= 13)) return true;
178
+ }
179
+ return false;
180
+ }
181
+
182
+ function relativeWhenInside(path: string, cwd: string): string {
183
+ const candidate = relative(cwd, path);
184
+ if (
185
+ candidate.length > 0 &&
186
+ candidate !== ".." &&
187
+ !candidate.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) &&
188
+ !isAbsolute(candidate)
189
+ ) {
190
+ return candidate;
191
+ }
192
+ return path;
193
+ }
194
+
195
+ function draftContains(draft: string, item: string): boolean {
196
+ let from = 0;
197
+ while (from <= draft.length) {
198
+ const at = draft.indexOf(item, from);
199
+ if (at < 0) return false;
200
+ const before = at === 0 ? "" : (draft[at - 1] ?? "");
201
+ const after = draft[at + item.length] ?? "";
202
+ if ((before === "" || /\s/u.test(before)) && (after === "" || /\s/u.test(after))) return true;
203
+ from = at + item.length;
204
+ }
205
+ return false;
206
+ }
207
+
208
+ function pathKind(path: string): "file" | "directory" | "other" {
209
+ try {
210
+ const stat = statSync(path);
211
+ if (stat.isFile()) return "file";
212
+ if (stat.isDirectory()) return "directory";
213
+ return "other";
214
+ } catch {
215
+ return "other";
216
+ }
217
+ }
218
+
219
+ /** Format one DDS or chooser batch for the composer without ever submitting it. */
220
+ export function formatYaziMentions(
221
+ paths: ReadonlyArray<string>,
222
+ options: {
223
+ cwd: string;
224
+ draft: string;
225
+ statPath?: (path: string) => "file" | "directory" | "other";
226
+ maxPaths?: number;
227
+ maxChars?: number;
228
+ },
229
+ ): YaziMentionBatch {
230
+ const maxPaths = options.maxPaths ?? YAZI_PICK_MAX_PATHS;
231
+ const maxChars = options.maxChars ?? YAZI_PICK_MAX_CHARS;
232
+ const inspect = options.statPath ?? pathKind;
233
+ const rendered: string[] = [];
234
+ const seen = new Set<string>();
235
+ let mentions = 0;
236
+ let plainPaths = 0;
237
+ let duplicates = 0;
238
+ let truncated = Math.max(0, paths.length - maxPaths);
239
+
240
+ const candidates = paths.slice(0, maxPaths);
241
+ for (const [index, rawPath] of candidates.entries()) {
242
+ const absolute = isAbsolute(rawPath) ? rawPath : resolve(options.cwd, rawPath);
243
+ if (seen.has(absolute)) {
244
+ duplicates += 1;
245
+ continue;
246
+ }
247
+ seen.add(absolute);
248
+ const kind = inspect(absolute);
249
+ let display = relativeWhenInside(absolute, options.cwd);
250
+ if (kind === "directory" && display !== "/" && !display.endsWith("/")) display = `${display}/`;
251
+ const mention = kind === "file" && !containsAsciiWhitespace(display);
252
+ const item = mention ? `@${display}` : `\`${display.replaceAll("`", "\\`")}\``;
253
+ if (draftContains(options.draft, item)) {
254
+ duplicates += 1;
255
+ continue;
256
+ }
257
+ const nextLength = rendered.length === 0 ? item.length : rendered.join(" ").length + 1 + item.length;
258
+ if (nextLength > maxChars) {
259
+ truncated += candidates.length - index;
260
+ break;
261
+ }
262
+ rendered.push(item);
263
+ if (mention) mentions += 1;
264
+ else plainPaths += 1;
265
+ }
266
+
267
+ return {
268
+ text: rendered.join(" "),
269
+ inserted: rendered.length,
270
+ mentions,
271
+ plainPaths,
272
+ duplicates,
273
+ truncated,
274
+ };
275
+ }
276
+
277
+ function appendDraft(draft: string, addition: string): string {
278
+ if (addition.length === 0) return draft;
279
+ if (draft.length === 0) return addition;
280
+ return `${draft.replace(/\s+$/u, "")} ${addition}`;
281
+ }
282
+
283
+ /** Own the only path from a Yazi decision into the interactive composer. */
284
+ export function createYaziBridge(deps: YaziBridgeDeps): YaziBridge {
285
+ const openSession = deps.openSession ?? createYaziSession;
286
+ let active: YaziSession | null = null;
287
+ let paneCwd: string | null = null;
288
+ let droppedLines = 0;
289
+ let disposed = false;
290
+ let generation = 0;
291
+ let livenessTimer: NodeJS.Timeout | null = null;
292
+ let sawLine = false;
293
+
294
+ const clearLiveness = (): void => {
295
+ if (livenessTimer) clearTimeout(livenessTimer);
296
+ livenessTimer = null;
297
+ };
298
+
299
+ const insert = (paths: ReadonlyArray<string>, cwd: string): void => {
300
+ const draft = deps.getDraft();
301
+ const batch = formatYaziMentions(paths, { cwd, draft, ...(deps.statPath ? { statPath: deps.statPath } : {}) });
302
+ if (batch.inserted === 0) {
303
+ if (batch.truncated > 0) {
304
+ deps.notice(
305
+ "warning",
306
+ `${batch.truncated} file-pane path${batch.truncated === 1 ? " was" : "s were"} omitted by the pick limits`,
307
+ );
308
+ }
309
+ return;
310
+ }
311
+ deps.setDraft(appendDraft(draft, batch.text));
312
+ deps.requestRender();
313
+ deps.notice(
314
+ "info",
315
+ `${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the file pane added to the draft`,
316
+ );
317
+ if (batch.plainPaths > 0) {
318
+ deps.notice(
319
+ "info",
320
+ `${batch.plainPaths} ${batch.plainPaths === 1 ? "path was" : "paths were"} inserted as plain text because directories and spaced paths cannot be file mentions`,
321
+ );
322
+ }
323
+ if (batch.truncated > 0) {
324
+ deps.notice(
325
+ "warning",
326
+ `${batch.truncated} file-pane path${batch.truncated === 1 ? " was" : "s were"} omitted by the pick limits`,
327
+ );
328
+ }
329
+ };
330
+
331
+ const start = async (mode: YaziSessionMode, profileMode: YaziProfileMode): Promise<YaziBridgeOpenResult> => {
332
+ const mux = deps.mux;
333
+ if (!mux?.available()) return { status: "unavailable", reason: "the pane layer is not available" };
334
+ generation += 1;
335
+ const ownGeneration = generation;
336
+ const token = (deps.pickToken ?? randomUUID)();
337
+ sawLine = false;
338
+ paneCwd = deps.getCwd();
339
+ const result = await openSession({
340
+ mux,
341
+ mode,
342
+ profileMode,
343
+ cwd: deps.getCwd(),
344
+ pickToken: token,
345
+ onEvent: (event: YaziEvent) => {
346
+ if (disposed || ownGeneration !== generation) return;
347
+ sawLine = true;
348
+ if (event.kind === "cd") {
349
+ paneCwd = event.cwd;
350
+ return;
351
+ }
352
+ if (event.values[0] !== token) {
353
+ droppedLines += 1;
354
+ return;
355
+ }
356
+ insert(event.values.slice(1), paneCwd ?? deps.getCwd());
357
+ },
358
+ onChooser: (choice) => {
359
+ if (disposed || ownGeneration !== generation) return;
360
+ paneCwd = choice.cwd;
361
+ if (choice.paths.length > 0) insert(choice.paths, choice.cwd);
362
+ },
363
+ onStopped: () => {
364
+ if (ownGeneration !== generation) return;
365
+ clearLiveness();
366
+ active = null;
367
+ },
368
+ });
369
+ if (result.status !== "opened") return result;
370
+ if (disposed || ownGeneration !== generation) {
371
+ await result.session.close();
372
+ return { status: "unavailable", reason: "the file pane was closed while it was opening" };
373
+ }
374
+ active = result.session;
375
+ if (mode === "companion") {
376
+ livenessTimer = setTimeout(() => {
377
+ if (disposed || ownGeneration !== generation || sawLine || active === null) return;
378
+ const stale = active;
379
+ active = null;
380
+ deps.notice("warning", "the file-pane event stream did not start; reopening yazi in chooser mode");
381
+ void stale.close().finally(() => {
382
+ if (!disposed && ownGeneration === generation) void start("chooser", profileMode);
383
+ });
384
+ }, deps.livenessMs ?? YAZI_LIVENESS_MS);
385
+ livenessTimer.unref();
386
+ }
387
+ return { status: "opened", mode, paneId: result.session.pane.paneId, existing: false };
388
+ };
389
+
390
+ return {
391
+ async open(options = {}): Promise<YaziBridgeOpenResult> {
392
+ if (disposed) return { status: "unavailable", reason: "the file-pane bridge is closed" };
393
+ const settings = deps.getSettings?.() ?? { mode: "companion", profile: "managed", followCwd: true };
394
+ if (active) {
395
+ if (settings.followCwd) {
396
+ const cwd = deps.getCwd();
397
+ if (await active.pushCwd(cwd)) paneCwd = cwd;
398
+ }
399
+ return { status: "opened", mode: active.mode, paneId: active.pane.paneId, existing: true };
400
+ }
401
+ const mode = options.once || settings.profile === "user" ? "chooser" : settings.mode;
402
+ if (!deps.mux?.available()) {
403
+ const result = await (
404
+ deps.runTerminalChooser ??
405
+ ((choiceOptions) =>
406
+ runYaziTerminalChooser({
407
+ ...choiceOptions,
408
+ stopUi: deps.stopUi ?? (() => {}),
409
+ startUi: deps.startUi ?? (() => {}),
410
+ requestRender: deps.requestRender,
411
+ }))
412
+ )({ cwd: deps.getCwd(), profileMode: settings.profile });
413
+ if (result.status === "chosen") {
414
+ paneCwd = result.choice.cwd;
415
+ insert(result.choice.paths, result.choice.cwd);
416
+ }
417
+ if (result.status === "chosen" || result.status === "cancelled") {
418
+ return { status: "opened", mode: "chooser", paneId: null, existing: false };
419
+ }
420
+ return result;
421
+ }
422
+ return await start(mode, settings.profile);
423
+ },
424
+ status(): Readonly<YaziBridgeStatus> {
425
+ const snapshot = active?.snapshot();
426
+ return {
427
+ mode: active?.mode ?? "closed",
428
+ paneId: active?.pane.paneId ?? null,
429
+ paneCwd: paneCwd ?? snapshot?.paneCwd ?? null,
430
+ lastLineAt: snapshot?.lastLineAt ?? null,
431
+ droppedLines,
432
+ };
433
+ },
434
+ dispose(): void {
435
+ if (disposed) return;
436
+ disposed = true;
437
+ generation += 1;
438
+ clearLiveness();
439
+ const closing = active;
440
+ active = null;
441
+ if (closing) void closing.close();
442
+ },
443
+ };
444
+ }
@@ -40,13 +40,27 @@ export interface AskUserQuestion {
40
40
 
41
41
  export interface AskUserAnswer {
42
42
  question: string;
43
+ /** The whole answer on one line: the chosen labels, then the typed text. */
43
44
  answer: string;
45
+ /**
46
+ * The option labels the operator chose, in list order. Absent when they only
47
+ * typed. Present with no {@link value} is a label-only answer, which is how a
48
+ * reader tells "they picked the option" from "they picked it and typed a
49
+ * figure" (issue #228).
50
+ */
51
+ options?: string[];
52
+ /** The operator's typed text, exactly as submitted. Absent when they only chose. */
53
+ value?: string;
44
54
  }
45
55
 
46
56
  export interface AskUserDecision {
47
57
  key: string;
48
58
  value: string;
49
59
  label?: string;
60
+ /** The chosen labels behind `value`; derived by the harness, not model-supplied. */
61
+ options?: string[];
62
+ /** The typed text behind `value`; derived by the harness, not model-supplied. */
63
+ text?: string;
50
64
  /** Question that produced this decision; derived by the harness, not model-supplied. */
51
65
  source_question?: string;
52
66
  }
@@ -299,6 +313,13 @@ export function cancelledAskUserResult(): AskUserResult {
299
313
  return { answers: [], cancelled: true };
300
314
  }
301
315
 
316
+ /** The chosen labels, dropped when the surface supplied nothing usable. */
317
+ function normalizeAnswerOptions(value: unknown): string[] | undefined {
318
+ if (!Array.isArray(value)) return undefined;
319
+ const labels = value.filter((entry): entry is string => typeof entry === "string" && entry.trim().length > 0);
320
+ return labels.length > 0 ? labels : undefined;
321
+ }
322
+
302
323
  function normalizeAskUserResult(questions: ReadonlyArray<AskUserQuestion>, result: AskUserResult): AskUserResult {
303
324
  if (result.cancelled === true) return cancelledAskUserResult();
304
325
  const answers: AskUserAnswer[] = [];
@@ -308,7 +329,18 @@ function normalizeAskUserResult(questions: ReadonlyArray<AskUserQuestion>, resul
308
329
  if (!raw) continue;
309
330
  const question = typeof raw.question === "string" && raw.question.trim().length > 0 ? raw.question : fallbackQuestion;
310
331
  const answer = typeof raw.answer === "string" ? raw.answer.trim() : "";
311
- if (question.length > 0 && answer.length > 0) answers.push({ question, answer });
332
+ if (question.length === 0 || answer.length === 0) continue;
333
+ // The typed text keeps every byte the operator submitted. The one-line
334
+ // `answer` is a rendering of the same decision and is trimmed like any
335
+ // other display string; `value` is the record.
336
+ const options = normalizeAnswerOptions(raw.options);
337
+ const value = typeof raw.value === "string" && raw.value.length > 0 ? raw.value : undefined;
338
+ answers.push({
339
+ question,
340
+ answer,
341
+ ...(options ? { options } : {}),
342
+ ...(value !== undefined ? { value } : {}),
343
+ });
312
344
  }
313
345
  return { answers };
314
346
  }
@@ -363,7 +395,12 @@ function transcriptQuestions(questions: ReadonlyArray<AskUserQuestion>): AskUser
363
395
  }
364
396
 
365
397
  function transcriptAnswers(answers: ReadonlyArray<AskUserAnswer>): AskUserTranscriptAnswer[] {
366
- return answers.map((answer) => ({ question: answer.question, answer: answer.answer }));
398
+ return answers.map((answer) => ({
399
+ question: answer.question,
400
+ answer: answer.answer,
401
+ ...(answer.options && answer.options.length > 0 ? { options: [...answer.options] } : {}),
402
+ ...(answer.value !== undefined ? { value: answer.value } : {}),
403
+ }));
367
404
  }
368
405
 
369
406
  function toDecisionKey(value: string): string {
@@ -397,6 +434,8 @@ function decisionFromAnswer(
397
434
  key,
398
435
  value: answer.answer,
399
436
  ...(label ? { label } : {}),
437
+ ...(answer.options && answer.options.length > 0 ? { options: [...answer.options] } : {}),
438
+ ...(answer.value !== undefined ? { text: answer.value } : {}),
400
439
  source_question: answer.question,
401
440
  };
402
441
  }
@@ -406,6 +445,8 @@ function toTranscriptDecision(decision: AskUserDecision): AskUserTranscriptDecis
406
445
  key: toDecisionKey(decision.key),
407
446
  value: decision.value,
408
447
  ...(decision.label ? { label: decision.label } : {}),
448
+ ...(decision.options && decision.options.length > 0 ? { options: [...decision.options] } : {}),
449
+ ...(decision.text !== undefined ? { text: decision.text } : {}),
409
450
  ...(decision.source_question ? { source_question: decision.source_question } : {}),
410
451
  };
411
452
  }
@@ -3,13 +3,16 @@ import type { SafeEventBus } from "../core/event-bus.js";
3
3
  import type { AgentSpec } from "../domains/agents/spec.js";
4
4
  import type { DispatchContract } from "../domains/dispatch/contract.js";
5
5
  import type { AgentRoleFactsResolver } from "../domains/dispatch/execution-role.js";
6
+ import type { PanesOperations } from "../domains/mux/operations.js";
6
7
  import type { AutonomyLevel } from "../domains/safety/autonomy.js";
7
8
  import { builtin, toolPromptHintsForNames } from "./builtin-tool-catalog.js";
9
+ import type { CompeteMuxWorktrees } from "./compete-worktrees.js";
8
10
  import { assertRegisteredBuiltinTools, type CoreToolBootstrapDeps, registerCoreTools } from "./core-bootstrap.js";
9
11
  import { createDispatchRunEventRegistry, createDispatchTool } from "./dispatch.js";
10
12
  import type { DispatchBackgroundRegistry } from "./dispatch-background.js";
11
13
  import { lazyTool } from "./lazy-tool.js";
12
14
  import { monitorToolSurface } from "./monitor-surface.js";
15
+ import { panesToolSurface } from "./panes-surface.js";
13
16
  import type { ToolRegistry } from "./registry.js";
14
17
  import { steerToolSurface } from "./steer-surface.js";
15
18
 
@@ -25,6 +28,13 @@ export interface ToolBootstrapDeps extends CoreToolBootstrapDeps {
25
28
  getCostCeilingUsd?: () => number;
26
29
  getWorkerRosters?: () => WorkerRosters;
27
30
  dispatchBackground?: DispatchBackgroundRegistry;
31
+ /** Optional herdr worktree lifecycle for compete candidates. */
32
+ competeMuxWorktrees?: CompeteMuxWorktrees;
33
+ /**
34
+ * Pane operations. Present only when a pane host answered detection, which
35
+ * is what keeps the `panes` tool out of the prompt on a machine with none.
36
+ */
37
+ panes?: PanesOperations;
28
38
  }
29
39
 
30
40
  /**
@@ -36,7 +46,11 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
36
46
  const registration = registerCoreTools(registry, deps);
37
47
  if (deps.dispatch) {
38
48
  const dispatch = deps.dispatch;
39
- const dispatchRunEvents = createDispatchRunEventRegistry();
49
+ // Display tail only. In a composed process the dispatch domain writes the
50
+ // durable journal off its own progress channel, which covers every run
51
+ // rather than only the ones the model dispatched through this tool, so a
52
+ // second sink here would transcribe a tool-path run twice.
53
+ const dispatchRunEvents = createDispatchRunEventRegistry({ journal: null });
40
54
  const dispatchToolDeps = {
41
55
  dispatch,
42
56
  runEvents: dispatchRunEvents,
@@ -48,6 +62,7 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
48
62
  ...(deps.getCostCeilingUsd ? { getCostCeilingUsd: deps.getCostCeilingUsd } : {}),
49
63
  ...(deps.getWorkerRosters ? { getWorkerRosters: deps.getWorkerRosters } : {}),
50
64
  ...(deps.dispatchBackground ? { background: deps.dispatchBackground } : {}),
65
+ ...(deps.competeMuxWorktrees ? { competeWorktrees: { mux: deps.competeMuxWorktrees } } : {}),
51
66
  };
52
67
  registry.register({
53
68
  ...builtin(createDispatchTool(dispatchToolDeps), {
@@ -76,5 +91,14 @@ export function registerAllTools(registry: ToolRegistry, deps: ToolBootstrapDeps
76
91
  ),
77
92
  });
78
93
  }
79
- assertRegisteredBuiltinTools(registry, registration, Boolean(deps.dispatch));
94
+ if (deps.panes) {
95
+ const panes = deps.panes;
96
+ registry.register({
97
+ ...builtin(
98
+ lazyTool(panesToolSurface, async () => (await import("./panes.js")).createPanesTool({ panes })),
99
+ { path: "src/tools/panes.ts", scope: "core" },
100
+ ),
101
+ });
102
+ }
103
+ assertRegisteredBuiltinTools(registry, registration, Boolean(deps.dispatch), Boolean(deps.panes));
80
104
  }
@@ -213,6 +213,21 @@ const TOOL_METADATA: Readonly<Record<string, ToolMetadata>> = {
213
213
  },
214
214
  costLatency: "local_fast",
215
215
  },
216
+ [ToolNames.Panes]: {
217
+ objective: "Focus, open, close, and inventory the terminal panes Clio owns beside this session.",
218
+ uiLabel: "Panes",
219
+ // show and list land on the same state twice; open starts a second pane
220
+ // and close is a no-op the second time, so the surface as a whole is not.
221
+ retrySafety: "not_retry_safe",
222
+ resultSizePolicy: {
223
+ kind: "exact",
224
+ maxBytes: 8_192,
225
+ followUpHint: 'Call panes with action="list" to re-read the pane inventory.',
226
+ },
227
+ costLatency: "local_fast",
228
+ promptHint:
229
+ 'When the operator asks to see a dispatched agent ("show me the tester"), call panes with action="show" and the agent id. Utility panes are presets only; an arbitrary command is the operator\'s own /panes open.',
230
+ },
216
231
  // RETRIEVE: network-class.
217
232
  [ToolNames.WebFetch]: {
218
233
  objective: "Fetch HTTP(S) text for explicit external research.",