niceeval 0.13.1 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) hide show
  1. package/INDEX.md +25 -2
  2. package/README.md +9 -10
  3. package/README.zh.md +9 -10
  4. package/dist/agents/ai-sdk.cjs.map +1 -1
  5. package/dist/agents/ai-sdk.d.cts +1 -1
  6. package/dist/agents/ai-sdk.d.mts +1 -1
  7. package/dist/agents/ai-sdk.d.ts +1 -1
  8. package/dist/agents/bub-install-spec.cjs +19 -5
  9. package/dist/agents/bub-install-spec.cjs.map +1 -1
  10. package/dist/agents/bub-install-spec.d.cts +9 -2
  11. package/dist/agents/bub-install-spec.d.mts +9 -2
  12. package/dist/agents/bub-install-spec.d.ts +9 -2
  13. package/dist/agents/bub-install-spec.js +14 -12
  14. package/dist/agents/bub.cjs +10 -6
  15. package/dist/agents/bub.cjs.map +1 -1
  16. package/dist/agents/bub.d.cts +2 -2
  17. package/dist/agents/bub.d.mts +2 -2
  18. package/dist/agents/bub.d.ts +2 -2
  19. package/dist/agents/claude-code.cjs.map +1 -1
  20. package/dist/agents/claude-code.d.cts +2 -2
  21. package/dist/agents/claude-code.d.mts +2 -2
  22. package/dist/agents/claude-code.d.ts +2 -2
  23. package/dist/agents/codex.cjs +4 -4
  24. package/dist/agents/codex.cjs.map +1 -1
  25. package/dist/agents/codex.d.cts +3 -3
  26. package/dist/agents/codex.d.mts +3 -3
  27. package/dist/agents/codex.d.ts +3 -3
  28. package/dist/agents/coding-cli-versions.cjs +10 -1
  29. package/dist/agents/coding-cli-versions.cjs.map +1 -1
  30. package/dist/agents/coding-cli-versions.d.cts +8 -3
  31. package/dist/agents/coding-cli-versions.d.mts +8 -3
  32. package/dist/agents/coding-cli-versions.d.ts +8 -3
  33. package/dist/agents/coding-cli-versions.js +18 -12
  34. package/dist/agents/deepseek-harness.cjs +151 -0
  35. package/dist/agents/deepseek-harness.cjs.map +1 -0
  36. package/dist/agents/deepseek-harness.d.cts +14 -0
  37. package/dist/agents/deepseek-harness.d.mts +14 -0
  38. package/dist/agents/deepseek-harness.d.ts +14 -0
  39. package/dist/agents/deepseek-harness.js +7 -0
  40. package/dist/agents/deepseek-harness.js.map +1 -0
  41. package/dist/agents/exact-npm-plugins.cjs +28 -0
  42. package/dist/agents/exact-npm-plugins.cjs.map +1 -0
  43. package/dist/agents/exact-npm-plugins.d.cts +10 -0
  44. package/dist/agents/exact-npm-plugins.d.mts +10 -0
  45. package/dist/agents/exact-npm-plugins.d.ts +10 -0
  46. package/dist/agents/exact-npm-plugins.js +8 -0
  47. package/dist/agents/exact-npm-plugins.js.map +1 -0
  48. package/dist/agents/index.cjs +5 -1
  49. package/dist/agents/index.cjs.map +1 -1
  50. package/dist/agents/index.d.cts +4 -0
  51. package/dist/agents/index.d.mts +4 -0
  52. package/dist/agents/index.d.ts +4 -0
  53. package/dist/agents/index.js +54 -50
  54. package/dist/agents/index.mjs +54 -50
  55. package/dist/agents/omp.cjs +170 -0
  56. package/dist/agents/omp.cjs.map +1 -0
  57. package/dist/agents/omp.d.cts +14 -0
  58. package/dist/agents/omp.d.mts +14 -0
  59. package/dist/agents/omp.d.ts +14 -0
  60. package/dist/agents/omp.js +7 -0
  61. package/dist/agents/omp.js.map +1 -0
  62. package/dist/agents/openclaw.cjs +51 -2
  63. package/dist/agents/openclaw.cjs.map +1 -1
  64. package/dist/agents/openclaw.d.cts +2 -0
  65. package/dist/agents/openclaw.d.mts +2 -0
  66. package/dist/agents/openclaw.d.ts +2 -0
  67. package/dist/agents/types.cjs.map +1 -1
  68. package/dist/agents/types.d.cts +4 -4
  69. package/dist/agents/types.d.mts +4 -4
  70. package/dist/agents/types.d.ts +4 -4
  71. package/dist/agents/ui-message-stream.cjs +24 -7
  72. package/dist/agents/ui-message-stream.cjs.map +1 -1
  73. package/dist/analysis/api.cjs +28 -2
  74. package/dist/analysis/api.cjs.map +1 -1
  75. package/dist/analysis/api.d.cts +22 -1
  76. package/dist/analysis/api.d.mts +22 -1
  77. package/dist/analysis/api.d.ts +22 -1
  78. package/dist/analysis/api.js +8 -6
  79. package/dist/analysis/bindings.cjs +11 -18
  80. package/dist/analysis/bindings.cjs.map +1 -1
  81. package/dist/analysis/bindings.d.cts +177 -49
  82. package/dist/analysis/bindings.d.mts +177 -49
  83. package/dist/analysis/bindings.d.ts +177 -49
  84. package/dist/analysis/contracts.cjs +1 -0
  85. package/dist/analysis/contracts.cjs.map +1 -1
  86. package/dist/analysis/contracts.d.cts +43 -3
  87. package/dist/analysis/contracts.d.mts +43 -3
  88. package/dist/analysis/contracts.d.ts +43 -3
  89. package/dist/analysis/cost-projection.cjs +2 -1
  90. package/dist/analysis/cost-projection.cjs.map +1 -1
  91. package/dist/analysis/cost-projection.d.cts +1 -1
  92. package/dist/analysis/cost-projection.d.mts +1 -1
  93. package/dist/analysis/cost-projection.d.ts +1 -1
  94. package/dist/analysis/cost.cjs +13 -3
  95. package/dist/analysis/cost.cjs.map +1 -1
  96. package/dist/analysis/cost.d.cts +10 -3
  97. package/dist/analysis/cost.d.mts +10 -3
  98. package/dist/analysis/cost.d.ts +10 -3
  99. package/dist/analysis/experiment-groups.cjs +96 -0
  100. package/dist/analysis/experiment-groups.cjs.map +1 -0
  101. package/dist/analysis/experiment-groups.d.cts +9 -0
  102. package/dist/analysis/experiment-groups.d.mts +9 -0
  103. package/dist/analysis/experiment-groups.d.ts +9 -0
  104. package/dist/analysis/experiment-groups.js +10 -0
  105. package/dist/analysis/experiment-groups.js.map +1 -0
  106. package/dist/analysis/index.cjs +4 -1
  107. package/dist/analysis/index.cjs.map +1 -1
  108. package/dist/analysis/index.d.cts +4 -2
  109. package/dist/analysis/index.d.mts +4 -2
  110. package/dist/analysis/index.d.ts +4 -2
  111. package/dist/analysis/index.js +40 -36
  112. package/dist/analysis/index.mjs +40 -36
  113. package/dist/assertions/limits.cjs +4 -0
  114. package/dist/assertions/limits.cjs.map +1 -1
  115. package/dist/assertions/limits.d.cts +4 -0
  116. package/dist/assertions/limits.d.mts +4 -0
  117. package/dist/assertions/limits.d.ts +4 -0
  118. package/dist/assertions/match.cjs +63 -25
  119. package/dist/assertions/match.cjs.map +1 -1
  120. package/dist/assertions/match.d.cts +7 -0
  121. package/dist/assertions/match.d.mts +7 -0
  122. package/dist/assertions/match.d.ts +7 -0
  123. package/dist/assertions/record/attachment.cjs +32 -4
  124. package/dist/assertions/record/attachment.cjs.map +1 -1
  125. package/dist/assertions/record/diff.cjs +10 -4
  126. package/dist/assertions/record/diff.cjs.map +1 -1
  127. package/dist/assertions/record/producer.cjs +101 -4
  128. package/dist/assertions/record/producer.cjs.map +1 -1
  129. package/dist/assertions/record/producer.d.cts +4 -1
  130. package/dist/assertions/record/producer.d.mts +4 -1
  131. package/dist/assertions/record/producer.d.ts +4 -1
  132. package/dist/assertions/runtime.cjs +45 -5
  133. package/dist/assertions/runtime.cjs.map +1 -1
  134. package/dist/cli/record.cjs +113 -8
  135. package/dist/cli/record.cjs.map +1 -1
  136. package/dist/cli/record.d.cts +20 -1
  137. package/dist/cli/record.d.mts +20 -1
  138. package/dist/cli/record.d.ts +20 -1
  139. package/dist/cli/record.js +4 -2
  140. package/dist/cli.cjs +386 -31
  141. package/dist/cli.cjs.map +1 -1
  142. package/dist/cli.d.cts +10 -2
  143. package/dist/cli.d.mts +10 -2
  144. package/dist/cli.d.ts +10 -2
  145. package/dist/context/send-retry.cjs +4 -4
  146. package/dist/context/send-retry.cjs.map +1 -1
  147. package/dist/coordination/host/runtime.cjs +8 -30
  148. package/dist/coordination/host/runtime.cjs.map +1 -1
  149. package/dist/coordination/host/runtime.d.cts +3 -3
  150. package/dist/coordination/host/runtime.d.mts +3 -3
  151. package/dist/coordination/host/runtime.d.ts +3 -3
  152. package/dist/coordination/host/types.cjs.map +1 -1
  153. package/dist/coordination/host/types.d.cts +0 -5
  154. package/dist/coordination/host/types.d.mts +0 -5
  155. package/dist/coordination/host/types.d.ts +0 -5
  156. package/dist/coordination/platform/node.cjs +90 -9
  157. package/dist/coordination/platform/node.cjs.map +1 -1
  158. package/dist/define.cjs +25 -1
  159. package/dist/define.cjs.map +1 -1
  160. package/dist/experiment/host/index.cjs +1 -0
  161. package/dist/experiment/host/index.cjs.map +1 -1
  162. package/dist/i18n/en.cjs +26 -8
  163. package/dist/i18n/en.cjs.map +1 -1
  164. package/dist/i18n/en.d.cts +19 -6
  165. package/dist/i18n/en.d.mts +19 -6
  166. package/dist/i18n/en.d.ts +19 -6
  167. package/dist/index.cjs.map +1 -1
  168. package/dist/index.d.cts +1 -1
  169. package/dist/index.d.mts +1 -1
  170. package/dist/index.d.ts +1 -1
  171. package/dist/o11y/parsers/hermes.cjs +1 -1
  172. package/dist/o11y/parsers/hermes.cjs.map +1 -1
  173. package/dist/o11y/prices.json +1 -1
  174. package/dist/o11y/record/families.cjs +12 -3
  175. package/dist/o11y/record/families.cjs.map +1 -1
  176. package/dist/o11y/record/families.d.cts +8 -8
  177. package/dist/o11y/record/families.d.mts +8 -8
  178. package/dist/o11y/record/families.d.ts +8 -8
  179. package/dist/o11y/record/family-projectors.d.cts +66 -18
  180. package/dist/o11y/record/family-projectors.d.mts +66 -18
  181. package/dist/o11y/record/family-projectors.d.ts +66 -18
  182. package/dist/o11y/record/family-writers.d.cts +11 -3
  183. package/dist/o11y/record/family-writers.d.mts +11 -3
  184. package/dist/o11y/record/family-writers.d.ts +11 -3
  185. package/dist/o11y/record/runner-producer.cjs +14 -4
  186. package/dist/o11y/record/runner-producer.cjs.map +1 -1
  187. package/dist/record/codec/core.d.cts +2 -2
  188. package/dist/record/codec/core.d.mts +2 -2
  189. package/dist/record/codec/core.d.ts +2 -2
  190. package/dist/record/family/catalog.d.cts +44 -12
  191. package/dist/record/family/catalog.d.mts +44 -12
  192. package/dist/record/family/catalog.d.ts +44 -12
  193. package/dist/record/family/index.js +128 -124
  194. package/dist/record/family/observability-v1.cjs +35 -0
  195. package/dist/record/family/observability-v1.cjs.map +1 -0
  196. package/dist/record/family/observability-v1.d.cts +3 -0
  197. package/dist/record/family/observability-v1.d.mts +3 -0
  198. package/dist/record/family/observability-v1.d.ts +3 -0
  199. package/dist/record/family/observability-v1.js +6 -0
  200. package/dist/record/family/observability-v1.js.map +1 -0
  201. package/dist/record/family/observability.cjs +58 -9
  202. package/dist/record/family/observability.cjs.map +1 -1
  203. package/dist/record/family/observability.d.cts +1014 -15
  204. package/dist/record/family/observability.d.mts +1014 -15
  205. package/dist/record/family/observability.d.ts +1014 -15
  206. package/dist/record/family/observability.js +22 -18
  207. package/dist/record/host/runtime.cjs +600 -31
  208. package/dist/record/host/runtime.cjs.map +1 -1
  209. package/dist/record/host/types.cjs.map +1 -1
  210. package/dist/record/host/types.d.cts +33 -9
  211. package/dist/record/host/types.d.mts +33 -9
  212. package/dist/record/host/types.d.ts +33 -9
  213. package/dist/record/maintenance/runtime.cjs +1 -2
  214. package/dist/record/maintenance/runtime.cjs.map +1 -1
  215. package/dist/record/model/core.cjs.map +1 -1
  216. package/dist/record/model/core.d.cts +1 -1
  217. package/dist/record/model/core.d.mts +1 -1
  218. package/dist/record/model/core.d.ts +1 -1
  219. package/dist/record/model/definition.d.cts +6 -6
  220. package/dist/record/model/definition.d.mts +6 -6
  221. package/dist/record/model/definition.d.ts +6 -6
  222. package/dist/record/model/identifiers.cjs +1 -1
  223. package/dist/record/model/identifiers.cjs.map +1 -1
  224. package/dist/record/model/identifiers.d.cts +1 -1
  225. package/dist/record/model/identifiers.d.mts +1 -1
  226. package/dist/record/model/identifiers.d.ts +1 -1
  227. package/dist/record/platform/node.cjs +159 -23
  228. package/dist/record/platform/node.cjs.map +1 -1
  229. package/dist/record/platform/services.cjs.map +1 -1
  230. package/dist/record/platform/services.d.cts +15 -2
  231. package/dist/record/platform/services.d.mts +15 -2
  232. package/dist/record/platform/services.d.ts +15 -2
  233. package/dist/record/reader/errors.cjs +37 -1
  234. package/dist/record/reader/errors.cjs.map +1 -1
  235. package/dist/record/reader/errors.d.cts +49 -1
  236. package/dist/record/reader/errors.d.mts +49 -1
  237. package/dist/record/reader/errors.d.ts +49 -1
  238. package/dist/record/reader/errors.js +22 -12
  239. package/dist/record/reader/format.cjs +76 -17
  240. package/dist/record/reader/format.cjs.map +1 -1
  241. package/dist/record/reader/format.d.cts +11 -4
  242. package/dist/record/reader/format.d.mts +11 -4
  243. package/dist/record/reader/format.d.ts +11 -4
  244. package/dist/record/reader/format.js +2 -0
  245. package/dist/record/reader/index.js +32 -18
  246. package/dist/record/reader/runtime.cjs +64 -0
  247. package/dist/record/reader/runtime.cjs.map +1 -1
  248. package/dist/record/reader/runtime.d.cts +15 -0
  249. package/dist/record/reader/runtime.d.mts +15 -0
  250. package/dist/record/reader/runtime.d.ts +15 -0
  251. package/dist/record/reader/runtime.js +2 -0
  252. package/dist/report/assets/styles.css +53 -29
  253. package/dist/report/built-in/analysis-values.cjs +21 -13
  254. package/dist/report/built-in/analysis-values.cjs.map +1 -1
  255. package/dist/report/built-in/analysis-values.d.cts +11 -22
  256. package/dist/report/built-in/analysis-values.d.mts +11 -22
  257. package/dist/report/built-in/analysis-values.d.ts +11 -22
  258. package/dist/report/built-in/analysis-values.js +4 -6
  259. package/dist/report/built-in/index.cjs +1 -3
  260. package/dist/report/built-in/index.cjs.map +1 -1
  261. package/dist/report/built-in/index.d.cts +1 -1
  262. package/dist/report/built-in/index.d.mts +1 -1
  263. package/dist/report/built-in/index.d.ts +1 -1
  264. package/dist/report/built-in/index.js +4 -8
  265. package/dist/report/built-in/index.mjs +4 -8
  266. package/dist/report/built-in/machine.cjs +0 -2
  267. package/dist/report/built-in/machine.cjs.map +1 -1
  268. package/dist/report/built-in/machine.d.cts +0 -2
  269. package/dist/report/built-in/machine.d.mts +0 -2
  270. package/dist/report/built-in/machine.d.ts +0 -2
  271. package/dist/report/built-in/result-components.cjs +49 -51
  272. package/dist/report/built-in/result-components.cjs.map +1 -1
  273. package/dist/report/built-in/result-components.d.cts +16 -17
  274. package/dist/report/built-in/result-components.d.mts +16 -17
  275. package/dist/report/built-in/result-components.d.ts +16 -17
  276. package/dist/report/built-in/result-components.js +0 -4
  277. package/dist/report/built-in/run-membership-overview.cjs +126 -17
  278. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  279. package/dist/report/built-in/run-membership-overview.d.cts +14 -0
  280. package/dist/report/built-in/run-membership-overview.d.mts +14 -0
  281. package/dist/report/built-in/run-membership-overview.d.ts +14 -0
  282. package/dist/report/built-in/run-membership-overview.js +4 -2
  283. package/dist/report/built-in/standard.cjs +80 -45
  284. package/dist/report/built-in/standard.cjs.map +1 -1
  285. package/dist/report/built-in/standard.d.cts +19 -41
  286. package/dist/report/built-in/standard.d.mts +19 -41
  287. package/dist/report/built-in/standard.d.ts +19 -41
  288. package/dist/report/built-in/standard.js +6 -6
  289. package/dist/report/components/attempt-detail/compute.cjs +78 -2
  290. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  291. package/dist/report/components/attempt-detail/compute.d.cts +1 -1
  292. package/dist/report/components/attempt-detail/compute.d.mts +1 -1
  293. package/dist/report/components/attempt-detail/compute.d.ts +1 -1
  294. package/dist/report/components/attempt-detail/content.cjs +1 -1
  295. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  296. package/dist/report/components/entity-lists/compute.cjs +42 -5
  297. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  298. package/dist/report/components/entity-lists/compute.d.cts +10 -8
  299. package/dist/report/components/entity-lists/compute.d.mts +10 -8
  300. package/dist/report/components/entity-lists/compute.d.ts +10 -8
  301. package/dist/report/components/entity-lists/content.cjs +31 -6
  302. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  303. package/dist/report/components/entity-lists/index.cjs +9 -4
  304. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  305. package/dist/report/components/entity-lists/index.d.cts +4 -7
  306. package/dist/report/components/entity-lists/index.d.mts +4 -7
  307. package/dist/report/components/entity-lists/index.d.ts +4 -7
  308. package/dist/report/components/summaries/compute.cjs +8 -1
  309. package/dist/report/components/summaries/compute.cjs.map +1 -1
  310. package/dist/report/components/summaries/compute.d.cts +9 -1
  311. package/dist/report/components/summaries/compute.d.mts +9 -1
  312. package/dist/report/components/summaries/compute.d.ts +9 -1
  313. package/dist/report/components/summaries/index.cjs +48 -4
  314. package/dist/report/components/summaries/index.cjs.map +1 -1
  315. package/dist/report/components/summaries/index.d.cts +7 -4
  316. package/dist/report/components/summaries/index.d.mts +7 -4
  317. package/dist/report/components/summaries/index.d.ts +7 -4
  318. package/dist/report/definition/cell.cjs +3 -0
  319. package/dist/report/definition/cell.cjs.map +1 -1
  320. package/dist/report/definition/cell.d.cts +2 -0
  321. package/dist/report/definition/cell.d.mts +2 -0
  322. package/dist/report/definition/cell.d.ts +2 -0
  323. package/dist/report/definition/primitives/chart.cjs +8 -5
  324. package/dist/report/definition/primitives/chart.cjs.map +1 -1
  325. package/dist/report/definition/primitives/points-dataset.cjs +1 -0
  326. package/dist/report/definition/primitives/points-dataset.cjs.map +1 -1
  327. package/dist/report/definition/primitives.cjs +15 -2
  328. package/dist/report/definition/primitives.cjs.map +1 -1
  329. package/dist/report/definition/report.cjs +27 -3
  330. package/dist/report/definition/report.cjs.map +1 -1
  331. package/dist/report/definition/report.d.cts +8 -0
  332. package/dist/report/definition/report.d.mts +8 -0
  333. package/dist/report/definition/report.d.ts +8 -0
  334. package/dist/report/execution/machine.cjs +30 -14
  335. package/dist/report/execution/machine.cjs.map +1 -1
  336. package/dist/report/execution/machine.d.cts +20 -10
  337. package/dist/report/execution/machine.d.mts +20 -10
  338. package/dist/report/execution/machine.d.ts +20 -10
  339. package/dist/report/execution/machine.js +6 -6
  340. package/dist/report/host/execute.cjs +25 -16
  341. package/dist/report/host/execute.cjs.map +1 -1
  342. package/dist/report/host/execute.d.cts +4 -0
  343. package/dist/report/host/execute.d.mts +4 -0
  344. package/dist/report/host/execute.d.ts +4 -0
  345. package/dist/report/host/from-record.cjs +22 -5
  346. package/dist/report/host/from-record.cjs.map +1 -1
  347. package/dist/report/host/machine.cjs +53 -11
  348. package/dist/report/host/machine.cjs.map +1 -1
  349. package/dist/report/host/site-runtime.cjs +9 -8
  350. package/dist/report/host/site-runtime.cjs.map +1 -1
  351. package/dist/report/host/site-runtime.d.cts +1 -1
  352. package/dist/report/host/site-runtime.d.mts +1 -1
  353. package/dist/report/host/site-runtime.d.ts +1 -1
  354. package/dist/report/host/static.cjs +56 -9
  355. package/dist/report/host/static.cjs.map +1 -1
  356. package/dist/report/index.cjs.map +1 -1
  357. package/dist/report/index.d.cts +1 -1
  358. package/dist/report/index.d.mts +1 -1
  359. package/dist/report/index.d.ts +1 -1
  360. package/dist/report/model/dataset.cjs +7 -2
  361. package/dist/report/model/dataset.cjs.map +1 -1
  362. package/dist/report/model/locale.cjs +2 -0
  363. package/dist/report/model/locale.cjs.map +1 -1
  364. package/dist/report/model/locale.d.cts +1 -0
  365. package/dist/report/model/locale.d.mts +1 -0
  366. package/dist/report/model/locale.d.ts +1 -0
  367. package/dist/report/model/metrics.cjs +3 -1
  368. package/dist/report/model/metrics.cjs.map +1 -1
  369. package/dist/report/model/pricing.cjs +16 -11
  370. package/dist/report/model/pricing.cjs.map +1 -1
  371. package/dist/report/react/styles.css +53 -29
  372. package/dist/runner/adoption.cjs +1 -0
  373. package/dist/runner/adoption.cjs.map +1 -1
  374. package/dist/runner/attempt.cjs +44 -5
  375. package/dist/runner/attempt.cjs.map +1 -1
  376. package/dist/runner/attempt.d.cts +13 -1
  377. package/dist/runner/attempt.d.mts +13 -1
  378. package/dist/runner/attempt.d.ts +13 -1
  379. package/dist/runner/config-identity.cjs +10 -2
  380. package/dist/runner/config-identity.cjs.map +1 -1
  381. package/dist/runner/config-identity.d.cts +4 -2
  382. package/dist/runner/config-identity.d.mts +4 -2
  383. package/dist/runner/config-identity.d.ts +4 -2
  384. package/dist/runner/feedback/human.cjs +298 -59
  385. package/dist/runner/feedback/human.cjs.map +1 -1
  386. package/dist/runner/feedback/json.cjs +14 -6
  387. package/dist/runner/feedback/json.cjs.map +1 -1
  388. package/dist/runner/feedback/json.d.cts +3 -2
  389. package/dist/runner/feedback/json.d.mts +3 -2
  390. package/dist/runner/feedback/json.d.ts +3 -2
  391. package/dist/runner/feedback/reducer.cjs +2 -0
  392. package/dist/runner/feedback/reducer.cjs.map +1 -1
  393. package/dist/runner/judge-config.cjs +1 -1
  394. package/dist/runner/judge-config.cjs.map +1 -1
  395. package/dist/runner/ledger.cjs +124 -12
  396. package/dist/runner/ledger.cjs.map +1 -1
  397. package/dist/runner/project-current.cjs +13 -5
  398. package/dist/runner/project-current.cjs.map +1 -1
  399. package/dist/runner/run.cjs +564 -256
  400. package/dist/runner/run.cjs.map +1 -1
  401. package/dist/runner/sandbox-pool.cjs +161 -30
  402. package/dist/runner/sandbox-pool.cjs.map +1 -1
  403. package/dist/runner/sandbox-pool.d.cts +34 -2
  404. package/dist/runner/sandbox-pool.d.mts +34 -2
  405. package/dist/runner/sandbox-pool.d.ts +34 -2
  406. package/dist/runner/shared-state-lease.cjs +803 -0
  407. package/dist/runner/shared-state-lease.cjs.map +1 -0
  408. package/dist/runner/shared-state-lease.d.cts +121 -0
  409. package/dist/runner/shared-state-lease.d.mts +121 -0
  410. package/dist/runner/shared-state-lease.d.ts +121 -0
  411. package/dist/runner/shared-state-lease.js +24 -0
  412. package/dist/runner/shared-state-lease.js.map +1 -0
  413. package/dist/runner/teardown-registry.cjs +97 -34
  414. package/dist/runner/teardown-registry.cjs.map +1 -1
  415. package/dist/runner/teardown-registry.d.cts +27 -1
  416. package/dist/runner/teardown-registry.d.mts +27 -1
  417. package/dist/runner/teardown-registry.d.ts +27 -1
  418. package/dist/runner/teardown-registry.js +20 -16
  419. package/dist/runner/types.cjs.map +1 -1
  420. package/dist/runner/types.d.cts +31 -5
  421. package/dist/runner/types.d.mts +31 -5
  422. package/dist/runner/types.d.ts +31 -5
  423. package/dist/sample/analysis.cjs +249 -459
  424. package/dist/sample/analysis.cjs.map +1 -1
  425. package/dist/sample/capability.cjs +138 -7
  426. package/dist/sample/capability.cjs.map +1 -1
  427. package/dist/sample/capability.d.cts +3 -1
  428. package/dist/sample/capability.d.mts +3 -1
  429. package/dist/sample/capability.d.ts +3 -1
  430. package/dist/sample/capability.js +8 -6
  431. package/dist/sandbox/docker-agent-image.cjs +5 -1
  432. package/dist/sandbox/docker-agent-image.cjs.map +1 -1
  433. package/dist/sandbox/docker-agent-image.d.cts +2 -0
  434. package/dist/sandbox/docker-agent-image.d.mts +2 -0
  435. package/dist/sandbox/docker-agent-image.d.ts +2 -0
  436. package/dist/sandbox/docker-agent-image.js +14 -10
  437. package/dist/sandbox/docker-profile/schema.cjs +283 -534
  438. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  439. package/dist/sandbox/docker-profile/schema.d.cts +10 -27
  440. package/dist/sandbox/docker-profile/schema.d.mts +10 -27
  441. package/dist/sandbox/docker-profile/schema.d.ts +10 -27
  442. package/dist/sandbox/e2b-agent-template.cjs +5 -2
  443. package/dist/sandbox/e2b-agent-template.cjs.map +1 -1
  444. package/dist/sandbox/index.cjs +4 -2
  445. package/dist/sandbox/index.cjs.map +1 -1
  446. package/dist/sandbox/index.d.cts +1 -1
  447. package/dist/sandbox/index.d.mts +1 -1
  448. package/dist/sandbox/index.d.ts +1 -1
  449. package/dist/sandbox/index.js +120 -116
  450. package/dist/sandbox/index.mjs +120 -116
  451. package/dist/sandbox/keep-registry.cjs +28 -66
  452. package/dist/sandbox/keep-registry.cjs.map +1 -1
  453. package/dist/sandbox/types.cjs.map +1 -1
  454. package/dist/sandbox/types.d.cts +1 -1
  455. package/dist/sandbox/types.d.mts +1 -1
  456. package/dist/sandbox/types.d.ts +1 -1
  457. package/dist/shared/aggregate.cjs +16 -6
  458. package/dist/shared/aggregate.cjs.map +1 -1
  459. package/dist/shared/aggregate.d.cts +12 -4
  460. package/dist/shared/aggregate.d.mts +12 -4
  461. package/dist/shared/aggregate.d.ts +12 -4
  462. package/dist/shared/turn-label.cjs +20 -2
  463. package/dist/shared/turn-label.cjs.map +1 -1
  464. package/dist/shared/turn-label.d.cts +2 -0
  465. package/dist/shared/turn-label.d.mts +2 -0
  466. package/dist/shared/turn-label.d.ts +2 -0
  467. package/dist/shared/turn-label.js +4 -2
  468. package/dist/vendor/remark/remark-gfm.cjs +7 -7
  469. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  470. package/dist/vendor/remark/remark-parse.cjs +12 -12
  471. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  472. package/dist/vendor/remark/remark.cjs +13 -13
  473. package/dist/vendor/remark/remark.cjs.map +1 -1
  474. package/dist/view/server.cjs +6 -0
  475. package/dist/view/server.cjs.map +1 -1
  476. package/docs-site/images/hitl-handshake-zh.svg +3 -3
  477. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  478. package/docs-site/zh/examples/coding-agent-extensions.mdx +1 -1
  479. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +4 -3
  480. package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
  481. package/docs-site/zh/examples/integrations/codex-sdk.mdx +5 -5
  482. package/docs-site/zh/examples/integrations/langgraph.mdx +4 -4
  483. package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
  484. package/docs-site/zh/explanation/adapter.mdx +5 -5
  485. package/docs-site/zh/explanation/assert.mdx +7 -7
  486. package/docs-site/zh/explanation/drive.mdx +4 -2
  487. package/docs-site/zh/explanation/evals.mdx +10 -8
  488. package/docs-site/zh/explanation/experiment.mdx +2 -2
  489. package/docs-site/zh/explanation/hitl.mdx +9 -9
  490. package/docs-site/zh/explanation/judge.mdx +5 -5
  491. package/docs-site/zh/explanation/overview.mdx +3 -3
  492. package/docs-site/zh/explanation/runner.mdx +1 -1
  493. package/docs-site/zh/index.mdx +3 -3
  494. package/docs-site/zh/reference/builtin-agents.mdx +13 -13
  495. package/docs-site/zh/reference/capabilities.mdx +1 -1
  496. package/docs-site/zh/reference/cli.mdx +18 -12
  497. package/docs-site/zh/reference/define-agent.mdx +130 -5
  498. package/docs-site/zh/reference/define-config.mdx +2 -2
  499. package/docs-site/zh/reference/define-eval.mdx +4 -4
  500. package/docs-site/zh/reference/events.mdx +11 -11
  501. package/docs-site/zh/reference/official-adapters.mdx +6 -6
  502. package/docs-site/zh/reference/results-data.mdx +6 -0
  503. package/docs-site/zh/troubleshooting/debugging.mdx +1 -1
  504. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +37 -5
  505. package/docs-site/zh/tutorials/accept-results.mdx +72 -0
  506. package/docs-site/zh/tutorials/agent-onboarding.mdx +6 -6
  507. package/docs-site/zh/tutorials/authoring.mdx +9 -13
  508. package/docs-site/zh/tutorials/ci-integration.mdx +6 -6
  509. package/docs-site/zh/tutorials/compare-runs.mdx +61 -0
  510. package/docs-site/zh/tutorials/concurrency.mdx +13 -12
  511. package/docs-site/zh/tutorials/configuration.mdx +4 -6
  512. package/docs-site/zh/tutorials/connect-your-agent.mdx +1 -1
  513. package/docs-site/zh/tutorials/control-run-cost.mdx +58 -0
  514. package/docs-site/zh/tutorials/criteria-files.mdx +2 -2
  515. package/docs-site/zh/tutorials/custom-reports.mdx +2 -2
  516. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +46 -0
  517. package/docs-site/zh/tutorials/docker-in-docker.mdx +52 -43
  518. package/docs-site/zh/tutorials/eval-groups.mdx +6 -6
  519. package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
  520. package/docs-site/zh/tutorials/experiments.mdx +2 -3
  521. package/docs-site/zh/tutorials/handle-execution-failures.mdx +18 -10
  522. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +16 -8
  523. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +160 -0
  524. package/docs-site/zh/tutorials/plugins.mdx +14 -0
  525. package/docs-site/zh/tutorials/rerun-and-cache.mdx +4 -2
  526. package/docs-site/zh/tutorials/sandbox-agent.mdx +17 -11
  527. package/docs-site/zh/tutorials/sandbox-providers.mdx +17 -13
  528. package/docs-site/zh/tutorials/sandbox-reuse.mdx +12 -19
  529. package/docs-site/zh/tutorials/select-and-preview.mdx +65 -0
  530. package/docs-site/zh/tutorials/verify-judge.mdx +78 -0
  531. package/docs-site/zh/tutorials/viewing-results.mdx +38 -1
  532. package/docs-site/zh/tutorials/write-experiment.mdx +7 -5
  533. package/docs-site/zh/tutorials/write-send.mdx +9 -8
  534. package/package.json +9 -5
  535. package/dist/report/built-in/overview.cjs +0 -44
  536. package/dist/report/built-in/overview.cjs.map +0 -1
  537. package/dist/report/built-in/overview.d.cts +0 -6
  538. package/dist/report/built-in/overview.d.mts +0 -6
  539. package/dist/report/built-in/overview.d.ts +0 -6
  540. package/dist/report/built-in/overview.js +0 -9
  541. package/dist/report/built-in/overview.js.map +0 -1
  542. package/dist/runner/gate-lease.cjs +0 -283
  543. package/dist/runner/gate-lease.cjs.map +0 -1
  544. package/dist/runner/gate-lease.d.cts +0 -62
  545. package/dist/runner/gate-lease.d.mts +0 -62
  546. package/dist/runner/gate-lease.d.ts +0 -62
  547. package/dist/runner/gate-lease.js +0 -22
  548. package/dist/runner/gate-lease.js.map +0 -1
