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
@@ -58,6 +58,13 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
58
58
  * 分类照常决议、只是无人消费。回调必须不抛错:它跑在 attempt 的失败路径上,不得掩盖原始失败。
59
59
  */
60
60
  onFailureClass?: (declaration: AttemptFailureDeclaration) => void;
61
+ /**
62
+ * A fresh Sandbox owns its physical Scope inside this Attempt. Its lifecycle
63
+ * hooks normally turn cleanup errors into diagnostics so the remaining
64
+ * finalizers can run; an Experiment with sharedState must still retain that
65
+ * terminal cleanup fact until it decides whether releasing its lease is safe.
66
+ */
67
+ onFreshSandboxCleanupFailure?: (failure: FreshSandboxCleanupFailure) => void;
61
68
  /**
62
69
  * Invocation coordination may consume the single sealed Assert-first result
63
70
  * here and pass it to EvaluationRecordContract. The Attempt never opens a
@@ -71,7 +78,12 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
71
78
  reuseOrdinal: number;
72
79
  };
73
80
  }
74
- export declare function runAttemptEffect<SealRequirements, AttachmentError, AttachmentRequirements>(a: Attempt, opts: RunOptions<AttachmentError, AttachmentRequirements>, sandboxSem: Effect.Semaphore, { buildLocators, runTiming, parentSignal, invocationSignal, onPhase, concurrencySlot, onFailureClass, onSealedEvaluation, reusedSandbox, }: RunAttemptEffectOptions<SealRequirements>): Effect.Effect<EvalResult, never, SealRequirements | Exclude<SealRequirements, import("effect/Scope").Scope>>;
81
+ /** Internal handoff from a fresh Attempt Scope to its owning Experiment lifecycle. */
82
+ export interface FreshSandboxCleanupFailure {
83
+ readonly stage: "sandbox.lifecycle" | "sandbox.stop";
84
+ readonly error: Error;
85
+ }
86
+ export declare function runAttemptEffect<SealRequirements, AttachmentError, AttachmentRequirements>(a: Attempt, opts: RunOptions<AttachmentError, AttachmentRequirements>, sandboxSem: Effect.Semaphore, { buildLocators, runTiming, parentSignal, invocationSignal, onPhase, concurrencySlot, onFailureClass, onFreshSandboxCleanupFailure, onSealedEvaluation, reusedSandbox, }: RunAttemptEffectOptions<SealRequirements>): Effect.Effect<EvalResult, never, SealRequirements | Exclude<SealRequirements, import("effect/Scope").Scope>>;
75
87
  /** Runner-originated failures before Fact folding still produce a closed Score terminal outcome. */
76
88
  export declare function scoreFactOutcomeForAttemptError(error: AttemptError): import("../assertions/types.cjs").ScoreFactAttemptOutcome;
77
89
  /** 把 catch 到的 e(body 里 test()/setup 抛错,或 Sample 层 squash 出来的原始错误)折成
@@ -58,6 +58,13 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
58
58
  * 分类照常决议、只是无人消费。回调必须不抛错:它跑在 attempt 的失败路径上,不得掩盖原始失败。
59
59
  */
60
60
  onFailureClass?: (declaration: AttemptFailureDeclaration) => void;
61
+ /**
62
+ * A fresh Sandbox owns its physical Scope inside this Attempt. Its lifecycle
63
+ * hooks normally turn cleanup errors into diagnostics so the remaining
64
+ * finalizers can run; an Experiment with sharedState must still retain that
65
+ * terminal cleanup fact until it decides whether releasing its lease is safe.
66
+ */
67
+ onFreshSandboxCleanupFailure?: (failure: FreshSandboxCleanupFailure) => void;
61
68
  /**
62
69
  * Invocation coordination may consume the single sealed Assert-first result
63
70
  * here and pass it to EvaluationRecordContract. The Attempt never opens a
@@ -71,7 +78,12 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
71
78
  reuseOrdinal: number;
72
79
  };
73
80
  }
74
- export declare function runAttemptEffect<SealRequirements, AttachmentError, AttachmentRequirements>(a: Attempt, opts: RunOptions<AttachmentError, AttachmentRequirements>, sandboxSem: Effect.Semaphore, { buildLocators, runTiming, parentSignal, invocationSignal, onPhase, concurrencySlot, onFailureClass, onSealedEvaluation, reusedSandbox, }: RunAttemptEffectOptions<SealRequirements>): Effect.Effect<EvalResult, never, SealRequirements | Exclude<SealRequirements, import("effect/Scope").Scope>>;
81
+ /** Internal handoff from a fresh Attempt Scope to its owning Experiment lifecycle. */
82
+ export interface FreshSandboxCleanupFailure {
83
+ readonly stage: "sandbox.lifecycle" | "sandbox.stop";
84
+ readonly error: Error;
85
+ }
86
+ export declare function runAttemptEffect<SealRequirements, AttachmentError, AttachmentRequirements>(a: Attempt, opts: RunOptions<AttachmentError, AttachmentRequirements>, sandboxSem: Effect.Semaphore, { buildLocators, runTiming, parentSignal, invocationSignal, onPhase, concurrencySlot, onFailureClass, onFreshSandboxCleanupFailure, onSealedEvaluation, reusedSandbox, }: RunAttemptEffectOptions<SealRequirements>): Effect.Effect<EvalResult, never, SealRequirements | Exclude<SealRequirements, import("effect/Scope").Scope>>;
75
87
  /** Runner-originated failures before Fact folding still produce a closed Score terminal outcome. */
76
88
  export declare function scoreFactOutcomeForAttemptError(error: AttemptError): import("../assertions/types.mjs").ScoreFactAttemptOutcome;
77
89
  /** 把 catch 到的 e(body 里 test()/setup 抛错,或 Sample 层 squash 出来的原始错误)折成
@@ -58,6 +58,13 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
58
58
  * 分类照常决议、只是无人消费。回调必须不抛错:它跑在 attempt 的失败路径上,不得掩盖原始失败。
59
59
  */
