niceeval 0.13.2-canary.35 → 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 (485) hide show
  1. package/INDEX.md +24 -2
  2. package/dist/agents/bub-install-spec.cjs +19 -5
  3. package/dist/agents/bub-install-spec.cjs.map +1 -1
  4. package/dist/agents/bub-install-spec.d.cts +9 -2
  5. package/dist/agents/bub-install-spec.d.mts +9 -2
  6. package/dist/agents/bub-install-spec.d.ts +9 -2
  7. package/dist/agents/bub-install-spec.js +14 -12
  8. package/dist/agents/bub.cjs +10 -6
  9. package/dist/agents/bub.cjs.map +1 -1
  10. package/dist/agents/bub.d.cts +2 -2
  11. package/dist/agents/bub.d.mts +2 -2
  12. package/dist/agents/bub.d.ts +2 -2
  13. package/dist/agents/claude-code.cjs.map +1 -1
  14. package/dist/agents/claude-code.d.cts +2 -2
  15. package/dist/agents/claude-code.d.mts +2 -2
  16. package/dist/agents/claude-code.d.ts +2 -2
  17. package/dist/agents/codex.cjs +4 -4
  18. package/dist/agents/codex.cjs.map +1 -1
  19. package/dist/agents/codex.d.cts +3 -3
  20. package/dist/agents/codex.d.mts +3 -3
  21. package/dist/agents/codex.d.ts +3 -3
  22. package/dist/agents/deepseek-harness.cjs +50 -2
  23. package/dist/agents/deepseek-harness.cjs.map +1 -1
  24. package/dist/agents/deepseek-harness.d.cts +2 -0
  25. package/dist/agents/deepseek-harness.d.mts +2 -0
  26. package/dist/agents/deepseek-harness.d.ts +2 -0
  27. package/dist/agents/exact-npm-plugins.cjs +28 -0
  28. package/dist/agents/exact-npm-plugins.cjs.map +1 -0
  29. package/dist/agents/exact-npm-plugins.d.cts +10 -0
  30. package/dist/agents/exact-npm-plugins.d.mts +10 -0
  31. package/dist/agents/exact-npm-plugins.d.ts +10 -0
  32. package/dist/agents/exact-npm-plugins.js +8 -0
  33. package/dist/agents/exact-npm-plugins.js.map +1 -0
  34. package/dist/agents/openclaw.cjs +51 -2
  35. package/dist/agents/openclaw.cjs.map +1 -1
  36. package/dist/agents/openclaw.d.cts +2 -0
  37. package/dist/agents/openclaw.d.mts +2 -0
  38. package/dist/agents/openclaw.d.ts +2 -0
  39. package/dist/agents/types.cjs.map +1 -1
  40. package/dist/agents/types.d.cts +2 -2
  41. package/dist/agents/types.d.mts +2 -2
  42. package/dist/agents/types.d.ts +2 -2
  43. package/dist/agents/ui-message-stream.cjs +24 -7
  44. package/dist/agents/ui-message-stream.cjs.map +1 -1
  45. package/dist/analysis/api.cjs +19 -1
  46. package/dist/analysis/api.cjs.map +1 -1
  47. package/dist/analysis/api.d.cts +2 -2
  48. package/dist/analysis/api.d.mts +2 -2
  49. package/dist/analysis/api.d.ts +2 -2
  50. package/dist/analysis/bindings.cjs +11 -18
  51. package/dist/analysis/bindings.cjs.map +1 -1
  52. package/dist/analysis/bindings.d.cts +177 -49
  53. package/dist/analysis/bindings.d.mts +177 -49
  54. package/dist/analysis/bindings.d.ts +177 -49
  55. package/dist/analysis/contracts.cjs +1 -0
  56. package/dist/analysis/contracts.cjs.map +1 -1
  57. package/dist/analysis/contracts.d.cts +43 -3
  58. package/dist/analysis/contracts.d.mts +43 -3
  59. package/dist/analysis/contracts.d.ts +43 -3
  60. package/dist/analysis/cost-projection.cjs +2 -1
  61. package/dist/analysis/cost-projection.cjs.map +1 -1
  62. package/dist/analysis/cost-projection.d.cts +1 -1
  63. package/dist/analysis/cost-projection.d.mts +1 -1
  64. package/dist/analysis/cost-projection.d.ts +1 -1
  65. package/dist/analysis/cost.cjs +13 -3
  66. package/dist/analysis/cost.cjs.map +1 -1
  67. package/dist/analysis/cost.d.cts +10 -3
  68. package/dist/analysis/cost.d.mts +10 -3
  69. package/dist/analysis/cost.d.ts +10 -3
  70. package/dist/analysis/experiment-groups.cjs +96 -0
  71. package/dist/analysis/experiment-groups.cjs.map +1 -0
  72. package/dist/analysis/experiment-groups.d.cts +9 -0
  73. package/dist/analysis/experiment-groups.d.mts +9 -0
  74. package/dist/analysis/experiment-groups.d.ts +9 -0
  75. package/dist/analysis/experiment-groups.js +10 -0
  76. package/dist/analysis/experiment-groups.js.map +1 -0
  77. package/dist/analysis/index.cjs +4 -1
  78. package/dist/analysis/index.cjs.map +1 -1
  79. package/dist/analysis/index.d.cts +4 -2
  80. package/dist/analysis/index.d.mts +4 -2
  81. package/dist/analysis/index.d.ts +4 -2
  82. package/dist/analysis/index.js +40 -36
  83. package/dist/analysis/index.mjs +40 -36
  84. package/dist/assertions/limits.cjs +4 -0
  85. package/dist/assertions/limits.cjs.map +1 -1
  86. package/dist/assertions/limits.d.cts +4 -0
  87. package/dist/assertions/limits.d.mts +4 -0
  88. package/dist/assertions/limits.d.ts +4 -0
  89. package/dist/assertions/match.cjs +63 -25
  90. package/dist/assertions/match.cjs.map +1 -1
  91. package/dist/assertions/match.d.cts +7 -0
  92. package/dist/assertions/match.d.mts +7 -0
  93. package/dist/assertions/match.d.ts +7 -0
  94. package/dist/assertions/record/attachment.cjs +32 -4
  95. package/dist/assertions/record/attachment.cjs.map +1 -1
  96. package/dist/assertions/record/diff.cjs +10 -4
  97. package/dist/assertions/record/diff.cjs.map +1 -1
  98. package/dist/assertions/record/producer.cjs +101 -4
  99. package/dist/assertions/record/producer.cjs.map +1 -1
  100. package/dist/assertions/record/producer.d.cts +4 -1
  101. package/dist/assertions/record/producer.d.mts +4 -1
  102. package/dist/assertions/record/producer.d.ts +4 -1
  103. package/dist/assertions/runtime.cjs +45 -5
  104. package/dist/assertions/runtime.cjs.map +1 -1
  105. package/dist/cli/record.cjs +113 -8
  106. package/dist/cli/record.cjs.map +1 -1
  107. package/dist/cli/record.d.cts +20 -1
  108. package/dist/cli/record.d.mts +20 -1
  109. package/dist/cli/record.d.ts +20 -1
  110. package/dist/cli/record.js +4 -2
  111. package/dist/cli.cjs +386 -31
  112. package/dist/cli.cjs.map +1 -1
  113. package/dist/cli.d.cts +10 -2
  114. package/dist/cli.d.mts +10 -2
  115. package/dist/cli.d.ts +10 -2
  116. package/dist/context/send-retry.cjs +4 -4
  117. package/dist/context/send-retry.cjs.map +1 -1
  118. package/dist/coordination/host/runtime.cjs +8 -30
  119. package/dist/coordination/host/runtime.cjs.map +1 -1
  120. package/dist/coordination/host/runtime.d.cts +3 -3
  121. package/dist/coordination/host/runtime.d.mts +3 -3
  122. package/dist/coordination/host/runtime.d.ts +3 -3
  123. package/dist/coordination/host/types.cjs.map +1 -1
  124. package/dist/coordination/host/types.d.cts +0 -5
  125. package/dist/coordination/host/types.d.mts +0 -5
  126. package/dist/coordination/host/types.d.ts +0 -5
  127. package/dist/coordination/platform/node.cjs +90 -9
  128. package/dist/coordination/platform/node.cjs.map +1 -1
  129. package/dist/define.cjs +25 -1
  130. package/dist/define.cjs.map +1 -1
  131. package/dist/experiment/host/index.cjs +1 -0
  132. package/dist/experiment/host/index.cjs.map +1 -1
  133. package/dist/i18n/en.cjs +19 -6
  134. package/dist/i18n/en.cjs.map +1 -1
  135. package/dist/i18n/en.d.cts +12 -4
  136. package/dist/i18n/en.d.mts +12 -4
  137. package/dist/i18n/en.d.ts +12 -4
  138. package/dist/index.cjs.map +1 -1
  139. package/dist/index.d.cts +1 -1
  140. package/dist/index.d.mts +1 -1
  141. package/dist/index.d.ts +1 -1
  142. package/dist/o11y/prices.json +1 -1
  143. package/dist/o11y/record/families.cjs +12 -3
  144. package/dist/o11y/record/families.cjs.map +1 -1
  145. package/dist/o11y/record/families.d.cts +8 -8
  146. package/dist/o11y/record/families.d.mts +8 -8
  147. package/dist/o11y/record/families.d.ts +8 -8
  148. package/dist/o11y/record/family-projectors.d.cts +66 -18
  149. package/dist/o11y/record/family-projectors.d.mts +66 -18
  150. package/dist/o11y/record/family-projectors.d.ts +66 -18
  151. package/dist/o11y/record/family-writers.d.cts +11 -3
  152. package/dist/o11y/record/family-writers.d.mts +11 -3
  153. package/dist/o11y/record/family-writers.d.ts +11 -3
  154. package/dist/o11y/record/runner-producer.cjs +14 -4
  155. package/dist/o11y/record/runner-producer.cjs.map +1 -1
  156. package/dist/record/codec/core.d.cts +2 -2
  157. package/dist/record/codec/core.d.mts +2 -2
  158. package/dist/record/codec/core.d.ts +2 -2
  159. package/dist/record/family/catalog.d.cts +44 -12
  160. package/dist/record/family/catalog.d.mts +44 -12
  161. package/dist/record/family/catalog.d.ts +44 -12
  162. package/dist/record/family/index.js +128 -124
  163. package/dist/record/family/observability-v1.cjs +35 -0
  164. package/dist/record/family/observability-v1.cjs.map +1 -0
  165. package/dist/record/family/observability-v1.d.cts +3 -0
  166. package/dist/record/family/observability-v1.d.mts +3 -0
  167. package/dist/record/family/observability-v1.d.ts +3 -0
  168. package/dist/record/family/observability-v1.js +6 -0
  169. package/dist/record/family/observability-v1.js.map +1 -0
  170. package/dist/record/family/observability.cjs +58 -9
  171. package/dist/record/family/observability.cjs.map +1 -1
  172. package/dist/record/family/observability.d.cts +1014 -15
  173. package/dist/record/family/observability.d.mts +1014 -15
  174. package/dist/record/family/observability.d.ts +1014 -15
  175. package/dist/record/family/observability.js +22 -18
  176. package/dist/record/host/runtime.cjs +600 -31
  177. package/dist/record/host/runtime.cjs.map +1 -1
  178. package/dist/record/host/types.cjs.map +1 -1
  179. package/dist/record/host/types.d.cts +33 -9
  180. package/dist/record/host/types.d.mts +33 -9
  181. package/dist/record/host/types.d.ts +33 -9
  182. package/dist/record/maintenance/runtime.cjs +1 -2
  183. package/dist/record/maintenance/runtime.cjs.map +1 -1
  184. package/dist/record/model/core.cjs.map +1 -1
  185. package/dist/record/model/core.d.cts +1 -1
  186. package/dist/record/model/core.d.mts +1 -1
  187. package/dist/record/model/core.d.ts +1 -1
  188. package/dist/record/model/definition.d.cts +6 -6
  189. package/dist/record/model/definition.d.mts +6 -6
  190. package/dist/record/model/definition.d.ts +6 -6
  191. package/dist/record/model/identifiers.cjs +1 -1
  192. package/dist/record/model/identifiers.cjs.map +1 -1
  193. package/dist/record/model/identifiers.d.cts +1 -1
  194. package/dist/record/model/identifiers.d.mts +1 -1
  195. package/dist/record/model/identifiers.d.ts +1 -1
  196. package/dist/record/platform/node.cjs +159 -23
  197. package/dist/record/platform/node.cjs.map +1 -1
  198. package/dist/record/platform/services.cjs.map +1 -1
  199. package/dist/record/platform/services.d.cts +15 -2
  200. package/dist/record/platform/services.d.mts +15 -2
  201. package/dist/record/platform/services.d.ts +15 -2
  202. package/dist/record/reader/errors.cjs +37 -1
  203. package/dist/record/reader/errors.cjs.map +1 -1
  204. package/dist/record/reader/errors.d.cts +49 -1
  205. package/dist/record/reader/errors.d.mts +49 -1
  206. package/dist/record/reader/errors.d.ts +49 -1
  207. package/dist/record/reader/errors.js +22 -12
  208. package/dist/record/reader/format.cjs +76 -17
  209. package/dist/record/reader/format.cjs.map +1 -1
  210. package/dist/record/reader/format.d.cts +11 -4
  211. package/dist/record/reader/format.d.mts +11 -4
  212. package/dist/record/reader/format.d.ts +11 -4
  213. package/dist/record/reader/format.js +2 -0
  214. package/dist/record/reader/index.js +32 -18
  215. package/dist/record/reader/runtime.cjs +64 -0
  216. package/dist/record/reader/runtime.cjs.map +1 -1
  217. package/dist/record/reader/runtime.d.cts +15 -0
  218. package/dist/record/reader/runtime.d.mts +15 -0
  219. package/dist/record/reader/runtime.d.ts +15 -0
  220. package/dist/record/reader/runtime.js +2 -0
  221. package/dist/report/assets/styles.css +53 -29
  222. package/dist/report/built-in/analysis-values.cjs +0 -8
  223. package/dist/report/built-in/analysis-values.cjs.map +1 -1
  224. package/dist/report/built-in/analysis-values.d.cts +0 -13
  225. package/dist/report/built-in/analysis-values.d.mts +0 -13
  226. package/dist/report/built-in/analysis-values.d.ts +0 -13
  227. package/dist/report/built-in/analysis-values.js +4 -6
  228. package/dist/report/built-in/index.cjs +1 -3
  229. package/dist/report/built-in/index.cjs.map +1 -1
  230. package/dist/report/built-in/index.d.cts +1 -1
  231. package/dist/report/built-in/index.d.mts +1 -1
  232. package/dist/report/built-in/index.d.ts +1 -1
  233. package/dist/report/built-in/index.js +4 -8
  234. package/dist/report/built-in/index.mjs +4 -8
  235. package/dist/report/built-in/machine.cjs +0 -2
  236. package/dist/report/built-in/machine.cjs.map +1 -1
  237. package/dist/report/built-in/machine.d.cts +0 -2
  238. package/dist/report/built-in/machine.d.mts +0 -2
  239. package/dist/report/built-in/machine.d.ts +0 -2
  240. package/dist/report/built-in/result-components.cjs +25 -73
  241. package/dist/report/built-in/result-components.cjs.map +1 -1
  242. package/dist/report/built-in/result-components.d.cts +3 -19
  243. package/dist/report/built-in/result-components.d.mts +3 -19
  244. package/dist/report/built-in/result-components.d.ts +3 -19
  245. package/dist/report/built-in/result-components.js +0 -4
  246. package/dist/report/built-in/run-membership-overview.cjs +30 -17
  247. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  248. package/dist/report/built-in/run-membership-overview.d.cts +14 -0
  249. package/dist/report/built-in/run-membership-overview.d.mts +14 -0
  250. package/dist/report/built-in/run-membership-overview.d.ts +14 -0
  251. package/dist/report/built-in/run-membership-overview.js +4 -2
  252. package/dist/report/built-in/standard.cjs +80 -46
  253. package/dist/report/built-in/standard.cjs.map +1 -1
  254. package/dist/report/built-in/standard.d.cts +19 -42
  255. package/dist/report/built-in/standard.d.mts +19 -42
  256. package/dist/report/built-in/standard.d.ts +19 -42
  257. package/dist/report/built-in/standard.js +6 -6
  258. package/dist/report/components/attempt-detail/compute.cjs +78 -2
  259. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  260. package/dist/report/components/attempt-detail/compute.d.cts +1 -1
  261. package/dist/report/components/attempt-detail/compute.d.mts +1 -1
  262. package/dist/report/components/attempt-detail/compute.d.ts +1 -1
  263. package/dist/report/components/attempt-detail/content.cjs +1 -1
  264. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  265. package/dist/report/components/entity-lists/compute.cjs +2 -2
  266. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  267. package/dist/report/components/entity-lists/compute.d.cts +2 -2
  268. package/dist/report/components/entity-lists/compute.d.mts +2 -2
  269. package/dist/report/components/entity-lists/compute.d.ts +2 -2
  270. package/dist/report/components/entity-lists/index.cjs +6 -2
  271. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  272. package/dist/report/components/entity-lists/index.d.cts +3 -6
  273. package/dist/report/components/entity-lists/index.d.mts +3 -6
  274. package/dist/report/components/entity-lists/index.d.ts +3 -6
  275. package/dist/report/components/summaries/compute.cjs +8 -1
  276. package/dist/report/components/summaries/compute.cjs.map +1 -1
  277. package/dist/report/components/summaries/compute.d.cts +9 -1
  278. package/dist/report/components/summaries/compute.d.mts +9 -1
  279. package/dist/report/components/summaries/compute.d.ts +9 -1
  280. package/dist/report/components/summaries/index.cjs +48 -4
  281. package/dist/report/components/summaries/index.cjs.map +1 -1
  282. package/dist/report/components/summaries/index.d.cts +7 -4
  283. package/dist/report/components/summaries/index.d.mts +7 -4
  284. package/dist/report/components/summaries/index.d.ts +7 -4
  285. package/dist/report/definition/primitives/chart.cjs +8 -5
  286. package/dist/report/definition/primitives/chart.cjs.map +1 -1
  287. package/dist/report/definition/primitives/points-dataset.cjs +1 -0
  288. package/dist/report/definition/primitives/points-dataset.cjs.map +1 -1
  289. package/dist/report/definition/primitives.cjs +6 -0
  290. package/dist/report/definition/primitives.cjs.map +1 -1
  291. package/dist/report/definition/report.cjs +27 -3
  292. package/dist/report/definition/report.cjs.map +1 -1
  293. package/dist/report/definition/report.d.cts +8 -0
  294. package/dist/report/definition/report.d.mts +8 -0
  295. package/dist/report/definition/report.d.ts +8 -0
  296. package/dist/report/execution/machine.cjs +30 -14
  297. package/dist/report/execution/machine.cjs.map +1 -1
  298. package/dist/report/execution/machine.d.cts +20 -10
  299. package/dist/report/execution/machine.d.mts +20 -10
  300. package/dist/report/execution/machine.d.ts +20 -10
  301. package/dist/report/execution/machine.js +6 -6
  302. package/dist/report/host/execute.cjs +25 -16
  303. package/dist/report/host/execute.cjs.map +1 -1
  304. package/dist/report/host/execute.d.cts +4 -0
  305. package/dist/report/host/execute.d.mts +4 -0
  306. package/dist/report/host/execute.d.ts +4 -0
  307. package/dist/report/host/from-record.cjs +22 -5
  308. package/dist/report/host/from-record.cjs.map +1 -1
  309. package/dist/report/host/machine.cjs +53 -11
  310. package/dist/report/host/machine.cjs.map +1 -1
  311. package/dist/report/host/site-runtime.cjs +9 -8
  312. package/dist/report/host/site-runtime.cjs.map +1 -1
  313. package/dist/report/host/site-runtime.d.cts +1 -1
  314. package/dist/report/host/site-runtime.d.mts +1 -1
  315. package/dist/report/host/site-runtime.d.ts +1 -1
  316. package/dist/report/host/static.cjs +56 -9
  317. package/dist/report/host/static.cjs.map +1 -1
  318. package/dist/report/index.cjs.map +1 -1
  319. package/dist/report/index.d.cts +1 -1
  320. package/dist/report/index.d.mts +1 -1
  321. package/dist/report/index.d.ts +1 -1
  322. package/dist/report/model/dataset.cjs +7 -2
  323. package/dist/report/model/dataset.cjs.map +1 -1
  324. package/dist/report/model/locale.cjs +2 -0
  325. package/dist/report/model/locale.cjs.map +1 -1
  326. package/dist/report/model/locale.d.cts +1 -0
  327. package/dist/report/model/locale.d.mts +1 -0
  328. package/dist/report/model/locale.d.ts +1 -0
  329. package/dist/report/model/metrics.cjs +3 -1
  330. package/dist/report/model/metrics.cjs.map +1 -1
  331. package/dist/report/model/pricing.cjs +16 -11
  332. package/dist/report/model/pricing.cjs.map +1 -1
  333. package/dist/report/react/styles.css +53 -29
  334. package/dist/runner/adoption.cjs +1 -0
  335. package/dist/runner/adoption.cjs.map +1 -1
  336. package/dist/runner/attempt.cjs +44 -5
  337. package/dist/runner/attempt.cjs.map +1 -1
  338. package/dist/runner/attempt.d.cts +13 -1
  339. package/dist/runner/attempt.d.mts +13 -1
  340. package/dist/runner/attempt.d.ts +13 -1
  341. package/dist/runner/config-identity.cjs +10 -2
  342. package/dist/runner/config-identity.cjs.map +1 -1
  343. package/dist/runner/config-identity.d.cts +4 -2
  344. package/dist/runner/config-identity.d.mts +4 -2
  345. package/dist/runner/config-identity.d.ts +4 -2
  346. package/dist/runner/feedback/human.cjs +139 -64
  347. package/dist/runner/feedback/human.cjs.map +1 -1
  348. package/dist/runner/feedback/json.cjs +14 -6
  349. package/dist/runner/feedback/json.cjs.map +1 -1
  350. package/dist/runner/feedback/json.d.cts +3 -2
  351. package/dist/runner/feedback/json.d.mts +3 -2
  352. package/dist/runner/feedback/json.d.ts +3 -2
  353. package/dist/runner/feedback/reducer.cjs +2 -0
  354. package/dist/runner/feedback/reducer.cjs.map +1 -1
  355. package/dist/runner/judge-config.cjs +1 -1
  356. package/dist/runner/judge-config.cjs.map +1 -1
  357. package/dist/runner/ledger.cjs +124 -12
  358. package/dist/runner/ledger.cjs.map +1 -1
  359. package/dist/runner/project-current.cjs +13 -5
  360. package/dist/runner/project-current.cjs.map +1 -1
  361. package/dist/runner/run.cjs +521 -256
  362. package/dist/runner/run.cjs.map +1 -1
  363. package/dist/runner/sandbox-pool.cjs +161 -30
  364. package/dist/runner/sandbox-pool.cjs.map +1 -1
  365. package/dist/runner/sandbox-pool.d.cts +34 -2
  366. package/dist/runner/sandbox-pool.d.mts +34 -2
  367. package/dist/runner/sandbox-pool.d.ts +34 -2
  368. package/dist/runner/shared-state-lease.cjs +803 -0
  369. package/dist/runner/shared-state-lease.cjs.map +1 -0
  370. package/dist/runner/shared-state-lease.d.cts +121 -0
  371. package/dist/runner/shared-state-lease.d.mts +121 -0
  372. package/dist/runner/shared-state-lease.d.ts +121 -0
  373. package/dist/runner/shared-state-lease.js +24 -0
  374. package/dist/runner/shared-state-lease.js.map +1 -0
  375. package/dist/runner/teardown-registry.cjs +97 -34
  376. package/dist/runner/teardown-registry.cjs.map +1 -1
  377. package/dist/runner/teardown-registry.d.cts +27 -1
  378. package/dist/runner/teardown-registry.d.mts +27 -1
  379. package/dist/runner/teardown-registry.d.ts +27 -1
  380. package/dist/runner/teardown-registry.js +20 -16
  381. package/dist/runner/types.cjs.map +1 -1
  382. package/dist/runner/types.d.cts +31 -5
  383. package/dist/runner/types.d.mts +31 -5
  384. package/dist/runner/types.d.ts +31 -5
  385. package/dist/sample/analysis.cjs +249 -459
  386. package/dist/sample/analysis.cjs.map +1 -1
  387. package/dist/sample/capability.cjs +46 -8
  388. package/dist/sample/capability.cjs.map +1 -1
  389. package/dist/sandbox/docker-profile/schema.cjs +283 -534
  390. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  391. package/dist/sandbox/docker-profile/schema.d.cts +10 -27
  392. package/dist/sandbox/docker-profile/schema.d.mts +10 -27
  393. package/dist/sandbox/docker-profile/schema.d.ts +10 -27
  394. package/dist/sandbox/e2b-agent-template.cjs +5 -2
  395. package/dist/sandbox/e2b-agent-template.cjs.map +1 -1
  396. package/dist/sandbox/keep-registry.cjs +28 -66
  397. package/dist/sandbox/keep-registry.cjs.map +1 -1
  398. package/dist/sandbox/types.cjs.map +1 -1
  399. package/dist/sandbox/types.d.cts +1 -1
  400. package/dist/sandbox/types.d.mts +1 -1
  401. package/dist/sandbox/types.d.ts +1 -1
  402. package/dist/shared/aggregate.cjs +16 -6
  403. package/dist/shared/aggregate.cjs.map +1 -1
  404. package/dist/shared/aggregate.d.cts +12 -4
  405. package/dist/shared/aggregate.d.mts +12 -4
  406. package/dist/shared/aggregate.d.ts +12 -4
  407. package/dist/shared/turn-label.cjs +20 -2
  408. package/dist/shared/turn-label.cjs.map +1 -1
  409. package/dist/shared/turn-label.d.cts +2 -0
  410. package/dist/shared/turn-label.d.mts +2 -0
  411. package/dist/shared/turn-label.d.ts +2 -0
  412. package/dist/shared/turn-label.js +4 -2
  413. package/dist/vendor/remark/remark-gfm.cjs +7 -7
  414. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  415. package/dist/vendor/remark/remark-parse.cjs +12 -12
  416. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  417. package/dist/vendor/remark/remark.cjs +13 -13
  418. package/dist/vendor/remark/remark.cjs.map +1 -1
  419. package/dist/view/server.cjs +6 -0
  420. package/dist/view/server.cjs.map +1 -1
  421. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  422. package/docs-site/zh/examples/coding-agent-extensions.mdx +1 -1
  423. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +1 -0
  424. package/docs-site/zh/examples/integrations/langgraph.mdx +1 -1
  425. package/docs-site/zh/explanation/assert.mdx +6 -6
  426. package/docs-site/zh/explanation/drive.mdx +1 -1
  427. package/docs-site/zh/explanation/evals.mdx +9 -9
  428. package/docs-site/zh/explanation/experiment.mdx +2 -2
  429. package/docs-site/zh/explanation/hitl.mdx +3 -3
  430. package/docs-site/zh/explanation/judge.mdx +5 -5
  431. package/docs-site/zh/explanation/overview.mdx +3 -3
  432. package/docs-site/zh/explanation/runner.mdx +1 -1
  433. package/docs-site/zh/index.mdx +3 -3
  434. package/docs-site/zh/reference/builtin-agents.mdx +9 -9
  435. package/docs-site/zh/reference/cli.mdx +18 -12
  436. package/docs-site/zh/reference/define-agent.mdx +130 -5
  437. package/docs-site/zh/reference/define-config.mdx +2 -2
  438. package/docs-site/zh/reference/define-eval.mdx +4 -4
  439. package/docs-site/zh/reference/events.mdx +1 -1
  440. package/docs-site/zh/reference/official-adapters.mdx +5 -5
  441. package/docs-site/zh/troubleshooting/debugging.mdx +1 -1
  442. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +37 -5
  443. package/docs-site/zh/tutorials/accept-results.mdx +72 -0
  444. package/docs-site/zh/tutorials/agent-onboarding.mdx +6 -6
  445. package/docs-site/zh/tutorials/authoring.mdx +9 -13
  446. package/docs-site/zh/tutorials/ci-integration.mdx +6 -6
  447. package/docs-site/zh/tutorials/compare-runs.mdx +61 -0
  448. package/docs-site/zh/tutorials/concurrency.mdx +13 -12
  449. package/docs-site/zh/tutorials/configuration.mdx +4 -6
  450. package/docs-site/zh/tutorials/connect-your-agent.mdx +1 -1
  451. package/docs-site/zh/tutorials/control-run-cost.mdx +58 -0
  452. package/docs-site/zh/tutorials/criteria-files.mdx +2 -2
  453. package/docs-site/zh/tutorials/custom-reports.mdx +2 -2
  454. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +46 -0
  455. package/docs-site/zh/tutorials/docker-in-docker.mdx +50 -44
  456. package/docs-site/zh/tutorials/eval-groups.mdx +6 -6
  457. package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
  458. package/docs-site/zh/tutorials/experiments.mdx +2 -3
  459. package/docs-site/zh/tutorials/handle-execution-failures.mdx +18 -10
  460. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +16 -8
  461. package/docs-site/zh/tutorials/plugins.mdx +14 -0
  462. package/docs-site/zh/tutorials/rerun-and-cache.mdx +3 -17
  463. package/docs-site/zh/tutorials/sandbox-agent.mdx +17 -11
  464. package/docs-site/zh/tutorials/sandbox-providers.mdx +17 -13
  465. package/docs-site/zh/tutorials/sandbox-reuse.mdx +12 -19
  466. package/docs-site/zh/tutorials/select-and-preview.mdx +65 -0
  467. package/docs-site/zh/tutorials/verify-judge.mdx +78 -0
  468. package/docs-site/zh/tutorials/viewing-results.mdx +27 -8
  469. package/docs-site/zh/tutorials/write-experiment.mdx +7 -5
  470. package/docs-site/zh/tutorials/write-send.mdx +2 -2
  471. package/package.json +9 -5
  472. package/dist/report/built-in/overview.cjs +0 -45
  473. package/dist/report/built-in/overview.cjs.map +0 -1
  474. package/dist/report/built-in/overview.d.cts +0 -6
  475. package/dist/report/built-in/overview.d.mts +0 -6
  476. package/dist/report/built-in/overview.d.ts +0 -6
  477. package/dist/report/built-in/overview.js +0 -9
  478. package/dist/report/built-in/overview.js.map +0 -1
  479. package/dist/runner/gate-lease.cjs +0 -283
  480. package/dist/runner/gate-lease.cjs.map +0 -1
  481. package/dist/runner/gate-lease.d.cts +0 -62
  482. package/dist/runner/gate-lease.d.mts +0 -62
  483. package/dist/runner/gate-lease.d.ts +0 -62
  484. package/dist/runner/gate-lease.js +0 -22
  485. package/dist/runner/gate-lease.js.map +0 -1