package/INDEX.md CHANGED
@@ -10,23 +10,43 @@
10
10
 
11
11
  随包文档目前只有中文。不要为了找英文版而去抓官网或 GitHub——那里的页面可能对应另一个版本,「另一个版本的英文页」比「当前版本的中文页」更危险。中文页读起来没有障碍就直接读;与用户交流仍用用户的语言。
12
12
 
13
+ ## 帮用户跑通实验
14
+
15
+ 1. **先确认目标和边界。** 读用户项目的 README、依赖、被测入口和现有 NiceEval 文件,确认要评什么真实用例、被测应用怎样启动、使用哪个 Agent / Sandbox / Judge,以及允许的时间和费用。不要用「你好」式占位题代替真实用例;付费模型、全量 benchmark 或批量重跑先征得用户同意。
16
+ 2. **只读完成当前步骤需要的文档。** 从下面的树进入 `agent-onboarding` 或 `quickstart`,再按被测对象选择一页接入教程;需要精确字段或命令时补读一页 Reference。不要一次加载整站,也不要凭记忆发明 API。
17
+ 3. **先建立最小闭环。** Adapter 连接真实被测入口,Experiment 明确选择评估用例与运行条件,评估用例覆盖一个有代表性的真实任务。先运行 `niceeval exp list`,再用 `niceeval exp <experiment> <eval> --dry` 核对选择、模型、Attempt 数和结果沿用;生命周期或 Sandbox 不明确时用 `niceeval debug <experiment> <eval>` 查看静态计划。
18
+ 4. **小范围真实运行。** 先跑一条评估用例、一个 Experiment 和足够证明链路的最小 Attempt 数;需要时给预算与并发加保护。保留完成反馈中的 `runIds`,用 `niceeval show --run <run-id>` 验证结果、分母和诊断,而不是只看进程退出码。
19
+ 5. **交付可复现结果。** 告诉用户新增或修改了哪些文件、实际运行了什么命令、Run ID、通过/失败/不可用状态和下一步。没有真实运行就明确说明,不把 `--dry`、typecheck 或配置发现说成实验已经跑通。
20
+
21
+ ## 发现并解决问题
22
+
23
+ 1. **从公开入口收集证据。** 选择问题对应的固定 Run;先用 `show --run` 看覆盖、Verdict 和 diagnostics,再从页面给出的 Attempt locator 用 `show @<locator>` 下钻 Assertion、Judge、工具调用、用量、时间和文件变化。不要直接读取或修改 `.niceeval/` 私有文件。
24
+ 2. **先分类,再修改。** 选择或发现错误查 `exp list` 与 `--dry`;Plugin、Sandbox、Agent、Fixture 顺序查 `debug`;基础设施和保留现场查 Troubleshooting;Judge 不可用先验证模型、密钥和端点;`failed` 才表示断言未满足,`errored`、`skipped`、`not-dispatched` 与 `unavailable` 不能当成零分或普通失败。
25
+ 3. **修产生错误的那一层。** 被测应用行为错就修应用;事件或用量映射错就修 Adapter;题意或判据错就修评估用例;Provider、凭据或生命周期错就修运行配置。不要通过放松断言、伪造事件或改历史 Record 让结果变绿。
26
+ 4. **只复验受影响范围。** 修改后重复同一条精确选择命令。默认结果沿用会跳过身份仍匹配的结果;需要重验失败项用 `--rerun`,需要重验全部选中位置才用 `--rerun all`。只有在身份变化但历史证据经人工核对仍然有效时,才用 `niceeval accept` 明确发布新的采用 Run。
27
+ 5. **闭环验证。** 用新 Run ID 再次查看固定分母,确认原 diagnostic 消失且没有新增错误;需要比较修复前后时,把两个明确 Run ID 一起交给 `show` 或 `view`,不要用「最新」代替实验边界。
28
+
13
29
  <!-- GENERATED:BEGIN bundled-docs-tree -->
