@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
@@ -1,15 +1,15 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
- import {
3
- createTomlFileReader,
4
- tomlTableAt
5
- } from "./chunk-LCGCVYZ4.js";
6
2
  import {
7
3
  loadFragments,
8
4
  renderCodewikiDigest
9
- } from "./chunk-47CMYGET.js";
5
+ } from "./chunk-VAZSBTKF.js";
10
6
  import {
11
7
  loadMemoryRecordsSync
12
- } from "./chunk-5T7RBWN2.js";
8
+ } from "./chunk-AB44T6BB.js";
9
+ import {
10
+ createTomlFileReader,
11
+ tomlTableAt
12
+ } from "./chunk-LCGCVYZ4.js";
13
13
  import {
14
14
  WIKI_INDEX,
15
15
  WIKI_PLAN_FILE,
@@ -68,20 +68,20 @@ import {
68
68
  } from "./chunk-33YXPOE3.js";
69
69
  import {
70
70
  ceilChars
71
- } from "./chunk-AEYBF3TB.js";
71
+ } from "./chunk-UM7N4G5A.js";
72
+ import {
73
+ BusChannels
74
+ } from "./chunk-HLW2MRKE.js";
72
75
  import {
73
76
  INTEROP_AGENT_KINDS
74
77
  } from "./chunk-IHXBNWMM.js";
75
- import {
76
- BusChannels
77
- } from "./chunk-RKRLDWD3.js";
78
78
  import {
79
79
  require_dist
80
80
  } from "./chunk-APJ265NV.js";