@@ -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,10 +26,7 @@ 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[];
29
+ readonly comparison: ExperimentComparisonScope;
33
30
  /** 显示排序列;省略时按列表自身题型选择 passRate 或 totalScore。 */
34
31
  readonly sort?: string;
35
32
  readonly searchable?: boolean;
@@ -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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compute.js","sourceRoot":"","sources":["compute.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Closed-data assembly for the report summary components.\n *\n * These helpers deliberately keep all statistical meaning in the published\n * Analysis facade. They may inspect the fixed Sample snapshot for identity\n * and coverage facts, but never open a Record, construct a MetricValue, or\n * implement a second reducer.\n */\nimport { narrowSample, type CostMetricValue, type MetricValue, type PricingProfile, type Sample, } from \"../../../analysis/index.ts\";\nimport type { Verdict } from \"../../../shared/types.ts\";\nimport { aggregate, agent, evalId, experiment, label, model, type ReportGroup, } from \"../../model/aggregate.ts\";\nimport { toAttemptEvidence } from \"../../model/conversions.ts\";\nimport { costUSD, evidenceRow, hasMetricValue, passRate, totalCostUSD, type EvidenceRow, } from \"../../model/metrics.ts\";\nimport { dimensionField, metricField, } from \"../../model/dataset.ts\";\nimport type { VerdictCounts } from \"../../definition/cell.tsx\";\nimport type { Dataset } from \"../../model/types.ts\";\nexport interface SampleSummaryData {\n readonly earliestStartedAt: string | null;\n readonly latestStartedAt: string | null;\n readonly experiments: number;\n readonly evals: number;\n readonly attempts: number;\n readonly verdicts: VerdictCounts;\n readonly passRate: MetricValue<number> | null;\n /** 成本投影读数;Report 未声明 PricingProfile 时为 null(不请求 measure)。 */\n readonly totalCostUSD: CostMetricValue | null;\n}\nexport type SummarySeries = \"agent\" | \"model\" | \"experiment\" | ReportGroup;\nexport interface ExperimentScatterData {\n readonly connect: boolean;\n readonly points: readonly ExperimentScatterPoint[];\n}\nexport interface ExperimentScatterPoint extends EvidenceRow {\n readonly key: string;\n readonly experiment: string;\n readonly series: string;\n /** 成本投影读数;调用方已确认 Report 声明了 PricingProfile。 */\n readonly costUSD: CostMetricValue;\n readonly passRate: MetricValue<number>;\n}\nexport interface StabilityPoint extends EvidenceRow {\n readonly key: string;\n readonly evalId: string;\n readonly condition: string;\n /** Analysis-owned denominator for this exact condition × eval metric. */\n readonly executions: number;\n readonly passRate: MetricValue<number>;\n}\nexport interface StabilityOverviewData {\n readonly executions: number;\n readonly neverPassed: number;\n readonly flaky: number;\n readonly points: readonly StabilityPoint[];\n readonly dataset: Dataset;\n}\n/**\n * Produces the familiar range/KPI summary from one fixed Sample. The counts\n * are closed Sample identity facts; the numeric readings are emitted by\n * Analysis unchanged. The cost projection is requested only when the Report\n * declares a PricingProfile; without one nothing is measured or captured.\n */\nexport async function sampleSummaryData(sample: Sample, votes: \"eval\" | \"attempt\", pricing: PricingProfile | null): Promise<SampleSummaryData> {\n const [summary, evidence] = pricing === null\n ? await Promise.all([\n aggregate(sample, { by: {}, values: { passRate } }),\n toAttemptEvidence(sample),\n ])\n : await Promise.all([\n aggregate(sample, {\n by: {},\n values: { passRate, totalCostUSD: totalCostUSD(pricing) },\n }),\n toAttemptEvidence(sample),\n ]);\n const currentSlots = sample.snapshot.slots.filter((slot) => slot.state !== \"excluded\");\n const first = summary[0];\n const range = runRange(sample);\n return Object.freeze({\n ...range,\n experiments: new Set(currentSlots.map((slot) => String(slot.experimentId))).size,\n evals: new Set(currentSlots.map((slot) => String(slot.evalId))).size,\n attempts: currentSlots.filter((slot) => slot.state === \"included\").length,\n verdicts: tallyVerdicts(sample, evidence.entries, votes),\n passRate: first?.passRate ?? null,\n totalCostUSD: first === undefined || pricing === null\n ? null\n : (first as unknown as {\n readonly totalCostUSD: CostMetricValue;\n }).totalCostUSD,\n });\n}\n/**\n * Uses Analysis rows for every plotted value. Only display-safe dimensions\n * are normalized into strings; MetricValue, issues, and evidence stay intact.\n * The x axis always stays cost × passRate; duration never replaces cost.\n */\nexport async function experimentScatterData(sample: Sample, options: {\n readonly series?: SummarySeries;\n readonly connect?: boolean;\n}, pricing: PricingProfile): Promise<ExperimentScatterData> {\n const line = label(\"line\");\n const hasLine = sample.snapshot.runs.some((run) => run.context?.labels.line !== undefined);\n const group = groupFor(options.series, hasLine ? line : agent);\n const connect = options.connect ?? (group === line);\n const rows = await aggregate(sample, {\n by: { experiment, series: group },\n values: { costUSD: costUSD(pricing), passRate },\n });\n const points = Object.freeze(rows.map((row): ExperimentScatterPoint => evidenceRow({\n key: row.key,\n experiment: String(row.experiment),\n series: dimensionText(row.series),\n costUSD: (row as unknown as {\n readonly costUSD: CostMetricValue;\n }).costUSD,\n passRate: row.passRate,\n })));\n return Object.freeze({ connect, points });\n}\n/**\n * Builds stability display data from per-eval Analysis pass-rate rows. The\n * `executions` coordinate is the existing metric denominator, not a Report\n * metric. This retains partial/missing states instead of manufacturing zero\n * values or a second verdict reducer.\n */\nexport async function stabilityOverviewData(sample: Sample, options: {\n readonly columns?: SummarySeries;\n readonly evals?: string | readonly string[];\n}): Promise<StabilityOverviewData> {\n const scoped = sampleForEvals(sample, options.evals);\n const group = groupFor(options.columns, experiment);\n const rows = await aggregate(scoped, {\n by: { evalId, condition: group },\n values: { passRate },\n });\n const points = Object.freeze(rows.map((row): StabilityPoint => evidenceRow({\n key: row.key,\n evalId: String(row.evalId),\n condition: dimensionText(row.condition),\n executions: row.passRate.total,\n passRate: row.passRate,\n })));\n const stability = stabilityCounts(points);\n return Object.freeze({\n ...stability,\n points,\n dataset: Object.freeze({\n fields: Object.freeze([\n dimensionField(\"evalId\", \"string\"),\n dimensionField(\"condition\", \"string\"),\n dimensionField(\"executions\", \"number\"),\n metricField(\"passRate\", passRate),\n ]),\n rows: Object.freeze(points.map((point) => Object.freeze({\n key: point.key,\n values: Object.freeze({\n evalId: point.evalId,\n condition: point.condition,\n executions: point.executions,\n passRate: point.passRate,\n }),\n }))),\n }),\n });\n}\nfunction groupFor(value: SummarySeries | undefined, fallback: ReportGroup): ReportGroup {\n if (value === undefined)\n return fallback;\n if (typeof value !== \"string\")\n return value;\n switch (value) {\n case \"agent\":\n return agent;\n case \"model\":\n return model;\n case \"experiment\":\n return experiment;\n default:\n throw new TypeError(`Summary series ${JSON.stringify(value)} must be \"agent\", \"model\", \"experiment\", or an Analysis Dimension / GroupFunction.`);\n }\n}\nfunction dimensionText(value: string | number | boolean | null): string {\n return value === null ? \"(missing)\" : String(value);\n}\nfunction runRange(sample: Sample): {\n readonly earliestStartedAt: string | null;\n readonly latestStartedAt: string | null;\n} {\n let earliest: number | null = null;\n let latest: number | null = null;\n for (const run of sample.snapshot.runs) {\n const startedAt = Number(run.startedAt);\n if (!Number.isFinite(startedAt))\n continue;\n earliest = earliest === null || startedAt < earliest ? startedAt : earliest;\n latest = latest === null || startedAt > latest ? startedAt : latest;\n }\n return Object.freeze({\n earliestStartedAt: earliest === null ? null : new Date(earliest).toISOString(),\n latestStartedAt: latest === null ? null : new Date(latest).toISOString(),\n });\n}\nfunction tallyVerdicts(sample: Sample, entries: Awaited<ReturnType<typeof toAttemptEvidence>>[\"entries\"], votes: \"eval\" | \"attempt\"): VerdictCounts {\n const byLocator = new Map(sample.snapshot.slots\n .filter((slot): slot is Extract<typeof slot, {\n readonly state: \"included\";\n }> => slot.state === \"included\")\n .map((slot) => [slot.attempt.locator, slot] as const));\n const choices = new Map<string, {\n readonly ordinal: number;\n readonly locator: string;\n readonly verdict: Verdict;\n }>();\n for (const entry of entries) {\n if (entry.state !== \"available\")\n continue;\n const slot = byLocator.get(entry.attempt.locator);\n if (slot === undefined)\n continue;\n const key = votes === \"attempt\"\n ? entry.attempt.locator\n : `${slot.experimentId}\\u0000${slot.evalId}`;\n const existing = choices.get(key);\n if (existing === undefined ||\n slot.attemptOrdinal > existing.ordinal ||\n (slot.attemptOrdinal === existing.ordinal && entry.attempt.locator > existing.locator)) {\n choices.set(key, {\n ordinal: slot.attemptOrdinal,\n locator: entry.attempt.locator,\n verdict: entry.detail.verdict,\n });\n }\n }\n const counts: {\n passed: number;\n failed: number;\n errored: number;\n skipped: number;\n } = {\n passed: 0,\n failed: 0,\n errored: 0,\n skipped: 0,\n };\n for (const choice of choices.values())\n counts[choice.verdict] += 1;\n return Object.freeze(counts);\n}\nfunction sampleForEvals(sample: Sample, evals: string | readonly string[] | undefined): Sample {\n if (evals === undefined)\n return sample;\n const selected = typeof evals === \"string\" ? [evals] : evals;\n if (!selected.every((value) => typeof value === \"string\")) {\n throw new TypeError(\"StabilityOverview.evals must be a string or an array of strings\");\n }\n const wanted = new Set(selected);\n return narrowSample(sample, {\n slotIds: sample.snapshot.slots\n .filter((slot) => slot.state !== \"excluded\" && wanted.has(String(slot.evalId)))\n .map((slot) => slot.slotId),\n });\n}\nfunction stabilityCounts(points: readonly StabilityPoint[]): {\n readonly executions: number;\n readonly neverPassed: number;\n readonly flaky: number;\n} {\n const byEval = new Map<string, {\n measured: boolean;\n passed: boolean;\n flaky: boolean;\n }>();\n let executions = 0;\n for (const point of points) {\n executions += point.executions;\n let facts = byEval.get(point.evalId);\n if (facts === undefined) {\n facts = { measured: false, passed: false, flaky: false };\n byEval.set(point.evalId, facts);\n }\n if (!hasMetricValue(point.passRate))\n continue;\n facts.measured = true;\n facts.passed ||= point.passRate.value > 0;\n facts.flaky ||= point.passRate.value > 0 && point.passRate.value < 1;\n }\n return Object.freeze({\n executions,\n neverPassed: [...byEval.values()].filter((facts) => facts.measured && !facts.passed).length,\n flaky: [...byEval.values()].filter((facts) => facts.flaky).length,\n });\n}\n"]}
1
+ {"version":3,"file":"compute.js","sourceRoot":"","sources":["compute.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Closed-data assembly for the report summary components.\n *\n * These helpers deliberately keep all statistical meaning in the published\n * Analysis facade. They may inspect the fixed Sample snapshot for identity\n * and coverage facts, but never open a Record, construct a MetricValue, or\n * implement a second reducer.\n */\nimport { narrowSample, type CostMetricValue, type MetricValue, type PricingProfile, type Sample, } from \"../../../analysis/index.ts\";\nimport type { Verdict } from \"../../../shared/types.ts\";\nimport { aggregate, agent, evalId, experiment, label, model, type ReportGroup, } from \"../../model/aggregate.ts\";\nimport { toAttemptEvidence } from \"../../model/conversions.ts\";\nimport { costUSD, evidenceRow, hasMetricValue, passRate, totalCostUSD, type EvidenceRow, } from \"../../model/metrics.ts\";\nimport { dimensionField, metricField, } from \"../../model/dataset.ts\";\nimport type { VerdictCounts } from \"../../definition/cell.tsx\";\nimport type { Dataset } from \"../../model/types.ts\";\nimport type { ExperimentListItem } from \"../entity-lists/compute.ts\";\nexport interface SampleSummaryData {\n readonly earliestStartedAt: string | null;\n readonly latestStartedAt: string | null;\n readonly experiments: number;\n readonly evals: number;\n readonly attempts: number;\n readonly verdicts: VerdictCounts;\n readonly passRate: MetricValue<number> | null;\n /** 成本投影读数;Report 未声明 PricingProfile 时为 null(不请求 measure)。 */\n readonly totalCostUSD: CostMetricValue | null;\n}\nexport type SummarySeries = \"agent\" | \"model\" | \"experiment\" | ReportGroup;\nexport interface ExperimentScatterData {\n readonly connect: boolean;\n readonly points: readonly ExperimentScatterPoint[];\n}\nexport interface ExperimentScatterPoint extends EvidenceRow {\n readonly key: string;\n readonly experiment: string;\n readonly series: string;\n /** 成本投影读数;调用方已确认 Report 声明了 PricingProfile。 */\n readonly costUSD: CostMetricValue;\n readonly passRate: MetricValue<number>;\n /** The Experiment's primary reading kind, shared with ExperimentTable. */\n readonly evaluationKind: \"pass\" | \"points\" | \"mixed\";\n /** Closed earned score; absent when score evidence is incomplete or not applicable. */\n readonly totalScore?: number;\n}\nexport interface StabilityPoint extends EvidenceRow {\n readonly key: string;\n readonly evalId: string;\n readonly condition: string;\n /** Analysis-owned denominator for this exact condition × eval metric. */\n readonly executions: number;\n readonly passRate: MetricValue<number>;\n}\nexport interface StabilityOverviewData {\n readonly executions: number;\n readonly neverPassed: number;\n readonly flaky: number;\n readonly points: readonly StabilityPoint[];\n readonly dataset: Dataset;\n}\n/**\n * Produces the familiar range/KPI summary from one fixed Sample. The counts\n * are closed Sample identity facts; the numeric readings are emitted by\n * Analysis unchanged. The cost projection is requested only when the Report\n * declares a PricingProfile; without one nothing is measured or captured.\n */\nexport async function sampleSummaryData(sample: Sample, votes: \"eval\" | \"attempt\", pricing: PricingProfile | null): Promise<SampleSummaryData> {\n const [summary, evidence] = pricing === null\n ? await Promise.all([\n aggregate(sample, { by: {}, values: { passRate } }),\n toAttemptEvidence(sample),\n ])\n : await Promise.all([\n aggregate(sample, {\n by: {},\n values: { passRate, totalCostUSD: totalCostUSD(pricing) },\n }),\n toAttemptEvidence(sample),\n ]);\n const currentSlots = sample.snapshot.slots.filter((slot) => slot.state !== \"excluded\");\n const first = summary[0];\n const range = runRange(sample);\n return Object.freeze({\n ...range,\n experiments: new Set(currentSlots.map((slot) => String(slot.experimentId))).size,\n evals: new Set(currentSlots.map((slot) => String(slot.evalId))).size,\n attempts: currentSlots.filter((slot) => slot.state === \"included\").length,\n verdicts: tallyVerdicts(sample, evidence.entries, votes),\n passRate: first?.passRate ?? null,\n totalCostUSD: first === undefined || pricing === null\n ? null\n : (first as unknown as {\n readonly totalCostUSD: CostMetricValue;\n }).totalCostUSD,\n });\n}\n/**\n * Uses Analysis rows for every plotted value. Only display-safe dimensions\n * are normalized into strings; MetricValue, issues, and evidence stay intact.\n * Cost and pass rate remain Analysis MetricValues. Score classification and\n * earned score reuse the closed Experiment list facts used by ExperimentTable,\n * so the chart and table agree on every Experiment's primary reading.\n */\nexport async function experimentScatterData(sample: Sample, options: {\n readonly series?: SummarySeries;\n readonly connect?: boolean;\n readonly experiments?: readonly ExperimentListItem[];\n}, pricing: PricingProfile): Promise<ExperimentScatterData> {\n const line = label(\"line\");\n const hasLine = sample.snapshot.runs.some((run) => run.context?.labels.line !== undefined);\n const group = groupFor(options.series, hasLine ? line : agent);\n const connect = options.connect ?? (group === line);\n const rows = await aggregate(sample, {\n by: { experiment, series: group },\n values: { costUSD: costUSD(pricing), passRate },\n });\n const experimentFacts = new Map((options.experiments ?? []).map((item) => [String(item.experimentId), item]));\n const points = Object.freeze(rows.map((row): ExperimentScatterPoint => evidenceRow({\n key: row.key,\n experiment: String(row.experiment),\n series: dimensionText(row.series),\n costUSD: (row as unknown as {\n readonly costUSD: CostMetricValue;\n }).costUSD,\n passRate: row.passRate,\n evaluationKind: experimentFacts.get(String(row.experiment))?.evaluationKind ?? \"pass\",\n ...(experimentFacts.get(String(row.experiment))?.totalScore === undefined\n ? {}\n : { totalScore: experimentFacts.get(String(row.experiment))!.totalScore }),\n })));\n return Object.freeze({ connect, points });\n}\n/**\n * Builds stability display data from per-eval Analysis pass-rate rows. The\n * `executions` coordinate is the existing metric denominator, not a Report\n * metric. This retains partial/missing states instead of manufacturing zero\n * values or a second verdict reducer.\n */\nexport async function stabilityOverviewData(sample: Sample, options: {\n readonly columns?: SummarySeries;\n readonly evals?: string | readonly string[];\n}): Promise<StabilityOverviewData> {\n const scoped = sampleForEvals(sample, options.evals);\n const group = groupFor(options.columns, experiment);\n const rows = await aggregate(scoped, {\n by: { evalId, condition: group },\n values: { passRate },\n });\n const points = Object.freeze(rows.map((row): StabilityPoint => evidenceRow({\n key: row.key,\n evalId: String(row.evalId),\n condition: dimensionText(row.condition),\n executions: row.passRate.total,\n passRate: row.passRate,\n })));\n const stability = stabilityCounts(points);\n return Object.freeze({\n ...stability,\n points,\n dataset: Object.freeze({\n fields: Object.freeze([\n dimensionField(\"evalId\", \"string\"),\n dimensionField(\"condition\", \"string\"),\n dimensionField(\"executions\", \"number\"),\n metricField(\"passRate\", passRate),\n ]),\n rows: Object.freeze(points.map((point) => Object.freeze({\n key: point.key,\n values: Object.freeze({\n evalId: point.evalId,\n condition: point.condition,\n executions: point.executions,\n passRate: point.passRate,\n }),\n }))),\n }),\n });\n}\nfunction groupFor(value: SummarySeries | undefined, fallback: ReportGroup): ReportGroup {\n if (value === undefined)\n return fallback;\n if (typeof value !== \"string\")\n return value;\n switch (value) {\n case \"agent\":\n return agent;\n case \"model\":\n return model;\n case \"experiment\":\n return experiment;\n default:\n throw new TypeError(`Summary series ${JSON.stringify(value)} must be \"agent\", \"model\", \"experiment\", or an Analysis Dimension / GroupFunction.`);\n }\n}\nfunction dimensionText(value: string | number | boolean | null): string {\n return value === null ? \"(missing)\" : String(value);\n}\nfunction runRange(sample: Sample): {\n readonly earliestStartedAt: string | null;\n readonly latestStartedAt: string | null;\n} {\n let earliest: number | null = null;\n let latest: number | null = null;\n for (const run of sample.snapshot.runs) {\n const startedAt = Number(run.startedAt);\n if (!Number.isFinite(startedAt))\n continue;\n earliest = earliest === null || startedAt < earliest ? startedAt : earliest;\n latest = latest === null || startedAt > latest ? startedAt : latest;\n }\n return Object.freeze({\n earliestStartedAt: earliest === null ? null : new Date(earliest).toISOString(),\n latestStartedAt: latest === null ? null : new Date(latest).toISOString(),\n });\n}\nfunction tallyVerdicts(sample: Sample, entries: Awaited<ReturnType<typeof toAttemptEvidence>>[\"entries\"], votes: \"eval\" | \"attempt\"): VerdictCounts {\n const byLocator = new Map(sample.snapshot.slots\n .filter((slot): slot is Extract<typeof slot, {\n readonly state: \"included\";\n }> => slot.state === \"included\")\n .map((slot) => [slot.attempt.locator, slot] as const));\n const choices = new Map<string, {\n readonly ordinal: number;\n readonly locator: string;\n readonly verdict: Verdict;\n }>();\n for (const entry of entries) {\n if (entry.state !== \"available\")\n continue;\n const slot = byLocator.get(entry.attempt.locator);\n if (slot === undefined)\n continue;\n const key = votes === \"attempt\"\n ? entry.attempt.locator\n : `${slot.experimentId}\\u0000${slot.evalId}`;\n const existing = choices.get(key);\n if (existing === undefined ||\n slot.attemptOrdinal > existing.ordinal ||\n (slot.attemptOrdinal === existing.ordinal && entry.attempt.locator > existing.locator)) {\n choices.set(key, {\n ordinal: slot.attemptOrdinal,\n locator: entry.attempt.locator,\n verdict: entry.detail.verdict,\n });\n }\n }\n const counts: {\n passed: number;\n failed: number;\n errored: number;\n skipped: number;\n } = {\n passed: 0,\n failed: 0,\n errored: 0,\n skipped: 0,\n };\n for (const choice of choices.values())\n counts[choice.verdict] += 1;\n return Object.freeze(counts);\n}\nfunction sampleForEvals(sample: Sample, evals: string | readonly string[] | undefined): Sample {\n if (evals === undefined)\n return sample;\n const selected = typeof evals === \"string\" ? [evals] : evals;\n if (!selected.every((value) => typeof value === \"string\")) {\n throw new TypeError(\"StabilityOverview.evals must be a string or an array of strings\");\n }\n const wanted = new Set(selected);\n return narrowSample(sample, {\n slotIds: sample.snapshot.slots\n .filter((slot) => slot.state !== \"excluded\" && wanted.has(String(slot.evalId)))\n .map((slot) => slot.slotId),\n });\n}\nfunction stabilityCounts(points: readonly StabilityPoint[]): {\n readonly executions: number;\n readonly neverPassed: number;\n readonly flaky: number;\n} {\n const byEval = new Map<string, {\n measured: boolean;\n passed: boolean;\n flaky: boolean;\n }>();\n let executions = 0;\n for (const point of points) {\n executions += point.executions;\n let facts = byEval.get(point.evalId);\n if (facts === undefined) {\n facts = { measured: false, passed: false, flaky: false };\n byEval.set(point.evalId, facts);\n }\n if (!hasMetricValue(point.passRate))\n continue;\n facts.measured = true;\n facts.passed ||= point.passRate.value > 0;\n facts.flaky ||= point.passRate.value > 0 && point.passRate.value < 1;\n }\n return Object.freeze({\n executions,\n neverPassed: [...byEval.values()].filter((facts) => facts.measured && !facts.passed).length,\n flaky: [...byEval.values()].filter((facts) => facts.flaky).length,\n });\n}\n"]}
@@ -11,6 +11,7 @@ import { type ReportGroup } from "../../model/aggregate.cjs";
11
11
  import { type EvidenceRow } from "../../model/metrics.cjs";
