niceeval 0.13.3 → 0.13.4-canary.39

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 (487) hide show
  1. package/INDEX.md +5 -5
  2. package/dist/agents/index.cjs +2 -2
  3. package/dist/agents/index.cjs.map +1 -1
  4. package/dist/agents/project.json +6 -0
  5. package/dist/agents/streaming.cjs.map +1 -1
  6. package/dist/agents/types.cjs.map +1 -1
  7. package/dist/agents/types.d.cts +1 -1
  8. package/dist/agents/types.d.mts +1 -1
  9. package/dist/agents/types.d.ts +1 -1
  10. package/dist/analysis/bindings.d.cts +8 -8
  11. package/dist/analysis/bindings.d.mts +8 -8
  12. package/dist/analysis/bindings.d.ts +8 -8
  13. package/dist/analysis/contracts.cjs.map +1 -1
  14. package/dist/analysis/contracts.d.cts +8 -19
  15. package/dist/analysis/contracts.d.mts +8 -19
  16. package/dist/analysis/contracts.d.ts +8 -19
  17. package/dist/analysis/experiment-groups.cjs +7 -14
  18. package/dist/analysis/experiment-groups.cjs.map +1 -1
  19. package/dist/analysis/index.cjs.map +1 -1
  20. package/dist/analysis/index.d.cts +1 -1
  21. package/dist/analysis/index.d.mts +1 -1
  22. package/dist/analysis/index.d.ts +1 -1
  23. package/dist/cli/application.cjs +4 -13
  24. package/dist/cli/application.cjs.map +1 -1
  25. package/dist/cli/application.d.cts +62 -59
  26. package/dist/cli/application.d.mts +62 -59
  27. package/dist/cli/application.d.ts +62 -59
  28. package/dist/cli/application.js +6 -12
  29. package/dist/cli/bootstrap.cjs +28 -2
  30. package/dist/cli/bootstrap.cjs.map +1 -1
  31. package/dist/cli/contribution.cjs +185 -0
  32. package/dist/cli/contribution.cjs.map +1 -0
  33. package/dist/cli/contribution.d.cts +55 -0
  34. package/dist/cli/contribution.d.mts +55 -0
  35. package/dist/cli/contribution.d.ts +55 -0
  36. package/dist/cli/contribution.js +20 -0
  37. package/dist/cli/contribution.js.map +1 -0
  38. package/dist/cli/node-application.cjs +119 -87
  39. package/dist/cli/node-application.cjs.map +1 -1
  40. package/dist/cli/node-application.d.cts +2 -8
  41. package/dist/cli/node-application.d.mts +2 -8
  42. package/dist/cli/node-application.d.ts +2 -8
  43. package/dist/cli/node-application.js +12 -22
  44. package/dist/cli/program.cjs +87 -2756
  45. package/dist/cli/program.cjs.map +1 -1
  46. package/dist/cli/program.d.cts +11 -332
  47. package/dist/cli/program.d.mts +11 -332
  48. package/dist/cli/program.d.ts +11 -332
  49. package/dist/cli/program.js +4 -28
  50. package/dist/cli.cjs +0 -3
  51. package/dist/cli.cjs.map +1 -1
  52. package/dist/cli.d.cts +0 -1
  53. package/dist/cli.d.mts +0 -1
  54. package/dist/cli.d.ts +0 -1
  55. package/dist/cli.js +6 -14
  56. package/dist/define.cjs +1 -1
  57. package/dist/define.cjs.map +1 -1
  58. package/dist/docker/cache-administration.cjs +8 -0
  59. package/dist/docker/cache-administration.cjs.map +1 -0
  60. package/dist/docker/cache-administration.d.cts +33 -0
  61. package/dist/docker/cache-administration.d.mts +33 -0
  62. package/dist/docker/cache-administration.d.ts +33 -0
  63. package/dist/docker/cache-administration.js +6 -0
  64. package/dist/docker/cache-administration.js.map +1 -0
  65. package/dist/docker/cache-live.cjs +27 -0
  66. package/dist/docker/cache-live.cjs.map +1 -0
  67. package/dist/docker/cache-live.d.cts +3 -0
  68. package/dist/docker/cache-live.d.mts +3 -0
  69. package/dist/docker/cache-live.d.ts +3 -0
  70. package/dist/docker/cache-live.js +6 -0
  71. package/dist/docker/cache-live.js.map +1 -0
  72. package/dist/docker/cli/contribution.cjs +223 -0
  73. package/dist/docker/cli/contribution.cjs.map +1 -0
  74. package/dist/docker/cli/contribution.d.cts +48 -0
  75. package/dist/docker/cli/contribution.d.mts +48 -0
  76. package/dist/docker/cli/contribution.d.ts +48 -0
  77. package/dist/docker/cli/contribution.js +8 -0
  78. package/dist/docker/cli/contribution.js.map +1 -0
  79. package/dist/eval/cli/contribution.cjs +62 -0
  80. package/dist/eval/cli/contribution.cjs.map +1 -0
  81. package/dist/eval/cli/contribution.d.cts +21 -0
  82. package/dist/eval/cli/contribution.d.mts +21 -0
  83. package/dist/eval/cli/contribution.d.ts +21 -0
  84. package/dist/eval/cli/contribution.js +8 -0
  85. package/dist/eval/cli/contribution.js.map +1 -0
  86. package/dist/eval/host/index.cjs +23 -0
  87. package/dist/eval/host/index.cjs.map +1 -0
  88. package/dist/eval/host/index.d.cts +27 -0
  89. package/dist/eval/host/index.d.mts +27 -0
  90. package/dist/eval/host/index.d.ts +27 -0
  91. package/dist/eval/host/index.js +8 -0
  92. package/dist/eval/host/index.js.map +1 -0
  93. package/dist/eval/host/index.mjs +8 -0
  94. package/dist/eval/host/index.mjs.map +1 -0
  95. package/dist/experiment/host/cli/contribution.cjs +835 -0
  96. package/dist/experiment/host/cli/contribution.cjs.map +1 -0
  97. package/dist/experiment/host/cli/contribution.d.cts +329 -0
  98. package/dist/experiment/host/cli/contribution.d.mts +329 -0
  99. package/dist/experiment/host/cli/contribution.d.ts +329 -0
  100. package/dist/experiment/host/cli/contribution.js +22 -0
  101. package/dist/experiment/host/cli/contribution.js.map +1 -0
  102. package/dist/experiment/host/cli/index.cjs +9 -0
  103. package/dist/experiment/host/cli/index.cjs.map +1 -0
  104. package/dist/experiment/host/cli/index.d.cts +2 -0
  105. package/dist/experiment/host/cli/index.d.mts +2 -0
  106. package/dist/experiment/host/cli/index.d.ts +2 -0
  107. package/dist/experiment/host/cli/index.js +10 -0
  108. package/dist/experiment/host/cli/index.js.map +1 -0
  109. package/dist/experiment/host/cli/terminal.cjs +15 -0
  110. package/dist/experiment/host/cli/terminal.cjs.map +1 -0
  111. package/dist/experiment/host/cli/terminal.d.cts +14 -0
  112. package/dist/experiment/host/cli/terminal.d.mts +14 -0
  113. package/dist/experiment/host/cli/terminal.d.ts +14 -0
  114. package/dist/experiment/host/cli/terminal.js +8 -0
  115. package/dist/experiment/host/cli/terminal.js.map +1 -0
  116. package/dist/experiment/host/index.cjs +35 -58
  117. package/dist/experiment/host/index.cjs.map +1 -1
  118. package/dist/experiment/host/index.d.cts +5 -79
  119. package/dist/experiment/host/index.d.mts +5 -79
  120. package/dist/experiment/host/index.d.ts +5 -79
  121. package/dist/experiment/host/index.js +4 -2
  122. package/dist/experiment/host/index.mjs +4 -2
  123. package/dist/experiment/host/operations.cjs +678 -0
  124. package/dist/experiment/host/operations.cjs.map +1 -0
  125. package/dist/experiment/host/operations.d.cts +19 -0
  126. package/dist/experiment/host/operations.d.mts +19 -0
  127. package/dist/experiment/host/operations.d.ts +19 -0
  128. package/dist/experiment/host/operations.js +24 -0
  129. package/dist/experiment/host/operations.js.map +1 -0
  130. package/dist/experiment/host/presentation.cjs +81 -0
  131. package/dist/experiment/host/presentation.cjs.map +1 -0
  132. package/dist/experiment/host/presentation.d.cts +9 -0
  133. package/dist/experiment/host/presentation.d.mts +9 -0
  134. package/dist/experiment/host/presentation.d.ts +9 -0
  135. package/dist/experiment/host/presentation.js +8 -0
  136. package/dist/experiment/host/presentation.js.map +1 -0
  137. package/dist/experiment/host/teardown.cjs +394 -0
  138. package/dist/experiment/host/teardown.cjs.map +1 -0
  139. package/dist/experiment/host/teardown.d.cts +5 -0
  140. package/dist/experiment/host/teardown.d.mts +5 -0
  141. package/dist/experiment/host/teardown.d.ts +5 -0
  142. package/dist/experiment/host/teardown.js +8 -0
  143. package/dist/experiment/host/teardown.js.map +1 -0
  144. package/dist/experiment/host/types.cjs +9 -0
  145. package/dist/experiment/host/types.cjs.map +1 -0
  146. package/dist/experiment/host/types.d.cts +423 -0
  147. package/dist/experiment/host/types.d.mts +423 -0
  148. package/dist/experiment/host/types.d.ts +423 -0
  149. package/dist/experiment/host/types.js +6 -0
  150. package/dist/experiment/host/types.js.map +1 -0
  151. package/dist/i18n/en.cjs +8 -50
  152. package/dist/i18n/en.cjs.map +1 -1
  153. package/dist/i18n/en.d.cts +2 -6
  154. package/dist/i18n/en.d.mts +2 -6
  155. package/dist/i18n/en.d.ts +2 -6
  156. package/dist/o11y/project.json +6 -0
  157. package/dist/project/cli/contribution.cjs +66 -0
  158. package/dist/project/cli/contribution.cjs.map +1 -0
  159. package/dist/project/cli/contribution.d.cts +17 -0
  160. package/dist/project/cli/contribution.d.mts +17 -0
  161. package/dist/project/cli/contribution.d.ts +17 -0
  162. package/dist/project/cli/contribution.js +8 -0
  163. package/dist/project/cli/contribution.js.map +1 -0
  164. package/dist/project/cli/index.cjs +7 -0
  165. package/dist/project/cli/index.cjs.map +1 -0
  166. package/dist/project/cli/index.d.cts +1 -0
  167. package/dist/project/cli/index.d.mts +1 -0
  168. package/dist/project/cli/index.d.ts +1 -0
  169. package/dist/project/cli/index.js +8 -0
  170. package/dist/project/cli/index.js.map +1 -0
  171. package/dist/project/host/index.cjs +11 -0
  172. package/dist/project/host/index.cjs.map +1 -0
  173. package/dist/project/host/index.d.cts +4 -0
  174. package/dist/project/host/index.d.mts +4 -0
  175. package/dist/project/host/index.d.ts +4 -0
  176. package/dist/project/host/index.js +14 -0
  177. package/dist/project/host/index.js.map +1 -0
  178. package/dist/project/host/index.mjs +14 -0
  179. package/dist/project/host/index.mjs.map +1 -0
  180. package/dist/project/host.cjs +59 -0
  181. package/dist/project/host.cjs.map +1 -0
  182. package/dist/project/host.d.cts +17 -0
  183. package/dist/project/host.d.mts +17 -0
  184. package/dist/project/host.d.ts +17 -0
  185. package/dist/project/host.js +6 -0
  186. package/dist/project/host.js.map +1 -0
  187. package/dist/project/index.cjs +11 -0
  188. package/dist/project/index.cjs.map +1 -0
  189. package/dist/project/index.d.cts +4 -0
  190. package/dist/project/index.d.mts +4 -0
  191. package/dist/project/index.d.ts +4 -0
  192. package/dist/project/index.js +14 -0
  193. package/dist/project/index.js.map +1 -0
  194. package/dist/project/node.cjs +91 -0
  195. package/dist/project/node.cjs.map +1 -0
  196. package/dist/project/node.d.cts +6 -0
  197. package/dist/project/node.d.mts +6 -0
  198. package/dist/project/node.d.ts +6 -0
  199. package/dist/project/node.js +12 -0
  200. package/dist/project/node.js.map +1 -0
  201. package/dist/project/services.cjs +17 -0
  202. package/dist/project/services.cjs.map +1 -0
  203. package/dist/project/services.d.cts +47 -0
  204. package/dist/project/services.d.mts +47 -0
  205. package/dist/project/services.d.ts +47 -0
  206. package/dist/project/services.js +12 -0
  207. package/dist/project/services.js.map +1 -0
  208. package/dist/project/templates.cjs +28 -0
  209. package/dist/project/templates.cjs.map +1 -0
  210. package/dist/project/templates.d.cts +4 -0
  211. package/dist/project/templates.d.mts +4 -0
  212. package/dist/project/templates.d.ts +4 -0
  213. package/dist/project/templates.js +12 -0
  214. package/dist/project/templates.js.map +1 -0
  215. package/dist/project.json +6 -0
  216. package/dist/record/family/catalog.d.cts +10 -10
  217. package/dist/record/family/catalog.d.mts +10 -10
  218. package/dist/record/family/catalog.d.ts +10 -10
  219. package/dist/record/family/file-changes.d.cts +8 -8
  220. package/dist/record/family/file-changes.d.mts +8 -8
  221. package/dist/record/family/file-changes.d.ts +8 -8
  222. package/dist/record/host/cli/contribution.cjs +206 -0
  223. package/dist/record/host/cli/contribution.cjs.map +1 -0
  224. package/dist/record/host/cli/contribution.d.cts +32 -0
  225. package/dist/record/host/cli/contribution.d.mts +32 -0
  226. package/dist/record/host/cli/contribution.d.ts +32 -0
  227. package/dist/record/host/cli/contribution.js +10 -0
  228. package/dist/record/host/cli/contribution.js.map +1 -0
  229. package/dist/record/host/cli/index.cjs +8 -0
  230. package/dist/record/host/cli/index.cjs.map +1 -0
  231. package/dist/record/host/cli/index.d.cts +1 -0
  232. package/dist/record/host/cli/index.d.mts +1 -0
  233. package/dist/record/host/cli/index.d.ts +1 -0
  234. package/dist/record/host/cli/index.js +10 -0
  235. package/dist/record/host/cli/index.js.map +1 -0
  236. package/dist/record/host/cli/presentation.cjs +122 -0
  237. package/dist/record/host/cli/presentation.cjs.map +1 -0
  238. package/dist/record/host/cli/presentation.d.cts +7 -0
  239. package/dist/record/host/cli/presentation.d.mts +7 -0
  240. package/dist/record/host/cli/presentation.d.ts +7 -0
  241. package/dist/record/host/cli/presentation.js +12 -0
  242. package/dist/record/host/cli/presentation.js.map +1 -0
  243. package/dist/record/host/index.cjs.map +1 -1
  244. package/dist/record/host/index.d.cts +1 -1
  245. package/dist/record/host/index.d.mts +1 -1
  246. package/dist/record/host/index.d.ts +1 -1
  247. package/dist/record/host/runtime.cjs +184 -1
  248. package/dist/record/host/runtime.cjs.map +1 -1
  249. package/dist/record/host/types.cjs.map +1 -1
  250. package/dist/record/host/types.d.cts +120 -0
  251. package/dist/record/host/types.d.mts +120 -0
  252. package/dist/record/host/types.d.ts +120 -0
  253. package/dist/record/project.json +6 -0
  254. package/dist/report/assets/styles.css +80 -0
  255. package/dist/report/cli/contribution.cjs +325 -0
  256. package/dist/report/cli/contribution.cjs.map +1 -0
  257. package/dist/report/cli/contribution.d.cts +143 -0
  258. package/dist/report/cli/contribution.d.mts +143 -0
  259. package/dist/report/cli/contribution.d.ts +143 -0
  260. package/dist/report/cli/contribution.js +12 -0
  261. package/dist/report/cli/contribution.js.map +1 -0
  262. package/dist/report/client-dist/app.js +9 -9
  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 +5 -0
  266. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  267. package/dist/report/components/entity-lists/compute.d.cts +2 -0
  268. package/dist/report/components/entity-lists/compute.d.mts +2 -0
  269. package/dist/report/components/entity-lists/compute.d.ts +2 -0
  270. package/dist/report/components/entity-lists/content.cjs +35 -12
  271. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  272. package/dist/report/components/entity-lists/index.cjs +0 -3
  273. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  274. package/dist/report/components/summaries/index.cjs +2 -4
  275. package/dist/report/components/summaries/index.cjs.map +1 -1
  276. package/dist/report/definition/cell.cjs +7 -2
  277. package/dist/report/definition/cell.cjs.map +1 -1
  278. package/dist/report/definition/cell.d.cts +2 -0
  279. package/dist/report/definition/cell.d.mts +2 -0
  280. package/dist/report/definition/cell.d.ts +2 -0
  281. package/dist/report/definition/primitives/assertion-evidence.cjs +190 -4
  282. package/dist/report/definition/primitives/assertion-evidence.cjs.map +1 -1
  283. package/dist/report/definition/primitives/assertion-evidence.d.cts +4 -0
  284. package/dist/report/definition/primitives/assertion-evidence.d.mts +4 -0
  285. package/dist/report/definition/primitives/assertion-evidence.d.ts +4 -0
  286. package/dist/report/execution/machine.cjs +2 -3
  287. package/dist/report/execution/machine.cjs.map +1 -1
  288. package/dist/report/execution/machine.d.cts +11 -8
  289. package/dist/report/execution/machine.d.mts +11 -8
  290. package/dist/report/execution/machine.d.ts +11 -8
  291. package/dist/report/host/from-record.cjs +13 -8
  292. package/dist/report/host/from-record.cjs.map +1 -1
  293. package/dist/report/host/index.cjs +5 -1
  294. package/dist/report/host/index.cjs.map +1 -1
  295. package/dist/report/host/index.d.cts +1 -0
  296. package/dist/report/host/index.d.mts +1 -0
  297. package/dist/report/host/index.d.ts +1 -0
  298. package/dist/report/host/index.js +8 -2
  299. package/dist/report/host/index.mjs +8 -2
  300. package/dist/report/host/machine.cjs +23 -22
  301. package/dist/report/host/machine.cjs.map +1 -1
  302. package/dist/report/host/machine.d.cts +1 -1
  303. package/dist/report/host/machine.d.mts +1 -1
  304. package/dist/report/host/machine.d.ts +1 -1
  305. package/dist/report/host/node/loader.cjs +4 -2
  306. package/dist/report/host/node/loader.cjs.map +1 -1
  307. package/dist/report/host/node/loader.d.cts +3 -1
  308. package/dist/report/host/node/loader.d.mts +3 -1
  309. package/dist/report/host/node/loader.d.ts +3 -1
  310. package/dist/report/host/node.cjs +44 -9
  311. package/dist/report/host/node.cjs.map +1 -1
  312. package/dist/report/host/node.d.cts +13 -3
  313. package/dist/report/host/node.d.mts +13 -3
  314. package/dist/report/host/node.d.ts +13 -3
  315. package/dist/report/host/node.js +44 -32
  316. package/dist/report/host/operations.cjs +14 -0
  317. package/dist/report/host/operations.cjs.map +1 -0
  318. package/dist/report/host/operations.d.cts +39 -0
  319. package/dist/report/host/operations.d.mts +39 -0
  320. package/dist/report/host/operations.d.ts +39 -0
  321. package/dist/report/host/operations.js +10 -0
  322. package/dist/report/host/operations.js.map +1 -0
  323. package/dist/report/model/chart/plot.cjs +1 -1
  324. package/dist/report/model/chart/plot.cjs.map +1 -1
  325. package/dist/report/model/locale.cjs +4 -0
  326. package/dist/report/model/locale.cjs.map +1 -1
  327. package/dist/report/model/locale.d.cts +3 -1
  328. package/dist/report/model/locale.d.mts +3 -1
  329. package/dist/report/model/locale.d.ts +3 -1
  330. package/dist/report/react/styles.css +80 -0
  331. package/dist/runner/build-preparation.cjs +5 -5
  332. package/dist/runner/build-preparation.cjs.map +1 -1
  333. package/dist/runner/build-preparation.d.cts +2 -3
  334. package/dist/runner/build-preparation.d.mts +2 -3
  335. package/dist/runner/build-preparation.d.ts +2 -3
  336. package/dist/runner/feedback/coordinator.cjs +18 -15
  337. package/dist/runner/feedback/coordinator.cjs.map +1 -1
  338. package/dist/runner/feedback/coordinator.d.cts +6 -0
  339. package/dist/runner/feedback/coordinator.d.mts +6 -0
  340. package/dist/runner/feedback/coordinator.d.ts +6 -0
  341. package/dist/runner/ledger.cjs +3 -13
  342. package/dist/runner/ledger.cjs.map +1 -1
  343. package/dist/runner/ledger.d.cts +1 -3
  344. package/dist/runner/ledger.d.mts +1 -3
  345. package/dist/runner/ledger.d.ts +1 -3
  346. package/dist/runner/run.cjs +63 -18
  347. package/dist/runner/run.cjs.map +1 -1
  348. package/dist/runner/session.cjs +10 -0
  349. package/dist/runner/session.cjs.map +1 -1
  350. package/dist/runner/session.d.cts +25 -0
  351. package/dist/runner/session.d.mts +25 -0
  352. package/dist/runner/session.d.ts +25 -0
  353. package/dist/runner/types.cjs.map +1 -1
  354. package/dist/runner/types.d.cts +1 -2
  355. package/dist/runner/types.d.mts +1 -2
  356. package/dist/runner/types.d.ts +1 -2
  357. package/dist/sandbox/build-coordinator.cjs +38 -19
  358. package/dist/sandbox/build-coordinator.cjs.map +1 -1
  359. package/dist/sandbox/build-coordinator.d.cts +47 -7
  360. package/dist/sandbox/build-coordinator.d.mts +47 -7
  361. package/dist/sandbox/build-coordinator.d.ts +47 -7
  362. package/dist/sandbox/build-coordinator.js +8 -4
  363. package/dist/sandbox/cli/contribution.cjs +128 -0
  364. package/dist/sandbox/cli/contribution.cjs.map +1 -0
  365. package/dist/sandbox/cli/contribution.d.cts +71 -0
  366. package/dist/sandbox/cli/contribution.d.mts +71 -0
  367. package/dist/sandbox/cli/contribution.d.ts +71 -0
  368. package/dist/sandbox/cli/contribution.js +8 -0
  369. package/dist/sandbox/cli/contribution.js.map +1 -0
  370. package/dist/sandbox/cli-commands.cjs +14 -21
  371. package/dist/sandbox/cli-commands.cjs.map +1 -1
  372. package/dist/sandbox/cli-commands.d.cts +12 -8
  373. package/dist/sandbox/cli-commands.d.mts +12 -8
  374. package/dist/sandbox/cli-commands.d.ts +12 -8
  375. package/dist/sandbox/compose.cjs +22 -2
  376. package/dist/sandbox/compose.cjs.map +1 -1
  377. package/dist/sandbox/compose.d.cts +1 -1
  378. package/dist/sandbox/compose.d.mts +1 -1
  379. package/dist/sandbox/compose.d.ts +1 -1
  380. package/dist/sandbox/docker-profile/cli.cjs +13 -9
  381. package/dist/sandbox/docker-profile/cli.cjs.map +1 -1
  382. package/dist/sandbox/docker-profile/cli.d.cts +2 -0
  383. package/dist/sandbox/docker-profile/cli.d.mts +2 -0
  384. package/dist/sandbox/docker-profile/cli.d.ts +2 -0
  385. package/dist/sandbox/docker-profile/runtime.cjs +68 -7
  386. package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
  387. package/dist/sandbox/docker-profile/runtime.d.cts +19 -1
  388. package/dist/sandbox/docker-profile/runtime.d.mts +19 -1
  389. package/dist/sandbox/docker-profile/runtime.d.ts +19 -1
  390. package/dist/sandbox/docker-profile/runtime.js +10 -8
  391. package/dist/sandbox/docker-profile/schema.cjs +68 -19
  392. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  393. package/dist/sandbox/docker-profile/schema.d.cts +23 -9
  394. package/dist/sandbox/docker-profile/schema.d.mts +23 -9
  395. package/dist/sandbox/docker-profile/schema.d.ts +23 -9
  396. package/dist/sandbox/docker-task-build-cache.cjs +532 -0
  397. package/dist/sandbox/docker-task-build-cache.cjs.map +1 -0
  398. package/dist/sandbox/docker-task-build-cache.d.cts +68 -0
  399. package/dist/sandbox/docker-task-build-cache.d.mts +68 -0
  400. package/dist/sandbox/docker-task-build-cache.d.ts +68 -0
  401. package/dist/sandbox/docker-task-build-cache.js +20 -0
  402. package/dist/sandbox/docker-task-build-cache.js.map +1 -0
  403. package/dist/sandbox/docker.cjs +50 -0
  404. package/dist/sandbox/docker.cjs.map +1 -1
  405. package/dist/sandbox/docker.d.cts +15 -0
  406. package/dist/sandbox/docker.d.mts +15 -0
  407. package/dist/sandbox/docker.d.ts +15 -0
  408. package/dist/sandbox/dockerfile-build.cjs +55 -5
  409. package/dist/sandbox/dockerfile-build.cjs.map +1 -1
  410. package/dist/sandbox/dockerfile-build.d.cts +2 -2
  411. package/dist/sandbox/dockerfile-build.d.mts +2 -2
  412. package/dist/sandbox/dockerfile-build.d.ts +2 -2
  413. package/dist/sandbox/index.cjs +5 -3
  414. package/dist/sandbox/index.cjs.map +1 -1
  415. package/dist/sandbox/index.d.cts +4 -3
  416. package/dist/sandbox/index.d.mts +4 -3
  417. package/dist/sandbox/index.d.ts +4 -3
  418. package/dist/sandbox/index.js +16 -14
  419. package/dist/sandbox/index.mjs +16 -14
  420. package/dist/sandbox/keep.cjs +1 -3
  421. package/dist/sandbox/keep.cjs.map +1 -1
  422. package/dist/sandbox/layer.cjs +70 -79
  423. package/dist/sandbox/layer.cjs.map +1 -1
  424. package/dist/sandbox/layer.d.cts +6 -12
  425. package/dist/sandbox/layer.d.mts +6 -12
  426. package/dist/sandbox/layer.d.ts +6 -12
  427. package/dist/sandbox/layer.js +16 -18
  428. package/dist/sandbox/ledger-paths.cjs +4 -18
  429. package/dist/sandbox/ledger-paths.cjs.map +1 -1
  430. package/dist/sandbox/ledger-paths.d.cts +3 -13
  431. package/dist/sandbox/ledger-paths.d.mts +3 -13
  432. package/dist/sandbox/ledger-paths.d.ts +3 -13
  433. package/dist/sandbox/ledger-paths.js +4 -8
  434. package/dist/sandbox/registry.cjs +1 -1
  435. package/dist/sandbox/registry.cjs.map +1 -1
  436. package/dist/sandbox/runtime.cjs +27 -37
  437. package/dist/sandbox/runtime.cjs.map +1 -1
  438. package/dist/sandbox/runtime.d.cts +1 -2
  439. package/dist/sandbox/runtime.d.mts +1 -2
  440. package/dist/sandbox/runtime.d.ts +1 -2
  441. package/dist/sandbox/runtime.js +6 -8
  442. package/dist/sandbox/types.cjs.map +1 -1
  443. package/dist/sandbox/types.d.cts +3 -3
  444. package/dist/sandbox/types.d.mts +3 -3
  445. package/dist/sandbox/types.d.ts +3 -3
  446. package/dist/sources/project.json +6 -0
  447. package/dist/vendor/remark/remark-gfm.cjs +72 -72
  448. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  449. package/dist/vendor/remark/remark-parse.cjs +54 -54
  450. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  451. package/dist/vendor/remark/remark.cjs +125 -125
  452. package/dist/vendor/remark/remark.cjs.map +2 -2
  453. package/docs-site/zh/README.md +1 -1
  454. package/docs-site/zh/explanation/assert.mdx +4 -0
  455. package/docs-site/zh/explanation/judge.mdx +40 -9
  456. package/docs-site/zh/reference/cli.mdx +67 -43
  457. package/docs-site/zh/reference/define-agent.mdx +2 -2
  458. package/docs-site/zh/reference/report-components.mdx +4 -3
  459. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +6 -0
  460. package/docs-site/zh/troubleshooting/debugging.mdx +28 -1
  461. package/docs-site/zh/tutorials/agent-feedback-loop.mdx +4 -2
  462. package/docs-site/zh/tutorials/concurrency.mdx +2 -2
  463. package/docs-site/zh/tutorials/custom-reports.mdx +175 -9
  464. package/docs-site/zh/tutorials/docker-in-docker.mdx +52 -7
  465. package/docs-site/zh/tutorials/eval-groups.mdx +1 -2
  466. package/docs-site/zh/tutorials/evaluation-kinds.mdx +39 -6
  467. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +14 -5
  468. package/docs-site/zh/tutorials/sandbox-providers.mdx +1 -28
  469. package/docs-site/zh/tutorials/sandbox-reuse.mdx +1 -1
  470. package/docs-site/zh/tutorials/viewing-results.mdx +2 -0
  471. package/package.json +24 -19
  472. package/README.md +0 -176
  473. package/README.zh.md +0 -176
  474. package/dist/cli/record.cjs +0 -246
  475. package/dist/cli/record.cjs.map +0 -1
  476. package/dist/cli/record.d.cts +0 -40
  477. package/dist/cli/record.d.mts +0 -40
  478. package/dist/cli/record.d.ts +0 -40
  479. package/dist/cli/record.js +0 -10
  480. package/dist/cli/record.js.map +0 -1
  481. package/dist/sandbox/local.cjs +0 -361
  482. package/dist/sandbox/local.cjs.map +0 -1
  483. package/dist/sandbox/local.d.cts +0 -80
  484. package/dist/sandbox/local.d.mts +0 -80
  485. package/dist/sandbox/local.d.ts +0 -80
  486. package/dist/sandbox/local.js +0 -6
  487. package/dist/sandbox/local.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"content.js","sourceRoot":"","sources":["content.ts"],"names":[],"mappings":"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","sourcesContent":["// 实体列表 Table Content 投影(docs/feature/reports/library.md)。\n// Experiment 层级在这里从闭合 ExperimentListItem + 组读数投影成 TableContent.subRows;\n// 组件本体是中立 Table 原语,不知道 experiment / Eval / Attempt 语义。\nimport type { Cell, ColumnSpec, TableContent, TableContentRow, } from \"../../definition/cell.ts\";\nimport { localizedMessage } from \"../../model/locale.ts\";\nimport type { Verdict } from \"../../../shared/types.ts\";\nimport type { MetricValue } from \"../../../analysis/index.ts\";\nimport { experimentEvalLayout, relativeEvalLabel, type AttemptListItem, type ExperimentListEvalRow, type ExperimentListItem, type ExperimentMetrics, type EvalLayoutNode, } from \"./compute.ts\";\n/** 覆盖缺口占位行共用的原因码;missingText(code) 经 locale 键给出文案。 */\nconst NO_CURRENT_RESULT = \"noCurrentResult\";\n/** 组内零样本读数格的结构化原因码。 */\nconst GROUP_NO_SAMPLES = \"noSamples\";\n/** 三张实体表共用的列表头。文案单源在 locale 字典,这里只烤成随列走的 LocalizedText。 */\nconst HEADER = {\n entity: localizedMessage(\"experimentList.experiment\"),\n model: localizedMessage(\"table.model\"),\n agent: localizedMessage(\"table.agent\"),\n durationMs: localizedMessage(\"experimentList.avgDuration\"),\n passRate: localizedMessage(\"experimentList.passRate\"),\n totalScore: localizedMessage(\"experimentList.totalScore\"),\n tokens: localizedMessage(\"experimentList.tokens\"),\n costUSD: localizedMessage(\"experimentList.cost\"),\n record: localizedMessage(\"experimentList.result\"),\n verdict: localizedMessage(\"experimentList.status\"),\n result: localizedMessage(\"experimentList.result\"),\n};\n/**\n * 一行的「格子原料」:这一行自己算得出的全部格子,与任何列集无关。\n * 原料裁成行由 `projectCells` 做——列集外的原料丢掉,原料没覆盖的列显式填\n * notApplicable,不靠缺格回落成 \"—\"(memory/cell-key-must-match-column-set.md)。\n */\ntype CellBag = Readonly<globalThis.Record<string, Cell>>;\nfunction projectCells(bag: CellBag, columns: readonly ColumnSpec[]): globalThis.Record<string, Cell> {\n const cells: globalThis.Record<string, Cell> = {};\n for (const column of columns) {\n cells[column.key] = bag[column.key] ?? { kind: \"notApplicable\" };\n }\n return cells;\n}\nfunction measureCell(value: MetricValue): Cell {\n return {\n kind: \"metric\",\n metric: value,\n // A complete denominator adds no actionable information to every text\n // cell. Keep partial and exceptional states explicit; the MetricValue\n // itself remains intact for both renderers and machine output.\n showCoverage: value.state !== \"available\",\n };\n}\nfunction stackCell(...cells: readonly Cell[]): Cell {\n const visible = cells.filter((cell) => cell.kind !== \"notApplicable\");\n if (visible.length === 0)\n return { kind: \"notApplicable\" };\n if (visible.length === 1)\n return visible[0]!;\n return { kind: \"stack\", cells: visible as [\n Cell,\n ...Cell[]\n ] };\n}\n/** 一组判定 → 计票。experiment / 组行数题、Eval 行数 attempt,同一形态同一构造。 */\nfunction tallyVerdicts(attempts: readonly AttemptListItem[]): {\n readonly passed: number;\n readonly failed: number;\n readonly errored: number;\n readonly skipped: number;\n} {\n const counts = { passed: 0, failed: 0, errored: 0, skipped: 0 };\n for (const attempt of attempts) {\n if (attempt.verdict === null)\n continue;\n counts[attempt.verdict] += 1;\n }\n return counts;\n}\nfunction verdictCountsCell(attempts: readonly AttemptListItem[]): Cell {\n return { kind: \"verdict\", counts: tallyVerdicts(attempts) };\n}\nfunction evalVerdictCell(attempts: readonly AttemptListItem[]): Cell {\n const only = attempts.length === 1 ? attempts[0]?.verdict : null;\n return only === null || only === undefined ? verdictCountsCell(attempts) : verdictCell(only);\n}\nfunction verdictCell(verdict: Verdict | null): Cell {\n if (verdict === null)\n return { kind: \"notApplicable\" };\n return { kind: \"verdict\", verdict };\n}\nfunction locatorCell(attempt: AttemptListItem): Cell {\n return {\n kind: \"locator\",\n locator: attempt.locator,\n ...(attempt.verdict === null ? {} : { verdict: attempt.verdict }),\n };\n}\nfunction textCell(text: string, detail?: string): Cell {\n return detail ? { kind: \"text\", text, detail } : { kind: \"text\", text };\n}\n/** 失败摘要格:closed 摘录缺失时如实显示 \"—\",不发明文案。 */\nfunction resultCell(attempt: AttemptListItem): Cell {\n return attempt.failureSummary === null\n ? { kind: \"text\", text: \"—\" }\n : { kind: \"summary\", text: attempt.failureSummary };\n}\n/**\n * attempt 行的格子原料。层级表取 entity / record / durationMs / tokens / costUSD,\n * 平铺表取 entity / verdict / result / durationMs / costUSD;\n * 两张表各自裁自这一份,不各写一份构造。\n */\nfunction attemptCells(attempt: AttemptListItem): CellBag {\n return {\n entity: locatorCell(attempt),\n verdict: verdictCell(attempt.verdict),\n result: resultCell(attempt),\n // locator 已携带这次判定;层级 Result 不重复同一个状态。\n durationMs: measureCell(attempt.durationMs),\n tokens: measureCell(attempt.tokens),\n ...(attempt.totalScore === undefined ? {} : { totalScore: { kind: \"score\", earned: attempt.totalScore } as const }),\n ...(attempt.costUSD === undefined ? {} : { costUSD: measureCell(attempt.costUSD) }),\n };\n}\nconst HIERARCHY_COLUMNS_PREFIX: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"model\", header: HEADER.model },\n { key: \"agent\", header: HEADER.agent },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nconst HIERARCHY_COLUMNS_SUFFIX: readonly ColumnSpec[] = [\n { key: \"tokens\", better: \"lower\", header: HEADER.tokens },\n { key: \"summary\", better: \"higher\", header: HEADER.result },\n];\nfunction hierarchyColumns(): readonly ColumnSpec[] {\n return [...HIERARCHY_COLUMNS_PREFIX, ...HIERARCHY_COLUMNS_SUFFIX];\n}\nconst COST_COLUMN: ColumnSpec = { key: \"costUSD\", better: \"lower\", header: HEADER.costUSD };\n/** Attempt 平铺表的列集(AttemptList / FailureList 同一份)。 */\nconst FLAT_ENTITY_COLUMNS: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"verdict\", header: HEADER.verdict },\n { key: \"result\", header: HEADER.result },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nfunction columnsWithCost(columns: readonly ColumnSpec[], includeCost: boolean): readonly ColumnSpec[] {\n if (!includeCost)\n return columns;\n const resultIndex = columns.findIndex((column) => column.key === \"summary\");\n if (resultIndex < 0)\n return [...columns, COST_COLUMN];\n return [...columns.slice(0, resultIndex), COST_COLUMN, ...columns.slice(resultIndex)];\n}\n/** 层级实体的计数属于身份说明,必须留在同一个首格而不是渲染成续行。 */\nfunction identityCell(name: string, metadata: string): Cell {\n return textCell(`${name} (${metadata})`);\n}\n/** 组内题数与已知题数:\"3/4 evals\" 只在有缺口时出现。 */\nfunction groupEntityDetail(evals: number, knownEvals: number): string {\n return knownEvals > evals ? `${evals}/${knownEvals} evals` : `${evals} evals`;\n}\n/**\n * 组行读数格:直接用 Analysis-owned 组 MetricValue;组前缀聚合缺失时才是\n * missing(本该有却没跑到),不是 \"—\"(对这一行没有意义)。\n */\nfunction groupMetricValue(metrics: ExperimentMetrics | undefined, key: keyof ExperimentMetrics): Cell {\n const metric = metrics?.[key];\n return metric === undefined ? { kind: \"missing\", code: GROUP_NO_SAMPLES } : measureCell(metric);\n}\n/** 覆盖缺口占位行:code 与补跑命令同行——都是「当前配置下没有结果」这一个事实。 */\nfunction placeholderRow(experimentId: string, evalId: string, label: string, columns: readonly ColumnSpec[]): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n summary: {\n kind: \"missing\",\n code: NO_CURRENT_RESULT,\n detail: `niceeval exp ${experimentId}`,\n },\n };\n return {\n key: `${experimentId}:${evalId}:missing`,\n variant: \"placeholder\",\n cells: projectCells(bag, columns),\n };\n}\ninterface HierarchyView {\n readonly columns: readonly ColumnSpec[];\n readonly item: ExperimentListItem;\n readonly labelPrefix: string;\n}\nfunction attemptRow(attempt: AttemptListItem, columns: readonly ColumnSpec[]): TableContentRow {\n return {\n key: attempt.locator,\n cells: projectCells(attemptCells(attempt), columns),\n };\n}\nfunction evalRow(row: ExperimentListEvalRow, label: string, view: HierarchyView): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n durationMs: measureCell(row.durationMs),\n summary: row.evaluationKind === \"pass\"\n ? (row.attempts.length === 1\n ? evalVerdictCell(row.attempts)\n : stackCell(measureCell(row.endToEndPassRate), verdictCountsCell(row.attempts)))\n : stackCell(row.totalScore === undefined\n ? { kind: \"notApplicable\" }\n : { kind: \"score\", earned: row.totalScore }, evalVerdictCell(row.attempts)),\n ...(row.costUSD === undefined ? {} : { costUSD: measureCell(row.costUSD) }),\n };\n return {\n key: row.evalId,\n cells: projectCells(bag, view.columns),\n subRows: row.attempts.map((attempt) => attemptRow(attempt, view.columns)),\n };\n}\nfunction leafTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n}>, view: HierarchyView): TableContentRow {\n const label = relativeEvalLabel(node.evalId, view.labelPrefix);\n const row = view.item.evalRows.find((candidate) => candidate.evalId === node.evalId);\n return row === undefined\n ? placeholderRow(view.item.experimentId, node.evalId, label, view.columns)\n : evalRow(row, label, view);\n}\n/** 组行的成员 attempt 列表(用于判定计票)。 */\nfunction attemptsUnder(node: EvalLayoutNode, evalRows: readonly ExperimentListEvalRow[]): readonly AttemptListItem[] {\n const members = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n members.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n return evalRows\n .filter((row) => members.has(row.evalId))\n .flatMap((row) => row.attempts);\n}\nfunction groupTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n}>, item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n evalIds.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n const evalRows = item.evalRows.filter((row) => evalIds.has(row.evalId));\n const knownEvals = evalIds.size;\n const evals = evalRows.length;\n const metrics = item.groupMetrics.get(node.prefix);\n const attempts = attemptsUnder(node, item.evalRows);\n const verdicts = evals === 0\n ? { kind: \"missing\", code: GROUP_NO_SAMPLES } as const\n : verdictCountsCell(attempts);\n const primary = evalRows.every((row) => row.evaluationKind === \"pass\")\n ? groupMetricValue(metrics, \"passRate\")\n : evalRows.some((row) => row.totalScore !== undefined)\n ? { kind: \"score\", earned: evalRows.reduce((sum, row) => sum + (row.totalScore ?? 0), 0) } as const\n : { kind: \"notApplicable\" } as const;\n const bag: CellBag = {\n entity: identityCell(node.segment, groupEntityDetail(evals, knownEvals)),\n durationMs: groupMetricValue(metrics, \"durationMs\"),\n tokens: groupMetricValue(metrics, \"tokens\"),\n ...(metrics?.costUSD === undefined ? {} : { costUSD: measureCell(metrics.costUSD) }),\n summary: stackCell(primary, verdicts),\n };\n return {\n key: `group:${node.prefix}`,\n variant: \"group\",\n cells: projectCells(bag, view.columns),\n subRows: groupChildren(node.children, { ...view, labelPrefix: node.prefix }),\n };\n}\n/** 同一层的组行按主读数降序(缺数据沉底,同值按段名收口),叶子恒在组行之后。 */\nfunction groupChildren(nodes: readonly EvalLayoutNode[], view: HierarchyView): TableContentRow[] {\n const groups = nodes\n .filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n }> => node.kind === \"group\")\n .slice()\n .sort((left, right) => {\n const leftPrimary = view.item.groupMetrics.get(left.prefix)?.passRate.value ?? null;\n const rightPrimary = view.item.groupMetrics.get(right.prefix)?.passRate.value ?? null;\n if (leftPrimary === null && rightPrimary === null)\n return left.segment.localeCompare(right.segment);\n if (leftPrimary === null)\n return 1;\n if (rightPrimary === null)\n return -1;\n return rightPrimary - leftPrimary || left.segment.localeCompare(right.segment);\n });\n const leaves = nodes.filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n }> => node.kind === \"leaf\");\n return [\n ...groups.map((node) => groupTableRow(node, view.item, view)),\n ...leaves.map((node) => leafTableRow(node, view)),\n ];\n}\nfunction experimentRow(item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set(item.evalRows.map((row) => row.evalId));\n const members: readonly EvalLayoutNode[] = experimentEvalLayout([...new Set([...evalIds, ...item.missingEvalIds])]);\n const attempts = item.evalRows.flatMap((row) => row.attempts);\n const primary = item.evaluationKind === \"pass\"\n ? measureCell(item.endToEndPassRate)\n : item.totalScore === undefined\n ? { kind: \"notApplicable\" } as const\n : { kind: \"score\", earned: item.totalScore } as const;\n const bag: CellBag = {\n entity: textCell(item.experimentId),\n model: item.model === null ? { kind: \"notApplicable\" } : textCell(item.model),\n agent: item.agent === null ? { kind: \"notApplicable\" } : textCell(item.agent),\n durationMs: measureCell(item.durationMs),\n tokens: measureCell(item.tokens),\n ...(item.costUSD === undefined ? {} : { costUSD: measureCell(item.costUSD) }),\n summary: stackCell(primary, verdictCountsCell(attempts)),\n };\n return {\n key: item.experimentId,\n cells: projectCells(bag, view.columns),\n subRows: members.length > 0 ? groupChildren(members, view) : [],\n };\n}\nexport function experimentListContent(items: readonly ExperimentListItem[]): TableContent {\n const columns = columnsWithCost(hierarchyColumns(), items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n rows: items.map((item) => experimentRow(item, { columns, item, labelPrefix: \"\" })),\n };\n}\nexport function attemptListContent(items: readonly AttemptListItem[]): TableContent {\n const columns = columnsWithCost(FLAT_ENTITY_COLUMNS, items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n // 与层级表里的 attempt 行同一份格子原料,只是裁到平铺列集。\n rows: items.map((item) => attemptRow(item, columns)),\n };\n}\n"]}
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["content.ts"],"names":[],"mappings":"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","sourcesContent":["// 实体列表 Table Content 投影(docs/feature/reports/library.md)。\n// Experiment 层级在这里从闭合 ExperimentListItem + 组读数投影成 TableContent.subRows;\n// 组件本体是中立 Table 原语,不知道 experiment / Eval / Attempt 语义。\nimport type { Cell, ColumnSpec, TableContent, TableContentRow, } from \"../../definition/cell.ts\";\nimport { localizedMessage } from \"../../model/locale.ts\";\nimport type { Verdict } from \"../../../shared/types.ts\";\nimport type { MetricValue } from \"../../../analysis/index.ts\";\nimport { experimentEvalLayout, relativeEvalLabel, type AttemptListItem, type ExperimentListEvalRow, type ExperimentListItem, type ExperimentMetrics, type EvalLayoutNode, } from \"./compute.ts\";\n/** 覆盖缺口占位行共用的原因码;missingText(code) 经 locale 键给出文案。 */\nconst NO_CURRENT_RESULT = \"noCurrentResult\";\n/** 组内零样本读数格的结构化原因码。 */\nconst GROUP_NO_SAMPLES = \"noSamples\";\n/** 三张实体表共用的列表头。文案单源在 locale 字典,这里只烤成随列走的 LocalizedText。 */\nconst HEADER = {\n entity: localizedMessage(\"experimentList.experiment\"),\n model: localizedMessage(\"table.model\"),\n agent: localizedMessage(\"table.agent\"),\n durationMs: localizedMessage(\"experimentList.avgDuration\"),\n passRate: localizedMessage(\"experimentList.passRate\"),\n totalScore: localizedMessage(\"experimentList.totalScore\"),\n tokens: localizedMessage(\"experimentList.tokens\"),\n costUSD: localizedMessage(\"experimentList.cost\"),\n record: localizedMessage(\"experimentList.result\"),\n verdict: localizedMessage(\"experimentList.status\"),\n result: localizedMessage(\"experimentList.result\"),\n};\n/**\n * 一行的「格子原料」:这一行自己算得出的全部格子,与任何列集无关。\n * 原料裁成行由 `projectCells` 做——列集外的原料丢掉,原料没覆盖的列显式填\n * notApplicable,不靠缺格回落成 \"—\"(memory/cell-key-must-match-column-set.md)。\n */\ntype CellBag = Readonly<globalThis.Record<string, Cell>>;\nfunction projectCells(bag: CellBag, columns: readonly ColumnSpec[]): globalThis.Record<string, Cell> {\n const cells: globalThis.Record<string, Cell> = {};\n for (const column of columns) {\n cells[column.key] = bag[column.key] ?? { kind: \"notApplicable\" };\n }\n return cells;\n}\nfunction measureCell(value: MetricValue, showCoverage = value.state !== \"available\"): Cell {\n return {\n kind: \"metric\",\n metric: value,\n // A complete denominator adds no actionable information to every text\n // cell. Keep partial and exceptional states explicit; the MetricValue\n // itself remains intact for both renderers and machine output.\n showCoverage,\n };\n}\nfunction stackCell(...cells: readonly Cell[]): Cell {\n const visible = cells.filter((cell) => cell.kind !== \"notApplicable\");\n if (visible.length === 0)\n return { kind: \"notApplicable\" };\n if (visible.length === 1)\n return visible[0]!;\n return { kind: \"stack\", cells: visible as [\n Cell,\n ...Cell[]\n ] };\n}\n/** 一组判定 → 计票。experiment / 组行数题、Eval 行数 attempt,同一形态同一构造。 */\nfunction tallyVerdicts(attempts: readonly AttemptListItem[]): {\n readonly passed: number;\n readonly failed: number;\n readonly errored: number;\n readonly skipped: number;\n} {\n const counts = { passed: 0, failed: 0, errored: 0, skipped: 0 };\n for (const attempt of attempts) {\n if (attempt.verdict === null)\n continue;\n counts[attempt.verdict] += 1;\n }\n return counts;\n}\nfunction verdictCountsCell(attempts: readonly AttemptListItem[]): Cell {\n return { kind: \"verdict\", counts: tallyVerdicts(attempts) };\n}\n/** Score 行不重复必然的 passed,只保留会改变用户判断的异常计数。 */\nfunction exceptionalVerdictCountsCell(attempts: readonly AttemptListItem[]): Cell {\n const counts = tallyVerdicts(attempts);\n if (counts.failed + counts.errored + counts.skipped === 0)\n return { kind: \"notApplicable\" };\n return { kind: \"verdict\", counts: { ...counts, passed: 0 } };\n}\n/** 只有所有 Score Attempt 都给出完整计数时才汇总;未知不冒充零。 */\nfunction missedScoreItems(attempts: readonly AttemptListItem[]): number | undefined {\n const scoreAttempts = attempts.filter((attempt) => attempt.evaluationKind === \"points\");\n if (scoreAttempts.length === 0 || scoreAttempts.some((attempt) => attempt.missedScoreItems === undefined)) {\n return undefined;\n }\n return scoreAttempts.reduce((total, attempt) => total + attempt.missedScoreItems!, 0);\n}\nfunction scoreCell(earned: number, attempts: readonly AttemptListItem[]): Cell {\n const missed = missedScoreItems(attempts);\n return {\n kind: \"score\",\n earned,\n ...(missed === undefined ? {} : { missedScoreItems: missed }),\n };\n}\nfunction evalVerdictCell(attempts: readonly AttemptListItem[]): Cell {\n const only = attempts.length === 1 ? attempts[0]?.verdict : null;\n return only === null || only === undefined ? verdictCountsCell(attempts) : verdictCell(only);\n}\nfunction verdictCell(verdict: Verdict | null): Cell {\n if (verdict === null)\n return { kind: \"notApplicable\" };\n return { kind: \"verdict\", verdict };\n}\nfunction locatorCell(attempt: AttemptListItem): Cell {\n return {\n kind: \"locator\",\n locator: attempt.locator,\n ...(attempt.verdict === null ? {} : { verdict: attempt.verdict }),\n };\n}\nfunction textCell(text: string, detail?: string): Cell {\n return detail ? { kind: \"text\", text, detail } : { kind: \"text\", text };\n}\n/** 失败摘要格:closed 摘录缺失时如实显示 \"—\",不发明文案。 */\nfunction resultCell(attempt: AttemptListItem): Cell {\n return attempt.failureSummary === null\n ? { kind: \"text\", text: \"—\" }\n : { kind: \"summary\", text: attempt.failureSummary };\n}\n/**\n * attempt 行的格子原料。层级表取 entity / record / durationMs / tokens / costUSD,\n * 平铺表取 entity / verdict / result / durationMs / costUSD;\n * 两张表各自裁自这一份,不各写一份构造。\n */\nfunction attemptCells(attempt: AttemptListItem): CellBag {\n return {\n entity: locatorCell(attempt),\n verdict: verdictCell(attempt.verdict),\n result: resultCell(attempt),\n // locator 已携带这次判定;层级 Result 不重复同一个状态。\n durationMs: measureCell(attempt.durationMs),\n tokens: measureCell(attempt.tokens),\n ...(attempt.totalScore === undefined ? {} : { totalScore: { kind: \"score\", earned: attempt.totalScore } as const }),\n ...(attempt.costUSD === undefined ? {} : { costUSD: measureCell(attempt.costUSD) }),\n };\n}\nconst HIERARCHY_COLUMNS_PREFIX: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"model\", header: HEADER.model },\n { key: \"agent\", header: HEADER.agent },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nconst HIERARCHY_COLUMNS_SUFFIX: readonly ColumnSpec[] = [\n { key: \"tokens\", better: \"lower\", header: HEADER.tokens },\n { key: \"summary\", better: \"higher\", header: HEADER.result },\n];\nfunction hierarchyColumns(): readonly ColumnSpec[] {\n return [...HIERARCHY_COLUMNS_PREFIX, ...HIERARCHY_COLUMNS_SUFFIX];\n}\nconst COST_COLUMN: ColumnSpec = { key: \"costUSD\", better: \"lower\", header: HEADER.costUSD };\n/** Attempt 平铺表的列集(AttemptList / FailureList 同一份)。 */\nconst FLAT_ENTITY_COLUMNS: readonly ColumnSpec[] = [\n { key: \"entity\", header: HEADER.entity },\n { key: \"verdict\", header: HEADER.verdict },\n { key: \"result\", header: HEADER.result },\n { key: \"durationMs\", better: \"lower\", header: HEADER.durationMs },\n];\nfunction columnsWithCost(columns: readonly ColumnSpec[], includeCost: boolean): readonly ColumnSpec[] {\n if (!includeCost)\n return columns;\n const resultIndex = columns.findIndex((column) => column.key === \"summary\");\n if (resultIndex < 0)\n return [...columns, COST_COLUMN];\n return [...columns.slice(0, resultIndex), COST_COLUMN, ...columns.slice(resultIndex)];\n}\n/** 层级实体的计数属于身份说明,必须留在同一个首格而不是渲染成续行。 */\nfunction identityCell(name: string, metadata: string): Cell {\n return textCell(`${name} (${metadata})`);\n}\n/** 组内题数与已知题数:\"3/4 evals\" 只在有缺口时出现。 */\nfunction groupEntityDetail(evals: number, knownEvals: number): string {\n return knownEvals > evals ? `${evals}/${knownEvals} evals` : `${evals} evals`;\n}\n/**\n * 组行读数格:直接用 Analysis-owned 组 MetricValue;组前缀聚合缺失时才是\n * missing(本该有却没跑到),不是 \"—\"(对这一行没有意义)。\n */\nfunction groupMetricValue(metrics: ExperimentMetrics | undefined, key: keyof ExperimentMetrics): Cell {\n const metric = metrics?.[key];\n return metric === undefined ? { kind: \"missing\", code: GROUP_NO_SAMPLES } : measureCell(metric);\n}\n/** 覆盖缺口占位行:code 与补跑命令同行——都是「当前配置下没有结果」这一个事实。 */\nfunction placeholderRow(experimentId: string, evalId: string, label: string, columns: readonly ColumnSpec[]): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n summary: {\n kind: \"missing\",\n code: NO_CURRENT_RESULT,\n detail: `niceeval exp ${experimentId}`,\n },\n };\n return {\n key: `${experimentId}:${evalId}:missing`,\n variant: \"placeholder\",\n cells: projectCells(bag, columns),\n };\n}\ninterface HierarchyView {\n readonly columns: readonly ColumnSpec[];\n readonly item: ExperimentListItem;\n readonly labelPrefix: string;\n}\nfunction attemptRow(attempt: AttemptListItem, columns: readonly ColumnSpec[]): TableContentRow {\n return {\n key: attempt.locator,\n cells: projectCells(attemptCells(attempt), columns),\n };\n}\nfunction evalRow(row: ExperimentListEvalRow, label: string, view: HierarchyView): TableContentRow {\n const bag: CellBag = {\n entity: textCell(label),\n durationMs: measureCell(row.durationMs),\n summary: row.evaluationKind === \"pass\"\n ? (row.attempts.length === 1\n ? evalVerdictCell(row.attempts)\n : stackCell(measureCell(row.endToEndPassRate), verdictCountsCell(row.attempts)))\n : stackCell(row.totalScore === undefined\n ? { kind: \"notApplicable\" }\n : scoreCell(row.totalScore, row.attempts), exceptionalVerdictCountsCell(row.attempts)),\n ...(row.costUSD === undefined ? {} : { costUSD: measureCell(row.costUSD) }),\n };\n return {\n key: row.evalId,\n cells: projectCells(bag, view.columns),\n subRows: row.attempts.map((attempt) => attemptRow(attempt, view.columns)),\n };\n}\nfunction leafTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n}>, view: HierarchyView): TableContentRow {\n const label = relativeEvalLabel(node.evalId, view.labelPrefix);\n const row = view.item.evalRows.find((candidate) => candidate.evalId === node.evalId);\n return row === undefined\n ? placeholderRow(view.item.experimentId, node.evalId, label, view.columns)\n : evalRow(row, label, view);\n}\n/** 组行的成员 attempt 列表(用于判定计票)。 */\nfunction attemptsUnder(node: EvalLayoutNode, evalRows: readonly ExperimentListEvalRow[]): readonly AttemptListItem[] {\n const members = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n members.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n return evalRows\n .filter((row) => members.has(row.evalId))\n .flatMap((row) => row.attempts);\n}\nfunction groupTableRow(node: Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n}>, item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set<string>();\n const collect = (list: readonly EvalLayoutNode[]): void => {\n for (const entry of list) {\n if (entry.kind === \"leaf\")\n evalIds.add(entry.evalId);\n else\n collect(entry.children);\n }\n };\n collect([node]);\n const evalRows = item.evalRows.filter((row) => evalIds.has(row.evalId));\n const knownEvals = evalIds.size;\n const evals = evalRows.length;\n const metrics = item.groupMetrics.get(node.prefix);\n const attempts = attemptsUnder(node, item.evalRows);\n const verdicts = evals === 0\n ? { kind: \"missing\", code: GROUP_NO_SAMPLES } as const\n : verdictCountsCell(attempts);\n const primary = evalRows.every((row) => row.evaluationKind === \"pass\")\n ? groupMetricValue(metrics, \"passRate\")\n : evalRows.some((row) => row.totalScore !== undefined)\n ? scoreCell(evalRows.reduce((sum, row) => sum + (row.totalScore ?? 0), 0), attempts)\n : { kind: \"notApplicable\" } as const;\n const bag: CellBag = {\n entity: identityCell(node.segment, groupEntityDetail(evals, knownEvals)),\n durationMs: groupMetricValue(metrics, \"durationMs\"),\n tokens: groupMetricValue(metrics, \"tokens\"),\n ...(metrics?.costUSD === undefined ? {} : { costUSD: measureCell(metrics.costUSD) }),\n summary: stackCell(primary, evalRows.every((row) => row.evaluationKind === \"pass\") ? verdicts : exceptionalVerdictCountsCell(attempts)),\n };\n return {\n key: `group:${node.prefix}`,\n variant: \"group\",\n cells: projectCells(bag, view.columns),\n subRows: groupChildren(node.children, { ...view, labelPrefix: node.prefix }),\n };\n}\n/** 同一层的组行按主读数降序(缺数据沉底,同值按段名收口),叶子恒在组行之后。 */\nfunction groupChildren(nodes: readonly EvalLayoutNode[], view: HierarchyView): TableContentRow[] {\n const groups = nodes\n .filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"group\";\n }> => node.kind === \"group\")\n .slice()\n .sort((left, right) => {\n const leftPrimary = view.item.groupMetrics.get(left.prefix)?.passRate.value ?? null;\n const rightPrimary = view.item.groupMetrics.get(right.prefix)?.passRate.value ?? null;\n if (leftPrimary === null && rightPrimary === null)\n return left.segment.localeCompare(right.segment);\n if (leftPrimary === null)\n return 1;\n if (rightPrimary === null)\n return -1;\n return rightPrimary - leftPrimary || left.segment.localeCompare(right.segment);\n });\n const leaves = nodes.filter((node): node is Extract<EvalLayoutNode, {\n readonly kind: \"leaf\";\n }> => node.kind === \"leaf\");\n return [\n ...groups.map((node) => groupTableRow(node, view.item, view)),\n ...leaves.map((node) => leafTableRow(node, view)),\n ];\n}\nfunction experimentRow(item: ExperimentListItem, view: HierarchyView): TableContentRow {\n const evalIds = new Set(item.evalRows.map((row) => row.evalId));\n const members: readonly EvalLayoutNode[] = experimentEvalLayout([...new Set([...evalIds, ...item.missingEvalIds])]);\n const attempts = item.evalRows.flatMap((row) => row.attempts);\n const primary = item.evaluationKind === \"pass\"\n ? measureCell(item.endToEndPassRate, false)\n : item.totalScore === undefined\n ? { kind: \"notApplicable\" } as const\n : scoreCell(item.totalScore, attempts);\n const bag: CellBag = {\n entity: identityCell(item.experimentId, `${item.endToEndPassRate.samples}/${item.endToEndPassRate.total}`),\n model: item.model === null ? { kind: \"notApplicable\" } : textCell(item.model),\n agent: item.agent === null ? { kind: \"notApplicable\" } : textCell(item.agent),\n durationMs: measureCell(item.durationMs, false),\n tokens: measureCell(item.tokens, false),\n ...(item.costUSD === undefined ? {} : { costUSD: measureCell(item.costUSD, false) }),\n summary: stackCell(primary, item.evaluationKind === \"pass\" ? verdictCountsCell(attempts) : exceptionalVerdictCountsCell(attempts)),\n };\n return {\n key: item.experimentId,\n cells: projectCells(bag, view.columns),\n subRows: members.length > 0 ? groupChildren(members, view) : [],\n };\n}\nexport function experimentListContent(items: readonly ExperimentListItem[]): TableContent {\n const columns = columnsWithCost(hierarchyColumns(), items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n rows: items.map((item) => experimentRow(item, { columns, item, labelPrefix: \"\" })),\n };\n}\nexport function attemptListContent(items: readonly AttemptListItem[]): TableContent {\n const columns = columnsWithCost(FLAT_ENTITY_COLUMNS, items.some((item) => item.costUSD !== undefined));\n return {\n columns,\n // 与层级表里的 attempt 行同一份格子原料,只是裁到平铺列集。\n rows: items.map((item) => attemptRow(item, columns)),\n };\n}\n"]}
@@ -39,9 +39,6 @@ exports.AttemptList = (0, tree_ts_1.defineComponent)(async (props, ctx) => {
39
39
  });
