niceeval 0.13.1 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (548) hide show
  1. package/INDEX.md +25 -2
  2. package/README.md +9 -10
  3. package/README.zh.md +9 -10
  4. package/dist/agents/ai-sdk.cjs.map +1 -1
  5. package/dist/agents/ai-sdk.d.cts +1 -1
  6. package/dist/agents/ai-sdk.d.mts +1 -1
  7. package/dist/agents/ai-sdk.d.ts +1 -1
  8. package/dist/agents/bub-install-spec.cjs +19 -5
  9. package/dist/agents/bub-install-spec.cjs.map +1 -1
  10. package/dist/agents/bub-install-spec.d.cts +9 -2
  11. package/dist/agents/bub-install-spec.d.mts +9 -2
  12. package/dist/agents/bub-install-spec.d.ts +9 -2
  13. package/dist/agents/bub-install-spec.js +14 -12
  14. package/dist/agents/bub.cjs +10 -6
  15. package/dist/agents/bub.cjs.map +1 -1
  16. package/dist/agents/bub.d.cts +2 -2
  17. package/dist/agents/bub.d.mts +2 -2
  18. package/dist/agents/bub.d.ts +2 -2
  19. package/dist/agents/claude-code.cjs.map +1 -1
  20. package/dist/agents/claude-code.d.cts +2 -2
  21. package/dist/agents/claude-code.d.mts +2 -2
  22. package/dist/agents/claude-code.d.ts +2 -2
  23. package/dist/agents/codex.cjs +4 -4
  24. package/dist/agents/codex.cjs.map +1 -1
  25. package/dist/agents/codex.d.cts +3 -3
  26. package/dist/agents/codex.d.mts +3 -3
  27. package/dist/agents/codex.d.ts +3 -3
  28. package/dist/agents/coding-cli-versions.cjs +10 -1
  29. package/dist/agents/coding-cli-versions.cjs.map +1 -1
  30. package/dist/agents/coding-cli-versions.d.cts +8 -3
  31. package/dist/agents/coding-cli-versions.d.mts +8 -3
  32. package/dist/agents/coding-cli-versions.d.ts +8 -3
  33. package/dist/agents/coding-cli-versions.js +18 -12
  34. package/dist/agents/deepseek-harness.cjs +151 -0
  35. package/dist/agents/deepseek-harness.cjs.map +1 -0
  36. package/dist/agents/deepseek-harness.d.cts +14 -0
  37. package/dist/agents/deepseek-harness.d.mts +14 -0
  38. package/dist/agents/deepseek-harness.d.ts +14 -0
  39. package/dist/agents/deepseek-harness.js +7 -0
  40. package/dist/agents/deepseek-harness.js.map +1 -0
  41. package/dist/agents/exact-npm-plugins.cjs +28 -0
  42. package/dist/agents/exact-npm-plugins.cjs.map +1 -0
  43. package/dist/agents/exact-npm-plugins.d.cts +10 -0
  44. package/dist/agents/exact-npm-plugins.d.mts +10 -0
  45. package/dist/agents/exact-npm-plugins.d.ts +10 -0
  46. package/dist/agents/exact-npm-plugins.js +8 -0
  47. package/dist/agents/exact-npm-plugins.js.map +1 -0
  48. package/dist/agents/index.cjs +5 -1
  49. package/dist/agents/index.cjs.map +1 -1
  50. package/dist/agents/index.d.cts +4 -0
  51. package/dist/agents/index.d.mts +4 -0
  52. package/dist/agents/index.d.ts +4 -0
  53. package/dist/agents/index.js +54 -50
  54. package/dist/agents/index.mjs +54 -50
  55. package/dist/agents/omp.cjs +170 -0
  56. package/dist/agents/omp.cjs.map +1 -0
  57. package/dist/agents/omp.d.cts +14 -0
  58. package/dist/agents/omp.d.mts +14 -0
  59. package/dist/agents/omp.d.ts +14 -0
  60. package/dist/agents/omp.js +7 -0
  61. package/dist/agents/omp.js.map +1 -0
  62. package/dist/agents/openclaw.cjs +51 -2
  63. package/dist/agents/openclaw.cjs.map +1 -1
  64. package/dist/agents/openclaw.d.cts +2 -0
  65. package/dist/agents/openclaw.d.mts +2 -0
  66. package/dist/agents/openclaw.d.ts +2 -0
  67. package/dist/agents/types.cjs.map +1 -1
  68. package/dist/agents/types.d.cts +4 -4
  69. package/dist/agents/types.d.mts +4 -4
  70. package/dist/agents/types.d.ts +4 -4
  71. package/dist/agents/ui-message-stream.cjs +24 -7
  72. package/dist/agents/ui-message-stream.cjs.map +1 -1
  73. package/dist/analysis/api.cjs +28 -2
  74. package/dist/analysis/api.cjs.map +1 -1
  75. package/dist/analysis/api.d.cts +22 -1
  76. package/dist/analysis/api.d.mts +22 -1
  77. package/dist/analysis/api.d.ts +22 -1
  78. package/dist/analysis/api.js +8 -6
  79. package/dist/analysis/bindings.cjs +11 -18
  80. package/dist/analysis/bindings.cjs.map +1 -1
  81. package/dist/analysis/bindings.d.cts +177 -49
  82. package/dist/analysis/bindings.d.mts +177 -49
  83. package/dist/analysis/bindings.d.ts +177 -49
  84. package/dist/analysis/contracts.cjs +1 -0
  85. package/dist/analysis/contracts.cjs.map +1 -1
  86. package/dist/analysis/contracts.d.cts +43 -3
  87. package/dist/analysis/contracts.d.mts +43 -3
  88. package/dist/analysis/contracts.d.ts +43 -3
  89. package/dist/analysis/cost-projection.cjs +2 -1
  90. package/dist/analysis/cost-projection.cjs.map +1 -1
  91. package/dist/analysis/cost-projection.d.cts +1 -1
  92. package/dist/analysis/cost-projection.d.mts +1 -1
  93. package/dist/analysis/cost-projection.d.ts +1 -1
  94. package/dist/analysis/cost.cjs +13 -3
  95. package/dist/analysis/cost.cjs.map +1 -1
  96. package/dist/analysis/cost.d.cts +10 -3
  97. package/dist/analysis/cost.d.mts +10 -3
  98. package/dist/analysis/cost.d.ts +10 -3
  99. package/dist/analysis/experiment-groups.cjs +96 -0
  100. package/dist/analysis/experiment-groups.cjs.map +1 -0
  101. package/dist/analysis/experiment-groups.d.cts +9 -0
  102. package/dist/analysis/experiment-groups.d.mts +9 -0
  103. package/dist/analysis/experiment-groups.d.ts +9 -0
  104. package/dist/analysis/experiment-groups.js +10 -0
  105. package/dist/analysis/experiment-groups.js.map +1 -0
  106. package/dist/analysis/index.cjs +4 -1
  107. package/dist/analysis/index.cjs.map +1 -1
  108. package/dist/analysis/index.d.cts +4 -2
  109. package/dist/analysis/index.d.mts +4 -2
  110. package/dist/analysis/index.d.ts +4 -2
  111. package/dist/analysis/index.js +40 -36
  112. package/dist/analysis/index.mjs +40 -36
  113. package/dist/assertions/limits.cjs +4 -0
  114. package/dist/assertions/limits.cjs.map +1 -1
  115. package/dist/assertions/limits.d.cts +4 -0
  116. package/dist/assertions/limits.d.mts +4 -0
  117. package/dist/assertions/limits.d.ts +4 -0
  118. package/dist/assertions/match.cjs +63 -25
  119. package/dist/assertions/match.cjs.map +1 -1
  120. package/dist/assertions/match.d.cts +7 -0
  121. package/dist/assertions/match.d.mts +7 -0
  122. package/dist/assertions/match.d.ts +7 -0
  123. package/dist/assertions/record/attachment.cjs +32 -4
  124. package/dist/assertions/record/attachment.cjs.map +1 -1
  125. package/dist/assertions/record/diff.cjs +10 -4
  126. package/dist/assertions/record/diff.cjs.map +1 -1
  127. package/dist/assertions/record/producer.cjs +101 -4
  128. package/dist/assertions/record/producer.cjs.map +1 -1
  129. package/dist/assertions/record/producer.d.cts +4 -1
  130. package/dist/assertions/record/producer.d.mts +4 -1
  131. package/dist/assertions/record/producer.d.ts +4 -1
  132. package/dist/assertions/runtime.cjs +45 -5
  133. package/dist/assertions/runtime.cjs.map +1 -1
  134. package/dist/cli/record.cjs +113 -8
  135. package/dist/cli/record.cjs.map +1 -1
  136. package/dist/cli/record.d.cts +20 -1
  137. package/dist/cli/record.d.mts +20 -1
  138. package/dist/cli/record.d.ts +20 -1
  139. package/dist/cli/record.js +4 -2
  140. package/dist/cli.cjs +386 -31
  141. package/dist/cli.cjs.map +1 -1
  142. package/dist/cli.d.cts +10 -2
  143. package/dist/cli.d.mts +10 -2
  144. package/dist/cli.d.ts +10 -2
  145. package/dist/context/send-retry.cjs +4 -4
  146. package/dist/context/send-retry.cjs.map +1 -1
  147. package/dist/coordination/host/runtime.cjs +8 -30
  148. package/dist/coordination/host/runtime.cjs.map +1 -1
  149. package/dist/coordination/host/runtime.d.cts +3 -3
  150. package/dist/coordination/host/runtime.d.mts +3 -3
  151. package/dist/coordination/host/runtime.d.ts +3 -3
  152. package/dist/coordination/host/types.cjs.map +1 -1
  153. package/dist/coordination/host/types.d.cts +0 -5
  154. package/dist/coordination/host/types.d.mts +0 -5
  155. package/dist/coordination/host/types.d.ts +0 -5
  156. package/dist/coordination/platform/node.cjs +90 -9
  157. package/dist/coordination/platform/node.cjs.map +1 -1
  158. package/dist/define.cjs +25 -1
  159. package/dist/define.cjs.map +1 -1
  160. package/dist/experiment/host/index.cjs +1 -0
  161. package/dist/experiment/host/index.cjs.map +1 -1
  162. package/dist/i18n/en.cjs +26 -8
  163. package/dist/i18n/en.cjs.map +1 -1
  164. package/dist/i18n/en.d.cts +19 -6
  165. package/dist/i18n/en.d.mts +19 -6
  166. package/dist/i18n/en.d.ts +19 -6
  167. package/dist/index.cjs.map +1 -1
  168. package/dist/index.d.cts +1 -1
  169. package/dist/index.d.mts +1 -1
  170. package/dist/index.d.ts +1 -1
  171. package/dist/o11y/parsers/hermes.cjs +1 -1
  172. package/dist/o11y/parsers/hermes.cjs.map +1 -1
  173. package/dist/o11y/prices.json +1 -1
  174. package/dist/o11y/record/families.cjs +12 -3
  175. package/dist/o11y/record/families.cjs.map +1 -1
  176. package/dist/o11y/record/families.d.cts +8 -8
  177. package/dist/o11y/record/families.d.mts +8 -8
  178. package/dist/o11y/record/families.d.ts +8 -8
  179. package/dist/o11y/record/family-projectors.d.cts +66 -18
  180. package/dist/o11y/record/family-projectors.d.mts +66 -18
  181. package/dist/o11y/record/family-projectors.d.ts +66 -18
  182. package/dist/o11y/record/family-writers.d.cts +11 -3
  183. package/dist/o11y/record/family-writers.d.mts +11 -3
  184. package/dist/o11y/record/family-writers.d.ts +11 -3
  185. package/dist/o11y/record/runner-producer.cjs +14 -4
  186. package/dist/o11y/record/runner-producer.cjs.map +1 -1
  187. package/dist/record/codec/core.d.cts +2 -2
  188. package/dist/record/codec/core.d.mts +2 -2
  189. package/dist/record/codec/core.d.ts +2 -2
  190. package/dist/record/family/catalog.d.cts +44 -12
  191. package/dist/record/family/catalog.d.mts +44 -12
  192. package/dist/record/family/catalog.d.ts +44 -12
  193. package/dist/record/family/index.js +128 -124
  194. package/dist/record/family/observability-v1.cjs +35 -0
  195. package/dist/record/family/observability-v1.cjs.map +1 -0
  196. package/dist/record/family/observability-v1.d.cts +3 -0
  197. package/dist/record/family/observability-v1.d.mts +3 -0
  198. package/dist/record/family/observability-v1.d.ts +3 -0
  199. package/dist/record/family/observability-v1.js +6 -0
  200. package/dist/record/family/observability-v1.js.map +1 -0
  201. package/dist/record/family/observability.cjs +58 -9
  202. package/dist/record/family/observability.cjs.map +1 -1
  203. package/dist/record/family/observability.d.cts +1014 -15
  204. package/dist/record/family/observability.d.mts +1014 -15
  205. package/dist/record/family/observability.d.ts +1014 -15
  206. package/dist/record/family/observability.js +22 -18
  207. package/dist/record/host/runtime.cjs +600 -31
  208. package/dist/record/host/runtime.cjs.map +1 -1
  209. package/dist/record/host/types.cjs.map +1 -1
  210. package/dist/record/host/types.d.cts +33 -9
  211. package/dist/record/host/types.d.mts +33 -9
  212. package/dist/record/host/types.d.ts +33 -9
  213. package/dist/record/maintenance/runtime.cjs +1 -2
  214. package/dist/record/maintenance/runtime.cjs.map +1 -1
  215. package/dist/record/model/core.cjs.map +1 -1
  216. package/dist/record/model/core.d.cts +1 -1
  217. package/dist/record/model/core.d.mts +1 -1
  218. package/dist/record/model/core.d.ts +1 -1
  219. package/dist/record/model/definition.d.cts +6 -6
  220. package/dist/record/model/definition.d.mts +6 -6
  221. package/dist/record/model/definition.d.ts +6 -6
  222. package/dist/record/model/identifiers.cjs +1 -1
  223. package/dist/record/model/identifiers.cjs.map +1 -1
  224. package/dist/record/model/identifiers.d.cts +1 -1
  225. package/dist/record/model/identifiers.d.mts +1 -1
  226. package/dist/record/model/identifiers.d.ts +1 -1
  227. package/dist/record/platform/node.cjs +159 -23
  228. package/dist/record/platform/node.cjs.map +1 -1
  229. package/dist/record/platform/services.cjs.map +1 -1
  230. package/dist/record/platform/services.d.cts +15 -2
  231. package/dist/record/platform/services.d.mts +15 -2
  232. package/dist/record/platform/services.d.ts +15 -2
  233. package/dist/record/reader/errors.cjs +37 -1
  234. package/dist/record/reader/errors.cjs.map +1 -1
  235. package/dist/record/reader/errors.d.cts +49 -1
  236. package/dist/record/reader/errors.d.mts +49 -1
  237. package/dist/record/reader/errors.d.ts +49 -1
  238. package/dist/record/reader/errors.js +22 -12
  239. package/dist/record/reader/format.cjs +76 -17
  240. package/dist/record/reader/format.cjs.map +1 -1
  241. package/dist/record/reader/format.d.cts +11 -4
  242. package/dist/record/reader/format.d.mts +11 -4
  243. package/dist/record/reader/format.d.ts +11 -4
  244. package/dist/record/reader/format.js +2 -0
  245. package/dist/record/reader/index.js +32 -18
  246. package/dist/record/reader/runtime.cjs +64 -0
  247. package/dist/record/reader/runtime.cjs.map +1 -1
  248. package/dist/record/reader/runtime.d.cts +15 -0
  249. package/dist/record/reader/runtime.d.mts +15 -0
  250. package/dist/record/reader/runtime.d.ts +15 -0
  251. package/dist/record/reader/runtime.js +2 -0
  252. package/dist/report/assets/styles.css +53 -29
  253. package/dist/report/built-in/analysis-values.cjs +21 -13
  254. package/dist/report/built-in/analysis-values.cjs.map +1 -1
  255. package/dist/report/built-in/analysis-values.d.cts +11 -22
  256. package/dist/report/built-in/analysis-values.d.mts +11 -22
  257. package/dist/report/built-in/analysis-values.d.ts +11 -22
  258. package/dist/report/built-in/analysis-values.js +4 -6
  259. package/dist/report/built-in/index.cjs +1 -3
  260. package/dist/report/built-in/index.cjs.map +1 -1
  261. package/dist/report/built-in/index.d.cts +1 -1
  262. package/dist/report/built-in/index.d.mts +1 -1
  263. package/dist/report/built-in/index.d.ts +1 -1
  264. package/dist/report/built-in/index.js +4 -8
  265. package/dist/report/built-in/index.mjs +4 -8
  266. package/dist/report/built-in/machine.cjs +0 -2
  267. package/dist/report/built-in/machine.cjs.map +1 -1
  268. package/dist/report/built-in/machine.d.cts +0 -2
  269. package/dist/report/built-in/machine.d.mts +0 -2
  270. package/dist/report/built-in/machine.d.ts +0 -2
  271. package/dist/report/built-in/result-components.cjs +49 -51
  272. package/dist/report/built-in/result-components.cjs.map +1 -1
  273. package/dist/report/built-in/result-components.d.cts +16 -17
  274. package/dist/report/built-in/result-components.d.mts +16 -17
  275. package/dist/report/built-in/result-components.d.ts +16 -17
  276. package/dist/report/built-in/result-components.js +0 -4
  277. package/dist/report/built-in/run-membership-overview.cjs +126 -17
  278. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  279. package/dist/report/built-in/run-membership-overview.d.cts +14 -0
  280. package/dist/report/built-in/run-membership-overview.d.mts +14 -0
  281. package/dist/report/built-in/run-membership-overview.d.ts +14 -0
  282. package/dist/report/built-in/run-membership-overview.js +4 -2
  283. package/dist/report/built-in/standard.cjs +80 -45
  284. package/dist/report/built-in/standard.cjs.map +1 -1
  285. package/dist/report/built-in/standard.d.cts +19 -41
  286. package/dist/report/built-in/standard.d.mts +19 -41
  287. package/dist/report/built-in/standard.d.ts +19 -41
  288. package/dist/report/built-in/standard.js +6 -6
  289. package/dist/report/components/attempt-detail/compute.cjs +78 -2
  290. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  291. package/dist/report/components/attempt-detail/compute.d.cts +1 -1
  292. package/dist/report/components/attempt-detail/compute.d.mts +1 -1
  293. package/dist/report/components/attempt-detail/compute.d.ts +1 -1
  294. package/dist/report/components/attempt-detail/content.cjs +1 -1
  295. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  296. package/dist/report/components/entity-lists/compute.cjs +42 -5
  297. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  298. package/dist/report/components/entity-lists/compute.d.cts +10 -8
  299. package/dist/report/components/entity-lists/compute.d.mts +10 -8
  300. package/dist/report/components/entity-lists/compute.d.ts +10 -8
  301. package/dist/report/components/entity-lists/content.cjs +31 -6
  302. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  303. package/dist/report/components/entity-lists/index.cjs +9 -4
  304. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  305. package/dist/report/components/entity-lists/index.d.cts +4 -7
  306. package/dist/report/components/entity-lists/index.d.mts +4 -7
  307. package/dist/report/components/entity-lists/index.d.ts +4 -7
  308. package/dist/report/components/summaries/compute.cjs +8 -1
  309. package/dist/report/components/summaries/compute.cjs.map +1 -1
  310. package/dist/report/components/summaries/compute.d.cts +9 -1
  311. package/dist/report/components/summaries/compute.d.mts +9 -1
  312. package/dist/report/components/summaries/compute.d.ts +9 -1
  313. package/dist/report/components/summaries/index.cjs +48 -4
  314. package/dist/report/components/summaries/index.cjs.map +1 -1
  315. package/dist/report/components/summaries/index.d.cts +7 -4
  316. package/dist/report/components/summaries/index.d.mts +7 -4
  317. package/dist/report/components/summaries/index.d.ts +7 -4
  318. package/dist/report/definition/cell.cjs +3 -0
  319. package/dist/report/definition/cell.cjs.map +1 -1
  320. package/dist/report/definition/cell.d.cts +2 -0
  321. package/dist/report/definition/cell.d.mts +2 -0
  322. package/dist/report/definition/cell.d.ts +2 -0
  323. package/dist/report/definition/primitives/chart.cjs +8 -5
  324. package/dist/report/definition/primitives/chart.cjs.map +1 -1
  325. package/dist/report/definition/primitives/points-dataset.cjs +1 -0
  326. package/dist/report/definition/primitives/points-dataset.cjs.map +1 -1
  327. package/dist/report/definition/primitives.cjs +15 -2
  328. package/dist/report/definition/primitives.cjs.map +1 -1
  329. package/dist/report/definition/report.cjs +27 -3
  330. package/dist/report/definition/report.cjs.map +1 -1
  331. package/dist/report/definition/report.d.cts +8 -0
  332. package/dist/report/definition/report.d.mts +8 -0
  333. package/dist/report/definition/report.d.ts +8 -0
  334. package/dist/report/execution/machine.cjs +30 -14
  335. package/dist/report/execution/machine.cjs.map +1 -1
  336. package/dist/report/execution/machine.d.cts +20 -10
  337. package/dist/report/execution/machine.d.mts +20 -10
  338. package/dist/report/execution/machine.d.ts +20 -10
  339. package/dist/report/execution/machine.js +6 -6
  340. package/dist/report/host/execute.cjs +25 -16
  341. package/dist/report/host/execute.cjs.map +1 -1
  342. package/dist/report/host/execute.d.cts +4 -0
  343. package/dist/report/host/execute.d.mts +4 -0
  344. package/dist/report/host/execute.d.ts +4 -0
  345. package/dist/report/host/from-record.cjs +22 -5
  346. package/dist/report/host/from-record.cjs.map +1 -1
  347. package/dist/report/host/machine.cjs +53 -11
  348. package/dist/report/host/machine.cjs.map +1 -1
  349. package/dist/report/host/site-runtime.cjs +9 -8
  350. package/dist/report/host/site-runtime.cjs.map +1 -1
  351. package/dist/report/host/site-runtime.d.cts +1 -1
  352. package/dist/report/host/site-runtime.d.mts +1 -1
  353. package/dist/report/host/site-runtime.d.ts +1 -1
  354. package/dist/report/host/static.cjs +56 -9
  355. package/dist/report/host/static.cjs.map +1 -1
  356. package/dist/report/index.cjs.map +1 -1
  357. package/dist/report/index.d.cts +1 -1
  358. package/dist/report/index.d.mts +1 -1
  359. package/dist/report/index.d.ts +1 -1
  360. package/dist/report/model/dataset.cjs +7 -2
  361. package/dist/report/model/dataset.cjs.map +1 -1
  362. package/dist/report/model/locale.cjs +2 -0
  363. package/dist/report/model/locale.cjs.map +1 -1
  364. package/dist/report/model/locale.d.cts +1 -0
  365. package/dist/report/model/locale.d.mts +1 -0
  366. package/dist/report/model/locale.d.ts +1 -0
  367. package/dist/report/model/metrics.cjs +3 -1
  368. package/dist/report/model/metrics.cjs.map +1 -1
  369. package/dist/report/model/pricing.cjs +16 -11
  370. package/dist/report/model/pricing.cjs.map +1 -1
  371. package/dist/report/react/styles.css +53 -29
  372. package/dist/runner/adoption.cjs +1 -0
  373. package/dist/runner/adoption.cjs.map +1 -1
  374. package/dist/runner/attempt.cjs +44 -5
  375. package/dist/runner/attempt.cjs.map +1 -1
  376. package/dist/runner/attempt.d.cts +13 -1
  377. package/dist/runner/attempt.d.mts +13 -1
  378. package/dist/runner/attempt.d.ts +13 -1
  379. package/dist/runner/config-identity.cjs +10 -2
  380. package/dist/runner/config-identity.cjs.map +1 -1
  381. package/dist/runner/config-identity.d.cts +4 -2
  382. package/dist/runner/config-identity.d.mts +4 -2
  383. package/dist/runner/config-identity.d.ts +4 -2
  384. package/dist/runner/feedback/human.cjs +298 -59
  385. package/dist/runner/feedback/human.cjs.map +1 -1
  386. package/dist/runner/feedback/json.cjs +14 -6
  387. package/dist/runner/feedback/json.cjs.map +1 -1
  388. package/dist/runner/feedback/json.d.cts +3 -2
  389. package/dist/runner/feedback/json.d.mts +3 -2
  390. package/dist/runner/feedback/json.d.ts +3 -2
  391. package/dist/runner/feedback/reducer.cjs +2 -0
  392. package/dist/runner/feedback/reducer.cjs.map +1 -1
  393. package/dist/runner/judge-config.cjs +1 -1
  394. package/dist/runner/judge-config.cjs.map +1 -1
  395. package/dist/runner/ledger.cjs +124 -12
  396. package/dist/runner/ledger.cjs.map +1 -1
  397. package/dist/runner/project-current.cjs +13 -5
  398. package/dist/runner/project-current.cjs.map +1 -1
  399. package/dist/runner/run.cjs +564 -256
  400. package/dist/runner/run.cjs.map +1 -1
  401. package/dist/runner/sandbox-pool.cjs +161 -30
  402. package/dist/runner/sandbox-pool.cjs.map +1 -1
  403. package/dist/runner/sandbox-pool.d.cts +34 -2
  404. package/dist/runner/sandbox-pool.d.mts +34 -2
  405. package/dist/runner/sandbox-pool.d.ts +34 -2
  406. package/dist/runner/shared-state-lease.cjs +803 -0
  407. package/dist/runner/shared-state-lease.cjs.map +1 -0
  408. package/dist/runner/shared-state-lease.d.cts +121 -0
  409. package/dist/runner/shared-state-lease.d.mts +121 -0
  410. package/dist/runner/shared-state-lease.d.ts +121 -0
  411. package/dist/runner/shared-state-lease.js +24 -0
  412. package/dist/runner/shared-state-lease.js.map +1 -0
  413. package/dist/runner/teardown-registry.cjs +97 -34
  414. package/dist/runner/teardown-registry.cjs.map +1 -1
  415. package/dist/runner/teardown-registry.d.cts +27 -1
  416. package/dist/runner/teardown-registry.d.mts +27 -1
  417. package/dist/runner/teardown-registry.d.ts +27 -1
  418. package/dist/runner/teardown-registry.js +20 -16
  419. package/dist/runner/types.cjs.map +1 -1
  420. package/dist/runner/types.d.cts +31 -5
  421. package/dist/runner/types.d.mts +31 -5
  422. package/dist/runner/types.d.ts +31 -5
  423. package/dist/sample/analysis.cjs +249 -459
  424. package/dist/sample/analysis.cjs.map +1 -1
  425. package/dist/sample/capability.cjs +138 -7
  426. package/dist/sample/capability.cjs.map +1 -1
  427. package/dist/sample/capability.d.cts +3 -1
  428. package/dist/sample/capability.d.mts +3 -1
  429. package/dist/sample/capability.d.ts +3 -1
  430. package/dist/sample/capability.js +8 -6
  431. package/dist/sandbox/docker-agent-image.cjs +5 -1
  432. package/dist/sandbox/docker-agent-image.cjs.map +1 -1
  433. package/dist/sandbox/docker-agent-image.d.cts +2 -0
  434. package/dist/sandbox/docker-agent-image.d.mts +2 -0
  435. package/dist/sandbox/docker-agent-image.d.ts +2 -0
  436. package/dist/sandbox/docker-agent-image.js +14 -10
  437. package/dist/sandbox/docker-profile/schema.cjs +283 -534
  438. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  439. package/dist/sandbox/docker-profile/schema.d.cts +10 -27
  440. package/dist/sandbox/docker-profile/schema.d.mts +10 -27
  441. package/dist/sandbox/docker-profile/schema.d.ts +10 -27
  442. package/dist/sandbox/e2b-agent-template.cjs +5 -2
  443. package/dist/sandbox/e2b-agent-template.cjs.map +1 -1
  444. package/dist/sandbox/index.cjs +4 -2
  445. package/dist/sandbox/index.cjs.map +1 -1
  446. package/dist/sandbox/index.d.cts +1 -1
  447. package/dist/sandbox/index.d.mts +1 -1
  448. package/dist/sandbox/index.d.ts +1 -1
  449. package/dist/sandbox/index.js +120 -116
  450. package/dist/sandbox/index.mjs +120 -116
  451. package/dist/sandbox/keep-registry.cjs +28 -66
  452. package/dist/sandbox/keep-registry.cjs.map +1 -1
  453. package/dist/sandbox/types.cjs.map +1 -1
  454. package/dist/sandbox/types.d.cts +1 -1
  455. package/dist/sandbox/types.d.mts +1 -1
  456. package/dist/sandbox/types.d.ts +1 -1
  457. package/dist/shared/aggregate.cjs +16 -6
  458. package/dist/shared/aggregate.cjs.map +1 -1
  459. package/dist/shared/aggregate.d.cts +12 -4
  460. package/dist/shared/aggregate.d.mts +12 -4
  461. package/dist/shared/aggregate.d.ts +12 -4
  462. package/dist/shared/turn-label.cjs +20 -2
  463. package/dist/shared/turn-label.cjs.map +1 -1
  464. package/dist/shared/turn-label.d.cts +2 -0
  465. package/dist/shared/turn-label.d.mts +2 -0
  466. package/dist/shared/turn-label.d.ts +2 -0
  467. package/dist/shared/turn-label.js +4 -2
  468. package/dist/vendor/remark/remark-gfm.cjs +7 -7
  469. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  470. package/dist/vendor/remark/remark-parse.cjs +12 -12
  471. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  472. package/dist/vendor/remark/remark.cjs +13 -13
  473. package/dist/vendor/remark/remark.cjs.map +1 -1
  474. package/dist/view/server.cjs +6 -0
  475. package/dist/view/server.cjs.map +1 -1
  476. package/docs-site/images/hitl-handshake-zh.svg +3 -3
  477. package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
  478. package/docs-site/zh/examples/coding-agent-extensions.mdx +1 -1
  479. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +4 -3
  480. package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
  481. package/docs-site/zh/examples/integrations/codex-sdk.mdx +5 -5
  482. package/docs-site/zh/examples/integrations/langgraph.mdx +4 -4
  483. package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
  484. package/docs-site/zh/explanation/adapter.mdx +5 -5
  485. package/docs-site/zh/explanation/assert.mdx +7 -7
  486. package/docs-site/zh/explanation/drive.mdx +4 -2
  487. package/docs-site/zh/explanation/evals.mdx +10 -8
  488. package/docs-site/zh/explanation/experiment.mdx +2 -2
  489. package/docs-site/zh/explanation/hitl.mdx +9 -9
  490. package/docs-site/zh/explanation/judge.mdx +5 -5
  491. package/docs-site/zh/explanation/overview.mdx +3 -3
  492. package/docs-site/zh/explanation/runner.mdx +1 -1
  493. package/docs-site/zh/index.mdx +3 -3
  494. package/docs-site/zh/reference/builtin-agents.mdx +13 -13
  495. package/docs-site/zh/reference/capabilities.mdx +1 -1
  496. package/docs-site/zh/reference/cli.mdx +18 -12
  497. package/docs-site/zh/reference/define-agent.mdx +130 -5
  498. package/docs-site/zh/reference/define-config.mdx +2 -2
  499. package/docs-site/zh/reference/define-eval.mdx +4 -4
  500. package/docs-site/zh/reference/events.mdx +11 -11
  501. package/docs-site/zh/reference/official-adapters.mdx +6 -6
  502. package/docs-site/zh/reference/results-data.mdx +6 -0
  503. package/docs-site/zh/troubleshooting/debugging.mdx +1 -1
  504. package/docs-site/zh/troubleshooting/recover-after-kill.mdx +37 -5
  505. package/docs-site/zh/tutorials/accept-results.mdx +72 -0
  506. package/docs-site/zh/tutorials/agent-onboarding.mdx +6 -6
  507. package/docs-site/zh/tutorials/authoring.mdx +9 -13
  508. package/docs-site/zh/tutorials/ci-integration.mdx +6 -6
  509. package/docs-site/zh/tutorials/compare-runs.mdx +61 -0
  510. package/docs-site/zh/tutorials/concurrency.mdx +13 -12
  511. package/docs-site/zh/tutorials/configuration.mdx +4 -6
  512. package/docs-site/zh/tutorials/connect-your-agent.mdx +1 -1
  513. package/docs-site/zh/tutorials/control-run-cost.mdx +58 -0
  514. package/docs-site/zh/tutorials/criteria-files.mdx +2 -2
  515. package/docs-site/zh/tutorials/custom-reports.mdx +2 -2
  516. package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +46 -0
  517. package/docs-site/zh/tutorials/docker-in-docker.mdx +52 -43
  518. package/docs-site/zh/tutorials/eval-groups.mdx +6 -6
  519. package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
  520. package/docs-site/zh/tutorials/experiments.mdx +2 -3
  521. package/docs-site/zh/tutorials/handle-execution-failures.mdx +18 -10
  522. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +16 -8
  523. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +160 -0
  524. package/docs-site/zh/tutorials/plugins.mdx +14 -0
  525. package/docs-site/zh/tutorials/rerun-and-cache.mdx +4 -2
  526. package/docs-site/zh/tutorials/sandbox-agent.mdx +17 -11
  527. package/docs-site/zh/tutorials/sandbox-providers.mdx +17 -13
  528. package/docs-site/zh/tutorials/sandbox-reuse.mdx +12 -19
  529. package/docs-site/zh/tutorials/select-and-preview.mdx +65 -0
  530. package/docs-site/zh/tutorials/verify-judge.mdx +78 -0
  531. package/docs-site/zh/tutorials/viewing-results.mdx +38 -1
  532. package/docs-site/zh/tutorials/write-experiment.mdx +7 -5
  533. package/docs-site/zh/tutorials/write-send.mdx +9 -8
  534. package/package.json +9 -5
  535. package/dist/report/built-in/overview.cjs +0 -44
  536. package/dist/report/built-in/overview.cjs.map +0 -1
  537. package/dist/report/built-in/overview.d.cts +0 -6
  538. package/dist/report/built-in/overview.d.mts +0 -6
  539. package/dist/report/built-in/overview.d.ts +0 -6
  540. package/dist/report/built-in/overview.js +0 -9
  541. package/dist/report/built-in/overview.js.map +0 -1
  542. package/dist/runner/gate-lease.cjs +0 -283
  543. package/dist/runner/gate-lease.cjs.map +0 -1
  544. package/dist/runner/gate-lease.d.cts +0 -62
  545. package/dist/runner/gate-lease.d.mts +0 -62
  546. package/dist/runner/gate-lease.d.ts +0 -62
  547. package/dist/runner/gate-lease.js +0 -22
  548. package/dist/runner/gate-lease.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["node.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readdir, readFile, unlink, type FileHandle } from \"node:fs/promises\";\nimport { hostname } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { Effect, Layer } from \"effect\";\nimport type { RecordId } from \"../../record/model/identifiers.ts\";\nimport { RecordIoError, RecordMaintenanceBusy, RecordPathAlreadyExists, RecordPermissionError, RecordRootInvalid, type RecordFileSystemError, type RecordPlatformOperation, } from \"../../record/platform/errors.ts\";\nimport type { RecordRoot } from \"../../record/platform/root.ts\";\nimport { recordCoordinationIdentity } from \"../identity.ts\";\nimport { RecordCoordination, issueRecordLease, recordCoordinationIdentityMismatch, type RecordCoordinationError, type RecordCoordinationService, type RecordLease, type RecordLeaseKind, } from \"../record-leases.ts\";\ninterface LeaseLayout {\n readonly localStateRoot: string;\n readonly recordKey: string;\n readonly readDirectory: string;\n readonly appendDirectory: string;\n readonly maintenanceFile: string;\n readonly identityFile: string;\n}\ninterface IdentityFile {\n readonly version: 1;\n readonly recordKey: string;\n readonly recordId: string;\n}\nconst textEncoder = new TextEncoder();\nconst leases = new WeakMap<RecordLease, string>();\nfunction errorCode(cause: unknown): string | undefined {\n return typeof cause === \"object\" && cause !== null && \"code\" in cause &&\n typeof cause.code === \"string\"\n ? cause.code\n : undefined;\n}\nfunction isMissing(cause: unknown): boolean {\n return errorCode(cause) === \"ENOENT\";\n}\nfunction isAlreadyExists(cause: unknown): boolean {\n return errorCode(cause) === \"EEXIST\";\n}\nfunction fileSystemError(operation: RecordPlatformOperation, path: string, cause: unknown): RecordIoError | RecordPermissionError {\n return errorCode(cause) === \"EACCES\" || errorCode(cause) === \"EPERM\"\n ? new RecordPermissionError({\n code: \"record-permission-denied\",\n operation,\n path,\n cause,\n })\n : new RecordIoError({\n code: \"record-io-error\",\n operation,\n path,\n cause,\n });\n}\nfunction nodeIo<A>(input: {\n readonly operation: RecordPlatformOperation;\n readonly path: string;\n readonly run: () => Promise<A>;\n}): Effect.Effect<A, RecordIoError | RecordPermissionError> {\n return Effect.tryPromise({\n try: input.run,\n catch: (cause) => fileSystemError(input.operation, input.path, cause),\n });\n}\nfunction layoutFor(root: unknown): Effect.Effect<LeaseLayout, RecordRootInvalid> {\n const identity = recordCoordinationIdentity(root);\n return identity === undefined\n ? Effect.fail(new RecordRootInvalid({ code: \"record-root-invalid\" }))\n : Effect.succeed(Object.freeze({\n localStateRoot: identity.localStateRoot,\n recordKey: identity.recordKey,\n readDirectory: join(identity.localStateRoot, \"leases\", \"read\"),\n appendDirectory: join(identity.localStateRoot, \"leases\", \"append\"),\n maintenanceFile: join(identity.localStateRoot, \"leases\", \"maintenance.lock\"),\n identityFile: join(identity.localStateRoot, \"identity.json\"),\n }));\n}\nfunction ensureDirectory(path: string): Effect.Effect<void, RecordFileSystemError> {\n return nodeIo({\n operation: \"create-directory\",\n path,\n run: () => mkdir(path, { recursive: true }),\n });\n}\nfunction closeHandle(handle: FileHandle, operation: RecordPlatformOperation, path: string): Effect.Effect<void> {\n return nodeIo({ operation, path, run: () => handle.close() }).pipe(Effect.orDie);\n}\nfunction syncDirectory(path: string): Effect.Effect<void, RecordFileSystemError> {\n return Effect.scoped(Effect.acquireRelease(nodeIo({ operation: \"sync-directory\", path, run: () => open(path, \"r\") }), (handle) => closeHandle(handle, \"sync-directory\", path)).pipe(Effect.flatMap((handle) => nodeIo({ operation: \"sync-directory\", path, run: () => handle.sync() }))));\n}\nfunction writeExclusiveFile(path: string, bytes: Uint8Array): Effect.Effect<void, RecordFileSystemError> {\n const parent = dirname(path);\n const acquire = Effect.tryPromise({\n try: () => open(path, \"wx\", 0o600),\n catch: (cause) => isAlreadyExists(cause)\n ? new RecordPathAlreadyExists({\n code: \"record-path-already-exists\",\n path,\n })\n : fileSystemError(\"write-file\", path, cause),\n });\n return Effect.gen(function* () {\n yield* ensureDirectory(parent);\n yield* Effect.scoped(Effect.acquireRelease(acquire, (handle) => closeHandle(handle, \"write-file\", path)).pipe(Effect.flatMap((handle) => nodeIo({ operation: \"write-file\", path, run: () => handle.writeFile(bytes) }).pipe(Effect.zipRight(nodeIo({ operation: \"sync-file\", path, run: () => handle.sync() }))))));\n yield* syncDirectory(parent);\n });\n}\nfunction removeFileIfPresent(path: string): Effect.Effect<void, RecordFileSystemError> {\n return nodeIo({ operation: \"release-record-lease\", path, run: () => unlink(path) }).pipe(Effect.catchAll((error) => isMissing(error.cause) ? Effect.void : Effect.fail(error)), Effect.zipRight(syncDirectory(dirname(path))));\n}\nfunction pathPresent(path: string): Effect.Effect<boolean, RecordFileSystemError> {\n return nodeIo({ operation: \"read-file\", path, run: async () => {\n try {\n await readFile(path);\n return true;\n }\n catch (cause) {\n if (isMissing(cause))\n return false;\n throw cause;\n }\n } });\n}\nfunction leasePayload(kind: RecordLeaseKind): Uint8Array {\n return textEncoder.encode(JSON.stringify({\n version: 1,\n kind,\n host: hostname(),\n pid: process.pid,\n nonce: randomUUID(),\n }));\n}\nfunction makeLease(kind: RecordLeaseKind, path: string): RecordLease {\n const lease = issueRecordLease(kind);\n leases.set(lease, path);\n return lease;\n}\nfunction sharedDirectory(layout: LeaseLayout, kind: \"read\" | \"append\"): string {\n return kind === \"read\" ? layout.readDirectory : layout.appendDirectory;\n}\nfunction sharedEntriesPresent(layout: LeaseLayout): Effect.Effect<boolean, RecordFileSystemError> {\n const directories = [layout.readDirectory, layout.appendDirectory] as const;\n return Effect.forEach(directories, (directory) => ensureDirectory(directory).pipe(Effect.zipRight(nodeIo({\n operation: \"list-directory\",\n path: directory,\n run: () => readdir(directory),\n }))), { concurrency: 1 }).pipe(Effect.map((entries) => entries.some((items) => items.length > 0)));\n}\nfunction maintenanceBusy(requested: \"shared\" | \"exclusive\"): RecordMaintenanceBusy {\n return new RecordMaintenanceBusy({ code: \"record-maintenance-busy\", requested });\n}\nfunction enterSharedLease(root: RecordRoot, kind: \"read\" | \"append\"): Effect.Effect<RecordLease, RecordCoordinationError> {\n return Effect.gen(function* () {\n const layout = yield* layoutFor(root);\n const directory = sharedDirectory(layout, kind);\n yield* ensureDirectory(directory);\n if (yield* pathPresent(layout.maintenanceFile)) {\n return yield* Effect.fail(maintenanceBusy(\"shared\"));\n }\n const path = join(directory, `${process.pid}-${randomUUID()}.lease`);\n const created = yield* writeExclusiveFile(path, leasePayload(kind)).pipe(Effect.matchEffect({\n onFailure: (error) => error instanceof RecordPathAlreadyExists\n ? Effect.succeed(false)\n : Effect.fail(error),\n onSuccess: () => Effect.succeed(true),\n }));\n if (!created) {\n return yield* Effect.fail(maintenanceBusy(\"shared\"));\n }\n if (yield* pathPresent(layout.maintenanceFile)) {\n yield* removeFileIfPresent(path);\n return yield* Effect.fail(maintenanceBusy(\"shared\"));\n }\n return makeLease(kind, path);\n });\n}\nfunction enterMaintenanceLease(root: RecordRoot): Effect.Effect<RecordLease, RecordCoordinationError> {\n return Effect.gen(function* () {\n const layout = yield* layoutFor(root);\n yield* ensureDirectory(dirname(layout.maintenanceFile));\n const created = yield* writeExclusiveFile(layout.maintenanceFile, leasePayload(\"maintenance\")).pipe(Effect.matchEffect({\n onFailure: (error) => error instanceof RecordPathAlreadyExists\n ? Effect.succeed(false)\n : Effect.fail(error),\n onSuccess: () => Effect.succeed(true),\n }));\n if (!created) {\n return yield* Effect.fail(maintenanceBusy(\"exclusive\"));\n }\n if (yield* sharedEntriesPresent(layout)) {\n yield* removeFileIfPresent(layout.maintenanceFile);\n return yield* Effect.fail(maintenanceBusy(\"exclusive\"));\n }\n return makeLease(\"maintenance\", layout.maintenanceFile);\n });\n}\nfunction release(lease: RecordLease): Effect.Effect<void> {\n const path = leases.get(lease);\n return path === undefined\n ? Effect.die(\"Record coordination lease was not issued by this platform\")\n : removeFileIfPresent(path).pipe(Effect.orDie);\n}\nfunction readIdentity(path: string): Effect.Effect<IdentityFile | undefined, RecordFileSystemError> {\n return nodeIo({ operation: \"read-file\", path, run: () => readFile(path, \"utf8\") }).pipe(Effect.map((text) => {\n try {\n const value: unknown = JSON.parse(text);\n if (typeof value !== \"object\" || value === null || Array.isArray(value) ||\n Reflect.get(value, \"version\") !== 1 ||\n typeof Reflect.get(value, \"recordKey\") !== \"string\" ||\n typeof Reflect.get(value, \"recordId\") !== \"string\") {\n return undefined;\n }\n return Object.freeze({\n version: 1 as const,\n recordKey: Reflect.get(value, \"recordKey\") as string,\n recordId: Reflect.get(value, \"recordId\") as string,\n });\n }\n catch {\n return undefined;\n }\n }), Effect.catchAll((error) => isMissing(error.cause) ? Effect.succeed(undefined) : Effect.fail(error)));\n}\nfunction identityBytes(input: IdentityFile): Uint8Array {\n return textEncoder.encode(JSON.stringify(input));\n}\nfunction identityMatches(identity: IdentityFile | undefined, layout: LeaseLayout, recordId: RecordId): boolean {\n return identity !== undefined &&\n identity.recordKey === layout.recordKey &&\n identity.recordId === recordId;\n}\nfunction verifyIdentity(input: {\n readonly root: RecordRoot;\n readonly recordId: RecordId;\n}): Effect.Effect<void, RecordCoordinationError> {\n return Effect.gen(function* () {\n const layout = yield* layoutFor(input.root);\n yield* ensureDirectory(layout.localStateRoot);\n const existing = yield* readIdentity(layout.identityFile);\n if (existing !== undefined) {\n return identityMatches(existing, layout, input.recordId)\n ? undefined\n : yield* Effect.fail(recordCoordinationIdentityMismatch());\n }\n const expected: IdentityFile = {\n version: 1,\n recordKey: layout.recordKey,\n recordId: input.recordId,\n };\n const created = yield* writeExclusiveFile(layout.identityFile, identityBytes(expected)).pipe(Effect.matchEffect({\n onFailure: (error) => error instanceof RecordPathAlreadyExists\n ? Effect.succeed(false)\n : Effect.fail(error),\n onSuccess: () => Effect.succeed(true),\n }));\n if (created) {\n return;\n }\n const raced = yield* readIdentity(layout.identityFile);\n if (!identityMatches(raced, layout, input.recordId)) {\n return yield* Effect.fail(recordCoordinationIdentityMismatch());\n }\n });\n}\nconst nodeRecordCoordination: RecordCoordinationService = {\n enterRecordRead: (root) => Effect.acquireRelease(enterSharedLease(root, \"read\"), (lease) => release(lease)),\n enterRecordAppend: (root) => Effect.acquireRelease(enterSharedLease(root, \"append\"), (lease) => release(lease)),\n enterRecordMaintenance: (root) => Effect.acquireRelease(enterMaintenanceLease(root), (lease) => release(lease)),\n verifyRecordIdentity: verifyIdentity,\n};\nexport const NodeRecordCoordinationLive = Layer.succeed(RecordCoordination, nodeRecordCoordination);\n"]}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["node.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { lstat, mkdir, open, readdir, readFile, unlink, type FileHandle } from \"node:fs/promises\";\nimport { hostname } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { Effect, Layer } from \"effect\";\nimport type { RecordId } from \"../../record/model/identifiers.ts\";\nimport { RecordIoError, RecordMaintenanceBusy, RecordPathAlreadyExists, RecordPermissionError, RecordRootInvalid, type RecordFileSystemError, type RecordPlatformOperation, } from \"../../record/platform/errors.ts\";\nimport type { RecordRoot } from \"../../record/platform/root.ts\";\nimport { recordCoordinationIdentity } from \"../identity.ts\";\nimport { RecordCoordination, issueRecordLease, recordCoordinationIdentityMismatch, type RecordCoordinationError, type RecordCoordinationService, type RecordLease, type RecordLeaseKind, } from \"../record-leases.ts\";\ninterface LeaseLayout {\n readonly localStateRoot: string;\n readonly recordKey: string;\n readonly readDirectory: string;\n readonly appendDirectory: string;\n readonly maintenanceFile: string;\n readonly identityFile: string;\n}\ninterface IdentityFile {\n readonly version: 1;\n readonly recordKey: string;\n readonly recordId: string;\n}\nconst textEncoder = new TextEncoder();\nconst leases = new WeakMap<RecordLease, string>();\nconst MAXIMUM_LEASE_PAYLOAD_BYTES = 4096;\ninterface LeasePayload {\n readonly version: 1;\n readonly kind: RecordLeaseKind;\n readonly host: string;\n readonly pid: number;\n readonly nonce: string;\n}\nfunction errorCode(cause: unknown): string | undefined {\n return typeof cause === \"object\" && cause !== null && \"code\" in cause &&\n typeof cause.code === \"string\"\n ? cause.code\n : undefined;\n}\nfunction isMissing(cause: unknown): boolean {\n return errorCode(cause) === \"ENOENT\";\n}\nfunction isAlreadyExists(cause: unknown): boolean {\n return errorCode(cause) === \"EEXIST\";\n}\nfunction fileSystemError(operation: RecordPlatformOperation, path: string, cause: unknown): RecordIoError | RecordPermissionError {\n return errorCode(cause) === \"EACCES\" || errorCode(cause) === \"EPERM\"\n ? new RecordPermissionError({\n code: \"record-permission-denied\",\n operation,\n path,\n cause,\n })\n : new RecordIoError({\n code: \"record-io-error\",\n operation,\n path,\n cause,\n });\n}\nfunction nodeIo<A>(input: {\n readonly operation: RecordPlatformOperation;\n readonly path: string;\n readonly run: () => Promise<A>;\n}): Effect.Effect<A, RecordIoError | RecordPermissionError> {\n return Effect.tryPromise({\n try: input.run,\n catch: (cause) => fileSystemError(input.operation, input.path, cause),\n });\n}\nfunction layoutFor(root: unknown): Effect.Effect<LeaseLayout, RecordRootInvalid> {\n const identity = recordCoordinationIdentity(root);\n return identity === undefined\n ? Effect.fail(new RecordRootInvalid({ code: \"record-root-invalid\" }))\n : Effect.succeed(Object.freeze({\n localStateRoot: identity.localStateRoot,\n recordKey: identity.recordKey,\n readDirectory: join(identity.localStateRoot, \"leases\", \"read\"),\n appendDirectory: join(identity.localStateRoot, \"leases\", \"append\"),\n maintenanceFile: join(identity.localStateRoot, \"leases\", \"maintenance.lock\"),\n identityFile: join(identity.localStateRoot, \"identity.json\"),\n }));\n}\nfunction ensureDirectory(path: string): Effect.Effect<void, RecordFileSystemError> {\n return nodeIo({\n operation: \"create-directory\",\n path,\n run: () => mkdir(path, { recursive: true }),\n });\n}\nfunction closeHandle(handle: FileHandle, operation: RecordPlatformOperation, path: string): Effect.Effect<void> {\n return nodeIo({ operation, path, run: () => handle.close() }).pipe(Effect.orDie);\n}\nfunction syncDirectory(path: string): Effect.Effect<void, RecordFileSystemError> {\n return Effect.scoped(Effect.acquireRelease(nodeIo({ operation: \"sync-directory\", path, run: () => open(path, \"r\") }), (handle) => closeHandle(handle, \"sync-directory\", path)).pipe(Effect.flatMap((handle) => nodeIo({ operation: \"sync-directory\", path, run: () => handle.sync() }))));\n}\nfunction writeExclusiveFile(path: string, bytes: Uint8Array): Effect.Effect<void, RecordFileSystemError> {\n const parent = dirname(path);\n const acquire = Effect.tryPromise({\n try: () => open(path, \"wx\", 0o600),\n catch: (cause) => isAlreadyExists(cause)\n ? new RecordPathAlreadyExists({\n code: \"record-path-already-exists\",\n path,\n })\n : fileSystemError(\"write-file\", path, cause),\n });\n return Effect.gen(function* () {\n yield* ensureDirectory(parent);\n yield* Effect.scoped(Effect.acquireRelease(acquire, (handle) => closeHandle(handle, \"write-file\", path)).pipe(Effect.flatMap((handle) => nodeIo({ operation: \"write-file\", path, run: () => handle.writeFile(bytes) }).pipe(Effect.zipRight(nodeIo({ operation: \"sync-file\", path, run: () => handle.sync() }))))));\n yield* syncDirectory(parent);\n });\n}\nfunction removeFileIfPresent(path: string): Effect.Effect<void, RecordFileSystemError> {\n return nodeIo({ operation: \"release-record-lease\", path, run: () => unlink(path) }).pipe(Effect.catchAll((error) => isMissing(error.cause) ? Effect.void : Effect.fail(error)), Effect.zipRight(syncDirectory(dirname(path))));\n}\nfunction pathPresent(path: string): Effect.Effect<boolean, RecordFileSystemError> {\n return nodeIo({ operation: \"read-file\", path, run: async () => {\n try {\n await readFile(path);\n return true;\n }\n catch (cause) {\n if (isMissing(cause))\n return false;\n throw cause;\n }\n } });\n}\nfunction leasePayload(kind: RecordLeaseKind): Uint8Array {\n return textEncoder.encode(JSON.stringify({\n version: 1,\n kind,\n host: hostname(),\n pid: process.pid,\n nonce: randomUUID(),\n }));\n}\nfunction decodeLeasePayload(value: unknown): LeasePayload | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n return undefined;\n if (Object.keys(value).length !== 5 ||\n Reflect.get(value, \"version\") !== 1 ||\n (Reflect.get(value, \"kind\") !== \"read\" &&\n Reflect.get(value, \"kind\") !== \"append\" &&\n Reflect.get(value, \"kind\") !== \"maintenance\") ||\n typeof Reflect.get(value, \"host\") !== \"string\" ||\n typeof Reflect.get(value, \"pid\") !== \"number\" ||\n !Number.isSafeInteger(Reflect.get(value, \"pid\")) ||\n Reflect.get(value, \"pid\") <= 0 ||\n typeof Reflect.get(value, \"nonce\") !== \"string\" ||\n Reflect.get(value, \"nonce\").length === 0)\n return undefined;\n return value as LeasePayload;\n}\n/** Only ESRCH proves that a same-host lease owner no longer exists. */\nfunction ownerIsKnownDead(payload: LeasePayload): boolean {\n if (payload.host !== hostname())\n return false;\n try {\n process.kill(payload.pid, 0);\n return false;\n }\n catch (cause) {\n return errorCode(cause) === \"ESRCH\";\n }\n}\nfunction sharedLeaseIsKnownStale(path: string, expectedKind: \"read\" | \"append\"): Effect.Effect<boolean, RecordFileSystemError> {\n return Effect.gen(function* () {\n const metadata = yield* nodeIo({\n operation: \"read-file\",\n path,\n run: () => lstat(path),\n }).pipe(Effect.catchAll((error) => isMissing(error.cause) ? Effect.succeed(undefined) : Effect.fail(error)));\n if (metadata === undefined)\n return true;\n if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > MAXIMUM_LEASE_PAYLOAD_BYTES) {\n return false;\n }\n const bytes = yield* nodeIo({\n operation: \"read-file\",\n path,\n run: () => readFile(path),\n }).pipe(Effect.catchAll((error) => isMissing(error.cause) ? Effect.succeed(undefined) : Effect.fail(error)));\n if (bytes === undefined)\n return true;\n let value: unknown;\n try {\n value = JSON.parse(bytes.toString(\"utf8\"));\n }\n catch {\n return false;\n }\n const payload = decodeLeasePayload(value);\n return payload !== undefined && payload.kind === expectedKind && ownerIsKnownDead(payload);\n });\n}\nfunction makeLease(kind: RecordLeaseKind, path: string): RecordLease {\n const lease = issueRecordLease(kind);\n leases.set(lease, path);\n return lease;\n}\nfunction sharedDirectory(layout: LeaseLayout, kind: \"read\" | \"append\"): string {\n return kind === \"read\" ? layout.readDirectory : layout.appendDirectory;\n}\nfunction liveSharedEntriesPresent(layout: LeaseLayout): Effect.Effect<boolean, RecordFileSystemError> {\n const directories = [\n { path: layout.readDirectory, kind: \"read\" as const },\n { path: layout.appendDirectory, kind: \"append\" as const },\n ] as const;\n return Effect.gen(function* () {\n let occupied = false;\n for (const directory of directories) {\n yield* ensureDirectory(directory.path);\n const entries = yield* nodeIo({\n operation: \"list-directory\",\n path: directory.path,\n run: () => readdir(directory.path),\n });\n for (const entry of entries) {\n const path = join(directory.path, entry);\n if (yield* sharedLeaseIsKnownStale(path, directory.kind)) {\n yield* removeFileIfPresent(path);\n }\n else {\n occupied = true;\n }\n }\n }\n return occupied;\n });\n}\nfunction maintenanceBusy(requested: \"shared\" | \"exclusive\"): RecordMaintenanceBusy {\n return new RecordMaintenanceBusy({ code: \"record-maintenance-busy\", requested });\n}\nfunction enterSharedLease(root: RecordRoot, kind: \"read\" | \"append\"): Effect.Effect<RecordLease, RecordCoordinationError> {\n return Effect.gen(function* () {\n const layout = yield* layoutFor(root);\n const directory = sharedDirectory(layout, kind);\n yield* ensureDirectory(directory);\n if (yield* pathPresent(layout.maintenanceFile)) {\n return yield* Effect.fail(maintenanceBusy(\"shared\"));\n }\n const path = join(directory, `${process.pid}-${randomUUID()}.lease`);\n const created = yield* writeExclusiveFile(path, leasePayload(kind)).pipe(Effect.matchEffect({\n onFailure: (error) => error instanceof RecordPathAlreadyExists\n ? Effect.succeed(false)\n : Effect.fail(error),\n onSuccess: () => Effect.succeed(true),\n }));\n if (!created) {\n return yield* Effect.fail(maintenanceBusy(\"shared\"));\n }\n const maintenancePresent = yield* pathPresent(layout.maintenanceFile).pipe(Effect.tapError(() => removeFileIfPresent(path).pipe(Effect.orDie)));\n if (maintenancePresent) {\n yield* removeFileIfPresent(path);\n return yield* Effect.fail(maintenanceBusy(\"shared\"));\n }\n return makeLease(kind, path);\n });\n}\nfunction enterMaintenanceLease(root: RecordRoot): Effect.Effect<RecordLease, RecordCoordinationError> {\n return Effect.gen(function* () {\n const layout = yield* layoutFor(root);\n yield* ensureDirectory(dirname(layout.maintenanceFile));\n const created = yield* writeExclusiveFile(layout.maintenanceFile, leasePayload(\"maintenance\")).pipe(Effect.matchEffect({\n onFailure: (error) => error instanceof RecordPathAlreadyExists\n ? Effect.succeed(false)\n : Effect.fail(error),\n onSuccess: () => Effect.succeed(true),\n }));\n if (!created) {\n return yield* Effect.fail(maintenanceBusy(\"exclusive\"));\n }\n const sharedPresent = yield* liveSharedEntriesPresent(layout).pipe(Effect.tapError(() => removeFileIfPresent(layout.maintenanceFile).pipe(Effect.orDie)));\n if (sharedPresent) {\n yield* removeFileIfPresent(layout.maintenanceFile);\n return yield* Effect.fail(maintenanceBusy(\"exclusive\"));\n }\n return makeLease(\"maintenance\", layout.maintenanceFile);\n });\n}\nfunction release(lease: RecordLease): Effect.Effect<void> {\n const path = leases.get(lease);\n return path === undefined\n ? Effect.die(\"Record coordination lease was not issued by this platform\")\n : removeFileIfPresent(path).pipe(Effect.orDie);\n}\nfunction readIdentity(path: string): Effect.Effect<IdentityFile | undefined, RecordFileSystemError> {\n return nodeIo({ operation: \"read-file\", path, run: () => readFile(path, \"utf8\") }).pipe(Effect.map((text) => {\n try {\n const value: unknown = JSON.parse(text);\n if (typeof value !== \"object\" || value === null || Array.isArray(value) ||\n Reflect.get(value, \"version\") !== 1 ||\n typeof Reflect.get(value, \"recordKey\") !== \"string\" ||\n typeof Reflect.get(value, \"recordId\") !== \"string\") {\n return undefined;\n }\n return Object.freeze({\n version: 1 as const,\n recordKey: Reflect.get(value, \"recordKey\") as string,\n recordId: Reflect.get(value, \"recordId\") as string,\n });\n }\n catch {\n return undefined;\n }\n }), Effect.catchAll((error) => isMissing(error.cause) ? Effect.succeed(undefined) : Effect.fail(error)));\n}\nfunction identityBytes(input: IdentityFile): Uint8Array {\n return textEncoder.encode(JSON.stringify(input));\n}\nfunction identityMatches(identity: IdentityFile | undefined, layout: LeaseLayout, recordId: RecordId): boolean {\n return identity !== undefined &&\n identity.recordKey === layout.recordKey &&\n identity.recordId === recordId;\n}\nfunction verifyIdentity(input: {\n readonly root: RecordRoot;\n readonly recordId: RecordId;\n}): Effect.Effect<void, RecordCoordinationError> {\n return Effect.gen(function* () {\n const layout = yield* layoutFor(input.root);\n yield* ensureDirectory(layout.localStateRoot);\n const existing = yield* readIdentity(layout.identityFile);\n if (existing !== undefined) {\n return identityMatches(existing, layout, input.recordId)\n ? undefined\n : yield* Effect.fail(recordCoordinationIdentityMismatch());\n }\n const expected: IdentityFile = {\n version: 1,\n recordKey: layout.recordKey,\n recordId: input.recordId,\n };\n const created = yield* writeExclusiveFile(layout.identityFile, identityBytes(expected)).pipe(Effect.matchEffect({\n onFailure: (error) => error instanceof RecordPathAlreadyExists\n ? Effect.succeed(false)\n : Effect.fail(error),\n onSuccess: () => Effect.succeed(true),\n }));\n if (created) {\n return;\n }\n const raced = yield* readIdentity(layout.identityFile);\n if (!identityMatches(raced, layout, input.recordId)) {\n return yield* Effect.fail(recordCoordinationIdentityMismatch());\n }\n });\n}\nconst nodeRecordCoordination: RecordCoordinationService = {\n enterRecordRead: (root) => Effect.acquireRelease(enterSharedLease(root, \"read\"), (lease) => release(lease)),\n enterRecordAppend: (root) => Effect.acquireRelease(enterSharedLease(root, \"append\"), (lease) => release(lease)),\n enterRecordMaintenance: (root) => Effect.acquireRelease(enterMaintenanceLease(root), (lease) => release(lease)),\n verifyRecordIdentity: verifyIdentity,\n};\nexport const NodeRecordCoordinationLive = Layer.succeed(RecordCoordination, nodeRecordCoordination);\n"]}
