niceeval 0.13.1 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) hide show
  1. package/INDEX.md +25 -2
  2. package/README.md +9 -10
  3. package/README.zh.md +9 -10
  4. package/dist/agents/ai-sdk.cjs.map +1 -1
  5. package/dist/agents/ai-sdk.d.cts +1 -1
  6. package/dist/agents/ai-sdk.d.mts +1 -1
  7. package/dist/agents/ai-sdk.d.ts +1 -1
  8. package/dist/agents/bub-install-spec.cjs +19 -5
  9. package/dist/agents/bub-install-spec.cjs.map +1 -1
  10. package/dist/agents/bub-install-spec.d.cts +9 -2
  11. package/dist/agents/bub-install-spec.d.mts +9 -2
  12. package/dist/agents/bub-install-spec.d.ts +9 -2
  13. package/dist/agents/bub-install-spec.js +14 -12
  14. package/dist/agents/bub.cjs +10 -6
  15. package/dist/agents/bub.cjs.map +1 -1
  16. package/dist/agents/bub.d.cts +2 -2
  17. package/dist/agents/bub.d.mts +2 -2
  18. package/dist/agents/bub.d.ts +2 -2
  19. package/dist/agents/claude-code.cjs.map +1 -1
  20. package/dist/agents/claude-code.d.cts +2 -2
  21. package/dist/agents/claude-code.d.mts +2 -2
  22. package/dist/agents/claude-code.d.ts +2 -2
  23. package/dist/agents/codex.cjs +4 -4
  24. package/dist/agents/codex.cjs.map +1 -1
  25. package/dist/agents/codex.d.cts +3 -3
  26. package/dist/agents/codex.d.mts +3 -3
  27. package/dist/agents/codex.d.ts +3 -3
  28. package/dist/agents/coding-cli-versions.cjs +10 -1
  29. package/dist/agents/coding-cli-versions.cjs.map +1 -1
  30. package/dist/agents/coding-cli-versions.d.cts +8 -3
  31. package/dist/agents/coding-cli-versions.d.mts +8 -3
  32. package/dist/agents/coding-cli-versions.d.ts +8 -3
  33. package/dist/agents/coding-cli-versions.js +18 -12
  34. package/dist/agents/deepseek-harness.cjs +151 -0
  35. package/dist/agents/deepseek-harness.cjs.map +1 -0
  36. package/dist/agents/deepseek-harness.d.cts +14 -0
  37. package/dist/agents/deepseek-harness.d.mts +14 -0
  38. package/dist/agents/deepseek-harness.d.ts +14 -0
  39. package/dist/agents/deepseek-harness.js +7 -0
  40. package/dist/agents/deepseek-harness.js.map +1 -0
  41. package/dist/agents/exact-npm-plugins.cjs +28 -0
  42. package/dist/agents/exact-npm-plugins.cjs.map +1 -0
  43. package/dist/agents/exact-npm-plugins.d.cts +10 -0
  44. package/dist/agents/exact-npm-plugins.d.mts +10 -0
  45. package/dist/agents/exact-npm-plugins.d.ts +10 -0
  46. package/dist/agents/exact-npm-plugins.js +8 -0
  47. package/dist/agents/exact-npm-plugins.js.map +1 -0
  48. package/dist/agents/index.cjs +5 -1
  49. package/dist/agents/index.cjs.map +1 -1
  50. package/dist/agents/index.d.cts +4 -0
  51. package/dist/agents/index.d.mts +4 -0
  52. package/dist/agents/index.d.ts +4 -0
  53. package/dist/agents/index.js +54 -50
  54. package/dist/agents/index.mjs +54 -50
  55. package/dist/agents/omp.cjs +170 -0
  56. package/dist/agents/omp.cjs.map +1 -0
  57. package/dist/agents/omp.d.cts +14 -0
  58. package/dist/agents/omp.d.mts +14 -0
  59. package/dist/agents/omp.d.ts +14 -0
  60. package/dist/agents/omp.js +7 -0
  61. package/dist/agents/omp.js.map +1 -0
  62. package/dist/agents/openclaw.cjs +51 -2
  63. package/dist/agents/openclaw.cjs.map +1 -1
  64. package/dist/agents/openclaw.d.cts +2 -0
  65. package/dist/agents/openclaw.d.mts +2 -0
  66. package/dist/agents/openclaw.d.ts +2 -0
  67. package/dist/agents/types.cjs.map +1 -1
  68. package/dist/agents/types.d.cts +4 -4
  69. package/dist/agents/types.d.mts +4 -4
  70. package/dist/agents/types.d.ts +4 -4
  71. package/dist/agents/ui-message-stream.cjs +24 -7
  72. package/dist/agents/ui-message-stream.cjs.map +1 -1
  73. package/dist/analysis/api.cjs +28 -2
  74. package/dist/analysis/api.cjs.map +1 -1
  75. package/dist/analysis/api.d.cts +22 -1
  76. package/dist/analysis/api.d.mts +22 -1
  77. package/dist/analysis/api.d.ts +22 -1
  78. package/dist/analysis/api.js +8 -6
  79. package/dist/analysis/bindings.cjs +11 -18
  80. package/dist/analysis/bindings.cjs.map +1 -1
  81. package/dist/analysis/bindings.d.cts +177 -49
  82. package/dist/analysis/bindings.d.mts +177 -49
  83. package/dist/analysis/bindings.d.ts +177 -49
  84. package/dist/analysis/contracts.cjs +1 -0
  85. package/dist/analysis/contracts.cjs.map +1 -1
  86. package/dist/analysis/contracts.d.cts +43 -3
  87. package/dist/analysis/contracts.d.mts +43 -3
  88. package/dist/analysis/contracts.d.ts +43 -3
  89. package/dist/analysis/cost-projection.cjs +2 -1
  90. package/dist/analysis/cost-projection.cjs.map +1 -1
  91. package/dist/analysis/cost-projection.d.cts +1 -1
  92. package/dist/analysis/cost-projection.d.mts +1 -1
  93. package/dist/analysis/cost-projection.d.ts +1 -1
  94. package/dist/analysis/cost.cjs +13 -3
  95. package/dist/analysis/cost.cjs.map +1 -1
  96. package/dist/analysis/cost.d.cts +10 -3
  97. package/dist/analysis/cost.d.mts +10 -3
  98. package/dist/analysis/cost.d.ts +10 -3
  99. package/dist/analysis/experiment-groups.cjs +96 -0
  100. package/dist/analysis/experiment-groups.cjs.map +1 -0
  101. package/dist/analysis/experiment-groups.d.cts +9 -0
  102. package/dist/analysis/experiment-groups.d.mts +9 -0
  103. package/dist/analysis/experiment-groups.d.ts +9 -0
  104. package/dist/analysis/experiment-groups.js +10 -0
  105. package/dist/analysis/experiment-groups.js.map +1 -0
  106. package/dist/analysis/index.cjs +4 -1
  107. package/dist/analysis/index.cjs.map +1 -1
  108. package/dist/analysis/index.d.cts +4 -2
  109. package/dist/analysis/index.d.mts +4 -2
  110. package/dist/analysis/index.d.ts +4 -2
  111. package/dist/analysis/index.js +40 -36
  112. package/dist/analysis/index.mjs +40 -36
  113. package/dist/assertions/limits.cjs +4 -0
  114. package/dist/assertions/limits.cjs.map +1 -1
  115. package/dist/assertions/limits.d.cts +4 -0
  116. package/dist/assertions/limits.d.mts +4 -0
  117. package/dist/assertions/limits.d.ts +4 -0
  118. package/dist/assertions/match.cjs +63 -25
  119. package/dist/assertions/match.cjs.map +1 -1
  120. package/dist/assertions/match.d.cts +7 -0
  121. package/dist/assertions/match.d.mts +7 -0
  122. package/dist/assertions/match.d.ts +7 -0
  123. package/dist/assertions/record/attachment.cjs +32 -4
  124. package/dist/assertions/record/attachment.cjs.map +1 -1
  125. package/dist/assertions/record/diff.cjs +10 -4
  126. package/dist/assertions/record/diff.cjs.map +1 -1
  127. package/dist/assertions/record/producer.cjs +101 -4
  128. package/dist/assertions/record/producer.cjs.map +1 -1
  129. package/dist/assertions/record/producer.d.cts +4 -1
  130. package/dist/assertions/record/producer.d.mts +4 -1
  131. package/dist/assertions/record/producer.d.ts +4 -1
  132. package/dist/assertions/runtime.cjs +45 -5
  133. package/dist/assertions/runtime.cjs.map +1 -1
  134. package/dist/cli/record.cjs +113 -8
  135. package/dist/cli/record.cjs.map +1 -1
  136. package/dist/cli/record.d.cts +20 -1
  137. package/dist/cli/record.d.mts +20 -1
  138. package/dist/cli/record.d.ts +20 -1
  139. package/dist/cli/record.js +4 -2
  140. package/dist/cli.cjs +386 -31
  141. package/dist/cli.cjs.map +1 -1
  142. package/dist/cli.d.cts +10 -2
  143. package/dist/cli.d.mts +10 -2
  144. package/dist/cli.d.ts +10 -2
  145. package/dist/context/send-retry.cjs +4 -4
  146. package/dist/context/send-retry.cjs.map +1 -1
  147. package/dist/coordination/host/runtime.cjs +8 -30
  148. package/dist/coordination/host/runtime.cjs.map +1 -1
  149. package/dist/coordination/host/runtime.d.cts +3 -3
  150. package/dist/coordination/host/runtime.d.mts +3 -3
  151. package/dist/coordination/host/runtime.d.ts +3 -3
  152. package/dist/coordination/host/types.cjs.map +1 -1
  153. package/dist/coordination/host/types.d.cts +0 -5
  154. package/dist/coordination/host/types.d.mts +0 -5
  155. package/dist/coordination/host/types.d.ts +0 -5
  156. package/dist/coordination/platform/node.cjs +90 -9
  157. package/dist/coordination/platform/node.cjs.map +1 -1
  158. package/dist/define.cjs +25 -1
  159. package/dist/define.cjs.map +1 -1
  160. package/dist/experiment/host/index.cjs +1 -0
  161. package/dist/experiment/host/index.cjs.map +1 -1
  162. package/dist/i18n/en.cjs +26 -8
  163. package/dist/i18n/en.cjs.map +1 -1
  164. package/dist/i18n/en.d.cts +19 -6
  165. package/dist/i18n/en.d.mts +19 -6
  166. package/dist/i18n/en.d.ts +19 -6
  167. package/dist/index.cjs.map +1 -1
  168. package/dist/index.d.cts +1 -1
  169. package/dist/index.d.mts +1 -1
  170. package/dist/index.d.ts +1 -1
  171. package/dist/o11y/parsers/hermes.cjs +1 -1
  172. package/dist/o11y/parsers/hermes.cjs.map +1 -1
  173. package/dist/o11y/prices.json +1 -1
  174. package/dist/o11y/record/families.cjs +12 -3
  175. package/dist/o11y/record/families.cjs.map +1 -1
  176. package/dist/o11y/record/families.d.cts +8 -8
  177. package/dist/o11y/record/families.d.mts +8 -8
  178. package/dist/o11y/record/families.d.ts +8 -8
  179. package/dist/o11y/record/family-projectors.d.cts +66 -18
  180. package/dist/o11y/record/family-projectors.d.mts +66 -18
  181. package/dist/o11y/record/family-projectors.d.ts +66 -18
  182. package/dist/o11y/record/family-writers.d.cts +11 -3
  183. package/dist/o11y/record/family-writers.d.mts +11 -3
  184. package/dist/o11y/record/family-writers.d.ts +11 -3
  185. package/dist/o11y/record/runner-producer.cjs +14 -4
  186. package/dist/o11y/record/runner-producer.cjs.map +1 -1
  187. package/dist/record/codec/core.d.cts +2 -2
  188. package/dist/record/codec/core.d.mts +2 -2
  189. package/dist/record/codec/core.d.ts +2 -2
  190. package/dist/record/family/catalog.d.cts +44 -12
  191. package/dist/record/family/catalog.d.mts +44 -12
  192. package/dist/record/family/catalog.d.ts +44 -12
  193. package/dist/record/family/index.js +128 -124
  194. package/dist/record/family/observability-v1.cjs +35 -0
  195. package/dist/record/family/observability-v1.cjs.map +1 -0
  196. package/dist/record/family/observability-v1.d.cts +3 -0
  197. package/dist/record/family/observability-v1.d.mts +3 -0
  198. package/dist/record/family/observability-v1.d.ts +3 -0
  199. package/dist/record/family/observability-v1.js +6 -0
  200. package/dist/record/family/observability-v1.js.map +1 -0
  201. package/dist/record/family/observability.cjs +58 -9
  202. package/dist/record/family/observability.cjs.map +1 -1
  203. package/dist/record/family/observability.d.cts +1014 -15
  204. package/dist/record/family/observability.d.mts +1014 -15
  205. package/dist/record/family/observability.d.ts +1014 -15
  206. package/dist/record/family/observability.js +22 -18
  207. package/dist/record/host/runtime.cjs +600 -31
  208. package/dist/record/host/runtime.cjs.map +1 -1
  209. package/dist/record/host/types.cjs.map +1 -1
  210. package/dist/record/host/types.d.cts +33 -9
  211. package/dist/record/host/types.d.mts +33 -9
  212. package/dist/record/host/types.d.ts +33 -9
  213. package/dist/record/maintenance/runtime.cjs +1 -2
  214. package/dist/record/maintenance/runtime.cjs.map +1 -1
  215. package/dist/record/model/core.cjs.map +1 -1
  216. package/dist/record/model/core.d.cts +1 -1
  217. package/dist/record/model/core.d.mts +1 -1
  218. package/dist/record/model/core.d.ts +1 -1
  219. package/dist/record/model/definition.d.cts +6 -6
  220. package/dist/record/model/definition.d.mts +6 -6
  221. package/dist/record/model/definition.d.ts +6 -6
  222. package/dist/record/model/identifiers.cjs +1 -1
  223. package/dist/record/model/identifiers.cjs.map +1 -1
  224. package/dist/record/model/identifiers.d.cts +1 -1
  225. package/dist/record/model/identifiers.d.mts +1 -1
  226. package/dist/record/model/identifiers.d.ts +1 -1
  227. package/dist/record/platform/node.cjs +159 -23
  228. package/dist/record/platform/node.cjs.map +1 -1
  229. package/dist/record/platform/services.cjs.map +1 -1
  230. package/dist/record/platform/services.d.cts +15 -2
  231. package/dist/record/platform/services.d.mts +15 -2
  232. package/dist/record/platform/services.d.ts +15 -2
  233. package/dist/record/reader/errors.cjs +37 -1
  234. package/dist/record/reader/errors.cjs.map +1 -1
  235. package/dist/record/reader/errors.d.cts +49 -1
  236. package/dist/record/reader/errors.d.mts +49 -1
  237. package/dist/record/reader/errors.d.ts +49 -1
  238. package/dist/record/reader/errors.js +22 -12
  239. package/dist/record/reader/format.cjs +76 -17
  240. package/dist/record/reader/format.cjs.map +1 -1
  241. package/dist/record/reader/format.d.cts +11 -4
  242. package/dist/record/reader/format.d.mts +11 -4
  243. package/dist/record/reader/format.d.ts +11 -4
  244. package/dist/record/reader/format.js +2 -0
  245. package/dist/record/reader/index.js +32 -18
  246. package/dist/record/reader/runtime.cjs +64 -0
  247. package/dist/record/reader/runtime.cjs.map +1 -1
  248. package/dist/record/reader/runtime.d.cts +15 -0
  249. package/dist/record/reader/runtime.d.mts +15 -0
  250. package/dist/record/reader/runtime.d.ts +15 -0
  251. package/dist/record/reader/runtime.js +2 -0
  252. package/dist/report/assets/styles.css +53 -29
  253. package/dist/report/built-in/analysis-values.cjs +21 -13
  254. package/dist/report/built-in/analysis-values.cjs.map +1 -1
  255. package/dist/report/built-in/analysis-values.d.cts +11 -22
  256. package/dist/report/built-in/analysis-values.d.mts +11 -22
  257. package/dist/report/built-in/analysis-values.d.ts +11 -22
  258. package/dist/report/built-in/analysis-values.js +4 -6
  259. package/dist/report/built-in/index.cjs +1 -3
  260. package/dist/report/built-in/index.cjs.map +1 -1
  261. package/dist/report/built-in/index.d.cts +1 -1
  262. package/dist/report/built-in/index.d.mts +1 -1
  263. package/dist/report/built-in/index.d.ts +1 -1
  264. package/dist/report/built-in/index.js +4 -8
  265. package/dist/report/built-in/index.mjs +4 -8
  266. package/dist/report/built-in/machine.cjs +0 -2
  267. package/dist/report/built-in/machine.cjs.map +1 -1
  268. package/dist/report/built-in/machine.d.cts +0 -2
  269. package/dist/report/built-in/machine.d.mts +0 -2
  270. package/dist/report/built-in/machine.d.ts +0 -2
  271. package/dist/report/built-in/result-components.cjs +49 -51
  272. package/dist/report/built-in/result-components.cjs.map +1 -1
  273. package/dist/report/built-in/result-components.d.cts +16 -17
  274. package/dist/report/built-in/result-components.d.mts +16 -17
  275. package/dist/report/built-in/result-components.d.ts +16 -17
  276. package/dist/report/built-in/result-components.js +0 -4
  277. package/dist/report/built-in/run-membership-overview.cjs +126 -17
  278. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  279. package/dist/report/built-in/run-membership-overview.d.cts +14 -0
  280. package/dist/report/built-in/run-membership-overview.d.mts +14 -0
  281. package/dist/report/built-in/run-membership-overview.d.ts +14 -0
  282. package/dist/report/built-in/run-membership-overview.js +4 -2
  283. package/dist/report/built-in/standard.cjs +80 -45
  284. package/dist/report/built-in/standard.cjs.map +1 -1
  285. package/dist/report/built-in/standard.d.cts +19 -41
  286. package/dist/report/built-in/standard.d.mts +19 -41
  287. package/dist/report/built-in/standard.d.ts +19 -41
  288. package/dist/report/built-in/standard.js +6 -6
  289. package/dist/report/components/attempt-detail/compute.cjs +78 -2
  290. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  291. package/dist/report/components/attempt-detail/compute.d.cts +1 -1
  292. package/dist/report/components/attempt-detail/compute.d.mts +1 -1
  293. package/dist/report/components/attempt-detail/compute.d.ts +1 -1
  294. package/dist/report/components/attempt-detail/content.cjs +1 -1
  295. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  296. package/dist/report/components/entity-lists/compute.cjs +42 -5
  297. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  298. package/dist/report/components/entity-lists/compute.d.cts +10 -8
  299. package/dist/report/components/entity-lists/compute.d.mts +10 -8
  300. package/dist/report/components/entity-lists/compute.d.ts +10 -8
  301. package/dist/report/components/entity-lists/content.cjs +31 -6
  302. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  303. package/dist/report/components/entity-lists/index.cjs +9 -4
  304. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  305. package/dist/report/components/entity-lists/index.d.cts +4 -7
  306. package/dist/report/components/entity-lists/index.d.mts +4 -7
  307. package/dist/report/components/entity-lists/index.d.ts +4 -7
  308. package/dist/report/components/summaries/compute.cjs +8 -1
  309. package/dist/report/components/summaries/compute.cjs.map +1 -1
  310. package/dist/report/components/summaries/compute.d.cts +9 -1
  311. package/dist/report/components/summaries/compute.d.mts +9 -1
  312. package/dist/report/components/summaries/compute.d.ts +9 -1
  313. package/dist/report/components/summaries/index.cjs +48 -4
  314. package/dist/report/components/summaries/index.cjs.map +1 -1
  315. package/dist/report/components/summaries/index.d.cts +7 -4
  316. package/dist/report/components/summaries/index.d.mts +7 -4
  317. package/dist/report/components/summaries/index.d.ts +7 -4
  318. package/dist/report/definition/cell.cjs +3 -0
  319. package/dist/report/definition/cell.cjs.map +1 -1
  320. package/dist/report/definition/cell.d.cts +2 -0
  321. package/dist/report/definition/cell.d.mts +2 -0
  322. package/dist/report/definition/cell.d.ts +2 -0
  323. package/dist/report/definition/primitives/chart.cjs +8 -5
  324. package/dist/report/definition/primitives/chart.cjs.map +1 -1
  325. package/dist/report/definition/primitives/points-dataset.cjs +1 -0
  326. package/dist/report/definition/primitives/points-dataset.cjs.map +1 -1
  327. package/dist/report/definition/primitives.cjs +15 -2
  328. package/dist/report/definition/primitives.cjs.map +1 -1
  329. package/dist/report/definition/report.cjs +27 -3
  330. package/dist/report/definition/report.cjs.map +1 -1
  331. package/dist/report/definition/report.d.cts +8 -0
  332. package/dist/report/definition/report.d.mts +8 -0
  333. package/dist/report/definition/report.d.ts +8 -0
  334. package/dist/report/execution/machine.cjs +30 -14
  335. package/dist/report/execution/machine.cjs.map +1 -1
  336. package/dist/report/execution/machine.d.cts +20 -10
  337. package/dist/report/execution/machine.d.mts +20 -10
  338. package/dist/report/execution/machine.d.ts +20 -10
  339. package/dist/report/execution/machine.js +6 -6
  340. package/dist/report/host/execute.cjs +25 -16
  341. package/dist/report/host/execute.cjs.map +1 -1
  342. package/dist/report/host/execute.d.cts +4 -0
  343. package/dist/report/host/execute.d.mts +4 -0
  344. package/dist/report/host/execute.d.ts +4 -0
  345. package/dist/report/host/from-record.cjs +22 -5
  346. package/dist/report/host/from-record.cjs.map +1 -1
  347. package/dist/report/host/machine.cjs +53 -11
  348. package/dist/report/host/machine.cjs.map +1 -1
  349. package/dist/report/host/site-runtime.cjs +9 -8
  350. package/dist/report/host/site-runtime.cjs.map +1 -1
  351. package/dist/report/host/site-runtime.d.cts +1 -1
  352. package/dist/report/host/site-runtime.d.mts +1 -1
  353. package/dist/report/host/site-runtime.d.ts +1 -1
  354. package/dist/report/host/static.cjs +56 -9
  355. package/dist/report/host/static.cjs.map +1 -1
  356. package/dist/report/index.cjs.map +1 -1
  357. package/dist/report/index.d.cts +1 -1
  358. package/dist/report/index.d.mts +1 -1
  359. package/dist/report/index.d.ts +1 -1
  360. package/dist/report/model/dataset.cjs +7 -2
  361. package/dist/report/model/dataset.cjs.map +1 -1
  362. package/dist/report/model/locale.cjs +2 -0
  363. package/dist/report/model/locale.cjs.map +1 -1
  364. package/dist/report/model/locale.d.cts +1 -0
  365. package/dist/report/model/locale.d.mts +1 -0
  366. package/dist/report/model/locale.d.ts +1 -0
  367. package/dist/report/model/metrics.cjs +3 -1
  368. package/dist/report/model/metrics.cjs.map +1 -1
  369. package/dist/report/model/pricing.cjs +16 -11
  370. package/dist/report/model/pricing.cjs.map +1 -1
  371. package/dist/report/react/styles.css +53 -29
  372. package/dist/runner/adoption.cjs +1 -0
  373. package/dist/runner/adoption.cjs.map +1 -1
  374. package/dist/runner/attempt.cjs +44 -5
  375. package/dist/runner/attempt.cjs.map +1 -1
  376. package/dist/runner/attempt.d.cts +13 -1
  377. package/dist/runner/attempt.d.mts +13 -1
  378. package/dist/runner/attempt.d.ts +13 -1
  379. package/dist/runner/config-identity.cjs +10 -2
  380. package/dist/runner/config-identity.cjs.map +1 -1
  381. package/dist/runner/config-identity.d.cts +4 -2
  382. package/dist/runner/config-identity.d.mts +4 -2
  383. package/dist/runner/config-identity.d.ts +4 -2
  384. package/dist/runner/feedback/human.cjs +298 -59
  385. package/dist/runner/feedback/human.cjs.map +1 -1
  386. package/dist/runner/feedback/json.cjs +14 -6
  387. package/dist/runner/feedback/json.cjs.map +1 -1
  388. package/dist/runner/feedback/json.d.cts +3 -2
  389. package/dist/runner/feedback/json.d.mts +3 -2
  390. package/dist/runner/feedback/json.d.ts +3 -2
  391. package/dist/runner/feedback/reducer.cjs +2 -0
  392. package/dist/runner/feedback/reducer.cjs.map +1 -1
  393. package/dist/runner/judge-config.cjs +1 -1
  394. package/dist/runner/judge-config.cjs.map +1 -1
  395. package/dist/runner/ledger.cjs +124 -12
  396. package/dist/runner/ledger.cjs.map +1 -1
  397. package/dist/runner/project-current.cjs +13 -5
  398. package/dist/runner/project-current.cjs.map +1 -1
  399. package/dist/runner/run.cjs +564 -256
  400. package/dist/runner/run.cjs.map +1 -1
  401. package/dist/runner/sandbox-pool.cjs +161 -30
  402. package/dist/runner/sandbox-pool.cjs.map +1 -1
  403. package/dist/runner/sandbox-pool.d.cts +34 -2
  404. package/dist/runner/sandbox-pool.d.mts +34 -2
  405. package/dist/runner/sandbox-pool.d.ts +34 -2
  406. package/dist/runner/shared-state-lease.cjs +803 -0
  407. package/dist/runner/shared-state-lease.cjs.map +1 -0
  408. package/dist/runner/shared-state-lease.d.cts +121 -0
  409. package/dist/runner/shared-state-lease.d.mts +121 -0
  410. package/dist/runner/shared-state-lease.d.ts +121 -0
  411. package/dist/runner/shared-state-lease.js +24 -0
  412. package/dist/runner/shared-state-lease.js.map +1 -0
  413. package/dist/runner/teardown-registry.cjs +97 -34
  414. package/dist/runner/teardown-registry.cjs.map +1 -1
  415. package/dist/runner/teardown-registry.d.cts +27 -1
  416. package/dist/runner/teardown-registry.d.mts +27 -1
  417. package/dist/runner/teardown-registry.d.ts +27 -1
  418. package/dist/runner/teardown-registry.js +20 -16
  419. package/dist/runner/types.cjs.map +1 -1
  420. package/dist/runner/types.d.cts +31 -5
  421. package/dist/runner/types.d.mts +31 -5
  422. package/dist/runner/types.d.ts +31 -5
  423. package/dist/sample/analysis.cjs +249 -459
  424. package/dist/sample/analysis.cjs.map +1 -1
  425. package/dist/sample/capability.cjs +138 -7
  426. package/dist/sample/capability.cjs.map +1 -1
  427. package/dist/sample/capability.d.cts +3 -1
  428. package/dist/sample/capability.d.mts +3 -1
  429. package/dist/sample/capability.d.ts +3 -1
  430. package/dist/sample/capability.js +8 -6
  431. package/dist/sandbox/docker-agent-image.cjs +5 -1
  432. package/dist/sandbox/docker-agent-image.cjs.map +1 -1
  433. package/dist/sandbox/docker-agent-image.d.cts +2 -0
  434. package/dist/sandbox/docker-agent-image.d.mts +2 -0
  435. package/dist/sandbox/docker-agent-image.d.ts +2 -0
  436. package/dist/sandbox/docker-agent-image.js +14 -10
  437. package/dist/sandbox/docker-profile/schema.cjs +283 -534
  438. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  439. package/dist/sandbox/docker-profile/schema.d.cts +10 -27
  440. package/dist/sandbox/docker-profile/schema.d.mts +10 -27
  441. package/dist/sandbox/docker-profile/schema.d.ts +10 -27
  442. package/dist/sandbox/e2b-agent-template.cjs +5 -2
  443. package/dist/sandbox/e2b-agent-template.cjs.map +1 -1
  444. package/dist/sandbox/index.cjs +4 -2
  445. package/dist/sandbox/index.cjs.map +1 -1
  446. package/dist/sandbox/index.d.cts +1 -1
  447. package/dist/sandbox/index.d.mts +1 -1
  448. package/dist/sandbox/index.d.ts +1 -1
  449. package/dist/sandbox/index.js +120 -116
  450. package/dist/sandbox/index.mjs +120 -116
  451. package/dist/sandbox/keep-registry.cjs +28 -66
  452. package/dist/sandbox/keep-registry.cjs.map +1 -1
  453. package/dist/sandbox/types.cjs.map +1 -1
  454. package/dist/sandbox/types.d.cts +1 -1
  455. package/dist/sandbox/types.d.mts +1 -1
  456. package/dist/sandbox/types.d.ts +1 -1
  457. package/dist/shared/aggregate.cjs +16 -6
  458. package/dist/shared/aggregate.cjs.map +1 -1
  459. package/dist/shared/aggregate.d.cts +12 -4
  460. package/dist/shared/aggregate.d.mts +12 -4
  461. package/dist/shared/aggregate.d.ts +12 -4
  462. package/dist/shared/turn-label.cjs +20 -2
  463. package/dist/shared/turn-label.cjs.map +1 -1
  464. package/dist/shared/turn-label.d.cts +2 -0
  465. package/dist/shared/turn-label.d.mts +2 -0
  466. package/dist/shared/turn-label.d.ts +2 -0
  467. package/dist/shared/turn-label.js +4 -2
  468. package/dist/vendor/remark/remark-gfm.cjs +7 -7
  469. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  470. package/dist/vendor/remark/remark-parse.cjs +12 -12
  471. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  472. package/dist/vendor/remark/remark.cjs +13 -13
  473. package/dist/vendor/remark/remark.cjs.map +1 -1
  474. package/dist/view/server.cjs +6 -0
  475. package/dist/view/server.cjs.map +1 -1
  476. package/docs-site/images/hitl-handshake-zh.svg +3 -3
  477. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  478. package/docs-site/zh/examples/coding-agent-extensions.mdx +1 -1
  479. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +4 -3
  480. package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
  481. package/docs-site/zh/examples/integrations/codex-sdk.mdx +5 -5
  482. package/docs-site/zh/examples/integrations/langgraph.mdx +4 -4
  483. package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
  484. package/docs-site/zh/explanation/adapter.mdx +5 -5
  485. package/docs-site/zh/explanation/assert.mdx +7 -7
  486. package/docs-site/zh/explanation/drive.mdx +4 -2
  487. package/docs-site/zh/explanation/evals.mdx +10 -8
  488. package/docs-site/zh/explanation/experiment.mdx +2 -2
  489. package/docs-site/zh/explanation/hitl.mdx +9 -9
  490. package/docs-site/zh/explanation/judge.mdx +5 -5
  491. package/docs-site/zh/explanation/overview.mdx +3 -3
  492. package/docs-site/zh/explanation/runner.mdx +1 -1
  493. package/docs-site/zh/index.mdx +3 -3
  494. package/docs-site/zh/reference/builtin-agents.mdx +13 -13
  495. package/docs-site/zh/reference/capabilities.mdx +1 -1
  496. package/docs-site/zh/reference/cli.mdx +18 -12
  497. package/docs-site/zh/reference/define-agent.mdx +130 -5
  498. package/docs-site/zh/reference/define-config.mdx +2 -2
  499. package/docs-site/zh/reference/define-eval.mdx +4 -4
  500. package/docs-site/zh/reference/events.mdx +11 -11
  501. package/docs-site/zh/reference/official-adapters.mdx +6 -6
  502. package/docs-site/zh/reference/results-data.mdx +6 -0
  503. package/docs-site/zh/troubleshooting/debugging.mdx +1 -1
  504. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +37 -5
  505. package/docs-site/zh/tutorials/accept-results.mdx +72 -0
  506. package/docs-site/zh/tutorials/agent-onboarding.mdx +6 -6
  507. package/docs-site/zh/tutorials/authoring.mdx +9 -13
  508. package/docs-site/zh/tutorials/ci-integration.mdx +6 -6
  509. package/docs-site/zh/tutorials/compare-runs.mdx +61 -0
  510. package/docs-site/zh/tutorials/concurrency.mdx +13 -12
  511. package/docs-site/zh/tutorials/configuration.mdx +4 -6
  512. package/docs-site/zh/tutorials/connect-your-agent.mdx +1 -1
  513. package/docs-site/zh/tutorials/control-run-cost.mdx +58 -0
  514. package/docs-site/zh/tutorials/criteria-files.mdx +2 -2
  515. package/docs-site/zh/tutorials/custom-reports.mdx +2 -2
  516. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +46 -0
  517. package/docs-site/zh/tutorials/docker-in-docker.mdx +52 -43
  518. package/docs-site/zh/tutorials/eval-groups.mdx +6 -6
  519. package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
  520. package/docs-site/zh/tutorials/experiments.mdx +2 -3
  521. package/docs-site/zh/tutorials/handle-execution-failures.mdx +18 -10
  522. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +16 -8
  523. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +160 -0
  524. package/docs-site/zh/tutorials/plugins.mdx +14 -0
  525. package/docs-site/zh/tutorials/rerun-and-cache.mdx +4 -2
  526. package/docs-site/zh/tutorials/sandbox-agent.mdx +17 -11
  527. package/docs-site/zh/tutorials/sandbox-providers.mdx +17 -13
  528. package/docs-site/zh/tutorials/sandbox-reuse.mdx +12 -19
  529. package/docs-site/zh/tutorials/select-and-preview.mdx +65 -0
  530. package/docs-site/zh/tutorials/verify-judge.mdx +78 -0
  531. package/docs-site/zh/tutorials/viewing-results.mdx +38 -1
  532. package/docs-site/zh/tutorials/write-experiment.mdx +7 -5
  533. package/docs-site/zh/tutorials/write-send.mdx +9 -8
  534. package/package.json +9 -5
  535. package/dist/report/built-in/overview.cjs +0 -44
  536. package/dist/report/built-in/overview.cjs.map +0 -1
  537. package/dist/report/built-in/overview.d.cts +0 -6
  538. package/dist/report/built-in/overview.d.mts +0 -6
  539. package/dist/report/built-in/overview.d.ts +0 -6
  540. package/dist/report/built-in/overview.js +0 -9
  541. package/dist/report/built-in/overview.js.map +0 -1
  542. package/dist/runner/gate-lease.cjs +0 -283
  543. package/dist/runner/gate-lease.cjs.map +0 -1
  544. package/dist/runner/gate-lease.d.cts +0 -62
  545. package/dist/runner/gate-lease.d.mts +0 -62
  546. package/dist/runner/gate-lease.d.ts +0 -62
  547. package/dist/runner/gate-lease.js +0 -22
  548. package/dist/runner/gate-lease.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dataset.js","sourceRoot":"","sources":["dataset.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClosedRows, JsonValue, MeasureFormat, MetricValue, } from \"../../analysis/index.ts\";\nimport { isClosedRows } from \"../../analysis/contracts.ts\";\nimport { isMetricValue } from \"./metrics.ts\";\nimport type { ClosedDataset, Dataset, DatasetDimensionValueType, DatasetField, DatasetRow, DatasetValue, } from \"./types.ts\";\nconst closedDatasetBrands = new WeakSet<object>();\n/** A bad Dataset request never becomes a fake zero, metric, or Evidence row. */\nexport class ReportDatasetError extends Error {\n readonly code = \"report-dataset-invalid\";\n constructor(reason: string) {\n super(reason);\n this.name = \"ReportDatasetError\";\n }\n}\n/** Declares one presentation Dimension field; null coordinates remain valid. */\nexport function dimensionField(name: string, valueType: DatasetDimensionValueType = \"scalar\"): DatasetField {\n assertFieldName(name);\n if (!isDimensionValueType(valueType)) {\n throw new ReportDatasetError(\"unsupported Dimension field value type \" + JSON.stringify(valueType));\n }\n return Object.freeze({ name, kind: \"dimension\" as const, valueType });\n}\n/**\n * Declares a Metric field by its Report row property name. Current Analysis\n * Measures do not carry a display-column name, so accepting one explicitly\n * avoids guessing from an opaque Measure id.\n */\nexport function metricField(name: string, measure: Readonly<{\n readonly unit?: string;\n readonly format?: MeasureFormat;\n readonly better?: \"higher\" | \"lower\" | \"neutral\";\n}>): DatasetField {\n assertFieldName(name);\n return Object.freeze({\n name,\n kind: \"metric\" as const,\n valueType: \"number\" as const,\n ...(measure.unit === undefined ? {} : { unit: measure.unit }),\n ...(measure.format === undefined ? {} : { format: measure.format }),\n ...(measure.better === undefined ? {} : { better: measure.better }),\n });\n}\n/**\n * Projects Analysis-issued ClosedRows into a neutral Dataset while preserving\n * row key, collection identity, frame-level issues, Evidence refs, and every\n * full MetricValue cell. It does not reduce, filter, or re-close rows.\n */\nexport function datasetFromClosedRows<Row extends object>(rows: ClosedRows<Row>, fields: readonly DatasetField[]): ClosedDataset {\n if (!isClosedRows(rows)) {\n throw new ReportDatasetError(\"datasetFromClosedRows requires Analysis-issued ClosedRows\");\n }\n const closedFields = closeFields(fields);\n const datasetRows = rows.map((row, rowIndex) => closeRow(row, rowIndex, closedFields));\n const dataset: ClosedDataset = Object.freeze({\n kind: \"closed-dataset\" as const,\n identity: rows.identity,\n fields: closedFields,\n rows: Object.freeze(datasetRows),\n issues: rows.issues,\n refs: rows.refs,\n });\n closedDatasetBrands.add(dataset);\n return dataset;\n}\n/** True only for a Dataset created from Analysis-issued ClosedRows above. */\nexport function isClosedDataset(value: unknown): value is ClosedDataset {\n return isDataset(value) && closedDatasetBrands.has(value as object) &&\n (value as {\n readonly kind?: unknown;\n }).kind === \"closed-dataset\";\n}\n/** Validates a neutral Dataset shape without claiming that it came from Analysis. */\nexport function isDataset(value: unknown): value is Dataset {\n if (!isPlainRecord(value) || !Array.isArray(value.fields) || !Array.isArray(value.rows))\n return false;\n try {\n const fields = closeFields(value.fields);\n for (let index = 0; index < value.rows.length; index += 1) {\n const row = value.rows[index];\n if (!isDatasetRow(row))\n return false;\n for (const field of fields) {\n if (!Object.hasOwn(row.values, field.name))\n return false;\n if (!fieldValueMatches(field, row.values[field.name]))\n return false;\n }\n }\n return true;\n }\n catch {\n return false;\n }\n}\nexport function fieldOf(dataset: Dataset, name: string): DatasetField | undefined {\n return dataset.fields.find((field) => field.name === name);\n}\nexport function requireField(dataset: Dataset, name: string): DatasetField {\n const field = fieldOf(dataset, name);\n if (field !== undefined)\n return field;\n throw new ReportDatasetError(\"Dataset field \" + JSON.stringify(name) + \" is not declared; fields are \" +\n dataset.fields.map((entry) => JSON.stringify(entry.name)).join(\", \"));\n}\n/** Reads an existing MetricValue cell without changing any of its semantics. */\nexport function metricValueOf(row: DatasetRow, fieldName: string): MetricValue | null {\n const value = row.values[fieldName];\n return isMetricValue(value) ? value : null;\n}\nfunction closeFields(fields: readonly unknown[]): readonly DatasetField[] {\n if (!Array.isArray(fields))\n throw new ReportDatasetError(\"Dataset fields must be an array\");\n const names = new Set<string>();\n const closed = fields.map((field) => {\n if (!isPlainRecord(field))\n throw new ReportDatasetError(\"Dataset field must be an object\");\n const name = field.name;\n if (typeof name !== \"string\")\n throw new ReportDatasetError(\"Dataset field name must be a string\");\n assertFieldName(name);\n if (names.has(name)) {\n throw new ReportDatasetError(\"Dataset field \" + JSON.stringify(name) + \" is declared more than once\");\n }\n names.add(name);\n const kind = field.kind;\n if (kind !== \"dimension\" && kind !== \"metric\") {\n throw new ReportDatasetError(\"Dataset field \" + JSON.stringify(name) + \" has an unknown kind\");\n }\n const valueType = field.valueType;\n if (!isDimensionValueType(valueType)) {\n throw new ReportDatasetError(\"Dataset field \" + JSON.stringify(name) + \" has an unknown value type\");\n }\n if (kind === \"metric\" && valueType !== \"number\") {\n throw new ReportDatasetError(\"Metric Dataset fields must use valueType \\\"number\\\"\");\n }\n const unit = field.unit;\n if (unit !== undefined && typeof unit !== \"string\") {\n throw new ReportDatasetError(\"Dataset field unit must be a string\");\n }\n const format = field.format;\n if (format !== undefined && !isMeasureFormat(format)) {\n throw new ReportDatasetError(\"Dataset field format must be a closed MeasureFormat\");\n }\n const better = field.better;\n if (better !== undefined && !isBetter(better)) {\n throw new ReportDatasetError(\"Dataset field better must be higher, lower, or neutral\");\n }\n const bounds = field.bounds;\n if (bounds !== undefined && !validBounds(bounds)) {\n throw new ReportDatasetError(\"Dataset field bounds must be finite and ordered\");\n }\n return Object.freeze({\n name,\n kind,\n valueType,\n ...(unit === undefined ? {} : { unit }),\n ...(format === undefined ? {} : { format }),\n ...(better === undefined ? {} : { better }),\n ...(bounds === undefined\n ? {}\n : { bounds: Object.freeze({ ...bounds }) }),\n }) satisfies DatasetField;\n });\n return Object.freeze(closed);\n}\nfunction closeRow(value: object, rowIndex: number, fields: readonly DatasetField[]): DatasetRow {\n if (!isPlainRecord(value) || typeof value.key !== \"string\") {\n throw new ReportDatasetError(\"Closed row \" + String(rowIndex) + \" must have a stable string key\");\n }\n const values: Record<string, DatasetValue> = Object.create(null);\n for (const field of fields) {\n if (!Object.hasOwn(value, field.name)) {\n throw new ReportDatasetError(\"Closed row \" + JSON.stringify(value.key) + \" is missing field \" + JSON.stringify(field.name));\n }\n const fieldValue = value[field.name];\n if (!fieldValueMatches(field, fieldValue)) {\n throw new ReportDatasetError(\"Closed row \" + JSON.stringify(value.key) + \" has an invalid \" + field.kind +\n \" field \" + JSON.stringify(field.name));\n }\n values[field.name] = fieldValue;\n }\n return Object.freeze({ key: value.key, values: Object.freeze(values) });\n}\nfunction isDatasetRow(value: unknown): value is DatasetRow {\n return isPlainRecord(value) && typeof value.key === \"string\" && isPlainRecord(value.values);\n}\nfunction fieldValueMatches(field: DatasetField, value: unknown): value is DatasetValue {\n if (field.kind === \"metric\")\n return isMetricValue(value);\n if (value === null)\n return true;\n switch (field.valueType) {\n case \"string\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"scalar\":\n return typeof value === \"string\" || typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value));\n }\n}\nfunction assertFieldName(name: string): void {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new ReportDatasetError(\"Dataset field names must be non-empty strings\");\n }\n if (name === \"key\") {\n throw new ReportDatasetError('Dataset reserves \"key\" for stable row identity');\n }\n}\nfunction isDimensionValueType(value: unknown): value is DatasetDimensionValueType {\n return value === \"string\" || value === \"number\" || value === \"boolean\" || value === \"scalar\";\n}\nfunction isBetter(value: unknown): value is \"higher\" | \"lower\" | \"neutral\" {\n return value === \"higher\" || value === \"lower\" || value === \"neutral\";\n}\nfunction validBounds(value: unknown): value is {\n readonly min?: number;\n readonly max?: number;\n} {\n if (!isPlainRecord(value))\n return false;\n if ((value.min !== undefined && (typeof value.min !== \"number\" || !Number.isFinite(value.min))) ||\n (value.max !== undefined && (typeof value.max !== \"number\" || !Number.isFinite(value.max)))) {\n return false;\n }\n return value.min === undefined || value.max === undefined || value.min <= value.max;\n}\nfunction isMeasureFormat(value: unknown): value is MeasureFormat {\n return typeof value === \"string\" ||\n (isPlainRecord(value) && typeof value.kind === \"string\" &&\n (value.options === undefined || isJsonValue(value.options)));\n}\nfunction isJsonValue(value: unknown, ancestors = new Set<object>()): value is JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\")\n return true;\n if (typeof value === \"number\")\n return Number.isFinite(value);\n if (typeof value !== \"object\" || value === null || ancestors.has(value))\n return false;\n ancestors.add(value);\n const valid = Array.isArray(value)\n ? value.every((entry) => isJsonValue(entry, ancestors))\n : isPlainRecord(value) && Object.values(value).every((entry) => isJsonValue(entry, ancestors));\n ancestors.delete(value);\n return valid;\n}\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n"]}
