@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,240 @@
1
+ import { createHash } from "node:crypto";
2
+ import { discoverAgentRecipes } from "../agents/registry.js";
3
+ import { agentSpecFingerprint, normalizeAgentSpec } from "../agents/spec.js";
4
+ import type { RunReceipt } from "../dispatch/types.js";
5
+ import { loadFragments } from "../prompts/fragment-loader.js";
6
+ import { createSafetyPolicyEngine } from "../safety/policy-engine.js";
7
+ import type { EvalLedgerSnapshot, EvalPromptManifestObservation } from "./metrics/tracked.js";
8
+ import type { EvalExecutionEnvelopeV1, EvalPromptFragmentIdentityV1 } from "./schema/execution-envelope.js";
9
+ import { EVAL_EXECUTION_ENVELOPE_SCHEMA_V1 } from "./schema/execution-envelope.js";
10
+ import type { EvalSuiteTargetV2, EvalSuiteTaskV2 } from "./schema/suite.js";
11
+
12
+ /** Bounded execution facts a deterministic grader can surface from an in-process dispatch. */
13
+ export interface EvalExecutionObservationV1 {
14
+ compositionHash: string | null;
15
+ target: string | null;
16
+ wireModel: string | null;
17
+ runtime: string | null;
18
+ thinkingLevel: string | null;
19
+ toolSignature: string | null;
20
+ autonomy: string | null;
21
+ policyHashes: { rulePack: string | null; project: string | null };
22
+ projectContext: {
23
+ tier: string | null;
24
+ contentHash: string | null;
25
+ chars: number | null;
26
+ sections: string[];
27
+ rulesApplied: string[];
28
+ operatorProfileApplied: boolean | null;
29
+ } | null;
30
+ }
31
+
32
+ export interface BuildEvalExecutionEnvelopeInput {
33
+ task: EvalSuiteTaskV2;
34
+ target: EvalSuiteTargetV2;
35
+ cwd: string | null;
36
+ receipt: RunReceipt | null;
37
+ ledger: EvalLedgerSnapshot;
38
+ observation?: EvalExecutionObservationV1;
39
+ }
40
+
41
+ /**
42
+ * Bind one behavioral result to the exact model-facing and policy-facing
43
+ * identity available at the runner boundary. Nulls mean the declared
44
+ * machinery-only mode has no such model concept; they never stand in for a
45
+ * guessed value.
46
+ */
47
+ export function buildEvalExecutionEnvelopeV1(input: BuildEvalExecutionEnvelopeInput): EvalExecutionEnvelopeV1 {
48
+ const scenario = input.task.behavioral;
49
+ if (scenario === undefined) throw new Error(`behavioral task ${input.task.id} has no behavioral scenario`);
50
+ const manifest = input.ledger.promptManifests.at(-1) ?? null;
51
+ const contextSnapshot = input.ledger.contextSnapshots.at(-1) ?? null;
52
+ const recipe = recipeIdentity(
53
+ input,
54
+ scenario.execution.subject.kind === "worker" ? scenario.execution.subject.role : null,
55
+ );
56
+ const policy = policyIdentity(input.cwd, input.receipt, input.observation);
57
+ const autonomy =
58
+ input.receipt?.autonomyEnforcement?.autonomy ?? input.observation?.autonomy ?? input.task.runner.autonomy ?? null;
59
+ const promptFragments = promptFragmentIdentities(manifest, recipe, autonomy);
60
+ const compositionHash =
61
+ input.receipt?.staticCompositionHash ??
62
+ input.observation?.compositionHash ??
63
+ manifest?.systemPromptHash ??
64
+ contextSnapshot?.promptHash ??
65
+ null;
66
+ const projectContext = projectContextIdentity(input, manifest, promptFragments);
67
+ return {
68
+ schema: EVAL_EXECUTION_ENVELOPE_SCHEMA_V1,
69
+ prompt: { fragments: promptFragments, compositionHash },
70
+ recipe: recipe === null ? null : { id: recipe.id, version: recipe.version, contentHash: recipe.contentHash },
71
+ target: input.receipt?.targetId ?? input.observation?.target ?? input.target.id,
72
+ wireModel:
73
+ input.receipt?.wireModelId ?? input.observation?.wireModel ?? contextSnapshot?.modelId ?? input.target.model ?? null,
74
+ runtime: input.receipt?.runtimeId ?? input.observation?.runtime ?? contextSnapshot?.runtimeId ?? null,
75
+ thinkingLevel:
76
+ input.receipt?.runtimeResolution?.effectiveThinkingLevel ??
77
+ input.observation?.thinkingLevel ??
78
+ manifest?.thinkingLevel ??
79
+ input.target.thinking ??
80
+ null,
81
+ toolSignature:
82
+ input.receipt?.toolSignature ?? input.observation?.toolSignature ?? contextSnapshot?.toolSignature ?? null,
83
+ autonomy,
84
+ policyHashes: policy,
85
+ projectContext,
86
+ corpus: { ...scenario.corpus },
87
+ };
88
+ }
89
+
90
+ function recipeIdentity(
91
+ input: BuildEvalExecutionEnvelopeInput,
92
+ role: string | null,
93
+ ): { id: string; version: number; contentHash: string; personaHash: string } | null {
94
+ const id = input.receipt?.agentId ?? input.task.runner.agent ?? role;
95
+ if (id === null || input.cwd === null) return null;
96
+ try {
97
+ const recipe = discoverAgentRecipes(input.cwd).find((entry) => entry.id === id);
98
+ if (recipe === undefined) return null;
99
+ return {
100
+ id: recipe.id,
101
+ version: recipe.version,
102
+ contentHash: agentSpecFingerprint(normalizeAgentSpec(recipe)),
103
+ personaHash: sha256(recipe.body),
104
+ };
105
+ } catch {
106
+ return null;
107
+ }
108
+ }
109
+
110
+ function promptFragmentIdentities(
111
+ manifest: EvalPromptManifestObservation | null,
112
+ recipe: { id: string; version: number; personaHash: string } | null,
113
+ autonomy: string | null,
114
+ ): EvalPromptFragmentIdentityV1[] {
115
+ let versions = new Map<string, number>();
116
+ try {
117
+ versions = new Map([...loadFragments().byId.values()].map((fragment) => [fragment.id, fragment.version]));
118
+ } catch {
119
+ // The manifest still carries exact hashes; only authored versions become unavailable.
120
+ }
121
+ if (manifest !== null) {
122
+ return manifest.fragments
123
+ .map((fragment) => ({
124
+ id: fragment.id,
125
+ version: versions.get(fragment.id) ?? ("unversioned" as const),
126
+ contentHash: fragment.contentHash,
127
+ }))
128
+ .sort((left, right) => left.id.localeCompare(right.id));
129
+ }
130
+ if (recipe === null) return [];
131
+ const selected = ["identity.clio-worker", "operating.contract", "operating.worker"];
132
+ if (autonomy !== null) selected.push(`safety.${autonomy}`);
133
+ const fragments: EvalPromptFragmentIdentityV1[] = [];
134
+ try {
135
+ const table = loadFragments();
136
+ for (const id of selected) {
137
+ const fragment = table.byId.get(id);
138
+ if (fragment !== undefined) {
139
+ fragments.push({ id, version: fragment.version, contentHash: fragment.contentHash });
140
+ }
141
+ }
142
+ } catch {
143
+ // The composition hash remains authoritative when resource discovery fails.
144
+ }
145
+ fragments.push({ id: `persona.${recipe.id}`, version: recipe.version, contentHash: recipe.personaHash });
146
+ return fragments.sort((left, right) => left.id.localeCompare(right.id));
147
+ }
148
+
149
+ function policyIdentity(
150
+ cwd: string | null,
151
+ receipt: RunReceipt | null,
152
+ observation: EvalExecutionObservationV1 | undefined,
153
+ ): EvalExecutionEnvelopeV1["policyHashes"] {
154
+ const sealed = receipt?.reproducibility?.safetyPolicy;
155
+ if (sealed !== undefined) return { rulePack: sealed.rulePackHash, project: sealed.projectPolicyHash };
156
+ if (observation !== undefined) return { ...observation.policyHashes };
157
+ if (cwd === null) return { rulePack: null, project: null };
158
+ try {
159
+ const metadata = createSafetyPolicyEngine({ cwd }).metadata();
160
+ return { rulePack: metadata.rulePackHash, project: metadata.projectPolicyHash };
161
+ } catch {
162
+ return { rulePack: null, project: null };
163
+ }
164
+ }
165
+
166
+ function projectContextIdentity(
167
+ input: BuildEvalExecutionEnvelopeInput,
168
+ manifest: EvalPromptManifestObservation | null,
169
+ fragments: ReadonlyArray<EvalPromptFragmentIdentityV1>,
170
+ ): EvalExecutionEnvelopeV1["projectContext"] {
171
+ const receipt = input.receipt;
172
+ if (receipt?.projectContext !== undefined) {
173
+ const sections = [...(receipt.projectContext.sections ?? [])].sort();
174
+ const hasContentBearingContext = sections.some((section) => section !== "workspace-root");
175
+ return {
176
+ kind: "worker",
177
+ tier: receipt.projectContext.tier,
178
+ contentHash: hasContentBearingContext ? (receipt.projectContext.contentHash ?? null) : null,
179
+ chars: hasContentBearingContext ? (receipt.projectContext.chars ?? null) : null,
180
+ sections,
181
+ rulesApplied: [...(receipt.rulesApplied ?? [])].sort(),
182
+ operatorProfileApplied: receipt.operatorProfileApplied ?? null,
183
+ };
184
+ }
185
+ const observed = input.observation?.projectContext;
186
+ if (observed !== undefined && observed !== null) {
187
+ const sections = [...observed.sections].sort();
188
+ const hasContentBearingContext = sections.some((section) => section !== "workspace-root");
189
+ return {
190
+ kind: "worker",
191
+ tier: observed.tier,
192
+ contentHash: hasContentBearingContext ? observed.contentHash : null,
193
+ chars: hasContentBearingContext ? observed.chars : null,
194
+ sections,
195
+ rulesApplied: [...observed.rulesApplied].sort(),
196
+ operatorProfileApplied: observed.operatorProfileApplied,
197
+ };
198
+ }
199
+ if (manifest !== null) {
200
+ const contextFragments = fragments.filter((fragment) => fragment.id.startsWith("context."));
201
+ const preload = manifest.projectPreload;
202
+ const identity = {
203
+ preload,
204
+ fragments: contextFragments.map((fragment) => [fragment.id, fragment.contentHash]),
205
+ };
206
+ return {
207
+ kind: "session",
208
+ tier: preload?.mode ?? null,
209
+ contentHash: sha256(stableJson(identity)),
210
+ chars: preload?.chars ?? null,
211
+ sections: contextFragments.map((fragment) => fragment.id).sort(),
212
+ rulesApplied: [],
213
+ operatorProfileApplied: contextFragments.some((fragment) => fragment.id === "context.operator-profile"),
214
+ };
215
+ }
216
+ return {
217
+ kind: "none",
218
+ tier: null,
219
+ contentHash: null,
220
+ chars: null,
221
+ sections: [],
222
+ rulesApplied: [],
223
+ operatorProfileApplied: null,
224
+ };
225
+ }
226
+
227
+ function stableJson(value: unknown): string {
228
+ if (Array.isArray(value)) return `[${value.map(stableJson).join(",")}]`;
229
+ if (typeof value === "object" && value !== null) {
230
+ return `{${Object.entries(value as Record<string, unknown>)
231
+ .sort(([left], [right]) => left.localeCompare(right))
232
+ .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)
233
+ .join(",")}}`;
234
+ }
235
+ return JSON.stringify(value);
236
+ }
237
+
238
+ function sha256(value: string): string {
239
+ return createHash("sha256").update(value, "utf8").digest("hex");
240
+ }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Bounded newest-first listing of the eval reports this installation stored.
3
+ *
4
+ * The store has always been addressed by id: `eval report <evalId>` and
5
+ * `eval compare <a> <b>` both require the operator to already know which report
6
+ * they want. Nothing enumerated the directory, so a surface that wants to offer
7
+ * the choice had to invent the enumeration. This is that enumeration, and it is
8
+ * a store concern rather than a wire concern: it decides which files are in the
9
+ * window and hands back parsed artifacts, and says nothing about which of their
10
+ * fields may leave the host.
11
+ */
12
+
13
+ import { readdir } from "node:fs/promises";
14
+ import { loadEvalArtifactV4 } from "./artifacts/store.js";
15
+ import type { EvalArtifactV4 } from "./schema/artifact.js";
16
+ import { evalRoot } from "./store.js";
17
+
18
+ /**
19
+ * The exact shape `createEvalId` mints: an ISO stamp with its separators
20
+ * stripped, the first eight characters of the suite hash, and a random suffix.
21
+ */
22
+ const EVAL_ID_PATTERN = /^eval-(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(\d{3})Z-([0-9a-f]{8})-([0-9a-f]{12})$/u;
23
+
24
+ export interface EvalStoredReport {
25
+ readonly evalId: string;
26
+ /**
27
+ * The instant the run started, read back out of the id.
28
+ *
29
+ * Null unless the id is one this harness minted and its embedded suite-hash
30
+ * prefix agrees with the suite the artifact names. An artifact has no
31
+ * timestamp field of its own, so the id is the only record of when it ran,
32
+ * and a stamp read off an id that does not otherwise match its contents is
33
+ * not a fact worth reporting.
34
+ */
35
+ readonly startedAt: string | null;
36
+ readonly artifact: EvalArtifactV4;
37
+ }
38
+
39
+ export interface EvalStoreListing {
40
+ /** False when the installation has no eval store at all, which reads differently from an empty one. */
41
+ readonly available: boolean;
42
+ /** Reports on disk before the window bound. */
43
+ readonly stored: number;
44
+ readonly reports: readonly EvalStoredReport[];
45
+ /**
46
+ * Files inside the window the current parser refused.
47
+ *
48
+ * Counted rather than dropped silently. Routing accepts artifact v4 only, so
49
+ * a retired shape still on disk is a real thing in this store, and a listing
50
+ * that quietly skipped it would report a smaller store than the operator has.
51
+ */
52
+ readonly unreadable: number;
53
+ }
54
+
55
+ /** The stamp an id carries, without checking it against anything. */
56
+ function idStamp(evalId: string): { startedAt: string; suiteHashPrefix: string } | null {
57
+ const match = EVAL_ID_PATTERN.exec(evalId);
58
+ if (match === null) return null;
59
+ const [, year, month, day, hour, minute, second, millisecond, suiteHashPrefix] = match;
60
+ const startedAt = `${year}-${month}-${day}T${hour}:${minute}:${second}.${millisecond}Z`;
61
+ const parsed = new Date(startedAt);
62
+ if (Number.isNaN(parsed.getTime()) || parsed.toISOString() !== startedAt) return null;
63
+ return { startedAt, suiteHashPrefix: suiteHashPrefix as string };
64
+ }
65
+
66
+ /** Newest first. An id this harness did not mint sorts oldest rather than throwing. */
67
+ function byNewest(left: string, right: string): number {
68
+ const leftStamp = idStamp(left)?.startedAt ?? "";
69
+ const rightStamp = idStamp(right)?.startedAt ?? "";
70
+ if (leftStamp !== rightStamp) return leftStamp < rightStamp ? 1 : -1;
71
+ return left < right ? 1 : -1;
72
+ }
73
+
74
+ export async function listEvalReports(dataDir: string, limit: number): Promise<EvalStoreListing> {
75
+ let entries: string[];
76
+ try {
77
+ entries = await readdir(evalRoot(dataDir));
78
+ } catch (error) {
79
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") {
80
+ return { available: false, stored: 0, reports: [], unreadable: 0 };
81
+ }
82
+ throw error;
83
+ }
84
+ const ids = entries
85
+ .filter((entry) => entry.endsWith(".json"))
86
+ .map((entry) => entry.slice(0, -".json".length))
87
+ .sort(byNewest);
88
+ const reports: EvalStoredReport[] = [];
89
+ let unreadable = 0;
90
+ for (const evalId of ids.slice(0, limit)) {
91
+ let artifact: EvalArtifactV4;
92
+ try {
93
+ artifact = await loadEvalArtifactV4(dataDir, evalId);
94
+ } catch {
95
+ unreadable += 1;
96
+ continue;
97
+ }
98
+ // The id inside the file is authoritative. A file whose stem disagrees with
99
+ // it was renamed or copied in, and the two names it now answers to are not
100
+ // the same report.
101
+ if (artifact.evalId !== evalId) {
102
+ unreadable += 1;
103
+ continue;
104
+ }
105
+ const stamp = idStamp(evalId);
106
+ reports.push({
107
+ evalId,
108
+ startedAt: stamp !== null && artifact.suite.hash.startsWith(stamp.suiteHashPrefix) ? stamp.startedAt : null,
109
+ artifact,
110
+ });
111
+ }
112
+ return { available: true, stored: ids.length, reports, unreadable };
113
+ }
@@ -0,0 +1,136 @@
1
+ import {
2
+ EVAL_TRACKED_METRIC_NAMES,
3
+ type EvalMetricSource,
4
+ type EvalTrackedMetricName,
5
+ type EvalVerdictEnvelopeV1,
6
+ } from "../schema/verdict.js";
7
+
8
+ export interface EvalMetricDistributionV1 {
9
+ observations: number;
10
+ measured: number;
11
+ unmeasured: number;
12
+ mean: number | null;
13
+ min: number | null;
14
+ max: number | null;
15
+ p90: number | null;
16
+ variance: number | null;
17
+ standardDeviation: number | null;
18
+ sources: EvalMetricSource[];
19
+ }
20
+
21
+ export type EvalTrackedMetricDistributionsV1 = Record<EvalTrackedMetricName, EvalMetricDistributionV1> & {
22
+ expectedColdReasons: Record<string, EvalMetricDistributionV1>;
23
+ };
24
+
25
+ export interface EvalScenarioAggregateV1 {
26
+ scenarioId: string;
27
+ trials: number;
28
+ k: number;
29
+ passed: number;
30
+ failed: number;
31
+ unmeasured: number;
32
+ machineryFailures: number;
33
+ passAtK: number;
34
+ passPowK: number;
35
+ trackedMetrics: EvalTrackedMetricDistributionsV1;
36
+ }
37
+
38
+ /** Aggregate each scenario independently so trial outcomes never cross tasks. */
39
+ export function aggregateEvalVerdicts(verdicts: ReadonlyArray<EvalVerdictEnvelopeV1>): EvalScenarioAggregateV1[] {
40
+ const byScenario = new Map<string, EvalVerdictEnvelopeV1[]>();
41
+ for (const verdict of verdicts) {
42
+ const group = byScenario.get(verdict.scenarioId) ?? [];
43
+ group.push(verdict);
44
+ byScenario.set(verdict.scenarioId, group);
45
+ }
46
+ return [...byScenario.entries()]
47
+ .sort(([left], [right]) => left.localeCompare(right))
48
+ .map(([scenarioId, group]) => aggregateScenario(scenarioId, group));
49
+ }
50
+
51
+ function aggregateScenario(
52
+ scenarioId: string,
53
+ verdicts: ReadonlyArray<EvalVerdictEnvelopeV1>,
54
+ ): EvalScenarioAggregateV1 {
55
+ const ordered = [...verdicts].sort((left, right) => left.trialIndex - right.trialIndex);
56
+ const passed = ordered.filter((verdict) => verdict.outcome === "pass").length;
57
+ const failed = ordered.filter((verdict) => verdict.outcome === "fail").length;
58
+ const unmeasured = ordered.filter((verdict) => verdict.outcome === "unmeasured").length;
59
+ const machineryFailures = ordered.filter((verdict) => verdict.machinery === "infrastructure_failure").length;
60
+ const fixed = Object.fromEntries(
61
+ EVAL_TRACKED_METRIC_NAMES.map((name) => [name, distribution(ordered.map((verdict) => verdict.trackedMetrics[name]))]),
62
+ ) as Record<EvalTrackedMetricName, EvalMetricDistributionV1>;
63
+ const reasons = new Set(ordered.flatMap((verdict) => Object.keys(verdict.trackedMetrics.expectedColdReasons)));
64
+ const expectedColdReasons = Object.fromEntries(
65
+ [...reasons]
66
+ .sort((left, right) => left.localeCompare(right))
67
+ .map((reason) => [
68
+ reason,
69
+ distribution(
70
+ ordered.map(
71
+ (verdict) => verdict.trackedMetrics.expectedColdReasons[reason] ?? { value: 0, source: "ledger" as const },
72
+ ),
73
+ ),
74
+ ]),
75
+ );
76
+ const k = ordered.length;
77
+ return {
78
+ scenarioId,
79
+ trials: k,
80
+ k,
81
+ passed,
82
+ failed,
83
+ unmeasured,
84
+ machineryFailures,
85
+ passAtK: k > 0 && passed > 0 ? 1 : 0,
86
+ passPowK: k > 0 && passed === k ? 1 : 0,
87
+ trackedMetrics: { ...fixed, expectedColdReasons },
88
+ };
89
+ }
90
+
91
+ function distribution(
92
+ metrics: ReadonlyArray<{ value: number | null; source: EvalMetricSource }>,
93
+ ): EvalMetricDistributionV1 {
94
+ const values = metrics.flatMap((metric) => (metric.value === null ? [] : [metric.value]));
95
+ const sources = [...new Set(metrics.map((metric) => metric.source))].sort(compareSources);
96
+ if (values.length === 0) {
97
+ return {
98
+ observations: metrics.length,
99
+ measured: 0,
100
+ unmeasured: metrics.length,
101
+ mean: null,
102
+ min: null,
103
+ max: null,
104
+ p90: null,
105
+ variance: null,
106
+ standardDeviation: null,
107
+ sources,
108
+ };
109
+ }
110
+ const ordered = [...values].sort((left, right) => left - right);
111
+ const p90Index = Math.max(0, Math.ceil(ordered.length * 0.9) - 1);
112
+ const mean = ordered.reduce((sum, value) => sum + value, 0) / ordered.length;
113
+ const variance = ordered.reduce((sum, value) => sum + (value - mean) ** 2, 0) / ordered.length;
114
+ return {
115
+ observations: metrics.length,
116
+ measured: values.length,
117
+ unmeasured: metrics.length - values.length,
118
+ mean,
119
+ min: ordered[0] ?? null,
120
+ max: ordered.at(-1) ?? null,
121
+ p90: ordered[p90Index] ?? null,
122
+ variance,
123
+ standardDeviation: Math.sqrt(variance),
124
+ sources,
125
+ };
126
+ }
127
+
128
+ function compareSources(left: EvalMetricSource, right: EvalMetricSource): number {
129
+ return sourceOrder(left) - sourceOrder(right);
130
+ }
131
+
132
+ function sourceOrder(source: EvalMetricSource): number {
133
+ if (source === "ledger") return 0;
134
+ if (source === "receipt") return 1;
135
+ return 2;
136
+ }
@@ -0,0 +1,112 @@
1
+ import { performance } from "node:perf_hooks";
2
+ import type { SessionEntry } from "../../session/entries.js";
3
+
4
+ export interface EvalCallLedgerFold {
5
+ push(chunk: string): void;
6
+ entries(): SessionEntry[];
7
+ }
8
+
9
+ /** Fold structured assistant completions into the eval's per-call ledger. */
10
+ export function createEvalCallLedgerFold(now: () => number = () => performance.now()): EvalCallLedgerFold {
11
+ const entries: SessionEntry[] = [];
12
+ let pending = "";
13
+ let activeStartedAt: number | null = null;
14
+ let activeFirstOutputAt: number | null = null;
15
+
16
+ const consume = (line: string): void => {
17
+ const event = parseRecord(line);
18
+ if (event === null) return;
19
+ if (event.type === "message_start" && isAssistantMessage(event.message)) {
20
+ activeStartedAt = now();
21
+ activeFirstOutputAt = null;
22
+ return;
23
+ }
24
+ if (event.type === "message_update" && activeStartedAt !== null && activeFirstOutputAt === null) {
25
+ activeFirstOutputAt = now();
26
+ return;
27
+ }
28
+ if (event.type !== "message_end" || !isAssistantMessage(event.message)) return;
29
+ const message = event.message;
30
+ const usage = isRecord(message.usage) ? message.usage : null;
31
+ if (usage === null) {
32
+ activeStartedAt = null;
33
+ activeFirstOutputAt = null;
34
+ return;
35
+ }
36
+ const endedAt = now();
37
+ const promptCache: Record<string, unknown> = {
38
+ input: nonNegativeNumber(usage.input) ?? 0,
39
+ cacheRead: nonNegativeNumber(usage.cacheRead) ?? 0,
40
+ cacheWrite: nonNegativeNumber(usage.cacheWrite) ?? 0,
41
+ backendVerdict: "unknown",
42
+ };
43
+ if (isRecord(message.backendTimings)) promptCache.backend = structuredClone(message.backendTimings);
44
+ const previous = entries.at(-1);
45
+ entries.push({
46
+ kind: "message",
47
+ role: "assistant",
48
+ turnId: `eval-call-${entries.length + 1}`,
49
+ parentTurnId: previous?.turnId ?? null,
50
+ timestamp: messageTimestamp(message.timestamp),
51
+ payload: {
52
+ promptCache,
53
+ timing: {
54
+ ttftMs:
55
+ activeStartedAt === null ? null : Math.round(Math.max(0, (activeFirstOutputAt ?? endedAt) - activeStartedAt)),
56
+ apiMs: activeStartedAt === null ? 0 : Math.round(Math.max(0, endedAt - activeStartedAt)),
57
+ },
58
+ usage: structuredClone(usage),
59
+ },
60
+ });
61
+ activeStartedAt = null;
62
+ activeFirstOutputAt = null;
63
+ };
64
+
65
+ return {
66
+ push(chunk: string): void {
67
+ pending += chunk;
68
+ for (;;) {
69
+ const newline = pending.indexOf("\n");
70
+ if (newline === -1) break;
71
+ consume(pending.slice(0, newline).replace(/\r$/u, ""));
72
+ pending = pending.slice(newline + 1);
73
+ }
74
+ },
75
+ entries(): SessionEntry[] {
76
+ if (pending.length > 0) {
77
+ consume(pending.replace(/\r$/u, ""));
78
+ pending = "";
79
+ }
80
+ return structuredClone(entries);
81
+ },
82
+ };
83
+ }
84
+
85
+ function isAssistantMessage(value: unknown): value is Record<string, unknown> & { role: "assistant" } {
86
+ return isRecord(value) && value.role === "assistant";
87
+ }
88
+
89
+ function messageTimestamp(value: unknown): string {
90
+ const milliseconds = nonNegativeNumber(value);
91
+ if (milliseconds === null) return new Date(0).toISOString();
92
+ const date = new Date(milliseconds);
93
+ return Number.isFinite(date.getTime()) ? date.toISOString() : new Date(0).toISOString();
94
+ }
95
+
96
+ function nonNegativeNumber(value: unknown): number | null {
97
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
98
+ }
99
+
100
+ function parseRecord(line: string): Record<string, unknown> | null {
101
+ if (line.trim().length === 0) return null;
102
+ try {
103
+ const value: unknown = JSON.parse(line);
104
+ return isRecord(value) ? value : null;
105
+ } catch {
106
+ return null;
107
+ }
108
+ }
109
+
110
+ function isRecord(value: unknown): value is Record<string, unknown> {
111
+ return typeof value === "object" && value !== null && !Array.isArray(value);
112
+ }