niceeval 0.13.2-canary.35 → 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 (485) hide show
  1. package/INDEX.md +24 -2
  2. package/dist/agents/bub-install-spec.cjs +19 -5
  3. package/dist/agents/bub-install-spec.cjs.map +1 -1
  4. package/dist/agents/bub-install-spec.d.cts +9 -2
  5. package/dist/agents/bub-install-spec.d.mts +9 -2
  6. package/dist/agents/bub-install-spec.d.ts +9 -2
  7. package/dist/agents/bub-install-spec.js +14 -12
  8. package/dist/agents/bub.cjs +10 -6
  9. package/dist/agents/bub.cjs.map +1 -1
  10. package/dist/agents/bub.d.cts +2 -2
  11. package/dist/agents/bub.d.mts +2 -2
  12. package/dist/agents/bub.d.ts +2 -2
  13. package/dist/agents/claude-code.cjs.map +1 -1
  14. package/dist/agents/claude-code.d.cts +2 -2
  15. package/dist/agents/claude-code.d.mts +2 -2
  16. package/dist/agents/claude-code.d.ts +2 -2
  17. package/dist/agents/codex.cjs +4 -4
  18. package/dist/agents/codex.cjs.map +1 -1
  19. package/dist/agents/codex.d.cts +3 -3
  20. package/dist/agents/codex.d.mts +3 -3
  21. package/dist/agents/codex.d.ts +3 -3
  22. package/dist/agents/deepseek-harness.cjs +50 -2
  23. package/dist/agents/deepseek-harness.cjs.map +1 -1
  24. package/dist/agents/deepseek-harness.d.cts +2 -0
  25. package/dist/agents/deepseek-harness.d.mts +2 -0
  26. package/dist/agents/deepseek-harness.d.ts +2 -0
  27. package/dist/agents/exact-npm-plugins.cjs +28 -0
  28. package/dist/agents/exact-npm-plugins.cjs.map +1 -0
  29. package/dist/agents/exact-npm-plugins.d.cts +10 -0
  30. package/dist/agents/exact-npm-plugins.d.mts +10 -0
  31. package/dist/agents/exact-npm-plugins.d.ts +10 -0
  32. package/dist/agents/exact-npm-plugins.js +8 -0
  33. package/dist/agents/exact-npm-plugins.js.map +1 -0
  34. package/dist/agents/openclaw.cjs +51 -2
  35. package/dist/agents/openclaw.cjs.map +1 -1
  36. package/dist/agents/openclaw.d.cts +2 -0
  37. package/dist/agents/openclaw.d.mts +2 -0
  38. package/dist/agents/openclaw.d.ts +2 -0
  39. package/dist/agents/types.cjs.map +1 -1
  40. package/dist/agents/types.d.cts +2 -2
  41. package/dist/agents/types.d.mts +2 -2
  42. package/dist/agents/types.d.ts +2 -2
  43. package/dist/agents/ui-message-stream.cjs +24 -7
  44. package/dist/agents/ui-message-stream.cjs.map +1 -1
  45. package/dist/analysis/api.cjs +19 -1
  46. package/dist/analysis/api.cjs.map +1 -1
  47. package/dist/analysis/api.d.cts +2 -2
  48. package/dist/analysis/api.d.mts +2 -2
  49. package/dist/analysis/api.d.ts +2 -2
  50. package/dist/analysis/bindings.cjs +11 -18
  51. package/dist/analysis/bindings.cjs.map +1 -1
  52. package/dist/analysis/bindings.d.cts +177 -49
  53. package/dist/analysis/bindings.d.mts +177 -49
  54. package/dist/analysis/bindings.d.ts +177 -49
  55. package/dist/analysis/contracts.cjs +1 -0
  56. package/dist/analysis/contracts.cjs.map +1 -1
  57. package/dist/analysis/contracts.d.cts +43 -3
  58. package/dist/analysis/contracts.d.mts +43 -3
  59. package/dist/analysis/contracts.d.ts +43 -3
  60. package/dist/analysis/cost-projection.cjs +2 -1
  61. package/dist/analysis/cost-projection.cjs.map +1 -1
  62. package/dist/analysis/cost-projection.d.cts +1 -1
  63. package/dist/analysis/cost-projection.d.mts +1 -1
  64. package/dist/analysis/cost-projection.d.ts +1 -1
  65. package/dist/analysis/cost.cjs +13 -3
  66. package/dist/analysis/cost.cjs.map +1 -1
  67. package/dist/analysis/cost.d.cts +10 -3
  68. package/dist/analysis/cost.d.mts +10 -3
  69. package/dist/analysis/cost.d.ts +10 -3
  70. package/dist/analysis/experiment-groups.cjs +96 -0
  71. package/dist/analysis/experiment-groups.cjs.map +1 -0
  72. package/dist/analysis/experiment-groups.d.cts +9 -0
  73. package/dist/analysis/experiment-groups.d.mts +9 -0
  74. package/dist/analysis/experiment-groups.d.ts +9 -0
  75. package/dist/analysis/experiment-groups.js +10 -0
  76. package/dist/analysis/experiment-groups.js.map +1 -0
  77. package/dist/analysis/index.cjs +4 -1
  78. package/dist/analysis/index.cjs.map +1 -1
  79. package/dist/analysis/index.d.cts +4 -2
  80. package/dist/analysis/index.d.mts +4 -2
  81. package/dist/analysis/index.d.ts +4 -2
  82. package/dist/analysis/index.js +40 -36
  83. package/dist/analysis/index.mjs +40 -36
  84. package/dist/assertions/limits.cjs +4 -0
  85. package/dist/assertions/limits.cjs.map +1 -1
  86. package/dist/assertions/limits.d.cts +4 -0
  87. package/dist/assertions/limits.d.mts +4 -0
  88. package/dist/assertions/limits.d.ts +4 -0
  89. package/dist/assertions/match.cjs +63 -25
  90. package/dist/assertions/match.cjs.map +1 -1
  91. package/dist/assertions/match.d.cts +7 -0
  92. package/dist/assertions/match.d.mts +7 -0
  93. package/dist/assertions/match.d.ts +7 -0
  94. package/dist/assertions/record/attachment.cjs +32 -4
  95. package/dist/assertions/record/attachment.cjs.map +1 -1
  96. package/dist/assertions/record/diff.cjs +10 -4
  97. package/dist/assertions/record/diff.cjs.map +1 -1
  98. package/dist/assertions/record/producer.cjs +101 -4
  99. package/dist/assertions/record/producer.cjs.map +1 -1
  100. package/dist/assertions/record/producer.d.cts +4 -1
  101. package/dist/assertions/record/producer.d.mts +4 -1
  102. package/dist/assertions/record/producer.d.ts +4 -1
  103. package/dist/assertions/runtime.cjs +45 -5
  104. package/dist/assertions/runtime.cjs.map +1 -1
  105. package/dist/cli/record.cjs +113 -8
  106. package/dist/cli/record.cjs.map +1 -1
  107. package/dist/cli/record.d.cts +20 -1
  108. package/dist/cli/record.d.mts +20 -1
  109. package/dist/cli/record.d.ts +20 -1
  110. package/dist/cli/record.js +4 -2
  111. package/dist/cli.cjs +386 -31
  112. package/dist/cli.cjs.map +1 -1
  113. package/dist/cli.d.cts +10 -2
  114. package/dist/cli.d.mts +10 -2
  115. package/dist/cli.d.ts +10 -2
  116. package/dist/context/send-retry.cjs +4 -4
  117. package/dist/context/send-retry.cjs.map +1 -1
  118. package/dist/coordination/host/runtime.cjs +8 -30
  119. package/dist/coordination/host/runtime.cjs.map +1 -1
  120. package/dist/coordination/host/runtime.d.cts +3 -3
  121. package/dist/coordination/host/runtime.d.mts +3 -3
  122. package/dist/coordination/host/runtime.d.ts +3 -3
  123. package/dist/coordination/host/types.cjs.map +1 -1
  124. package/dist/coordination/host/types.d.cts +0 -5
  125. package/dist/coordination/host/types.d.mts +0 -5
  126. package/dist/coordination/host/types.d.ts +0 -5
  127. package/dist/coordination/platform/node.cjs +90 -9
  128. package/dist/coordination/platform/node.cjs.map +1 -1
  129. package/dist/define.cjs +25 -1
  130. package/dist/define.cjs.map +1 -1
  131. package/dist/experiment/host/index.cjs +1 -0
  132. package/dist/experiment/host/index.cjs.map +1 -1
  133. package/dist/i18n/en.cjs +19 -6
  134. package/dist/i18n/en.cjs.map +1 -1
  135. package/dist/i18n/en.d.cts +12 -4
  136. package/dist/i18n/en.d.mts +12 -4
  137. package/dist/i18n/en.d.ts +12 -4
  138. package/dist/index.cjs.map +1 -1
  139. package/dist/index.d.cts +1 -1
  140. package/dist/index.d.mts +1 -1
  141. package/dist/index.d.ts +1 -1
  142. package/dist/o11y/prices.json +1 -1
  143. package/dist/o11y/record/families.cjs +12 -3
  144. package/dist/o11y/record/families.cjs.map +1 -1
  145. package/dist/o11y/record/families.d.cts +8 -8
  146. package/dist/o11y/record/families.d.mts +8 -8
  147. package/dist/o11y/record/families.d.ts +8 -8
  148. package/dist/o11y/record/family-projectors.d.cts +66 -18
  149. package/dist/o11y/record/family-projectors.d.mts +66 -18
  150. package/dist/o11y/record/family-projectors.d.ts +66 -18
  151. package/dist/o11y/record/family-writers.d.cts +11 -3
  152. package/dist/o11y/record/family-writers.d.mts +11 -3
  153. package/dist/o11y/record/family-writers.d.ts +11 -3
  154. package/dist/o11y/record/runner-producer.cjs +14 -4
  155. package/dist/o11y/record/runner-producer.cjs.map +1 -1
  156. package/dist/record/codec/core.d.cts +2 -2
  157. package/dist/record/codec/core.d.mts +2 -2
  158. package/dist/record/codec/core.d.ts +2 -2
  159. package/dist/record/family/catalog.d.cts +44 -12
  160. package/dist/record/family/catalog.d.mts +44 -12
  161. package/dist/record/family/catalog.d.ts +44 -12
  162. package/dist/record/family/index.js +128 -124
  163. package/dist/record/family/observability-v1.cjs +35 -0
  164. package/dist/record/family/observability-v1.cjs.map +1 -0
  165. package/dist/record/family/observability-v1.d.cts +3 -0
  166. package/dist/record/family/observability-v1.d.mts +3 -0
  167. package/dist/record/family/observability-v1.d.ts +3 -0
  168. package/dist/record/family/observability-v1.js +6 -0
  169. package/dist/record/family/observability-v1.js.map +1 -0
  170. package/dist/record/family/observability.cjs +58 -9
  171. package/dist/record/family/observability.cjs.map +1 -1
  172. package/dist/record/family/observability.d.cts +1014 -15
  173. package/dist/record/family/observability.d.mts +1014 -15
  174. package/dist/record/family/observability.d.ts +1014 -15
  175. package/dist/record/family/observability.js +22 -18
  176. package/dist/record/host/runtime.cjs +600 -31
  177. package/dist/record/host/runtime.cjs.map +1 -1
  178. package/dist/record/host/types.cjs.map +1 -1
  179. package/dist/record/host/types.d.cts +33 -9
  180. package/dist/record/host/types.d.mts +33 -9
  181. package/dist/record/host/types.d.ts +33 -9
  182. package/dist/record/maintenance/runtime.cjs +1 -2
  183. package/dist/record/maintenance/runtime.cjs.map +1 -1
  184. package/dist/record/model/core.cjs.map +1 -1
  185. package/dist/record/model/core.d.cts +1 -1
  186. package/dist/record/model/core.d.mts +1 -1
  187. package/dist/record/model/core.d.ts +1 -1
  188. package/dist/record/model/definition.d.cts +6 -6
  189. package/dist/record/model/definition.d.mts +6 -6
  190. package/dist/record/model/definition.d.ts +6 -6
  191. package/dist/record/model/identifiers.cjs +1 -1
  192. package/dist/record/model/identifiers.cjs.map +1 -1
  193. package/dist/record/model/identifiers.d.cts +1 -1
  194. package/dist/record/model/identifiers.d.mts +1 -1
  195. package/dist/record/model/identifiers.d.ts +1 -1
  196. package/dist/record/platform/node.cjs +159 -23
  197. package/dist/record/platform/node.cjs.map +1 -1
  198. package/dist/record/platform/services.cjs.map +1 -1
  199. package/dist/record/platform/services.d.cts +15 -2
  200. package/dist/record/platform/services.d.mts +15 -2
  201. package/dist/record/platform/services.d.ts +15 -2
  202. package/dist/record/reader/errors.cjs +37 -1
  203. package/dist/record/reader/errors.cjs.map +1 -1
  204. package/dist/record/reader/errors.d.cts +49 -1
  205. package/dist/record/reader/errors.d.mts +49 -1
  206. package/dist/record/reader/errors.d.ts +49 -1
  207. package/dist/record/reader/errors.js +22 -12
  208. package/dist/record/reader/format.cjs +76 -17
  209. package/dist/record/reader/format.cjs.map +1 -1
  210. package/dist/record/reader/format.d.cts +11 -4
  211. package/dist/record/reader/format.d.mts +11 -4
  212. package/dist/record/reader/format.d.ts +11 -4
  213. package/dist/record/reader/format.js +2 -0
  214. package/dist/record/reader/index.js +32 -18
  215. package/dist/record/reader/runtime.cjs +64 -0
  216. package/dist/record/reader/runtime.cjs.map +1 -1
  217. package/dist/record/reader/runtime.d.cts +15 -0
  218. package/dist/record/reader/runtime.d.mts +15 -0
  219. package/dist/record/reader/runtime.d.ts +15 -0
  220. package/dist/record/reader/runtime.js +2 -0
  221. package/dist/report/assets/styles.css +53 -29
  222. package/dist/report/built-in/analysis-values.cjs +0 -8
  223. package/dist/report/built-in/analysis-values.cjs.map +1 -1
  224. package/dist/report/built-in/analysis-values.d.cts +0 -13
  225. package/dist/report/built-in/analysis-values.d.mts +0 -13
  226. package/dist/report/built-in/analysis-values.d.ts +0 -13
  227. package/dist/report/built-in/analysis-values.js +4 -6
  228. package/dist/report/built-in/index.cjs +1 -3
  229. package/dist/report/built-in/index.cjs.map +1 -1
  230. package/dist/report/built-in/index.d.cts +1 -1
  231. package/dist/report/built-in/index.d.mts +1 -1
  232. package/dist/report/built-in/index.d.ts +1 -1
  233. package/dist/report/built-in/index.js +4 -8
  234. package/dist/report/built-in/index.mjs +4 -8
  235. package/dist/report/built-in/machine.cjs +0 -2
  236. package/dist/report/built-in/machine.cjs.map +1 -1
  237. package/dist/report/built-in/machine.d.cts +0 -2
  238. package/dist/report/built-in/machine.d.mts +0 -2
  239. package/dist/report/built-in/machine.d.ts +0 -2
  240. package/dist/report/built-in/result-components.cjs +25 -73
  241. package/dist/report/built-in/result-components.cjs.map +1 -1
  242. package/dist/report/built-in/result-components.d.cts +3 -19
  243. package/dist/report/built-in/result-components.d.mts +3 -19
  244. package/dist/report/built-in/result-components.d.ts +3 -19
  245. package/dist/report/built-in/result-components.js +0 -4
  246. package/dist/report/built-in/run-membership-overview.cjs +30 -17
  247. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  248. package/dist/report/built-in/run-membership-overview.d.cts +14 -0
  249. package/dist/report/built-in/run-membership-overview.d.mts +14 -0
  250. package/dist/report/built-in/run-membership-overview.d.ts +14 -0
  251. package/dist/report/built-in/run-membership-overview.js +4 -2
  252. package/dist/report/built-in/standard.cjs +80 -46
  253. package/dist/report/built-in/standard.cjs.map +1 -1
  254. package/dist/report/built-in/standard.d.cts +19 -42
  255. package/dist/report/built-in/standard.d.mts +19 -42
  256. package/dist/report/built-in/standard.d.ts +19 -42
  257. package/dist/report/built-in/standard.js +6 -6
  258. package/dist/report/components/attempt-detail/compute.cjs +78 -2
  259. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  260. package/dist/report/components/attempt-detail/compute.d.cts +1 -1
  261. package/dist/report/components/attempt-detail/compute.d.mts +1 -1
  262. package/dist/report/components/attempt-detail/compute.d.ts +1 -1
  263. package/dist/report/components/attempt-detail/content.cjs +1 -1
  264. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  265. package/dist/report/components/entity-lists/compute.cjs +2 -2
  266. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  267. package/dist/report/components/entity-lists/compute.d.cts +2 -2
  268. package/dist/report/components/entity-lists/compute.d.mts +2 -2
  269. package/dist/report/components/entity-lists/compute.d.ts +2 -2
  270. package/dist/report/components/entity-lists/index.cjs +6 -2
  271. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  272. package/dist/report/components/entity-lists/index.d.cts +3 -6
  273. package/dist/report/components/entity-lists/index.d.mts +3 -6
  274. package/dist/report/components/entity-lists/index.d.ts +3 -6
  275. package/dist/report/components/summaries/compute.cjs +8 -1
  276. package/dist/report/components/summaries/compute.cjs.map +1 -1
  277. package/dist/report/components/summaries/compute.d.cts +9 -1
  278. package/dist/report/components/summaries/compute.d.mts +9 -1
  279. package/dist/report/components/summaries/compute.d.ts +9 -1
  280. package/dist/report/components/summaries/index.cjs +48 -4
  281. package/dist/report/components/summaries/index.cjs.map +1 -1
  282. package/dist/report/components/summaries/index.d.cts +7 -4
  283. package/dist/report/components/summaries/index.d.mts +7 -4
  284. package/dist/report/components/summaries/index.d.ts +7 -4
  285. package/dist/report/definition/primitives/chart.cjs +8 -5
  286. package/dist/report/definition/primitives/chart.cjs.map +1 -1
  287. package/dist/report/definition/primitives/points-dataset.cjs +1 -0
  288. package/dist/report/definition/primitives/points-dataset.cjs.map +1 -1
  289. package/dist/report/definition/primitives.cjs +6 -0
  290. package/dist/report/definition/primitives.cjs.map +1 -1
  291. package/dist/report/definition/report.cjs +27 -3
  292. package/dist/report/definition/report.cjs.map +1 -1
  293. package/dist/report/definition/report.d.cts +8 -0
  294. package/dist/report/definition/report.d.mts +8 -0
  295. package/dist/report/definition/report.d.ts +8 -0
  296. package/dist/report/execution/machine.cjs +30 -14
  297. package/dist/report/execution/machine.cjs.map +1 -1
  298. package/dist/report/execution/machine.d.cts +20 -10
  299. package/dist/report/execution/machine.d.mts +20 -10
  300. package/dist/report/execution/machine.d.ts +20 -10
  301. package/dist/report/execution/machine.js +6 -6
  302. package/dist/report/host/execute.cjs +25 -16
  303. package/dist/report/host/execute.cjs.map +1 -1
  304. package/dist/report/host/execute.d.cts +4 -0
  305. package/dist/report/host/execute.d.mts +4 -0
  306. package/dist/report/host/execute.d.ts +4 -0
  307. package/dist/report/host/from-record.cjs +22 -5
  308. package/dist/report/host/from-record.cjs.map +1 -1
  309. package/dist/report/host/machine.cjs +53 -11
  310. package/dist/report/host/machine.cjs.map +1 -1
  311. package/dist/report/host/site-runtime.cjs +9 -8
  312. package/dist/report/host/site-runtime.cjs.map +1 -1
  313. package/dist/report/host/site-runtime.d.cts +1 -1
  314. package/dist/report/host/site-runtime.d.mts +1 -1
  315. package/dist/report/host/site-runtime.d.ts +1 -1
  316. package/dist/report/host/static.cjs +56 -9
  317. package/dist/report/host/static.cjs.map +1 -1
  318. package/dist/report/index.cjs.map +1 -1
  319. package/dist/report/index.d.cts +1 -1
  320. package/dist/report/index.d.mts +1 -1
  321. package/dist/report/index.d.ts +1 -1
  322. package/dist/report/model/dataset.cjs +7 -2
  323. package/dist/report/model/dataset.cjs.map +1 -1
  324. package/dist/report/model/locale.cjs +2 -0
  325. package/dist/report/model/locale.cjs.map +1 -1
  326. package/dist/report/model/locale.d.cts +1 -0
  327. package/dist/report/model/locale.d.mts +1 -0
  328. package/dist/report/model/locale.d.ts +1 -0
  329. package/dist/report/model/metrics.cjs +3 -1
  330. package/dist/report/model/metrics.cjs.map +1 -1
  331. package/dist/report/model/pricing.cjs +16 -11
  332. package/dist/report/model/pricing.cjs.map +1 -1
  333. package/dist/report/react/styles.css +53 -29
  334. package/dist/runner/adoption.cjs +1 -0
  335. package/dist/runner/adoption.cjs.map +1 -1
  336. package/dist/runner/attempt.cjs +44 -5
  337. package/dist/runner/attempt.cjs.map +1 -1
  338. package/dist/runner/attempt.d.cts +13 -1
  339. package/dist/runner/attempt.d.mts +13 -1
  340. package/dist/runner/attempt.d.ts +13 -1
  341. package/dist/runner/config-identity.cjs +10 -2
  342. package/dist/runner/config-identity.cjs.map +1 -1
  343. package/dist/runner/config-identity.d.cts +4 -2
  344. package/dist/runner/config-identity.d.mts +4 -2
  345. package/dist/runner/config-identity.d.ts +4 -2
  346. package/dist/runner/feedback/human.cjs +139 -64
  347. package/dist/runner/feedback/human.cjs.map +1 -1
  348. package/dist/runner/feedback/json.cjs +14 -6
  349. package/dist/runner/feedback/json.cjs.map +1 -1
  350. package/dist/runner/feedback/json.d.cts +3 -2
  351. package/dist/runner/feedback/json.d.mts +3 -2
  352. package/dist/runner/feedback/json.d.ts +3 -2
  353. package/dist/runner/feedback/reducer.cjs +2 -0
  354. package/dist/runner/feedback/reducer.cjs.map +1 -1
  355. package/dist/runner/judge-config.cjs +1 -1
  356. package/dist/runner/judge-config.cjs.map +1 -1
  357. package/dist/runner/ledger.cjs +124 -12
  358. package/dist/runner/ledger.cjs.map +1 -1
  359. package/dist/runner/project-current.cjs +13 -5
  360. package/dist/runner/project-current.cjs.map +1 -1
  361. package/dist/runner/run.cjs +521 -256
  362. package/dist/runner/run.cjs.map +1 -1
  363. package/dist/runner/sandbox-pool.cjs +161 -30
  364. package/dist/runner/sandbox-pool.cjs.map +1 -1
  365. package/dist/runner/sandbox-pool.d.cts +34 -2
  366. package/dist/runner/sandbox-pool.d.mts +34 -2
  367. package/dist/runner/sandbox-pool.d.ts +34 -2
  368. package/dist/runner/shared-state-lease.cjs +803 -0
  369. package/dist/runner/shared-state-lease.cjs.map +1 -0
  370. package/dist/runner/shared-state-lease.d.cts +121 -0
  371. package/dist/runner/shared-state-lease.d.mts +121 -0
  372. package/dist/runner/shared-state-lease.d.ts +121 -0
  373. package/dist/runner/shared-state-lease.js +24 -0
  374. package/dist/runner/shared-state-lease.js.map +1 -0
  375. package/dist/runner/teardown-registry.cjs +97 -34
  376. package/dist/runner/teardown-registry.cjs.map +1 -1
  377. package/dist/runner/teardown-registry.d.cts +27 -1
  378. package/dist/runner/teardown-registry.d.mts +27 -1
  379. package/dist/runner/teardown-registry.d.ts +27 -1
  380. package/dist/runner/teardown-registry.js +20 -16
  381. package/dist/runner/types.cjs.map +1 -1
  382. package/dist/runner/types.d.cts +31 -5
  383. package/dist/runner/types.d.mts +31 -5
  384. package/dist/runner/types.d.ts +31 -5
  385. package/dist/sample/analysis.cjs +249 -459
  386. package/dist/sample/analysis.cjs.map +1 -1
  387. package/dist/sample/capability.cjs +46 -8
  388. package/dist/sample/capability.cjs.map +1 -1
  389. package/dist/sandbox/docker-profile/schema.cjs +283 -534
  390. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  391. package/dist/sandbox/docker-profile/schema.d.cts +10 -27
  392. package/dist/sandbox/docker-profile/schema.d.mts +10 -27
  393. package/dist/sandbox/docker-profile/schema.d.ts +10 -27
  394. package/dist/sandbox/e2b-agent-template.cjs +5 -2
  395. package/dist/sandbox/e2b-agent-template.cjs.map +1 -1
  396. package/dist/sandbox/keep-registry.cjs +28 -66
  397. package/dist/sandbox/keep-registry.cjs.map +1 -1
  398. package/dist/sandbox/types.cjs.map +1 -1
  399. package/dist/sandbox/types.d.cts +1 -1
  400. package/dist/sandbox/types.d.mts +1 -1
  401. package/dist/sandbox/types.d.ts +1 -1
  402. package/dist/shared/aggregate.cjs +16 -6
  403. package/dist/shared/aggregate.cjs.map +1 -1
  404. package/dist/shared/aggregate.d.cts +12 -4
  405. package/dist/shared/aggregate.d.mts +12 -4
  406. package/dist/shared/aggregate.d.ts +12 -4
  407. package/dist/shared/turn-label.cjs +20 -2
  408. package/dist/shared/turn-label.cjs.map +1 -1
  409. package/dist/shared/turn-label.d.cts +2 -0
  410. package/dist/shared/turn-label.d.mts +2 -0
  411. package/dist/shared/turn-label.d.ts +2 -0
  412. package/dist/shared/turn-label.js +4 -2
  413. package/dist/vendor/remark/remark-gfm.cjs +7 -7
  414. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  415. package/dist/vendor/remark/remark-parse.cjs +12 -12
  416. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  417. package/dist/vendor/remark/remark.cjs +13 -13
  418. package/dist/vendor/remark/remark.cjs.map +1 -1
  419. package/dist/view/server.cjs +6 -0
  420. package/dist/view/server.cjs.map +1 -1
  421. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  422. package/docs-site/zh/examples/coding-agent-extensions.mdx +1 -1
  423. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +1 -0
  424. package/docs-site/zh/examples/integrations/langgraph.mdx +1 -1
  425. package/docs-site/zh/explanation/assert.mdx +6 -6
  426. package/docs-site/zh/explanation/drive.mdx +1 -1
  427. package/docs-site/zh/explanation/evals.mdx +9 -9
  428. package/docs-site/zh/explanation/experiment.mdx +2 -2
  429. package/docs-site/zh/explanation/hitl.mdx +3 -3
  430. package/docs-site/zh/explanation/judge.mdx +5 -5
  431. package/docs-site/zh/explanation/overview.mdx +3 -3
  432. package/docs-site/zh/explanation/runner.mdx +1 -1
  433. package/docs-site/zh/index.mdx +3 -3
  434. package/docs-site/zh/reference/builtin-agents.mdx +9 -9
  435. package/docs-site/zh/reference/cli.mdx +18 -12
  436. package/docs-site/zh/reference/define-agent.mdx +130 -5
  437. package/docs-site/zh/reference/define-config.mdx +2 -2
  438. package/docs-site/zh/reference/define-eval.mdx +4 -4
  439. package/docs-site/zh/reference/events.mdx +1 -1
  440. package/docs-site/zh/reference/official-adapters.mdx +5 -5
  441. package/docs-site/zh/troubleshooting/debugging.mdx +1 -1
  442. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +37 -5
  443. package/docs-site/zh/tutorials/accept-results.mdx +72 -0
  444. package/docs-site/zh/tutorials/agent-onboarding.mdx +6 -6
  445. package/docs-site/zh/tutorials/authoring.mdx +9 -13
  446. package/docs-site/zh/tutorials/ci-integration.mdx +6 -6
  447. package/docs-site/zh/tutorials/compare-runs.mdx +61 -0
  448. package/docs-site/zh/tutorials/concurrency.mdx +13 -12
  449. package/docs-site/zh/tutorials/configuration.mdx +4 -6
  450. package/docs-site/zh/tutorials/connect-your-agent.mdx +1 -1
  451. package/docs-site/zh/tutorials/control-run-cost.mdx +58 -0
  452. package/docs-site/zh/tutorials/criteria-files.mdx +2 -2
  453. package/docs-site/zh/tutorials/custom-reports.mdx +2 -2
  454. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +46 -0
  455. package/docs-site/zh/tutorials/docker-in-docker.mdx +50 -44
  456. package/docs-site/zh/tutorials/eval-groups.mdx +6 -6
  457. package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
  458. package/docs-site/zh/tutorials/experiments.mdx +2 -3
  459. package/docs-site/zh/tutorials/handle-execution-failures.mdx +18 -10
  460. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +16 -8
  461. package/docs-site/zh/tutorials/plugins.mdx +14 -0
  462. package/docs-site/zh/tutorials/rerun-and-cache.mdx +3 -17
  463. package/docs-site/zh/tutorials/sandbox-agent.mdx +17 -11
  464. package/docs-site/zh/tutorials/sandbox-providers.mdx +17 -13
  465. package/docs-site/zh/tutorials/sandbox-reuse.mdx +12 -19
  466. package/docs-site/zh/tutorials/select-and-preview.mdx +65 -0
  467. package/docs-site/zh/tutorials/verify-judge.mdx +78 -0
  468. package/docs-site/zh/tutorials/viewing-results.mdx +27 -8
  469. package/docs-site/zh/tutorials/write-experiment.mdx +7 -5
  470. package/docs-site/zh/tutorials/write-send.mdx +2 -2
  471. package/package.json +9 -5
  472. package/dist/report/built-in/overview.cjs +0 -45
  473. package/dist/report/built-in/overview.cjs.map +0 -1
  474. package/dist/report/built-in/overview.d.cts +0 -6
  475. package/dist/report/built-in/overview.d.mts +0 -6
  476. package/dist/report/built-in/overview.d.ts +0 -6
  477. package/dist/report/built-in/overview.js +0 -9
  478. package/dist/report/built-in/overview.js.map +0 -1
  479. package/dist/runner/gate-lease.cjs +0 -283
  480. package/dist/runner/gate-lease.cjs.map +0 -1
  481. package/dist/runner/gate-lease.d.cts +0 -62
  482. package/dist/runner/gate-lease.d.mts +0 -62
  483. package/dist/runner/gate-lease.d.ts +0 -62
  484. package/dist/runner/gate-lease.js +0 -22
  485. 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。
