@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
@@ -19,6 +19,8 @@ import {
19
19
  listKnownModelsForRuntime,
20
20
  listProviderSupportEntries,
21
21
  type ProviderSupportEntry,
22
+ readTargetModelSnapshot,
23
+ recordTargetModelSnapshot,
22
24
  resolveRuntimeAuthTarget,
23
25
  supportGroupLabel,
24
26
  } from "../domains/providers/index.js";
@@ -103,6 +105,7 @@ const DEFAULT_PORTS: Record<string, number> = {
103
105
  lemonade: 8000,
104
106
  "anthropic-compat": 8000,
105
107
  "openai-compat": 8000,
108
+ litellm: 4000,
106
109
  };
107
110
 
108
111
  interface ParsedArgs {
@@ -317,7 +320,9 @@ function printRuntimeList(includeHidden: boolean): void {
317
320
  : runtime?.auth === "api-key"
318
321
  ? status?.available
319
322
  ? "credential"
320
- : "needs-key"
323
+ : targetRequiresAuth({ id: entry.runtimeId, runtime: entry.runtimeId }, runtime)
324
+ ? "needs-key"
325
+ : "key-optional"
321
326
  : (runtime?.auth ?? "none");
322
327
  rows.push({
323
328
  group: supportGroupLabel(entry.group),
@@ -387,8 +392,8 @@ function catalogContextWindowFor(runtime: RuntimeDescriptor, modelId: string): n
387
392
  /**
388
393
  * Check the resolved model against the catalog where there is one and against
389
394
  * the target's own list where there is not. A runtime with no catalog used to
390
- * pass any string here while the same command wrote the live list that ruled
391
- * it out into `wireModels`, so the target saved as `ok` and failed on its first
395
+ * pass any string here while the same command had a live list that ruled it
396
+ * out, so the target saved as `ok` and failed on its first
392
397
  * turn. Without a catalog or a live list there is nothing to check against, and
393
398
  * the note says so rather than implying the id was verified.
394
399
  */
@@ -617,7 +622,6 @@ function buildDescriptor(
617
622
  parts: {
618
623
  url?: string;
619
624
  model?: string;
620
- wireModels?: string[];
621
625
  apiKeyEnv?: string;
622
626
  apiKeyRef?: string;
623
627
  oauthProfile?: string;
@@ -631,19 +635,12 @@ function buildDescriptor(
631
635
  ): TargetDescriptor {
632
636
  const descriptor: TargetDescriptor = { id, runtime: runtime.id };
633
637
  if (parts.url) descriptor.url = parts.url;
634
- const wireModels =
635
- parts.wireModels?.filter((value, index, all) => value.trim().length > 0 && all.indexOf(value) === index) ?? [];
636
638
  if (parts.model) descriptor.defaultModel = parts.model;
637
- else {
638
- const firstWireModel = wireModels[0];
639
- if (firstWireModel) descriptor.defaultModel = firstWireModel;
640
- }
641
639
  const auth: NonNullable<TargetDescriptor["auth"]> = {};
642
640
  if (parts.apiKeyEnv) auth.apiKeyEnvVar = parts.apiKeyEnv;
643
641
  if (parts.apiKeyRef) auth.apiKeyRef = parts.apiKeyRef;
644
642
  if (parts.oauthProfile) auth.oauthProfile = parts.oauthProfile;
645
643
  if (Object.keys(auth).length > 0) descriptor.auth = auth;
646
- if (wireModels.length > 0) descriptor.wireModels = wireModels;
647
644
  if (parts.gateway) descriptor.gateway = true;
648
645
  if (parts.lifecycle) descriptor.lifecycle = parts.lifecycle;
649
646
  const caps: NonNullable<TargetDescriptor["capabilities"]> = {};
@@ -714,7 +711,7 @@ async function loginOAuthRuntime(rl: ReturnType<typeof createInterface>, runtime
714
711
  */
715
712
  interface WireModelInventory {
716
713
  models: string[];
717
- source: "catalog" | "probe" | "existing" | "none";
714
+ source: "catalog" | "probe" | "cache" | "legacy" | "none";
718
715
  /** Per-model load state when the probe reported it. */
719
716
  modelStates?: Readonly<Record<string, ProbeModelStatus>> | undefined;
720
717
  }
@@ -761,13 +758,21 @@ async function resolveSupportedWireModels(
761
758
  // lists models only through probeModels still gets its ids checked.
762
759
  const probe = await runtimeProbe(runtime, target, authToken);
763
760
  if (probe?.ok && probe.models && probe.models.length > 0) {
761
+ recordTargetModelSnapshot(target, probe.models);
764
762
  return { models: [...probe.models], source: "probe", modelStates: probe.modelStates };
765
763
  }
766
764
  const discovered = await runtimeProbeModels(runtime, target, authToken);
767
- if (discovered.length > 0) return { models: discovered, source: "probe" };
765
+ if (discovered.length > 0) {
766
+ recordTargetModelSnapshot(target, discovered);
767
+ return { models: discovered, source: "probe" };
768
+ }
769
+ }
770
+ const cached = readTargetModelSnapshot(target);
771
+ if (cached && cached.models.length > 0) return { models: [...cached.models], source: "cache" };
772
+ if (existing?.wireModels && existing.wireModels.length > 0) {
773
+ recordTargetModelSnapshot(target, existing.wireModels);
774
+ return { models: [...existing.wireModels], source: "legacy" };
768
775
  }
769
- if (existing?.wireModels && existing.wireModels.length > 0)
770
- return { models: [...existing.wireModels], source: "existing" };
771
776
  return { models: [], source: "none" };
772
777
  }
773
778
 
@@ -905,7 +910,6 @@ async function runNonInteractive(runtime: RuntimeDescriptor, args: ParsedArgs):
905
910
  const descriptor = buildDescriptor(runtime, args.id, {
906
911
  ...(url !== undefined ? { url } : {}),
907
912
  ...(model ? { model } : {}),
908
- ...(wireModels.length > 0 ? { wireModels } : {}),
909
913
  ...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),
910
914
  ...(apiKeyRef !== undefined ? { apiKeyRef } : {}),
911
915
  ...(oauthProfile !== undefined ? { oauthProfile } : {}),
@@ -966,6 +970,7 @@ async function runNonInteractive(runtime: RuntimeDescriptor, args: ParsedArgs):
966
970
  applyConfiguration(settings);
967
971
  updateSettings(applyConfiguration);
968
972
  const probe = await runtimeProbe(runtime, descriptor);
973
+ if (probe?.ok && probe.models) recordTargetModelSnapshot(descriptor, probe.models);
969
974
  printSummary(settings, descriptor, probe);
970
975
  if (
971
976
  runtime.auth === "oauth" &&
@@ -1272,10 +1277,7 @@ async function runInteractive(
1272
1277
  }
1273
1278
 
1274
1279
  let model: string | undefined = defaults.model;
1275
- let inventory: WireModelInventory =
1276
- existing?.wireModels && existing.wireModels.length > 0
1277
- ? { models: [...existing.wireModels], source: "existing" }
1278
- : { models: [], source: "none" };
1280
+ let inventory: WireModelInventory = { models: [], source: "none" };
1279
1281
  const tentative = buildDescriptor(runtime, targetId, {
1280
1282
  ...(url !== undefined ? { url } : {}),
1281
1283
  ...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),
@@ -1367,7 +1369,6 @@ async function runInteractive(
1367
1369
  ...(apiKeyEnv !== undefined ? { apiKeyEnv } : {}),
1368
1370
  ...(apiKeyRef !== undefined ? { apiKeyRef } : {}),
1369
1371
  ...(oauthProfile !== undefined ? { oauthProfile } : {}),
1370
- ...(wireModels.length > 0 ? { wireModels } : {}),
1371
1372
  gateway: gatewayAnswer,
1372
1373
  ...(defaults.lifecycle !== undefined
1373
1374
  ? { lifecycle: defaults.lifecycle }
@@ -1395,6 +1396,7 @@ async function runInteractive(
1395
1396
  }
1396
1397
 
1397
1398
  const probe = await runtimeProbe(runtime, descriptor);
1399
+ if (probe?.ok && probe.models) recordTargetModelSnapshot(descriptor, probe.models);
1398
1400
  if (probe) {
1399
1401
  process.stdout.write("\n");
1400
1402
  for (const line of probeLines(descriptor, probe)) process.stdout.write(`${line}\n`);
@@ -0,0 +1,124 @@
1
+ import { accessSync, constants, mkdirSync } from "node:fs";
2
+ import { readSettings } from "../core/config.js";
3
+ import { runEventJournalRoot } from "../domains/dispatch/run-event-journal.js";
4
+ import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
5
+ import { detectMux, MUX_METHOD_MIN_PROTOCOL, resolveSocketCandidates } from "../domains/mux/index.js";
6
+ import { describeResolution, findPinnedTool, toolStatus } from "../domains/toolchain/index.js";
7
+
8
+ /**
9
+ * The panes section of `clio-coder doctor`.
10
+ *
11
+ * Five rows, in the order an operator debugs them: what mode the pane layer
12
+ * resolved to, whether the socket answered, whether the server is new enough
13
+ * for the methods phase 3 uses, where the pane host binary resolves, and
14
+ * whether the journal directory the viewer reads is writable.
15
+ *
16
+ * No row is an error. Panes are optional: an operator who never wanted them has
17
+ * a healthy install without them, and doctor's exit code answers "is this
18
+ * install healthy". The rows that would be errors elsewhere are warnings that
19
+ * name the next step instead.
20
+ */
21
+
22
+ const PANE_HOST_TOOL_ID = "herdr";
23
+
24
+ /** Highest protocol any method Clio drives requires, for the version row. */
25
+ const REQUIRED_PROTOCOL = Math.max(...Object.values(MUX_METHOD_MIN_PROTOCOL));
26
+
27
+ function journalWritabilityFinding(root = runEventJournalRoot()): DoctorFinding {
28
+ try {
29
+ // The viewer reads this tree and the journal writes it, so the useful
30
+ // question is whether it can exist and be written, not whether it does.
31
+ mkdirSync(root, { recursive: true });
32
+ accessSync(root, constants.W_OK);
33
+ return { ok: true, name: "panes journal dir", detail: `${root} is writable` };
34
+ } catch (error) {
35
+ return {
36
+ ok: true,
37
+ level: "warn",
38
+ name: "panes journal dir",
39
+ detail: `${root} is not writable (${error instanceof Error ? error.message : String(error)}); \`clio-coder fleet view\` will have no transcript to follow`,
40
+ };
41
+ }
42
+ }
43
+
44
+ export async function panesFindings(env: NodeJS.ProcessEnv = process.env): Promise<DoctorFinding[]> {
45
+ let enabled: "auto" | "embedded" | "off" = "off";
46
+ try {
47
+ enabled = readSettings().panes.enabled;
48
+ } catch {
49
+ // An unreadable settings file is already reported by the settings row;
50
+ // this section answers on the shipped default (off) rather than throwing.
51
+ }
52
+
53
+ // Inactive by choice is a different answer from unavailable. With the
54
+ // setting off, detection is skipped the same way the boot skips it, and the
55
+ // row names the two ways to turn the extension on instead of warning about
56
+ // a socket nobody asked for.
57
+ if (enabled === "off") {
58
+ return [
59
+ {
60
+ ok: true,
61
+ name: "panes mode",
62
+ detail:
63
+ "off by choice (panes.enabled=off); start `clio-coder --with-panes` for one session, or set panes.enabled=auto",
64
+ },
65
+ journalWritabilityFinding(),
66
+ ];
67
+ }
68
+
69
+ // Detection is the same ladder the interactive boot runs, so this row is the
70
+ // answer that boot would get. It opens a socket and nothing else: no file is
71
+ // created and no pane is touched.
72
+ const { detection, client } = await detectMux({ enabled, env });
73
+ await client?.close().catch(() => undefined);
74
+
75
+ const candidates = detection.candidates.length > 0 ? detection.candidates : resolveSocketCandidates(env);
76
+ const findings: DoctorFinding[] = [
77
+ {
78
+ ok: true,
79
+ level: detection.mode === "none" ? "warn" : "ok",
80
+ name: "panes mode",
81
+ detail: `${detection.mode} (panes.enabled=${enabled}); ${detection.reason}`,
82
+ },
83
+ {
84
+ ok: true,
85
+ level: detection.socketPath === null ? "warn" : "ok",
86
+ name: "panes socket",
87
+ detail:
88
+ detection.socketPath === null
89
+ ? `no socket answered; tried ${candidates.length > 0 ? candidates.join(", ") : "no candidates"}`
90
+ : `${detection.socketPath} answered a ping`,
91
+ },
92
+ ];
93
+
94
+ const server = detection.server;
95
+ findings.push({
96
+ ok: true,
97
+ level: server === null || server.protocol < REQUIRED_PROTOCOL ? "warn" : "ok",
98
+ name: "panes protocol",
99
+ detail:
100
+ server === null
101
+ ? `unknown; Clio's optional methods need protocol ${REQUIRED_PROTOCOL} or newer`
102
+ : `server ${server.version}, protocol ${server.protocol}; Clio's optional methods need ${REQUIRED_PROTOCOL} (${server.protocol >= REQUIRED_PROTOCOL ? "satisfied" : "toasts and agent focus fall back"})`,
103
+ });
104
+
105
+ const entry = findPinnedTool(PANE_HOST_TOOL_ID);
106
+ findings.push(
107
+ entry === null
108
+ ? {
109
+ ok: true,
110
+ level: "warn",
111
+ name: "panes binary",
112
+ detail: `${PANE_HOST_TOOL_ID} is not in the pinned tool registry`,
113
+ }
114
+ : {
115
+ ok: true,
116
+ level: toolStatus(entry).resolution.source === "none" ? "warn" : "ok",
117
+ name: "panes binary",
118
+ detail: describeResolution(toolStatus(entry)),
119
+ },
120
+ );
121
+
122
+ findings.push(journalWritabilityFinding());
123
+ return findings;
124
+ }
@@ -0,0 +1,57 @@
1
+ import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
2
+ import {
3
+ describeYaziProfile,
4
+ inspectCurrentYaziProfile,
5
+ userYaziConfigDir,
6
+ yaziProfileDir,
7
+ } from "../domains/mux/index.js";
8
+ import { describeResolution, toolStatuses } from "../domains/toolchain/index.js";
9
+
10
+ function yaziProfileFinding(): DoctorFinding {
11
+ try {
12
+ const profile = inspectCurrentYaziProfile();
13
+ return {
14
+ ok: true,
15
+ name: "yazi managed profile",
16
+ detail: describeYaziProfile(profile),
17
+ level: profile.state === "current" ? "ok" : "warn",
18
+ };
19
+ } catch (error) {
20
+ return {
21
+ ok: true,
22
+ name: "yazi managed profile",
23
+ level: "warn",
24
+ detail: `${yaziProfileDir()} could not be inspected (${error instanceof Error ? error.message : String(error)}); user config ${userYaziConfigDir()} is separate and untouched`,
25
+ };
26
+ }
27
+ }
28
+
29
+ /**
30
+ * One row per pinned external tool: where it resolves, and how the version
31
+ * found compares to the pin.
32
+ *
33
+ * Every one of these tools is optional, so no row is ever an error. A missing
34
+ * tool is a WARN with the command that installs it, because doctor's exit code
35
+ * answers "is this Clio install healthy", and an operator who never wanted
36
+ * panes has a healthy install without them.
37
+ *
38
+ * A PATH copy Clio rejected for being below the registry floor is never
39
+ * reported as an absent one. The row says which binary was found, what version
40
+ * it reported, and which floor it missed, and adds the install command only
41
+ * when there is no vendored copy already answering for the tool. Doctor is the
42
+ * surface an operator reaches for when a tool they installed themselves is not
43
+ * being used, and a row that only said "not found" would send them looking for
44
+ * a binary that is right there on their PATH.
45
+ */
46
+ export function toolchainFindings(): DoctorFinding[] {
47
+ const tools = toolStatuses().map((status) => ({
48
+ ok: true,
49
+ name: `external tool ${status.id}`,
50
+ // The rejection and the remedy both live inside the shared resolution
51
+ // sentence, so this row and `clio-coder tools status` cannot describe the
52
+ // same machine differently.
53
+ detail: describeResolution(status),
54
+ level: status.resolution.source === "none" ? ("warn" as const) : ("ok" as const),
55
+ }));
56
+ return [...tools, yaziProfileFinding()];
57
+ }
package/src/cli/doctor.ts CHANGED
@@ -7,7 +7,9 @@ import {
7
7
  runDoctorModelChecks,
8
8
  runDoctorRuntimeChecks,
9
9
  } from "../domains/lifecycle/doctor.js";
10
+ import { panesFindings } from "./doctor-panes.js";
10
11
  import { stateStorageFinding } from "./doctor-state-size.js";
12
+ import { toolchainFindings } from "./doctor-toolchain.js";
11
13
  import { printError } from "./shared.js";
12
14
 
13
15
  const HELP = `clio-coder doctor [--fix] [--json]
@@ -49,7 +51,24 @@ export async function runDoctorCommand(args: ReadonlyArray<string> = []): Promis
49
51
  // Fleet preflight probes each configured node over SSH and persists the
50
52
  // per-node eligibility verdicts dispatch placement enforces.
51
53
  const fleetChecks = untouched ? [] : await runDoctorFleetChecks();
52
- const all = [...findings, ...storageChecks, ...runtimeChecks, ...modelChecks, ...interopChecks, ...fleetChecks];
54
+ // Resolution reads PATH and the vendor root and creates nothing, but on an
55
+ // untouched home there is no vendor root to look at and the answer would be
56
+ // "none" for every row regardless, so the sweep stays with the others.
57
+ const toolChecks = untouched ? [] : toolchainFindings();
58
+ // The pane sweep pings a socket and reads PATH; it creates nothing except the
59
+ // journal directory it is asked about, which is inside the state root doctor
60
+ // has already agreed not to build on an untouched home.
61
+ const paneChecks = untouched ? [] : await panesFindings();
62
+ const all = [
63
+ ...findings,
64
+ ...storageChecks,
65
+ ...runtimeChecks,
66
+ ...modelChecks,
67
+ ...interopChecks,
68
+ ...fleetChecks,
69
+ ...toolChecks,
70
+ ...paneChecks,
71
+ ];
53
72
  const ok = all.every((f) => f.ok);
54
73
  if (json) {
55
74
  process.stdout.write(`${JSON.stringify({ ok, fix, findings: all }, null, 2)}\n`);