@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,82 @@
1
+ import { lstatSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { resolveClioDirs } from "../core/xdg.js";
4
+ import type { DoctorFinding } from "../domains/lifecycle/doctor.js";
5
+
6
+ interface MeasuredEntry {
7
+ bytes: number;
8
+ error: string | null;
9
+ }
10
+
11
+ /** Report aggregate state usage and the largest top-level contributor. */
12
+ export function stateStorageFinding(stateDir = resolveClioDirs().state): DoctorFinding {
13
+ let names: string[];
14
+ try {
15
+ names = readdirSync(stateDir);
16
+ } catch (error) {
17
+ return {
18
+ ok: false,
19
+ name: "state storage",
20
+ detail: `${stateDir} could not be measured: ${error instanceof Error ? error.message : String(error)}`,
21
+ };
22
+ }
23
+
24
+ let total = 0;
25
+ let largest: { name: string; bytes: number } | null = null;
26
+ for (const name of names.sort()) {
27
+ const measured = measureEntry(join(stateDir, name));
28
+ if (measured.error !== null) {
29
+ return { ok: false, name: "state storage", detail: measured.error };
30
+ }
31
+ total += measured.bytes;
32
+ if (largest === null || measured.bytes > largest.bytes) largest = { name, bytes: measured.bytes };
33
+ }
34
+
35
+ return {
36
+ ok: true,
37
+ name: "state storage",
38
+ detail:
39
+ largest === null
40
+ ? `${formatBytes(total)} (${total.toLocaleString("en-US")} bytes); largest contributor none`
41
+ : `${formatBytes(total)} (${total.toLocaleString("en-US")} bytes); largest contributor ${largest.name} at ${formatBytes(largest.bytes)} (${largest.bytes.toLocaleString("en-US")} bytes)`,
42
+ };
43
+ }
44
+
45
+ function measureEntry(path: string): MeasuredEntry {
46
+ let stats: ReturnType<typeof lstatSync>;
47
+ try {
48
+ stats = lstatSync(path);
49
+ } catch (error) {
50
+ return {
51
+ bytes: 0,
52
+ error: `${path} could not be inspected: ${error instanceof Error ? error.message : String(error)}`,
53
+ };
54
+ }
55
+ if (!stats.isDirectory() || stats.isSymbolicLink()) return { bytes: stats.size, error: null };
56
+
57
+ let names: string[];
58
+ try {
59
+ names = readdirSync(path);
60
+ } catch (error) {
61
+ return { bytes: 0, error: `${path} could not be listed: ${error instanceof Error ? error.message : String(error)}` };
62
+ }
63
+ let bytes = 0;
64
+ for (const name of names) {
65
+ const child = measureEntry(join(path, name));
66
+ if (child.error !== null) return child;
67
+ bytes += child.bytes;
68
+ }
69
+ return { bytes, error: null };
70
+ }
71
+
72
+ function formatBytes(bytes: number): string {
73
+ if (bytes < 1024) return `${bytes} B`;
74
+ const units = ["KiB", "MiB", "GiB", "TiB"];
75
+ let value = bytes;
76
+ let unit = -1;
77
+ do {
78
+ value /= 1024;
79
+ unit += 1;
80
+ } while (value >= 1024 && unit < units.length - 1);
81
+ return `${value.toFixed(value >= 10 ? 1 : 2)} ${units[unit]}`;
82
+ }
@@ -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,6 +7,9 @@ import {
7
7
  runDoctorModelChecks,
8
8
  runDoctorRuntimeChecks,
9
9
  } from "../domains/lifecycle/doctor.js";
10
+ import { panesFindings } from "./doctor-panes.js";
11
+ import { stateStorageFinding } from "./doctor-state-size.js";
12
+ import { toolchainFindings } from "./doctor-toolchain.js";
10
13
  import { printError } from "./shared.js";
11
14
 
12
15
  const HELP = `clio-coder doctor [--fix] [--json]
@@ -35,6 +38,7 @@ export async function runDoctorCommand(args: ReadonlyArray<string> = []): Promis
35
38
  // gets every check on the home it just built.
36
39
  const untouched = !fix && isUninitializedHome();
37
40
  const findings = runDoctor({ fix });
41
+ const storageChecks = untouched ? [] : [stateStorageFinding()];
38
42
  const runtimeChecks = await runDoctorRuntimeChecks();
39
43
  // Every model pointer is checked against what its target advertises, so a
40
44
  // placeholder id saved by configure is reported here and not on the first turn.
@@ -47,7 +51,24 @@ export async function runDoctorCommand(args: ReadonlyArray<string> = []): Promis
47
51
  // Fleet preflight probes each configured node over SSH and persists the
48
52
  // per-node eligibility verdicts dispatch placement enforces.
49
53
  const fleetChecks = untouched ? [] : await runDoctorFleetChecks();
50
- const all = [...findings, ...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
+ ];
51
72
  const ok = all.every((f) => f.ok);
52
73
  if (json) {
53
74
  process.stdout.write(`${JSON.stringify({ ok, fix, findings: all }, null, 2)}\n`);
@@ -0,0 +1,436 @@
1
+ /**
2
+ * Fixed machine-readable projection of the eval reports this installation stored.
3
+ *
4
+ * Neither existing read works as a transport. `eval report <evalId>` and
5
+ * `eval compare <a> <b>` both require the operator to already name the reports
6
+ * they want, and nothing enumerated the store, so a GUI host had nowhere to
7
+ * start. This command accepts no identifier, no path, and no limit; it selects
8
+ * a bounded newest-first window itself and emits each report's identity,
9
+ * provenance, serving facts, accounting, and per-scenario outcome counts.
10
+ *
11
+ * An eval artifact is the largest single host-only payload in this harness, and
12
+ * the reason is worth stating rather than discovering. `results[].artifacts`
13
+ * holds whatever the runner attached, which for the `clio-run` runner is the
14
+ * entire session transcript: the operator's task text, every tool argument and
15
+ * result, the model's replies, provider endpoint URLs, error prose, and the
16
+ * prepared workspace path. There is no width at which a projection of that is
17
+ * safe, so it does not cross at any width and its per-report count crosses
18
+ * instead. That is the same class as a trace event's payload and a process
19
+ * command line, and it is why this read is a summary rather than a viewer.
20
+ *
21
+ * Held back for the same reason or the next one down: the eval entry path, the
22
+ * per-result metric map (open-keyed, and its string values include content
23
+ * hashes and a workspace's own structural digest), the compiled prompt hash,
24
+ * the suite hash, the terminal receipt digests, and the behavioral judge's
25
+ * facts and excerpts. What crosses instead is how many of each there are, and
26
+ * the closed vocabularies the harness mints itself.
27
+ */
28
+
29
+ import { clioDataDir } from "../core/xdg.js";
30
+ import { listEvalReports } from "../domains/eval/inventory.js";
31
+ import type { EvalArtifactResultV4, EvalArtifactV4 } from "../domains/eval/schema/artifact.js";
32
+ import { EVAL_EXECUTION_MATRIX_DIMENSIONS_V1 } from "../domains/eval/schema/execution-envelope.js";
33
+ import { evalServingConfigurationOf, sameEvalServingConfiguration } from "../domains/eval/schema/serving.js";
34
+ import { CANONICAL_METRIC_PREFIXES, CANONICAL_METRICS } from "../domains/eval/schema/suite.js";
35
+
36
+ /** Wire bound on the report window. */
37
+ export const EVAL_INVENTORY_MAX_REPORTS = 8;
38
+ /** Wire bound on each report's per-scenario roll-up. */
39
+ export const EVAL_INVENTORY_MAX_SCENARIOS = 16;
40
+
41
+ /**
42
+ * Every failure class the suite runner mints, and nothing else.
43
+ *
44
+ * The legacy v1 runner also has `timeout` and `cwd_missing`, and they are
45
+ * deliberately absent: routing accepts artifact v4 only, so this read can never
46
+ * emit them and carrying them would state a distinction it never establishes.
47
+ */
48
+ const FAILURE_CLASSES = [
49
+ "budget_exhausted",
50
+ "runner_failed",
51
+ "grader_failed",
52
+ "verifier_failed",
53
+ "forbidden_path",
54
+ "assertion_unresolved",
55
+ "assertion_failed",
56
+ "setup_failed",
57
+ "command_error",
58
+ ] as const;
59
+
60
+ /** A class outside the set is a real answer: the result still failed, and the operator still learns that. */
61
+ type EvalInventoryFailureClass = (typeof FAILURE_CLASSES)[number] | "other";
62
+
63
+ const REPORTED_FAILURE_CLASSES: readonly EvalInventoryFailureClass[] = [...FAILURE_CLASSES, "other"];
64
+
65
+ const BEHAVIOR_OUTCOMES = ["pass", "behavioral_failure", "unknown", "unmeasured", "infrastructure_failure"] as const;
66
+ type EvalInventoryBehaviorOutcome = (typeof BEHAVIOR_OUTCOMES)[number];
67
+
68
+ const IDENTIFIER_PATTERN = /^[A-Za-z0-9._-]{1,128}$/u;
69
+ const VERSION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$/u;
70
+ const COMMIT_PATTERN = /^[0-9a-f]{7,64}$/u;
71
+
72
+ export interface EvalInventoryTokens {
73
+ /** False when no run reported provider usage. The counts are then absent rather than zero. */
74
+ readonly measured: boolean;
75
+ readonly runs: number;
76
+ readonly measuredRuns: number;
77
+ readonly input: number | null;
78
+ readonly output: number | null;
79
+ readonly total: number | null;
80
+ readonly cacheRead: number | null;
81
+ readonly cacheWrite: number | null;
82
+ }
83
+
84
+ export interface EvalInventoryScenario {
85
+ readonly scenarioId: string;
86
+ readonly trials: number;
87
+ readonly passed: number;
88
+ readonly failed: number;
89
+ readonly unmeasured: number;
90
+ readonly machineryFailures: number;
91
+ readonly passAtK: number;
92
+ readonly passPowK: number;
93
+ }
94
+
95
+ export interface EvalInventoryReport {
96
+ readonly evalId: string;
97
+ readonly startedAt: string | null;
98
+ readonly suiteId: string;
99
+ /**
100
+ * A 1-based ordinal over `sameEvalServingConfiguration`, the rule `eval
101
+ * compare` itself uses to decide two runs are comparable.
102
+ *
103
+ * The fields that rule compares include the compiled prompt hash, which is a
104
+ * fingerprint and does not cross. The relation it establishes does: two
105
+ * reports sharing an ordinal are two `eval compare` will accept without
106
+ * `--allow-config-drift`, which is the fact an operator picking a baseline
107
+ * needs, and the ordinal reveals nothing about the values behind it.
108
+ */
109
+ readonly servingGroup: number;
110
+ readonly clioVersion: string | null;
111
+ readonly clioCommit: string | null;
112
+ readonly platform: string | null;
113
+ readonly node: string | null;
114
+ readonly matrix: {
115
+ readonly target: string | null;
116
+ readonly model: string | null;
117
+ readonly thinking: string | null;
118
+ readonly dimensions: readonly string[];
119
+ };
120
+ readonly serving: {
121
+ /** False when the artifact recorded none and the matrix it declared is standing in. */
122
+ readonly observed: boolean;
123
+ readonly targetId: string | null;
124
+ readonly runtimeId: string | null;
125
+ readonly modelId: string | null;
126
+ readonly serverBuild: string | null;
127
+ readonly thinkingLevel: string | null;
128
+ readonly totalSlots: number | null;
129
+ /** Whether a compiled prompt hash was recorded. The hash itself stays on the host. */
130
+ readonly compiledPromptPinned: boolean;
131
+ };
132
+ readonly summary: {
133
+ readonly runs: number;
134
+ readonly passed: number;
135
+ readonly failed: number;
136
+ readonly passRate: number;
137
+ readonly wallTimeMs: number;
138
+ readonly tokens: EvalInventoryTokens;
139
+ };
140
+ readonly results: {
141
+ readonly total: number;
142
+ readonly withAssignment: number;
143
+ readonly withTerminalReceipt: number;
144
+ readonly withVerdict: number;
145
+ readonly withBehavioral: number;
146
+ readonly withExecutionEnvelope: number;
147
+ readonly machineryFailures: number;
148
+ /** Runner attachments across the report. Their contents are host-only at any width. */
149
+ readonly attachments: number;
150
+ /** Metric readings whose name the suite schema declares, and readings whose name it does not. */
151
+ readonly canonicalMetrics: number;
152
+ readonly otherMetrics: number;
153
+ };
154
+ readonly failureClasses: readonly { readonly failureClass: EvalInventoryFailureClass; readonly count: number }[];
155
+ readonly behaviorOutcomes: readonly {
156
+ readonly outcome: EvalInventoryBehaviorOutcome;
157
+ readonly count: number;
158
+ }[];
159
+ /** Null when the artifact carried no scenario reductions at all, which is not the same as carrying none. */
160
+ readonly scenarios: readonly EvalInventoryScenario[] | null;
161
+ readonly scenariosTruncated: boolean;
162
+ /** Reductions refused because their own counts did not add up, counted rather than hidden. */
163
+ readonly scenariosDropped: number;
164
+ }
165
+
166
+ export interface EvalInventorySnapshot {
167
+ readonly version: 1;
168
+ readonly generatedAt: string;
169
+ readonly available: boolean;
170
+ readonly stored: number;
171
+ readonly unreadable: number;
172
+ readonly reports: readonly EvalInventoryReport[];
173
+ readonly truncated: boolean;
174
+ }
175
+
176
+ const CANONICAL_METRIC_NAMES: ReadonlySet<string> = new Set(CANONICAL_METRICS);
177
+
178
+ function isCanonicalMetric(name: string): boolean {
179
+ return CANONICAL_METRIC_NAMES.has(name) || CANONICAL_METRIC_PREFIXES.some((prefix) => name.startsWith(prefix));
180
+ }
181
+
182
+ function identifier(value: string | null): string | null {
183
+ return value !== null && IDENTIFIER_PATTERN.test(value) ? value : null;
184
+ }
185
+
186
+ function tally(value: unknown): number {
187
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? Math.trunc(value) : 0;
188
+ }
189
+
190
+ function isRecord(value: unknown): value is Record<string, unknown> {
191
+ return typeof value === "object" && value !== null && !Array.isArray(value);
192
+ }
193
+
194
+ /**
195
+ * `parseEvalArtifactV4` casts the aggregates array through without checking its
196
+ * entries, so this is the first thing that looks at them. A scenario whose id
197
+ * or counts are not what the reducer produces is dropped rather than repaired:
198
+ * a scenario roll-up is a derived number, and a wrong one is worse than a
199
+ * missing one.
200
+ */
201
+ function projectScenarios(artifact: EvalArtifactV4): {
202
+ scenarios: EvalInventoryScenario[] | null;
203
+ truncated: boolean;
204
+ dropped: number;
205
+ } {
206
+ if (artifact.aggregates === undefined) return { scenarios: null, truncated: false, dropped: 0 };
207
+ const projected: EvalInventoryScenario[] = [];
208
+ let dropped = 0;
209
+ for (const entry of artifact.aggregates) {
210
+ if (!isRecord(entry)) {
211
+ dropped += 1;
212
+ continue;
213
+ }
214
+ const scenarioId = identifier(typeof entry.scenarioId === "string" ? entry.scenarioId : null);
215
+ if (scenarioId === null) {
216
+ dropped += 1;
217
+ continue;
218
+ }
219
+ const trials = tally(entry.trials);
220
+ const passed = tally(entry.passed);
221
+ const failed = tally(entry.failed);
222
+ const unmeasured = tally(entry.unmeasured);
223
+ const machineryFailures = tally(entry.machineryFailures);
224
+ // The reducer partitions one scenario's trials into exactly three outcomes
225
+ // and counts machinery failures inside them, so anything else did not come
226
+ // out of `aggregateEvalVerdicts`. It is counted rather than hidden, because
227
+ // a scenario list that looks whole while a reduction was refused would let
228
+ // the wire cross-check read as satisfied.
229
+ if (passed + failed + unmeasured !== trials || machineryFailures > failed) {
230
+ dropped += 1;
231
+ continue;
232
+ }
233
+ projected.push({
234
+ scenarioId,
235
+ trials,
236
+ passed,
237
+ failed,
238
+ unmeasured,
239
+ machineryFailures,
240
+ // Re-derived rather than read, because both are pure functions of the
241
+ // counts beside them and a stored disagreement is not a second opinion.
242
+ passAtK: trials > 0 && passed > 0 ? 1 : 0,
243
+ passPowK: trials > 0 && passed === trials ? 1 : 0,
244
+ });
245
+ }
246
+ const scenarios = projected.slice(0, EVAL_INVENTORY_MAX_SCENARIOS);
247
+ return { scenarios, truncated: scenarios.length < projected.length, dropped };
248
+ }
249
+
250
+ function projectTokens(artifact: EvalArtifactV4): EvalInventoryTokens {
251
+ const tokens = artifact.summary.tokens;
252
+ if (!tokens.measured) {
253
+ return {
254
+ measured: false,
255
+ runs: tally(tokens.runs),
256
+ measuredRuns: 0,
257
+ input: null,
258
+ output: null,
259
+ total: null,
260
+ cacheRead: null,
261
+ cacheWrite: null,
262
+ };
263
+ }
264
+ return {
265
+ measured: true,
266
+ runs: tally(tokens.runs),
267
+ measuredRuns: tally(tokens.measuredRuns),
268
+ input: tally(tokens.input),
269
+ output: tally(tokens.output),
270
+ total: tally(tokens.total),
271
+ cacheRead: tally(tokens.cacheRead),
272
+ cacheWrite: tally(tokens.cacheWrite),
273
+ };
274
+ }
275
+
276
+ function classifyFailure(failureClass: string | null): EvalInventoryFailureClass | null {
277
+ if (failureClass === null) return null;
278
+ return (FAILURE_CLASSES as readonly string[]).includes(failureClass)
279
+ ? (failureClass as EvalInventoryFailureClass)
280
+ : "other";
281
+ }
282
+
283
+ function countResults(results: readonly EvalArtifactResultV4[]): {
284
+ counts: EvalInventoryReport["results"];
285
+ failureClasses: EvalInventoryReport["failureClasses"];
286
+ behaviorOutcomes: EvalInventoryReport["behaviorOutcomes"];
287
+ } {
288
+ let withAssignment = 0;
289
+ let withTerminalReceipt = 0;
290
+ let withVerdict = 0;
291
+ let withBehavioral = 0;
292
+ let withExecutionEnvelope = 0;
293
+ let machineryFailures = 0;
294
+ let attachments = 0;
295
+ let canonicalMetrics = 0;
296
+ let otherMetrics = 0;
297
+ const failures = new Map<EvalInventoryFailureClass, number>();
298
+ const outcomes = new Map<EvalInventoryBehaviorOutcome, number>();
299
+ for (const result of results) {
300
+ if (result.assignmentId !== null) withAssignment += 1;
301
+ if (result.terminalReceiptDigest !== null) withTerminalReceipt += 1;
302
+ if (result.verdict !== undefined) withVerdict += 1;
303
+ if (result.verdict?.machinery === "infrastructure_failure") machineryFailures += 1;
304
+ if (result.behavioral !== undefined) withBehavioral += 1;
305
+ if (result.executionEnvelope !== undefined) withExecutionEnvelope += 1;
306
+ attachments += Object.keys(result.artifacts).length;
307
+ for (const name of Object.keys(result.metrics)) {
308
+ if (isCanonicalMetric(name)) canonicalMetrics += 1;
309
+ else otherMetrics += 1;
310
+ }
311
+ const failureClass = classifyFailure(result.failureClass);
312
+ if (failureClass !== null) failures.set(failureClass, (failures.get(failureClass) ?? 0) + 1);
313
+ const outcome = result.behavioral?.outcome;
314
+ if (outcome !== undefined && (BEHAVIOR_OUTCOMES as readonly string[]).includes(outcome)) {
315
+ outcomes.set(outcome, (outcomes.get(outcome) ?? 0) + 1);
316
+ }
317
+ }
318
+ return {
319
+ counts: {
320
+ total: results.length,
321
+ withAssignment,
322
+ withTerminalReceipt,
323
+ withVerdict,
324
+ withBehavioral,
325
+ withExecutionEnvelope,
326
+ machineryFailures,
327
+ attachments,
328
+ canonicalMetrics,
329
+ otherMetrics,
330
+ },
331
+ failureClasses: REPORTED_FAILURE_CLASSES.flatMap((failureClass) => {
332
+ const count = failures.get(failureClass) ?? 0;
333
+ return count === 0 ? [] : [{ failureClass, count }];
334
+ }),
335
+ behaviorOutcomes: BEHAVIOR_OUTCOMES.flatMap((outcome) => {
336
+ const count = outcomes.get(outcome) ?? 0;
337
+ return count === 0 ? [] : [{ outcome, count }];
338
+ }),
339
+ };
340
+ }
341
+
342
+ function projectReport(
343
+ evalId: string,
344
+ startedAt: string | null,
345
+ artifact: EvalArtifactV4,
346
+ servingGroup: number,
347
+ ): EvalInventoryReport {
348
+ const serving = evalServingConfigurationOf(artifact);
349
+ const { counts, failureClasses, behaviorOutcomes } = countResults(artifact.results);
350
+ const { scenarios, truncated, dropped } = projectScenarios(artifact);
351
+ const version = artifact.clio.version;
352
+ const commit = artifact.clio.commit;
353
+ return {
354
+ evalId,
355
+ startedAt,
356
+ suiteId: identifier(artifact.suite.id) ?? "unavailable",
357
+ servingGroup,
358
+ clioVersion: VERSION_PATTERN.test(version) ? version : null,
359
+ clioCommit: commit !== null && COMMIT_PATTERN.test(commit) ? commit : null,
360
+ platform: identifier(artifact.environment.platform),
361
+ node: identifier(artifact.environment.node),
362
+ matrix: {
363
+ target: identifier(artifact.matrix.target),
364
+ model: identifier(artifact.matrix.model),
365
+ thinking: identifier(artifact.matrix.thinking),
366
+ dimensions: (artifact.matrix.dimensions ?? []).filter((dimension) =>
367
+ (EVAL_EXECUTION_MATRIX_DIMENSIONS_V1 as readonly string[]).includes(dimension),
368
+ ),
369
+ },
370
+ serving: {
371
+ observed: artifact.servingConfiguration !== undefined,
372
+ targetId: identifier(serving.targetId),
373
+ runtimeId: identifier(serving.runtimeId),
374
+ modelId: identifier(serving.modelId),
375
+ serverBuild: identifier(serving.serverBuild),
376
+ thinkingLevel: identifier(serving.thinkingLevel),
377
+ totalSlots: serving.total_slots === null ? null : tally(serving.total_slots),
378
+ compiledPromptPinned: serving.compiledPromptHash !== null,
379
+ },
380
+ summary: {
381
+ runs: tally(artifact.summary.runs),
382
+ passed: tally(artifact.summary.passed),
383
+ failed: tally(artifact.summary.failed),
384
+ passRate: Number.isFinite(artifact.summary.passRate) ? Math.min(1, Math.max(0, artifact.summary.passRate)) : 0,
385
+ wallTimeMs: tally(artifact.summary.wallTimeMs),
386
+ tokens: projectTokens(artifact),
387
+ },
388
+ results: counts,
389
+ failureClasses,
390
+ behaviorOutcomes,
391
+ scenarios,
392
+ scenariosTruncated: truncated,
393
+ scenariosDropped: dropped,
394
+ };
395
+ }
396
+
397
+ export async function evalInventorySnapshot(
398
+ now: () => number = Date.now,
399
+ dataDir: string = clioDataDir(),
400
+ ): Promise<EvalInventorySnapshot> {
401
+ const listing = await listEvalReports(dataDir, EVAL_INVENTORY_MAX_REPORTS);
402
+ // One group per distinct serving configuration, numbered in the order the
403
+ // window meets them, so the newest report is always in group 1.
404
+ const groups: ReturnType<typeof evalServingConfigurationOf>[] = [];
405
+ const reports = listing.reports.map((stored) => {
406
+ const serving = evalServingConfigurationOf(stored.artifact);
407
+ let index = groups.findIndex((candidate) => sameEvalServingConfiguration(candidate, serving));
408
+ if (index === -1) index = groups.push(serving) - 1;
409
+ return projectReport(stored.evalId, stored.startedAt, stored.artifact, index + 1);
410
+ });
411
+ return {
412
+ version: 1,
413
+ generatedAt: new Date(now()).toISOString(),
414
+ available: listing.available,
415
+ stored: listing.stored,
416
+ unreadable: listing.unreadable,
417
+ reports,
418
+ truncated: listing.stored > listing.reports.length + listing.unreadable,
419
+ };
420
+ }
421
+
422
+ /**
423
+ * `clio-coder eval inventory --json`, and nothing else.
424
+ *
425
+ * Anything but the exact argv is a usage error, so a GUI host starts this
426
+ * process knowing it cannot be steered into reading a different store, a wider
427
+ * window, or one named report.
428
+ */
429
+ export async function runEvalInventory(args: ReadonlyArray<string>): Promise<number> {
430
+ if (args.length !== 1 || args[0] !== "--json") {
431
+ process.stderr.write("clio-coder eval inventory: usage: clio-coder eval inventory --json\n");
432
+ return 2;
433
+ }
434
+ process.stdout.write(`${JSON.stringify(await evalInventorySnapshot(), null, 2)}\n`);
435
+ return 0;
436
+ }