14
30
 
15
31
  <!-- 本文件是构建产物(pnpm run build:index),勿手改:树区文案改对应页面的 frontmatter title/description,导语改 INDEX.template.md(生成逻辑见 scripts/generate-reference.ts) -->
16
32
 
17
33
  ## `docs-site/zh/tutorials/`
18
34
 
35
+ - `docs-site/zh/tutorials/accept-results.mdx` — 审阅并采用历史 Attempt:从 --dry 取得候选 locator,核对不可变 Attempt,再用 niceeval accept 原子采用明确结果,并用新 Run ID 验证分母与来源。
19
36
  - `docs-site/zh/tutorials/agent-feedback-loop.mdx` — 让 Coding Agent 根据结果迭代:让 Coding Agent 读取 receipt 的 runIds,再用 show 或 view 查看已发布 Record 中的结果。
20
- - `docs-site/zh/tutorials/agent-onboarding.mdx` — Coding Agent 从零接入项目:给 Coding Agent 的完整接入流程:探索项目、与用户确认路径、配置 Judge、写出 Adapter / Experiment / 评估用例并跑通第一个实验。
37
+ - `docs-site/zh/tutorials/agent-onboarding.mdx` — Coding Agent 从零接入项目:给 Coding Agent 的完整接入流程:探索项目、与用户确认路径、配置 Judge、写出 AdapterExperiment 与评估用例,并跑通第一个实验。
21
38
  - `docs-site/zh/tutorials/authoring.mdx` — 编写评估用例: 单轮、多轮和测试集模式:用 defineEval 编写评估用例,包括单轮对话、多轮对话、数据驱动测试、Sandbox Workspace 和评估的生命周期与 Fixture。
22
39
  - `docs-site/zh/tutorials/ci-integration.mdx` — 在 CI 中运行 NiceEval:让 CI 使用退出状态判定门禁,保留最后的 receipt,并向平台提供 JUnit 文件。
40
+ - `docs-site/zh/tutorials/compare-runs.mdx` — 比较多个固定 Run:用明确 Run ID 固定比较分母,核对结果覆盖,再比较通过率、得分、成本与时长,而不让新结果改变已打开的比较。
23
41
  - `docs-site/zh/tutorials/concurrency.mdx` — 调好并发:吞吐、共享状态与固定执行顺序:全局并发位和实验自己的 maxConcurrency 是两级并发限制。这一页说明各自管什么、共享状态怎么串行、执行顺序怎么固定,以及多开一个终端为什么能加速。
24
42
  - `docs-site/zh/tutorials/configuration.mdx` — 把配置和密钥各放到该放的地方:跑几次、超时、并发、judge 这些值写进代码的哪一层,API key 和 provider token 用哪些环境变量。
25
43
  - `docs-site/zh/tutorials/connect-otel.mdx` — OTel 接入:把应用已有的 OTel span 发送给 NiceEval,在 niceeval view 中查看每轮调用瀑布图。评估用例断言仍以 Send 返回的事件和用量为准。
26
44
  - `docs-site/zh/tutorials/connect-your-agent.mdx` — 接入你的 Agent:写一个 Adapter、配置一个 Experiment,并运行第一条评估用例。再把配置和参数从 Experiment 传给 Adapter 与被测应用。
45
+ - `docs-site/zh/tutorials/control-run-cost.mdx` — 控制一次运行的成本:用 attempts、首过即停、budget、并发和结果沿用分别控制统计样本、停止派发、花费保护与资源占用。
27
46
  - `docs-site/zh/tutorials/criteria-files.mdx` — 隐藏测试判分:让判据文件进缓存 fingerprint:用 loadText 在模块顶层读入隐藏测试、跑测脚本等判据文件,文件内容进入 fingerprint:改一字节自动重跑,不靠人工 --rerun。
28
47
  - `docs-site/zh/tutorials/custom-reports.mdx` — 编写自定义报告:先定义 Analysis 统计口径,再用标准 React JSX 编写可在终端、网页和静态站阅读的 Report。
29
48
  - `docs-site/zh/tutorials/dataset-fanout.mdx` — 数据驱动测试(dataset fan-out):用多份数据运行同一套评估用例:从 .eval.ts 文件导出数组或 keyed record,将一套评估逻辑展开为多个 case。用 loadYaml 或 loadJson 读取外部测试集,并获得稳定 ID。
49
+ - `docs-site/zh/tutorials/debug-lifecycle-plan.mdx` — 运行前检查生命周期计划:用 niceeval debug 查看一个 Experiment 与评估用例配对的 Plugin、Sandbox、Agent、Fixture 和 teardown 顺序,而不创建任何运行资源。
30
50
  - `docs-site/zh/tutorials/deploy-report-site.mdx` — 部署静态报告站:将 view --out 生成的完整自包含报告目录部署到任意静态托管服务。
31
51
  - `docs-site/zh/tutorials/docker-in-docker.mdx` — 让 Sandbox 使用 Docker:根据任务信任边界选择 Docker socket、raw privileged DinD 或受管 rootless DinD,并为 Agent 准备 Docker CLI 与 daemon。
32
52
  - `docs-site/zh/tutorials/eval-groups.mdx` — 用评估组复用 Sandbox:用 defineEvalGroup 显式声明兼容成员:同组按稳定 ID 串行复用一台 Sandbox,不同组继续并行,并把公共准备放到正确的 Sandbox Layer。
@@ -35,6 +55,7 @@
35
55
  - `docs-site/zh/tutorials/fixtures.mdx` — Sandbox Fixture:用任务评估 coding agents:用 .eval.ts 给 coding agent 准备隔离 workspace、发送真实任务,并用 Sandbox 文件、命令、diff 和 judge 验证结果。
36
56
  - `docs-site/zh/tutorials/handle-execution-failures.mdx` — 在基础设施失败时停止无效运行:读懂自动重试,为确定性故障声明影响范围,修复后继续未完成的评估。
37
57
  - `docs-site/zh/tutorials/install-custom-sandbox-agent.mdx` — 为自定义 Sandbox Agent 安装 CLI:用 ensure 和 installer 检查、安装并复检自定义 coding-agent CLI 的精确版本。
58
+ - `docs-site/zh/tutorials/nixos-managed-dind.mdx` — 在 NixOS 上配置 Managed DinD:使用 NiceEval 的 NixOS module 部署 managed rootless Docker profile,并通过 doctor 验证宿主环境。
38
59
  - `docs-site/zh/tutorials/plugins.mdx` — 用 Plugin 组合生命周期:用 definePlugin 为实验、评估组、Sandbox 和评估组合多个生命周期。
39
60
  - `docs-site/zh/tutorials/publish-report.mdx` — 发布静态报告:用 view --out 导出可离线打开、与源 Record 脱离且包含全部页面的自包含报告站。
40
61
  - `docs-site/zh/tutorials/quickstart.mdx` — 为你的 Agent 项目设置评估:安装 NiceEval,写三个文件,10 分钟内对你自己的应用跑通第一条评估用例。
@@ -43,7 +64,9 @@
43
64
  - `docs-site/zh/tutorials/sandbox-agent.mdx` — Sandbox Agent:评估 Claude Code、Codex 和 bub:使用 NiceEval 内置 agents 或自定义 adapter,在 Docker 或云端 sandbox 中运行 coding-agent CLI。
44
65
  - `docs-site/zh/tutorials/sandbox-providers.mdx` — Sandbox:官方 Sandbox Docker、Vercel 或 E2B Provider。通过预制快照加速评估
45
66
  - `docs-site/zh/tutorials/sandbox-reuse.mdx` — 复用 Sandbox:一批评估共用环境,公共准备只付一次:在 Experiment 里声明 sandboxReuse 让多条 Attempt 共用 Sandbox:写对四层生命周期、配好 lifetimeMs。准备代码做不到幂等重放时改用并发,不要复用。
67
+ - `docs-site/zh/tutorials/select-and-preview.mdx` — 选择并预览运行范围:先列出 Experiment,再用路径、评估用例前缀和 tag 收窄范围,最后用 --dry 确认计划后再花费模型与 Sandbox 成本。
46
68
  - `docs-site/zh/tutorials/theming.mdx` — 报告外观与安全边界:用 Report theme token 调整外观,同时保留唯一的产品 CSS、离线阅读与 View shell 边界。
69
+ - `docs-site/zh/tutorials/verify-judge.mdx` — 配置并验证 Judge:连接 OpenAI 兼容 Judge 网关,用一条最小评估真实预检和判分,再从结果区分配置缺失、网络失败与低质量输出。
47
70
  - `docs-site/zh/tutorials/viewing-results.mdx` — 查看 NiceEval 结果:用 show 或 view 从已发布的 Record 选择固定 Sample,并读取一个页面或完整报告站。
48
71
  - `docs-site/zh/tutorials/write-experiment.mdx` — 实验与生命周期:如何写好实验。选择 Agent、传递 model 和 flags,设置 attempts、预算、并发与 Sandbox,并用 setup / teardown 起停实验级共享服务。
49
72
  - `docs-site/zh/tutorials/write-send.mdx` — 编写 Send:分七步编写 Adapter 的 send 函数:发送消息、续接会话、记录用量、映射工具事件、处理人工介入(HITL)、接入 OTel trace,并透传 Experiment flags。
@@ -80,7 +103,7 @@
80
103
 
81
104
  - `docs-site/zh/troubleshooting/debug-sandbox.mdx` — 保留 Sandbox 现场排查问题:用 --keep-sandbox 把失败 Attempt 的 Sandbox 保留成可随时唤醒的现场,用 niceeval sandbox enter 进去手动排查,用 sandbox list / stop 查看和清理。
82
105
  - `docs-site/zh/troubleshooting/debugging.mdx` — 排查结果与报告问题:根据可见错误、Sample 状态和 rebuild 反馈,定位查看、重跑与导出问题。