40
40
  exports.AttemptList.displayName = "AttemptList";
41
41
  exports.ExperimentTable = (0, tree_ts_1.defineComponent)(async (props, ctx) => {
42
- if (props.comparison.comparison.state === "non-comparable") {
43
- return (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: props.className, children: props.comparison.comparison.issues.map((issue) => issue.reason).join(", ") });
44
- }
45
42
  const sample = (0, experiment_groups_ts_1.sampleForExperimentComparisonScope)(props.comparison);
46
43
  const rows = await (0, compute_ts_1.experimentListData)(sample, ctx.report.pricing);
47
44
  const defaultSort = "summary";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"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","sourcesContent":["// 实体列表组合件:FailureList / AttemptList / ExperimentTable。\n// 列表本体是中立 Table 原语(TableContentView);语义全部住在 compute.ts 与\n// content.ts 的投影层,docs/feature/reports/library.md。\nimport type { ExperimentComparisonScope, Sample } from \"../../../analysis/index.ts\";\nimport { sampleForExperimentComparisonScope } from \"../../../analysis/experiment-groups.ts\";\nimport { defineComponent } from \"../../definition/tree.ts\";\nimport { TableContentView, Text } from \"../../definition/primitives.tsx\";\nimport type { ReportLocale } from \"../../model/locale.ts\";\nimport { attemptListData, experimentListData, type AttemptListItem, type ExperimentListItem, } from \"./compute.ts\";\nimport { attemptListContent, experimentListContent } from \"./content.ts\";\nexport { attemptListData, experimentListData, experimentEvalLayout, relativeEvalLabel, } from \"./compute.ts\";\nexport type { AttemptListItem, EvalLayoutNode, EvaluationKindComposition, ExperimentListEvalRow, ExperimentListItem, ExperimentMetrics, } from \"./compute.ts\";\nexport { attemptListContent, experimentListContent } from \"./content.ts\";\nexport interface FailureListProps {\n readonly limit?: number;\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly AttemptListItem[];\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** 失败处理台:只列 failed / errored attempt,按 startedAt 新到旧、locator 升序收口。 */\nexport const FailureList = defineComponent<FailureListProps>(async (props, ctx) => {\n const sample = props.input ?? ctx.scope;\n const all = props.rows ?? await attemptListData(sample, ctx.report.pricing);\n const failures = all\n .filter((item) => item.verdict === \"failed\" || item.verdict === \"errored\")\n .sort((left, right) => {\n const leftStarted = left.startedAt ?? Number.NEGATIVE_INFINITY;\n const rightStarted = right.startedAt ?? Number.NEGATIVE_INFINITY;\n if (leftStarted !== rightStarted)\n return leftStarted > rightStarted ? -1 : 1;\n return left.locator < right.locator ? -1 : left.locator > right.locator ? 1 : 0;\n });\n const limit = props.limit ?? 20;\n return <TableContentView data={attemptListContent(failures.slice(0, limit))} locale={props.locale} className={props.className}/>;\n});\nFailureList.displayName = \"FailureList\";\nexport interface AttemptListProps {\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly AttemptListItem[];\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** 薄组合:attemptListData + Table。顺序保持传入顺序(不重排)。 */\nexport const AttemptList = defineComponent<AttemptListProps>(async (props, ctx) => {\n const rows = props.rows ?? await attemptListData(props.input ?? ctx.scope, ctx.report.pricing);\n return <TableContentView data={attemptListContent(rows)} locale={props.locale} className={props.className}/>;\n});\nAttemptList.displayName = \"AttemptList\";\nexport interface ExperimentTableProps {\n readonly comparison: ExperimentComparisonScope;\n /** 显示排序列;省略时按列表自身题型选择 passRate 或 totalScore。 */\n readonly sort?: string;\n readonly searchable?: boolean;\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\nexport const ExperimentTable = defineComponent<ExperimentTableProps>(async (props, ctx) => {\n if (props.comparison.comparison.state === \"non-comparable\") {\n return <Text className={props.className}>\n {props.comparison.comparison.issues.map((issue) => issue.reason).join(\", \")}\n </Text>;\n }\n const sample = sampleForExperimentComparisonScope(props.comparison);\n const rows = await experimentListData(sample, ctx.report.pricing);\n const defaultSort = \"summary\";\n return <TableContentView data={experimentListContent(rows)} sort={props.sort ?? defaultSort} searchable={props.searchable ?? true} locale={props.locale} className={props.className}/>;\n});\nExperimentTable.displayName = \"ExperimentTable\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"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","sourcesContent":["// 实体列表组合件:FailureList / AttemptList / ExperimentTable。\n// 列表本体是中立 Table 原语(TableContentView);语义全部住在 compute.ts 与\n// content.ts 的投影层,docs/feature/reports/library.md。\nimport type { ExperimentComparisonScope, Sample } from \"../../../analysis/index.ts\";\nimport { sampleForExperimentComparisonScope } from \"../../../analysis/experiment-groups.ts\";\nimport { defineComponent } from \"../../definition/tree.ts\";\nimport { TableContentView, Text } from \"../../definition/primitives.tsx\";\nimport type { ReportLocale } from \"../../model/locale.ts\";\nimport { attemptListData, experimentListData, type AttemptListItem, type ExperimentListItem, } from \"./compute.ts\";\nimport { attemptListContent, experimentListContent } from \"./content.ts\";\nexport { attemptListData, experimentListData, experimentEvalLayout, relativeEvalLabel, } from \"./compute.ts\";\nexport type { AttemptListItem, EvalLayoutNode, EvaluationKindComposition, ExperimentListEvalRow, ExperimentListItem, ExperimentMetrics, } from \"./compute.ts\";\nexport { attemptListContent, experimentListContent } from \"./content.ts\";\nexport interface FailureListProps {\n readonly limit?: number;\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly AttemptListItem[];\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** 失败处理台:只列 failed / errored attempt,按 startedAt 新到旧、locator 升序收口。 */\nexport const FailureList = defineComponent<FailureListProps>(async (props, ctx) => {\n const sample = props.input ?? ctx.scope;\n const all = props.rows ?? await attemptListData(sample, ctx.report.pricing);\n const failures = all\n .filter((item) => item.verdict === \"failed\" || item.verdict === \"errored\")\n .sort((left, right) => {\n const leftStarted = left.startedAt ?? Number.NEGATIVE_INFINITY;\n const rightStarted = right.startedAt ?? Number.NEGATIVE_INFINITY;\n if (leftStarted !== rightStarted)\n return leftStarted > rightStarted ? -1 : 1;\n return left.locator < right.locator ? -1 : left.locator > right.locator ? 1 : 0;\n });\n const limit = props.limit ?? 20;\n return <TableContentView data={attemptListContent(failures.slice(0, limit))} locale={props.locale} className={props.className}/>;\n});\nFailureList.displayName = \"FailureList\";\nexport interface AttemptListProps {\n /** 显式 Sample;省略时用当前组合上下文的 `ctx.scope`。 */\n readonly input?: Sample;\n /** 已闭合的行;省略时按 `input` 计算。 */\n readonly rows?: readonly AttemptListItem[];\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** 薄组合:attemptListData + Table。顺序保持传入顺序(不重排)。 */\nexport const AttemptList = defineComponent<AttemptListProps>(async (props, ctx) => {\n const rows = props.rows ?? await attemptListData(props.input ?? ctx.scope, ctx.report.pricing);\n return <TableContentView data={attemptListContent(rows)} locale={props.locale} className={props.className}/>;\n});\nAttemptList.displayName = \"AttemptList\";\nexport interface ExperimentTableProps {\n readonly comparison: ExperimentComparisonScope;\n /** 显示排序列;省略时按列表自身题型选择 passRate 或 totalScore。 */\n readonly sort?: string;\n readonly searchable?: boolean;\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\nexport const ExperimentTable = defineComponent<ExperimentTableProps>(async (props, ctx) => {\n const sample = sampleForExperimentComparisonScope(props.comparison);\n const rows = await experimentListData(sample, ctx.report.pricing);\n const defaultSort = \"summary\";\n return <TableContentView data={experimentListContent(rows)} sort={props.sort ?? defaultSort} searchable={props.searchable ?? true} locale={props.locale} className={props.className}/>;\n});\nExperimentTable.displayName = \"ExperimentTable\";\n"]}
@@ -40,9 +40,6 @@ exports.ExperimentScatter = (0, tree_ts_1.defineComponent)(async (props, ctx) =>
40
40
  if (pricing === null) {
41
41
  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) }) }));
