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
@@ -0,0 +1,39 @@
1
+ import { Context, Effect } from "effect";
2
+ import type { ReportDefinition } from "../definition/report.js";
3
+ import type { ThemeDefinition } from "../theme.js";
4
+ declare const ReportPlatformError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
5
+ readonly _tag: "ReportPlatformError";
6
+ } & Readonly<A>;
7
+ export declare class ReportPlatformError extends ReportPlatformError_base<{
8
+ readonly operation: "load-config" | "load-report" | "load-theme" | "open-browser";
9
+ readonly cause: unknown;
10
+ }> {
11
+ }
12
+ export interface ReportModulePlatformService {
13
+ readonly loadConfig: (cwd: string, options?: {
14
+ readonly includeTheme?: boolean;
15
+ }) => Effect.Effect<{
16
+ readonly report?: ReportDefinition;
17
+ readonly theme?: ThemeDefinition;
18
+ readonly watchInputs: readonly string[];
19
+ }, ReportPlatformError>;
20
+ readonly loadReport: (path: string) => Effect.Effect<{
21
+ readonly report: ReportDefinition;
22
+ readonly watchInputs: readonly string[];
23
+ }, ReportPlatformError>;
24
+ readonly loadTheme: (path: string) => Effect.Effect<{
25
+ readonly theme: ThemeDefinition;
26
+ readonly watchInputs: readonly string[];
27
+ }, ReportPlatformError>;
28
+ readonly resolveModulePath: (cwd: string, value: string) => string;
29
+ }
30
+ declare const ReportModulePlatform_base: Context.TagClass<ReportModulePlatform, "@niceeval/report/ReportModulePlatform", ReportModulePlatformService>;
31
+ export declare class ReportModulePlatform extends ReportModulePlatform_base {
32
+ }
33
+ export interface ReportBrowserService {
34
+ readonly open: (url: string) => Effect.Effect<boolean, ReportPlatformError>;
35
+ }
36
+ declare const ReportBrowser_base: Context.TagClass<ReportBrowser, "@niceeval/report/ReportBrowser", ReportBrowserService>;
37
+ export declare class ReportBrowser extends ReportBrowser_base {
38
+ }
39
+ export {};
@@ -0,0 +1,10 @@
1
+ import { createRequire as __niceevalCreateRequire } from "node:module";
2
+ const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
3
+ const __niceevalCanonical = __niceevalRequire("./operations.cjs");
4
+ const __niceevalExport0 = __niceevalCanonical["ReportBrowser"];
5
+ export { __niceevalExport0 as ReportBrowser };
6
+ const __niceevalExport1 = __niceevalCanonical["ReportModulePlatform"];
7
+ export { __niceevalExport1 as ReportModulePlatform };
8
+ const __niceevalExport2 = __niceevalCanonical["ReportPlatformError"];
9
+ export { __niceevalExport2 as ReportPlatformError };
10
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sources":[],"names":[],"mappings":""}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.renderCharPlot = renderCharPlot;
4
4
  exports.renderCoordinateTable = renderCoordinateTable;
5
5
  // text 面的字符坐标图:Scatter / Line 共用。
6
- // 形态照 docs-site/zh/reference/report-components.mdx 的示例块:y 轴刻度 + │ 边框,
6
+ // 形态照 apps/docs-site/zh/reference/report-components.mdx 的示例块:y 轴刻度 + │ 边框,
7
7
  // 点用字母标注、图例列在图下;lower-better 的轴反向,「好」的角落恒在右上。
8
8
  const text_layout_ts_1 = require("../text-layout.cjs");