83
- - `docs-site/zh/troubleshooting/recover-after-kill.mdx` — 运行被强杀后恢复:进程被 kill -9、CI 超时或断电杀掉后,重跑同一条命令续跑没跑完的部分,用 niceeval sandbox prune 收回没清理的容器,用 --teardown 补齐实验收尾。
106
+ - `docs-site/zh/troubleshooting/recover-after-kill.mdx` — 运行被强杀后恢复:进程被 kill -9、CI 超时或断电杀掉后,从已发布结果重跑、收回遗留 Sandbox、补齐实验收尾,并显式恢复共享状态租约。
84
107
 
85
108
  ## `docs-site/zh/examples/`
86
109
 
package/README.md CHANGED
@@ -88,25 +88,27 @@ See the full glossary in the [architecture overview](https://niceeval.com/docs/c
88
88
  ```ts
89
89
  // evals/eval-tool-call.eval.ts
90
90
  import { defineEval } from "niceeval";
91
+ import { includes, jsonMatch, pattern, toolMatch } from "niceeval/expect";
91
92
 
92
93
  export default defineEval({
94
+ judge: true,
93
95
  description: "Verify the agent calls the weather tool and answers from its result",
94
96
 
95
97
  async test(t) {
96
98
  const turn = await t.send("What's the weather in Beijing today?");
97
- t.succeeded();
99
+ turn.succeeded();
98
100
 
99
101
  await t.group("calls get_weather with the right city", () => {
100
- t.calledTool("get_weather", { input: { city: "Beijing" } });
101
- t.messageIncludes(/°C|sunny|cloudy|rain/);
102
+ turn.calledTool(toolMatch("get_weather", { input: jsonMatch({ city: "Beijing" }) }));
103
+ t.check(turn.message, pattern(/°C|sunny|cloudy|rain/));
102
104
  });
103
105
 
104
106
  const second = await t.send("What about Shanghai tomorrow?");
105
- second.messageIncludes("Shanghai");
107
+ t.check(second.message, includes("Shanghai"));
106
108
 
107
- t.judge.autoevals
109
+ turn.judge.autoevals
108
110
  .closedQA("Does the reply use the tool's weather data instead of making up a temperature?")
109
- .atLeast(0.7);
111
+ .gate(0.7);
110
112
  },
111
113
  });
112
114
  ```
@@ -171,7 +173,4 @@ This project was inspired by — or had its code learned by AI from — the proj
171
173
  - [agent eval](https://github.com/vercel-labs/agent-eval)
172
174
  - [ponytail](https://github.com/DietrichGebert/ponytail)
173
175
 
174
- Thanks to the following communities
175
- - WIP
176
-
177
- We also thank Linux Do for their support and feedback during the project's early development.
176
+ Thanks to [Linux.do](https://linux.do/) for their support and feedback during the project's early development.
package/README.zh.md CHANGED
@@ -88,25 +88,27 @@ NiceEval 支持两种接入方式,取决于被测 agent 是否需要隔离的
88
88
  ```ts
89
89
  // evals/eval-tool-call.eval.ts
90
90
  import { defineEval } from "niceeval";
91
+ import { includes, jsonMatch, pattern, toolMatch } from "niceeval/expect";
91
92
 
92
93
  export default defineEval({
94
+ judge: true,
93
95
  description: "测试 agent 在实时天气问题中正确调用工具并基于结果作答的能力",
94
96
 
95
97
  async test(t) {
96
98
  const turn = await t.send("北京今天天气怎么样?");
97
- t.succeeded();
99
+ turn.succeeded();
98
100
 
99
101
  await t.group("调用 get_weather 且城市正确", () => {
100
- t.calledTool("get_weather", { input: { city: "北京" } });
101
- t.messageIncludes(/°C|气温|天气|晴|多云|雨/);
102
+ turn.calledTool(toolMatch("get_weather", { input: jsonMatch({ city: "北京" }) }));
103
+ t.check(turn.message, pattern(/°C|气温|天气|晴|多云|雨/));
102
104
  });
103
105
 
104
106
  const second = await t.send("上海明天天气怎么样?");
105
- second.messageIncludes("上海");
107
+ t.check(second.message, includes("上海"));
106
108
 
107
- t.judge.autoevals
109
+ turn.judge.autoevals
108
110
  .closedQA("助手是否基于工具返回的天气数据作答,而不是凭空编造温度?")
109
- .atLeast(0.7);
111
+ .gate(0.7);
110
112
  },
111
113
  });
112
114
  ```
@@ -171,7 +173,4 @@ READ https://niceeval.com/INIT.md and set up niceeval for this repo: install it,
171
173
  - [agent eval](https://github.com/vercel-labs/agent-eval)
172
174
  - [ponytail](https://github.com/DietrichGebert/ponytail)
173
175
 
174
- 感谢下列社区
175
- - WIP
176
-
177
- 我们也感谢 Linux Do 在项目早期开发期间给予的支持与反馈。
176
+ 感谢 [Linux.do](https://linux.do/) 在项目早期开发期间给予的支持与反馈。
@@ -1 +1 @@
1
- {"version":3,"file":"ai-sdk.js","sourceRoot":"","sources":["ai-sdk.ts"],"names":[],"mappings":"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","sourcesContent":["// AI SDK(Vercel `ai` 包)结果 → 标准事件流的共享转换器(采集通道 0:进程内直构)。\n//\n// 结构化 typing,不依赖 `ai` 包:niceeval 只认识 generateText / streamText 完整结果的\n// 【形状子集】。字段名跨 AI SDK 大版本漂移(v4 args/result/promptTokens、v5+ input/output/\n// inputTokens、v7 inputTokenDetails)在这里统一兜住,adapter 作者不必各自写防御代码,也不必\n// 像手工 recorder 那样包住每个工具的 execute —— AI SDK 的 steps 里本来就有带 toolCallId 的\n// 完整调用记录。\n//\n// v7 的 tool approval(工具带 `needsApproval`)也在这里兜:\n// · `tool-approval-request` part → `input.requested` 事件 + 整轮 `status: \"waiting\"`,\n// 直接满足 HITL 契约的「waiting + input.requested」两条义务(resume 仍归 adapter 管);\n// · 批准 / 拒绝后的 resume 结果里,执行结果只出现在 `responseMessages` 的 tool 消息中\n// (不在 steps 里),这里挖出来补成 `operation.finished` —— 拒绝(execution-denied)映射成\n// `status: \"rejected\"`,喂 `calledTool(..., { status: \"rejected\" })` 与 `noFailedActions()`。\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { defineAgent } from \"../define.ts\";\nimport { makeSendFailure } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nimport { normalizeJsonValue } from \"../shared/json-value.ts\";\nimport { normalizeToolName as normalizeShared } from \"../o11y/tool-names.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport type { Agent, InputRequest, InputResponse, JsonValue, StreamEvent, ToolName, Usage } from \"../types.ts\";\n// ───────────────────────── AI SDK 结果的形状子集 ─────────────────────────\n/** 一次工具调用(v5+ 用 `input`,v4 用 `args`;两者都认)。 */\nexport interface AiSdkToolCallLike {\n toolCallId: string;\n toolName: string;\n input?: unknown;\n args?: unknown;\n}\n/** 一次工具结果(v5+ 用 `output`,v4 用 `result`)。 */\nexport interface AiSdkToolResultLike {\n toolCallId: string;\n toolName?: string;\n output?: unknown;\n result?: unknown;\n}\n/**\n * step.content 的一个 part(v5+)。带类型序:同一 step 里 reasoning / text / tool-call /\n * tool-result / tool-error / tool-approval-request 按真实发生顺序排 —— 有它就优先用它,时序保真。\n */\nexport interface AiSdkContentPartLike {\n type: string;\n text?: unknown;\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n output?: unknown;\n result?: unknown;\n error?: unknown;\n /** v7 tool approval:`tool-approval-request` part 的请求 id 与被拦下的调用。 */\n approvalId?: unknown;\n isAutomatic?: unknown;\n toolCall?: {\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n };\n}\n/** 一个 step = 一次模型调用(工具循环里的一圈)。 */\nexport interface AiSdkStepLike {\n content?: readonly AiSdkContentPartLike[];\n text?: string;\n reasoningText?: string;\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n}\nexport interface AiSdkUsageLike {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n cachedInputTokens?: number;\n /** LanguageModelUsage(v5+)对推理模型(o-series 等)带回的思考 token,已计入 outputTokens。 */\n reasoningTokens?: number;\n /** v7:cache 细分挪进了 inputTokenDetails。 */\n inputTokenDetails?: {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n}\n/** result.responseMessages 的一条(只认 tool 消息里的 tool-result part,其余略过)。 */\nexport interface AiSdkResponseMessageLike {\n role?: unknown;\n content?: unknown;\n}\n/** generateText / streamText 完整结果的形状子集。没有 steps 的老结果退回顶层字段。 */\nexport interface AiSdkResultLike {\n text?: string;\n steps?: readonly AiSdkStepLike[];\n /** v7:跨全部 step 聚合的 content parts(approval 请求也在里面)。 */\n content?: readonly AiSdkContentPartLike[];\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n /** v5/v6 聚合全部 step 的用量;优先于 usage(v6 的 usage 只是最后一个 step,v7 起也是聚合)。 */\n totalUsage?: AiSdkUsageLike;\n usage?: AiSdkUsageLike;\n /**\n * 本次调用新产生的消息(v7)。tool approval 批准 / 拒绝后,被拦工具的执行结果只出现在\n * 这里的 tool 消息里(不进 steps),turnFromAiSdk 从中补齐 `operation.finished`。\n */\n responseMessages?: readonly AiSdkResponseMessageLike[];\n}\n/** turnFromAiSdk 的返回:铺进 `Turn` 即可(data 仍归调用方 —— 结构化输出是应用自己的语义)。 */\nexport interface AiSdkTurn {\n events: StreamEvent[];\n usage?: Usage;\n /** 有待人批准的工具调用(非 automatic 的 tool-approval-request)→ \"waiting\",否则 \"completed\"。 */\n status: \"completed\" | \"waiting\";\n /** 通用 AI SDK tool call 没有原生 command 分类时,随有工具调用的 Turn 降级 actions。 */\n evidenceCoverage?: {\n readonly actions: {\n readonly status: \"partial\";\n readonly reason: string;\n };\n };\n}\n// ───────────────────────── 转换 ─────────────────────────\n/**\n * AI SDK 结果 → `{ events, usage, status }`,直接铺进 `Turn` 返回:\n *\n * ```typescript\n * const result = await generateText({ model, tools, prompt: input.text });\n * return { ...turnFromAiSdk(result), data: result.text };\n * ```\n *\n * `callId` 用 AI SDK 原生的 `toolCallId`(显式配对,不合成);工具名保留原名进 `name`,\n * canonical 名进 `tool`(认不出的域内工具落 \"unknown\",`calledTool(\"get_weather\")`\n * 仍按原名匹配)。工具执行失败(v5+ 的 `tool-error` part)映射成 `status: \"failed\"` 的\n * `operation.finished`,喂 `noFailedActions()`。\n *\n * v7 tool approval:`needsApproval` 工具被拦下时返回 `status: \"waiting\"` + 每个待批准\n * 调用一条 `input.requested`(`id` = approvalId、`action` = 工具原名、`options` =\n * approve / deny)。resume(把 `tool-approval-response` 塞回 messages 再跑一次)后的结果\n * 再交给 turnFromAiSdk,会从 `responseMessages` 里补出执行 / 拒绝的 `operation.finished`。\n */\nexport function turnFromAiSdk(result: AiSdkResultLike): AiSdkTurn {\n const stepEvents: StreamEvent[] = [];\n const steps: readonly AiSdkStepLike[] = result.steps && result.steps.length > 0\n ? result.steps\n : [{ text: result.text, toolCalls: result.toolCalls, toolResults: result.toolResults }];\n const seen = { called: new Set<string>(), resolved: new Set<string>() };\n for (const step of steps) {\n if (Array.isArray(step.content) && step.content.length > 0) {\n pushContentParts(stepEvents, step.content, seen);\n }\n else {\n pushStepFields(stepEvents, step, seen);\n }\n }\n // approval resume 时被拦工具的执行结果只在 responseMessages 里;补出的 operation.finished\n // 排在本轮 step 事件之前 —— 时间上它确实先于模型看到结果后的新输出。\n const minedEvents = mineResponseMessages(result.responseMessages, seen.resolved);\n const events = [...minedEvents, ...stepEvents];\n const waiting = events.some((e) => e.type === \"input.requested\");\n const evidenceCoverage = unclassifiedToolActionsCoverage(events);\n return {\n events,\n usage: readUsage(result, steps.length),\n status: waiting ? \"waiting\" : \"completed\",\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n}\ninterface SeenCallIds {\n called: Set<string>;\n resolved: Set<string>;\n}\n/** v5+ 路径:content parts 自带真实顺序,逐个翻译。 */\nfunction pushContentParts(events: StreamEvent[], parts: readonly AiSdkContentPartLike[], seen: SeenCallIds): void {\n for (const part of parts) {\n switch (part.type) {\n case \"text\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"message\", role: \"assistant\", text });\n break;\n }\n case \"reasoning\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"thinking\", text });\n break;\n }\n case \"tool-call\": {\n pushCalled(events, seen, {\n toolCallId: str(part.toolCallId) ?? \"unknown\",\n toolName: str(part.toolName) ?? \"unknown\",\n input: part.input ?? part.args,\n });\n break;\n }\n case \"tool-result\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: asJson(part.output ?? part.result),\n status: \"completed\",\n });\n break;\n }\n case \"tool-error\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: { error: part.error instanceof Error ? part.error.message : String(part.error) },\n status: \"failed\",\n });\n break;\n }\n case \"tool-approval-request\": {\n // 同一 step 里通常已有配对的 tool-call part(去重);没有时从 toolCall 字段补。\n const call = part.toolCall;\n if (call) {\n pushCalled(events, seen, {\n toolCallId: str(call.toolCallId) ?? \"unknown\",\n toolName: str(call.toolName) ?? \"unknown\",\n input: call.input ?? call.args,\n });\n }\n if (part.isAutomatic === true)\n break; // SDK 自动裁决,不用等人\n const request: InputRequest = {\n id: str(part.approvalId),\n action: call ? str(call.toolName) : undefined,\n input: call ? asJson(call.input ?? call.args) : undefined,\n options: [{ id: \"approve\" }, { id: \"deny\" }],\n };\n events.push({ type: \"input.requested\", request });\n break;\n }\n default:\n break; // source / file 等其余 part 类型对断言无意义,丢弃\n }\n }\n}\n/** 退路(v4 / 无 content parts):toolCalls + toolResults + text,顺序按「调用 → 结果 → 文本」近似。 */\nfunction pushStepFields(events: StreamEvent[], step: AiSdkStepLike, seen: SeenCallIds): void {\n if (step.reasoningText)\n events.push({ type: \"thinking\", text: step.reasoningText });\n for (const call of step.toolCalls ?? []) {\n pushCalled(events, seen, { toolCallId: call.toolCallId, toolName: call.toolName, input: call.input ?? call.args });\n }\n for (const res of step.toolResults ?? []) {\n seen.resolved.add(res.toolCallId);\n events.push({\n type: \"operation.finished\",\n operationId: res.toolCallId,\n kind: \"tool\",\n output: asJson(res.output ?? res.result),\n status: \"completed\",\n });\n }\n if (step.text?.trim())\n events.push({ type: \"message\", role: \"assistant\", text: step.text });\n}\n/** 同一原生 tool call ID 只发一条 operation.started(tool-call part 与 approval-request 会重)。 */\nfunction pushCalled(events: StreamEvent[], seen: SeenCallIds, call: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n}): void {\n if (seen.called.has(call.toolCallId))\n return;\n seen.called.add(call.toolCallId);\n events.push({\n type: \"operation.started\",\n operationId: call.toolCallId,\n operation: {\n kind: \"tool\",\n name: call.toolName,\n input: asJson(call.input),\n tool: normalizeToolName(call.toolName),\n },\n });\n}\n/**\n * 从 responseMessages 的 tool 消息里挖 steps 没有的 tool-result(v7 approval resume 的\n * 执行结果只在这里)。output 是 ToolResultOutput 包装({ type: \"json\" | \"text\" |\n * \"execution-denied\" | \"error-text\" | … }),按类型解包;`execution-denied` → \"rejected\"。\n */\nfunction mineResponseMessages(messages: readonly AiSdkResponseMessageLike[] | undefined, resolved: ReadonlySet<string>): StreamEvent[] {\n const events: StreamEvent[] = [];\n for (const msg of messages ?? []) {\n if (msg.role !== \"tool\" || !Array.isArray(msg.content))\n continue;\n for (const part of msg.content as AiSdkContentPartLike[]) {\n if (part.type !== \"tool-result\")\n continue;\n const callId = str(part.toolCallId);\n if (!callId || resolved.has(callId))\n continue;\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", ...unwrapToolOutput(part.output) });\n }\n }\n return events;\n}\nfunction unwrapToolOutput(output: unknown): {\n output?: JsonValue;\n status: \"completed\" | \"failed\" | \"rejected\";\n} {\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n const wrapped = output as {\n type?: unknown;\n value?: unknown;\n reason?: unknown;\n };\n switch (wrapped.type) {\n case \"json\":\n case \"text\":\n case \"content\":\n return { output: asJson(wrapped.value), status: \"completed\" };\n case \"execution-denied\":\n return {\n output: str(wrapped.reason) ? { reason: str(wrapped.reason)! } : undefined,\n status: \"rejected\",\n };\n case \"error-text\":\n case \"error-json\":\n return { output: { error: asJson(wrapped.value) }, status: \"failed\" };\n default:\n break;\n }\n }\n return { output: asJson(output), status: \"completed\" };\n}\n/** totalUsage(v5/v6 的全 steps 聚合)优先;v7 的 usage 本身就是聚合;requests = step 数。 */\nfunction readUsage(result: AiSdkResultLike, stepCount: number): Usage | undefined {\n const u = result.totalUsage ?? result.usage;\n if (!u)\n return undefined;\n const rawInput = num(u.inputTokens) ?? num(u.promptTokens) ?? 0;\n const outputTokens = num(u.outputTokens) ?? num(u.completionTokens) ?? 0;\n if (rawInput === 0 && outputTokens === 0)\n return undefined;\n const cacheRead = num(u.cachedInputTokens) ?? num(u.inputTokenDetails?.cacheReadTokens) ?? 0;\n const cacheCreation = num(u.inputTokenDetails?.cacheWriteTokens) ?? 0;\n // AI SDK 的 inputTokens 是含缓存明细的输入总量,落互斥桶前扣掉在场的明细\n // (docs/feature/adapters/sdk/ai-sdk/cost.md)\n const inputTokens = Math.max(0, rawInput - cacheRead - cacheCreation);\n const usage: Usage = { inputTokens, outputTokens, requests: Math.max(stepCount, 1) };\n if (cacheRead)\n usage.cacheReadTokens = cacheRead;\n if (cacheCreation)\n usage.cacheCreationTokens = cacheCreation;\n const reasoning = num(u.reasoningTokens);\n if (reasoning)\n usage.reasoningTokens = reasoning;\n return usage;\n}\n/** AI SDK 应用的工具多为域内自定义名(get_weather…),canonical 落 \"unknown\" 即可;仅认通用别名基表。 */\nfunction normalizeToolName(name: string): ToolName {\n return normalizeShared(name);\n}\n/** 工具入参 / 出参来自可替换的 AI SDK 版本;在边界立即清洗成领域 JsonValue。 */\nfunction asJson(value: unknown): JsonValue {\n return normalizeJsonValue(value);\n}\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\nfunction num(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n// ───────────────────────── 内建 agent 工厂 ─────────────────────────\n/**\n * `generate` 收到的上下文。`messages` 是本会话的完整 ModelMessage 历史(含本轮的用户消息 /\n * approval 裁决),直接透传给 generateText / streamText 即可;泛型 `M` 由调用方钉成自己\n * AI SDK 版本的 `ModelMessage`,niceeval 不引 `ai` 包。\n */\nexport interface AiSdkGenerateContext<M = JsonValue, Integration extends object = object> {\n readonly messages: M[];\n /** 实验钉的 model(ctx.model);省略 → 用应用自己的默认。 */\n readonly model?: string;\n /** 实验钉的推理努力程度(ctx.reasoningEffort);省略 → 用应用自己的默认。应用自己决定怎么塞进 providerOptions(如 OpenAI 的 reasoningEffort)。 */\n readonly reasoningEffort?: string;\n readonly signal: AbortSignal;\n readonly flags: Readonly<globalThis.Record<string, JsonValue>>;\n /**\n * 配了 `tracing`(如 `aiSdkOtel()`)才有:直接放进 generateText / streamText 的\n * `telemetry` 选项。OTel provider、per-attempt 端点绑定和轮末 flush 都由工厂做,\n * 应用侧原样透传即可。\n */\n readonly telemetry?: AiSdkTelemetrySettings<Integration>;\n}\n/**\n * generateText / streamText 的 `telemetry` 选项的形状子集。integrations 的元素是\n * `@ai-sdk/otel` 的集成实例。`Integration` 由 tracing 实现携带,niceeval 不引\n * 用户版本的 `ai` 包,也不在中间层抹成 `any`。\n */\nexport interface AiSdkTelemetrySettings<Integration extends object = object> {\n readonly integrations: readonly Integration[];\n}\n/** tracing 管线为某一轮建好的遥测件(`AiSdkTracing.telemetryForEndpoint` 的返回值)。 */\nexport interface AiSdkTurnTelemetry<Integration extends object = object> {\n /** 直接放进 generateText / streamText 的 `telemetry` 选项。 */\n settings: AiSdkTelemetrySettings<Integration>;\n /** 每轮结束后由工厂调用:轮次归属靠时间窗口,span 必须立刻送到,不能等 batch。 */\n flush(): Promise<void>;\n}\n/**\n * `aiSdkAgent` 的 tracing 管线契约。内置实现是 `niceeval/adapter/otel` 的 `aiSdkOtel()`——\n * 独立子路径导出,OTel 三件套是可选 peer 依赖,只有 import 那个入口的项目才需要安装;\n * 这里只放形状,`niceeval/adapter` 本身零 OTel 依赖。\n */\nexport interface AiSdkTracing<Integration extends object = object> {\n /** 为本轮的 OTLP 接收端点建(或复用)一条导出管线。每个 attempt 端点不同,按端点缓存。 */\n telemetryForEndpoint(endpoint: string): AiSdkTurnTelemetry<Integration>;\n}\nexport interface AiSdkAgentOptions<M = JsonValue, Integration extends object = object> {\n /** agent 名(报告 / 结果聚合的身份)。默认 \"ai-sdk\"。 */\n name?: string;\n /**\n * 开 OTel 管线(拿 `niceeval view` 的瀑布图):传 `niceeval/adapter/otel` 的\n * `aiSdkOtel()`。设了运行器就为这个 agent 开 per-attempt OTLP 接收器,工厂每轮用\n * 管线建好绑定接收端点的集成,经 `generate` 的 ctx.telemetry 交给应用,原样透传给\n * generateText / streamText 的 `telemetry` 选项即可。省略则整个 OTel 管线不开,\n * `generate` 拿到的 `telemetry` 恒为 undefined,应用侧零开销。\n *\n * ```typescript\n * import { aiSdkOtel } from \"niceeval/adapter/otel\";\n * aiSdkAgent({ tracing: aiSdkOtel(), generate });\n * ```\n */\n tracing?: AiSdkTracing<Integration>;\n /**\n * 每轮一召:拿会话历史跑一次 generateText / streamText(await 完整结果)并原样返回。\n * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。\n */\n generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;\n /** 本轮的结构化输出(Turn.data,喂 outputEquals / outputMatches)。省略则 data 为 undefined。 */\n data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;\n}\n/**\n * 内建的 AI SDK 进程内 agent 工厂:把「一个 generateText 调用」变成完整的 niceeval agent。\n * 应用只写 `generate`(怎么召模型),协议侧的活全部由工厂承担:\n *\n * · 多轮会话:ctx.session.id 未记录时开新会话线并 capture 回写,同一 id 续接同一份\n * messages 历史;\n * · 事件流:结果经 {@link turnFromAiSdk} 直构(toolCallId 配对、时序保真、usage);\n * · HITL:`needsApproval` 工具停轮 → `waiting` + `input.requested`;下一轮输入按行翻译成\n * tool-approval-response(以 approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝)塞回\n * messages 再召 `generate`,SDK 才会执行(或跳过)被拦的工具;\n * · 失败兜底:`generate` 抛错或结果完全为空 → `status: \"failed\"` + error 事件;\n * · tracing:传 `tracing: aiSdkOtel()`(来自 `niceeval/adapter/otel`)后,工厂替应用\n * 做完 OTel 管线——为每轮建好绑定 niceeval 接收端点的 `@ai-sdk/otel` 集成(经\n * ctx.telemetry 交给 generate,原样透传给 generateText 的 `telemetry` 即可)并在轮末\n * flush;`aiSdkOtel({ backendUrl })` 可选双发到你自己的观测后端。应用侧零埋点代码。\n *\n * ```typescript\n * import { aiSdkAgent } from \"niceeval/adapter\";\n * import { generateText, isStepCount, type ModelMessage } from \"ai\";\n *\n * export const assistant = aiSdkAgent<ModelMessage>({\n * name: \"my-assistant\",\n * generate: ({ messages, model, signal }) =>\n * generateText({ model: resolveModel(model), system: SYSTEM_PROMPT,\n * tools, stopWhen: isStepCount(5), messages, abortSignal: signal }),\n * data: (result) => ({ reply: result.text }),\n * });\n * ```\n */\nexport function aiSdkAgent<M = JsonValue, Integration extends object = object>(options: AiSdkAgentOptions<M, Integration>): Agent {\n interface SessionState {\n messages: M[];\n /** 上一轮停下的 tool approval:下一轮输入按行翻译成裁决。 */\n pendingApprovals: string[];\n }\n const sessions = new Map<string, SessionState>();\n return defineAgent({\n name: options.name ?? \"ai-sdk\",\n // 官方 SDK 完整 steps/output:全通道 complete(见 adapters/architecture/evidence.md)。\n evidenceCoverage: completeEvidenceCoverage,\n // tracing 开了才让运行器为这个 agent 起 OTLP 接收器(ctx.telemetry 才会出现);\n // AgentTracing 的其余字段(env/configure/scope)这里都用不上,空对象即可。\n tracing: options.tracing ? {} : undefined,\n async send(input, ctx) {\n // 会话续接:ctx.session.id 未记录时开新会话并 capture 回写;否则按 id 续接同一份历史。\n const id = ctx.session.id ?? `ai-sdk-${randomUUID()}`;\n ctx.session.capture(id);\n let state = sessions.get(id);\n if (!state) {\n state = { messages: [], pendingApprovals: [] };\n sessions.set(id, state);\n }\n if (state.pendingApprovals.length > 0) {\n // HITL:t.respond 的回答到 adapter 就是一次普通的带 responses 的 send,按\n // requestId(= approvalId)对位取裁决;没答到的请求直接报错,不从文本猜。\n const content = state.pendingApprovals.map((approvalId) => ({\n type: \"tool-approval-response\" as const,\n approvalId,\n approved: approvalDecision(input.responses, approvalId),\n }));\n state.pendingApprovals = [];\n state.messages.push({ role: \"tool\", content } as M);\n }\n else {\n state.messages.push(userMessage(input.text, input.files) as M);\n }\n // tracing 管线由调用方显式传入(niceeval/adapter/otel 的 aiSdkOtel()),工厂只管\n // 每轮把 per-attempt 端点交给它、轮末 flush。\n const otel = ctx.telemetry && options.tracing ? options.tracing.telemetryForEndpoint(ctx.telemetry.endpoint) : undefined;\n let result: AiSdkResultLike;\n try {\n result = await options.generate({\n messages: state.messages,\n model: ctx.model,\n reasoningEffort: ctx.reasoningEffort,\n signal: ctx.signal,\n flags: ctx.flags,\n telemetry: otel?.settings,\n });\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw makeSendFailure({ acceptance: \"unknown\", message, cause: normalizeExternalCause(error) });\n }\n finally {\n // 轮次归属靠时间窗口:本轮 span 必须在 send 返回前送到接收器,不能等 batch。\n await otel?.flush();\n }\n // resume 的另一半义务:本次调用新产生的消息(含 approval 执行结果)进历史。\n state.messages.push(...((result.responseMessages ?? []) as M[]));\n state.pendingApprovals = collectPendingApprovals(result);\n const turn = turnFromAiSdk(result);\n // 上游偶尔退化返回完全空的结果;当正常回复会把故障伪装成通过,按失败处理。\n if (turn.events.length === 0) {\n throw makeSendFailure({\n acceptance: \"unknown\",\n message: \"AI SDK returned an empty result (no text, no tool calls)\",\n });\n }\n return { ...turn, data: options.data?.(result, turn) };\n },\n });\n}\n/** 裁决词法(t.respond 的自由文本回答):approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝。 */\nfunction isApproved(line: string): boolean {\n return /^(approve|yes|同意|批准)/i.test(line);\n}\n/** 按 requestId(= approvalId)从 input.responses 对位取裁决;optionId 优先,自由文本走 isApproved。 */\nfunction approvalDecision(responses: readonly InputResponse[] | undefined, requestId: string): boolean {\n const matched = responses?.find((r) => r.requestId === requestId);\n if (!matched) {\n throw new Error(`No response for pending approval \"${requestId}\". Answer approval requests with t.respond(...).`);\n }\n if (matched.optionId !== undefined)\n return matched.optionId === \"approve\";\n return isApproved(matched.text?.trim() ?? \"\");\n}\n/** 待人批准的 approval 请求 id(非 automatic)。steps 优先,退回 v7 顶层聚合 content。 */\nfunction collectPendingApprovals(result: AiSdkResultLike): string[] {\n const parts: AiSdkContentPartLike[] = [];\n if (result.steps?.length) {\n for (const step of result.steps)\n if (Array.isArray(step.content))\n parts.push(...step.content);\n }\n else if (Array.isArray(result.content)) {\n parts.push(...result.content);\n }\n const ids: string[] = [];\n for (const part of parts) {\n if (part.type !== \"tool-approval-request\" || part.isAutomatic === true)\n continue;\n const approvalId = str(part.approvalId);\n if (approvalId)\n ids.push(approvalId);\n }\n return ids;\n}\n/**\n * t.sendFile 带来的文件(base64)转成 AI SDK 的多模态用户消息;纯文本就是纯文本。\n * 用 `file` part(v7 推荐;`image` part 已废弃),mediaType 原样透传,图片之外的附件也能走。\n */\nfunction userMessage(text: string, files: readonly {\n mimeType: string;\n dataBase64: string;\n}[] | undefined): unknown {\n if (!files || files.length === 0)\n return { role: \"user\", content: text };\n return {\n role: \"user\",\n content: [\n { type: \"text\", text: text || \"请描述这个附件。\" },\n ...files.map((f) => ({ type: \"file\", mediaType: f.mimeType, data: f.dataBase64 })),\n ],\n };\n}\n"]}
1
+ {"version":3,"file":"ai-sdk.js","sourceRoot":"","sources":["ai-sdk.ts"],"names":[],"mappings":"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","sourcesContent":["// AI SDK(Vercel `ai` 包)结果 → 标准事件流的共享转换器(采集通道 0:进程内直构)。\n//\n// 结构化 typing,不依赖 `ai` 包:niceeval 只认识 generateText / streamText 完整结果的\n// 【形状子集】。字段名跨 AI SDK 大版本漂移(v4 args/result/promptTokens、v5+ input/output/\n// inputTokens、v7 inputTokenDetails)在这里统一兜住,adapter 作者不必各自写防御代码,也不必\n// 像手工 recorder 那样包住每个工具的 execute —— AI SDK 的 steps 里本来就有带 toolCallId 的\n// 完整调用记录。\n//\n// v7 的 tool approval(工具带 `needsApproval`)也在这里兜:\n// · `tool-approval-request` part → `input.requested` 事件 + 整轮 `status: \"waiting\"`,\n// 直接满足 HITL 契约的「waiting + input.requested」两条义务(resume 仍归 adapter 管);\n// · 批准 / 拒绝后的 resume 结果里,执行结果只出现在 `responseMessages` 的 tool 消息中\n// (不在 steps 里),这里挖出来补成 `operation.finished` —— 拒绝(execution-denied)映射成\n// `status: \"rejected\"`,喂 `calledTool(..., { status: \"rejected\" })` 与 `noFailedActions()`。\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { defineAgent } from \"../define.ts\";\nimport { makeSendFailure } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nimport { normalizeJsonValue } from \"../shared/json-value.ts\";\nimport { normalizeToolName as normalizeShared } from \"../o11y/tool-names.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport type { Agent, InputRequest, InputResponse, JsonValue, StreamEvent, ToolName, Usage } from \"../types.ts\";\n// ───────────────────────── AI SDK 结果的形状子集 ─────────────────────────\n/** 一次工具调用(v5+ 用 `input`,v4 用 `args`;两者都认)。 */\nexport interface AiSdkToolCallLike {\n toolCallId: string;\n toolName: string;\n input?: unknown;\n args?: unknown;\n}\n/** 一次工具结果(v5+ 用 `output`,v4 用 `result`)。 */\nexport interface AiSdkToolResultLike {\n toolCallId: string;\n toolName?: string;\n output?: unknown;\n result?: unknown;\n}\n/**\n * step.content 的一个 part(v5+)。带类型序:同一 step 里 reasoning / text / tool-call /\n * tool-result / tool-error / tool-approval-request 按真实发生顺序排 —— 有它就优先用它,时序保真。\n */\nexport interface AiSdkContentPartLike {\n type: string;\n text?: unknown;\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n output?: unknown;\n result?: unknown;\n error?: unknown;\n /** v7 tool approval:`tool-approval-request` part 的请求 id 与被拦下的调用。 */\n approvalId?: unknown;\n isAutomatic?: unknown;\n toolCall?: {\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n };\n}\n/** 一个 step = 一次模型调用(工具循环里的一圈)。 */\nexport interface AiSdkStepLike {\n content?: readonly AiSdkContentPartLike[];\n text?: string;\n reasoningText?: string;\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n}\nexport interface AiSdkUsageLike {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n cachedInputTokens?: number;\n /** LanguageModelUsage(v5+)对推理模型(o-series 等)带回的思考 token,已计入 outputTokens。 */\n reasoningTokens?: number;\n /** v7:cache 细分挪进了 inputTokenDetails。 */\n inputTokenDetails?: {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n}\n/** result.responseMessages 的一条(只认 tool 消息里的 tool-result part,其余略过)。 */\nexport interface AiSdkResponseMessageLike {\n role?: unknown;\n content?: unknown;\n}\n/** generateText / streamText 完整结果的形状子集。没有 steps 的老结果退回顶层字段。 */\nexport interface AiSdkResultLike {\n text?: string;\n steps?: readonly AiSdkStepLike[];\n /** v7:跨全部 step 聚合的 content parts(approval 请求也在里面)。 */\n content?: readonly AiSdkContentPartLike[];\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n /** v5/v6 聚合全部 step 的用量;优先于 usage(v6 的 usage 只是最后一个 step,v7 起也是聚合)。 */\n totalUsage?: AiSdkUsageLike;\n usage?: AiSdkUsageLike;\n /**\n * 本次调用新产生的消息(v7)。tool approval 批准 / 拒绝后,被拦工具的执行结果只出现在\n * 这里的 tool 消息里(不进 steps),turnFromAiSdk 从中补齐 `operation.finished`。\n */\n responseMessages?: readonly AiSdkResponseMessageLike[];\n}\n/** turnFromAiSdk 的返回:铺进 `Turn` 即可(data 仍归调用方 —— 结构化输出是应用自己的语义)。 */\nexport interface AiSdkTurn {\n events: StreamEvent[];\n usage?: Usage;\n /** 有待人批准的工具调用(非 automatic 的 tool-approval-request)→ \"waiting\",否则 \"completed\"。 */\n status: \"completed\" | \"waiting\";\n /** 通用 AI SDK tool call 没有原生 command 分类时,随有工具调用的 Turn 降级 actions。 */\n evidenceCoverage?: {\n readonly actions: {\n readonly status: \"partial\";\n readonly reason: string;\n };\n };\n}\n// ───────────────────────── 转换 ─────────────────────────\n/**\n * AI SDK 结果 → `{ events, usage, status }`,直接铺进 `Turn` 返回:\n *\n * ```typescript\n * const result = await generateText({ model, tools, prompt: input.text });\n * return { ...turnFromAiSdk(result), data: result.text };\n * ```\n *\n * `callId` 用 AI SDK 原生的 `toolCallId`(显式配对,不合成);工具名保留原名进 `name`,\n * canonical 名进 `tool`(认不出的域内工具落 \"unknown\",`calledTool(\"get_weather\")`\n * 仍按原名匹配)。工具执行失败(v5+ 的 `tool-error` part)映射成 `status: \"failed\"` 的\n * `operation.finished`,喂 `noFailedActions()`。\n *\n * v7 tool approval:`needsApproval` 工具被拦下时返回 `status: \"waiting\"` + 每个待批准\n * 调用一条 `input.requested`(`id` = approvalId、`action` = 工具原名、`options` =\n * approve / deny)。resume(把 `tool-approval-response` 塞回 messages 再跑一次)后的结果\n * 再交给 turnFromAiSdk,会从 `responseMessages` 里补出执行 / 拒绝的 `operation.finished`。\n */\nexport function turnFromAiSdk(result: AiSdkResultLike): AiSdkTurn {\n const stepEvents: StreamEvent[] = [];\n const steps: readonly AiSdkStepLike[] = result.steps && result.steps.length > 0\n ? result.steps\n : [{ text: result.text, toolCalls: result.toolCalls, toolResults: result.toolResults }];\n const seen = { called: new Set<string>(), resolved: new Set<string>() };\n for (const step of steps) {\n if (Array.isArray(step.content) && step.content.length > 0) {\n pushContentParts(stepEvents, step.content, seen);\n }\n else {\n pushStepFields(stepEvents, step, seen);\n }\n }\n // approval resume 时被拦工具的执行结果只在 responseMessages 里;补出的 operation.finished\n // 排在本轮 step 事件之前 —— 时间上它确实先于模型看到结果后的新输出。\n const minedEvents = mineResponseMessages(result.responseMessages, seen.resolved);\n const events = [...minedEvents, ...stepEvents];\n const waiting = events.some((e) => e.type === \"input.requested\");\n const evidenceCoverage = unclassifiedToolActionsCoverage(events);\n return {\n events,\n usage: readUsage(result, steps.length),\n status: waiting ? \"waiting\" : \"completed\",\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n}\ninterface SeenCallIds {\n called: Set<string>;\n resolved: Set<string>;\n}\n/** v5+ 路径:content parts 自带真实顺序,逐个翻译。 */\nfunction pushContentParts(events: StreamEvent[], parts: readonly AiSdkContentPartLike[], seen: SeenCallIds): void {\n for (const part of parts) {\n switch (part.type) {\n case \"text\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"message\", role: \"assistant\", text });\n break;\n }\n case \"reasoning\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"thinking\", text });\n break;\n }\n case \"tool-call\": {\n pushCalled(events, seen, {\n toolCallId: str(part.toolCallId) ?? \"unknown\",\n toolName: str(part.toolName) ?? \"unknown\",\n input: part.input ?? part.args,\n });\n break;\n }\n case \"tool-result\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: asJson(part.output ?? part.result),\n status: \"completed\",\n });\n break;\n }\n case \"tool-error\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: { error: part.error instanceof Error ? part.error.message : String(part.error) },\n status: \"failed\",\n });\n break;\n }\n case \"tool-approval-request\": {\n // 同一 step 里通常已有配对的 tool-call part(去重);没有时从 toolCall 字段补。\n const call = part.toolCall;\n if (call) {\n pushCalled(events, seen, {\n toolCallId: str(call.toolCallId) ?? \"unknown\",\n toolName: str(call.toolName) ?? \"unknown\",\n input: call.input ?? call.args,\n });\n }\n if (part.isAutomatic === true)\n break; // SDK 自动裁决,不用等人\n const request: InputRequest = {\n id: str(part.approvalId),\n action: call ? str(call.toolName) : undefined,\n input: call ? asJson(call.input ?? call.args) : undefined,\n options: [{ id: \"approve\" }, { id: \"deny\" }],\n };\n events.push({ type: \"input.requested\", request });\n break;\n }\n default:\n break; // source / file 等其余 part 类型对断言无意义,丢弃\n }\n }\n}\n/** 退路(v4 / 无 content parts):toolCalls + toolResults + text,顺序按「调用 → 结果 → 文本」近似。 */\nfunction pushStepFields(events: StreamEvent[], step: AiSdkStepLike, seen: SeenCallIds): void {\n if (step.reasoningText)\n events.push({ type: \"thinking\", text: step.reasoningText });\n for (const call of step.toolCalls ?? []) {\n pushCalled(events, seen, { toolCallId: call.toolCallId, toolName: call.toolName, input: call.input ?? call.args });\n }\n for (const res of step.toolResults ?? []) {\n seen.resolved.add(res.toolCallId);\n events.push({\n type: \"operation.finished\",\n operationId: res.toolCallId,\n kind: \"tool\",\n output: asJson(res.output ?? res.result),\n status: \"completed\",\n });\n }\n if (step.text?.trim())\n events.push({ type: \"message\", role: \"assistant\", text: step.text });\n}\n/** 同一原生 tool call ID 只发一条 operation.started(tool-call part 与 approval-request 会重)。 */\nfunction pushCalled(events: StreamEvent[], seen: SeenCallIds, call: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n}): void {\n if (seen.called.has(call.toolCallId))\n return;\n seen.called.add(call.toolCallId);\n events.push({\n type: \"operation.started\",\n operationId: call.toolCallId,\n operation: {\n kind: \"tool\",\n name: call.toolName,\n input: asJson(call.input),\n tool: normalizeToolName(call.toolName),\n },\n });\n}\n/**\n * 从 responseMessages 的 tool 消息里挖 steps 没有的 tool-result(v7 approval resume 的\n * 执行结果只在这里)。output 是 ToolResultOutput 包装({ type: \"json\" | \"text\" |\n * \"execution-denied\" | \"error-text\" | … }),按类型解包;`execution-denied` → \"rejected\"。\n */\nfunction mineResponseMessages(messages: readonly AiSdkResponseMessageLike[] | undefined, resolved: ReadonlySet<string>): StreamEvent[] {\n const events: StreamEvent[] = [];\n for (const msg of messages ?? []) {\n if (msg.role !== \"tool\" || !Array.isArray(msg.content))\n continue;\n for (const part of msg.content as AiSdkContentPartLike[]) {\n if (part.type !== \"tool-result\")\n continue;\n const callId = str(part.toolCallId);\n if (!callId || resolved.has(callId))\n continue;\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", ...unwrapToolOutput(part.output) });\n }\n }\n return events;\n}\nfunction unwrapToolOutput(output: unknown): {\n output?: JsonValue;\n status: \"completed\" | \"failed\" | \"rejected\";\n} {\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n const wrapped = output as {\n type?: unknown;\n value?: unknown;\n reason?: unknown;\n };\n switch (wrapped.type) {\n case \"json\":\n case \"text\":\n case \"content\":\n return { output: asJson(wrapped.value), status: \"completed\" };\n case \"execution-denied\":\n return {\n output: str(wrapped.reason) ? { reason: str(wrapped.reason)! } : undefined,\n status: \"rejected\",\n };\n case \"error-text\":\n case \"error-json\":\n return { output: { error: asJson(wrapped.value) }, status: \"failed\" };\n default:\n break;\n }\n }\n return { output: asJson(output), status: \"completed\" };\n}\n/** totalUsage(v5/v6 的全 steps 聚合)优先;v7 的 usage 本身就是聚合;requests = step 数。 */\nfunction readUsage(result: AiSdkResultLike, stepCount: number): Usage | undefined {\n const u = result.totalUsage ?? result.usage;\n if (!u)\n return undefined;\n const rawInput = num(u.inputTokens) ?? num(u.promptTokens) ?? 0;\n const outputTokens = num(u.outputTokens) ?? num(u.completionTokens) ?? 0;\n if (rawInput === 0 && outputTokens === 0)\n return undefined;\n const cacheRead = num(u.cachedInputTokens) ?? num(u.inputTokenDetails?.cacheReadTokens) ?? 0;\n const cacheCreation = num(u.inputTokenDetails?.cacheWriteTokens) ?? 0;\n // AI SDK 的 inputTokens 是含缓存明细的输入总量,落互斥桶前扣掉在场的明细\n // (docs/feature/adapters/sdk/ai-sdk/cost.md)\n const inputTokens = Math.max(0, rawInput - cacheRead - cacheCreation);\n const usage: Usage = { inputTokens, outputTokens, requests: Math.max(stepCount, 1) };\n if (cacheRead)\n usage.cacheReadTokens = cacheRead;\n if (cacheCreation)\n usage.cacheCreationTokens = cacheCreation;\n const reasoning = num(u.reasoningTokens);\n if (reasoning)\n usage.reasoningTokens = reasoning;\n return usage;\n}\n/** AI SDK 应用的工具多为域内自定义名(get_weather…),canonical 落 \"unknown\" 即可;仅认通用别名基表。 */\nfunction normalizeToolName(name: string): ToolName {\n return normalizeShared(name);\n}\n/** 工具入参 / 出参来自可替换的 AI SDK 版本;在边界立即清洗成领域 JsonValue。 */\nfunction asJson(value: unknown): JsonValue {\n return normalizeJsonValue(value);\n}\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\nfunction num(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n// ───────────────────────── 内建 agent 工厂 ─────────────────────────\n/**\n * `generate` 收到的上下文。`messages` 是本会话的完整 ModelMessage 历史(含本轮的用户消息 /\n * approval 裁决),直接透传给 generateText / streamText 即可;泛型 `M` 由调用方钉成自己\n * AI SDK 版本的 `ModelMessage`,niceeval 不引 `ai` 包。\n */\nexport interface AiSdkGenerateContext<M = JsonValue, Integration extends object = object> {\n readonly messages: M[];\n /** 实验钉的 model(ctx.model);省略 → 用应用自己的默认。 */\n readonly model?: string;\n /** 实验钉的推理努力程度(ctx.reasoningEffort);省略 → 用应用自己的默认。应用自己决定怎么塞进 providerOptions(如 OpenAI 的 reasoningEffort)。 */\n readonly reasoningEffort?: string;\n readonly signal: AbortSignal;\n readonly flags: Readonly<globalThis.Record<string, JsonValue>>;\n /**\n * 配了 `tracing`(如 `aiSdkOtel()`)才有:直接放进 generateText / streamText 的\n * `telemetry` 选项。OTel provider、per-attempt 端点绑定和轮末 flush 都由工厂做,\n * 应用侧原样透传即可。\n */\n readonly telemetry?: AiSdkTelemetrySettings<Integration>;\n}\n/**\n * generateText / streamText 的 `telemetry` 选项的形状子集。integrations 的元素是\n * `@ai-sdk/otel` 的集成实例。`Integration` 由 tracing 实现携带,niceeval 不引\n * 用户版本的 `ai` 包,也不在中间层抹成 `any`。\n */\nexport interface AiSdkTelemetrySettings<Integration extends object = object> {\n readonly integrations: readonly Integration[];\n}\n/** tracing 管线为某一轮建好的遥测件(`AiSdkTracing.telemetryForEndpoint` 的返回值)。 */\nexport interface AiSdkTurnTelemetry<Integration extends object = object> {\n /** 直接放进 generateText / streamText 的 `telemetry` 选项。 */\n settings: AiSdkTelemetrySettings<Integration>;\n /** 每轮结束后由工厂调用:轮次归属靠时间窗口,span 必须立刻送到,不能等 batch。 */\n flush(): Promise<void>;\n}\n/**\n * `aiSdkAgent` 的 tracing 管线契约。内置实现是 `niceeval/adapter/otel` 的 `aiSdkOtel()`——\n * 独立子路径导出,OTel 三件套是可选 peer 依赖,只有 import 那个入口的项目才需要安装;\n * 这里只放形状,`niceeval/adapter` 本身零 OTel 依赖。\n */\nexport interface AiSdkTracing<Integration extends object = object> {\n /** 为本轮的 OTLP 接收端点建(或复用)一条导出管线。每个 attempt 端点不同,按端点缓存。 */\n telemetryForEndpoint(endpoint: string): AiSdkTurnTelemetry<Integration>;\n}\nexport interface AiSdkAgentOptions<M = JsonValue, Integration extends object = object> {\n /** agent 名(报告 / 结果聚合的身份)。默认 \"ai-sdk\"。 */\n name?: string;\n /**\n * 开 OTel 管线(拿 `niceeval view` 的瀑布图):传 `niceeval/adapter/otel` 的\n * `aiSdkOtel()`。设了运行器就为这个 agent 开 per-attempt OTLP 接收器,工厂每轮用\n * 管线建好绑定接收端点的集成,经 `generate` 的 ctx.telemetry 交给应用,原样透传给\n * generateText / streamText 的 `telemetry` 选项即可。省略则整个 OTel 管线不开,\n * `generate` 拿到的 `telemetry` 恒为 undefined,应用侧零开销。\n *\n * ```typescript\n * import { aiSdkOtel } from \"niceeval/adapter/otel\";\n * aiSdkAgent({ tracing: aiSdkOtel(), generate });\n * ```\n */\n tracing?: AiSdkTracing<Integration>;\n /**\n * 每轮一召:拿会话历史跑一次 generateText / streamText(await 完整结果)并原样返回。\n * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。\n */\n generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;\n /** 本轮的结构化输出(Turn.data,供 `t.check(turn.data, match)` 使用)。省略则 data 为 undefined。 */\n data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;\n}\n/**\n * 内建的 AI SDK 进程内 agent 工厂:把「一个 generateText 调用」变成完整的 niceeval agent。\n * 应用只写 `generate`(怎么召模型),协议侧的活全部由工厂承担:\n *\n * · 多轮会话:ctx.session.id 未记录时开新会话线并 capture 回写,同一 id 续接同一份\n * messages 历史;\n * · 事件流:结果经 {@link turnFromAiSdk} 直构(toolCallId 配对、时序保真、usage);\n * · HITL:`needsApproval` 工具停轮 → `waiting` + `input.requested`;下一轮输入按行翻译成\n * tool-approval-response(以 approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝)塞回\n * messages 再召 `generate`,SDK 才会执行(或跳过)被拦的工具;\n * · 失败兜底:`generate` 抛错或结果完全为空 → `status: \"failed\"` + error 事件;\n * · tracing:传 `tracing: aiSdkOtel()`(来自 `niceeval/adapter/otel`)后,工厂替应用\n * 做完 OTel 管线——为每轮建好绑定 niceeval 接收端点的 `@ai-sdk/otel` 集成(经\n * ctx.telemetry 交给 generate,原样透传给 generateText 的 `telemetry` 即可)并在轮末\n * flush;`aiSdkOtel({ backendUrl })` 可选双发到你自己的观测后端。应用侧零埋点代码。\n *\n * ```typescript\n * import { aiSdkAgent } from \"niceeval/adapter\";\n * import { generateText, isStepCount, type ModelMessage } from \"ai\";\n *\n * export const assistant = aiSdkAgent<ModelMessage>({\n * name: \"my-assistant\",\n * generate: ({ messages, model, signal }) =>\n * generateText({ model: resolveModel(model), system: SYSTEM_PROMPT,\n * tools, stopWhen: isStepCount(5), messages, abortSignal: signal }),\n * data: (result) => ({ reply: result.text }),\n * });\n * ```\n */\nexport function aiSdkAgent<M = JsonValue, Integration extends object = object>(options: AiSdkAgentOptions<M, Integration>): Agent {\n interface SessionState {\n messages: M[];\n /** 上一轮停下的 tool approval:下一轮输入按行翻译成裁决。 */\n pendingApprovals: string[];\n }\n const sessions = new Map<string, SessionState>();\n return defineAgent({\n name: options.name ?? \"ai-sdk\",\n // 官方 SDK 完整 steps/output:全通道 complete(见 adapters/architecture/evidence.md)。\n evidenceCoverage: completeEvidenceCoverage,\n // tracing 开了才让运行器为这个 agent 起 OTLP 接收器(ctx.telemetry 才会出现);\n // AgentTracing 的其余字段(env/configure/scope)这里都用不上,空对象即可。\n tracing: options.tracing ? {} : undefined,\n async send(input, ctx) {\n // 会话续接:ctx.session.id 未记录时开新会话并 capture 回写;否则按 id 续接同一份历史。\n const id = ctx.session.id ?? `ai-sdk-${randomUUID()}`;\n ctx.session.capture(id);\n let state = sessions.get(id);\n if (!state) {\n state = { messages: [], pendingApprovals: [] };\n sessions.set(id, state);\n }\n if (state.pendingApprovals.length > 0) {\n // HITL:t.respond 的回答到 adapter 就是一次普通的带 responses 的 send,按\n // requestId(= approvalId)对位取裁决;没答到的请求直接报错,不从文本猜。\n const content = state.pendingApprovals.map((approvalId) => ({\n type: \"tool-approval-response\" as const,\n approvalId,\n approved: approvalDecision(input.responses, approvalId),\n }));\n state.pendingApprovals = [];\n state.messages.push({ role: \"tool\", content } as M);\n }\n else {\n state.messages.push(userMessage(input.text, input.files) as M);\n }\n // tracing 管线由调用方显式传入(niceeval/adapter/otel 的 aiSdkOtel()),工厂只管\n // 每轮把 per-attempt 端点交给它、轮末 flush。\n const otel = ctx.telemetry && options.tracing ? options.tracing.telemetryForEndpoint(ctx.telemetry.endpoint) : undefined;\n let result: AiSdkResultLike;\n try {\n result = await options.generate({\n messages: state.messages,\n model: ctx.model,\n reasoningEffort: ctx.reasoningEffort,\n signal: ctx.signal,\n flags: ctx.flags,\n telemetry: otel?.settings,\n });\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw makeSendFailure({ acceptance: \"unknown\", message, cause: normalizeExternalCause(error) });\n }\n finally {\n // 轮次归属靠时间窗口:本轮 span 必须在 send 返回前送到接收器,不能等 batch。\n await otel?.flush();\n }\n // resume 的另一半义务:本次调用新产生的消息(含 approval 执行结果)进历史。\n state.messages.push(...((result.responseMessages ?? []) as M[]));\n state.pendingApprovals = collectPendingApprovals(result);\n const turn = turnFromAiSdk(result);\n // 上游偶尔退化返回完全空的结果;当正常回复会把故障伪装成通过,按失败处理。\n if (turn.events.length === 0) {\n throw makeSendFailure({\n acceptance: \"unknown\",\n message: \"AI SDK returned an empty result (no text, no tool calls)\",\n });\n }\n return { ...turn, data: options.data?.(result, turn) };\n },\n });\n}\n/** 裁决词法(t.respond 的自由文本回答):approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝。 */\nfunction isApproved(line: string): boolean {\n return /^(approve|yes|同意|批准)/i.test(line);\n}\n/** 按 requestId(= approvalId)从 input.responses 对位取裁决;optionId 优先,自由文本走 isApproved。 */\nfunction approvalDecision(responses: readonly InputResponse[] | undefined, requestId: string): boolean {\n const matched = responses?.find((r) => r.requestId === requestId);\n if (!matched) {\n throw new Error(`No response for pending approval \"${requestId}\". Answer approval requests with t.respond(...).`);\n }\n if (matched.optionId !== undefined)\n return matched.optionId === \"approve\";\n return isApproved(matched.text?.trim() ?? \"\");\n}\n/** 待人批准的 approval 请求 id(非 automatic)。steps 优先,退回 v7 顶层聚合 content。 */\nfunction collectPendingApprovals(result: AiSdkResultLike): string[] {\n const parts: AiSdkContentPartLike[] = [];\n if (result.steps?.length) {\n for (const step of result.steps)\n if (Array.isArray(step.content))\n parts.push(...step.content);\n }\n else if (Array.isArray(result.content)) {\n parts.push(...result.content);\n }\n const ids: string[] = [];\n for (const part of parts) {\n if (part.type !== \"tool-approval-request\" || part.isAutomatic === true)\n continue;\n const approvalId = str(part.approvalId);\n if (approvalId)\n ids.push(approvalId);\n }\n return ids;\n}\n/**\n * t.sendFile 带来的文件(base64)转成 AI SDK 的多模态用户消息;纯文本就是纯文本。\n * 用 `file` part(v7 推荐;`image` part 已废弃),mediaType 原样透传,图片之外的附件也能走。\n */\nfunction userMessage(text: string, files: readonly {\n mimeType: string;\n dataBase64: string;\n}[] | undefined): unknown {\n if (!files || files.length === 0)\n return { role: \"user\", content: text };\n return {\n role: \"user\",\n content: [\n { type: \"text\", text: text || \"请描述这个附件。\" },\n ...files.map((f) => ({ type: \"file\", mediaType: f.mimeType, data: f.dataBase64 })),\n ],\n };\n}\n"]}
@@ -179,7 +179,7 @@ export interface AiSdkAgentOptions<M = JsonValue, Integration extends object = o
179
179
  * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。