42
42
  }
43
- if (props.comparison.comparison.state === "non-comparable") {
44
- 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(", ") }) }));
45
- }
46
43
  const sample = (0, experiment_groups_ts_1.sampleForExperimentComparisonScope)(props.comparison);
47
44
  const experiments = await (0, compute_ts_2.experimentListData)(sample, pricing);
48
45
  const data = await (0, compute_ts_1.experimentScatterData)(sample, {
@@ -55,8 +52,9 @@ exports.ExperimentScatter = (0, tree_ts_1.defineComponent)(async (props, ctx) =>
55
52
  }
56
53
  const passPoints = data.points.filter((point) => point.evaluationKind === "pass");
57
54
  const scorePoints = data.points.filter((point) => point.evaluationKind !== "pass");
55
+ const scoreConnect = props.connect === true && data.connect;
58
56
  const pointTarget = props.pointTarget ?? defaultExperimentPointTarget;
59
- 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 }) }))] }));
57
+ 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: scoreConnect }) }))] }));
60
58
  });
61
59
  exports.ExperimentScatter.displayName = "ExperimentScatter";
62
60
  /** The conventional summary + comparison composition. */
@@ -1 +1 @@
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 { experimentListData } from \"../entity-lists/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 sample = sampleForExperimentComparisonScope(props.comparison);\n const experiments = await experimentListData(sample, pricing);\n const data = await experimentScatterData(sample, {\n series: props.series,\n connect: props.connect,\n experiments,\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
+ {"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 { experimentListData } from \"../entity-lists/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 const sample = sampleForExperimentComparisonScope(props.comparison);\n const experiments = await experimentListData(sample, pricing);\n const data = await experimentScatterData(sample, {\n series: props.series,\n connect: props.connect,\n experiments,\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 scoreConnect = props.connect === true && data.connect;\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={scoreConnect}/>\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"]}
@@ -32,8 +32,13 @@ function formatCellText(cell, locale) {
32
32
  const more = cell.more && cell.more > 0 ? ` +${cell.more} more` : "";
33
33
  return `${cell.text}${more}`;
34
34
  }