12
12
  import type { VerdictCounts } from "../../definition/cell.cjs";
13
13
  import type { Dataset } from "../../model/types.cjs";
14
+ import type { ExperimentListItem } from "../entity-lists/compute.cjs";
14
15
  export interface SampleSummaryData {
15
16
  readonly earliestStartedAt: string | null;
16
17
  readonly latestStartedAt: string | null;
@@ -34,6 +35,10 @@ export interface ExperimentScatterPoint extends EvidenceRow {
34
35
  /** 成本投影读数;调用方已确认 Report 声明了 PricingProfile。 */
35
36
  readonly costUSD: CostMetricValue;
36
37
  readonly passRate: MetricValue<number>;
38
+ /** The Experiment's primary reading kind, shared with ExperimentTable. */
39
+ readonly evaluationKind: "pass" | "points" | "mixed";
40
+ /** Closed earned score; absent when score evidence is incomplete or not applicable. */
41
+ readonly totalScore?: number;
37
42
  }
38
43
  export interface StabilityPoint extends EvidenceRow {
39
44
  readonly key: string;
@@ -60,11 +65,14 @@ export declare function sampleSummaryData(sample: Sample, votes: "eval" | "attem
60
65
  /**
61
66
  * Uses Analysis rows for every plotted value. Only display-safe dimensions
62
67
  * are normalized into strings; MetricValue, issues, and evidence stay intact.
63
- * The x axis always stays cost × passRate; duration never replaces cost.
68
+ * Cost and pass rate remain Analysis MetricValues. Score classification and
69
+ * earned score reuse the closed Experiment list facts used by ExperimentTable,
70
+ * so the chart and table agree on every Experiment's primary reading.
64
71
  */
65
72
  export declare function experimentScatterData(sample: Sample, options: {
66
73
  readonly series?: SummarySeries;
67
74
  readonly connect?: boolean;
75
+ readonly experiments?: readonly ExperimentListItem[];
68
76
  }, pricing: PricingProfile): Promise<ExperimentScatterData>;
69
77
  /**
70
78
  * Builds stability display data from per-eval Analysis pass-rate rows. The
@@ -11,6 +11,7 @@ import { type ReportGroup } from "../../model/aggregate.mjs";
11
11
  import { type EvidenceRow } from "../../model/metrics.mjs";
12
12
  import type { VerdictCounts } from "../../definition/cell.mjs";
13
13
  import type { Dataset } from "../../model/types.mjs";
14
+ import type { ExperimentListItem } from "../entity-lists/compute.mjs";
14
15
  export interface SampleSummaryData {
15
16
  readonly earliestStartedAt: string | null;
16
17
  readonly latestStartedAt: string | null;
@@ -34,6 +35,10 @@ export interface ExperimentScatterPoint extends EvidenceRow {
34
35
  /** 成本投影读数;调用方已确认 Report 声明了 PricingProfile。 */
35
36
  readonly costUSD: CostMetricValue;
36
37
  readonly passRate: MetricValue<number>;
38
+ /** The Experiment's primary reading kind, shared with ExperimentTable. */
39
+ readonly evaluationKind: "pass" | "points" | "mixed";
40
+ /** Closed earned score; absent when score evidence is incomplete or not applicable. */
41
+ readonly totalScore?: number;
37
42
  }
38
43
  export interface StabilityPoint extends EvidenceRow {
39
44
  readonly key: string;
@@ -60,11 +65,14 @@ export declare function sampleSummaryData(sample: Sample, votes: "eval" | "attem
60
65
  /**
61
66
  * Uses Analysis rows for every plotted value. Only display-safe dimensions
62
67
  * are normalized into strings; MetricValue, issues, and evidence stay intact.
63
- * The x axis always stays cost × passRate; duration never replaces cost.
68
+ * Cost and pass rate remain Analysis MetricValues. Score classification and
69
+ * earned score reuse the closed Experiment list facts used by ExperimentTable,
70
+ * so the chart and table agree on every Experiment's primary reading.
64
71
  */
65
72
  export declare function experimentScatterData(sample: Sample, options: {
66
73
  readonly series?: SummarySeries;
67
74
  readonly connect?: boolean;
75
+ readonly experiments?: readonly ExperimentListItem[];
68
76
  }, pricing: PricingProfile): Promise<ExperimentScatterData>;
69
77
  /**
70
78
  * Builds stability display data from per-eval Analysis pass-rate rows. The
@@ -11,6 +11,7 @@ import { type ReportGroup } from "../../model/aggregate.js";
11
11
  import { type EvidenceRow } from "../../model/metrics.js";
12
12
  import type { VerdictCounts } from "../../definition/cell.js";
13
13
  import type { Dataset } from "../../model/types.js";
14
+ import type { ExperimentListItem } from "../entity-lists/compute.js";
14
15
  export interface SampleSummaryData {
15
16
  readonly earliestStartedAt: string | null;
16
17
  readonly latestStartedAt: string | null;
@@ -34,6 +35,10 @@ export interface ExperimentScatterPoint extends EvidenceRow {
34
35
  /** 成本投影读数;调用方已确认 Report 声明了 PricingProfile。 */
35
36
  readonly costUSD: CostMetricValue;
36
37
  readonly passRate: MetricValue<number>;
38
+ /** The Experiment's primary reading kind, shared with ExperimentTable. */
39
+ readonly evaluationKind: "pass" | "points" | "mixed";
40
+ /** Closed earned score; absent when score evidence is incomplete or not applicable. */
41
+ readonly totalScore?: number;
37
42
  }
38
43
  export interface StabilityPoint extends EvidenceRow {
39
44
  readonly key: string;
@@ -60,11 +65,14 @@ export declare function sampleSummaryData(sample: Sample, votes: "eval" | "attem
60
65
  /**
61
66
  * Uses Analysis rows for every plotted value. Only display-safe dimensions
62
67
  * are normalized into strings; MetricValue, issues, and evidence stay intact.
63
- * The x axis always stays cost × passRate; duration never replaces cost.
68
+ * Cost and pass rate remain Analysis MetricValues. Score classification and
69
+ * earned score reuse the closed Experiment list facts used by ExperimentTable,
70
+ * so the chart and table agree on every Experiment's primary reading.
64
71
  */
65
72
  export declare function experimentScatterData(sample: Sample, options: {
66
73
  readonly series?: SummarySeries;
67
74
  readonly connect?: boolean;
75
+ readonly experiments?: readonly ExperimentListItem[];
68
76
  }, pricing: PricingProfile): Promise<ExperimentScatterData>;
69
77
  /**
70
78
  * Builds stability display data from per-eval Analysis pass-rate rows. The
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SampleOverview = exports.ExperimentScatter = exports.SampleSummary = exports.StabilityOverview = 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 details_ts_1 = require("../../library/details.cjs");
@@ -27,22 +28,35 @@ exports.SampleSummary = (0, tree_ts_1.defineComponent)(async (props, ctx) => {
27
28
  return ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { className: joinClassNames("niceeval-sample-summary", props.className), children: [(0, jsx_runtime_1.jsxs)(primitives_tsx_1.Grid, { children: [(0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.passRate"), value: metricCell(data.passRate) }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.experiments"), value: data.experiments }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.evals"), value: data.evals }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.attempts"), value: data.attempts }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, votes === "attempt" ? "scopeSummary.votesAttempt" : "scopeSummary.votesEval"), value: { kind: "verdict", counts: data.verdicts } }), pricing === null ? ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.totalCost"), value: (0, locale_ts_1.resolveLocalizedText)(pricing_ts_1.COST_SUMMARY_NO_PROFILE_TEXT, locale) })) : ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.totalCost"), value: data.totalCostUSD === null ? (0, locale_ts_1.localeText)(locale, "cell.missing") : metricCell(data.totalCostUSD) }))] }), range === null ? null : (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: "niceeval-sample-summary-range", children: range })] }));
28
29
  });
29
30
  exports.SampleSummary.displayName = "SampleSummary";
30
- /** An Analysis-backed experiment cost × pass-rate comparison. */
31
+ /**
32
+ * An Experiment comparison whose primary y axis follows the evaluation kind.
33
+ * Pass-only Experiments use pass rate; Score and mixed Experiments use total
34
+ * earned score. A mixed Sample renders the two incomparable units separately.
35
+ */
31
36
  exports.ExperimentScatter = (0, tree_ts_1.defineComponent)(async (props, ctx) => {
32
37
  const locale = props.locale ?? locale_ts_1.DEFAULT_REPORT_LOCALE;
33
38
  const pricing = ctx.report.pricing;
34
39
  if (pricing === null) {
35
40
  return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Col, { className: joinClassNames("niceeval-experiment-scatter", props.className), children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: "niceeval-experiment-scatter-note", children: (0, locale_ts_1.resolveLocalizedText)(pricing_ts_1.COST_SCATTER_NO_PROFILE_TEXT, locale) }) }));
36
41
  }
37
- const data = await (0, compute_ts_1.experimentScatterData)(props.input ?? ctx.scope, {
42
+ if (props.comparison.comparison.state === "non-comparable") {
43
+ return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Col, { className: joinClassNames("niceeval-experiment-scatter", props.className), children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: "niceeval-experiment-scatter-note", children: props.comparison.comparison.issues.map((issue) => issue.reason).join(", ") }) }));
44
+ }
45
+ const data = await (0, compute_ts_1.experimentScatterData)((0, experiment_groups_ts_1.sampleForExperimentComparisonScope)(props.comparison), {
38
46
  series: props.series,
39
47
  connect: props.connect,
40
48
  }, pricing);
41
- return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Col, { className: props.className, children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Scatter, { points: data.points, x: "costUSD", y: "passRate", point: "experiment", series: "series", connect: data.connect, pointTarget: props.pointTarget ?? defaultExperimentPointTarget, locale: props.locale, legend: true }) }));
49
+ if (data.points.length > 0 && data.points.every((point) => point.costUSD.state === "migration-required")) {
50
+ return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Col, { className: joinClassNames("niceeval-experiment-scatter", props.className), children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: "niceeval-experiment-scatter-note", children: (0, locale_ts_1.localeText)(locale, "costProjection.migrationRequired") }) }));
51
+ }
52
+ const passPoints = data.points.filter((point) => point.evaluationKind === "pass");
53
+ const scorePoints = data.points.filter((point) => point.evaluationKind !== "pass");
54
+ const pointTarget = props.pointTarget ?? defaultExperimentPointTarget;
55
+ return ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { className: props.className, children: [passPoints.length === 0 ? null : ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Scatter, { points: passPoints, x: "costUSD", y: "passRate", point: "experiment", series: "series", connect: data.connect, pointTarget: pointTarget, locale: props.locale, legend: true })), scorePoints.length === 0 ? null : ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Chart, { data: scoreScatterDataset(scorePoints), x: "costUSD", y: "totalScore", pointTarget: pointTarget, locale: props.locale, legend: true, children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Series, { id: "score", mark: "scatter", points: "experiment", by: "series", connect: data.connect }) }))] }));
42
56
  });