180
180
  */
181
181
  generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;
182
- /** 本轮的结构化输出(Turn.data,喂 outputEquals / outputMatches)。省略则 data 为 undefined。 */
182
+ /** 本轮的结构化输出(Turn.data,供 `t.check(turn.data, match)` 使用)。省略则 data 为 undefined。 */
183
183
  data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;
184
184
  }
185
185
  /**
@@ -179,7 +179,7 @@ export interface AiSdkAgentOptions<M = JsonValue, Integration extends object = o
179
179
  * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。
180
180
  */
181
181
  generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;
182
- /** 本轮的结构化输出(Turn.data,喂 outputEquals / outputMatches)。省略则 data 为 undefined。 */
182
+ /** 本轮的结构化输出(Turn.data,供 `t.check(turn.data, match)` 使用)。省略则 data 为 undefined。 */
183
183
  data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;
184
184
  }
185
185
  /**
@@ -179,7 +179,7 @@ export interface AiSdkAgentOptions<M = JsonValue, Integration extends object = o
179
179
  * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。
180
180
  */
181
181
  generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;
182
- /** 本轮的结构化输出(Turn.data,喂 outputEquals / outputMatches)。省略则 data 为 undefined。 */
182
+ /** 本轮的结构化输出(Turn.data,供 `t.check(turn.data, match)` 使用)。省略则 data 为 undefined。 */
183
183
  data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;
