@iowarp/clio-coder 0.3.9 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/NOTICE +33 -0
  3. package/README.md +7 -2
  4. package/dist/{acp-7LOELQFP.js → acp-G5WJBNCT.js} +13 -12
  5. package/dist/{agents-FIBG2SHA.js → agents-FMV2Q5G4.js} +39 -36
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-OI4LIH2I.js → auth-3IDSJEIK.js} +16 -15
  8. package/dist/{builtins-AD25UL3C.js → builtins-XCZWXSC7.js} +3 -3
  9. package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
  10. package/dist/{chunk-56KB5IJP.js → chunk-2OQE55CK.js} +3 -3
  11. package/dist/{chunk-N3PBVRTZ.js → chunk-32KWKNSF.js} +9 -7
  12. package/dist/{chunk-VKBMFOYV.js → chunk-36EJLSQQ.js} +23 -27
  13. package/dist/{chunk-465CC7FK.js → chunk-3BT2XMV4.js} +16 -13
  14. package/dist/{chunk-NQ6UCCOD.js → chunk-3URVFKWK.js} +7 -7
  15. package/dist/{chunk-WIE7ZOSW.js → chunk-3XML7CDN.js} +2 -2
  16. package/dist/chunk-42FMPA75.js +101 -0
  17. package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
  18. package/dist/{chunk-HAY4ZE2P.js → chunk-5PSMVOLM.js} +2 -2
  19. package/dist/{chunk-JEQQR47K.js → chunk-6DB53AJS.js} +168 -9
  20. package/dist/{chunk-KV2AOLDF.js → chunk-76ONBSIA.js} +5 -25
  21. package/dist/{chunk-FALJGAWU.js → chunk-7MCTRUCE.js} +2 -2
  22. package/dist/{chunk-5T7RBWN2.js → chunk-AB44T6BB.js} +5 -5
  23. package/dist/chunk-B7OBL7PK.js +1405 -0
  24. package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
  25. package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
  26. package/dist/{chunk-O6I4CIEU.js → chunk-BKFJHQCA.js} +6 -6
  27. package/dist/chunk-BKFM6EJV.js +462 -0
  28. package/dist/chunk-BMS5RKQY.js +27 -0
  29. package/dist/{chunk-MV2VUEJC.js → chunk-BPKCPIL7.js} +2 -2
  30. package/dist/{chunk-TEO2TLVN.js → chunk-BUMFYQFY.js} +964 -1120
  31. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  32. package/dist/chunk-C2LTL2W6.js +2447 -0
  33. package/dist/{chunk-EBOC7MT3.js → chunk-CODPRO7Q.js} +8 -8
  34. package/dist/{chunk-HPCTNZM2.js → chunk-CTJ4RNAA.js} +4 -4
  35. package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
  36. package/dist/{chunk-MIX5N5AC.js → chunk-DQITNCXG.js} +394 -154
  37. package/dist/{chunk-S4COXYBG.js → chunk-DYJP44XW.js} +129 -106
  38. package/dist/{chunk-N5XKWMDW.js → chunk-F4CKPOEQ.js} +6 -6
  39. package/dist/{chunk-AMKHQW3C.js → chunk-FEFIFZTL.js} +3 -3
  40. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  41. package/dist/{chunk-7C6RYZGQ.js → chunk-GKF55TAZ.js} +3 -3
  42. package/dist/{chunk-B5XRQOLB.js → chunk-GR5G2PVF.js} +9 -8
  43. package/dist/{chunk-XDOQXGFO.js → chunk-GXNLGKAB.js} +64 -8
  44. package/dist/chunk-HHV2GANA.js +88 -0
  45. package/dist/{chunk-774ILSRL.js → chunk-HI63TFOG.js} +4 -3
  46. package/dist/{chunk-R7LNVMCS.js → chunk-HJJTYUHX.js} +64 -72
  47. package/dist/{chunk-RKRLDWD3.js → chunk-HLW2MRKE.js} +1 -1
  48. package/dist/{chunk-CA42X6KT.js → chunk-HWHKMHUA.js} +6 -6
  49. package/dist/chunk-HZHHCK24.js +1631 -0
  50. package/dist/{chunk-HJB5IUKP.js → chunk-I5VEOC6I.js} +12 -12
  51. package/dist/chunk-IBEBSCYA.js +564 -0
  52. package/dist/chunk-IQ7KR472.js +362 -0
  53. package/dist/{chunk-4H6ULJ3H.js → chunk-J4W7KFM7.js} +921 -990
  54. package/dist/{chunk-4LJX2PUC.js → chunk-JDG2WCRO.js} +5 -5
  55. package/dist/{chunk-NZU6YDNV.js → chunk-K5C3NCBD.js} +4 -4
  56. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  57. package/dist/{chunk-NNNWO6F2.js → chunk-KFZI4NIL.js} +93 -3
  58. package/dist/chunk-KMVISBZR.js +132 -0
  59. package/dist/{chunk-BVDVID7E.js → chunk-LDQ2ZF2M.js} +2 -2
  60. package/dist/{chunk-OEDBCISO.js → chunk-LQ3DZAMX.js} +2 -2
  61. package/dist/{chunk-PZ4I4JE2.js → chunk-LY4S7GJC.js} +124 -116
  62. package/dist/{chunk-3DUR4WUA.js → chunk-MLKNTWH2.js} +19 -19
  63. package/dist/chunk-NEKRRTYW.js +56 -0
  64. package/dist/{chunk-5DQRIYDZ.js → chunk-NHCZP4K7.js} +2 -2
  65. package/dist/chunk-NHLBIGRH.js +1506 -0
  66. package/dist/chunk-NQQH3YT7.js +302 -0
  67. package/dist/chunk-NYS75XW5.js +15 -0
  68. package/dist/{chunk-TD7UE2L5.js → chunk-O4XIVISU.js} +7 -7
  69. package/dist/{chunk-WXCJ7VME.js → chunk-O6TL7WWY.js} +6 -6
  70. package/dist/chunk-OQBA45DZ.js +97 -0
  71. package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
  72. package/dist/chunk-PMZCIOCJ.js +25 -0
  73. package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
  74. package/dist/{chunk-HKO36JWF.js → chunk-QBJA7R7N.js} +31 -3
  75. package/dist/chunk-QDC3K2U3.js +262 -0
  76. package/dist/{chunk-5HFBWUMU.js → chunk-QLFS5GO2.js} +4 -4
  77. package/dist/{chunk-GAYUJ7LE.js → chunk-QLL7ILRG.js} +41 -32
  78. package/dist/{chunk-LXPJXFM5.js → chunk-QREDIESB.js} +7 -7
  79. package/dist/chunk-QSNYB6ZV.js +195 -0
  80. package/dist/chunk-R346GLFC.js +31 -0
  81. package/dist/{chunk-VPTUJU4P.js → chunk-SJ5ZKQ4S.js} +2 -2
  82. package/dist/{chunk-QQ7EKM72.js → chunk-SP2RXXYO.js} +6 -54
  83. package/dist/chunk-SUCTJL45.js +45 -0
  84. package/dist/{chunk-5QKCQQ3E.js → chunk-SUW5DORT.js} +2 -2
  85. package/dist/chunk-T56WDKA5.js +183 -0
  86. package/dist/chunk-TVHHYFHE.js +255 -0
  87. package/dist/{chunk-IHKBWSXF.js → chunk-TZ3SGWZZ.js} +2 -2
  88. package/dist/{chunk-ECUO3KDP.js → chunk-U77AMWDL.js} +47 -7
  89. package/dist/{chunk-3UUY7R3Z.js → chunk-ULC6OTWO.js} +7 -7
  90. package/dist/{chunk-AEYBF3TB.js → chunk-UM7N4G5A.js} +2 -2
  91. package/dist/{chunk-3V5AYSEQ.js → chunk-UXMFQ54G.js} +43 -36
  92. package/dist/{chunk-YW7UVM5V.js → chunk-V5DHCITQ.js} +34 -1
  93. package/dist/{chunk-47CMYGET.js → chunk-VAZSBTKF.js} +2 -2
  94. package/dist/{chunk-3MRC2YSQ.js → chunk-VEO4AP2K.js} +2 -2
  95. package/dist/{chunk-PNY46YEY.js → chunk-VFA6GDY5.js} +47 -3
  96. package/dist/chunk-VO67MWHC.js +75 -0
  97. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  98. package/dist/{chunk-AD7Y7STJ.js → chunk-VYMXRQI6.js} +36 -22
  99. package/dist/{chunk-T3Z6VAAF.js → chunk-W5VSYASO.js} +19 -17
  100. package/dist/{chunk-5PVQ4SRS.js → chunk-WZR7K7ZX.js} +7 -123
  101. package/dist/{chunk-DG4M6ZUE.js → chunk-X3YGUTOB.js} +4 -4
  102. package/dist/chunk-X75E3D2N.js +686 -0
  103. package/dist/{chunk-P3JGPQFL.js → chunk-YDFRH54B.js} +4 -4
  104. package/dist/chunk-YJX4SHTD.js +40 -0
  105. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  106. package/dist/{chunk-YSEHGPCT.js → chunk-Z2RR6MAK.js} +3 -3
  107. package/dist/{chunk-HCBCAYZU.js → chunk-Z4TXYIEG.js} +5 -5
  108. package/dist/cli/index.js +47 -36
  109. package/dist/{clio-LT5V7SSZ.js → clio-2JXHBBY5.js} +7 -7
  110. package/dist/{code-nav-LMW275PA.js → code-nav-3YYRMYNF.js} +6 -6
  111. package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
  112. package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
  113. package/dist/{config-RXS5T3JT.js → config-QZPCMYSO.js} +58 -50
  114. package/dist/{configure-2WYWSCSD.js → configure-TEGEBYCA.js} +21 -19
  115. package/dist/{context-I3BTOTCS.js → context-AV7OEZ4D.js} +11 -11
  116. package/dist/{context-MVOORGMF.js → context-E6H5RNMC.js} +49 -41
  117. package/dist/{context-PALKKQYL.js → context-GSXUE4CT.js} +25 -23
  118. package/dist/{context-clear-N2WOYZ2K.js → context-clear-SHIBYK6T.js} +48 -40
  119. package/dist/{context-working-set-MIEVECVZ.js → context-working-set-5ZGKPGZQ.js} +11 -10
  120. package/dist/{dispatch-runner-VVA4SRRH.js → dispatch-runner-EFMJT4LD.js} +88 -60
  121. package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
  122. package/dist/doctor-QOA5FNY5.js +313 -0
  123. package/dist/{eval-IJ5VEZDJ.js → eval-TFBYQH4H.js} +66 -64
  124. package/dist/eval-inventory-SXH7PDKX.js +316 -0
  125. package/dist/{evidence-L5APPXNV.js → evidence-ERGESKGN.js} +198 -44
  126. package/dist/{evolve-RGNKFJ52.js → evolve-VDXTSYCJ.js} +46 -38
  127. package/dist/{extensions-7WYWUX5A.js → extensions-7BGBHN57.js} +6 -6
  128. package/dist/{fleet-6CNVBZZP.js → fleet-2RRVDF2V.js} +189 -101
  129. package/dist/{fleet-commands-L2SXSYEI.js → fleet-commands-VJ726XIA.js} +10 -10
  130. package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
  131. package/dist/{fleet-graph-2J3OOIPO.js → fleet-graph-JF5QOATM.js} +16 -15
  132. package/dist/fleet-inspect-VLY4S7QM.js +442 -0
  133. package/dist/{fleet-preflight-CZRJ4JP5.js → fleet-preflight-AIZUEJOY.js} +6 -5
  134. package/dist/{fleet-validate-C5RI6DP7.js → fleet-validate-AJRPDMDV.js} +20 -18
  135. package/dist/fleet-verify-JFEL2L3H.js +175 -0
  136. package/dist/fleet-view-ZCON35AG.js +102 -0
  137. package/dist/{init-VBN2ACVA.js → init-DN2WWLFE.js} +64 -56
  138. package/dist/install-XGLBQY5E.js +13 -0
  139. package/dist/interop-OZBKXAYL.js +114 -0
  140. package/dist/{library-JHGUMLY2.js → library-YWZG7IMW.js} +19 -18
  141. package/dist/{memory-K4OQIYWG.js → memory-I4C4HMLW.js} +48 -40
  142. package/dist/{models-2NCZUWDD.js → models-CEYXJBO6.js} +30 -28
  143. package/dist/{monitor-MMVTJABD.js → monitor-NZ6GCI3P.js} +53 -47
  144. package/dist/{orchestrator-ZKBPCHW6.js → orchestrator-GCGQ4N5I.js} +6311 -7145
  145. package/dist/panes-HMABYVO4.js +58 -0
  146. package/dist/panes-KY6W3V2E.js +103 -0
  147. package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
  148. package/dist/{reset-DD5JGOY3.js → reset-DQ6FGCSH.js} +13 -11
  149. package/dist/resources-BB3MVJMD.js +111 -0
  150. package/dist/{run-QEGNX7FL.js → run-H2GQDUER.js} +113 -82
  151. package/dist/{share-JKD3BQMW.js → share-GTJN6A5O.js} +18 -17
  152. package/dist/{skills-LMQIKDOZ.js → skills-L55TEW6R.js} +31 -24
  153. package/dist/{skills-eval-I7X2774U.js → skills-eval-XVXPH2JI.js} +61 -52
  154. package/dist/skills-inventory-S4MXPJFV.js +126 -0
  155. package/dist/slash-commands-ZSGASKJC.js +77 -0
  156. package/dist/{steer-CF5TDANS.js → steer-RZGSCY4R.js} +3 -3
  157. package/dist/{support-I7LOJLIF.js → support-PKEUNNQL.js} +4 -4
  158. package/dist/{targets-RUSR6B5Z.js → targets-NCPZ644J.js} +31 -29
  159. package/dist/{terminal-lease-QYVORFR4.js → terminal-lease-44SV3YCN.js} +4 -4
  160. package/dist/tools-DAF3DI3C.js +27 -0
  161. package/dist/{trace-ODOQIVIW.js → trace-FYVW2MQA.js} +149 -7
  162. package/dist/tui-primitives-2AKXQNZK.js +13 -0
  163. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
  164. package/dist/{upgrade-XANW3FXB.js → upgrade-3XPP6OQL.js} +26 -24
  165. package/dist/{usage-4H7ZRXQT.js → usage-3NLHGTU2.js} +57 -49
  166. package/dist/{verifiers-UZXNBZEB.js → verifiers-SSQONKRT.js} +171 -12
  167. package/dist/{verify-BVKWTNDL.js → verify-3U6J7FZI.js} +9 -9
  168. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
  169. package/dist/{wiki-generate-MY7WV2QI.js → wiki-generate-CEHYGPGQ.js} +67 -59
  170. package/dist/with-panes-MKB46MPQ.js +782 -0
  171. package/dist/worker/entry.js +101 -66
  172. package/docs/README.md +3 -2
  173. package/docs/acp.md +24 -3
  174. package/docs/alcf-provider.md +1 -1
  175. package/docs/architecture.md +2 -2
  176. package/docs/artifact-versions.md +4 -1
  177. package/docs/built-in-agents.md +1 -1
  178. package/docs/capacity-and-scheduling.md +43 -5
  179. package/docs/commands-and-modes.md +31 -2
  180. package/docs/configuration-and-targets.md +40 -10
  181. package/docs/context-engine.md +1 -1
  182. package/docs/development-pipeline.md +19 -0
  183. package/docs/dispatch-typed-intent.md +385 -0
  184. package/docs/documentation-coverage.md +2 -2
  185. package/docs/documentation-guide.md +1 -1
  186. package/docs/environment-variables.md +1 -0
  187. package/docs/eval-runner.md +1 -1
  188. package/docs/evals-internal.md +1 -1
  189. package/docs/evidence-and-memory.md +2 -2
  190. package/docs/evolution.md +1 -1
  191. package/docs/exit-codes-and-output.md +1 -1
  192. package/docs/extensions-and-sharing.md +25 -1
  193. package/docs/fleet-dispatch.md +22 -1
  194. package/docs/installation-and-lifecycle.md +15 -2
  195. package/docs/middleware-and-components.md +1 -1
  196. package/docs/model-catalog.md +10 -1
  197. package/docs/observability.md +3 -3
  198. package/docs/proactive-memory.md +1 -1
  199. package/docs/prompt-envelope-and-tools.md +1 -1
  200. package/docs/provider-adapter-cookbook.md +1 -1
  201. package/docs/safety-model.md +2 -2
  202. package/docs/scientific-validation.md +3 -3
  203. package/docs/session-lifecycle.md +1 -1
  204. package/docs/skills-marketplace.md +1 -1
  205. package/docs/tool-usage.md +18 -8
  206. package/docs/trace-store.md +1 -1
  207. package/docs/troubleshooting.md +1 -1
  208. package/docs/tui-design.md +1 -1
  209. package/docs/worker-dispatch-mechanics.md +1 -1
  210. package/package.json +4 -2
  211. package/src/cli/acp.ts +6 -2
  212. package/src/cli/argv.ts +25 -0
  213. package/src/cli/configure.ts +23 -21
  214. package/src/cli/doctor-panes.ts +124 -0
  215. package/src/cli/doctor-toolchain.ts +57 -0
  216. package/src/cli/doctor.ts +20 -1
  217. package/src/cli/eval-inventory.ts +436 -0
  218. package/src/cli/eval.ts +13 -0
  219. package/src/cli/evidence-detail.ts +88 -0
  220. package/src/cli/evidence-inventory.ts +183 -0
  221. package/src/cli/evidence.ts +30 -5
  222. package/src/cli/fleet-decisions.ts +69 -0
  223. package/src/cli/fleet-inspect.ts +334 -0
  224. package/src/cli/fleet-verify.ts +133 -0
  225. package/src/cli/fleet-view.ts +810 -0
  226. package/src/cli/fleet.ts +148 -37
  227. package/src/cli/index.ts +14 -2
  228. package/src/cli/interop-inspect.ts +128 -0
  229. package/src/cli/interop.ts +34 -0
  230. package/src/cli/panes.ts +35 -0
  231. package/src/cli/reset.ts +5 -2
  232. package/src/cli/run.ts +58 -0
  233. package/src/cli/skills-inventory.ts +185 -0
  234. package/src/cli/skills.ts +16 -13
  235. package/src/cli/tools.ts +321 -0
  236. package/src/cli/trace-inspect.ts +252 -0
  237. package/src/cli/trace.ts +23 -2
  238. package/src/cli/verifiers-inspect.ts +347 -0
  239. package/src/cli/verifiers.ts +9 -0
  240. package/src/core/bus-events.ts +4 -0
  241. package/src/core/config.ts +49 -0
  242. package/src/core/defaults.ts +93 -7
  243. package/src/core/response-schema.ts +44 -4
  244. package/src/core/theme-token-hex.ts +43 -0
  245. package/src/core/tool-names.ts +2 -1
  246. package/src/core/xdg.ts +1 -1
  247. package/src/domains/agents/fleets/build-review.md +0 -3
  248. package/src/domains/agents/fleets/build-test.md +0 -3
  249. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  250. package/src/domains/agents/result-contract.ts +164 -35
  251. package/src/domains/config/classify.ts +3 -0
  252. package/src/domains/dispatch/admission-error.ts +9 -0
  253. package/src/domains/dispatch/admission.ts +22 -21
  254. package/src/domains/dispatch/capacity-lease.ts +21 -1
  255. package/src/domains/dispatch/council-topology.ts +398 -0
  256. package/src/domains/dispatch/extension.ts +222 -50
  257. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  258. package/src/domains/dispatch/fleet-plan.ts +7 -2
  259. package/src/domains/dispatch/fleet-run.ts +64 -1
  260. package/src/domains/dispatch/gate-decisions.ts +11 -1
  261. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  262. package/src/domains/dispatch/gate-topology.ts +289 -0
  263. package/src/domains/dispatch/index.ts +19 -0
  264. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  265. package/src/domains/dispatch/intent.ts +85 -1
  266. package/src/domains/dispatch/reservation-store.ts +24 -4
  267. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  268. package/src/domains/dispatch/run-event-journal.ts +598 -0
  269. package/src/domains/dispatch/state.ts +45 -1
  270. package/src/domains/dispatch/types.ts +13 -0
  271. package/src/domains/dispatch/validation.ts +33 -8
  272. package/src/domains/eval/compare/compare.ts +3 -16
  273. package/src/domains/eval/inventory.ts +113 -0
  274. package/src/domains/eval/schema/serving.ts +31 -0
  275. package/src/domains/evidence/store.ts +6 -0
  276. package/src/domains/memory/index.ts +0 -1
  277. package/src/domains/memory/task-memory-policy.ts +6 -10
  278. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  279. package/src/domains/middleware/memory-intervention.ts +33 -21
  280. package/src/domains/mux/contract.ts +434 -0
  281. package/src/domains/mux/detect.ts +158 -0
  282. package/src/domains/mux/extension.ts +47 -0
  283. package/src/domains/mux/index.ts +96 -0
  284. package/src/domains/mux/manifest.ts +6 -0
  285. package/src/domains/mux/operations.ts +164 -0
  286. package/src/domains/mux/pane-registry.ts +90 -0
  287. package/src/domains/mux/protocol.ts +49 -0
  288. package/src/domains/mux/socket-client.ts +816 -0
  289. package/src/domains/mux/types.ts +222 -0
  290. package/src/domains/mux/viewer-command.ts +59 -0
  291. package/src/domains/mux/yazi/assets/init.lua +2 -0
  292. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  293. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  294. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  295. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  296. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  297. package/src/domains/mux/yazi/event-stream.ts +180 -0
  298. package/src/domains/mux/yazi/profile.ts +299 -0
  299. package/src/domains/mux/yazi/session.ts +228 -0
  300. package/src/domains/mux/yazi/theme.ts +30 -0
  301. package/src/domains/observability/cost.ts +21 -0
  302. package/src/domains/observability/index.ts +2 -0
  303. package/src/domains/observability/trace-store.ts +42 -0
  304. package/src/domains/providers/endpoint-capacity.ts +154 -22
  305. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  306. package/src/domains/providers/extension.ts +20 -3
  307. package/src/domains/providers/index.ts +22 -0
  308. package/src/domains/providers/model-runtime-capabilities.ts +32 -0
  309. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  310. package/src/domains/providers/runtimes/builtins.ts +2 -0
  311. package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
  312. package/src/domains/providers/support.ts +1 -0
  313. package/src/domains/providers/target-model-cache.ts +124 -0
  314. package/src/domains/resources/index.ts +3 -0
  315. package/src/domains/resources/skills/loader.ts +33 -0
  316. package/src/domains/safety/action-classifier.ts +6 -0
  317. package/src/domains/toolchain/archive.ts +175 -0
  318. package/src/domains/toolchain/contract.ts +28 -0
  319. package/src/domains/toolchain/extension.ts +47 -0
  320. package/src/domains/toolchain/index.ts +39 -0
  321. package/src/domains/toolchain/install.ts +327 -0
  322. package/src/domains/toolchain/manifest.ts +8 -0
  323. package/src/domains/toolchain/paths.ts +34 -0
  324. package/src/domains/toolchain/registry.ts +265 -0
  325. package/src/domains/toolchain/remove.ts +218 -0
  326. package/src/domains/toolchain/resolve.ts +182 -0
  327. package/src/domains/toolchain/types.ts +113 -0
  328. package/src/domains/toolchain/version.ts +88 -0
  329. package/src/engine/acp/server.ts +413 -70
  330. package/src/engine/acp/types.ts +19 -1
  331. package/src/engine/claude/sdk-module.ts +98 -0
  332. package/src/engine/claude/sdk-runtime.ts +19 -11
  333. package/src/engine/tui-primitives.ts +21 -0
  334. package/src/engine/tui.ts +1 -0
  335. package/src/engine/worker-runtime.ts +2 -13
  336. package/src/entry/boot-options.ts +2 -0
  337. package/src/entry/orchestrator.ts +103 -5
  338. package/src/entry/panes-activation.ts +31 -0
  339. package/src/entry/with-panes.ts +20 -0
  340. package/src/interactive/context-overlay.ts +1 -0
  341. package/src/interactive/cost-overlay.ts +2 -0
  342. package/src/interactive/council-grid.ts +1 -3
  343. package/src/interactive/council.ts +11 -0
  344. package/src/interactive/dispatch-board.ts +26 -16
  345. package/src/interactive/interactive-application.ts +153 -6
  346. package/src/interactive/interactive-input-runtime.ts +7 -0
  347. package/src/interactive/interactive-slash-runtime.ts +36 -6
  348. package/src/interactive/memory-overlay.ts +1 -0
  349. package/src/interactive/modal-marker.ts +170 -0
  350. package/src/interactive/mux-bridge.ts +214 -0
  351. package/src/interactive/overlay-frame.ts +58 -2
  352. package/src/interactive/overlay-general-openers.ts +1 -0
  353. package/src/interactive/overlay-key-routing.ts +14 -3
  354. package/src/interactive/overlay-lifecycle.ts +19 -3
  355. package/src/interactive/overlay-model-selectors.ts +40 -3
  356. package/src/interactive/overlay-permission-lifecycle.ts +90 -22
  357. package/src/interactive/overlay-transitions.ts +18 -4
  358. package/src/interactive/overlays/agents.ts +1 -0
  359. package/src/interactive/overlays/ask-user.ts +136 -30
  360. package/src/interactive/overlays/auth-dialog.ts +1 -0
  361. package/src/interactive/overlays/context-reset.ts +1 -0
  362. package/src/interactive/overlays/cwd-fallback.ts +1 -0
  363. package/src/interactive/overlays/decisions.ts +11 -11
  364. package/src/interactive/overlays/extensions.ts +1 -0
  365. package/src/interactive/overlays/fleet-run-approval.ts +1 -0
  366. package/src/interactive/overlays/handoff-review.ts +1 -0
  367. package/src/interactive/overlays/help-reference.ts +2 -0
  368. package/src/interactive/overlays/interop.ts +1 -0
  369. package/src/interactive/overlays/library-install-confirm.ts +1 -0
  370. package/src/interactive/overlays/library-tabs.ts +28 -0
  371. package/src/interactive/overlays/list-overlay.ts +10 -1
  372. package/src/interactive/overlays/message-picker.ts +1 -0
  373. package/src/interactive/overlays/model-scope.ts +86 -0
  374. package/src/interactive/overlays/model-selector.ts +1 -0
  375. package/src/interactive/overlays/prompts.ts +1 -0
  376. package/src/interactive/overlays/session-selector.ts +1 -0
  377. package/src/interactive/overlays/settings-sections.ts +30 -0
  378. package/src/interactive/overlays/settings.ts +579 -44
  379. package/src/interactive/overlays/side-question.ts +1 -0
  380. package/src/interactive/overlays/skills-hub.ts +3 -11
  381. package/src/interactive/overlays/tree-selector.ts +1 -0
  382. package/src/interactive/pane-policy.ts +46 -0
  383. package/src/interactive/panes-runtime.ts +292 -0
  384. package/src/interactive/renderers/compaction-summary.ts +29 -0
  385. package/src/interactive/renderers/worker-entry.ts +122 -14
  386. package/src/interactive/slash-commands.ts +251 -15
  387. package/src/interactive/tasks-overlay.ts +1 -0
  388. package/src/interactive/theme/tokens.ts +3 -14
  389. package/src/interactive/turn-context.ts +47 -2
  390. package/src/interactive/view/artifacts.ts +109 -1
  391. package/src/interactive/view/view-overlay.ts +1 -0
  392. package/src/interactive/watch-pane.ts +152 -0
  393. package/src/interactive/worker-progress.ts +7 -1
  394. package/src/interactive/worker-receipts.ts +19 -1
  395. package/src/interactive/worker-stream.ts +5 -0
  396. package/src/interactive/yazi-bridge.ts +444 -0
  397. package/src/tools/bootstrap.ts +26 -2
  398. package/src/tools/builtin-tool-catalog.ts +15 -0
  399. package/src/tools/compete-worktrees.ts +83 -2
  400. package/src/tools/core-bootstrap.ts +2 -1
  401. package/src/tools/dispatch-admission.ts +14 -3
  402. package/src/tools/dispatch-arguments.ts +20 -20
  403. package/src/tools/dispatch-run-events.ts +134 -19
  404. package/src/tools/dispatch-runner.ts +29 -7
  405. package/src/tools/dispatch-types.ts +15 -3
  406. package/src/tools/dispatch.ts +1 -1
  407. package/src/tools/executables.ts +17 -14
  408. package/src/tools/observation.ts +54 -4
  409. package/src/tools/panes-surface.ts +38 -0
  410. package/src/tools/panes.ts +112 -0
  411. package/src/tools/policy.ts +10 -1
  412. package/src/tools/presentation.ts +1 -0
  413. package/dist/chunk-D73KXYPF.js +0 -37
  414. package/dist/chunk-MLOK6ZOS.js +0 -2888
  415. package/dist/chunk-YKOFT37S.js +0 -279
  416. package/dist/doctor-TWBWFK5V.js +0 -165