35
- case "score":
36
- return cell.possible !== undefined ? `${cell.earned} / ${cell.possible}` : String(cell.earned);
35
+ case "score": {
36
+ const score = cell.possible !== undefined ? `${cell.earned} / ${cell.possible}` : String(cell.earned);
37
+ if (cell.missedScoreItems === undefined)
38
+ return score;
39
+ const loc = locale ?? locale_ts_1.DEFAULT_REPORT_LOCALE;
40
+ return `${score} · ${(0, locale_ts_1.countText)(loc, "experimentList.missedScoreItems", cell.missedScoreItems)}`;
41
+ }
37
42
  case "verdict": {
38
43
  const loc = locale ?? locale_ts_1.DEFAULT_REPORT_LOCALE;
39
44
  if (cell.counts) {
@@ -1 +1 @@
1
- {"version":3,"file":"cell.js","sourceRoot":"","sources":["cell.tsx"],"names":[],"mappings":"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","sourcesContent":["// 官方表格数据协议的单元格类型(docs/feature/reports/library.md「单元格类型」)。\n// Table / Grid / Stat 共用这份判别联合;自定义 Source 要交给这些原语必须适配成这个形状。\nimport type { AttemptLocator } from \"../../attempt-locator.ts\";\nimport type { LocalizedText } from \"../../shared/types.ts\";\nimport type { Verdict } from \"../../shared/types.ts\";\nimport type { MetricValue } from \"../../analysis/index.ts\";\nimport { formatMetricScalar, missingText, verdictMark } from \"../model/format.ts\";\nimport { formatCostProjectionCellText, isCostMetricValue } from \"../model/pricing.ts\";\nimport { DEFAULT_REPORT_LOCALE, localeText, resolveLocalizedText, type ReportLocale, } from \"../model/locale.ts\";\n/** 判定计票:passed / failed / errored / skipped。 */\nexport interface VerdictCounts {\n readonly passed: number;\n readonly failed: number;\n readonly errored: number;\n readonly skipped: number;\n}\n/**\n * 官方表格一格。三条不变量:\n * - metric 格永远带证据(不得压成 text);\n * - notApplicable 与 missing 不合并;\n * - summary 的文本已在上游折好。\n */\nexport type Cell = {\n /** 同一格内按顺序组合多个中立 Cell;不得嵌套 stack。 */\n readonly kind: \"stack\";\n readonly cells: readonly [\n Cell,\n ...Cell[]\n ];\n} | {\n readonly kind: \"metric\";\n readonly metric: MetricValue;\n /** Hide the compact samples/total suffix only when an adjacent region presents coverage. */\n readonly showCoverage?: boolean;\n} | {\n readonly kind: \"verdict\";\n readonly verdict?: Verdict | \"skipped\";\n readonly counts?: VerdictCounts;\n /** 计票覆盖的 attempt 引用(有证据可下钻的计票格才携带,如稳定性矩阵)。 */\n readonly refs?: readonly AttemptLocator[];\n // 两种形态:counts = 判定构成计票(experiment / Eval 行);verdict = 单判定(attempt 行)。\n // 格子只带值,计票怎么来的(折叠、分桶)在实体投影侧,渲染面不算数。\n /** 单判定形态省略判定词、只留判定符(如对照矩阵逐格只放得下一个符号的场景)。 */\n readonly bare?: boolean;\n} | {\n readonly kind: \"score\";\n readonly earned: number;\n readonly possible?: number;\n} | {\n readonly kind: \"summary\";\n readonly text: string;\n readonly more?: number;\n} | {\n readonly kind: \"locator\";\n readonly locator: AttemptLocator;\n /** 有判定的 attempt 行:判定长在 locator 上(判定符 + 语义色),没有判定就省略。 */\n readonly verdict?: Verdict | \"skipped\";\n} | {\n readonly kind: \"text\";\n readonly text: string;\n readonly detail?: string;\n} | {\n readonly kind: \"notApplicable\";\n} | {\n readonly kind: \"missing\";\n readonly code: string;\n /** 补上这一格的命令,可直接复制(如 `niceeval exp <experimentId>`)。 */\n readonly detail?: string;\n};\nexport interface ColumnSpec {\n readonly key: string;\n readonly unit?: string;\n readonly better?: \"higher\" | \"lower\";\n /**\n * 列表头。text / web 两面按当前 locale 解析同一份;省略时按 key 原样显示\n * (维度值列——条件名、实验 id 这类列名即数据的列——用这一支)。\n * Table 原语自己不携带列名词表,表头只来自这里\n * (docs/feature/reports/library.md「Content 协议」)。\n */\n readonly header?: LocalizedText;\n}\n/**\n * 表行 Content。与布局原语 `Row` 组件不同名。\n * placeholder 行照常渲染,但不进任何列的聚合读数。\n * group 行的读数由自己的 subRows 聚合而来,不是一条独立事实。\n */\nexport interface TableContentRow {\n readonly key: string;\n readonly cells: Readonly<Record<string, Cell>>;\n readonly subRows?: readonly TableContentRow[];\n /** group 行的读数由自己的 subRows 聚合而来,不是一条独立事实。 */\n readonly variant?: \"normal\" | \"placeholder\" | \"group\";\n}\nexport interface TableContent {\n readonly columns: readonly ColumnSpec[];\n readonly rows: readonly TableContentRow[];\n}\n/** 把 Cell 折成 text 面可见字符串(缺数据 / 不适用统一不补成 0)。 */\nexport function formatCellText(cell: Cell | null | undefined, locale?: ReportLocale): string {\n if (cell == null)\n return \"—\";\n switch (cell.kind) {\n case \"stack\":\n return cell.cells\n .map((entry) => formatCellText(entry, locale))\n .filter((entry) => entry !== \"—\")\n .join(\" · \") || \"—\";\n case \"notApplicable\":\n return \"—\";\n case \"missing\": {\n const loc = locale ?? DEFAULT_REPORT_LOCALE;\n const reason = missingText(cell.code, loc);\n return cell.detail ? `${reason} · ${cell.detail}` : reason;\n }\n case \"text\":\n return cell.detail ? `${cell.text}\\n ${cell.detail}` : cell.text;\n case \"locator\": {\n const mark = cell.verdict !== undefined ? `${verdictMark(cell.verdict === \"skipped\" ? \"skipped\" : cell.verdict)} ` : \"\";\n return `${mark}${cell.locator}`;\n }\n case \"summary\": {\n const more = cell.more && cell.more > 0 ? ` +${cell.more} more` : \"\";\n return `${cell.text}${more}`;\n }\n case \"score\":\n return cell.possible !== undefined ? `${cell.earned} / ${cell.possible}` : String(cell.earned);\n case \"verdict\": {\n const loc = locale ?? DEFAULT_REPORT_LOCALE;\n if (cell.counts) {\n const parts = ([\"passed\", \"failed\", \"errored\", \"skipped\"] as const)\n .filter((k) => cell.counts![k] > 0)\n .map((k) => `${cell.counts![k]} ${localeText(loc, `verdict.${k === \"skipped\" ? \"skipped\" : k}`)}`);\n return parts.join(\" · \") || \"—\";\n }\n if (cell.verdict !== undefined) {\n const v = cell.verdict === \"skipped\" ? \"skipped\" : cell.verdict;\n // 判定符与判定词同场,与 locator 格、web 面同一条纪律:单色打印下照样读得出。\n // bare 省略判定词,只留判定符,供逐格空间紧张的场景(如对照矩阵)使用。\n if (cell.bare)\n return verdictMark(v);\n return `${verdictMark(v)} ${localeText(loc, `verdict.${v}`)}`;\n }\n return \"—\";\n }\n case \"metric\": {\n if (isCostMetricValue(cell.metric)) {\n const closed = formatCostProjectionCellText(cell.metric, locale ?? DEFAULT_REPORT_LOCALE);\n return closed.detail ? `${closed.text}\\n ${closed.detail}` : closed.text;\n }\n if (cell.showCoverage === false) {\n return formatMetricScalar(cell.metric.value, cell.metric.unit, cell.metric.format, locale ?? DEFAULT_REPORT_LOCALE);\n }\n const display = formatMetricScalar(cell.metric.value, cell.metric.unit, cell.metric.format, locale ?? DEFAULT_REPORT_LOCALE);\n return `${display} · ${cell.metric.state}`;\n }\n default: {\n const _exhaustive: never = cell;\n return _exhaustive;\n }\n }\n}\n/** 把 TableContent 展平为 text 排版器用的预格式化行(含 subRows 缩进前缀)。 */\nexport function flattenTableContentForText(content: TableContent, locale?: string): {\n columns: Array<{\n key: string;\n header: string;\n align?: \"left\" | \"right\";\n }>;\n /** depth 是行树里的层数(顶层 0);text 面按它画组边界横线,不认识具体实体。 */\n rows: Array<{\n key: string;\n cells: Record<string, string | null>;\n variant?: string;\n depth: number;\n }>;\n} {\n // 表头与 web 面同源:走列声明的 header,缺省才回落 key。\n const columns = content.columns.map((c) => ({\n key: c.key,\n header: c.header !== undefined ? resolveLocalizedText(c.header, locale ?? DEFAULT_REPORT_LOCALE) : c.key,\n align: (c.better ? \"right\" : \"left\") as \"left\" | \"right\",\n }));\n const rows: Array<{\n key: string;\n cells: Record<string, string | null>;\n variant?: string;\n depth: number;\n }> = [];\n const walk = (row: TableContentRow, depth: number, ancestorLast: readonly boolean[], isLast: boolean): void => {\n const cells: Record<string, string | null> = {};\n for (const col of content.columns) {\n const cell = row.cells[col.key];\n let text = formatCellText(cell, locale);\n if (depth > 0 && col === content.columns[0] && text !== \"—\") {\n const rails = ancestorLast.map((last) => last ? \" \" : \"│ \").join(\"\");\n text = `${rails}${isLast ? \"└─ \" : \"├─ \"}${text}`;\n }\n cells[col.key] = text;\n }\n rows.push({ key: row.key, cells, variant: row.variant, depth });\n const children = row.subRows ?? [];\n const childAncestors = depth === 0 ? ancestorLast : [...ancestorLast, isLast];\n children.forEach((child, index) => walk(child, depth + 1, childAncestors, index === children.length - 1));\n };\n content.rows.forEach((row, index) => walk(row, 0, [], index === content.rows.length - 1));\n return { columns, rows };\n}\n"]}
1
+ {"version":3,"file":"cell.js","sourceRoot":"","sources":["cell.tsx"],"names":[],"mappings":"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","sourcesContent":["// 官方表格数据协议的单元格类型(docs/feature/reports/library.md「单元格类型」)。\n// Table / Grid / Stat 共用这份判别联合;自定义 Source 要交给这些原语必须适配成这个形状。\nimport type { AttemptLocator } from \"../../attempt-locator.ts\";\nimport type { LocalizedText } from \"../../shared/types.ts\";\nimport type { Verdict } from \"../../shared/types.ts\";\nimport type { MetricValue } from \"../../analysis/index.ts\";\nimport { formatMetricScalar, missingText, verdictMark } from \"../model/format.ts\";\nimport { formatCostProjectionCellText, isCostMetricValue } from \"../model/pricing.ts\";\nimport { DEFAULT_REPORT_LOCALE, countText, localeText, resolveLocalizedText, type ReportLocale, } from \"../model/locale.ts\";\n/** 判定计票:passed / failed / errored / skipped。 */\nexport interface VerdictCounts {\n readonly passed: number;\n readonly failed: number;\n readonly errored: number;\n readonly skipped: number;\n}\n/**\n * 官方表格一格。三条不变量:\n * - metric 格永远带证据(不得压成 text);\n * - notApplicable 与 missing 不合并;\n * - summary 的文本已在上游折好。\n */\nexport type Cell = {\n /** 同一格内按顺序组合多个中立 Cell;不得嵌套 stack。 */\n readonly kind: \"stack\";\n readonly cells: readonly [\n Cell,\n ...Cell[]\n ];\n} | {\n readonly kind: \"metric\";\n readonly metric: MetricValue;\n /** Hide the compact samples/total suffix only when an adjacent region presents coverage. */\n readonly showCoverage?: boolean;\n} | {\n readonly kind: \"verdict\";\n readonly verdict?: Verdict | \"skipped\";\n readonly counts?: VerdictCounts;\n /** 计票覆盖的 attempt 引用(有证据可下钻的计票格才携带,如稳定性矩阵)。 */\n readonly refs?: readonly AttemptLocator[];\n // 两种形态:counts = 判定构成计票(experiment / Eval 行);verdict = 单判定(attempt 行)。\n // 格子只带值,计票怎么来的(折叠、分桶)在实体投影侧,渲染面不算数。\n /** 单判定形态省略判定词、只留判定符(如对照矩阵逐格只放得下一个符号的场景)。 */\n readonly bare?: boolean;\n} | {\n readonly kind: \"score\";\n readonly earned: number;\n readonly possible?: number;\n /** Fully evaluated score contributions whose earned value is below their declared points. */\n readonly missedScoreItems?: number;\n} | {\n readonly kind: \"summary\";\n readonly text: string;\n readonly more?: number;\n} | {\n readonly kind: \"locator\";\n readonly locator: AttemptLocator;\n /** 有判定的 attempt 行:判定长在 locator 上(判定符 + 语义色),没有判定就省略。 */\n readonly verdict?: Verdict | \"skipped\";\n} | {\n readonly kind: \"text\";\n readonly text: string;\n readonly detail?: string;\n} | {\n readonly kind: \"notApplicable\";\n} | {\n readonly kind: \"missing\";\n readonly code: string;\n /** 补上这一格的命令,可直接复制(如 `niceeval exp <experimentId>`)。 */\n readonly detail?: string;\n};\nexport interface ColumnSpec {\n readonly key: string;\n readonly unit?: string;\n readonly better?: \"higher\" | \"lower\";\n /**\n * 列表头。text / web 两面按当前 locale 解析同一份;省略时按 key 原样显示\n * (维度值列——条件名、实验 id 这类列名即数据的列——用这一支)。\n * Table 原语自己不携带列名词表,表头只来自这里\n * (docs/feature/reports/library.md「Content 协议」)。\n */\n readonly header?: LocalizedText;\n}\n/**\n * 表行 Content。与布局原语 `Row` 组件不同名。\n * placeholder 行照常渲染,但不进任何列的聚合读数。\n * group 行的读数由自己的 subRows 聚合而来,不是一条独立事实。\n */\nexport interface TableContentRow {\n readonly key: string;\n readonly cells: Readonly<Record<string, Cell>>;\n readonly subRows?: readonly TableContentRow[];\n /** group 行的读数由自己的 subRows 聚合而来,不是一条独立事实。 */\n readonly variant?: \"normal\" | \"placeholder\" | \"group\";\n}\nexport interface TableContent {\n readonly columns: readonly ColumnSpec[];\n readonly rows: readonly TableContentRow[];\n}\n/** 把 Cell 折成 text 面可见字符串(缺数据 / 不适用统一不补成 0)。 */\nexport function formatCellText(cell: Cell | null | undefined, locale?: ReportLocale): string {\n if (cell == null)\n return \"—\";\n switch (cell.kind) {\n case \"stack\":\n return cell.cells\n .map((entry) => formatCellText(entry, locale))\n .filter((entry) => entry !== \"—\")\n .join(\" · \") || \"—\";\n case \"notApplicable\":\n return \"—\";\n case \"missing\": {\n const loc = locale ?? DEFAULT_REPORT_LOCALE;\n const reason = missingText(cell.code, loc);\n return cell.detail ? `${reason} · ${cell.detail}` : reason;\n }\n case \"text\":\n return cell.detail ? `${cell.text}\\n ${cell.detail}` : cell.text;\n case \"locator\": {\n const mark = cell.verdict !== undefined ? `${verdictMark(cell.verdict === \"skipped\" ? \"skipped\" : cell.verdict)} ` : \"\";\n return `${mark}${cell.locator}`;\n }\n case \"summary\": {\n const more = cell.more && cell.more > 0 ? ` +${cell.more} more` : \"\";\n return `${cell.text}${more}`;\n }\n case \"score\": {\n const score = cell.possible !== undefined ? `${cell.earned} / ${cell.possible}` : String(cell.earned);\n if (cell.missedScoreItems === undefined)\n return score;\n const loc = locale ?? DEFAULT_REPORT_LOCALE;\n return `${score} · ${countText(loc, \"experimentList.missedScoreItems\", cell.missedScoreItems)}`;\n }\n case \"verdict\": {\n const loc = locale ?? DEFAULT_REPORT_LOCALE;\n if (cell.counts) {\n const parts = ([\"passed\", \"failed\", \"errored\", \"skipped\"] as const)\n .filter((k) => cell.counts![k] > 0)\n .map((k) => `${cell.counts![k]} ${localeText(loc, `verdict.${k === \"skipped\" ? \"skipped\" : k}`)}`);\n return parts.join(\" · \") || \"—\";\n }\n if (cell.verdict !== undefined) {\n const v = cell.verdict === \"skipped\" ? \"skipped\" : cell.verdict;\n // 判定符与判定词同场,与 locator 格、web 面同一条纪律:单色打印下照样读得出。\n // bare 省略判定词,只留判定符,供逐格空间紧张的场景(如对照矩阵)使用。\n if (cell.bare)\n return verdictMark(v);\n return `${verdictMark(v)} ${localeText(loc, `verdict.${v}`)}`;\n }\n return \"—\";\n }\n case \"metric\": {\n if (isCostMetricValue(cell.metric)) {\n const closed = formatCostProjectionCellText(cell.metric, locale ?? DEFAULT_REPORT_LOCALE);\n return closed.detail ? `${closed.text}\\n ${closed.detail}` : closed.text;\n }\n if (cell.showCoverage === false) {\n return formatMetricScalar(cell.metric.value, cell.metric.unit, cell.metric.format, locale ?? DEFAULT_REPORT_LOCALE);\n }\n const display = formatMetricScalar(cell.metric.value, cell.metric.unit, cell.metric.format, locale ?? DEFAULT_REPORT_LOCALE);\n return `${display} · ${cell.metric.state}`;\n }\n default: {\n const _exhaustive: never = cell;\n return _exhaustive;\n }\n }\n}\n/** 把 TableContent 展平为 text 排版器用的预格式化行(含 subRows 缩进前缀)。 */\nexport function flattenTableContentForText(content: TableContent, locale?: string): {\n columns: Array<{\n key: string;\n header: string;\n align?: \"left\" | \"right\";\n }>;\n /** depth 是行树里的层数(顶层 0);text 面按它画组边界横线,不认识具体实体。 */\n rows: Array<{\n key: string;\n cells: Record<string, string | null>;\n variant?: string;\n depth: number;\n }>;\n} {\n // 表头与 web 面同源:走列声明的 header,缺省才回落 key。\n const columns = content.columns.map((c) => ({\n key: c.key,\n header: c.header !== undefined ? resolveLocalizedText(c.header, locale ?? DEFAULT_REPORT_LOCALE) : c.key,\n align: (c.better ? \"right\" : \"left\") as \"left\" | \"right\",\n }));\n const rows: Array<{\n key: string;\n cells: Record<string, string | null>;\n variant?: string;\n depth: number;\n }> = [];\n const walk = (row: TableContentRow, depth: number, ancestorLast: readonly boolean[], isLast: boolean): void => {\n const cells: Record<string, string | null> = {};\n for (const col of content.columns) {\n const cell = row.cells[col.key];\n let text = formatCellText(cell, locale);\n if (depth > 0 && col === content.columns[0] && text !== \"—\") {\n const rails = ancestorLast.map((last) => last ? \" \" : \"│ \").join(\"\");\n text = `${rails}${isLast ? \"└─ \" : \"├─ \"}${text}`;\n }\n cells[col.key] = text;\n }\n rows.push({ key: row.key, cells, variant: row.variant, depth });\n const children = row.subRows ?? [];\n const childAncestors = depth === 0 ? ancestorLast : [...ancestorLast, isLast];\n children.forEach((child, index) => walk(child, depth + 1, childAncestors, index === children.length - 1));\n };\n content.rows.forEach((row, index) => walk(row, 0, [], index === content.rows.length - 1));\n return { columns, rows };\n}\n"]}
@@ -37,6 +37,8 @@ export type Cell = {
37
37
  readonly kind: "score";
38
38
  readonly earned: number;
39
39
  readonly possible?: number;
40
+ /** Fully evaluated score contributions whose earned value is below their declared points. */
41
+ readonly missedScoreItems?: number;
40
42
  } | {
41
43
  readonly kind: "summary";
42
44
  readonly text: string;
@@ -37,6 +37,8 @@ export type Cell = {
37
37
  readonly kind: "score";
38
38
  readonly earned: number;
39
39
  readonly possible?: number;
40
+ /** Fully evaluated score contributions whose earned value is below their declared points. */
41
+ readonly missedScoreItems?: number;
40
42
  } | {
41
43
  readonly kind: "summary";
42
44
  readonly text: string;
@@ -37,6 +37,8 @@ export type Cell = {
37
37
  readonly kind: "score";
38
38
  readonly earned: number;
39
39
  readonly possible?: number;
40
+ /** Fully evaluated score contributions whose earned value is below their declared points. */
41
+ readonly missedScoreItems?: number;
40
42
  } | {
41
43
  readonly kind: "summary";
42
44
  readonly text: string;