1
+ {"version":3,"file":"dataset.js","sourceRoot":"","sources":["dataset.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ClosedRows, JsonValue, MeasureFormat, MetricValue, } from \"../../analysis/index.ts\";\nimport { isClosedRows } from \"../../analysis/contracts.ts\";\nimport { isMetricValue } from \"./metrics.ts\";\nimport type { ClosedDataset, Dataset, DatasetDimensionValueType, DatasetField, DatasetRow, DatasetValue, } from \"./types.ts\";\nconst closedDatasetBrands = new WeakSet<object>();\n/** A bad Dataset request never becomes a fake zero, metric, or Evidence row. */\nexport class ReportDatasetError extends Error {\n readonly code = \"report-dataset-invalid\";\n constructor(reason: string) {\n super(reason);\n this.name = \"ReportDatasetError\";\n }\n}\n/** Declares one presentation Dimension field; null coordinates remain valid. */\nexport function dimensionField(name: string, valueType: DatasetDimensionValueType = \"scalar\"): DatasetField {\n assertFieldName(name);\n if (!isDimensionValueType(valueType)) {\n throw new ReportDatasetError(\"unsupported Dimension field value type \" + JSON.stringify(valueType));\n }\n return Object.freeze({ name, kind: \"dimension\" as const, valueType });\n}\n/**\n * Declares a Metric field by its Report row property name. Current Analysis\n * Measures do not carry a display-column name, so accepting one explicitly\n * avoids guessing from an opaque Measure id.\n */\nexport function metricField(name: string, measure: Readonly<{\n readonly unit?: string;\n readonly format?: MeasureFormat;\n readonly better?: \"higher\" | \"lower\" | \"neutral\";\n}>): DatasetField {\n assertFieldName(name);\n return Object.freeze({\n name,\n kind: \"metric\" as const,\n valueType: \"number\" as const,\n ...(measure.unit === undefined ? {} : { unit: measure.unit }),\n ...(measure.format === undefined ? {} : { format: measure.format }),\n ...(measure.better === undefined ? {} : { better: measure.better }),\n });\n}\n/**\n * Projects Analysis-issued ClosedRows into a neutral Dataset while preserving\n * row key, collection identity, frame-level issues, Evidence refs, and every\n * full MetricValue cell. It does not reduce, filter, or re-close rows.\n */\nexport function datasetFromClosedRows<Row extends object>(rows: ClosedRows<Row>, fields: readonly DatasetField[]): ClosedDataset {\n if (!isClosedRows(rows)) {\n throw new ReportDatasetError(\"datasetFromClosedRows requires Analysis-issued ClosedRows\");\n }\n const closedFields = closeFields(fields);\n const datasetRows = rows.map((row, rowIndex) => closeRow(row, rowIndex, closedFields));\n const dataset: ClosedDataset = Object.freeze({\n kind: \"closed-dataset\" as const,\n identity: rows.identity,\n fields: closedFields,\n rows: Object.freeze(datasetRows),\n issues: rows.issues,\n refs: rows.refs,\n });\n closedDatasetBrands.add(dataset);\n return dataset;\n}\n/** True only for a Dataset created from Analysis-issued ClosedRows above. */\nexport function isClosedDataset(value: unknown): value is ClosedDataset {\n return isDataset(value) && closedDatasetBrands.has(value as object) &&\n (value as {\n readonly kind?: unknown;\n }).kind === \"closed-dataset\";\n}\n/** Validates a neutral Dataset shape without claiming that it came from Analysis. */\nexport function isDataset(value: unknown): value is Dataset {\n if (!isPlainRecord(value) || !Array.isArray(value.fields) || !Array.isArray(value.rows))\n return false;\n try {\n const fields = closeFields(value.fields);\n for (let index = 0; index < value.rows.length; index += 1) {\n const row = value.rows[index];\n if (!isDatasetRow(row))\n return false;\n for (const field of fields) {\n if (!Object.hasOwn(row.values, field.name))\n return false;\n if (!fieldValueMatches(field, row.values[field.name]))\n return false;\n }\n }\n return true;\n }\n catch {\n return false;\n }\n}\nexport function fieldOf(dataset: Dataset, name: string): DatasetField | undefined {\n return dataset.fields.find((field) => field.name === name);\n}\nexport function requireField(dataset: Dataset, name: string): DatasetField {\n const field = fieldOf(dataset, name);\n if (field !== undefined)\n return field;\n throw new ReportDatasetError(\"Dataset field \" + JSON.stringify(name) + \" is not declared; fields are \" +\n dataset.fields.map((entry) => JSON.stringify(entry.name)).join(\", \"));\n}\n/** Reads an existing MetricValue cell without changing any of its semantics. */\nexport function metricValueOf(row: DatasetRow, fieldName: string): MetricValue | null {\n const value = row.values[fieldName];\n return isMetricValue(value) ? value : null;\n}\nfunction closeFields(fields: readonly unknown[]): readonly DatasetField[] {\n if (!Array.isArray(fields))\n throw new ReportDatasetError(\"Dataset fields must be an array\");\n const names = new Set<string>();\n const closed = fields.map((field) => {\n if (!isPlainRecord(field))\n throw new ReportDatasetError(\"Dataset field must be an object\");\n const name = field.name;\n if (typeof name !== \"string\")\n throw new ReportDatasetError(\"Dataset field name must be a string\");\n assertFieldName(name);\n if (names.has(name)) {\n throw new ReportDatasetError(\"Dataset field \" + JSON.stringify(name) + \" is declared more than once\");\n }\n names.add(name);\n const kind = field.kind;\n if (kind !== \"dimension\" && kind !== \"metric\") {\n throw new ReportDatasetError(\"Dataset field \" + JSON.stringify(name) + \" has an unknown kind\");\n }\n const valueType = field.valueType;\n if (!isDimensionValueType(valueType)) {\n throw new ReportDatasetError(\"Dataset field \" + JSON.stringify(name) + \" has an unknown value type\");\n }\n if (kind === \"metric\" && valueType !== \"number\") {\n throw new ReportDatasetError(\"Metric Dataset fields must use valueType \\\"number\\\"\");\n }\n const unit = field.unit;\n if (unit !== undefined && typeof unit !== \"string\") {\n throw new ReportDatasetError(\"Dataset field unit must be a string\");\n }\n const format = field.format;\n if (format !== undefined && !isMeasureFormat(format)) {\n throw new ReportDatasetError(\"Dataset field format must be a closed MeasureFormat\");\n }\n const better = field.better;\n if (better !== undefined && !isBetter(better)) {\n throw new ReportDatasetError(\"Dataset field better must be higher, lower, or neutral\");\n }\n const bounds = field.bounds;\n if (bounds !== undefined && !validBounds(bounds)) {\n throw new ReportDatasetError(\"Dataset field bounds must be finite and ordered\");\n }\n return Object.freeze({\n name,\n kind,\n valueType,\n ...(unit === undefined ? {} : { unit }),\n ...(format === undefined ? {} : { format }),\n ...(better === undefined ? {} : { better }),\n ...(bounds === undefined\n ? {}\n : { bounds: Object.freeze({ ...bounds }) }),\n }) satisfies DatasetField;\n });\n return Object.freeze(closed);\n}\nfunction closeRow(value: object, rowIndex: number, fields: readonly DatasetField[]): DatasetRow {\n if (!isPlainRecord(value) || typeof value.key !== \"string\") {\n throw new ReportDatasetError(\"Closed row \" + String(rowIndex) + \" must have a stable string key\");\n }\n const values: Record<string, DatasetValue> = Object.create(null);\n for (const field of fields) {\n if (!Object.hasOwn(value, field.name)) {\n throw new ReportDatasetError(\"Closed row \" + JSON.stringify(value.key) + \" is missing field \" + JSON.stringify(field.name));\n }\n const fieldValue = value[field.name];\n if (!fieldValueMatches(field, fieldValue)) {\n throw new ReportDatasetError(\"Closed row \" + JSON.stringify(value.key) + \" has an invalid \" + field.kind +\n \" field \" + JSON.stringify(field.name));\n }\n values[field.name] = fieldValue;\n }\n return Object.freeze({ key: value.key, values: Object.freeze(values) });\n}\nfunction isDatasetRow(value: unknown): value is DatasetRow {\n return isPlainRecord(value) && typeof value.key === \"string\" && isPlainRecord(value.values);\n}\nfunction fieldValueMatches(field: DatasetField, value: unknown): value is DatasetValue {\n // A neutral Dataset also backs explicit external/scalar charts. ClosedRows\n // still pass through closeRow(), which requires an Analysis MetricValue;\n // the general Dataset validator must additionally accept the finite scalar\n // and null forms already supported by pointsToDataset() and chart-map.ts.\n if (field.kind === \"metric\") {\n return isMetricValue(value) || value === null || (typeof value === \"number\" && Number.isFinite(value));\n }\n if (value === null)\n return true;\n switch (field.valueType) {\n case \"string\":\n return typeof value === \"string\";\n case \"number\":\n return typeof value === \"number\" && Number.isFinite(value);\n case \"boolean\":\n return typeof value === \"boolean\";\n case \"scalar\":\n return typeof value === \"string\" || typeof value === \"boolean\" ||\n (typeof value === \"number\" && Number.isFinite(value));\n }\n}\nfunction assertFieldName(name: string): void {\n if (typeof name !== \"string\" || name.length === 0) {\n throw new ReportDatasetError(\"Dataset field names must be non-empty strings\");\n }\n if (name === \"key\") {\n throw new ReportDatasetError('Dataset reserves \"key\" for stable row identity');\n }\n}\nfunction isDimensionValueType(value: unknown): value is DatasetDimensionValueType {\n return value === \"string\" || value === \"number\" || value === \"boolean\" || value === \"scalar\";\n}\nfunction isBetter(value: unknown): value is \"higher\" | \"lower\" | \"neutral\" {\n return value === \"higher\" || value === \"lower\" || value === \"neutral\";\n}\nfunction validBounds(value: unknown): value is {\n readonly min?: number;\n readonly max?: number;\n} {\n if (!isPlainRecord(value))\n return false;\n if ((value.min !== undefined && (typeof value.min !== \"number\" || !Number.isFinite(value.min))) ||\n (value.max !== undefined && (typeof value.max !== \"number\" || !Number.isFinite(value.max)))) {\n return false;\n }\n return value.min === undefined || value.max === undefined || value.min <= value.max;\n}\nfunction isMeasureFormat(value: unknown): value is MeasureFormat {\n return typeof value === \"string\" ||\n (isPlainRecord(value) && typeof value.kind === \"string\" &&\n (value.options === undefined || isJsonValue(value.options)));\n}\nfunction isJsonValue(value: unknown, ancestors = new Set<object>()): value is JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\")\n return true;\n if (typeof value === \"number\")\n return Number.isFinite(value);\n if (typeof value !== \"object\" || value === null || ancestors.has(value))\n return false;\n ancestors.add(value);\n const valid = Array.isArray(value)\n ? value.every((entry) => isJsonValue(entry, ancestors))\n : isPlainRecord(value) && Object.values(value).every((entry) => isJsonValue(entry, ancestors));\n ancestors.delete(value);\n return valid;\n}\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n"]}
@@ -214,6 +214,7 @@ const en = {
214
214
  "tabs.tab": "Tab",
215
215
  /** 成本投影卡片的显示文案(docs/feature/reports/cost-projections/cli.md)。 */
216
216
  "costProjection.unavailable": "cost projection unavailable",
217
+ "costProjection.migrationRequired": "cost projection requires migration — run niceeval migrate",
217
218
  "costProjection.basis.observed": "observed",
218
219
  "costProjection.basis.estimated": "estimated",
219
220
  "costProjection.basis.mixed": "mixed",
@@ -378,6 +379,7 @@ const zhCN = {
378
379
  "attemptSource.abortReason": "前置未过,test() 就地结束",
379
380
  "tabs.tab": "Tab",
380
381
  "costProjection.unavailable": "成本投影不可用",
382
+ "costProjection.migrationRequired": "成本投影需要迁移——请运行 niceeval migrate",
381
383
  "costProjection.basis.observed": "供应商观测",
382
384
  "costProjection.basis.estimated": "价格表估算",
383
385
  "costProjection.basis.mixed": "混合",
@@ -1 +1 @@
1
- {"version":3,"file":"locale.js","sourceRoot":"","sources":["locale.ts"],"names":[],"mappings":";;;AAkBA,oDAeC;AAED,kDAQC;AAyWD,gCAKC;AAMD,4CAKC;AAED,8BAEC;AAID,gDASC;AA3aY,QAAA,qBAAqB,GAAiB,IAAI,CAAC;AACxD,2BAA2B;AACd,QAAA,eAAe,GAA4B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACxE;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,IAAmB,EAAE,MAAoB;IAC1E,IAAI,OAAO,IAAI,KAAK,QAAQ;QACxB,OAAO,IAAI,CAAC;IAChB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE;QACrC,OAAO,MAAM,CAAC;IAClB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IACnB,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE;QAC7B,OAAO,EAAE,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YACnC,OAAO,KAAK,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qGAAqG,CAAC,CAAC;AAC3H,CAAC;AACD,qDAAqD;AACrD,SAAgB,mBAAmB,CAAC,CAAgB,EAAE,CAAgB;IAClE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;QAC9C,OAAO,CAAC,KAAK,CAAC,CAAC;IACnB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC7B,OAAO,KAAK,CAAC;IACjB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1E,CAAC;AACD,MAAM,EAAE,GAAG;IACP,gBAAgB,EAAE,QAAQ;IAC1B,gBAAgB,EAAE,QAAQ;IAC1B,iBAAiB,EAAE,SAAS;IAC5B,iBAAiB,EAAE,SAAS;IAC5B,0DAA0D;IAC1D,wBAAwB,EAAE,aAAa;IACvC,gEAAgE;IAChE,qBAAqB,EAAE,MAAM;IAC7B,mBAAmB,EAAE,MAAM;IAC3B,kBAAkB,EAAE,MAAM;IAC1B,oBAAoB,EAAE,OAAO;IAC7B,+BAA+B;IAC/B,cAAc,EAAE,SAAS;IACzB,oDAAoD;IACpD,iBAAiB,EAAE,YAAY;IAC/B,8DAA8D;IAC9D,sBAAsB,EAAE,8BAA8B;IACtD,oBAAoB,EAAE,qCAAqC;IAC3D,0BAA0B,EAAE,+BAA+B;IAC3D,oBAAoB,EAAE,4EAA4E;IAClG,mBAAmB,EAAE,WAAW;IAChC,mBAAmB,EAAE,aAAa;IAClC,qBAAqB,EAAE,cAAc;IACrC,oBAAoB,EAAE,kBAAkB;IACxC,mBAAmB,EAAE,iBAAiB;IACtC,aAAa,EAAE,OAAO;IACtB,aAAa,EAAE,OAAO;IACtB,gBAAgB,EAAE,UAAU;IAC5B,yBAAyB,EAAE,cAAc;IACzC,YAAY,EAAE,MAAM;IACpB,cAAc,EAAE,QAAQ;IACxB,qBAAqB,EAAE,oBAAoB;IAC3C,+CAA+C;IAC/C,eAAe,EAAE,SAAS;IAC1B,2BAA2B,EAAE,YAAY;IACzC,4BAA4B,EAAE,WAAW;IACzC,yBAAyB,EAAE,WAAW;IACtC,oCAAoC,EAAE,0DAA0D;IAChG,2BAA2B,EAAE,aAAa;IAC1C,sCAAsC,EAAE,gDAAgD;IACxF,uBAAuB,EAAE,QAAQ;IACjC,qBAAqB,EAAE,MAAM;IAC7B,uBAAuB,EAAE,QAAQ;IACjC,uBAAuB,EAAE,QAAQ;IACjC,4BAA4B,EAAE,gBAAgB;IAC9C,yBAAyB,EAAE,UAAU;IACrC,kCAAkC,EAAE,qBAAqB;IACzD,6BAA6B,EAAE,SAAS;IACxC,sBAAsB,EAAE,OAAO;IAC/B,oBAAoB,EAAE,aAAa;IACnC,6BAA6B,EAAE,mBAAmB;IAClD,+BAA+B,EAAE,oBAAoB;IACrD;0FACsF;IACtF,+BAA+B,EAAE,sBAAsB;IACvD,iCAAiC,EAAE,uBAAuB;IAC1D,oCAAoC;IACpC,yBAAyB,EAAE,6BAA6B;IACxD,2BAA2B,EAAE,8BAA8B;IAC3D,gCAAgC;IAChC,8BAA8B,EAAE,YAAY;IAC5C,+BAA+B,EAAE,cAAc;IAC/C,yBAAyB,EAAE,aAAa;IACxC,8BAA8B;IAC9B,0BAA0B,EAAE,aAAa;IACzC,oBAAoB,EAAE,OAAO;IAC7B,uBAAuB,EAAE,UAAU;IACnC,uBAAuB,EAAE,WAAW;IACpC,yBAAyB,EAAE,aAAa;IACxC,wBAAwB,EAAE,YAAY;IACtC,sBAAsB,EAAE,mBAAmB;IAC3C,uBAAuB,EAAE,2BAA2B;IACpD,2BAA2B,EAAE,+CAA+C;IAC5E,wBAAwB,EAAE,cAAc;IACxC,2BAA2B,EAAE,iBAAiB;IAC9C,0BAA0B,EAAE,gBAAgB;IAC5C,4BAA4B,EAAE,iBAAiB;IAC/C,qBAAqB,EAAE,WAAW;IAClC,wBAAwB,EAAE,cAAc;IACxC,gBAAgB,EAAE,OAAO;IACzB,mBAAmB,EAAE,WAAW;IAChC,oBAAoB,EAAE,MAAM;IAC5B,4DAA4D;IAC5D,0BAA0B,EAAE,sBAAsB;IAClD,4BAA4B;IAC5B,cAAc,EAAE,QAAQ;IACxB,2BAA2B;IAC3B,gBAAgB,EAAE,2BAA2B;IAC7C,mCAAmC;IACnC,mBAAmB,EAAE,kBAAkB;IACvC,mBAAmB,EAAE,wBAAwB;IAC7C,qBAAqB,EAAE,yBAAyB;IAChD,mBAAmB,EAAE,aAAa;IAClC,uBAAuB,EAAE,wBAAwB;IACjD,2BAA2B,EAAE,sBAAsB;IACnD,mBAAmB,EAAE,eAAe;IACpC,yBAAyB,EAAE,aAAa;IACxC,qBAAqB,EAAE,SAAS;IAChC,kBAAkB,EAAE,OAAO;IAC3B,sBAAsB,EAAE,OAAO;IAC/B,uBAAuB,EAAE,4BAA4B;IACrD,yBAAyB,EAAE,6BAA6B;IACxD,2BAA2B,EAAE,+BAA+B;IAC5D,6BAA6B,EAAE,gCAAgC;IAC/D,uBAAuB,EAAE,eAAe;IACxC,2BAA2B,EAAE,kBAAkB;IAC/C,wBAAwB,EAAE,2CAA2C;IACrE,0BAA0B,EAAE,4CAA4C;IACxE,oBAAoB,EAAE,UAAU;IAChC,uBAAuB,EAAE,cAAc;IACvC,yBAAyB,EAAE,WAAW;IACtC,yBAAyB,EAAE,oDAAoD;IAC/E,aAAa,EAAE,oDAAoD;IACnE,iBAAiB,EAAE,QAAQ;IAC3B,gBAAgB,EAAE,WAAW;IAC7B,kBAAkB,EAAE,aAAa;IACjC,YAAY,EAAE,MAAM;IACpB,wBAAwB,EAAE,wBAAwB;IAClD,uBAAuB,EAAE,cAAc;IACvC,sEAAsE;IACtE,gCAAgC,EAAE,wBAAwB;IAC1D,kCAAkC,EAAE,yBAAyB;IAC7D,qCAAqC,EAAE,oBAAoB;IAC3D,uCAAuC,EAAE,qBAAqB;IAC9D,oBAAoB,EAAE,aAAa;IACnC,sBAAsB,EAAE,YAAY;IACpC,iCAAiC,EAAE,YAAY;IAC/C,4BAA4B;IAC5B,4BAA4B,EAAE,yBAAyB;IACvD,6EAA6E;IAC7E,cAAc,EAAE,iBAAiB;IACjC,aAAa,EAAE,aAAa;IAC5B,iEAAiE;IACjE,2BAA2B,EAAE,0BAA0B;IACvD,6BAA6B,EAAE,2BAA2B;IAC1D,oBAAoB,EAAE,iBAAiB;IACvC,+BAA+B;IAC/B,sBAAsB,EAAE,aAAa;IACrC,wBAAwB,EAAE,UAAU;IACpC,0BAA0B,EAAE,UAAU;IACtC,4BAA4B,EAAE,WAAW;IACzC,gCAAgC,EAAE,YAAY;IAC9C,kCAAkC,EAAE,YAAY;IAChD,4BAA4B;IAC5B,qBAAqB,EAAE,UAAU;IACjC,uBAAuB,EAAE,WAAW;IACpC,2BAA2B,EAAE,YAAY;IACzC,6BAA6B,EAAE,YAAY;IAC3C,qBAAqB,EAAE,WAAW;IAClC,4EAA4E;IAC5E,6CAA6C,EAAE,gBAAgB;IAC/D,+CAA+C,EAAE,iBAAiB;IAClE,sCAAsC,EAAE,SAAS;IACjD,wCAAwC,EAAE,UAAU;IACpD,yCAAyC,EAAE,YAAY;IACvD,2CAA2C,EAAE,aAAa;IAC1D,sCAAsC,EAAE,aAAa;IACrD,oCAAoC,EAAE,gBAAgB;IACtD,8CAA8C;IAC9C,+BAA+B,EAAE,kBAAkB;IACnD,+EAA+E;IAC/E,qCAAqC,EAAE,8CAA8C;IACrF,gCAAgC,EAAE,eAAe;IACjD,gBAAgB;IAChB,wBAAwB,EAAE,WAAW;IACrC,4BAA4B,EAAE,UAAU;IACxC,2BAA2B,EAAE,SAAS;IACtC,0BAA0B,EAAE,QAAQ;IACpC,2BAA2B,EAAE,wCAAwC;IACrE,UAAU,EAAE,KAAK;IACjB,iEAAiE;IACjE,4BAA4B,EAAE,6BAA6B;IAC3D,+BAA+B,EAAE,UAAU;IAC3C,gCAAgC,EAAE,WAAW;IAC7C,4BAA4B,EAAE,OAAO;IACrC,8BAA8B,EAAE,SAAS;IACzC,wBAAwB,EAAE,+DAA+D;IACzF,iCAAiC,EAAE,mBAAmB;IACtD,iCAAiC,EAAE,mBAAmB;IACtD,wCAAwC,EAAE,4BAA4B;IACtE,+BAA+B,EAAE,kBAAkB;IACnD,2BAA2B,EAAE,aAAa;IAC1C,2BAA2B,EAAE,mCAAmC;IAChE,yBAAyB,EAAE,yBAAyB;IACpD,yBAAyB,EAAE,UAAU;IACrC,kCAAkC,EAAE,oBAAoB;IACxD,6BAA6B,EAAE,eAAe;IAC9C,uBAAuB,EAAE,mBAAmB;CACtC,CAAC;AAEX,MAAM,IAAI,GAAgD;IACtD,gBAAgB,EAAE,IAAI;IACtB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,IAAI;IACvB,iBAAiB,EAAE,IAAI;IACvB,wBAAwB,EAAE,SAAS;IACnC,qBAAqB,EAAE,QAAQ;IAC/B,mBAAmB,EAAE,QAAQ;IAC7B,kBAAkB,EAAE,OAAO;IAC3B,oBAAoB,EAAE,QAAQ;IAC9B,cAAc,EAAE,KAAK;IACrB,iBAAiB,EAAE,KAAK;IACxB,sBAAsB,EAAE,UAAU;IAClC,oBAAoB,EAAE,gCAAgC;IACtD,0BAA0B,EAAE,wBAAwB;IACpD,oBAAoB,EAAE,0CAA0C;IAChE,mBAAmB,EAAE,WAAW;IAChC,mBAAmB,EAAE,eAAe;IACpC,qBAAqB,EAAE,eAAe;IACtC,oBAAoB,EAAE,MAAM;IAC5B,mBAAmB,EAAE,MAAM;IAC3B,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,OAAO;IACtB,gBAAgB,EAAE,IAAI;IACtB,yBAAyB,EAAE,MAAM;IACjC,YAAY,EAAE,IAAI;IAClB,cAAc,EAAE,IAAI;IACpB,qBAAqB,EAAE,MAAM;IAC7B,eAAe,EAAE,SAAS;IAC1B,2BAA2B,EAAE,IAAI;IACjC,4BAA4B,EAAE,MAAM;IACpC,yBAAyB,EAAE,KAAK;IAChC,oCAAoC,EAAE,wCAAwC;IAC9E,2BAA2B,EAAE,IAAI;IACjC,sCAAsC,EAAE,gBAAgB;IACxD,uBAAuB,EAAE,QAAQ;IACjC,qBAAqB,EAAE,IAAI;IAC3B,uBAAuB,EAAE,IAAI;IAC7B,uBAAuB,EAAE,IAAI;IAC7B,4BAA4B,EAAE,cAAc;IAC5C,yBAAyB,EAAE,IAAI;IAC/B,kCAAkC,EAAE,OAAO;IAC3C,6BAA6B,EAAE,IAAI;IACnC,sBAAsB,EAAE,OAAO;IAC/B,oBAAoB,EAAE,YAAY;IAClC,6BAA6B,EAAE,YAAY;IAC3C,+BAA+B,EAAE,YAAY;IAC7C,+BAA+B,EAAE,YAAY;IAC7C,iCAAiC,EAAE,YAAY;IAC/C,yBAAyB,EAAE,eAAe;IAC1C,2BAA2B,EAAE,eAAe;IAC5C,8BAA8B,EAAE,MAAM;IACtC,+BAA+B,EAAE,MAAM;IACvC,yBAAyB,EAAE,KAAK;IAChC,0BAA0B,EAAE,IAAI;IAChC,oBAAoB,EAAE,MAAM;IAC5B,uBAAuB,EAAE,SAAS;IAClC,uBAAuB,EAAE,KAAK;IAC9B,yBAAyB,EAAE,IAAI;IAC/B,wBAAwB,EAAE,KAAK;IAC/B,sBAAsB,EAAE,eAAe;IACvC,uBAAuB,EAAE,sBAAsB;IAC/C,2BAA2B,EAAE,0BAA0B;IACvD,wBAAwB,EAAE,SAAS;IACnC,2BAA2B,EAAE,YAAY;IACzC,0BAA0B,EAAE,SAAS;IACrC,4BAA4B,EAAE,SAAS;IACvC,qBAAqB,EAAE,YAAY;IACnC,wBAAwB,EAAE,eAAe;IACzC,gBAAgB,EAAE,MAAM;IACxB,mBAAmB,EAAE,KAAK;IAC1B,oBAAoB,EAAE,IAAI;IAC1B,0BAA0B,EAAE,QAAQ;IACpC,cAAc,EAAE,IAAI;IACpB,gBAAgB,EAAE,oBAAoB;IACtC,mBAAmB,EAAE,YAAY;IACjC,mBAAmB,EAAE,WAAW;IAChC,qBAAqB,EAAE,WAAW;IAClC,mBAAmB,EAAE,YAAY;IACjC,uBAAuB,EAAE,aAAa;IACtC,2BAA2B,EAAE,eAAe;IAC5C,mBAAmB,EAAE,YAAY;IACjC,yBAAyB,EAAE,KAAK;IAChC,qBAAqB,EAAE,IAAI;IAC3B,kBAAkB,EAAE,IAAI;IACxB,sBAAsB,EAAE,IAAI;IAC5B,uBAAuB,EAAE,gBAAgB;IACzC,yBAAyB,EAAE,gBAAgB;IAC3C,2BAA2B,EAAE,iBAAiB;IAC9C,6BAA6B,EAAE,iBAAiB;IAChD,uBAAuB,EAAE,YAAY;IACrC,2BAA2B,EAAE,aAAa;IAC1C,wBAAwB,EAAE,iBAAiB;IAC3C,0BAA0B,EAAE,iBAAiB;IAC7C,oBAAoB,EAAE,KAAK;IAC3B,uBAAuB,EAAE,QAAQ;IACjC,yBAAyB,EAAE,OAAO;IAClC,yBAAyB,EAAE,yCAAyC;IACpE,aAAa,EAAE,4BAA4B;IAC3C,iBAAiB,EAAE,IAAI;IACvB,gBAAgB,EAAE,KAAK;IACvB,kBAAkB,EAAE,IAAI;IACxB,YAAY,EAAE,IAAI;IAClB,wBAAwB,EAAE,aAAa;IACvC,uBAAuB,EAAE,MAAM;IAC/B,gCAAgC,EAAE,eAAe;IACjD,kCAAkC,EAAE,eAAe;IACnD,qCAAqC,EAAE,YAAY;IACnD,uCAAuC,EAAE,YAAY;IACrD,oBAAoB,EAAE,WAAW;IACjC,sBAAsB,EAAE,WAAW;IACnC,iCAAiC,EAAE,KAAK;IACxC,4BAA4B,EAAE,0BAA0B;IACxD,cAAc,EAAE,aAAa;IAC7B,aAAa,EAAE,MAAM;IACrB,2BAA2B,EAAE,qBAAqB;IAClD,6BAA6B,EAAE,qBAAqB;IACpD,oBAAoB,EAAE,aAAa;IACnC,sBAAsB,EAAE,YAAY;IACpC,wBAAwB,EAAE,SAAS;IACnC,0BAA0B,EAAE,YAAY;IACxC,4BAA4B,EAAE,YAAY;IAC1C,gCAAgC,EAAE,SAAS;IAC3C,kCAAkC,EAAE,SAAS;IAC7C,qBAAqB,EAAE,SAAS;IAChC,uBAAuB,EAAE,SAAS;IAClC,2BAA2B,EAAE,SAAS;IACtC,6BAA6B,EAAE,SAAS;IACxC,qBAAqB,EAAE,QAAQ;IAC/B,6CAA6C,EAAE,SAAS;IACxD,+CAA+C,EAAE,SAAS;IAC1D,sCAAsC,EAAE,SAAS;IACjD,wCAAwC,EAAE,SAAS;IACnD,yCAAyC,EAAE,SAAS;IACpD,2CAA2C,EAAE,SAAS;IACtD,sCAAsC,EAAE,KAAK;IAC7C,oCAAoC,EAAE,KAAK;IAC3C,+BAA+B,EAAE,aAAa;IAC9C,qCAAqC,EAAE,wBAAwB;IAC/D,gCAAgC,EAAE,MAAM;IACxC,wBAAwB,EAAE,IAAI;IAC9B,4BAA4B,EAAE,KAAK;IACnC,2BAA2B,EAAE,IAAI;IACjC,0BAA0B,EAAE,IAAI;IAChC,2BAA2B,EAAE,kBAAkB;IAC/C,UAAU,EAAE,KAAK;IACjB,4BAA4B,EAAE,SAAS;IACvC,+BAA+B,EAAE,OAAO;IACxC,gCAAgC,EAAE,OAAO;IACzC,4BAA4B,EAAE,IAAI;IAClC,8BAA8B,EAAE,IAAI;IACpC,wBAAwB,EAAE,+CAA+C;IACzE,iCAAiC,EAAE,SAAS;IAC5C,iCAAiC,EAAE,SAAS;IAC5C,wCAAwC,EAAE,cAAc;IACxD,+BAA+B,EAAE,OAAO;IACxC,2BAA2B,EAAE,KAAK;IAClC,2BAA2B,EAAE,0BAA0B;IACvD,yBAAyB,EAAE,uBAAuB;IAClD,yBAAyB,EAAE,KAAK;IAChC,kCAAkC,EAAE,QAAQ;IAC5C,6BAA6B,EAAE,KAAK;IACpC,uBAAuB,EAAE,mBAAmB;CAC/C,CAAC;AACF,MAAM,YAAY,GAA2E;IACzF,EAAE;IACF,OAAO,EAAE,IAAI;CAChB,CAAC;AACF,oDAAoD;AACpD,SAAgB,UAAU,CAAC,MAAoB,EAAE,GAAqB,EAAE,IAAiD;IACrH,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACrE,IAAI,CAAC,IAAI;QACL,OAAO,QAAQ,CAAC;IACpB,OAAO,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtG,CAAC;AACD;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,GAAqB;IAClD,MAAM,IAAI,GAAsC,EAAE,CAAC;IACnD,KAAK,MAAM,MAAM,IAAI,uBAAe;QAChC,IAAI,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,sEAAsE;AACtE,SAAgB,SAAS,CAAC,MAAoB,EAAE,IAAyV,EAAE,CAAS;IAChZ,OAAO,UAAU,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAsB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACjG,CAAC;AACD;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAgC,EAAE,MAAoB,EAAE,QAAgB;IACvG,IAAI,KAAK,KAAK,SAAS;QACnB,OAAO,QAAQ,CAAC;IACpB,IAAI,CAAC;QACD,OAAO,oBAAoB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,CAAC;QACH,OAAO,QAAQ,CAAC;IACpB,CAAC;AACL,CAAC","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\": \"Record\",\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.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.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.tokens\": \"Tokens\",\n \"experimentList.cost\": \"Cost\",\n \"experimentList.result\": \"Record\",\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"]}
@@ -186,6 +186,7 @@ declare const en: {
186
186
  readonly "tabs.tab": "Tab";
187
187
  /** 成本投影卡片的显示文案(docs/feature/reports/cost-projections/cli.md)。 */
188
188
  readonly "costProjection.unavailable": "cost projection unavailable";
189
+ readonly "costProjection.migrationRequired": "cost projection requires migration — run niceeval migrate";
189
190
  readonly "costProjection.basis.observed": "observed";
190
191
  readonly "costProjection.basis.estimated": "estimated";
191
192
  readonly "costProjection.basis.mixed": "mixed";
@@ -186,6 +186,7 @@ declare const en: {
186
186
  readonly "tabs.tab": "Tab";
187
187
  /** 成本投影卡片的显示文案(docs/feature/reports/cost-projections/cli.md)。 */
188
188
  readonly "costProjection.unavailable": "cost projection unavailable";
189
+ readonly "costProjection.migrationRequired": "cost projection requires migration — run niceeval migrate";
189
190
  readonly "costProjection.basis.observed": "observed";
190
191
  readonly "costProjection.basis.estimated": "estimated";
191
192
  readonly "costProjection.basis.mixed": "mixed";
@@ -186,6 +186,7 @@ declare const en: {
186
186
  readonly "tabs.tab": "Tab";
187
187
  /** 成本投影卡片的显示文案(docs/feature/reports/cost-projections/cli.md)。 */
188
188
  readonly "costProjection.unavailable": "cost projection unavailable";
189
+ readonly "costProjection.migrationRequired": "cost projection requires migration — run niceeval migrate";
189
190
  readonly "costProjection.basis.observed": "observed";
190
191
  readonly "costProjection.basis.estimated": "estimated";
191
192
  readonly "costProjection.basis.mixed": "mixed";
@@ -117,6 +117,8 @@ function isMetricValue(value) {
117
117
  return metric.total > 0 && metric.samples < metric.total;
118
118
  case "empty":
119
119
  return metric.value === null && metric.samples === metric.total;
120
+ case "migration-required":
121
+ return metric.value === null && metric.samples === 0 && metric.total > 0;
120
122
  case "unsupported":
121
123
  return metric.value === null && metric.samples === 0;
122
124
  // Cost projections can be structurally sound while no USD contribution
@@ -175,7 +177,7 @@ function isMetricCount(value) {
175
177
  return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
176
178
  }
177
179
  function isMetricState(value) {
178
- return value === "available" || value === "partial" || value === "empty" ||
180
+ return value === "available" || value === "partial" || value === "empty" || value === "migration-required" ||
179
181
  value === "unsupported" || value === "unavailable" || value === "failed";
180
182
  }
181
183
  function isMetricBasis(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["metrics.ts"],"names":[],"mappings":"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","sourcesContent":["import { allLogicalSlots, attemptLatencyMs, attemptPassed, attemptTokens, defineMeasure, latestCompletedAttempt, logicalSlots, mean, oneValue, partial, ratio, retainContributingEvidence, type AnalysisIssue, type EvidenceRef, type JsonValue, type MeasureFormat, type MetricValue, } from \"../../analysis/index.ts\";\n/**\n * Analysis owns every metric's denominator, missingness, state, Evidence, and\n * provenance. These descriptors are the small Report catalog expressed with\n * current Analysis definitions.\n */\nexport const passRate = defineMeasure({\n id: \"niceeval.report.pass-rate\",\n population: logicalSlots,\n input: attemptPassed,\n withinAttempt: oneValue<boolean>(),\n withinSlot: latestCompletedAttempt<boolean>(),\n acrossSlots: ratio(),\n denominator: allLogicalSlots(),\n missing: partial(),\n evidence: retainContributingEvidence(),\n unit: \"ratio\",\n format: \"percent\",\n better: \"higher\",\n});\n/** Mean recorded `eval.run` duration across the fixed logical-Slot denominator. */\nexport const durationMs = defineMeasure({\n id: \"niceeval.report.duration-ms\",\n population: logicalSlots,\n input: attemptLatencyMs,\n withinAttempt: oneValue<number>(),\n withinSlot: latestCompletedAttempt<number>(),\n acrossSlots: mean(),\n denominator: allLogicalSlots(),\n missing: partial(),\n evidence: retainContributingEvidence(),\n unit: \"ms\",\n better: \"lower\",\n});\n/** Mean recorded input plus output token count across the fixed denominator. */\nexport const tokens = defineMeasure({\n id: \"niceeval.report.tokens\",\n population: logicalSlots,\n input: attemptTokens,\n withinAttempt: oneValue<number>(),\n withinSlot: latestCompletedAttempt<number>(),\n acrossSlots: mean(),\n denominator: allLogicalSlots(),\n missing: partial(),\n evidence: retainContributingEvidence(),\n unit: \"tokens\",\n better: \"lower\",\n});\nexport { costUSD, totalCostUSD } from \"../../analysis/index.ts\";\n/**\n * Presentation facts retain the original metric and every Analysis-owned\n * diagnostic channel. They are safe for a component to inspect, but not a\n * replacement metric that can be re-aggregated.\n */\nexport interface MetricFacts<Value = number> {\n readonly value: Value | null;\n readonly state: MetricValue<Value>[\"state\"];\n readonly samples: number;\n readonly total: number;\n readonly basis: MetricValue<Value>[\"basis\"];\n readonly issues: readonly AnalysisIssue[];\n readonly refs: readonly EvidenceRef[];\n readonly unit?: string;\n readonly format?: MeasureFormat;\n readonly better?: MetricValue<Value>[\"better\"];\n readonly bounds?: MetricValue<Value>[\"bounds\"];\n readonly complete: boolean;\n readonly coverage: number | null;\n readonly metric: MetricValue<Value>;\n}\n/** Extract display facts without discarding the complete MetricValue. */\nexport function metricFacts<Value>(metric: MetricValue<Value>): MetricFacts<Value> {\n return Object.freeze({\n value: metric.value,\n state: metric.state,\n samples: metric.samples,\n total: metric.total,\n basis: metric.basis,\n issues: metric.issues,\n refs: metric.refs,\n ...(metric.unit === undefined ? {} : { unit: metric.unit }),\n ...(metric.format === undefined ? {} : { format: metric.format }),\n ...(metric.better === undefined ? {} : { better: metric.better }),\n ...(metric.bounds === undefined ? {} : { bounds: metric.bounds }),\n complete: metric.state === \"available\",\n coverage: metric.total === 0 ? null : metric.samples / metric.total,\n metric,\n });\n}\n/** The contributor/denominator fraction; null means the declared denominator is zero. */\nexport function metricCoverage(metric: MetricValue): number | null {\n return metric.total === 0 ? null : metric.samples / metric.total;\n}\n/** A numeric metric is usable only when Analysis closed a finite scalar. */\nexport function hasMetricValue(metric: MetricValue): metric is MetricValue<number> & {\n readonly value: number;\n} {\n return metric.value !== null && typeof metric.value === \"number\" && Number.isFinite(metric.value);\n}\n/**\n * A closed business row may collect existing MetricValue diagnostics, but it\n * cannot manufacture one or alter its total, state, issues, refs, or value.\n */\nexport interface EvidenceRow {\n readonly issues: readonly AnalysisIssue[];\n readonly refs: readonly EvidenceRef[];\n}\ndeclare const evidenceRowMetricDiagnostic: unique symbol;\ntype MetricFieldKeys<Fields extends object> = {\n [Key in keyof Fields]-?: Fields[Key] extends MetricValue ? Key : never;\n}[keyof Fields];\ntype EvidenceRowInput<Fields extends object> = [\n MetricFieldKeys<Fields>\n] extends [\n never\n] ? {\n readonly [evidenceRowMetricDiagnostic]: \"evidenceRow requires at least one MetricValue field\";\n} : unknown;\n/**\n * Structural validation for an already-closed Analysis MetricValue. It is a\n * display-boundary guard, not a constructor: Report never exports\n * `metricValue()`.\n */\nexport function isMetricValue(value: unknown): value is MetricValue {\n if (!isPlainRecord(value))\n return false;\n const metric = value as Partial<MetricValue>;\n if ((metric.value !== null && (typeof metric.value !== \"number\" || !Number.isFinite(metric.value))) ||\n !isMetricState(metric.state) ||\n !isMetricCount(metric.samples) ||\n !isMetricCount(metric.total) ||\n metric.samples > metric.total ||\n !isMetricBasis(metric.basis) ||\n !Array.isArray(metric.issues) ||\n !metric.issues.every(isAnalysisIssue) ||\n !Array.isArray(metric.refs) ||\n !metric.refs.every(isEvidenceRef) ||\n (metric.unit !== undefined && typeof metric.unit !== \"string\") ||\n (metric.format !== undefined && !isMeasureFormat(metric.format)) ||\n (metric.better !== undefined && ![\"higher\", \"lower\", \"neutral\"].includes(metric.better)) ||\n (metric.bounds !== undefined && !isMetricBounds(metric.bounds))) {\n return false;\n }\n switch (metric.state) {\n case \"available\":\n return typeof metric.value === \"number\" && metric.total > 0 && metric.samples === metric.total;\n case \"partial\":\n return metric.total > 0 && metric.samples < metric.total;\n case \"empty\":\n return metric.value === null && metric.samples === metric.total;\n case \"unsupported\":\n return metric.value === null && metric.samples === 0;\n // Cost projections can be structurally sound while no USD contribution\n // is reportable. Analysis owns that distinction and may retain the full\n // logical-Slot denominator; Report only accepts the already-closed cell.\n case \"unavailable\":\n return metric.value === null && metric.samples === 0;\n case \"failed\":\n return metric.value === null;\n }\n}\n/**\n * Copies an ordinary presentation row while deterministically retaining the\n * existing Analysis diagnostics from all its metric fields.\n */\nexport function evidenceRow<const Fields extends object>(fields: Fields & EvidenceRowInput<Fields>): Readonly<Fields & EvidenceRow> {\n if (!isPlainRecord(fields))\n throw new TypeError(\"evidenceRow requires a plain object\");\n if (Object.hasOwn(fields, \"issues\") || Object.hasOwn(fields, \"refs\")) {\n throw new TypeError(\"evidenceRow reserves the issues and refs fields\");\n }\n const metrics = Object.values(fields).filter(isMetricValue);\n if (metrics.length === 0) {\n throw new TypeError(\"evidenceRow requires at least one existing MetricValue field\");\n }\n return Object.freeze({\n ...fields,\n issues: dedupeAnalysisIssues(metrics.flatMap((metric) => metric.issues)),\n refs: dedupeEvidenceRefs(metrics.flatMap((metric) => metric.refs)),\n }) as Readonly<Fields & EvidenceRow>;\n}\n/**\n * Sorting changes only display order. Unlike Analysis-issued ClosedRows, the\n * result is an ordinary frozen array and deliberately has no closed-row\n * identity or aggregate metadata.\n */\nexport function sortRowsByMetric<Row extends object>(rows: readonly Row[], field: keyof Row, direction: \"asc\" | \"desc\" = \"desc\"): readonly Row[] {\n const ordered = [...rows].sort((left, right) => {\n const leftValue = numericMetricValue(left[field]);\n const rightValue = numericMetricValue(right[field]);\n const difference = leftValue - rightValue;\n return direction === \"asc\" ? difference : -difference;\n });\n return Object.freeze(ordered);\n}\nfunction numericMetricValue(value: unknown): number {\n return isMetricValue(value) && value.value !== null ? value.value : Number.NEGATIVE_INFINITY;\n}\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\nfunction isMetricCount(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\nfunction isMetricState(value: unknown): value is MetricValue[\"state\"] {\n return value === \"available\" || value === \"partial\" || value === \"empty\" ||\n value === \"unsupported\" || value === \"unavailable\" || value === \"failed\";\n}\nfunction isMetricBasis(value: unknown): value is MetricValue[\"basis\"] {\n return value === \"attempt\" || value === \"eval\" || value === \"run\" ||\n value === \"pair\" || value === \"slot\";\n}\nfunction isAnalysisIssue(value: unknown): value is AnalysisIssue {\n return isPlainRecord(value) && typeof value.code === \"string\" && typeof value.message === \"string\" &&\n Array.isArray(value.refs) && value.refs.every(isEvidenceRef);\n}\nfunction isEvidenceRef(value: unknown): value is EvidenceRef {\n return isPlainRecord(value) && isPlainRecord(value.identity) &&\n value.identity.kind === \"attempt\" && typeof value.identity.locator === \"string\";\n}\nfunction isMeasureFormat(value: unknown): value is MeasureFormat {\n return typeof value === \"string\" ||\n (isPlainRecord(value) && typeof value.kind === \"string\" &&\n (value.options === undefined || isJsonValue(value.options)));\n}\nfunction isJsonValue(value: unknown, ancestors = new Set<object>()): value is JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\")\n return true;\n if (typeof value === \"number\")\n return Number.isFinite(value);\n if (typeof value !== \"object\" || value === null || ancestors.has(value))\n return false;\n ancestors.add(value);\n const valid = Array.isArray(value)\n ? value.every((entry) => isJsonValue(entry, ancestors))\n : isPlainRecord(value) && Object.values(value).every((entry) => isJsonValue(entry, ancestors));\n ancestors.delete(value);\n return valid;\n}\nfunction isMetricBounds(value: unknown): boolean {\n if (!isPlainRecord(value))\n return false;\n if ((value.min !== undefined && (typeof value.min !== \"number\" || !Number.isFinite(value.min))) ||\n (value.max !== undefined && (typeof value.max !== \"number\" || !Number.isFinite(value.max)))) {\n return false;\n }\n return value.min === undefined || value.max === undefined || value.min <= value.max;\n}\nfunction dedupeEvidenceRefs(refs: readonly EvidenceRef[]): readonly EvidenceRef[] {\n const unique = new Map<string, EvidenceRef>();\n for (const ref of refs) {\n const key = ref.identity.kind + \"\\u0000\" + ref.identity.locator;\n if (!unique.has(key)) {\n unique.set(key, Object.freeze({\n identity: Object.freeze({ kind: ref.identity.kind, locator: ref.identity.locator }),\n }));\n }\n }\n return Object.freeze([...unique.entries()]\n .sort(([left], [right]) => compareCanonicalCodeUnits(left, right))\n .map(([, ref]) => ref));\n}\nfunction dedupeAnalysisIssues(issues: readonly AnalysisIssue[]): readonly AnalysisIssue[] {\n const unique = new Map<string, AnalysisIssue>();\n for (const issue of issues) {\n const refs = dedupeEvidenceRefs(issue.refs);\n const key = issue.code + \"\\u0000\" + issue.message + \"\\u0000\" +\n refs.map((ref) => ref.identity.locator).join(\"\\u0001\");\n if (!unique.has(key)) {\n unique.set(key, Object.freeze({ code: issue.code, message: issue.message, refs }));\n }\n }\n return Object.freeze([...unique.entries()]\n .sort(([left], [right]) => compareCanonicalCodeUnits(left, right))\n .map(([, issue]) => issue));\n}\nfunction compareCanonicalCodeUnits(left: string, right: string): number {\n if (left === right)\n return 0;\n return left < right ? -1 : 1;\n}\n"]}
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["metrics.ts"],"names":[],"mappings":";;;AAuEA,kCAiBC;AAED,wCAEC;AAED,wCAIC;AAyBD,sCAuCC;AAKD,kCAeC;AAMD,4CAQC;AApMD,sDAAwT;AACxT;;;;GAIG;AACU,QAAA,QAAQ,GAAG,IAAA,wBAAa,EAAC;IAClC,EAAE,EAAE,2BAA2B;IAC/B,UAAU,EAAE,uBAAY;IACxB,KAAK,EAAE,wBAAa;IACpB,aAAa,EAAE,IAAA,mBAAQ,GAAW;IAClC,UAAU,EAAE,IAAA,iCAAsB,GAAW;IAC7C,WAAW,EAAE,IAAA,gBAAK,GAAE;IACpB,WAAW,EAAE,IAAA,0BAAe,GAAE;IAC9B,OAAO,EAAE,IAAA,kBAAO,GAAE;IAClB,QAAQ,EAAE,IAAA,qCAA0B,GAAE;IACtC,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,QAAQ;CACnB,CAAC,CAAC;AACH,mFAAmF;AACtE,QAAA,UAAU,GAAG,IAAA,wBAAa,EAAC;IACpC,EAAE,EAAE,6BAA6B;IACjC,UAAU,EAAE,uBAAY;IACxB,KAAK,EAAE,2BAAgB;IACvB,aAAa,EAAE,IAAA,mBAAQ,GAAU;IACjC,UAAU,EAAE,IAAA,iCAAsB,GAAU;IAC5C,WAAW,EAAE,IAAA,eAAI,GAAE;IACnB,WAAW,EAAE,IAAA,0BAAe,GAAE;IAC9B,OAAO,EAAE,IAAA,kBAAO,GAAE;IAClB,QAAQ,EAAE,IAAA,qCAA0B,GAAE;IACtC,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,OAAO;CAClB,CAAC,CAAC;AACH,gFAAgF;AACnE,QAAA,MAAM,GAAG,IAAA,wBAAa,EAAC;IAChC,EAAE,EAAE,wBAAwB;IAC5B,UAAU,EAAE,uBAAY;IACxB,KAAK,EAAE,wBAAa;IACpB,aAAa,EAAE,IAAA,mBAAQ,GAAU;IACjC,UAAU,EAAE,IAAA,iCAAsB,GAAU;IAC5C,WAAW,EAAE,IAAA,eAAI,GAAE;IACnB,WAAW,EAAE,IAAA,0BAAe,GAAE;IAC9B,OAAO,EAAE,IAAA,kBAAO,GAAE;IAClB,QAAQ,EAAE,IAAA,qCAA0B,GAAE;IACtC,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,OAAO;CAClB,CAAC,CAAC;AACH,oDAAgE;AAAvD,mGAAA,OAAO,OAAA;AAAE,wGAAA,YAAY,OAAA;AAsB9B,yEAAyE;AACzE,SAAgB,WAAW,CAAQ,MAA0B;IACzD,OAAO,MAAM,CAAC,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACjE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACjE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QACjE,QAAQ,EAAE,MAAM,CAAC,KAAK,KAAK,WAAW;QACtC,QAAQ,EAAE,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK;QACnE,MAAM;KACT,CAAC,CAAC;AACP,CAAC;AACD,yFAAyF;AACzF,SAAgB,cAAc,CAAC,MAAmB;IAC9C,OAAO,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AACrE,CAAC;AACD,4EAA4E;AAC5E,SAAgB,cAAc,CAAC,MAAmB;IAG9C,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtG,CAAC;AAoBD;;;;GAIG;AACH,SAAgB,aAAa,CAAC,KAAc;IACxC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,MAAM,MAAM,GAAG,KAA6B,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/F,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5B,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC;QAC9B,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5B,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK;QAC7B,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;QAC5B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7B,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;QACrC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAC3B,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACjC,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC;QAC9D,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAChE,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxF,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,KAAK,WAAW;YACZ,OAAO,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC;QACnG,KAAK,SAAS;YACV,OAAO,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7D,KAAK,OAAO;YACR,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC;QACpE,KAAK,oBAAoB;YACrB,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAC7E,KAAK,aAAa;YACd,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;QACzD,uEAAuE;QACvE,wEAAwE;QACxE,yEAAyE;QACzE,KAAK,aAAa;YACd,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;QACzD,KAAK,QAAQ;YACT,OAAO,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;IACrC,CAAC;AACL,CAAC;AACD;;;GAGG;AACH,SAAgB,WAAW,CAA8B,MAAyC;IAC9F,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QACtB,MAAM,IAAI,SAAS,CAAC,qCAAqC,CAAC,CAAC;IAC/D,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACjB,GAAG,MAAM;QACT,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxE,IAAI,EAAE,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KACrE,CAAmC,CAAC;AACzC,CAAC;AACD;;;;GAIG;AACH,SAAgB,gBAAgB,CAAqB,IAAoB,EAAE,KAAgB,EAAE,YAA4B,MAAM;IAC3H,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC3C,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;QAC1C,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AACD,SAAS,kBAAkB,CAAC,KAAc;IACtC,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;AACjG,CAAC;AACD,SAAS,aAAa,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACnE,OAAO,KAAK,CAAC;IACjB,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAChE,CAAC;AACD,SAAS,aAAa,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAClF,CAAC;AACD,SAAS,aAAa,CAAC,KAAc;IACjC,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,oBAAoB;QACtG,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,KAAK,QAAQ,CAAC;AACjF,CAAC;AACD,SAAS,aAAa,CAAC,KAAc;IACjC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK;QAC7D,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,CAAC;AAC7C,CAAC;AACD,SAAS,eAAe,CAAC,KAAc;IACnC,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QAC9F,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AACrE,CAAC;AACD,SAAS,aAAa,CAAC,KAAc;IACjC,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC;QACxD,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC;AACxF,CAAC;AACD,SAAS,eAAe,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC5B,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YACnD,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AACD,SAAS,WAAW,CAAC,KAAc,EAAE,YAAY,IAAI,GAAG,EAAU;IAC9D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QACzE,OAAO,IAAI,CAAC;IAChB,IAAI,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;QACnE,OAAO,KAAK,CAAC;IACjB,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvD,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IACnG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,SAAS,cAAc,CAAC,KAAc;IAClC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3F,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC;AACxF,CAAC;AACD,SAAS,kBAAkB,CAAC,IAA4B;IACpD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;gBAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;aACtF,CAAC,CAAC,CAAC;QACR,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACrC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SACjE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AAChC,CAAC;AACD,SAAS,oBAAoB,CAAC,MAAgC;IAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,GAAG,QAAQ,GAAG,KAAK,CAAC,OAAO,GAAG,QAAQ;YACxD,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACrC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;SACjE,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AACpC,CAAC;AACD,SAAS,yBAAyB,CAAC,IAAY,EAAE,KAAa;IAC1D,IAAI,IAAI,KAAK,KAAK;QACd,OAAO,CAAC,CAAC;IACb,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC","sourcesContent":["import { allLogicalSlots, attemptLatencyMs, attemptPassed, attemptTokens, defineMeasure, latestCompletedAttempt, logicalSlots, mean, oneValue, partial, ratio, retainContributingEvidence, type AnalysisIssue, type EvidenceRef, type JsonValue, type MeasureFormat, type MetricValue, } from \"../../analysis/index.ts\";\n/**\n * Analysis owns every metric's denominator, missingness, state, Evidence, and\n * provenance. These descriptors are the small Report catalog expressed with\n * current Analysis definitions.\n */\nexport const passRate = defineMeasure({\n id: \"niceeval.report.pass-rate\",\n population: logicalSlots,\n input: attemptPassed,\n withinAttempt: oneValue<boolean>(),\n withinSlot: latestCompletedAttempt<boolean>(),\n acrossSlots: ratio(),\n denominator: allLogicalSlots(),\n missing: partial(),\n evidence: retainContributingEvidence(),\n unit: \"ratio\",\n format: \"percent\",\n better: \"higher\",\n});\n/** Mean recorded `eval.run` duration across the fixed logical-Slot denominator. */\nexport const durationMs = defineMeasure({\n id: \"niceeval.report.duration-ms\",\n population: logicalSlots,\n input: attemptLatencyMs,\n withinAttempt: oneValue<number>(),\n withinSlot: latestCompletedAttempt<number>(),\n acrossSlots: mean(),\n denominator: allLogicalSlots(),\n missing: partial(),\n evidence: retainContributingEvidence(),\n unit: \"ms\",\n better: \"lower\",\n});\n/** Mean recorded input plus output token count across the fixed denominator. */\nexport const tokens = defineMeasure({\n id: \"niceeval.report.tokens\",\n population: logicalSlots,\n input: attemptTokens,\n withinAttempt: oneValue<number>(),\n withinSlot: latestCompletedAttempt<number>(),\n acrossSlots: mean(),\n denominator: allLogicalSlots(),\n missing: partial(),\n evidence: retainContributingEvidence(),\n unit: \"tokens\",\n better: \"lower\",\n});\nexport { costUSD, totalCostUSD } from \"../../analysis/index.ts\";\n/**\n * Presentation facts retain the original metric and every Analysis-owned\n * diagnostic channel. They are safe for a component to inspect, but not a\n * replacement metric that can be re-aggregated.\n */\nexport interface MetricFacts<Value = number> {\n readonly value: Value | null;\n readonly state: MetricValue<Value>[\"state\"];\n readonly samples: number;\n readonly total: number;\n readonly basis: MetricValue<Value>[\"basis\"];\n readonly issues: readonly AnalysisIssue[];\n readonly refs: readonly EvidenceRef[];\n readonly unit?: string;\n readonly format?: MeasureFormat;\n readonly better?: MetricValue<Value>[\"better\"];\n readonly bounds?: MetricValue<Value>[\"bounds\"];\n readonly complete: boolean;\n readonly coverage: number | null;\n readonly metric: MetricValue<Value>;\n}\n/** Extract display facts without discarding the complete MetricValue. */\nexport function metricFacts<Value>(metric: MetricValue<Value>): MetricFacts<Value> {\n return Object.freeze({\n value: metric.value,\n state: metric.state,\n samples: metric.samples,\n total: metric.total,\n basis: metric.basis,\n issues: metric.issues,\n refs: metric.refs,\n ...(metric.unit === undefined ? {} : { unit: metric.unit }),\n ...(metric.format === undefined ? {} : { format: metric.format }),\n ...(metric.better === undefined ? {} : { better: metric.better }),\n ...(metric.bounds === undefined ? {} : { bounds: metric.bounds }),\n complete: metric.state === \"available\",\n coverage: metric.total === 0 ? null : metric.samples / metric.total,\n metric,\n });\n}\n/** The contributor/denominator fraction; null means the declared denominator is zero. */\nexport function metricCoverage(metric: MetricValue): number | null {\n return metric.total === 0 ? null : metric.samples / metric.total;\n}\n/** A numeric metric is usable only when Analysis closed a finite scalar. */\nexport function hasMetricValue(metric: MetricValue): metric is MetricValue<number> & {\n readonly value: number;\n} {\n return metric.value !== null && typeof metric.value === \"number\" && Number.isFinite(metric.value);\n}\n/**\n * A closed business row may collect existing MetricValue diagnostics, but it\n * cannot manufacture one or alter its total, state, issues, refs, or value.\n */\nexport interface EvidenceRow {\n readonly issues: readonly AnalysisIssue[];\n readonly refs: readonly EvidenceRef[];\n}\ndeclare const evidenceRowMetricDiagnostic: unique symbol;\ntype MetricFieldKeys<Fields extends object> = {\n [Key in keyof Fields]-?: Fields[Key] extends MetricValue ? Key : never;\n}[keyof Fields];\ntype EvidenceRowInput<Fields extends object> = [\n MetricFieldKeys<Fields>\n] extends [\n never\n] ? {\n readonly [evidenceRowMetricDiagnostic]: \"evidenceRow requires at least one MetricValue field\";\n} : unknown;\n/**\n * Structural validation for an already-closed Analysis MetricValue. It is a\n * display-boundary guard, not a constructor: Report never exports\n * `metricValue()`.\n */\nexport function isMetricValue(value: unknown): value is MetricValue {\n if (!isPlainRecord(value))\n return false;\n const metric = value as Partial<MetricValue>;\n if ((metric.value !== null && (typeof metric.value !== \"number\" || !Number.isFinite(metric.value))) ||\n !isMetricState(metric.state) ||\n !isMetricCount(metric.samples) ||\n !isMetricCount(metric.total) ||\n metric.samples > metric.total ||\n !isMetricBasis(metric.basis) ||\n !Array.isArray(metric.issues) ||\n !metric.issues.every(isAnalysisIssue) ||\n !Array.isArray(metric.refs) ||\n !metric.refs.every(isEvidenceRef) ||\n (metric.unit !== undefined && typeof metric.unit !== \"string\") ||\n (metric.format !== undefined && !isMeasureFormat(metric.format)) ||\n (metric.better !== undefined && ![\"higher\", \"lower\", \"neutral\"].includes(metric.better)) ||\n (metric.bounds !== undefined && !isMetricBounds(metric.bounds))) {\n return false;\n }\n switch (metric.state) {\n case \"available\":\n return typeof metric.value === \"number\" && metric.total > 0 && metric.samples === metric.total;\n case \"partial\":\n return metric.total > 0 && metric.samples < metric.total;\n case \"empty\":\n return metric.value === null && metric.samples === metric.total;\n case \"migration-required\":\n return metric.value === null && metric.samples === 0 && metric.total > 0;\n case \"unsupported\":\n return metric.value === null && metric.samples === 0;\n // Cost projections can be structurally sound while no USD contribution\n // is reportable. Analysis owns that distinction and may retain the full\n // logical-Slot denominator; Report only accepts the already-closed cell.\n case \"unavailable\":\n return metric.value === null && metric.samples === 0;\n case \"failed\":\n return metric.value === null;\n }\n}\n/**\n * Copies an ordinary presentation row while deterministically retaining the\n * existing Analysis diagnostics from all its metric fields.\n */\nexport function evidenceRow<const Fields extends object>(fields: Fields & EvidenceRowInput<Fields>): Readonly<Fields & EvidenceRow> {\n if (!isPlainRecord(fields))\n throw new TypeError(\"evidenceRow requires a plain object\");\n if (Object.hasOwn(fields, \"issues\") || Object.hasOwn(fields, \"refs\")) {\n throw new TypeError(\"evidenceRow reserves the issues and refs fields\");\n }\n const metrics = Object.values(fields).filter(isMetricValue);\n if (metrics.length === 0) {\n throw new TypeError(\"evidenceRow requires at least one existing MetricValue field\");\n }\n return Object.freeze({\n ...fields,\n issues: dedupeAnalysisIssues(metrics.flatMap((metric) => metric.issues)),\n refs: dedupeEvidenceRefs(metrics.flatMap((metric) => metric.refs)),\n }) as Readonly<Fields & EvidenceRow>;\n}\n/**\n * Sorting changes only display order. Unlike Analysis-issued ClosedRows, the\n * result is an ordinary frozen array and deliberately has no closed-row\n * identity or aggregate metadata.\n */\nexport function sortRowsByMetric<Row extends object>(rows: readonly Row[], field: keyof Row, direction: \"asc\" | \"desc\" = \"desc\"): readonly Row[] {\n const ordered = [...rows].sort((left, right) => {\n const leftValue = numericMetricValue(left[field]);\n const rightValue = numericMetricValue(right[field]);\n const difference = leftValue - rightValue;\n return direction === \"asc\" ? difference : -difference;\n });\n return Object.freeze(ordered);\n}\nfunction numericMetricValue(value: unknown): number {\n return isMetricValue(value) && value.value !== null ? value.value : Number.NEGATIVE_INFINITY;\n}\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\nfunction isMetricCount(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\nfunction isMetricState(value: unknown): value is MetricValue[\"state\"] {\n return value === \"available\" || value === \"partial\" || value === \"empty\" || value === \"migration-required\" ||\n value === \"unsupported\" || value === \"unavailable\" || value === \"failed\";\n}\nfunction isMetricBasis(value: unknown): value is MetricValue[\"basis\"] {\n return value === \"attempt\" || value === \"eval\" || value === \"run\" ||\n value === \"pair\" || value === \"slot\";\n}\nfunction isAnalysisIssue(value: unknown): value is AnalysisIssue {\n return isPlainRecord(value) && typeof value.code === \"string\" && typeof value.message === \"string\" &&\n Array.isArray(value.refs) && value.refs.every(isEvidenceRef);\n}\nfunction isEvidenceRef(value: unknown): value is EvidenceRef {\n return isPlainRecord(value) && isPlainRecord(value.identity) &&\n value.identity.kind === \"attempt\" && typeof value.identity.locator === \"string\";\n}\nfunction isMeasureFormat(value: unknown): value is MeasureFormat {\n return typeof value === \"string\" ||\n (isPlainRecord(value) && typeof value.kind === \"string\" &&\n (value.options === undefined || isJsonValue(value.options)));\n}\nfunction isJsonValue(value: unknown, ancestors = new Set<object>()): value is JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\")\n return true;\n if (typeof value === \"number\")\n return Number.isFinite(value);\n if (typeof value !== \"object\" || value === null || ancestors.has(value))\n return false;\n ancestors.add(value);\n const valid = Array.isArray(value)\n ? value.every((entry) => isJsonValue(entry, ancestors))\n : isPlainRecord(value) && Object.values(value).every((entry) => isJsonValue(entry, ancestors));\n ancestors.delete(value);\n return valid;\n}\nfunction isMetricBounds(value: unknown): boolean {\n if (!isPlainRecord(value))\n return false;\n if ((value.min !== undefined && (typeof value.min !== \"number\" || !Number.isFinite(value.min))) ||\n (value.max !== undefined && (typeof value.max !== \"number\" || !Number.isFinite(value.max)))) {\n return false;\n }\n return value.min === undefined || value.max === undefined || value.min <= value.max;\n}\nfunction dedupeEvidenceRefs(refs: readonly EvidenceRef[]): readonly EvidenceRef[] {\n const unique = new Map<string, EvidenceRef>();\n for (const ref of refs) {\n const key = ref.identity.kind + \"\\u0000\" + ref.identity.locator;\n if (!unique.has(key)) {\n unique.set(key, Object.freeze({\n identity: Object.freeze({ kind: ref.identity.kind, locator: ref.identity.locator }),\n }));\n }\n }\n return Object.freeze([...unique.entries()]\n .sort(([left], [right]) => compareCanonicalCodeUnits(left, right))\n .map(([, ref]) => ref));\n}\nfunction dedupeAnalysisIssues(issues: readonly AnalysisIssue[]): readonly AnalysisIssue[] {\n const unique = new Map<string, AnalysisIssue>();\n for (const issue of issues) {\n const refs = dedupeEvidenceRefs(issue.refs);\n const key = issue.code + \"\\u0000\" + issue.message + \"\\u0000\" +\n refs.map((ref) => ref.identity.locator).join(\"\\u0001\");\n if (!unique.has(key)) {\n unique.set(key, Object.freeze({ code: issue.code, message: issue.message, refs }));\n }\n }\n return Object.freeze([...unique.entries()]\n .sort(([left], [right]) => compareCanonicalCodeUnits(left, right))\n .map(([, issue]) => issue));\n}\nfunction compareCanonicalCodeUnits(left: string, right: string): number {\n if (left === right)\n return 0;\n return left < right ? -1 : 1;\n}\n"]}
@@ -26,6 +26,8 @@ function formatCostProjectionAmountText(cell, locale) {
26
26
  return `$${cell.projection.combined.amount}`;
27
27
  case "unavailable":
28
28
  return (0, locale_ts_1.localeText)(locale, "costProjection.unavailable");
29
+ case "migration-required":
30
+ return (0, locale_ts_1.localeText)(locale, "costProjection.migrationRequired");
29
31
  default: {
30
32
  const exhaustive = cell.projection;
31
33
  return exhaustive;
@@ -39,22 +41,19 @@ function formatCostProjectionAmountText(cell, locale) {
39
41
  */
40
42
  function formatCostProjectionCellText(cell, locale) {
41
43
  const projection = cell.projection;
42
- if (projection.state === "unavailable" || projection.combined === null) {
44
+ if (projection.state === "migration-required") {
43
45
  return Object.freeze({
44
- text: (0, locale_ts_1.localeText)(locale, "costProjection.unavailable"),
46
+ text: (0, locale_ts_1.localeText)(locale, "costProjection.migrationRequired"),
45
47
  detail: formatCostProjectionCellDetail(cell, locale),
46
48
  });
47
49
  }
48
- const parts = [
49
- `${knownValueLabel(projection, locale)} ${moneyText(projection.combined)}`,
50
- (0, locale_ts_1.localeText)(locale, `costProjection.basis.${projection.basis}`),
51
- ];
52
- if (projection.state === "partial") {
53
- parts.push((0, locale_ts_1.localeText)(locale, "costProjection.state.partial"));
50
+ if (projection.state === "unavailable" || projection.combined === null) {
51
+ return Object.freeze({
52
+ text: (0, locale_ts_1.localeText)(locale, "costProjection.unavailable"),
53
+ });
54
54
  }
55
55
  return Object.freeze({
56
- text: parts.join(" · "),
57
- detail: formatCostProjectionCellDetail(cell, locale),
56
+ text: moneyText(projection.combined),
58
57
  });
59
58
  }
60
59
  /**
@@ -108,7 +107,13 @@ function isCostMetricValue(value) {
108
107
  const projection = value.projection;
109
108
  // The Host's machine boundary additionally matches this identity against
110
109
  // the captured cost measure entry before a projection leaves the Report.
111
- return (0, cost_ts_1.isCostProjectionValue)(projection) && projection.state === value.state;
110
+ if (!(0, cost_ts_1.isCostProjectionValue)(projection) || projection.state !== value.state)
111
+ return false;
112
+ if (projection.state === "migration-required") {
113
+ const slots = new Set(projection.ledger.map((entry) => `${entry.slot.runId}\u0000${entry.slot.slotId}`));
114
+ return value.samples === 0 && value.total > 0 && slots.size === value.total;
115
+ }
116
+ return true;
112
117
  }
113
118
  function moneyText(value) {
114
119
  return `${value.currency} ${value.amount}`;