60
60
  onFailureClass?: (declaration: AttemptFailureDeclaration) => void;
61
+ /**
62
+ * A fresh Sandbox owns its physical Scope inside this Attempt. Its lifecycle
63
+ * hooks normally turn cleanup errors into diagnostics so the remaining
64
+ * finalizers can run; an Experiment with sharedState must still retain that
65
+ * terminal cleanup fact until it decides whether releasing its lease is safe.
66
+ */
67
+ onFreshSandboxCleanupFailure?: (failure: FreshSandboxCleanupFailure) => void;
61
68
  /**
62
69
  * Invocation coordination may consume the single sealed Assert-first result
63
70
  * here and pass it to EvaluationRecordContract. The Attempt never opens a
@@ -71,7 +78,12 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
71
78
  reuseOrdinal: number;
72
79
  };
73
80
  }
74
- export declare function runAttemptEffect<SealRequirements, AttachmentError, AttachmentRequirements>(a: Attempt, opts: RunOptions<AttachmentError, AttachmentRequirements>, sandboxSem: Effect.Semaphore, { buildLocators, runTiming, parentSignal, invocationSignal, onPhase, concurrencySlot, onFailureClass, onSealedEvaluation, reusedSandbox, }: RunAttemptEffectOptions<SealRequirements>): Effect.Effect<EvalResult, never, SealRequirements | Exclude<SealRequirements, import("effect/Scope").Scope>>;
81
+ /** Internal handoff from a fresh Attempt Scope to its owning Experiment lifecycle. */
82
+ export interface FreshSandboxCleanupFailure {
83
+ readonly stage: "sandbox.lifecycle" | "sandbox.stop";
84
+ readonly error: Error;
85
+ }
86
+ export declare function runAttemptEffect<SealRequirements, AttachmentError, AttachmentRequirements>(a: Attempt, opts: RunOptions<AttachmentError, AttachmentRequirements>, sandboxSem: Effect.Semaphore, { buildLocators, runTiming, parentSignal, invocationSignal, onPhase, concurrencySlot, onFailureClass, onFreshSandboxCleanupFailure, onSealedEvaluation, reusedSandbox, }: RunAttemptEffectOptions<SealRequirements>): Effect.Effect<EvalResult, never, SealRequirements | Exclude<SealRequirements, import("effect/Scope").Scope>>;
75
87
  /** Runner-originated failures before Fact folding still produce a closed Score terminal outcome. */
76
88
  export declare function scoreFactOutcomeForAttemptError(error: AttemptError): import("../assertions/types.js").ScoreFactAttemptOutcome;
77
89
  /** 把 catch 到的 e(body 里 test()/setup 抛错,或 Sample 层 squash 出来的原始错误)折成
@@ -28,12 +28,14 @@ function freezeJson(value) {
28
28
  return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, freezeJson(entry)])));
29
29
  }
30
30
  function freezeConfigIdentity(identity) {
31
+ const { sharedState, ...withoutSharedState } = identity;
31
32
  return Object.freeze({
32
- ...identity,
33
+ ...withoutSharedState,
33
34
  model: Object.freeze(identity.model),
34
35
  reasoningEffort: Object.freeze(identity.reasoningEffort),
35
36
  flags: freezeJson({ ...identity.flags }),
36
37
  plugins: freezeJson(identity.plugins),
38
+ ...(sharedState === undefined ? {} : { sharedState }),
37
39
  sandboxLayer: freezeJson(identity.sandboxLayer),
38
40
  judge: identity.judge._tag === "Unconfigured"
39
41
  ? Object.freeze({ _tag: "Unconfigured" })
@@ -104,6 +106,7 @@ function configIdentityForRun(run, plan, judge = run.judge) {
104
106
  flags: run.flags,
105
107
  plugins: run.pluginBehavior ?? [],
106
108
  sandboxReuse: run.sandboxReuse ?? false,
109
+ ...(run.sharedState === undefined ? {} : { sharedState: run.sharedState.key }),
107
110
  sandboxLayer: (0, link_ts_1.sandboxLayerIdentityFor)(plan.pair, "experiment"),
108
111
  judge: judgeIdentity(judge),
109
112
  agentInstalls: agentInstallPlansForRun(run),
@@ -124,13 +127,14 @@ function configIdentityFromResult(result) {
124
127
  flags: exp.flags ?? {},
125
128
  plugins: exp.plugins ?? [],
126
129
  sandboxReuse: exp.sandboxReuse ?? false,
130
+ ...(exp.sharedState === undefined ? {} : { sharedState: exp.sharedState.key }),
127
131
  sandboxLayer: exp.sandboxLayer,
128
132
  judge: judgeIdentity(exp.judge),
129
133
  agentInstalls: exp.agentInstalls,
130
134
  });
131
135
  }
132
136
  /**
133
- * 身份 → 字段路径表。可省略配置先归一为完整 ADT,再由 `_tag` 决定是否产生字段路径。
137
+ * 身份 → 字段路径表。真正未声明的配置不会生成对象键或字段路径。
134
138
  */
