niceeval 0.13.1 → 0.13.2

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 (548) hide show
  1. package/INDEX.md +25 -2
  2. package/README.md +9 -10
  3. package/README.zh.md +9 -10
  4. package/dist/agents/ai-sdk.cjs.map +1 -1
  5. package/dist/agents/ai-sdk.d.cts +1 -1
  6. package/dist/agents/ai-sdk.d.mts +1 -1
  7. package/dist/agents/ai-sdk.d.ts +1 -1
  8. package/dist/agents/bub-install-spec.cjs +19 -5
  9. package/dist/agents/bub-install-spec.cjs.map +1 -1
  10. package/dist/agents/bub-install-spec.d.cts +9 -2
  11. package/dist/agents/bub-install-spec.d.mts +9 -2
  12. package/dist/agents/bub-install-spec.d.ts +9 -2
  13. package/dist/agents/bub-install-spec.js +14 -12
  14. package/dist/agents/bub.cjs +10 -6
  15. package/dist/agents/bub.cjs.map +1 -1
  16. package/dist/agents/bub.d.cts +2 -2
  17. package/dist/agents/bub.d.mts +2 -2
  18. package/dist/agents/bub.d.ts +2 -2
  19. package/dist/agents/claude-code.cjs.map +1 -1
  20. package/dist/agents/claude-code.d.cts +2 -2
  21. package/dist/agents/claude-code.d.mts +2 -2
  22. package/dist/agents/claude-code.d.ts +2 -2
  23. package/dist/agents/codex.cjs +4 -4
  24. package/dist/agents/codex.cjs.map +1 -1
  25. package/dist/agents/codex.d.cts +3 -3
  26. package/dist/agents/codex.d.mts +3 -3
  27. package/dist/agents/codex.d.ts +3 -3
  28. package/dist/agents/coding-cli-versions.cjs +10 -1
  29. package/dist/agents/coding-cli-versions.cjs.map +1 -1
  30. package/dist/agents/coding-cli-versions.d.cts +8 -3
  31. package/dist/agents/coding-cli-versions.d.mts +8 -3
  32. package/dist/agents/coding-cli-versions.d.ts +8 -3
  33. package/dist/agents/coding-cli-versions.js +18 -12
  34. package/dist/agents/deepseek-harness.cjs +151 -0
  35. package/dist/agents/deepseek-harness.cjs.map +1 -0
  36. package/dist/agents/deepseek-harness.d.cts +14 -0
  37. package/dist/agents/deepseek-harness.d.mts +14 -0
  38. package/dist/agents/deepseek-harness.d.ts +14 -0
  39. package/dist/agents/deepseek-harness.js +7 -0
  40. package/dist/agents/deepseek-harness.js.map +1 -0
  41. package/dist/agents/exact-npm-plugins.cjs +28 -0
  42. package/dist/agents/exact-npm-plugins.cjs.map +1 -0
  43. package/dist/agents/exact-npm-plugins.d.cts +10 -0
  44. package/dist/agents/exact-npm-plugins.d.mts +10 -0
  45. package/dist/agents/exact-npm-plugins.d.ts +10 -0
  46. package/dist/agents/exact-npm-plugins.js +8 -0
  47. package/dist/agents/exact-npm-plugins.js.map +1 -0
  48. package/dist/agents/index.cjs +5 -1
  49. package/dist/agents/index.cjs.map +1 -1
  50. package/dist/agents/index.d.cts +4 -0
  51. package/dist/agents/index.d.mts +4 -0
  52. package/dist/agents/index.d.ts +4 -0
  53. package/dist/agents/index.js +54 -50
  54. package/dist/agents/index.mjs +54 -50
  55. package/dist/agents/omp.cjs +170 -0
  56. package/dist/agents/omp.cjs.map +1 -0
  57. package/dist/agents/omp.d.cts +14 -0
  58. package/dist/agents/omp.d.mts +14 -0
  59. package/dist/agents/omp.d.ts +14 -0
  60. package/dist/agents/omp.js +7 -0
  61. package/dist/agents/omp.js.map +1 -0
  62. package/dist/agents/openclaw.cjs +51 -2
  63. package/dist/agents/openclaw.cjs.map +1 -1
  64. package/dist/agents/openclaw.d.cts +2 -0
  65. package/dist/agents/openclaw.d.mts +2 -0
  66. package/dist/agents/openclaw.d.ts +2 -0
  67. package/dist/agents/types.cjs.map +1 -1
  68. package/dist/agents/types.d.cts +4 -4
  69. package/dist/agents/types.d.mts +4 -4
  70. package/dist/agents/types.d.ts +4 -4
  71. package/dist/agents/ui-message-stream.cjs +24 -7
  72. package/dist/agents/ui-message-stream.cjs.map +1 -1
  73. package/dist/analysis/api.cjs +28 -2
  74. package/dist/analysis/api.cjs.map +1 -1
  75. package/dist/analysis/api.d.cts +22 -1
  76. package/dist/analysis/api.d.mts +22 -1
  77. package/dist/analysis/api.d.ts +22 -1
  78. package/dist/analysis/api.js +8 -6
  79. package/dist/analysis/bindings.cjs +11 -18
  80. package/dist/analysis/bindings.cjs.map +1 -1
  81. package/dist/analysis/bindings.d.cts +177 -49
  82. package/dist/analysis/bindings.d.mts +177 -49
  83. package/dist/analysis/bindings.d.ts +177 -49
  84. package/dist/analysis/contracts.cjs +1 -0
  85. package/dist/analysis/contracts.cjs.map +1 -1
  86. package/dist/analysis/contracts.d.cts +43 -3
  87. package/dist/analysis/contracts.d.mts +43 -3
  88. package/dist/analysis/contracts.d.ts +43 -3
  89. package/dist/analysis/cost-projection.cjs +2 -1
  90. package/dist/analysis/cost-projection.cjs.map +1 -1
  91. package/dist/analysis/cost-projection.d.cts +1 -1
  92. package/dist/analysis/cost-projection.d.mts +1 -1
  93. package/dist/analysis/cost-projection.d.ts +1 -1
  94. package/dist/analysis/cost.cjs +13 -3
  95. package/dist/analysis/cost.cjs.map +1 -1
  96. package/dist/analysis/cost.d.cts +10 -3
  97. package/dist/analysis/cost.d.mts +10 -3
  98. package/dist/analysis/cost.d.ts +10 -3
  99. package/dist/analysis/experiment-groups.cjs +96 -0
  100. package/dist/analysis/experiment-groups.cjs.map +1 -0
  101. package/dist/analysis/experiment-groups.d.cts +9 -0
  102. package/dist/analysis/experiment-groups.d.mts +9 -0
  103. package/dist/analysis/experiment-groups.d.ts +9 -0
  104. package/dist/analysis/experiment-groups.js +10 -0
  105. package/dist/analysis/experiment-groups.js.map +1 -0
  106. package/dist/analysis/index.cjs +4 -1
  107. package/dist/analysis/index.cjs.map +1 -1
  108. package/dist/analysis/index.d.cts +4 -2
  109. package/dist/analysis/index.d.mts +4 -2
  110. package/dist/analysis/index.d.ts +4 -2
  111. package/dist/analysis/index.js +40 -36
  112. package/dist/analysis/index.mjs +40 -36
  113. package/dist/assertions/limits.cjs +4 -0
  114. package/dist/assertions/limits.cjs.map +1 -1
  115. package/dist/assertions/limits.d.cts +4 -0
  116. package/dist/assertions/limits.d.mts +4 -0
  117. package/dist/assertions/limits.d.ts +4 -0
  118. package/dist/assertions/match.cjs +63 -25
  119. package/dist/assertions/match.cjs.map +1 -1
  120. package/dist/assertions/match.d.cts +7 -0
  121. package/dist/assertions/match.d.mts +7 -0
  122. package/dist/assertions/match.d.ts +7 -0
  123. package/dist/assertions/record/attachment.cjs +32 -4
  124. package/dist/assertions/record/attachment.cjs.map +1 -1
  125. package/dist/assertions/record/diff.cjs +10 -4
  126. package/dist/assertions/record/diff.cjs.map +1 -1
  127. package/dist/assertions/record/producer.cjs +101 -4
  128. package/dist/assertions/record/producer.cjs.map +1 -1
  129. package/dist/assertions/record/producer.d.cts +4 -1
  130. package/dist/assertions/record/producer.d.mts +4 -1
  131. package/dist/assertions/record/producer.d.ts +4 -1
  132. package/dist/assertions/runtime.cjs +45 -5
  133. package/dist/assertions/runtime.cjs.map +1 -1
  134. package/dist/cli/record.cjs +113 -8
  135. package/dist/cli/record.cjs.map +1 -1
  136. package/dist/cli/record.d.cts +20 -1
  137. package/dist/cli/record.d.mts +20 -1
  138. package/dist/cli/record.d.ts +20 -1
  139. package/dist/cli/record.js +4 -2
  140. package/dist/cli.cjs +386 -31
  141. package/dist/cli.cjs.map +1 -1
  142. package/dist/cli.d.cts +10 -2
  143. package/dist/cli.d.mts +10 -2
  144. package/dist/cli.d.ts +10 -2
  145. package/dist/context/send-retry.cjs +4 -4
  146. package/dist/context/send-retry.cjs.map +1 -1
  147. package/dist/coordination/host/runtime.cjs +8 -30
  148. package/dist/coordination/host/runtime.cjs.map +1 -1
  149. package/dist/coordination/host/runtime.d.cts +3 -3
  150. package/dist/coordination/host/runtime.d.mts +3 -3
  151. package/dist/coordination/host/runtime.d.ts +3 -3
  152. package/dist/coordination/host/types.cjs.map +1 -1
  153. package/dist/coordination/host/types.d.cts +0 -5
  154. package/dist/coordination/host/types.d.mts +0 -5
  155. package/dist/coordination/host/types.d.ts +0 -5
  156. package/dist/coordination/platform/node.cjs +90 -9
  157. package/dist/coordination/platform/node.cjs.map +1 -1
  158. package/dist/define.cjs +25 -1
  159. package/dist/define.cjs.map +1 -1
  160. package/dist/experiment/host/index.cjs +1 -0
  161. package/dist/experiment/host/index.cjs.map +1 -1
  162. package/dist/i18n/en.cjs +26 -8
  163. package/dist/i18n/en.cjs.map +1 -1
  164. package/dist/i18n/en.d.cts +19 -6
  165. package/dist/i18n/en.d.mts +19 -6
  166. package/dist/i18n/en.d.ts +19 -6
  167. package/dist/index.cjs.map +1 -1
  168. package/dist/index.d.cts +1 -1
  169. package/dist/index.d.mts +1 -1
  170. package/dist/index.d.ts +1 -1
  171. package/dist/o11y/parsers/hermes.cjs +1 -1
  172. package/dist/o11y/parsers/hermes.cjs.map +1 -1
  173. package/dist/o11y/prices.json +1 -1
  174. package/dist/o11y/record/families.cjs +12 -3
  175. package/dist/o11y/record/families.cjs.map +1 -1
  176. package/dist/o11y/record/families.d.cts +8 -8
  177. package/dist/o11y/record/families.d.mts +8 -8
  178. package/dist/o11y/record/families.d.ts +8 -8
  179. package/dist/o11y/record/family-projectors.d.cts +66 -18
  180. package/dist/o11y/record/family-projectors.d.mts +66 -18
  181. package/dist/o11y/record/family-projectors.d.ts +66 -18
  182. package/dist/o11y/record/family-writers.d.cts +11 -3
  183. package/dist/o11y/record/family-writers.d.mts +11 -3
  184. package/dist/o11y/record/family-writers.d.ts +11 -3
  185. package/dist/o11y/record/runner-producer.cjs +14 -4
  186. package/dist/o11y/record/runner-producer.cjs.map +1 -1
  187. package/dist/record/codec/core.d.cts +2 -2
  188. package/dist/record/codec/core.d.mts +2 -2
  189. package/dist/record/codec/core.d.ts +2 -2
  190. package/dist/record/family/catalog.d.cts +44 -12
  191. package/dist/record/family/catalog.d.mts +44 -12
  192. package/dist/record/family/catalog.d.ts +44 -12
  193. package/dist/record/family/index.js +128 -124
  194. package/dist/record/family/observability-v1.cjs +35 -0
  195. package/dist/record/family/observability-v1.cjs.map +1 -0
  196. package/dist/record/family/observability-v1.d.cts +3 -0
  197. package/dist/record/family/observability-v1.d.mts +3 -0
  198. package/dist/record/family/observability-v1.d.ts +3 -0
  199. package/dist/record/family/observability-v1.js +6 -0
  200. package/dist/record/family/observability-v1.js.map +1 -0
  201. package/dist/record/family/observability.cjs +58 -9
  202. package/dist/record/family/observability.cjs.map +1 -1
  203. package/dist/record/family/observability.d.cts +1014 -15
  204. package/dist/record/family/observability.d.mts +1014 -15
  205. package/dist/record/family/observability.d.ts +1014 -15
  206. package/dist/record/family/observability.js +22 -18
  207. package/dist/record/host/runtime.cjs +600 -31
  208. package/dist/record/host/runtime.cjs.map +1 -1
  209. package/dist/record/host/types.cjs.map +1 -1
  210. package/dist/record/host/types.d.cts +33 -9
  211. package/dist/record/host/types.d.mts +33 -9
  212. package/dist/record/host/types.d.ts +33 -9
  213. package/dist/record/maintenance/runtime.cjs +1 -2
  214. package/dist/record/maintenance/runtime.cjs.map +1 -1
  215. package/dist/record/model/core.cjs.map +1 -1
  216. package/dist/record/model/core.d.cts +1 -1
  217. package/dist/record/model/core.d.mts +1 -1
  218. package/dist/record/model/core.d.ts +1 -1
  219. package/dist/record/model/definition.d.cts +6 -6
  220. package/dist/record/model/definition.d.mts +6 -6
  221. package/dist/record/model/definition.d.ts +6 -6
  222. package/dist/record/model/identifiers.cjs +1 -1
  223. package/dist/record/model/identifiers.cjs.map +1 -1
  224. package/dist/record/model/identifiers.d.cts +1 -1
  225. package/dist/record/model/identifiers.d.mts +1 -1
  226. package/dist/record/model/identifiers.d.ts +1 -1
  227. package/dist/record/platform/node.cjs +159 -23
  228. package/dist/record/platform/node.cjs.map +1 -1
  229. package/dist/record/platform/services.cjs.map +1 -1
  230. package/dist/record/platform/services.d.cts +15 -2
  231. package/dist/record/platform/services.d.mts +15 -2
  232. package/dist/record/platform/services.d.ts +15 -2
  233. package/dist/record/reader/errors.cjs +37 -1
  234. package/dist/record/reader/errors.cjs.map +1 -1
  235. package/dist/record/reader/errors.d.cts +49 -1
  236. package/dist/record/reader/errors.d.mts +49 -1
  237. package/dist/record/reader/errors.d.ts +49 -1
  238. package/dist/record/reader/errors.js +22 -12
  239. package/dist/record/reader/format.cjs +76 -17
  240. package/dist/record/reader/format.cjs.map +1 -1
  241. package/dist/record/reader/format.d.cts +11 -4
  242. package/dist/record/reader/format.d.mts +11 -4
  243. package/dist/record/reader/format.d.ts +11 -4
  244. package/dist/record/reader/format.js +2 -0
  245. package/dist/record/reader/index.js +32 -18
  246. package/dist/record/reader/runtime.cjs +64 -0
  247. package/dist/record/reader/runtime.cjs.map +1 -1
  248. package/dist/record/reader/runtime.d.cts +15 -0
  249. package/dist/record/reader/runtime.d.mts +15 -0
  250. package/dist/record/reader/runtime.d.ts +15 -0
  251. package/dist/record/reader/runtime.js +2 -0
  252. package/dist/report/assets/styles.css +53 -29
  253. package/dist/report/built-in/analysis-values.cjs +21 -13
  254. package/dist/report/built-in/analysis-values.cjs.map +1 -1
  255. package/dist/report/built-in/analysis-values.d.cts +11 -22
  256. package/dist/report/built-in/analysis-values.d.mts +11 -22
  257. package/dist/report/built-in/analysis-values.d.ts +11 -22
  258. package/dist/report/built-in/analysis-values.js +4 -6
  259. package/dist/report/built-in/index.cjs +1 -3
  260. package/dist/report/built-in/index.cjs.map +1 -1
  261. package/dist/report/built-in/index.d.cts +1 -1
  262. package/dist/report/built-in/index.d.mts +1 -1
  263. package/dist/report/built-in/index.d.ts +1 -1
  264. package/dist/report/built-in/index.js +4 -8
  265. package/dist/report/built-in/index.mjs +4 -8
  266. package/dist/report/built-in/machine.cjs +0 -2
  267. package/dist/report/built-in/machine.cjs.map +1 -1
  268. package/dist/report/built-in/machine.d.cts +0 -2
  269. package/dist/report/built-in/machine.d.mts +0 -2
  270. package/dist/report/built-in/machine.d.ts +0 -2
  271. package/dist/report/built-in/result-components.cjs +49 -51
  272. package/dist/report/built-in/result-components.cjs.map +1 -1
  273. package/dist/report/built-in/result-components.d.cts +16 -17
  274. package/dist/report/built-in/result-components.d.mts +16 -17
  275. package/dist/report/built-in/result-components.d.ts +16 -17
  276. package/dist/report/built-in/result-components.js +0 -4
  277. package/dist/report/built-in/run-membership-overview.cjs +126 -17
  278. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  279. package/dist/report/built-in/run-membership-overview.d.cts +14 -0
  280. package/dist/report/built-in/run-membership-overview.d.mts +14 -0
  281. package/dist/report/built-in/run-membership-overview.d.ts +14 -0
  282. package/dist/report/built-in/run-membership-overview.js +4 -2
  283. package/dist/report/built-in/standard.cjs +80 -45
  284. package/dist/report/built-in/standard.cjs.map +1 -1
  285. package/dist/report/built-in/standard.d.cts +19 -41
  286. package/dist/report/built-in/standard.d.mts +19 -41
  287. package/dist/report/built-in/standard.d.ts +19 -41
  288. package/dist/report/built-in/standard.js +6 -6
  289. package/dist/report/components/attempt-detail/compute.cjs +78 -2
  290. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  291. package/dist/report/components/attempt-detail/compute.d.cts +1 -1
  292. package/dist/report/components/attempt-detail/compute.d.mts +1 -1
  293. package/dist/report/components/attempt-detail/compute.d.ts +1 -1
  294. package/dist/report/components/attempt-detail/content.cjs +1 -1
  295. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  296. package/dist/report/components/entity-lists/compute.cjs +42 -5
  297. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  298. package/dist/report/components/entity-lists/compute.d.cts +10 -8
  299. package/dist/report/components/entity-lists/compute.d.mts +10 -8
  300. package/dist/report/components/entity-lists/compute.d.ts +10 -8
  301. package/dist/report/components/entity-lists/content.cjs +31 -6
  302. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  303. package/dist/report/components/entity-lists/index.cjs +9 -4
  304. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  305. package/dist/report/components/entity-lists/index.d.cts +4 -7
  306. package/dist/report/components/entity-lists/index.d.mts +4 -7
  307. package/dist/report/components/entity-lists/index.d.ts +4 -7
  308. package/dist/report/components/summaries/compute.cjs +8 -1
  309. package/dist/report/components/summaries/compute.cjs.map +1 -1
  310. package/dist/report/components/summaries/compute.d.cts +9 -1
  311. package/dist/report/components/summaries/compute.d.mts +9 -1
  312. package/dist/report/components/summaries/compute.d.ts +9 -1
  313. package/dist/report/components/summaries/index.cjs +48 -4
  314. package/dist/report/components/summaries/index.cjs.map +1 -1
  315. package/dist/report/components/summaries/index.d.cts +7 -4
  316. package/dist/report/components/summaries/index.d.mts +7 -4
  317. package/dist/report/components/summaries/index.d.ts +7 -4
  318. package/dist/report/definition/cell.cjs +3 -0
  319. package/dist/report/definition/cell.cjs.map +1 -1
  320. package/dist/report/definition/cell.d.cts +2 -0
  321. package/dist/report/definition/cell.d.mts +2 -0
  322. package/dist/report/definition/cell.d.ts +2 -0
  323. package/dist/report/definition/primitives/chart.cjs +8 -5
  324. package/dist/report/definition/primitives/chart.cjs.map +1 -1
  325. package/dist/report/definition/primitives/points-dataset.cjs +1 -0
  326. package/dist/report/definition/primitives/points-dataset.cjs.map +1 -1
  327. package/dist/report/definition/primitives.cjs +15 -2
  328. package/dist/report/definition/primitives.cjs.map +1 -1
  329. package/dist/report/definition/report.cjs +27 -3
  330. package/dist/report/definition/report.cjs.map +1 -1
  331. package/dist/report/definition/report.d.cts +8 -0
  332. package/dist/report/definition/report.d.mts +8 -0
  333. package/dist/report/definition/report.d.ts +8 -0
  334. package/dist/report/execution/machine.cjs +30 -14
  335. package/dist/report/execution/machine.cjs.map +1 -1
  336. package/dist/report/execution/machine.d.cts +20 -10
  337. package/dist/report/execution/machine.d.mts +20 -10
  338. package/dist/report/execution/machine.d.ts +20 -10
  339. package/dist/report/execution/machine.js +6 -6
  340. package/dist/report/host/execute.cjs +25 -16
  341. package/dist/report/host/execute.cjs.map +1 -1
  342. package/dist/report/host/execute.d.cts +4 -0
  343. package/dist/report/host/execute.d.mts +4 -0
  344. package/dist/report/host/execute.d.ts +4 -0
  345. package/dist/report/host/from-record.cjs +22 -5
  346. package/dist/report/host/from-record.cjs.map +1 -1
  347. package/dist/report/host/machine.cjs +53 -11
  348. package/dist/report/host/machine.cjs.map +1 -1
  349. package/dist/report/host/site-runtime.cjs +9 -8
  350. package/dist/report/host/site-runtime.cjs.map +1 -1
  351. package/dist/report/host/site-runtime.d.cts +1 -1
  352. package/dist/report/host/site-runtime.d.mts +1 -1
  353. package/dist/report/host/site-runtime.d.ts +1 -1
  354. package/dist/report/host/static.cjs +56 -9
  355. package/dist/report/host/static.cjs.map +1 -1
  356. package/dist/report/index.cjs.map +1 -1
  357. package/dist/report/index.d.cts +1 -1
  358. package/dist/report/index.d.mts +1 -1
  359. package/dist/report/index.d.ts +1 -1
  360. package/dist/report/model/dataset.cjs +7 -2
  361. package/dist/report/model/dataset.cjs.map +1 -1
  362. package/dist/report/model/locale.cjs +2 -0
  363. package/dist/report/model/locale.cjs.map +1 -1
  364. package/dist/report/model/locale.d.cts +1 -0
  365. package/dist/report/model/locale.d.mts +1 -0
  366. package/dist/report/model/locale.d.ts +1 -0
  367. package/dist/report/model/metrics.cjs +3 -1
  368. package/dist/report/model/metrics.cjs.map +1 -1
  369. package/dist/report/model/pricing.cjs +16 -11
  370. package/dist/report/model/pricing.cjs.map +1 -1
  371. package/dist/report/react/styles.css +53 -29
  372. package/dist/runner/adoption.cjs +1 -0
  373. package/dist/runner/adoption.cjs.map +1 -1
  374. package/dist/runner/attempt.cjs +44 -5
  375. package/dist/runner/attempt.cjs.map +1 -1
  376. package/dist/runner/attempt.d.cts +13 -1
  377. package/dist/runner/attempt.d.mts +13 -1
  378. package/dist/runner/attempt.d.ts +13 -1
  379. package/dist/runner/config-identity.cjs +10 -2
  380. package/dist/runner/config-identity.cjs.map +1 -1
  381. package/dist/runner/config-identity.d.cts +4 -2
  382. package/dist/runner/config-identity.d.mts +4 -2
  383. package/dist/runner/config-identity.d.ts +4 -2
  384. package/dist/runner/feedback/human.cjs +298 -59
  385. package/dist/runner/feedback/human.cjs.map +1 -1
  386. package/dist/runner/feedback/json.cjs +14 -6
  387. package/dist/runner/feedback/json.cjs.map +1 -1
  388. package/dist/runner/feedback/json.d.cts +3 -2
  389. package/dist/runner/feedback/json.d.mts +3 -2
  390. package/dist/runner/feedback/json.d.ts +3 -2
  391. package/dist/runner/feedback/reducer.cjs +2 -0
  392. package/dist/runner/feedback/reducer.cjs.map +1 -1
  393. package/dist/runner/judge-config.cjs +1 -1
  394. package/dist/runner/judge-config.cjs.map +1 -1
  395. package/dist/runner/ledger.cjs +124 -12
  396. package/dist/runner/ledger.cjs.map +1 -1
  397. package/dist/runner/project-current.cjs +13 -5
  398. package/dist/runner/project-current.cjs.map +1 -1
  399. package/dist/runner/run.cjs +564 -256
  400. package/dist/runner/run.cjs.map +1 -1
  401. package/dist/runner/sandbox-pool.cjs +161 -30
  402. package/dist/runner/sandbox-pool.cjs.map +1 -1
  403. package/dist/runner/sandbox-pool.d.cts +34 -2
  404. package/dist/runner/sandbox-pool.d.mts +34 -2
  405. package/dist/runner/sandbox-pool.d.ts +34 -2
  406. package/dist/runner/shared-state-lease.cjs +803 -0
  407. package/dist/runner/shared-state-lease.cjs.map +1 -0
  408. package/dist/runner/shared-state-lease.d.cts +121 -0
  409. package/dist/runner/shared-state-lease.d.mts +121 -0
  410. package/dist/runner/shared-state-lease.d.ts +121 -0
  411. package/dist/runner/shared-state-lease.js +24 -0
  412. package/dist/runner/shared-state-lease.js.map +1 -0
  413. package/dist/runner/teardown-registry.cjs +97 -34
  414. package/dist/runner/teardown-registry.cjs.map +1 -1
  415. package/dist/runner/teardown-registry.d.cts +27 -1
  416. package/dist/runner/teardown-registry.d.mts +27 -1
  417. package/dist/runner/teardown-registry.d.ts +27 -1
  418. package/dist/runner/teardown-registry.js +20 -16
  419. package/dist/runner/types.cjs.map +1 -1
  420. package/dist/runner/types.d.cts +31 -5
  421. package/dist/runner/types.d.mts +31 -5
  422. package/dist/runner/types.d.ts +31 -5
  423. package/dist/sample/analysis.cjs +249 -459
  424. package/dist/sample/analysis.cjs.map +1 -1
  425. package/dist/sample/capability.cjs +138 -7
  426. package/dist/sample/capability.cjs.map +1 -1
  427. package/dist/sample/capability.d.cts +3 -1
  428. package/dist/sample/capability.d.mts +3 -1
  429. package/dist/sample/capability.d.ts +3 -1
  430. package/dist/sample/capability.js +8 -6
  431. package/dist/sandbox/docker-agent-image.cjs +5 -1
  432. package/dist/sandbox/docker-agent-image.cjs.map +1 -1
  433. package/dist/sandbox/docker-agent-image.d.cts +2 -0
  434. package/dist/sandbox/docker-agent-image.d.mts +2 -0
  435. package/dist/sandbox/docker-agent-image.d.ts +2 -0
  436. package/dist/sandbox/docker-agent-image.js +14 -10
  437. package/dist/sandbox/docker-profile/schema.cjs +283 -534
  438. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  439. package/dist/sandbox/docker-profile/schema.d.cts +10 -27
  440. package/dist/sandbox/docker-profile/schema.d.mts +10 -27
  441. package/dist/sandbox/docker-profile/schema.d.ts +10 -27
  442. package/dist/sandbox/e2b-agent-template.cjs +5 -2
  443. package/dist/sandbox/e2b-agent-template.cjs.map +1 -1
  444. package/dist/sandbox/index.cjs +4 -2
  445. package/dist/sandbox/index.cjs.map +1 -1
  446. package/dist/sandbox/index.d.cts +1 -1
  447. package/dist/sandbox/index.d.mts +1 -1
  448. package/dist/sandbox/index.d.ts +1 -1
  449. package/dist/sandbox/index.js +120 -116
  450. package/dist/sandbox/index.mjs +120 -116
  451. package/dist/sandbox/keep-registry.cjs +28 -66
  452. package/dist/sandbox/keep-registry.cjs.map +1 -1
  453. package/dist/sandbox/types.cjs.map +1 -1
  454. package/dist/sandbox/types.d.cts +1 -1
  455. package/dist/sandbox/types.d.mts +1 -1
  456. package/dist/sandbox/types.d.ts +1 -1
  457. package/dist/shared/aggregate.cjs +16 -6
  458. package/dist/shared/aggregate.cjs.map +1 -1
  459. package/dist/shared/aggregate.d.cts +12 -4
  460. package/dist/shared/aggregate.d.mts +12 -4
  461. package/dist/shared/aggregate.d.ts +12 -4
  462. package/dist/shared/turn-label.cjs +20 -2
  463. package/dist/shared/turn-label.cjs.map +1 -1
  464. package/dist/shared/turn-label.d.cts +2 -0
  465. package/dist/shared/turn-label.d.mts +2 -0
  466. package/dist/shared/turn-label.d.ts +2 -0
  467. package/dist/shared/turn-label.js +4 -2
  468. package/dist/vendor/remark/remark-gfm.cjs +7 -7
  469. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  470. package/dist/vendor/remark/remark-parse.cjs +12 -12
  471. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  472. package/dist/vendor/remark/remark.cjs +13 -13
  473. package/dist/vendor/remark/remark.cjs.map +1 -1
  474. package/dist/view/server.cjs +6 -0
  475. package/dist/view/server.cjs.map +1 -1
  476. package/docs-site/images/hitl-handshake-zh.svg +3 -3
  477. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  478. package/docs-site/zh/examples/coding-agent-extensions.mdx +1 -1
  479. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +4 -3
  480. package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
  481. package/docs-site/zh/examples/integrations/codex-sdk.mdx +5 -5
  482. package/docs-site/zh/examples/integrations/langgraph.mdx +4 -4
  483. package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
  484. package/docs-site/zh/explanation/adapter.mdx +5 -5
  485. package/docs-site/zh/explanation/assert.mdx +7 -7
  486. package/docs-site/zh/explanation/drive.mdx +4 -2
  487. package/docs-site/zh/explanation/evals.mdx +10 -8
  488. package/docs-site/zh/explanation/experiment.mdx +2 -2
  489. package/docs-site/zh/explanation/hitl.mdx +9 -9
  490. package/docs-site/zh/explanation/judge.mdx +5 -5
  491. package/docs-site/zh/explanation/overview.mdx +3 -3
  492. package/docs-site/zh/explanation/runner.mdx +1 -1
  493. package/docs-site/zh/index.mdx +3 -3
  494. package/docs-site/zh/reference/builtin-agents.mdx +13 -13
  495. package/docs-site/zh/reference/capabilities.mdx +1 -1
  496. package/docs-site/zh/reference/cli.mdx +18 -12
  497. package/docs-site/zh/reference/define-agent.mdx +130 -5
  498. package/docs-site/zh/reference/define-config.mdx +2 -2
  499. package/docs-site/zh/reference/define-eval.mdx +4 -4
  500. package/docs-site/zh/reference/events.mdx +11 -11
  501. package/docs-site/zh/reference/official-adapters.mdx +6 -6
  502. package/docs-site/zh/reference/results-data.mdx +6 -0
  503. package/docs-site/zh/troubleshooting/debugging.mdx +1 -1
  504. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +37 -5
  505. package/docs-site/zh/tutorials/accept-results.mdx +72 -0
  506. package/docs-site/zh/tutorials/agent-onboarding.mdx +6 -6
  507. package/docs-site/zh/tutorials/authoring.mdx +9 -13
  508. package/docs-site/zh/tutorials/ci-integration.mdx +6 -6
  509. package/docs-site/zh/tutorials/compare-runs.mdx +61 -0
  510. package/docs-site/zh/tutorials/concurrency.mdx +13 -12
  511. package/docs-site/zh/tutorials/configuration.mdx +4 -6
  512. package/docs-site/zh/tutorials/connect-your-agent.mdx +1 -1
  513. package/docs-site/zh/tutorials/control-run-cost.mdx +58 -0
  514. package/docs-site/zh/tutorials/criteria-files.mdx +2 -2
  515. package/docs-site/zh/tutorials/custom-reports.mdx +2 -2
  516. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +46 -0
  517. package/docs-site/zh/tutorials/docker-in-docker.mdx +52 -43
  518. package/docs-site/zh/tutorials/eval-groups.mdx +6 -6
  519. package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
  520. package/docs-site/zh/tutorials/experiments.mdx +2 -3
  521. package/docs-site/zh/tutorials/handle-execution-failures.mdx +18 -10
  522. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +16 -8
  523. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +160 -0
  524. package/docs-site/zh/tutorials/plugins.mdx +14 -0
  525. package/docs-site/zh/tutorials/rerun-and-cache.mdx +4 -2
  526. package/docs-site/zh/tutorials/sandbox-agent.mdx +17 -11
  527. package/docs-site/zh/tutorials/sandbox-providers.mdx +17 -13
  528. package/docs-site/zh/tutorials/sandbox-reuse.mdx +12 -19
  529. package/docs-site/zh/tutorials/select-and-preview.mdx +65 -0
  530. package/docs-site/zh/tutorials/verify-judge.mdx +78 -0
  531. package/docs-site/zh/tutorials/viewing-results.mdx +38 -1
  532. package/docs-site/zh/tutorials/write-experiment.mdx +7 -5
  533. package/docs-site/zh/tutorials/write-send.mdx +9 -8
  534. package/package.json +9 -5
  535. package/dist/report/built-in/overview.cjs +0 -44
  536. package/dist/report/built-in/overview.cjs.map +0 -1
  537. package/dist/report/built-in/overview.d.cts +0 -6
  538. package/dist/report/built-in/overview.d.mts +0 -6
  539. package/dist/report/built-in/overview.d.ts +0 -6
  540. package/dist/report/built-in/overview.js +0 -9
  541. package/dist/report/built-in/overview.js.map +0 -1
  542. package/dist/runner/gate-lease.cjs +0 -283
  543. package/dist/runner/gate-lease.cjs.map +0 -1
  544. package/dist/runner/gate-lease.d.cts +0 -62
  545. package/dist/runner/gate-lease.d.mts +0 -62
  546. package/dist/runner/gate-lease.d.ts +0 -62
  547. package/dist/runner/gate-lease.js +0 -22
  548. package/dist/runner/gate-lease.js.map +0 -1