43
57
  exports.ExperimentScatter.displayName = "ExperimentScatter";
44
58
  /** The conventional summary + comparison composition. */
45
- exports.SampleOverview = (0, tree_ts_1.defineComponent)((props) => ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { className: props.className, children: [(0, jsx_runtime_1.jsx)(exports.SampleSummary, { input: props.input, locale: props.locale }), (0, jsx_runtime_1.jsx)(exports.ExperimentScatter, { input: props.input, series: props.series, connect: props.connect, pointTarget: props.pointTarget, locale: props.locale })] })));
59
+ exports.SampleOverview = (0, tree_ts_1.defineComponent)((props) => ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { className: props.className, children: [(0, jsx_runtime_1.jsx)(exports.SampleSummary, { input: (0, experiment_groups_ts_1.sampleForExperimentComparisonScope)(props.comparison), locale: props.locale }), (0, jsx_runtime_1.jsx)(exports.ExperimentScatter, { comparison: props.comparison, series: props.series, connect: props.connect, pointTarget: props.pointTarget, locale: props.locale })] })));
46
60
  exports.SampleOverview.displayName = "SampleOverview";
47
61
  function metricCell(metric) {
48
62
  return metric === null ? null : { kind: "metric", metric };
@@ -53,6 +67,36 @@ function defaultExperimentPointTarget(point) {
53
67
  params: (0, details_ts_1.experimentDetailTarget)(point.key),
54
68
  };
55
69
  }