package/dist/define.cjs CHANGED
@@ -137,6 +137,12 @@ function defineExperiment(def) {
137
137
  if (def.setup !== undefined && typeof def.setup !== "function") {
138
138
  throw new Error((0, index_ts_1.t)("define.experimentSetupNotFunction"));
139
139
  }
140
+ // teardown 与 setup 是同一个 Experiment lifecycle 边界。非函数值绝不能
141
+ // 伪装成已声明的 cleanup,否则 explicit sharedState recovery 可能在没有
142
+ // 执行补偿的情况下释放 immutable owner generation。
143
+ if (def.teardown !== undefined && typeof def.teardown !== "function") {
144
+ throw new Error((0, index_ts_1.t)("define.experimentTeardownNotFunction"));
145
+ }
140
146
  // classifyFailure 是失败分类链上的实验通道(见 runner/types.ts 的 ExperimentDef.classifyFailure):
141
147
  // 传成非函数在解析时就报,不等到某条 attempt 撞死才发现这一路声明白写。
142
148
  if (def.classifyFailure !== undefined && typeof def.classifyFailure !== "function") {
@@ -151,7 +157,8 @@ function defineExperiment(def) {
151
157
  throw new Error((0, index_ts_1.t)("define.experimentLabelInvalid", { key }));
152
158
  }
153
159
  }
154
- const { id: _derivedId, ...author } = def;
160
+ const sharedState = normalizeSharedState(def.sharedState);
161
+ const { id: _derivedId, sharedState: _sharedState, ...author } = def;
155
162
  return (0, types_ts_1.brandExperimentDefinition)({
156
163
  ...author,
157
164
  flags: decodeJsonRecord(def.flags ?? {}, "defineExperiment flags"),
@@ -160,9 +167,26 @@ function defineExperiment(def) {
160
167
  earlyExit: def.earlyExit ?? false,
161
168
  evals: Array.isArray(def.evals) ? Object.freeze([...def.evals]) : (def.evals ?? "*"),
162
169
  sandboxReuse: def.sandboxReuse === true,
170
+ ...(sharedState === undefined ? {} : { sharedState }),
163
171
  plugins: normalizePlugins(def.plugins ?? [], "defineExperiment plugins", "experiment"),
164
172
  });
165
173
  }
174
+ const SharedStateKeyPattern = /^[a-z0-9][a-z0-9._/-]{0,127}$/u;
175
+ function normalizeSharedState(value) {
176
+ if (value === undefined)
177
+ return undefined;
178
+ const candidate = value;
179
+ if (typeof value !== "object" ||
180
+ value === null ||
181
+ Array.isArray(value) ||
182
+ !Object.hasOwn(value, "key") ||
183
+ Object.keys(value).length !== 1 ||
184
+ typeof candidate.key !== "string" ||
185
+ !SharedStateKeyPattern.test(candidate.key)) {
186
+ throw new TypeError((0, index_ts_1.t)("define.experimentSharedStateInvalid"));
187
+ }
188
+ return Object.freeze({ key: candidate.key });
189
+ }
166
190
  function normalizeEvalFields(def) {
167
191
  return {
168
192
  ...(def.description !== undefined ? { description: def.description } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"define.js","sourceRoot":"","sources":["define.ts"],"names":[],"mappings":"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","sourcesContent":["// 定义入口:把用户对象规格化成核心认得的形状。路径即身份 —— 这里禁止手写 id,\n// 由发现阶段从文件路径推导(见 runner/discover.ts)。\nimport type { DirectAgent, DirectAgentDef, Config, EvalInput, EvalGroupDefinition, EvalGroupInput, EvalDefinition, EvalDefinitionFields, ExperimentDefinition, ExperimentInput, SandboxAgent, SandboxAgentDef, ScoreEvalInput, ScoreTestContext, TestContext, JsonValue, } from \"./types.ts\";\nimport { brandEvalDefinition, brandEvalGroupDefinition, brandExperimentDefinition, isEvalDefinition, } from \"./types.ts\";\nimport { t } from \"./i18n/index.ts\";\nimport { customProviderSandbox, isSandboxLayer, type CustomProviderSandboxOptions, type SandboxLayer, } from \"./sandbox/layer.ts\";\nimport { Either, Schema } from \"effect\";\nimport { assertEvidenceCoverage } from \"./assertions/coverage.ts\";\nimport { isPluginInstance, pluginInstanceDataOf, type PluginInstance, type PluginOwner } from \"./plugin/contracts.ts\";\n// 发现期必须区分 defineScoreEval 的真正产物与运行时手写 `{ evaluationKind: \"score\" }` 的裸对象。\n// WeakSet 是模块私有来源证明;Definition 本身另有 types.ts 的私有 symbol 品牌供类型层使用。\nconst definedScoreEvals = new WeakSet<object>();\n/** Define a closed set of real Eval definitions sharing one physical Sandbox. */\nexport function defineEvalGroup<const Sandbox extends SandboxLayer | undefined>(input: EvalGroupInput<Sandbox>): EvalGroupDefinition {\n if (!Array.isArray(input.evals) || input.evals.length === 0) {\n throw new TypeError(\"defineEvalGroup evals must be a non-empty array of defineEval()/defineScoreEval() definitions.\");\n }\n input.evals.forEach((member, index) => {\n if (!isEvalDefinition(member)) {\n throw new TypeError(`defineEvalGroup evals[${index}] must be the object returned by defineEval() or defineScoreEval().`);\n }\n });\n assertSandboxLayer(input.sandbox, \"defineEvalGroup\");\n if (input.onUnavailable !== \"stop-group\" && input.onUnavailable !== \"replace-sandbox\") {\n throw new TypeError(\"defineEvalGroup onUnavailable must be \\\"stop-group\\\" or \\\"replace-sandbox\\\".\");\n }\n const [first, ...rest] = input.evals;\n return brandEvalGroupDefinition({\n evals: Object.freeze([first, ...rest]),\n onUnavailable: input.onUnavailable,\n ...(input.sandbox ? { sandbox: input.sandbox } : {}),\n ...(input.plugins === undefined ? {} : { plugins: normalizePlugins(input.plugins, \"defineEvalGroup plugins\", \"group\") }),\n });\n}\n/** @internal 仅供 discoverEvals 验证 score 题型来源。 */\nexport function isDefinedScoreEval(value: object): boolean {\n return definedScoreEvals.has(value);\n}\n/** 沙箱型 agent:在沙箱里 spawn 一个 coding agent 的 CLI,跑完读回 transcript。 */\nexport function defineSandboxAgent(def: SandboxAgentDef): SandboxAgent {\n if (!def.name)\n throw new Error(t(\"define.sandboxAgentNameRequired\"));\n assertEvidenceCoverage(def.evidenceCoverage, \"defineSandboxAgent\");\n if (def.ensure === undefined)\n throw new Error(t(\"define.sandboxAgentEnsureRequired\"));\n const ensure = Array.isArray(def.ensure) ? def.ensure : [def.ensure];\n if (ensure.length === 0)\n throw new Error(t(\"define.sandboxAgentEnsureRequired\"));\n return {\n name: def.name,\n kind: \"sandbox\",\n evidenceCoverage: def.evidenceCoverage,\n ensure,\n installers: def.installers ?? [],\n setup: def.setup,\n tracing: def.tracing,\n spanMapper: def.spanMapper,\n send: def.send,\n classifySendFailure: def.classifySendFailure,\n teardown: def.teardown,\n };\n}\n/** Direct Agent:在 send 里直接驱动函数、SDK 或服务端点。 */\nexport function defineAgent(def: DirectAgentDef): DirectAgent {\n if (!def.name)\n throw new Error(t(\"define.agentNameRequired\"));\n assertEvidenceCoverage(def.evidenceCoverage, \"defineAgent\");\n return {\n name: def.name,\n kind: \"direct\",\n evidenceCoverage: def.evidenceCoverage,\n setup: def.setup,\n tracing: def.tracing,\n spanMapper: def.spanMapper,\n send: def.send,\n classifySendFailure: def.classifySendFailure,\n teardown: def.teardown,\n };\n}\n/** 会话型 eval(通过制:一个 eval 折叠成一分)。禁止提供 id —— 从路径推导。 */\nexport function defineEval<const Sandbox extends SandboxLayer | undefined = undefined>(def: EvalInput<Sandbox>): EvalDefinition<\"pass\", TestContext, Sandbox> {\n if (Object.hasOwn(def, \"id\")) {\n throw new Error(t(\"define.evalIdRejected\"));\n }\n if (Object.hasOwn(def, \"evaluationKind\")) {\n throw new Error(t(\"define.evalEvaluationKindRejected\"));\n }\n if (Object.hasOwn(def, \"configHash\")) {\n throw new Error(t(\"define.evalConfigHashRejected\"));\n }\n if (typeof def.test !== \"function\") {\n throw new Error(t(\"define.evalTestRequired\"));\n }\n assertSandboxLayer(def.sandbox, \"defineEval\");\n return brandEvalDefinition({ ...normalizeEvalFields(def), evaluationKind: \"pass\", test: def.test });\n}\n/**\n * 计分制 eval:Fact verdict uses 与 Fact score uses 可以读取同一份证据;正常返回由 Runner\n * 自动关闭计分收集器。字段与 `defineEval` 同形,禁止提供 id,由发现期推导。\n */\nexport function defineScoreEval<const Sandbox extends SandboxLayer | undefined = undefined>(def: ScoreEvalInput<Sandbox>): EvalDefinition<\"score\", ScoreTestContext, Sandbox> {\n if (Object.hasOwn(def, \"id\")) {\n throw new Error(t(\"define.scoreEvalIdRejected\"));\n }\n if (Object.hasOwn(def, \"evaluationKind\")) {\n throw new Error(t(\"define.scoreEvalEvaluationKindRejected\"));\n }\n if (Object.hasOwn(def, \"configHash\")) {\n throw new Error(t(\"define.scoreEvalConfigHashRejected\"));\n }\n if (typeof def.test !== \"function\") {\n throw new Error(t(\"define.scoreEvalTestRequired\"));\n }\n assertSandboxLayer(def.sandbox, \"defineScoreEval\");\n const result = brandEvalDefinition({ ...normalizeEvalFields(def), evaluationKind: \"score\", test: def.test });\n definedScoreEvals.add(result);\n return result;\n}\n/** 实验:可签入的运行配置(怎么跑这批 eval)。 */\nexport function defineExperiment(def: ExperimentInput): ExperimentDefinition {\n if (Object.hasOwn(def, \"id\")) {\n throw new Error(t(\"define.experimentIdRejected\"));\n }\n if (!def.agent)\n throw new Error(t(\"define.experimentAgentRequired\"));\n assertSandboxLayer(def.sandbox, \"defineExperiment\");\n // setup 是实验级生命周期钩子(整场一次,宿主机侧,见 runner/types.ts 的 ExperimentDef.setup);\n // 传成非函数(如误把 sandbox 钩子对象塞进来)在解析时就报,不等到调度才炸。\n if (def.setup !== undefined && typeof def.setup !== \"function\") {\n throw new Error(t(\"define.experimentSetupNotFunction\"));\n }\n // classifyFailure 是失败分类链上的实验通道(见 runner/types.ts 的 ExperimentDef.classifyFailure):\n // 传成非函数在解析时就报,不等到某条 attempt 撞死才发现这一路声明白写。\n if (def.classifyFailure !== undefined && typeof def.classifyFailure !== \"function\") {\n throw new Error(t(\"define.experimentClassifyFailureNotFunction\"));\n }\n // labels 是报告归类坐标(进 ExperimentRunInfo.labels,不透传 ctx/t):值域 string | number,\n // 解析时即校验,布尔 / 对象 / NaN 直接报错,不等到落盘或报告分组才炸。\n if (def.labels !== undefined) {\n for (const [key, value] of Object.entries(def.labels)) {\n const ok = typeof value === \"string\" || (typeof value === \"number\" && Number.isFinite(value));\n if (!ok)\n throw new Error(t(\"define.experimentLabelInvalid\", { key }));\n }\n }\n const { id: _derivedId, ...author } = def;\n return brandExperimentDefinition({\n ...author,\n flags: decodeJsonRecord(def.flags ?? {}, \"defineExperiment flags\"),\n labels: Object.freeze({ ...(def.labels ?? {}) }),\n attempts: def.attempts ?? 1,\n earlyExit: def.earlyExit ?? false,\n evals: Array.isArray(def.evals) ? Object.freeze([...def.evals]) : (def.evals ?? \"*\"),\n sandboxReuse: def.sandboxReuse === true,\n plugins: normalizePlugins(def.plugins ?? [], \"defineExperiment plugins\", \"experiment\"),\n });\n}\nfunction normalizeEvalFields<const Sandbox extends SandboxLayer | undefined>(def: EvalInput<Sandbox> | ScoreEvalInput<Sandbox>): EvalDefinitionFields<Sandbox> {\n return {\n ...(def.description !== undefined ? { description: def.description } : {}),\n tags: Object.freeze([...(def.tags ?? [])]),\n ...(def.sandbox !== undefined ? { sandbox: def.sandbox } : {}),\n plugins: normalizePlugins(def.plugins ?? [], \"defineEval plugins\", \"eval\"),\n ...(def.judge !== undefined ? { judge: def.judge } : {}),\n reporters: Object.freeze([...(def.reporters ?? [])]),\n ...(def.timeoutMs !== undefined ? { timeoutMs: def.timeoutMs } : {}),\n metadata: decodeJsonRecord(def.metadata ?? {}, \"Eval metadata\"),\n diff: Object.freeze({\n include: Object.freeze([...(def.diff?.include ?? [])]),\n ignore: Object.freeze([...(def.diff?.ignore ?? [])]),\n }),\n };\n}\nfunction normalizePlugins<Owner extends PluginOwner>(value: readonly PluginInstance<Owner>[], label: string, owner: Owner): readonly PluginInstance<Owner>[] {\n if (!Array.isArray(value))\n throw new TypeError(`${label} must be an array.`);\n return Object.freeze(value.map((plugin, index) => {\n if (!isPluginInstance(plugin))\n throw new TypeError(`${label}[${index}] must be created by definePlugin().`);\n if (pluginInstanceDataOf(plugin)[owner] === undefined) {\n throw new TypeError(`${label}[${index}] does not support ${owner} attachment.`);\n }\n return plugin;\n }));\n}\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\")\n return true;\n if (typeof value === \"number\")\n return Number.isFinite(value);\n if (Array.isArray(value))\n return value.every(isJsonValue);\n if (typeof value !== \"object\")\n return false;\n return Object.values(value).every(isJsonValue);\n}\nconst JsonValueSchema = Schema.declare<JsonValue>(isJsonValue);\nconst JsonRecordSchema = Schema.Record({ key: Schema.String, value: JsonValueSchema });\nfunction deepFreezeJson(value: JsonValue): JsonValue {\n if (Array.isArray(value)) {\n const items: JsonValue[] = value.map(deepFreezeJson);\n Object.freeze(items);\n return items;\n }\n if (value !== null && typeof value === \"object\") {\n const record: globalThis.Record<string, JsonValue> = Object.fromEntries(Object.entries(value).map(([key, child]) => [key, deepFreezeJson(child)]));\n Object.freeze(record);\n return record;\n }\n return value;\n}\nfunction decodeJsonRecord(value: Readonly<globalThis.Record<string, JsonValue>>, label: string): Readonly<globalThis.Record<string, JsonValue>> {\n const decoded = Schema.decodeUnknownEither(JsonRecordSchema, { errors: \"all\" })(value);\n if (Either.isLeft(decoded))\n throw new TypeError(`${label} must be JSON-compatible: ${String(decoded.left)}`);\n return Object.freeze(Object.fromEntries(Object.entries(decoded.right).map(([key, child]) => [key, deepFreezeJson(child)])));\n}\n/**\n * `SandboxLayer` 的品牌只由 `niceeval/sandbox` 工厂写入。动态 TSX/JS 调用绕过静态类型时,\n * 不接受看似相同的裸对象,以免在 linker 阶段才得到难以定位的错误。\n */\nfunction assertSandboxLayer(value: unknown, factory: string): void {\n if (value !== undefined && !isSandboxLayer(value)) {\n throw new TypeError(`${factory} sandbox must be a SandboxLayer created by a niceeval/sandbox factory (for example dockerImage(), dockerCompose(), e2bTemplate(), or localSandbox()).`);\n }\n}\n/** 项目级配置。 */\nexport function defineConfig(config: Config): Config {\n return config;\n}\n/**\n * 自定义沙箱 provider:`create` 直接返回一个实现 `Sandbox` 接口的实例,不需要 niceeval 内置支持\n * 这个 provider 名字。用于接入 docker/vercel/e2b 之外的运行环境(自建 VM、Modal、Fly 等)。\n */\nexport function defineSandbox(def: CustomProviderSandboxOptions): SandboxLayer<\"template-bearing\", \"prepare-only\"> {\n return customProviderSandbox(def);\n}\n"]}
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["define.ts"],"names":[],"mappings":"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","sourcesContent":["// 定义入口:把用户对象规格化成核心认得的形状。路径即身份 —— 这里禁止手写 id,\n// 由发现阶段从文件路径推导(见 runner/discover.ts)。\nimport type { DirectAgent, DirectAgentDef, Config, EvalInput, EvalGroupDefinition, EvalGroupInput, EvalDefinition, EvalDefinitionFields, ExperimentDefinition, ExperimentInput, SharedStateConfig, SandboxAgent, SandboxAgentDef, ScoreEvalInput, ScoreTestContext, TestContext, JsonValue, } from \"./types.ts\";\nimport { brandEvalDefinition, brandEvalGroupDefinition, brandExperimentDefinition, isEvalDefinition, } from \"./types.ts\";\nimport { t } from \"./i18n/index.ts\";\nimport { customProviderSandbox, isSandboxLayer, type CustomProviderSandboxOptions, type SandboxLayer, } from \"./sandbox/layer.ts\";\nimport { Either, Schema } from \"effect\";\nimport { assertEvidenceCoverage } from \"./assertions/coverage.ts\";\nimport { isPluginInstance, pluginInstanceDataOf, type PluginInstance, type PluginOwner } from \"./plugin/contracts.ts\";\n// 发现期必须区分 defineScoreEval 的真正产物与运行时手写 `{ evaluationKind: \"score\" }` 的裸对象。\n// WeakSet 是模块私有来源证明;Definition 本身另有 types.ts 的私有 symbol 品牌供类型层使用。\nconst definedScoreEvals = new WeakSet<object>();\n/** Define a closed set of real Eval definitions sharing one physical Sandbox. */\nexport function defineEvalGroup<const Sandbox extends SandboxLayer | undefined>(input: EvalGroupInput<Sandbox>): EvalGroupDefinition {\n if (!Array.isArray(input.evals) || input.evals.length === 0) {\n throw new TypeError(\"defineEvalGroup evals must be a non-empty array of defineEval()/defineScoreEval() definitions.\");\n }\n input.evals.forEach((member, index) => {\n if (!isEvalDefinition(member)) {\n throw new TypeError(`defineEvalGroup evals[${index}] must be the object returned by defineEval() or defineScoreEval().`);\n }\n });\n assertSandboxLayer(input.sandbox, \"defineEvalGroup\");\n if (input.onUnavailable !== \"stop-group\" && input.onUnavailable !== \"replace-sandbox\") {\n throw new TypeError(\"defineEvalGroup onUnavailable must be \\\"stop-group\\\" or \\\"replace-sandbox\\\".\");\n }\n const [first, ...rest] = input.evals;\n return brandEvalGroupDefinition({\n evals: Object.freeze([first, ...rest]),\n onUnavailable: input.onUnavailable,\n ...(input.sandbox ? { sandbox: input.sandbox } : {}),\n ...(input.plugins === undefined ? {} : { plugins: normalizePlugins(input.plugins, \"defineEvalGroup plugins\", \"group\") }),\n });\n}\n/** @internal 仅供 discoverEvals 验证 score 题型来源。 */\nexport function isDefinedScoreEval(value: object): boolean {\n return definedScoreEvals.has(value);\n}\n/** 沙箱型 agent:在沙箱里 spawn 一个 coding agent 的 CLI,跑完读回 transcript。 */\nexport function defineSandboxAgent(def: SandboxAgentDef): SandboxAgent {\n if (!def.name)\n throw new Error(t(\"define.sandboxAgentNameRequired\"));\n assertEvidenceCoverage(def.evidenceCoverage, \"defineSandboxAgent\");\n if (def.ensure === undefined)\n throw new Error(t(\"define.sandboxAgentEnsureRequired\"));\n const ensure = Array.isArray(def.ensure) ? def.ensure : [def.ensure];\n if (ensure.length === 0)\n throw new Error(t(\"define.sandboxAgentEnsureRequired\"));\n return {\n name: def.name,\n kind: \"sandbox\",\n evidenceCoverage: def.evidenceCoverage,\n ensure,\n installers: def.installers ?? [],\n setup: def.setup,\n tracing: def.tracing,\n spanMapper: def.spanMapper,\n send: def.send,\n classifySendFailure: def.classifySendFailure,\n teardown: def.teardown,\n };\n}\n/** Direct Agent:在 send 里直接驱动函数、SDK 或服务端点。 */\nexport function defineAgent(def: DirectAgentDef): DirectAgent {\n if (!def.name)\n throw new Error(t(\"define.agentNameRequired\"));\n assertEvidenceCoverage(def.evidenceCoverage, \"defineAgent\");\n return {\n name: def.name,\n kind: \"direct\",\n evidenceCoverage: def.evidenceCoverage,\n setup: def.setup,\n tracing: def.tracing,\n spanMapper: def.spanMapper,\n send: def.send,\n classifySendFailure: def.classifySendFailure,\n teardown: def.teardown,\n };\n}\n/** 会话型 eval(通过制:一个 eval 折叠成一分)。禁止提供 id —— 从路径推导。 */\nexport function defineEval<const Sandbox extends SandboxLayer | undefined = undefined>(def: EvalInput<Sandbox>): EvalDefinition<\"pass\", TestContext, Sandbox> {\n if (Object.hasOwn(def, \"id\")) {\n throw new Error(t(\"define.evalIdRejected\"));\n }\n if (Object.hasOwn(def, \"evaluationKind\")) {\n throw new Error(t(\"define.evalEvaluationKindRejected\"));\n }\n if (Object.hasOwn(def, \"configHash\")) {\n throw new Error(t(\"define.evalConfigHashRejected\"));\n }\n if (typeof def.test !== \"function\") {\n throw new Error(t(\"define.evalTestRequired\"));\n }\n assertSandboxLayer(def.sandbox, \"defineEval\");\n return brandEvalDefinition({ ...normalizeEvalFields(def), evaluationKind: \"pass\", test: def.test });\n}\n/**\n * 计分制 eval:Fact verdict uses 与 Fact score uses 可以读取同一份证据;正常返回由 Runner\n * 自动关闭计分收集器。字段与 `defineEval` 同形,禁止提供 id,由发现期推导。\n */\nexport function defineScoreEval<const Sandbox extends SandboxLayer | undefined = undefined>(def: ScoreEvalInput<Sandbox>): EvalDefinition<\"score\", ScoreTestContext, Sandbox> {\n if (Object.hasOwn(def, \"id\")) {\n throw new Error(t(\"define.scoreEvalIdRejected\"));\n }\n if (Object.hasOwn(def, \"evaluationKind\")) {\n throw new Error(t(\"define.scoreEvalEvaluationKindRejected\"));\n }\n if (Object.hasOwn(def, \"configHash\")) {\n throw new Error(t(\"define.scoreEvalConfigHashRejected\"));\n }\n if (typeof def.test !== \"function\") {\n throw new Error(t(\"define.scoreEvalTestRequired\"));\n }\n assertSandboxLayer(def.sandbox, \"defineScoreEval\");\n const result = brandEvalDefinition({ ...normalizeEvalFields(def), evaluationKind: \"score\", test: def.test });\n definedScoreEvals.add(result);\n return result;\n}\n/** 实验:可签入的运行配置(怎么跑这批 eval)。 */\nexport function defineExperiment(def: ExperimentInput): ExperimentDefinition {\n if (Object.hasOwn(def, \"id\")) {\n throw new Error(t(\"define.experimentIdRejected\"));\n }\n if (!def.agent)\n throw new Error(t(\"define.experimentAgentRequired\"));\n assertSandboxLayer(def.sandbox, \"defineExperiment\");\n // setup 是实验级生命周期钩子(整场一次,宿主机侧,见 runner/types.ts 的 ExperimentDef.setup);\n // 传成非函数(如误把 sandbox 钩子对象塞进来)在解析时就报,不等到调度才炸。\n if (def.setup !== undefined && typeof def.setup !== \"function\") {\n throw new Error(t(\"define.experimentSetupNotFunction\"));\n }\n // teardown 与 setup 是同一个 Experiment lifecycle 边界。非函数值绝不能\n // 伪装成已声明的 cleanup,否则 explicit sharedState recovery 可能在没有\n // 执行补偿的情况下释放 immutable owner generation。\n if (def.teardown !== undefined && typeof def.teardown !== \"function\") {\n throw new Error(t(\"define.experimentTeardownNotFunction\"));\n }\n // classifyFailure 是失败分类链上的实验通道(见 runner/types.ts 的 ExperimentDef.classifyFailure):\n // 传成非函数在解析时就报,不等到某条 attempt 撞死才发现这一路声明白写。\n if (def.classifyFailure !== undefined && typeof def.classifyFailure !== \"function\") {\n throw new Error(t(\"define.experimentClassifyFailureNotFunction\"));\n }\n // labels 是报告归类坐标(进 ExperimentRunInfo.labels,不透传 ctx/t):值域 string | number,\n // 解析时即校验,布尔 / 对象 / NaN 直接报错,不等到落盘或报告分组才炸。\n if (def.labels !== undefined) {\n for (const [key, value] of Object.entries(def.labels)) {\n const ok = typeof value === \"string\" || (typeof value === \"number\" && Number.isFinite(value));\n if (!ok)\n throw new Error(t(\"define.experimentLabelInvalid\", { key }));\n }\n }\n const sharedState = normalizeSharedState(def.sharedState);\n const { id: _derivedId, sharedState: _sharedState, ...author } = def;\n return brandExperimentDefinition({\n ...author,\n flags: decodeJsonRecord(def.flags ?? {}, \"defineExperiment flags\"),\n labels: Object.freeze({ ...(def.labels ?? {}) }),\n attempts: def.attempts ?? 1,\n earlyExit: def.earlyExit ?? false,\n evals: Array.isArray(def.evals) ? Object.freeze([...def.evals]) : (def.evals ?? \"*\"),\n sandboxReuse: def.sandboxReuse === true,\n ...(sharedState === undefined ? {} : { sharedState }),\n plugins: normalizePlugins(def.plugins ?? [], \"defineExperiment plugins\", \"experiment\"),\n });\n}\nconst SharedStateKeyPattern = /^[a-z0-9][a-z0-9._/-]{0,127}$/u;\nfunction normalizeSharedState(value: unknown): SharedStateConfig | undefined {\n if (value === undefined)\n return undefined;\n const candidate = value as {\n key?: unknown;\n };\n if (typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n !Object.hasOwn(value, \"key\") ||\n Object.keys(value).length !== 1 ||\n typeof candidate.key !== \"string\" ||\n !SharedStateKeyPattern.test(candidate.key)) {\n throw new TypeError(t(\"define.experimentSharedStateInvalid\"));\n }\n return Object.freeze({ key: candidate.key });\n}\nfunction normalizeEvalFields<const Sandbox extends SandboxLayer | undefined>(def: EvalInput<Sandbox> | ScoreEvalInput<Sandbox>): EvalDefinitionFields<Sandbox> {\n return {\n ...(def.description !== undefined ? { description: def.description } : {}),\n tags: Object.freeze([...(def.tags ?? [])]),\n ...(def.sandbox !== undefined ? { sandbox: def.sandbox } : {}),\n plugins: normalizePlugins(def.plugins ?? [], \"defineEval plugins\", \"eval\"),\n ...(def.judge !== undefined ? { judge: def.judge } : {}),\n reporters: Object.freeze([...(def.reporters ?? [])]),\n ...(def.timeoutMs !== undefined ? { timeoutMs: def.timeoutMs } : {}),\n metadata: decodeJsonRecord(def.metadata ?? {}, \"Eval metadata\"),\n diff: Object.freeze({\n include: Object.freeze([...(def.diff?.include ?? [])]),\n ignore: Object.freeze([...(def.diff?.ignore ?? [])]),\n }),\n };\n}\nfunction normalizePlugins<Owner extends PluginOwner>(value: readonly PluginInstance<Owner>[], label: string, owner: Owner): readonly PluginInstance<Owner>[] {\n if (!Array.isArray(value))\n throw new TypeError(`${label} must be an array.`);\n return Object.freeze(value.map((plugin, index) => {\n if (!isPluginInstance(plugin))\n throw new TypeError(`${label}[${index}] must be created by definePlugin().`);\n if (pluginInstanceDataOf(plugin)[owner] === undefined) {\n throw new TypeError(`${label}[${index}] does not support ${owner} attachment.`);\n }\n return plugin;\n }));\n}\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\")\n return true;\n if (typeof value === \"number\")\n return Number.isFinite(value);\n if (Array.isArray(value))\n return value.every(isJsonValue);\n if (typeof value !== \"object\")\n return false;\n return Object.values(value).every(isJsonValue);\n}\nconst JsonValueSchema = Schema.declare<JsonValue>(isJsonValue);\nconst JsonRecordSchema = Schema.Record({ key: Schema.String, value: JsonValueSchema });\nfunction deepFreezeJson(value: JsonValue): JsonValue {\n if (Array.isArray(value)) {\n const items: JsonValue[] = value.map(deepFreezeJson);\n Object.freeze(items);\n return items;\n }\n if (value !== null && typeof value === \"object\") {\n const record: globalThis.Record<string, JsonValue> = Object.fromEntries(Object.entries(value).map(([key, child]) => [key, deepFreezeJson(child)]));\n Object.freeze(record);\n return record;\n }\n return value;\n}\nfunction decodeJsonRecord(value: Readonly<globalThis.Record<string, JsonValue>>, label: string): Readonly<globalThis.Record<string, JsonValue>> {\n const decoded = Schema.decodeUnknownEither(JsonRecordSchema, { errors: \"all\" })(value);\n if (Either.isLeft(decoded))\n throw new TypeError(`${label} must be JSON-compatible: ${String(decoded.left)}`);\n return Object.freeze(Object.fromEntries(Object.entries(decoded.right).map(([key, child]) => [key, deepFreezeJson(child)])));\n}\n/**\n * `SandboxLayer` 的品牌只由 `niceeval/sandbox` 工厂写入。动态 TSX/JS 调用绕过静态类型时,\n * 不接受看似相同的裸对象,以免在 linker 阶段才得到难以定位的错误。\n */\nfunction assertSandboxLayer(value: unknown, factory: string): void {\n if (value !== undefined && !isSandboxLayer(value)) {\n throw new TypeError(`${factory} sandbox must be a SandboxLayer created by a niceeval/sandbox factory (for example dockerImage(), dockerCompose(), e2bTemplate(), or localSandbox()).`);\n }\n}\n/** 项目级配置。 */\nexport function defineConfig(config: Config): Config {\n return config;\n}\n/**\n * 自定义沙箱 provider:`create` 直接返回一个实现 `Sandbox` 接口的实例,不需要 niceeval 内置支持\n * 这个 provider 名字。用于接入 docker/vercel/e2b 之外的运行环境(自建 VM、Modal、Fly 等)。\n */\nexport function defineSandbox(def: CustomProviderSandboxOptions): SandboxLayer<\"template-bearing\", \"prepare-only\"> {\n return customProviderSandbox(def);\n}\n"]}
@@ -67,6 +67,7 @@ function debugAgentRun(experiment, evalId) {
67
67
  earlyExit: experiment.earlyExit ?? false,
68
68
  sandbox: experiment.sandbox,
69
69
  sandboxReuse: experiment.sandboxReuse,
70
+ ...(experiment.sharedState === undefined ? {} : { sharedState: experiment.sharedState }),
70
71
  judge: experiment.judge,
71
72
  ...(0, timeout_ts_1.resolveRunTimeout)(undefined, experiment.timeoutMs),
72
73
  budget: experiment.budget,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport { loadConfigFile } from \"../../load-config.ts\";\nimport { assembleCommandPlan, type CommandPlan } from \"../../runner/command-plan.ts\";\nimport { discoverEvals, discoverExperiments } from \"../../runner/discover.ts\";\nimport { planProjectTarget } from \"../../runner/fingerprint.ts\";\nimport { resolveExperimentEvals } from \"../../runner/eval-selection.ts\";\nimport { prepareRunnerRecordReuse, withRunnerCurrentReusePreview, } from \"../../runner/record.ts\";\nimport { projectCurrentReuseReadback, } from \"../../runner/reuse-readback.ts\";\nimport { acceptLocators } from \"../../runner/accept.ts\";\nimport { runEvals } from \"../../runner/run.ts\";\nimport type { AcceptLocatorsOptions, } from \"../../runner/accept.ts\";\nimport type { ProjectTargetPlan } from \"../../runner/fingerprint.ts\";\nimport type { CurrentReuseReadbackSnapshot } from \"../../runner/reuse-readback.ts\";\nimport type { ExecutionReusePlanSlot } from \"../../runner/reuse-plan.ts\";\nimport { resolveRunTimeout } from \"../../runner/timeout.ts\";\nimport type { AgentRun, Config, DiscoveredEval, DiscoveredExperiment, RunOptions, } from \"../../runner/types.ts\";\nimport type { RecordRoot } from \"../../record/platform/root.ts\";\nimport { matchExperimentSelector } from \"../../shared/aggregate.ts\";\n/**\n * Public, supported high-level Host composition SDK for the NiceEval CLI,\n * replacement CLI/Web hosts, and deep application integrations. Eval authors\n * use `defineExperiment`; this entry deliberately exposes no Runner internals.\n */\n/** One discovered Experiment after its author selector and CLI prefixes close. */\nexport interface ExperimentHostSelection {\n readonly experiment: DiscoveredExperiment;\n readonly selectedEvalIds: readonly string[];\n /** The Experiment-owned set before CLI eval-prefix narrowing. */\n readonly selectorEvalIds: readonly string[];\n}\n/** Discovery result used by both `exp list` and execution planning. */\nexport interface ExperimentHostListResult {\n readonly evals: readonly DiscoveredEval[];\n readonly experimentIds: readonly string[];\n readonly selections: readonly ExperimentHostSelection[];\n}\n/**\n * Discovery and selection are owned here so consumers cannot invoke an\n * Experiment's predicate a second time while reconstructing an AgentRun.\n */\nfunction list(input: {\n readonly cwd: string;\n /** Keep the CLI's public `--tag` selection inside the Experiment boundary. */\n readonly tag?: string;\n readonly selector?: string;\n readonly evalPatterns?: readonly string[];\n}): Effect.Effect<ExperimentHostListResult, unknown> {\n return Effect.gen(function* () {\n const discoveredEvals = yield* discoverEvals(input.cwd);\n const evals = input.tag === undefined\n ? discoveredEvals\n : discoveredEvals.filter((evalDefinition) => evalDefinition.tags?.includes(input.tag!));\n const experiments = yield* discoverExperiments(input.cwd);\n const experimentIds = Object.freeze(experiments.map((experiment) => experiment.id));\n const selectedIds = input.selector === undefined\n ? undefined\n : new Set(matchExperimentSelector(experimentIds, input.selector));\n const selections = experiments\n .filter((experiment) => selectedIds === undefined || selectedIds.has(experiment.id))\n .map((experiment): ExperimentHostSelection => {\n const selected = resolveExperimentEvals({\n experimentId: experiment.id,\n selector: experiment.evals,\n cliPatterns: input.evalPatterns ?? [],\n evals,\n });\n return Object.freeze({\n experiment,\n selectedEvalIds: Object.freeze([...selected.selectedEvalIds]),\n selectorEvalIds: Object.freeze(selected.selectorEvals.map((evalDefinition) => evalDefinition.id)),\n });\n });\n return Object.freeze({\n evals: Object.freeze([...evals]),\n experimentIds,\n selections: Object.freeze(selections),\n });\n });\n}\nexport interface ExperimentHostDebugPlanRequest {\n readonly cwd: string;\n readonly experimentSelector: string;\n readonly evalSelector: string;\n}\n/** A fully closed, read-only lifecycle plan for exactly one Experiment × Eval pair. */\nexport interface ExperimentHostDebugPlan {\n readonly status: \"planned\";\n readonly experimentId: string;\n readonly evalId: string;\n readonly commandPlan: CommandPlan;\n}\n/**\n * Selector outcomes are data, rather than CLI-owned selection logic or a\n * partially constructed plan. The caller can render them in its own surface.\n */\nexport type ExperimentHostDebugPlanResult = ExperimentHostDebugPlan | {\n readonly status: \"experiment-no-match\";\n readonly selector: string;\n readonly candidates: readonly string[];\n} | {\n readonly status: \"experiment-ambiguous\";\n readonly selector: string;\n readonly candidates: readonly string[];\n} | {\n readonly status: \"eval-no-match\";\n readonly selector: string;\n readonly experimentId: string;\n readonly candidates: readonly string[];\n} | {\n readonly status: \"eval-ambiguous\";\n readonly selector: string;\n readonly experimentId: string;\n readonly candidates: readonly string[];\n};\nfunction uniqueExactOrPrefix<T>(candidates: readonly T[], selector: string, id: (candidate: T) => string): readonly T[] {\n const exact = candidates.find((candidate) => id(candidate) === selector);\n return exact === undefined\n ? candidates.filter((candidate) => id(candidate).startsWith(selector))\n : [exact];\n}\nfunction debugAgentRun(experiment: DiscoveredExperiment, evalId: string): AgentRun {\n return {\n agent: experiment.agent,\n model: experiment.model,\n reasoningEffort: experiment.reasoningEffort,\n flags: experiment.flags ?? {},\n plugins: experiment.plugins,\n attempts: experiment.attempts ?? 1,\n earlyExit: experiment.earlyExit ?? false,\n sandbox: experiment.sandbox,\n sandboxReuse: experiment.sandboxReuse,\n judge: experiment.judge,\n ...resolveRunTimeout(undefined, experiment.timeoutMs),\n budget: experiment.budget,\n selectedEvalIds: [evalId],\n experimentId: experiment.id,\n experimentBaseDir: experiment.baseDir,\n experimentSourcePath: experiment.sourcePath,\n description: experiment.description,\n labels: experiment.labels,\n maxConcurrency: experiment.maxConcurrency,\n setup: experiment.setup,\n teardown: experiment.teardown,\n classifyFailure: experiment.classifyFailure,\n };\n}\n/**\n * Closes selector resolution, physical planning, and command-plan projection\n * inside the Experiment Host. It deliberately does not construct a Record\n * root, enter a lease, read history, or invoke an author callback.\n */\nfunction debug(input: ExperimentHostDebugPlanRequest): Effect.Effect<ExperimentHostDebugPlanResult, unknown> {\n return Effect.gen(function* () {\n const config = yield* Effect.tryPromise({\n try: () => loadConfigFile(input.cwd),\n catch: (cause) => cause,\n });\n const listed = yield* list({ cwd: input.cwd });\n const selectedExperiments = uniqueExactOrPrefix(listed.selections, input.experimentSelector, ({ experiment }) => experiment.id).slice().sort((left, right) => left.experiment.id.localeCompare(right.experiment.id));\n if (selectedExperiments.length === 0) {\n return Object.freeze({\n status: \"experiment-no-match\" as const,\n selector: input.experimentSelector,\n candidates: Object.freeze([...listed.experimentIds].sort()),\n });\n }\n if (selectedExperiments.length > 1) {\n return Object.freeze({\n status: \"experiment-ambiguous\" as const,\n selector: input.experimentSelector,\n candidates: Object.freeze(selectedExperiments.map(({ experiment }) => experiment.id)),\n });\n }\n const selection = selectedExperiments[0]!;\n const experiment = selection.experiment;\n const selectorEvalIds = new Set(selection.selectorEvalIds);\n const selectorEvals = listed.evals.filter((evalDef) => selectorEvalIds.has(evalDef.id));\n const selectedEvals = uniqueExactOrPrefix(selectorEvals, input.evalSelector, (evalDef) => evalDef.id)\n .slice().sort((left, right) => left.id.localeCompare(right.id));\n if (selectedEvals.length === 0) {\n return Object.freeze({\n status: \"eval-no-match\" as const,\n selector: input.evalSelector,\n experimentId: experiment.id,\n candidates: Object.freeze(selectorEvals.map((evalDef) => evalDef.id).sort()),\n });\n }\n if (selectedEvals.length > 1) {\n return Object.freeze({\n status: \"eval-ambiguous\" as const,\n selector: input.evalSelector,\n experimentId: experiment.id,\n candidates: Object.freeze(selectedEvals.map((evalDef) => evalDef.id)),\n });\n }\n const evalDef = selectedEvals[0]!;\n const run = debugAgentRun(experiment, evalDef.id);\n const target = yield* planProjectTarget(listed.evals, [run], config.timeoutMs, { configJudge: config.judge });\n const commandPlan = assembleCommandPlan({\n rows: [{\n experimentId: experiment.id,\n evalId: evalDef.id,\n ...(evalDef.evalGroup === undefined ? {} : { evalGroupId: evalDef.evalGroup.id }),\n attempts: run.attempts,\n dispatch: [{ attempts: Array.from({ length: run.attempts }, (_, attempt) => attempt) }],\n }],\n preparedPairsByKey: target.preparedPairsByKey,\n });\n return Object.freeze({\n status: \"planned\" as const,\n experimentId: experiment.id,\n evalId: evalDef.id,\n commandPlan,\n });\n });\n}\nexport interface ExperimentHostPlanRequest {\n readonly evals: readonly DiscoveredEval[];\n readonly agentRuns: readonly AgentRun[];\n readonly config: Config;\n readonly recordRoot: RecordRoot;\n readonly rerun?: \"failed\" | \"all\";\n readonly keepSandbox?: \"failed\" | \"all\";\n /** Omit for a dispatch plan; include only for the read-only `exp --dry` path. */\n readonly previewStartedAt?: number;\n}\nexport interface ExperimentHostCurrentPlan {\n readonly slots: readonly ExecutionReusePlanSlot[];\n readonly readbacks: readonly CurrentReuseReadbackSnapshot[];\n}\nexport interface ExperimentHostPlan {\n readonly target: ProjectTargetPlan;\n readonly current?: ExperimentHostCurrentPlan;\n}\n/**\n * Reuses the production physical planner and frozen Record reuse planner.\n * It never creates a Run; current history is read only when a dry preview was\n * explicitly requested.\n */\nfunction plan(input: ExperimentHostPlanRequest) {\n return Effect.gen(function* () {\n const target = yield* planProjectTarget(input.evals, input.agentRuns, input.config.timeoutMs, {\n configJudge: input.config.judge,\n ...(input.keepSandbox === undefined ? {} : { keepSandbox: input.keepSandbox }),\n });\n const reuse = yield* prepareRunnerRecordReuse({\n evals: input.evals,\n runs: input.agentRuns,\n config: { timeoutMs: input.config.timeoutMs },\n plannedFingerprints: target.plannedFingerprints,\n plannedConfigHashes: target.plannedConfigHashes,\n ...(input.rerun === undefined ? {} : { rerun: input.rerun }),\n ...(input.keepSandbox === undefined ? {} : { keepSandbox: input.keepSandbox }),\n });\n const current = input.previewStartedAt === undefined\n ? undefined\n : yield* withRunnerCurrentReusePreview({\n recordRoot: input.recordRoot,\n startedAt: input.previewStartedAt,\n evals: input.evals,\n runs: input.agentRuns,\n reuse,\n use: ({ reusePlan, readReadbacks }) => readReadbacks().pipe(Effect.map((readbacks): ExperimentHostCurrentPlan => Object.freeze({\n slots: Object.freeze([...reusePlan.slots]),\n readbacks: Object.freeze(readbacks.map(projectCurrentReuseReadback)),\n }))),\n });\n return Object.freeze({\n target,\n ...(current === undefined ? {} : { current }),\n });\n });\n}\n/** The existing Runner remains the one execution implementation. */\nfunction run<AttachmentError, AttachmentRequirements>(input: RunOptions<AttachmentError, AttachmentRequirements>) {\n return runEvals(input);\n}\n/** The existing adoption flow remains the one acceptance implementation. */\nfunction accept(input: AcceptLocatorsOptions) {\n return acceptLocators(input);\n}\nexport interface ExperimentHostSDK {\n readonly list: typeof list;\n readonly plan: typeof plan;\n readonly debug: typeof debug;\n readonly run: typeof run;\n readonly accept: typeof accept;\n}\n/** The fixed public Host surface; discovery, Runner, and adoption internals stay private. */\nexport const experimentHost: ExperimentHostSDK = Object.freeze({\n list,\n plan,\n debug,\n run,\n accept,\n});\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport { loadConfigFile } from \"../../load-config.ts\";\nimport { assembleCommandPlan, type CommandPlan } from \"../../runner/command-plan.ts\";\nimport { discoverEvals, discoverExperiments } from \"../../runner/discover.ts\";\nimport { planProjectTarget } from \"../../runner/fingerprint.ts\";\nimport { resolveExperimentEvals } from \"../../runner/eval-selection.ts\";\nimport { prepareRunnerRecordReuse, withRunnerCurrentReusePreview, } from \"../../runner/record.ts\";\nimport { projectCurrentReuseReadback, } from \"../../runner/reuse-readback.ts\";\nimport { acceptLocators } from \"../../runner/accept.ts\";\nimport { runEvals } from \"../../runner/run.ts\";\nimport type { AcceptLocatorsOptions, } from \"../../runner/accept.ts\";\nimport type { ProjectTargetPlan } from \"../../runner/fingerprint.ts\";\nimport type { CurrentReuseReadbackSnapshot } from \"../../runner/reuse-readback.ts\";\nimport type { ExecutionReusePlanSlot } from \"../../runner/reuse-plan.ts\";\nimport { resolveRunTimeout } from \"../../runner/timeout.ts\";\nimport type { AgentRun, Config, DiscoveredEval, DiscoveredExperiment, RunOptions, } from \"../../runner/types.ts\";\nimport type { RecordRoot } from \"../../record/platform/root.ts\";\nimport { matchExperimentSelector } from \"../../shared/aggregate.ts\";\n/**\n * Public, supported high-level Host composition SDK for the NiceEval CLI,\n * replacement CLI/Web hosts, and deep application integrations. Eval authors\n * use `defineExperiment`; this entry deliberately exposes no Runner internals.\n */\n/** One discovered Experiment after its author selector and CLI prefixes close. */\nexport interface ExperimentHostSelection {\n readonly experiment: DiscoveredExperiment;\n readonly selectedEvalIds: readonly string[];\n /** The Experiment-owned set before CLI eval-prefix narrowing. */\n readonly selectorEvalIds: readonly string[];\n}\n/** Discovery result used by both `exp list` and execution planning. */\nexport interface ExperimentHostListResult {\n readonly evals: readonly DiscoveredEval[];\n readonly experimentIds: readonly string[];\n readonly selections: readonly ExperimentHostSelection[];\n}\n/**\n * Discovery and selection are owned here so consumers cannot invoke an\n * Experiment's predicate a second time while reconstructing an AgentRun.\n */\nfunction list(input: {\n readonly cwd: string;\n /** Keep the CLI's public `--tag` selection inside the Experiment boundary. */\n readonly tag?: string;\n readonly selector?: string;\n readonly evalPatterns?: readonly string[];\n}): Effect.Effect<ExperimentHostListResult, unknown> {\n return Effect.gen(function* () {\n const discoveredEvals = yield* discoverEvals(input.cwd);\n const evals = input.tag === undefined\n ? discoveredEvals\n : discoveredEvals.filter((evalDefinition) => evalDefinition.tags?.includes(input.tag!));\n const experiments = yield* discoverExperiments(input.cwd);\n const experimentIds = Object.freeze(experiments.map((experiment) => experiment.id));\n const selectedIds = input.selector === undefined\n ? undefined\n : new Set(matchExperimentSelector(experimentIds, input.selector));\n const selections = experiments\n .filter((experiment) => selectedIds === undefined || selectedIds.has(experiment.id))\n .map((experiment): ExperimentHostSelection => {\n const selected = resolveExperimentEvals({\n experimentId: experiment.id,\n selector: experiment.evals,\n cliPatterns: input.evalPatterns ?? [],\n evals,\n });\n return Object.freeze({\n experiment,\n selectedEvalIds: Object.freeze([...selected.selectedEvalIds]),\n selectorEvalIds: Object.freeze(selected.selectorEvals.map((evalDefinition) => evalDefinition.id)),\n });\n });\n return Object.freeze({\n evals: Object.freeze([...evals]),\n experimentIds,\n selections: Object.freeze(selections),\n });\n });\n}\nexport interface ExperimentHostDebugPlanRequest {\n readonly cwd: string;\n readonly experimentSelector: string;\n readonly evalSelector: string;\n}\n/** A fully closed, read-only lifecycle plan for exactly one Experiment × Eval pair. */\nexport interface ExperimentHostDebugPlan {\n readonly status: \"planned\";\n readonly experimentId: string;\n readonly evalId: string;\n readonly commandPlan: CommandPlan;\n}\n/**\n * Selector outcomes are data, rather than CLI-owned selection logic or a\n * partially constructed plan. The caller can render them in its own surface.\n */\nexport type ExperimentHostDebugPlanResult = ExperimentHostDebugPlan | {\n readonly status: \"experiment-no-match\";\n readonly selector: string;\n readonly candidates: readonly string[];\n} | {\n readonly status: \"experiment-ambiguous\";\n readonly selector: string;\n readonly candidates: readonly string[];\n} | {\n readonly status: \"eval-no-match\";\n readonly selector: string;\n readonly experimentId: string;\n readonly candidates: readonly string[];\n} | {\n readonly status: \"eval-ambiguous\";\n readonly selector: string;\n readonly experimentId: string;\n readonly candidates: readonly string[];\n};\nfunction uniqueExactOrPrefix<T>(candidates: readonly T[], selector: string, id: (candidate: T) => string): readonly T[] {\n const exact = candidates.find((candidate) => id(candidate) === selector);\n return exact === undefined\n ? candidates.filter((candidate) => id(candidate).startsWith(selector))\n : [exact];\n}\nfunction debugAgentRun(experiment: DiscoveredExperiment, evalId: string): AgentRun {\n return {\n agent: experiment.agent,\n model: experiment.model,\n reasoningEffort: experiment.reasoningEffort,\n flags: experiment.flags ?? {},\n plugins: experiment.plugins,\n attempts: experiment.attempts ?? 1,\n earlyExit: experiment.earlyExit ?? false,\n sandbox: experiment.sandbox,\n sandboxReuse: experiment.sandboxReuse,\n ...(experiment.sharedState === undefined ? {} : { sharedState: experiment.sharedState }),\n judge: experiment.judge,\n ...resolveRunTimeout(undefined, experiment.timeoutMs),\n budget: experiment.budget,\n selectedEvalIds: [evalId],\n experimentId: experiment.id,\n experimentBaseDir: experiment.baseDir,\n experimentSourcePath: experiment.sourcePath,\n description: experiment.description,\n labels: experiment.labels,\n maxConcurrency: experiment.maxConcurrency,\n setup: experiment.setup,\n teardown: experiment.teardown,\n classifyFailure: experiment.classifyFailure,\n };\n}\n/**\n * Closes selector resolution, physical planning, and command-plan projection\n * inside the Experiment Host. It deliberately does not construct a Record\n * root, enter a lease, read history, or invoke an author callback.\n */\nfunction debug(input: ExperimentHostDebugPlanRequest): Effect.Effect<ExperimentHostDebugPlanResult, unknown> {\n return Effect.gen(function* () {\n const config = yield* Effect.tryPromise({\n try: () => loadConfigFile(input.cwd),\n catch: (cause) => cause,\n });\n const listed = yield* list({ cwd: input.cwd });\n const selectedExperiments = uniqueExactOrPrefix(listed.selections, input.experimentSelector, ({ experiment }) => experiment.id).slice().sort((left, right) => left.experiment.id.localeCompare(right.experiment.id));\n if (selectedExperiments.length === 0) {\n return Object.freeze({\n status: \"experiment-no-match\" as const,\n selector: input.experimentSelector,\n candidates: Object.freeze([...listed.experimentIds].sort()),\n });\n }\n if (selectedExperiments.length > 1) {\n return Object.freeze({\n status: \"experiment-ambiguous\" as const,\n selector: input.experimentSelector,\n candidates: Object.freeze(selectedExperiments.map(({ experiment }) => experiment.id)),\n });\n }\n const selection = selectedExperiments[0]!;\n const experiment = selection.experiment;\n const selectorEvalIds = new Set(selection.selectorEvalIds);\n const selectorEvals = listed.evals.filter((evalDef) => selectorEvalIds.has(evalDef.id));\n const selectedEvals = uniqueExactOrPrefix(selectorEvals, input.evalSelector, (evalDef) => evalDef.id)\n .slice().sort((left, right) => left.id.localeCompare(right.id));\n if (selectedEvals.length === 0) {\n return Object.freeze({\n status: \"eval-no-match\" as const,\n selector: input.evalSelector,\n experimentId: experiment.id,\n candidates: Object.freeze(selectorEvals.map((evalDef) => evalDef.id).sort()),\n });\n }\n if (selectedEvals.length > 1) {\n return Object.freeze({\n status: \"eval-ambiguous\" as const,\n selector: input.evalSelector,\n experimentId: experiment.id,\n candidates: Object.freeze(selectedEvals.map((evalDef) => evalDef.id)),\n });\n }\n const evalDef = selectedEvals[0]!;\n const run = debugAgentRun(experiment, evalDef.id);\n const target = yield* planProjectTarget(listed.evals, [run], config.timeoutMs, { configJudge: config.judge });\n const commandPlan = assembleCommandPlan({\n rows: [{\n experimentId: experiment.id,\n evalId: evalDef.id,\n ...(evalDef.evalGroup === undefined ? {} : { evalGroupId: evalDef.evalGroup.id }),\n attempts: run.attempts,\n dispatch: [{ attempts: Array.from({ length: run.attempts }, (_, attempt) => attempt) }],\n }],\n preparedPairsByKey: target.preparedPairsByKey,\n });\n return Object.freeze({\n status: \"planned\" as const,\n experimentId: experiment.id,\n evalId: evalDef.id,\n commandPlan,\n });\n });\n}\nexport interface ExperimentHostPlanRequest {\n readonly evals: readonly DiscoveredEval[];\n readonly agentRuns: readonly AgentRun[];\n readonly config: Config;\n readonly recordRoot: RecordRoot;\n readonly rerun?: \"failed\" | \"all\";\n readonly keepSandbox?: \"failed\" | \"all\";\n /** Omit for a dispatch plan; include only for the read-only `exp --dry` path. */\n readonly previewStartedAt?: number;\n}\nexport interface ExperimentHostCurrentPlan {\n readonly slots: readonly ExecutionReusePlanSlot[];\n readonly readbacks: readonly CurrentReuseReadbackSnapshot[];\n}\nexport interface ExperimentHostPlan {\n readonly target: ProjectTargetPlan;\n readonly current?: ExperimentHostCurrentPlan;\n}\n/**\n * Reuses the production physical planner and frozen Record reuse planner.\n * It never creates a Run; current history is read only when a dry preview was\n * explicitly requested.\n */\nfunction plan(input: ExperimentHostPlanRequest) {\n return Effect.gen(function* () {\n const target = yield* planProjectTarget(input.evals, input.agentRuns, input.config.timeoutMs, {\n configJudge: input.config.judge,\n ...(input.keepSandbox === undefined ? {} : { keepSandbox: input.keepSandbox }),\n });\n const reuse = yield* prepareRunnerRecordReuse({\n evals: input.evals,\n runs: input.agentRuns,\n config: { timeoutMs: input.config.timeoutMs },\n plannedFingerprints: target.plannedFingerprints,\n plannedConfigHashes: target.plannedConfigHashes,\n ...(input.rerun === undefined ? {} : { rerun: input.rerun }),\n ...(input.keepSandbox === undefined ? {} : { keepSandbox: input.keepSandbox }),\n });\n const current = input.previewStartedAt === undefined\n ? undefined\n : yield* withRunnerCurrentReusePreview({\n recordRoot: input.recordRoot,\n startedAt: input.previewStartedAt,\n evals: input.evals,\n runs: input.agentRuns,\n reuse,\n use: ({ reusePlan, readReadbacks }) => readReadbacks().pipe(Effect.map((readbacks): ExperimentHostCurrentPlan => Object.freeze({\n slots: Object.freeze([...reusePlan.slots]),\n readbacks: Object.freeze(readbacks.map(projectCurrentReuseReadback)),\n }))),\n });\n return Object.freeze({\n target,\n ...(current === undefined ? {} : { current }),\n });\n });\n}\n/** The existing Runner remains the one execution implementation. */\nfunction run<AttachmentError, AttachmentRequirements>(input: RunOptions<AttachmentError, AttachmentRequirements>) {\n return runEvals(input);\n}\n/** The existing adoption flow remains the one acceptance implementation. */\nfunction accept(input: AcceptLocatorsOptions) {\n return acceptLocators(input);\n}\nexport interface ExperimentHostSDK {\n readonly list: typeof list;\n readonly plan: typeof plan;\n readonly debug: typeof debug;\n readonly run: typeof run;\n readonly accept: typeof accept;\n}\n/** The fixed public Host surface; discovery, Runner, and adoption internals stay private. */\nexport const experimentHost: ExperimentHostSDK = Object.freeze({\n list,\n plan,\n debug,\n run,\n accept,\n});\n"]}
package/dist/i18n/en.cjs CHANGED
@@ -146,7 +146,7 @@ exports.en = {
146
146
  "Run `niceeval exp <selection> --dry` to see which entries each one blocks.\n",
147
147
  "cli.flag.invalidNumber": "Flag --{{flag}} expects a number, got \"{{value}}\".\n",
148
148
  "cli.flag.outputRemoved": "error: unknown option '--output'\n fix: run without a flag for human text; use --json for the machine feed\n",
149
- "cli.flag.strictRemoved": "Unknown option: --strict\nExpress required facts with t.check(...) or await t.require(...) in the Eval source.\n",
149
+ "cli.flag.strictRemoved": "Unknown option: --strict\nExpress required facts with t.check(...) or await t.check(...).orStop() in the Eval source.\n",
150
150
  "runner.budgetUnenforceable": "budget for {{budgetKey}}: several attempts completed without any cost data (agent reports no usage and the model is not in the price table) — the budget cannot be enforced for this agent; continuing without the guard.\n",
151
151
  "runner.experimentTeardownFailed": "teardown for experiment {{experimentId}} failed: {{message}}. Record are unaffected, but host-side resources started by this experiment may not have been released; check manually.\n",
152
152
  "runner.cleanupTimeout": "cleanup timed out after {{timeoutMs}}ms\n",
@@ -154,7 +154,16 @@ exports.en = {
154
154
  "runner.experimentTeardownLate": "experiment {{experimentId}}'s teardown was not triggered by the normal countdown path; it has been executed by the end-of-run sweep instead. Record are unaffected; seeing this line means an unlocated intermittent scheduling issue fired — please record this run in the memory ledger.\n",
155
155
  "runner.teardownRegistrationWriteFailed": "writing the crash-recovery teardown registration for experiment {{experimentId}} failed: {{message}}. The run continues normally, but a SIGKILL during this run cannot be recovered via `niceeval exp --teardown` or the startup self-heal — check disk space/permissions under .niceeval/teardowns/.\n",
156
156
  "runner.coordinationRecovered": "recovered expired coordination state for {{experimentId}}; this run continues. Further recoveries are summarized at completion.\n",
157
- "runner.gateLeaseWaiting": "waiting on another run for experiment {{experimentId}}'s concurrency slots: all {{effectiveN}} in use ({{holders}}). Concurrent runs share this experiment's slots, and the smallest maxConcurrency in play wins — this run declared {{declaredN}}. This run will dispatch when a slot is released or its owner's heartbeat expires.\n",
157
+ "runner.sharedStateWaiting": "waiting for sharedState key {{key}} to be released; this Invocation will not take it over automatically.\n",
158
+ "runner.sharedStateRecoveryRequired": "sharedState key {{key}} requires explicit recovery before another Invocation can use it. Inspect immutable owner evidence with `niceeval exp <selector> --teardown --recover-shared-state <key>`.\n",
159
+ "runner.sharedStateExplicitRecovered": "explicitly recovered sharedState key {{key}} for experiment {{experimentId}}.\n",
160
+ "cli.exp.sharedStateRecoveryFlags": "sharedState recovery requires `--teardown --recover-shared-state <key> --owner-token <token> --confirm-owner-terminated --confirm-remote-quiesced`.\n",
161
+ "cli.exp.sharedStateRecoveryJsonUnsupported": "error: explicit sharedState recovery does not support --json. Retry without --json; this recovery flow has a human-only interface.\n",
162
+ "cli.exp.sharedStateRecoveryTeardownRequired": "error: sharedState recovery requires the selected Experiment {{experimentId}} to declare teardown as a function. The active generation was left unchanged.\n",
163
+ "cli.exp.sharedStateRecoveryTarget": "sharedState recovery target:\n key: {{key}}\n experiment: {{experimentId}}\n owner token: {{ownerToken}}\n host: {{host}}\n PID: {{pid}}\n process identity: {{processIdentity}}\n heartbeat: {{heartbeatAt}}\n",
164
+ "cli.exp.sharedStateRecoveryAlreadyReleased": "sharedState key {{key}} was already released after its cleanup; its immutable recovery generation is already complete.\n",
165
+ "cli.exp.sharedStateRecoveryRegistrationFailed": "error: sharedState recovery for {{key}} could not clear the exact interrupted teardown registration: {{message}}. The recovery generation remains closed.\n",
166
+ "cli.exp.sharedStateRecoveryAlreadyReleasedRegistrationFailed": "error: sharedState key {{key}} was already released, but NiceEval could not clear the exact stale teardown registration: {{message}}. It did not rerun teardown.\n",
158
167
  "runner.dispatchHaltedExperiment": "experiment halted (dispatch-halted): {{message}}\n",
159
168
  "runner.dispatchHaltedEval": "eval halted: {{message}}\n",
160
169
  "judge.modelMissing": "No judge model configured. Set it in the Experiment, Eval, or defineConfig judge config (there is no built-in default model, and no environment variable for it).\n" +
@@ -175,6 +184,11 @@ exports.en = {
175
184
  " --dry preview without writing; --record <root> select the actual Record root; --json one JSON document\n" +
176
185
  " --teardown recover a killed run: run only the selected experiments'\n" +
177
186
  " teardown (no attempts, no setup); combining it with eval id prefixes is an error\n" +
187
+ " explicit sharedState recovery:\n" +
188
+ " niceeval exp <selector> --teardown --recover-shared-state <key>\n" +
189
+ " --owner-token <token> --confirm-owner-terminated --confirm-remote-quiesced\n" +
190
+ " reads immutable owner evidence from <key>; the selected Experiment must declare a teardown function\n" +
191
+ " (its current sharedState declaration may have changed); inspect or recover with human text (not --json)\n" +
178
192
  " niceeval debug <experiment> <eval> [--json] show the lifecycle command plan\n" +
179
193
  " niceeval accept @<locator>... accept explicit historical results\n" +
180
194
  " niceeval show [--run <run-id>...] render a Report in the terminal\n" +
@@ -182,13 +196,13 @@ exports.en = {
182
196
  " --experiment <id> is repeatable and narrows that current target\n" +
183
197
  " --run <run-id> is repeatable and audits complete historical ids only\n" +
184
198
  " --record <root> selects the actual Record root (default: .niceeval/record)\n" +
185
- " --report overview (or omit it) uses the built-in overview; --page <route>\n" +
199
+ " --report standard (or omit it) uses the built-in standard report; --page <route>\n" +
186
200
  " selects an exact Report route; --json emits one Report show document\n" +
187
201
  " niceeval list list discovered evals\n" +
188
202
  " niceeval session list [--all] [experiment-prefix] query Sessions (read-only)\n" +
189
203
  " niceeval session show <sessionId> show one Session (read-only)\n" +
190
204
  " niceeval view [--run <run-id>...] [--out dir] [--port n] [--no-open]\n" +
191
- " uses the same Record selection and built-in overview as show; live mode\n" +
205
+ " uses the same Record selection and built-in standard report as show; live mode\n" +
192
206
  " binds loopback only and rebuilds fixed ReportExecutions on Record changes\n" +
193
207
  " --out <dir> exports one completed static site and starts no server\n" +
194
208
  " niceeval sandbox list|enter|history|diff|stop inspect & destroy sandboxes kept by --keep-sandbox\n" +
@@ -281,7 +295,9 @@ exports.en = {
281
295
  "define.experimentAgentRequired": "defineExperiment requires agent.",
282
296
  "define.experimentFlagNotJson": "experiment.flags.{{key}} is not JSON-serializable (functions / undefined / cycles / bigint are not allowed); flags are persisted verbatim into result runs and must be plain JSON.",
283
297
  "define.experimentLabelInvalid": "experiment.labels.{{key}} must be a string or a finite number; labels are report-side grouping coordinates persisted verbatim into result runs.",
298
+ "define.experimentSharedStateInvalid": "experiment.sharedState must be exactly { key }, where key is a stable, non-secret string matching [a-z0-9][a-z0-9._/-]{0,127}.",
284
299
  "define.experimentSetupNotFunction": "experiment.setup must be a function ((ctx) => void); use experiment.teardown for cleanup; to prepare the in-sandbox environment per experiment, chain .setup() hooks on the sandbox spec instead.",
300
+ "define.experimentTeardownNotFunction": "Experiment teardown must be a function ((ctx) => void); use a function-valued paired lifecycle hook so normal cleanup and explicit sharedState recovery can both execute it.",
285
301
  "define.experimentClassifyFailureNotFunction": "experiment.classifyFailure must be a function ((failure) => FailureClass | undefined); it classifies failures that surface as third-party errors and must return undefined for anything it does not recognize.",
286
302
  "define.experimentIdRejected": "defineExperiment does not accept id; ids are derived from file paths.",
287
303
  "define.sandboxAgentNameRequired": "defineSandboxAgent requires name.",
@@ -316,14 +332,16 @@ exports.en = {
316
332
  "feedback.human.resultIncomplete": "INCOMPLETE",
317
333
  "feedback.human.resultInterrupted": "INTERRUPTED",
318
334
  "feedback.human.resultPassed": "PASSED",
335
+ "feedback.human.resultScored": "SCORED",
336
+ "feedback.human.resultErrored": "ERRORED",
337
+ "feedback.human.resultCompleted": "COMPLETED",
319
338
  "feedback.human.recoveryHeader": "RECOVERY",
320
- "feedback.human.coordinationRecoveredSummary": "{{slots}} · {{locks}}",
321
- "feedback.human.unit.concurrencySlot": "concurrency slot",
322
- "feedback.human.unit.concurrencySlots": "concurrency slots",
323
339
  "feedback.human.unit.caseLock": "case lock",
324
340
  "feedback.human.unit.caseLocks": "case locks",
325
341
  "feedback.human.resultsHeader": "RESULTS",
342
+ "feedback.human.errorsHeader": "ERRORS",
326
343
  "feedback.human.resultsMore": "… {{count}} more",
344
+ "feedback.human.scoreSummaryLine": "{{scored}} scored · {{skipped}} skipped · {{errored}} errored ({{reused}} reused)",
327
345
  "feedback.human.reuse": "{{reused}} of {{total}} carried in from cache · {{toRun}} to run",
328
346
  "feedback.human.summaryLine": "{{passed}} passed · {{failed}} failed · {{errored}} errored ({{reused}} reused)",
329
347
  "feedback.human.summaryIncompleteLine": "{{passed}} passed · {{failed}} failed · {{errored}} errored · {{unstarted}} unstarted ({{reused}} reused)",
@@ -367,7 +385,7 @@ exports.en = {
367
385
  "hitl.invalidOption": "Answer \"{{optionId}}\" is not an option of request {{requestId}} ({{options}}).",
368
386
  "hitl.noOptions": "this request has no options",
369
387
  "hitl.requestMissingId": "This input.requested request has no stable id, so a response cannot be built — the adapter must give every pending request a stable id.",
370
- "hitl.respondAllEmpty": "There is no pending input.requested request; respond() / respondAll() cannot work. Confirm the turn parked with t.parked(), then answer via t.requireInputRequest() or t.respond().",
388
+ "hitl.respondAllEmpty": "There is no pending input.requested request; respond() / respondAll() cannot work. Confirm the turn has status waiting, then answer via t.requireInputRequest() or t.respond().",
371
389
  "hitl.respondEmpty": "t.respond(...) requires at least one answer.",
372
390
  "hitl.stringAmbiguous": "There are {{count}} pending input requests; a plain-string answer cannot be matched to one. Use the { request, optionId } or { request, text } object form to name it explicitly.",
373
391
  "judge.apiKeyMissing": "judge is missing an API key: set NICEEVAL_JUDGE_KEY, or point judge.apiKeyEnv at another environment variable.",