135
139
  function flatten(identity) {
136
140
  const out = new Map();
@@ -143,6 +147,8 @@ function flatten(identity) {
143
147
  putDeclared("model", identity.model);
144
148
  putDeclared("reasoningEffort", identity.reasoningEffort);
145
149
  put("sandboxReuse", identity.sandboxReuse);
150
+ if (identity.sharedState !== undefined)
151
+ put("sharedState.key", identity.sharedState);
146
152
  for (const [key, value] of Object.entries(identity.flags))
147
153
  put(`flags.${key}`, value);
148
154
  put("plugins", identity.plugins);
@@ -242,6 +248,7 @@ function counterfactualConfigIdentity(current, historical, accepted) {
242
248
  else
243
249
  agentInstalls = historical.agentInstalls;
244
250
  }
251
+ const sharedState = accepted.has("config:sharedState.key") ? historical.sharedState : current.sharedState;
245
252
  return freezeConfigIdentity({
246
253
  agent: accepted.has("config:agent") ? historical.agent : current.agent,
247
254
  model: accepted.has("config:model") ? historical.model : current.model,
@@ -251,6 +258,7 @@ function counterfactualConfigIdentity(current, historical, accepted) {
251
258
  flags,
252
259
  plugins,
253
260
  sandboxReuse: accepted.has("config:sandboxReuse") ? historical.sandboxReuse : current.sandboxReuse,
261
+ ...(sharedState === undefined ? {} : { sharedState }),
254
262
  sandboxLayer,
255
263
  judge,
256
264
  agentInstalls,
@@ -1 +1 @@
1
- {"version":3,"file":"config-identity.js","sourceRoot":"","sources":["config-identity.ts"],"names":[],"mappings":"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","sourcesContent":["// 配置身份的字段级投影:`configHash` 的哈希输入本身,加上「同一份输入怎样按字段路径比对」。\n//\n// 哈希只回答「等不等」,回答不了「哪里变了」。`--accept config:<字段路径>` 与 `--dry` 的逐条\n// 作废原因都要后一个答案,而两侧必须来自同一份字段集合——configHash 里有的字段,这里就能按\n// 点路径指名;这里指不出来的路径,`--accept` 也就没有对应的差异可授权。\n//\n// 历史侧的同名投影从落盘重建(`ExperimentRunInfo` + 结果顶层的 agent/model),这正是\n// 「进 configHash 的字段必须落进 run.json」那条规则存在的理由。\nimport type { LinkedRunPlan } from \"../sandbox/plan.ts\";\nimport { sandboxLayerIdentityFor } from \"../sandbox/link.ts\";\nimport type { AgentIdentity, AgentInstaller } from \"../agents/types.ts\";\nimport type { EvalResult, JsonValue, JudgeConfig, ResolvedJudgeConfig } from \"../types.ts\";\nimport type { AgentRun } from \"./types.ts\";\n/**\n * 一次运行的**配置身份**:`computeConfigHash` 的哈希输入,字段集合与\n * docs/feature/experiments/cache.md「指纹:两个哈希嵌套」逐字对应。\n *\n * 键恒存在(值可以是 `undefined`):稳定序列化把键本身也算进字节,少一个键就是另一个哈希。\n * 新增公开配置字段时只在这里裁决一次「进不进 configHash」。\n */\nexport interface ConfigIdentity {\n readonly agent: string;\n readonly model: DeclaredConfigValue<string>;\n readonly reasoningEffort: DeclaredConfigValue<string>;\n readonly flags: Readonly<globalThis.Record<string, JsonValue>>;\n /** Credential-free Experiment Plugin and receiver behavior. */\n readonly plugins: JsonValue;\n readonly sandboxReuse: boolean;\n /** Experiment 作者 layer 身份;物理 provider plan 属于逐 Eval fingerprint,不进入 Run 级身份。 */\n readonly sandboxLayer: JsonValue;\n readonly judge: JudgeConfigIdentity;\n /** 声明顺序、精确 installer 配对、安装模式与计划目标平台的完整静态身份。 */\n readonly agentInstalls: readonly JsonValue[];\n}\nexport type DeclaredConfigValue<Value> = {\n readonly _tag: \"Omitted\";\n} | {\n readonly _tag: \"Configured\";\n readonly value: Value;\n};\nexport type JudgeConfigIdentity = {\n readonly _tag: \"Unconfigured\";\n} | {\n readonly _tag: \"Configured\";\n readonly model: DeclaredConfigValue<string>;\n readonly baseUrl: DeclaredConfigValue<string>;\n readonly apiKeyEnv: DeclaredConfigValue<string>;\n readonly timeoutMs: DeclaredConfigValue<number>;\n};\n/** manifest 相减得出的一条具名差异;`selector` 原样可复制进 `--accept`。 */\nexport type ConfigFieldDelta = {\n readonly _tag: \"Added\";\n readonly selector: string;\n readonly from?: never;\n readonly to: string;\n} | {\n readonly _tag: \"Removed\";\n readonly selector: string;\n readonly from: string;\n readonly to?: never;\n} | {\n readonly _tag: \"Changed\";\n readonly selector: string;\n readonly from: string;\n readonly to: string;\n};\nexport function addedConfigField(selector: string, to: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Added\", selector, to });\n}\nexport function removedConfigField(selector: string, from: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Removed\", selector, from });\n}\nexport function changedConfigField(selector: string, from: string, to: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Changed\", selector, from, to });\n}\nfunction freezeJson<Value extends JsonValue>(value: Value): Value {\n if (value === null || typeof value !== \"object\")\n return value;\n if (Array.isArray(value)) {\n return Object.freeze(value.map((entry) => freezeJson(entry))) as Value;\n }\n return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, freezeJson(entry)]))) as Value;\n}\nfunction freezeConfigIdentity(identity: ConfigIdentity): ConfigIdentity {\n return Object.freeze({\n ...identity,\n model: Object.freeze(identity.model),\n reasoningEffort: Object.freeze(identity.reasoningEffort),\n flags: freezeJson({ ...identity.flags }),\n plugins: freezeJson(identity.plugins),\n sandboxLayer: freezeJson(identity.sandboxLayer),\n judge: identity.judge._tag === \"Unconfigured\"\n ? Object.freeze({ _tag: \"Unconfigured\" as const })\n : Object.freeze({\n _tag: \"Configured\" as const,\n model: Object.freeze(identity.judge.model),\n baseUrl: Object.freeze(identity.judge.baseUrl),\n apiKeyEnv: Object.freeze(identity.judge.apiKeyEnv),\n timeoutMs: Object.freeze(identity.judge.timeoutMs),\n }),\n agentInstalls: Object.freeze(identity.agentInstalls.map((entry) => freezeJson(entry))),\n });\n}\nfunction sameAgentIdentity(left: AgentIdentity, right: AgentIdentity): boolean {\n return left.agent === right.agent && left.version === right.version && left.revision === right.revision;\n}\nfunction installerIdentity(installer: AgentInstaller | undefined): JsonValue {\n if (installer === undefined)\n return { _tag: \"Missing\" };\n return {\n _tag: \"Matched\",\n identity: {\n agent: installer.identity.agent,\n version: installer.identity.version,\n revision: installer.identity.revision,\n },\n installMode: installer.installMode,\n platforms: installer.platforms === undefined\n ? { _tag: \"All\" }\n : { _tag: \"Listed\", values: [...installer.platforms] },\n };\n}\n/** 计划期一次性冻结全部 ensure/installer 配对;运行事实与 staged digest 不反写配置身份。 */\nexport function agentInstallPlansForRun(run: AgentRun): readonly JsonValue[] {\n const agent = run.agent;\n if (agent.kind === \"direct\")\n return Object.freeze([]);\n return Object.freeze(agent.ensure.map((ensure, index) => freezeJson({\n order: index,\n ensure: {\n agent: ensure.identity.agent,\n version: ensure.identity.version,\n revision: ensure.identity.revision,\n },\n installer: installerIdentity(agent.installers.find((candidate) => sameAgentIdentity(candidate.identity, ensure.identity))),\n })));\n}\nfunction declaredString(value: string | undefined): DeclaredConfigValue<string> {\n return value === undefined ? { _tag: \"Omitted\" } : { _tag: \"Configured\", value };\n}\nfunction judgeIdentity(judge: JudgeConfig | ResolvedJudgeConfig | undefined): JudgeConfigIdentity {\n return judge === undefined\n ? { _tag: \"Unconfigured\" }\n : {\n _tag: \"Configured\",\n model: declaredString(judge.model),\n baseUrl: declaredString(judge.baseUrl),\n apiKeyEnv: declaredString(judge.apiKeyEnv),\n timeoutMs: judge.timeoutMs === undefined ? { _tag: \"Omitted\" } : { _tag: \"Configured\", value: judge.timeoutMs },\n };\n}\n/** 本次解析后配置的身份投影。 */\nexport function configIdentityForRun(run: AgentRun, plan: LinkedRunPlan, judge: JudgeConfig | ResolvedJudgeConfig | undefined = run.judge): ConfigIdentity {\n return freezeConfigIdentity({\n agent: run.agent.name,\n model: declaredString(run.model),\n reasoningEffort: declaredString(run.reasoningEffort),\n flags: run.flags,\n plugins: run.pluginBehavior ?? [],\n sandboxReuse: run.sandboxReuse ?? false,\n sandboxLayer: sandboxLayerIdentityFor(plan.pair, \"experiment\"),\n judge: judgeIdentity(judge),\n agentInstalls: agentInstallPlansForRun(run),\n });\n}\n/**\n * 历史条目的同一份投影,从落盘重建。缺 `ExperimentRunInfo`(第三方 harness 写的结果)时\n * 配置面无从重算,返回 `undefined`——差异算不出就如实算不出,不猜。\n */\nexport function configIdentityFromResult(result: EvalResult): ConfigIdentity | undefined {\n const exp = result.experiment;\n if (exp === undefined)\n return undefined;\n return freezeConfigIdentity({\n agent: result.agent,\n model: declaredString(result.model),\n reasoningEffort: declaredString(exp.reasoningEffort),\n flags: exp.flags ?? {},\n plugins: exp.plugins ?? [],\n sandboxReuse: exp.sandboxReuse ?? false,\n sandboxLayer: exp.sandboxLayer,\n judge: judgeIdentity(exp.judge),\n agentInstalls: exp.agentInstalls,\n });\n}\n/**\n * 身份 → 字段路径表。可省略配置先归一为完整 ADT,再由 `_tag` 决定是否产生字段路径。\n */\nfunction flatten(identity: ConfigIdentity): Map<string, JsonValue> {\n const out = new Map<string, JsonValue>();\n const put = (path: string, value: JsonValue): void => { out.set(path, value); };\n const putDeclared = <Value extends JsonValue>(path: string, value: DeclaredConfigValue<Value>): void => {\n if (value._tag === \"Configured\")\n put(path, value.value);\n };\n put(\"agent\", identity.agent);\n putDeclared(\"model\", identity.model);\n putDeclared(\"reasoningEffort\", identity.reasoningEffort);\n put(\"sandboxReuse\", identity.sandboxReuse);\n for (const [key, value] of Object.entries(identity.flags))\n put(`flags.${key}`, value);\n put(\"plugins\", identity.plugins);\n put(\"sandboxLayer\", identity.sandboxLayer);\n if (identity.judge._tag === \"Configured\") {\n putDeclared(\"judge.model\", identity.judge.model);\n putDeclared(\"judge.baseUrl\", identity.judge.baseUrl);\n putDeclared(\"judge.apiKeyEnv\", identity.judge.apiKeyEnv);\n putDeclared(\"judge.timeoutMs\", identity.judge.timeoutMs);\n }\n put(\"agentInstalls\", [...identity.agentInstalls]);\n return out;\n}\n/**\n * 身份的字段路径投影,供 manifest 的配置面落盘(见 `runner/manifest.ts`)。与差异比对读的是\n * 同一个 `flatten`:清单里指得出的路径,`--accept config:<路径>` 就授权得了,两侧不可能分叉。\n */\nexport function configIdentityPaths(identity: ConfigIdentity): Array<[\n string,\n JsonValue\n]> {\n return [...flatten(identity)];\n}\n/** 值的字符串投影:差异明细与 `carriedAccepting` 留痕共用完整值,有界呈现是人读 renderer(`feedback/human.ts`)的职责,不在构造点做。 */\nfunction serializeValue(value: JsonValue): string {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n/**\n * 历史侧与本次侧的字段级差异,按 selector 字典序。键的增删同样是一条差异。\n */\nexport function configDeltas(historical: ConfigIdentity, current: ConfigIdentity): ConfigFieldDelta[] {\n const from = flatten(historical);\n const to = flatten(current);\n const paths = [...new Set([...from.keys(), ...to.keys()])].sort();\n const out: ConfigFieldDelta[] = [];\n for (const path of paths) {\n const hasFrom = from.has(path);\n const hasTo = to.has(path);\n if (hasFrom && hasTo && JSON.stringify(from.get(path)) === JSON.stringify(to.get(path)))\n continue;\n const fromValue = from.get(path);\n const toValue = to.get(path);\n if (hasFrom && fromValue === undefined)\n throw new Error(`Missing historical config value for ${path}.`);\n if (hasTo && toValue === undefined)\n throw new Error(`Missing current config value for ${path}.`);\n const selector = `config:${path}`;\n if (!hasFrom)\n out.push(addedConfigField(selector, serializeValue(toValue!)));\n else if (!hasTo)\n out.push(removedConfigField(selector, serializeValue(fromValue!)));\n else\n out.push(changedConfigField(selector, serializeValue(fromValue!), serializeValue(toValue!)));\n }\n return out;\n}\n/**\n * 反事实身份:把本次身份里**被授权的那些字段**换回历史值,其余原样。\n *\n * 换出来的身份再算一次指纹,与历史条目落盘的那个相等,才证明「两侧只差这些被授权的字段」——\n * 授权因此不是绕开判据,而是把判据挪到一个明确写下来的口径上重算一次。\n *\n * `sandbox` / `judge` 是整对象进哈希的分组:键在不在本身改变字节,逐字段拼回去会造出两侧都\n * 不存在的形状。分组内**每一条**差异都被授权才整体换回历史对象,否则保持本次值——那样指纹\n * 自然对不上,条目照常重跑,不会静默跨过没被授权的那半。\n */\nexport function counterfactualConfigIdentity(current: ConfigIdentity, historical: ConfigIdentity, accepted: ReadonlySet<string>): ConfigIdentity {\n const differing = new Set(configDeltas(historical, current).map((d) => d.selector));\n const flags: globalThis.Record<string, JsonValue> = { ...current.flags };\n for (const selector of accepted) {\n if (!selector.startsWith(\"config:flags.\"))\n continue;\n const key = selector.slice(\"config:flags.\".length);\n if (Object.hasOwn(historical.flags, key)) {\n const value = historical.flags[key];\n if (value === undefined)\n throw new Error(`Missing historical flag value for ${key}.`);\n flags[key] = value;\n }\n else\n delete flags[key];\n }\n let sandboxLayer = current.sandboxLayer;\n let plugins = current.plugins;\n let judge = current.judge;\n let agentInstalls = current.agentInstalls;\n const rollbackGroups: readonly (\"sandboxLayer\" | \"plugins\" | \"judge\" | \"agentInstalls\")[] = [\n \"sandboxLayer\", \"plugins\", \"judge\", \"agentInstalls\",\n ];\n for (const group of rollbackGroups) {\n const paths = [...differing].filter((selector) => selector === `config:${group}` || selector.startsWith(`config:${group}.`));\n if (paths.length === 0 || !paths.every((selector) => accepted.has(selector)))\n continue;\n if (group === \"sandboxLayer\")\n sandboxLayer = historical.sandboxLayer;\n else if (group === \"plugins\")\n plugins = historical.plugins;\n else if (group === \"judge\")\n judge = historical.judge;\n else\n agentInstalls = historical.agentInstalls;\n }\n return freezeConfigIdentity({\n agent: accepted.has(\"config:agent\") ? historical.agent : current.agent,\n model: accepted.has(\"config:model\") ? historical.model : current.model,\n reasoningEffort: accepted.has(\"config:reasoningEffort\")\n ? historical.reasoningEffort\n : current.reasoningEffort,\n flags,\n plugins,\n sandboxReuse: accepted.has(\"config:sandboxReuse\") ? historical.sandboxReuse : current.sandboxReuse,\n sandboxLayer,\n judge,\n agentInstalls,\n });\n}\n"]}
1
+ {"version":3,"file":"config-identity.js","sourceRoot":"","sources":["config-identity.ts"],"names":[],"mappings":"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","sourcesContent":["// 配置身份的字段级投影:`configHash` 的哈希输入本身,加上「同一份输入怎样按字段路径比对」。\n//\n// 哈希只回答「等不等」,回答不了「哪里变了」。`--accept config:<字段路径>` 与 `--dry` 的逐条\n// 作废原因都要后一个答案,而两侧必须来自同一份字段集合——configHash 里有的字段,这里就能按\n// 点路径指名;这里指不出来的路径,`--accept` 也就没有对应的差异可授权。\n//\n// 历史侧的同名投影从落盘重建(`ExperimentRunInfo` + 结果顶层的 agent/model),这正是\n// 「进 configHash 的字段必须落进 run.json」那条规则存在的理由。\nimport type { LinkedRunPlan } from \"../sandbox/plan.ts\";\nimport { sandboxLayerIdentityFor } from \"../sandbox/link.ts\";\nimport type { AgentIdentity, AgentInstaller } from \"../agents/types.ts\";\nimport type { EvalResult, JsonValue, JudgeConfig, ResolvedJudgeConfig } from \"../types.ts\";\nimport type { AgentRun } from \"./types.ts\";\n/**\n * 一次运行的**配置身份**:`computeConfigHash` 的哈希输入,字段集合与\n * docs/feature/experiments/cache.md「指纹:两个哈希嵌套」逐字对应。\n *\n * 可选配置必须真的省略键,而不是写入 `undefined` 或一个 Omitted 哨兵;否则未声明配置会\n * 无端改变基础 configHash。新增公开配置字段时只在这里裁决一次「进不进 configHash」。\n */\nexport interface ConfigIdentity {\n readonly agent: string;\n readonly model: DeclaredConfigValue<string>;\n readonly reasoningEffort: DeclaredConfigValue<string>;\n readonly flags: Readonly<globalThis.Record<string, JsonValue>>;\n /** Credential-free Experiment Plugin and receiver behavior. */\n readonly plugins: JsonValue;\n readonly sandboxReuse: boolean;\n /** Stable public key for the shared-state mutex, never a secret or stored state. */\n readonly sharedState?: string;\n /** Experiment 作者 layer 身份;物理 provider plan 属于逐 Eval fingerprint,不进入 Run 级身份。 */\n readonly sandboxLayer: JsonValue;\n readonly judge: JudgeConfigIdentity;\n /** 声明顺序、精确 installer 配对、安装模式与计划目标平台的完整静态身份。 */\n readonly agentInstalls: readonly JsonValue[];\n}\nexport type DeclaredConfigValue<Value> = {\n readonly _tag: \"Omitted\";\n} | {\n readonly _tag: \"Configured\";\n readonly value: Value;\n};\nexport type JudgeConfigIdentity = {\n readonly _tag: \"Unconfigured\";\n} | {\n readonly _tag: \"Configured\";\n readonly model: DeclaredConfigValue<string>;\n readonly baseUrl: DeclaredConfigValue<string>;\n readonly apiKeyEnv: DeclaredConfigValue<string>;\n readonly timeoutMs: DeclaredConfigValue<number>;\n};\n/** manifest 相减得出的一条具名差异;`selector` 原样可复制进 `--accept`。 */\nexport type ConfigFieldDelta = {\n readonly _tag: \"Added\";\n readonly selector: string;\n readonly from?: never;\n readonly to: string;\n} | {\n readonly _tag: \"Removed\";\n readonly selector: string;\n readonly from: string;\n readonly to?: never;\n} | {\n readonly _tag: \"Changed\";\n readonly selector: string;\n readonly from: string;\n readonly to: string;\n};\nexport function addedConfigField(selector: string, to: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Added\", selector, to });\n}\nexport function removedConfigField(selector: string, from: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Removed\", selector, from });\n}\nexport function changedConfigField(selector: string, from: string, to: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Changed\", selector, from, to });\n}\nfunction freezeJson<Value extends JsonValue>(value: Value): Value {\n if (value === null || typeof value !== \"object\")\n return value;\n if (Array.isArray(value)) {\n return Object.freeze(value.map((entry) => freezeJson(entry))) as Value;\n }\n return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, freezeJson(entry)]))) as Value;\n}\nfunction freezeConfigIdentity(identity: ConfigIdentity): ConfigIdentity {\n const { sharedState, ...withoutSharedState } = identity;\n return Object.freeze({\n ...withoutSharedState,\n model: Object.freeze(identity.model),\n reasoningEffort: Object.freeze(identity.reasoningEffort),\n flags: freezeJson({ ...identity.flags }),\n plugins: freezeJson(identity.plugins),\n ...(sharedState === undefined ? {} : { sharedState }),\n sandboxLayer: freezeJson(identity.sandboxLayer),\n judge: identity.judge._tag === \"Unconfigured\"\n ? Object.freeze({ _tag: \"Unconfigured\" as const })\n : Object.freeze({\n _tag: \"Configured\" as const,\n model: Object.freeze(identity.judge.model),\n baseUrl: Object.freeze(identity.judge.baseUrl),\n apiKeyEnv: Object.freeze(identity.judge.apiKeyEnv),\n timeoutMs: Object.freeze(identity.judge.timeoutMs),\n }),\n agentInstalls: Object.freeze(identity.agentInstalls.map((entry) => freezeJson(entry))),\n });\n}\nfunction sameAgentIdentity(left: AgentIdentity, right: AgentIdentity): boolean {\n return left.agent === right.agent && left.version === right.version && left.revision === right.revision;\n}\nfunction installerIdentity(installer: AgentInstaller | undefined): JsonValue {\n if (installer === undefined)\n return { _tag: \"Missing\" };\n return {\n _tag: \"Matched\",\n identity: {\n agent: installer.identity.agent,\n version: installer.identity.version,\n revision: installer.identity.revision,\n },\n installMode: installer.installMode,\n platforms: installer.platforms === undefined\n ? { _tag: \"All\" }\n : { _tag: \"Listed\", values: [...installer.platforms] },\n };\n}\n/** 计划期一次性冻结全部 ensure/installer 配对;运行事实与 staged digest 不反写配置身份。 */\nexport function agentInstallPlansForRun(run: AgentRun): readonly JsonValue[] {\n const agent = run.agent;\n if (agent.kind === \"direct\")\n return Object.freeze([]);\n return Object.freeze(agent.ensure.map((ensure, index) => freezeJson({\n order: index,\n ensure: {\n agent: ensure.identity.agent,\n version: ensure.identity.version,\n revision: ensure.identity.revision,\n },\n installer: installerIdentity(agent.installers.find((candidate) => sameAgentIdentity(candidate.identity, ensure.identity))),\n })));\n}\nfunction declaredString(value: string | undefined): DeclaredConfigValue<string> {\n return value === undefined ? { _tag: \"Omitted\" } : { _tag: \"Configured\", value };\n}\nfunction judgeIdentity(judge: JudgeConfig | ResolvedJudgeConfig | undefined): JudgeConfigIdentity {\n return judge === undefined\n ? { _tag: \"Unconfigured\" }\n : {\n _tag: \"Configured\",\n model: declaredString(judge.model),\n baseUrl: declaredString(judge.baseUrl),\n apiKeyEnv: declaredString(judge.apiKeyEnv),\n timeoutMs: judge.timeoutMs === undefined ? { _tag: \"Omitted\" } : { _tag: \"Configured\", value: judge.timeoutMs },\n };\n}\n/** 本次解析后配置的身份投影。 */\nexport function configIdentityForRun(run: AgentRun, plan: LinkedRunPlan, judge: JudgeConfig | ResolvedJudgeConfig | undefined = run.judge): ConfigIdentity {\n return freezeConfigIdentity({\n agent: run.agent.name,\n model: declaredString(run.model),\n reasoningEffort: declaredString(run.reasoningEffort),\n flags: run.flags,\n plugins: run.pluginBehavior ?? [],\n sandboxReuse: run.sandboxReuse ?? false,\n ...(run.sharedState === undefined ? {} : { sharedState: run.sharedState.key }),\n sandboxLayer: sandboxLayerIdentityFor(plan.pair, \"experiment\"),\n judge: judgeIdentity(judge),\n agentInstalls: agentInstallPlansForRun(run),\n });\n}\n/**\n * 历史条目的同一份投影,从落盘重建。缺 `ExperimentRunInfo`(第三方 harness 写的结果)时\n * 配置面无从重算,返回 `undefined`——差异算不出就如实算不出,不猜。\n */\nexport function configIdentityFromResult(result: EvalResult): ConfigIdentity | undefined {\n const exp = result.experiment;\n if (exp === undefined)\n return undefined;\n return freezeConfigIdentity({\n agent: result.agent,\n model: declaredString(result.model),\n reasoningEffort: declaredString(exp.reasoningEffort),\n flags: exp.flags ?? {},\n plugins: exp.plugins ?? [],\n sandboxReuse: exp.sandboxReuse ?? false,\n ...(exp.sharedState === undefined ? {} : { sharedState: exp.sharedState.key }),\n sandboxLayer: exp.sandboxLayer,\n judge: judgeIdentity(exp.judge),\n agentInstalls: exp.agentInstalls,\n });\n}\n/**\n * 身份 → 字段路径表。真正未声明的配置不会生成对象键或字段路径。\n */\nfunction flatten(identity: ConfigIdentity): Map<string, JsonValue> {\n const out = new Map<string, JsonValue>();\n const put = (path: string, value: JsonValue): void => { out.set(path, value); };\n const putDeclared = <Value extends JsonValue>(path: string, value: DeclaredConfigValue<Value>): void => {\n if (value._tag === \"Configured\")\n put(path, value.value);\n };\n put(\"agent\", identity.agent);\n putDeclared(\"model\", identity.model);\n putDeclared(\"reasoningEffort\", identity.reasoningEffort);\n put(\"sandboxReuse\", identity.sandboxReuse);\n if (identity.sharedState !== undefined)\n put(\"sharedState.key\", identity.sharedState);\n for (const [key, value] of Object.entries(identity.flags))\n put(`flags.${key}`, value);\n put(\"plugins\", identity.plugins);\n put(\"sandboxLayer\", identity.sandboxLayer);\n if (identity.judge._tag === \"Configured\") {\n putDeclared(\"judge.model\", identity.judge.model);\n putDeclared(\"judge.baseUrl\", identity.judge.baseUrl);\n putDeclared(\"judge.apiKeyEnv\", identity.judge.apiKeyEnv);\n putDeclared(\"judge.timeoutMs\", identity.judge.timeoutMs);\n }\n put(\"agentInstalls\", [...identity.agentInstalls]);\n return out;\n}\n/**\n * 身份的字段路径投影,供 manifest 的配置面落盘(见 `runner/manifest.ts`)。与差异比对读的是\n * 同一个 `flatten`:清单里指得出的路径,`--accept config:<路径>` 就授权得了,两侧不可能分叉。\n */\nexport function configIdentityPaths(identity: ConfigIdentity): Array<[\n string,\n JsonValue\n]> {\n return [...flatten(identity)];\n}\n/** 值的字符串投影:差异明细与 `carriedAccepting` 留痕共用完整值,有界呈现是人读 renderer(`feedback/human.ts`)的职责,不在构造点做。 */\nfunction serializeValue(value: JsonValue): string {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n/**\n * 历史侧与本次侧的字段级差异,按 selector 字典序。键的增删同样是一条差异。\n */\nexport function configDeltas(historical: ConfigIdentity, current: ConfigIdentity): ConfigFieldDelta[] {\n const from = flatten(historical);\n const to = flatten(current);\n const paths = [...new Set([...from.keys(), ...to.keys()])].sort();\n const out: ConfigFieldDelta[] = [];\n for (const path of paths) {\n const hasFrom = from.has(path);\n const hasTo = to.has(path);\n if (hasFrom && hasTo && JSON.stringify(from.get(path)) === JSON.stringify(to.get(path)))\n continue;\n const fromValue = from.get(path);\n const toValue = to.get(path);\n if (hasFrom && fromValue === undefined)\n throw new Error(`Missing historical config value for ${path}.`);\n if (hasTo && toValue === undefined)\n throw new Error(`Missing current config value for ${path}.`);\n const selector = `config:${path}`;\n if (!hasFrom)\n out.push(addedConfigField(selector, serializeValue(toValue!)));\n else if (!hasTo)\n out.push(removedConfigField(selector, serializeValue(fromValue!)));\n else\n out.push(changedConfigField(selector, serializeValue(fromValue!), serializeValue(toValue!)));\n }\n return out;\n}\n/**\n * 反事实身份:把本次身份里**被授权的那些字段**换回历史值,其余原样。\n *\n * 换出来的身份再算一次指纹,与历史条目落盘的那个相等,才证明「两侧只差这些被授权的字段」——\n * 授权因此不是绕开判据,而是把判据挪到一个明确写下来的口径上重算一次。\n *\n * `sandbox` / `judge` 是整对象进哈希的分组:键在不在本身改变字节,逐字段拼回去会造出两侧都\n * 不存在的形状。分组内**每一条**差异都被授权才整体换回历史对象,否则保持本次值——那样指纹\n * 自然对不上,条目照常重跑,不会静默跨过没被授权的那半。\n */\nexport function counterfactualConfigIdentity(current: ConfigIdentity, historical: ConfigIdentity, accepted: ReadonlySet<string>): ConfigIdentity {\n const differing = new Set(configDeltas(historical, current).map((d) => d.selector));\n const flags: globalThis.Record<string, JsonValue> = { ...current.flags };\n for (const selector of accepted) {\n if (!selector.startsWith(\"config:flags.\"))\n continue;\n const key = selector.slice(\"config:flags.\".length);\n if (Object.hasOwn(historical.flags, key)) {\n const value = historical.flags[key];\n if (value === undefined)\n throw new Error(`Missing historical flag value for ${key}.`);\n flags[key] = value;\n }\n else\n delete flags[key];\n }\n let sandboxLayer = current.sandboxLayer;\n let plugins = current.plugins;\n let judge = current.judge;\n let agentInstalls = current.agentInstalls;\n const rollbackGroups: readonly (\"sandboxLayer\" | \"plugins\" | \"judge\" | \"agentInstalls\")[] = [\n \"sandboxLayer\", \"plugins\", \"judge\", \"agentInstalls\",\n ];\n for (const group of rollbackGroups) {\n const paths = [...differing].filter((selector) => selector === `config:${group}` || selector.startsWith(`config:${group}.`));\n if (paths.length === 0 || !paths.every((selector) => accepted.has(selector)))\n continue;\n if (group === \"sandboxLayer\")\n sandboxLayer = historical.sandboxLayer;\n else if (group === \"plugins\")\n plugins = historical.plugins;\n else if (group === \"judge\")\n judge = historical.judge;\n else\n agentInstalls = historical.agentInstalls;\n }\n const sharedState = accepted.has(\"config:sharedState.key\") ? historical.sharedState : current.sharedState;\n return freezeConfigIdentity({\n agent: accepted.has(\"config:agent\") ? historical.agent : current.agent,\n model: accepted.has(\"config:model\") ? historical.model : current.model,\n reasoningEffort: accepted.has(\"config:reasoningEffort\")\n ? historical.reasoningEffort\n : current.reasoningEffort,\n flags,\n plugins,\n sandboxReuse: accepted.has(\"config:sandboxReuse\") ? historical.sandboxReuse : current.sandboxReuse,\n ...(sharedState === undefined ? {} : { sharedState }),\n sandboxLayer,\n judge,\n agentInstalls,\n });\n}\n"]}
@@ -5,8 +5,8 @@ import type { AgentRun } from "./types.cjs";
5
5
  * 一次运行的**配置身份**:`computeConfigHash` 的哈希输入,字段集合与
6
6
  * docs/feature/experiments/cache.md「指纹:两个哈希嵌套」逐字对应。
7
7
  *
8
- * 键恒存在(值可以是 `undefined`):稳定序列化把键本身也算进字节,少一个键就是另一个哈希。
9
- * 新增公开配置字段时只在这里裁决一次「进不进 configHash」。
8
+ * 可选配置必须真的省略键,而不是写入 `undefined` 或一个 Omitted 哨兵;否则未声明配置会
9
+ * 无端改变基础 configHash。新增公开配置字段时只在这里裁决一次「进不进 configHash」。
10
10
  */
11
11
  export interface ConfigIdentity {
12
12
  readonly agent: string;
@@ -16,6 +16,8 @@ export interface ConfigIdentity {
16
16
  /** Credential-free Experiment Plugin and receiver behavior. */
17
17
  readonly plugins: JsonValue;
18
18
  readonly sandboxReuse: boolean;
19
+ /** Stable public key for the shared-state mutex, never a secret or stored state. */
20
+ readonly sharedState?: string;
19
21
  /** Experiment 作者 layer 身份;物理 provider plan 属于逐 Eval fingerprint,不进入 Run 级身份。 */
20
22
  readonly sandboxLayer: JsonValue;
21
23
  readonly judge: JudgeConfigIdentity;
@@ -5,8 +5,8 @@ import type { AgentRun } from "./types.mjs";
5
5
  * 一次运行的**配置身份**:`computeConfigHash` 的哈希输入,字段集合与
6
6
  * docs/feature/experiments/cache.md「指纹:两个哈希嵌套」逐字对应。
7
7
  *
8
- * 键恒存在(值可以是 `undefined`):稳定序列化把键本身也算进字节,少一个键就是另一个哈希。
9
- * 新增公开配置字段时只在这里裁决一次「进不进 configHash」。
8
+ * 可选配置必须真的省略键,而不是写入 `undefined` 或一个 Omitted 哨兵;否则未声明配置会
9
+ * 无端改变基础 configHash。新增公开配置字段时只在这里裁决一次「进不进 configHash」。
10
10
  */
11
11
  export interface ConfigIdentity {
12
12
  readonly agent: string;
@@ -16,6 +16,8 @@ export interface ConfigIdentity {
16
16
  /** Credential-free Experiment Plugin and receiver behavior. */
17
17
  readonly plugins: JsonValue;
18
18
  readonly sandboxReuse: boolean;
19
+ /** Stable public key for the shared-state mutex, never a secret or stored state. */
20
+ readonly sharedState?: string;
19
21
  /** Experiment 作者 layer 身份;物理 provider plan 属于逐 Eval fingerprint,不进入 Run 级身份。 */
20
22
  readonly sandboxLayer: JsonValue;
21
23
  readonly judge: JudgeConfigIdentity;
@@ -5,8 +5,8 @@ import type { AgentRun } from "./types.js";
5
5
  * 一次运行的**配置身份**:`computeConfigHash` 的哈希输入,字段集合与
6
6
  * docs/feature/experiments/cache.md「指纹:两个哈希嵌套」逐字对应。
7
7
  *
8
- * 键恒存在(值可以是 `undefined`):稳定序列化把键本身也算进字节,少一个键就是另一个哈希。
9
- * 新增公开配置字段时只在这里裁决一次「进不进 configHash」。
8
+ * 可选配置必须真的省略键,而不是写入 `undefined` 或一个 Omitted 哨兵;否则未声明配置会
9
+ * 无端改变基础 configHash。新增公开配置字段时只在这里裁决一次「进不进 configHash」。
10
10
  */
11
11
  export interface ConfigIdentity {
12
12
  readonly agent: string;
@@ -16,6 +16,8 @@ export interface ConfigIdentity {
16
16
  /** Credential-free Experiment Plugin and receiver behavior. */
17
17
  readonly plugins: JsonValue;
18
18
  readonly sandboxReuse: boolean;
19
+ /** Stable public key for the shared-state mutex, never a secret or stored state. */
20
+ readonly sharedState?: string;
19
21
  /** Experiment 作者 layer 身份;物理 provider plan 属于逐 Eval fingerprint,不进入 Run 级身份。 */
20
22
  readonly sandboxLayer: JsonValue;
21
23
  readonly judge: JudgeConfigIdentity;