niceeval 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/INDEX.md +23 -23
  2. package/README.zh.md +6 -6
  3. package/dist/agents/types.d.ts +69 -7
  4. package/dist/context/types.d.ts +32 -12
  5. package/dist/i18n/en.d.ts +54 -0
  6. package/dist/i18n/zh-CN.d.ts +57 -3
  7. package/dist/o11y/types.d.ts +16 -2
  8. package/dist/report/aggregate.d.ts +32 -24
  9. package/dist/report/aggregate.js +158 -50
  10. package/dist/report/built-in/index.d.ts +2 -0
  11. package/dist/report/built-in/index.js +8 -0
  12. package/dist/report/components.d.ts +93 -160
  13. package/dist/report/components.js +377 -114
  14. package/dist/report/compute.d.ts +87 -81
  15. package/dist/report/compute.js +597 -417
  16. package/dist/report/flag.d.ts +32 -6
  17. package/dist/report/flag.js +92 -4
  18. package/dist/report/format.d.ts +19 -11
  19. package/dist/report/format.js +30 -13
  20. package/dist/report/index.d.ts +16 -16
  21. package/dist/report/index.js +20 -21
  22. package/dist/report/load.js +3 -2
  23. package/dist/report/locale.d.ts +57 -33
  24. package/dist/report/locale.js +122 -56
  25. package/dist/report/metrics.d.ts +23 -4
  26. package/dist/report/metrics.js +110 -25
  27. package/dist/report/primitives.d.ts +48 -15
  28. package/dist/report/primitives.js +135 -26
  29. package/dist/report/react/AttemptList.d.ts +9 -7
  30. package/dist/report/react/AttemptList.js +17 -10
  31. package/dist/report/react/DeltaTable.js +19 -18
  32. package/dist/report/react/EvalList.d.ts +4 -4
  33. package/dist/report/react/EvalList.js +0 -0
  34. package/dist/report/react/ExperimentComparison.d.ts +10 -0
  35. package/dist/report/react/ExperimentComparison.js +12 -0
  36. package/dist/report/react/ExperimentList.d.ts +4 -3
  37. package/dist/report/react/ExperimentList.js +17 -18
  38. package/dist/report/react/MetricBars.js +5 -4
  39. package/dist/report/react/MetricLine.js +12 -5
  40. package/dist/report/react/MetricMatrix.js +1 -1
  41. package/dist/report/react/MetricScatter.js +59 -28
  42. package/dist/report/react/MetricTable.js +2 -12
  43. package/dist/report/react/ScopeSummary.d.ts +10 -0
  44. package/dist/report/react/ScopeSummary.js +17 -0
  45. package/dist/report/react/Scoreboard.js +6 -6
  46. package/dist/report/react/cell.js +2 -2
  47. package/dist/report/react/chart-math.d.ts +23 -6
  48. package/dist/report/react/chart-math.js +71 -19
  49. package/dist/report/react/fixtures.d.ts +5 -9
  50. package/dist/report/react/fixtures.js +110 -147
  51. package/dist/report/react/index.d.ts +15 -5
  52. package/dist/report/react/index.js +18 -7
  53. package/dist/report/report.d.ts +137 -16
  54. package/dist/report/report.js +259 -28
  55. package/dist/report/text/faces.d.ts +17 -19
  56. package/dist/report/text/faces.js +253 -184
  57. package/dist/report/text/plot.js +1 -1
  58. package/dist/report/text/table.js +38 -7
  59. package/dist/report/tree.d.ts +90 -40
  60. package/dist/report/tree.js +252 -94
  61. package/dist/report/types.d.ts +247 -284
  62. package/dist/report/types.js +4 -3
  63. package/dist/report/web.d.ts +21 -5
  64. package/dist/report/web.js +42 -16
  65. package/dist/results/select.d.ts +38 -16
  66. package/dist/results/select.js +73 -25
  67. package/dist/results/types.d.ts +49 -14
  68. package/dist/runner/feedback/sink.d.ts +110 -0
  69. package/dist/runner/types.d.ts +513 -22
  70. package/dist/sandbox/docker.d.ts +23 -2
  71. package/dist/sandbox/e2b.d.ts +15 -1
  72. package/dist/sandbox/errors.d.ts +30 -3
  73. package/dist/sandbox/io-retry.d.ts +17 -0
  74. package/dist/sandbox/registry.d.ts +2 -0
  75. package/dist/sandbox/resolve.d.ts +18 -5
  76. package/dist/sandbox/retry.d.ts +11 -1
  77. package/dist/sandbox/types.d.ts +39 -5
  78. package/dist/sandbox/vercel.d.ts +7 -1
  79. package/dist/scoring/coverage.d.ts +30 -0
  80. package/dist/scoring/display.d.ts +21 -0
  81. package/dist/scoring/display.js +120 -0
  82. package/dist/scoring/types.d.ts +103 -20
  83. package/dist/shared/aggregate.d.ts +4 -2
  84. package/dist/shared/aggregate.js +8 -7
  85. package/dist/shared/types.d.ts +28 -0
  86. package/dist/tty-line.d.ts +0 -4
  87. package/dist/util.d.ts +23 -0
  88. package/docs-site/zh/README.md +44 -0
  89. package/docs-site/zh/examples/ai-agent-application.mdx +63 -0
  90. package/docs-site/zh/examples/coding-agent-extensions.mdx +57 -0
  91. package/docs-site/zh/examples/index.mdx +50 -0
  92. package/docs-site/zh/{concepts → explanation}/adapter.mdx +31 -13
  93. package/docs-site/zh/{concepts → explanation}/assert.mdx +7 -7
  94. package/docs-site/zh/{concepts → explanation}/drive.mdx +8 -8
  95. package/docs-site/zh/{concepts → explanation}/evals.mdx +4 -4
  96. package/docs-site/zh/{concepts → explanation}/experiment.mdx +8 -8
  97. package/docs-site/zh/{concepts → explanation}/hitl.mdx +8 -8
  98. package/docs-site/zh/{concepts → explanation}/judge.mdx +5 -5
  99. package/docs-site/zh/{concepts → explanation}/overview.mdx +11 -11
  100. package/docs-site/zh/{guides → explanation}/runner.mdx +18 -8
  101. package/docs-site/zh/{concepts → explanation}/tier.mdx +6 -6
  102. package/docs-site/zh/{guides → how-to}/agent-feedback-loop.mdx +35 -33
  103. package/docs-site/zh/{guides → how-to}/authoring.mdx +35 -2
  104. package/docs-site/zh/{guides → how-to}/ci-integration.mdx +23 -12
  105. package/docs-site/zh/{guides → how-to}/connect-otel.mdx +6 -6
  106. package/docs-site/zh/{guides → how-to}/connect-your-agent.mdx +47 -21
  107. package/docs-site/zh/{guides → how-to}/custom-reports.mdx +34 -39
  108. package/docs-site/zh/{guides → how-to}/dataset-fanout.mdx +25 -3
  109. package/docs-site/zh/{guides → how-to}/experiments.mdx +12 -5
  110. package/docs-site/zh/how-to/publish-report.mdx +105 -0
  111. package/docs-site/zh/{guides → how-to}/reporters.mdx +2 -2
  112. package/docs-site/zh/{guides → how-to}/sandbox-agent.mdx +56 -7
  113. package/docs-site/zh/how-to/sandbox-providers.mdx +350 -0
  114. package/docs-site/zh/{guides → how-to}/scoring-guide.mdx +4 -4
  115. package/docs-site/zh/{guides → how-to}/viewing-results.mdx +82 -39
  116. package/docs-site/zh/{guides → how-to}/write-experiment.mdx +6 -4
  117. package/docs-site/zh/{guides → how-to}/write-send.mdx +30 -14
  118. package/docs-site/zh/index.mdx +24 -26
  119. package/docs-site/zh/introduction.mdx +8 -8
  120. package/docs-site/zh/reference/builtin-agents.mdx +32 -5
  121. package/docs-site/zh/reference/capabilities.mdx +8 -8
  122. package/docs-site/zh/reference/cli.mdx +40 -12
  123. package/docs-site/zh/reference/define-agent.mdx +58 -5
  124. package/docs-site/zh/reference/define-config.mdx +1 -1
  125. package/docs-site/zh/reference/define-eval.mdx +42 -9
  126. package/docs-site/zh/reference/events.mdx +3 -3
  127. package/docs-site/zh/reference/expect.mdx +26 -1
  128. package/docs-site/zh/{guides → reference}/official-adapters.mdx +32 -8
  129. package/docs-site/zh/{guides → reference}/report-components.mdx +45 -33
  130. package/docs-site/zh/{guides → reference}/results-data.mdx +21 -13
  131. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +57 -0
  132. package/docs-site/zh/troubleshooting/debugging.mdx +212 -0
  133. package/docs-site/zh/{quickstart.mdx → tutorials/quickstart.mdx} +5 -17
  134. package/package.json +10 -2
  135. package/src/agents/ai-sdk-otel.test.ts +1 -0
  136. package/src/agents/ai-sdk.test.ts +3 -0
  137. package/src/agents/ai-sdk.ts +3 -0
  138. package/src/agents/bub-install-spec.test.ts +34 -0
  139. package/src/agents/bub-install-spec.ts +32 -0
  140. package/src/agents/bub.ts +31 -32
  141. package/src/agents/claude-code.test.ts +130 -9
  142. package/src/agents/claude-code.ts +76 -4
  143. package/src/agents/codex.test.ts +189 -40
  144. package/src/agents/codex.ts +155 -14
  145. package/src/agents/coding-cli-versions.test.ts +15 -0
  146. package/src/agents/coding-cli-versions.ts +3 -0
  147. package/src/agents/index.ts +13 -2
  148. package/src/agents/langgraph.test.ts +204 -0
  149. package/src/agents/langgraph.ts +495 -0
  150. package/src/agents/marketplace.ts +85 -0
  151. package/src/agents/native-config.test.ts +179 -0
  152. package/src/agents/native-config.ts +267 -0
  153. package/src/agents/openai-compat.test.ts +1 -0
  154. package/src/agents/openai-compat.ts +1 -1
  155. package/src/agents/openclaw.test.ts +31 -0
  156. package/src/agents/openclaw.ts +171 -0
  157. package/src/agents/plugin-config.test.ts +1 -0
  158. package/src/agents/sdk-streams.test.ts +79 -0
  159. package/src/agents/sdk-streams.ts +55 -10
  160. package/src/agents/skills.test.ts +1 -0
  161. package/src/agents/streaming.test.ts +3 -9
  162. package/src/agents/streaming.ts +2 -2
  163. package/src/agents/types.ts +71 -8
  164. package/src/agents/ui-message-stream.test.ts +3 -0
  165. package/src/cli.ts +446 -124
  166. package/src/context/context.test.ts +51 -12
  167. package/src/context/context.ts +162 -30
  168. package/src/context/session.test.ts +2 -1
  169. package/src/context/session.ts +115 -7
  170. package/src/context/types.ts +30 -12
  171. package/src/define.test.ts +13 -8
  172. package/src/define.ts +25 -4
  173. package/src/expect/index.ts +53 -23
  174. package/src/i18n/en.ts +81 -17
  175. package/src/i18n/zh-CN.ts +80 -17
  176. package/src/o11y/cost.test.ts +1 -0
  177. package/src/o11y/execution-tree.test.ts +1 -20
  178. package/src/o11y/otlp/mappers/claude-code.test.ts +1 -0
  179. package/src/o11y/otlp/parse.test.ts +1 -0
  180. package/src/o11y/otlp/turn-otel.test.ts +1 -0
  181. package/src/o11y/parsers/bub.test.ts +1 -0
  182. package/src/o11y/parsers/claude-code.test.ts +1 -34
  183. package/src/o11y/parsers/openclaw.test.ts +154 -0
  184. package/src/o11y/parsers/openclaw.ts +310 -0
  185. package/src/o11y/prices.json +746 -311
  186. package/src/o11y/tool-names.test.ts +1 -0
  187. package/src/o11y/types.ts +16 -2
  188. package/src/report/aggregate.ts +178 -61
  189. package/src/report/built-in/index.tsx +9 -0
  190. package/src/report/components.tsx +625 -279
  191. package/src/report/compute.ts +723 -491
  192. package/src/report/dual-render.test.tsx +741 -1024
  193. package/src/report/flag.ts +104 -12
  194. package/src/report/format.ts +32 -12
  195. package/src/report/index.ts +119 -46
  196. package/src/report/load.ts +3 -2
  197. package/src/report/locale.ts +136 -65
  198. package/src/report/metrics.ts +108 -25
  199. package/src/report/primitives.tsx +196 -45
  200. package/src/report/react/AttemptList.tsx +30 -43
  201. package/src/report/react/DeltaTable.tsx +63 -45
  202. package/src/report/react/EvalList.tsx +0 -0
  203. package/src/report/react/ExperimentComparison.tsx +73 -0
  204. package/src/report/react/ExperimentList.tsx +50 -32
  205. package/src/report/react/MetricBars.tsx +5 -4
  206. package/src/report/react/MetricLine.tsx +13 -8
  207. package/src/report/react/MetricMatrix.tsx +2 -2
  208. package/src/report/react/MetricScatter.tsx +86 -34
  209. package/src/report/react/MetricTable.tsx +4 -76
  210. package/src/report/react/ScopeSummary.tsx +86 -0
  211. package/src/report/react/Scoreboard.tsx +28 -10
  212. package/src/report/react/cell.tsx +2 -2
  213. package/src/report/react/chart-math.test.ts +85 -0
  214. package/src/report/react/chart-math.ts +101 -22
  215. package/src/report/react/enhance.js +89 -5
  216. package/src/report/react/fixtures.ts +114 -154
  217. package/src/report/react/index.tsx +24 -39
  218. package/src/report/react/render.test.tsx +138 -158
  219. package/src/report/react/styles.css +243 -82
  220. package/src/report/report.test.ts +779 -841
  221. package/src/report/report.ts +423 -41
  222. package/src/report/text/faces.ts +290 -193
  223. package/src/report/text/plot.ts +1 -1
  224. package/src/report/text/table.ts +44 -7
  225. package/src/report/tree.ts +362 -104
  226. package/src/report/types.ts +261 -271
  227. package/src/report/web.ts +63 -20
  228. package/src/results/annotated-source.test.ts +62 -9
  229. package/src/results/annotated-source.ts +64 -6
  230. package/src/results/attempt-evidence.test.ts +13 -11
  231. package/src/results/attempt-evidence.ts +20 -13
  232. package/src/results/attempt-source.ts +6 -3
  233. package/src/results/copy.ts +150 -60
  234. package/src/results/host-equivalence.test.ts +34 -20
  235. package/src/results/index.ts +12 -4
  236. package/src/results/locator.test.ts +1 -22
  237. package/src/results/open.ts +15 -5
  238. package/src/results/publish.ts +149 -0
  239. package/src/results/results.test.ts +89 -54
  240. package/src/results/select.ts +104 -34
  241. package/src/results/truncate.ts +90 -0
  242. package/src/results/types.ts +43 -14
  243. package/src/results/writer.ts +31 -13
  244. package/src/runner/attempt.test.ts +138 -7
  245. package/src/runner/attempt.ts +603 -104
  246. package/src/runner/discover.test.ts +47 -0
  247. package/src/runner/discover.ts +36 -2
  248. package/src/runner/eval-source.test.ts +1 -27
  249. package/src/runner/feedback/agent.test.ts +504 -0
  250. package/src/runner/feedback/agent.ts +409 -0
  251. package/src/runner/feedback/ci.test.ts +562 -0
  252. package/src/runner/feedback/ci.ts +401 -0
  253. package/src/runner/feedback/coordinator.test.ts +317 -0
  254. package/src/runner/feedback/coordinator.ts +397 -0
  255. package/src/runner/feedback/failure.ts +40 -0
  256. package/src/runner/feedback/human.test.ts +616 -0
  257. package/src/runner/feedback/human.ts +535 -0
  258. package/src/runner/feedback/index.ts +66 -0
  259. package/src/runner/feedback/io.ts +78 -0
  260. package/src/runner/feedback/profile.test.ts +50 -0
  261. package/src/runner/feedback/profile.ts +58 -0
  262. package/src/runner/feedback/reducer.test.ts +395 -0
  263. package/src/runner/feedback/reducer.ts +260 -0
  264. package/src/runner/feedback/renderer.ts +82 -0
  265. package/src/runner/feedback/sink.ts +203 -0
  266. package/src/runner/feedback/testing.ts +106 -0
  267. package/src/runner/ledger.test.ts +230 -0
  268. package/src/runner/ledger.ts +329 -0
  269. package/src/runner/report.test.ts +128 -3
  270. package/src/runner/report.ts +33 -9
  271. package/src/runner/reporters/artifacts.ts +8 -2
  272. package/src/runner/reporters/braintrust.test.ts +8 -7
  273. package/src/runner/reporters/braintrust.ts +9 -2
  274. package/src/runner/reporters/index.ts +2 -2
  275. package/src/runner/reporters/json.test.ts +162 -0
  276. package/src/runner/reporters/json.ts +35 -8
  277. package/src/runner/reporters/shared.ts +1 -5
  278. package/src/runner/run.test.ts +760 -3
  279. package/src/runner/run.ts +243 -37
  280. package/src/runner/sandbox-prep.ts +3 -42
  281. package/src/runner/timing.ts +158 -0
  282. package/src/runner/types.ts +518 -22
  283. package/src/sandbox/checkpoint.test.ts +55 -0
  284. package/src/sandbox/checkpoint.ts +29 -8
  285. package/src/sandbox/cli-commands.ts +407 -0
  286. package/src/sandbox/docker.ts +115 -16
  287. package/src/sandbox/e2b-agent-template.test.ts +56 -0
  288. package/src/sandbox/e2b-agent-template.ts +94 -0
  289. package/src/sandbox/e2b.ts +74 -9
  290. package/src/sandbox/errors.ts +111 -4
  291. package/src/sandbox/index.ts +2 -0
  292. package/src/sandbox/io-retry.test.ts +58 -0
  293. package/src/sandbox/io-retry.ts +45 -0
  294. package/src/sandbox/keep-registry.test.ts +86 -0
  295. package/src/sandbox/keep-registry.ts +142 -0
  296. package/src/sandbox/keep.ts +178 -0
  297. package/src/sandbox/paths.test.ts +1 -0
  298. package/src/sandbox/paths.ts +19 -8
  299. package/src/sandbox/registry.ts +20 -3
  300. package/src/sandbox/resolve.ts +76 -11
  301. package/src/sandbox/retry.test.ts +70 -0
  302. package/src/sandbox/retry.ts +46 -4
  303. package/src/sandbox/types.ts +44 -6
  304. package/src/sandbox/vercel.ts +43 -20
  305. package/src/scoring/collector.ts +60 -17
  306. package/src/scoring/coverage.ts +95 -0
  307. package/src/scoring/diff.ts +81 -0
  308. package/src/scoring/display.test.ts +121 -0
  309. package/src/scoring/display.ts +133 -0
  310. package/src/scoring/evidence.test.ts +189 -0
  311. package/src/scoring/judge.test.ts +142 -0
  312. package/src/scoring/judge.ts +15 -18
  313. package/src/scoring/scoped.ts +217 -50
  314. package/src/scoring/types.ts +117 -20
  315. package/src/scoring/verdict.ts +16 -4
  316. package/src/shared/aggregate.ts +8 -6
  317. package/src/shared/types.ts +31 -0
  318. package/src/show/compose.ts +50 -67
  319. package/src/show/index.ts +127 -56
  320. package/src/show/render.ts +662 -131
  321. package/src/show/report-host.test.ts +188 -0
  322. package/src/show/report-host.ts +375 -0
  323. package/src/show/show.test.ts +320 -54
  324. package/src/tty-line.ts +8 -26
  325. package/src/util.test.ts +1 -0
  326. package/src/util.ts +41 -0
  327. package/src/view/app/App.test.tsx +69 -0
  328. package/src/view/app/App.tsx +144 -48
  329. package/src/view/app/components/AttemptModal.tsx +423 -11
  330. package/src/view/app/components/CodeView.tsx +41 -14
  331. package/src/view/app/components/CopyControls.tsx +2 -2
  332. package/src/view/app/i18n.ts +37 -17
  333. package/src/view/app/lib/attempt-route.test.ts +1 -0
  334. package/src/view/app/lib/verdict.ts +7 -9
  335. package/src/view/app/main.tsx +13 -8
  336. package/src/view/app/pages/{RunsPage.tsx → AttemptsPage.tsx} +6 -6
  337. package/src/view/app/types.ts +4 -1
  338. package/src/view/artifact-serving.test.ts +2 -1
  339. package/src/view/client-dist/app.css +1 -1
  340. package/src/view/client-dist/app.js +17 -17
  341. package/src/view/data.test.ts +10 -3
  342. package/src/view/data.ts +155 -49
  343. package/src/view/index.ts +56 -41
  344. package/src/view/server.ts +37 -15
  345. package/src/view/shared/types.ts +34 -5
  346. package/src/view/styles.css +227 -0
  347. package/src/view/view-report.test.ts +167 -62
  348. package/dist/report/built-ins/experiment-comparison.d.ts +0 -1
  349. package/dist/report/built-ins/experiment-comparison.js +0 -13
  350. package/dist/report/built-ins/index.d.ts +0 -1
  351. package/dist/report/built-ins/index.js +0 -2
  352. package/dist/report/react/GroupSummary.d.ts +0 -8
  353. package/dist/report/react/GroupSummary.js +0 -8
  354. package/dist/report/react/RunOverview.d.ts +0 -8
  355. package/dist/report/react/RunOverview.js +0 -12
  356. package/docs-site/zh/example/ai-agent-application.mdx +0 -152
  357. package/docs-site/zh/example/claude-code-codex-plugin.mdx +0 -167
  358. package/docs-site/zh/example/claude-code-codex-skill.mdx +0 -152
  359. package/docs-site/zh/example/showcase.mdx +0 -39
  360. package/docs-site/zh/guides/publish-report.mdx +0 -91
  361. package/docs-site/zh/guides/sandbox-providers.mdx +0 -102
  362. package/src/report/built-in-user-parity.test.tsx +0 -640
  363. package/src/report/built-ins/experiment-comparison.tsx +0 -19
  364. package/src/report/built-ins/index.ts +0 -2
  365. package/src/report/react/GroupSummary.tsx +0 -66
  366. package/src/report/react/RunOverview.tsx +0 -109
  367. package/src/runner/reporters/console.ts +0 -70
  368. package/src/runner/reporters/live.test.ts +0 -56
  369. package/src/runner/reporters/live.ts +0 -247
  370. package/src/runner/reporters/quiet.test.ts +0 -66
  371. package/src/runner/reporters/quiet.ts +0 -49
  372. package/src/runner/reporters/table.ts +0 -277
  373. /package/docs-site/zh/{example/tier1-ai-sdk-v7.mdx → examples/integrations/ai-sdk-v7.mdx} +0 -0
  374. /package/docs-site/zh/{example/tier1-claude-sdk.mdx → examples/integrations/claude-sdk.mdx} +0 -0
  375. /package/docs-site/zh/{example/tier1-codex-sdk.mdx → examples/integrations/codex-sdk.mdx} +0 -0
  376. /package/docs-site/zh/{example/tier1-langgraph.mdx → examples/integrations/langgraph.mdx} +0 -0
  377. /package/docs-site/zh/{example/tier1-pi-sdk.mdx → examples/integrations/pi-sdk.mdx} +0 -0
  378. /package/docs-site/zh/{guides → how-to}/fixtures.mdx +0 -0