9
9
  function makeScale(lo, hi, cells, invert) {
@@ -1 +1 @@
1
- {"version":3,"file":"plot.js","sourceRoot":"","sources":["plot.ts"],"names":[],"mappings":";;AA+EA,wCAyCC;AAMD,sDAyBC;AAvJD,kCAAkC;AAClC,sEAAsE;AACtE,8CAA8C;AAC9C,sDAA6E;AA8C7E,SAAS,SAAS,CAAC,EAAU,EAAE,EAAU,EAAE,KAAa,EAAE,MAAe;IACrE,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC;IACrB,OAAO;QACH,EAAE;QACF,EAAE;QACF,EAAE,CAAC,KAAa;YACZ,cAAc;YACd,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC;YAC/C,IAAI,MAAM;gBACN,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,CAAC;KACJ,CAAC;AACN,CAAC;AACD,qCAAqC;AACrC,SAAS,QAAQ,CAAC,IAAgB,EAAE,CAGnC,EAAE,CAGF;IACG,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG;YACtB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC7B,CAAC;AACL,CAAC;AACD,SAAgB,cAAc,CAAC,IAAqB;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;IAC1G,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,4BAAW,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAC7F,iDAAiD;IACjD,gEAAgE;IAChE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,IAAI,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5G,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvI,CAAC;IACL,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IAC1D,CAAC;IACD,0BAA0B;IAC1B,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAClD,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAA,gCAAe,EAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3E,iCAAiC;IACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9D,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACjF,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;QACzD,IAAI,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,IAAA,4BAAW,EAAC,KAAK,CAAC,CAAC,CAAC;QACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;YACxD,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9E,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AACD;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,IAMnC,EAAE,MAMJ;IACG,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAwC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,4BAAW,EAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,GAAG;SACL,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAA,2BAAU,EAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;SACpG,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;SACjC,IAAI,CAAC,KAAK,CAAC;SACX,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;SACpB,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC","sourcesContent":["// text 面的字符坐标图:Scatter / Line 共用。\n// 形态照 docs-site/zh/reference/report-components.mdx 的示例块:y 轴刻度 + │ 边框,\n// 点用字母标注、图例列在图下;lower-better 的轴反向,「好」的角落恒在右上。\nimport { padDisplay, padStartDisplay, stringWidth } from \"../text-layout.ts\";\nexport interface PlotPoint {\n /** 图上的标记字符(点或系列的字母)。 */\n mark: string;\n x: number;\n y: number;\n}\nexport interface CharPlotOptions {\n /** 总列宽(含 y 轴刻度区)。 */\n width: number;\n /** 网格行数;默认 9。 */\n height?: number;\n points: PlotPoint[];\n /**\n * 值域(已按呼吸边距 / bounds 钳制推定,与 web 面共用同一份——见\n * chart-math.ts 的 `paddedAxisDomain`,调用方在此之前算好,text 面按字符行列粒度取整,\n * 不重算)。\n */\n xDomain: [\n number,\n number\n ];\n yDomain: [\n number,\n number\n ];\n /** 值空间的折线(同系列点按 x 排序连线),用 · 描画,字母覆盖其上。 */\n lines?: {\n x: number;\n y: number;\n }[][];\n xLabel: string;\n yLabel: string;\n /** 值 → 刻度文案(已格式化的 display)。 */\n formatX: (value: number, step?: number) => string;\n formatY: (value: number, step?: number) => string;\n /** better: \"lower\" 的轴反向 —— 好的一端在右 / 上。 */\n invertX?: boolean;\n invertY?: boolean;\n}\ninterface Scale {\n lo: number;\n hi: number;\n /** 值 → [0, cells-1] 的下标。 */\n at(value: number): number;\n}\nfunction makeScale(lo: number, hi: number, cells: number, invert: boolean): Scale {\n const span = hi - lo;\n return {\n lo,\n hi,\n at(value: number): number {\n // 单值域:唯一的点落正中\n let t = span === 0 ? 0.5 : (value - lo) / span;\n if (invert)\n t = 1 - t;\n return Math.max(0, Math.min(cells - 1, Math.round(t * (cells - 1))));\n },\n };\n}\n/** 值空间折线 → 网格 · 描画:相邻点之间按列逐格线性插值。 */\nfunction drawLine(grid: string[][], a: {\n col: number;\n row: number;\n}, b: {\n col: number;\n row: number;\n}): void {\n const steps = Math.max(Math.abs(b.col - a.col), Math.abs(b.row - a.row));\n for (let i = 1; i < steps; i++) {\n const col = Math.round(a.col + ((b.col - a.col) * i) / steps);\n const row = Math.round(a.row + ((b.row - a.row) * i) / steps);\n if (grid[row][col] === \" \")\n grid[row][col] = \"·\";\n }\n}\nexport function renderCharPlot(opts: CharPlotOptions): string {\n const height = Math.max(4, opts.height ?? 9);\n const yTickTexts = [opts.formatY(opts.yDomain[0]), opts.formatY(opts.yDomain[1])]; // 仅估 gutter 宽度,精度不参与展示\n const gutter = Math.max(...yTickTexts.map(stringWidth)) + 1;\n const plotWidth = Math.max(16, opts.width - gutter - 1);\n const xScale = makeScale(opts.xDomain[0], opts.xDomain[1], plotWidth, opts.invertX ?? false);\n // y:大下标 = 「好」的一端;网格第 0 行是顶端,行下标 = height-1 - at,\n // 所以 invertY=false(higher 好)时 hi 折到 at=height-1 → 顶行,lower 好时反之\n const yScale = makeScale(opts.yDomain[0], opts.yDomain[1], height, opts.invertY ?? false);\n const rowOf = (y: number) => height - 1 - yScale.at(y);\n const grid: string[][] = Array.from({ length: height }, () => Array.from({ length: plotWidth }, () => \" \"));\n for (const line of opts.lines ?? []) {\n for (let i = 1; i < line.length; i++) {\n drawLine(grid, { col: xScale.at(line[i - 1].x), row: rowOf(line[i - 1].y) }, { col: xScale.at(line[i].x), row: rowOf(line[i].y) });\n }\n }\n for (const point of opts.points) {\n grid[rowOf(point.y)][xScale.at(point.x)] = point.mark;\n }\n // y 轴刻度:极值行标注 display,其余空\n const tickByRow = new Map<number, string>();\n tickByRow.set(rowOf(yScale.lo), opts.formatY(yScale.lo, yScale.hi - yScale.lo));\n tickByRow.set(rowOf(yScale.hi), opts.formatY(yScale.hi, yScale.hi - yScale.lo));\n const out: string[] = [];\n out.push(`${\" \".repeat(gutter)}${opts.yLabel} ↑`);\n for (let row = 0; row < height; row++) {\n const tick = tickByRow.get(row) ?? \"\";\n out.push(`${padStartDisplay(tick, gutter)}│${grid[row].join(\"\")}`.replace(/\\s+$/, \"\"));\n }\n out.push(`${\" \".repeat(gutter)}└${\"─\".repeat(plotWidth)}→ ${opts.xLabel}`);\n // x 轴刻度:两端极值(反向轴时右端是 lo),标在真实位置上\n const ticksRow = Array.from({ length: plotWidth }, () => \" \");\n for (const value of xScale.lo === xScale.hi ? [xScale.lo] : [xScale.lo, xScale.hi]) {\n const label = opts.formatX(value, xScale.hi - xScale.lo);\n let col = xScale.at(value);\n col = Math.min(col, plotWidth - stringWidth(label));\n for (let i = 0; i < label.length && col + i < plotWidth; i++)\n ticksRow[col + i] = label[i];\n }\n out.push(`${\" \".repeat(gutter + 1)}${ticksRow.join(\"\")}`.replace(/\\s+$/, \"\"));\n return out.join(\"\\n\");\n}\n/**\n * 图下的读值表:每行是一个点的标记字母、所属系列、点名与两轴终值。字母把图上的记号与这\n * 一行绑在一起(docs/feature/reports/cli.md「标记字母按图例顺序分配」);\n * `series` 列只在有两个以上系列时出现,单系列时那一列全是同一个词、占宽度不给信息。\n */\nexport function renderCoordinateTable(rows: {\n mark?: string;\n series?: string;\n key: string;\n x: string;\n y: string;\n}[], header: {\n mark?: string;\n series?: string;\n key: string;\n x: string;\n y: string;\n}): string {\n const all = [header, ...rows];\n const columns: (\"mark\" | \"series\" | \"key\" | \"x\")[] = [\"mark\", \"series\", \"key\", \"x\"];\n const widths = new Map<string, number>();\n for (const column of columns) {\n widths.set(column, Math.max(...all.map((row) => stringWidth(row[column] ?? \"\"))));\n }\n return all\n .map((row) => [...columns.map((column) => padDisplay(row[column] ?? \"\", widths.get(column)!)), row.y]\n .filter((cell) => cell.length > 0)\n .join(\" \")\n .replace(/\\s+$/, \"\"))\n .join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"plot.js","sourceRoot":"","sources":["plot.ts"],"names":[],"mappings":"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","sourcesContent":["// text 面的字符坐标图:Scatter / Line 共用。\n// 形态照 apps/docs-site/zh/reference/report-components.mdx 的示例块:y 轴刻度 + │ 边框,\n// 点用字母标注、图例列在图下;lower-better 的轴反向,「好」的角落恒在右上。\nimport { padDisplay, padStartDisplay, stringWidth } from \"../text-layout.ts\";\nexport interface PlotPoint {\n /** 图上的标记字符(点或系列的字母)。 */\n mark: string;\n x: number;\n y: number;\n}\nexport interface CharPlotOptions {\n /** 总列宽(含 y 轴刻度区)。 */\n width: number;\n /** 网格行数;默认 9。 */\n height?: number;\n points: PlotPoint[];\n /**\n * 值域(已按呼吸边距 / bounds 钳制推定,与 web 面共用同一份——见\n * chart-math.ts 的 `paddedAxisDomain`,调用方在此之前算好,text 面按字符行列粒度取整,\n * 不重算)。\n */\n xDomain: [\n number,\n number\n ];\n yDomain: [\n number,\n number\n ];\n /** 值空间的折线(同系列点按 x 排序连线),用 · 描画,字母覆盖其上。 */\n lines?: {\n x: number;\n y: number;\n }[][];\n xLabel: string;\n yLabel: string;\n /** 值 → 刻度文案(已格式化的 display)。 */\n formatX: (value: number, step?: number) => string;\n formatY: (value: number, step?: number) => string;\n /** better: \"lower\" 的轴反向 —— 好的一端在右 / 上。 */\n invertX?: boolean;\n invertY?: boolean;\n}\ninterface Scale {\n lo: number;\n hi: number;\n /** 值 → [0, cells-1] 的下标。 */\n at(value: number): number;\n}\nfunction makeScale(lo: number, hi: number, cells: number, invert: boolean): Scale {\n const span = hi - lo;\n return {\n lo,\n hi,\n at(value: number): number {\n // 单值域:唯一的点落正中\n let t = span === 0 ? 0.5 : (value - lo) / span;\n if (invert)\n t = 1 - t;\n return Math.max(0, Math.min(cells - 1, Math.round(t * (cells - 1))));\n },\n };\n}\n/** 值空间折线 → 网格 · 描画:相邻点之间按列逐格线性插值。 */\nfunction drawLine(grid: string[][], a: {\n col: number;\n row: number;\n}, b: {\n col: number;\n row: number;\n}): void {\n const steps = Math.max(Math.abs(b.col - a.col), Math.abs(b.row - a.row));\n for (let i = 1; i < steps; i++) {\n const col = Math.round(a.col + ((b.col - a.col) * i) / steps);\n const row = Math.round(a.row + ((b.row - a.row) * i) / steps);\n if (grid[row][col] === \" \")\n grid[row][col] = \"·\";\n }\n}\nexport function renderCharPlot(opts: CharPlotOptions): string {\n const height = Math.max(4, opts.height ?? 9);\n const yTickTexts = [opts.formatY(opts.yDomain[0]), opts.formatY(opts.yDomain[1])]; // 仅估 gutter 宽度,精度不参与展示\n const gutter = Math.max(...yTickTexts.map(stringWidth)) + 1;\n const plotWidth = Math.max(16, opts.width - gutter - 1);\n const xScale = makeScale(opts.xDomain[0], opts.xDomain[1], plotWidth, opts.invertX ?? false);\n // y:大下标 = 「好」的一端;网格第 0 行是顶端,行下标 = height-1 - at,\n // 所以 invertY=false(higher 好)时 hi 折到 at=height-1 → 顶行,lower 好时反之\n const yScale = makeScale(opts.yDomain[0], opts.yDomain[1], height, opts.invertY ?? false);\n const rowOf = (y: number) => height - 1 - yScale.at(y);\n const grid: string[][] = Array.from({ length: height }, () => Array.from({ length: plotWidth }, () => \" \"));\n for (const line of opts.lines ?? []) {\n for (let i = 1; i < line.length; i++) {\n drawLine(grid, { col: xScale.at(line[i - 1].x), row: rowOf(line[i - 1].y) }, { col: xScale.at(line[i].x), row: rowOf(line[i].y) });\n }\n }\n for (const point of opts.points) {\n grid[rowOf(point.y)][xScale.at(point.x)] = point.mark;\n }\n // y 轴刻度:极值行标注 display,其余空\n const tickByRow = new Map<number, string>();\n tickByRow.set(rowOf(yScale.lo), opts.formatY(yScale.lo, yScale.hi - yScale.lo));\n tickByRow.set(rowOf(yScale.hi), opts.formatY(yScale.hi, yScale.hi - yScale.lo));\n const out: string[] = [];\n out.push(`${\" \".repeat(gutter)}${opts.yLabel} ↑`);\n for (let row = 0; row < height; row++) {\n const tick = tickByRow.get(row) ?? \"\";\n out.push(`${padStartDisplay(tick, gutter)}│${grid[row].join(\"\")}`.replace(/\\s+$/, \"\"));\n }\n out.push(`${\" \".repeat(gutter)}└${\"─\".repeat(plotWidth)}→ ${opts.xLabel}`);\n // x 轴刻度:两端极值(反向轴时右端是 lo),标在真实位置上\n const ticksRow = Array.from({ length: plotWidth }, () => \" \");\n for (const value of xScale.lo === xScale.hi ? [xScale.lo] : [xScale.lo, xScale.hi]) {\n const label = opts.formatX(value, xScale.hi - xScale.lo);\n let col = xScale.at(value);\n col = Math.min(col, plotWidth - stringWidth(label));\n for (let i = 0; i < label.length && col + i < plotWidth; i++)\n ticksRow[col + i] = label[i];\n }\n out.push(`${\" \".repeat(gutter + 1)}${ticksRow.join(\"\")}`.replace(/\\s+$/, \"\"));\n return out.join(\"\\n\");\n}\n/**\n * 图下的读值表:每行是一个点的标记字母、所属系列、点名与两轴终值。字母把图上的记号与这\n * 一行绑在一起(docs/feature/reports/cli.md「标记字母按图例顺序分配」);\n * `series` 列只在有两个以上系列时出现,单系列时那一列全是同一个词、占宽度不给信息。\n */\nexport function renderCoordinateTable(rows: {\n mark?: string;\n series?: string;\n key: string;\n x: string;\n y: string;\n}[], header: {\n mark?: string;\n series?: string;\n key: string;\n x: string;\n y: string;\n}): string {\n const all = [header, ...rows];\n const columns: (\"mark\" | \"series\" | \"key\" | \"x\")[] = [\"mark\", \"series\", \"key\", \"x\"];\n const widths = new Map<string, number>();\n for (const column of columns) {\n widths.set(column, Math.max(...all.map((row) => stringWidth(row[column] ?? \"\"))));\n }\n return all\n .map((row) => [...columns.map((column) => padDisplay(row[column] ?? \"\", widths.get(column)!)), row.y]\n .filter((cell) => cell.length > 0)\n .join(\" \")\n .replace(/\\s+$/, \"\"))\n .join(\"\\n\");\n}\n"]}
@@ -82,6 +82,8 @@ const en = {
82
82
  "experimentList.passRateDescription": "End-to-end pass rate: passed = 1; failed and errored = 0",
83
83
  "experimentList.totalScore": "Total score",
84
84
  "experimentList.totalScoreDescription": "Total score: sum of points earned across evals",
85
+ "experimentList.missedScoreItems.one": "{n} missed check",
86
+ "experimentList.missedScoreItems.other": "{n} missed checks",
85
87
  "experimentList.tokens": "Tokens",
86
88
  "experimentList.cost": "Cost",
87
89
  "experimentList.result": "Result",
@@ -267,6 +269,8 @@ const zhCN = {
267
269
  "experimentList.passRateDescription": "端到端通过率:passed = 1;failed 和 errored = 0",
268
270
  "experimentList.totalScore": "总分",
269
271
  "experimentList.totalScoreDescription": "总分:各 Eval 挣分之和",
272
+ "experimentList.missedScoreItems.one": "{n} 项未满足",
273
+ "experimentList.missedScoreItems.other": "{n} 项未满足",
270
274
  "experimentList.tokens": "Tokens",
271
275
  "experimentList.cost": "成本",
272
276
  "experimentList.result": "结果",
@@ -1 +1 @@
1
- {"version":3,"file":"locale.js","sourceRoot":"","sources":["locale.ts"],"names":[],"mappings":"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","sourcesContent":["// 官方组件 chrome 文案的 locale 字典与 LocalizedText 解析。\n// ReportLocale 是开放的 BCP 47 标签(数据协议不封语言上限);官方内置文案与\n// 官方固定文案覆盖 en / zh-CN;公共 MetricValue 由 renderer 按当前 locale 格式化。\n// 只覆盖组件自带的固定文案(verdict 词、缺数据、覆盖率角标、注脚、占位符等);\n// 维度键、issues 的 message 不经这里。\n// 刻意不 import src/i18n/(CLI 专用字典,locale 来源与 key 面完全不同)。\nimport type { LocalizedText } from \"../../types.ts\";\nexport type { LocalizedText };\n/** 报告渲染的 locale(BCP 47 标签,开放);默认 \"en\"(`niceeval show` 缺省输出不变)。 */\nexport type ReportLocale = string;\nexport const DEFAULT_REPORT_LOCALE: ReportLocale = \"en\";\n/** 官方固定文案覆盖的 locale 全集。 */\nexport const DISPLAY_LOCALES: readonly ReportLocale[] = [\"en\", \"zh-CN\"];\n/**\n * LocalizedText 的确定回退:取当前 locale;缺失时取 en;仍缺失时取按 locale 键字典序的\n * 第一个非空值。对象没有任何非空值时报错,不渲染空文案\n * (docs/feature/reports/library.md「行为约束」)。\n */\nexport function resolveLocalizedText(text: LocalizedText, locale: ReportLocale): string {\n if (typeof text === \"string\")\n return text;\n const direct = text[locale];\n if (direct !== undefined && direct !== \"\")\n return direct;\n const en = text.en;\n if (en !== undefined && en !== \"\")\n return en;\n for (const key of Object.keys(text).sort()) {\n const value = text[key];\n if (value !== undefined && value !== \"\")\n return value;\n }\n throw new Error(\"LocalizedText object has no non-empty value. Provide at least one locale entry, e.g. { en: \\\"…\\\" }.\");\n}\n/** LocalizedText 按字段值深相等(键顺序无关;标题回退链的「唯一且相同」判定用)。 */\nexport function localizedTextEquals(a: LocalizedText, b: LocalizedText): boolean {\n if (typeof a === \"string\" || typeof b === \"string\")\n return a === b;\n const keysA = Object.keys(a).sort();\n const keysB = Object.keys(b).sort();\n if (keysA.length !== keysB.length)\n return false;\n return keysA.every((key, i) => key === keysB[i] && a[key] === b[key]);\n}\nconst en = {\n \"verdict.passed\": \"passed\",\n \"verdict.failed\": \"failed\",\n \"verdict.errored\": \"errored\",\n \"verdict.skipped\": \"skipped\",\n /** AttemptSummary 的重试序号(0 起的 identity.attempt 显示前 +1)。 */\n \"attemptSummary.attempt\": \"attempt {n}\",\n /** formatTimeDistance 的四区间读法(presentation.md「相对时距是数据,不是文案」)。 */\n \"timeDistance.minute\": \"{n}m\",\n \"timeDistance.hour\": \"{n}h\",\n \"timeDistance.day\": \"{n}d\",\n \"timeDistance.month\": \"{n}mo\",\n /** 全 null / 无样本的统一文案,绝不画 0。 */\n \"cell.missing\": \"no data\",\n /** missing 格 code=`unscorable`:有 attempt,但读数测不出。 */\n \"cell.unscorable\": \"unscorable\",\n /** missing 格 code=`noCurrentResult`:当前配置下这道题没有结果(覆盖缺口占位行)。 */\n \"cell.noCurrentResult\": \"no result for current config\",\n \"cell.measuredTitle\": \"{samples}/{total} attempts measured\",\n \"cell.noneMeasurableTitle\": \"0/{total} attempts measurable\",\n \"cell.coverageTitle\": \"coverage {samples}/{total}: this metric is null for the remaining attempts\",\n \"cell.missingValue\": \"(missing)\",\n \"cell.evidence.one\": \"{n} attempt\",\n \"cell.evidence.other\": \"{n} attempts\",\n \"table.higherBetter\": \"higher is better\",\n \"table.lowerBetter\": \"lower is better\",\n \"table.model\": \"Model\",\n \"table.agent\": \"Agent\",\n \"table.verdicts\": \"Verdicts\",\n \"table.filterPlaceholder\": \"Filter rows…\",\n \"table.eval\": \"Eval\",\n \"table.reason\": \"Reason\",\n \"table.viewBreakdown\": \"Per-eval breakdown\",\n /** <Table> 的 locator 列表头(行带 locator 时自动追加)。 */\n \"table.attempt\": \"attempt\",\n \"experimentList.experiment\": \"Experiment\",\n \"experimentList.avgDuration\": \"Avg. time\",\n \"experimentList.passRate\": \"Pass rate\",\n \"experimentList.passRateDescription\": \"End-to-end pass rate: passed = 1; failed and errored = 0\",\n \"experimentList.totalScore\": \"Total score\",\n \"experimentList.totalScoreDescription\": \"Total score: sum of points earned across evals\",\n \"experimentList.tokens\": \"Tokens\",\n \"experimentList.cost\": \"Cost\",\n \"experimentList.result\": \"Result\",\n \"experimentList.status\": \"Status\",\n \"experimentList.evalAttempt\": \"Eval / Attempt\",\n \"experimentList.duration\": \"Duration\",\n \"experimentList.filterPlaceholder\": \"Filter experiments…\",\n \"experimentList.defaultModel\": \"default\",\n \"experimentList.flags\": \"Flags\",\n \"entityList.average\": \"{value} avg\",\n \"entityList.moreFailures.one\": \"+{n} more failure\",\n \"entityList.moreFailures.other\": \"+{n} more failures\",\n /** 计分制 passed attempt 丢分得分点的「其余」计数(规则 6);与 moreFailures 同结构,措辞不同——\n * 丢分不是失败,不该说成 \"more failures\"(entity-lists.md AttemptListItem.moreFailures 字段注释)。 */\n \"entityList.moreLostPoints.one\": \"+{n} more lost point\",\n \"entityList.moreLostPoints.other\": \"+{n} more lost points\",\n /** <Table> 压到下限仍放不下时,从右侧丢列并如实报数。 */\n \"table.columnsHidden.one\": \"({n} more column not shown)\",\n \"table.columnsHidden.other\": \"({n} more columns not shown)\",\n /** StabilityOverview 的读数格标签。 */\n \"stabilityOverview.executions\": \"Executions\",\n \"stabilityOverview.neverPassed\": \"Never passed\",\n \"stabilityOverview.flaky\": \"Flaky evals\",\n /** SampleSummary 的 KPI 标签。 */\n \"scopeSummary.experiments\": \"Experiments\",\n \"scopeSummary.evals\": \"Evals\",\n \"scopeSummary.attempts\": \"Attempts\",\n \"scopeSummary.passRate\": \"Pass rate\",\n \"scopeSummary.totalScore\": \"Total score\",\n \"scopeSummary.totalCost\": \"Total cost\",\n \"scopeSummary.lastRun\": \"Last run · {time}\",\n \"scopeSummary.runRange\": \"Run range · {from} – {to}\",\n \"scopeSummary.costCoverage\": \"Cost available for {samples}/{total} attempts\",\n \"scopeSummary.votesEval\": \"Eval results\",\n \"scopeSummary.votesAttempt\": \"Attempt results\",\n \"overview.experiments.one\": \"{n} experiment\",\n \"overview.experiments.other\": \"{n} experiments\",\n \"overview.evalsCount\": \"{n} evals\",\n \"overview.attemptsCount\": \"{n} attempts\",\n \"overview.evals\": \"Evals\",\n \"overview.passRate\": \"Pass rate\",\n \"overview.totalCost\": \"Cost\",\n /** 方向提示唯一文案:轴向已随 better 反正,「更好」恒指向右上(两轴都声明 better 时才显示)。 */\n \"scatter.betterUpperRight\": \"better → upper right\",\n /** 读值表的系列列表头;多个系列同图时才出现。 */\n \"chart.series\": \"series\",\n /** 0 个可画点:x/y 指标没有可用数据。 */\n \"scatter.noData\": \"No data to plot {x} × {y}\",\n /** 标题行尾的归类维度标注(series 维度存在时显示)。 */\n \"scatter.groupedBy\": \"grouped by {dim}\",\n \"pointsMissing.one\": \"{n} point missing data\",\n \"pointsMissing.other\": \"{n} points missing data\",\n \"attemptList.empty\": \"No attempts\",\n \"attemptList.truncated\": \"and {n} more not shown\",\n \"attemptList.truncatedText\": \"({n} more not shown)\",\n \"attemptList.score\": \"score {score}\",\n \"attemptList.unavailable\": \"unavailable\",\n \"attemptList.details\": \"details\",\n \"scoreboard.total\": \"Total\",\n \"scoreboard.totalText\": \"total\",\n \"scoreboard.notRun.one\": \"{n} eval not run, scored 0\",\n \"scoreboard.notRun.other\": \"{n} evals not run, scored 0\",\n \"scoreboard.unscorable.one\": \"{n} eval unscorable, scored 0\",\n \"scoreboard.unscorable.other\": \"{n} evals unscorable, scored 0\",\n \"scoreboard.notRunText\": \"({n} not run)\",\n \"scoreboard.unscorableText\": \"({n} unscorable)\",\n \"scoreboard.ignored.one\": \"{n} eval outside the question set ignored\",\n \"scoreboard.ignored.other\": \"{n} evals outside the question set ignored\",\n \"scoreboard.weights\": \"weights:\",\n \"scoreboard.allWeights\": \"all evals ×1\",\n \"scoreboard.othersWeight\": \"others ×1\",\n \"scoreboard.subjectTitle\": \"{questions} evals, weighted {earned} of {possible}\",\n \"delta.empty\": \"{experiments} experiments, 0 comparable conditions\",\n \"delta.totalsRow\": \"totals\",\n \"delta.passRate\": \"pass rate\",\n \"delta.totalScore\": \"total score\",\n \"delta.cost\": \"cost\",\n \"delta.commonVsBaseline\": \"{n} common vs baseline\",\n \"stability.neverPassed\": \"never passed\",\n /** ScopeWarnings 聚合层的 chrome:汇总行、kind 徽标、组头与明细折叠标签;message 本体不经字典。 */\n \"issues.summary.experiments.one\": \"{n} experiment flagged\",\n \"issues.summary.experiments.other\": \"{n} experiments flagged\",\n \"issues.group.unreadableSnapshot.one\": \"{n} run unreadable\",\n \"issues.group.unreadableSnapshot.other\": \"{n} runs unreadable\",\n \"issues.details.one\": \"{n} warning\",\n \"issues.details.other\": \"{n} issues\",\n \"issues.badge.unfinishedSnapshot\": \"unfinished\",\n /** 覆盖缺口(scope.coverage)。 */\n \"overview.evalsCountPartial\": \"{covered}/{total} evals\",\n /** Hero / HeroCard 的运行 meta(hero.noRuns 是 latestStartedAt 为 null 时的内置文案)。 */\n \"hero.lastRun\": \"Last run {time}\",\n \"hero.noRuns\": \"No runs yet\",\n /** CopyFixPrompt 的 web 面 chrome(prompt 本身面向 agent、固定英文,不经词典)。 */\n \"copyFixPrompt.summary.one\": \"Fix prompt · {n} failure\",\n \"copyFixPrompt.summary.other\": \"Fix prompt · {n} failures\",\n \"copyFixPrompt.copy\": \"Copy fix prompt\",\n /** TraceWaterfall 的 chrome。 */\n \"traceWaterfall.empty\": \"No attempts\",\n \"traceWaterfall.noTrace\": \"no trace\",\n \"traceWaterfall.spans.one\": \"{n} span\",\n \"traceWaterfall.spans.other\": \"{n} spans\",\n \"traceWaterfall.failedSpans.one\": \"{n} failed\",\n \"traceWaterfall.failedSpans.other\": \"{n} failed\",\n /** Waterfall 原语的 chrome。 */\n \"waterfall.nodes.one\": \"{n} node\",\n \"waterfall.nodes.other\": \"{n} nodes\",\n \"waterfall.failedNodes.one\": \"{n} failed\",\n \"waterfall.failedNodes.other\": \"{n} failed\",\n \"waterfall.foldTotal\": \"{t} total\",\n /** SnapshotDiagnostics 聚合层的 chrome:汇总行三段计数与最高严重度;message/command 本体不经字典。 */\n \"snapshotDiagnostics.summary.experiments.one\": \"{n} experiment\",\n \"snapshotDiagnostics.summary.experiments.other\": \"{n} experiments\",\n \"snapshotDiagnostics.summary.runs.one\": \"{n} run\",\n \"snapshotDiagnostics.summary.runs.other\": \"{n} runs\",\n \"snapshotDiagnostics.summary.records.one\": \"{n} record\",\n \"snapshotDiagnostics.summary.records.other\": \"{n} records\",\n \"snapshotDiagnostics.severity.warning\": \"issues only\",\n \"snapshotDiagnostics.severity.error\": \"errors present\",\n /** AttemptList 的 web 面过滤框占位符(filter 渐进增强)。 */\n \"attemptList.filterPlaceholder\": \"Filter attempts…\",\n /** 计分制 attempt 详情的 chrome(docs/feature/assertions/library/display.md「计分制」)。 */\n \"attemptAssertions.scorePointsEarned\": \"{earned}/{total} score points earned in full\",\n \"attemptAssertions.scoreEntries\": \"Score entries\",\n /** 断言表的四列表头。 */\n \"attemptAssertions.name\": \"Assertion\",\n \"attemptAssertions.severity\": \"Severity\",\n \"attemptAssertions.outcome\": \"Outcome\",\n \"attemptAssertions.detail\": \"Detail\",\n \"attemptSource.abortReason\": \"prerequisite failed, test() ended here\",\n \"tabs.tab\": \"Tab\",\n /** 成本投影卡片的显示文案(docs/feature/reports/cost-projections/cli.md)。 */\n \"costProjection.unavailable\": \"cost projection unavailable\",\n \"costProjection.migrationRequired\": \"cost projection requires migration — run niceeval migrate\",\n \"costProjection.basis.observed\": \"observed\",\n \"costProjection.basis.estimated\": \"estimated\",\n \"costProjection.basis.mixed\": \"mixed\",\n \"costProjection.state.partial\": \"partial\",\n \"costProjection.profile\": \"Pricing profile {identity} · {currency} · {decimals} decimals\",\n \"costProjection.providerObserved\": \"Provider observed\",\n \"costProjection.profileEstimated\": \"Profile estimated\",\n \"costProjection.meanPerContributingSlot\": \"Mean per contributing slot\",\n \"costProjection.totalKnownCost\": \"Total known cost\",\n \"costProjection.knownValue\": \"Known value\",\n \"costProjection.provenance\": \"Rate card {source} · as of {asOf}\",\n \"costProjection.coverage\": \"{samples}/{total} slots\",\n \"costProjection.unpriced\": \"Unpriced\",\n \"costProjection.observedElsewhere\": \"Observed elsewhere\",\n \"costProjection.notConverted\": \"not converted\",\n \"costProjection.reason\": \"{provider} {code}\",\n} as const;\nexport type ReportMessageKey = keyof typeof en;\nconst zhCN: globalThis.Record<ReportMessageKey, string> = {\n \"verdict.passed\": \"通过\",\n \"verdict.failed\": \"失败\",\n \"verdict.errored\": \"错误\",\n \"verdict.skipped\": \"跳过\",\n \"attemptSummary.attempt\": \"第 {n} 次\",\n \"timeDistance.minute\": \"{n} 分钟\",\n \"timeDistance.hour\": \"{n} 小时\",\n \"timeDistance.day\": \"{n} 天\",\n \"timeDistance.month\": \"{n} 个月\",\n \"cell.missing\": \"无数据\",\n \"cell.unscorable\": \"测不出\",\n \"cell.noCurrentResult\": \"当前配置下无结果\",\n \"cell.measuredTitle\": \"{samples}/{total} 次 attempt 测得\",\n \"cell.noneMeasurableTitle\": \"0/{total} 次 attempt 可测\",\n \"cell.coverageTitle\": \"覆盖率 {samples}/{total}:其余 attempt 测不了这个指标\",\n \"cell.missingValue\": \"(missing)\",\n \"cell.evidence.one\": \"{n} 个 Attempt\",\n \"cell.evidence.other\": \"{n} 个 Attempt\",\n \"table.higherBetter\": \"越高越好\",\n \"table.lowerBetter\": \"越低越好\",\n \"table.model\": \"模型\",\n \"table.agent\": \"Agent\",\n \"table.verdicts\": \"结果\",\n \"table.filterPlaceholder\": \"筛选行…\",\n \"table.eval\": \"题目\",\n \"table.reason\": \"原因\",\n \"table.viewBreakdown\": \"逐题明细\",\n \"table.attempt\": \"Attempt\",\n \"experimentList.experiment\": \"实验\",\n \"experimentList.avgDuration\": \"平均耗时\",\n \"experimentList.passRate\": \"通过率\",\n \"experimentList.passRateDescription\": \"端到端通过率:passed = 1;failed 和 errored = 0\",\n \"experimentList.totalScore\": \"总分\",\n \"experimentList.totalScoreDescription\": \"总分:各 Eval 挣分之和\",\n \"experimentList.tokens\": \"Tokens\",\n \"experimentList.cost\": \"成本\",\n \"experimentList.result\": \"结果\",\n \"experimentList.status\": \"状态\",\n \"experimentList.evalAttempt\": \"题目 / Attempt\",\n \"experimentList.duration\": \"耗时\",\n \"experimentList.filterPlaceholder\": \"筛选实验…\",\n \"experimentList.defaultModel\": \"默认\",\n \"experimentList.flags\": \"Flags\",\n \"entityList.average\": \"平均 {value}\",\n \"entityList.moreFailures.one\": \"+{n} 条其它失败\",\n \"entityList.moreFailures.other\": \"+{n} 条其它失败\",\n \"entityList.moreLostPoints.one\": \"+{n} 处其它丢分\",\n \"entityList.moreLostPoints.other\": \"+{n} 处其它丢分\",\n \"table.columnsHidden.one\": \"(还有 {n} 列未列出)\",\n \"table.columnsHidden.other\": \"(还有 {n} 列未列出)\",\n \"stabilityOverview.executions\": \"执行次数\",\n \"stabilityOverview.neverPassed\": \"零通过题\",\n \"stabilityOverview.flaky\": \"闪烁题\",\n \"scopeSummary.experiments\": \"实验\",\n \"scopeSummary.evals\": \"Eval\",\n \"scopeSummary.attempts\": \"Attempt\",\n \"scopeSummary.passRate\": \"通过率\",\n \"scopeSummary.totalScore\": \"总分\",\n \"scopeSummary.totalCost\": \"总成本\",\n \"scopeSummary.lastRun\": \"最近运行 · {time}\",\n \"scopeSummary.runRange\": \"运行范围 · {from} – {to}\",\n \"scopeSummary.costCoverage\": \"{samples}/{total} 次有成本数据\",\n \"scopeSummary.votesEval\": \"Eval 结果\",\n \"scopeSummary.votesAttempt\": \"Attempt 结果\",\n \"overview.experiments.one\": \"{n} 个实验\",\n \"overview.experiments.other\": \"{n} 个实验\",\n \"overview.evalsCount\": \"{n} 个 Eval\",\n \"overview.attemptsCount\": \"{n} 次 attempt\",\n \"overview.evals\": \"Eval\",\n \"overview.passRate\": \"通过率\",\n \"overview.totalCost\": \"成本\",\n \"scatter.betterUpperRight\": \"越靠右上越好\",\n \"chart.series\": \"系列\",\n \"scatter.noData\": \"{x} × {y} 没有可绘制的数据\",\n \"scatter.groupedBy\": \"按 {dim} 归类\",\n \"pointsMissing.one\": \"{n} 个点缺数据\",\n \"pointsMissing.other\": \"{n} 个点缺数据\",\n \"attemptList.empty\": \"没有 attempt\",\n \"attemptList.truncated\": \"还有 {n} 条未列出\",\n \"attemptList.truncatedText\": \"(还有 {n} 条未列出)\",\n \"attemptList.score\": \"得分 {score}\",\n \"attemptList.unavailable\": \"评不了\",\n \"attemptList.details\": \"详情\",\n \"scoreboard.total\": \"总分\",\n \"scoreboard.totalText\": \"总分\",\n \"scoreboard.notRun.one\": \"{n} 道题没跑,按 0 计\",\n \"scoreboard.notRun.other\": \"{n} 道题没跑,按 0 计\",\n \"scoreboard.unscorable.one\": \"{n} 道题测不了,按 0 计\",\n \"scoreboard.unscorable.other\": \"{n} 道题测不了,按 0 计\",\n \"scoreboard.notRunText\": \"(没跑 {n} 题)\",\n \"scoreboard.unscorableText\": \"(测不了 {n} 题)\",\n \"scoreboard.ignored.one\": \"题集之外的 {n} 道题已忽略\",\n \"scoreboard.ignored.other\": \"题集之外的 {n} 道题已忽略\",\n \"scoreboard.weights\": \"权重:\",\n \"scoreboard.allWeights\": \"全部题 ×1\",\n \"scoreboard.othersWeight\": \"其余 ×1\",\n \"scoreboard.subjectTitle\": \"{questions} 道题,加权得分 {earned}/{possible}\",\n \"delta.empty\": \"{experiments} 个实验、0 个可配对条件\",\n \"delta.totalsRow\": \"汇总\",\n \"delta.passRate\": \"通过率\",\n \"delta.totalScore\": \"总分\",\n \"delta.cost\": \"成本\",\n \"delta.commonVsBaseline\": \"共同 {n} 题对基准\",\n \"stability.neverPassed\": \"从未通过\",\n \"issues.summary.experiments.one\": \"{n} 个实验的数字带警告\",\n \"issues.summary.experiments.other\": \"{n} 个实验的数字带警告\",\n \"issues.group.unreadableSnapshot.one\": \"{n} 个快照被跳过\",\n \"issues.group.unreadableSnapshot.other\": \"{n} 个快照被跳过\",\n \"issues.details.one\": \"{n} 条原始警告\",\n \"issues.details.other\": \"{n} 条原始警告\",\n \"issues.badge.unfinishedSnapshot\": \"未收尾\",\n \"overview.evalsCountPartial\": \"{covered}/{total} 个 Eval\",\n \"hero.lastRun\": \"最后运行 {time}\",\n \"hero.noRuns\": \"暂无运行\",\n \"copyFixPrompt.summary.one\": \"修复 prompt · {n} 个失败\",\n \"copyFixPrompt.summary.other\": \"修复 prompt · {n} 个失败\",\n \"copyFixPrompt.copy\": \"复制修复 prompt\",\n \"traceWaterfall.empty\": \"没有 attempt\",\n \"traceWaterfall.noTrace\": \"无 trace\",\n \"traceWaterfall.spans.one\": \"{n} 个 span\",\n \"traceWaterfall.spans.other\": \"{n} 个 span\",\n \"traceWaterfall.failedSpans.one\": \"{n} 个失败\",\n \"traceWaterfall.failedSpans.other\": \"{n} 个失败\",\n \"waterfall.nodes.one\": \"{n} 个节点\",\n \"waterfall.nodes.other\": \"{n} 个节点\",\n \"waterfall.failedNodes.one\": \"{n} 个失败\",\n \"waterfall.failedNodes.other\": \"{n} 个失败\",\n \"waterfall.foldTotal\": \"合计 {t}\",\n \"snapshotDiagnostics.summary.experiments.one\": \"{n} 个实验\",\n \"snapshotDiagnostics.summary.experiments.other\": \"{n} 个实验\",\n \"snapshotDiagnostics.summary.runs.one\": \"{n} 个快照\",\n \"snapshotDiagnostics.summary.runs.other\": \"{n} 个快照\",\n \"snapshotDiagnostics.summary.records.one\": \"{n} 条记录\",\n \"snapshotDiagnostics.summary.records.other\": \"{n} 条记录\",\n \"snapshotDiagnostics.severity.warning\": \"仅警告\",\n \"snapshotDiagnostics.severity.error\": \"含错误\",\n \"attemptList.filterPlaceholder\": \"筛选 attempt…\",\n \"attemptAssertions.scorePointsEarned\": \"{earned}/{total} 得分点挣满\",\n \"attemptAssertions.scoreEntries\": \"给分记录\",\n \"attemptAssertions.name\": \"断言\",\n \"attemptAssertions.severity\": \"严重度\",\n \"attemptAssertions.outcome\": \"结果\",\n \"attemptAssertions.detail\": \"详情\",\n \"attemptSource.abortReason\": \"前置未过,test() 就地结束\",\n \"tabs.tab\": \"Tab\",\n \"costProjection.unavailable\": \"成本投影不可用\",\n \"costProjection.migrationRequired\": \"成本投影需要迁移——请运行 niceeval migrate\",\n \"costProjection.basis.observed\": \"供应商观测\",\n \"costProjection.basis.estimated\": \"价格表估算\",\n \"costProjection.basis.mixed\": \"混合\",\n \"costProjection.state.partial\": \"部分\",\n \"costProjection.profile\": \"价格配置 {identity} · {currency} · {decimals} 位小数\",\n \"costProjection.providerObserved\": \"供应商观测金额\",\n \"costProjection.profileEstimated\": \"价格表估算金额\",\n \"costProjection.meanPerContributingSlot\": \"每个有贡献槽位的平均成本\",\n \"costProjection.totalKnownCost\": \"已知总成本\",\n \"costProjection.knownValue\": \"已知值\",\n \"costProjection.provenance\": \"费率卡 {source} · 截止 {asOf}\",\n \"costProjection.coverage\": \"{samples}/{total} 个槽位\",\n \"costProjection.unpriced\": \"未报价\",\n \"costProjection.observedElsewhere\": \"其它币种观测\",\n \"costProjection.notConverted\": \"不换算\",\n \"costProjection.reason\": \"{provider} {code}\",\n};\nconst dictionaries: globalThis.Record<string, globalThis.Record<ReportMessageKey, string>> = {\n en,\n \"zh-CN\": zhCN,\n};\n/** 查字典 + 简单插值({name} 占位符)。内置词典未覆盖的 locale 回退 en。 */\nexport function localeText(locale: ReportLocale, key: ReportMessageKey, vars?: globalThis.Record<string, string | number>): string {\n const template = dictionaries[locale]?.[key] ?? dictionaries.en[key];\n if (!vars)\n return template;\n return template.replace(/\\{(\\w+)\\}/g, (m, name: string) => name in vars ? String(vars[name]) : m);\n}\n/**\n * 内置消息键 → 覆盖 `DISPLAY_LOCALES` 的 `LocalizedText`。\n * 列声明的 `header` 这类「值本身要随身携带两种语言」的字段用它烤一份,\n * 渲染面再按当前 locale 解析(docs/feature/reports/library.md)。\n */\nexport function localizedMessage(key: ReportMessageKey): LocalizedText {\n const text: globalThis.Record<string, string> = {};\n for (const locale of DISPLAY_LOCALES)\n text[locale] = localeText(locale, key);\n return text;\n}\n/** 带单复数的计数文案:n === 1 用 `<base>.one`,其余 `<base>.other`(zh-CN 两键同值)。 */\nexport function countText(locale: ReportLocale, base: \"overview.experiments\" | \"pointsMissing\" | \"scoreboard.notRun\" | \"scoreboard.unscorable\" | \"scoreboard.ignored\" | \"entityList.moreFailures\" | \"entityList.moreLostPoints\" | \"cell.evidence\" | \"table.columnsHidden\" | \"copyFixPrompt.summary\" | \"traceWaterfall.spans\" | \"traceWaterfall.failedSpans\" | \"waterfall.nodes\" | \"waterfall.failedNodes\", n: number): string {\n return localeText(locale, `${base}.${n === 1 ? \"one\" : \"other\"}` as ReportMessageKey, { n });\n}\n/**\n * 按 locale 解析读数 / 列 label;undefined 回退 fallback(= metric.name)。渲染面(web / text)共用。\n */\nexport function resolveMetricLabel(label: LocalizedText | undefined, locale: ReportLocale, fallback: string): string {\n if (label === undefined)\n return fallback;\n try {\n return resolveLocalizedText(label, locale);\n }\n catch {\n return fallback;\n }\n}\n"]}
1
+ {"version":3,"file":"locale.js","sourceRoot":"","sources":["locale.ts"],"names":[],"mappings":"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","sourcesContent":["// 官方组件 chrome 文案的 locale 字典与 LocalizedText 解析。\n// ReportLocale 是开放的 BCP 47 标签(数据协议不封语言上限);官方内置文案与\n// 官方固定文案覆盖 en / zh-CN;公共 MetricValue 由 renderer 按当前 locale 格式化。\n// 只覆盖组件自带的固定文案(verdict 词、缺数据、覆盖率角标、注脚、占位符等);\n// 维度键、issues 的 message 不经这里。\n// 刻意不 import src/i18n/(CLI 专用字典,locale 来源与 key 面完全不同)。\nimport type { LocalizedText } from \"../../types.ts\";\nexport type { LocalizedText };\n/** 报告渲染的 locale(BCP 47 标签,开放);默认 \"en\"(`niceeval show` 缺省输出不变)。 */\nexport type ReportLocale = string;\nexport const DEFAULT_REPORT_LOCALE: ReportLocale = \"en\";\n/** 官方固定文案覆盖的 locale 全集。 */\nexport const DISPLAY_LOCALES: readonly ReportLocale[] = [\"en\", \"zh-CN\"];\n/**\n * LocalizedText 的确定回退:取当前 locale;缺失时取 en;仍缺失时取按 locale 键字典序的\n * 第一个非空值。对象没有任何非空值时报错,不渲染空文案\n * (docs/feature/reports/library.md「行为约束」)。\n */\nexport function resolveLocalizedText(text: LocalizedText, locale: ReportLocale): string {\n if (typeof text === \"string\")\n return text;\n const direct = text[locale];\n if (direct !== undefined && direct !== \"\")\n return direct;\n const en = text.en;\n if (en !== undefined && en !== \"\")\n return en;\n for (const key of Object.keys(text).sort()) {\n const value = text[key];\n if (value !== undefined && value !== \"\")\n return value;\n }\n throw new Error(\"LocalizedText object has no non-empty value. Provide at least one locale entry, e.g. { en: \\\"…\\\" }.\");\n}\n/** LocalizedText 按字段值深相等(键顺序无关;标题回退链的「唯一且相同」判定用)。 */\nexport function localizedTextEquals(a: LocalizedText, b: LocalizedText): boolean {\n if (typeof a === \"string\" || typeof b === \"string\")\n return a === b;\n const keysA = Object.keys(a).sort();\n const keysB = Object.keys(b).sort();\n if (keysA.length !== keysB.length)\n return false;\n return keysA.every((key, i) => key === keysB[i] && a[key] === b[key]);\n}\nconst en = {\n \"verdict.passed\": \"passed\",\n \"verdict.failed\": \"failed\",\n \"verdict.errored\": \"errored\",\n \"verdict.skipped\": \"skipped\",\n /** AttemptSummary 的重试序号(0 起的 identity.attempt 显示前 +1)。 */\n \"attemptSummary.attempt\": \"attempt {n}\",\n /** formatTimeDistance 的四区间读法(presentation.md「相对时距是数据,不是文案」)。 */\n \"timeDistance.minute\": \"{n}m\",\n \"timeDistance.hour\": \"{n}h\",\n \"timeDistance.day\": \"{n}d\",\n \"timeDistance.month\": \"{n}mo\",\n /** 全 null / 无样本的统一文案,绝不画 0。 */\n \"cell.missing\": \"no data\",\n /** missing 格 code=`unscorable`:有 attempt,但读数测不出。 */\n \"cell.unscorable\": \"unscorable\",\n /** missing 格 code=`noCurrentResult`:当前配置下这道题没有结果(覆盖缺口占位行)。 */\n \"cell.noCurrentResult\": \"no result for current config\",\n \"cell.measuredTitle\": \"{samples}/{total} attempts measured\",\n \"cell.noneMeasurableTitle\": \"0/{total} attempts measurable\",\n \"cell.coverageTitle\": \"coverage {samples}/{total}: this metric is null for the remaining attempts\",\n \"cell.missingValue\": \"(missing)\",\n \"cell.evidence.one\": \"{n} attempt\",\n \"cell.evidence.other\": \"{n} attempts\",\n \"table.higherBetter\": \"higher is better\",\n \"table.lowerBetter\": \"lower is better\",\n \"table.model\": \"Model\",\n \"table.agent\": \"Agent\",\n \"table.verdicts\": \"Verdicts\",\n \"table.filterPlaceholder\": \"Filter rows…\",\n \"table.eval\": \"Eval\",\n \"table.reason\": \"Reason\",\n \"table.viewBreakdown\": \"Per-eval breakdown\",\n /** <Table> 的 locator 列表头(行带 locator 时自动追加)。 */\n \"table.attempt\": \"attempt\",\n \"experimentList.experiment\": \"Experiment\",\n \"experimentList.avgDuration\": \"Avg. time\",\n \"experimentList.passRate\": \"Pass rate\",\n \"experimentList.passRateDescription\": \"End-to-end pass rate: passed = 1; failed and errored = 0\",\n \"experimentList.totalScore\": \"Total score\",\n \"experimentList.totalScoreDescription\": \"Total score: sum of points earned across evals\",\n \"experimentList.missedScoreItems.one\": \"{n} missed check\",\n \"experimentList.missedScoreItems.other\": \"{n} missed checks\",\n \"experimentList.tokens\": \"Tokens\",\n \"experimentList.cost\": \"Cost\",\n \"experimentList.result\": \"Result\",\n \"experimentList.status\": \"Status\",\n \"experimentList.evalAttempt\": \"Eval / Attempt\",\n \"experimentList.duration\": \"Duration\",\n \"experimentList.filterPlaceholder\": \"Filter experiments…\",\n \"experimentList.defaultModel\": \"default\",\n \"experimentList.flags\": \"Flags\",\n \"entityList.average\": \"{value} avg\",\n \"entityList.moreFailures.one\": \"+{n} more failure\",\n \"entityList.moreFailures.other\": \"+{n} more failures\",\n /** 计分制 passed attempt 丢分得分点的「其余」计数(规则 6);与 moreFailures 同结构,措辞不同——\n * 丢分不是失败,不该说成 \"more failures\"(entity-lists.md AttemptListItem.moreFailures 字段注释)。 */\n \"entityList.moreLostPoints.one\": \"+{n} more lost point\",\n \"entityList.moreLostPoints.other\": \"+{n} more lost points\",\n /** <Table> 压到下限仍放不下时,从右侧丢列并如实报数。 */\n \"table.columnsHidden.one\": \"({n} more column not shown)\",\n \"table.columnsHidden.other\": \"({n} more columns not shown)\",\n /** StabilityOverview 的读数格标签。 */\n \"stabilityOverview.executions\": \"Executions\",\n \"stabilityOverview.neverPassed\": \"Never passed\",\n \"stabilityOverview.flaky\": \"Flaky evals\",\n /** SampleSummary 的 KPI 标签。 */\n \"scopeSummary.experiments\": \"Experiments\",\n \"scopeSummary.evals\": \"Evals\",\n \"scopeSummary.attempts\": \"Attempts\",\n \"scopeSummary.passRate\": \"Pass rate\",\n \"scopeSummary.totalScore\": \"Total score\",\n \"scopeSummary.totalCost\": \"Total cost\",\n \"scopeSummary.lastRun\": \"Last run · {time}\",\n \"scopeSummary.runRange\": \"Run range · {from} – {to}\",\n \"scopeSummary.costCoverage\": \"Cost available for {samples}/{total} attempts\",\n \"scopeSummary.votesEval\": \"Eval results\",\n \"scopeSummary.votesAttempt\": \"Attempt results\",\n \"overview.experiments.one\": \"{n} experiment\",\n \"overview.experiments.other\": \"{n} experiments\",\n \"overview.evalsCount\": \"{n} evals\",\n \"overview.attemptsCount\": \"{n} attempts\",\n \"overview.evals\": \"Evals\",\n \"overview.passRate\": \"Pass rate\",\n \"overview.totalCost\": \"Cost\",\n /** 方向提示唯一文案:轴向已随 better 反正,「更好」恒指向右上(两轴都声明 better 时才显示)。 */\n \"scatter.betterUpperRight\": \"better → upper right\",\n /** 读值表的系列列表头;多个系列同图时才出现。 */\n \"chart.series\": \"series\",\n /** 0 个可画点:x/y 指标没有可用数据。 */\n \"scatter.noData\": \"No data to plot {x} × {y}\",\n /** 标题行尾的归类维度标注(series 维度存在时显示)。 */\n \"scatter.groupedBy\": \"grouped by {dim}\",\n \"pointsMissing.one\": \"{n} point missing data\",\n \"pointsMissing.other\": \"{n} points missing data\",\n \"attemptList.empty\": \"No attempts\",\n \"attemptList.truncated\": \"and {n} more not shown\",\n \"attemptList.truncatedText\": \"({n} more not shown)\",\n \"attemptList.score\": \"score {score}\",\n \"attemptList.unavailable\": \"unavailable\",\n \"attemptList.details\": \"details\",\n \"scoreboard.total\": \"Total\",\n \"scoreboard.totalText\": \"total\",\n \"scoreboard.notRun.one\": \"{n} eval not run, scored 0\",\n \"scoreboard.notRun.other\": \"{n} evals not run, scored 0\",\n \"scoreboard.unscorable.one\": \"{n} eval unscorable, scored 0\",\n \"scoreboard.unscorable.other\": \"{n} evals unscorable, scored 0\",\n \"scoreboard.notRunText\": \"({n} not run)\",\n \"scoreboard.unscorableText\": \"({n} unscorable)\",\n \"scoreboard.ignored.one\": \"{n} eval outside the question set ignored\",\n \"scoreboard.ignored.other\": \"{n} evals outside the question set ignored\",\n \"scoreboard.weights\": \"weights:\",\n \"scoreboard.allWeights\": \"all evals ×1\",\n \"scoreboard.othersWeight\": \"others ×1\",\n \"scoreboard.subjectTitle\": \"{questions} evals, weighted {earned} of {possible}\",\n \"delta.empty\": \"{experiments} experiments, 0 comparable conditions\",\n \"delta.totalsRow\": \"totals\",\n \"delta.passRate\": \"pass rate\",\n \"delta.totalScore\": \"total score\",\n \"delta.cost\": \"cost\",\n \"delta.commonVsBaseline\": \"{n} common vs baseline\",\n \"stability.neverPassed\": \"never passed\",\n /** ScopeWarnings 聚合层的 chrome:汇总行、kind 徽标、组头与明细折叠标签;message 本体不经字典。 */\n \"issues.summary.experiments.one\": \"{n} experiment flagged\",\n \"issues.summary.experiments.other\": \"{n} experiments flagged\",\n \"issues.group.unreadableSnapshot.one\": \"{n} run unreadable\",\n \"issues.group.unreadableSnapshot.other\": \"{n} runs unreadable\",\n \"issues.details.one\": \"{n} warning\",\n \"issues.details.other\": \"{n} issues\",\n \"issues.badge.unfinishedSnapshot\": \"unfinished\",\n /** 覆盖缺口(scope.coverage)。 */\n \"overview.evalsCountPartial\": \"{covered}/{total} evals\",\n /** Hero / HeroCard 的运行 meta(hero.noRuns 是 latestStartedAt 为 null 时的内置文案)。 */\n \"hero.lastRun\": \"Last run {time}\",\n \"hero.noRuns\": \"No runs yet\",\n /** CopyFixPrompt 的 web 面 chrome(prompt 本身面向 agent、固定英文,不经词典)。 */\n \"copyFixPrompt.summary.one\": \"Fix prompt · {n} failure\",\n \"copyFixPrompt.summary.other\": \"Fix prompt · {n} failures\",\n \"copyFixPrompt.copy\": \"Copy fix prompt\",\n /** TraceWaterfall 的 chrome。 */\n \"traceWaterfall.empty\": \"No attempts\",\n \"traceWaterfall.noTrace\": \"no trace\",\n \"traceWaterfall.spans.one\": \"{n} span\",\n \"traceWaterfall.spans.other\": \"{n} spans\",\n \"traceWaterfall.failedSpans.one\": \"{n} failed\",\n \"traceWaterfall.failedSpans.other\": \"{n} failed\",\n /** Waterfall 原语的 chrome。 */\n \"waterfall.nodes.one\": \"{n} node\",\n \"waterfall.nodes.other\": \"{n} nodes\",\n \"waterfall.failedNodes.one\": \"{n} failed\",\n \"waterfall.failedNodes.other\": \"{n} failed\",\n \"waterfall.foldTotal\": \"{t} total\",\n /** SnapshotDiagnostics 聚合层的 chrome:汇总行三段计数与最高严重度;message/command 本体不经字典。 */\n \"snapshotDiagnostics.summary.experiments.one\": \"{n} experiment\",\n \"snapshotDiagnostics.summary.experiments.other\": \"{n} experiments\",\n \"snapshotDiagnostics.summary.runs.one\": \"{n} run\",\n \"snapshotDiagnostics.summary.runs.other\": \"{n} runs\",\n \"snapshotDiagnostics.summary.records.one\": \"{n} record\",\n \"snapshotDiagnostics.summary.records.other\": \"{n} records\",\n \"snapshotDiagnostics.severity.warning\": \"issues only\",\n \"snapshotDiagnostics.severity.error\": \"errors present\",\n /** AttemptList 的 web 面过滤框占位符(filter 渐进增强)。 */\n \"attemptList.filterPlaceholder\": \"Filter attempts…\",\n /** 计分制 attempt 详情的 chrome(docs/feature/assertions/library/display.md「计分制」)。 */\n \"attemptAssertions.scorePointsEarned\": \"{earned}/{total} score points earned in full\",\n \"attemptAssertions.scoreEntries\": \"Score entries\",\n /** 断言表的四列表头。 */\n \"attemptAssertions.name\": \"Assertion\",\n \"attemptAssertions.severity\": \"Severity\",\n \"attemptAssertions.outcome\": \"Outcome\",\n \"attemptAssertions.detail\": \"Detail\",\n \"attemptSource.abortReason\": \"prerequisite failed, test() ended here\",\n \"tabs.tab\": \"Tab\",\n /** 成本投影卡片的显示文案(docs/feature/reports/cost-projections/cli.md)。 */\n \"costProjection.unavailable\": \"cost projection unavailable\",\n \"costProjection.migrationRequired\": \"cost projection requires migration — run niceeval migrate\",\n \"costProjection.basis.observed\": \"observed\",\n \"costProjection.basis.estimated\": \"estimated\",\n \"costProjection.basis.mixed\": \"mixed\",\n \"costProjection.state.partial\": \"partial\",\n \"costProjection.profile\": \"Pricing profile {identity} · {currency} · {decimals} decimals\",\n \"costProjection.providerObserved\": \"Provider observed\",\n \"costProjection.profileEstimated\": \"Profile estimated\",\n \"costProjection.meanPerContributingSlot\": \"Mean per contributing slot\",\n \"costProjection.totalKnownCost\": \"Total known cost\",\n \"costProjection.knownValue\": \"Known value\",\n \"costProjection.provenance\": \"Rate card {source} · as of {asOf}\",\n \"costProjection.coverage\": \"{samples}/{total} slots\",\n \"costProjection.unpriced\": \"Unpriced\",\n \"costProjection.observedElsewhere\": \"Observed elsewhere\",\n \"costProjection.notConverted\": \"not converted\",\n \"costProjection.reason\": \"{provider} {code}\",\n} as const;\nexport type ReportMessageKey = keyof typeof en;\nconst zhCN: globalThis.Record<ReportMessageKey, string> = {\n \"verdict.passed\": \"通过\",\n \"verdict.failed\": \"失败\",\n \"verdict.errored\": \"错误\",\n \"verdict.skipped\": \"跳过\",\n \"attemptSummary.attempt\": \"第 {n} 次\",\n \"timeDistance.minute\": \"{n} 分钟\",\n \"timeDistance.hour\": \"{n} 小时\",\n \"timeDistance.day\": \"{n} 天\",\n \"timeDistance.month\": \"{n} 个月\",\n \"cell.missing\": \"无数据\",\n \"cell.unscorable\": \"测不出\",\n \"cell.noCurrentResult\": \"当前配置下无结果\",\n \"cell.measuredTitle\": \"{samples}/{total} 次 attempt 测得\",\n \"cell.noneMeasurableTitle\": \"0/{total} 次 attempt 可测\",\n \"cell.coverageTitle\": \"覆盖率 {samples}/{total}:其余 attempt 测不了这个指标\",\n \"cell.missingValue\": \"(missing)\",\n \"cell.evidence.one\": \"{n} 个 Attempt\",\n \"cell.evidence.other\": \"{n} 个 Attempt\",\n \"table.higherBetter\": \"越高越好\",\n \"table.lowerBetter\": \"越低越好\",\n \"table.model\": \"模型\",\n \"table.agent\": \"Agent\",\n \"table.verdicts\": \"结果\",\n \"table.filterPlaceholder\": \"筛选行…\",\n \"table.eval\": \"题目\",\n \"table.reason\": \"原因\",\n \"table.viewBreakdown\": \"逐题明细\",\n \"table.attempt\": \"Attempt\",\n \"experimentList.experiment\": \"实验\",\n \"experimentList.avgDuration\": \"平均耗时\",\n \"experimentList.passRate\": \"通过率\",\n \"experimentList.passRateDescription\": \"端到端通过率:passed = 1;failed 和 errored = 0\",\n \"experimentList.totalScore\": \"总分\",\n \"experimentList.totalScoreDescription\": \"总分:各 Eval 挣分之和\",\n \"experimentList.missedScoreItems.one\": \"{n} 项未满足\",\n \"experimentList.missedScoreItems.other\": \"{n} 项未满足\",\n \"experimentList.tokens\": \"Tokens\",\n \"experimentList.cost\": \"成本\",\n \"experimentList.result\": \"结果\",\n \"experimentList.status\": \"状态\",\n \"experimentList.evalAttempt\": \"题目 / Attempt\",\n \"experimentList.duration\": \"耗时\",\n \"experimentList.filterPlaceholder\": \"筛选实验…\",\n \"experimentList.defaultModel\": \"默认\",\n \"experimentList.flags\": \"Flags\",\n \"entityList.average\": \"平均 {value}\",\n \"entityList.moreFailures.one\": \"+{n} 条其它失败\",\n \"entityList.moreFailures.other\": \"+{n} 条其它失败\",\n \"entityList.moreLostPoints.one\": \"+{n} 处其它丢分\",\n \"entityList.moreLostPoints.other\": \"+{n} 处其它丢分\",\n \"table.columnsHidden.one\": \"(还有 {n} 列未列出)\",\n \"table.columnsHidden.other\": \"(还有 {n} 列未列出)\",\n \"stabilityOverview.executions\": \"执行次数\",\n \"stabilityOverview.neverPassed\": \"零通过题\",\n \"stabilityOverview.flaky\": \"闪烁题\",\n \"scopeSummary.experiments\": \"实验\",\n \"scopeSummary.evals\": \"Eval\",\n \"scopeSummary.attempts\": \"Attempt\",\n \"scopeSummary.passRate\": \"通过率\",\n \"scopeSummary.totalScore\": \"总分\",\n \"scopeSummary.totalCost\": \"总成本\",\n \"scopeSummary.lastRun\": \"最近运行 · {time}\",\n \"scopeSummary.runRange\": \"运行范围 · {from} – {to}\",\n \"scopeSummary.costCoverage\": \"{samples}/{total} 次有成本数据\",\n \"scopeSummary.votesEval\": \"Eval 结果\",\n \"scopeSummary.votesAttempt\": \"Attempt 结果\",\n \"overview.experiments.one\": \"{n} 个实验\",\n \"overview.experiments.other\": \"{n} 个实验\",\n \"overview.evalsCount\": \"{n} 个 Eval\",\n \"overview.attemptsCount\": \"{n} 次 attempt\",\n \"overview.evals\": \"Eval\",\n \"overview.passRate\": \"通过率\",\n \"overview.totalCost\": \"成本\",\n \"scatter.betterUpperRight\": \"越靠右上越好\",\n \"chart.series\": \"系列\",\n \"scatter.noData\": \"{x} × {y} 没有可绘制的数据\",\n \"scatter.groupedBy\": \"按 {dim} 归类\",\n \"pointsMissing.one\": \"{n} 个点缺数据\",\n \"pointsMissing.other\": \"{n} 个点缺数据\",\n \"attemptList.empty\": \"没有 attempt\",\n \"attemptList.truncated\": \"还有 {n} 条未列出\",\n \"attemptList.truncatedText\": \"(还有 {n} 条未列出)\",\n \"attemptList.score\": \"得分 {score}\",\n \"attemptList.unavailable\": \"评不了\",\n \"attemptList.details\": \"详情\",\n \"scoreboard.total\": \"总分\",\n \"scoreboard.totalText\": \"总分\",\n \"scoreboard.notRun.one\": \"{n} 道题没跑,按 0 计\",\n \"scoreboard.notRun.other\": \"{n} 道题没跑,按 0 计\",\n \"scoreboard.unscorable.one\": \"{n} 道题测不了,按 0 计\",\n \"scoreboard.unscorable.other\": \"{n} 道题测不了,按 0 计\",\n \"scoreboard.notRunText\": \"(没跑 {n} 题)\",\n \"scoreboard.unscorableText\": \"(测不了 {n} 题)\",\n \"scoreboard.ignored.one\": \"题集之外的 {n} 道题已忽略\",\n \"scoreboard.ignored.other\": \"题集之外的 {n} 道题已忽略\",\n \"scoreboard.weights\": \"权重:\",\n \"scoreboard.allWeights\": \"全部题 ×1\",\n \"scoreboard.othersWeight\": \"其余 ×1\",\n \"scoreboard.subjectTitle\": \"{questions} 道题,加权得分 {earned}/{possible}\",\n \"delta.empty\": \"{experiments} 个实验、0 个可配对条件\",\n \"delta.totalsRow\": \"汇总\",\n \"delta.passRate\": \"通过率\",\n \"delta.totalScore\": \"总分\",\n \"delta.cost\": \"成本\",\n \"delta.commonVsBaseline\": \"共同 {n} 题对基准\",\n \"stability.neverPassed\": \"从未通过\",\n \"issues.summary.experiments.one\": \"{n} 个实验的数字带警告\",\n \"issues.summary.experiments.other\": \"{n} 个实验的数字带警告\",\n \"issues.group.unreadableSnapshot.one\": \"{n} 个快照被跳过\",\n \"issues.group.unreadableSnapshot.other\": \"{n} 个快照被跳过\",\n \"issues.details.one\": \"{n} 条原始警告\",\n \"issues.details.other\": \"{n} 条原始警告\",\n \"issues.badge.unfinishedSnapshot\": \"未收尾\",\n \"overview.evalsCountPartial\": \"{covered}/{total} 个 Eval\",\n \"hero.lastRun\": \"最后运行 {time}\",\n \"hero.noRuns\": \"暂无运行\",\n \"copyFixPrompt.summary.one\": \"修复 prompt · {n} 个失败\",\n \"copyFixPrompt.summary.other\": \"修复 prompt · {n} 个失败\",\n \"copyFixPrompt.copy\": \"复制修复 prompt\",\n \"traceWaterfall.empty\": \"没有 attempt\",\n \"traceWaterfall.noTrace\": \"无 trace\",\n \"traceWaterfall.spans.one\": \"{n} 个 span\",\n \"traceWaterfall.spans.other\": \"{n} 个 span\",\n \"traceWaterfall.failedSpans.one\": \"{n} 个失败\",\n \"traceWaterfall.failedSpans.other\": \"{n} 个失败\",\n \"waterfall.nodes.one\": \"{n} 个节点\",\n \"waterfall.nodes.other\": \"{n} 个节点\",\n \"waterfall.failedNodes.one\": \"{n} 个失败\",\n \"waterfall.failedNodes.other\": \"{n} 个失败\",\n \"waterfall.foldTotal\": \"合计 {t}\",\n \"snapshotDiagnostics.summary.experiments.one\": \"{n} 个实验\",\n \"snapshotDiagnostics.summary.experiments.other\": \"{n} 个实验\",\n \"snapshotDiagnostics.summary.runs.one\": \"{n} 个快照\",\n \"snapshotDiagnostics.summary.runs.other\": \"{n} 个快照\",\n \"snapshotDiagnostics.summary.records.one\": \"{n} 条记录\",\n \"snapshotDiagnostics.summary.records.other\": \"{n} 条记录\",\n \"snapshotDiagnostics.severity.warning\": \"仅警告\",\n \"snapshotDiagnostics.severity.error\": \"含错误\",\n \"attemptList.filterPlaceholder\": \"筛选 attempt…\",\n \"attemptAssertions.scorePointsEarned\": \"{earned}/{total} 得分点挣满\",\n \"attemptAssertions.scoreEntries\": \"给分记录\",\n \"attemptAssertions.name\": \"断言\",\n \"attemptAssertions.severity\": \"严重度\",\n \"attemptAssertions.outcome\": \"结果\",\n \"attemptAssertions.detail\": \"详情\",\n \"attemptSource.abortReason\": \"前置未过,test() 就地结束\",\n \"tabs.tab\": \"Tab\",\n \"costProjection.unavailable\": \"成本投影不可用\",\n \"costProjection.migrationRequired\": \"成本投影需要迁移——请运行 niceeval migrate\",\n \"costProjection.basis.observed\": \"供应商观测\",\n \"costProjection.basis.estimated\": \"价格表估算\",\n \"costProjection.basis.mixed\": \"混合\",\n \"costProjection.state.partial\": \"部分\",\n \"costProjection.profile\": \"价格配置 {identity} · {currency} · {decimals} 位小数\",\n \"costProjection.providerObserved\": \"供应商观测金额\",\n \"costProjection.profileEstimated\": \"价格表估算金额\",\n \"costProjection.meanPerContributingSlot\": \"每个有贡献槽位的平均成本\",\n \"costProjection.totalKnownCost\": \"已知总成本\",\n \"costProjection.knownValue\": \"已知值\",\n \"costProjection.provenance\": \"费率卡 {source} · 截止 {asOf}\",\n \"costProjection.coverage\": \"{samples}/{total} 个槽位\",\n \"costProjection.unpriced\": \"未报价\",\n \"costProjection.observedElsewhere\": \"其它币种观测\",\n \"costProjection.notConverted\": \"不换算\",\n \"costProjection.reason\": \"{provider} {code}\",\n};\nconst dictionaries: globalThis.Record<string, globalThis.Record<ReportMessageKey, string>> = {\n en,\n \"zh-CN\": zhCN,\n};\n/** 查字典 + 简单插值({name} 占位符)。内置词典未覆盖的 locale 回退 en。 */\nexport function localeText(locale: ReportLocale, key: ReportMessageKey, vars?: globalThis.Record<string, string | number>): string {\n const template = dictionaries[locale]?.[key] ?? dictionaries.en[key];\n if (!vars)\n return template;\n return template.replace(/\\{(\\w+)\\}/g, (m, name: string) => name in vars ? String(vars[name]) : m);\n}\n/**\n * 内置消息键 → 覆盖 `DISPLAY_LOCALES` 的 `LocalizedText`。\n * 列声明的 `header` 这类「值本身要随身携带两种语言」的字段用它烤一份,\n * 渲染面再按当前 locale 解析(docs/feature/reports/library.md)。\n */\nexport function localizedMessage(key: ReportMessageKey): LocalizedText {\n const text: globalThis.Record<string, string> = {};\n for (const locale of DISPLAY_LOCALES)\n text[locale] = localeText(locale, key);\n return text;\n}\n/** 带单复数的计数文案:n === 1 用 `<base>.one`,其余 `<base>.other`(zh-CN 两键同值)。 */\nexport function countText(locale: ReportLocale, base: \"overview.experiments\" | \"pointsMissing\" | \"scoreboard.notRun\" | \"scoreboard.unscorable\" | \"scoreboard.ignored\" | \"experimentList.missedScoreItems\" | \"entityList.moreFailures\" | \"entityList.moreLostPoints\" | \"cell.evidence\" | \"table.columnsHidden\" | \"copyFixPrompt.summary\" | \"traceWaterfall.spans\" | \"traceWaterfall.failedSpans\" | \"waterfall.nodes\" | \"waterfall.failedNodes\", n: number): string {\n return localeText(locale, `${base}.${n === 1 ? \"one\" : \"other\"}` as ReportMessageKey, { n });\n}\n/**\n * 按 locale 解析读数 / 列 label;undefined 回退 fallback(= metric.name)。渲染面(web / text)共用。\n */\nexport function resolveMetricLabel(label: LocalizedText | undefined, locale: ReportLocale, fallback: string): string {\n if (label === undefined)\n return fallback;\n try {\n return resolveLocalizedText(label, locale);\n }\n catch {\n return fallback;\n }\n}\n"]}
@@ -54,6 +54,8 @@ declare const en: {
54
54
  readonly "experimentList.passRateDescription": "End-to-end pass rate: passed = 1; failed and errored = 0";
55
55
  readonly "experimentList.totalScore": "Total score";
56
56
  readonly "experimentList.totalScoreDescription": "Total score: sum of points earned across evals";
57
+ readonly "experimentList.missedScoreItems.one": "{n} missed check";
58
+ readonly "experimentList.missedScoreItems.other": "{n} missed checks";
57
59
  readonly "experimentList.tokens": "Tokens";
58
60
  readonly "experimentList.cost": "Cost";
59
61
  readonly "experimentList.result": "Result";
@@ -214,7 +216,7 @@ export declare function localeText(locale: ReportLocale, key: ReportMessageKey,
214
216
  */
215
217
  export declare function localizedMessage(key: ReportMessageKey): LocalizedText;
216
218
  /** 带单复数的计数文案:n === 1 用 `<base>.one`,其余 `<base>.other`(zh-CN 两键同值)。 */
217
- export declare function countText(locale: ReportLocale, base: "overview.experiments" | "pointsMissing" | "scoreboard.notRun" | "scoreboard.unscorable" | "scoreboard.ignored" | "entityList.moreFailures" | "entityList.moreLostPoints" | "cell.evidence" | "table.columnsHidden" | "copyFixPrompt.summary" | "traceWaterfall.spans" | "traceWaterfall.failedSpans" | "waterfall.nodes" | "waterfall.failedNodes", n: number): string;
219
+ export declare function countText(locale: ReportLocale, base: "overview.experiments" | "pointsMissing" | "scoreboard.notRun" | "scoreboard.unscorable" | "scoreboard.ignored" | "experimentList.missedScoreItems" | "entityList.moreFailures" | "entityList.moreLostPoints" | "cell.evidence" | "table.columnsHidden" | "copyFixPrompt.summary" | "traceWaterfall.spans" | "traceWaterfall.failedSpans" | "waterfall.nodes" | "waterfall.failedNodes", n: number): string;
218
220
  /**
219
221
  * 按 locale 解析读数 / 列 label;undefined 回退 fallback(= metric.name)。渲染面(web / text)共用。
220
222
  */
@@ -54,6 +54,8 @@ declare const en: {
54
54
  readonly "experimentList.passRateDescription": "End-to-end pass rate: passed = 1; failed and errored = 0";
55
55
  readonly "experimentList.totalScore": "Total score";
56
56
  readonly "experimentList.totalScoreDescription": "Total score: sum of points earned across evals";
57
+ readonly "experimentList.missedScoreItems.one": "{n} missed check";
58
+ readonly "experimentList.missedScoreItems.other": "{n} missed checks";
57
59
  readonly "experimentList.tokens": "Tokens";
58
60
  readonly "experimentList.cost": "Cost";
59
61
  readonly "experimentList.result": "Result";
@@ -214,7 +216,7 @@ export declare function localeText(locale: ReportLocale, key: ReportMessageKey,
214
216
  */
215
217
  export declare function localizedMessage(key: ReportMessageKey): LocalizedText;
216
218
  /** 带单复数的计数文案:n === 1 用 `<base>.one`,其余 `<base>.other`(zh-CN 两键同值)。 */
217
- export declare function countText(locale: ReportLocale, base: "overview.experiments" | "pointsMissing" | "scoreboard.notRun" | "scoreboard.unscorable" | "scoreboard.ignored" | "entityList.moreFailures" | "entityList.moreLostPoints" | "cell.evidence" | "table.columnsHidden" | "copyFixPrompt.summary" | "traceWaterfall.spans" | "traceWaterfall.failedSpans" | "waterfall.nodes" | "waterfall.failedNodes", n: number): string;
219
+ export declare function countText(locale: ReportLocale, base: "overview.experiments" | "pointsMissing" | "scoreboard.notRun" | "scoreboard.unscorable" | "scoreboard.ignored" | "experimentList.missedScoreItems" | "entityList.moreFailures" | "entityList.moreLostPoints" | "cell.evidence" | "table.columnsHidden" | "copyFixPrompt.summary" | "traceWaterfall.spans" | "traceWaterfall.failedSpans" | "waterfall.nodes" | "waterfall.failedNodes", n: number): string;
218
220
  /**
219
221
  * 按 locale 解析读数 / 列 label;undefined 回退 fallback(= metric.name)。渲染面(web / text)共用。
220
222
  */
@@ -54,6 +54,8 @@ declare const en: {
54
54
  readonly "experimentList.passRateDescription": "End-to-end pass rate: passed = 1; failed and errored = 0";
55
55
  readonly "experimentList.totalScore": "Total score";
56
56
  readonly "experimentList.totalScoreDescription": "Total score: sum of points earned across evals";
57
+ readonly "experimentList.missedScoreItems.one": "{n} missed check";
58
+ readonly "experimentList.missedScoreItems.other": "{n} missed checks";
57
59
  readonly "experimentList.tokens": "Tokens";
58
60
  readonly "experimentList.cost": "Cost";
59
61
  readonly "experimentList.result": "Result";
@@ -214,7 +216,7 @@ export declare function localeText(locale: ReportLocale, key: ReportMessageKey,
214
216
  */
215
217
  export declare function localizedMessage(key: ReportMessageKey): LocalizedText;
216
218
  /** 带单复数的计数文案:n === 1 用 `<base>.one`,其余 `<base>.other`(zh-CN 两键同值)。 */
217
- export declare function countText(locale: ReportLocale, base: "overview.experiments" | "pointsMissing" | "scoreboard.notRun" | "scoreboard.unscorable" | "scoreboard.ignored" | "entityList.moreFailures" | "entityList.moreLostPoints" | "cell.evidence" | "table.columnsHidden" | "copyFixPrompt.summary" | "traceWaterfall.spans" | "traceWaterfall.failedSpans" | "waterfall.nodes" | "waterfall.failedNodes", n: number): string;
219
+ export declare function countText(locale: ReportLocale, base: "overview.experiments" | "pointsMissing" | "scoreboard.notRun" | "scoreboard.unscorable" | "scoreboard.ignored" | "experimentList.missedScoreItems" | "entityList.moreFailures" | "entityList.moreLostPoints" | "cell.evidence" | "table.columnsHidden" | "copyFixPrompt.summary" | "traceWaterfall.spans" | "traceWaterfall.failedSpans" | "waterfall.nodes" | "waterfall.failedNodes", n: number): string;
218
220
  /**
219
221
  * 按 locale 解析读数 / 列 label;undefined 回退 fallback(= metric.name)。渲染面(web / text)共用。
220
222
  */
@@ -1602,9 +1602,89 @@ table.niceeval-report,
1602
1602
  color: color-mix(in oklch, var(--bad), var(--text) 38%);
1603
1603
  }
1604
1604
  .niceeval-assertion-evidence {
1605
+ min-width: 0;
1606
+ }
1607
+ .niceeval-match-node {
1608
+ min-width: 0;
1609
+ border-left: 2px solid var(--line-strong);
1610
+ padding-left: 10px;
1611
+ }
1612
+ .niceeval-match-node > summary {
1613
+ cursor: pointer;
1614
+ list-style: none;
1615
+ }
1616
+ .niceeval-match-node > summary::-webkit-details-marker { display: none; }
1617
+ .niceeval-match-summary {
1618
+ display: flex;
1619
+ min-width: 0;
1620
+ align-items: baseline;
1621
+ gap: 7px;
1622
+ font: 12px/1.5 var(--font-mono);
1623
+ font-weight: 650;
1624
+ }
1625
+ .niceeval-match-summary code {
1626
+ overflow: hidden;
1627
+ color: inherit;
1628
+ text-overflow: ellipsis;
1629
+ white-space: nowrap;
1630
+ }
1631
+ .niceeval-match-summary--matched { color: var(--good); }
1632
+ .niceeval-match-summary--mismatched { color: var(--bad); }
1633
+ .niceeval-match-summary--unavailable { color: var(--warn); }
1634
+ .niceeval-match-detail {
1635
+ display: grid;
1636
+ gap: 10px;
1637
+ padding: 8px 0 4px;
1638
+ }
1639
+ .niceeval-match-children {
1640
+ display: grid;
1641
+ gap: 7px;
1642
+ }
1643
+ .niceeval-match-body {
1644
+ display: grid;
1645
+ gap: 10px;
1646
+ }
1647
+ .niceeval-match-evidence-grid {
1648
+ display: grid;
1649
+ gap: 10px;
1650
+ }
1651
+ .niceeval-match-facts {
1605
1652
  display: grid;
1653
+ gap: 5px;
1654
+ margin: 0;
1655
+ font: 11px/1.5 var(--font-mono);
1656
+ }
1657
+ .niceeval-match-facts > div {
1658
+ display: grid;
1659
+ grid-template-columns: minmax(5.5rem, max-content) minmax(0, 1fr);
1660
+ gap: 10px;
1661
+ }
1662
+ .niceeval-match-facts dt { color: var(--soft); }
1663
+ .niceeval-match-facts dd {
1664
+ min-width: 0;
1665
+ margin: 0;
1666
+ overflow-wrap: anywhere;
1667
+ color: var(--muted);
1668
+ }
1669
+ .niceeval-match-coverage {
1670
+ margin: 0;
1671
+ color: var(--soft);
1672
+ font: 10px/1.5 var(--font-mono);
1673
+ }
1674
+ .niceeval-match-raw {
1606
1675
  min-width: 0;
1676
+ border-top: 1px dashed var(--line);
1677
+ padding-top: 8px;
1678
+ }
1679
+ .niceeval-match-raw > summary {
1680
+ color: var(--soft);
1681
+ cursor: pointer;
1682
+ font: 11px/1.4 var(--font-mono);
1683
+ }
1684
+ .niceeval-match-raw > div {
1685
+ display: grid;
1607
1686
  gap: 12px;
1687
+ padding-top: 10px;
1608
1688
  }
1609
1689
  .niceeval-assertion-evidence-section { min-width: 0; }
1610
1690
  .niceeval-assertion-evidence-section > h5 {
@@ -55,11 +55,11 @@ function collectBuildPreparation(opts) {
55
55
  }
56
56
  const keys = [];
57
57
  for (const work of collected.works) {
58
- if (!worksByKey.has(work.buildKey))
59
- worksByKey.set(work.buildKey, work);
60
- providerByKey.set(work.buildKey, opts.provider ?? collected.provider);
61
- if (!keys.includes(work.buildKey))
62
- keys.push(work.buildKey);
58
+ if (!worksByKey.has(work.ref))
59
+ worksByKey.set(work.ref, work);
60
+ providerByKey.set(work.ref, opts.provider ?? collected.provider);
61
+ if (!keys.includes(work.ref))
62
+ keys.push(work.ref);
63
63
  }
64
64
  if (keys.length > 0)
65
65
  pairBuildKeys.set(pair.key, keys);
@@ -1 +1 @@
1
- {"version":3,"file":"build-preparation.js","sourceRoot":"","sources":["build-preparation.ts"],"names":[],"mappings":"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","sourcesContent":["// PreparedRunPair -> Run 级构建工作。provider-specific 解析留在 sandbox/runtime;\n// 本模块只去重 BuildKey、路由 provider,并跳过已经完整携带的 pair。\nimport { Effect, Option } from \"effect\";\nimport type { SandboxBuildProvider, SandboxBuildWork } from \"../sandbox/build-coordinator.ts\";\nimport { routeBuildProviders } from \"../sandbox/dockerfile-build.ts\";\nimport type { BuildKey } from \"../sandbox/identity.ts\";\nimport { collectSandboxRuntimeBuildPreparation, SandboxRuntimeMaterializationError, } from \"../sandbox/runtime.ts\";\nimport type { PreparedRunPair } from \"./sandbox-selection.ts\";\nimport type { RunOptions } from \"./types.ts\";\nexport interface CollectedBuildPreparation {\n readonly works: readonly SandboxBuildWork[];\n readonly pairBuildKeys: Readonly<globalThis.Record<string, readonly BuildKey[]>>;\n readonly provider: SandboxBuildProvider;\n}\n/**\n * CarryPlan 完成后收集 fresh pair 所需构建。输入已经是不可变 physical plan;这里不再读取\n * Eval/Experiment 声明,也不做 template/provider 二次选择。\n */\nexport function collectBuildPreparation(opts: {\n readonly preparedPairs: readonly PreparedRunPair[];\n readonly carriedAttemptsByKey: ReadonlyMap<string, ReadonlySet<number>>;\n /** 测试可注入单一 provider;生产默认按每条 BuildKey 的 ProviderModule 路由。 */\n readonly provider?: SandboxBuildProvider;\n}): Effect.Effect<Option.Option<CollectedBuildPreparation>, SandboxRuntimeMaterializationError> {\n return Effect.gen(function* () {\n const worksByKey = new Map<BuildKey, SandboxBuildWork>();\n const providerByKey = new Map<BuildKey, SandboxBuildProvider>();\n const pairBuildKeys = new Map<string, BuildKey[]>();\n for (const pair of opts.preparedPairs) {\n const carried = opts.carriedAttemptsByKey.get(pair.key);\n if (carried !== undefined && carried.size >= pair.run.attempts)\n continue;\n if (pair.plan._tag === \"Direct\")\n continue;\n const collection = yield* collectSandboxRuntimeBuildPreparation(pair.plan, pair.evalDef.id);\n if (pair.plan.providerPlan.build._tag === \"None\") {\n if (Option.isSome(collection) && collection.value.works.length > 0) {\n return yield* new SandboxRuntimeMaterializationError({\n code: \"sandbox.build-input-drift\",\n provider: pair.plan.providerPlan.provider,\n message: \"Provider planned no builds but returned build work during collection.\",\n cause: new Error(\"unexpected build work\"),\n });\n }\n continue;\n }\n if (Option.isNone(collection)) {\n return yield* new SandboxRuntimeMaterializationError({\n code: \"sandbox.build-input-drift\",\n provider: pair.plan.providerPlan.provider,\n message: \"Provider planned required builds but returned no build collection.\",\n cause: new Error(\"required build collection missing\"),\n });\n }\n const collected = collection.value;\n const plannedKeys = pair.plan.providerPlan.build.buildKeys;\n const collectedKeys = collected.works.map((work) => work.buildKey).sort();\n if (plannedKeys.length !== collectedKeys.length || [...plannedKeys].sort().some((key, i) => key !== collectedKeys[i])) {\n return yield* new SandboxRuntimeMaterializationError({\n code: \"sandbox.build-input-drift\",\n provider: pair.plan.providerPlan.provider,\n message: \"Build collection keys differ from the physical plan.\",\n cause: new Error(\"build key mismatch\"),\n });\n }\n const keys: BuildKey[] = [];\n for (const work of collected.works) {\n if (!worksByKey.has(work.buildKey))\n worksByKey.set(work.buildKey, work);\n providerByKey.set(work.buildKey, opts.provider ?? collected.provider);\n if (!keys.includes(work.buildKey))\n keys.push(work.buildKey);\n }\n if (keys.length > 0)\n pairBuildKeys.set(pair.key, keys);\n }\n if (worksByKey.size === 0)\n return Option.none();\n const provider = opts.provider ?? routeBuildProviders(providerByKey);\n return Option.some(Object.freeze({\n works: Object.freeze([...worksByKey.values()]),\n pairBuildKeys: Object.freeze(Object.fromEntries(pairBuildKeys)),\n provider,\n }));\n });\n}\n/** 把收集结果压成 RunOptions.buildPreparation。 */\nexport function toBuildPreparation(collected: CollectedBuildPreparation): Option.Option<NonNullable<RunOptions[\"buildPreparation\"]>> {\n if (collected.works.length === 0)\n return Option.none();\n return Option.some({\n works: collected.works,\n pairBuildKeys: collected.pairBuildKeys,\n provider: collected.provider,\n });\n}\n"]}
1
+ {"version":3,"file":"build-preparation.js","sourceRoot":"","sources":["build-preparation.ts"],"names":[],"mappings":"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","sourcesContent":["// PreparedRunPair -> Run 级构建工作。provider-specific 解析留在 sandbox/runtime;\n// 本模块只去重 BuildKey、路由 provider,并跳过已经完整携带的 pair。\nimport { Effect, Option } from \"effect\";\nimport type { SandboxBuildProvider, SandboxBuildRef, SandboxBuildWork } from \"../sandbox/build-coordinator.ts\";\nimport { routeBuildProviders } from \"../sandbox/dockerfile-build.ts\";\nimport type { BuildKey } from \"../sandbox/identity.ts\";\nimport { collectSandboxRuntimeBuildPreparation, SandboxRuntimeMaterializationError, } from \"../sandbox/runtime.ts\";\nimport type { PreparedRunPair } from \"./sandbox-selection.ts\";\nimport type { RunOptions } from \"./types.ts\";\nexport interface CollectedBuildPreparation {\n readonly works: readonly SandboxBuildWork[];\n readonly pairBuildKeys: Readonly<globalThis.Record<string, readonly SandboxBuildRef[]>>;\n readonly provider: SandboxBuildProvider;\n}\n/**\n * CarryPlan 完成后收集 fresh pair 所需构建。输入已经是不可变 physical plan;这里不再读取\n * Eval/Experiment 声明,也不做 template/provider 二次选择。\n */\nexport function collectBuildPreparation(opts: {\n readonly preparedPairs: readonly PreparedRunPair[];\n readonly carriedAttemptsByKey: ReadonlyMap<string, ReadonlySet<number>>;\n /** 测试可注入单一 provider;生产默认按每条 BuildKey 的 ProviderModule 路由。 */\n readonly provider?: SandboxBuildProvider;\n}): Effect.Effect<Option.Option<CollectedBuildPreparation>, SandboxRuntimeMaterializationError> {\n return Effect.gen(function* () {\n const worksByKey = new Map<SandboxBuildRef, SandboxBuildWork>();\n const providerByKey = new Map<SandboxBuildRef, SandboxBuildProvider>();\n const pairBuildKeys = new Map<string, SandboxBuildRef[]>();\n for (const pair of opts.preparedPairs) {\n const carried = opts.carriedAttemptsByKey.get(pair.key);\n if (carried !== undefined && carried.size >= pair.run.attempts)\n continue;\n if (pair.plan._tag === \"Direct\")\n continue;\n const collection = yield* collectSandboxRuntimeBuildPreparation(pair.plan, pair.evalDef.id);\n if (pair.plan.providerPlan.build._tag === \"None\") {\n if (Option.isSome(collection) && collection.value.works.length > 0) {\n return yield* new SandboxRuntimeMaterializationError({\n code: \"sandbox.build-input-drift\",\n provider: pair.plan.providerPlan.provider,\n message: \"Provider planned no builds but returned build work during collection.\",\n cause: new Error(\"unexpected build work\"),\n });\n }\n continue;\n }\n if (Option.isNone(collection)) {\n return yield* new SandboxRuntimeMaterializationError({\n code: \"sandbox.build-input-drift\",\n provider: pair.plan.providerPlan.provider,\n message: \"Provider planned required builds but returned no build collection.\",\n cause: new Error(\"required build collection missing\"),\n });\n }\n const collected = collection.value;\n const plannedKeys = pair.plan.providerPlan.build.buildKeys;\n const collectedKeys = collected.works.map((work) => work.buildKey).sort();\n if (plannedKeys.length !== collectedKeys.length || [...plannedKeys].sort().some((key, i) => key !== collectedKeys[i])) {\n return yield* new SandboxRuntimeMaterializationError({\n code: \"sandbox.build-input-drift\",\n provider: pair.plan.providerPlan.provider,\n message: \"Build collection keys differ from the physical plan.\",\n cause: new Error(\"build key mismatch\"),\n });\n }\n const keys: SandboxBuildRef[] = [];\n for (const work of collected.works) {\n if (!worksByKey.has(work.ref))\n worksByKey.set(work.ref, work);\n providerByKey.set(work.ref, opts.provider ?? collected.provider);\n if (!keys.includes(work.ref))\n keys.push(work.ref);\n }\n if (keys.length > 0)\n pairBuildKeys.set(pair.key, keys);\n }\n if (worksByKey.size === 0)\n return Option.none();\n const provider = opts.provider ?? routeBuildProviders(providerByKey);\n return Option.some(Object.freeze({\n works: Object.freeze([...worksByKey.values()]),\n pairBuildKeys: Object.freeze(Object.fromEntries(pairBuildKeys)),\n provider,\n }));\n });\n}\n/** 把收集结果压成 RunOptions.buildPreparation。 */\nexport function toBuildPreparation(collected: CollectedBuildPreparation): Option.Option<NonNullable<RunOptions[\"buildPreparation\"]>> {\n if (collected.works.length === 0)\n return Option.none();\n return Option.some({\n works: collected.works,\n pairBuildKeys: collected.pairBuildKeys,\n provider: collected.provider,\n });\n}\n"]}
@@ -1,12 +1,11 @@
1
1
  import { Effect, Option } from "effect";
2
- import type { SandboxBuildProvider, SandboxBuildWork } from "../sandbox/build-coordinator.cjs";
3
- import type { BuildKey } from "../sandbox/identity.cjs";
2
+ import type { SandboxBuildProvider, SandboxBuildRef, SandboxBuildWork } from "../sandbox/build-coordinator.cjs";
4
3
  import { SandboxRuntimeMaterializationError } from "../sandbox/runtime.cjs";
5
4
  import type { PreparedRunPair } from "./sandbox-selection.cjs";
6
5
  import type { RunOptions } from "./types.cjs";
7
6
  export interface CollectedBuildPreparation {
8
7
  readonly works: readonly SandboxBuildWork[];
9
- readonly pairBuildKeys: Readonly<globalThis.Record<string, readonly BuildKey[]>>;
8
+ readonly pairBuildKeys: Readonly<globalThis.Record<string, readonly SandboxBuildRef[]>>;
10
9
  readonly provider: SandboxBuildProvider;
11
10
  }
12
11
  /**
@@ -1,12 +1,11 @@
1
1
  import { Effect, Option } from "effect";
2
- import type { SandboxBuildProvider, SandboxBuildWork } from "../sandbox/build-coordinator.mjs";
3
- import type { BuildKey } from "../sandbox/identity.mjs";
2
+ import type { SandboxBuildProvider, SandboxBuildRef, SandboxBuildWork } from "../sandbox/build-coordinator.mjs";
4
3
  import { SandboxRuntimeMaterializationError } from "../sandbox/runtime.mjs";
5
4
  import type { PreparedRunPair } from "./sandbox-selection.mjs";
6
5
  import type { RunOptions } from "./types.mjs";
7
6
  export interface CollectedBuildPreparation {
8
7
  readonly works: readonly SandboxBuildWork[];
9
- readonly pairBuildKeys: Readonly<globalThis.Record<string, readonly BuildKey[]>>;
8
+ readonly pairBuildKeys: Readonly<globalThis.Record<string, readonly SandboxBuildRef[]>>;
10
9
  readonly provider: SandboxBuildProvider;
11
10
  }
12
11
  /**
@@ -1,12 +1,11 @@
1
1
  import { Effect, Option } from "effect";
2
- import type { SandboxBuildProvider, SandboxBuildWork } from "../sandbox/build-coordinator.js";
3
- import type { BuildKey } from "../sandbox/identity.js";
2
+ import type { SandboxBuildProvider, SandboxBuildRef, SandboxBuildWork } from "../sandbox/build-coordinator.js";
4
3
  import { SandboxRuntimeMaterializationError } from "../sandbox/runtime.js";
5
4
  import type { PreparedRunPair } from "./sandbox-selection.js";
6
5
  import type { RunOptions } from "./types.js";
7
6
  export interface CollectedBuildPreparation {
8
7
  readonly works: readonly SandboxBuildWork[];
9
- readonly pairBuildKeys: Readonly<globalThis.Record<string, readonly BuildKey[]>>;
8
+ readonly pairBuildKeys: Readonly<globalThis.Record<string, readonly SandboxBuildRef[]>>;
10
9
  readonly provider: SandboxBuildProvider;
11
10
  }
12
11
  /**