184
184
  }
185
185
  /**
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BUB_INSTALL_MARKER = exports.BUB_CHECKPOINT_SUBDIRS = exports.DEFAULT_BUB_REQUIREMENT = exports.DEFAULT_BUB_OTEL_PLUGIN = void 0;
3
+ exports.BUB_INSTALL_MARKER = exports.BUB_CHECKPOINT_SUBDIRS = exports.DEFAULT_BUB_DEPENDENCY_OVERRIDES = exports.DEFAULT_BUB_REQUIREMENT = exports.DEFAULT_BUB_OTEL_PLUGIN = void 0;
4
4
  exports.bubRequirement = bubRequirement;
5
5
  exports.normalizeBubPackages = normalizeBubPackages;
6
6
  exports.bubInstallSpec = bubInstallSpec;
@@ -17,6 +17,16 @@ const coding_cli_versions_ts_1 = require("./coding-cli-versions.cjs");
17
17
  exports.DEFAULT_BUB_OTEL_PLUGIN = "git+https://github.com/bubbuild/bub-contrib.git@34715077877041b21472dcca39d91529296a1a9e#subdirectory=packages/bub-tapestore-otel";
18
18
  /** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */
19
19
  exports.DEFAULT_BUB_REQUIREMENT = bubRequirement(coding_cli_versions_ts_1.DEFAULT_BUB_VERSION);
