@iowarp/clio-coder 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/NOTICE +33 -0
  3. package/README.md +12 -3
  4. package/dist/{acp-U67UHUK2.js → acp-G5WJBNCT.js} +13 -12
  5. package/dist/{agents-YU6SGALZ.js → agents-FMV2Q5G4.js} +41 -36
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-5ZPJOIVG.js → auth-3IDSJEIK.js} +18 -18
  8. package/dist/{builtins-C6JMZVV6.js → builtins-XCZWXSC7.js} +5 -5
  9. package/dist/{chunk-IFBNV6H6.js → chunk-2ANTL7MR.js} +3 -3
  10. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  11. package/dist/{chunk-XWSF374K.js → chunk-2OQE55CK.js} +3 -3
  12. package/dist/{chunk-5H3GB5BO.js → chunk-32KWKNSF.js} +8 -384
  13. package/dist/{chunk-KTYTFRMB.js → chunk-36EJLSQQ.js} +34 -36
  14. package/dist/{chunk-FHJEP5SW.js → chunk-3BT2XMV4.js} +19 -13
  15. package/dist/chunk-3DPEIQKN.js +113 -0
  16. package/dist/{chunk-GU2UIAFZ.js → chunk-3URVFKWK.js} +7 -7
  17. package/dist/{chunk-WEH5XRJQ.js → chunk-3XML7CDN.js} +3 -3
  18. package/dist/chunk-42FMPA75.js +101 -0
  19. package/dist/{chunk-A2NJGIB3.js → chunk-5LXZXPKX.js} +2 -2
  20. package/dist/{chunk-VCBR6CU7.js → chunk-5PSMVOLM.js} +2 -2
  21. package/dist/{chunk-NMPKI6XL.js → chunk-6DB53AJS.js} +203 -25
  22. package/dist/{chunk-3BINW3FP.js → chunk-76ONBSIA.js} +2 -2
  23. package/dist/{chunk-26LEYJZH.js → chunk-7MCTRUCE.js} +2 -2
  24. package/dist/{chunk-TYPGUK6W.js → chunk-AB44T6BB.js} +111 -5
  25. package/dist/{chunk-K4XHGFR5.js → chunk-B7OBL7PK.js} +317 -721
  26. package/dist/{chunk-B5CSFE7B.js → chunk-BBVJUZHB.js} +2 -2
  27. package/dist/{chunk-EQ63NRB7.js → chunk-BBVYXMFO.js} +2 -2
  28. package/dist/{chunk-ZVJ5BLO2.js → chunk-BKFJHQCA.js} +154 -16
  29. package/dist/chunk-BKFM6EJV.js +462 -0
  30. package/dist/chunk-BMS5RKQY.js +27 -0
  31. package/dist/{chunk-ZNLWCMVZ.js → chunk-BPKCPIL7.js} +2 -2
  32. package/dist/{chunk-TLQJPP24.js → chunk-BUMFYQFY.js} +1394 -1349
  33. package/dist/{chunk-BNAZZHFG.js → chunk-BYP5D4HI.js} +1 -1
  34. package/dist/chunk-C2LTL2W6.js +2447 -0
  35. package/dist/{chunk-ME6CCNFO.js → chunk-CODPRO7Q.js} +8 -8
  36. package/dist/{chunk-E77JEWSD.js → chunk-CTJ4RNAA.js} +7 -37
  37. package/dist/{chunk-ODFEOB4F.js → chunk-CY6FY24N.js} +26 -8
  38. package/dist/{chunk-7RFXX52T.js → chunk-DQITNCXG.js} +642 -172
  39. package/dist/{chunk-TTHACPOM.js → chunk-DYJP44XW.js} +578 -117
  40. package/dist/{chunk-2HFZQUHL.js → chunk-F4CKPOEQ.js} +18 -8
  41. package/dist/{chunk-DGSYXYMX.js → chunk-FEFIFZTL.js} +3 -3
  42. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  43. package/dist/{chunk-MV3K5QF2.js → chunk-GCSMB2KY.js} +2 -2
  44. package/dist/chunk-GKF55TAZ.js +391 -0
  45. package/dist/{chunk-VWZOAB7K.js → chunk-GR5G2PVF.js} +9 -8
  46. package/dist/{chunk-4DGYLA73.js → chunk-GXNLGKAB.js} +80 -9
  47. package/dist/chunk-HHV2GANA.js +88 -0
  48. package/dist/{chunk-IIZWH4XA.js → chunk-HI63TFOG.js} +5 -4
  49. package/dist/{chunk-WLFILSD5.js → chunk-HJJTYUHX.js} +113 -83
  50. package/dist/{chunk-TT36MB5S.js → chunk-HLW2MRKE.js} +3 -1
  51. package/dist/{chunk-PMDBGQSJ.js → chunk-HWHKMHUA.js} +7 -7
  52. package/dist/chunk-HZHHCK24.js +1631 -0
  53. package/dist/{chunk-WSB3FPX7.js → chunk-I5VEOC6I.js} +39 -143
  54. package/dist/chunk-IBEBSCYA.js +564 -0
  55. package/dist/chunk-IQ7KR472.js +362 -0
  56. package/dist/{chunk-A3WNZD3P.js → chunk-J4W7KFM7.js} +949 -972
  57. package/dist/{chunk-TB5666IT.js → chunk-JDG2WCRO.js} +5 -5
  58. package/dist/{chunk-N22QMJKY.js → chunk-K5C3NCBD.js} +4 -4
  59. package/dist/{chunk-CGKSTWHD.js → chunk-K6BSR66V.js} +2 -1
  60. package/dist/{chunk-5C3AQNDW.js → chunk-KFZI4NIL.js} +216 -38
  61. package/dist/chunk-KMVISBZR.js +132 -0
  62. package/dist/{chunk-WXY7KU3G.js → chunk-LDQ2ZF2M.js} +2 -2
  63. package/dist/{chunk-XN3L4EYL.js → chunk-LQ3DZAMX.js} +3 -3
  64. package/dist/{chunk-U6MBIEMB.js → chunk-LY4S7GJC.js} +173 -144
  65. package/dist/{chunk-4SPRNWDE.js → chunk-MLKNTWH2.js} +19 -19
  66. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  67. package/dist/chunk-NEKRRTYW.js +56 -0
  68. package/dist/{chunk-SPULKLCF.js → chunk-NHCZP4K7.js} +3 -3
  69. package/dist/chunk-NHLBIGRH.js +1506 -0
  70. package/dist/chunk-NQQH3YT7.js +302 -0
  71. package/dist/chunk-NYS75XW5.js +15 -0
  72. package/dist/{chunk-GN57SG4G.js → chunk-O4XIVISU.js} +10 -8
  73. package/dist/{chunk-EMYUUSFG.js → chunk-O6TL7WWY.js} +6 -6
  74. package/dist/chunk-OQBA45DZ.js +97 -0
  75. package/dist/{chunk-LU7P4LHA.js → chunk-P3FOHJT4.js} +2 -2
  76. package/dist/chunk-PMZCIOCJ.js +25 -0
  77. package/dist/{chunk-I4HZDVNP.js → chunk-PQEFIJ36.js} +2 -2
  78. package/dist/{chunk-J3YUBZWY.js → chunk-QBJA7R7N.js} +62 -6
  79. package/dist/chunk-QDC3K2U3.js +262 -0
  80. package/dist/{chunk-2HEJ2F35.js → chunk-QLFS5GO2.js} +22 -10
  81. package/dist/{chunk-7RGZWPB6.js → chunk-QLL7ILRG.js} +95 -32
  82. package/dist/{chunk-YS5VLNH5.js → chunk-QREDIESB.js} +6 -6
  83. package/dist/chunk-QSNYB6ZV.js +195 -0
  84. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  85. package/dist/chunk-RKKLTLYB.js +45 -0
  86. package/dist/{chunk-P43ETTHK.js → chunk-SJ5ZKQ4S.js} +2 -2
  87. package/dist/{chunk-GPIEI3LY.js → chunk-SP2RXXYO.js} +6 -54
  88. package/dist/chunk-SUCTJL45.js +45 -0
  89. package/dist/{chunk-DYIM5TJT.js → chunk-SUW5DORT.js} +263 -7
  90. package/dist/chunk-T56WDKA5.js +183 -0
  91. package/dist/chunk-TVHHYFHE.js +255 -0
  92. package/dist/{chunk-FJ3H4MN5.js → chunk-TZ3SGWZZ.js} +3 -3
  93. package/dist/{chunk-MXKJU4JB.js → chunk-U77AMWDL.js} +91 -10
  94. package/dist/{chunk-5DHKRSMQ.js → chunk-ULC6OTWO.js} +11 -7
  95. package/dist/{chunk-RWSI4YD7.js → chunk-UM7N4G5A.js} +33 -12
  96. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  97. package/dist/{chunk-IGWKHNIQ.js → chunk-UXMFQ54G.js} +44 -37
  98. package/dist/{chunk-HFSBBKSQ.js → chunk-V5DHCITQ.js} +171 -3
  99. package/dist/{chunk-5WIGXA4T.js → chunk-VAZSBTKF.js} +111 -4
  100. package/dist/{chunk-VHN4MY6O.js → chunk-VEO4AP2K.js} +2 -2
  101. package/dist/{chunk-IJ7RPIYJ.js → chunk-VFA6GDY5.js} +65 -4
  102. package/dist/{chunk-PT7HYKEM.js → chunk-VO2LKSTM.js} +2 -2
  103. package/dist/chunk-VO67MWHC.js +75 -0
  104. package/dist/{chunk-XK56QHLX.js → chunk-VPKWYKEY.js} +19 -5
  105. package/dist/{chunk-TANS5ZJS.js → chunk-VYMXRQI6.js} +36 -22
  106. package/dist/{chunk-WWCZ5F23.js → chunk-W5VSYASO.js} +77 -16
  107. package/dist/{chunk-WNIJTQQK.js → chunk-WZR7K7ZX.js} +72 -116
  108. package/dist/{chunk-5Q2VVUKB.js → chunk-X3YGUTOB.js} +4 -4
  109. package/dist/chunk-X75E3D2N.js +686 -0
  110. package/dist/{chunk-VAWNZU7Z.js → chunk-YDFRH54B.js} +4 -4
  111. package/dist/chunk-YJX4SHTD.js +40 -0
  112. package/dist/{chunk-ZI647VB5.js → chunk-YPI3QQCF.js} +2 -2
  113. package/dist/chunk-Z2RR6MAK.js +127 -0
  114. package/dist/{chunk-FBVTI2TJ.js → chunk-Z4TXYIEG.js} +12 -131
  115. package/dist/cli/index.js +47 -36
  116. package/dist/{clio-QVTYJ57A.js → clio-2JXHBBY5.js} +7 -7
  117. package/dist/{code-nav-FGGFIE7L.js → code-nav-3YYRMYNF.js} +8 -8
  118. package/dist/{compile-cache-CVJMMODC.js → compile-cache-7FPE6PS3.js} +3 -3
  119. package/dist/{components-ZFA3SAER.js → components-RYZV4JGP.js} +5 -5
  120. package/dist/{config-LW5IJFQN.js → config-QZPCMYSO.js} +99 -63
  121. package/dist/{configure-7XIZCOU4.js → configure-TEGEBYCA.js} +23 -22
  122. package/dist/{context-Y6Y7QPR6.js → context-AV7OEZ4D.js} +12 -12
  123. package/dist/{context-L3WL3X7K.js → context-E6H5RNMC.js} +56 -47
  124. package/dist/{context-N52ZA626.js → context-GSXUE4CT.js} +29 -27
  125. package/dist/{context-clear-MBQRLSDQ.js → context-clear-SHIBYK6T.js} +55 -46
  126. package/dist/{context-index-HVMFQHK3.js → context-index-HNG3MOME.js} +2 -2
  127. package/dist/{context-working-set-GS6DSO7F.js → context-working-set-5ZGKPGZQ.js} +13 -13
  128. package/dist/{dispatch-runner-22ZCNOM3.js → dispatch-runner-EFMJT4LD.js} +93 -64
  129. package/dist/{docs-7LQ23DLM.js → docs-23KQS3XK.js} +5 -5
  130. package/dist/doctor-QOA5FNY5.js +313 -0
  131. package/dist/{eval-BEC2WHDA.js → eval-TFBYQH4H.js} +2032 -156
  132. package/dist/eval-inventory-SXH7PDKX.js +316 -0
  133. package/dist/{evidence-REJUMSKM.js → evidence-ERGESKGN.js} +203 -48
  134. package/dist/{evolve-PY5ZBA5K.js → evolve-VDXTSYCJ.js} +52 -43
  135. package/dist/{extensions-HVKU65YU.js → extensions-7BGBHN57.js} +13 -7
  136. package/dist/{fleet-7WZEWRFA.js → fleet-2RRVDF2V.js} +228 -108
  137. package/dist/{fleet-commands-UVHWM76J.js → fleet-commands-VJ726XIA.js} +11 -11
  138. package/dist/fleet-decisions-EPAPM3XJ.js +157 -0
  139. package/dist/{fleet-graph-6ULH7PES.js → fleet-graph-JF5QOATM.js} +18 -15
  140. package/dist/fleet-inspect-VLY4S7QM.js +442 -0
  141. package/dist/{fleet-preflight-J53T6CCE.js → fleet-preflight-AIZUEJOY.js} +5 -5
  142. package/dist/{fleet-validate-72PC4SLA.js → fleet-validate-AJRPDMDV.js} +22 -19
  143. package/dist/fleet-verify-JFEL2L3H.js +175 -0
  144. package/dist/fleet-view-ZCON35AG.js +102 -0
  145. package/dist/{init-OG3TPGQG.js → init-DN2WWLFE.js} +72 -62
  146. package/dist/install-XGLBQY5E.js +13 -0
  147. package/dist/interop-OZBKXAYL.js +114 -0
  148. package/dist/{library-CNTMPLRF.js → library-YWZG7IMW.js} +21 -18
  149. package/dist/{memory-6IS7F275.js → memory-I4C4HMLW.js} +54 -45
  150. package/dist/{models-ENRJDA5W.js → models-CEYXJBO6.js} +33 -30
  151. package/dist/{monitor-XLDVO7TN.js → monitor-NZ6GCI3P.js} +59 -52
  152. package/dist/{orchestrator-6KSPYRHA.js → orchestrator-GCGQ4N5I.js} +7827 -7328
  153. package/dist/panes-HMABYVO4.js +58 -0
  154. package/dist/panes-KY6W3V2E.js +103 -0
  155. package/dist/{paths-DBXMZMDU.js → paths-II4K7DNR.js} +5 -5
  156. package/dist/{reset-RZ4ER727.js → reset-DQ6FGCSH.js} +13 -11
  157. package/dist/resources-BB3MVJMD.js +111 -0
  158. package/dist/{run-Y2CNK5RU.js → run-H2GQDUER.js} +119 -87
  159. package/dist/{share-A55GYP6Z.js → share-GTJN6A5O.js} +20 -17
  160. package/dist/{skills-ALC5J6AT.js → skills-L55TEW6R.js} +33 -24
  161. package/dist/{skills-eval-JPBEBYQU.js → skills-eval-XVXPH2JI.js} +67 -56
  162. package/dist/skills-inventory-S4MXPJFV.js +126 -0
  163. package/dist/slash-commands-ZSGASKJC.js +77 -0
  164. package/dist/{steer-GGWFUJUD.js → steer-RZGSCY4R.js} +4 -4
  165. package/dist/{support-MIETYA5E.js → support-PKEUNNQL.js} +6 -6
  166. package/dist/{targets-VGNXIR3S.js → targets-NCPZ644J.js} +68 -40
  167. package/dist/{terminal-lease-WOBR64YA.js → terminal-lease-44SV3YCN.js} +6 -4
  168. package/dist/tools-DAF3DI3C.js +27 -0
  169. package/dist/{trace-PNCASAXC.js → trace-FYVW2MQA.js} +207 -10
  170. package/dist/tui-primitives-2AKXQNZK.js +13 -0
  171. package/dist/{uninstall-ZJF5H5ZN.js → uninstall-DW2PNOIC.js} +5 -5
  172. package/dist/{upgrade-FUSUAGHR.js → upgrade-3XPP6OQL.js} +27 -24
  173. package/dist/{usage-N4MKVHKD.js → usage-3NLHGTU2.js} +114 -62
  174. package/dist/{verifiers-YAWOJ3H2.js → verifiers-SSQONKRT.js} +172 -13
  175. package/dist/{verify-LTDHYBGY.js → verify-3U6J7FZI.js} +10 -10
  176. package/dist/{web-fetch-2YHJ3KTG.js → web-fetch-S7RR6GZ7.js} +3 -3
  177. package/dist/{wiki-generate-6M7GHTBJ.js → wiki-generate-CEHYGPGQ.js} +75 -65
  178. package/dist/with-panes-MKB46MPQ.js +782 -0
  179. package/dist/worker/entry.js +106 -75
  180. package/docs/README.md +3 -2
  181. package/docs/acp.md +24 -3
  182. package/docs/alcf-provider.md +1 -1
  183. package/docs/architecture.md +2 -2
  184. package/docs/artifact-versions.md +9 -1
  185. package/docs/built-in-agents.md +1 -1
  186. package/docs/capacity-and-scheduling.md +62 -3
  187. package/docs/commands-and-modes.md +31 -2
  188. package/docs/configuration-and-targets.md +69 -12
  189. package/docs/context-engine.md +63 -4
  190. package/docs/development-pipeline.md +19 -0
  191. package/docs/dispatch-typed-intent.md +385 -0
  192. package/docs/documentation-coverage.md +5 -5
  193. package/docs/documentation-guide.md +1 -1
  194. package/docs/environment-variables.md +3 -0
  195. package/docs/eval-runner.md +262 -11
  196. package/docs/evals-internal.md +72 -2
  197. package/docs/evidence-and-memory.md +12 -11
  198. package/docs/evolution.md +1 -1
  199. package/docs/exit-codes-and-output.md +1 -1
  200. package/docs/extensions-and-sharing.md +27 -1
  201. package/docs/fleet-dispatch.md +25 -4
  202. package/docs/installation-and-lifecycle.md +15 -2
  203. package/docs/middleware-and-components.md +1 -1
  204. package/docs/model-catalog.md +10 -1
  205. package/docs/observability.md +55 -4
  206. package/docs/proactive-memory.md +127 -14
  207. package/docs/prompt-envelope-and-tools.md +19 -1
  208. package/docs/provider-adapter-cookbook.md +1 -1
  209. package/docs/release-cut-checklist.md +19 -3
  210. package/docs/safety-model.md +2 -2
  211. package/docs/scientific-validation.md +3 -3
  212. package/docs/session-lifecycle.md +1 -1
  213. package/docs/skills-marketplace.md +1 -1
  214. package/docs/tool-usage.md +18 -8
  215. package/docs/trace-store.md +1 -1
  216. package/docs/troubleshooting.md +88 -1
  217. package/docs/tui-design.md +1 -1
  218. package/docs/worker-dispatch-mechanics.md +1 -1
  219. package/package.json +5 -2
  220. package/src/cli/acp.ts +6 -2
  221. package/src/cli/agents.ts +1 -1
  222. package/src/cli/argv.ts +25 -0
  223. package/src/cli/config-inspect.ts +33 -6
  224. package/src/cli/config.ts +1 -1
  225. package/src/cli/configure.ts +23 -21
  226. package/src/cli/doctor-panes.ts +124 -0
  227. package/src/cli/doctor-state-size.ts +82 -0
  228. package/src/cli/doctor-toolchain.ts +57 -0
  229. package/src/cli/doctor.ts +22 -1
  230. package/src/cli/eval-inventory.ts +436 -0
  231. package/src/cli/eval.ts +93 -16
  232. package/src/cli/evidence-detail.ts +88 -0
  233. package/src/cli/evidence-inventory.ts +183 -0
  234. package/src/cli/evidence.ts +30 -5
  235. package/src/cli/extensions.ts +5 -1
  236. package/src/cli/fleet-decisions.ts +69 -0
  237. package/src/cli/fleet-inspect.ts +334 -0
  238. package/src/cli/fleet-verify.ts +133 -0
  239. package/src/cli/fleet-view.ts +810 -0
  240. package/src/cli/fleet.ts +179 -39
  241. package/src/cli/index.ts +14 -2
  242. package/src/cli/interop-inspect.ts +128 -0
  243. package/src/cli/interop.ts +34 -0
  244. package/src/cli/panes.ts +35 -0
  245. package/src/cli/reset.ts +5 -2
  246. package/src/cli/run.ts +58 -0
  247. package/src/cli/skills-inventory.ts +185 -0
  248. package/src/cli/skills.ts +16 -13
  249. package/src/cli/targets.ts +44 -13
  250. package/src/cli/tools.ts +321 -0
  251. package/src/cli/trace-inspect.ts +252 -0
  252. package/src/cli/trace.ts +85 -5
  253. package/src/cli/usage.ts +63 -14
  254. package/src/cli/verifiers-inspect.ts +347 -0
  255. package/src/cli/verifiers.ts +9 -0
  256. package/src/core/bus-events.ts +33 -1
  257. package/src/core/cache-telemetry.ts +42 -0
  258. package/src/core/config.ts +67 -0
  259. package/src/core/defaults.ts +124 -8
  260. package/src/core/endpoint-key.ts +27 -0
  261. package/src/core/residency-target-key.ts +25 -0
  262. package/src/core/response-schema.ts +80 -6
  263. package/src/core/theme-token-hex.ts +43 -0
  264. package/src/core/tool-names.ts +2 -1
  265. package/src/core/xdg.ts +1 -1
  266. package/src/domains/agents/fleets/build-review.md +0 -3
  267. package/src/domains/agents/fleets/build-test.md +0 -3
  268. package/src/domains/agents/result-contract-filesystem.ts +32 -0
  269. package/src/domains/agents/result-contract.ts +164 -35
  270. package/src/domains/config/classify.ts +6 -0
  271. package/src/domains/context/codewiki/coordinator.ts +12 -4
  272. package/src/domains/dispatch/admission-error.ts +9 -0
  273. package/src/domains/dispatch/admission.ts +52 -14
  274. package/src/domains/dispatch/capacity-lease.ts +118 -9
  275. package/src/domains/dispatch/contract.ts +11 -0
  276. package/src/domains/dispatch/council-topology.ts +398 -0
  277. package/src/domains/dispatch/execution-plan.ts +44 -4
  278. package/src/domains/dispatch/extension.ts +378 -82
  279. package/src/domains/dispatch/fleet-node-prompt.ts +62 -0
  280. package/src/domains/dispatch/fleet-plan.ts +7 -2
  281. package/src/domains/dispatch/fleet-run.ts +87 -4
  282. package/src/domains/dispatch/gate-decisions.ts +11 -1
  283. package/src/domains/dispatch/gate-role-prompts.ts +9 -0
  284. package/src/domains/dispatch/gate-topology.ts +289 -0
  285. package/src/domains/dispatch/heartbeat.ts +32 -8
  286. package/src/domains/dispatch/index.ts +22 -0
  287. package/src/domains/dispatch/intent-compatibility.ts +330 -0
  288. package/src/domains/dispatch/intent.ts +85 -1
  289. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  290. package/src/domains/dispatch/reservation-store.ts +139 -11
  291. package/src/domains/dispatch/run-event-journal-bridge.ts +149 -0
  292. package/src/domains/dispatch/run-event-journal.ts +598 -0
  293. package/src/domains/dispatch/state.ts +49 -1
  294. package/src/domains/dispatch/types.ts +13 -0
  295. package/src/domains/dispatch/validation.ts +33 -8
  296. package/src/domains/dispatch/worker-spawn.ts +25 -11
  297. package/src/domains/dispatch/write-boundary-enforcer.ts +20 -3
  298. package/src/domains/dispatch/write-boundary.ts +62 -1
  299. package/src/domains/eval/artifacts/store.ts +62 -0
  300. package/src/domains/eval/compare/behavioral.ts +224 -0
  301. package/src/domains/eval/compare/compare.ts +342 -2
  302. package/src/domains/eval/compare/envelope.ts +128 -0
  303. package/src/domains/eval/compare/gates.ts +24 -6
  304. package/src/domains/eval/compare/thresholds.ts +30 -3
  305. package/src/domains/eval/execution-provenance.ts +240 -0
  306. package/src/domains/eval/inventory.ts +113 -0
  307. package/src/domains/eval/metrics/aggregate.ts +136 -0
  308. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  309. package/src/domains/eval/metrics/tracked.ts +413 -0
  310. package/src/domains/eval/provenance.ts +117 -0
  311. package/src/domains/eval/reports/comparison.ts +128 -0
  312. package/src/domains/eval/reports/junit.ts +17 -3
  313. package/src/domains/eval/reports/markdown.ts +3 -3
  314. package/src/domains/eval/reports/text.ts +14 -0
  315. package/src/domains/eval/run-compare.ts +20 -0
  316. package/src/domains/eval/runners/clio-run.ts +127 -0
  317. package/src/domains/eval/runners/external-command.ts +28 -3
  318. package/src/domains/eval/schema/adapter.ts +111 -0
  319. package/src/domains/eval/schema/artifact.ts +20 -0
  320. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  321. package/src/domains/eval/schema/behavioral.ts +520 -0
  322. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  323. package/src/domains/eval/schema/serving.ts +105 -0
  324. package/src/domains/eval/schema/suite.ts +38 -8
  325. package/src/domains/eval/schema/validate.ts +58 -3
  326. package/src/domains/eval/schema/verdict.ts +237 -0
  327. package/src/domains/eval/suites/resolve.ts +2 -0
  328. package/src/domains/eval/suites/run.ts +264 -33
  329. package/src/domains/eval/verifiers/command.ts +2 -1
  330. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  331. package/src/domains/evidence/build.ts +2 -13
  332. package/src/domains/evidence/eval.ts +2 -12
  333. package/src/domains/evidence/findings-markdown.ts +33 -0
  334. package/src/domains/evidence/run-trust.ts +7 -113
  335. package/src/domains/evidence/store.ts +6 -0
  336. package/src/domains/evidence/trust-projection.ts +2 -2
  337. package/src/domains/extensions/compatibility.ts +285 -0
  338. package/src/domains/extensions/discovery.ts +38 -3
  339. package/src/domains/extensions/resources.ts +1 -1
  340. package/src/domains/extensions/state.ts +12 -3
  341. package/src/domains/extensions/types.ts +2 -0
  342. package/src/domains/lifecycle/doctor.ts +69 -1
  343. package/src/domains/memory/index.ts +14 -1
  344. package/src/domains/memory/task-bank-promotion.ts +64 -0
  345. package/src/domains/memory/task-memory-policy.ts +82 -17
  346. package/src/domains/memory/task-memory-spend.ts +131 -0
  347. package/src/domains/memory/task-memory-status.ts +7 -0
  348. package/src/domains/memory/task-memory-telemetry.ts +3 -0
  349. package/src/domains/middleware/index.ts +1 -0
  350. package/src/domains/middleware/memory-intervention.ts +97 -21
  351. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  352. package/src/domains/mux/contract.ts +434 -0
  353. package/src/domains/mux/detect.ts +158 -0
  354. package/src/domains/mux/extension.ts +47 -0
  355. package/src/domains/mux/index.ts +96 -0
  356. package/src/domains/mux/manifest.ts +6 -0
  357. package/src/domains/mux/operations.ts +164 -0
  358. package/src/domains/mux/pane-registry.ts +90 -0
  359. package/src/domains/mux/protocol.ts +49 -0
  360. package/src/domains/mux/socket-client.ts +816 -0
  361. package/src/domains/mux/types.ts +222 -0
  362. package/src/domains/mux/viewer-command.ts +59 -0
  363. package/src/domains/mux/yazi/assets/init.lua +2 -0
  364. package/src/domains/mux/yazi/assets/plugins/git.yazi/LICENSE +21 -0
  365. package/src/domains/mux/yazi/assets/plugins/git.yazi/README.md +78 -0
  366. package/src/domains/mux/yazi/assets/plugins/git.yazi/main.lua +255 -0
  367. package/src/domains/mux/yazi/assets/plugins/git.yazi/types.lua +12 -0
  368. package/src/domains/mux/yazi/assets/yazi.toml +17 -0
  369. package/src/domains/mux/yazi/event-stream.ts +180 -0
  370. package/src/domains/mux/yazi/profile.ts +299 -0
  371. package/src/domains/mux/yazi/session.ts +228 -0
  372. package/src/domains/mux/yazi/theme.ts +30 -0
  373. package/src/domains/observability/background-memory-usage.ts +140 -0
  374. package/src/domains/observability/cost.ts +22 -1
  375. package/src/domains/observability/index.ts +9 -0
  376. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  377. package/src/domains/observability/trace-store.ts +234 -2
  378. package/src/domains/prompts/compiler.ts +100 -13
  379. package/src/domains/providers/endpoint-capacity.ts +228 -0
  380. package/src/domains/providers/endpoint-slots-store.ts +189 -0
  381. package/src/domains/providers/extension.ts +20 -3
  382. package/src/domains/providers/index.ts +32 -0
  383. package/src/domains/providers/model-runtime-capabilities.ts +32 -0
  384. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  385. package/src/domains/providers/runtime-resolution.ts +8 -1
  386. package/src/domains/providers/runtimes/boot-manifest.ts +1 -0
  387. package/src/domains/providers/runtimes/builtins.ts +2 -0
  388. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  389. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  390. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  391. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  392. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  393. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  394. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  395. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  396. package/src/domains/providers/runtimes/protocol/litellm.ts +375 -0
  397. package/src/domains/providers/support.ts +1 -0
  398. package/src/domains/providers/target-model-cache.ts +124 -0
  399. package/src/domains/providers/types/capability-flags.ts +2 -0
  400. package/src/domains/providers/types/target-descriptor.ts +2 -0
  401. package/src/domains/resources/index.ts +3 -0
  402. package/src/domains/resources/prompts/loader.ts +95 -33
  403. package/src/domains/resources/skills/loader.ts +33 -0
  404. package/src/domains/safety/action-classifier.ts +6 -0
  405. package/src/domains/safety/call-target.ts +52 -0
  406. package/src/domains/safety/run-effects.ts +35 -4
  407. package/src/domains/session/context-accounting.ts +52 -1
  408. package/src/domains/session/context-ledger.ts +37 -13
  409. package/src/domains/session/index.ts +6 -0
  410. package/src/domains/session/prompt-cache.ts +140 -0
  411. package/src/domains/session/prompt-manifest.ts +42 -0
  412. package/src/domains/toolchain/archive.ts +175 -0
  413. package/src/domains/toolchain/contract.ts +28 -0
  414. package/src/domains/toolchain/extension.ts +47 -0
  415. package/src/domains/toolchain/index.ts +39 -0
  416. package/src/domains/toolchain/install.ts +327 -0
  417. package/src/domains/toolchain/manifest.ts +8 -0
  418. package/src/domains/toolchain/paths.ts +34 -0
  419. package/src/domains/toolchain/registry.ts +265 -0
  420. package/src/domains/toolchain/remove.ts +218 -0
  421. package/src/domains/toolchain/resolve.ts +182 -0
  422. package/src/domains/toolchain/types.ts +113 -0
  423. package/src/domains/toolchain/version.ts +88 -0
  424. package/src/engine/acp/adapter.ts +18 -3
  425. package/src/engine/acp/server.ts +413 -70
  426. package/src/engine/acp/types.ts +19 -1
  427. package/src/engine/ai.ts +35 -0
  428. package/src/engine/apis/llamacpp-residency.ts +55 -3
  429. package/src/engine/apis/lmstudio.ts +25 -5
  430. package/src/engine/apis/ollama-native.ts +2 -1
  431. package/src/engine/apis/openai-completions.ts +80 -17
  432. package/src/engine/apis/residency-lock.ts +3 -1
  433. package/src/engine/apis/residency.ts +34 -1
  434. package/src/engine/claude/sdk-module.ts +98 -0
  435. package/src/engine/claude/sdk-runtime.ts +19 -11
  436. package/src/engine/provider-payload.ts +29 -1
  437. package/src/engine/tui-primitives.ts +21 -0
  438. package/src/engine/tui.ts +1 -0
  439. package/src/engine/worker-runtime.ts +2 -13
  440. package/src/entry/boot-options.ts +2 -0
  441. package/src/entry/orchestrator.ts +279 -35
  442. package/src/entry/panes-activation.ts +31 -0
  443. package/src/entry/with-panes.ts +20 -0
  444. package/src/interactive/chat-loop-messages.ts +26 -7
  445. package/src/interactive/chat-loop.ts +318 -41
  446. package/src/interactive/chat-panel.ts +62 -8
  447. package/src/interactive/clio-editor.ts +45 -8
  448. package/src/interactive/context-activity.ts +5 -1
  449. package/src/interactive/context-meter.ts +1 -1
  450. package/src/interactive/context-overlay.ts +41 -10
  451. package/src/interactive/cost-overlay.ts +66 -6
  452. package/src/interactive/council-grid.ts +1 -3
  453. package/src/interactive/council.ts +11 -0
  454. package/src/interactive/dispatch-board.ts +102 -20
  455. package/src/interactive/fleet-run-preview.ts +41 -15
  456. package/src/interactive/handoff-round.ts +41 -2
  457. package/src/interactive/interactive-application.ts +177 -7
  458. package/src/interactive/interactive-input-runtime.ts +15 -0
  459. package/src/interactive/interactive-presentation.ts +4 -0
  460. package/src/interactive/interactive-shell.ts +20 -17
  461. package/src/interactive/interactive-slash-runtime.ts +63 -10
  462. package/src/interactive/memory-overlay.ts +9 -0
  463. package/src/interactive/modal-marker.ts +170 -0
  464. package/src/interactive/mutation-preview.ts +295 -0
  465. package/src/interactive/mux-bridge.ts +214 -0
  466. package/src/interactive/overlay-frame.ts +58 -2
  467. package/src/interactive/overlay-general-openers.ts +17 -0
  468. package/src/interactive/overlay-key-routing.ts +52 -3
  469. package/src/interactive/overlay-lifecycle.ts +56 -7
  470. package/src/interactive/overlay-model-selectors.ts +40 -3
  471. package/src/interactive/overlay-permission-lifecycle.ts +112 -24
  472. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  473. package/src/interactive/overlay-transitions.ts +18 -4
  474. package/src/interactive/overlays/agents.ts +1 -0
  475. package/src/interactive/overlays/ask-user.ts +227 -49
  476. package/src/interactive/overlays/auth-dialog.ts +1 -0
  477. package/src/interactive/overlays/context-reset.ts +1 -0
  478. package/src/interactive/overlays/cwd-fallback.ts +1 -0
  479. package/src/interactive/overlays/decisions.ts +11 -11
  480. package/src/interactive/overlays/extensions.ts +1 -0
  481. package/src/interactive/overlays/fleet-run-approval.ts +1 -0
  482. package/src/interactive/overlays/handoff-review.ts +1 -0
  483. package/src/interactive/overlays/help-reference.ts +6 -0
  484. package/src/interactive/overlays/interop.ts +1 -0
  485. package/src/interactive/overlays/library-install-confirm.ts +1 -0
  486. package/src/interactive/overlays/library-tabs.ts +28 -0
  487. package/src/interactive/overlays/list-overlay.ts +10 -1
  488. package/src/interactive/overlays/message-picker.ts +1 -0
  489. package/src/interactive/overlays/model-scope.ts +86 -0
  490. package/src/interactive/overlays/model-selector.ts +1 -0
  491. package/src/interactive/overlays/prompts.ts +12 -1
  492. package/src/interactive/overlays/session-selector.ts +1 -0
  493. package/src/interactive/overlays/settings-sections.ts +30 -0
  494. package/src/interactive/overlays/settings.ts +614 -45
  495. package/src/interactive/overlays/side-question.ts +1 -0
  496. package/src/interactive/overlays/skills-hub.ts +3 -11
  497. package/src/interactive/overlays/tree-selector.ts +1 -0
  498. package/src/interactive/pane-policy.ts +46 -0
  499. package/src/interactive/panes-runtime.ts +292 -0
  500. package/src/interactive/permission-hint.ts +34 -2
  501. package/src/interactive/permission-overlay.ts +159 -9
  502. package/src/interactive/prewarm.ts +197 -0
  503. package/src/interactive/render-trace.ts +162 -15
  504. package/src/interactive/renderers/compaction-summary.ts +29 -0
  505. package/src/interactive/renderers/tool-execution.ts +4 -0
  506. package/src/interactive/renderers/worker-entry.ts +122 -14
  507. package/src/interactive/side-question.ts +58 -1
  508. package/src/interactive/slash-commands.ts +251 -15
  509. package/src/interactive/status/controller.ts +11 -0
  510. package/src/interactive/status/state-machine.ts +54 -2
  511. package/src/interactive/status/types.ts +7 -0
  512. package/src/interactive/tasks-overlay.ts +1 -0
  513. package/src/interactive/terminal-lease.ts +2 -0
  514. package/src/interactive/theme/tokens.ts +3 -14
  515. package/src/interactive/turn-context.ts +346 -33
  516. package/src/interactive/turn-persistence.ts +14 -4
  517. package/src/interactive/turn-prewarm.ts +364 -0
  518. package/src/interactive/turn-queues.ts +7 -4
  519. package/src/interactive/turn-runtime.ts +8 -1
  520. package/src/interactive/turn-state.ts +23 -0
  521. package/src/interactive/view/artifacts.ts +109 -1
  522. package/src/interactive/view/view-overlay.ts +29 -3
  523. package/src/interactive/watch-pane.ts +152 -0
  524. package/src/interactive/worker-progress.ts +7 -1
  525. package/src/interactive/worker-receipts.ts +19 -1
  526. package/src/interactive/worker-stream.ts +5 -0
  527. package/src/interactive/yazi-bridge.ts +444 -0
  528. package/src/tools/ask-user.ts +43 -2
  529. package/src/tools/bootstrap.ts +26 -2
  530. package/src/tools/builtin-tool-catalog.ts +15 -0
  531. package/src/tools/compete-worktrees.ts +83 -2
  532. package/src/tools/core-bootstrap.ts +2 -1
  533. package/src/tools/dispatch-admission.ts +14 -3
  534. package/src/tools/dispatch-arguments.ts +20 -20
  535. package/src/tools/dispatch-plan.ts +17 -9
  536. package/src/tools/dispatch-run-events.ts +134 -19
  537. package/src/tools/dispatch-runner.ts +29 -7
  538. package/src/tools/dispatch-scout.ts +1 -1
  539. package/src/tools/dispatch-types.ts +15 -3
  540. package/src/tools/dispatch.ts +1 -1
  541. package/src/tools/executables.ts +17 -14
  542. package/src/tools/observation.ts +54 -4
  543. package/src/tools/panes-surface.ts +38 -0
  544. package/src/tools/panes.ts +112 -0
  545. package/src/tools/policy.ts +10 -1
  546. package/src/tools/presentation.ts +1 -0
  547. package/src/tools/registry.ts +16 -0
  548. package/dist/chunk-AOCYTWAV.js +0 -449
  549. package/dist/chunk-HLE42MG7.js +0 -37
  550. package/dist/chunk-HWUFFB6L.js +0 -83
  551. package/dist/chunk-JOZYP4GM.js +0 -279
  552. package/dist/doctor-M7YEDGAE.js +0 -91