@@ -1,4 +1,4 @@
1
- // 手工 fixture:模拟计算函数(MetricTable.data / MetricMatrix.data / …)的产物。
1
+ // 手工 fixture:模拟计算函数(metricTableData / metricMatrixData / …)的产物。
2
2
  // 仅供渲染测试与 scripts/report-react-demo.tsx 使用,不从入口导出。
3
3
  // 数字刻意覆盖诚实细节:coverage 角标(samples<total)、全 null 格子、
4
4
  // 稀疏矩阵、缺数据的散点、delta 的 null 不硬算、truncated 计数。
@@ -8,12 +8,11 @@ import type {
8
8
  DeltaData,
9
9
  EvalListItem,
10
10
  ExperimentListItem,
11
- GroupSummaryData,
12
11
  LineData,
13
12
  MatrixData,
14
13
  MetricColumn,
15
- OverviewData,
16
14
  ScatterData,
15
+ ScopeSummaryData,
17
16
  ScoreboardData,
18
17
  TableData,
19
18
  } from "../types.ts";
@@ -21,67 +20,32 @@ import type { AttemptLocator } from "../../results/locator.ts";
21
20
 
22
21
  const locator = (s: string): AttemptLocator => s as AttemptLocator;
23
22
 
24
- export const passRateColumn: MetricColumn = { key: "pass-rate", label: "pass rate", unit: "%", better: "higher" };
23
+ export const passRateColumn: MetricColumn = { key: "task-pass-rate", label: "pass rate", unit: "%", better: "higher" };
25
24
  export const codeLinesColumn: MetricColumn = { key: "code-lines", label: "code lines", unit: "lines", better: "lower" };