20
+ /**
21
+ * Bub 0.4.0 的上游 lockfile 所验证的模型客户端闭包。
22
+ *
23
+ * Bub 自己的 PyPI metadata 没有限定这两个传递依赖;若只钉 `bub==0.4.0`,每次安装仍会
24
+ * 解析当天最新的客户端,使同一实验在没有配置变更时改变请求协议。
25
+ */
26
+ exports.DEFAULT_BUB_DEPENDENCY_OVERRIDES = [
27
+ "any-llm-sdk==1.17.0",
28
+ "openai==2.31.0",
29
+ ];
20
30
  exports.BUB_CHECKPOINT_SUBDIRS = [".local"];
21
31
  exports.BUB_INSTALL_MARKER = ".local/share/niceeval/bub-install-hash";
22
32
  /**
@@ -31,12 +41,16 @@ function bubRequirement(version) {
31
41
  function normalizeBubPackages(packages) {
32
42
  return [...new Set(packages.map((value) => value.trim()).filter(Boolean))].sort();
33
43
  }
34
- function bubInstallSpec(packages, requirement = exports.DEFAULT_BUB_REQUIREMENT, otelPlugin = exports.DEFAULT_BUB_OTEL_PLUGIN) {
44
+ function bubInstallSpec(packages, requirement = exports.DEFAULT_BUB_REQUIREMENT, otelPlugin = exports.DEFAULT_BUB_OTEL_PLUGIN, dependencyOverrides = []) {
35
45
  const normalized = normalizeBubPackages(packages);
36
46
  const plugins = normalized.length ? ` --with ${normalized.join(" --with ")}` : "";
37
- return `${requirement} --with ${otelPlugin}${plugins} --checkpoint(${exports.BUB_CHECKPOINT_SUBDIRS.join(",")})`;
47
+ const overrides = dependencyOverrides.length ? ` --overrides ${dependencyOverrides.join(" ")}` : "";
48
+ return `${requirement}${overrides} --with ${otelPlugin}${plugins} --checkpoint(${exports.BUB_CHECKPOINT_SUBDIRS.join(",")})`;
38
49
  }
39
- function bubInstallHash(packages, requirement = exports.DEFAULT_BUB_REQUIREMENT, otelPlugin = exports.DEFAULT_BUB_OTEL_PLUGIN) {
40
- return (0, node_crypto_1.createHash)("md5").update(bubInstallSpec(packages, requirement, otelPlugin)).digest("hex").slice(0, 12);
50
+ function bubInstallHash(packages, requirement = exports.DEFAULT_BUB_REQUIREMENT, otelPlugin = exports.DEFAULT_BUB_OTEL_PLUGIN, dependencyOverrides = []) {
51
+ return (0, node_crypto_1.createHash)("md5")
52
+ .update(bubInstallSpec(packages, requirement, otelPlugin, dependencyOverrides))
53
+ .digest("hex")
54
+ .slice(0, 12);
41
55
  }
42
56
  //# sourceMappingURL=bub-install-spec.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"bub-install-spec.js","sourceRoot":"","sources":["bub-install-spec.ts"],"names":[],"mappings":";;;AAoBA,wCAEC;AACD,oDAEC;AACD,wCAIC;AACD,wCAEC;AAjCD,6CAAyC;AACzC,qEAA+D;AAC/D;;;;;;GAMG;AACU,QAAA,uBAAuB,GAAG,mIAAmI,CAAC;AAC3K,+EAA+E;AAClE,QAAA,uBAAuB,GAAG,cAAc,CAAC,4CAAmB,CAAC,CAAC;AAC9D,QAAA,sBAAsB,GAAG,CAAC,QAAQ,CAAU,CAAC;AAC7C,QAAA,kBAAkB,GAAG,wCAAwC,CAAC;AAC3E;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,OAAe;IAC1C,OAAO,QAAQ,OAAO,EAAE,CAAC;AAC7B,CAAC;AACD,SAAgB,oBAAoB,CAAC,QAA2B;IAC5D,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACtF,CAAC;AACD,SAAgB,cAAc,CAAC,QAA2B,EAAE,WAAW,GAAG,+BAAuB,EAAE,UAAU,GAAG,+BAAuB;IACnI,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,OAAO,GAAG,WAAW,WAAW,UAAU,GAAG,OAAO,iBAAiB,8BAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC7G,CAAC;AACD,SAAgB,cAAc,CAAC,QAA2B,EAAE,WAAW,GAAG,+BAAuB,EAAE,UAAU,GAAG,+BAAuB;IACnI,OAAO,IAAA,wBAAU,EAAC,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClH,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n/**\n * Bub 的 OTel tape store 插件——时间轨的来源。插件不发 PyPI,git 依赖是唯一安装方式。\n *\n * 插件与 Bub 的 tape 协议同代:这个 pin(bub-contrib#53 之后)从 `bub.tape` 取类型,\n * 要求 Bub ≥ 0.3.10;更早的 pin 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,\n * 而是 span 全被拒、时间轨静默为空(台账见 memory/bub-tapestore-otel-tapeentry-drift.md)。\n */\nexport const DEFAULT_BUB_OTEL_PLUGIN = \"git+https://github.com/bubbuild/bub-contrib.git@34715077877041b21472dcca39d91529296a1a9e#subdirectory=packages/bub-tapestore-otel\";\n/** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */\nexport const DEFAULT_BUB_REQUIREMENT = bubRequirement(DEFAULT_BUB_VERSION);\nexport const BUB_CHECKPOINT_SUBDIRS = [\".local\"] as const;\nexport const BUB_INSTALL_MARKER = \".local/share/niceeval/bub-install-hash\";\n/**\n * PyPI requirement for a pinned Bub version.\n *\n * 这行同时是安装用的 uv override:OTel 插件所在 workspace 把 `bub` 声明成 git 依赖,\n * 不覆盖的话每次安装都会去拉 Bub 主干,版本失控。\n */\nexport function bubRequirement(version: string): string {\n return `bub==${version}`;\n}\nexport function normalizeBubPackages(packages: readonly string[]): string[] {\n return [...new Set(packages.map((value) => value.trim()).filter(Boolean))].sort();\n}\nexport function bubInstallSpec(packages: readonly string[], requirement = DEFAULT_BUB_REQUIREMENT, otelPlugin = DEFAULT_BUB_OTEL_PLUGIN): string {\n const normalized = normalizeBubPackages(packages);\n const plugins = normalized.length ? ` --with ${normalized.join(\" --with \")}` : \"\";\n return `${requirement} --with ${otelPlugin}${plugins} --checkpoint(${BUB_CHECKPOINT_SUBDIRS.join(\",\")})`;\n}\nexport function bubInstallHash(packages: readonly string[], requirement = DEFAULT_BUB_REQUIREMENT, otelPlugin = DEFAULT_BUB_OTEL_PLUGIN): string {\n return createHash(\"md5\").update(bubInstallSpec(packages, requirement, otelPlugin)).digest(\"hex\").slice(0, 12);\n}\n"]}
