niceeval 0.13.3-canary.37 → 0.13.3

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 (383) hide show
  1. package/dist/agents/bub.cjs +4 -4
  2. package/dist/agents/bub.cjs.map +1 -1
  3. package/dist/agents/bub.d.cts +2 -2
  4. package/dist/agents/bub.d.mts +2 -2
  5. package/dist/agents/bub.d.ts +2 -2
  6. package/dist/agents/codex-app-server.cjs +2 -3
  7. package/dist/agents/codex-app-server.cjs.map +1 -1
  8. package/dist/agents/codex.cjs +4 -4
  9. package/dist/agents/codex.cjs.map +1 -1
  10. package/dist/agents/codex.d.cts +3 -3
  11. package/dist/agents/codex.d.mts +3 -3
  12. package/dist/agents/codex.d.ts +3 -3
  13. package/dist/agents/sdk-streams.cjs +11 -4
  14. package/dist/agents/sdk-streams.cjs.map +1 -1
  15. package/dist/analysis/bindings.cjs +74 -19
  16. package/dist/analysis/bindings.cjs.map +1 -1
  17. package/dist/analysis/bindings.d.cts +534 -156
  18. package/dist/analysis/bindings.d.mts +534 -156
  19. package/dist/analysis/bindings.d.ts +534 -156
  20. package/dist/analysis/domain-view.cjs.map +1 -1
  21. package/dist/analysis/domain-view.d.cts +137 -8
  22. package/dist/analysis/domain-view.d.mts +137 -8
  23. package/dist/analysis/domain-view.d.ts +137 -8
  24. package/dist/analysis/index.cjs.map +1 -1
  25. package/dist/analysis/index.d.cts +1 -1
  26. package/dist/analysis/index.d.mts +1 -1
  27. package/dist/analysis/index.d.ts +1 -1
  28. package/dist/assertions/api.cjs.map +1 -1
  29. package/dist/assertions/api.d.cts +62 -0
  30. package/dist/assertions/api.d.mts +62 -0
  31. package/dist/assertions/api.d.ts +62 -0
  32. package/dist/assertions/judge.cjs +56 -5
  33. package/dist/assertions/judge.cjs.map +1 -1
  34. package/dist/assertions/match.cjs +66 -42
  35. package/dist/assertions/match.cjs.map +1 -1
  36. package/dist/assertions/match.d.cts +13 -0
  37. package/dist/assertions/match.d.mts +13 -0
  38. package/dist/assertions/match.d.ts +13 -0
  39. package/dist/assertions/record/attachment.cjs +104 -33
  40. package/dist/assertions/record/attachment.cjs.map +1 -1
  41. package/dist/assertions/record/attachment.d.cts +294 -57
  42. package/dist/assertions/record/attachment.d.mts +294 -57
  43. package/dist/assertions/record/attachment.d.ts +294 -57
  44. package/dist/assertions/record/codec.cjs +91 -17
  45. package/dist/assertions/record/codec.cjs.map +1 -1
  46. package/dist/assertions/record/codec.d.cts +280 -52
  47. package/dist/assertions/record/codec.d.mts +280 -52
  48. package/dist/assertions/record/codec.d.ts +280 -52
  49. package/dist/assertions/record/index.js +2 -0
  50. package/dist/assertions/record/model.cjs +16 -0
  51. package/dist/assertions/record/model.cjs.map +1 -1
  52. package/dist/assertions/record/model.d.cts +120 -13
  53. package/dist/assertions/record/model.d.mts +120 -13
  54. package/dist/assertions/record/model.d.ts +120 -13
  55. package/dist/assertions/record/model.js +2 -0
  56. package/dist/assertions/record/producer.cjs +70 -50
  57. package/dist/assertions/record/producer.cjs.map +1 -1
  58. package/dist/assertions/record/producer.d.cts +8 -7
  59. package/dist/assertions/record/producer.d.mts +8 -7
  60. package/dist/assertions/record/producer.d.ts +8 -7
  61. package/dist/assertions/runtime.cjs +49 -7
  62. package/dist/assertions/runtime.cjs.map +1 -1
  63. package/dist/cli/application.cjs +40 -0
  64. package/dist/cli/application.cjs.map +1 -0
  65. package/dist/cli/application.d.cts +129 -0
  66. package/dist/cli/application.d.mts +129 -0
  67. package/dist/cli/application.d.ts +129 -0
  68. package/dist/cli/application.js +24 -0
  69. package/dist/cli/application.js.map +1 -0
  70. package/dist/cli/bootstrap.cjs +10 -4
  71. package/dist/cli/bootstrap.cjs.map +1 -1
  72. package/dist/cli/node-application.cjs +123 -0
  73. package/dist/cli/node-application.cjs.map +1 -0
  74. package/dist/cli/node-application.d.cts +14 -0
  75. package/dist/cli/node-application.d.mts +14 -0
  76. package/dist/cli/node-application.d.ts +14 -0
  77. package/dist/cli/node-application.js +26 -0
  78. package/dist/cli/node-application.js.map +1 -0
  79. package/dist/cli/program.cjs +2807 -0
  80. package/dist/cli/program.cjs.map +1 -0
  81. package/dist/cli/program.d.cts +352 -0
  82. package/dist/cli/program.d.mts +352 -0
  83. package/dist/cli/program.d.ts +352 -0
  84. package/dist/cli/program.js +36 -0
  85. package/dist/cli/program.js.map +1 -0
  86. package/dist/cli/project-configuration.cjs +134 -0
  87. package/dist/cli/project-configuration.cjs.map +1 -0
  88. package/dist/cli/project-configuration.d.cts +64 -0
  89. package/dist/cli/project-configuration.d.mts +64 -0
  90. package/dist/cli/project-configuration.d.ts +64 -0
  91. package/dist/cli/project-configuration.js +22 -0
  92. package/dist/cli/project-configuration.js.map +1 -0
  93. package/dist/cli/record.cjs +20 -4
  94. package/dist/cli/record.cjs.map +1 -1
  95. package/dist/cli/record.d.cts +3 -3
  96. package/dist/cli/record.d.mts +3 -3
  97. package/dist/cli/record.d.ts +3 -3
  98. package/dist/cli.cjs +19 -3130
  99. package/dist/cli.cjs.map +1 -1
  100. package/dist/cli.d.cts +2 -148
  101. package/dist/cli.d.mts +2 -148
  102. package/dist/cli.d.ts +2 -148
  103. package/dist/cli.js +22 -30
  104. package/dist/context/assert-first.cjs +20 -15
  105. package/dist/context/assert-first.cjs.map +1 -1
  106. package/dist/eval/record/verdict.cjs +3 -2
  107. package/dist/eval/record/verdict.cjs.map +1 -1
  108. package/dist/experiment/host/index.cjs +1 -6
  109. package/dist/experiment/host/index.cjs.map +1 -1
  110. package/dist/experiment/host/index.d.cts +1 -0
  111. package/dist/experiment/host/index.d.mts +1 -0
  112. package/dist/experiment/host/index.d.ts +1 -0
  113. package/dist/load-config.cjs +13 -4
  114. package/dist/load-config.cjs.map +1 -1
  115. package/dist/load-config.d.cts +4 -3
  116. package/dist/load-config.d.mts +4 -3
  117. package/dist/load-config.d.ts +4 -3
  118. package/dist/load-config.js +4 -2
  119. package/dist/o11y/parsers/codex.cjs +29 -7
  120. package/dist/o11y/parsers/codex.cjs.map +1 -1
  121. package/dist/record/codec/core.d.cts +0 -2
  122. package/dist/record/codec/core.d.mts +0 -2
  123. package/dist/record/codec/core.d.ts +0 -2
  124. package/dist/record/codec/identifiers.cjs +2 -3
  125. package/dist/record/codec/identifiers.cjs.map +1 -1
  126. package/dist/record/codec/identifiers.d.cts +1 -2
  127. package/dist/record/codec/identifiers.d.mts +1 -2
  128. package/dist/record/codec/identifiers.d.ts +1 -2
  129. package/dist/record/codec/identifiers.js +10 -12
  130. package/dist/record/codec/index.js +42 -44
  131. package/dist/record/definition/attachment.cjs +1 -0
  132. package/dist/record/definition/attachment.cjs.map +1 -1
  133. package/dist/record/definition/attachment.d.cts +14 -0
  134. package/dist/record/definition/attachment.d.mts +14 -0
  135. package/dist/record/definition/attachment.d.ts +14 -0
  136. package/dist/record/family/assertions-v1.cjs +104 -0
  137. package/dist/record/family/assertions-v1.cjs.map +1 -0
  138. package/dist/record/family/assertions-v1.d.cts +2 -0
  139. package/dist/record/family/assertions-v1.d.mts +2 -0
  140. package/dist/record/family/assertions-v1.d.ts +2 -0
  141. package/dist/record/family/assertions-v1.js +6 -0
  142. package/dist/record/family/assertions-v1.js.map +1 -0
  143. package/dist/record/family/assertions.cjs +16 -5
  144. package/dist/record/family/assertions.cjs.map +1 -1
  145. package/dist/record/family/assertions.d.cts +510 -56
  146. package/dist/record/family/assertions.d.mts +510 -56
  147. package/dist/record/family/assertions.d.ts +510 -56
  148. package/dist/record/family/assertions.js +14 -10
  149. package/dist/record/family/catalog.cjs +17 -1
  150. package/dist/record/family/catalog.cjs.map +1 -1
  151. package/dist/record/family/catalog.d.cts +1292 -104
  152. package/dist/record/family/catalog.d.mts +1292 -104
  153. package/dist/record/family/catalog.d.ts +1292 -104
  154. package/dist/record/family/catalog.js +22 -20
  155. package/dist/record/family/index.js +144 -138
  156. package/dist/record/family/observability-v1.cjs +5 -0
  157. package/dist/record/family/observability-v1.cjs.map +1 -1
  158. package/dist/record/family/observability.cjs +1 -1
  159. package/dist/record/family/observability.cjs.map +1 -1
  160. package/dist/record/host/runtime.cjs +323 -173
  161. package/dist/record/host/runtime.cjs.map +1 -1
  162. package/dist/record/host/types.cjs.map +1 -1
  163. package/dist/record/host/types.d.cts +9 -7
  164. package/dist/record/host/types.d.mts +9 -7
  165. package/dist/record/host/types.d.ts +9 -7
  166. package/dist/record/model/core.cjs.map +1 -1
  167. package/dist/record/model/core.d.cts +1 -2
  168. package/dist/record/model/core.d.mts +1 -2
  169. package/dist/record/model/core.d.ts +1 -2
  170. package/dist/record/model/definition.cjs +1 -2
  171. package/dist/record/model/definition.cjs.map +1 -1
  172. package/dist/record/model/definition.d.cts +1 -7
  173. package/dist/record/model/definition.d.mts +1 -7
  174. package/dist/record/model/definition.d.ts +1 -7
  175. package/dist/record/model/identifiers.cjs +2 -3
  176. package/dist/record/model/identifiers.cjs.map +1 -1
  177. package/dist/record/model/identifiers.d.cts +1 -3
  178. package/dist/record/model/identifiers.d.mts +1 -3
  179. package/dist/record/model/identifiers.d.ts +1 -3
  180. package/dist/record/model/identifiers.js +36 -38
  181. package/dist/record/model/index.js +60 -62
  182. package/dist/record/platform/node.cjs +17 -7
  183. package/dist/record/platform/node.cjs.map +1 -1
  184. package/dist/record/platform/services.cjs.map +1 -1
  185. package/dist/record/platform/services.d.cts +8 -3
  186. package/dist/record/platform/services.d.mts +8 -3
  187. package/dist/record/platform/services.d.ts +8 -3
  188. package/dist/record/reader/format.cjs +16 -65
  189. package/dist/record/reader/format.cjs.map +1 -1
  190. package/dist/record/reader/format.d.cts +5 -9
  191. package/dist/record/reader/format.d.mts +5 -9
  192. package/dist/record/reader/format.d.ts +5 -9
  193. package/dist/record/reader/index.js +10 -8
  194. package/dist/record/reader/runtime.cjs +63 -32
  195. package/dist/record/reader/runtime.cjs.map +1 -1
  196. package/dist/record/reader/runtime.d.cts +40 -4
  197. package/dist/record/reader/runtime.d.mts +40 -4
  198. package/dist/record/reader/runtime.d.ts +40 -4
  199. package/dist/record/reader/runtime.js +6 -4
  200. package/dist/report/assets/enhance.js +5 -5
  201. package/dist/report/assets/styles.css +186 -24
  202. package/dist/report/built-in/result-components.cjs +8 -5
  203. package/dist/report/built-in/result-components.cjs.map +1 -1
  204. package/dist/report/built-in/standard.cjs +3 -0
  205. package/dist/report/built-in/standard.cjs.map +1 -1
  206. package/dist/report/built-in/standard.d.cts +2 -0
  207. package/dist/report/built-in/standard.d.mts +2 -0
  208. package/dist/report/built-in/standard.d.ts +2 -0
  209. package/dist/report/client-dist/app.js +53 -0
  210. package/dist/report/components/attempt-detail/compute.cjs +106 -231
  211. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  212. package/dist/report/components/attempt-detail/compute.d.cts +9 -43
  213. package/dist/report/components/attempt-detail/compute.d.mts +9 -43
  214. package/dist/report/components/attempt-detail/compute.d.ts +9 -43
  215. package/dist/report/components/attempt-detail/compute.js +2 -4
  216. package/dist/report/components/attempt-detail/content.cjs +3 -4
  217. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  218. package/dist/report/components/attempt-detail/validate.cjs +44 -2
  219. package/dist/report/components/attempt-detail/validate.cjs.map +1 -1
  220. package/dist/report/components/entity-lists/compute.cjs +9 -15
  221. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  222. package/dist/report/components/entity-lists/content.cjs +53 -40
  223. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  224. package/dist/report/components/entity-lists/index.cjs +1 -3
  225. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  226. package/dist/report/components/experiment-detail/compute.cjs +4 -6
  227. package/dist/report/components/experiment-detail/compute.cjs.map +1 -1
  228. package/dist/report/definition/cell.cjs +14 -7
  229. package/dist/report/definition/cell.cjs.map +1 -1
  230. package/dist/report/definition/cell.d.cts +4 -0
  231. package/dist/report/definition/cell.d.mts +4 -0
  232. package/dist/report/definition/cell.d.ts +4 -0
  233. package/dist/report/definition/primitives/assertion-evidence.cjs +96 -0
  234. package/dist/report/definition/primitives/assertion-evidence.cjs.map +1 -0
  235. package/dist/report/definition/primitives/assertion-evidence.d.cts +11 -0
  236. package/dist/report/definition/primitives/assertion-evidence.d.mts +11 -0
  237. package/dist/report/definition/primitives/assertion-evidence.d.ts +11 -0
  238. package/dist/report/definition/primitives/assertion-evidence.js +6 -0
  239. package/dist/report/definition/primitives/assertion-evidence.js.map +1 -0
  240. package/dist/report/definition/primitives.cjs +14 -1
  241. package/dist/report/definition/primitives.cjs.map +1 -1
  242. package/dist/report/definition/report.cjs +16 -8
  243. package/dist/report/definition/report.cjs.map +1 -1
  244. package/dist/report/definition/report.d.cts +6 -0
  245. package/dist/report/definition/report.d.mts +6 -0
  246. package/dist/report/definition/report.d.ts +6 -0
  247. package/dist/report/definition/table-text.cjs +12 -3
  248. package/dist/report/definition/table-text.cjs.map +1 -1
  249. package/dist/report/definition/table-text.d.cts +6 -1
  250. package/dist/report/definition/table-text.d.mts +6 -1
  251. package/dist/report/definition/table-text.d.ts +6 -1
  252. package/dist/report/execution/model.cjs +6 -14
  253. package/dist/report/execution/model.cjs.map +1 -1
  254. package/dist/report/execution/model.d.cts +5 -10
  255. package/dist/report/execution/model.d.mts +5 -10
  256. package/dist/report/execution/model.d.ts +5 -10
  257. package/dist/report/execution/model.js +6 -6
  258. package/dist/report/execution/paths.cjs +0 -11
  259. package/dist/report/execution/paths.cjs.map +1 -1
  260. package/dist/report/execution/paths.d.cts +0 -1
  261. package/dist/report/execution/paths.d.mts +0 -1
  262. package/dist/report/execution/paths.d.ts +0 -1
  263. package/dist/report/execution/paths.js +6 -8
  264. package/dist/report/host/execute.cjs +13 -22
  265. package/dist/report/host/execute.cjs.map +1 -1
  266. package/dist/report/host/execute.d.cts +1 -4
  267. package/dist/report/host/execute.d.mts +1 -4
  268. package/dist/report/host/execute.d.ts +1 -4
  269. package/dist/report/host/from-record.cjs +3 -0
  270. package/dist/report/host/from-record.cjs.map +1 -1
  271. package/dist/report/host/from-record.d.cts +4 -1
  272. package/dist/report/host/from-record.d.mts +4 -1
  273. package/dist/report/host/from-record.d.ts +4 -1
  274. package/dist/report/host/site-assets.cjs +1 -2
  275. package/dist/report/host/site-assets.cjs.map +1 -1
  276. package/dist/report/host/site-assets.d.cts +0 -1
  277. package/dist/report/host/site-assets.d.mts +0 -1
  278. package/dist/report/host/site-assets.d.ts +0 -1
  279. package/dist/report/host/site-assets.js +2 -4
  280. package/dist/report/host/static.cjs +71 -346
  281. package/dist/report/host/static.cjs.map +1 -1
  282. package/dist/report/host/static.d.cts +1 -3
  283. package/dist/report/host/static.d.mts +1 -3
  284. package/dist/report/host/static.d.ts +1 -3
  285. package/dist/report/host/static.js +2 -2
  286. package/dist/report/host/view-session.cjs.map +1 -1
  287. package/dist/report/host/view-session.d.cts +1 -1
  288. package/dist/report/host/view-session.d.mts +1 -1
  289. package/dist/report/host/view-session.d.ts +1 -1
  290. package/dist/report/model/locale.cjs +1 -1
  291. package/dist/report/model/locale.cjs.map +1 -1
  292. package/dist/report/model/locale.d.cts +1 -1
  293. package/dist/report/model/locale.d.mts +1 -1
  294. package/dist/report/model/locale.d.ts +1 -1
  295. package/dist/report/model/pricing.cjs +2 -2
  296. package/dist/report/model/pricing.cjs.map +1 -1
  297. package/dist/report/react/enhance.js +5 -5
  298. package/dist/report/react/styles.css +186 -24
  299. package/dist/runner/adoption.cjs +4 -7
  300. package/dist/runner/adoption.cjs.map +1 -1
  301. package/dist/runner/feedback/failure.cjs +77 -2
  302. package/dist/runner/feedback/failure.cjs.map +1 -1
  303. package/dist/runner/feedback/failure.d.cts +2 -1
  304. package/dist/runner/feedback/failure.d.mts +2 -1
  305. package/dist/runner/feedback/failure.d.ts +2 -1
  306. package/dist/runner/project-current.cjs +2 -13
  307. package/dist/runner/project-current.cjs.map +1 -1
  308. package/dist/runner/project-current.d.cts +4 -2
  309. package/dist/runner/project-current.d.mts +4 -2
  310. package/dist/runner/project-current.d.ts +4 -2
  311. package/dist/runner/reporters/braintrust.cjs +7 -7
  312. package/dist/runner/reporters/braintrust.cjs.map +1 -1
  313. package/dist/runner/reuse-readback.cjs +3 -4
  314. package/dist/runner/reuse-readback.cjs.map +1 -1
  315. package/dist/runner/run.cjs +5 -2
  316. package/dist/runner/run.cjs.map +1 -1
  317. package/dist/view/server.cjs +2 -37
  318. package/dist/view/server.cjs.map +1 -1
  319. package/dist/view/server.d.cts +0 -3
  320. package/dist/view/server.d.mts +0 -3
  321. package/dist/view/server.d.ts +0 -3
  322. package/docs-site/zh/reference/builtin-agents.mdx +7 -7
  323. package/docs-site/zh/reference/official-adapters.mdx +4 -4
  324. package/docs-site/zh/reference/report-components.mdx +2 -2
  325. package/docs-site/zh/tutorials/configuration.mdx +2 -2
  326. package/docs-site/zh/tutorials/deploy-report-site.mdx +24 -2
  327. package/docs-site/zh/tutorials/publish-report.mdx +4 -4
  328. package/docs-site/zh/tutorials/sandbox-agent.mdx +5 -5
  329. package/docs-site/zh/tutorials/theming.mdx +2 -2
  330. package/package.json +4 -6
  331. package/dist/record/migration/index.cjs +0 -5
  332. package/dist/record/migration/index.cjs.map +0 -1
  333. package/dist/record/migration/index.d.cts +0 -11
  334. package/dist/record/migration/index.d.mts +0 -11
  335. package/dist/record/migration/index.d.ts +0 -11
  336. package/dist/record/migration/index.js +0 -6
  337. package/dist/record/migration/index.js.map +0 -1
  338. package/dist/report/host/site-runtime.cjs +0 -92
  339. package/dist/report/host/site-runtime.cjs.map +0 -1
  340. package/dist/report/host/site-runtime.d.cts +0 -9
  341. package/dist/report/host/site-runtime.d.mts +0 -9
  342. package/dist/report/host/site-runtime.d.ts +0 -9
  343. package/dist/report/host/site-runtime.js +0 -10
  344. package/dist/report/host/site-runtime.js.map +0 -1
  345. package/dist/view/client-dist/app.css +0 -2
  346. package/dist/view/client-dist/app.js +0 -49
  347. package/dist/view/data.cjs +0 -3
  348. package/dist/view/data.cjs.map +0 -1
  349. package/dist/view/data.d.cts +0 -9
  350. package/dist/view/data.d.mts +0 -9
  351. package/dist/view/data.d.ts +0 -9
  352. package/dist/view/data.js +0 -4
  353. package/dist/view/data.js.map +0 -1
  354. package/dist/view/index.cjs +0 -24
  355. package/dist/view/index.cjs.map +0 -1
  356. package/dist/view/index.d.cts +0 -9
  357. package/dist/view/index.d.mts +0 -9
  358. package/dist/view/index.d.ts +0 -9
  359. package/dist/view/index.js +0 -28
  360. package/dist/view/index.js.map +0 -1
  361. package/dist/view/report-view-cache.cjs +0 -200
  362. package/dist/view/report-view-cache.cjs.map +0 -1
  363. package/dist/view/report-view-cache.d.cts +0 -67
  364. package/dist/view/report-view-cache.d.mts +0 -67
  365. package/dist/view/report-view-cache.d.ts +0 -67
  366. package/dist/view/report-view-cache.js +0 -8
  367. package/dist/view/report-view-cache.js.map +0 -1
  368. package/dist/view/shared/types.cjs +0 -3
  369. package/dist/view/shared/types.cjs.map +0 -1
  370. package/dist/view/shared/types.d.cts +0 -51
  371. package/dist/view/shared/types.d.mts +0 -51
  372. package/dist/view/shared/types.d.ts +0 -51
  373. package/dist/view/shared/types.js +0 -4
  374. package/dist/view/shared/types.js.map +0 -1
  375. package/dist/view/site.cjs +0 -32
  376. package/dist/view/site.cjs.map +0 -1
  377. package/dist/view/site.d.cts +0 -24
  378. package/dist/view/site.d.mts +0 -24
  379. package/dist/view/site.d.ts +0 -24
  380. package/dist/view/site.js +0 -8
  381. package/dist/view/site.js.map +0 -1
  382. package/dist/view/styles.css +0 -170
  383. package/dist/view/template.html +0 -17