70
+ function scoreScatterDataset(points) {
71
+ const cost = points[0]?.costUSD;
72
+ const costField = Object.freeze({
73
+ name: "costUSD",
74
+ kind: "metric",
75
+ valueType: "number",
76
+ ...(cost?.unit === undefined ? {} : { unit: cost.unit }),
77
+ ...(cost?.format === undefined ? {} : { format: cost.format }),
78
+ ...(cost?.better === undefined ? {} : { better: cost.better }),
79
+ ...(cost?.bounds === undefined ? {} : { bounds: cost.bounds }),
80
+ });
81
+ return Object.freeze({
82
+ fields: Object.freeze([
83
+ { name: "experiment", kind: "dimension", valueType: "string" },
84
+ { name: "series", kind: "dimension", valueType: "string" },
85
+ costField,
86
+ { name: "totalScore", kind: "metric", valueType: "number", better: "higher", bounds: { min: 0 } },
87
+ ]),
88
+ rows: Object.freeze(points.map((point) => Object.freeze({
89
+ // Match Scatter's point="experiment" route identity on the pass branch.
90
+ key: point.experiment,
91
+ values: Object.freeze({
92
+ experiment: point.experiment,
93
+ series: point.series,
94
+ costUSD: point.costUSD,
95
+ totalScore: point.totalScore ?? null,
96
+ }),
97
+ }))),
98
+ });
99
+ }
56
100
  function rangeText(earliest, latest, locale) {
57
101
  if (latest === null)
58
102
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":";;;;AAEA,sDAA2D;AAC3D,mEAAkF;AAIlF,yDAAkE;AAClE,qDAAkF;AAClF,qDAAoH;AACpH,uDAAqG;AACrG,6CAA6F;AAC7F,kEAA6D;AAApD,2HAAA,iBAAiB,OAAA;AAU1B;;;;;;GAMG;AACU,QAAA,aAAa,GAAG,IAAA,yBAAe,EAAqB,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAClF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,iCAAqB,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC;IACpC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,IAAA,8BAAiB,EAAC,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9E,OAAO,CAAC,wBAAC,oBAAG,IAAC,SAAS,EAAE,cAAc,CAAC,yBAAyB,EAAE,KAAK,CAAC,SAAS,CAAC,aAChF,wBAAC,qBAAI,eACH,uBAAC,qBAAI,IAAC,KAAK,EAAE,IAAA,sBAAU,EAAC,MAAM,EAAE,uBAAuB,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAC7F,uBAAC,qBAAI,IAAC,KAAK,EAAE,IAAA,sBAAU,EAAC,MAAM,EAAE,0BAA0B,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,GAAG,EACvF,uBAAC,qBAAI,IAAC,KAAK,EAAE,IAAA,sBAAU,EAAC,MAAM,EAAE,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,EAC3E,uBAAC,qBAAI,IAAC,KAAK,EAAE,IAAA,sBAAU,EAAC,MAAM,EAAE,uBAAuB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,EACjF,uBAAC,qBAAI,IAAC,KAAK,EAAE,IAAA,sBAAU,EAAC,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,wBAAwB,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAClK,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,uBAAC,qBAAI,IAAC,KAAK,EAAE,IAAA,sBAAU,EAAC,MAAM,EAAE,wBAAwB,CAAC,EAAE,KAAK,EAAE,IAAA,gCAAoB,EAAC,yCAA4B,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAC,qBAAI,IAAC,KAAK,EAAE,IAAA,sBAAU,EAAC,MAAM,EAAE,wBAAwB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAA,sBAAU,EAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IACzT,EACN,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,uBAAC,qBAAI,IAAC,SAAS,EAAC,+BAA+B,YAAE,KAAK,GAAQ,IACnF,CAAC,CAAC;AACZ,CAAC,CAAC,CAAC;AACH,qBAAa,CAAC,WAAW,GAAG,eAAe,CAAC;AAa5C,iEAAiE;AACpD,QAAA,iBAAiB,GAAG,IAAA,yBAAe,EAAyB,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAC1F,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,iCAAqB,CAAC;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IACnC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,CAAC,uBAAC,oBAAG,IAAC,SAAS,EAAE,cAAc,CAAC,6BAA6B,EAAE,KAAK,CAAC,SAAS,CAAC,YACtF,uBAAC,qBAAI,IAAC,SAAS,EAAC,kCAAkC,YAC/C,IAAA,gCAAoB,EAAC,yCAA4B,EAAE,MAAM,CAAC,GACtD,GACH,CAAC,CAAC;IACV,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,IAAA,kCAAqB,EAAC,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE;QAC/D,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;KACzB,EAAE,OAAO,CAAC,CAAC;IACZ,OAAO,CAAC,uBAAC,oBAAG,IAAC,SAAS,EAAE,KAAK,CAAC,SAAS,YACrC,uBAAC,wBAAO,IAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAC,SAAS,EAAC,CAAC,EAAC,UAAU,EAAC,KAAK,EAAC,YAAY,EAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,4BAA4B,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,SAAE,GAC3M,CAAC,CAAC;AACZ,CAAC,CAAC,CAAC;AACH,yBAAiB,CAAC,WAAW,GAAG,mBAAmB,CAAC;AAGpD,yDAAyD;AAC5C,QAAA,cAAc,GAAG,IAAA,yBAAe,EAAsB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,wBAAC,oBAAG,IAAC,SAAS,EAAE,KAAK,CAAC,SAAS,aAC1G,uBAAC,qBAAa,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,EAC1D,uBAAC,yBAAiB,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,IACxI,CAAC,CAAC,CAAC;AACX,sBAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC;AAC9C,SAAS,UAAU,CAAC,MAAkC;IAClD,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC/D,CAAC;AACD,SAAS,4BAA4B,CAAC,KAAuB;IACzD,OAAO;QACH,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,IAAA,mCAAsB,EAAC,KAAK,CAAC,GAAmB,CAAC;KAC5D,CAAC;AACN,CAAC;AACD,SAAS,SAAS,CAAC,QAAuB,EAAE,MAAqB,EAAE,MAAoB;IACnF,IAAI,MAAM,KAAK,IAAI;QACf,OAAO,IAAI,CAAC;IAChB,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC3C,OAAO,IAAA,sBAAU,EAAC,MAAM,EAAE,sBAAsB,EAAE,EAAE,IAAI,EAAE,IAAA,yBAAa,EAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,MAAM,KAAK,GAAG,IAAA,qCAAyB,EAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAClE,OAAO,IAAA,sBAAU,EAAC,MAAM,EAAE,uBAAuB,EAAE,KAAK,CAAC,CAAC;AAC9D,CAAC;AACD,SAAS,cAAc,CAAC,GAAG,KAAsC;IAC7D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnG,CAAC","sourcesContent":["/** Official summary components over a fixed Sample and closed Analysis rows. */\nimport type { ExperimentId, MetricValue, Sample } from \"../../../analysis/index.ts\";\nimport { defineComponent } from \"../../definition/tree.ts\";\nimport { Col, Grid, Scatter, Stat, Text, } from \"../../definition/primitives.tsx\";\nimport type { Cell } from \"../../definition/cell.tsx\";\nimport type { ChartTargetPoint } from \"../../definition/primitives/chart.tsx\";\nimport type { ReportTarget } from \"../../definition/report.ts\";\nimport { experimentDetailTarget } from \"../../library/details.ts\";\nimport { formatInstant, formatReportDateTimeRange, } from \"../../model/format.ts\";\nimport { DEFAULT_REPORT_LOCALE, localeText, resolveLocalizedText, type ReportLocale, } from \"../../model/locale.ts\";\nimport { COST_SCATTER_NO_PROFILE_TEXT, COST_SUMMARY_NO_PROFILE_TEXT, } from \"../../model/pricing.ts\";\nimport { experimentScatterData, sampleSummaryData, type SummarySeries, } from \"./compute.ts\";\nexport { StabilityOverview } from \"./stability-overview.tsx\";\nexport type { StabilityOverviewProps } from \"./stability-overview.tsx\";\nexport interface SampleSummaryProps {\n /** Explicit fixed Sample; omitted means the resolving component's `ctx.scope`. */\n readonly input?: Sample;\n /** Which closed evidence identity gets one verdict count. */\n readonly votes?: \"eval\" | \"attempt\";\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/**\n * The zero-config scope summary. Its values are either Sample identity facts\n * or untouched Analysis MetricValues; Grid/Stat supply both text and web\n * presentation from the single resolved tree. The cost KPI shows the full\n * projection (state/basis/profile/coverage/reasons), or the adjudicated\n * bilingual text when the Report declares no PricingProfile.\n */\nexport const SampleSummary = defineComponent<SampleSummaryProps>(async (props, ctx) => {\n const locale = props.locale ?? DEFAULT_REPORT_LOCALE;\n const votes = props.votes ?? \"eval\";\n const pricing = ctx.report.pricing;\n const data = await sampleSummaryData(props.input ?? ctx.scope, votes, pricing);\n const range = rangeText(data.earliestStartedAt, data.latestStartedAt, locale);\n return (<Col className={joinClassNames(\"niceeval-sample-summary\", props.className)}>\n <Grid>\n <Stat label={localeText(locale, \"scopeSummary.passRate\")} value={metricCell(data.passRate)}/>\n <Stat label={localeText(locale, \"scopeSummary.experiments\")} value={data.experiments}/>\n <Stat label={localeText(locale, \"scopeSummary.evals\")} value={data.evals}/>\n <Stat label={localeText(locale, \"scopeSummary.attempts\")} value={data.attempts}/>\n <Stat label={localeText(locale, votes === \"attempt\" ? \"scopeSummary.votesAttempt\" : \"scopeSummary.votesEval\")} value={{ kind: \"verdict\", counts: data.verdicts }}/>\n {pricing === null ? (<Stat label={localeText(locale, \"scopeSummary.totalCost\")} value={resolveLocalizedText(COST_SUMMARY_NO_PROFILE_TEXT, locale)}/>) : (<Stat label={localeText(locale, \"scopeSummary.totalCost\")} value={data.totalCostUSD === null ? localeText(locale, \"cell.missing\") : metricCell(data.totalCostUSD)}/>)}\n </Grid>\n {range === null ? null : <Text className=\"niceeval-sample-summary-range\">{range}</Text>}\n </Col>);\n});\nSampleSummary.displayName = \"SampleSummary\";\nexport interface ExperimentScatterProps {\n /** Explicit fixed Sample; omitted means the resolving component's `ctx.scope`. */\n readonly input?: Sample;\n /** The closed Run-context dimension used to split experiment points. */\n readonly series?: SummarySeries;\n /** Connect points from the same series; defaults on for the conventional `line` label. */\n readonly connect?: boolean;\n /** Overrides the library's default Experiment detail target for each point. */\n readonly pointTarget?: (point: ChartTargetPoint) => ReportTarget | undefined;\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** An Analysis-backed experiment cost × pass-rate comparison. */\nexport const ExperimentScatter = defineComponent<ExperimentScatterProps>(async (props, ctx) => {\n const locale = props.locale ?? DEFAULT_REPORT_LOCALE;\n const pricing = ctx.report.pricing;\n if (pricing === null) {\n return (<Col className={joinClassNames(\"niceeval-experiment-scatter\", props.className)}>\n <Text className=\"niceeval-experiment-scatter-note\">\n {resolveLocalizedText(COST_SCATTER_NO_PROFILE_TEXT, locale)}\n </Text>\n </Col>);\n }\n const data = await experimentScatterData(props.input ?? ctx.scope, {\n series: props.series,\n connect: props.connect,\n }, pricing);\n return (<Col className={props.className}>\n <Scatter points={data.points} x=\"costUSD\" y=\"passRate\" point=\"experiment\" series=\"series\" connect={data.connect} pointTarget={props.pointTarget ?? defaultExperimentPointTarget} locale={props.locale} legend/>\n </Col>);\n});\nExperimentScatter.displayName = \"ExperimentScatter\";\nexport interface SampleOverviewProps extends ExperimentScatterProps {\n}\n/** The conventional summary + comparison composition. */\nexport const SampleOverview = defineComponent<SampleOverviewProps>((props) => (<Col className={props.className}>\n <SampleSummary input={props.input} locale={props.locale}/>\n <ExperimentScatter input={props.input} series={props.series} connect={props.connect} pointTarget={props.pointTarget} locale={props.locale}/>\n </Col>));\nSampleOverview.displayName = \"SampleOverview\";\nfunction metricCell(metric: MetricValue<number> | null): Cell | null {\n return metric === null ? null : { kind: \"metric\", metric };\n}\nfunction defaultExperimentPointTarget(point: ChartTargetPoint): ReportTarget {\n return {\n page: \"experiment\",\n params: experimentDetailTarget(point.key as ExperimentId),\n };\n}\nfunction rangeText(earliest: string | null, latest: string | null, locale: ReportLocale): string | null {\n if (latest === null)\n return null;\n if (earliest === null || earliest === latest) {\n return localeText(locale, \"scopeSummary.lastRun\", { time: formatInstant(latest, locale) });\n }\n const range = formatReportDateTimeRange(earliest, latest, locale);\n return localeText(locale, \"scopeSummary.runRange\", range);\n}\nfunction joinClassNames(...parts: readonly (string | undefined)[]): string {\n return parts.filter((part): part is string => part !== undefined && part.length > 0).join(\" \");\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** Official summary components over a fixed Sample and closed Analysis rows. */\nimport type { ExperimentComparisonScope, ExperimentId, MetricValue, Sample } from \"../../../analysis/index.ts\";\nimport { sampleForExperimentComparisonScope } from \"../../../analysis/experiment-groups.ts\";\nimport { defineComponent } from \"../../definition/tree.ts\";\nimport { Chart, Col, Grid, Scatter, Series, Stat, Text, } from \"../../definition/primitives.tsx\";\nimport type { Cell } from \"../../definition/cell.tsx\";\nimport type { ChartTargetPoint } from \"../../definition/primitives/chart.tsx\";\nimport type { ReportTarget } from \"../../definition/report.ts\";\nimport { experimentDetailTarget } from \"../../library/details.ts\";\nimport { formatInstant, formatReportDateTimeRange, } from \"../../model/format.ts\";\nimport { DEFAULT_REPORT_LOCALE, localeText, resolveLocalizedText, type ReportLocale, } from \"../../model/locale.ts\";\nimport { COST_SCATTER_NO_PROFILE_TEXT, COST_SUMMARY_NO_PROFILE_TEXT, } from \"../../model/pricing.ts\";\nimport { experimentScatterData, sampleSummaryData, type ExperimentScatterPoint, type SummarySeries, } from \"./compute.ts\";\nimport type { Dataset, DatasetField } from \"../../model/types.ts\";\nexport { StabilityOverview } from \"./stability-overview.tsx\";\nexport type { StabilityOverviewProps } from \"./stability-overview.tsx\";\nexport interface SampleSummaryProps {\n /** Explicit fixed Sample; omitted means the resolving component's `ctx.scope`. */\n readonly input?: Sample;\n /** Which closed evidence identity gets one verdict count. */\n readonly votes?: \"eval\" | \"attempt\";\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/**\n * The zero-config scope summary. Its values are either Sample identity facts\n * or untouched Analysis MetricValues; Grid/Stat supply both text and web\n * presentation from the single resolved tree. The cost KPI shows the full\n * projection (state/basis/profile/coverage/reasons), or the adjudicated\n * bilingual text when the Report declares no PricingProfile.\n */\nexport const SampleSummary = defineComponent<SampleSummaryProps>(async (props, ctx) => {\n const locale = props.locale ?? DEFAULT_REPORT_LOCALE;\n const votes = props.votes ?? \"eval\";\n const pricing = ctx.report.pricing;\n const data = await sampleSummaryData(props.input ?? ctx.scope, votes, pricing);\n const range = rangeText(data.earliestStartedAt, data.latestStartedAt, locale);\n return (<Col className={joinClassNames(\"niceeval-sample-summary\", props.className)}>\n <Grid>\n <Stat label={localeText(locale, \"scopeSummary.passRate\")} value={metricCell(data.passRate)}/>\n <Stat label={localeText(locale, \"scopeSummary.experiments\")} value={data.experiments}/>\n <Stat label={localeText(locale, \"scopeSummary.evals\")} value={data.evals}/>\n <Stat label={localeText(locale, \"scopeSummary.attempts\")} value={data.attempts}/>\n <Stat label={localeText(locale, votes === \"attempt\" ? \"scopeSummary.votesAttempt\" : \"scopeSummary.votesEval\")} value={{ kind: \"verdict\", counts: data.verdicts }}/>\n {pricing === null ? (<Stat label={localeText(locale, \"scopeSummary.totalCost\")} value={resolveLocalizedText(COST_SUMMARY_NO_PROFILE_TEXT, locale)}/>) : (<Stat label={localeText(locale, \"scopeSummary.totalCost\")} value={data.totalCostUSD === null ? localeText(locale, \"cell.missing\") : metricCell(data.totalCostUSD)}/>)}\n </Grid>\n {range === null ? null : <Text className=\"niceeval-sample-summary-range\">{range}</Text>}\n </Col>);\n});\nSampleSummary.displayName = \"SampleSummary\";\nexport interface ExperimentScatterProps {\n readonly comparison: ExperimentComparisonScope;\n /** The closed Run-context dimension used to split experiment points. */\n readonly series?: SummarySeries;\n /** Connect points from the same series; defaults on for the conventional `line` label. */\n readonly connect?: boolean;\n /** Overrides the library's default Experiment detail target for each point. */\n readonly pointTarget?: (point: ChartTargetPoint) => ReportTarget | undefined;\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/**\n * An Experiment comparison whose primary y axis follows the evaluation kind.\n * Pass-only Experiments use pass rate; Score and mixed Experiments use total\n * earned score. A mixed Sample renders the two incomparable units separately.\n */\nexport const ExperimentScatter = defineComponent<ExperimentScatterProps>(async (props, ctx) => {\n const locale = props.locale ?? DEFAULT_REPORT_LOCALE;\n const pricing = ctx.report.pricing;\n if (pricing === null) {\n return (<Col className={joinClassNames(\"niceeval-experiment-scatter\", props.className)}>\n <Text className=\"niceeval-experiment-scatter-note\">\n {resolveLocalizedText(COST_SCATTER_NO_PROFILE_TEXT, locale)}\n </Text>\n </Col>);\n }\n if (props.comparison.comparison.state === \"non-comparable\") {\n return (<Col className={joinClassNames(\"niceeval-experiment-scatter\", props.className)}>\n <Text className=\"niceeval-experiment-scatter-note\">\n {props.comparison.comparison.issues.map((issue) => issue.reason).join(\", \")}\n </Text>\n </Col>);\n }\n const data = await experimentScatterData(sampleForExperimentComparisonScope(props.comparison), {\n series: props.series,\n connect: props.connect,\n }, pricing);\n if (data.points.length > 0 && data.points.every((point) => point.costUSD.state === \"migration-required\")) {\n return (<Col className={joinClassNames(\"niceeval-experiment-scatter\", props.className)}>\n <Text className=\"niceeval-experiment-scatter-note\">\n {localeText(locale, \"costProjection.migrationRequired\")}\n </Text>\n </Col>);\n }\n const passPoints = data.points.filter((point) => point.evaluationKind === \"pass\");\n const scorePoints = data.points.filter((point) => point.evaluationKind !== \"pass\");\n const pointTarget = props.pointTarget ?? defaultExperimentPointTarget;\n return (<Col className={props.className}>\n {passPoints.length === 0 ? null : (<Scatter points={passPoints} x=\"costUSD\" y=\"passRate\" point=\"experiment\" series=\"series\" connect={data.connect} pointTarget={pointTarget} locale={props.locale} legend/>)}\n {scorePoints.length === 0 ? null : (<Chart data={scoreScatterDataset(scorePoints)} x=\"costUSD\" y=\"totalScore\" pointTarget={pointTarget} locale={props.locale} legend>\n <Series id=\"score\" mark=\"scatter\" points=\"experiment\" by=\"series\" connect={data.connect}/>\n </Chart>)}\n </Col>);\n});\nExperimentScatter.displayName = \"ExperimentScatter\";\nexport interface SampleOverviewProps extends ExperimentScatterProps {\n}\n/** The conventional summary + comparison composition. */\nexport const SampleOverview = defineComponent<SampleOverviewProps>((props) => (<Col className={props.className}>\n <SampleSummary input={sampleForExperimentComparisonScope(props.comparison)} locale={props.locale}/>\n <ExperimentScatter comparison={props.comparison} series={props.series} connect={props.connect} pointTarget={props.pointTarget} locale={props.locale}/>\n </Col>));\nSampleOverview.displayName = \"SampleOverview\";\nfunction metricCell(metric: MetricValue<number> | null): Cell | null {\n return metric === null ? null : { kind: \"metric\", metric };\n}\nfunction defaultExperimentPointTarget(point: ChartTargetPoint): ReportTarget {\n return {\n page: \"experiment\",\n params: experimentDetailTarget(point.key as ExperimentId),\n };\n}\nfunction scoreScatterDataset(points: readonly ExperimentScatterPoint[]): Dataset {\n const cost = points[0]?.costUSD;\n const costField: DatasetField = Object.freeze({\n name: \"costUSD\",\n kind: \"metric\",\n valueType: \"number\",\n ...(cost?.unit === undefined ? {} : { unit: cost.unit }),\n ...(cost?.format === undefined ? {} : { format: cost.format }),\n ...(cost?.better === undefined ? {} : { better: cost.better }),\n ...(cost?.bounds === undefined ? {} : { bounds: cost.bounds }),\n });\n return Object.freeze({\n fields: Object.freeze([\n { name: \"experiment\", kind: \"dimension\", valueType: \"string\" },\n { name: \"series\", kind: \"dimension\", valueType: \"string\" },\n costField,\n { name: \"totalScore\", kind: \"metric\", valueType: \"number\", better: \"higher\", bounds: { min: 0 } },\n ] satisfies readonly DatasetField[]),\n rows: Object.freeze(points.map((point) => Object.freeze({\n // Match Scatter's point=\"experiment\" route identity on the pass branch.\n key: point.experiment,\n values: Object.freeze({\n experiment: point.experiment,\n series: point.series,\n costUSD: point.costUSD,\n totalScore: point.totalScore ?? null,\n }),\n }))),\n });\n}\nfunction rangeText(earliest: string | null, latest: string | null, locale: ReportLocale): string | null {\n if (latest === null)\n return null;\n if (earliest === null || earliest === latest) {\n return localeText(locale, \"scopeSummary.lastRun\", { time: formatInstant(latest, locale) });\n }\n const range = formatReportDateTimeRange(earliest, latest, locale);\n return localeText(locale, \"scopeSummary.runRange\", range);\n}\nfunction joinClassNames(...parts: readonly (string | undefined)[]): string {\n return parts.filter((part): part is string => part !== undefined && part.length > 0).join(\" \");\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  /** Official summary components over a fixed Sample and closed Analysis rows. */
2
- import type { Sample } from "../../../analysis/index.cjs";
2
+ import type { ExperimentComparisonScope, Sample } from "../../../analysis/index.cjs";
3
3
  import type { ChartTargetPoint } from "../../definition/primitives/chart.cjs";
4
4
  import type { ReportTarget } from "../../definition/report.cjs";
5
5
  import { type ReportLocale } from "../../model/locale.cjs";
@@ -23,8 +23,7 @@ export interface SampleSummaryProps {
23
23
  */
24
24
  export declare const SampleSummary: import("../../definition/tree.cjs").ReportComponent<SampleSummaryProps>;
25
25
  export interface ExperimentScatterProps {
26
- /** Explicit fixed Sample; omitted means the resolving component's `ctx.scope`. */
27
- readonly input?: Sample;
26
+ readonly comparison: ExperimentComparisonScope;
28
27
  /** The closed Run-context dimension used to split experiment points. */
29
28
  readonly series?: SummarySeries;
30
29
  /** Connect points from the same series; defaults on for the conventional `line` label. */
@@ -34,7 +33,11 @@ export interface ExperimentScatterProps {
34
33
  readonly locale?: ReportLocale;
35
34
  readonly className?: string;
36
35
  }
37
- /** An Analysis-backed experiment cost × pass-rate comparison. */
36
+ /**
37
+ * An Experiment comparison whose primary y axis follows the evaluation kind.
38
+ * Pass-only Experiments use pass rate; Score and mixed Experiments use total
39
+ * earned score. A mixed Sample renders the two incomparable units separately.
40
+ */
38
41
  export declare const ExperimentScatter: import("../../definition/tree.cjs").ReportComponent<ExperimentScatterProps>;
39
42
  export interface SampleOverviewProps extends ExperimentScatterProps {
40
43
  }
@@ -1,5 +1,5 @@
1
1
  /** Official summary components over a fixed Sample and closed Analysis rows. */
2
- import type { Sample } from "../../../analysis/index.mjs";
2
+ import type { ExperimentComparisonScope, Sample } from "../../../analysis/index.mjs";
3
3
  import type { ChartTargetPoint } from "../../definition/primitives/chart.mjs";
4
4
  import type { ReportTarget } from "../../definition/report.mjs";
5
5
  import { type ReportLocale } from "../../model/locale.mjs";
@@ -23,8 +23,7 @@ export interface SampleSummaryProps {
23
23
  */
24
24
  export declare const SampleSummary: import("../../definition/tree.mjs").ReportComponent<SampleSummaryProps>;
25
25
  export interface ExperimentScatterProps {
26
- /** Explicit fixed Sample; omitted means the resolving component's `ctx.scope`. */
27
- readonly input?: Sample;
26
+ readonly comparison: ExperimentComparisonScope;
28
27
  /** The closed Run-context dimension used to split experiment points. */
29
28
  readonly series?: SummarySeries;
30
29
  /** Connect points from the same series; defaults on for the conventional `line` label. */
@@ -34,7 +33,11 @@ export interface ExperimentScatterProps {
34
33
  readonly locale?: ReportLocale;
35
34
  readonly className?: string;
36
35
  }
37
- /** An Analysis-backed experiment cost × pass-rate comparison. */
36
+ /**
37
+ * An Experiment comparison whose primary y axis follows the evaluation kind.
38
+ * Pass-only Experiments use pass rate; Score and mixed Experiments use total
39
+ * earned score. A mixed Sample renders the two incomparable units separately.
40
+ */
38
41
  export declare const ExperimentScatter: import("../../definition/tree.mjs").ReportComponent<ExperimentScatterProps>;
39
42
  export interface SampleOverviewProps extends ExperimentScatterProps {
40
43
  }
@@ -1,5 +1,5 @@
1
1
  /** Official summary components over a fixed Sample and closed Analysis rows. */
2
- import type { Sample } from "../../../analysis/index.js";
2
+ import type { ExperimentComparisonScope, Sample } from "../../../analysis/index.js";
3
3
  import type { ChartTargetPoint } from "../../definition/primitives/chart.js";
4
4
  import type { ReportTarget } from "../../definition/report.js";
5
5
  import { type ReportLocale } from "../../model/locale.js";
@@ -23,8 +23,7 @@ export interface SampleSummaryProps {
23
23
  */
24
24
  export declare const SampleSummary: import("../../definition/tree.js").ReportComponent<SampleSummaryProps>;
25
25
  export interface ExperimentScatterProps {
26
- /** Explicit fixed Sample; omitted means the resolving component's `ctx.scope`. */
27
- readonly input?: Sample;
26
+ readonly comparison: ExperimentComparisonScope;
28
27
  /** The closed Run-context dimension used to split experiment points. */
29
28
  readonly series?: SummarySeries;
30
29
  /** Connect points from the same series; defaults on for the conventional `line` label. */
@@ -34,7 +33,11 @@ export interface ExperimentScatterProps {
34
33
  readonly locale?: ReportLocale;
35
34
  readonly className?: string;
36
35
  }
37
- /** An Analysis-backed experiment cost × pass-rate comparison. */
36
+ /**
37
+ * An Experiment comparison whose primary y axis follows the evaluation kind.
38
+ * Pass-only Experiments use pass rate; Score and mixed Experiments use total
39
+ * earned score. A mixed Sample renders the two incomparable units separately.
40
+ */
38
41
  export declare const ExperimentScatter: import("../../definition/tree.js").ReportComponent<ExperimentScatterProps>;
39
42
  export interface SampleOverviewProps extends ExperimentScatterProps {
40
43
  }
@@ -93,7 +93,10 @@ function chartFieldLabel(field, meta, locale) {
93
93
  tokens: "experimentList.tokens",
94
94
  };
95
95
  const base = dictionary[field] ? (0, locale_ts_1.localeText)(locale, dictionary[field]) : field;
96
- return meta.unit ? `${base}(${meta.unit})` : base;
96
+ return meta.unit && meta.format !== "percent" ? `${base}(${meta.unit})` : base;
97
+ }
98
+ function chartTickUnit(meta) {
99
+ return meta.format === "percent" ? "%" : meta.unit;
97
100
  }
98
101
  /** 解析点所属 series 句柄与下标;单系列隐式图不声明视觉身份。 */
99
102
  function dimensionAt(ctx, handle, index) {
@@ -331,11 +334,11 @@ function renderChartWeb(mapped, axes, locale, ctx, options) {
331
334
  ? [...new Set(drawable.map((point) => point.y))]
332
335
  : yScale.ticks).map((tick) => ((0, jsx_runtime_1.jsx)("text", { className: "niceeval-chart-tick", x: MARGIN.left - 8, y: yScale.scale(tick) + 3, textAnchor: "end", children: axes.yMeta.kind === "dimension"
333
336
  ? drawable.find((point) => point.y === tick)?.yLabel
334
- : (0, format_ts_1.formatAxisTick)(tick, (0, math_ts_1.tickStepOf)(yScale.ticks), axes.yMeta.unit) }, `ay${tick}`))) }), (0, jsx_runtime_1.jsx)("g", { className: "niceeval-chart-axis niceeval-chart-axis-x", children: (axes.xMeta.kind === "dimension"
337
+ : (0, format_ts_1.formatAxisTick)(tick, (0, math_ts_1.tickStepOf)(yScale.ticks), chartTickUnit(axes.yMeta)) }, `ay${tick}`))) }), (0, jsx_runtime_1.jsx)("g", { className: "niceeval-chart-axis niceeval-chart-axis-x", children: (axes.xMeta.kind === "dimension"
335
338
  ? [...new Set(drawable.map((point) => point.x))]
336
339
  : xScale.ticks).map((tick) => ((0, jsx_runtime_1.jsx)("text", { className: "niceeval-chart-tick", x: xScale.scale(tick), y: MARGIN.top + PLOT_H + 16, textAnchor: "middle", children: axes.xMeta.kind === "dimension"
337
340
  ? drawable.find((point) => point.x === tick)?.xLabel
338
- : (0, format_ts_1.formatAxisTick)(tick, (0, math_ts_1.tickStepOf)(xScale.ticks), axes.xMeta.unit) }, `ax${tick}`))) }), axes.xMeta.better !== undefined && axes.yMeta.better !== undefined ? ((0, jsx_runtime_1.jsx)("text", { className: "niceeval-chart-better-hint", x: MARGIN.left + PLOT_W - 6, y: MARGIN.top + 14, textAnchor: "end", children: (0, locale_ts_1.localeText)(locale, "scatter.betterUpperRight") })) : null, (0, jsx_runtime_1.jsx)("text", { className: "niceeval-chart-xlabel", x: MARGIN.left + PLOT_W / 2, y: HEIGHT - 8, textAnchor: "middle", children: xLabel }), (0, jsx_runtime_1.jsx)("text", { className: "niceeval-chart-ylabel", x: 14, y: MARGIN.top + PLOT_H / 2, textAnchor: "middle", transform: `rotate(-90 14 ${MARGIN.top + PLOT_H / 2})`, children: yLabel }), visible.flatMap((series) => {
341
+ : (0, format_ts_1.formatAxisTick)(tick, (0, math_ts_1.tickStepOf)(xScale.ticks), chartTickUnit(axes.xMeta)) }, `ax${tick}`))) }), axes.xMeta.better !== undefined && axes.yMeta.better !== undefined ? ((0, jsx_runtime_1.jsx)("text", { className: "niceeval-chart-better-hint", x: MARGIN.left + PLOT_W - 6, y: MARGIN.top + 14, textAnchor: "end", children: (0, locale_ts_1.localeText)(locale, "scatter.betterUpperRight") })) : null, (0, jsx_runtime_1.jsx)("text", { className: "niceeval-chart-xlabel", x: MARGIN.left + PLOT_W / 2, y: HEIGHT - 8, textAnchor: "middle", children: xLabel }), (0, jsx_runtime_1.jsx)("text", { className: "niceeval-chart-ylabel", x: 14, y: MARGIN.top + PLOT_H / 2, textAnchor: "middle", transform: `rotate(-90 14 ${MARGIN.top + PLOT_H / 2})`, children: yLabel }), visible.flatMap((series) => {
339
342
  const values = series.byField ? (0, chart_map_ts_1.seriesDimensionValues)(mapped, series.byField) : [series.id];
340
343
  return values.map((value) => {
341
344
  const seriesPoints = drawable.filter((p) => p.sourceSeriesId === series.id &&
@@ -478,10 +481,10 @@ function chartText(dataset, props, ctx) {
478
481
  // 印到轴上(步长的小数位数才是精度)。
479
482
  formatX: (v) => axes.xMeta.kind === "dimension"
480
483
  ? (points.find((point) => point.x === Math.round(v))?.xLabel ?? "")
481
- : (0, format_ts_1.formatAxisTick)(v, (0, math_ts_1.tickStepOf)((0, math_ts_1.ticksInDomain)(xDomain[0], xDomain[1], 5)), axes.xMeta.unit),
484
+ : (0, format_ts_1.formatAxisTick)(v, (0, math_ts_1.tickStepOf)((0, math_ts_1.ticksInDomain)(xDomain[0], xDomain[1], 5)), chartTickUnit(axes.xMeta)),
482
485
  formatY: (v) => axes.yMeta.kind === "dimension"
483
486
  ? (points.find((point) => point.y === Math.round(v))?.yLabel ?? "")
484
- : (0, format_ts_1.formatAxisTick)(v, (0, math_ts_1.tickStepOf)((0, math_ts_1.ticksInDomain)(yDomain[0], yDomain[1], 5)), axes.yMeta.unit),
487
+ : (0, format_ts_1.formatAxisTick)(v, (0, math_ts_1.tickStepOf)((0, math_ts_1.ticksInDomain)(yDomain[0], yDomain[1], 5)), chartTickUnit(axes.yMeta)),
485
488
  invertX: axes.xMeta.better === "lower",
486
489
  invertY: axes.yMeta.better === "lower",
487
490
  });