1
+ {"version":3,"file":"bub-install-spec.js","sourceRoot":"","sources":["bub-install-spec.ts"],"names":[],"mappings":";;;AA8BA,wCAEC;AACD,oDAEC;AACD,wCAKC;AACD,wCAKC;AA/CD,6CAAyC;AACzC,qEAA+D;AAC/D;;;;;;GAMG;AACU,QAAA,uBAAuB,GAAG,mIAAmI,CAAC;AAC3K,+EAA+E;AAClE,QAAA,uBAAuB,GAAG,cAAc,CAAC,4CAAmB,CAAC,CAAC;AAC3E;;;;;GAKG;AACU,QAAA,gCAAgC,GAAG;IAC5C,qBAAqB;IACrB,gBAAgB;CACV,CAAC;AACE,QAAA,sBAAsB,GAAG,CAAC,QAAQ,CAAU,CAAC;AAC7C,QAAA,kBAAkB,GAAG,wCAAwC,CAAC;AAC3E;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,OAAe;IAC1C,OAAO,QAAQ,OAAO,EAAE,CAAC;AAC7B,CAAC;AACD,SAAgB,oBAAoB,CAAC,QAA2B;IAC5D,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACtF,CAAC;AACD,SAAgB,cAAc,CAAC,QAA2B,EAAE,WAAW,GAAG,+BAAuB,EAAE,UAAU,GAAG,+BAAuB,EAAE,sBAAyC,EAAE;IAChL,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,OAAO,GAAG,WAAW,GAAG,SAAS,WAAW,UAAU,GAAG,OAAO,iBAAiB,8BAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACzH,CAAC;AACD,SAAgB,cAAc,CAAC,QAA2B,EAAE,WAAW,GAAG,+BAAuB,EAAE,UAAU,GAAG,+BAAuB,EAAE,sBAAyC,EAAE;IAChL,OAAO,IAAA,wBAAU,EAAC,KAAK,CAAC;SACnB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC;SAC9E,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC","sourcesContent":["import { createHash } from \"node:crypto\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n/**\n * Bub 的 OTel tape store 插件——时间轨的来源。插件不发 PyPI,git 依赖是唯一安装方式。\n *\n * 插件与 Bub 的 tape 协议同代:这个 pin(bub-contrib#53 之后)从 `bub.tape` 取类型,\n * 要求 Bub ≥ 0.3.10;更早的 pin 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,\n * 而是 span 全被拒、时间轨静默为空(台账见 memory/bub-tapestore-otel-tapeentry-drift.md)。\n */\nexport const DEFAULT_BUB_OTEL_PLUGIN = \"git+https://github.com/bubbuild/bub-contrib.git@34715077877041b21472dcca39d91529296a1a9e#subdirectory=packages/bub-tapestore-otel\";\n/** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */\nexport const DEFAULT_BUB_REQUIREMENT = bubRequirement(DEFAULT_BUB_VERSION);\n/**\n * Bub 0.4.0 的上游 lockfile 所验证的模型客户端闭包。\n *\n * Bub 自己的 PyPI metadata 没有限定这两个传递依赖;若只钉 `bub==0.4.0`,每次安装仍会\n * 解析当天最新的客户端,使同一实验在没有配置变更时改变请求协议。\n */\nexport const DEFAULT_BUB_DEPENDENCY_OVERRIDES = [\n \"any-llm-sdk==1.17.0\",\n \"openai==2.31.0\",\n] as const;\nexport const BUB_CHECKPOINT_SUBDIRS = [\".local\"] as const;\nexport const BUB_INSTALL_MARKER = \".local/share/niceeval/bub-install-hash\";\n/**\n * PyPI requirement for a pinned Bub version.\n *\n * 这行同时是安装用的 uv override:OTel 插件所在 workspace 把 `bub` 声明成 git 依赖,\n * 不覆盖的话每次安装都会去拉 Bub 主干,版本失控。\n */\nexport function bubRequirement(version: string): string {\n return `bub==${version}`;\n}\nexport function normalizeBubPackages(packages: readonly string[]): string[] {\n return [...new Set(packages.map((value) => value.trim()).filter(Boolean))].sort();\n}\nexport function bubInstallSpec(packages: readonly string[], requirement = DEFAULT_BUB_REQUIREMENT, otelPlugin = DEFAULT_BUB_OTEL_PLUGIN, dependencyOverrides: readonly string[] = []): string {\n const normalized = normalizeBubPackages(packages);\n const plugins = normalized.length ? ` --with ${normalized.join(\" --with \")}` : \"\";\n const overrides = dependencyOverrides.length ? ` --overrides ${dependencyOverrides.join(\" \")}` : \"\";\n return `${requirement}${overrides} --with ${otelPlugin}${plugins} --checkpoint(${BUB_CHECKPOINT_SUBDIRS.join(\",\")})`;\n}\nexport function bubInstallHash(packages: readonly string[], requirement = DEFAULT_BUB_REQUIREMENT, otelPlugin = DEFAULT_BUB_OTEL_PLUGIN, dependencyOverrides: readonly string[] = []): string {\n return createHash(\"md5\")\n .update(bubInstallSpec(packages, requirement, otelPlugin, dependencyOverrides))\n .digest(\"hex\")\n .slice(0, 12);\n}\n"]}
@@ -8,6 +8,13 @@
8
8
  export declare const DEFAULT_BUB_OTEL_PLUGIN = "git+https://github.com/bubbuild/bub-contrib.git@34715077877041b21472dcca39d91529296a1a9e#subdirectory=packages/bub-tapestore-otel";
9
9
  /** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */
10
10
  export declare const DEFAULT_BUB_REQUIREMENT: string;
11
+ /**
12
+ * Bub 0.4.0 的上游 lockfile 所验证的模型客户端闭包。
13
+ *
14
+ * Bub 自己的 PyPI metadata 没有限定这两个传递依赖;若只钉 `bub==0.4.0`,每次安装仍会
15
+ * 解析当天最新的客户端,使同一实验在没有配置变更时改变请求协议。
16
+ */
17
+ export declare const DEFAULT_BUB_DEPENDENCY_OVERRIDES: readonly ["any-llm-sdk==1.17.0", "openai==2.31.0"];
11
18
  export declare const BUB_CHECKPOINT_SUBDIRS: readonly [".local"];
12
19
  export declare const BUB_INSTALL_MARKER = ".local/share/niceeval/bub-install-hash";
13
20
  /**
@@ -18,5 +25,5 @@ export declare const BUB_INSTALL_MARKER = ".local/share/niceeval/bub-install-has
18
25
  */
19
26
  export declare function bubRequirement(version: string): string;
20
27
  export declare function normalizeBubPackages(packages: readonly string[]): string[];
21
- export declare function bubInstallSpec(packages: readonly string[], requirement?: string, otelPlugin?: string): string;
22
- export declare function bubInstallHash(packages: readonly string[], requirement?: string, otelPlugin?: string): string;
28
+ export declare function bubInstallSpec(packages: readonly string[], requirement?: string, otelPlugin?: string, dependencyOverrides?: readonly string[]): string;
29
+ export declare function bubInstallHash(packages: readonly string[], requirement?: string, otelPlugin?: string, dependencyOverrides?: readonly string[]): string;
@@ -8,6 +8,13 @@
8
8
  export declare const DEFAULT_BUB_OTEL_PLUGIN = "git+https://github.com/bubbuild/bub-contrib.git@34715077877041b21472dcca39d91529296a1a9e#subdirectory=packages/bub-tapestore-otel";
9
9
  /** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */
10
10
  export declare const DEFAULT_BUB_REQUIREMENT: string;
11
+ /**
12
+ * Bub 0.4.0 的上游 lockfile 所验证的模型客户端闭包。
13
+ *
14
+ * Bub 自己的 PyPI metadata 没有限定这两个传递依赖;若只钉 `bub==0.4.0`,每次安装仍会
15
+ * 解析当天最新的客户端,使同一实验在没有配置变更时改变请求协议。
16
+ */
17
+ export declare const DEFAULT_BUB_DEPENDENCY_OVERRIDES: readonly ["any-llm-sdk==1.17.0", "openai==2.31.0"];
11
18
  export declare const BUB_CHECKPOINT_SUBDIRS: readonly [".local"];
12
19
  export declare const BUB_INSTALL_MARKER = ".local/share/niceeval/bub-install-hash";
13
20
  /**
@@ -18,5 +25,5 @@ export declare const BUB_INSTALL_MARKER = ".local/share/niceeval/bub-install-has
18
25
  */
19
26
  export declare function bubRequirement(version: string): string;
20
27
  export declare function normalizeBubPackages(packages: readonly string[]): string[];
21
- export declare function bubInstallSpec(packages: readonly string[], requirement?: string, otelPlugin?: string): string;
22
- export declare function bubInstallHash(packages: readonly string[], requirement?: string, otelPlugin?: string): string;
28
+ export declare function bubInstallSpec(packages: readonly string[], requirement?: string, otelPlugin?: string, dependencyOverrides?: readonly string[]): string;
29
+ export declare function bubInstallHash(packages: readonly string[], requirement?: string, otelPlugin?: string, dependencyOverrides?: readonly string[]): string;
@@ -8,6 +8,13 @@
8
8
  export declare const DEFAULT_BUB_OTEL_PLUGIN = "git+https://github.com/bubbuild/bub-contrib.git@34715077877041b21472dcca39d91529296a1a9e#subdirectory=packages/bub-tapestore-otel";
9
9
  /** 装哪一版 Bub:`uv tool install` 的 requirement,版本单源在 `coding-cli-versions.ts`。 */
10
10
  export declare const DEFAULT_BUB_REQUIREMENT: string;
11
+ /**
12
+ * Bub 0.4.0 的上游 lockfile 所验证的模型客户端闭包。
13
+ *
14
+ * Bub 自己的 PyPI metadata 没有限定这两个传递依赖;若只钉 `bub==0.4.0`,每次安装仍会
15
+ * 解析当天最新的客户端,使同一实验在没有配置变更时改变请求协议。
16
+ */
17
+ export declare const DEFAULT_BUB_DEPENDENCY_OVERRIDES: readonly ["any-llm-sdk==1.17.0", "openai==2.31.0"];
11
18
  export declare const BUB_CHECKPOINT_SUBDIRS: readonly [".local"];
12
19
  export declare const BUB_INSTALL_MARKER = ".local/share/niceeval/bub-install-hash";
13
20
  /**
@@ -18,5 +25,5 @@ export declare const BUB_INSTALL_MARKER = ".local/share/niceeval/bub-install-has
18
25
  */
19
26
  export declare function bubRequirement(version: string): string;
20
27
  export declare function normalizeBubPackages(packages: readonly string[]): string[];
21
- export declare function bubInstallSpec(packages: readonly string[], requirement?: string, otelPlugin?: string): string;
22
- export declare function bubInstallHash(packages: readonly string[], requirement?: string, otelPlugin?: string): string;
28
+ export declare function bubInstallSpec(packages: readonly string[], requirement?: string, otelPlugin?: string, dependencyOverrides?: readonly string[]): string;
29
+ export declare function bubInstallHash(packages: readonly string[], requirement?: string, otelPlugin?: string, dependencyOverrides?: readonly string[]): string;
@@ -5,16 +5,18 @@ const __niceevalExport0 = __niceevalCanonical["BUB_CHECKPOINT_SUBDIRS"];
5
5
  export { __niceevalExport0 as BUB_CHECKPOINT_SUBDIRS };
6
6
  const __niceevalExport1 = __niceevalCanonical["BUB_INSTALL_MARKER"];
7
7
  export { __niceevalExport1 as BUB_INSTALL_MARKER };
8
- const __niceevalExport2 = __niceevalCanonical["DEFAULT_BUB_OTEL_PLUGIN"];
9
- export { __niceevalExport2 as DEFAULT_BUB_OTEL_PLUGIN };
10
- const __niceevalExport3 = __niceevalCanonical["DEFAULT_BUB_REQUIREMENT"];
11
- export { __niceevalExport3 as DEFAULT_BUB_REQUIREMENT };
12
- const __niceevalExport4 = __niceevalCanonical["bubInstallHash"];
13
- export { __niceevalExport4 as bubInstallHash };
14
- const __niceevalExport5 = __niceevalCanonical["bubInstallSpec"];
15
- export { __niceevalExport5 as bubInstallSpec };
16
- const __niceevalExport6 = __niceevalCanonical["bubRequirement"];
17
- export { __niceevalExport6 as bubRequirement };
18
- const __niceevalExport7 = __niceevalCanonical["normalizeBubPackages"];
19
- export { __niceevalExport7 as normalizeBubPackages };
8
+ const __niceevalExport2 = __niceevalCanonical["DEFAULT_BUB_DEPENDENCY_OVERRIDES"];
9
+ export { __niceevalExport2 as DEFAULT_BUB_DEPENDENCY_OVERRIDES };
10
+ const __niceevalExport3 = __niceevalCanonical["DEFAULT_BUB_OTEL_PLUGIN"];
11
+ export { __niceevalExport3 as DEFAULT_BUB_OTEL_PLUGIN };
12
+ const __niceevalExport4 = __niceevalCanonical["DEFAULT_BUB_REQUIREMENT"];
13
+ export { __niceevalExport4 as DEFAULT_BUB_REQUIREMENT };
14
+ const __niceevalExport5 = __niceevalCanonical["bubInstallHash"];
15
+ export { __niceevalExport5 as bubInstallHash };
16
+ const __niceevalExport6 = __niceevalCanonical["bubInstallSpec"];
17
+ export { __niceevalExport6 as bubInstallSpec };
18
+ const __niceevalExport7 = __niceevalCanonical["bubRequirement"];
19
+ export { __niceevalExport7 as bubRequirement };
20
+ const __niceevalExport8 = __niceevalCanonical["normalizeBubPackages"];
21
+ export { __niceevalExport8 as normalizeBubPackages };
20
22
  //# sourceMappingURL=bub-install-spec.js.map