@@ -44,7 +64,9 @@
44
64
  - `docs-site/zh/tutorials/sandbox-agent.mdx` — Sandbox Agent:评估 Claude Code、Codex 和 bub:使用 NiceEval 内置 agents 或自定义 adapter,在 Docker 或云端 sandbox 中运行 coding-agent CLI。
45
65
  - `docs-site/zh/tutorials/sandbox-providers.mdx` — Sandbox:官方 Sandbox Docker、Vercel 或 E2B Provider。通过预制快照加速评估
46
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 成本。
47
68
  - `docs-site/zh/tutorials/theming.mdx` — 报告外观与安全边界:用 Report theme token 调整外观,同时保留唯一的产品 CSS、离线阅读与 View shell 边界。
69
+ - `docs-site/zh/tutorials/verify-judge.mdx` — 配置并验证 Judge:连接 OpenAI 兼容 Judge 网关,用一条最小评估真实预检和判分,再从结果区分配置缺失、网络失败与低质量输出。
48
70
  - `docs-site/zh/tutorials/viewing-results.mdx` — 查看 NiceEval 结果:用 show 或 view 从已发布的 Record 选择固定 Sample,并读取一个页面或完整报告站。
49
71
  - `docs-site/zh/tutorials/write-experiment.mdx` — 实验与生命周期:如何写好实验。选择 Agent、传递 model 和 flags,设置 attempts、预算、并发与 Sandbox,并用 setup / teardown 起停实验级共享服务。