@@ -1 +1 @@
1
- {"version":3,"file":"failure.js","sourceRoot":"","sources":["failure.ts"],"names":[],"mappings":"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","sourcesContent":["import { compactAssertionSummary, summaryText } from \"../../assertions/display.ts\";\nimport { encodeAttemptLocator } from \"../../attempt-locator.ts\";\nimport type { EvaluationFactResult, EvalResult, PrimaryFactSummary, ScoreFactUseResult, VerdictFactUseResult, } from \"../../types.ts\";\nimport { firstLine } from \"../../util.ts\";\nimport { attemptTerminalOf } from \"../../shared/verdict.ts\";\nimport { runWho, type AgentRun, type FailureDetail } from \"../types.ts\";\nimport type { CurrentReusedAttemptReadback } from \"../reuse-readback.ts\";\n/**\n * Fresh results and current Record readbacks use separate projections so the\n * latter never has to impersonate an EvalResult at the feedback boundary.\n */\nexport function failureDetailFromResult(result: EvalResult): FailureDetail | undefined {\n const locator = result.locator;\n if (!locator || (result.verdict !== \"failed\" && result.verdict !== \"errored\")) {\n return undefined;\n }\n const terminal = failureSummaryTerminal(result);\n const fact = terminal === undefined ? undefined : primaryFactSummary(result, terminal);\n // An errored terminal can only fall back to the runner error after every\n // evaluator-originated Fact cause has been considered.\n const fallbackError = terminal === \"errored\" && fact === undefined ? result.error : undefined;\n // 执行错误只给一层可行动摘要(docs/feature/experiments/cli.md「运行反馈」):message 取首行\n // ——多行 message 的后续行(如 diagnose 的 output tail)归 `show @locator` 展开,不进\n // scrollback;再过 summaryText 剥控制字节并按摘要上限收口,adapter 组装的文本里混进\n // ANSI 着色时不泄漏进终端事实行。\n // 超时的那条 reason 后面直接接归属:哪层时限、上限多少、值从哪来。一行里说清「谁把它掐的」,\n // 不让人先去 `show --timing` 才知道自己撞的是哪条线(见 docs/feature/sandbox/architecture.md\n // 「时限归属」)。\n const timeout = fallbackError?.timeout;\n const attribution = timeout\n ? ` (${timeout.trigger} · limit ${timeout.limitMs}ms · from ${timeout.source})`\n : \"\";\n const reason = fallbackError !== undefined\n ? `${summaryText(firstLine(fallbackError.message))}${attribution}`\n : fact !== undefined\n ? compactAssertionSummary(fact)\n : summaryText(result.verdict);\n const origin = fallbackError?.origin;\n const phase = origin?.scope === \"attempt\" ? origin.phase : undefined;\n // 只在真正的结构化执行错误(没有主 Fact 摘要)上携带 `code`。Fact unavailable/errored\n // 已经有更具体的结构化摘要,不需要也没有这个字段。\n const code = result.verdict === \"errored\" && fact === undefined ? fallbackError?.code : undefined;\n return {\n locator,\n identity: { experimentId: result.experimentId, evalId: result.id, attempt: result.attempt },\n who: runWho({ agentName: result.agent, model: result.model, experimentId: result.experimentId }),\n verdict: result.verdict,\n reason,\n ...(fact !== undefined ? { fact } : {}),\n ...(phase !== undefined ? { phase } : {}),\n ...(code !== undefined ? { code } : {}),\n ...(origin !== undefined ? { origin } : {}),\n };\n}\n/**\n * A current Record reuse remains a readback ADT all the way to display. The\n * durable source identity is exact; display derives the current short alias.\n */\nexport function failureDetailFromCurrentReusedAttempt(readback: CurrentReusedAttemptReadback, run: Pick<AgentRun, \"agent\" | \"model\" | \"experimentId\">): FailureDetail | undefined {\n if (readback.verdict !== \"failed\")\n return undefined;\n const diagnostic = readback.executionErrors.state === \"available\"\n ? readback.executionErrors.value[0]\n : undefined;\n return {\n locator: encodeAttemptLocator(readback.source.attemptId),\n identity: {\n experimentId: readback.target.experimentId,\n evalId: readback.target.evalId,\n attempt: readback.target.attempt,\n },\n who: runWho({\n agentName: run.agent.name,\n model: run.model,\n experimentId: run.experimentId,\n }),\n verdict: \"failed\",\n reason: diagnostic === undefined\n ? summaryText(readback.verdict)\n : summaryText(firstLine(diagnostic.summary)),\n };\n}\n/**\n * 反馈行只投影已经落定的 Fact/use。\n * 只选择真正参与当前失败终态的 use;同一 Fact 同时用于 verdict 与 score 时只显示一次。\n * 反馈只投影 Fact/use 的因果关系,不重建另一套判定等级。\n */\ntype FailureSummaryTerminal = \"failed\" | \"errored\";\nfunction failureSummaryTerminal(result: EvalResult): FailureSummaryTerminal | undefined {\n const terminal = attemptTerminalOf(result);\n return terminal === \"failed\" || terminal === \"errored\"\n ? terminal\n : undefined;\n}\nfunction primaryFactSummary(result: EvalResult, terminal: FailureSummaryTerminal): PrimaryFactSummary | undefined {\n const facts = new Map<string, EvaluationFactResult>(result.factResults.map((fact) => [fact.factId, fact]));\n const candidates = new Map<string, FactFailureCandidate>();\n for (const use of result.factUses) {\n const candidate = useCandidate(use, facts, terminal);\n if (candidate === undefined)\n continue;\n const identity = candidate.factId === undefined ? `use:${candidate.sourceOrder}` : `fact:${candidate.factId}`;\n const existing = candidates.get(identity);\n if (existing === undefined || candidate.sourceOrder < existing.sourceOrder)\n candidates.set(identity, candidate);\n }\n // A dependency Fact can be the evaluator root cause even when no use points\n // to it directly. Uses keep their labels when present; these rows fill only\n // the otherwise invisible roots.\n if (terminal === \"errored\") {\n for (const fact of result.factResults) {\n const candidate = factCandidate(fact, result.factUses, terminal);\n if (candidate !== undefined && !candidates.has(`fact:${fact.factId}`)) {\n candidates.set(`fact:${fact.factId}`, candidate);\n }\n }\n }\n const ordered = [...candidates.values()].sort((left, right) => left.sourceOrder - right.sourceOrder);\n const primary = ordered[0];\n if (primary === undefined)\n return undefined;\n return {\n title: summaryText(primary.title),\n ...(primary.matcher === undefined ? {} : { matcher: summaryText(primary.matcher) }),\n ...(primary.expected === undefined ? {} : { expected: summaryText(primary.expected) }),\n ...(primary.received === undefined ? {} : { received: summaryText(primary.received) }),\n ...(primary.reason === undefined ? {} : { reason: summaryText(primary.reason) }),\n additionalFailures: ordered.length - 1,\n };\n}\ninterface FactFailureCandidate {\n readonly sourceOrder: number;\n readonly factId?: string;\n readonly title: string;\n readonly matcher?: string;\n readonly expected?: string;\n readonly received?: string;\n readonly reason?: string;\n}\nfunction useCandidate(use: VerdictFactUseResult | ScoreFactUseResult, facts: ReadonlyMap<string, EvaluationFactResult>, terminal: FailureSummaryTerminal): FactFailureCandidate | undefined {\n const isFailure = terminal === \"failed\"\n ? use.useKind === \"verdict\" && use.outcome === \"failed\"\n : use.outcome === \"errored\" || use.outcome === \"unavailable\";\n if (!isFailure)\n return undefined;\n const factId = use.useKind === \"verdict\"\n ? use.target.factId\n : use.input.kind === \"fact\"\n ? use.input.factId\n : undefined;\n if (factId === undefined)\n return undefined;\n const fact = facts.get(factId);\n const label = use.label;\n const title = label ?? use.key ?? fact?.name ?? factId;\n const matcher = fact?.name === undefined || fact.name === title ? undefined : fact.name;\n const reason = use.outcome === \"unavailable\"\n ? use.reason\n : use.outcome === \"errored\"\n ? use.error.message\n : undefined;\n return {\n sourceOrder: use.sourceOrder,\n factId,\n title,\n ...(matcher === undefined ? {} : { matcher }),\n ...(fact?.expected === undefined ? {} : { expected: fact.expected }),\n ...(fact?.received === undefined ? {} : { received: fact.received }),\n ...(reason === undefined ? {} : { reason }),\n };\n}\nfunction factCandidate(fact: EvaluationFactResult, uses: readonly (VerdictFactUseResult | ScoreFactUseResult)[], terminal: Extract<FailureSummaryTerminal, \"errored\">): FactFailureCandidate | undefined {\n if (terminal === \"errored\" && fact.outcome === \"errored\") {\n return {\n sourceOrder: fact.sourceOrder,\n factId: fact.factId,\n title: fact.name,\n reason: fact.error.message,\n };\n }\n if (fact.outcome !== \"unavailable\")\n return undefined;\n const consumers = uses.filter((use) => use.useKind === \"verdict\"\n ? use.target.factId === fact.factId\n : use.input.kind === \"fact\" && use.input.factId === fact.factId);\n if (consumers.length > 0 && consumers.every((use) => use.outcome !== \"unavailable\"))\n return undefined;\n return {\n sourceOrder: fact.sourceOrder,\n factId: fact.factId,\n title: fact.name,\n reason: fact.reason,\n };\n}\nfunction compactFactSummary(summary: PrimaryFactSummary): string {\n const parts = [summary.title];\n if (summary.matcher !== undefined)\n parts.push(summary.matcher);\n if (summary.reason !== undefined)\n parts.push(`reason ${summary.reason}`);\n if (summary.additionalFailures > 0)\n parts.push(`+${summary.additionalFailures} more`);\n return parts.join(\" · \");\n}\n"]}
1
+ {"version":3,"file":"failure.js","sourceRoot":"","sources":["failure.ts"],"names":[],"mappings":";;AAYA,0DA4CC;AAmFD,sFAuBC;AAlKD,4DAAmF;AAEnF,iEAAgE;AAEhE,2CAA0C;AAC1C,wDAA4D;AAC5D,0CAAwE;AAExE;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,MAAkB,EAAE,MAAgC;IACxF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAC/B,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,EAAE,CAAC;QAC5E,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,QAAQ,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,QAAQ,KAAK,SAAS;QAC/B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChG,yEAAyE;IACzE,uDAAuD;IACvD,MAAM,aAAa,GAAG,QAAQ,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,mEAAmE;IACnE,qEAAqE;IACrE,2DAA2D;IAC3D,qBAAqB;IACrB,oDAAoD;IACpD,2EAA2E;IAC3E,WAAW;IACX,MAAM,OAAO,GAAG,aAAa,EAAE,OAAO,CAAC;IACvC,MAAM,WAAW,GAAG,OAAO;QACvB,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,YAAY,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC,MAAM,GAAG;QAC/E,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,MAAM,GAAG,aAAa,KAAK,SAAS;QACtC,CAAC,CAAC,GAAG,IAAA,wBAAW,EAAC,IAAA,mBAAS,EAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,WAAW,EAAE;QAClE,CAAC,CAAC,IAAI,KAAK,SAAS;YAChB,CAAC,CAAC,IAAA,oCAAuB,EAAC,IAAI,CAAC;YAC/B,CAAC,CAAC,IAAA,wBAAW,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,aAAa,EAAE,MAAM,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,+DAA+D;IAC/D,2BAA2B;IAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAClG,OAAO;QACH,OAAO;QACP,QAAQ,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;QAC3F,GAAG,EAAE,IAAA,iBAAM,EAAC,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;QAChG,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM;QACN,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACN,CAAC;AACD,SAAS,MAAM,CAAC,KAAc;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAC9C,CAAC,CAAC,KAA0C;QAC5C,CAAC,CAAC,SAAS,CAAC;AACpB,CAAC;AACD,SAAS,cAAc,CAAC,SAA6B;IACjD,QAAQ,SAAS,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,cAAc;YACf,OAAO,SAAS,CAAC,SAAS,KAAK,WAAW;gBACtC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,YAAY;gBAChC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,wBAAwB,CAAC;QACrD,KAAK,aAAa;YACd,OAAO,eAAe,CAAC;QAC3B,KAAK,YAAY;YACb,OAAO,GAAG,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QAC/E,KAAK,mBAAmB;YACpB,OAAO,SAAS,CAAC,MAAM,CAAC;QAC5B,KAAK,gBAAgB;YACjB,OAAO,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpD,KAAK,cAAc;YACf,OAAO,cAAc,CAAC;QAC1B,KAAK,aAAa;YACd,OAAO,SAAS,CAAC,IAAI,CAAC;IAC9B,CAAC;AACL,CAAC;AACD,SAAS,gBAAgB,CAAC,UAA+C;IAMrE,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACjC,IAAI,KAAK,KAAK,SAAS;QACnB,OAAO,EAAE,CAAC;IACd,MAAM,MAAM,GAAG,CAAC,GAAW,EAAsB,EAAE,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5G,OAAO;QACH,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7E,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7E,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;KAC1E,CAAC;AACN,CAAC;AACD,SAAS,kBAAkB,CAAC,KAA2B,EAAE,MAAkB;IACvE,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,OAAO,CAAC;IAC1G,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,cAAc;QACvD,CAAC,CAAC;YACE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;YAC7E,QAAQ,EAAE,OAAO,OAAO,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SAC7E;QACD,CAAC,CAAC,EAAE,CAAC;IACT,OAAO;QACH,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC;QAClF,GAAG,UAAU;QACb,GAAG,WAAW;QACd,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;KAChE,CAAC;AACN,CAAC;AACD,SAAS,uBAAuB,CAAC,MAAkB,EAAE,MAA2C,EAAE,QAAgC;IAC9H,IAAI,MAAM,KAAK,SAAS;QACpB,OAAO,SAAS,CAAC;IACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,KAAK,QAAQ;QACnE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;QAChC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,OAAO,KAAK,SAAS;QACrB,OAAO,SAAS,CAAC;IACrB,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO;QACH,KAAK,EAAE,IAAA,wBAAW,EAAC,SAAS,CAAC,KAAK,CAAC;QACnC,GAAG,CAAC,SAAS,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAA,wBAAW,EAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QACvF,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAA,wBAAW,EAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1F,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAA,wBAAW,EAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1F,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAA,wBAAW,EAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACpF,kBAAkB,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;KAC1C,CAAC;AACN,CAAC;AACD;;;GAGG;AACH,SAAgB,qCAAqC,CAAC,QAAsC,EAAE,GAAuD;IACjJ,IAAI,QAAQ,CAAC,OAAO,KAAK,QAAQ;QAC7B,OAAO,SAAS,CAAC;IACrB,MAAM,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,KAAK,WAAW;QAC7D,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO;QACH,OAAO,EAAE,IAAA,yCAAoB,EAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC;QACxD,QAAQ,EAAE;YACN,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY;YAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM;YAC9B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,OAAO;SACnC;QACD,GAAG,EAAE,IAAA,iBAAM,EAAC;YACR,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI;YACzB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,YAAY,EAAE,GAAG,CAAC,YAAY;SACjC,CAAC;QACF,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,UAAU,KAAK,SAAS;YAC5B,CAAC,CAAC,IAAA,wBAAW,EAAC,QAAQ,CAAC,OAAO,CAAC;YAC/B,CAAC,CAAC,IAAA,wBAAW,EAAC,IAAA,mBAAS,EAAC,UAAU,CAAC,OAAO,CAAC,CAAC;KACnD,CAAC;AACN,CAAC;AAOD,SAAS,sBAAsB,CAAC,MAAkB;IAC9C,MAAM,QAAQ,GAAG,IAAA,8BAAiB,EAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,SAAS;QAClD,CAAC,CAAC,QAAQ;QACV,CAAC,CAAC,SAAS,CAAC;AACpB,CAAC;AACD,SAAS,kBAAkB,CAAC,MAAkB,EAAE,QAAgC;IAC5E,MAAM,KAAK,GAAG,IAAI,GAAG,CAA+B,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3G,MAAM,UAAU,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC3D,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,SAAS,KAAK,SAAS;YACvB,SAAS;QACb,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,SAAS,CAAC,MAAM,EAAE,CAAC;QAC9G,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,QAAQ,KAAK,SAAS,IAAI,SAAS,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW;YACtE,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5C,CAAC;IACD,4EAA4E;IAC5E,4EAA4E;IAC5E,iCAAiC;IACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjE,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;gBACpE,UAAU,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC;YACrD,CAAC;QACL,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;IACrG,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,OAAO,KAAK,SAAS;QACrB,OAAO,SAAS,CAAC;IACrB,OAAO;QACH,KAAK,EAAE,IAAA,wBAAW,EAAC,OAAO,CAAC,KAAK,CAAC;QACjC,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAA,wBAAW,EAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAA,wBAAW,EAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAA,wBAAW,EAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtF,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAA,wBAAW,EAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChF,kBAAkB,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;KACzC,CAAC;AACN,CAAC;AAUD,SAAS,YAAY,CAAC,GAA8C,EAAE,KAAgD,EAAE,QAAgC;IACpJ,MAAM,SAAS,GAAG,QAAQ,KAAK,QAAQ;QACnC,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,QAAQ;QACvD,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,aAAa,CAAC;IACjE,IAAI,CAAC,SAAS;QACV,OAAO,SAAS,CAAC;IACrB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,KAAK,SAAS;QACpC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM;QACnB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM;YACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM;YAClB,CAAC,CAAC,SAAS,CAAC;IACpB,IAAI,MAAM,KAAK,SAAS;QACpB,OAAO,SAAS,CAAC;IACrB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,MAAM,CAAC;IACvD,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACxF,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,KAAK,aAAa;QACxC,CAAC,CAAC,GAAG,CAAC,MAAM;QACZ,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS;YACvB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO;YACnB,CAAC,CAAC,SAAS,CAAC;IACpB,OAAO;QACH,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM;QACN,KAAK;QACL,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7C,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;KAC9C,CAAC;AACN,CAAC;AACD,SAAS,aAAa,CAAC,IAA0B,EAAE,IAA4D,EAAE,QAAoD;IACjK,IAAI,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACvD,OAAO;YACH,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;SAC7B,CAAC;IACN,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,aAAa;QAC9B,OAAO,SAAS,CAAC;IACrB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS;QAC5D,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QACnC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC;IACrE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,aAAa,CAAC;QAC/E,OAAO,SAAS,CAAC;IACrB,OAAO;QACH,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,IAAI;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;KACtB,CAAC;AACN,CAAC;AACD,SAAS,kBAAkB,CAAC,OAA2B;IACnD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAC5B,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,IAAI,OAAO,CAAC,kBAAkB,GAAG,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,kBAAkB,OAAO,CAAC,CAAC;IACtD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC","sourcesContent":["import { compactAssertionSummary, summaryText } from \"../../assertions/display.ts\";\nimport type { AssertionCriterion, AssertionSnapshotObject, SealedAssertionEntry, SealedAttemptAssertions, } from \"../../assertions/api.ts\";\nimport { encodeAttemptLocator } from \"../../attempt-locator.ts\";\nimport type { EvaluationFactResult, EvalResult, PrimaryFactSummary, ScoreFactUseResult, VerdictFactUseResult, } from \"../../types.ts\";\nimport { firstLine } from \"../../util.ts\";\nimport { attemptTerminalOf } from \"../../shared/verdict.ts\";\nimport { runWho, type AgentRun, type FailureDetail } from \"../types.ts\";\nimport type { CurrentReusedAttemptReadback } from \"../reuse-readback.ts\";\n/**\n * Fresh results and current Record readbacks use separate projections so the\n * latter never has to impersonate an EvalResult at the feedback boundary.\n */\nexport function failureDetailFromResult(result: EvalResult, sealed?: SealedAttemptAssertions): FailureDetail | undefined {\n const locator = result.locator;\n if (!locator || (result.verdict !== \"failed\" && result.verdict !== \"errored\")) {\n return undefined;\n }\n const terminal = failureSummaryTerminal(result);\n const fact = terminal === undefined\n ? undefined\n : primaryFactSummary(result, terminal) ?? primaryAssertionSummary(result, sealed, terminal);\n // An errored terminal can only fall back to the runner error after every\n // evaluator-originated Fact cause has been considered.\n const fallbackError = terminal === \"errored\" && fact === undefined ? result.error : undefined;\n // 执行错误只给一层可行动摘要(docs/feature/experiments/cli.md「运行反馈」):message 取首行\n // ——多行 message 的后续行(如 diagnose 的 output tail)归 `show @locator` 展开,不进\n // scrollback;再过 summaryText 剥控制字节并按摘要上限收口,adapter 组装的文本里混进\n // ANSI 着色时不泄漏进终端事实行。\n // 超时的那条 reason 后面直接接归属:哪层时限、上限多少、值从哪来。一行里说清「谁把它掐的」,\n // 不让人先去 `show --timing` 才知道自己撞的是哪条线(见 docs/feature/sandbox/architecture.md\n // 「时限归属」)。\n const timeout = fallbackError?.timeout;\n const attribution = timeout\n ? ` (${timeout.trigger} · limit ${timeout.limitMs}ms · from ${timeout.source})`\n : \"\";\n const reason = fallbackError !== undefined\n ? `${summaryText(firstLine(fallbackError.message))}${attribution}`\n : fact !== undefined\n ? compactAssertionSummary(fact)\n : summaryText(result.verdict);\n const origin = fallbackError?.origin;\n const phase = origin?.scope === \"attempt\" ? origin.phase : undefined;\n // 只在真正的结构化执行错误(没有主 Fact 摘要)上携带 `code`。Fact unavailable/errored\n // 已经有更具体的结构化摘要,不需要也没有这个字段。\n const code = result.verdict === \"errored\" && fact === undefined ? fallbackError?.code : undefined;\n return {\n locator,\n identity: { experimentId: result.experimentId, evalId: result.id, attempt: result.attempt },\n who: runWho({ agentName: result.agent, model: result.model, experimentId: result.experimentId }),\n verdict: result.verdict,\n reason,\n ...(fact !== undefined ? { fact } : {}),\n ...(phase !== undefined ? { phase } : {}),\n ...(code !== undefined ? { code } : {}),\n ...(origin !== undefined ? { origin } : {}),\n };\n}\nfunction record(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === \"object\" && value !== null\n ? value as Readonly<Record<string, unknown>>\n : undefined;\n}\nfunction criterionTitle(criterion: AssertionCriterion): string {\n switch (criterion.kind) {\n case \"scope-status\":\n return criterion.assertion === \"succeeded\"\n ? `${criterion.scope} succeeded`\n : `${criterion.scope} had no failed actions`;\n case \"value-match\":\n return \"value matched\";\n case \"occurrence\":\n return `${criterion.scope} ${criterion.occurrence} ${criterion.assertion}`;\n case \"judge-measurement\":\n return criterion.recipe;\n case \"sandbox-result\":\n return criterion.operation.replaceAll(\"-\", \" \");\n case \"direct-score\":\n return \"direct score\";\n case \"third-party\":\n return criterion.name;\n }\n}\nfunction diagnosticFields(diagnostic: AssertionSnapshotObject | undefined): {\n readonly matcher?: string;\n readonly expected?: string;\n readonly received?: string;\n readonly reason?: string;\n} {\n const value = record(diagnostic);\n if (value === undefined)\n return {};\n const string = (key: string): string | undefined => typeof value[key] === \"string\" ? value[key] : undefined;\n return {\n ...(string(\"message\") === undefined ? {} : { matcher: string(\"message\") }),\n ...(string(\"expected\") === undefined ? {} : { expected: string(\"expected\") }),\n ...(string(\"received\") === undefined ? {} : { received: string(\"received\") }),\n ...(string(\"reason\") === undefined ? {} : { reason: string(\"reason\") }),\n };\n}\nfunction assertionCandidate(entry: SealedAssertionEntry, result: EvalResult): Omit<PrimaryFactSummary, \"additionalFailures\"> {\n const diagnostic = diagnosticFields(entry.result.diagnostic);\n const subject = entry.subject.kind === \"snapshot\" ? record(entry.subject.value) : undefined;\n const errorReason = [...(result.events ?? [])].reverse().find((event) => event.type === \"error\")?.message;\n const scopeStatus = entry.criterion.kind === \"scope-status\"\n ? {\n expected: entry.criterion.assertion === \"succeeded\" ? \"completed\" : undefined,\n received: typeof subject?.status === \"string\" ? subject.status : undefined,\n }\n : {};\n return {\n title: entry.display.label ?? entry.display.key ?? criterionTitle(entry.criterion),\n ...diagnostic,\n ...scopeStatus,\n ...(errorReason === undefined ? {} : { reason: errorReason }),\n };\n}\nfunction primaryAssertionSummary(result: EvalResult, sealed: SealedAttemptAssertions | undefined, terminal: FailureSummaryTerminal): PrimaryFactSummary | undefined {\n if (sealed === undefined)\n return undefined;\n const failures = sealed.entries.filter((entry) => terminal === \"failed\"\n ? entry.result.gate === \"failed\"\n : entry.result.state === \"errored\" || entry.result.gate === \"unavailable\");\n const primary = failures[0];\n if (primary === undefined)\n return undefined;\n const candidate = assertionCandidate(primary, result);\n return {\n title: summaryText(candidate.title),\n ...(candidate.matcher === undefined ? {} : { matcher: summaryText(candidate.matcher) }),\n ...(candidate.expected === undefined ? {} : { expected: summaryText(candidate.expected) }),\n ...(candidate.received === undefined ? {} : { received: summaryText(candidate.received) }),\n ...(candidate.reason === undefined ? {} : { reason: summaryText(candidate.reason) }),\n additionalFailures: failures.length - 1,\n };\n}\n/**\n * A current Record reuse remains a readback ADT all the way to display. The\n * durable source identity is exact; display derives the current short alias.\n */\nexport function failureDetailFromCurrentReusedAttempt(readback: CurrentReusedAttemptReadback, run: Pick<AgentRun, \"agent\" | \"model\" | \"experimentId\">): FailureDetail | undefined {\n if (readback.verdict !== \"failed\")\n return undefined;\n const diagnostic = readback.executionErrors.state === \"available\"\n ? readback.executionErrors.value[0]\n : undefined;\n return {\n locator: encodeAttemptLocator(readback.source.attemptId),\n identity: {\n experimentId: readback.target.experimentId,\n evalId: readback.target.evalId,\n attempt: readback.target.attempt,\n },\n who: runWho({\n agentName: run.agent.name,\n model: run.model,\n experimentId: run.experimentId,\n }),\n verdict: \"failed\",\n reason: diagnostic === undefined\n ? summaryText(readback.verdict)\n : summaryText(firstLine(diagnostic.summary)),\n };\n}\n/**\n * 反馈行只投影已经落定的 Fact/use。\n * 只选择真正参与当前失败终态的 use;同一 Fact 同时用于 verdict 与 score 时只显示一次。\n * 反馈只投影 Fact/use 的因果关系,不重建另一套判定等级。\n */\ntype FailureSummaryTerminal = \"failed\" | \"errored\";\nfunction failureSummaryTerminal(result: EvalResult): FailureSummaryTerminal | undefined {\n const terminal = attemptTerminalOf(result);\n return terminal === \"failed\" || terminal === \"errored\"\n ? terminal\n : undefined;\n}\nfunction primaryFactSummary(result: EvalResult, terminal: FailureSummaryTerminal): PrimaryFactSummary | undefined {\n const facts = new Map<string, EvaluationFactResult>(result.factResults.map((fact) => [fact.factId, fact]));\n const candidates = new Map<string, FactFailureCandidate>();\n for (const use of result.factUses) {\n const candidate = useCandidate(use, facts, terminal);\n if (candidate === undefined)\n continue;\n const identity = candidate.factId === undefined ? `use:${candidate.sourceOrder}` : `fact:${candidate.factId}`;\n const existing = candidates.get(identity);\n if (existing === undefined || candidate.sourceOrder < existing.sourceOrder)\n candidates.set(identity, candidate);\n }\n // A dependency Fact can be the evaluator root cause even when no use points\n // to it directly. Uses keep their labels when present; these rows fill only\n // the otherwise invisible roots.\n if (terminal === \"errored\") {\n for (const fact of result.factResults) {\n const candidate = factCandidate(fact, result.factUses, terminal);\n if (candidate !== undefined && !candidates.has(`fact:${fact.factId}`)) {\n candidates.set(`fact:${fact.factId}`, candidate);\n }\n }\n }\n const ordered = [...candidates.values()].sort((left, right) => left.sourceOrder - right.sourceOrder);\n const primary = ordered[0];\n if (primary === undefined)\n return undefined;\n return {\n title: summaryText(primary.title),\n ...(primary.matcher === undefined ? {} : { matcher: summaryText(primary.matcher) }),\n ...(primary.expected === undefined ? {} : { expected: summaryText(primary.expected) }),\n ...(primary.received === undefined ? {} : { received: summaryText(primary.received) }),\n ...(primary.reason === undefined ? {} : { reason: summaryText(primary.reason) }),\n additionalFailures: ordered.length - 1,\n };\n}\ninterface FactFailureCandidate {\n readonly sourceOrder: number;\n readonly factId?: string;\n readonly title: string;\n readonly matcher?: string;\n readonly expected?: string;\n readonly received?: string;\n readonly reason?: string;\n}\nfunction useCandidate(use: VerdictFactUseResult | ScoreFactUseResult, facts: ReadonlyMap<string, EvaluationFactResult>, terminal: FailureSummaryTerminal): FactFailureCandidate | undefined {\n const isFailure = terminal === \"failed\"\n ? use.useKind === \"verdict\" && use.outcome === \"failed\"\n : use.outcome === \"errored\" || use.outcome === \"unavailable\";\n if (!isFailure)\n return undefined;\n const factId = use.useKind === \"verdict\"\n ? use.target.factId\n : use.input.kind === \"fact\"\n ? use.input.factId\n : undefined;\n if (factId === undefined)\n return undefined;\n const fact = facts.get(factId);\n const label = use.label;\n const title = label ?? use.key ?? fact?.name ?? factId;\n const matcher = fact?.name === undefined || fact.name === title ? undefined : fact.name;\n const reason = use.outcome === \"unavailable\"\n ? use.reason\n : use.outcome === \"errored\"\n ? use.error.message\n : undefined;\n return {\n sourceOrder: use.sourceOrder,\n factId,\n title,\n ...(matcher === undefined ? {} : { matcher }),\n ...(fact?.expected === undefined ? {} : { expected: fact.expected }),\n ...(fact?.received === undefined ? {} : { received: fact.received }),\n ...(reason === undefined ? {} : { reason }),\n };\n}\nfunction factCandidate(fact: EvaluationFactResult, uses: readonly (VerdictFactUseResult | ScoreFactUseResult)[], terminal: Extract<FailureSummaryTerminal, \"errored\">): FactFailureCandidate | undefined {\n if (terminal === \"errored\" && fact.outcome === \"errored\") {\n return {\n sourceOrder: fact.sourceOrder,\n factId: fact.factId,\n title: fact.name,\n reason: fact.error.message,\n };\n }\n if (fact.outcome !== \"unavailable\")\n return undefined;\n const consumers = uses.filter((use) => use.useKind === \"verdict\"\n ? use.target.factId === fact.factId\n : use.input.kind === \"fact\" && use.input.factId === fact.factId);\n if (consumers.length > 0 && consumers.every((use) => use.outcome !== \"unavailable\"))\n return undefined;\n return {\n sourceOrder: fact.sourceOrder,\n factId: fact.factId,\n title: fact.name,\n reason: fact.reason,\n };\n}\nfunction compactFactSummary(summary: PrimaryFactSummary): string {\n const parts = [summary.title];\n if (summary.matcher !== undefined)\n parts.push(summary.matcher);\n if (summary.reason !== undefined)\n parts.push(`reason ${summary.reason}`);\n if (summary.additionalFailures > 0)\n parts.push(`+${summary.additionalFailures} more`);\n return parts.join(\" · \");\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import type { SealedAttemptAssertions } from "../../assertions/api.cjs";
1
2
  import type { EvalResult } from "../../types.cjs";
2
3
  import { type AgentRun, type FailureDetail } from "../types.cjs";
3
4
  import type { CurrentReusedAttemptReadback } from "../reuse-readback.cjs";
@@ -5,7 +6,7 @@ import type { CurrentReusedAttemptReadback } from "../reuse-readback.cjs";
5
6
  * Fresh results and current Record readbacks use separate projections so the
6
7
  * latter never has to impersonate an EvalResult at the feedback boundary.
7
8
  */
8
- export declare function failureDetailFromResult(result: EvalResult): FailureDetail | undefined;
9
+ export declare function failureDetailFromResult(result: EvalResult, sealed?: SealedAttemptAssertions): FailureDetail | undefined;
9
10
  /**
10
11
  * A current Record reuse remains a readback ADT all the way to display. The
11
12
  * durable source identity is exact; display derives the current short alias.
@@ -1,3 +1,4 @@
1
+ import type { SealedAttemptAssertions } from "../../assertions/api.mjs";
1
2
  import type { EvalResult } from "../../types.mjs";
2
3
  import { type AgentRun, type FailureDetail } from "../types.mjs";
3
4
  import type { CurrentReusedAttemptReadback } from "../reuse-readback.mjs";
@@ -5,7 +6,7 @@ import type { CurrentReusedAttemptReadback } from "../reuse-readback.mjs";
5
6
  * Fresh results and current Record readbacks use separate projections so the
6
7
  * latter never has to impersonate an EvalResult at the feedback boundary.
7
8
  */
8
- export declare function failureDetailFromResult(result: EvalResult): FailureDetail | undefined;
9
+ export declare function failureDetailFromResult(result: EvalResult, sealed?: SealedAttemptAssertions): FailureDetail | undefined;
9
10
  /**
10
11
  * A current Record reuse remains a readback ADT all the way to display. The
11
12
  * durable source identity is exact; display derives the current short alias.
@@ -1,3 +1,4 @@
1
+ import type { SealedAttemptAssertions } from "../../assertions/api.js";
1
2
  import type { EvalResult } from "../../types.js";
2
3
  import { type AgentRun, type FailureDetail } from "../types.js";
3
4
  import type { CurrentReusedAttemptReadback } from "../reuse-readback.js";
@@ -5,7 +6,7 @@ import type { CurrentReusedAttemptReadback } from "../reuse-readback.js";
5
6
  * Fresh results and current Record readbacks use separate projections so the
6
7
  * latter never has to impersonate an EvalResult at the feedback boundary.
7
8
  */
8
- export declare function failureDetailFromResult(result: EvalResult): FailureDetail | undefined;
9
+ export declare function failureDetailFromResult(result: EvalResult, sealed?: SealedAttemptAssertions): FailureDetail | undefined;
9
10
  /**
10
11
  * A current Record reuse remains a readback ADT all the way to display. The
11
12
  * durable source identity is exact; display derives the current short alias.
@@ -6,35 +6,24 @@ exports.loadProjectCurrent = loadProjectCurrent;
6
6
  // Record、carry、rerun 与历史结果都不进入这里;show/view/out 共用这一条入口。
7
7
  const effect_1 = require("effect");
8
8
  const identifiers_ts_1 = require("../record/codec/identifiers.cjs");
9
- const load_config_ts_1 = require("../load-config.cjs");
10
9
  const discover_ts_1 = require("./discover.cjs");
11
10
  const eval_selection_ts_1 = require("./eval-selection.cjs");
12
11
  const execution_identity_ts_1 = require("./execution-identity.cjs");
13
12
  const fingerprint_ts_1 = require("./fingerprint.cjs");
14
13
  const timeout_ts_1 = require("./timeout.cjs");
15
14
  const aggregate_ts_1 = require("../shared/aggregate.cjs");
16
- /** Project-current config loading is the only Promise boundary in this module. */
17
15
  class ProjectCurrentLoadError extends effect_1.Data.TaggedError("ProjectCurrentLoadError") {
18
16
  }
19
17
  exports.ProjectCurrentLoadError = ProjectCurrentLoadError;
20
- function loadProjectConfig(cwd, options) {
21
- return effect_1.Effect.tryPromise({
22
- try: () => (0, load_config_ts_1.loadConfigFile)(cwd, options),
23
- catch: (cause) => new ProjectCurrentLoadError({
24
- stage: "config",
25
- message: cause instanceof Error ? cause.message : String(cause),
26
- }),
27
- });
28
- }
29
18
  /**
30
19
  * Discovers and plans the current project without closing the Effect runtime.
31
20
  * CLI and view are the Promise-facing application hosts for this operation.
32
21
  */
33
- function loadProjectCurrent(cwd, options = {}) {
22
+ function loadProjectCurrent(cwd, options) {
34
23
  const discoveryOptions = { freshImport: options.freshImport };
35
24
  return effect_1.Effect.gen(function* () {
36
25
  // namespaced fresh import 是进程级 loader 边界,按顺序装载,避免三棵图并发注册互相卡住。
37
- const config = yield* loadProjectConfig(cwd, discoveryOptions);
26
+ const config = options.config;
38
27
  const evals = yield* (0, discover_ts_1.discoverEvals)(cwd, discoveryOptions);
39
28
  const experiments = yield* (0, discover_ts_1.discoverExperiments)(cwd, discoveryOptions);
40
29
  const selectors = options.experiments === undefined
@@ -1 +1 @@
1
- {"version":3,"file":"project-current.js","sourceRoot":"","sources":["project-current.ts"],"names":[],"mappings":"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","sourcesContent":["// 项目 current 的宿主编排:发现定义 → 应用 selector → 无派发 identity planning。\n// Record、carry、rerun 与历史结果都不进入这里;show/view/out 共用这一条入口。\nimport { Data, Effect, Either, Schema } from \"effect\";\nimport type { AnalysisCurrentSlotIdentity } from \"../analysis/contracts.ts\";\nimport { EvalIdSchema, ExecutionIdentityDigestSchema, ExperimentIdSchema, } from \"../record/codec/identifiers.ts\";\nimport { loadConfigFile } from \"../load-config.ts\";\nimport { discoverEvals, discoverExperiments, type DiscoveryError } from \"./discover.ts\";\nimport { resolveExperimentEvals } from \"./eval-selection.ts\";\nimport { slotExecutionIdentityDigestHex } from \"./execution-identity.ts\";\nimport { planProjectTarget, type FingerprintPlanningFailure, type ProjectTargetPlan, } from \"./fingerprint.ts\";\nimport type { ProjectCurrentTarget } from \"./project-target.ts\";\nimport type { SandboxRunPlanningError } from \"./sandbox-selection.ts\";\nimport { resolveAttemptTimeout, resolveRunTimeout } from \"./timeout.ts\";\nimport type { AgentRun, Config } from \"./types.ts\";\nimport { matchExperimentSelector } from \"../shared/aggregate.ts\";\nexport interface LoadProjectCurrentOptions {\n experiments?: string | readonly string[];\n evals?: readonly string[];\n freshImport?: boolean;\n}\nexport interface LoadedProjectCurrent {\n target: ProjectCurrentTarget;\n watchInputs: readonly string[];\n currentSlots: readonly AnalysisCurrentSlotIdentity[];\n}\n/** Project-current config loading is the only Promise boundary in this module. */\nexport class ProjectCurrentLoadError extends Data.TaggedError(\"ProjectCurrentLoadError\")<{\n readonly stage: \"config\" | \"selection\";\n readonly message: string;\n}> {\n}\nfunction loadProjectConfig(cwd: string, options: {\n freshImport?: boolean;\n}): Effect.Effect<Config, ProjectCurrentLoadError> {\n return Effect.tryPromise({\n try: () => loadConfigFile(cwd, options),\n catch: (cause) => new ProjectCurrentLoadError({\n stage: \"config\",\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n });\n}\n/**\n * Discovers and plans the current project without closing the Effect runtime.\n * CLI and view are the Promise-facing application hosts for this operation.\n */\nexport function loadProjectCurrent(cwd: string, options: LoadProjectCurrentOptions = {}): Effect.Effect<LoadedProjectCurrent, ProjectCurrentLoadError | DiscoveryError | SandboxRunPlanningError | FingerprintPlanningFailure> {\n const discoveryOptions = { freshImport: options.freshImport };\n return Effect.gen(function* () {\n // namespaced fresh import 是进程级 loader 边界,按顺序装载,避免三棵图并发注册互相卡住。\n const config = yield* loadProjectConfig(cwd, discoveryOptions);\n const evals = yield* discoverEvals(cwd, discoveryOptions);\n const experiments = yield* discoverExperiments(cwd, discoveryOptions);\n const selectors = options.experiments === undefined\n ? []\n : Array.isArray(options.experiments) ? options.experiments : [options.experiments];\n const availableExperimentIds = experiments.map((entry) => entry.id);\n const availableIds = new Set(availableExperimentIds);\n const selectedIds = new Set<string>();\n for (const selector of selectors) {\n const matches = matchExperimentSelector(availableExperimentIds, selector);\n if (matches.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Unknown current project Experiment ${JSON.stringify(selector)}.`,\n }));\n }\n for (const match of matches)\n selectedIds.add(match);\n }\n if (selectors.length === 0) {\n for (const id of availableIds)\n selectedIds.add(id);\n }\n if (selectedIds.size === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project has no Experiments to show.\",\n }));\n }\n const runs = yield* Effect.sync((): AgentRun[] => {\n const selectedRuns: AgentRun[] = [];\n for (const experiment of experiments) {\n if (!selectedIds.has(experiment.id))\n continue;\n const { selectedEvalIds } = resolveExperimentEvals({\n experimentId: experiment.id,\n selector: experiment.evals,\n cliPatterns: [...(options.evals ?? [])],\n evals,\n });\n selectedRuns.push({\n agent: experiment.agent,\n model: experiment.model,\n reasoningEffort: experiment.reasoningEffort,\n flags: experiment.flags ?? {},\n plugins: experiment.plugins,\n attempts: experiment.attempts ?? 1,\n earlyExit: experiment.earlyExit ?? false,\n sandbox: experiment.sandbox,\n sandboxReuse: experiment.sandboxReuse,\n ...(experiment.sharedState === undefined ? {} : { sharedState: experiment.sharedState }),\n judge: experiment.judge,\n ...resolveRunTimeout(undefined, experiment.timeoutMs),\n budget: experiment.budget,\n selectedEvalIds,\n experimentId: experiment.id,\n experimentBaseDir: experiment.baseDir,\n experimentSourcePath: experiment.sourcePath,\n description: experiment.description,\n labels: experiment.labels,\n maxConcurrency: experiment.maxConcurrency,\n setup: experiment.setup,\n teardown: experiment.teardown,\n classifyFailure: experiment.classifyFailure,\n });\n }\n return selectedRuns;\n });\n if (runs.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project target contains no runnable Experiments.\",\n }));\n }\n const plan: ProjectTargetPlan = yield* planProjectTarget(evals, runs, config.timeoutMs, { configJudge: config.judge });\n if (plan.target.experiments.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project target contains no Eval results to show.\",\n }));\n }\n const currentSlots = yield* currentSlotIdentities(runs, plan, config);\n return {\n target: plan.target,\n currentSlots,\n watchInputs: Object.freeze([\n ...new Set([`${cwd}/niceeval.config.ts`, ...plan.watchInputs]),\n ].sort()),\n };\n });\n}\nfunction currentSlotIdentities(runs: readonly AgentRun[], plan: ProjectTargetPlan, config: Config): Effect.Effect<readonly AnalysisCurrentSlotIdentity[], ProjectCurrentLoadError> {\n return Effect.gen(function* () {\n const slots: AnalysisCurrentSlotIdentity[] = [];\n const seen = new Set<string>();\n for (const run of runs) {\n for (const pair of plan.preparedPairsByKey.values()) {\n if (pair.run.experimentId !== run.experimentId)\n continue;\n const fingerprint = plan.plannedFingerprints.get(pair.key);\n const configHash = plan.plannedConfigHashes.get(pair.key);\n if (fingerprint === undefined || configHash === undefined) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current identity planning omitted Eval ${JSON.stringify(pair.evalDef.id)}.`,\n }));\n }\n const timeout = resolveAttemptTimeout(run, pair.evalDef, config);\n const experimentId = Schema.decodeUnknownEither(ExperimentIdSchema)(run.experimentId);\n const evalId = Schema.decodeUnknownEither(EvalIdSchema)(pair.evalDef.id);\n if (Either.isLeft(experimentId) || Either.isLeft(evalId)) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current target produced an invalid Experiment or Eval identity.`,\n }));\n }\n for (let attempt = 0; attempt < run.attempts; attempt += 1) {\n const digestValue = slotExecutionIdentityDigestHex({\n experimentId: run.experimentId,\n evalId: pair.evalDef.id,\n attempt,\n input: { domain: \"niceeval.input/fingerprint-v1\", value: fingerprint },\n config: { domain: \"niceeval.config/identity-v1\", value: configHash },\n timeout: timeout === undefined\n ? null\n : { domain: \"niceeval.execution-duration/v1\", milliseconds: timeout.timeoutMs },\n });\n const digest = Schema.decodeUnknownEither(ExecutionIdentityDigestSchema)(digestValue);\n if (Either.isLeft(digest)) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current target produced an invalid execution identity digest.`,\n }));\n }\n const key = `${experimentId.right}\\0${evalId.right}\\0${String(attempt)}\\0${digest.right}`;\n if (seen.has(key))\n continue;\n seen.add(key);\n slots.push(Object.freeze({\n experimentId: experimentId.right,\n evalId: evalId.right,\n attemptOrdinal: attempt,\n executionIdentityDigest: digest.right,\n }));\n }\n }\n }\n return Object.freeze(slots);\n });\n}\n"]}
1
+ {"version":3,"file":"project-current.js","sourceRoot":"","sources":["project-current.ts"],"names":[],"mappings":"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","sourcesContent":["// 项目 current 的宿主编排:发现定义 → 应用 selector → 无派发 identity planning。\n// Record、carry、rerun 与历史结果都不进入这里;show/view/out 共用这一条入口。\nimport { Data, Effect, Either, Schema } from \"effect\";\nimport type { AnalysisCurrentSlotIdentity } from \"../analysis/contracts.ts\";\nimport { EvalIdSchema, ExecutionIdentityDigestSchema, ExperimentIdSchema, } from \"../record/codec/identifiers.ts\";\nimport { discoverEvals, discoverExperiments, type DiscoveryError } from \"./discover.ts\";\nimport { resolveExperimentEvals } from \"./eval-selection.ts\";\nimport { slotExecutionIdentityDigestHex } from \"./execution-identity.ts\";\nimport { planProjectTarget, type FingerprintPlanningFailure, type ProjectTargetPlan, } from \"./fingerprint.ts\";\nimport type { ProjectCurrentTarget } from \"./project-target.ts\";\nimport type { SandboxRunPlanningError } from \"./sandbox-selection.ts\";\nimport { resolveAttemptTimeout, resolveRunTimeout } from \"./timeout.ts\";\nimport type { AgentRun, Config } from \"./types.ts\";\nimport { matchExperimentSelector } from \"../shared/aggregate.ts\";\nexport interface LoadProjectCurrentOptions {\n /** Project-observing application hosts resolve this before entering Runner. */\n config: Config;\n experiments?: string | readonly string[];\n evals?: readonly string[];\n freshImport?: boolean;\n}\nexport interface LoadedProjectCurrent {\n target: ProjectCurrentTarget;\n watchInputs: readonly string[];\n currentSlots: readonly AnalysisCurrentSlotIdentity[];\n}\nexport class ProjectCurrentLoadError extends Data.TaggedError(\"ProjectCurrentLoadError\")<{\n readonly stage: \"config\" | \"selection\";\n readonly message: string;\n}> {\n}\n/**\n * Discovers and plans the current project without closing the Effect runtime.\n * CLI and view are the Promise-facing application hosts for this operation.\n */\nexport function loadProjectCurrent(cwd: string, options: LoadProjectCurrentOptions): Effect.Effect<LoadedProjectCurrent, ProjectCurrentLoadError | DiscoveryError | SandboxRunPlanningError | FingerprintPlanningFailure> {\n const discoveryOptions = { freshImport: options.freshImport };\n return Effect.gen(function* () {\n // namespaced fresh import 是进程级 loader 边界,按顺序装载,避免三棵图并发注册互相卡住。\n const config = options.config;\n const evals = yield* discoverEvals(cwd, discoveryOptions);\n const experiments = yield* discoverExperiments(cwd, discoveryOptions);\n const selectors = options.experiments === undefined\n ? []\n : Array.isArray(options.experiments) ? options.experiments : [options.experiments];\n const availableExperimentIds = experiments.map((entry) => entry.id);\n const availableIds = new Set(availableExperimentIds);\n const selectedIds = new Set<string>();\n for (const selector of selectors) {\n const matches = matchExperimentSelector(availableExperimentIds, selector);\n if (matches.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Unknown current project Experiment ${JSON.stringify(selector)}.`,\n }));\n }\n for (const match of matches)\n selectedIds.add(match);\n }\n if (selectors.length === 0) {\n for (const id of availableIds)\n selectedIds.add(id);\n }\n if (selectedIds.size === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project has no Experiments to show.\",\n }));\n }\n const runs = yield* Effect.sync((): AgentRun[] => {\n const selectedRuns: AgentRun[] = [];\n for (const experiment of experiments) {\n if (!selectedIds.has(experiment.id))\n continue;\n const { selectedEvalIds } = resolveExperimentEvals({\n experimentId: experiment.id,\n selector: experiment.evals,\n cliPatterns: [...(options.evals ?? [])],\n evals,\n });\n selectedRuns.push({\n agent: experiment.agent,\n model: experiment.model,\n reasoningEffort: experiment.reasoningEffort,\n flags: experiment.flags ?? {},\n plugins: experiment.plugins,\n attempts: experiment.attempts ?? 1,\n earlyExit: experiment.earlyExit ?? false,\n sandbox: experiment.sandbox,\n sandboxReuse: experiment.sandboxReuse,\n ...(experiment.sharedState === undefined ? {} : { sharedState: experiment.sharedState }),\n judge: experiment.judge,\n ...resolveRunTimeout(undefined, experiment.timeoutMs),\n budget: experiment.budget,\n selectedEvalIds,\n experimentId: experiment.id,\n experimentBaseDir: experiment.baseDir,\n experimentSourcePath: experiment.sourcePath,\n description: experiment.description,\n labels: experiment.labels,\n maxConcurrency: experiment.maxConcurrency,\n setup: experiment.setup,\n teardown: experiment.teardown,\n classifyFailure: experiment.classifyFailure,\n });\n }\n return selectedRuns;\n });\n if (runs.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project target contains no runnable Experiments.\",\n }));\n }\n const plan: ProjectTargetPlan = yield* planProjectTarget(evals, runs, config.timeoutMs, { configJudge: config.judge });\n if (plan.target.experiments.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project target contains no Eval results to show.\",\n }));\n }\n const currentSlots = yield* currentSlotIdentities(runs, plan, config);\n return {\n target: plan.target,\n currentSlots,\n watchInputs: Object.freeze([\n ...new Set([`${cwd}/niceeval.config.ts`, ...plan.watchInputs]),\n ].sort()),\n };\n });\n}\nfunction currentSlotIdentities(runs: readonly AgentRun[], plan: ProjectTargetPlan, config: Config): Effect.Effect<readonly AnalysisCurrentSlotIdentity[], ProjectCurrentLoadError> {\n return Effect.gen(function* () {\n const slots: AnalysisCurrentSlotIdentity[] = [];\n const seen = new Set<string>();\n for (const run of runs) {\n for (const pair of plan.preparedPairsByKey.values()) {\n if (pair.run.experimentId !== run.experimentId)\n continue;\n const fingerprint = plan.plannedFingerprints.get(pair.key);\n const configHash = plan.plannedConfigHashes.get(pair.key);\n if (fingerprint === undefined || configHash === undefined) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current identity planning omitted Eval ${JSON.stringify(pair.evalDef.id)}.`,\n }));\n }\n const timeout = resolveAttemptTimeout(run, pair.evalDef, config);\n const experimentId = Schema.decodeUnknownEither(ExperimentIdSchema)(run.experimentId);\n const evalId = Schema.decodeUnknownEither(EvalIdSchema)(pair.evalDef.id);\n if (Either.isLeft(experimentId) || Either.isLeft(evalId)) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current target produced an invalid Experiment or Eval identity.`,\n }));\n }\n for (let attempt = 0; attempt < run.attempts; attempt += 1) {\n const digestValue = slotExecutionIdentityDigestHex({\n experimentId: run.experimentId,\n evalId: pair.evalDef.id,\n attempt,\n input: { domain: \"niceeval.input/fingerprint-v1\", value: fingerprint },\n config: { domain: \"niceeval.config/identity-v1\", value: configHash },\n timeout: timeout === undefined\n ? null\n : { domain: \"niceeval.execution-duration/v1\", milliseconds: timeout.timeoutMs },\n });\n const digest = Schema.decodeUnknownEither(ExecutionIdentityDigestSchema)(digestValue);\n if (Either.isLeft(digest)) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current target produced an invalid execution identity digest.`,\n }));\n }\n const key = `${experimentId.right}\\0${evalId.right}\\0${String(attempt)}\\0${digest.right}`;\n if (seen.has(key))\n continue;\n seen.add(key);\n slots.push(Object.freeze({\n experimentId: experimentId.right,\n evalId: evalId.right,\n attemptOrdinal: attempt,\n executionIdentityDigest: digest.right,\n }));\n }\n }\n }\n return Object.freeze(slots);\n });\n}\n"]}
@@ -4,7 +4,10 @@ import { type DiscoveryError } from "./discover.cjs";
4
4
  import { type FingerprintPlanningFailure } from "./fingerprint.cjs";
5
5
  import type { ProjectCurrentTarget } from "./project-target.cjs";
6
6
  import type { SandboxRunPlanningError } from "./sandbox-selection.cjs";
7
+ import type { Config } from "./types.cjs";
7
8
  export interface LoadProjectCurrentOptions {
9
+ /** Project-observing application hosts resolve this before entering Runner. */
10
+ config: Config;
8
11
  experiments?: string | readonly string[];
9
12
  evals?: readonly string[];
10
13
  freshImport?: boolean;
@@ -17,7 +20,6 @@ export interface LoadedProjectCurrent {
17
20
  declare const ProjectCurrentLoadError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
18
21
  readonly _tag: "ProjectCurrentLoadError";
19
22
  } & Readonly<A>;
20
- /** Project-current config loading is the only Promise boundary in this module. */
21
23
  export declare class ProjectCurrentLoadError extends ProjectCurrentLoadError_base<{
22
24
  readonly stage: "config" | "selection";
23
25
  readonly message: string;
@@ -27,5 +29,5 @@ export declare class ProjectCurrentLoadError extends ProjectCurrentLoadError_bas
27
29
  * Discovers and plans the current project without closing the Effect runtime.
28
30
  * CLI and view are the Promise-facing application hosts for this operation.
29
31
  */
30
- export declare function loadProjectCurrent(cwd: string, options?: LoadProjectCurrentOptions): Effect.Effect<LoadedProjectCurrent, ProjectCurrentLoadError | DiscoveryError | SandboxRunPlanningError | FingerprintPlanningFailure>;
32
+ export declare function loadProjectCurrent(cwd: string, options: LoadProjectCurrentOptions): Effect.Effect<LoadedProjectCurrent, ProjectCurrentLoadError | DiscoveryError | SandboxRunPlanningError | FingerprintPlanningFailure>;
31
33
  export {};
@@ -4,7 +4,10 @@ import { type DiscoveryError } from "./discover.mjs";
4
4
  import { type FingerprintPlanningFailure } from "./fingerprint.mjs";
5
5
  import type { ProjectCurrentTarget } from "./project-target.mjs";
6
6
  import type { SandboxRunPlanningError } from "./sandbox-selection.mjs";
7
+ import type { Config } from "./types.mjs";
7
8
  export interface LoadProjectCurrentOptions {
9
+ /** Project-observing application hosts resolve this before entering Runner. */
10
+ config: Config;
8
11
  experiments?: string | readonly string[];
9
12
  evals?: readonly string[];
10
13
  freshImport?: boolean;
@@ -17,7 +20,6 @@ export interface LoadedProjectCurrent {
17
20
  declare const ProjectCurrentLoadError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
18
21
  readonly _tag: "ProjectCurrentLoadError";
19
22
  } & Readonly<A>;
20
- /** Project-current config loading is the only Promise boundary in this module. */
21
23
  export declare class ProjectCurrentLoadError extends ProjectCurrentLoadError_base<{
22
24
  readonly stage: "config" | "selection";
23
25
  readonly message: string;
@@ -27,5 +29,5 @@ export declare class ProjectCurrentLoadError extends ProjectCurrentLoadError_bas
27
29
  * Discovers and plans the current project without closing the Effect runtime.
28
30
  * CLI and view are the Promise-facing application hosts for this operation.
29
31
  */
30
- export declare function loadProjectCurrent(cwd: string, options?: LoadProjectCurrentOptions): Effect.Effect<LoadedProjectCurrent, ProjectCurrentLoadError | DiscoveryError | SandboxRunPlanningError | FingerprintPlanningFailure>;
32
+ export declare function loadProjectCurrent(cwd: string, options: LoadProjectCurrentOptions): Effect.Effect<LoadedProjectCurrent, ProjectCurrentLoadError | DiscoveryError | SandboxRunPlanningError | FingerprintPlanningFailure>;
31
33
  export {};
@@ -4,7 +4,10 @@ import { type DiscoveryError } from "./discover.js";
4
4
  import { type FingerprintPlanningFailure } from "./fingerprint.js";
5
5
  import type { ProjectCurrentTarget } from "./project-target.js";
6
6
  import type { SandboxRunPlanningError } from "./sandbox-selection.js";
7
+ import type { Config } from "./types.js";
7
8
  export interface LoadProjectCurrentOptions {
9
+ /** Project-observing application hosts resolve this before entering Runner. */
10
+ config: Config;
8
11
  experiments?: string | readonly string[];
9
12
  evals?: readonly string[];
10
13
  freshImport?: boolean;
@@ -17,7 +20,6 @@ export interface LoadedProjectCurrent {
17
20
  declare const ProjectCurrentLoadError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
18
21
  readonly _tag: "ProjectCurrentLoadError";
19
22
  } & Readonly<A>;
20
- /** Project-current config loading is the only Promise boundary in this module. */
21
23
  export declare class ProjectCurrentLoadError extends ProjectCurrentLoadError_base<{
22
24
  readonly stage: "config" | "selection";
23
25
  readonly message: string;
@@ -27,5 +29,5 @@ export declare class ProjectCurrentLoadError extends ProjectCurrentLoadError_bas
27
29
  * Discovers and plans the current project without closing the Effect runtime.
28
30
  * CLI and view are the Promise-facing application hosts for this operation.
29
31
  */
30
- export declare function loadProjectCurrent(cwd: string, options?: LoadProjectCurrentOptions): Effect.Effect<LoadedProjectCurrent, ProjectCurrentLoadError | DiscoveryError | SandboxRunPlanningError | FingerprintPlanningFailure>;
32
+ export declare function loadProjectCurrent(cwd: string, options: LoadProjectCurrentOptions): Effect.Effect<LoadedProjectCurrent, ProjectCurrentLoadError | DiscoveryError | SandboxRunPlanningError | FingerprintPlanningFailure>;
31
33
  export {};
@@ -174,14 +174,14 @@ function assertionMetadata(entries) {
174
174
  const metadata = [];
175
175
  for (const entry of entries) {
176
176
  const display = entry.entry.display;
177
- const result = entry.entry.result;
177
+ const decision = entry.entry.decision;
178
178
  const item = {
179
179
  entryId: entry.entry.entryId,
180
180
  groupPath: [...display.groupPath],
181
- outcome: entry.state === "available" ? result.state : entry.state,
182
- coverage: coverageMetadata(entry.entry.coverage),
183
- limitations: entry.entry.limitations.map(limitationMetadata),
184
- scoreContribution: scoreContributionMetadata(result.score),
181
+ outcome: entry.state === "available" ? decision.result : entry.state,
182
+ coverage: coverageMetadata(entry.entry.materials.coverage),
183
+ limitations: entry.entry.materials.limitations.map(limitationMetadata),
184
+ scoreContribution: scoreContributionMetadata(entry.entry.contribution),
185
185
  };
186
186
  if (display.label !== undefined)
187
187
  item.label = display.label;
@@ -197,14 +197,14 @@ function assertionMetadata(entries) {
197
197
  function assertionReason(entry) {
198
198
  if (entry.state !== "available")
199
199
  return entry.reason;
200
- switch (entry.entry.result.state) {
200
+ switch (entry.entry.decision.result) {
201
201
  case "matched":
202
202
  return undefined;
203
203
  case "mismatched":
204
204
  case "unavailable":
205
205
  case "errored":
206
206
  case "not-applicable":
207
- return entry.entry.result.reason;
207
+ return entry.entry.decision.reason ?? undefined;
208
208
  }
209
209
  }
210
210
  function coverageMetadata(coverage) {
@@ -1 +1 @@
1
- {"version":3,"file":"braintrust.js","sourceRoot":"","sources":["braintrust.ts"],"names":[],"mappings":"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","sourcesContent":["// Braintrust 报告器:把一次 niceeval 运行作为一个 Braintrust experiment 上报,\n// 每个 attempt 一行(scores = 断言,metrics = 时长/token/成本),跨提交比较与团队共享。\n// `braintrust` 是可选依赖:动态 import,装了才用得上,没装在 onInvocationStart 报错\n// (reporter 错误按框架约定只记 diagnostic,不会让运行崩)。\nimport type { EvalResult, JsonValue, Reporter } from \"../../types.ts\";\nimport type { AssertionCoverage, AssertionEntryRead, AssertionLimitation, AssertionsProjection, ScoreContribution, } from \"../../assertions/record/model.ts\";\nimport type { ScoreProjection } from \"../../eval/record/score.ts\";\n/** Closed assessment rows; this reporter does not reopen Record. */\ntype AttemptSlotProjectedEntry<Value> = {\n readonly state: \"excluded\" | \"not-recorded\" | \"core-invalid\";\n} | {\n readonly state: \"attachment-result\";\n readonly attachment: {\n readonly state: \"available\";\n readonly value: Value;\n } | {\n readonly state: \"unavailable\" | \"unsupported\" | \"invalid\";\n } | {\n readonly state: \"migration-required\";\n readonly from: string;\n readonly to: string;\n readonly command?: string;\n };\n};\nimport type { Verdict } from \"../../shared/types.ts\";\nimport { reportActivity } from \"../feedback/sink.ts\";\nexport interface BraintrustConfig {\n /** Braintrust 项目名;省略时用 \"niceeval\"。 */\n project?: string;\n /** Braintrust 项目 id;与 project 给一个即可。 */\n projectId?: string;\n /** 实验名;省略时由 Braintrust 自动命名。 */\n experiment?: string;\n /** 作为对比基线(diff base)的既有实验名。 */\n baseExperiment?: string;\n /** 作为对比基线(diff base)的既有实验 id。 */\n baseExperimentId?: string;\n /** true = 更新同名既有实验,而不是新建一个。 */\n update?: boolean;\n /** 实验级附加 metadata;与 niceeval 自动写入的字段合并,同名以这里为准。 */\n metadata?: globalThis.Record<string, JsonValue>;\n /** API key;省略时 SDK 读 BRAINTRUST_API_KEY 环境变量。 */\n apiKey?: string;\n}\n/**\n * Braintrust SDK 的最小类型面。本地声明是为了不把 `braintrust` 变成编译期依赖;\n * 动态 import 后按这个形状断言。\n */\ninterface BraintrustSdk {\n // SDK 里 init 同步返回(登录与建实验都是惰性的);统一 await,同步/异步都兼容。\n init(options: {\n project?: string;\n projectId?: string;\n experiment?: string;\n baseExperiment?: string;\n baseExperimentId?: string;\n update?: boolean;\n apiKey?: string;\n metadata?: globalThis.Record<string, JsonValue>;\n setCurrent?: boolean;\n }): BraintrustExperiment | Promise<BraintrustExperiment>;\n flush(): Promise<void>;\n}\ninterface BraintrustExperiment {\n log(event: BraintrustLogEvent): void;\n summarize(): Promise<{\n experimentUrl?: string;\n }>;\n}\nexport interface BraintrustLogEvent {\n id?: string;\n input?: string;\n output?: string;\n error?: EvalResult[\"error\"];\n scores?: globalThis.Record<string, number>;\n metadata?: globalThis.Record<string, JsonValue>;\n metrics?: globalThis.Record<string, number>;\n}\n/**\n * A post-Record Projection calculation supplies this optional assessment. The\n * live Reporter callback currently has no RecordProjection input, so its\n * absence is represented explicitly rather than as a made-up Attachment read.\n */\nexport type BraintrustAssessment = {\n readonly state: \"projected\";\n /** Exact Report-style public projections, including every data state. */\n readonly assertions: AttemptSlotProjectedEntry<AssertionsProjection<unknown>>;\n readonly verdict: AttemptSlotProjectedEntry<Verdict>;\n readonly score?: AttemptSlotProjectedEntry<ScoreProjection>;\n} | {\n readonly state: \"not-projected\";\n readonly reason: \"reporter-contract-does-not-provide-record-projections\";\n};\nconst NOT_PROJECTED_ASSESSMENT: BraintrustAssessment = Object.freeze({\n state: \"not-projected\" as const,\n reason: \"reporter-contract-does-not-provide-record-projections\" as const,\n});\n/**\n * 创建 Braintrust 报告器。挂在 `defineConfig({ reporters })` 上观测整次运行,\n * 或挂在单个 eval 的 `reporters` 上只观测它(同一实例被多个 eval 引用时共享一个实验)。\n */\nexport function Braintrust(config: BraintrustConfig = {}): Reporter {\n let sdk: BraintrustSdk | undefined;\n let experiment: BraintrustExperiment | undefined;\n return {\n async onInvocationStart(evals) {\n sdk = await loadBraintrustSdk();\n experiment = await sdk.init({\n project: config.projectId ? undefined : (config.project ?? \"niceeval\"),\n projectId: config.projectId,\n experiment: config.experiment,\n baseExperiment: config.baseExperiment,\n baseExperimentId: config.baseExperimentId,\n update: config.update,\n apiKey: config.apiKey,\n // 不再写顶层单一 agent:一次 Invocation 可能横跨多个 (agent, model, flags) 配置,\n // 启动时还没有任何结果,写一个必然只代表其中一份配置的值就是撒谎(见\n // docs/runner.md「Reporter 与运行器事件」)。每行自己的 agent 身份仍在\n // toBraintrustEvent() 的 metadata.agent 里,逐 attempt 精确;跨行的 agent 集合可以\n // 从 Braintrust 自己按 metadata.agent 分组得到,不需要实验级再存一份。\n metadata: {\n evals: evals.map((e) => e.id),\n ...config.metadata,\n },\n // 不设为全局 current experiment,避免污染用户代码里的 braintrust 全局态。\n setCurrent: false,\n });\n },\n onEvalComplete(result) {\n experiment?.log(toBraintrustEvent(result, NOT_PROJECTED_ASSESSMENT));\n },\n async onInvocationComplete() {\n if (!experiment)\n return;\n try {\n await sdk?.flush();\n const summary = await experiment.summarize();\n if (summary.experimentUrl) {\n reportActivity(`Braintrust experiment: ${summary.experimentUrl}`);\n }\n }\n finally {\n experiment = undefined;\n sdk = undefined;\n }\n },\n };\n}\n/**\n * EvalResult identity/transport data plus an optional post-Record assessment\n * become one Braintrust row. Assertions, Verdict, and Score only enter through\n * that assessment's public Attachment projections; this function never reads\n * a historical result graph.\n */\nexport function toBraintrustEvent(result: EvalResult, assessment: BraintrustAssessment = NOT_PROJECTED_ASSESSMENT): BraintrustLogEvent {\n const projectedVerdict = assessment.state === \"projected\"\n ? availableProjectionValue(assessment.verdict)\n : undefined;\n const verdict = projectedVerdict ?? result.verdict;\n const metrics: globalThis.Record<string, number> = {};\n if (result.startedAt) {\n const start = Date.parse(result.startedAt) / 1000;\n if (Number.isFinite(start)) {\n metrics.start = start;\n metrics.end = start + result.durationMs / 1000;\n }\n }\n if (result.usage) {\n const { inputTokens, outputTokens, cacheReadTokens, cacheCreationTokens, reasoningTokens, requests } = result.usage;\n if (inputTokens !== undefined)\n metrics.prompt_tokens = inputTokens;\n if (outputTokens !== undefined)\n metrics.completion_tokens = outputTokens;\n if (inputTokens !== undefined && outputTokens !== undefined)\n metrics.tokens = inputTokens + outputTokens;\n if (cacheReadTokens !== undefined)\n metrics.cache_read_tokens = cacheReadTokens;\n if (cacheCreationTokens !== undefined)\n metrics.cache_creation_tokens = cacheCreationTokens;\n if (reasoningTokens !== undefined)\n metrics.reasoning_tokens = reasoningTokens;\n if (requests !== undefined)\n metrics.requests = requests;\n }\n // estimated_cost_usd 恒为价目表估算(EvalResult.estimatedCostUSD,见 estimateCost);\n // observed 成本单独留在 result.usage.costUSD,不混入本指标。\n if (result.estimatedCostUSD !== undefined)\n metrics.estimated_cost_usd = result.estimatedCostUSD;\n const metadata: globalThis.Record<string, JsonValue> = {\n eval: result.id,\n agent: result.agent,\n attempt: result.attempt,\n verdict,\n status: verdict,\n evaluationAlgorithm: result.evaluationAlgorithm,\n evaluationKind: result.evaluationKind,\n assessmentProjection: assessment.state,\n };\n const scores: globalThis.Record<string, number> = {};\n if (assessment.state === \"projected\") {\n metadata.assertions = projectionMetadata(assessment.assertions, (assertions) => ({ entries: assertionMetadata(assertions.entries) }));\n metadata.verdictProjection = projectionMetadata(assessment.verdict, (value) => ({ value }));\n if (assessment.score !== undefined) {\n metadata.score = projectionMetadata(assessment.score, scoreMetadata);\n const score = availableProjectionValue(assessment.score);\n if (score?.state === \"complete\")\n scores[\"niceeval:score\"] = score.earned;\n }\n }\n else {\n metadata.assessmentProjectionReason = assessment.reason;\n }\n if (result.model !== undefined)\n metadata.model = result.model;\n if (result.experimentId !== undefined)\n metadata.experiment = result.experimentId;\n if (result.experiment?.flags && Object.keys(result.experiment.flags).length > 0) {\n metadata.flags = result.experiment.flags;\n }\n if (result.skipReason !== undefined)\n metadata.skipReason = result.skipReason;\n // 一次运行内 (experiment, eval, agent, model, attempt) 唯一;Braintrust 按 id 合并重复行。\n const id = [result.experimentId ?? \"\", result.id, result.agent, result.model ?? \"\", `a${result.attempt}`].join(\"|\");\n return {\n id,\n input: result.description ?? result.id,\n output: lastAssistantText(result.events),\n error: result.error,\n metadata,\n metrics,\n ...(Object.keys(scores).length > 0 ? { scores } : {}),\n };\n}\nfunction availableProjectionValue<Value>(entry: AttemptSlotProjectedEntry<Value>): Value | undefined {\n return entry.state === \"attachment-result\" && entry.attachment.state === \"available\"\n ? entry.attachment.value\n : undefined;\n}\nfunction projectionMetadata<Value>(entry: AttemptSlotProjectedEntry<Value>, available: (value: Value) => globalThis.Record<string, JsonValue>): JsonValue {\n if (entry.state !== \"attachment-result\") {\n return { state: entry.state };\n }\n switch (entry.attachment.state) {\n case \"available\":\n return { state: \"available\", ...available(entry.attachment.value) };\n case \"unavailable\":\n return { state: \"unavailable\" };\n case \"migration-required\":\n return {\n state: \"migration-required\",\n from: entry.attachment.from,\n to: entry.attachment.to,\n ...(entry.attachment.command === undefined ? {} : { command: entry.attachment.command }),\n };\n case \"unsupported\":\n case \"invalid\":\n return { state: entry.attachment.state };\n }\n}\nfunction assertionMetadata(entries: readonly AssertionEntryRead<unknown>[]): JsonValue {\n const metadata: JsonValue[] = [];\n for (const entry of entries) {\n const display = entry.entry.display;\n const result = entry.entry.result;\n const item: globalThis.Record<string, JsonValue> = {\n entryId: entry.entry.entryId,\n groupPath: [...display.groupPath],\n outcome: entry.state === \"available\" ? result.state : entry.state,\n coverage: coverageMetadata(entry.entry.coverage),\n limitations: entry.entry.limitations.map(limitationMetadata),\n scoreContribution: scoreContributionMetadata(result.score),\n };\n if (display.label !== undefined)\n item.label = display.label;\n if (display.key !== undefined)\n item.key = display.key;\n const reason = assertionReason(entry);\n if (reason !== undefined)\n item.reason = reason;\n metadata.push(item);\n }\n return metadata;\n}\nfunction assertionReason(entry: AssertionEntryRead<unknown>): string | undefined {\n if (entry.state !== \"available\")\n return entry.reason;\n switch (entry.entry.result.state) {\n case \"matched\":\n return undefined;\n case \"mismatched\":\n case \"unavailable\":\n case \"errored\":\n case \"not-applicable\":\n return entry.entry.result.reason;\n }\n}\nfunction coverageMetadata(coverage: AssertionCoverage): globalThis.Record<string, JsonValue> {\n const metadata: globalThis.Record<string, JsonValue> = { state: coverage.state };\n if (coverage.state !== \"complete\")\n metadata.reason = coverage.reason;\n return metadata;\n}\nfunction limitationMetadata(limitation: AssertionLimitation): globalThis.Record<string, JsonValue> {\n switch (limitation.kind) {\n case \"redacted\":\n return { kind: limitation.kind, fieldCount: limitation.fieldCount };\n case \"sampled\":\n return {\n kind: limitation.kind,\n captured: limitation.captured,\n ...(limitation.knownTotal === undefined ? {} : { knownTotal: limitation.knownTotal }),\n };\n case \"truncated\":\n return { kind: limitation.kind, omittedBytes: limitation.omittedBytes };\n case \"provider-limited\":\n return { kind: limitation.kind };\n }\n}\nfunction scoreContributionMetadata(contribution: ScoreContribution): globalThis.Record<string, JsonValue> {\n switch (contribution.state) {\n case \"not-scored\":\n return { state: contribution.state };\n case \"earned\":\n return {\n state: contribution.state,\n points: contribution.points,\n earned: contribution.earned,\n };\n case \"unavailable\":\n return {\n state: contribution.state,\n points: contribution.points,\n reason: contribution.reason,\n };\n }\n}\nfunction scoreMetadata(score: ScoreProjection): globalThis.Record<string, JsonValue> {\n switch (score.state) {\n case \"complete\":\n return { state: score.state, earned: score.earned, comparable: score.comparable };\n case \"partial\":\n return {\n state: score.state,\n earned: score.earned,\n reasons: [...score.reasons],\n comparable: score.comparable,\n };\n case \"unavailable\":\n return {\n state: score.state,\n reasons: [...score.reasons],\n comparable: score.comparable,\n };\n }\n}\n/** agent 的最终回复文本(事件流里最后一条 assistant message);没有就不填。 */\nfunction lastAssistantText(events: EvalResult[\"events\"]): string | undefined {\n if (!events)\n return undefined;\n for (let i = events.length - 1; i >= 0; i--) {\n const e = events[i];\n if (e.type === \"message\" && e.role === \"assistant\")\n return e.text;\n }\n return undefined;\n}\n/** 动态 import 说明:specifier 放变量里,`braintrust` 不进编译期依赖,没装也能 typecheck。 */\nconst BRAINTRUST_PACKAGE = \"braintrust\";\nasync function loadBraintrustSdk(): Promise<BraintrustSdk> {\n try {\n return (await __niceevalDynamicImport(BRAINTRUST_PACKAGE)) as unknown as BraintrustSdk;\n }\n catch {\n throw new Error(\"The 'braintrust' package is required for the Braintrust reporter but was not found. Install it with: npm install braintrust (and set BRAINTRUST_API_KEY).\");\n }\n}\n"]}
1
+ {"version":3,"file":"braintrust.js","sourceRoot":"","sources":["braintrust.ts"],"names":[],"mappings":"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","sourcesContent":["// Braintrust 报告器:把一次 niceeval 运行作为一个 Braintrust experiment 上报,\n// 每个 attempt 一行(scores = 断言,metrics = 时长/token/成本),跨提交比较与团队共享。\n// `braintrust` 是可选依赖:动态 import,装了才用得上,没装在 onInvocationStart 报错\n// (reporter 错误按框架约定只记 diagnostic,不会让运行崩)。\nimport type { EvalResult, JsonValue, Reporter } from \"../../types.ts\";\nimport type { AssertionCoverage, AssertionEntryRead, AssertionLimitation, AssertionsProjection, ScoreContribution, } from \"../../assertions/record/model.ts\";\nimport type { ScoreProjection } from \"../../eval/record/score.ts\";\n/** Closed assessment rows; this reporter does not reopen Record. */\ntype AttemptSlotProjectedEntry<Value> = {\n readonly state: \"excluded\" | \"not-recorded\" | \"core-invalid\";\n} | {\n readonly state: \"attachment-result\";\n readonly attachment: {\n readonly state: \"available\";\n readonly value: Value;\n } | {\n readonly state: \"unavailable\" | \"unsupported\" | \"invalid\";\n } | {\n readonly state: \"migration-required\";\n readonly from: string;\n readonly to: string;\n readonly command?: string;\n };\n};\nimport type { Verdict } from \"../../shared/types.ts\";\nimport { reportActivity } from \"../feedback/sink.ts\";\nexport interface BraintrustConfig {\n /** Braintrust 项目名;省略时用 \"niceeval\"。 */\n project?: string;\n /** Braintrust 项目 id;与 project 给一个即可。 */\n projectId?: string;\n /** 实验名;省略时由 Braintrust 自动命名。 */\n experiment?: string;\n /** 作为对比基线(diff base)的既有实验名。 */\n baseExperiment?: string;\n /** 作为对比基线(diff base)的既有实验 id。 */\n baseExperimentId?: string;\n /** true = 更新同名既有实验,而不是新建一个。 */\n update?: boolean;\n /** 实验级附加 metadata;与 niceeval 自动写入的字段合并,同名以这里为准。 */\n metadata?: globalThis.Record<string, JsonValue>;\n /** API key;省略时 SDK 读 BRAINTRUST_API_KEY 环境变量。 */\n apiKey?: string;\n}\n/**\n * Braintrust SDK 的最小类型面。本地声明是为了不把 `braintrust` 变成编译期依赖;\n * 动态 import 后按这个形状断言。\n */\ninterface BraintrustSdk {\n // SDK 里 init 同步返回(登录与建实验都是惰性的);统一 await,同步/异步都兼容。\n init(options: {\n project?: string;\n projectId?: string;\n experiment?: string;\n baseExperiment?: string;\n baseExperimentId?: string;\n update?: boolean;\n apiKey?: string;\n metadata?: globalThis.Record<string, JsonValue>;\n setCurrent?: boolean;\n }): BraintrustExperiment | Promise<BraintrustExperiment>;\n flush(): Promise<void>;\n}\ninterface BraintrustExperiment {\n log(event: BraintrustLogEvent): void;\n summarize(): Promise<{\n experimentUrl?: string;\n }>;\n}\nexport interface BraintrustLogEvent {\n id?: string;\n input?: string;\n output?: string;\n error?: EvalResult[\"error\"];\n scores?: globalThis.Record<string, number>;\n metadata?: globalThis.Record<string, JsonValue>;\n metrics?: globalThis.Record<string, number>;\n}\n/**\n * A post-Record Projection calculation supplies this optional assessment. The\n * live Reporter callback currently has no RecordProjection input, so its\n * absence is represented explicitly rather than as a made-up Attachment read.\n */\nexport type BraintrustAssessment = {\n readonly state: \"projected\";\n /** Exact Report-style public projections, including every data state. */\n readonly assertions: AttemptSlotProjectedEntry<AssertionsProjection<unknown>>;\n readonly verdict: AttemptSlotProjectedEntry<Verdict>;\n readonly score?: AttemptSlotProjectedEntry<ScoreProjection>;\n} | {\n readonly state: \"not-projected\";\n readonly reason: \"reporter-contract-does-not-provide-record-projections\";\n};\nconst NOT_PROJECTED_ASSESSMENT: BraintrustAssessment = Object.freeze({\n state: \"not-projected\" as const,\n reason: \"reporter-contract-does-not-provide-record-projections\" as const,\n});\n/**\n * 创建 Braintrust 报告器。挂在 `defineConfig({ reporters })` 上观测整次运行,\n * 或挂在单个 eval 的 `reporters` 上只观测它(同一实例被多个 eval 引用时共享一个实验)。\n */\nexport function Braintrust(config: BraintrustConfig = {}): Reporter {\n let sdk: BraintrustSdk | undefined;\n let experiment: BraintrustExperiment | undefined;\n return {\n async onInvocationStart(evals) {\n sdk = await loadBraintrustSdk();\n experiment = await sdk.init({\n project: config.projectId ? undefined : (config.project ?? \"niceeval\"),\n projectId: config.projectId,\n experiment: config.experiment,\n baseExperiment: config.baseExperiment,\n baseExperimentId: config.baseExperimentId,\n update: config.update,\n apiKey: config.apiKey,\n // 不再写顶层单一 agent:一次 Invocation 可能横跨多个 (agent, model, flags) 配置,\n // 启动时还没有任何结果,写一个必然只代表其中一份配置的值就是撒谎(见\n // docs/runner.md「Reporter 与运行器事件」)。每行自己的 agent 身份仍在\n // toBraintrustEvent() 的 metadata.agent 里,逐 attempt 精确;跨行的 agent 集合可以\n // 从 Braintrust 自己按 metadata.agent 分组得到,不需要实验级再存一份。\n metadata: {\n evals: evals.map((e) => e.id),\n ...config.metadata,\n },\n // 不设为全局 current experiment,避免污染用户代码里的 braintrust 全局态。\n setCurrent: false,\n });\n },\n onEvalComplete(result) {\n experiment?.log(toBraintrustEvent(result, NOT_PROJECTED_ASSESSMENT));\n },\n async onInvocationComplete() {\n if (!experiment)\n return;\n try {\n await sdk?.flush();\n const summary = await experiment.summarize();\n if (summary.experimentUrl) {\n reportActivity(`Braintrust experiment: ${summary.experimentUrl}`);\n }\n }\n finally {\n experiment = undefined;\n sdk = undefined;\n }\n },\n };\n}\n/**\n * EvalResult identity/transport data plus an optional post-Record assessment\n * become one Braintrust row. Assertions, Verdict, and Score only enter through\n * that assessment's public Attachment projections; this function never reads\n * a historical result graph.\n */\nexport function toBraintrustEvent(result: EvalResult, assessment: BraintrustAssessment = NOT_PROJECTED_ASSESSMENT): BraintrustLogEvent {\n const projectedVerdict = assessment.state === \"projected\"\n ? availableProjectionValue(assessment.verdict)\n : undefined;\n const verdict = projectedVerdict ?? result.verdict;\n const metrics: globalThis.Record<string, number> = {};\n if (result.startedAt) {\n const start = Date.parse(result.startedAt) / 1000;\n if (Number.isFinite(start)) {\n metrics.start = start;\n metrics.end = start + result.durationMs / 1000;\n }\n }\n if (result.usage) {\n const { inputTokens, outputTokens, cacheReadTokens, cacheCreationTokens, reasoningTokens, requests } = result.usage;\n if (inputTokens !== undefined)\n metrics.prompt_tokens = inputTokens;\n if (outputTokens !== undefined)\n metrics.completion_tokens = outputTokens;\n if (inputTokens !== undefined && outputTokens !== undefined)\n metrics.tokens = inputTokens + outputTokens;\n if (cacheReadTokens !== undefined)\n metrics.cache_read_tokens = cacheReadTokens;\n if (cacheCreationTokens !== undefined)\n metrics.cache_creation_tokens = cacheCreationTokens;\n if (reasoningTokens !== undefined)\n metrics.reasoning_tokens = reasoningTokens;\n if (requests !== undefined)\n metrics.requests = requests;\n }\n // estimated_cost_usd 恒为价目表估算(EvalResult.estimatedCostUSD,见 estimateCost);\n // observed 成本单独留在 result.usage.costUSD,不混入本指标。\n if (result.estimatedCostUSD !== undefined)\n metrics.estimated_cost_usd = result.estimatedCostUSD;\n const metadata: globalThis.Record<string, JsonValue> = {\n eval: result.id,\n agent: result.agent,\n attempt: result.attempt,\n verdict,\n status: verdict,\n evaluationAlgorithm: result.evaluationAlgorithm,\n evaluationKind: result.evaluationKind,\n assessmentProjection: assessment.state,\n };\n const scores: globalThis.Record<string, number> = {};\n if (assessment.state === \"projected\") {\n metadata.assertions = projectionMetadata(assessment.assertions, (assertions) => ({ entries: assertionMetadata(assertions.entries) }));\n metadata.verdictProjection = projectionMetadata(assessment.verdict, (value) => ({ value }));\n if (assessment.score !== undefined) {\n metadata.score = projectionMetadata(assessment.score, scoreMetadata);\n const score = availableProjectionValue(assessment.score);\n if (score?.state === \"complete\")\n scores[\"niceeval:score\"] = score.earned;\n }\n }\n else {\n metadata.assessmentProjectionReason = assessment.reason;\n }\n if (result.model !== undefined)\n metadata.model = result.model;\n if (result.experimentId !== undefined)\n metadata.experiment = result.experimentId;\n if (result.experiment?.flags && Object.keys(result.experiment.flags).length > 0) {\n metadata.flags = result.experiment.flags;\n }\n if (result.skipReason !== undefined)\n metadata.skipReason = result.skipReason;\n // 一次运行内 (experiment, eval, agent, model, attempt) 唯一;Braintrust 按 id 合并重复行。\n const id = [result.experimentId ?? \"\", result.id, result.agent, result.model ?? \"\", `a${result.attempt}`].join(\"|\");\n return {\n id,\n input: result.description ?? result.id,\n output: lastAssistantText(result.events),\n error: result.error,\n metadata,\n metrics,\n ...(Object.keys(scores).length > 0 ? { scores } : {}),\n };\n}\nfunction availableProjectionValue<Value>(entry: AttemptSlotProjectedEntry<Value>): Value | undefined {\n return entry.state === \"attachment-result\" && entry.attachment.state === \"available\"\n ? entry.attachment.value\n : undefined;\n}\nfunction projectionMetadata<Value>(entry: AttemptSlotProjectedEntry<Value>, available: (value: Value) => globalThis.Record<string, JsonValue>): JsonValue {\n if (entry.state !== \"attachment-result\") {\n return { state: entry.state };\n }\n switch (entry.attachment.state) {\n case \"available\":\n return { state: \"available\", ...available(entry.attachment.value) };\n case \"unavailable\":\n return { state: \"unavailable\" };\n case \"migration-required\":\n return {\n state: \"migration-required\",\n from: entry.attachment.from,\n to: entry.attachment.to,\n ...(entry.attachment.command === undefined ? {} : { command: entry.attachment.command }),\n };\n case \"unsupported\":\n case \"invalid\":\n return { state: entry.attachment.state };\n }\n}\nfunction assertionMetadata(entries: readonly AssertionEntryRead<unknown>[]): JsonValue {\n const metadata: JsonValue[] = [];\n for (const entry of entries) {\n const display = entry.entry.display;\n const decision = entry.entry.decision;\n const item: globalThis.Record<string, JsonValue> = {\n entryId: entry.entry.entryId,\n groupPath: [...display.groupPath],\n outcome: entry.state === \"available\" ? decision.result : entry.state,\n coverage: coverageMetadata(entry.entry.materials.coverage),\n limitations: entry.entry.materials.limitations.map(limitationMetadata),\n scoreContribution: scoreContributionMetadata(entry.entry.contribution),\n };\n if (display.label !== undefined)\n item.label = display.label;\n if (display.key !== undefined)\n item.key = display.key;\n const reason = assertionReason(entry);\n if (reason !== undefined)\n item.reason = reason;\n metadata.push(item);\n }\n return metadata;\n}\nfunction assertionReason(entry: AssertionEntryRead<unknown>): string | undefined {\n if (entry.state !== \"available\")\n return entry.reason;\n switch (entry.entry.decision.result) {\n case \"matched\":\n return undefined;\n case \"mismatched\":\n case \"unavailable\":\n case \"errored\":\n case \"not-applicable\":\n return entry.entry.decision.reason ?? undefined;\n }\n}\nfunction coverageMetadata(coverage: AssertionCoverage): globalThis.Record<string, JsonValue> {\n const metadata: globalThis.Record<string, JsonValue> = { state: coverage.state };\n if (coverage.state !== \"complete\")\n metadata.reason = coverage.reason;\n return metadata;\n}\nfunction limitationMetadata(limitation: AssertionLimitation): globalThis.Record<string, JsonValue> {\n switch (limitation.kind) {\n case \"redacted\":\n return { kind: limitation.kind, fieldCount: limitation.fieldCount };\n case \"sampled\":\n return {\n kind: limitation.kind,\n captured: limitation.captured,\n ...(limitation.knownTotal === undefined ? {} : { knownTotal: limitation.knownTotal }),\n };\n case \"truncated\":\n return { kind: limitation.kind, omittedBytes: limitation.omittedBytes };\n case \"provider-limited\":\n return { kind: limitation.kind };\n }\n}\nfunction scoreContributionMetadata(contribution: ScoreContribution): globalThis.Record<string, JsonValue> {\n switch (contribution.state) {\n case \"not-scored\":\n return { state: contribution.state };\n case \"earned\":\n return {\n state: contribution.state,\n points: contribution.points,\n earned: contribution.earned,\n };\n case \"unavailable\":\n return {\n state: contribution.state,\n points: contribution.points,\n reason: contribution.reason,\n };\n }\n}\nfunction scoreMetadata(score: ScoreProjection): globalThis.Record<string, JsonValue> {\n switch (score.state) {\n case \"complete\":\n return { state: score.state, earned: score.earned, comparable: score.comparable };\n case \"partial\":\n return {\n state: score.state,\n earned: score.earned,\n reasons: [...score.reasons],\n comparable: score.comparable,\n };\n case \"unavailable\":\n return {\n state: score.state,\n reasons: [...score.reasons],\n comparable: score.comparable,\n };\n }\n}\n/** agent 的最终回复文本(事件流里最后一条 assistant message);没有就不填。 */\nfunction lastAssistantText(events: EvalResult[\"events\"]): string | undefined {\n if (!events)\n return undefined;\n for (let i = events.length - 1; i >= 0; i--) {\n const e = events[i];\n if (e.type === \"message\" && e.role === \"assistant\")\n return e.text;\n }\n return undefined;\n}\n/** 动态 import 说明:specifier 放变量里,`braintrust` 不进编译期依赖,没装也能 typecheck。 */\nconst BRAINTRUST_PACKAGE = \"braintrust\";\nasync function loadBraintrustSdk(): Promise<BraintrustSdk> {\n try {\n return (await __niceevalDynamicImport(BRAINTRUST_PACKAGE)) as unknown as BraintrustSdk;\n }\n catch {\n throw new Error(\"The 'braintrust' package is required for the Braintrust reporter but was not found. Install it with: npm install braintrust (and set BRAINTRUST_API_KEY).\");\n }\n}\n"]}
@@ -65,11 +65,10 @@ function readSourceAttempt(input) {
65
65
  ? effect_1.Effect.succeed(read.value)
66
66
  : effect_1.Effect.fail(invalid("source-attempt-unavailable"))));
67
67
  }
68
- function scoreOf(entries) {
68
+ function scoreOf(contributions) {
69
69
  let earned = 0;
70
70
  let unavailable = false;
71
- for (const entry of entries) {
72
- const score = entry.result.score;
71
+ for (const score of contributions) {
73
72
  if (score.state === "earned" && typeof score.earned === "number")
74
73
  earned += score.earned;
75
74
  if (score.state === "unavailable")
@@ -110,7 +109,7 @@ function detailsFor(input) {
110
109
  })
111
110
  : nonAvailableRead(observability);
112
111
  const scoreAttachment = assertions.state === "available"
113
- ? Object.freeze({ state: "available", value: scoreOf(assertions.value.entries) })
112
+ ? Object.freeze({ state: "available", value: scoreOf(assertions.value.entries.map((entry) => entry.contribution)) })
114
113
  : nonAvailableRead(assertions);
115
114
  const score = input.evaluationKind === "score"
116
115
  ? Object.freeze({ state: "applicable", attachment: scoreAttachment })