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
@@ -47,8 +47,7 @@ function panelCapabilityForFeedback(io) {
47
47
  const HUMAN_FAILURE_CAP = 10;
48
48
  /** live 面板 FAILURES 分节滚动保留的条数(见 cli.md「运行中的 live 面板」)。 */
49
49
  const LIVE_FAILURES_VISIBLE = 5;
50
- /** 结束反馈 FAILURES 面板按失败形态聚合后,展开的组数上限;超出收进
51
- * `+K more kinds — niceeval view` 尾行(见 cli.md「人看的结束反馈」)。 */
50
+ /** 结束反馈中断言失败形态的展开上限;execution error 必须逐条保留自己的 message,不受此上限折叠。 */
52
51
  const FAILURE_GROUPS_CAP = 10;
53
52
  /** 非 TTY / `--json` 没有可依赖的终端宽度,失败单行投影用固定预算(见
54
53
  * docs/feature/assertions/library/display.md「一条摘要怎样排版」)。 */
@@ -58,6 +57,144 @@ const NON_TTY_HEARTBEAT_IDLE_MS = 30000;
58
57
  /** dashboard 高度预留:避免最后一行触发终端自动滚动(与 live.ts 旧实现的 `rows - 2` 同一动机,
59
58
  * 这里只需要给「下一帧」留出一行余地,不需要额外的表头/尾行预留)。 */
60
59
  const DASHBOARD_ROW_RESERVE = 1;
60
+ const HUMAN_RESULTS_EXPERIMENT_CAP = 5;
61
+ const HUMAN_ERROR_TEXT_MAX_BYTES = 240;
62
+ function freshHumanResult(result) {
63
+ const score = result.scoreResult;
64
+ const scoreState = score === undefined
65
+ ? undefined
66
+ : score.status === "scored"
67
+ ? "complete"
68
+ : score.earnedScore > 0
69
+ ? "partial"
70
+ : "unavailable";
71
+ return {
72
+ experimentId: result.experimentId ?? "default",
73
+ evalId: result.id,
74
+ evaluationKind: result.evaluationKind,
75
+ verdict: result.verdict,
76
+ ...(scoreState === undefined || score === undefined ? {} : { scoreState, earned: score.earnedScore }),
77
+ };
78
+ }
79
+ function reusedHumanResult(result) {
80
+ const attachment = result.score.state === "applicable" && result.score.attachment.state === "available"
81
+ ? result.score.attachment.value
82
+ : undefined;
83
+ return {
84
+ experimentId: result.target.experimentId,
85
+ evalId: result.target.evalId,
86
+ evaluationKind: result.source.evaluationKind,
87
+ verdict: result.verdict,
88
+ ...(attachment === undefined
89
+ ? {}
90
+ : {
91
+ scoreState: attachment.state,
92
+ ...(attachment.earned === undefined ? {} : { earned: attachment.earned }),
93
+ }),
94
+ };
95
+ }
96
+ function humanResultItems(summary) {
97
+ return [
98
+ ...summary.results.map(freshHumanResult),
99
+ ...summary.reusedAttempts.map(reusedHumanResult),
100
+ ];
101
+ }
102
+ function buildResultsPanelRows(items) {
103
+ const byExperiment = new Map();
104
+ for (const item of items) {
105
+ const group = byExperiment.get(item.experimentId);
106
+ if (group)
107
+ group.push(item);
108
+ else
109
+ byExperiment.set(item.experimentId, [item]);
110
+ }
111
+ const groups = [...byExperiment.entries()];
112
+ const rows = [];
113
+ for (const [experimentId, members] of groups.slice(0, HUMAN_RESULTS_EXPERIMENT_CAP)) {
114
+ rows.push({ kind: "line", text: experimentId });
115
+ const byEval = new Map();
116
+ for (const member of members) {
117
+ const evalGroup = byEval.get(member.evalId);
118
+ if (evalGroup)
119
+ evalGroup.push(member);
120
+ else
121
+ byEval.set(member.evalId, [member]);
122
+ }
123
+ for (const [evalId, attempts] of byEval) {
124
+ if (attempts.some((attempt) => attempt.evaluationKind === "score")) {
125
+ const complete = attempts.filter((attempt) => attempt.scoreState === "complete" && attempt.earned !== undefined);
126
+ const partial = attempts.filter((attempt) => attempt.scoreState === "partial" && attempt.earned !== undefined);
127
+ const reading = complete.length > 0
128
+ ? `${complete.reduce((sum, attempt) => sum + attempt.earned, 0) / complete.length} score · ${complete.length}/${attempts.length} complete`
129
+ : partial.length > 0
130
+ ? `≥${partial.map((attempt) => attempt.earned).join(", ≥")} score · partial`
131
+ : "score unavailable";
132
+ rows.push({ kind: "line", text: ` ${evalId} ${reading}` });
133
+ }
134
+ else {
135
+ const passed = attempts.filter((attempt) => attempt.verdict === "passed").length;
136
+ rows.push({ kind: "line", text: ` ${evalId} ${passed}/${attempts.length} passed` });
137
+ }
138
+ }
139
+ }
140
+ if (groups.length > HUMAN_RESULTS_EXPERIMENT_CAP) {
141
+ rows.push({
142
+ kind: "line",
143
+ text: (0, index_ts_1.t)("feedback.human.resultsMore", { count: groups.length - HUMAN_RESULTS_EXPERIMENT_CAP }),
144
+ });
145
+ }
146
+ return rows;
147
+ }
148
+ function buildPreAttemptErrorRows(results, runIdsByExperiment, panel) {
149
+ const errored = results.filter((result) => result.verdict === "errored" && result.locator === undefined && result.error !== undefined);
150
+ if (errored.length === 0)
151
+ return undefined;
152
+ const groups = new Map();
153
+ for (const result of errored) {
154
+ const error = result.error;
155
+ const runId = result.experimentId === undefined
156
+ ? undefined
157
+ : runIdsByExperiment.get(result.experimentId);
158
+ // Run timing node IDs are local identities. The same `n1` in another Run
159
+ // names a different physical failure and must not absorb its message.
160
+ const failureId = error.origin.scope === "run"
161
+ ? `${runId ?? result.experimentId ?? "default"}\u0000${error.origin.timingNodeId}`
162
+ : `${result.experimentId ?? "default"}\u0000${error.code}:${error.message}`;
163
+ const members = groups.get(failureId);
164
+ if (members)
165
+ members.push(result);
166
+ else
167
+ groups.set(failureId, [result]);
168
+ }
169
+ const rows = [];
170
+ const contentWidth = (0, panel_ts_1.panelContentWidth)(panel.width, panel.mode);
171
+ for (const members of groups.values()) {
172
+ const representative = members[0];
173
+ const error = representative.error;
174
+ rows.push({
175
+ kind: "line",
176
+ text: `${FAILURE_SYMBOL} ${representative.experimentId ?? "default"} · ${preAttemptErrorTitle(error.origin)}`,
177
+ });
178
+ rows.push({
179
+ kind: "line",
180
+ text: ` affected: ${members.map((member) => `${member.experimentId ?? "default"}/${member.id}`).join(", ")}`,
181
+ });
182
+ rows.push(...labelledWrappedRows("error", boundedHumanError(error.message), contentWidth));
183
+ }
184
+ return { rows, slots: errored.length };
185
+ }
186
+ function preAttemptErrorTitle(origin) {
187
+ if (origin.scope === "run")
188
+ return "Sandbox image build failed";
189
+ const phase = origin.phase;
190
+ switch (phase) {
191
+ case "judge.precheck": return "Judge precheck failed";
192
+ case "experiment.setup": return "Experiment setup failed";
193
+ case "sandbox.queue": return "Sandbox queue failed";
194
+ case "sandbox.create": return "Sandbox provisioning failed";
195
+ default: return `${phaseLabel(phase)} failed`;
196
+ }
197
+ }
61
198
  /** 按 `io.stderr.isTTY` 派发:构造时选一次,运行期不再切换。 */
62
199
  function createHumanRenderer(options) {
63
200
  const { io, command } = options;
@@ -181,7 +318,7 @@ function renderDurableLines(event, state, panel) {
181
318
  case "summary":
182
319
  return buildSummaryLines(event, state, panel);
183
320
  case "receipt":
184
- return buildReceiptLines(event, panel);
321
+ return buildReceiptLines(event, state, panel);
185
322
  default: {
186
323
  // 穷尽性检查:新增 DurableFeedbackEvent 变体时这里编译期报错提醒补上对应分支。
187
324
  const exhaustive = event;
@@ -257,20 +394,9 @@ function buildFailureFactLine(failure, maxWidth) {
257
394
  const budget = Math.max(0, maxWidth - (0, text_layout_ts_1.stringWidth)(prefix));
258
395
  const info = failure.fact
259
396
  ? (0, display_ts_1.fitCompactAssertionSummary)(failure.fact, budget)
260
- : buildErroredInfo(failure.phase, failure.code, failure.reason);
397
+ : `error: ${boundedHumanError(failure.reason)}`;
261
398
  return prefix + clipDisplayWidth(info, budget);
262
399
  }
263
- /**
264
- * errored 且没有主 Fact 摘要(真正的结构化执行错误)时的信息段:
265
- * `errored · <phase> · <code>`,余量够再接 `: <message>`。`phase`/`code` 用未翻译的原始字面量
266
- * (`LifecyclePhase` 枚举值 / `AttemptError.code`),不走 `phaseLabel()` 的人读短语 —— 这一段
267
- * 是给读者对照 `--json` `error` 事件、`result.json` 与 `show` 里同一个字面量用的,不是散文。
268
- */
269
- function buildErroredInfo(phase, code, reason) {
270
- const parts = ["errored", ...(phase ? [phase] : []), ...(code ? [code] : [])];
271
- const base = parts.join(" · ");
272
- return reason ? `${base}: ${reason}` : base;
273
- }
274
400
  /** 按显示列硬夹紧,超宽尾部截断补 `…`。`fitCompactAssertionSummary` 的截断口径是字符数,不是
275
401
  * 显示列(见该函数注释「显示宽度的精确裁剪仍归渲染面」);这里补上那道显示宽度的硬夹紧,
276
402
  * 堵住 CJK 内容"按字符数收口仍超显示列"的缝,保证渲染行恒不超过预算。 */
@@ -299,6 +425,11 @@ function buildDiagnosticLines(event, state) {
299
425
  // 跨用例撞上同一类状况时,读者需要的是「这类事发生了 N 次」,不是 N 段几乎相同的文字;
300
426
  // 逐 code 的次数与首条 message 由结束反馈的 WARNINGS / RECOVERY 面板汇总。
301
427
  const code = event.code ?? event.key;
428
+ // Judge precheck already has a live lifecycle row and a terminal pre-Attempt
429
+ // error block. Repeating its machine code in Human output adds no fact and
430
+ // exposes machine vocabulary in the default profile.
431
+ if (code === "judge-precheck-failed")
432
+ return [];
302
433
  const firstForCode = state.diagnostics.find((d) => (d.code ?? d.key) === code);
303
434
  const count = state.diagnostics.find((d) => d.key === event.key)?.count ?? 1;
304
435
  if (count > 1 || firstForCode?.key !== event.key)
@@ -327,36 +458,76 @@ function buildDiagnosticLines(event, state) {
327
458
  function buildSummaryLines(event, state, panel) {
328
459
  const { summary, completion } = event;
329
460
  const fullReuse = state.total > 0 && state.total === state.reused;
461
+ const resultItems = humanResultItems(summary);
462
+ const hasScore = resultItems.some((item) => item.evaluationKind === "score");
463
+ const hasPass = resultItems.some((item) => item.evaluationKind === "pass");
464
+ const scored = resultItems.filter((item) => item.evaluationKind === "score" && item.scoreState === "complete").length;
330
465
  // required reporter(显式 --junit)写失败必须让这行判红——它不是
331
466
  // CompletionStatus 的第四个值(那个枚举只有 complete/incomplete/interrupted 三态),但必须
332
467
  // 避免人看到一句会被误读成"全绿"的 PASSED、进程却以非零退出。
333
468
  const verdictWord = completion.status === "interrupted"
334
469
  ? (0, index_ts_1.t)("feedback.human.resultInterrupted")
335
- : completion.status === "incomplete"
336
- ? (0, index_ts_1.t)("feedback.human.resultIncomplete")
337
- : summary.failed > 0 || summary.errored > 0 || completion.reporterErrors.some((e) => e.required)
338
- ? (0, index_ts_1.t)("feedback.human.resultFailed")
339
- : (0, index_ts_1.t)("feedback.human.resultPassed");
470
+ : summary.errored > 0
471
+ ? (0, index_ts_1.t)("feedback.human.resultErrored")
472
+ : completion.status === "incomplete"
473
+ ? (0, index_ts_1.t)("feedback.human.resultIncomplete")
474
+ : completion.reporterErrors.some((e) => e.required)
475
+ ? (0, index_ts_1.t)("feedback.human.resultFailed")
476
+ : hasScore && !hasPass
477
+ ? (0, index_ts_1.t)("feedback.human.resultScored")
478
+ : hasScore && hasPass
479
+ ? summary.failed > 0
480
+ ? (0, index_ts_1.t)("feedback.human.resultFailed")
481
+ : (0, index_ts_1.t)("feedback.human.resultCompleted")
482
+ : summary.failed > 0
483
+ ? (0, index_ts_1.t)("feedback.human.resultFailed")
484
+ : (0, index_ts_1.t)("feedback.human.resultPassed");
340
485
  const summaryRows = [
341
486
  {
342
487
  kind: "line",
343
- text: (0, index_ts_1.t)(completion.unstarted > 0
344
- ? "feedback.human.summaryIncompleteLine"
345
- : fullReuse
346
- ? "feedback.human.summaryAllReusedLine"
347
- : "feedback.human.summaryLine", {
348
- passed: summary.passed,
349
- failed: summary.failed,
350
- errored: summary.errored,
351
- unstarted: completion.unstarted,
352
- reused: state.reused,
353
- }),
488
+ text: hasScore && !hasPass
489
+ ? (0, index_ts_1.t)("feedback.human.scoreSummaryLine", {
490
+ scored,
491
+ skipped: summary.skipped,
492
+ errored: summary.errored,
493
+ reused: state.reused,
494
+ })
495
+ : (0, index_ts_1.t)(completion.unstarted > 0
496
+ ? "feedback.human.summaryIncompleteLine"
497
+ : fullReuse
498
+ ? "feedback.human.summaryAllReusedLine"
499
+ : "feedback.human.summaryLine", {
500
+ passed: summary.passed,
501
+ failed: summary.failed,
502
+ errored: summary.errored,
503
+ unstarted: completion.unstarted,
504
+ reused: state.reused,
505
+ }),
354
506
  },
355
507
  { kind: "line", text: formatSummaryCostLine(state) },
356
508
  ];
357
509
  const blocks = [
358
510
  (0, panel_ts_1.renderPanel)({ title: verdictWord, meta: formatElapsed(summary.durationMs), rows: summaryRows, width: panel.width, mode: panel.mode }),
359
511
  ];
512
+ if (resultItems.length > 0) {
513
+ blocks.push((0, panel_ts_1.renderPanel)({
514
+ title: (0, index_ts_1.t)("feedback.human.resultsHeader"),
515
+ meta: `${new Set(resultItems.map((item) => item.experimentId)).size} configs`,
516
+ rows: buildResultsPanelRows(resultItems),
517
+ width: panel.width,
518
+ mode: panel.mode,
519
+ }));
520
+ }
521
+ const preAttemptErrors = buildPreAttemptErrorRows(summary.results, state.runIdsByExperiment, panel);
522
+ if (preAttemptErrors !== undefined) {
523
+ blocks.push((0, panel_ts_1.renderPanel)({
524
+ title: (0, index_ts_1.t)("feedback.human.errorsHeader"),
525
+ meta: `${preAttemptErrors.slots} attempt${preAttemptErrors.slots === 1 ? "" : "s"} not started`,
526
+ rows: preAttemptErrors.rows,
527
+ width: panel.width,
528
+ mode: panel.mode,
529
+ }));
530
+ }
360
531
  // 全通过时(state.failures 为空)不留空 FAILURES 面板。fresh 失败来自 durable event,carry
361
532
  // 失败由 plan 静态注入;reducer 把两者按 locator 收进同一清单,这里不从 InvocationSummary 再造 ——
362
533
  // 整套结果集(含携入)都要出现在这里,不只是本次派发的那部分(见 cli.md「计数口径…」)。
@@ -390,7 +561,10 @@ function buildSummaryLines(event, state, panel) {
390
561
  // `WARNINGS`(有诊断才出现,位于 FAILURES 与 NEXT 之间,见 cli.md「人看的结束反馈」):
391
562
  // 按 code 汇总本次去重后的诊断,运行中同 code 只完整打印过第一条,这里是「这类事一共
392
563
  // 发生了几次」的权威答案。
393
- const warningsRows = buildWarningsPanelRows(state.diagnostics);
564
+ const preAttemptCodes = new Set(summary.results.flatMap((result) => result.verdict === "errored" && result.locator === undefined && result.error !== undefined
565
+ ? [result.error.code]
566
+ : []));
567
+ const warningsRows = buildWarningsPanelRows(state.diagnostics.filter((diagnostic) => diagnostic.severity !== "error" || !preAttemptCodes.has(diagnostic.code ?? diagnostic.key)));
394
568
  if (warningsRows) {
395
569
  blocks.push((0, panel_ts_1.renderPanel)({ title: (0, index_ts_1.t)("feedback.human.warningsHeader"), rows: warningsRows, width: panel.width, mode: panel.mode }));
396
570
  }
@@ -410,7 +584,14 @@ function buildSummaryLines(event, state, panel) {
410
584
  function buildFailuresPanelRows(failures, panel) {
411
585
  const groups = groupFailuresByShape(failures);
412
586
  const contentWidth = (0, panel_ts_1.panelContentWidth)(panel.width, panel.mode);
413
- const shown = groups.slice(0, FAILURE_GROUPS_CAP);
587
+ let shownAssertionKinds = 0;
588
+ const shown = groups.filter((group) => {
589
+ if (group.representative.fact === undefined)
590
+ return true;
591
+ shownAssertionKinds += 1;
592
+ return shownAssertionKinds <= FAILURE_GROUPS_CAP;
593
+ });
594
+ const omitted = groups.length - shown.length;
414
595
  const multi = shown.filter((g) => g.size > 1);
415
596
  const countWidth = Math.max(0, ...multi.map((g) => (0, text_layout_ts_1.stringWidth)(`${FAILURE_SYMBOL} ×${g.size}`)));
416
597
  const rows = [];
@@ -422,10 +603,10 @@ function buildFailuresPanelRows(failures, panel) {
422
603
  rows.push(buildMultiFailureGroupRow(group, countWidth));
423
604
  }
424
605
  }
425
- if (groups.length > FAILURE_GROUPS_CAP) {
606
+ if (omitted > 0) {
426
607
  rows.push({
427
608
  kind: "line",
428
- text: (0, index_ts_1.t)("feedback.human.moreFailureKinds", { count: groups.length - FAILURE_GROUPS_CAP }),
609
+ text: (0, index_ts_1.t)("feedback.human.moreFailureKinds", { count: omitted }),
429
610
  });
430
611
  }
431
612
  return { rows, meta: (0, index_ts_1.t)("feedback.human.failuresTotalKinds", { total: failures.length, kinds: groups.length }) };
@@ -446,18 +627,14 @@ function groupFailuresByShape(failures) {
446
627
  .map(([key, g]) => ({ key, ...g }))
447
628
  .sort((a, b) => b.size - a.size);
448
629
  }
449
- /** key 与形态摘要文本共用同一个"剥掉 received 的断言摘要"投影(有主断言摘要时,`failed`
450
- * Fact unavailable 造成的 `errored` 都走这条);没有主 Fact 摘要的 `errored`(真正的
451
- * 结构化执行错误)按 `phase · code` 分组,摘要文本复用 `buildErroredInfo`(不带 message)。 */
630
+ /** 断言按稳定形态聚合;execution error 的 key 包含 locator,确保不同 Attempt 不会因共享
631
+ * phase/code 而吞掉各自的 Provider message。 */
452
632
  function failureShapeOf(failure) {
453
633
  if (failure.fact) {
454
634
  const shapeText = (0, display_ts_1.compactAssertionSummary)({ ...failure.fact, received: undefined, additionalFailures: 0 });
455
635
  return { key: `fact\u0000${failure.fact.title}\u0000${failure.fact.matcher ?? ""}`, shapeText };
456
636
  }
457
- return {
458
- key: `errored\u0000${failure.phase ?? "?"}\u0000${failure.code ?? "?"}`,
459
- shapeText: buildErroredInfo(failure.phase, failure.code, ""),
460
- };
637
+ return { key: `errored\u0000${failure.locator}`, shapeText: "error" };
461
638
  }
462
639
  function buildMultiFailureGroupRow(group, countWidth) {
463
640
  const countToken = (0, text_layout_ts_1.padStartDisplay)(`${FAILURE_SYMBOL} ×${group.size}`, countWidth);
@@ -472,13 +649,15 @@ function buildSingleFailureGroupRows(failure, contentWidth) {
472
649
  const identityLine = `${FAILURE_SYMBOL} ${failure.locator} ${failure.identity.evalId} [${failure.who}]`;
473
650
  const indent = (0, text_layout_ts_1.stringWidth)(`${FAILURE_SYMBOL} `);
474
651
  const budget = Math.max(0, contentWidth - indent);
475
- const info = failure.fact
476
- ? (0, display_ts_1.fitCompactAssertionSummary)(failure.fact, budget)
477
- : buildErroredInfo(failure.phase, failure.code, failure.reason);
478
- return [
479
- { kind: "line", text: identityLine },
480
- { kind: "line", text: `${" ".repeat(indent)}${clipDisplayWidth(info, budget)}` },
481
- ];
652
+ const rows = [{ kind: "line", text: identityLine }];
653
+ if (failure.fact) {
654
+ rows.push({ kind: "line", text: `${" ".repeat(indent)}${clipDisplayWidth((0, display_ts_1.fitCompactAssertionSummary)(failure.fact, budget), budget)}` });
655
+ }
656
+ else {
657
+ rows.push(...labelledWrappedRows("error", boundedHumanError(failure.reason), contentWidth));
658
+ }
659
+ rows.push(...labelledWrappedRows("details", `niceeval show ${failure.locator}`, contentWidth));
660
+ return rows;
482
661
  }
483
662
  /** `WARNINGS` 面板:`state.diagnostics` 已经按去重 key 折叠,这里再按对外稳定词法 `code` 二次
484
663
  * 聚合。info 由自己的完成面板消费;没有 warning/error 时返回 undefined。 */
@@ -508,38 +687,98 @@ function buildWarningsPanelRows(diagnostics) {
508
687
  }));
509
688
  }
510
689
  function buildRecoveryPanelRows(diagnostics) {
511
- let slots = 0;
512
690
  let locks = 0;
513
691
  for (const d of diagnostics) {
514
692
  if (d.severity !== "info" || d.code !== types_ts_1.COORDINATION_RECOVERED_CODE)
515
693
  continue;
516
- if (d.data?.resource === "concurrency-slot")
517
- slots += d.count;
518
694
  if (d.data?.resource === "case-lock")
519
695
  locks += d.count;
520
696
  }
521
- if (slots === 0 && locks === 0)
697
+ if (locks === 0)
522
698
  return undefined;
523
- const summary = (0, index_ts_1.t)("feedback.human.coordinationRecoveredSummary", {
524
- slots: pluralUnit(slots, "feedback.human.unit.concurrencySlot", "feedback.human.unit.concurrencySlots"),
525
- locks: pluralUnit(locks, "feedback.human.unit.caseLock", "feedback.human.unit.caseLocks"),
526
- });
699
+ const summary = pluralUnit(locks, "feedback.human.unit.caseLock", "feedback.human.unit.caseLocks");
527
700
  return [{ kind: "line", text: `i ${types_ts_1.COORDINATION_RECOVERED_CODE} ${summary}` }];
528
701
  }
529
702
  function warningCodeLabel(code, count) {
530
703
  return count > 1 ? `${code} ×${count}` : code;
531
704
  }
532
705
  /** `NEXT` 面板只由 receipt 的真实 Run ID 给出 Record 读取命令。 */
533
- function buildReceiptLines(event, panel) {
706
+ function buildReceiptLines(event, state, panel) {
534
707
  const rows = [];
708
+ const published = new Set(event.receipt.runIds);
709
+ const emitted = new Set();
710
+ for (const [experimentId, runId] of state.runIdsByExperiment) {
711
+ if (!published.has(runId))
712
+ continue;
713
+ rows.push({ kind: "line", text: experimentId });
714
+ rows.push(...labelledWrappedRows("details", `niceeval show --run ${runId}`, (0, panel_ts_1.panelContentWidth)(panel.width, panel.mode)));
715
+ emitted.add(runId);
716
+ }
535
717
  for (const runId of event.receipt.runIds) {
536
- rows.push({ kind: "line", text: `niceeval show --run ${runId}` });
718
+ if (!emitted.has(runId))
719
+ rows.push({ kind: "line", text: `details: niceeval show --run ${runId}` });
537
720
  }
538
721
  if (rows.length === 0) {
539
722
  rows.push({ kind: "line", text: "No published Record Runs are available for this invocation." });
540
723
  }
541
724
  return (0, panel_ts_1.renderPanel)({ title: (0, index_ts_1.t)("feedback.human.nextHeader"), rows, width: panel.width, mode: panel.mode });
542
725
  }
726
+ function boundedHumanError(message) {
727
+ const safe = (0, display_ts_1.stripControl)(message).replace(/\s+/gu, " ").trim();
728
+ const signalIndexes = [
729
+ safe.search(/\b[1-5]\d{2}\s+[A-Z][A-Za-z -]{2,40}(?:\s+[—·:-]\s+[A-Z][A-Z0-9_-]+)?/u),
730
+ safe.search(/\b[A-Z][A-Z0-9]+(?:_[A-Z0-9]+){1,}\b/u),
731
+ ].filter((index) => index >= 0);
732
+ // Wrappers often prepend a long command or transport path before the
733
+ // Provider's safe status/code. Focus the Human budget at that first stable
734
+ // signal; the full structured error remains available through details.
735
+ const focused = signalIndexes.length === 0 ? safe : safe.slice(Math.min(...signalIndexes));
736
+ if (utf8Bytes(focused) <= HUMAN_ERROR_TEXT_MAX_BYTES)
737
+ return focused;
738
+ const separator = " … ";
739
+ const available = HUMAN_ERROR_TEXT_MAX_BYTES - utf8Bytes(separator);
740
+ const head = Math.ceil(available / 2);
741
+ const tail = available - head;
742
+ return `${utf8Prefix(focused, head)}${separator}${utf8Suffix(focused, tail)}`;
743
+ }
744
+ function utf8Bytes(value) {
745
+ return new TextEncoder().encode(value).byteLength;
746
+ }
747
+ function utf8Prefix(value, maximumBytes) {
748
+ let bytes = 0;
749
+ let result = "";
750
+ for (const character of value) {
751
+ const nextBytes = utf8Bytes(character);
752
+ if (bytes + nextBytes > maximumBytes)
753
+ break;
754
+ result += character;
755
+ bytes += nextBytes;
756
+ }
757
+ return result;
758
+ }
759
+ function utf8Suffix(value, maximumBytes) {
760
+ let bytes = 0;
761
+ const result = [];
762
+ const characters = Array.from(value);
763
+ for (let index = characters.length - 1; index >= 0; index -= 1) {
764
+ const character = characters[index];
765
+ const nextBytes = utf8Bytes(character);
766
+ if (bytes + nextBytes > maximumBytes)
767
+ break;
768
+ result.push(character);
769
+ bytes += nextBytes;
770
+ }
771
+ return result.reverse().join("");
772
+ }
773
+ function labelledWrappedRows(label, text, contentWidth) {
774
+ const prefix = ` ${label}: `;
775
+ const continuation = " ".repeat((0, text_layout_ts_1.stringWidth)(prefix));
776
+ const lines = (0, text_layout_ts_1.wrapDisplay)(text, Math.max(4, contentWidth - (0, text_layout_ts_1.stringWidth)(prefix)));
777
+ return lines.map((line, index) => ({
778
+ kind: "line",
779
+ text: `${index === 0 ? prefix : continuation}${line}`,
780
+ }));
781
+ }
543
782
  /** estimated cost 展示:金额前加 `~`,明确是价目表估算(observed 只留在 result.usage.costUSD)。 */
544
783
  function formatEstimatedCost(value) {
545
784
  const cost = (0, format_ts_1.formatCost)(value);