50
72
  - `docs-site/zh/tutorials/write-send.mdx` — 编写 Send:分七步编写 Adapter 的 send 函数:发送消息、续接会话、记录用量、映射工具事件、处理人工介入(HITL)、接入 OTel trace,并透传 Experiment flags。
@@ -81,7 +103,7 @@
81
103
 
82
104
  - `docs-site/zh/troubleshooting/debug-sandbox.mdx` — 保留 Sandbox 现场排查问题:用 --keep-sandbox 把失败 Attempt 的 Sandbox 保留成可随时唤醒的现场,用 niceeval sandbox enter 进去手动排查,用 sandbox list / stop 查看和清理。
83
105
  - `docs-site/zh/troubleshooting/debugging.mdx` — 排查结果与报告问题:根据可见错误、Sample 状态和 rebuild 反馈,定位查看、重跑与导出问题。
84
- - `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、补齐实验收尾,并显式恢复共享状态租约。
85
107
 
86
108
  ## `docs-site/zh/examples/`
87
109
 
@@ -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
@@ -26,9 +26,13 @@ const SKILL_DIR = ".agents/skills";
26
26
  // 安装都会去拉 Bub 主干,版本失控。所以安装前总是先把 `bub==<version>` 写进这个文件。
27
27
  const BUB_OVERRIDE_FILE = "/tmp/bub-override.txt";
28
28
  function resolvePin(config) {
29
+ const version = config?.version ?? coding_cli_versions_ts_1.DEFAULT_BUB_VERSION;
29
30
  return {
30
31
  requirement: config?.version ? (0, bub_install_spec_ts_1.bubRequirement)(config.version) : bub_install_spec_ts_1.DEFAULT_BUB_REQUIREMENT,
31
32
  otelPlugin: config?.otelPlugin ?? bub_install_spec_ts_1.DEFAULT_BUB_OTEL_PLUGIN,
33
+ // NiceEval can reproduce the default release's upstream lock exactly. A caller-selected
34
+ // historical Bub version owns a different closure, so do not silently apply 0.4.0's pins.
35
+ dependencyOverrides: version === coding_cli_versions_ts_1.DEFAULT_BUB_VERSION ? bub_install_spec_ts_1.DEFAULT_BUB_DEPENDENCY_OVERRIDES : [],
32
36
  };
33
37
  }
34
38
  // NiceEval 的预制配方与运行时安装都写到 $HOME/.local;显式使用该路径,避免 PATH 上
@@ -39,7 +43,7 @@ function normalizePackages(plugins) {
39
43
  return (0, bub_install_spec_ts_1.normalizeBubPackages)((plugins ?? []).map((plugin) => plugin.package));
40
44
  }
41
45
  function installHashOf(packages, pin) {
42
- return (0, bub_install_spec_ts_1.bubInstallHash)(packages, pin.requirement, pin.otelPlugin);
46
+ return (0, bub_install_spec_ts_1.bubInstallHash)(packages, pin.requirement, pin.otelPlugin, pin.dependencyOverrides);
43
47
  }
44
48
  function tapePath(workspace, sessionId, bubHome) {
45
49
  const w = (0, node_crypto_1.createHash)("md5").update(workspace).digest("hex").slice(0, 16);
@@ -47,8 +51,8 @@ function tapePath(workspace, sessionId, bubHome) {
47
51
  return `${bubHome}/tapes/${w}__${s}.jsonl`;
48
52
  }
49
53
  function bubAgent(config) {
50
- const getApiKey = () => config?.apiKey ?? (0, util_ts_1.requireEnv)("BUB_API_KEY");
51
- const getApiBase = () => config?.apiBase ?? (0, util_ts_1.requireEnv)("BUB_API_BASE");
54
+ const getApiKey = () => config?.apiKey ?? (0, util_ts_1.requireEnv)("OPENAI_API_KEY");
55
+ const getApiBase = () => config?.apiBase ?? (0, util_ts_1.requireEnv)("OPENAI_BASE_URL");
52
56
  const packages = normalizePackages(config?.pythonPlugins);
53
57
  const pin = resolvePin(config);
54
58
  const identity = {
@@ -70,7 +74,7 @@ function bubAgent(config) {
70
74
  installMode: "sandbox-network",
71
75
  install: async (sandbox) => {
72
76
  await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);
73
- await sandbox.writeText(BUB_OVERRIDE_FILE, `${pin.requirement}\n`);
77
+ await sandbox.writeText(BUB_OVERRIDE_FILE, `${[pin.requirement, ...pin.dependencyOverrides].join("\n")}\n`);
74
78
  const withPlugins = packages.map((pkg) => `--with ${(0, shell_ts_1.shellQuote)(pkg)}`).join(" ");
75
79
  let last = "";
76
80
  for (let attempt = 1; attempt <= 3; attempt += 1) {
@@ -151,8 +155,8 @@ function bubAgent(config) {
151
155
  ctx.session.capture(sessionId);
152
156
  const apiKey = getApiKey();
153
157
  const env = {
154
- BUB_API_KEY: apiKey,
155
- BUB_API_BASE: getApiBase(),
158
+ OPENAI_API_KEY: apiKey,
159
+ OPENAI_BASE_URL: getApiBase(),
156
160
  BUB_HOME: bubHome,
157
161
  ...ctx.telemetry?.env,
158
162
  };
@@ -1 +1 @@
1
- {"version":3,"file":"bub.js","sourceRoot":"","sources":["bub.ts"],"names":[],"mappings":"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","sourcesContent":["import { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { defineSandboxAgent } from \"../define.ts\";\nimport { requireEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapBubSpans } from \"../o11y/otlp/mappers/bub.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport type { Agent, AgentSetupManifest, SkillSpec, TurnEvidenceCoverage } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { t } from \"../i18n/index.ts\";\nimport { BUB_INSTALL_MARKER, DEFAULT_BUB_OTEL_PLUGIN, DEFAULT_BUB_REQUIREMENT, bubInstallHash, bubRequirement, normalizeBubPackages, } from \"./bub-install-spec.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { defineSandboxCommand } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// bub 的 agent adapter(沙箱型)。\n//\n// ⚠️ 现实校正:bub 是 PyPI 上的 `bub`(alpha,Python 3.12),不是 npm 包。\n// · 安装:uv tool install bub(uv 自带 python 3.12,免 root)。\n// · 调用:bub run \"<prompt>\" --session-id <id> --workspace <path>\n// · 模型 + 代理:BUB_MODEL=openai:<model>、BUB_API_BASE、BUB_API_KEY。\n// · 记忆:tape(总是开),落盘在 ~/.bub/tapes/<md5(ws)[:16]>__<md5(sess)[:16]>.jsonl。\n// ───────────────────────────────────────────────────────────────────────────\n/**\n * Bub 的扩展单元 —— **只属于 Bub**:Bub 的插件是运行环境里的 Python Package,\n * 与 Claude Code / Codex 的 native plugin 没有共同的安装协议,不共用类型。\n */\nexport interface PythonPluginSpec {\n /** PyPI Package、Version Specifier 或 Git URL(如 `bub-plugin-memory==1.3.0`、`git+https://…@8f3c1a2`)。 */\n package: string;\n}\nexport interface BubConfig {\n /** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */\n apiKey?: string;\n /** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */\n apiBase?: string;\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md(bub 没有原生 Skill 加载机制)。\n */\n skills?: SkillSpec[];\n /**\n * 装哪一版 Bub(PyPI 版本号,如 `\"0.4.0\"`)。省略时用 NiceEval 钉的默认版本;\n * 永远是确定版本,不装 latest —— 被测对象的版本要能从实验配置读出来。\n */\n version?: string;\n /**\n * OTel tape store 插件的 git 依赖(时间轨的来源)。省略时用 NiceEval 钉的默认 pin。\n *\n * 插件与 Bub 的 tape 协议同代:默认 pin 从 `bub.tape` 取类型,要求 Bub ≥ 0.3.10;更早的\n * 插件 commit 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,而是 span 全被拒、\n * 时间轨静默为空 —— 所以往回钉 `version` 时必须同批钉配套的插件 commit。\n */\n otelPlugin?: string;\n /**\n * 额外装进 bub tool 环境的 Python Package,每个 Sandbox setup 时进 `uv tool install … --with <pkg>`。\n * 规范化后的 package 列表进安装 checkpoint key:plugin 集合不同的两个 agent 变体不会复用同一个\n * 安装 checkpoint(否则第二个变体会静默拿到第一个变体的环境)。\n */\n pythonPlugins?: PythonPluginSpec[];\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在装 bub、装 Skills /\n * Python package、写 manifest 全部完成后执行。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: SandboxCommand[];\n}\nconst UV = \"$HOME/.local/bin/uv\";\n/** bub 的 skill 目录(`skills` 生态的「通用」目录);bub 不原生扫描它,靠 AGENTS.md 的发现指引。 */\nconst SKILL_DIR = \".agents/skills\";\n// bub 与 OTel 插件的 pin 都从 config 来(缺省用源码里的默认 pin)——不设环境变量后门:\n// 装哪个包是配置,配置的家是代码(边界见 docs/architecture.md「配置从代码来,凭据从环境来」)。\n//\n// override 文件不是历史包袱:插件所在 workspace 把 `bub` 声明成 git 依赖,不覆盖的话每次\n// 安装都会去拉 Bub 主干,版本失控。所以安装前总是先把 `bub==<version>` 写进这个文件。\nconst BUB_OVERRIDE_FILE = \"/tmp/bub-override.txt\";\n/** 一个 agent 变体装的那套 bub:requirement + OTel 插件,两者都进安装指纹。 */\ninterface BubInstallPin {\n requirement: string;\n otelPlugin: string;\n}\nfunction resolvePin(config?: BubConfig): BubInstallPin {\n return {\n requirement: config?.version ? bubRequirement(config.version) : DEFAULT_BUB_REQUIREMENT,\n otelPlugin: config?.otelPlugin ?? DEFAULT_BUB_OTEL_PLUGIN,\n };\n}\n// NiceEval 的预制配方与运行时安装都写到 $HOME/.local;显式使用该路径,避免 PATH 上\n// 另一个未知版本的 bub 抢先命中。\nconst BUB = \"$HOME/.local/bin/bub\";\n/** 规范化 python plugin:去空白、丢空串、去重 —— 安装命令与 checkpoint key 用同一份列表。 */\nfunction normalizePackages(plugins?: readonly PythonPluginSpec[]): string[] {\n return normalizeBubPackages((plugins ?? []).map((plugin) => plugin.package));\n}\nfunction installHashOf(packages: readonly string[], pin: BubInstallPin): string {\n return bubInstallHash(packages, pin.requirement, pin.otelPlugin);\n}\nfunction tapePath(workspace: string, sessionId: string, bubHome: string): string {\n const w = createHash(\"md5\").update(workspace).digest(\"hex\").slice(0, 16);\n const s = createHash(\"md5\").update(sessionId).digest(\"hex\").slice(0, 16);\n return `${bubHome}/tapes/${w}__${s}.jsonl`;\n}\nexport function bubAgent(config?: BubConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"BUB_API_KEY\");\n const getApiBase = () => config?.apiBase ?? requireEnv(\"BUB_API_BASE\");\n const packages = normalizePackages(config?.pythonPlugins);\n const pin = resolvePin(config);\n const identity = {\n agent: \"bub\",\n version: config?.version ?? DEFAULT_BUB_VERSION,\n revision: installHashOf(packages, pin),\n } as const;\n const marker = `$HOME/${BUB_INSTALL_MARKER}`;\n const probe = defineSandboxCommand({ id: \"niceeval.agent.probe.bub\", revision: identity.revision, inputs: identity }, async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${BUB} && test \"$(cat ${marker} 2>/dev/null)\" = ${shellQuote(identity.revision)}`);\n });\n // sandboxId → { home, workspace }; persists values detected in setup() so send() can use them.\n const sessionInfo = new Map<string, {\n home: string;\n workspace: string;\n }>();\n return registerAgentLifecycleHookCommands(defineSandboxAgent({\n name: \"bub\",\n ensure: { identity, probe },\n installers: [{\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);\n await sandbox.writeText(BUB_OVERRIDE_FILE, `${pin.requirement}\\n`);\n const withPlugins = packages.map((pkg) => `--with ${shellQuote(pkg)}`).join(\" \");\n let last = \"\";\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const result = await sandbox.runShell(`${UV} tool install --reinstall --python 3.12 --prerelease allow 'bub' --overrides ${BUB_OVERRIDE_FILE} --with ${shellQuote(pin.otelPlugin)}${withPlugins ? ` ${withPlugins}` : \"\"}`);\n if (result.exitCode === 0) {\n await sandbox.runShellOrThrow(`mkdir -p \"$(dirname ${marker})\" && printf '%s' ${shellQuote(identity.revision)} > ${marker}`);\n return;\n }\n last = (result.stdout + result.stderr).split(\"\\n\").slice(-15).join(\"\\n\");\n }\n throw new Error(t(\"bub.installFailed\", { attempts: 3, tail: last }));\n },\n }],\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapBubSpans,\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n BUB_TAPESTORE_OTEL_ENABLED: \"true\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n async setup(sb, ctx) {\n // home 必须来自运行时探测:各 sandbox provider 不同(/home/node、/home/vercel-sandbox…),\n // 兜一个 provider 专属常量会静默走错路径(tape 读不到 → 空事件流 → 负断言假通过)。\n const home = (await sb.runShell(\"printf '%s' $HOME\")).stdout.trim();\n if (!home)\n throw new Error(t(\"bub.homeDetectFailed\"));\n const workspace = sb.workdir;\n sessionInfo.set(sb.sandboxId, { home, workspace });\n // Agent CLI 已由 runner 的 agent.ensure 循环完成安装与复检。\n // adapter setup 只写本 Attempt 的 runtime config。\n if (!(await sb.pathExists(`${workspace}/AGENTS.md`))) {\n await shared.writeFile(sb, `${workspace}/AGENTS.md`, [\n `You are a coding agent working in a Next.js project at ${workspace}.`,\n ``,\n `Implement the requested feature by writing files directly to disk with the available tools:`,\n `- fs_write(path, content): create or overwrite a file`,\n `- fs_edit(path, old, new): edit an existing file`,\n `- bash(cmd): run shell commands`,\n ``,\n `Do NOT respond with only a text explanation — write the actual code files.`,\n `After writing, verify with bash(\"cd ${workspace} && npm run build\").`,\n ].join(\"\\n\"));\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // bub 没有原生 Skill 加载机制:装进目录不等于会被读到,发现指引跟着一起写。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (packages.length)\n manifest.pythonPlugins = packages.map((pkg) => ({ package: pkg }));\n if (manifest.skills.length || manifest.pythonPlugins?.length) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"bub\", config?.postSetup);\n },\n async teardown(sb, ctx) {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // bub 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, ctx, \"bub\", config?.preTeardown);\n },\n async send(input, ctx) {\n const sb = ctx.sandbox;\n const info = sessionInfo.get(sb.sandboxId);\n if (!info)\n throw new Error(t(\"bub.setupNotRun\"));\n const { home, workspace } = info;\n const bubHome = `${home}/.bub`;\n // 会话契约:ctx.session.id 未记录时开新 tape(新 sessionId),否则 resume 传入的 id。\n // tape 路径由 md5(workspace)+md5(sessionId) 决定,同沙箱多会话靠 sessionId 区分。\n const sessionId = ctx.session.id ?? `fe-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const apiKey = getApiKey();\n const env: globalThis.Record<string, string> = {\n BUB_API_KEY: apiKey,\n BUB_API_BASE: getApiBase(),\n BUB_HOME: bubHome,\n ...ctx.telemetry?.env,\n };\n // model 归属:实验决定(ctx.model),省略时交给 bub 原生默认 / 用户环境,不硬编码。\n if (ctx.model)\n env.BUB_MODEL = `openai:${ctx.model}`;\n const res = await sb.runShell(`${BUB} --workspace ${workspace} run ${shared.shellQuote(input.text)} --session-id ${sessionId}`, { env, sensitiveValues: [apiKey], stream: true });\n const raw = await sb.readText(tapePath(workspace, sessionId, bubHome)).catch(() => undefined);\n const parsed = shared.parseBub(raw);\n const events = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw?.trim()) {\n const reason = \"Bub tape was unavailable; tool trajectory was not observed.\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n }\n else if (!parsed.parseSuccess) {\n const reason = \"Some Bub tape lines could not be parsed.\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\",\n ...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),\n };\n },\n }), config?.postSetup, config?.preTeardown);\n}\nexport default bubAgent();\n"]}
1
+ {"version":3,"file":"bub.js","sourceRoot":"","sources":["bub.ts"],"names":[],"mappings":"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","sourcesContent":["import { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { defineSandboxAgent } from \"../define.ts\";\nimport { requireEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapBubSpans } from \"../o11y/otlp/mappers/bub.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport type { Agent, AgentSetupManifest, SkillSpec, TurnEvidenceCoverage } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { t } from \"../i18n/index.ts\";\nimport { BUB_INSTALL_MARKER, DEFAULT_BUB_DEPENDENCY_OVERRIDES, DEFAULT_BUB_OTEL_PLUGIN, DEFAULT_BUB_REQUIREMENT, bubInstallHash, bubRequirement, normalizeBubPackages, } from \"./bub-install-spec.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { defineSandboxCommand } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// bub 的 agent adapter(沙箱型)。\n//\n// ⚠️ 现实校正:bub 是 PyPI 上的 `bub`(alpha,Python 3.12),不是 npm 包。\n// · 安装:uv tool install bub(uv 自带 python 3.12,免 root)。\n// · 调用:bub run \"<prompt>\" --session-id <id> --workspace <path>\n// · 模型 + 代理:BUB_MODEL=openai:<model>、OPENAI_BASE_URL、OPENAI_API_KEY。\n// · 记忆:tape(总是开),落盘在 ~/.bub/tapes/<md5(ws)[:16]>__<md5(sess)[:16]>.jsonl。\n// ───────────────────────────────────────────────────────────────────────────\n/**\n * Bub 的扩展单元 —— **只属于 Bub**:Bub 的插件是运行环境里的 Python Package,\n * 与 Claude Code / Codex 的 native plugin 没有共同的安装协议,不共用类型。\n */\nexport interface PythonPluginSpec {\n /** PyPI Package、Version Specifier 或 Git URL(如 `bub-plugin-memory==1.3.0`、`git+https://…@8f3c1a2`)。 */\n package: string;\n}\nexport interface BubConfig {\n /** OpenAI 兼容代理的 API key。省略时读 OPENAI_API_KEY env。 */\n apiKey?: string;\n /** OpenAI 兼容代理的 base URL。省略时读 OPENAI_BASE_URL env。 */\n apiBase?: string;\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md(bub 没有原生 Skill 加载机制)。\n */\n skills?: SkillSpec[];\n /**\n * 装哪一版 Bub(PyPI 版本号,如 `\"0.4.0\"`)。省略时用 NiceEval 钉的默认版本;\n * 永远是确定版本,不装 latest —— 被测对象的版本要能从实验配置读出来。\n */\n version?: string;\n /**\n * OTel tape store 插件的 git 依赖(时间轨的来源)。省略时用 NiceEval 钉的默认 pin。\n *\n * 插件与 Bub 的 tape 协议同代:默认 pin 从 `bub.tape` 取类型,要求 Bub ≥ 0.3.10;更早的\n * 插件 commit 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,而是 span 全被拒、\n * 时间轨静默为空 —— 所以往回钉 `version` 时必须同批钉配套的插件 commit。\n */\n otelPlugin?: string;\n /**\n * 额外装进 bub tool 环境的 Python Package,每个 Sandbox setup 时进 `uv tool install … --with <pkg>`。\n * 规范化后的 package 列表进安装 checkpoint key:plugin 集合不同的两个 agent 变体不会复用同一个\n * 安装 checkpoint(否则第二个变体会静默拿到第一个变体的环境)。\n */\n pythonPlugins?: PythonPluginSpec[];\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在装 bub、装 Skills /\n * Python package、写 manifest 全部完成后执行。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: SandboxCommand[];\n}\nconst UV = \"$HOME/.local/bin/uv\";\n/** bub 的 skill 目录(`skills` 生态的「通用」目录);bub 不原生扫描它,靠 AGENTS.md 的发现指引。 */\nconst SKILL_DIR = \".agents/skills\";\n// bub 与 OTel 插件的 pin 都从 config 来(缺省用源码里的默认 pin)——不设环境变量后门:\n// 装哪个包是配置,配置的家是代码(边界见 docs/architecture.md「配置从代码来,凭据从环境来」)。\n//\n// override 文件不是历史包袱:插件所在 workspace 把 `bub` 声明成 git 依赖,不覆盖的话每次\n// 安装都会去拉 Bub 主干,版本失控。所以安装前总是先把 `bub==<version>` 写进这个文件。\nconst BUB_OVERRIDE_FILE = \"/tmp/bub-override.txt\";\n/** 一个 agent 变体装的那套 bub:requirement + OTel 插件,两者都进安装指纹。 */\ninterface BubInstallPin {\n requirement: string;\n otelPlugin: string;\n dependencyOverrides: readonly string[];\n}\nfunction resolvePin(config?: BubConfig): BubInstallPin {\n const version = config?.version ?? DEFAULT_BUB_VERSION;\n return {\n requirement: config?.version ? bubRequirement(config.version) : DEFAULT_BUB_REQUIREMENT,\n otelPlugin: config?.otelPlugin ?? DEFAULT_BUB_OTEL_PLUGIN,\n // NiceEval can reproduce the default release's upstream lock exactly. A caller-selected\n // historical Bub version owns a different closure, so do not silently apply 0.4.0's pins.\n dependencyOverrides: version === DEFAULT_BUB_VERSION ? DEFAULT_BUB_DEPENDENCY_OVERRIDES : [],\n };\n}\n// NiceEval 的预制配方与运行时安装都写到 $HOME/.local;显式使用该路径,避免 PATH 上\n// 另一个未知版本的 bub 抢先命中。\nconst BUB = \"$HOME/.local/bin/bub\";\n/** 规范化 python plugin:去空白、丢空串、去重 —— 安装命令与 checkpoint key 用同一份列表。 */\nfunction normalizePackages(plugins?: readonly PythonPluginSpec[]): string[] {\n return normalizeBubPackages((plugins ?? []).map((plugin) => plugin.package));\n}\nfunction installHashOf(packages: readonly string[], pin: BubInstallPin): string {\n return bubInstallHash(packages, pin.requirement, pin.otelPlugin, pin.dependencyOverrides);\n}\nfunction tapePath(workspace: string, sessionId: string, bubHome: string): string {\n const w = createHash(\"md5\").update(workspace).digest(\"hex\").slice(0, 16);\n const s = createHash(\"md5\").update(sessionId).digest(\"hex\").slice(0, 16);\n return `${bubHome}/tapes/${w}__${s}.jsonl`;\n}\nexport function bubAgent(config?: BubConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"OPENAI_API_KEY\");\n const getApiBase = () => config?.apiBase ?? requireEnv(\"OPENAI_BASE_URL\");\n const packages = normalizePackages(config?.pythonPlugins);\n const pin = resolvePin(config);\n const identity = {\n agent: \"bub\",\n version: config?.version ?? DEFAULT_BUB_VERSION,\n revision: installHashOf(packages, pin),\n } as const;\n const marker = `$HOME/${BUB_INSTALL_MARKER}`;\n const probe = defineSandboxCommand({ id: \"niceeval.agent.probe.bub\", revision: identity.revision, inputs: identity }, async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${BUB} && test \"$(cat ${marker} 2>/dev/null)\" = ${shellQuote(identity.revision)}`);\n });\n // sandboxId → { home, workspace }; persists values detected in setup() so send() can use them.\n const sessionInfo = new Map<string, {\n home: string;\n workspace: string;\n }>();\n return registerAgentLifecycleHookCommands(defineSandboxAgent({\n name: \"bub\",\n ensure: { identity, probe },\n installers: [{\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);\n await sandbox.writeText(BUB_OVERRIDE_FILE, `${[pin.requirement, ...pin.dependencyOverrides].join(\"\\n\")}\\n`);\n const withPlugins = packages.map((pkg) => `--with ${shellQuote(pkg)}`).join(\" \");\n let last = \"\";\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const result = await sandbox.runShell(`${UV} tool install --reinstall --python 3.12 --prerelease allow 'bub' --overrides ${BUB_OVERRIDE_FILE} --with ${shellQuote(pin.otelPlugin)}${withPlugins ? ` ${withPlugins}` : \"\"}`);\n if (result.exitCode === 0) {\n await sandbox.runShellOrThrow(`mkdir -p \"$(dirname ${marker})\" && printf '%s' ${shellQuote(identity.revision)} > ${marker}`);\n return;\n }\n last = (result.stdout + result.stderr).split(\"\\n\").slice(-15).join(\"\\n\");\n }\n throw new Error(t(\"bub.installFailed\", { attempts: 3, tail: last }));\n },\n }],\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapBubSpans,\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n BUB_TAPESTORE_OTEL_ENABLED: \"true\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n async setup(sb, ctx) {\n // home 必须来自运行时探测:各 sandbox provider 不同(/home/node、/home/vercel-sandbox…),\n // 兜一个 provider 专属常量会静默走错路径(tape 读不到 → 空事件流 → 负断言假通过)。\n const home = (await sb.runShell(\"printf '%s' $HOME\")).stdout.trim();\n if (!home)\n throw new Error(t(\"bub.homeDetectFailed\"));\n const workspace = sb.workdir;\n sessionInfo.set(sb.sandboxId, { home, workspace });\n // Agent CLI 已由 runner 的 agent.ensure 循环完成安装与复检。\n // adapter setup 只写本 Attempt 的 runtime config。\n if (!(await sb.pathExists(`${workspace}/AGENTS.md`))) {\n await shared.writeFile(sb, `${workspace}/AGENTS.md`, [\n `You are a coding agent working in a Next.js project at ${workspace}.`,\n ``,\n `Implement the requested feature by writing files directly to disk with the available tools:`,\n `- fs_write(path, content): create or overwrite a file`,\n `- fs_edit(path, old, new): edit an existing file`,\n `- bash(cmd): run shell commands`,\n ``,\n `Do NOT respond with only a text explanation — write the actual code files.`,\n `After writing, verify with bash(\"cd ${workspace} && npm run build\").`,\n ].join(\"\\n\"));\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // bub 没有原生 Skill 加载机制:装进目录不等于会被读到,发现指引跟着一起写。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (packages.length)\n manifest.pythonPlugins = packages.map((pkg) => ({ package: pkg }));\n if (manifest.skills.length || manifest.pythonPlugins?.length) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"bub\", config?.postSetup);\n },\n async teardown(sb, ctx) {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // bub 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, ctx, \"bub\", config?.preTeardown);\n },\n async send(input, ctx) {\n const sb = ctx.sandbox;\n const info = sessionInfo.get(sb.sandboxId);\n if (!info)\n throw new Error(t(\"bub.setupNotRun\"));\n const { home, workspace } = info;\n const bubHome = `${home}/.bub`;\n // 会话契约:ctx.session.id 未记录时开新 tape(新 sessionId),否则 resume 传入的 id。\n // tape 路径由 md5(workspace)+md5(sessionId) 决定,同沙箱多会话靠 sessionId 区分。\n const sessionId = ctx.session.id ?? `fe-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const apiKey = getApiKey();\n const env: globalThis.Record<string, string> = {\n OPENAI_API_KEY: apiKey,\n OPENAI_BASE_URL: getApiBase(),\n BUB_HOME: bubHome,\n ...ctx.telemetry?.env,\n };\n // model 归属:实验决定(ctx.model),省略时交给 bub 原生默认 / 用户环境,不硬编码。\n if (ctx.model)\n env.BUB_MODEL = `openai:${ctx.model}`;\n const res = await sb.runShell(`${BUB} --workspace ${workspace} run ${shared.shellQuote(input.text)} --session-id ${sessionId}`, { env, sensitiveValues: [apiKey], stream: true });\n const raw = await sb.readText(tapePath(workspace, sessionId, bubHome)).catch(() => undefined);\n const parsed = shared.parseBub(raw);\n const events = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw?.trim()) {\n const reason = \"Bub tape was unavailable; tool trajectory was not observed.\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n }\n else if (!parsed.parseSuccess) {\n const reason = \"Some Bub tape lines could not be parsed.\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\",\n ...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),\n };\n },\n }), config?.postSetup, config?.preTeardown);\n}\nexport default bubAgent();\n"]}
@@ -9,9 +9,9 @@ export interface PythonPluginSpec {
9
9
  package: string;
10
10
  }