@@ -0,0 +1,321 @@
1
+ import { describeYaziProfile, inspectCurrentYaziProfile, resetYaziProfile } from "../domains/mux/index.js";
2
+ import {
3
+ describeFloorRejection,
4
+ describeResolution,
5
+ findPinnedTool,
6
+ installedToolVersions,
7
+ installRemedy,
8
+ installTool,
9
+ PINNED_TOOLS,
10
+ removeTool,
11
+ type ToolStatus,
12
+ toolStatus,
13
+ toolStatuses,
14
+ } from "../domains/toolchain/index.js";
15
+ import { formatColumns, printError, printOk } from "./shared.js";
16
+
17
+ const HELP = `clio-coder tools <command>
18
+
19
+ Manage the external terminal programs Clio can drive. Every one of them is
20
+ optional: Clio works without them and only uses one when it is present. Each is
21
+ pinned to an exact upstream version and checksum, and a copy already on PATH
22
+ wins over Clio's own as long as it clears the pinned minimum.
23
+
24
+ Commands:
25
+ clio-coder tools list [--json] the pinned table and where each resolves
26
+ clio-coder tools status <id> [--json] [--reset-profile] one tool in detail
27
+ clio-coder tools install <id> [--force] [--json] download, verify, and vendor a tool
28
+ clio-coder tools remove <id>|--all [--json] delete every vendored version of a tool
29
+
30
+ Downloads happen only here. Nothing on a startup path fetches anything.
31
+
32
+ An install keeps one version directory per tool: once the pinned version is in
33
+ place, versions it superseded are pruned, along with any staging directory left
34
+ by an install that was killed. Removal touches nothing outside <data>/tools/<id>
35
+ and needs no confirmation, since every byte under it is re-downloadable from the
36
+ checksum-pinned registry. "remove --all" sweeps every tool in the table.
37
+ `;
38
+
39
+ interface Parsed {
40
+ command?: string;
41
+ positional: string[];
42
+ json: boolean;
43
+ force: boolean;
44
+ all: boolean;
45
+ resetProfile: boolean;
46
+ help: boolean;
47
+ }
48
+
49
+ export async function runToolsCommand(argv: ReadonlyArray<string> = []): Promise<number> {
50
+ let parsed: Parsed;
51
+ try {
52
+ parsed = parse(argv);
53
+ } catch (error) {
54
+ printError(error instanceof Error ? error.message : String(error));
55
+ process.stderr.write(HELP);
56
+ return 2;
57
+ }
58
+ if (parsed.help || parsed.command === undefined) {
59
+ process.stdout.write(HELP);
60
+ return parsed.help ? 0 : 2;
61
+ }
62
+
63
+ // `--all` belongs to `remove` alone. Silently ignoring it elsewhere would let
64
+ // `tools install --all` read as a request that was honored.
65
+ if (parsed.all && parsed.command !== "remove") {
66
+ printError("--all is only valid with `tools remove`");
67
+ return 2;
68
+ }
69
+
70
+ switch (parsed.command) {
71
+ case "list":
72
+ if (parsed.resetProfile) return invalidResetProfile();
73
+ return listTools(parsed.json);
74
+ case "status":
75
+ return statusTool(parsed.positional[0], parsed.json, parsed.resetProfile);
76
+ case "install":
77
+ if (parsed.resetProfile) return invalidResetProfile();
78
+ return installOne(parsed.positional[0], parsed.force, parsed.json);
79
+ case "remove":
80
+ if (parsed.resetProfile) return invalidResetProfile();
81
+ return parsed.all ? removeAll(parsed.positional[0], parsed.json) : removeOne(parsed.positional[0], parsed.json);
82
+ default:
83
+ printError(`unknown tools command: ${parsed.command}`);
84
+ process.stderr.write(HELP);
85
+ return 2;
86
+ }
87
+ }
88
+
89
+ function parse(argv: ReadonlyArray<string>): Parsed {
90
+ const out: Parsed = { positional: [], json: false, force: false, all: false, resetProfile: false, help: false };
91
+ for (const arg of argv) {
92
+ if (!out.command && !arg.startsWith("-")) {
93
+ out.command = arg;
94
+ continue;
95
+ }
96
+ switch (arg) {
97
+ case "--json":
98
+ out.json = true;
99
+ break;
100
+ case "--force":
101
+ case "-f":
102
+ out.force = true;
103
+ break;
104
+ case "--all":
105
+ out.all = true;
106
+ break;
107
+ case "--reset-profile":
108
+ out.resetProfile = true;
109
+ break;
110
+ case "--help":
111
+ case "-h":
112
+ out.help = true;
113
+ break;
114
+ default:
115
+ if (arg.startsWith("-")) throw new Error(`unknown flag: ${arg}`);
116
+ out.positional.push(arg);
117
+ }
118
+ }
119
+ return out;
120
+ }
121
+
122
+ function listTools(json: boolean): number {
123
+ const statuses = toolStatuses();
124
+ if (json) {
125
+ process.stdout.write(`${JSON.stringify(statuses.map(jsonShape), null, 2)}\n`);
126
+ return 0;
127
+ }
128
+ const rows = statuses.map((status) => [
129
+ status.id,
130
+ status.version,
131
+ status.license,
132
+ status.resolution.source,
133
+ describeResolution(status),
134
+ ]);
135
+ process.stdout.write(formatColumns([["TOOL", "PIN", "LICENSE", "SOURCE", "RESOLVED"], ...rows]));
136
+ return 0;
137
+ }
138
+
139
+ function invalidResetProfile(): number {
140
+ printError("--reset-profile is only valid with `tools status yazi`");
141
+ return 2;
142
+ }
143
+
144
+ /**
145
+ * The one refusal an unknown id gets, from every verb.
146
+ *
147
+ * It names the tools that do exist, because the whole error an operator makes
148
+ * here is a name: `tools remove herd` and `tools remove tmux` want different
149
+ * answers, and the registry list gives both of them one.
150
+ */
151
+ function unknownTool(id: string): number {
152
+ printError(`unknown tool: ${id} (known: ${PINNED_TOOLS.map((row) => row.id).join(", ")})`);
153
+ return 2;
154
+ }
155
+
156
+ function statusTool(id: string | undefined, json: boolean, resetProfile: boolean): number {
157
+ if (id === undefined) {
158
+ printError("usage: clio-coder tools status <id>");
159
+ return 2;
160
+ }
161
+ const entry = findPinnedTool(id);
162
+ if (entry === null) {
163
+ return unknownTool(id);
164
+ }
165
+ if (resetProfile && id !== "yazi") return invalidResetProfile();
166
+ if (resetProfile) resetYaziProfile();
167
+ const status = toolStatus(entry);
168
+ const profile = id === "yazi" ? inspectCurrentYaziProfile() : null;
169
+ if (json) {
170
+ process.stdout.write(
171
+ `${JSON.stringify({ ...jsonShape(status), ...(profile ? { profile, profileReset: resetProfile } : {}) }, null, 2)}\n`,
172
+ );
173
+ return 0;
174
+ }
175
+ const rejection = describeFloorRejection(status);
176
+ const installedVersions = installedToolVersions(entry.id);
177
+ const lines = [
178
+ `${entry.id} ${entry.version} (${entry.license})`,
179
+ ` ${entry.summary}`,
180
+ ` homepage ${entry.homepage}`,
181
+ ` binaries ${entry.binaries.join(", ")}`,
182
+ ` PATH floor ${entry.minimumVersion}`,
183
+ ` platform ${status.platform ?? `${process.platform}-${process.arch}`}${status.supported ? "" : " (no pinned asset)"}`,
184
+ ` vendor dir ${status.installDir}${status.installed ? "" : " (not installed)"}`,
185
+ ` vendored ${installedVersions.length === 0 ? "nothing" : installedVersions.join(", ")}`,
186
+ ` resolves to ${describeResolution(status)}`,
187
+ // Spelled out on its own line as well as inside the resolution sentence,
188
+ // because a rejected PATH copy is the one thing an operator reads this
189
+ // command to understand and the sentence above may be about something else.
190
+ ...(rejection === null
191
+ ? []
192
+ : [
193
+ ` floor rejected: ${rejection}`,
194
+ ...(status.resolution.source === "none" && status.supported ? [` remedy ${installRemedy(entry.id)}`] : []),
195
+ ]),
196
+ ...(profile
197
+ ? [
198
+ ` profile ${describeYaziProfile(profile)}`,
199
+ ...(resetProfile ? [" profile reset; next open regenerates it"] : []),
200
+ ]
201
+ : []),
202
+ ];
203
+ process.stdout.write(`${lines.join("\n")}\n`);
204
+ return 0;
205
+ }
206
+
207
+ async function installOne(id: string | undefined, force: boolean, json: boolean): Promise<number> {
208
+ if (id === undefined) {
209
+ printError("usage: clio-coder tools install <id>");
210
+ return 2;
211
+ }
212
+ if (findPinnedTool(id) === null) {
213
+ return unknownTool(id);
214
+ }
215
+ const result = await installTool(id, {
216
+ force,
217
+ ...(json ? {} : { onProgress: (message: string) => process.stderr.write(` ${message}\n`) }),
218
+ });
219
+ if (json) {
220
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
221
+ return result.ok ? 0 : 1;
222
+ }
223
+ if (!result.ok) {
224
+ printError(result.message);
225
+ return 1;
226
+ }
227
+ printOk(result.message);
228
+ for (const path of result.documents) process.stdout.write(` license ${path}\n`);
229
+ for (const version of result.pruned) process.stdout.write(` pruned ${id} ${version}\n`);
230
+ return 0;
231
+ }
232
+
233
+ /**
234
+ * Delete a tool's vendored install.
235
+ *
236
+ * The two answers an operator can act on are "there was nothing there" and
237
+ * "these versions are gone", and both are exit 0: the state they asked for
238
+ * holds either way. Only an id the registry does not know is a usage error,
239
+ * because that is the one case where nothing was inspected at all.
240
+ */
241
+ function removeOne(id: string | undefined, json: boolean): number {
242
+ if (id === undefined) {
243
+ printError("usage: clio-coder tools remove <id>");
244
+ return 2;
245
+ }
246
+ if (findPinnedTool(id) === null) return unknownTool(id);
247
+ const result = removeTool(id);
248
+ if (json) {
249
+ process.stdout.write(`${JSON.stringify(result, null, 2)}\n`);
250
+ return result.ok ? 0 : 1;
251
+ }
252
+ if (!result.ok) {
253
+ printError(result.message);
254
+ return 1;
255
+ }
256
+ printOk(result.message);
257
+ if (result.removed.length > 0) {
258
+ process.stdout.write(` reinstall with \`${installRemedy(id)}\`\n`);
259
+ }
260
+ return 0;
261
+ }
262
+
263
+ /**
264
+ * Delete every pinned tool's vendored install.
265
+ *
266
+ * Each tool is swept independently and the exit code is the worst of them, so
267
+ * one directory that resists deletion does not hide the two that came off
268
+ * cleanly. Tools that had nothing installed are counted rather than listed:
269
+ * on the machine this verb is for, most of the registry is usually absent, and
270
+ * three lines of "nothing to remove" would bury the one line that matters.
271
+ */
272
+ function removeAll(id: string | undefined, json: boolean): number {
273
+ if (id !== undefined) {
274
+ printError("`tools remove --all` takes no tool id; drop the id or drop --all");
275
+ return 2;
276
+ }
277
+ const results = PINNED_TOOLS.map((entry) => removeTool(entry.id));
278
+ if (json) {
279
+ process.stdout.write(`${JSON.stringify(results, null, 2)}\n`);
280
+ return results.every((result) => result.ok) ? 0 : 1;
281
+ }
282
+ for (const result of results) {
283
+ if (!result.ok) printError(result.message);
284
+ else if (result.removed.length > 0 || result.staleStaging.length > 0) printOk(result.message);
285
+ }
286
+ const touched = results.filter((result) => result.ok && result.removed.length > 0);
287
+ const untouched = results.filter((result) => result.ok && result.removed.length === 0);
288
+ if (touched.length > 0) {
289
+ process.stdout.write(` reinstall with \`clio-coder tools install <id>\`\n`);
290
+ }
291
+ if (untouched.length > 0) {
292
+ process.stdout.write(` ${untouched.length} of ${results.length} had nothing vendored\n`);
293
+ }
294
+ return results.every((result) => result.ok) ? 0 : 1;
295
+ }
296
+
297
+ /** The JSON surface, flattened so a script does not have to walk the resolution. */
298
+ function jsonShape(status: ToolStatus): Record<string, unknown> {
299
+ return {
300
+ id: status.id,
301
+ version: status.version,
302
+ license: status.license,
303
+ platform: status.platform,
304
+ supported: status.supported,
305
+ installed: status.installed,
306
+ installDir: status.installDir,
307
+ source: status.resolution.source,
308
+ binaryPath: status.resolution.binaryPath,
309
+ foundVersion: status.resolution.version,
310
+ minimumVersion: status.resolution.entry?.minimumVersion ?? null,
311
+ pathCandidate: status.resolution.pathCandidate,
312
+ // A script deciding whether to warn about a floor rejection should not have
313
+ // to parse `detail` for it, so the rejection and the command that answers
314
+ // it are their own fields. `remedy` is null exactly where installing would
315
+ // change nothing: already vendored, or no asset for this platform.
316
+ floorRejection: describeFloorRejection(status),
317
+ remedy: status.resolution.source === "none" && status.supported ? installRemedy(status.id) : null,
318
+ installedVersions: installedToolVersions(status.id),
319
+ detail: describeResolution(status),
320
+ };
321
+ }
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Fixed machine-readable projection of recent durable trace runs and phases.
3
+ *
4
+ * `trace runs --json` is an operator-directed terminal surface: it takes a
5
+ * database path and a limit, and it emits `SELECT *`, which includes the
6
+ * request text the operator typed. The GUI cannot reuse that transport. This
7
+ * command accepts no identifier, path, or limit, opens only the default trace
8
+ * database, selects a bounded newest-first window itself, and emits accounting
9
+ * facts with no prompt text, no free-form description or error, and no path.
10
+ *
11
+ * It is deliberately a separate read from `fleet inspect --json` even though
12
+ * both are keyed by run id. The ledger and the trace database are different
13
+ * durable stores with different failure modes: an installation that never
14
+ * enabled tracing has no trace database at all, and that must be an empty
15
+ * answer here rather than a failure of the run journal.
16
+ */
17
+
18
+ import { existsSync } from "node:fs";
19
+ import { clioStatePath } from "../core/xdg.js";
20
+ import { TraceReader, traceDatabasePath } from "../domains/observability/trace-store.js";
21
+ import { sanitizeCallTargetText } from "../domains/safety/call-target.js";
22
+ import { truncateToWidth } from "../engine/tui-primitives.js";
23
+
24
+ export const TRACE_INSPECT_MAX_RUNS = 8;
25
+ export const TRACE_INSPECT_MAX_PHASES = 16;
26
+ export const TRACE_INSPECT_MAX_EVENT_KINDS = 12;
27
+ export const TRACE_INSPECT_MAX_PROCESS_KINDS = 8;
28
+
29
+ const IDENTITY_WIDTH = 128;
30
+ const STATUS_WIDTH = 64;
31
+
32
+ export interface TraceInspectPhase {
33
+ readonly name: string;
34
+ readonly kind: string;
35
+ readonly owner: string;
36
+ readonly status: string;
37
+ readonly attempt: number;
38
+ readonly retries: number;
39
+ /** Whether the phase recorded an error, without the error text itself. */
40
+ readonly failed: boolean;
41
+ readonly elapsedMs: number | null;
42
+ readonly totalTokens: number | null;
43
+ readonly totalCostUsd: number | null;
44
+ }
45
+
46
+ /**
47
+ * What a run's events were, in aggregate.
48
+ *
49
+ * Deliberately shapes and not rows. A trace event carries `payload_json` and a
50
+ * free-form name, which are the class of value this boundary keeps host-side,
51
+ * so the tail itself stays in the terminal and what crosses is how many events
52
+ * of each kind there were and the span they cover. The counts come out of SQL,
53
+ * so the payloads are not read on the way to counting them.
54
+ */
55
+ export interface TraceInspectEvents {
56
+ readonly total: number;
57
+ readonly firstAt: string | null;
58
+ readonly lastAt: string | null;
59
+ readonly kinds: readonly { readonly kind: string; readonly count: number }[];
60
+ readonly kindsTruncated: boolean;
61
+ }
62
+
63
+ /**
64
+ * What a run's child processes were, in aggregate.
65
+ *
66
+ * Same rule, applied harder: a process row carries the command line, the pid,
67
+ * and the host. None of that is needed to say a run spawned four workers and
68
+ * one is still alive, and none of it crosses.
69
+ */
70
+ export interface TraceInspectProcesses {
71
+ readonly total: number;
72
+ readonly running: number;
73
+ readonly kinds: readonly { readonly kind: string; readonly total: number; readonly running: number }[];
74
+ readonly kindsTruncated: boolean;
75
+ }
76
+
77
+ export interface TraceInspectRun {
78
+ readonly runId: string;
79
+ readonly agent: string;
80
+ readonly target: string;
81
+ readonly model: string;
82
+ readonly runtime: string;
83
+ readonly node: string | null;
84
+ readonly status: string;
85
+ readonly startedAt: string;
86
+ readonly elapsedMs: number | null;
87
+ readonly totalTokens: number | null;
88
+ readonly totalCostUsd: number | null;
89
+ readonly phases: readonly TraceInspectPhase[];
90
+ readonly phasesTruncated: boolean;
91
+ readonly events: TraceInspectEvents;
92
+ readonly processes: TraceInspectProcesses;
93
+ }
94
+
95
+ export interface TraceInspectSnapshot {
96
+ readonly version: 1;
97
+ readonly generatedAt: string;
98
+ /**
99
+ * False when this installation has no trace database. That is the ordinary
100
+ * state of an installation that never enabled tracing, and it has to stay
101
+ * distinguishable from a database that exists and holds no runs.
102
+ */
103
+ readonly available: boolean;
104
+ readonly runs: readonly TraceInspectRun[];
105
+ readonly truncated: boolean;
106
+ }
107
+
108
+ function bounded(value: string, width: number): string {
109
+ const sanitized = sanitizeCallTargetText(value);
110
+ if (sanitized.length === 0) return "unavailable";
111
+ return sanitizeCallTargetText(truncateToWidth(sanitized, width, "…", false));
112
+ }
113
+
114
+ function nullableBounded(value: string | null, width: number): string | null {
115
+ return value === null ? null : bounded(value, width);
116
+ }
117
+
118
+ /** A finite non-negative count, or null when the store recorded none. */
119
+ function tally(value: number | null): number | null {
120
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : null;
121
+ }
122
+
123
+ /** A finite non-negative cost, or null. Kept as a number so the GUI formats it. */
124
+ function cost(value: number | null): number | null {
125
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
126
+ }
127
+
128
+ /**
129
+ * Wall time between two stamps. Null rather than zero when either is missing or
130
+ * unparseable, because "still running" and "took no time" are different facts.
131
+ */
132
+ function elapsed(startedAt: string | null, endedAt: string | null): number | null {
133
+ if (startedAt === null || endedAt === null) return null;
134
+ const start = Date.parse(startedAt);
135
+ const end = Date.parse(endedAt);
136
+ if (!Number.isFinite(start) || !Number.isFinite(end)) return null;
137
+ return Math.max(0, end - start);
138
+ }
139
+
140
+ function eventSummary(reader: TraceReader, runId: string): TraceInspectEvents {
141
+ const span = reader.eventSpan(runId);
142
+ const all = reader.eventKindCounts(runId);
143
+ const visible = all.slice(0, TRACE_INSPECT_MAX_EVENT_KINDS);
144
+ return {
145
+ total: tally(span.total) ?? 0,
146
+ firstAt: span.firstAt,
147
+ lastAt: span.lastAt,
148
+ kinds: visible.map((entry) => ({ kind: bounded(entry.type, STATUS_WIDTH), count: tally(entry.count) ?? 0 })),
149
+ kindsTruncated: all.length > visible.length,
150
+ };
151
+ }
152
+
153
+ function processSummary(reader: TraceReader, runId: string): TraceInspectProcesses {
154
+ const all = reader.processKindCounts(runId);
155
+ const visible = all.slice(0, TRACE_INSPECT_MAX_PROCESS_KINDS);
156
+ return {
157
+ total: all.reduce((sum, entry) => sum + (tally(entry.total) ?? 0), 0),
158
+ running: all.reduce((sum, entry) => sum + (tally(entry.running) ?? 0), 0),
159
+ kinds: visible.map((entry) => ({
160
+ kind: bounded(entry.kind, STATUS_WIDTH),
161
+ total: tally(entry.total) ?? 0,
162
+ running: tally(entry.running) ?? 0,
163
+ })),
164
+ kindsTruncated: all.length > visible.length,
165
+ };
166
+ }
167
+
168
+ /** Pure payload builder, exported so the fixed contract is testable without subprocess capture. */
169
+ export function traceInspectSnapshot(
170
+ now: () => number = Date.now,
171
+ databasePath: string = traceDatabasePath(clioStatePath()),
172
+ ): TraceInspectSnapshot {
173
+ const generatedAt = new Date(now()).toISOString();
174
+ if (!existsSync(databasePath)) {
175
+ return { version: 1, generatedAt, available: false, runs: [], truncated: false };
176
+ }
177
+ let reader: TraceReader;
178
+ try {
179
+ reader = new TraceReader(databasePath);
180
+ } catch {
181
+ // A database that exists but will not open is not an empty installation,
182
+ // and it is not this command's job to diagnose it. Report it as present
183
+ // with nothing readable rather than inventing either extreme.
184
+ return { version: 1, generatedAt, available: true, runs: [], truncated: false };
185
+ }
186
+ try {
187
+ const selected = reader.runs(TRACE_INSPECT_MAX_RUNS + 1);
188
+ const window = selected.slice(0, TRACE_INSPECT_MAX_RUNS);
189
+ const runs = window.map((row): TraceInspectRun => {
190
+ const allPhases = reader.phases(row.run_id);
191
+ const visible = allPhases.slice(0, TRACE_INSPECT_MAX_PHASES);
192
+ return {
193
+ runId: bounded(row.run_id, IDENTITY_WIDTH),
194
+ agent: bounded(row.agent, IDENTITY_WIDTH),
195
+ target: bounded(row.target, IDENTITY_WIDTH),
196
+ model: bounded(row.model, IDENTITY_WIDTH),
197
+ runtime: bounded(row.runtime, IDENTITY_WIDTH),
198
+ node: nullableBounded(row.node, IDENTITY_WIDTH),
199
+ status: bounded(row.status, STATUS_WIDTH),
200
+ startedAt: row.started_at,
201
+ elapsedMs: elapsed(row.started_at, row.ended_at),
202
+ totalTokens: tally(row.total_tokens),
203
+ totalCostUsd: cost(row.total_cost_usd),
204
+ phases: visible.map(
205
+ (phase): TraceInspectPhase => ({
206
+ name: bounded(phase.name, IDENTITY_WIDTH),
207
+ kind: bounded(phase.kind, STATUS_WIDTH),
208
+ owner: bounded(phase.owner, IDENTITY_WIDTH),
209
+ status: bounded(phase.status, STATUS_WIDTH),
210
+ attempt: tally(phase.attempt) ?? 0,
211
+ retries: tally(phase.retries) ?? 0,
212
+ // The error text can quote a path, a URL, or a model reply, so only
213
+ // the fact that one was recorded crosses.
214
+ failed: phase.error !== null && phase.error !== "",
215
+ elapsedMs: elapsed(phase.started_at, phase.ended_at),
216
+ totalTokens: tally(phase.total_tokens),
217
+ totalCostUsd: cost(phase.total_cost_usd),
218
+ }),
219
+ ),
220
+ phasesTruncated: allPhases.length > visible.length,
221
+ events: eventSummary(reader, row.run_id),
222
+ processes: processSummary(reader, row.run_id),
223
+ };
224
+ });
225
+ return {
226
+ version: 1,
227
+ generatedAt,
228
+ available: true,
229
+ runs,
230
+ truncated: selected.length > window.length,
231
+ };
232
+ } finally {
233
+ reader.close();
234
+ }
235
+ }
236
+
237
+ /**
238
+ * `clio-coder trace inspect --json`, and nothing else.
239
+ *
240
+ * `fixed` is false as soon as the caller supplied a database, a limit, a follow,
241
+ * or any other positional. The whole point of this command is that its argv is
242
+ * not a surface: a GUI host can invoke it and be certain the process it started
243
+ * cannot be steered into reading a different file or a wider window.
244
+ */
245
+ export function runTraceInspect(fixed: boolean): number {
246
+ if (!fixed) {
247
+ process.stderr.write("clio-coder trace inspect: usage: clio-coder trace inspect --json\n");
248
+ return 2;
249
+ }
250
+ process.stdout.write(`${JSON.stringify(traceInspectSnapshot(), null, 2)}\n`);
251
+ return 0;
252
+ }