81
81
  import {
82
82
  clioDataDir,
83
83
  resolveClioDirs
84
- } from "./chunk-BNAZZHFG.js";
84
+ } from "./chunk-BYP5D4HI.js";
85
85
  import {
86
86
  __toESM,
87
87
  init_esm_shims
@@ -4101,4 +4101,4 @@ export {
4101
4101
  buildWikiPlanPrompt,
4102
4102
  buildWikiPagePrompt
4103
4103
  };
4104
- //# sourceMappingURL=chunk-HJB5IUKP.js.map
4104
+ //# sourceMappingURL=chunk-I5VEOC6I.js.map
@@ -0,0 +1,564 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ truncateToWidth
4
+ } from "./chunk-NYS75XW5.js";
5
+ import {
6
+ openLedger,
7
+ readFleetRun
8
+ } from "./chunk-BUMFYQFY.js";
9
+ import {
10
+ formatTrustSummaryLine,
11
+ inspectRunReceiptTrustStatus
12
+ } from "./chunk-B7OBL7PK.js";
13
+ import {
14
+ WRITE_BOUNDARY_VIOLATION_REASON
15
+ } from "./chunk-U77AMWDL.js";
16
+ import {
17
+ readRunEventJournal,
18
+ runEventJournalPath
19
+ } from "./chunk-IQ7KR472.js";
20
+ import {
21
+ sanitizeCallTargetText
22
+ } from "./chunk-TVHHYFHE.js";
23
+ import {
24
+ clioStateDir,
25
+ resetXdgCache
26
+ } from "./chunk-BYP5D4HI.js";
27
+ import {
28
+ init_esm_shims
29
+ } from "./chunk-3R73A4XB.js";
30
+
31
+ // src/cli/fleet-view.ts
32
+ init_esm_shims();
33
+ import { readdirSync, readFileSync } from "node:fs";
34
+ import { join } from "node:path";
35
+ var HELP = `clio-coder fleet view <runId|fleetRootId> [--follow]
36
+ clio-coder fleet view --watch <selection-file>
37
+
38
+ Follow one dispatched run from its durable state: the run ledger entry, the
39
+ run event journal, and the sealed receipt once it exists.
40
+
41
+ --follow keep tailing until the run's terminal line, then stay open (q exits)
42
+ --watch follow whichever run id the selection file names, retargeting
43
+ live as the file changes (q exits). This is the process the
44
+ interactive workers view (Alt+W) runs inside its watch pane.
45
+
46
+ Without --follow the current snapshot is printed and the command exits.
47
+ The transcript comes from <state>/runs/<runId>/events.ndjson, which the
48
+ orchestrator writes when panes.journal is on (the default). A run dispatched
49
+ with the journal off shows its ledger and receipt but no transcript.
50
+
51
+ Given the fleet root id that \`fleet run\` prints (fleet-<hex>), this prints the
52
+ run's step index instead: one line per step with its run id and outcome. Pass
53
+ one of those run ids back to see that step.
54
+ `;
55
+ var POLL_MS = 250;
56
+ var TRANSCRIPT_LIMIT = 400;
57
+ var TASK_MAX_WIDTH = 400;
58
+ var DETAIL_MAX_WIDTH = 200;
59
+ var DEFAULT_WIDTH = 100;
60
+ var MIN_WIDTH = 40;
61
+ var QUIT_CTRL_C = String.fromCharCode(3);
62
+ var QUIT_ESCAPE = String.fromCharCode(27);
63
+ function sanitizeBounded(value, maxWidth) {
64
+ const sanitized = sanitizeCallTargetText(value);
65
+ if (sanitized.length === 0) return "";
66
+ return sanitizeCallTargetText(truncateToWidth(sanitized, maxWidth, "\u2026", false));
67
+ }
68
+ function receiptPathFor(run) {
69
+ return run.receiptPath ?? join(clioStateDir(), "receipts", `${run.id}.json`);
70
+ }
71
+ function evidenceLine(run) {
72
+ if (run.receiptPath === null && run.endedAt === null) {
73
+ return { text: "receipt pending; the run has not finalized", receiptPath: null };
74
+ }
75
+ const path = receiptPathFor(run);
76
+ let receipt;
77
+ try {
78
+ receipt = JSON.parse(readFileSync(path, "utf8"));
79
+ } catch (error) {
80
+ return {
81
+ text: `receipt unavailable: cannot read ${path} (${error instanceof Error ? error.message : String(error)})`,
82
+ receiptPath: null
83
+ };
84
+ }
85
+ const inspection = inspectRunReceiptTrustStatus(receipt, run);
86
+ if (!inspection.integrity.ok) {
87
+ return {
88
+ text: `RECEIPT INTEGRITY FAILED: ${inspection.integrity.reason}; stored receipt fields are untrusted`,
89
+ receiptPath: path
90
+ };
91
+ }
92
+ return { text: formatTrustSummaryLine(inspection.status), receiptPath: path };
93
+ }
94
+ function transcriptLine(line) {
95
+ switch (line.kind) {
96
+ case "open":
97
+ return { at: line.at, label: `run opened (${sanitizeBounded(line.agentId, 64)})`, detail: void 0 };
98
+ case "event":
99
+ return {
100
+ at: line.at,
101
+ label: sanitizeBounded(line.type, 64),
102
+ detail: line.detail === void 0 ? void 0 : sanitizeBounded(line.detail, DETAIL_MAX_WIDTH)
103
+ };
104
+ case "journal_truncated":
105
+ return { at: line.at, label: "journal truncated", detail: sanitizeBounded(line.reason, 64) };
106
+ case "receipt":
107
+ return {
108
+ at: line.at,
109
+ label: `receipt sealed (${sanitizeBounded(line.outcome, 32)})`,
110
+ detail: line.digest === void 0 ? void 0 : `sha256:${sanitizeBounded(line.digest, 64)}`
111
+ };
112
+ case "terminal":
113
+ return {
114
+ at: line.at,
115
+ label: `terminal (${sanitizeBounded(line.outcome, 32)})`,
116
+ detail: line.detail === void 0 ? void 0 : sanitizeBounded(line.detail, DETAIL_MAX_WIDTH)
117
+ };
118
+ default:
119
+ return null;
120
+ }
121
+ }
122
+ function resolveRunId(runId) {
123
+ const ledger = openLedger();
124
+ if (ledger.get(runId) !== null) return { runId };
125
+ const candidates = ledger.list().filter((run) => run.id.startsWith(runId)).map((run) => run.id);
126
+ if (candidates.length === 1 && candidates[0] !== void 0) return { runId: candidates[0] };
127
+ return { candidates };
128
+ }
129
+ function loadRunViewModel(runId, options = {}) {
130
+ const run = openLedger().get(runId);
131
+ if (run === null) return null;
132
+ const now = options.now ?? (() => Date.now());
133
+ const journal = readRunEventJournal(runId, {
134
+ maxLines: TRANSCRIPT_LIMIT,
135
+ ...options.journalRoot === void 0 ? {} : { root: options.journalRoot }
136
+ });
137
+ const transcript = [];
138
+ for (const line of journal.lines) {
139
+ const rendered = transcriptLine(line);
140
+ if (rendered !== null) transcript.push(rendered);
141
+ }
142
+ const evidence = evidenceLine(run);
143
+ const startedMs = Date.parse(run.startedAt);
144
+ const endedMs = run.endedAt === null ? now() : Date.parse(run.endedAt);
145
+ const task = sanitizeBounded(run.task, TASK_MAX_WIDTH);
146
+ return {
147
+ runId: run.id,
148
+ agentId: run.agentId,
149
+ model: run.wireModelId,
150
+ target: run.targetId,
151
+ node: run.node?.id ?? "local",
152
+ phase: run.outcome ?? run.status,
153
+ startedAt: run.startedAt,
154
+ elapsedMs: Number.isFinite(startedMs) && Number.isFinite(endedMs) ? Math.max(0, endedMs - startedMs) : 0,
155
+ task: task.length > 0 ? task : void 0,
156
+ transcript,
157
+ transcriptTruncated: journal.truncated,
158
+ journalPresent: journal.present,
159
+ journalPath: runEventJournalPath(runId, options.journalRoot === void 0 ? void 0 : options.journalRoot),
160
+ evidence: evidence.text,
161
+ receiptPath: evidence.receiptPath,
162
+ outcome: journal.terminal?.outcome ?? run.outcome ?? null,
163
+ outcomeDetail: journal.terminal?.detail ?? run.outcomeDetail ?? null,
164
+ terminal: journal.terminal !== null || run.endedAt !== null
165
+ };
166
+ }
167
+ function formatElapsed(ms) {
168
+ const seconds = Math.floor(ms / 1e3);
169
+ if (seconds < 60) return `${seconds}s`;
170
+ const minutes = Math.floor(seconds / 60);
171
+ if (minutes < 60) return `${minutes}m${String(seconds % 60).padStart(2, "0")}s`;
172
+ return `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, "0")}m`;
173
+ }
174
+ function clockOf(iso) {
175
+ const time = iso.slice(11, 19);
176
+ return time.length === 8 ? time : iso.slice(0, 8);
177
+ }
178
+ function renderRunView(model, width = DEFAULT_WIDTH) {
179
+ const columns = Math.max(MIN_WIDTH, width);
180
+ const rule = "\u2500".repeat(columns);
181
+ const lines = [];
182
+ lines.push(truncateToWidth(`run ${model.runId} ${model.agentId}`, columns, "\u2026", false));
183
+ lines.push(
184
+ truncateToWidth(
185
+ `model ${model.model} target ${model.target} node ${model.node} phase ${model.phase} elapsed ${formatElapsed(model.elapsedMs)}`,
186
+ columns,
187
+ "\u2026",
188
+ false
189
+ )
190
+ );
191
+ if (model.task !== void 0) {
192
+ lines.push(truncateToWidth(`task ${model.task}`, columns, "\u2026", false));
193
+ }
194
+ lines.push(rule);
195
+ if (!model.journalPresent) {
196
+ lines.push("no event journal for this run.");
197
+ lines.push(`expected ${model.journalPath} (panes.journal may have been off when it ran)`);
198
+ } else if (model.transcript.length === 0) {
199
+ lines.push("journal is empty; no events recorded yet.");
200
+ } else {
201
+ if (model.transcriptTruncated) lines.push("\u2026 earlier events dropped (journal truncated)");
202
+ for (const entry of model.transcript) {
203
+ const head = `${clockOf(entry.at)} ${entry.label}`;
204
+ lines.push(truncateToWidth(entry.detail === void 0 ? head : `${head}: ${entry.detail}`, columns, "\u2026", false));
205
+ }
206
+ }
207
+ lines.push(rule);
208
+ lines.push(truncateToWidth(`evidence ${model.evidence}`, columns, "\u2026", false));
209
+ if (model.receiptPath !== null) {
210
+ lines.push(truncateToWidth(`receipt ${model.receiptPath}`, columns, "\u2026", false));
211
+ }
212
+ const outcome = model.outcome === null ? model.terminal ? "terminal, outcome not recorded" : "running" : model.outcomeDetail === null || model.outcomeDetail.length === 0 ? model.outcome : `${model.outcome} (${sanitizeBounded(model.outcomeDetail, DETAIL_MAX_WIDTH)})`;
213
+ lines.push(truncateToWidth(`outcome ${outcome}`, columns, "\u2026", false));
214
+ return lines;
215
+ }
216
+ function renderWatchView(runId, model, width = DEFAULT_WIDTH, ledgerRoot = clioStateDir()) {
217
+ const columns = Math.max(MIN_WIDTH, width);
218
+ if (runId === null) {
219
+ return [
220
+ "no worker selected.",
221
+ "",
222
+ "In clio-coder, open the workers view (Alt+W), pick a run, press Enter.",
223
+ "Arrow keys there retarget this pane live."
224
+ ];
225
+ }
226
+ if (model === null) {
227
+ const missing = `run ${sanitizeBounded(runId, 64)} is not in the run ledger under ${ledgerRoot}.`;
228
+ const wrappedMissing = [];
229
+ for (let offset = 0; offset < missing.length; offset += columns) {
230
+ wrappedMissing.push(missing.slice(offset, offset + columns));
231
+ }
232
+ return [
233
+ ...wrappedMissing,
234
+ "",
235
+ "If this run is queued, it has not started yet; this view will update when its ledger entry appears.",
236
+ "If it already started or finished, it was not found in this ledger."
237
+ ];
238
+ }
239
+ return renderRunView(model, columns);
240
+ }
241
+ var FLEET_ROOT_PREFIX = "fleet-";
242
+ var STEP_ID_MAX_WIDTH = 32;
243
+ function fleetRunsDir() {
244
+ return join(clioStateDir(), "fleet-runs");
245
+ }
246
+ function resolveFleetRootId(token) {
247
+ if (readFleetRun(token) !== null) return { rootId: token };
248
+ let entries;
249
+ try {
250
+ entries = readdirSync(fleetRunsDir());
251
+ } catch {
252
+ return { candidates: [] };
253
+ }
254
+ const candidates = entries.filter((name) => name.endsWith(".json")).map((name) => name.slice(0, -".json".length)).filter((id) => id.startsWith(token));
255
+ if (candidates.length === 1 && candidates[0] !== void 0) return { rootId: candidates[0] };
256
+ return { candidates };
257
+ }
258
+ function stepResultOf(value) {
259
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : {};
260
+ }
261
+ function loadFleetRunViewModel(rootId, options = {}) {
262
+ const record = readFleetRun(rootId);
263
+ if (record === null) return null;
264
+ const ledger = openLedger();
265
+ const now = options.now ?? (() => Date.now());
266
+ const settled = /* @__PURE__ */ new Map();
267
+ for (const entry of record.steps ?? []) {
268
+ if (typeof entry?.stepId === "string") settled.set(entry.stepId, stepResultOf(entry.result));
269
+ }
270
+ const stepIds = record.stepIds?.length > 0 ? record.stepIds : [...settled.keys()];
271
+ const steps = stepIds.map((stepId) => {
272
+ const result = settled.get(stepId);
273
+ const runId = typeof result?.terminalRunId === "string" ? result.terminalRunId : null;
274
+ if (result === void 0 || runId === null) {
275
+ return { stepId, runId: null, agentId: null, outcome: "not run", detail: void 0 };
276
+ }
277
+ const envelope = ledger.get(runId);
278
+ const outcome = envelope?.outcome ?? (result.succeeded === true ? "succeeded" : "failed");
279
+ const detail = result.boundaryViolated === true ? WRITE_BOUNDARY_VIOLATION_REASON : result.failureReason;
280
+ return {
281
+ stepId,
282
+ runId,
283
+ agentId: envelope?.agentId ?? null,
284
+ outcome,
285
+ detail: typeof detail === "string" && detail.length > 0 ? detail : void 0
286
+ };
287
+ });
288
+ const startedMs = Date.parse(record.startedAt);
289
+ const endedMs = record.endedAt === null ? now() : Date.parse(record.endedAt);
290
+ return {
291
+ rootId: record.id,
292
+ fleet: record.fleet,
293
+ startedAt: record.startedAt,
294
+ elapsedMs: Number.isFinite(startedMs) && Number.isFinite(endedMs) ? Math.max(0, endedMs - startedMs) : 0,
295
+ running: record.endedAt === null,
296
+ resumedFrom: record.resumedFrom,
297
+ plannedSteps: stepIds.length,
298
+ recordedSteps: settled.size,
299
+ steps
300
+ };
301
+ }
302
+ function renderFleetRunView(model, width = DEFAULT_WIDTH) {
303
+ const columns = Math.max(MIN_WIDTH, width);
304
+ const rule = "\u2500".repeat(columns);
305
+ const lines = [];
306
+ lines.push(truncateToWidth(`fleet ${sanitizeBounded(model.fleet, 64)} root ${model.rootId}`, columns, "\u2026", false));
307
+ const resumed = model.resumedFrom === null ? "" : ` resumed from ${sanitizeBounded(model.resumedFrom, 64)}`;
308
+ lines.push(
309
+ truncateToWidth(
310
+ `started ${model.startedAt} elapsed ${formatElapsed(model.elapsedMs)} ${model.recordedSteps} of ${model.plannedSteps} steps recorded${model.running ? " (running)" : ""}${resumed}`,
311
+ columns,
312
+ "\u2026",
313
+ false
314
+ )
315
+ );
316
+ lines.push(rule);
317
+ if (model.steps.length === 0) {
318
+ lines.push("no steps recorded for this fleet run.");
319
+ } else {
320
+ const rows = model.steps.map((step) => ({
321
+ step: sanitizeBounded(step.stepId, STEP_ID_MAX_WIDTH),
322
+ runId: step.runId ?? "-",
323
+ outcome: sanitizeBounded(step.outcome, 32),
324
+ tail: [step.agentId, step.detail].filter((part) => part !== null && part !== void 0).join(": ")
325
+ }));
326
+ const stepWidth = Math.max(...rows.map((row) => row.step.length));
327
+ const runWidth = Math.max(...rows.map((row) => row.runId.length));
328
+ const outcomeWidth = Math.max(...rows.map((row) => row.outcome.length));
329
+ for (const row of rows) {
330
+ const head = `${row.step.padEnd(stepWidth)} ${row.runId.padEnd(runWidth)} ${row.outcome.padEnd(outcomeWidth)}`;
331
+ const text = row.tail.length === 0 ? head : `${head} ${sanitizeBounded(row.tail, DETAIL_MAX_WIDTH)}`;
332
+ lines.push(truncateToWidth(text.trimEnd(), columns, "\u2026", false));
333
+ }
334
+ }
335
+ lines.push(rule);
336
+ lines.push("clio-coder fleet view <run id> for one step's transcript, receipt, and ledger entry");
337
+ return lines;
338
+ }
339
+ function fail(message) {
340
+ process.stderr.write(`clio-coder fleet view: ${message}
341
+ `);
342
+ return 2;
343
+ }
344
+ function parseViewArgs(args) {
345
+ const parsed = { follow: false, help: false };
346
+ for (let i = 0; i < args.length; i += 1) {
347
+ const arg = args[i];
348
+ if (arg === void 0) continue;
349
+ if (arg === "--follow" || arg === "-f") {
350
+ parsed.follow = true;
351
+ continue;
352
+ }
353
+ if (arg === "--watch") {
354
+ const value = args[i + 1];
355
+ if (value === void 0 || value.startsWith("-")) return "--watch requires a selection-file path";
356
+ parsed.watchPath = value;
357
+ i += 1;
358
+ continue;
359
+ }
360
+ const dirRole = arg === "--config-dir" ? "config" : arg === "--data-dir" ? "data" : arg === "--state-dir" ? "state" : arg === "--cache-dir" ? "cache" : null;
361
+ if (dirRole !== null) {
362
+ const value = args[i + 1];
363
+ if (value === void 0 || value.startsWith("-")) return `${arg} requires a directory path`;
364
+ parsed.dirs ??= {};
365
+ parsed.dirs[dirRole] = value;
366
+ i += 1;
367
+ continue;
368
+ }
369
+ if (arg === "--help" || arg === "-h") {
370
+ parsed.help = true;
371
+ continue;
372
+ }
373
+ if (arg.startsWith("-")) return `unknown flag: ${arg}`;
374
+ if (parsed.runId !== void 0) return `unexpected argument: ${arg}`;
375
+ parsed.runId = arg;
376
+ }
377
+ if (parsed.watchPath !== void 0 && parsed.runId !== void 0) {
378
+ return "--watch follows the selection file; it does not take a run id";
379
+ }
380
+ if (parsed.watchPath !== void 0 && parsed.follow) {
381
+ return "--watch already follows; drop --follow";
382
+ }
383
+ return parsed;
384
+ }
385
+ function applyViewDirs(dirs) {
386
+ if (dirs === void 0) return;
387
+ if (dirs.config !== void 0) process.env.CLIO_CODER_CONFIG_DIR = dirs.config;
388
+ if (dirs.data !== void 0) process.env.CLIO_CODER_DATA_DIR = dirs.data;
389
+ if (dirs.state !== void 0) process.env.CLIO_CODER_STATE_DIR = dirs.state;
390
+ if (dirs.cache !== void 0) process.env.CLIO_CODER_CACHE_DIR = dirs.cache;
391
+ resetXdgCache();
392
+ }
393
+ function readWatchSelection(path) {
394
+ let raw;
395
+ try {
396
+ raw = readFileSync(path, "utf8");
397
+ } catch {
398
+ return null;
399
+ }
400
+ const line = raw.split("\n", 1)[0]?.trim() ?? "";
401
+ return line.length > 0 && line.length <= 128 ? line : null;
402
+ }
403
+ function terminalWidth() {
404
+ const columns = process.stdout.columns;
405
+ return typeof columns === "number" && columns >= MIN_WIDTH ? columns : DEFAULT_WIDTH;
406
+ }
407
+ async function runFleetView(args) {
408
+ const parsed = parseViewArgs(args);
409
+ if (typeof parsed === "string") {
410
+ process.stderr.write(`clio-coder fleet view: ${parsed}
411
+ `);
412
+ process.stdout.write(HELP);
413
+ return 2;
414
+ }
415
+ if (parsed.help) {
416
+ process.stdout.write(HELP);
417
+ return 0;
418
+ }
419
+ applyViewDirs(parsed.dirs);
420
+ if (parsed.watchPath !== void 0) {
421
+ if (process.stdout.isTTY !== true || process.stdin.isTTY !== true) {
422
+ const selected = readWatchSelection(parsed.watchPath);
423
+ const model = selected === null ? null : loadRunViewModel(selected);
424
+ process.stdout.write(`${renderWatchView(selected, model, terminalWidth()).join("\n")}
425
+ `);
426
+ return 0;
427
+ }
428
+ return watchSelection(parsed.watchPath);
429
+ }
430
+ if (parsed.runId === void 0) {
431
+ process.stderr.write(HELP);
432
+ return 2;
433
+ }
434
+ if (parsed.runId.startsWith(FLEET_ROOT_PREFIX)) {
435
+ const root = resolveFleetRootId(parsed.runId);
436
+ if (!("rootId" in root)) {
437
+ return root.candidates.length === 0 ? fail(`unknown fleet run '${parsed.runId}' (no record under ${fleetRunsDir()})`) : fail(`fleet root id '${parsed.runId}' is ambiguous: ${root.candidates.slice(0, 8).join(", ")}`);
438
+ }
439
+ const fleetModel = loadFleetRunViewModel(root.rootId);
440
+ if (fleetModel === null) return fail(`unknown fleet run '${root.rootId}'`);
441
+ if (parsed.follow) {
442
+ process.stderr.write("clio-coder fleet view: --follow applies to a run id, not a fleet root; printing the index\n");
443
+ }
444
+ process.stdout.write(`${renderFleetRunView(fleetModel, terminalWidth()).join("\n")}
445
+ `);
446
+ return 0;
447
+ }
448
+ const resolved = resolveRunId(parsed.runId);
449
+ if (!("runId" in resolved)) {
450
+ return resolved.candidates.length === 0 ? fail(`unknown run '${parsed.runId}' (not in the run ledger under ${clioStateDir()})`) : fail(`run id '${parsed.runId}' is ambiguous: ${resolved.candidates.slice(0, 8).join(", ")}`);
451
+ }
452
+ const runId = resolved.runId;
453
+ const snapshot = loadRunViewModel(runId);
454
+ if (snapshot === null) return fail(`unknown run '${runId}'`);
455
+ if (!parsed.follow || process.stdout.isTTY !== true || process.stdin.isTTY !== true) {
456
+ if (parsed.follow) {
457
+ process.stderr.write("clio-coder fleet view: --follow needs an interactive terminal; printing a snapshot\n");
458
+ }
459
+ process.stdout.write(`${renderRunView(snapshot, terminalWidth()).join("\n")}
460
+ `);
461
+ return 0;
462
+ }
463
+ return followRun(runId);
464
+ }
465
+ async function watchSelection(selectionPath) {
466
+ const { ProcessTerminal, TuiAltScreen } = await import("./tui-primitives-2AKXQNZK.js");
467
+ const terminal = new ProcessTerminal();
468
+ const tui = new TuiAltScreen(terminal);
469
+ let selected = readWatchSelection(selectionPath);
470
+ let model = selected === null ? null : loadRunViewModel(selected);
471
+ const view = {
472
+ render(width) {
473
+ const lines = renderWatchView(selected, model, width);
474
+ lines.push("");
475
+ lines.push("watching the workers-view selection\u2026 q to quit");
476
+ return lines;
477
+ },
478
+ invalidate() {
479
+ }
480
+ };
481
+ tui.addChild(view);
482
+ return await new Promise((resolve) => {
483
+ let settled = false;
484
+ const timer = setInterval(() => {
485
+ selected = readWatchSelection(selectionPath);
486
+ model = selected === null ? null : loadRunViewModel(selected);
487
+ tui.requestRender();
488
+ }, POLL_MS);
489
+ const finish = () => {
490
+ if (settled) return;
491
+ settled = true;
492
+ clearInterval(timer);
493
+ removeInput();
494
+ tui.stop();
495
+ resolve(0);
496
+ };
497
+ const removeInput = tui.addInputListener((data) => {
498
+ if (data === "q" || data === QUIT_CTRL_C || data === QUIT_ESCAPE) {
499
+ finish();
500
+ return { consume: true };
501
+ }
502
+ return void 0;
503
+ });
504
+ tui.start();
505
+ tui.requestRender();
506
+ });
507
+ }
508
+ async function followRun(runId) {
509
+ const { ProcessTerminal, TuiAltScreen } = await import("./tui-primitives-2AKXQNZK.js");
510
+ const terminal = new ProcessTerminal();
511
+ const tui = new TuiAltScreen(terminal);
512
+ let model = loadRunViewModel(runId);
513
+ let following = true;
514
+ const view = {
515
+ render(width) {
516
+ if (model === null) return [`run ${runId} left the ledger.`];
517
+ const lines = renderRunView(model, width);
518
+ lines.push("");
519
+ lines.push(following ? "following\u2026 q to quit" : "run finished. q to quit");
520
+ return lines;
521
+ },
522
+ invalidate() {
523
+ }
524
+ };
525
+ tui.addChild(view);
526
+ return await new Promise((resolve) => {
527
+ let settled = false;
528
+ const timer = setInterval(() => {
529
+ model = loadRunViewModel(runId);
530
+ if (model?.terminal === true) following = false;
531
+ tui.requestRender();
532
+ }, POLL_MS);
533
+ const finish = () => {
534
+ if (settled) return;
535
+ settled = true;
536
+ clearInterval(timer);
537
+ removeInput();
538
+ tui.stop();
539
+ resolve(0);
540
+ };
541
+ const removeInput = tui.addInputListener((data) => {
542
+ if (data === "q" || data === QUIT_CTRL_C || data === QUIT_ESCAPE) {
543
+ finish();
544
+ return { consume: true };
545
+ }
546
+ return void 0;
547
+ });
548
+ tui.start();
549
+ tui.requestRender();
550
+ });
551
+ }
552
+
553
+ export {
554
+ resolveRunId,
555
+ loadRunViewModel,
556
+ renderRunView,
557
+ renderWatchView,
558
+ resolveFleetRootId,
559
+ loadFleetRunViewModel,
560
+ renderFleetRunView,
561
+ readWatchSelection,
562
+ runFleetView
563
+ };
564
+ //# sourceMappingURL=chunk-IBEBSCYA.js.map