@@ -0,0 +1,782 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ createMuxDomainModule,
4
+ createYaziSession,
5
+ ensureYaziProfile,
6
+ resolveYaziBinaries,
7
+ watchViewerCommand,
8
+ yaziProfileDir
9
+ } from "./chunk-HZHHCK24.js";
10
+ import {
11
+ paneWatchDecision
12
+ } from "./chunk-PMZCIOCJ.js";
13
+ import {
14
+ PANES_PRESETS
15
+ } from "./chunk-YJX4SHTD.js";
16
+ import "./chunk-LCGCVYZ4.js";
17
+ import {
18
+ newestRunEventJournalRunId,
19
+ runEventJournalPath,
20
+ runEventJournalRoot
21
+ } from "./chunk-IQ7KR472.js";
22
+ import {
23
+ resolveBinary
24
+ } from "./chunk-BMS5RKQY.js";
25
+ import "./chunk-QSNYB6ZV.js";
26
+ import "./chunk-QDC3K2U3.js";
27
+ import {
28
+ sanitizeCallTargetText
29
+ } from "./chunk-TVHHYFHE.js";
30
+ import {
31
+ BusChannels
32
+ } from "./chunk-HLW2MRKE.js";
33
+ import "./chunk-IWHMRKLL.js";
34
+ import {
35
+ clioCacheDir,
36
+ clioConfigDir,
37
+ clioDataDir,
38
+ clioStateDir
39
+ } from "./chunk-BYP5D4HI.js";
40
+ import {
41
+ init_esm_shims
42
+ } from "./chunk-3R73A4XB.js";
43
+
44
+ // src/entry/with-panes.ts
45
+ init_esm_shims();
46
+
47
+ // src/interactive/mux-bridge.ts
48
+ init_esm_shims();
49
+ var MUX_BRIDGE_THROTTLE_MS = 250;
50
+ var LONG_RUN_MS = 6e4;
51
+ var DETAIL_MAX_CHARS = 96;
52
+ function isFailure(outcome) {
53
+ return outcome === "failed" || outcome === "timed_out";
54
+ }
55
+ function selfStateFor(phase) {
56
+ if (phase === "tool_blocked") return "blocked";
57
+ return phase === "idle" || phase === "ended" ? "idle" : "working";
58
+ }
59
+ function terminalOutcome(outcome) {
60
+ if (outcome === "succeeded") return "succeeded";
61
+ if (outcome === "canceled") return "canceled";
62
+ if (outcome === "timed_out") return "timed_out";
63
+ return "failed";
64
+ }
65
+ function createMuxBridge(deps) {
66
+ const log = deps.log ?? (() => void 0);
67
+ const now = deps.now ?? Date.now;
68
+ const throttleMs = deps.throttleMs ?? MUX_BRIDGE_THROTTLE_MS;
69
+ const setTimeoutFn = deps.setTimeoutFn ?? setTimeout;
70
+ const clearTimeoutFn = deps.clearTimeoutFn ?? clearTimeout;
71
+ const startedAt = /* @__PURE__ */ new Map();
72
+ let disposed = false;
73
+ let timer = null;
74
+ let draining = Promise.resolve();
75
+ let pendingSelf = null;
76
+ let reportedSelf = null;
77
+ const schedule = () => {
78
+ if (disposed || timer !== null) return;
79
+ timer = setTimeoutFn(() => {
80
+ timer = null;
81
+ void drainSelf();
82
+ }, throttleMs);
83
+ timer.unref?.();
84
+ };
85
+ const drainSelf = () => {
86
+ draining = draining.then(async () => {
87
+ if (disposed) return;
88
+ const self = pendingSelf;
89
+ pendingSelf = null;
90
+ if (self !== null && self !== reportedSelf) {
91
+ reportedSelf = self;
92
+ await deps.mux.reportSelf({ state: self }).catch(() => false);
93
+ }
94
+ });
95
+ return draining;
96
+ };
97
+ const boundedDetail = (value) => {
98
+ if (typeof value !== "string" || value.length === 0) return null;
99
+ return sanitizeCallTargetText(value).slice(0, DETAIL_MAX_CHARS);
100
+ };
101
+ const onTerminal = (identity, rawOutcome, fields) => {
102
+ const outcome = terminalOutcome(rawOutcome);
103
+ const begun = startedAt.get(identity.runId);
104
+ startedAt.delete(identity.runId);
105
+ const policy = deps.notificationsPolicy();
106
+ const failed = isFailure(outcome);
107
+ const qualifies = policy === "all" || policy === "failures" && failed;
108
+ if (!qualifies) return;
109
+ const detail = boundedDetail(fields.detail);
110
+ const durationMs = typeof fields.durationMs === "number" ? fields.durationMs : begun === void 0 ? null : now() - begun;
111
+ if (failed) {
112
+ deps.notice?.("error", `${identity.agentId} ${outcome} (${identity.runId})${detail ? `: ${detail}` : ""}`);
113
+ }
114
+ if (!deps.mux.available()) return;
115
+ draining = draining.then(async () => {
116
+ if (disposed) return;
117
+ try {
118
+ await deps.mux.notify({
119
+ title: `${identity.agentId} ${outcome}`,
120
+ ...detail ? { body: detail } : {},
121
+ // A failure interrupts; a long success announces. A short success
122
+ // in `all` mode gets the toast without the chime.
123
+ sound: failed ? "request" : durationMs !== null && durationMs >= LONG_RUN_MS ? "done" : "none"
124
+ });
125
+ } catch (error) {
126
+ log("debug", `mux bridge notify failed: ${error instanceof Error ? error.message : String(error)}`);
127
+ }
128
+ });
129
+ };
130
+ const unsubscribers = [
131
+ deps.bus.on(BusChannels.DispatchStarted, (payload) => {
132
+ startedAt.set(payload.runId, now());
133
+ }),
134
+ deps.bus.on(BusChannels.DispatchCompleted, (payload) => {
135
+ onTerminal(payload, payload.outcome, { durationMs: payload.durationMs, detail: payload.outcomeDetail });
136
+ }),
137
+ deps.bus.on(BusChannels.DispatchFailed, (payload) => {
138
+ onTerminal(payload, payload.reason, { durationMs: payload.durationMs, detail: payload.outcomeDetail });
139
+ }),
140
+ // SA-3. The interactive status machine is the one surface that already
141
+ // knows when a turn starts, when it ends, and when a tool call is parked
142
+ // on an approval, so the self-report rides its transitions rather than
143
+ // growing a second turn-lifecycle listener.
144
+ deps.bus.on(BusChannels.AgentStatusChanged, (payload) => {
145
+ const state = selfStateFor(payload.phase);
146
+ if (state === reportedSelf && pendingSelf === null) return;
147
+ pendingSelf = state;
148
+ schedule();
149
+ })
150
+ ];
151
+ return {
152
+ flush() {
153
+ if (timer !== null) {
154
+ clearTimeoutFn(timer);
155
+ timer = null;
156
+ }
157
+ return drainSelf();
158
+ },
159
+ dispose() {
160
+ if (disposed) return;
161
+ disposed = true;
162
+ if (timer !== null) clearTimeoutFn(timer);
163
+ timer = null;
164
+ for (const unsubscribe of unsubscribers) unsubscribe();
165
+ startedAt.clear();
166
+ }
167
+ };
168
+ }
169
+
170
+ // src/interactive/panes-runtime.ts
171
+ init_esm_shims();
172
+ var UNAVAILABLE = "the pane layer is not available in this session";
173
+ function inventory(records) {
174
+ return records.map((record) => ({
175
+ paneId: record.ref.paneId,
176
+ tabId: record.ref.tabId,
177
+ purpose: record.purpose,
178
+ label: record.label,
179
+ adopted: record.adopted === true
180
+ }));
181
+ }
182
+ function createPanesRuntime(deps) {
183
+ const probe = deps.resolveBinaryPath ?? resolveBinary;
184
+ const journalRoot = deps.journalRoot ?? runEventJournalRoot;
185
+ let yaziController = null;
186
+ let watchController = null;
187
+ let nextPendingOpen = 0;
188
+ const pendingOpens = /* @__PURE__ */ new Map();
189
+ const beginPendingOpen = (label) => {
190
+ nextPendingOpen += 1;
191
+ const id = `pending:${nextPendingOpen}`;
192
+ pendingOpens.set(id, {
193
+ paneId: id,
194
+ tabId: "pending",
195
+ purpose: "utility",
196
+ label,
197
+ adopted: false,
198
+ pending: true
199
+ });
200
+ return id;
201
+ };
202
+ const closedYaziStatus = () => ({
203
+ mode: "closed",
204
+ paneId: null,
205
+ paneCwd: null,
206
+ lastLineAt: null,
207
+ droppedLines: 0
208
+ });
209
+ const matchRun = (target) => {
210
+ const needle = target.trim().toLowerCase();
211
+ if (needle.length === 0) return null;
212
+ const snapshot = deps.getDispatchSnapshot();
213
+ const live = [
214
+ ...snapshot.running.map((run) => ({ runId: run.runId, agentId: run.agentId, status: "running" })),
215
+ ...snapshot.retrying.map((run) => ({ runId: run.runId, agentId: run.agentId, status: "retrying" }))
216
+ ];
217
+ const newestFirst = [...live].reverse();
218
+ const byAgent = newestFirst.find((run) => run.agentId.toLowerCase().includes(needle));
219
+ if (byAgent) return byAgent;
220
+ return newestFirst.find((run) => run.runId.toLowerCase().startsWith(needle)) ?? null;
221
+ };
222
+ const presetArgv = (presetId, binaryPath) => {
223
+ if (presetId === "shell") return [binaryPath, "-l"];
224
+ if (presetId === "logs") {
225
+ const runId = (deps.newestJournalRunId ?? (() => newestRunEventJournalRunId(journalRoot())))();
226
+ if (runId === null) return null;
227
+ return [binaryPath, "-n", "200", "-F", runEventJournalPath(runId, journalRoot())];
228
+ }
229
+ return null;
230
+ };
231
+ const show = async (target, source) => {
232
+ if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
233
+ const match = matchRun(target);
234
+ if (match === null) {
235
+ const snapshot = deps.getDispatchSnapshot();
236
+ const candidates = [
237
+ .../* @__PURE__ */ new Set([...snapshot.running.map((run) => run.agentId), ...snapshot.retrying.map((run) => run.agentId)])
238
+ ];
239
+ return { status: "not-found", target, candidates };
240
+ }
241
+ const decision = paneWatchDecision({ source, runStatus: match.status });
242
+ if (!decision.open) return { status: "refused", reason: decision.reason };
243
+ if (watchController === null) {
244
+ return { status: "unavailable", reason: "the watch pane is not wired in this session" };
245
+ }
246
+ const watched = await watchController.watch(match.runId);
247
+ if (watched.status !== "watching") return { status: "unavailable", reason: watched.reason };
248
+ return { status: "watching", runId: match.runId, agentId: match.agentId, opened: watched.opened };
249
+ };
250
+ return {
251
+ status() {
252
+ const detection = deps.mux.detection();
253
+ const panes = deps.getSettings().panes;
254
+ return {
255
+ mode: deps.mux.mode,
256
+ available: deps.mux.available(),
257
+ reason: detection.reason,
258
+ socketPath: detection.socketPath,
259
+ server: detection.server,
260
+ settings: {
261
+ enabled: panes.enabled,
262
+ notifications: panes.notifications,
263
+ journal: panes.journal,
264
+ yazi: { ...panes.yazi }
265
+ },
266
+ yazi: yaziController?.status() ?? closedYaziStatus(),
267
+ panes: [...inventory(deps.mux.list()), ...pendingOpens.values()]
268
+ };
269
+ },
270
+ show(target) {
271
+ return show(target, "slash");
272
+ },
273
+ async open(request) {
274
+ const cwd = deps.getCwd();
275
+ if (request.preset !== void 0) {
276
+ const preset = PANES_PRESETS.find((entry) => entry.id === request.preset);
277
+ if (!preset) {
278
+ return { status: "refused", reason: `unknown preset: ${request.preset}` };
279
+ }
280
+ if (preset.id === "yazi") {
281
+ if (!deps.getSettings().panes.yazi.enabled) {
282
+ return { status: "refused", reason: "the files pane is disabled by panes.yazi.enabled" };
283
+ }
284
+ if (!yaziController) {
285
+ return { status: "unavailable", reason: "the files-pane return path is not ready" };
286
+ }
287
+ const pendingId3 = beginPendingOpen(preset.id);
288
+ try {
289
+ const result = await yaziController.open(request.once ? { once: true } : void 0);
290
+ if (result.status === "opened") {
291
+ return { status: "opened", label: preset.id, paneId: result.paneId };
292
+ }
293
+ if (result.status === "missing-binary") {
294
+ return {
295
+ status: "missing-binary",
296
+ preset: preset.id,
297
+ binary: result.binary,
298
+ installHint: preset.installHint,
299
+ detail: result.detail
300
+ };
301
+ }
302
+ return {
303
+ status: result.status === "profile-error" ? "refused" : "unavailable",
304
+ reason: result.reason
305
+ };
306
+ } finally {
307
+ pendingOpens.delete(pendingId3);
308
+ }
309
+ }
310
+ if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
311
+ const binaryPath = probe(preset.binary);
312
+ if (binaryPath === null) {
313
+ return {
314
+ status: "missing-binary",
315
+ preset: preset.id,
316
+ binary: preset.binary,
317
+ installHint: preset.installHint,
318
+ detail: `${preset.binary} was not found (install with \`${preset.installHint}\`)`
319
+ };
320
+ }
321
+ const argv2 = presetArgv(preset.id, binaryPath);
322
+ if (argv2 === null) {
323
+ return { status: "refused", reason: `preset ${preset.id} has nothing to show yet` };
324
+ }
325
+ const pendingId2 = beginPendingOpen(preset.id);
326
+ try {
327
+ const ref = await deps.mux.openUtilityPane({ argv: argv2, cwd, label: preset.id });
328
+ if (ref === null) return { status: "unavailable", reason: `pane host refused to open ${preset.id}` };
329
+ return { status: "opened", label: preset.id, paneId: ref.paneId };
330
+ } finally {
331
+ pendingOpens.delete(pendingId2);
332
+ }
333
+ }
334
+ if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
335
+ const argv = request.argv ?? [];
336
+ if (argv.length === 0) return { status: "refused", reason: "nothing to run" };
337
+ const label = argv[0] ?? "pane";
338
+ const pendingId = beginPendingOpen(label);
339
+ try {
340
+ const ref = await deps.mux.openUtilityPane({ argv, cwd, label });
341
+ if (ref === null) return { status: "unavailable", reason: `pane host refused to open ${label}` };
342
+ return { status: "opened", label, paneId: ref.paneId };
343
+ } finally {
344
+ pendingOpens.delete(pendingId);
345
+ }
346
+ },
347
+ async close(target) {
348
+ if (!deps.mux.available()) return { status: "unavailable", reason: UNAVAILABLE };
349
+ const owned = deps.mux.list();
350
+ if (target === "all") {
351
+ const labels = [];
352
+ for (const record of [...owned]) {
353
+ if (await deps.mux.closePane(record.ref.paneId)) labels.push(record.label);
354
+ }
355
+ return { status: "closed", closed: labels.length, labels };
356
+ }
357
+ const needle = target.trim().toLowerCase();
358
+ const newestFirst = [...owned].reverse();
359
+ const match = newestFirst.find((record) => record.ref.paneId.toLowerCase() === needle) ?? newestFirst.find((record) => record.label.toLowerCase().includes(needle)) ?? newestFirst.find((record) => record.purpose === needle);
360
+ if (!match) return { status: "not-found", target };
361
+ const closed = await deps.mux.closePane(match.ref.paneId);
362
+ return closed ? { status: "closed", closed: 1, labels: [match.label] } : { status: "not-found", target };
363
+ },
364
+ attachYazi(controller) {
365
+ yaziController = controller;
366
+ return () => {
367
+ if (yaziController === controller) yaziController = null;
368
+ };
369
+ },
370
+ attachWatch(controller) {
371
+ watchController = controller;
372
+ return () => {
373
+ if (watchController === controller) watchController = null;
374
+ };
375
+ }
376
+ };
377
+ }
378
+
379
+ // src/interactive/watch-pane.ts
380
+ init_esm_shims();
381
+ import { mkdirSync, renameSync, writeFileSync } from "node:fs";
382
+ import { dirname, join } from "node:path";
383
+ function watchSelectionPath(stateDir = clioStateDir()) {
384
+ return join(stateDir, "watch-selection");
385
+ }
386
+ function atomicWrite(path, content) {
387
+ mkdirSync(dirname(path), { recursive: true });
388
+ const tmp = `${path}.tmp`;
389
+ writeFileSync(tmp, content, "utf8");
390
+ renameSync(tmp, path);
391
+ }
392
+ function createWatchPaneController(deps) {
393
+ const selectionPath = deps.selectionPath ?? watchSelectionPath();
394
+ const dirs = deps.dirs ?? Object.freeze({
395
+ config: clioConfigDir(),
396
+ data: clioDataDir(),
397
+ state: clioStateDir(),
398
+ cache: clioCacheDir()
399
+ });
400
+ const command = deps.command ?? ((path, layout) => watchViewerCommand(path, { dirs: layout }));
401
+ const write = deps.writeFile ?? atomicWrite;
402
+ let paneId = null;
403
+ let disposed = false;
404
+ let adoptionInFlight = null;
405
+ const unsubscribe = deps.mux.onPaneGone((record) => {
406
+ if (record.ref.paneId === paneId) paneId = null;
407
+ });
408
+ const adoptExistingPane = () => {
409
+ if (disposed || paneId !== null) return Promise.resolve(true);
410
+ if (adoptionInFlight !== null) return adoptionInFlight;
411
+ const attempt = Promise.resolve().then(() => deps.mux.adoptPane({ purpose: "watch", label: "watch" })).then((adopted) => {
412
+ if (!disposed && paneId === null && adopted !== null) paneId = adopted.paneId;
413
+ return true;
414
+ }).catch(() => {
415
+ return false;
416
+ }).finally(() => {
417
+ if (adoptionInFlight === attempt) adoptionInFlight = null;
418
+ });
419
+ adoptionInFlight = attempt;
420
+ return attempt;
421
+ };
422
+ const writeSelection = (runId) => {
423
+ try {
424
+ write(selectionPath, `${runId}
425
+ `);
426
+ return true;
427
+ } catch {
428
+ return false;
429
+ }
430
+ };
431
+ void adoptExistingPane();
432
+ return {
433
+ async watch(runId) {
434
+ if (!writeSelection(runId)) {
435
+ return { status: "unavailable", reason: `cannot write the watch selection at ${selectionPath}` };
436
+ }
437
+ if (paneId !== null) return { status: "watching", runId, paneId, opened: false };
438
+ const scanned = await adoptExistingPane();
439
+ if (!scanned) await adoptExistingPane();
440
+ if (paneId !== null) return { status: "watching", runId, paneId, opened: false };
441
+ const opened = await deps.mux.openUtilityPane({
442
+ argv: command(selectionPath, dirs),
443
+ cwd: deps.getCwd(),
444
+ label: "watch",
445
+ title: "clio watch",
446
+ purpose: "watch",
447
+ direction: "right"
448
+ });
449
+ if (opened === null) {
450
+ return { status: "unavailable", reason: "the pane host refused to open the watch pane" };
451
+ }
452
+ paneId = opened.paneId;
453
+ return { status: "watching", runId, paneId, opened: true };
454
+ },
455
+ follow(runId) {
456
+ if (paneId === null) return false;
457
+ return writeSelection(runId);
458
+ },
459
+ isOpen() {
460
+ return paneId !== null;
461
+ },
462
+ dispose() {
463
+ disposed = true;
464
+ unsubscribe();
465
+ }
466
+ };
467
+ }
468
+
469
+ // src/interactive/yazi-bridge.ts
470
+ init_esm_shims();
471
+ import { spawnSync } from "node:child_process";
472
+ import { randomUUID } from "node:crypto";
473
+ import { mkdirSync as mkdirSync2, readFileSync, statSync, writeFileSync as writeFileSync2 } from "node:fs";
474
+ import { isAbsolute, join as join2, relative, resolve } from "node:path";
475
+ var YAZI_PICK_MAX_PATHS = 32;
476
+ var YAZI_PICK_MAX_CHARS = 4096;
477
+ var YAZI_LIVENESS_MS = 5e3;
478
+ function readOptional(path) {
479
+ try {
480
+ return readFileSync(path, "utf8");
481
+ } catch {
482
+ return "";
483
+ }
484
+ }
485
+ async function runYaziTerminalChooser(options) {
486
+ const binaries = (options.resolveBinaries ?? resolveYaziBinaries)();
487
+ if (!binaries.yaziPath) {
488
+ return { status: "missing-binary", binary: "yazi", detail: binaries.missingYaziDetail };
489
+ }
490
+ if (options.profileMode === "managed" && !binaries.yaPath) {
491
+ return {
492
+ status: "missing-binary",
493
+ binary: "ya",
494
+ detail: "the Yazi helper `ya` is not available; install the complete pinned Yazi tool"
495
+ };
496
+ }
497
+ const cacheDir = options.cacheDir ?? clioCacheDir();
498
+ const sessionsDir = join2(cacheDir, "yazi", "sessions");
499
+ mkdirSync2(sessionsDir, { recursive: true });
500
+ const sessionId = options.sessionId ?? randomUUID();
501
+ const chooserPath = join2(sessionsDir, `${sessionId}.chooser`);
502
+ const cwdPath = join2(sessionsDir, `${sessionId}.cwd`);
503
+ const profile = options.profileMode === "managed" ? (options.ensureProfile ?? ensureYaziProfile)({
504
+ yaPath: binaries.yaPath,
505
+ yaziPath: binaries.yaziPath,
506
+ profileDir: yaziProfileDir(cacheDir)
507
+ }) : null;
508
+ if (options.profileMode === "managed" && !profile) {
509
+ return { status: "profile-error", reason: "Clio could not generate a valid managed Yazi profile" };
510
+ }
511
+ writeFileSync2(chooserPath, "");
512
+ writeFileSync2(cwdPath, "");
513
+ const args = [options.cwd, "--chooser-file", chooserPath, "--cwd-file", cwdPath];
514
+ const env = { ...process.env, ...profile ? { YAZI_CONFIG_HOME: profile.dir } : {} };
515
+ let processError;
516
+ options.stopUi();
517
+ try {
518
+ const result = options.spawnYazi ? options.spawnYazi(binaries.yaziPath, args, { cwd: options.cwd, env }) : spawnSync(binaries.yaziPath, args, { cwd: options.cwd, env, stdio: "inherit" });
519
+ processError = result.error;
520
+ } catch (error) {
521
+ processError = error instanceof Error ? error : new Error(String(error));
522
+ } finally {
523
+ options.startUi();
524
+ options.requestRender();
525
+ }
526
+ if (processError) return { status: "unavailable", reason: `yazi chooser failed: ${processError.message}` };
527
+ const paths = readOptional(chooserPath).split("\n").filter((path) => path.length > 0);
528
+ if (paths.length === 0) return { status: "cancelled" };
529
+ return {
530
+ status: "chosen",
531
+ choice: { paths, cwd: readOptional(cwdPath).trim() || options.cwd }
532
+ };
533
+ }
534
+ function containsAsciiWhitespace(value) {
535
+ for (const character of value) {
536
+ const code = character.charCodeAt(0);
537
+ if (code === 32 || code >= 9 && code <= 13) return true;
538
+ }
539
+ return false;
540
+ }
541
+ function relativeWhenInside(path, cwd) {
542
+ const candidate = relative(cwd, path);
543
+ if (candidate.length > 0 && candidate !== ".." && !candidate.startsWith(`..${process.platform === "win32" ? "\\" : "/"}`) && !isAbsolute(candidate)) {
544
+ return candidate;
545
+ }
546
+ return path;
547
+ }
548
+ function draftContains(draft, item) {
549
+ let from = 0;
550
+ while (from <= draft.length) {
551
+ const at = draft.indexOf(item, from);
552
+ if (at < 0) return false;
553
+ const before = at === 0 ? "" : draft[at - 1] ?? "";
554
+ const after = draft[at + item.length] ?? "";
555
+ if ((before === "" || /\s/u.test(before)) && (after === "" || /\s/u.test(after))) return true;
556
+ from = at + item.length;
557
+ }
558
+ return false;
559
+ }
560
+ function pathKind(path) {
561
+ try {
562
+ const stat = statSync(path);
563
+ if (stat.isFile()) return "file";
564
+ if (stat.isDirectory()) return "directory";
565
+ return "other";
566
+ } catch {
567
+ return "other";
568
+ }
569
+ }
570
+ function formatYaziMentions(paths, options) {
571
+ const maxPaths = options.maxPaths ?? YAZI_PICK_MAX_PATHS;
572
+ const maxChars = options.maxChars ?? YAZI_PICK_MAX_CHARS;
573
+ const inspect = options.statPath ?? pathKind;
574
+ const rendered = [];
575
+ const seen = /* @__PURE__ */ new Set();
576
+ let mentions = 0;
577
+ let plainPaths = 0;
578
+ let duplicates = 0;
579
+ let truncated = Math.max(0, paths.length - maxPaths);
580
+ const candidates = paths.slice(0, maxPaths);
581
+ for (const [index, rawPath] of candidates.entries()) {
582
+ const absolute = isAbsolute(rawPath) ? rawPath : resolve(options.cwd, rawPath);
583
+ if (seen.has(absolute)) {
584
+ duplicates += 1;
585
+ continue;
586
+ }
587
+ seen.add(absolute);
588
+ const kind = inspect(absolute);
589
+ let display = relativeWhenInside(absolute, options.cwd);
590
+ if (kind === "directory" && display !== "/" && !display.endsWith("/")) display = `${display}/`;
591
+ const mention = kind === "file" && !containsAsciiWhitespace(display);
592
+ const item = mention ? `@${display}` : `\`${display.replaceAll("`", "\\`")}\``;
593
+ if (draftContains(options.draft, item)) {
594
+ duplicates += 1;
595
+ continue;
596
+ }
597
+ const nextLength = rendered.length === 0 ? item.length : rendered.join(" ").length + 1 + item.length;
598
+ if (nextLength > maxChars) {
599
+ truncated += candidates.length - index;
600
+ break;
601
+ }
602
+ rendered.push(item);
603
+ if (mention) mentions += 1;
604
+ else plainPaths += 1;
605
+ }
606
+ return {
607
+ text: rendered.join(" "),
608
+ inserted: rendered.length,
609
+ mentions,
610
+ plainPaths,
611
+ duplicates,
612
+ truncated
613
+ };
614
+ }
615
+ function appendDraft(draft, addition) {
616
+ if (addition.length === 0) return draft;
617
+ if (draft.length === 0) return addition;
618
+ return `${draft.replace(/\s+$/u, "")} ${addition}`;
619
+ }
620
+ function createYaziBridge(deps) {
621
+ const openSession = deps.openSession ?? createYaziSession;
622
+ let active = null;
623
+ let paneCwd = null;
624
+ let droppedLines = 0;
625
+ let disposed = false;
626
+ let generation = 0;
627
+ let livenessTimer = null;
628
+ let sawLine = false;
629
+ const clearLiveness = () => {
630
+ if (livenessTimer) clearTimeout(livenessTimer);
631
+ livenessTimer = null;
632
+ };
633
+ const insert = (paths, cwd) => {
634
+ const draft = deps.getDraft();
635
+ const batch = formatYaziMentions(paths, { cwd, draft, ...deps.statPath ? { statPath: deps.statPath } : {} });
636
+ if (batch.inserted === 0) {
637
+ if (batch.truncated > 0) {
638
+ deps.notice(
639
+ "warning",
640
+ `${batch.truncated} file-pane path${batch.truncated === 1 ? " was" : "s were"} omitted by the pick limits`
641
+ );
642
+ }
643
+ return;
644
+ }
645
+ deps.setDraft(appendDraft(draft, batch.text));
646
+ deps.requestRender();
647
+ deps.notice(
648
+ "info",
649
+ `${batch.inserted} ${batch.inserted === 1 ? "path" : "paths"} from the file pane added to the draft`
650
+ );
651
+ if (batch.plainPaths > 0) {
652
+ deps.notice(
653
+ "info",
654
+ `${batch.plainPaths} ${batch.plainPaths === 1 ? "path was" : "paths were"} inserted as plain text because directories and spaced paths cannot be file mentions`
655
+ );
656
+ }
657
+ if (batch.truncated > 0) {
658
+ deps.notice(
659
+ "warning",
660
+ `${batch.truncated} file-pane path${batch.truncated === 1 ? " was" : "s were"} omitted by the pick limits`
661
+ );
662
+ }
663
+ };
664
+ const start = async (mode, profileMode) => {
665
+ const mux = deps.mux;
666
+ if (!mux?.available()) return { status: "unavailable", reason: "the pane layer is not available" };
667
+ generation += 1;
668
+ const ownGeneration = generation;
669
+ const token = (deps.pickToken ?? randomUUID)();
670
+ sawLine = false;
671
+ paneCwd = deps.getCwd();
672
+ const result = await openSession({
673
+ mux,
674
+ mode,
675
+ profileMode,
676
+ cwd: deps.getCwd(),
677
+ pickToken: token,
678
+ onEvent: (event) => {
679
+ if (disposed || ownGeneration !== generation) return;
680
+ sawLine = true;
681
+ if (event.kind === "cd") {
682
+ paneCwd = event.cwd;
683
+ return;
684
+ }
685
+ if (event.values[0] !== token) {
686
+ droppedLines += 1;
687
+ return;
688
+ }
689
+ insert(event.values.slice(1), paneCwd ?? deps.getCwd());
690
+ },
691
+ onChooser: (choice) => {
692
+ if (disposed || ownGeneration !== generation) return;
693
+ paneCwd = choice.cwd;
694
+ if (choice.paths.length > 0) insert(choice.paths, choice.cwd);
695
+ },
696
+ onStopped: () => {
697
+ if (ownGeneration !== generation) return;
698
+ clearLiveness();
699
+ active = null;
700
+ }
701
+ });
702
+ if (result.status !== "opened") return result;
703
+ if (disposed || ownGeneration !== generation) {
704
+ await result.session.close();
705
+ return { status: "unavailable", reason: "the file pane was closed while it was opening" };
706
+ }
707
+ active = result.session;
708
+ if (mode === "companion") {
709
+ livenessTimer = setTimeout(() => {
710
+ if (disposed || ownGeneration !== generation || sawLine || active === null) return;
711
+ const stale = active;
712
+ active = null;
713
+ deps.notice("warning", "the file-pane event stream did not start; reopening yazi in chooser mode");
714
+ void stale.close().finally(() => {
715
+ if (!disposed && ownGeneration === generation) void start("chooser", profileMode);
716
+ });
717
+ }, deps.livenessMs ?? YAZI_LIVENESS_MS);
718
+ livenessTimer.unref();
719
+ }
720
+ return { status: "opened", mode, paneId: result.session.pane.paneId, existing: false };
721
+ };
722
+ return {
723
+ async open(options = {}) {
724
+ if (disposed) return { status: "unavailable", reason: "the file-pane bridge is closed" };
725
+ const settings = deps.getSettings?.() ?? { mode: "companion", profile: "managed", followCwd: true };
726
+ if (active) {
727
+ if (settings.followCwd) {
728
+ const cwd = deps.getCwd();
729
+ if (await active.pushCwd(cwd)) paneCwd = cwd;
730
+ }
731
+ return { status: "opened", mode: active.mode, paneId: active.pane.paneId, existing: true };
732
+ }
733
+ const mode = options.once || settings.profile === "user" ? "chooser" : settings.mode;
734
+ if (!deps.mux?.available()) {
735
+ const result = await (deps.runTerminalChooser ?? ((choiceOptions) => runYaziTerminalChooser({
736
+ ...choiceOptions,
737
+ stopUi: deps.stopUi ?? (() => {
738
+ }),
739
+ startUi: deps.startUi ?? (() => {
740
+ }),
741
+ requestRender: deps.requestRender
742
+ })))({ cwd: deps.getCwd(), profileMode: settings.profile });
743
+ if (result.status === "chosen") {
744
+ paneCwd = result.choice.cwd;
745
+ insert(result.choice.paths, result.choice.cwd);
746
+ }
747
+ if (result.status === "chosen" || result.status === "cancelled") {
748
+ return { status: "opened", mode: "chooser", paneId: null, existing: false };
749
+ }
750
+ return result;
751
+ }
752
+ return await start(mode, settings.profile);
753
+ },
754
+ status() {
755
+ const snapshot = active?.snapshot();
756
+ return {
757
+ mode: active?.mode ?? "closed",
758
+ paneId: active?.pane.paneId ?? null,
759
+ paneCwd: paneCwd ?? snapshot?.paneCwd ?? null,
760
+ lastLineAt: snapshot?.lastLineAt ?? null,
761
+ droppedLines
762
+ };
763
+ },
764
+ dispose() {
765
+ if (disposed) return;
766
+ disposed = true;
767
+ generation += 1;
768
+ clearLiveness();
769
+ const closing = active;
770
+ active = null;
771
+ if (closing) void closing.close();
772
+ }
773
+ };
774
+ }
775
+ export {
776
+ createMuxBridge,
777
+ createMuxDomainModule,
778
+ createPanesRuntime,
779
+ createWatchPaneController,
780
+ createYaziBridge
781
+ };
782
+ //# sourceMappingURL=with-panes-MKB46MPQ.js.map