11
11
  export interface BubConfig {
12
- /** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */
12
+ /** OpenAI 兼容代理的 API key。省略时读 OPENAI_API_KEY env。 */
13
13
  apiKey?: string;
14
- /** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */
14
+ /** OpenAI 兼容代理的 base URL。省略时读 OPENAI_BASE_URL env。 */
15
15
  apiBase?: string;
16
16
  /**
17
17
  * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。
@@ -9,9 +9,9 @@ export interface PythonPluginSpec {
9
9
  package: string;
10
10
  }
11
11
  export interface BubConfig {
12
- /** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */
12
+ /** OpenAI 兼容代理的 API key。省略时读 OPENAI_API_KEY env。 */
13
13
  apiKey?: string;
14
- /** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */
14
+ /** OpenAI 兼容代理的 base URL。省略时读 OPENAI_BASE_URL env。 */
15
15
  apiBase?: string;
16
16
  /**
17
17
  * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。
@@ -9,9 +9,9 @@ export interface PythonPluginSpec {
9
9
  package: string;
10
10
  }
11
11
  export interface BubConfig {
12
- /** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */
12
+ /** OpenAI 兼容代理的 API key。省略时读 OPENAI_API_KEY env。 */
13
13
  apiKey?: string;
14
- /** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */
14
+ /** OpenAI 兼容代理的 base URL。省略时读 OPENAI_BASE_URL env。 */
15
15
  apiBase?: string;
16
16
  /**
17
17
  * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。