@@ -3,11 +3,6 @@ import type { AttemptLocator } from "../../../attempt-locator.mjs";
3
3
  import type { EvalId, ExperimentId } from "../../../analysis/index.mjs";
4
4
  import type { Verdict } from "../../../shared/types.mjs";
5
5
  type UtcMillis = Sample["snapshot"]["runs"][number]["startedAt"];
6
- /**
7
- * 当前 Analysis 只发布通过制读数(没有总分 Measure),题型构成恒为
8
- * "pass"。未来 Analysis 发布计分制 Measure 时,这里与 content.ts 的列集一起按
9
- * 同一构成判据扩展。
10
- */
11
6
  export type EvaluationKindComposition = "pass" | "points" | "mixed";
12
7
  /** 一个层级共用的四枚 Analysis-owned 读数。 */
13
8
  export interface ExperimentMetrics {
@@ -30,6 +25,9 @@ export interface AttemptListItem {
30
25
  * display 标签;closed 数据没有可读摘录时为 null(渲染成 "—",不发明文案)。
31
26
  */
32
27
  readonly failureSummary: string | null;
28
+ readonly evaluationKind: "pass" | "points";
29
+ /** Complete earned score for this Attempt; absent for pass or incomplete score evidence. */
30
+ readonly totalScore?: number;
33
31
  readonly passRate: MetricValue<number>;
34
32
  readonly durationMs: MetricValue<number>;
35
33
  /** Present only when the owning Report declares a PricingProfile. */
@@ -43,6 +41,9 @@ export interface AttemptListItem {
43
41
  /** experiment 层级表里一道 Eval 的闭合行;attempts 是它的可见子行。 */
44
42
  export interface ExperimentListEvalRow {
45
43
  readonly evalId: EvalId;
44
+ readonly evaluationKind: "pass" | "points";
45
+ /** Mean of complete Attempt scores for this Eval. */
46
+ readonly totalScore?: number;
46
47
  readonly endToEndPassRate: MetricValue<number>;
47
48
  readonly durationMs: MetricValue<number>;
48
49
  readonly costUSD?: CostMetricValue;
@@ -56,8 +57,9 @@ export interface ExperimentListItem {
56
57
  readonly agent: string | null;
57
58
  readonly model: string | null;
58
59
  readonly flags: Readonly<Record<string, JsonValue>> | null;
59
- /** 占位默认值,见 EvaluationKindComposition 注释。 */
60
60
  readonly evaluationKind: EvaluationKindComposition;
61
+ /** Sum of the visible per-Eval score cells; absent when no complete Score Eval exists. */
62
+ readonly totalScore?: number;
61
63
  readonly endToEndPassRate: MetricValue<number>;
62
64
  readonly durationMs: MetricValue<number>;
63
65
  readonly costUSD?: CostMetricValue;
@@ -100,8 +102,8 @@ export declare function experimentEvalLayout(evalIdValues: readonly EvalId[]): r
100
102
  export declare function attemptListData(sample: Sample, pricing?: PricingProfile | null): Promise<readonly AttemptListItem[]>;
101
103
  /**
102
104
  * `experimentListData(sample)`:每个 experiment 一项,展开到每道 Eval;初始排序按
103
- * 这份列表自身的题型构成选择主读数——当前 facade 只有通过制读数,恒为
104
- * endToEndPassRate 降序(缺数据沉底,同值按 experimentId 字典序收口)。
105
+ * 这份列表自身的题型构成选择主读数:纯通过制按 endToEndPassRate,含分数制
106
+ * 时按 totalScore 降序(缺数据沉底,同值按 experimentId 字典序收口)。
105
107
  */
106
108
  export declare function experimentListData(sample: Sample, pricing?: PricingProfile | null): Promise<readonly ExperimentListItem[]>;
107
109
  export {};
@@ -3,11 +3,6 @@ import type { AttemptLocator } from "../../../attempt-locator.js";
3
3
  import type { EvalId, ExperimentId } from "../../../analysis/index.js";
4
4
  import type { Verdict } from "../../../shared/types.js";
5
5
  type UtcMillis = Sample["snapshot"]["runs"][number]["startedAt"];
6
- /**
7
- * 当前 Analysis 只发布通过制读数(没有总分 Measure),题型构成恒为
8
- * "pass"。未来 Analysis 发布计分制 Measure 时,这里与 content.ts 的列集一起按
9
- * 同一构成判据扩展。
10
- */
11
6
  export type EvaluationKindComposition = "pass" | "points" | "mixed";
12
7
  /** 一个层级共用的四枚 Analysis-owned 读数。 */
13
8
  export interface ExperimentMetrics {
@@ -30,6 +25,9 @@ export interface AttemptListItem {
30
25
  * display 标签;closed 数据没有可读摘录时为 null(渲染成 "—",不发明文案)。
31
26
  */
32
27
  readonly failureSummary: string | null;
28
+ readonly evaluationKind: "pass" | "points";
29
+ /** Complete earned score for this Attempt; absent for pass or incomplete score evidence. */
30
+ readonly totalScore?: number;
33
31
  readonly passRate: MetricValue<number>;
34
32
  readonly durationMs: MetricValue<number>;
35
33
  /** Present only when the owning Report declares a PricingProfile. */
@@ -43,6 +41,9 @@ export interface AttemptListItem {
43
41
  /** experiment 层级表里一道 Eval 的闭合行;attempts 是它的可见子行。 */
44
42
  export interface ExperimentListEvalRow {
45
43
  readonly evalId: EvalId;
44
+ readonly evaluationKind: "pass" | "points";
45
+ /** Mean of complete Attempt scores for this Eval. */
46
+ readonly totalScore?: number;
46
47
  readonly endToEndPassRate: MetricValue<number>;
47
48
  readonly durationMs: MetricValue<number>;
48
49
  readonly costUSD?: CostMetricValue;
@@ -56,8 +57,9 @@ export interface ExperimentListItem {
56
57
  readonly agent: string | null;
57
58
  readonly model: string | null;
58
59
  readonly flags: Readonly<Record<string, JsonValue>> | null;
59
- /** 占位默认值,见 EvaluationKindComposition 注释。 */
60
60
  readonly evaluationKind: EvaluationKindComposition;
61
+ /** Sum of the visible per-Eval score cells; absent when no complete Score Eval exists. */
62
+ readonly totalScore?: number;
61
63
  readonly endToEndPassRate: MetricValue<number>;
62
64
  readonly durationMs: MetricValue<number>;
63
65
  readonly costUSD?: CostMetricValue;
@@ -100,8 +102,8 @@ export declare function experimentEvalLayout(evalIdValues: readonly EvalId[]): r
100
102
  export declare function attemptListData(sample: Sample, pricing?: PricingProfile | null): Promise<readonly AttemptListItem[]>;
101
103
  /**
102
104
  * `experimentListData(sample)`:每个 experiment 一项,展开到每道 Eval;初始排序按
103
- * 这份列表自身的题型构成选择主读数——当前 facade 只有通过制读数,恒为
104
- * endToEndPassRate 降序(缺数据沉底,同值按 experimentId 字典序收口)。
105
+ * 这份列表自身的题型构成选择主读数:纯通过制按 endToEndPassRate,含分数制
106
+ * 时按 totalScore 降序(缺数据沉底,同值按 experimentId 字典序收口)。
105
107
  */
106
108
  export declare function experimentListData(sample: Sample, pricing?: PricingProfile | null): Promise<readonly ExperimentListItem[]>;
107
109
  export {};
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.experimentListContent = experimentListContent;
4
4
  exports.attemptListContent = attemptListContent;
5
5
  const locale_ts_1 = require("../../model/locale.cjs");
6
+ const format_ts_1 = require("../../model/format.cjs");
6
7
  const compute_ts_1 = require("./compute.cjs");
7
8
  /** 覆盖缺口占位行共用的原因码;missingText(code) 经 locale 键给出文案。 */
8
9
  const NO_CURRENT_RESULT = "noCurrentResult";
@@ -15,6 +16,7 @@ const HEADER = {
15
16
  agent: (0, locale_ts_1.localizedMessage)("table.agent"),
16
17
  durationMs: (0, locale_ts_1.localizedMessage)("experimentList.avgDuration"),
17
18
  passRate: (0, locale_ts_1.localizedMessage)("experimentList.passRate"),
19
+ totalScore: (0, locale_ts_1.localizedMessage)("experimentList.totalScore"),
18
20
  tokens: (0, locale_ts_1.localizedMessage)("experimentList.tokens"),
19
21
  costUSD: (0, locale_ts_1.localizedMessage)("experimentList.cost"),
20
22
  record: (0, locale_ts_1.localizedMessage)("experimentList.result"),
@@ -78,19 +80,29 @@ function attemptCells(attempt) {
78
80
  // 层级表的判定构成列:该次判定,与 verdict 格同值。
79
81
  record: verdictCell(attempt.verdict),
80
82
  durationMs: measureCell(attempt.durationMs),
83
+ ...(attempt.totalScore === undefined ? {} : { totalScore: { kind: "score", earned: attempt.totalScore } }),
81
84
  ...(attempt.costUSD === undefined ? {} : { costUSD: measureCell(attempt.costUSD) }),
82
85
  };
83
86
  }
84
- /** 层级表列集:主读数列随题型构成在场,其余固定。当前 facade 只有通过制读数。 */
85
- const HIERARCHY_COLUMNS = [
87
+ const HIERARCHY_COLUMNS_PREFIX = [
86
88
  { key: "entity", header: HEADER.entity },
87
89
  { key: "model", header: HEADER.model },
88
90
  { key: "agent", header: HEADER.agent },
89
91
  { key: "durationMs", better: "lower", header: HEADER.durationMs },
90
- { key: "passRate", better: "higher", header: HEADER.passRate },
92
+ ];
93
+ const HIERARCHY_COLUMNS_SUFFIX = [
91
94
  { key: "tokens", better: "lower", header: HEADER.tokens },
92
95
  { key: "record", header: HEADER.record },
93
96
  ];
97
+ function hierarchyColumns(items) {
98
+ const composition = (0, format_ts_1.experimentListEvaluationKindComposition)(items.map((item) => ({ evaluationKind: item.evaluationKind, attempts: item.evalRows.length })));
99
+ const primary = [];
100
+ if (composition !== "points")
101
+ primary.push({ key: "passRate", better: "higher", header: HEADER.passRate });
102
+ if (composition !== "pass")
103
+ primary.push({ key: "totalScore", better: "higher", header: HEADER.totalScore });
104
+ return [...HIERARCHY_COLUMNS_PREFIX, ...primary, ...HIERARCHY_COLUMNS_SUFFIX];
105
+ }
94
106
  const COST_COLUMN = { key: "costUSD", better: "lower", header: HEADER.costUSD };
95
107
  /** Attempt 平铺表的列集(AttemptList / FailureList 同一份)。 */
96
108
  const FLAT_ENTITY_COLUMNS = [
@@ -151,6 +163,8 @@ function evalRow(row, label, view) {
151
163
  // 判定构成列:该题 attempts 的计票,与 experiment 行计票同一形态。
152
164
  record: verdictCountsCell(row.attempts),
153
165
  durationMs: measureCell(row.durationMs),
166
+ ...(row.evaluationKind === "pass" ? { passRate: measureCell(row.endToEndPassRate) } : {}),
167
+ ...(row.totalScore === undefined ? {} : { totalScore: { kind: "score", earned: row.totalScore } }),
154
168
  ...(row.costUSD === undefined ? {} : { costUSD: measureCell(row.costUSD) }),
155
169
  };
156
170
  return {
@@ -201,7 +215,17 @@ function groupTableRow(node, item, view) {
201
215
  const bag = {
202
216
  entity: identityCell(node.segment, groupEntityDetail(evals, knownEvals)),
203
217
  durationMs: groupMetricValue(metrics, "durationMs"),
204
- passRate: groupMetricValue(metrics, "passRate"),
218
+ ...(evalRows.every((row) => row.evaluationKind === "pass")
219
+ ? { passRate: groupMetricValue(metrics, "passRate") }
220
+ : {}),
221
+ ...(evalRows.some((row) => row.totalScore !== undefined)
222
+ ? {
223
+ totalScore: {
224
+ kind: "score",
225
+ earned: evalRows.reduce((sum, row) => sum + (row.totalScore ?? 0), 0),
226
+ },
227
+ }
228
+ : {}),
205
229
  tokens: groupMetricValue(metrics, "tokens"),
206
230
  ...(metrics?.costUSD === undefined ? {} : { costUSD: measureCell(metrics.costUSD) }),
207
231
  record: evals === 0
@@ -246,7 +270,8 @@ function experimentRow(item, view) {
246
270
  model: item.model === null ? { kind: "notApplicable" } : textCell(item.model),
247
271
  agent: item.agent === null ? { kind: "notApplicable" } : textCell(item.agent),
248
272
  durationMs: measureCell(item.durationMs),
249
- passRate: measureCell(item.endToEndPassRate),
273
+ ...(item.evaluationKind === "pass" ? { passRate: measureCell(item.endToEndPassRate) } : {}),
274
+ ...(item.totalScore === undefined ? {} : { totalScore: { kind: "score", earned: item.totalScore } }),
250
275
  tokens: measureCell(item.tokens),
251
276
  ...(item.costUSD === undefined ? {} : { costUSD: measureCell(item.costUSD) }),
252
277
  record: verdictCountsCell(attempts),
@@ -258,7 +283,7 @@ function experimentRow(item, view) {
258
283
  };
259
284
  }
260
285
  function experimentListContent(items) {
261
- const columns = columnsWithCost(HIERARCHY_COLUMNS, items.some((item) => item.costUSD !== undefined));
286
+ const columns = columnsWithCost(hierarchyColumns(items), items.some((item) => item.costUSD !== undefined));
262
287
  return {
263
288
  columns,
264
289
  rows: items.map((item) => experimentRow(item, { columns, item, labelPrefix: "" })),
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","sourceRoot":"","sources":["content.ts"],"names":[],"mappings":"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","sourcesContent":["// 实体列表 Table Content 投影(docs/feature/reports/library.md)。\n// Experiment 层级在这里从闭合 ExperimentListItem + 组读数投影成 TableContent.subRows;\n// 组件本体是中立 Table 原语,不知道 experiment / Eval / Attempt 语义。\nimport type { Cell, ColumnSpec, TableContent, TableContentRow, } from \"../../definition/cell.ts\";\nimport { localizedMessage } from \"../../model/locale.ts\";\nimport type { Verdict } from \"../../../shared/types.ts\";\nimport type { MetricValue } from \"../../../analysis/index.ts\";\nimport { experimentEvalLayout, relativeEvalLabel, type AttemptListItem, type ExperimentListEvalRow, type ExperimentListItem, type ExperimentMetrics, type EvalLayoutNode, } from \"./compute.ts\";\n/** 覆盖缺口占位行共用的原因码;missingText(code) 经 locale 键给出文案。 */\nconst NO_CURRENT_RESULT = \"noCurrentResult\";\n/** 组内零样本读数格的结构化原因码。 */\nconst GROUP_NO_SAMPLES = \"noSamples\";\n/** 三张实体表共用的列表头。文案单源在 locale 字典,这里只烤成随列走的 LocalizedText。 */\nconst HEADER = {\n entity: localizedMessage(\"experimentList.experiment\"),\n model: localizedMessage(\"table.model\"),\n agent: localizedMessage(\"table.agent\"),\n durationMs: localizedMessage(\"experimentList.avgDuration\"),\n passRate: localizedMessage(\"experimentList.passRate\"),\n tokens: localizedMessage(\"experimentList.tokens\"),\n costUSD: localizedMessage(\"experimentList.cost\"),\n record: localizedMessage(\"experimentList.result\"),\n verdict: localizedMessage(\"experimentList.status\"),\n result: localizedMessage(\"experimentList.result\"),\n};\n/**\n * 一行的「格子原料」:这一行自己算得出的全部格子,与任何列集无关。\n * 原料裁成行由 `projectCells` 做——列集外的原料丢掉,原料没覆盖的列显式填\n * notApplicable,不靠缺格回落成 \"—\"(memory/cell-key-must-match-column-set.md)。\n */\ntype CellBag = Readonly<globalThis.Record<string, Cell>>;\nfunction projectCells(bag: CellBag, columns: readonly ColumnSpec[]): globalThis.Record<string, Cell> {\n const cells: globalThis.Record<string, Cell> = {};\n for (const column of columns) {\n cells[column.key] = bag[column.key] ?? { kind: \"notApplicable\" };\n }\n return cells;\n}\nfunction measureCell(value: MetricValue): Cell {\n return { kind: \"metric\", metric: value };\n}\n/** 一组判定 → 计票。experiment / 组行数题、Eval 行数 attempt,同一形态同一构造。 */\nfunction tallyVerdicts(attempts: readonly AttemptListItem[]): {\n readonly passed: number;\n readonly failed: number;\n readonly errored: number;\n readonly skipped: number;\n} {\n const counts = { passed: 0, failed: 0, errored: 0, skipped: 0 };\n for (const attempt of attempts) {\n if (attempt.verdict === null)\n continue;\n counts[attempt.verdict] += 1;\n }\n return counts;\n}\nfunction verdictCountsCell(attempts: readonly AttemptListItem[]): Cell {\n return { kind: \"verdict\", counts: tallyVerdicts(attempts) };\n}\nfunction verdictCell(verdict: Verdict | null): Cell {\n if (verdict === null)\n return { kind: \"notApplicable\" };\n return { kind: \"verdict\", verdict };\n}\nfunction locatorCell(attempt: AttemptListItem): Cell {\n return {\n kind: \"locator\",\n locator: attempt.locator,\n ...(attempt.verdict === null ? {} : { verdict: attempt.verdict }),\n };\n}\nfunction textCell(text: string, detail?: string): Cell {\n return detail ? { kind: \"text\", text, detail } : { kind: \"text\", text };\n}\n/** 失败摘要格:closed 摘录缺失时如实显示 \"—\",不发明文案。 */\nfunction resultCell(attempt: AttemptListItem): Cell {\n return attempt.failureSummary === null\n ? { kind: \"text\", text: \"—\" }\n : { kind: \"summary\", text: attempt.failureSummary };\n}\n/**\n * attempt 行的格子原料。层级表取 entity / record / durationMs / costUSD,\n * 平铺表取 entity / verdict / result / durationMs / costUSD;\n * 两张表各自裁自这一份,不各写一份构造。\n */\nfunction attemptCells(attempt: AttemptListItem): CellBag {\n return {\n entity: locatorCell(attempt),\n verdict: verdictCell(attempt.verdict),\n result: resultCell(attempt),\n // 层级表的判定构成列:该次判定,与 verdict 格同值。\n record: verdictCell(attempt.verdict),\n durationMs: measureCell(attempt.durationMs),\n ...(attempt.costUSD === undefined ? {} : { costUSD: measureCell(attempt.costUSD) }),\n };\n}\n/** 层级表列集:主读数列随题型构成在场,其余固定。当前 facade 只有通过制读数。 */\nconst HIERARCHY_COLUMNS: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"model\", header: HEADER.model },\n { key: \"agent\", header: HEADER.agent },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n { key: \"passRate\", better: \"higher\", header: HEADER.passRate },\n { key: \"tokens\", better: \"lower\", header: HEADER.tokens },\n { key: \"record\", header: HEADER.record },\n];\nconst COST_COLUMN: ColumnSpec = { key: \"costUSD\", better: \"lower\", header: HEADER.costUSD };\n/** Attempt 平铺表的列集(AttemptList / FailureList 同一份)。 */\nconst FLAT_ENTITY_COLUMNS: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"verdict\", header: HEADER.verdict },\n { key: \"result\", header: HEADER.result },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nfunction columnsWithCost(columns: readonly ColumnSpec[], includeCost: boolean): readonly ColumnSpec[] {\n if (!includeCost)\n return columns;\n const recordIndex = columns.findIndex((column) => column.key === \"record\");\n if (recordIndex < 0)\n return [...columns, COST_COLUMN];\n return [...columns.slice(0, recordIndex), COST_COLUMN, ...columns.slice(recordIndex)];\n}\n/** 层级实体的计数属于身份说明,必须留在同一个首格而不是渲染成续行。 */\nfunction identityCell(name: string, metadata: string): Cell {\n return textCell(`${name} (${metadata})`);\n}\n/** 组内题数与已知题数:\"3/4 evals\" 只在有缺口时出现。 */\nfunction groupEntityDetail(evals: number, knownEvals: number): string {\n return knownEvals > evals ? `${evals}/${knownEvals} evals` : `${evals} evals`;\n}\n/**\n * 组行读数格:直接用 Analysis-owned 组 MetricValue;组前缀聚合缺失时才是\n * missing(本该有却没跑到),不是 \"—\"(对这一行没有意义)。\n */\nfunction groupMetricValue(metrics: ExperimentMetrics | undefined, key: keyof ExperimentMetrics): Cell {\n const metric = metrics?.[key];\n return metric === undefined ? { kind: \"missing\", code: GROUP_NO_SAMPLES } : measureCell(metric);\n}\n/** 覆盖缺口占位行:code 与补跑命令同行——都是「当前配置下没有结果」这一个事实。 */\nfunction placeholderRow(experimentId: string, evalId: string, label: string, columns: readonly ColumnSpec[]): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n record: {\n kind: \"missing\",\n code: NO_CURRENT_RESULT,\n detail: `niceeval exp ${experimentId}`,\n },\n };\n return {\n key: `${experimentId}:${evalId}:missing`,\n variant: \"placeholder\",\n cells: projectCells(bag, columns),\n };\n}\ninterface HierarchyView {\n readonly columns: readonly ColumnSpec[];\n readonly item: ExperimentListItem;\n readonly labelPrefix: string;\n}\nfunction attemptRow(attempt: AttemptListItem, columns: readonly ColumnSpec[]): TableContentRow {\n return {\n key: attempt.locator,\n cells: projectCells(attemptCells(attempt), columns),\n };\n}\nfunction evalRow(row: ExperimentListEvalRow, label: string, view: HierarchyView): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n // 判定构成列:该题 attempts 的计票,与 experiment 行计票同一形态。\n record: verdictCountsCell(row.attempts),\n durationMs: measureCell(row.durationMs),\n ...(row.costUSD === undefined ? {} : { costUSD: measureCell(row.costUSD) }),\n };\n return {\n key: row.evalId,\n cells: projectCells(bag, view.columns),\n subRows: row.attempts.map((attempt) => attemptRow(attempt, view.columns)),\n };\n}\nfunction leafTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n}>, view: HierarchyView): TableContentRow {\n const label = relativeEvalLabel(node.evalId, view.labelPrefix);\n const row = view.item.evalRows.find((candidate) => candidate.evalId === node.evalId);\n return row === undefined\n ? placeholderRow(view.item.experimentId, node.evalId, label, view.columns)\n : evalRow(row, label, view);\n}\n/** 组行的成员 attempt 列表(用于判定计票)。 */\nfunction attemptsUnder(node: EvalLayoutNode, evalRows: readonly ExperimentListEvalRow[]): readonly AttemptListItem[] {\n const members = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n members.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n return evalRows\n .filter((row) => members.has(row.evalId))\n .flatMap((row) => row.attempts);\n}\nfunction groupTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n}>, item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n evalIds.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n const evalRows = item.evalRows.filter((row) => evalIds.has(row.evalId));\n const knownEvals = evalIds.size;\n const evals = evalRows.length;\n const metrics = item.groupMetrics.get(node.prefix);\n const attempts = attemptsUnder(node, item.evalRows);\n const bag: CellBag = {\n entity: identityCell(node.segment, groupEntityDetail(evals, knownEvals)),\n durationMs: groupMetricValue(metrics, \"durationMs\"),\n passRate: groupMetricValue(metrics, \"passRate\"),\n tokens: groupMetricValue(metrics, \"tokens\"),\n ...(metrics?.costUSD === undefined ? {} : { costUSD: measureCell(metrics.costUSD) }),\n record: evals === 0\n ? { kind: \"missing\", code: GROUP_NO_SAMPLES }\n : verdictCountsCell(attempts),\n };\n return {\n key: `group:${node.prefix}`,\n variant: \"group\",\n cells: projectCells(bag, view.columns),\n subRows: groupChildren(node.children, { ...view, labelPrefix: node.prefix }),\n };\n}\n/** 同一层的组行按主读数降序(缺数据沉底,同值按段名收口),叶子恒在组行之后。 */\nfunction groupChildren(nodes: readonly EvalLayoutNode[], view: HierarchyView): TableContentRow[] {\n const groups = nodes\n .filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n }> => node.kind === \"group\")\n .slice()\n .sort((left, right) => {\n const leftPrimary = view.item.groupMetrics.get(left.prefix)?.passRate.value ?? null;\n const rightPrimary = view.item.groupMetrics.get(right.prefix)?.passRate.value ?? null;\n if (leftPrimary === null && rightPrimary === null)\n return left.segment.localeCompare(right.segment);\n if (leftPrimary === null)\n return 1;\n if (rightPrimary === null)\n return -1;\n return rightPrimary - leftPrimary || left.segment.localeCompare(right.segment);\n });\n const leaves = nodes.filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n }> => node.kind === \"leaf\");\n return [\n ...groups.map((node) => groupTableRow(node, view.item, view)),\n ...leaves.map((node) => leafTableRow(node, view)),\n ];\n}\nfunction experimentRow(item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set(item.evalRows.map((row) => row.evalId));\n const members: readonly EvalLayoutNode[] = experimentEvalLayout([...new Set([...evalIds, ...item.missingEvalIds])]);\n const attempts = item.evalRows.flatMap((row) => row.attempts);\n const bag: CellBag = {\n entity: textCell(item.experimentId),\n model: item.model === null ? { kind: \"notApplicable\" } : textCell(item.model),\n agent: item.agent === null ? { kind: \"notApplicable\" } : textCell(item.agent),\n durationMs: measureCell(item.durationMs),\n passRate: measureCell(item.endToEndPassRate),\n tokens: measureCell(item.tokens),\n ...(item.costUSD === undefined ? {} : { costUSD: measureCell(item.costUSD) }),\n record: verdictCountsCell(attempts),\n };\n return {\n key: item.experimentId,\n cells: projectCells(bag, view.columns),\n subRows: members.length > 0 ? groupChildren(members, view) : [],\n };\n}\nexport function experimentListContent(items: readonly ExperimentListItem[]): TableContent {\n const columns = columnsWithCost(HIERARCHY_COLUMNS, items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n rows: items.map((item) => experimentRow(item, { columns, item, labelPrefix: \"\" })),\n };\n}\nexport function attemptListContent(items: readonly AttemptListItem[]): TableContent {\n const columns = columnsWithCost(FLAT_ENTITY_COLUMNS, items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n // 与层级表里的 attempt 行同一份格子原料,只是裁到平铺列集。\n rows: items.map((item) => attemptRow(item, columns)),\n };\n}\n"]}
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["content.ts"],"names":[],"mappings":"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","sourcesContent":["// 实体列表 Table Content 投影(docs/feature/reports/library.md)。\n// Experiment 层级在这里从闭合 ExperimentListItem + 组读数投影成 TableContent.subRows;\n// 组件本体是中立 Table 原语,不知道 experiment / Eval / Attempt 语义。\nimport type { Cell, ColumnSpec, TableContent, TableContentRow, } from \"../../definition/cell.ts\";\nimport { localizedMessage } from \"../../model/locale.ts\";\nimport type { Verdict } from \"../../../shared/types.ts\";\nimport type { MetricValue } from \"../../../analysis/index.ts\";\nimport { experimentListEvaluationKindComposition } from \"../../model/format.ts\";\nimport { experimentEvalLayout, relativeEvalLabel, type AttemptListItem, type ExperimentListEvalRow, type ExperimentListItem, type ExperimentMetrics, type EvalLayoutNode, } from \"./compute.ts\";\n/** 覆盖缺口占位行共用的原因码;missingText(code) 经 locale 键给出文案。 */\nconst NO_CURRENT_RESULT = \"noCurrentResult\";\n/** 组内零样本读数格的结构化原因码。 */\nconst GROUP_NO_SAMPLES = \"noSamples\";\n/** 三张实体表共用的列表头。文案单源在 locale 字典,这里只烤成随列走的 LocalizedText。 */\nconst HEADER = {\n entity: localizedMessage(\"experimentList.experiment\"),\n model: localizedMessage(\"table.model\"),\n agent: localizedMessage(\"table.agent\"),\n durationMs: localizedMessage(\"experimentList.avgDuration\"),\n passRate: localizedMessage(\"experimentList.passRate\"),\n totalScore: localizedMessage(\"experimentList.totalScore\"),\n tokens: localizedMessage(\"experimentList.tokens\"),\n costUSD: localizedMessage(\"experimentList.cost\"),\n record: localizedMessage(\"experimentList.result\"),\n verdict: localizedMessage(\"experimentList.status\"),\n result: localizedMessage(\"experimentList.result\"),\n};\n/**\n * 一行的「格子原料」:这一行自己算得出的全部格子,与任何列集无关。\n * 原料裁成行由 `projectCells` 做——列集外的原料丢掉,原料没覆盖的列显式填\n * notApplicable,不靠缺格回落成 \"—\"(memory/cell-key-must-match-column-set.md)。\n */\ntype CellBag = Readonly<globalThis.Record<string, Cell>>;\nfunction projectCells(bag: CellBag, columns: readonly ColumnSpec[]): globalThis.Record<string, Cell> {\n const cells: globalThis.Record<string, Cell> = {};\n for (const column of columns) {\n cells[column.key] = bag[column.key] ?? { kind: \"notApplicable\" };\n }\n return cells;\n}\nfunction measureCell(value: MetricValue): Cell {\n return { kind: \"metric\", metric: value };\n}\n/** 一组判定 → 计票。experiment / 组行数题、Eval 行数 attempt,同一形态同一构造。 */\nfunction tallyVerdicts(attempts: readonly AttemptListItem[]): {\n readonly passed: number;\n readonly failed: number;\n readonly errored: number;\n readonly skipped: number;\n} {\n const counts = { passed: 0, failed: 0, errored: 0, skipped: 0 };\n for (const attempt of attempts) {\n if (attempt.verdict === null)\n continue;\n counts[attempt.verdict] += 1;\n }\n return counts;\n}\nfunction verdictCountsCell(attempts: readonly AttemptListItem[]): Cell {\n return { kind: \"verdict\", counts: tallyVerdicts(attempts) };\n}\nfunction verdictCell(verdict: Verdict | null): Cell {\n if (verdict === null)\n return { kind: \"notApplicable\" };\n return { kind: \"verdict\", verdict };\n}\nfunction locatorCell(attempt: AttemptListItem): Cell {\n return {\n kind: \"locator\",\n locator: attempt.locator,\n ...(attempt.verdict === null ? {} : { verdict: attempt.verdict }),\n };\n}\nfunction textCell(text: string, detail?: string): Cell {\n return detail ? { kind: \"text\", text, detail } : { kind: \"text\", text };\n}\n/** 失败摘要格:closed 摘录缺失时如实显示 \"—\",不发明文案。 */\nfunction resultCell(attempt: AttemptListItem): Cell {\n return attempt.failureSummary === null\n ? { kind: \"text\", text: \"—\" }\n : { kind: \"summary\", text: attempt.failureSummary };\n}\n/**\n * attempt 行的格子原料。层级表取 entity / record / durationMs / costUSD,\n * 平铺表取 entity / verdict / result / durationMs / costUSD;\n * 两张表各自裁自这一份,不各写一份构造。\n */\nfunction attemptCells(attempt: AttemptListItem): CellBag {\n return {\n entity: locatorCell(attempt),\n verdict: verdictCell(attempt.verdict),\n result: resultCell(attempt),\n // 层级表的判定构成列:该次判定,与 verdict 格同值。\n record: verdictCell(attempt.verdict),\n durationMs: measureCell(attempt.durationMs),\n ...(attempt.totalScore === undefined ? {} : { totalScore: { kind: \"score\", earned: attempt.totalScore } as const }),\n ...(attempt.costUSD === undefined ? {} : { costUSD: measureCell(attempt.costUSD) }),\n };\n}\nconst HIERARCHY_COLUMNS_PREFIX: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"model\", header: HEADER.model },\n { key: \"agent\", header: HEADER.agent },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nconst HIERARCHY_COLUMNS_SUFFIX: readonly ColumnSpec[] = [\n { key: \"tokens\", better: \"lower\", header: HEADER.tokens },\n { key: \"record\", header: HEADER.record },\n];\nfunction hierarchyColumns(items: readonly ExperimentListItem[]): readonly ColumnSpec[] {\n const composition = experimentListEvaluationKindComposition(items.map((item) => ({ evaluationKind: item.evaluationKind, attempts: item.evalRows.length })));\n const primary: ColumnSpec[] = [];\n if (composition !== \"points\")\n primary.push({ key: \"passRate\", better: \"higher\", header: HEADER.passRate });\n if (composition !== \"pass\")\n primary.push({ key: \"totalScore\", better: \"higher\", header: HEADER.totalScore });\n return [...HIERARCHY_COLUMNS_PREFIX, ...primary, ...HIERARCHY_COLUMNS_SUFFIX];\n}\nconst COST_COLUMN: ColumnSpec = { key: \"costUSD\", better: \"lower\", header: HEADER.costUSD };\n/** Attempt 平铺表的列集(AttemptList / FailureList 同一份)。 */\nconst FLAT_ENTITY_COLUMNS: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"verdict\", header: HEADER.verdict },\n { key: \"result\", header: HEADER.result },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nfunction columnsWithCost(columns: readonly ColumnSpec[], includeCost: boolean): readonly ColumnSpec[] {\n if (!includeCost)\n return columns;\n const recordIndex = columns.findIndex((column) => column.key === \"record\");\n if (recordIndex < 0)\n return [...columns, COST_COLUMN];\n return [...columns.slice(0, recordIndex), COST_COLUMN, ...columns.slice(recordIndex)];\n}\n/** 层级实体的计数属于身份说明,必须留在同一个首格而不是渲染成续行。 */\nfunction identityCell(name: string, metadata: string): Cell {\n return textCell(`${name} (${metadata})`);\n}\n/** 组内题数与已知题数:\"3/4 evals\" 只在有缺口时出现。 */\nfunction groupEntityDetail(evals: number, knownEvals: number): string {\n return knownEvals > evals ? `${evals}/${knownEvals} evals` : `${evals} evals`;\n}\n/**\n * 组行读数格:直接用 Analysis-owned 组 MetricValue;组前缀聚合缺失时才是\n * missing(本该有却没跑到),不是 \"—\"(对这一行没有意义)。\n */\nfunction groupMetricValue(metrics: ExperimentMetrics | undefined, key: keyof ExperimentMetrics): Cell {\n const metric = metrics?.[key];\n return metric === undefined ? { kind: \"missing\", code: GROUP_NO_SAMPLES } : measureCell(metric);\n}\n/** 覆盖缺口占位行:code 与补跑命令同行——都是「当前配置下没有结果」这一个事实。 */\nfunction placeholderRow(experimentId: string, evalId: string, label: string, columns: readonly ColumnSpec[]): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n record: {\n kind: \"missing\",\n code: NO_CURRENT_RESULT,\n detail: `niceeval exp ${experimentId}`,\n },\n };\n return {\n key: `${experimentId}:${evalId}:missing`,\n variant: \"placeholder\",\n cells: projectCells(bag, columns),\n };\n}\ninterface HierarchyView {\n readonly columns: readonly ColumnSpec[];\n readonly item: ExperimentListItem;\n readonly labelPrefix: string;\n}\nfunction attemptRow(attempt: AttemptListItem, columns: readonly ColumnSpec[]): TableContentRow {\n return {\n key: attempt.locator,\n cells: projectCells(attemptCells(attempt), columns),\n };\n}\nfunction evalRow(row: ExperimentListEvalRow, label: string, view: HierarchyView): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n // 判定构成列:该题 attempts 的计票,与 experiment 行计票同一形态。\n record: verdictCountsCell(row.attempts),\n durationMs: measureCell(row.durationMs),\n ...(row.evaluationKind === \"pass\" ? { passRate: measureCell(row.endToEndPassRate) } : {}),\n ...(row.totalScore === undefined ? {} : { totalScore: { kind: \"score\", earned: row.totalScore } as const }),\n ...(row.costUSD === undefined ? {} : { costUSD: measureCell(row.costUSD) }),\n };\n return {\n key: row.evalId,\n cells: projectCells(bag, view.columns),\n subRows: row.attempts.map((attempt) => attemptRow(attempt, view.columns)),\n };\n}\nfunction leafTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n}>, view: HierarchyView): TableContentRow {\n const label = relativeEvalLabel(node.evalId, view.labelPrefix);\n const row = view.item.evalRows.find((candidate) => candidate.evalId === node.evalId);\n return row === undefined\n ? placeholderRow(view.item.experimentId, node.evalId, label, view.columns)\n : evalRow(row, label, view);\n}\n/** 组行的成员 attempt 列表(用于判定计票)。 */\nfunction attemptsUnder(node: EvalLayoutNode, evalRows: readonly ExperimentListEvalRow[]): readonly AttemptListItem[] {\n const members = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n members.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n return evalRows\n .filter((row) => members.has(row.evalId))\n .flatMap((row) => row.attempts);\n}\nfunction groupTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n}>, item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n evalIds.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n const evalRows = item.evalRows.filter((row) => evalIds.has(row.evalId));\n const knownEvals = evalIds.size;\n const evals = evalRows.length;\n const metrics = item.groupMetrics.get(node.prefix);\n const attempts = attemptsUnder(node, item.evalRows);\n const bag: CellBag = {\n entity: identityCell(node.segment, groupEntityDetail(evals, knownEvals)),\n durationMs: groupMetricValue(metrics, \"durationMs\"),\n ...(evalRows.every((row) => row.evaluationKind === \"pass\")\n ? { passRate: groupMetricValue(metrics, \"passRate\") }\n : {}),\n ...(evalRows.some((row) => row.totalScore !== undefined)\n ? {\n totalScore: {\n kind: \"score\",\n earned: evalRows.reduce((sum, row) => sum + (row.totalScore ?? 0), 0),\n } as const,\n }\n : {}),\n tokens: groupMetricValue(metrics, \"tokens\"),\n ...(metrics?.costUSD === undefined ? {} : { costUSD: measureCell(metrics.costUSD) }),\n record: evals === 0\n ? { kind: \"missing\", code: GROUP_NO_SAMPLES }\n : verdictCountsCell(attempts),\n };\n return {\n key: `group:${node.prefix}`,\n variant: \"group\",\n cells: projectCells(bag, view.columns),\n subRows: groupChildren(node.children, { ...view, labelPrefix: node.prefix }),\n };\n}\n/** 同一层的组行按主读数降序(缺数据沉底,同值按段名收口),叶子恒在组行之后。 */\nfunction groupChildren(nodes: readonly EvalLayoutNode[], view: HierarchyView): TableContentRow[] {\n const groups = nodes\n .filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n }> => node.kind === \"group\")\n .slice()\n .sort((left, right) => {\n const leftPrimary = view.item.groupMetrics.get(left.prefix)?.passRate.value ?? null;\n const rightPrimary = view.item.groupMetrics.get(right.prefix)?.passRate.value ?? null;\n if (leftPrimary === null && rightPrimary === null)\n return left.segment.localeCompare(right.segment);\n if (leftPrimary === null)\n return 1;\n if (rightPrimary === null)\n return -1;\n return rightPrimary - leftPrimary || left.segment.localeCompare(right.segment);\n });\n const leaves = nodes.filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n }> => node.kind === \"leaf\");\n return [\n ...groups.map((node) => groupTableRow(node, view.item, view)),\n ...leaves.map((node) => leafTableRow(node, view)),\n ];\n}\nfunction experimentRow(item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set(item.evalRows.map((row) => row.evalId));\n const members: readonly EvalLayoutNode[] = experimentEvalLayout([...new Set([...evalIds, ...item.missingEvalIds])]);\n const attempts = item.evalRows.flatMap((row) => row.attempts);\n const bag: CellBag = {\n entity: textCell(item.experimentId),\n model: item.model === null ? { kind: \"notApplicable\" } : textCell(item.model),\n agent: item.agent === null ? { kind: \"notApplicable\" } : textCell(item.agent),\n durationMs: measureCell(item.durationMs),\n ...(item.evaluationKind === \"pass\" ? { passRate: measureCell(item.endToEndPassRate) } : {}),\n ...(item.totalScore === undefined ? {} : { totalScore: { kind: \"score\", earned: item.totalScore } as const }),\n tokens: measureCell(item.tokens),\n ...(item.costUSD === undefined ? {} : { costUSD: measureCell(item.costUSD) }),\n record: verdictCountsCell(attempts),\n };\n return {\n key: item.experimentId,\n cells: projectCells(bag, view.columns),\n subRows: members.length > 0 ? groupChildren(members, view) : [],\n };\n}\nexport function experimentListContent(items: readonly ExperimentListItem[]): TableContent {\n const columns = columnsWithCost(hierarchyColumns(items), items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n rows: items.map((item) => experimentRow(item, { columns, item, labelPrefix: \"\" })),\n };\n}\nexport function attemptListContent(items: readonly AttemptListItem[]): TableContent {\n const columns = columnsWithCost(FLAT_ENTITY_COLUMNS, items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n // 与层级表里的 attempt 行同一份格子原料,只是裁到平铺列集。\n rows: items.map((item) => attemptRow(item, columns)),\n };\n}\n"]}
@@ -2,10 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ExperimentTable = exports.AttemptList = exports.FailureList = exports.experimentListContent = exports.attemptListContent = exports.relativeEvalLabel = exports.experimentEvalLayout = exports.experimentListData = exports.attemptListData = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const experiment_groups_ts_1 = require("../../../analysis/experiment-groups.cjs");
5
6
  const tree_ts_1 = require("../../definition/tree.cjs");
6
7
  const primitives_tsx_1 = require("../../definition/primitives.cjs");
7
8
  const compute_ts_1 = require("./compute.cjs");
8
9
  const content_ts_1 = require("./content.cjs");
10
+ const format_ts_1 = require("../../model/format.cjs");
9
11
  var compute_ts_2 = require("./compute.cjs");
10
12
  Object.defineProperty(exports, "attemptListData", { enumerable: true, get: function () { return compute_ts_2.attemptListData; } });
11
13
  Object.defineProperty(exports, "experimentListData", { enumerable: true, get: function () { return compute_ts_2.experimentListData; } });
@@ -38,10 +40,13 @@ exports.AttemptList = (0, tree_ts_1.defineComponent)(async (props, ctx) => {
38
40
  });
39
41
  exports.AttemptList.displayName = "AttemptList";
40
42
  exports.ExperimentTable = (0, tree_ts_1.defineComponent)(async (props, ctx) => {
41
- const sample = props.input ?? ctx.scope;
42
- const rows = props.rows ?? await (0, compute_ts_1.experimentListData)(sample, ctx.report.pricing);
43
- // 当前 facade 只发布通过制读数,默认排序恒为 passRate 降序(数据本身已按此排好)。
44
- const defaultSort = "passRate";
43
+ if (props.comparison.comparison.state === "non-comparable") {
44
+ return (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: props.className, children: props.comparison.comparison.issues.map((issue) => issue.reason).join(", ") });
45
+ }
46
+ const sample = (0, experiment_groups_ts_1.sampleForExperimentComparisonScope)(props.comparison);
47
+ const rows = await (0, compute_ts_1.experimentListData)(sample, ctx.report.pricing);
48
+ const composition = (0, format_ts_1.experimentListEvaluationKindComposition)(rows.map((row) => ({ evaluationKind: row.evaluationKind, attempts: row.evalRows.length })));
49
+ const defaultSort = composition === "pass" ? "passRate" : "totalScore";
45
50
  return (0, jsx_runtime_1.jsx)(primitives_tsx_1.TableContentView, { data: (0, content_ts_1.experimentListContent)(rows), sort: props.sort ?? defaultSort, searchable: props.searchable ?? true, locale: props.locale, className: props.className });
46
51
  });
47
52
  exports.ExperimentTable.displayName = "ExperimentTable";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"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","sourcesContent":["// 实体列表组合件:FailureList / AttemptList / ExperimentTable。\n// 列表本体是中立 Table 原语(TableContentView);语义全部住在 compute.ts 与\n// content.ts 的投影层,docs/feature/reports/library.md。\nimport type { Sample } from \"../../../analysis/index.ts\";\nimport { defineComponent } from \"../../definition/tree.ts\";\nimport { TableContentView } from \"../../definition/primitives.tsx\";\nimport type { ReportLocale } from \"../../model/locale.ts\";\nimport { attemptListData, experimentListData, type AttemptListItem, type ExperimentListItem, } from \"./compute.ts\";\nimport { attemptListContent, experimentListContent } from \"./content.ts\";\nexport { attemptListData, experimentListData, experimentEvalLayout, relativeEvalLabel, } from \"./compute.ts\";\nexport type { AttemptListItem, EvalLayoutNode, EvaluationKindComposition, ExperimentListEvalRow, ExperimentListItem, ExperimentMetrics, } from \"./compute.ts\";\nexport { attemptListContent, experimentListContent } from \"./content.ts\";\nexport interface FailureListProps {\n readonly limit?: number;\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly AttemptListItem[];\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** 失败处理台:只列 failed / errored attempt,按 startedAt 新到旧、locator 升序收口。 */\nexport const FailureList = defineComponent<FailureListProps>(async (props, ctx) => {\n const sample = props.input ?? ctx.scope;\n const all = props.rows ?? await attemptListData(sample, ctx.report.pricing);\n const failures = all\n .filter((item) => item.verdict === \"failed\" || item.verdict === \"errored\")\n .sort((left, right) => {\n const leftStarted = left.startedAt ?? Number.NEGATIVE_INFINITY;\n const rightStarted = right.startedAt ?? Number.NEGATIVE_INFINITY;\n if (leftStarted !== rightStarted)\n return leftStarted > rightStarted ? -1 : 1;\n return left.locator < right.locator ? -1 : left.locator > right.locator ? 1 : 0;\n });\n const limit = props.limit ?? 20;\n return <TableContentView data={attemptListContent(failures.slice(0, limit))} locale={props.locale} className={props.className}/>;\n});\nFailureList.displayName = \"FailureList\";\nexport interface AttemptListProps {\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly AttemptListItem[];\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** 薄组合:attemptListData + Table。顺序保持传入顺序(不重排)。 */\nexport const AttemptList = defineComponent<AttemptListProps>(async (props, ctx) => {\n const rows = props.rows ?? await attemptListData(props.input ?? ctx.scope, ctx.report.pricing);\n return <TableContentView data={attemptListContent(rows)} locale={props.locale} className={props.className}/>;\n});\nAttemptList.displayName = \"AttemptList\";\nexport interface ExperimentTableProps {\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly ExperimentListItem[];\n /** 显示排序列;省略时按列表自身主读数(当前 facade 恒为 passRate)降序。 */\n readonly sort?: string;\n readonly searchable?: boolean;\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\nexport const ExperimentTable = defineComponent<ExperimentTableProps>(async (props, ctx) => {\n const sample = props.input ?? ctx.scope;\n const rows = props.rows ?? await experimentListData(sample, ctx.report.pricing);\n // 当前 facade 只发布通过制读数,默认排序恒为 passRate 降序(数据本身已按此排好)。\n const defaultSort = \"passRate\";\n return <TableContentView data={experimentListContent(rows)} sort={props.sort ?? defaultSort} searchable={props.searchable ?? true} locale={props.locale} className={props.className}/>;\n});\nExperimentTable.displayName = \"ExperimentTable\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"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","sourcesContent":["// 实体列表组合件:FailureList / AttemptList / ExperimentTable。\n// 列表本体是中立 Table 原语(TableContentView);语义全部住在 compute.ts 与\n// content.ts 的投影层,docs/feature/reports/library.md。\nimport type { ExperimentComparisonScope, Sample } from \"../../../analysis/index.ts\";\nimport { sampleForExperimentComparisonScope } from \"../../../analysis/experiment-groups.ts\";\nimport { defineComponent } from \"../../definition/tree.ts\";\nimport { TableContentView, Text } from \"../../definition/primitives.tsx\";\nimport type { ReportLocale } from \"../../model/locale.ts\";\nimport { attemptListData, experimentListData, type AttemptListItem, type ExperimentListItem, } from \"./compute.ts\";\nimport { attemptListContent, experimentListContent } from \"./content.ts\";\nimport { experimentListEvaluationKindComposition } from \"../../model/format.ts\";\nexport { attemptListData, experimentListData, experimentEvalLayout, relativeEvalLabel, } from \"./compute.ts\";\nexport type { AttemptListItem, EvalLayoutNode, EvaluationKindComposition, ExperimentListEvalRow, ExperimentListItem, ExperimentMetrics, } from \"./compute.ts\";\nexport { attemptListContent, experimentListContent } from \"./content.ts\";\nexport interface FailureListProps {\n readonly limit?: number;\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly AttemptListItem[];\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** 失败处理台:只列 failed / errored attempt,按 startedAt 新到旧、locator 升序收口。 */\nexport const FailureList = defineComponent<FailureListProps>(async (props, ctx) => {\n const sample = props.input ?? ctx.scope;\n const all = props.rows ?? await attemptListData(sample, ctx.report.pricing);\n const failures = all\n .filter((item) => item.verdict === \"failed\" || item.verdict === \"errored\")\n .sort((left, right) => {\n const leftStarted = left.startedAt ?? Number.NEGATIVE_INFINITY;\n const rightStarted = right.startedAt ?? Number.NEGATIVE_INFINITY;\n if (leftStarted !== rightStarted)\n return leftStarted > rightStarted ? -1 : 1;\n return left.locator < right.locator ? -1 : left.locator > right.locator ? 1 : 0;\n });\n const limit = props.limit ?? 20;\n return <TableContentView data={attemptListContent(failures.slice(0, limit))} locale={props.locale} className={props.className}/>;\n});\nFailureList.displayName = \"FailureList\";\nexport interface AttemptListProps {\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly AttemptListItem[];\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** 薄组合:attemptListData + Table。顺序保持传入顺序(不重排)。 */\nexport const AttemptList = defineComponent<AttemptListProps>(async (props, ctx) => {\n const rows = props.rows ?? await attemptListData(props.input ?? ctx.scope, ctx.report.pricing);\n return <TableContentView data={attemptListContent(rows)} locale={props.locale} className={props.className}/>;\n});\nAttemptList.displayName = \"AttemptList\";\nexport interface ExperimentTableProps {\n readonly comparison: ExperimentComparisonScope;\n /** 显示排序列;省略时按列表自身题型选择 passRate totalScore。 */\n readonly sort?: string;\n readonly searchable?: boolean;\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\nexport const ExperimentTable = defineComponent<ExperimentTableProps>(async (props, ctx) => {\n if (props.comparison.comparison.state === \"non-comparable\") {\n return <Text className={props.className}>\n {props.comparison.comparison.issues.map((issue) => issue.reason).join(\", \")}\n </Text>;\n }\n const sample = sampleForExperimentComparisonScope(props.comparison);\n const rows = await experimentListData(sample, ctx.report.pricing);\n const composition = experimentListEvaluationKindComposition(rows.map((row) => ({ evaluationKind: row.evaluationKind, attempts: row.evalRows.length })));\n const defaultSort = composition === \"pass\" ? \"passRate\" : \"totalScore\";\n return <TableContentView data={experimentListContent(rows)} sort={props.sort ?? defaultSort} searchable={props.searchable ?? true} locale={props.locale} className={props.className}/>;\n});\nExperimentTable.displayName = \"ExperimentTable\";\n"]}
@@ -1,6 +1,6 @@
1
- import type { Sample } from "../../../analysis/index.cjs";
1
+ import type { ExperimentComparisonScope, Sample } from "../../../analysis/index.cjs";
2
2
  import type { ReportLocale } from "../../model/locale.cjs";
3
- import { type AttemptListItem, type ExperimentListItem } from "./compute.cjs";
3
+ import { type AttemptListItem } from "./compute.cjs";
4
4
  export { attemptListData, experimentListData, experimentEvalLayout, relativeEvalLabel, } from "./compute.cjs";
5
5
  export type { AttemptListItem, EvalLayoutNode, EvaluationKindComposition, ExperimentListEvalRow, ExperimentListItem, ExperimentMetrics, } from "./compute.cjs";
6
6
  export { attemptListContent, experimentListContent } from "./content.cjs";
@@ -26,11 +26,8 @@ export interface AttemptListProps {
26
26
  /** 薄组合:attemptListData + Table。顺序保持传入顺序(不重排)。 */
27
27
  export declare const AttemptList: import("../../definition/tree.cjs").ReportComponent<AttemptListProps>;
28
28
  export interface ExperimentTableProps {
29
- /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */
30
- readonly input?: Sample;
31
- /** 已闭合的行;省略时按 `input` 计算。 */
32
- readonly rows?: readonly ExperimentListItem[];
33
- /** 显示排序列;省略时按列表自身主读数(当前 facade 恒为 passRate)降序。 */
29
+ readonly comparison: ExperimentComparisonScope;
30
+ /** 显示排序列;省略时按列表自身题型选择 passRate 或 totalScore。 */
34
31
  readonly sort?: string;
35
32
  readonly searchable?: boolean;
36
33
  readonly locale?: ReportLocale;
@@ -1,6 +1,6 @@
1
- import type { Sample } from "../../../analysis/index.mjs";
1
+ import type { ExperimentComparisonScope, Sample } from "../../../analysis/index.mjs";
2
2
  import type { ReportLocale } from "../../model/locale.mjs";
3
- import { type AttemptListItem, type ExperimentListItem } from "./compute.mjs";
3
+ import { type AttemptListItem } from "./compute.mjs";
4
4
  export { attemptListData, experimentListData, experimentEvalLayout, relativeEvalLabel, } from "./compute.mjs";
5
5
  export type { AttemptListItem, EvalLayoutNode, EvaluationKindComposition, ExperimentListEvalRow, ExperimentListItem, ExperimentMetrics, } from "./compute.mjs";
6
6
  export { attemptListContent, experimentListContent } from "./content.mjs";
@@ -26,11 +26,8 @@ export interface AttemptListProps {
26
26
  /** 薄组合:attemptListData + Table。顺序保持传入顺序(不重排)。 */
27
27
  export declare const AttemptList: import("../../definition/tree.mjs").ReportComponent<AttemptListProps>;
28
28
  export interface ExperimentTableProps {
29
- /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */
30
- readonly input?: Sample;
31
- /** 已闭合的行;省略时按 `input` 计算。 */
32
- readonly rows?: readonly ExperimentListItem[];
33
- /** 显示排序列;省略时按列表自身主读数(当前 facade 恒为 passRate)降序。 */
29
+ readonly comparison: ExperimentComparisonScope;
30
+ /** 显示排序列;省略时按列表自身题型选择 passRate 或 totalScore。 */
34
31
  readonly sort?: string;
35
32
  readonly searchable?: boolean;
36
33
  readonly locale?: ReportLocale;
@@ -1,6 +1,6 @@
1
- import type { Sample } from "../../../analysis/index.js";
1
+ import type { ExperimentComparisonScope, Sample } from "../../../analysis/index.js";
2
2
  import type { ReportLocale } from "../../model/locale.js";
3
- import { type AttemptListItem, type ExperimentListItem } from "./compute.js";
3
+ import { type AttemptListItem } from "./compute.js";
4
4
  export { attemptListData, experimentListData, experimentEvalLayout, relativeEvalLabel, } from "./compute.js";
5
5
  export type { AttemptListItem, EvalLayoutNode, EvaluationKindComposition, ExperimentListEvalRow, ExperimentListItem, ExperimentMetrics, } from "./compute.js";
6
6
  export { attemptListContent, experimentListContent } from "./content.js";
@@ -26,11 +26,8 @@ export interface AttemptListProps {
26
26
  /** 薄组合:attemptListData + Table。顺序保持传入顺序(不重排)。 */
27
27
  export declare const AttemptList: import("../../definition/tree.js").ReportComponent<AttemptListProps>;
28
28
  export interface ExperimentTableProps {
29
- /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */
30
- readonly input?: Sample;
31
- /** 已闭合的行;省略时按 `input` 计算。 */
32
- readonly rows?: readonly ExperimentListItem[];
33
- /** 显示排序列;省略时按列表自身主读数(当前 facade 恒为 passRate)降序。 */
29
+ readonly comparison: ExperimentComparisonScope;
30
+ /** 显示排序列;省略时按列表自身题型选择 passRate 或 totalScore。 */
34
31
  readonly sort?: string;
35
32
  readonly searchable?: boolean;
36
33
  readonly locale?: ReportLocale;
@@ -53,7 +53,9 @@ async function sampleSummaryData(sample, votes, pricing) {
53
53
  /**
54
54
  * Uses Analysis rows for every plotted value. Only display-safe dimensions
55
55
  * are normalized into strings; MetricValue, issues, and evidence stay intact.
56
- * The x axis always stays cost × passRate; duration never replaces cost.
56
+ * Cost and pass rate remain Analysis MetricValues. Score classification and
57
+ * earned score reuse the closed Experiment list facts used by ExperimentTable,
58
+ * so the chart and table agree on every Experiment's primary reading.
57
59
  */
58
60
  async function experimentScatterData(sample, options, pricing) {
59
61
  const line = (0, aggregate_ts_1.label)("line");
@@ -64,12 +66,17 @@ async function experimentScatterData(sample, options, pricing) {
64
66
  by: { experiment: aggregate_ts_1.experiment, series: group },
65
67
  values: { costUSD: (0, metrics_ts_1.costUSD)(pricing), passRate: metrics_ts_1.passRate },
66
68
  });
69
+ const experimentFacts = new Map((options.experiments ?? []).map((item) => [String(item.experimentId), item]));
67
70
  const points = Object.freeze(rows.map((row) => (0, metrics_ts_1.evidenceRow)({
68
71
  key: row.key,
69
72
  experiment: String(row.experiment),
70
73
  series: dimensionText(row.series),
71
74
  costUSD: row.costUSD,
72
75
  passRate: row.passRate,
76
+ evaluationKind: experimentFacts.get(String(row.experiment))?.evaluationKind ?? "pass",
77
+ ...(experimentFacts.get(String(row.experiment))?.totalScore === undefined
78
+ ? {}
79
+ : { totalScore: experimentFacts.get(String(row.experiment)).totalScore }),
73
80
  })));
74
81
  return Object.freeze({ connect, points });
75
82
  }