26
25
  export const costColumn: MetricColumn = { key: "cost", label: "cost", unit: "$", better: "lower" };
27
26
 
28
- export const overviewData: OverviewData = {
29
- snapshots: [
30
- { experimentId: "compare/bub", agent: "bub", model: "gpt-5.4", startedAt: "2026-07-01T10:00:00Z" },
31
- { experimentId: "compare/codex", agent: "codex", startedAt: "2026-07-01T11:30:00Z" },
32
- ],
33
- totals: {
34
- evals: 12,
35
- attempts: 48,
36
- passed: 36,
37
- failed: 8,
38
- errored: 2,
39
- skipped: 2,
40
- // 两级聚合口径(computeCell)刻意不等于 36/(36+8+2)≈78% 的 attempt 原始占比:
41
- // 组件必须原样渲染这个字段,不得从上面四个 verdict 计票现场重算。
42
- passRate: { value: 0.7, display: "70%", samples: 46, total: 48, refs: [] },
43
- costUSD: null, // 全部 attempt 都没报成本:null,组件必须显示缺数据而不是 $0
44
- durationMs: 261_000,
45
- },
46
- warnings: [
47
- {
48
- kind: "partial-coverage",
49
- experimentId: "compare/bub",
50
- covered: 9,
51
- total: 12,
52
- message: "snapshot covers 9 of 12 evals seen in history; re-run `niceeval exp compare/bub` for a full snapshot",
53
- },
54
- ],
55
- };
56
-
57
- export const overviewWithCost: OverviewData = {
58
- ...overviewData,
59
- totals: { ...overviewData.totals, costUSD: 1.234 },
60
- warnings: [],
61
- };
62
-
63
- /** GroupSummary.data 的产物形态:eval 级折叠计票 + 旧 GroupSelector 口径的通过率(包成 MetricCell)。 */
64
- export const groupSummaryData: GroupSummaryData = {
27
+ /** scopeSummaryData 的产物形态:两级计票恒随行,成功率与总成本是官方 MetricCell。 */
28
+ export const scopeSummaryData: ScopeSummaryData = {
29
+ range: { earliestStartedAt: "2026-07-01T10:00:00Z", latestStartedAt: "2026-07-01T11:30:00Z" },
65
30
  experiments: 2,
66
- // evals = 全部 verdicts 之和(3+1+1+1=6);passRate 分母只数非 skipped 的 5 道
67
31
  evals: 6,
68
32
  attempts: 9,
69
- verdicts: { passed: 3, failed: 1, errored: 1, skipped: 1 },
70
- // 3 passed / (3 + 1 + 1) = 60%;samples=ran=5 < total=evals=6:1 道 skipped 未计入分母的覆盖率角标
71
- passRate: { value: 0.6, display: "60%", samples: 5, total: 6, refs: [] },
72
- totalCostUSD: 1.5,
73
- lastRunAt: "2026-07-01T11:30:00Z",
33
+ evalVerdicts: { passed: 3, failed: 1, errored: 1, skipped: 1 },
34
+ attemptVerdicts: { passed: 4, failed: 3, errored: 1, skipped: 1 },
35
+ // 两级聚合口径,刻意不等于任一计票的比例:组件必须原样渲染,不重算
36
+ endToEndPassRate: { value: 0.6, display: "60%", samples: 8, total: 9, refs: [] },
37
+ totalCostUSD: { value: 1.5, display: "$1.50", samples: 8, total: 9, refs: [] },
74
38
  };
75
39
 
76
- export const tableData: TableData<"pass-rate" | "code-lines"> = {
77
- dimension: "agent",
40
+ export const tableData: TableData = {
41
+ rowDimension: "agent",
78
42
  // 行顺序故意不按 passRate 排:组件必须按传入顺序渲染,不重排
79
43
  columns: [passRateColumn, codeLinesColumn],
80
44
  rows: [
81
45
  {
82
46
  key: "codex",
83
47
  cells: {
84
- "pass-rate": { value: 0.5, display: "50%", samples: 6, total: 6, refs: [] },
48
+ "task-pass-rate": { value: 0.5, display: "50%", samples: 6, total: 6, refs: [] },
85
49
  // 全 null:一个有效样本都没有 → 缺数据文案,绝不画 0
86
50
  "code-lines": { value: null, display: "—", samples: 0, total: 6, refs: [] },
87
51
  },
@@ -89,12 +53,12 @@ export const tableData: TableData<"pass-rate" | "code-lines"> = {
89
53
  {
90
54
  key: "bub",
91
55
  cells: {
92
- "pass-rate": {
56
+ "task-pass-rate": {
93
57
  value: 0.87,
94
58
  display: "87%",
95
59
  samples: 6,
96
60
  total: 6,
97
- refs: [locator("@1a0a0a0")],
61
+ refs: [locator("@1a0a0a0a")],
98
62
  },
99
63
  // samples < total:有 attempt 测不了 → 覆盖率角标 5/6
100
64
  "code-lines": { value: 120, display: "120 lines", samples: 5, total: 6, refs: [] },
@@ -103,34 +67,9 @@ export const tableData: TableData<"pass-rate" | "code-lines"> = {
103
67
  ],
104
68
  };
105
69
 
106
- /** rows: "experiment" 的榜单形态:行携带 agent/model 元信息与 eval 级折叠计票。 */
107
- export const tableDataWithMeta: TableData<"pass-rate"> = {
108
- dimension: "experiment",
109
- columns: [passRateColumn],
110
- rows: [
111
- {
112
- key: "compare/bub",
113
- cells: { "pass-rate": { value: 0.5, display: "50%", samples: 2, total: 2, refs: [] } },
114
- meta: {
115
- agent: "bub",
116
- model: "gpt-5.4",
117
- verdicts: { passed: 1, failed: 1, errored: 0, skipped: 0 },
118
- },
119
- },
120
- {
121
- key: "compare/codex",
122
- cells: { "pass-rate": { value: 1, display: "100%", samples: 2, total: 2, refs: [] } },
123
- meta: {
124
- agent: "codex",
125
- verdicts: { passed: 2, failed: 0, errored: 0, skipped: 0 },
126
- },
127
- },
128
- ],
129
- };
130
-
131
70
  export const matrixData: MatrixData = {
132
- rows: "eval",
133
- columns: "agent",
71
+ rowDimension: "eval",
72
+ columnDimension: "agent",
134
73
  metric: passRateColumn,
135
74
  // 稀疏:geometry/angles × codex 没有样本,数据里不出现 → 格子空着
136
75
  cells: [
@@ -142,7 +81,7 @@ export const matrixData: MatrixData = {
142
81
  display: "100%",
143
82
  samples: 2,
144
83
  total: 2,
145
- refs: [locator("@1b3b3b3"), locator("@1b7b7b7")],
84
+ refs: [locator("@1b3b3b3b"), locator("@1b7b7b7b")],
146
85
  },
147
86
  },
148
87
  {
@@ -159,34 +98,41 @@ export const matrixData: MatrixData = {
159
98
  };
160
99
 
161
100
  export const scoreboardData: ScoreboardData = {
162
- dimension: "agent",
101
+ rowDimension: "agent",
102
+ questions: [
103
+ "algebra/quadratic",
104
+ "algebra/simple",
105
+ "geometry/angles",
106
+ "geometry/area",
107
+ ],
163
108
  fullMarks: 100,
164
109
  weights: [{ prefix: "algebra/", weight: 2 }],
110
+ ignoredEvals: 1,
165
111
  rows: [
166
112
  {
167
113
  key: "bub",
168
- total: { value: 78.5, display: "78.5" },
114
+ // notRun 1:一题没跑、按 0 计;unscorable 0 —— 两种 0 分分开计数
115
+ total: { value: 78.5, display: "78.5", notRun: 1, unscorable: 0, refs: [locator("@1a0a0a0a")] },
169
116
  subjects: [
170
- // missing 1:一题没跑、按 0 计——固定分母的如实注脚
171
- { key: "algebra", earned: 14, possible: 16, evals: 8, missing: 1 },
172
- { key: "geometry", earned: 3, possible: 4, evals: 4, missing: 0 },
117
+ { key: "algebra", earned: 14, possible: 16, questions: 8, notRun: 1, unscorable: 0, display: "14/16 (87.5%)", refs: [] },
118
+ { key: "geometry", earned: 3, possible: 4, questions: 4, notRun: 0, unscorable: 0, display: "3/4 (75%)", refs: [] },
173
119
  ],
174
120
  },
175
121
  {
176
122
  key: "codex",
177
- total: { value: 52, display: "52" },
123
+ total: { value: 52, display: "52", notRun: 0, unscorable: 2, refs: [] },
178
124
  subjects: [
179
- { key: "algebra", earned: 9, possible: 16, evals: 8, missing: 0 },
180
- { key: "geometry", earned: 1.4, possible: 4, evals: 4, missing: 2 },
125
+ { key: "algebra", earned: 9, possible: 16, questions: 8, notRun: 0, unscorable: 0, display: "9/16 (56.3%)", refs: [] },
126
+ { key: "geometry", earned: 1.4, possible: 4, questions: 4, notRun: 0, unscorable: 2, display: "1.4/4 (35%)", refs: [] },
181
127
  ],
182
128
  },
183
129
  ],
184
130
  };
185
131
 
186
132
  export const scatterData: ScatterData = {
187
- points: "experiment",
188
- series: "agent",
189
- x: costColumn, // better: "lower" → 轴反向,便宜的一端在右
133
+ pointDimension: "experiment",
134
+ seriesDimension: "agent",
135
+ x: costColumn, // better: "lower" → 轴反向(贵在左、便宜在右);两轴都有 better → 提示「越靠右上越好」
190
136
  y: passRateColumn,
191
137
  rows: [
192
138
  {
@@ -219,82 +165,88 @@ export const scatterData: ScatterData = {
219
165
 
220
166
  export const lineData: LineData = {
221
167
  x: { key: "latencyMs", label: "Simulated latency", unit: "ms" },
222
- series: "agents",
168
+ seriesDimension: "agents",
223
169
  y: passRateColumn,
224
170
  rows: [
225
171
  {
226
- key: "ultra/agents-1-lat-100",
172
+ key: "100",
227
173
  series: "1 agents",
228
174
  x: 100,
229
175
  xDisplay: "100ms",
230
176
  y: { value: 0.4, display: "40%", samples: 6, total: 6, refs: [] },
231
177
  },
232
178
  {
233
- key: "ultra/agents-1-lat-300",
179
+ key: "300",
234
180
  series: "1 agents",
235
181
  x: 300,
236
182
  xDisplay: "300ms",
237
183
  y: { value: 0.3, display: "30%", samples: 6, total: 6, refs: [] },
238
184
  },
239
185
  {
240
- key: "ultra/agents-16-lat-100",
186
+ key: "100",
241
187
  series: "16 agents",
242
188
  x: 100,
243
189
  xDisplay: "100ms",
244
190
  y: { value: 0.8, display: "80%", samples: 6, total: 6, refs: [] },
245
191
  },
246
192
  {
247
- key: "ultra/agents-16-lat-300",
193
+ key: "300",
248
194
  series: "16 agents",
249
195
  x: 300,
250
196
  xDisplay: "300ms",
251
197
  y: { value: 0.7, display: "70%", samples: 6, total: 6, refs: [] },
252
198
  },
253
199
  {
254
- // 未声明 flag 的 experiment:作轴不画点,注脚报数
255
- key: "ultra/legacy",
200
+ // 未声明数值 flag 的 attempt:不伪造 x 值,注脚报数
201
+ key: "null",
256
202
  series: "1 agents",
257
203
  x: null,
258
- xDisplay: "",
204
+ xDisplay: "",
259
205
  y: { value: 0.5, display: "50%", samples: 6, total: 6, refs: [] },
260
206
  },
261
207
  ],
262
208
  };
263
209
 
264
- export const deltaData: DeltaData<"pass-rate" | "cost"> = {
210
+ export const deltaData: DeltaData = {
211
+ byDimension: "experiment",
265
212
  columns: [passRateColumn, costColumn],
266
213
  rows: [
267
214
  {
268
- key: "bub",
269
- a: { experimentId: "compare/bub" },
270
- b: { experimentId: "compare/bub--agents-md" },
215
+ key: "compare/bub → compare/bub--agents-md",
216
+ label: "bub",
217
+ a: { key: "compare/bub" },
218
+ b: { key: "compare/bub--agents-md" },
271
219
  cells: {
272
- // 通过率 +12pp:better higher → (绿)
273
- "pass-rate": {
220
+ // 通过率 +12pp:better higher → improved(绿)
221
+ "task-pass-rate": {
274
222
  a: { value: 0.5, display: "50%", samples: 6, total: 6, refs: [] },
275
223
  b: { value: 0.62, display: "62%", samples: 6, total: 6, refs: [] },
276
224
  delta: 0.12,
277
225
  display: "+12pp",
226
+ outcome: "improved",
278
227
  },
279
- // 成本 +$0.15:better lower → (红)
228
+ // 成本 +$0.15:better lower → regressed(红)
280
229
  cost: {
281
230
  a: { value: 0.2, display: "$0.20", samples: 6, total: 6, refs: [] },
282
231
  b: { value: 0.35, display: "$0.35", samples: 6, total: 6, refs: [] },
283
232
  delta: 0.15,
284
233
  display: "+$0.15",
234
+ outcome: "regressed",
285
235
  },
286
236
  },
287
237
  },
288
238
  {
289
- key: "codex",
290
- a: { experimentId: "compare/codex" },
291
- b: { experimentId: "compare/codex--agents-md" },
239
+ key: "compare/codex → compare/codex--agents-md",
240
+ label: "codex",
241
+ a: { key: "compare/codex" },
242
+ b: { key: "compare/codex--agents-md" },
292
243
  cells: {
293
- "pass-rate": {
244
+ "task-pass-rate": {
294
245
  a: { value: 0.4, display: "40%", samples: 6, total: 6, refs: [] },
295
246
  b: { value: 0.4, display: "40%", samples: 6, total: 6, refs: [] },
296
247
  delta: 0,
297
248
  display: "±0",
249
+ outcome: "unchanged",
298
250
  },
299
251
  // A 侧缺数据 → delta null:显示缺,不硬算
300
252
  cost: {
@@ -302,6 +254,7 @@ export const deltaData: DeltaData<"pass-rate" | "cost"> = {
302
254
  b: { value: 0.3, display: "$0.30", samples: 6, total: 6, refs: [] },
303
255
  delta: null,
304
256
  display: "—",
257
+ outcome: "unavailable",
305
258
  },
306
259
  },
307
260
  },
@@ -312,66 +265,75 @@ export const deltaData: DeltaData<"pass-rate" | "cost"> = {
312
265
 
313
266
  /** algebra/quadratic 在 compare/bub 上失败的那次 attempt——两条子失败夹具共用同一条。 */
314
267
  const failedAttempt: AttemptListItem = {
315
- evalId: "algebra/quadratic",
316
268
  experimentId: "compare/bub",
269
+ evalId: "algebra/quadratic",
317
270
  attempt: 3,
318
271
  agent: "bub",
319
272
  verdict: "failed",
320
- assertions: [
321
- {
322
- name: "roots-correct",
323
- severity: "gate",
324
- score: 0,
325
- passed: false,
326
- detail: "expected x=2, got x=3",
327
- evidence: "judge: sign flipped when substituting into the quadratic formula",
328
- },
329
- ],
273
+ // 已按 Scoring display 契约折好的单行摘要;渲染面只做宽度截断,不重算
274
+ failureSummary: "gate: roots-correct · expected x=2 · received x=3",
275
+ moreFailures: 1,
276
+ examScore: { value: 0, display: "0%", samples: 1, total: 1, refs: [locator("@1a4a4a4a")] },
330
277
  durationMs: 32_000,
331
278
  costUSD: 0.12,
332
- locator: locator("@1a4a4a4"),
279
+ locator: locator("@1a4a4a4a"),
333
280
  };
334
281
 
335
282
  const erroredAttempt: AttemptListItem = {
336
- evalId: "geometry/angles",
337
283
  experimentId: "compare/codex",
284
+ evalId: "geometry/angles",
338
285
  attempt: 0,
339
286
  agent: "codex",
340
287
  verdict: "errored",
341
- error: "TypeError: cannot read properties of undefined (reading 'foo')",
342
- assertions: [],
288
+ // errored:结构化 error 的一层摘要(phase · code · message)
289
+ failureSummary: "eval.run · unexpected-error · TypeError: cannot read properties of undefined (reading 'foo')",
290
+ moreFailures: 0,
291
+ examScore: { value: 0, display: "0%", samples: 1, total: 1, refs: [locator("@1c1c1c1c")] },
343
292
  durationMs: 4_500,
344
- locator: locator("@1c1c1c1"),
293
+ costUSD: null,
294
+ locator: locator("@1c1c1c1c"),
345
295
  };
346
296
 
347
297
  const failedRetryAttempt: AttemptListItem = {
348
298
  ...failedAttempt,
349
299
  attempt: 4,
350
300
  durationMs: 35_000,
351
- locator: locator("@1b5b5b5"),
301
+ locator: locator("@1b5b5b5b"),
302
+ };
303
+
304
+ const passedAttempt: AttemptListItem = {
305
+ experimentId: "compare/bub",
306
+ evalId: "algebra/simple",
307
+ attempt: 0,
308
+ agent: "bub",
309
+ verdict: "passed",
310
+ failureSummary: null,
311
+ moreFailures: 0,
312
+ examScore: { value: 1, display: "100%", samples: 1, total: 1, refs: [locator("@1d2d2d2d")] },
313
+ durationMs: 5_000,
314
+ costUSD: 0.02,
315
+ locator: locator("@1d2d2d2d"),
352
316
  };
353
317
 
354
318
  export const attemptListItems: AttemptListItem[] = [failedAttempt, erroredAttempt];
355
319
 
356
320
  export const evalListItems: EvalListItem[] = [
357
321
  {
358
- evalId: "algebra/quadratic",
359
322
  experimentId: "compare/bub",
323
+ evalId: "algebra/quadratic",
360
324
  verdict: "failed",
361
- reason: "roots-correct: expected x=2, got x=3",
362
- score: { value: 0, display: "0%", samples: 1, total: 1, refs: [failedAttempt.locator] },
363
- duration: { value: 32_000, display: "32.0s", samples: 1, total: 1, refs: [failedAttempt.locator] },
364
- cost: { value: 0.12, display: "$0.12", samples: 1, total: 1, refs: [failedAttempt.locator] },
325
+ examScore: { value: 0, display: "0%", samples: 1, total: 1, refs: [failedAttempt.locator] },
326
+ durationMs: { value: 32_000, display: "32.0s", samples: 1, total: 1, refs: [failedAttempt.locator] },
327
+ costUSD: { value: 0.12, display: "$0.12", samples: 1, total: 1, refs: [failedAttempt.locator] },
365
328
  attempts: [failedAttempt],
366
329
  },
367
330
  {
368
- evalId: "geometry/angles",
369
331
  experimentId: "compare/codex",
332
+ evalId: "geometry/angles",
370
333
  verdict: "errored",
371
- reason: erroredAttempt.error,
372
- score: { value: 0, display: "0%", samples: 1, total: 1, refs: [erroredAttempt.locator] },
373
- duration: { value: 4_500, display: "4.5s", samples: 1, total: 1, refs: [erroredAttempt.locator] },
374
- cost: { value: null, display: "—", samples: 0, total: 1, refs: [] },
334
+ examScore: { value: 0, display: "0%", samples: 1, total: 1, refs: [erroredAttempt.locator] },
335
+ durationMs: { value: 4_500, display: "4.5s", samples: 1, total: 1, refs: [erroredAttempt.locator] },
336
+ costUSD: { value: null, display: "", samples: 0, total: 1, refs: [] },
375
337
  attempts: [erroredAttempt],
376
338
  },
377
339
  ];
@@ -382,10 +344,10 @@ export const experimentListItems: ExperimentListItem[] = [
382
344
  agent: "bub",
383
345
  model: "gpt-5.4",
384
346
  flags: { memory: true },
385
- verdicts: { passed: 1, failed: 1, errored: 0, skipped: 0 },
386
- passRate: { value: 0.5, display: "50%", samples: 2, total: 2, refs: [] },
387
- cost: { value: 0.12, display: "$0.12", samples: 1, total: 2, refs: [failedAttempt.locator] },
388
- duration: { value: 32_000, display: "32.0s", samples: 2, total: 2, refs: [] },
347
+ evalVerdicts: { passed: 1, failed: 1, errored: 0, skipped: 0 },
348
+ endToEndPassRate: { value: 0.5, display: "50%", samples: 2, total: 2, refs: [] },
349
+ costUSD: { value: 0.12, display: "$0.12", samples: 1, total: 2, refs: [failedAttempt.locator] },
350
+ durationMs: { value: 32_000, display: "32.0s", samples: 2, total: 2, refs: [] },
389
351
  tokens: { value: null, display: "—", samples: 0, total: 2, refs: [] },
390
352
  evals: 2,
391
353
  attempts: 3,
@@ -394,27 +356,26 @@ export const experimentListItems: ExperimentListItem[] = [
394
356
  {
395
357
  evalId: "algebra/quadratic",
396
358
  verdict: "failed",
397
- reason: "roots-correct: expected x=2, got x=3",
398
- duration: { value: 32_000, display: "32.0s", samples: 1, total: 1, refs: [failedAttempt.locator] },
399
- cost: { value: 0.12, display: "$0.12", samples: 1, total: 1, refs: [failedAttempt.locator] },
359
+ durationMs: { value: 32_000, display: "32.0s", samples: 1, total: 1, refs: [failedAttempt.locator] },
360
+ costUSD: { value: 0.12, display: "$0.12", samples: 1, total: 1, refs: [failedAttempt.locator] },
400
361
  attempts: [failedAttempt, failedRetryAttempt],
401
362
  },
402
363
  {
403
364
  evalId: "algebra/simple",
404
365
  verdict: "passed",
405
- duration: { value: 5_000, display: "5.0s", samples: 1, total: 1, refs: [] },
406
- cost: { value: 0.02, display: "$0.02", samples: 1, total: 1, refs: [] },
407
- attempts: [],
366
+ durationMs: { value: 5_000, display: "5.0s", samples: 1, total: 1, refs: [] },
367
+ costUSD: { value: 0.02, display: "$0.02", samples: 1, total: 1, refs: [] },
368
+ attempts: [passedAttempt],
408
369
  },
409
370
  ],
410
371
  },
411
372
  {
412
373
  experimentId: "compare/codex",
413
374
  agent: "codex",
414
- verdicts: { passed: 0, failed: 0, errored: 1, skipped: 0 },
415
- passRate: { value: 0, display: "0%", samples: 1, total: 1, refs: [] },
416
- cost: { value: null, display: "—", samples: 0, total: 1, refs: [] },
417
- duration: { value: 4_500, display: "4.5s", samples: 1, total: 1, refs: [] },
375
+ evalVerdicts: { passed: 0, failed: 0, errored: 1, skipped: 0 },
376
+ endToEndPassRate: { value: 0, display: "0%", samples: 1, total: 1, refs: [] },
377
+ costUSD: { value: null, display: "—", samples: 0, total: 1, refs: [] },
378
+ durationMs: { value: 4_500, display: "4.5s", samples: 1, total: 1, refs: [] },
418
379
  tokens: { value: null, display: "—", samples: 0, total: 1, refs: [] },
419
380
  evals: 1,
420
381
  attempts: 1,
@@ -423,9 +384,8 @@ export const experimentListItems: ExperimentListItem[] = [
423
384
  {
424
385
  evalId: "geometry/angles",
425
386
  verdict: "errored",
426
- reason: erroredAttempt.error,
427
- duration: { value: 4_500, display: "4.5s", samples: 1, total: 1, refs: [erroredAttempt.locator] },
428
- cost: { value: null, display: "—", samples: 0, total: 1, refs: [] },
387
+ durationMs: { value: 4_500, display: "4.5s", samples: 1, total: 1, refs: [erroredAttempt.locator] },
388
+ costUSD: { value: null, display: "", samples: 0, total: 1, refs: [] },
429
389
  attempts: [erroredAttempt],
430
390
  },
431
391
  ],
@@ -1,40 +1,25 @@
1
- // niceeval/report/react —— 零件复用的导出点:把某一块指标表嵌进已有内部面板时从这里
2
- // import。导出的组件与 niceeval/report 是同一批双面组件(web 面即 React 渲染,零 IO、
3
- // 可进 "use client",不 hydrate 也完整),都带自己的 data 计算函数;那是零件的复用,
4
- // 不是另一套报告系统 —— 报告的家在官方宿主(--report)。
1
+ // niceeval/report/react —— 纯 web 渲染面的导出点:把某一块指标表嵌进已有 React 页面时
2
+ // 从这里 import。组件只收算好的可序列化 `data`(data 形态),不含任何读盘 / artifact
3
+ // 计算代码;计算函数、spec 形态与组合组件只住在 niceeval/report。
5
4
  //
6
5
  // 契约:
7
6
  // - 组件只认「算好的可序列化数据」:零 hooks、零数据操作;
8
7
  // - 样式随包发布:配套 ./styles.css(nre-* 稳定类名),使用者在其后加载覆盖即可;
8
+ // - 渐进增强脚本 ./enhance.js 可选加载,初始静态 HTML 无 JS 完整可读;
9
9
  // - 跨块配色一致:维度键 → 稳定散列 → 固定调色板下标(colors.ts)。
10
10
 
11
- export {
12
- AttemptList,
13
- DeltaTable,
14
- EvalList,
15
- ExperimentList,
16
- GroupSummary,
17
- MetricBars,
18
- MetricLine,
19
- MetricMatrix,
20
- MetricScatter,
21
- MetricTable,
22
- RunOverview,
23
- Scoreboard,
24
- } from "../components.tsx";
25
- export type {
26
- AttemptListProps,
27
- DeltaTableProps,
28
- EvalListProps,
29
- ExperimentListProps,
30
- GroupSummaryProps,
31
- MetricLineProps,
32
- MetricMatrixProps,
33
- MetricScatterProps,
34
- MetricTableProps,
35
- RunOverviewProps,
36
- ScoreboardProps,
37
- } from "../components.tsx";
11
+ export { AttemptList } from "./AttemptList.tsx";
12
+ export { EvalList } from "./EvalList.tsx";
13
+ export { ExperimentList } from "./ExperimentList.tsx";
14
+ export { ScopeSummary } from "./ScopeSummary.tsx";
15
+ export { ExperimentComparisonView as ExperimentComparison } from "./ExperimentComparison.tsx";
16
+ export { MetricTable } from "./MetricTable.tsx";
17
+ export { MetricMatrix } from "./MetricMatrix.tsx";
18
+ export { MetricBars } from "./MetricBars.tsx";
19
+ export { MetricScatter } from "./MetricScatter.tsx";
20
+ export { MetricLine } from "./MetricLine.tsx";
21
+ export { DeltaTable } from "./DeltaTable.tsx";
22
+ export { Scoreboard } from "./Scoreboard.tsx";
38
23
 
39
24
  // 数据契约类型(家在 ../types.ts,「算」与「画」两侧共用同一份)
40
25
  export type {
@@ -42,25 +27,25 @@ export type {
42
27
  AttemptLocator,
43
28
  DeltaData,
44
29
  EvalListItem,
30
+ ExperimentComparisonData,
31
+ ExperimentComparisonGroupData,
45
32
  ExperimentListEvalRow,
46
33
  ExperimentListItem,
47
- GroupSummaryData,
48
- LineAxis,
49
34
  LineData,
50
35
  MatrixData,
51
36
  MetricCell,
52
37
  MetricColumn,
53
- OverviewData,
54
38
  ScatterData,
39
+ ScopeSummaryData,
40
+ ScopeWarning,
55
41
  ScoreboardData,
56
- SelectionWarning,
57
42
  TableData,
58
- TableRowMeta,
43
+ VerdictTally,
59
44
  } from "../types.ts";
60
45
 
61
- // locale(官方组件 chrome 文案;指标 label 的按 locale 字典也用它解析)
62
- export { DEFAULT_REPORT_LOCALE, resolveMetricLabel } from "../locale.ts";
63
- export type { LocalizedLabel, ReportLocale } from "../locale.ts";
46
+ // locale(官方组件 chrome 文案;LocalizedText 的按 locale 解析也用它)
47
+ export { DEFAULT_REPORT_LOCALE, resolveLocalizedText, resolveMetricLabel } from "../locale.ts";
48
+ export type { LocalizedText, ReportLocale } from "../locale.ts";
64
49
 
65
50
  // 稳定配色(自定义组件想与官方组件同键同色时用;seriesClassForKey 配 CSS 的 --nre-series)
66
51
  export { NRE_PALETTE, colorClassForKey, colorHexForKey, colorIndexForKey, seriesClassForKey } from "./colors.ts";