niceeval 0.12.2-canary.31 → 0.13.1

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 (2041) hide show
  1. package/INDEX.md +10 -10
  2. package/README.md +2 -0
  3. package/README.zh.md +2 -0
  4. package/bin/niceeval.js +15 -0
  5. package/dist/agents/claude-code.cjs +9 -1
  6. package/dist/agents/claude-code.cjs.map +1 -1
  7. package/dist/agents/post-setup.cjs +0 -2
  8. package/dist/agents/post-setup.cjs.map +1 -1
  9. package/dist/agents/provisioner.cjs +2 -13
  10. package/dist/agents/provisioner.cjs.map +1 -1
  11. package/dist/agents/provisioner.d.cts +0 -5
  12. package/dist/agents/provisioner.d.mts +0 -5
  13. package/dist/agents/provisioner.d.ts +0 -5
  14. package/dist/agents/provisioner.js +22 -26
  15. package/dist/agents/sdk-streams.cjs +2 -1
  16. package/dist/agents/sdk-streams.cjs.map +1 -1
  17. package/dist/agents/types.cjs.map +1 -1
  18. package/dist/agents/types.d.cts +2 -10
  19. package/dist/agents/types.d.mts +2 -10
  20. package/dist/agents/types.d.ts +2 -10
  21. package/dist/analysis/api.cjs +689 -0
  22. package/dist/analysis/api.cjs.map +1 -0
  23. package/dist/analysis/api.d.cts +126 -0
  24. package/dist/analysis/api.d.mts +126 -0
  25. package/dist/analysis/api.d.ts +126 -0
  26. package/dist/analysis/api.js +24 -0
  27. package/dist/analysis/api.js.map +1 -0
  28. package/dist/analysis/bindings.cjs +617 -0
  29. package/dist/analysis/bindings.cjs.map +1 -0
  30. package/dist/analysis/bindings.d.cts +8313 -0
  31. package/dist/analysis/bindings.d.mts +8313 -0
  32. package/dist/analysis/bindings.d.ts +8313 -0
  33. package/dist/analysis/bindings.js +22 -0
  34. package/dist/analysis/bindings.js.map +1 -0
  35. package/dist/analysis/contracts.cjs +39 -0
  36. package/dist/analysis/contracts.cjs.map +1 -0
  37. package/dist/analysis/contracts.d.cts +293 -0
  38. package/dist/analysis/contracts.d.mts +293 -0
  39. package/dist/analysis/contracts.d.ts +293 -0
  40. package/dist/analysis/contracts.js +12 -0
  41. package/dist/analysis/contracts.js.map +1 -0
  42. package/dist/analysis/cost-decimal.cjs +177 -0
  43. package/dist/analysis/cost-decimal.cjs.map +1 -0
  44. package/dist/analysis/cost-decimal.d.cts +51 -0
  45. package/dist/analysis/cost-decimal.d.mts +51 -0
  46. package/dist/analysis/cost-decimal.d.ts +51 -0
  47. package/dist/analysis/cost-decimal.js +28 -0
  48. package/dist/analysis/cost-decimal.js.map +1 -0
  49. package/dist/analysis/cost-projection.cjs +430 -0
  50. package/dist/analysis/cost-projection.cjs.map +1 -0
  51. package/dist/analysis/cost-projection.d.cts +37 -0
  52. package/dist/analysis/cost-projection.d.mts +37 -0
  53. package/dist/analysis/cost-projection.d.ts +37 -0
  54. package/dist/analysis/cost-projection.js +10 -0
  55. package/dist/analysis/cost-projection.js.map +1 -0
  56. package/dist/analysis/cost.cjs +814 -0
  57. package/dist/analysis/cost.cjs.map +1 -0
  58. package/dist/analysis/cost.d.cts +310 -0
  59. package/dist/analysis/cost.d.mts +310 -0
  60. package/dist/analysis/cost.d.ts +310 -0
  61. package/dist/analysis/cost.js +26 -0
  62. package/dist/analysis/cost.js.map +1 -0
  63. package/dist/analysis/definitions.cjs +346 -0
  64. package/dist/analysis/definitions.cjs.map +1 -0
  65. package/dist/analysis/definitions.d.cts +230 -0
  66. package/dist/analysis/definitions.d.mts +230 -0
  67. package/dist/analysis/definitions.d.ts +230 -0
  68. package/dist/analysis/definitions.js +70 -0
  69. package/dist/analysis/definitions.js.map +1 -0
  70. package/dist/analysis/domain-view.cjs +3 -0
  71. package/dist/analysis/domain-view.cjs.map +1 -0
  72. package/dist/analysis/domain-view.d.cts +367 -0
  73. package/dist/analysis/domain-view.d.mts +367 -0
  74. package/dist/analysis/domain-view.d.ts +367 -0
  75. package/dist/analysis/domain-view.js +4 -0
  76. package/dist/analysis/domain-view.js.map +1 -0
  77. package/dist/analysis/file-changes.cjs +225 -0
  78. package/dist/analysis/file-changes.cjs.map +1 -0
  79. package/dist/analysis/file-changes.d.cts +30 -0
  80. package/dist/analysis/file-changes.d.mts +30 -0
  81. package/dist/analysis/file-changes.d.ts +30 -0
  82. package/dist/analysis/file-changes.js +6 -0
  83. package/dist/analysis/file-changes.js.map +1 -0
  84. package/dist/analysis/host.cjs +8 -0
  85. package/dist/analysis/host.cjs.map +1 -0
  86. package/dist/analysis/host.d.cts +19 -0
  87. package/dist/analysis/host.d.mts +19 -0
  88. package/dist/analysis/host.d.ts +19 -0
  89. package/dist/analysis/host.js +6 -0
  90. package/dist/analysis/host.js.map +1 -0
  91. package/dist/analysis/host.mjs +6 -0
  92. package/dist/analysis/host.mjs.map +1 -0
  93. package/dist/analysis/index.cjs +45 -8
  94. package/dist/analysis/index.cjs.map +1 -1
  95. package/dist/analysis/index.d.cts +10 -2
  96. package/dist/analysis/index.d.mts +10 -2
  97. package/dist/analysis/index.d.ts +10 -2
  98. package/dist/analysis/index.js +70 -6
  99. package/dist/analysis/index.mjs +70 -6
  100. package/dist/assertions/api.cjs.map +1 -1
  101. package/dist/assertions/api.d.cts +1 -1
  102. package/dist/assertions/api.d.mts +1 -1
  103. package/dist/assertions/api.d.ts +1 -1
  104. package/dist/assertions/diff.cjs +2 -2
  105. package/dist/assertions/diff.cjs.map +1 -1
  106. package/dist/assertions/diff.d.cts +2 -2
  107. package/dist/assertions/diff.d.mts +2 -2
  108. package/dist/assertions/diff.d.ts +2 -2
  109. package/dist/assertions/judge.cjs +11 -10
  110. package/dist/assertions/judge.cjs.map +1 -1
  111. package/dist/assertions/record/attachment.cjs +64 -81
  112. package/dist/assertions/record/attachment.cjs.map +1 -1
  113. package/dist/assertions/record/attachment.d.cts +88 -143
  114. package/dist/assertions/record/attachment.d.mts +88 -143
  115. package/dist/assertions/record/attachment.d.ts +88 -143
  116. package/dist/assertions/record/attachment.js +12 -16
  117. package/dist/assertions/record/codec.cjs +178 -100
  118. package/dist/assertions/record/codec.cjs.map +1 -1
  119. package/dist/assertions/record/codec.d.cts +75 -56
  120. package/dist/assertions/record/codec.d.mts +75 -56
  121. package/dist/assertions/record/codec.d.ts +75 -56
  122. package/dist/assertions/record/codec.js +36 -32
  123. package/dist/assertions/record/diff.cjs +545 -134
  124. package/dist/assertions/record/diff.cjs.map +1 -1
  125. package/dist/assertions/record/diff.d.cts +73 -25
  126. package/dist/assertions/record/diff.d.mts +73 -25
  127. package/dist/assertions/record/diff.d.ts +73 -25
  128. package/dist/assertions/record/diff.js +12 -14
  129. package/dist/assertions/record/index.js +70 -72
  130. package/dist/assertions/record/model.cjs.map +1 -1
  131. package/dist/assertions/record/model.d.cts +62 -70
  132. package/dist/assertions/record/model.d.mts +62 -70
  133. package/dist/assertions/record/model.d.ts +62 -70
  134. package/dist/assertions/record/producer.cjs +5 -2
  135. package/dist/assertions/record/producer.cjs.map +1 -1
  136. package/dist/assertions/record/producer.d.cts +18 -18
  137. package/dist/assertions/record/producer.d.mts +18 -18
  138. package/dist/assertions/record/producer.d.ts +18 -18
  139. package/dist/assertions/record/producer.js +2 -2
  140. package/dist/assertions/runtime.cjs +14 -9
  141. package/dist/assertions/runtime.cjs.map +1 -1
  142. package/dist/assertions/workspace-diff.cjs +18 -4
  143. package/dist/assertions/workspace-diff.cjs.map +1 -1
  144. package/dist/assertions/workspace-diff.d.cts +3 -1
  145. package/dist/assertions/workspace-diff.d.mts +3 -1
  146. package/dist/assertions/workspace-diff.d.ts +3 -1
  147. package/dist/assertions/workspace-diff.js +14 -12
  148. package/dist/attempt-locator-resolution.cjs +33 -38
  149. package/dist/attempt-locator-resolution.cjs.map +1 -1
  150. package/dist/attempt-locator-resolution.d.cts +15 -8
  151. package/dist/attempt-locator-resolution.d.mts +15 -8
  152. package/dist/attempt-locator-resolution.d.ts +15 -8
  153. package/dist/cli/record.cjs +16 -89
  154. package/dist/cli/record.cjs.map +1 -1
  155. package/dist/cli/record.d.cts +2 -9
  156. package/dist/cli/record.d.mts +2 -9
  157. package/dist/cli/record.d.ts +2 -9
  158. package/dist/cli/record.js +2 -6
  159. package/dist/cli.cjs +619 -246
  160. package/dist/cli.cjs.map +1 -1
  161. package/dist/cli.d.cts +6 -5
  162. package/dist/cli.d.mts +6 -5
  163. package/dist/cli.d.ts +6 -5
  164. package/dist/context/assert-first.cjs +13 -4
  165. package/dist/context/assert-first.cjs.map +1 -1
  166. package/dist/context/assert-first.d.cts +3 -4
  167. package/dist/context/assert-first.d.mts +3 -4
  168. package/dist/context/assert-first.d.ts +3 -4
  169. package/dist/context/send-retry.cjs +18 -21
  170. package/dist/context/send-retry.cjs.map +1 -1
  171. package/dist/context/send-retry.d.cts +0 -3
  172. package/dist/context/send-retry.d.mts +0 -3
  173. package/dist/context/send-retry.d.ts +0 -3
  174. package/dist/context/session.cjs +46 -42
  175. package/dist/context/session.cjs.map +1 -1
  176. package/dist/context/session.d.cts +4 -6
  177. package/dist/context/session.d.mts +4 -6
  178. package/dist/context/session.d.ts +4 -6
  179. package/dist/coordination/host/index.cjs +10 -0
  180. package/dist/coordination/host/index.cjs.map +1 -0
  181. package/dist/coordination/host/index.d.cts +6 -0
  182. package/dist/coordination/host/index.d.mts +6 -0
  183. package/dist/coordination/host/index.d.ts +6 -0
  184. package/dist/coordination/host/index.js +6 -0
  185. package/dist/coordination/host/index.mjs +6 -0
  186. package/dist/coordination/host/runtime.cjs +57 -0
  187. package/dist/coordination/host/runtime.cjs.map +1 -0
  188. package/dist/coordination/host/runtime.d.cts +13 -0
  189. package/dist/coordination/host/runtime.d.mts +13 -0
  190. package/dist/coordination/host/runtime.d.ts +13 -0
  191. package/dist/coordination/host/runtime.js +8 -0
  192. package/dist/coordination/host/types.cjs.map +1 -0
  193. package/dist/coordination/host/types.d.cts +37 -0
  194. package/dist/coordination/host/types.d.mts +37 -0
  195. package/dist/coordination/host/types.d.ts +37 -0
  196. package/dist/coordination/identity.cjs +48 -0
  197. package/dist/coordination/identity.cjs.map +1 -0
  198. package/dist/coordination/identity.d.cts +14 -0
  199. package/dist/coordination/identity.d.mts +14 -0
  200. package/dist/coordination/identity.d.ts +14 -0
  201. package/dist/coordination/identity.js +6 -0
  202. package/dist/coordination/index.cjs +23 -0
  203. package/dist/coordination/index.cjs.map +1 -0
  204. package/dist/coordination/index.d.cts +6 -0
  205. package/dist/coordination/index.d.mts +6 -0
  206. package/dist/coordination/index.d.ts +6 -0
  207. package/dist/coordination/index.js +16 -0
  208. package/dist/coordination/platform/index.cjs +18 -0
  209. package/dist/coordination/platform/index.cjs.map +1 -0
  210. package/dist/coordination/platform/index.d.cts +1 -0
  211. package/dist/coordination/platform/index.d.mts +1 -0
  212. package/dist/coordination/platform/index.d.ts +1 -0
  213. package/dist/coordination/platform/index.js +6 -0
  214. package/dist/coordination/platform/node.cjs +251 -0
  215. package/dist/coordination/platform/node.cjs.map +1 -0
  216. package/dist/coordination/platform/node.d.cts +3 -0
  217. package/dist/coordination/platform/node.d.mts +3 -0
  218. package/dist/coordination/platform/node.d.ts +3 -0
  219. package/dist/coordination/platform/node.js +6 -0
  220. package/dist/coordination/platform/node.js.map +1 -0
  221. package/dist/coordination/record-leases.cjs +22 -0
  222. package/dist/coordination/record-leases.cjs.map +1 -0
  223. package/dist/coordination/record-leases.d.cts +39 -0
  224. package/dist/coordination/record-leases.d.mts +39 -0
  225. package/dist/coordination/record-leases.d.ts +39 -0
  226. package/dist/coordination/record-leases.js +10 -0
  227. package/dist/coordination/record-leases.js.map +1 -0
  228. package/dist/eval/experiment-id.cjs +1 -5
  229. package/dist/eval/experiment-id.cjs.map +1 -1
  230. package/dist/eval/experiment-id.d.cts +0 -2
  231. package/dist/eval/experiment-id.d.mts +0 -2
  232. package/dist/eval/experiment-id.d.ts +0 -2
  233. package/dist/eval/experiment-id.js +0 -4
  234. package/dist/eval/record/attachment.cjs +7 -47
  235. package/dist/eval/record/attachment.cjs.map +1 -1
  236. package/dist/eval/record/attachment.d.cts +8 -24
  237. package/dist/eval/record/attachment.d.mts +8 -24
  238. package/dist/eval/record/attachment.d.ts +8 -24
  239. package/dist/eval/record/attachment.js +4 -10
  240. package/dist/eval/record/coherence.cjs +6 -6
  241. package/dist/eval/record/coherence.cjs.map +1 -1
  242. package/dist/eval/record/coherence.d.cts +16 -16
  243. package/dist/eval/record/coherence.d.mts +16 -16
  244. package/dist/eval/record/coherence.d.ts +16 -16
  245. package/dist/eval/record/coherence.js +2 -2
  246. package/dist/eval/record/eligibility.cjs +53 -135
  247. package/dist/eval/record/eligibility.cjs.map +1 -1
  248. package/dist/eval/record/eligibility.d.cts +38 -140
  249. package/dist/eval/record/eligibility.d.mts +38 -140
  250. package/dist/eval/record/eligibility.d.ts +38 -140
  251. package/dist/eval/record/eligibility.js +16 -38
  252. package/dist/eval/record/evaluation-plan.cjs +18 -23
  253. package/dist/eval/record/evaluation-plan.cjs.map +1 -1
  254. package/dist/eval/record/evaluation-plan.d.cts +6 -9
  255. package/dist/eval/record/evaluation-plan.d.mts +6 -9
  256. package/dist/eval/record/evaluation-plan.d.ts +6 -9
  257. package/dist/eval/record/evaluation-plan.js +2 -2
  258. package/dist/eval/record/evaluation-record.cjs +161 -454
  259. package/dist/eval/record/evaluation-record.cjs.map +1 -1
  260. package/dist/eval/record/evaluation-record.d.cts +67 -128
  261. package/dist/eval/record/evaluation-record.d.mts +67 -128
  262. package/dist/eval/record/evaluation-record.d.ts +67 -128
  263. package/dist/eval/record/evaluation-record.js +16 -16
  264. package/dist/eval/record/evaluation.cjs +59 -174
  265. package/dist/eval/record/evaluation.cjs.map +1 -1
  266. package/dist/eval/record/evaluation.d.cts +43 -119
  267. package/dist/eval/record/evaluation.d.mts +43 -119
  268. package/dist/eval/record/evaluation.d.ts +43 -119
  269. package/dist/eval/record/evaluation.js +20 -32
  270. package/dist/eval/record/index.js +144 -238
  271. package/dist/eval/record/membership-provenance.cjs +58 -191
  272. package/dist/eval/record/membership-provenance.cjs.map +1 -1
  273. package/dist/eval/record/membership-provenance.d.cts +83 -659
  274. package/dist/eval/record/membership-provenance.d.mts +83 -659
  275. package/dist/eval/record/membership-provenance.d.ts +83 -659
  276. package/dist/eval/record/membership-provenance.js +34 -54
  277. package/dist/eval/record/score.cjs +58 -170
  278. package/dist/eval/record/score.cjs.map +1 -1
  279. package/dist/eval/record/score.d.cts +36 -104
  280. package/dist/eval/record/score.d.mts +36 -104
  281. package/dist/eval/record/score.d.ts +36 -104
  282. package/dist/eval/record/score.js +22 -40
  283. package/dist/eval/record/sealed-assertion.cjs +10 -10
  284. package/dist/eval/record/sealed-assertion.cjs.map +1 -1
  285. package/dist/eval/record/sealed-assertion.d.cts +12 -12
  286. package/dist/eval/record/sealed-assertion.d.mts +12 -12
  287. package/dist/eval/record/sealed-assertion.d.ts +12 -12
  288. package/dist/eval/record/sealed-assertion.js +10 -10
  289. package/dist/eval/record/verdict.cjs +42 -64
  290. package/dist/eval/record/verdict.cjs.map +1 -1
  291. package/dist/eval/record/verdict.d.cts +35 -48
  292. package/dist/eval/record/verdict.d.mts +35 -48
  293. package/dist/eval/record/verdict.d.ts +35 -48
  294. package/dist/eval/record/verdict.js +16 -32
  295. package/dist/experiment/host/index.cjs +210 -0
  296. package/dist/experiment/host/index.cjs.map +1 -0
  297. package/dist/experiment/host/index.d.cts +125 -0
  298. package/dist/experiment/host/index.d.mts +125 -0
  299. package/dist/experiment/host/index.d.ts +125 -0
  300. package/dist/experiment/host/index.js +6 -0
  301. package/dist/experiment/host/index.mjs +6 -0
  302. package/dist/experiment/host/index.mjs.map +1 -0
  303. package/dist/fresh-import.cjs +33 -119
  304. package/dist/fresh-import.cjs.map +1 -1
  305. package/dist/i18n/en.cjs +10 -5
  306. package/dist/i18n/en.cjs.map +1 -1
  307. package/dist/i18n/en.d.cts +9 -4
  308. package/dist/i18n/en.d.mts +9 -4
  309. package/dist/i18n/en.d.ts +9 -4
  310. package/dist/index.cjs +1 -4
  311. package/dist/index.cjs.map +1 -1
  312. package/dist/index.d.cts +0 -2
  313. package/dist/index.d.mts +0 -2
  314. package/dist/index.d.ts +0 -2
  315. package/dist/index.js +18 -20
  316. package/dist/index.mjs +18 -20
  317. package/dist/o11y/cost.cjs +16 -6
  318. package/dist/o11y/cost.cjs.map +1 -1
  319. package/dist/o11y/parsers/bub.cjs +16 -4
  320. package/dist/o11y/parsers/bub.cjs.map +1 -1
  321. package/dist/o11y/parsers/hermes.cjs +19 -6
  322. package/dist/o11y/parsers/hermes.cjs.map +1 -1
  323. package/dist/o11y/parsers/openclaw.cjs +5 -10
  324. package/dist/o11y/parsers/openclaw.cjs.map +1 -1
  325. package/dist/o11y/parsers/opencode.cjs +6 -11
  326. package/dist/o11y/parsers/opencode.cjs.map +1 -1
  327. package/dist/o11y/prices.json +1335 -557
  328. package/dist/o11y/record/capture.cjs +38 -38
  329. package/dist/o11y/record/capture.cjs.map +1 -1
  330. package/dist/o11y/record/capture.d.cts +25 -25
  331. package/dist/o11y/record/capture.d.mts +25 -25
  332. package/dist/o11y/record/capture.d.ts +25 -25
  333. package/dist/o11y/record/capture.js +26 -26
  334. package/dist/o11y/record/codec.cjs +139 -140
  335. package/dist/o11y/record/codec.cjs.map +1 -1
  336. package/dist/o11y/record/codec.d.cts +262 -266
  337. package/dist/o11y/record/codec.d.mts +262 -266
  338. package/dist/o11y/record/codec.d.ts +262 -266
  339. package/dist/o11y/record/codec.js +58 -60
  340. package/dist/o11y/record/errors.cjs +20 -20
  341. package/dist/o11y/record/errors.cjs.map +1 -1
  342. package/dist/o11y/record/errors.d.cts +18 -18
  343. package/dist/o11y/record/errors.d.mts +18 -18
  344. package/dist/o11y/record/errors.d.ts +18 -18
  345. package/dist/o11y/record/errors.js +20 -20
  346. package/dist/o11y/record/families.cjs +269 -264
  347. package/dist/o11y/record/families.cjs.map +1 -1
  348. package/dist/o11y/record/families.d.cts +1589 -1573
  349. package/dist/o11y/record/families.d.mts +1589 -1573
  350. package/dist/o11y/record/families.d.ts +1589 -1573
  351. package/dist/o11y/record/families.js +64 -64
  352. package/dist/o11y/record/family-projectors.cjs +31 -58
  353. package/dist/o11y/record/family-projectors.cjs.map +1 -1
  354. package/dist/o11y/record/family-projectors.d.cts +2933 -34
  355. package/dist/o11y/record/family-projectors.d.mts +2933 -34
  356. package/dist/o11y/record/family-projectors.d.ts +2933 -34
  357. package/dist/o11y/record/family-projectors.js +10 -4
  358. package/dist/o11y/record/family-writers.cjs +207 -336
  359. package/dist/o11y/record/family-writers.cjs.map +1 -1
  360. package/dist/o11y/record/family-writers.d.cts +637 -5260
  361. package/dist/o11y/record/family-writers.d.mts +637 -5260
  362. package/dist/o11y/record/family-writers.d.ts +637 -5260
  363. package/dist/o11y/record/family-writers.js +14 -56
  364. package/dist/o11y/record/index.js +446 -484
  365. package/dist/o11y/record/limits.cjs +45 -45
  366. package/dist/o11y/record/limits.cjs.map +1 -1
  367. package/dist/o11y/record/limits.d.cts +32 -32
  368. package/dist/o11y/record/limits.d.mts +32 -32
  369. package/dist/o11y/record/limits.d.ts +32 -32
  370. package/dist/o11y/record/limits.js +64 -64
  371. package/dist/o11y/record/model.cjs +271 -277
  372. package/dist/o11y/record/model.cjs.map +1 -1
  373. package/dist/o11y/record/model.d.cts +160 -186
  374. package/dist/o11y/record/model.d.mts +160 -186
  375. package/dist/o11y/record/model.d.ts +160 -186
  376. package/dist/o11y/record/model.js +154 -154
  377. package/dist/o11y/record/runner-producer.cjs +649 -520
  378. package/dist/o11y/record/runner-producer.cjs.map +1 -1
  379. package/dist/o11y/record/runner-producer.d.cts +39 -25
  380. package/dist/o11y/record/runner-producer.d.mts +39 -25
  381. package/dist/o11y/record/runner-producer.d.ts +39 -25
  382. package/dist/o11y/record/runner-producer.js +26 -22
  383. package/dist/o11y/record/validation.cjs +75 -75
  384. package/dist/o11y/record/validation.cjs.map +1 -1
  385. package/dist/o11y/record/validation.d.cts +35 -35
  386. package/dist/o11y/record/validation.d.mts +35 -35
  387. package/dist/o11y/record/validation.d.ts +35 -35
  388. package/dist/o11y/record/validation.js +24 -24
  389. package/dist/o11y/types.cjs.map +1 -1
  390. package/dist/o11y/types.d.cts +7 -5
  391. package/dist/o11y/types.d.mts +7 -5
  392. package/dist/o11y/types.d.ts +7 -5
  393. package/dist/plugin/contracts.cjs.map +1 -1
  394. package/dist/plugin/contracts.d.cts +0 -3
  395. package/dist/plugin/contracts.d.mts +0 -3
  396. package/dist/plugin/contracts.d.ts +0 -3
  397. package/dist/plugins/record/attachment.cjs +0 -59
  398. package/dist/plugins/record/attachment.cjs.map +1 -1
  399. package/dist/plugins/record/attachment.d.cts +6 -14
  400. package/dist/plugins/record/attachment.d.mts +6 -14
  401. package/dist/plugins/record/attachment.d.ts +6 -14
  402. package/dist/plugins/record/attachment.js +0 -16
  403. package/dist/plugins/record/capability.cjs +0 -255
  404. package/dist/plugins/record/capability.cjs.map +1 -1
  405. package/dist/plugins/record/capability.d.cts +1 -93
  406. package/dist/plugins/record/capability.d.mts +1 -93
  407. package/dist/plugins/record/capability.d.ts +1 -93
  408. package/dist/plugins/record/capability.js +0 -22
  409. package/dist/plugins/record/codec.cjs +0 -241
  410. package/dist/plugins/record/codec.cjs.map +1 -1
  411. package/dist/plugins/record/codec.d.cts +2 -28
  412. package/dist/plugins/record/codec.d.mts +2 -28
  413. package/dist/plugins/record/codec.d.ts +2 -28
  414. package/dist/plugins/record/codec.js +0 -44
  415. package/dist/plugins/record/index.cjs +0 -51
  416. package/dist/plugins/record/index.cjs.map +1 -1
  417. package/dist/plugins/record/index.d.cts +5 -9
  418. package/dist/plugins/record/index.d.mts +5 -9
  419. package/dist/plugins/record/index.d.ts +5 -9
  420. package/dist/plugins/record/index.js +0 -90
  421. package/dist/plugins/record/migration.cjs +0 -30
  422. package/dist/plugins/record/migration.cjs.map +1 -1
  423. package/dist/plugins/record/migration.d.cts +3 -20
  424. package/dist/plugins/record/migration.d.mts +3 -20
  425. package/dist/plugins/record/migration.d.ts +3 -20
  426. package/dist/plugins/record/migration.js +0 -2
  427. package/dist/plugins/record/model.cjs.map +1 -1
  428. package/dist/plugins/record/model.d.cts +2 -93
  429. package/dist/plugins/record/model.d.mts +2 -93
  430. package/dist/plugins/record/model.d.ts +2 -93
  431. package/dist/plugins/record/provenance.cjs +0 -316
  432. package/dist/plugins/record/provenance.cjs.map +1 -1
  433. package/dist/plugins/record/provenance.d.cts +1 -78
  434. package/dist/plugins/record/provenance.d.mts +1 -78
  435. package/dist/plugins/record/provenance.d.ts +1 -78
  436. package/dist/plugins/record/provenance.js +0 -20
  437. package/dist/record/attachment/blob-policy.cjs +3 -0
  438. package/dist/record/attachment/blob-policy.cjs.map +1 -0
  439. package/dist/record/attachment/blob-policy.d.cts +18 -0
  440. package/dist/record/attachment/blob-policy.d.mts +18 -0
  441. package/dist/record/attachment/blob-policy.d.ts +18 -0
  442. package/dist/record/attachment/blob-policy.js +4 -0
  443. package/dist/record/attachment/blob-policy.js.map +1 -0
  444. package/dist/record/attachment/blob-ref.cjs +42 -0
  445. package/dist/record/attachment/blob-ref.cjs.map +1 -0
  446. package/dist/record/attachment/blob-ref.d.cts +22 -0
  447. package/dist/record/attachment/blob-ref.d.mts +22 -0
  448. package/dist/record/attachment/blob-ref.d.ts +22 -0
  449. package/dist/record/attachment/blob-ref.js +14 -0
  450. package/dist/record/attachment/blob-ref.js.map +1 -0
  451. package/dist/record/attachment/errors.cjs +6 -34
  452. package/dist/record/attachment/errors.cjs.map +1 -1
  453. package/dist/record/attachment/errors.d.cts +2 -24
  454. package/dist/record/attachment/errors.d.mts +2 -24
  455. package/dist/record/attachment/errors.d.ts +2 -24
  456. package/dist/record/attachment/errors.js +4 -10
  457. package/dist/record/attachment/index.cjs +2 -8
  458. package/dist/record/attachment/index.cjs.map +1 -1
  459. package/dist/record/attachment/index.d.cts +3 -3
  460. package/dist/record/attachment/index.d.mts +3 -3
  461. package/dist/record/attachment/index.d.ts +3 -3
  462. package/dist/record/attachment/index.js +6 -18
  463. package/dist/record/attachment/internal.cjs +5 -14
  464. package/dist/record/attachment/internal.cjs.map +1 -1
  465. package/dist/record/attachment/internal.d.cts +3 -2
  466. package/dist/record/attachment/internal.d.mts +3 -2
  467. package/dist/record/attachment/internal.d.ts +3 -2
  468. package/dist/record/attachment/internal.js +12 -30
  469. package/dist/record/attachment/runtime.cjs +155 -745
  470. package/dist/record/attachment/runtime.cjs.map +1 -1
  471. package/dist/record/attachment/runtime.d.cts +25 -68
  472. package/dist/record/attachment/runtime.d.mts +25 -68
  473. package/dist/record/attachment/runtime.d.ts +25 -68
  474. package/dist/record/attachment/runtime.js +16 -48
  475. package/dist/record/attachment/types.cjs +3 -26
  476. package/dist/record/attachment/types.cjs.map +1 -1
  477. package/dist/record/attachment/types.d.cts +33 -132
  478. package/dist/record/attachment/types.d.mts +33 -132
  479. package/dist/record/attachment/types.d.ts +33 -132
  480. package/dist/record/attachment/types.js +10 -22
  481. package/dist/record/codec/core.cjs +102 -85
  482. package/dist/record/codec/core.cjs.map +1 -1
  483. package/dist/record/codec/core.d.cts +205 -55
  484. package/dist/record/codec/core.d.mts +205 -55
  485. package/dist/record/codec/core.d.ts +205 -55
  486. package/dist/record/codec/core.js +50 -42
  487. package/dist/record/codec/identifiers.cjs +24 -2
  488. package/dist/record/codec/identifiers.cjs.map +1 -1
  489. package/dist/record/codec/identifiers.d.cts +11 -2
  490. package/dist/record/codec/identifiers.d.mts +11 -2
  491. package/dist/record/codec/identifiers.d.ts +11 -2
  492. package/dist/record/codec/identifiers.js +36 -18
  493. package/dist/record/codec/index.js +86 -60
  494. package/dist/record/definition/attachment.cjs +108 -0
  495. package/dist/record/definition/attachment.cjs.map +1 -0
  496. package/dist/record/definition/attachment.d.cts +77 -0
  497. package/dist/record/definition/attachment.d.mts +77 -0
  498. package/dist/record/definition/attachment.d.ts +77 -0
  499. package/dist/record/definition/attachment.js +8 -0
  500. package/dist/record/definition/attachment.js.map +1 -0
  501. package/dist/record/definition/canonical.cjs +271 -0
  502. package/dist/record/definition/canonical.cjs.map +1 -0
  503. package/dist/record/definition/canonical.d.cts +38 -0
  504. package/dist/record/definition/canonical.d.mts +38 -0
  505. package/dist/record/definition/canonical.d.ts +38 -0
  506. package/dist/record/definition/canonical.js +10 -0
  507. package/dist/record/definition/canonical.js.map +1 -0
  508. package/dist/record/definition/core.cjs +13 -0
  509. package/dist/record/definition/core.cjs.map +1 -0
  510. package/dist/record/definition/core.d.cts +10 -0
  511. package/dist/record/definition/core.d.mts +10 -0
  512. package/dist/record/definition/core.d.ts +10 -0
  513. package/dist/record/definition/core.js +6 -0
  514. package/dist/record/definition/core.js.map +1 -0
  515. package/dist/record/definition/index.cjs +21 -0
  516. package/dist/record/definition/index.cjs.map +1 -0
  517. package/dist/record/definition/index.d.cts +4 -0
  518. package/dist/record/definition/index.d.mts +4 -0
  519. package/dist/record/definition/index.d.ts +4 -0
  520. package/dist/record/definition/index.js +16 -0
  521. package/dist/record/definition/index.js.map +1 -0
  522. package/dist/record/definition/schema-codec.cjs +347 -0
  523. package/dist/record/definition/schema-codec.cjs.map +1 -0
  524. package/dist/record/definition/schema-codec.d.cts +48 -0
  525. package/dist/record/definition/schema-codec.d.mts +48 -0
  526. package/dist/record/definition/schema-codec.d.ts +48 -0
  527. package/dist/record/definition/schema-codec.js +8 -0
  528. package/dist/record/definition/schema-codec.js.map +1 -0
  529. package/dist/record/errors/record-errors.cjs +2 -2
  530. package/dist/record/errors/record-errors.cjs.map +1 -1
  531. package/dist/record/errors/record-errors.d.cts +2 -2
  532. package/dist/record/errors/record-errors.d.mts +2 -2
  533. package/dist/record/errors/record-errors.d.ts +2 -2
  534. package/dist/record/family/artifacts.cjs +83 -0
  535. package/dist/record/family/artifacts.cjs.map +1 -0
  536. package/dist/record/family/artifacts.d.cts +225 -0
  537. package/dist/record/family/artifacts.d.mts +225 -0
  538. package/dist/record/family/artifacts.d.ts +225 -0
  539. package/dist/record/family/artifacts.js +14 -0
  540. package/dist/record/family/artifacts.js.map +1 -0
  541. package/dist/record/family/assertions.cjs +172 -0
  542. package/dist/record/family/assertions.cjs.map +1 -0
  543. package/dist/record/family/assertions.d.cts +292 -0
  544. package/dist/record/family/assertions.d.mts +292 -0
  545. package/dist/record/family/assertions.d.ts +292 -0
  546. package/dist/record/family/assertions.js +20 -0
  547. package/dist/record/family/assertions.js.map +1 -0
  548. package/dist/record/family/catalog.cjs +91 -0
  549. package/dist/record/family/catalog.cjs.map +1 -0
  550. package/dist/record/family/catalog.d.cts +3653 -0
  551. package/dist/record/family/catalog.d.mts +3653 -0
  552. package/dist/record/family/catalog.d.ts +3653 -0
  553. package/dist/record/family/catalog.js +34 -0
  554. package/dist/record/family/catalog.js.map +1 -0
  555. package/dist/record/family/common.cjs +80 -0
  556. package/dist/record/family/common.cjs.map +1 -0
  557. package/dist/record/family/common.d.cts +44 -0
  558. package/dist/record/family/common.d.mts +44 -0
  559. package/dist/record/family/common.d.ts +44 -0
  560. package/dist/record/family/common.js +28 -0
  561. package/dist/record/family/common.js.map +1 -0
  562. package/dist/record/family/file-changes.cjs +278 -0
  563. package/dist/record/family/file-changes.cjs.map +1 -0
  564. package/dist/record/family/file-changes.d.cts +643 -0
  565. package/dist/record/family/file-changes.d.mts +643 -0
  566. package/dist/record/family/file-changes.d.ts +643 -0
  567. package/dist/record/family/file-changes.js +32 -0
  568. package/dist/record/family/file-changes.js.map +1 -0
  569. package/dist/record/family/index.cjs +24 -0
  570. package/dist/record/family/index.cjs.map +1 -0
  571. package/dist/record/family/index.d.cts +7 -0
  572. package/dist/record/family/index.d.mts +7 -0
  573. package/dist/record/family/index.d.ts +7 -0
  574. package/dist/record/family/index.js +148 -0
  575. package/dist/record/family/index.js.map +1 -0
  576. package/dist/record/family/observability.cjs +511 -0
  577. package/dist/record/family/observability.cjs.map +1 -0
  578. package/dist/record/family/observability.d.cts +2879 -0
  579. package/dist/record/family/observability.d.mts +2879 -0
  580. package/dist/record/family/observability.d.ts +2879 -0
  581. package/dist/record/family/observability.js +30 -0
  582. package/dist/record/family/observability.js.map +1 -0
  583. package/dist/record/family/source-navigation.cjs +215 -0
  584. package/dist/record/family/source-navigation.cjs.map +1 -0
  585. package/dist/record/family/source-navigation.d.cts +330 -0
  586. package/dist/record/family/source-navigation.d.mts +330 -0
  587. package/dist/record/family/source-navigation.d.ts +330 -0
  588. package/dist/record/family/source-navigation.js +24 -0
  589. package/dist/record/family/source-navigation.js.map +1 -0
  590. package/dist/record/family/sources.cjs +82 -0
  591. package/dist/record/family/sources.cjs.map +1 -0
  592. package/dist/record/family/sources.d.cts +81 -0
  593. package/dist/record/family/sources.d.mts +81 -0
  594. package/dist/record/family/sources.d.ts +81 -0
  595. package/dist/record/family/sources.js +14 -0
  596. package/dist/record/family/sources.js.map +1 -0
  597. package/dist/record/host/index.cjs +11 -0
  598. package/dist/record/host/index.cjs.map +1 -0
  599. package/dist/record/host/index.d.cts +7 -0
  600. package/dist/record/host/index.d.mts +7 -0
  601. package/dist/record/host/index.d.ts +7 -0
  602. package/dist/record/host/index.js +6 -0
  603. package/dist/record/host/index.js.map +1 -0
  604. package/dist/record/host/index.mjs +6 -0
  605. package/dist/record/host/index.mjs.map +1 -0
  606. package/dist/record/host/runtime.cjs +1696 -0
  607. package/dist/record/host/runtime.cjs.map +1 -0
  608. package/dist/record/host/runtime.d.cts +2 -0
  609. package/dist/record/host/runtime.d.mts +2 -0
  610. package/dist/record/host/runtime.d.ts +2 -0
  611. package/dist/record/host/runtime.js +6 -0
  612. package/dist/record/host/types.cjs +9 -0
  613. package/dist/record/host/types.cjs.map +1 -0
  614. package/dist/record/host/types.d.cts +259 -0
  615. package/dist/record/host/types.d.mts +259 -0
  616. package/dist/record/host/types.d.ts +259 -0
  617. package/dist/record/host/types.js +14 -0
  618. package/dist/record/host/types.js.map +1 -0
  619. package/dist/record/index.cjs +19 -52
  620. package/dist/record/index.cjs.map +1 -1
  621. package/dist/record/index.d.cts +14 -11
  622. package/dist/record/index.d.mts +14 -11
  623. package/dist/record/index.d.ts +14 -11
  624. package/dist/record/index.js +16 -310
  625. package/dist/record/index.mjs +20 -0
  626. package/dist/record/index.mjs.map +1 -0
  627. package/dist/record/maintenance/runtime.cjs +9 -11
  628. package/dist/record/maintenance/runtime.cjs.map +1 -1
  629. package/dist/record/maintenance/runtime.d.cts +4 -5
  630. package/dist/record/maintenance/runtime.d.mts +4 -5
  631. package/dist/record/maintenance/runtime.d.ts +4 -5
  632. package/dist/record/maintenance/types.cjs.map +1 -1
  633. package/dist/record/maintenance/types.d.cts +7 -8
  634. package/dist/record/maintenance/types.d.mts +7 -8
  635. package/dist/record/maintenance/types.d.ts +7 -8
  636. package/dist/record/migration/index.cjs +2 -25
  637. package/dist/record/migration/index.cjs.map +1 -1
  638. package/dist/record/migration/index.d.cts +11 -8
  639. package/dist/record/migration/index.d.mts +11 -8
  640. package/dist/record/migration/index.d.ts +11 -8
  641. package/dist/record/migration/index.js +2 -44
  642. package/dist/record/model/core.cjs +1 -4
  643. package/dist/record/model/core.cjs.map +1 -1
  644. package/dist/record/model/core.d.cts +59 -39
  645. package/dist/record/model/core.d.mts +59 -39
  646. package/dist/record/model/core.d.ts +59 -39
  647. package/dist/record/model/definition.cjs +147 -0
  648. package/dist/record/model/definition.cjs.map +1 -0
  649. package/dist/record/model/definition.d.cts +463 -0
  650. package/dist/record/model/definition.d.mts +463 -0
  651. package/dist/record/model/definition.d.ts +463 -0
  652. package/dist/record/model/definition.js +40 -0
  653. package/dist/record/model/definition.js.map +1 -0
  654. package/dist/record/model/identifiers.cjs +52 -10
  655. package/dist/record/model/identifiers.cjs.map +1 -1
  656. package/dist/record/model/identifiers.d.cts +44 -3
  657. package/dist/record/model/identifiers.d.mts +44 -3
  658. package/dist/record/model/identifiers.d.ts +44 -3
  659. package/dist/record/model/identifiers.js +62 -36
  660. package/dist/record/model/index.cjs +1 -0
  661. package/dist/record/model/index.cjs.map +1 -1
  662. package/dist/record/model/index.d.cts +1 -0
  663. package/dist/record/model/index.d.mts +1 -0
  664. package/dist/record/model/index.d.ts +1 -0
  665. package/dist/record/model/index.js +86 -48
  666. package/dist/record/model/read-state.cjs.map +1 -1
  667. package/dist/record/model/read-state.d.cts +6 -9
  668. package/dist/record/model/read-state.d.mts +6 -9
  669. package/dist/record/model/read-state.d.ts +6 -9
  670. package/dist/record/model/run-context.cjs +80 -0
  671. package/dist/record/model/run-context.cjs.map +1 -0
  672. package/dist/record/model/run-context.d.cts +30 -0
  673. package/dist/record/model/run-context.d.mts +30 -0
  674. package/dist/record/model/run-context.d.ts +30 -0
  675. package/dist/record/model/run-context.js +14 -0
  676. package/dist/record/model/run-context.js.map +1 -0
  677. package/dist/record/model/validation.cjs +155 -54
  678. package/dist/record/model/validation.cjs.map +1 -1
  679. package/dist/record/model/validation.d.cts +16 -11
  680. package/dist/record/model/validation.d.mts +16 -11
  681. package/dist/record/model/validation.d.ts +16 -11
  682. package/dist/record/model/validation.js +10 -8
  683. package/dist/record/platform/errors.cjs +2 -8
  684. package/dist/record/platform/errors.cjs.map +1 -1
  685. package/dist/record/platform/errors.d.cts +3 -13
  686. package/dist/record/platform/errors.d.mts +3 -13
  687. package/dist/record/platform/errors.d.ts +3 -13
  688. package/dist/record/platform/errors.js +0 -2
  689. package/dist/record/platform/index.js +38 -48
  690. package/dist/record/platform/node.cjs +3 -142
  691. package/dist/record/platform/node.cjs.map +1 -1
  692. package/dist/record/platform/node.d.cts +2 -4
  693. package/dist/record/platform/node.d.mts +2 -4
  694. package/dist/record/platform/node.d.ts +2 -4
  695. package/dist/record/platform/node.js +0 -4
  696. package/dist/record/platform/root.cjs +0 -11
  697. package/dist/record/platform/root.cjs.map +1 -1
  698. package/dist/record/platform/root.d.cts +0 -2
  699. package/dist/record/platform/root.d.mts +0 -2
  700. package/dist/record/platform/root.d.ts +0 -2
  701. package/dist/record/platform/services.cjs +1 -7
  702. package/dist/record/platform/services.cjs.map +1 -1
  703. package/dist/record/platform/services.d.cts +2 -29
  704. package/dist/record/platform/services.d.mts +2 -29
  705. package/dist/record/platform/services.d.ts +2 -29
  706. package/dist/record/platform/services.js +2 -6
  707. package/dist/record/reader/errors.cjs.map +1 -1
  708. package/dist/record/reader/errors.d.cts +3 -2
  709. package/dist/record/reader/errors.d.mts +3 -2
  710. package/dist/record/reader/errors.d.ts +3 -2
  711. package/dist/record/reader/format.cjs +26 -40
  712. package/dist/record/reader/format.cjs.map +1 -1
  713. package/dist/record/reader/format.d.cts +6 -7
  714. package/dist/record/reader/format.d.mts +6 -7
  715. package/dist/record/reader/format.d.ts +6 -7
  716. package/dist/record/reader/index.js +22 -30
  717. package/dist/record/reader/runtime.cjs +112 -636
  718. package/dist/record/reader/runtime.cjs.map +1 -1
  719. package/dist/record/reader/runtime.d.cts +43 -12
  720. package/dist/record/reader/runtime.d.mts +43 -12
  721. package/dist/record/reader/runtime.d.ts +43 -12
  722. package/dist/record/reader/runtime.js +6 -10
  723. package/dist/record/reader/types.cjs +3 -6
  724. package/dist/record/reader/types.cjs.map +1 -1
  725. package/dist/record/reader/types.d.cts +3 -42
  726. package/dist/record/reader/types.d.mts +3 -42
  727. package/dist/record/reader/types.d.ts +3 -42
  728. package/dist/record/reader/types.js +0 -4
  729. package/dist/record/writer/errors.cjs +7 -0
  730. package/dist/record/writer/errors.cjs.map +1 -1
  731. package/dist/record/writer/errors.d.cts +5 -0
  732. package/dist/record/writer/errors.d.mts +5 -0
  733. package/dist/record/writer/errors.d.ts +5 -0
  734. package/dist/record/writer/errors.js +6 -4
  735. package/dist/record/writer/index.cjs +0 -1
  736. package/dist/record/writer/index.cjs.map +1 -1
  737. package/dist/record/writer/index.d.cts +0 -1
  738. package/dist/record/writer/index.d.mts +0 -1
  739. package/dist/record/writer/index.d.ts +0 -1
  740. package/dist/record/writer/index.js +10 -10
  741. package/dist/record/writer/types.cjs.map +1 -1
  742. package/dist/record/writer/types.d.cts +12 -17
  743. package/dist/record/writer/types.d.mts +12 -17
  744. package/dist/record/writer/types.d.ts +12 -17
  745. package/dist/report/assets/colors.cjs +70 -0
  746. package/dist/report/assets/colors.cjs.map +1 -0
  747. package/dist/report/assets/colors.d.cts +22 -0
  748. package/dist/report/assets/colors.d.mts +22 -0
  749. package/dist/report/assets/colors.d.ts +22 -0
  750. package/dist/report/assets/colors.js +18 -0
  751. package/dist/report/assets/colors.js.map +1 -0
  752. package/dist/report/assets/enhance.js +466 -0
  753. package/dist/report/assets/series-encoding.cjs +116 -0
  754. package/dist/report/assets/series-encoding.cjs.map +1 -0
  755. package/dist/report/assets/series-encoding.d.cts +36 -0
  756. package/dist/report/assets/series-encoding.d.mts +36 -0
  757. package/dist/report/assets/series-encoding.d.ts +36 -0
  758. package/dist/report/assets/series-encoding.js +22 -0
  759. package/dist/report/assets/series-encoding.js.map +1 -0
  760. package/dist/report/assets/styles.css +2678 -0
  761. package/dist/report/built-in/analysis-values.cjs +28 -0
  762. package/dist/report/built-in/analysis-values.cjs.map +1 -0
  763. package/dist/report/built-in/analysis-values.d.cts +41 -0
  764. package/dist/report/built-in/analysis-values.d.mts +41 -0
  765. package/dist/report/built-in/analysis-values.d.ts +41 -0
  766. package/dist/report/built-in/analysis-values.js +10 -0
  767. package/dist/report/built-in/analysis-values.js.map +1 -0
  768. package/dist/report/built-in/attempt-overview.cjs +62 -384
  769. package/dist/report/built-in/attempt-overview.cjs.map +1 -1
  770. package/dist/report/built-in/attempt-overview.d.cts +4 -8
  771. package/dist/report/built-in/attempt-overview.d.mts +4 -8
  772. package/dist/report/built-in/attempt-overview.d.ts +4 -8
  773. package/dist/report/built-in/execution.cjs +40 -747
  774. package/dist/report/built-in/execution.cjs.map +1 -1
  775. package/dist/report/built-in/execution.d.cts +10 -19
  776. package/dist/report/built-in/execution.d.mts +10 -19
  777. package/dist/report/built-in/execution.d.ts +10 -19
  778. package/dist/report/built-in/index.cjs +15 -28
  779. package/dist/report/built-in/index.cjs.map +1 -1
  780. package/dist/report/built-in/index.d.cts +4 -6
  781. package/dist/report/built-in/index.d.mts +4 -6
  782. package/dist/report/built-in/index.d.ts +4 -6
  783. package/dist/report/built-in/index.js +22 -31
  784. package/dist/report/built-in/index.mjs +22 -31
  785. package/dist/report/built-in/machine.cjs +41 -0
  786. package/dist/report/built-in/machine.cjs.map +1 -0
  787. package/dist/report/built-in/machine.d.cts +29 -0
  788. package/dist/report/built-in/machine.d.mts +29 -0
  789. package/dist/report/built-in/machine.d.ts +29 -0
  790. package/dist/report/built-in/machine.js +8 -0
  791. package/dist/report/built-in/machine.js.map +1 -0
  792. package/dist/report/built-in/overview.cjs +38 -200
  793. package/dist/report/built-in/overview.cjs.map +1 -1
  794. package/dist/report/built-in/overview.d.cts +5 -5
  795. package/dist/report/built-in/overview.d.mts +5 -5
  796. package/dist/report/built-in/overview.d.ts +5 -5
  797. package/dist/report/built-in/overview.js +0 -2
  798. package/dist/report/built-in/result-components.cjs +325 -0
  799. package/dist/report/built-in/result-components.cjs.map +1 -0
  800. package/dist/report/built-in/result-components.d.cts +94 -0
  801. package/dist/report/built-in/result-components.d.mts +94 -0
  802. package/dist/report/built-in/result-components.d.ts +94 -0
  803. package/dist/report/built-in/result-components.js +24 -0
  804. package/dist/report/built-in/result-components.js.map +1 -0
  805. package/dist/report/built-in/run-membership-overview.cjs +48 -184
  806. package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
  807. package/dist/report/built-in/run-membership-overview.d.cts +5 -5
  808. package/dist/report/built-in/run-membership-overview.d.mts +5 -5
  809. package/dist/report/built-in/run-membership-overview.d.ts +5 -5
  810. package/dist/report/built-in/sandbox-history.cjs +31 -372
  811. package/dist/report/built-in/sandbox-history.cjs.map +1 -1
  812. package/dist/report/built-in/sandbox-history.d.cts +5 -8
  813. package/dist/report/built-in/sandbox-history.d.mts +5 -8
  814. package/dist/report/built-in/sandbox-history.d.ts +5 -8
  815. package/dist/report/built-in/source.cjs +40 -150
  816. package/dist/report/built-in/source.cjs.map +1 -1
  817. package/dist/report/built-in/source.d.cts +10 -11
  818. package/dist/report/built-in/source.d.mts +10 -11
  819. package/dist/report/built-in/source.d.ts +10 -11
  820. package/dist/report/built-in/source.js +1 -0
  821. package/dist/report/built-in/standard.cjs +135 -0
  822. package/dist/report/built-in/standard.cjs.map +1 -0
  823. package/dist/report/built-in/standard.d.cts +91 -0
  824. package/dist/report/built-in/standard.d.mts +91 -0
  825. package/dist/report/built-in/standard.d.ts +91 -0
  826. package/dist/report/built-in/standard.js +17 -0
  827. package/dist/report/built-in/standard.js.map +1 -0
  828. package/dist/report/components/attempt-detail/compute.cjs +763 -0
  829. package/dist/report/components/attempt-detail/compute.cjs.map +1 -0
  830. package/dist/report/components/attempt-detail/compute.d.cts +370 -0
  831. package/dist/report/components/attempt-detail/compute.d.mts +370 -0
  832. package/dist/report/components/attempt-detail/compute.d.ts +370 -0
  833. package/dist/report/components/attempt-detail/compute.js +46 -0
  834. package/dist/report/components/attempt-detail/compute.js.map +1 -0
  835. package/dist/report/components/attempt-detail/content.cjs +411 -0
  836. package/dist/report/components/attempt-detail/content.cjs.map +1 -0
  837. package/dist/report/components/attempt-detail/content.d.cts +34 -0
  838. package/dist/report/components/attempt-detail/content.d.mts +34 -0
  839. package/dist/report/components/attempt-detail/content.d.ts +34 -0
  840. package/dist/report/components/attempt-detail/content.js +30 -0
  841. package/dist/report/components/attempt-detail/content.js.map +1 -0
  842. package/dist/report/components/attempt-detail/index.cjs +314 -0
  843. package/dist/report/components/attempt-detail/index.cjs.map +1 -0
  844. package/dist/report/components/attempt-detail/index.d.cts +27 -0
  845. package/dist/report/components/attempt-detail/index.d.mts +27 -0
  846. package/dist/report/components/attempt-detail/index.d.ts +27 -0
  847. package/dist/report/components/attempt-detail/index.js +34 -0
  848. package/dist/report/components/attempt-detail/index.js.map +1 -0
  849. package/dist/report/components/attempt-detail/validate.cjs +497 -0
  850. package/dist/report/components/attempt-detail/validate.cjs.map +1 -0
  851. package/dist/report/components/attempt-detail/validate.d.cts +14 -0
  852. package/dist/report/components/attempt-detail/validate.d.mts +14 -0
  853. package/dist/report/components/attempt-detail/validate.d.ts +14 -0
  854. package/dist/report/components/attempt-detail/validate.js +30 -0
  855. package/dist/report/components/attempt-detail/validate.js.map +1 -0
  856. package/dist/report/components/entity-lists/compute.cjs +426 -0
  857. package/dist/report/components/entity-lists/compute.cjs.map +1 -0
  858. package/dist/report/components/entity-lists/compute.d.cts +107 -0
  859. package/dist/report/components/entity-lists/compute.d.mts +107 -0
  860. package/dist/report/components/entity-lists/compute.d.ts +107 -0
  861. package/dist/report/components/entity-lists/compute.js +12 -0
  862. package/dist/report/components/entity-lists/compute.js.map +1 -0
  863. package/dist/report/components/entity-lists/content.cjs +275 -0
  864. package/dist/report/components/entity-lists/content.cjs.map +1 -0
  865. package/dist/report/components/entity-lists/content.d.cts +4 -0
  866. package/dist/report/components/entity-lists/content.d.mts +4 -0
  867. package/dist/report/components/entity-lists/content.d.ts +4 -0
  868. package/dist/report/components/entity-lists/content.js +8 -0
  869. package/dist/report/components/entity-lists/content.js.map +1 -0
  870. package/dist/report/components/entity-lists/index.cjs +48 -0
  871. package/dist/report/components/entity-lists/index.cjs.map +1 -0
  872. package/dist/report/components/entity-lists/index.d.cts +39 -0
  873. package/dist/report/components/entity-lists/index.d.mts +39 -0
  874. package/dist/report/components/entity-lists/index.d.ts +39 -0
  875. package/dist/report/components/entity-lists/index.js +22 -0
  876. package/dist/report/components/entity-lists/index.js.map +1 -0
  877. package/dist/report/components/experiment-detail/compute.cjs +228 -0
  878. package/dist/report/components/experiment-detail/compute.cjs.map +1 -0
  879. package/dist/report/components/experiment-detail/compute.d.cts +72 -0
  880. package/dist/report/components/experiment-detail/compute.d.mts +72 -0
  881. package/dist/report/components/experiment-detail/compute.d.ts +72 -0
  882. package/dist/report/components/experiment-detail/compute.js +6 -0
  883. package/dist/report/components/experiment-detail/compute.js.map +1 -0
  884. package/dist/report/components/experiment-detail/index.cjs +84 -0
  885. package/dist/report/components/experiment-detail/index.cjs.map +1 -0
  886. package/dist/report/components/experiment-detail/index.d.cts +13 -0
  887. package/dist/report/components/experiment-detail/index.d.mts +13 -0
  888. package/dist/report/components/experiment-detail/index.d.ts +13 -0
  889. package/dist/report/components/experiment-detail/index.js +6 -0
  890. package/dist/report/components/experiment-detail/index.js.map +1 -0
  891. package/dist/report/components/site-components/HeroCard.cjs +38 -0
  892. package/dist/report/components/site-components/HeroCard.cjs.map +1 -0
  893. package/dist/report/components/site-components/HeroCard.d.cts +14 -0
  894. package/dist/report/components/site-components/HeroCard.d.mts +14 -0
  895. package/dist/report/components/site-components/HeroCard.d.ts +14 -0
  896. package/dist/report/components/site-components/HeroCard.js +6 -0
  897. package/dist/report/components/site-components/HeroCard.js.map +1 -0
  898. package/dist/report/components/site-components/PoweredBy.cjs +12 -0
  899. package/dist/report/components/site-components/PoweredBy.cjs.map +1 -0
  900. package/dist/report/components/site-components/PoweredBy.d.cts +5 -0
  901. package/dist/report/components/site-components/PoweredBy.d.mts +5 -0
  902. package/dist/report/components/site-components/PoweredBy.d.ts +5 -0
  903. package/dist/report/components/site-components/PoweredBy.js +8 -0
  904. package/dist/report/components/site-components/PoweredBy.js.map +1 -0
  905. package/dist/report/components/site-components/compute.cjs +130 -0
  906. package/dist/report/components/site-components/compute.cjs.map +1 -0
  907. package/dist/report/components/site-components/compute.d.cts +36 -0
  908. package/dist/report/components/site-components/compute.d.mts +36 -0
  909. package/dist/report/components/site-components/compute.d.ts +36 -0
  910. package/dist/report/components/site-components/compute.js +16 -0
  911. package/dist/report/components/site-components/compute.js.map +1 -0
  912. package/dist/report/components/site-components/content.cjs +9 -0
  913. package/dist/report/components/site-components/content.cjs.map +1 -0
  914. package/dist/report/components/site-components/content.d.cts +118 -0
  915. package/dist/report/components/site-components/content.d.mts +118 -0
  916. package/dist/report/components/site-components/content.d.ts +118 -0
  917. package/dist/report/components/site-components/content.js +12 -0
  918. package/dist/report/components/site-components/content.js.map +1 -0
  919. package/dist/report/components/site-components/faces.cjs +33 -0
  920. package/dist/report/components/site-components/faces.cjs.map +1 -0
  921. package/dist/report/components/site-components/faces.d.cts +9 -0
  922. package/dist/report/components/site-components/faces.d.mts +9 -0
  923. package/dist/report/components/site-components/faces.d.ts +9 -0
  924. package/dist/report/components/site-components/faces.js +6 -0
  925. package/dist/report/components/site-components/faces.js.map +1 -0
  926. package/dist/report/components/site-components/hero-types.cjs +3 -0
  927. package/dist/report/components/site-components/hero-types.cjs.map +1 -0
  928. package/dist/report/components/site-components/hero-types.d.cts +17 -0
  929. package/dist/report/components/site-components/hero-types.d.mts +17 -0
  930. package/dist/report/components/site-components/hero-types.d.ts +17 -0
  931. package/dist/report/components/site-components/hero-types.js +4 -0
  932. package/dist/report/components/site-components/hero-types.js.map +1 -0
  933. package/dist/report/components/site-components/index.cjs +90 -0
  934. package/dist/report/components/site-components/index.cjs.map +1 -0
  935. package/dist/report/components/site-components/index.d.cts +58 -0
  936. package/dist/report/components/site-components/index.d.mts +58 -0
  937. package/dist/report/components/site-components/index.d.ts +58 -0
  938. package/dist/report/components/site-components/index.js +26 -0
  939. package/dist/report/components/site-components/index.js.map +1 -0
  940. package/dist/report/components/site-components/projections.cjs +86 -0
  941. package/dist/report/components/site-components/projections.cjs.map +1 -0
  942. package/dist/report/components/site-components/projections.d.cts +11 -0
  943. package/dist/report/components/site-components/projections.d.mts +11 -0
  944. package/dist/report/components/site-components/projections.d.ts +11 -0
  945. package/dist/report/components/site-components/projections.js +12 -0
  946. package/dist/report/components/site-components/projections.js.map +1 -0
  947. package/dist/report/components/site-components/scope-warnings.cjs +89 -0
  948. package/dist/report/components/site-components/scope-warnings.cjs.map +1 -0
  949. package/dist/report/components/site-components/scope-warnings.d.cts +34 -0
  950. package/dist/report/components/site-components/scope-warnings.d.mts +34 -0
  951. package/dist/report/components/site-components/scope-warnings.d.ts +34 -0
  952. package/dist/report/components/site-components/scope-warnings.js +8 -0
  953. package/dist/report/components/site-components/scope-warnings.js.map +1 -0
  954. package/dist/report/components/site-components/snapshot-diagnostics.cjs +43 -0
  955. package/dist/report/components/site-components/snapshot-diagnostics.cjs.map +1 -0
  956. package/dist/report/components/site-components/snapshot-diagnostics.d.cts +15 -0
  957. package/dist/report/components/site-components/snapshot-diagnostics.d.mts +15 -0
  958. package/dist/report/components/site-components/snapshot-diagnostics.d.ts +15 -0
  959. package/dist/report/components/site-components/snapshot-diagnostics.js +8 -0
  960. package/dist/report/components/site-components/snapshot-diagnostics.js.map +1 -0
  961. package/dist/report/components/site-components/validators.cjs +140 -0
  962. package/dist/report/components/site-components/validators.cjs.map +1 -0
  963. package/dist/report/components/site-components/validators.d.cts +9 -0
  964. package/dist/report/components/site-components/validators.d.mts +9 -0
  965. package/dist/report/components/site-components/validators.d.ts +9 -0
  966. package/dist/report/components/site-components/validators.js +16 -0
  967. package/dist/report/components/site-components/validators.js.map +1 -0
  968. package/dist/report/components/summaries/compute.cjs +224 -0
  969. package/dist/report/components/summaries/compute.cjs.map +1 -0
  970. package/dist/report/components/summaries/compute.d.cts +78 -0
  971. package/dist/report/components/summaries/compute.d.mts +78 -0
  972. package/dist/report/components/summaries/compute.d.ts +78 -0
  973. package/dist/report/components/summaries/compute.js +10 -0
  974. package/dist/report/components/summaries/compute.js.map +1 -0
  975. package/dist/report/components/summaries/index.cjs +68 -0
  976. package/dist/report/components/summaries/index.cjs.map +1 -0
  977. package/dist/report/components/summaries/index.d.cts +42 -0
  978. package/dist/report/components/summaries/index.d.mts +42 -0
  979. package/dist/report/components/summaries/index.d.ts +42 -0
  980. package/dist/report/components/summaries/index.js +12 -0
  981. package/dist/report/components/summaries/index.js.map +1 -0
  982. package/dist/report/components/summaries/stability-overview.cjs +27 -0
  983. package/dist/report/components/summaries/stability-overview.cjs.map +1 -0
  984. package/dist/report/components/summaries/stability-overview.d.cts +19 -0
  985. package/dist/report/components/summaries/stability-overview.d.mts +19 -0
  986. package/dist/report/components/summaries/stability-overview.d.ts +19 -0
  987. package/dist/report/components/summaries/stability-overview.js +6 -0
  988. package/dist/report/components/summaries/stability-overview.js.map +1 -0
  989. package/dist/report/definition/cell.cjs +90 -0
  990. package/dist/report/definition/cell.cjs.map +1 -0
  991. package/dist/report/definition/cell.d.cts +99 -0
  992. package/dist/report/definition/cell.d.mts +99 -0
  993. package/dist/report/definition/cell.d.ts +99 -0
  994. package/dist/report/definition/cell.js +8 -0
  995. package/dist/report/definition/cell.js.map +1 -0
  996. package/dist/report/definition/grid-layout.cjs +151 -0
  997. package/dist/report/definition/grid-layout.cjs.map +1 -0
  998. package/dist/report/definition/grid-layout.d.cts +77 -0
  999. package/dist/report/definition/grid-layout.d.mts +77 -0
  1000. package/dist/report/definition/grid-layout.d.ts +77 -0
  1001. package/dist/report/definition/grid-layout.js +20 -0
  1002. package/dist/report/definition/grid-layout.js.map +1 -0
  1003. package/dist/report/definition/primitives/callouts-logic.cjs +113 -0
  1004. package/dist/report/definition/primitives/callouts-logic.cjs.map +1 -0
  1005. package/dist/report/definition/primitives/callouts-logic.d.cts +26 -0
  1006. package/dist/report/definition/primitives/callouts-logic.d.mts +26 -0
  1007. package/dist/report/definition/primitives/callouts-logic.d.ts +26 -0
  1008. package/dist/report/definition/primitives/callouts-logic.js +20 -0
  1009. package/dist/report/definition/primitives/callouts-logic.js.map +1 -0
  1010. package/dist/report/definition/primitives/callouts.cjs +105 -0
  1011. package/dist/report/definition/primitives/callouts.cjs.map +1 -0
  1012. package/dist/report/definition/primitives/callouts.d.cts +9 -0
  1013. package/dist/report/definition/primitives/callouts.d.mts +9 -0
  1014. package/dist/report/definition/primitives/callouts.d.ts +9 -0
  1015. package/dist/report/definition/primitives/callouts.js +6 -0
  1016. package/dist/report/definition/primitives/callouts.js.map +1 -0
  1017. package/dist/report/definition/primitives/chart-map.cjs +138 -0
  1018. package/dist/report/definition/primitives/chart-map.cjs.map +1 -0
  1019. package/dist/report/definition/primitives/chart-map.d.cts +77 -0
  1020. package/dist/report/definition/primitives/chart-map.d.mts +77 -0
  1021. package/dist/report/definition/primitives/chart-map.d.ts +77 -0
  1022. package/dist/report/definition/primitives/chart-map.js +12 -0
  1023. package/dist/report/definition/primitives/chart-map.js.map +1 -0
  1024. package/dist/report/definition/primitives/chart.cjs +651 -0
  1025. package/dist/report/definition/primitives/chart.cjs.map +1 -0
  1026. package/dist/report/definition/primitives/chart.d.cts +43 -0
  1027. package/dist/report/definition/primitives/chart.d.mts +43 -0
  1028. package/dist/report/definition/primitives/chart.d.ts +43 -0
  1029. package/dist/report/definition/primitives/chart.js +8 -0
  1030. package/dist/report/definition/primitives/chart.js.map +1 -0
  1031. package/dist/report/definition/primitives/conversation.cjs +255 -0
  1032. package/dist/report/definition/primitives/conversation.cjs.map +1 -0
  1033. package/dist/report/definition/primitives/conversation.d.cts +71 -0
  1034. package/dist/report/definition/primitives/conversation.d.mts +71 -0
  1035. package/dist/report/definition/primitives/conversation.d.ts +71 -0
  1036. package/dist/report/definition/primitives/conversation.js +16 -0
  1037. package/dist/report/definition/primitives/conversation.js.map +1 -0
  1038. package/dist/report/definition/primitives/copy-block.cjs +55 -0
  1039. package/dist/report/definition/primitives/copy-block.cjs.map +1 -0
  1040. package/dist/report/definition/primitives/copy-block.d.cts +19 -0
  1041. package/dist/report/definition/primitives/copy-block.d.mts +19 -0
  1042. package/dist/report/definition/primitives/copy-block.d.ts +19 -0
  1043. package/dist/report/definition/primitives/copy-block.js +6 -0
  1044. package/dist/report/definition/primitives/copy-block.js.map +1 -0
  1045. package/dist/report/definition/primitives/diff-lines.cjs +163 -0
  1046. package/dist/report/definition/primitives/diff-lines.cjs.map +1 -0
  1047. package/dist/report/definition/primitives/diff-lines.d.cts +68 -0
  1048. package/dist/report/definition/primitives/diff-lines.d.mts +68 -0
  1049. package/dist/report/definition/primitives/diff-lines.d.ts +68 -0
  1050. package/dist/report/definition/primitives/diff-lines.js +28 -0
  1051. package/dist/report/definition/primitives/diff-lines.js.map +1 -0
  1052. package/dist/report/definition/primitives/diff-view.cjs +155 -0
  1053. package/dist/report/definition/primitives/diff-view.cjs.map +1 -0
  1054. package/dist/report/definition/primitives/diff-view.d.cts +14 -0
  1055. package/dist/report/definition/primitives/diff-view.d.mts +14 -0
  1056. package/dist/report/definition/primitives/diff-view.d.ts +14 -0
  1057. package/dist/report/definition/primitives/diff-view.js +8 -0
  1058. package/dist/report/definition/primitives/diff-view.js.map +1 -0
  1059. package/dist/report/definition/primitives/downloads.cjs +89 -0
  1060. package/dist/report/definition/primitives/downloads.cjs.map +1 -0
  1061. package/dist/report/definition/primitives/downloads.d.cts +28 -0
  1062. package/dist/report/definition/primitives/downloads.d.mts +28 -0
  1063. package/dist/report/definition/primitives/downloads.d.ts +28 -0
  1064. package/dist/report/definition/primitives/downloads.js +8 -0
  1065. package/dist/report/definition/primitives/downloads.js.map +1 -0
  1066. package/dist/report/definition/primitives/markdown.cjs +290 -0
  1067. package/dist/report/definition/primitives/markdown.cjs.map +1 -0
  1068. package/dist/report/definition/primitives/markdown.d.cts +29 -0
  1069. package/dist/report/definition/primitives/markdown.d.mts +29 -0
  1070. package/dist/report/definition/primitives/markdown.d.ts +29 -0
  1071. package/dist/report/definition/primitives/markdown.js +16 -0
  1072. package/dist/report/definition/primitives/markdown.js.map +1 -0
  1073. package/dist/report/definition/primitives/marks.cjs +96 -0
  1074. package/dist/report/definition/primitives/marks.cjs.map +1 -0
  1075. package/dist/report/definition/primitives/marks.d.cts +125 -0
  1076. package/dist/report/definition/primitives/marks.d.mts +125 -0
  1077. package/dist/report/definition/primitives/marks.d.ts +125 -0
  1078. package/dist/report/definition/primitives/marks.js +14 -0
  1079. package/dist/report/definition/primitives/marks.js.map +1 -0
  1080. package/dist/report/definition/primitives/points-dataset.cjs +147 -0
  1081. package/dist/report/definition/primitives/points-dataset.cjs.map +1 -0
  1082. package/dist/report/definition/primitives/points-dataset.d.cts +17 -0
  1083. package/dist/report/definition/primitives/points-dataset.d.mts +17 -0
  1084. package/dist/report/definition/primitives/points-dataset.d.ts +17 -0
  1085. package/dist/report/definition/primitives/points-dataset.js +6 -0
  1086. package/dist/report/definition/primitives/points-dataset.js.map +1 -0
  1087. package/dist/report/definition/primitives/shared.cjs +131 -0
  1088. package/dist/report/definition/primitives/shared.cjs.map +1 -0
  1089. package/dist/report/definition/primitives/shared.d.cts +67 -0
  1090. package/dist/report/definition/primitives/shared.d.mts +67 -0
  1091. package/dist/report/definition/primitives/shared.d.ts +67 -0
  1092. package/dist/report/definition/primitives/shared.js +34 -0
  1093. package/dist/report/definition/primitives/shared.js.map +1 -0
  1094. package/dist/report/definition/primitives/source-view.cjs +204 -0
  1095. package/dist/report/definition/primitives/source-view.cjs.map +1 -0
  1096. package/dist/report/definition/primitives/source-view.d.cts +47 -0
  1097. package/dist/report/definition/primitives/source-view.d.mts +47 -0
  1098. package/dist/report/definition/primitives/source-view.d.ts +47 -0
  1099. package/dist/report/definition/primitives/source-view.js +8 -0
  1100. package/dist/report/definition/primitives/source-view.js.map +1 -0
  1101. package/dist/report/definition/primitives/text-panel-state.cjs +38 -0
  1102. package/dist/report/definition/primitives/text-panel-state.cjs.map +1 -0
  1103. package/dist/report/definition/primitives/text-panel-state.d.cts +9 -0
  1104. package/dist/report/definition/primitives/text-panel-state.d.mts +9 -0
  1105. package/dist/report/definition/primitives/text-panel-state.d.ts +9 -0
  1106. package/dist/report/definition/primitives/text-panel-state.js +12 -0
  1107. package/dist/report/definition/primitives/text-panel-state.js.map +1 -0
  1108. package/dist/report/definition/primitives/tool-evidence.cjs +95 -0
  1109. package/dist/report/definition/primitives/tool-evidence.cjs.map +1 -0
  1110. package/dist/report/definition/primitives/tool-evidence.d.cts +11 -0
  1111. package/dist/report/definition/primitives/tool-evidence.d.mts +11 -0
  1112. package/dist/report/definition/primitives/tool-evidence.d.ts +11 -0
  1113. package/dist/report/definition/primitives/tool-evidence.js +6 -0
  1114. package/dist/report/definition/primitives/tool-evidence.js.map +1 -0
  1115. package/dist/report/definition/primitives/turn-trace.cjs +205 -0
  1116. package/dist/report/definition/primitives/turn-trace.cjs.map +1 -0
  1117. package/dist/report/definition/primitives/turn-trace.d.cts +8 -0
  1118. package/dist/report/definition/primitives/turn-trace.d.mts +8 -0
  1119. package/dist/report/definition/primitives/turn-trace.d.ts +8 -0
  1120. package/dist/report/definition/primitives/turn-trace.js +6 -0
  1121. package/dist/report/definition/primitives/turn-trace.js.map +1 -0
  1122. package/dist/report/definition/primitives/waterfall.cjs +206 -0
  1123. package/dist/report/definition/primitives/waterfall.cjs.map +1 -0
  1124. package/dist/report/definition/primitives/waterfall.d.cts +34 -0
  1125. package/dist/report/definition/primitives/waterfall.d.mts +34 -0
  1126. package/dist/report/definition/primitives/waterfall.d.ts +34 -0
  1127. package/dist/report/definition/primitives/waterfall.js +8 -0
  1128. package/dist/report/definition/primitives/waterfall.js.map +1 -0
  1129. package/dist/report/definition/primitives.cjs +826 -0
  1130. package/dist/report/definition/primitives.cjs.map +1 -0
  1131. package/dist/report/definition/primitives.d.cts +194 -0
  1132. package/dist/report/definition/primitives.d.mts +194 -0
  1133. package/dist/report/definition/primitives.d.ts +194 -0
  1134. package/dist/report/definition/primitives.js +84 -0
  1135. package/dist/report/definition/primitives.js.map +1 -0
  1136. package/dist/report/definition/report.cjs +778 -0
  1137. package/dist/report/definition/report.cjs.map +1 -0
  1138. package/dist/report/definition/report.d.cts +203 -0
  1139. package/dist/report/definition/report.d.mts +203 -0
  1140. package/dist/report/definition/report.d.ts +203 -0
  1141. package/dist/report/definition/report.js +16 -0
  1142. package/dist/report/definition/report.js.map +1 -0
  1143. package/dist/report/definition/table-text.cjs +184 -0
  1144. package/dist/report/definition/table-text.cjs.map +1 -0
  1145. package/dist/report/definition/table-text.d.cts +14 -0
  1146. package/dist/report/definition/table-text.d.mts +14 -0
  1147. package/dist/report/definition/table-text.d.ts +14 -0
  1148. package/dist/report/definition/table-text.js +6 -0
  1149. package/dist/report/definition/table-text.js.map +1 -0
  1150. package/dist/report/definition/tree.cjs +685 -0
  1151. package/dist/report/definition/tree.cjs.map +1 -0
  1152. package/dist/report/definition/tree.d.cts +165 -0
  1153. package/dist/report/definition/tree.d.mts +165 -0
  1154. package/dist/report/definition/tree.d.ts +165 -0
  1155. package/dist/report/definition/tree.js +44 -0
  1156. package/dist/report/definition/tree.js.map +1 -0
  1157. package/dist/report/execution/machine.cjs +587 -0
  1158. package/dist/report/execution/machine.cjs.map +1 -0
  1159. package/dist/report/execution/machine.d.cts +291 -0
  1160. package/dist/report/execution/machine.d.mts +291 -0
  1161. package/dist/report/execution/machine.d.ts +291 -0
  1162. package/dist/report/execution/machine.js +36 -0
  1163. package/dist/report/execution/machine.js.map +1 -0
  1164. package/dist/report/execution/model.cjs +91 -463
  1165. package/dist/report/execution/model.cjs.map +1 -1
  1166. package/dist/report/execution/model.d.cts +57 -39
  1167. package/dist/report/execution/model.d.mts +57 -39
  1168. package/dist/report/execution/model.d.ts +57 -39
  1169. package/dist/report/execution/model.js +36 -12
  1170. package/dist/report/execution/paths.cjs +182 -0
  1171. package/dist/report/execution/paths.cjs.map +1 -0
  1172. package/dist/report/execution/paths.d.cts +27 -0
  1173. package/dist/report/execution/paths.d.mts +27 -0
  1174. package/dist/report/execution/paths.d.ts +27 -0
  1175. package/dist/report/execution/paths.js +20 -0
  1176. package/dist/report/execution/paths.js.map +1 -0
  1177. package/dist/report/extension/assets.cjs +143 -0
  1178. package/dist/report/extension/assets.cjs.map +1 -0
  1179. package/dist/report/extension/assets.d.cts +17 -0
  1180. package/dist/report/extension/assets.d.mts +17 -0
  1181. package/dist/report/extension/assets.d.ts +17 -0
  1182. package/dist/report/extension/assets.js +10 -0
  1183. package/dist/report/extension/assets.js.map +1 -0
  1184. package/dist/report/extension/define.cjs +119 -0
  1185. package/dist/report/extension/define.cjs.map +1 -0
  1186. package/dist/report/extension/define.d.cts +11 -0
  1187. package/dist/report/extension/define.d.mts +11 -0
  1188. package/dist/report/extension/define.d.ts +11 -0
  1189. package/dist/report/extension/define.js +6 -0
  1190. package/dist/report/extension/define.js.map +1 -0
  1191. package/dist/report/extension/index.cjs +10 -0
  1192. package/dist/report/extension/index.cjs.map +1 -0
  1193. package/dist/report/extension/index.d.cts +6 -0
  1194. package/dist/report/extension/index.d.mts +6 -0
  1195. package/dist/report/extension/index.d.ts +6 -0
  1196. package/dist/report/extension/index.js +10 -0
  1197. package/dist/report/extension/index.js.map +1 -0
  1198. package/dist/report/extension/index.mjs +10 -0
  1199. package/dist/report/extension/index.mjs.map +1 -0
  1200. package/dist/report/extension/meta.cjs +59 -0
  1201. package/dist/report/extension/meta.cjs.map +1 -0
  1202. package/dist/report/extension/meta.d.cts +13 -0
  1203. package/dist/report/extension/meta.d.mts +13 -0
  1204. package/dist/report/extension/meta.d.ts +13 -0
  1205. package/dist/report/extension/meta.js +12 -0
  1206. package/dist/report/extension/meta.js.map +1 -0
  1207. package/dist/report/extension/types.cjs +3 -0
  1208. package/dist/report/extension/types.cjs.map +1 -0
  1209. package/dist/report/extension/types.d.cts +44 -0
  1210. package/dist/report/extension/types.d.mts +44 -0
  1211. package/dist/report/extension/types.d.ts +44 -0
  1212. package/dist/report/extension/types.js +4 -0
  1213. package/dist/report/extension/types.js.map +1 -0
  1214. package/dist/report/host/execute.cjs +467 -1238
  1215. package/dist/report/host/execute.cjs.map +1 -1
  1216. package/dist/report/host/execute.d.cts +71 -19
  1217. package/dist/report/host/execute.d.mts +71 -19
  1218. package/dist/report/host/execute.d.ts +71 -19
  1219. package/dist/report/host/execute.js +10 -2
  1220. package/dist/report/host/from-record.cjs +446 -27
  1221. package/dist/report/host/from-record.cjs.map +1 -1
  1222. package/dist/report/host/from-record.d.cts +67 -30
  1223. package/dist/report/host/from-record.d.mts +67 -30
  1224. package/dist/report/host/from-record.d.ts +67 -30
  1225. package/dist/report/host/from-record.js +8 -4
  1226. package/dist/report/host/index.cjs +31 -18
  1227. package/dist/report/host/index.cjs.map +1 -1
  1228. package/dist/report/host/index.d.cts +20 -11
  1229. package/dist/report/host/index.d.mts +20 -11
  1230. package/dist/report/host/index.d.ts +20 -11
  1231. package/dist/report/host/index.js +2 -20
  1232. package/dist/report/host/index.mjs +6 -0
  1233. package/dist/report/host/index.mjs.map +1 -0
  1234. package/dist/report/host/machine.cjs +102 -0
  1235. package/dist/report/host/machine.cjs.map +1 -0
  1236. package/dist/report/host/machine.d.cts +7 -0
  1237. package/dist/report/host/machine.d.mts +7 -0
  1238. package/dist/report/host/machine.d.ts +7 -0
  1239. package/dist/report/host/machine.js +6 -0
  1240. package/dist/report/host/machine.js.map +1 -0
  1241. package/dist/report/host/node/loader.cjs +40 -19
  1242. package/dist/report/host/node/loader.cjs.map +1 -1
  1243. package/dist/report/host/node/loader.d.cts +8 -7
  1244. package/dist/report/host/node/loader.d.mts +8 -7
  1245. package/dist/report/host/node/loader.d.ts +8 -7
  1246. package/dist/report/host/node.cjs +1 -1
  1247. package/dist/report/host/node.cjs.map +1 -1
  1248. package/dist/report/host/node.d.cts +3 -3
  1249. package/dist/report/host/node.d.mts +3 -3
  1250. package/dist/report/host/node.d.ts +3 -3
  1251. package/dist/report/host/progress.cjs +41 -0
  1252. package/dist/report/host/progress.cjs.map +1 -0
  1253. package/dist/report/host/progress.d.cts +22 -0
  1254. package/dist/report/host/progress.d.mts +22 -0
  1255. package/dist/report/host/progress.d.ts +22 -0
  1256. package/dist/report/host/progress.js +8 -0
  1257. package/dist/report/host/progress.js.map +1 -0
  1258. package/dist/report/host/show-target.cjs +214 -0
  1259. package/dist/report/host/show-target.cjs.map +1 -0
  1260. package/dist/report/host/show-target.d.cts +107 -0
  1261. package/dist/report/host/show-target.d.mts +107 -0
  1262. package/dist/report/host/show-target.d.ts +107 -0
  1263. package/dist/report/host/show-target.js +8 -0
  1264. package/dist/report/host/show-target.js.map +1 -0
  1265. package/dist/report/host/site-assets.cjs +11 -0
  1266. package/dist/report/host/site-assets.cjs.map +1 -0
  1267. package/dist/report/host/site-assets.d.cts +7 -0
  1268. package/dist/report/host/site-assets.d.mts +7 -0
  1269. package/dist/report/host/site-assets.d.ts +7 -0
  1270. package/dist/report/host/site-assets.js +8 -0
  1271. package/dist/report/host/site-assets.js.map +1 -0
  1272. package/dist/report/host/site-runtime.cjs +91 -0
  1273. package/dist/report/host/site-runtime.cjs.map +1 -0
  1274. package/dist/report/host/site-runtime.d.cts +9 -0
  1275. package/dist/report/host/site-runtime.d.mts +9 -0
  1276. package/dist/report/host/site-runtime.d.ts +9 -0
  1277. package/dist/report/host/site-runtime.js +10 -0
  1278. package/dist/report/host/site-runtime.js.map +1 -0
  1279. package/dist/report/host/static.cjs +694 -99
  1280. package/dist/report/host/static.cjs.map +1 -1
  1281. package/dist/report/host/static.d.cts +36 -19
  1282. package/dist/report/host/static.d.mts +36 -19
  1283. package/dist/report/host/static.d.ts +36 -19
  1284. package/dist/report/host/static.js +14 -4
  1285. package/dist/report/host/target-route.cjs +58 -0
  1286. package/dist/report/host/target-route.cjs.map +1 -0
  1287. package/dist/report/host/target-route.d.cts +15 -0
  1288. package/dist/report/host/target-route.d.mts +15 -0
  1289. package/dist/report/host/target-route.d.ts +15 -0
  1290. package/dist/report/host/target-route.js +8 -0
  1291. package/dist/report/host/target-route.js.map +1 -0
  1292. package/dist/report/host/view-session.cjs +68 -51
  1293. package/dist/report/host/view-session.cjs.map +1 -1
  1294. package/dist/report/host/view-session.d.cts +38 -44
  1295. package/dist/report/host/view-session.d.mts +38 -44
  1296. package/dist/report/host/view-session.d.ts +38 -44
  1297. package/dist/report/index.cjs +111 -52
  1298. package/dist/report/index.cjs.map +1 -1
  1299. package/dist/report/index.d.cts +39 -11
  1300. package/dist/report/index.d.mts +39 -11
  1301. package/dist/report/index.d.ts +39 -11
  1302. package/dist/report/index.js +188 -116
  1303. package/dist/report/index.mjs +188 -116
  1304. package/dist/report/library/details.cjs +166 -0
  1305. package/dist/report/library/details.cjs.map +1 -0
  1306. package/dist/report/library/details.d.cts +29 -0
  1307. package/dist/report/library/details.d.mts +29 -0
  1308. package/dist/report/library/details.d.ts +29 -0
  1309. package/dist/report/library/details.js +18 -0
  1310. package/dist/report/library/details.js.map +1 -0
  1311. package/dist/report/model/aggregate.cjs +243 -0
  1312. package/dist/report/model/aggregate.cjs.map +1 -0
  1313. package/dist/report/model/aggregate.d.cts +88 -0
  1314. package/dist/report/model/aggregate.d.mts +88 -0
  1315. package/dist/report/model/aggregate.d.ts +88 -0
  1316. package/dist/report/model/aggregate.js +26 -0
  1317. package/dist/report/model/aggregate.js.map +1 -0
  1318. package/dist/report/model/chart/math.cjs +206 -0
  1319. package/dist/report/model/chart/math.cjs.map +1 -0
  1320. package/dist/report/model/chart/math.d.cts +73 -0
  1321. package/dist/report/model/chart/math.d.mts +73 -0
  1322. package/dist/report/model/chart/math.d.ts +73 -0
  1323. package/dist/report/model/chart/math.js +14 -0
  1324. package/dist/report/model/chart/math.js.map +1 -0
  1325. package/dist/report/model/chart/plot.cjs +94 -0
  1326. package/dist/report/model/chart/plot.cjs.map +1 -0
  1327. package/dist/report/model/chart/plot.d.cts +52 -0
  1328. package/dist/report/model/chart/plot.d.mts +52 -0
  1329. package/dist/report/model/chart/plot.d.ts +52 -0
  1330. package/dist/report/model/chart/plot.js +8 -0
  1331. package/dist/report/model/chart/plot.js.map +1 -0
  1332. package/dist/report/model/conversions.cjs +100 -0
  1333. package/dist/report/model/conversions.cjs.map +1 -0
  1334. package/dist/report/model/conversions.d.cts +40 -0
  1335. package/dist/report/model/conversions.d.mts +40 -0
  1336. package/dist/report/model/conversions.d.ts +40 -0
  1337. package/dist/report/model/conversions.js +24 -0
  1338. package/dist/report/model/conversions.js.map +1 -0
  1339. package/dist/report/model/dataset.cjs +255 -0
  1340. package/dist/report/model/dataset.cjs.map +1 -0
  1341. package/dist/report/model/dataset.d.cts +33 -0
  1342. package/dist/report/model/dataset.d.mts +33 -0
  1343. package/dist/report/model/dataset.d.ts +33 -0
  1344. package/dist/report/model/dataset.js +22 -0
  1345. package/dist/report/model/dataset.js.map +1 -0
  1346. package/dist/report/model/format.cjs +377 -0
  1347. package/dist/report/model/format.cjs.map +1 -0
  1348. package/dist/report/model/format.d.cts +98 -0
  1349. package/dist/report/model/format.d.mts +98 -0
  1350. package/dist/report/model/format.d.ts +98 -0
  1351. package/dist/report/model/format.js +38 -0
  1352. package/dist/report/model/format.js.map +1 -0
  1353. package/dist/report/model/locale.cjs +437 -0
  1354. package/dist/report/model/locale.cjs.map +1 -0
  1355. package/dist/report/model/locale.d.cts +220 -0
  1356. package/dist/report/model/locale.d.mts +220 -0
  1357. package/dist/report/model/locale.d.ts +220 -0
  1358. package/dist/report/model/locale.js +20 -0
  1359. package/dist/report/model/locale.js.map +1 -0
  1360. package/dist/report/model/metrics.cjs +254 -0
  1361. package/dist/report/model/metrics.cjs.map +1 -0
  1362. package/dist/report/model/metrics.d.cts +73 -0
  1363. package/dist/report/model/metrics.d.mts +73 -0
  1364. package/dist/report/model/metrics.d.ts +73 -0
  1365. package/dist/report/model/metrics.js +26 -0
  1366. package/dist/report/model/metrics.js.map +1 -0
  1367. package/dist/report/model/pricing.cjs +126 -0
  1368. package/dist/report/model/pricing.cjs.map +1 -0
  1369. package/dist/report/model/pricing.d.cts +37 -0
  1370. package/dist/report/model/pricing.d.mts +37 -0
  1371. package/dist/report/model/pricing.d.ts +37 -0
  1372. package/dist/report/model/pricing.js +16 -0
  1373. package/dist/report/model/pricing.js.map +1 -0
  1374. package/dist/report/model/text-layout.cjs +8 -0
  1375. package/dist/report/model/text-layout.cjs.map +1 -1
  1376. package/dist/report/model/text-layout.d.cts +7 -0
  1377. package/dist/report/model/text-layout.d.mts +7 -0
  1378. package/dist/report/model/text-layout.d.ts +7 -0
  1379. package/dist/report/model/text-layout.js +30 -18
  1380. package/dist/report/model/types.cjs +3 -0
  1381. package/dist/report/model/types.cjs.map +1 -0
  1382. package/dist/report/model/types.d.cts +64 -0
  1383. package/dist/report/model/types.d.mts +64 -0
  1384. package/dist/report/model/types.d.ts +64 -0
  1385. package/dist/report/model/types.js +4 -0
  1386. package/dist/report/model/types.js.map +1 -0
  1387. package/dist/report/presentation.cjs +219 -0
  1388. package/dist/report/presentation.cjs.map +1 -0
  1389. package/dist/report/presentation.d.cts +114 -0
  1390. package/dist/report/presentation.d.mts +114 -0
  1391. package/dist/report/presentation.d.ts +114 -0
  1392. package/dist/report/presentation.js +18 -0
  1393. package/dist/report/react/enhance.js +466 -0
  1394. package/dist/report/react/index.cjs +40 -0
  1395. package/dist/report/react/index.cjs.map +1 -0
  1396. package/dist/report/react/index.d.cts +9 -0
  1397. package/dist/report/react/index.d.mts +9 -0
  1398. package/dist/report/react/index.d.ts +9 -0
  1399. package/dist/report/react/index.js +64 -0
  1400. package/dist/report/react/index.js.map +1 -0
  1401. package/dist/report/react/index.mjs +64 -0
  1402. package/dist/report/react/index.mjs.map +1 -0
  1403. package/dist/report/react/styles.css +2678 -0
  1404. package/dist/report/runtime/resolved-page.cjs +327 -0
  1405. package/dist/report/runtime/resolved-page.cjs.map +1 -0
  1406. package/dist/report/runtime/resolved-page.d.cts +136 -0
  1407. package/dist/report/runtime/resolved-page.d.mts +136 -0
  1408. package/dist/report/runtime/resolved-page.d.ts +136 -0
  1409. package/dist/report/runtime/resolved-page.js +14 -0
  1410. package/dist/report/runtime/resolved-page.js.map +1 -0
  1411. package/dist/report/runtime/text.cjs +33 -0
  1412. package/dist/report/runtime/text.cjs.map +1 -0
  1413. package/dist/report/runtime/text.d.cts +28 -0
  1414. package/dist/report/runtime/text.d.mts +28 -0
  1415. package/dist/report/runtime/text.d.ts +28 -0
  1416. package/dist/report/runtime/text.js +8 -0
  1417. package/dist/report/runtime/text.js.map +1 -0
  1418. package/dist/report/runtime/web.cjs +31 -0
  1419. package/dist/report/runtime/web.cjs.map +1 -0
  1420. package/dist/report/runtime/web.d.cts +21 -0
  1421. package/dist/report/runtime/web.d.mts +21 -0
  1422. package/dist/report/runtime/web.d.ts +21 -0
  1423. package/dist/report/runtime/web.js +8 -0
  1424. package/dist/report/runtime/web.js.map +1 -0
  1425. package/dist/report/theme.cjs +141 -0
  1426. package/dist/report/theme.cjs.map +1 -0
  1427. package/dist/report/theme.d.cts +57 -0
  1428. package/dist/report/theme.d.mts +57 -0
  1429. package/dist/report/theme.d.ts +57 -0
  1430. package/dist/report/theme.js +20 -0
  1431. package/dist/runner/accept.cjs +74 -87
  1432. package/dist/runner/accept.cjs.map +1 -1
  1433. package/dist/runner/accept.d.cts +14 -17
  1434. package/dist/runner/accept.d.mts +14 -17
  1435. package/dist/runner/accept.d.ts +14 -17
  1436. package/dist/runner/accept.js +4 -8
  1437. package/dist/runner/adoption.cjs +346 -408
  1438. package/dist/runner/adoption.cjs.map +1 -1
  1439. package/dist/runner/adoption.d.cts +132 -116
  1440. package/dist/runner/adoption.d.mts +132 -116
  1441. package/dist/runner/adoption.d.ts +132 -116
  1442. package/dist/runner/adoption.js +42 -46
  1443. package/dist/runner/attempt.cjs +175 -74
  1444. package/dist/runner/attempt.cjs.map +1 -1
  1445. package/dist/runner/attempt.d.cts +1 -1
  1446. package/dist/runner/attempt.d.mts +1 -1
  1447. package/dist/runner/attempt.d.ts +1 -1
  1448. package/dist/runner/cleanup-timeout.cjs +12 -6
  1449. package/dist/runner/cleanup-timeout.cjs.map +1 -1
  1450. package/dist/runner/cleanup-timeout.d.cts +5 -5
  1451. package/dist/runner/cleanup-timeout.d.mts +5 -5
  1452. package/dist/runner/cleanup-timeout.d.ts +5 -5
  1453. package/dist/runner/execution-identity.cjs +25 -0
  1454. package/dist/runner/execution-identity.cjs.map +1 -0
  1455. package/dist/runner/execution-identity.d.cts +39 -0
  1456. package/dist/runner/execution-identity.d.mts +39 -0
  1457. package/dist/runner/execution-identity.d.ts +39 -0
  1458. package/dist/runner/execution-identity.js +8 -0
  1459. package/dist/runner/execution-identity.js.map +1 -0
  1460. package/dist/runner/feedback/failure.cjs +0 -2
  1461. package/dist/runner/feedback/failure.cjs.map +1 -1
  1462. package/dist/runner/feedback/human.cjs +47 -20
  1463. package/dist/runner/feedback/human.cjs.map +1 -1
  1464. package/dist/runner/feedback/index.cjs.map +1 -1
  1465. package/dist/runner/feedback/index.d.cts +1 -1
  1466. package/dist/runner/feedback/index.d.mts +1 -1
  1467. package/dist/runner/feedback/index.d.ts +1 -1
  1468. package/dist/runner/feedback/json.cjs +29 -7
  1469. package/dist/runner/feedback/json.cjs.map +1 -1
  1470. package/dist/runner/feedback/json.d.cts +14 -1
  1471. package/dist/runner/feedback/json.d.mts +14 -1
  1472. package/dist/runner/feedback/json.d.ts +14 -1
  1473. package/dist/runner/feedback/reducer.cjs +3 -1
  1474. package/dist/runner/feedback/reducer.cjs.map +1 -1
  1475. package/dist/runner/feedback/sink.cjs +1 -1
  1476. package/dist/runner/feedback/sink.cjs.map +1 -1
  1477. package/dist/runner/feedback/sink.d.cts +6 -6
  1478. package/dist/runner/feedback/sink.d.mts +6 -6
  1479. package/dist/runner/feedback/sink.d.ts +6 -6
  1480. package/dist/runner/fingerprint.cjs +8 -2
  1481. package/dist/runner/fingerprint.cjs.map +1 -1
  1482. package/dist/runner/fingerprint.d.cts +9 -0
  1483. package/dist/runner/fingerprint.d.mts +9 -0
  1484. package/dist/runner/fingerprint.d.ts +9 -0
  1485. package/dist/runner/fingerprint.js +4 -2
  1486. package/dist/runner/gate-lease.cjs +24 -12
  1487. package/dist/runner/gate-lease.cjs.map +1 -1
  1488. package/dist/runner/ledger.cjs +27 -5
  1489. package/dist/runner/ledger.cjs.map +1 -1
  1490. package/dist/runner/lock.cjs +24 -11
  1491. package/dist/runner/lock.cjs.map +1 -1
  1492. package/dist/runner/project-current.cjs +63 -0
  1493. package/dist/runner/project-current.cjs.map +1 -1
  1494. package/dist/runner/project-current.d.cts +2 -0
  1495. package/dist/runner/project-current.d.mts +2 -0
  1496. package/dist/runner/project-current.d.ts +2 -0
  1497. package/dist/runner/record.cjs +659 -667
  1498. package/dist/runner/record.cjs.map +1 -1
  1499. package/dist/runner/record.d.cts +54 -81
  1500. package/dist/runner/record.d.mts +54 -81
  1501. package/dist/runner/record.d.ts +54 -81
  1502. package/dist/runner/rename-experiment.cjs +95 -54
  1503. package/dist/runner/rename-experiment.cjs.map +1 -1
  1504. package/dist/runner/rename-experiment.d.cts +19 -21
  1505. package/dist/runner/rename-experiment.d.mts +19 -21
  1506. package/dist/runner/rename-experiment.d.ts +19 -21
  1507. package/dist/runner/rename-experiment.js +2 -4
  1508. package/dist/runner/report.cjs +7 -2
  1509. package/dist/runner/report.cjs.map +1 -1
  1510. package/dist/runner/reporters/braintrust.cjs +4 -16
  1511. package/dist/runner/reporters/braintrust.cjs.map +1 -1
  1512. package/dist/runner/reporters/braintrust.d.cts +22 -5
  1513. package/dist/runner/reporters/braintrust.d.mts +22 -5
  1514. package/dist/runner/reporters/braintrust.d.ts +22 -5
  1515. package/dist/runner/reuse-plan.cjs +256 -435
  1516. package/dist/runner/reuse-plan.cjs.map +1 -1
  1517. package/dist/runner/reuse-plan.d.cts +43 -63
  1518. package/dist/runner/reuse-plan.d.mts +43 -63
  1519. package/dist/runner/reuse-plan.d.ts +43 -63
  1520. package/dist/runner/reuse-plan.js +6 -8
  1521. package/dist/runner/reuse-readback.cjs +157 -170
  1522. package/dist/runner/reuse-readback.cjs.map +1 -1
  1523. package/dist/runner/reuse-readback.d.cts +46 -62
  1524. package/dist/runner/reuse-readback.d.mts +46 -62
  1525. package/dist/runner/reuse-readback.d.ts +46 -62
  1526. package/dist/runner/reuse-readback.js +0 -2
  1527. package/dist/runner/run.cjs +110 -135
  1528. package/dist/runner/run.cjs.map +1 -1
  1529. package/dist/runner/run.d.cts +1 -1
  1530. package/dist/runner/run.d.mts +1 -1
  1531. package/dist/runner/run.d.ts +1 -1
  1532. package/dist/runner/sandbox-pool.cjs +55 -43
  1533. package/dist/runner/sandbox-pool.cjs.map +1 -1
  1534. package/dist/runner/sandbox-record-producer.cjs +21 -6
  1535. package/dist/runner/sandbox-record-producer.cjs.map +1 -1
  1536. package/dist/runner/sandbox-record-producer.d.cts +6 -4
  1537. package/dist/runner/sandbox-record-producer.d.mts +6 -4
  1538. package/dist/runner/sandbox-record-producer.d.ts +6 -4
  1539. package/dist/runner/sandbox-record-producer.js +4 -0
  1540. package/dist/runner/source-producer.cjs +208 -268
  1541. package/dist/runner/source-producer.cjs.map +1 -1
  1542. package/dist/runner/source-producer.d.cts +32 -17
  1543. package/dist/runner/source-producer.d.mts +32 -17
  1544. package/dist/runner/source-producer.d.ts +32 -17
  1545. package/dist/runner/source-producer.js +6 -4
  1546. package/dist/runner/timing.cjs +13 -9
  1547. package/dist/runner/timing.cjs.map +1 -1
  1548. package/dist/runner/types.cjs +3 -2
  1549. package/dist/runner/types.cjs.map +1 -1
  1550. package/dist/runner/types.d.cts +34 -52
  1551. package/dist/runner/types.d.mts +34 -52
  1552. package/dist/runner/types.d.ts +34 -52
  1553. package/dist/runner/types.js +30 -28
  1554. package/dist/sample/analysis.cjs +925 -919
  1555. package/dist/sample/analysis.cjs.map +1 -1
  1556. package/dist/sample/analysis.d.cts +32 -144
  1557. package/dist/sample/analysis.d.mts +32 -144
  1558. package/dist/sample/analysis.d.ts +32 -144
  1559. package/dist/sample/analysis.js +14 -26
  1560. package/dist/sample/capability.cjs +761 -0
  1561. package/dist/sample/capability.cjs.map +1 -0
  1562. package/dist/sample/capability.d.cts +189 -0
  1563. package/dist/sample/capability.d.mts +189 -0
  1564. package/dist/sample/capability.d.ts +189 -0
  1565. package/dist/sample/capability.js +36 -0
  1566. package/dist/sample/capability.js.map +1 -0
  1567. package/dist/sample/index.cjs +9 -13
  1568. package/dist/sample/index.cjs.map +1 -1
  1569. package/dist/sample/index.d.cts +2 -2
  1570. package/dist/sample/index.d.mts +2 -2
  1571. package/dist/sample/index.d.ts +2 -2
  1572. package/dist/sample/index.js +10 -24
  1573. package/dist/sandbox/build-coordinator.cjs +146 -147
  1574. package/dist/sandbox/build-coordinator.cjs.map +1 -1
  1575. package/dist/sandbox/case-types.cjs.map +1 -1
  1576. package/dist/sandbox/case-types.d.cts +6 -0
  1577. package/dist/sandbox/case-types.d.mts +6 -0
  1578. package/dist/sandbox/case-types.d.ts +6 -0
  1579. package/dist/sandbox/commands.cjs.map +1 -1
  1580. package/dist/sandbox/commands.d.cts +0 -2
  1581. package/dist/sandbox/commands.d.mts +0 -2
  1582. package/dist/sandbox/commands.d.ts +0 -2
  1583. package/dist/sandbox/compose.cjs +212 -153
  1584. package/dist/sandbox/compose.cjs.map +1 -1
  1585. package/dist/sandbox/compose.d.cts +11 -2
  1586. package/dist/sandbox/compose.d.mts +11 -2
  1587. package/dist/sandbox/compose.d.ts +11 -2
  1588. package/dist/sandbox/compose.js +32 -30
  1589. package/dist/sandbox/docker.cjs +59 -38
  1590. package/dist/sandbox/docker.cjs.map +1 -1
  1591. package/dist/sandbox/docker.d.cts +2 -1
  1592. package/dist/sandbox/docker.d.mts +2 -1
  1593. package/dist/sandbox/docker.d.ts +2 -1
  1594. package/dist/sandbox/e2b.cjs +30 -18
  1595. package/dist/sandbox/e2b.cjs.map +1 -1
  1596. package/dist/sandbox/index.cjs +2 -2
  1597. package/dist/sandbox/index.cjs.map +1 -1
  1598. package/dist/sandbox/index.d.cts +2 -2
  1599. package/dist/sandbox/index.d.mts +2 -2
  1600. package/dist/sandbox/index.d.ts +2 -2
  1601. package/dist/sandbox/index.js +52 -52
  1602. package/dist/sandbox/index.mjs +52 -52
  1603. package/dist/sandbox/io-retry.cjs +18 -14
  1604. package/dist/sandbox/io-retry.cjs.map +1 -1
  1605. package/dist/sandbox/io-retry.d.cts +7 -4
  1606. package/dist/sandbox/io-retry.d.mts +7 -4
  1607. package/dist/sandbox/io-retry.d.ts +7 -4
  1608. package/dist/sandbox/keep.cjs +79 -52
  1609. package/dist/sandbox/keep.cjs.map +1 -1
  1610. package/dist/sandbox/layer.cjs.map +1 -1
  1611. package/dist/sandbox/layer.d.cts +3 -3
  1612. package/dist/sandbox/layer.d.mts +3 -3
  1613. package/dist/sandbox/layer.d.ts +3 -3
  1614. package/dist/sandbox/paths.cjs +96 -12
  1615. package/dist/sandbox/paths.cjs.map +1 -1
  1616. package/dist/sandbox/paths.d.cts +16 -0
  1617. package/dist/sandbox/paths.d.mts +16 -0
  1618. package/dist/sandbox/paths.d.ts +16 -0
  1619. package/dist/sandbox/paths.js +10 -8
  1620. package/dist/sandbox/prepare-commands.cjs +0 -5
  1621. package/dist/sandbox/prepare-commands.cjs.map +1 -1
  1622. package/dist/sandbox/prepare-commands.d.cts +1 -1
  1623. package/dist/sandbox/prepare-commands.d.mts +1 -1
  1624. package/dist/sandbox/prepare-commands.d.ts +1 -1
  1625. package/dist/sandbox/record/attachment.cjs +16 -53
  1626. package/dist/sandbox/record/attachment.cjs.map +1 -1
  1627. package/dist/sandbox/record/attachment.d.cts +11 -15
  1628. package/dist/sandbox/record/attachment.d.mts +11 -15
  1629. package/dist/sandbox/record/attachment.d.ts +11 -15
  1630. package/dist/sandbox/record/attachment.js +2 -6
  1631. package/dist/sandbox/record/codec.cjs +17 -17
  1632. package/dist/sandbox/record/codec.cjs.map +1 -1
  1633. package/dist/sandbox/record/codec.d.cts +12 -12
  1634. package/dist/sandbox/record/codec.d.mts +12 -12
  1635. package/dist/sandbox/record/codec.d.ts +12 -12
  1636. package/dist/sandbox/record/codec.js +4 -4
  1637. package/dist/sandbox/record/model.cjs +7 -7
  1638. package/dist/sandbox/record/model.cjs.map +1 -1
  1639. package/dist/sandbox/record/model.d.cts +13 -13
  1640. package/dist/sandbox/record/model.d.mts +13 -13
  1641. package/dist/sandbox/record/model.d.ts +13 -13
  1642. package/dist/sandbox/record/model.js +6 -6
  1643. package/dist/sandbox/record/projector.cjs +16 -25
  1644. package/dist/sandbox/record/projector.cjs.map +1 -1
  1645. package/dist/sandbox/record/projector.d.cts +4 -18
  1646. package/dist/sandbox/record/projector.d.mts +4 -18
  1647. package/dist/sandbox/record/projector.d.ts +4 -18
  1648. package/dist/sandbox/record/projector.js +2 -2
  1649. package/dist/sandbox/registry.cjs +19 -9
  1650. package/dist/sandbox/registry.cjs.map +1 -1
  1651. package/dist/sandbox/request-executor.cjs +63 -0
  1652. package/dist/sandbox/request-executor.cjs.map +1 -0
  1653. package/dist/sandbox/request-executor.d.cts +16 -0
  1654. package/dist/sandbox/request-executor.d.mts +16 -0
  1655. package/dist/sandbox/request-executor.d.ts +16 -0
  1656. package/dist/sandbox/request-executor.js +8 -0
  1657. package/dist/sandbox/request-executor.js.map +1 -0
  1658. package/dist/sandbox/retry.cjs +42 -38
  1659. package/dist/sandbox/retry.cjs.map +1 -1
  1660. package/dist/sandbox/retry.d.cts +6 -6
  1661. package/dist/sandbox/retry.d.mts +6 -6
  1662. package/dist/sandbox/retry.d.ts +6 -6
  1663. package/dist/sandbox/runtime.cjs +47 -56
  1664. package/dist/sandbox/runtime.cjs.map +1 -1
  1665. package/dist/sandbox/runtime.d.cts +1 -1
  1666. package/dist/sandbox/runtime.d.mts +1 -1
  1667. package/dist/sandbox/runtime.d.ts +1 -1
  1668. package/dist/sandbox/transfer-errors.cjs +37 -5
  1669. package/dist/sandbox/transfer-errors.cjs.map +1 -1
  1670. package/dist/sandbox/transfer-errors.d.cts +14 -0
  1671. package/dist/sandbox/transfer-errors.d.mts +14 -0
  1672. package/dist/sandbox/transfer-errors.d.ts +14 -0
  1673. package/dist/sandbox/transfer-errors.js +12 -8
  1674. package/dist/sandbox/types.cjs.map +1 -1
  1675. package/dist/sandbox/types.d.cts +0 -7
  1676. package/dist/sandbox/types.d.mts +0 -7
  1677. package/dist/sandbox/types.d.ts +0 -7
  1678. package/dist/sandbox/vercel.cjs +10 -14
  1679. package/dist/sandbox/vercel.cjs.map +1 -1
  1680. package/dist/sources/attachment.cjs +103 -248
  1681. package/dist/sources/attachment.cjs.map +1 -1
  1682. package/dist/sources/attachment.d.cts +47 -319
  1683. package/dist/sources/attachment.d.mts +47 -319
  1684. package/dist/sources/attachment.d.ts +47 -319
  1685. package/dist/sources/attachment.js +8 -18
  1686. package/dist/sources/codec.cjs +56 -56
  1687. package/dist/sources/codec.cjs.map +1 -1
  1688. package/dist/sources/codec.d.cts +63 -63
  1689. package/dist/sources/codec.d.mts +63 -63
  1690. package/dist/sources/codec.d.ts +63 -63
  1691. package/dist/sources/codec.js +44 -44
  1692. package/dist/sources/index.cjs +0 -2
  1693. package/dist/sources/index.cjs.map +1 -1
  1694. package/dist/sources/index.d.cts +0 -2
  1695. package/dist/sources/index.d.mts +0 -2
  1696. package/dist/sources/index.d.ts +0 -2
  1697. package/dist/sources/index.js +72 -86
  1698. package/dist/sources/model.cjs +2 -2
  1699. package/dist/sources/model.cjs.map +1 -1
  1700. package/dist/sources/model.d.cts +41 -41
  1701. package/dist/sources/model.d.mts +41 -41
  1702. package/dist/sources/model.d.ts +41 -41
  1703. package/dist/sources/model.js +2 -2
  1704. package/dist/sources/projector.cjs +39 -268
  1705. package/dist/sources/projector.cjs.map +1 -1
  1706. package/dist/sources/projector.d.cts +40 -8
  1707. package/dist/sources/projector.d.mts +40 -8
  1708. package/dist/sources/projector.d.ts +40 -8
  1709. package/dist/sources/projector.js +4 -6
  1710. package/dist/types.js +30 -28
  1711. package/dist/view/data.cjs.map +1 -1
  1712. package/dist/view/data.d.cts +5 -4
  1713. package/dist/view/data.d.mts +5 -4
  1714. package/dist/view/data.d.ts +5 -4
  1715. package/dist/view/index.cjs +3 -4
  1716. package/dist/view/index.cjs.map +1 -1
  1717. package/dist/view/index.d.cts +2 -2
  1718. package/dist/view/index.d.mts +2 -2
  1719. package/dist/view/index.d.ts +2 -2
  1720. package/dist/view/index.js +2 -4
  1721. package/dist/view/report-view-cache.cjs +200 -0
  1722. package/dist/view/report-view-cache.cjs.map +1 -0
  1723. package/dist/view/report-view-cache.d.cts +67 -0
  1724. package/dist/view/report-view-cache.d.mts +67 -0
  1725. package/dist/view/report-view-cache.d.ts +67 -0
  1726. package/dist/view/report-view-cache.js +8 -0
  1727. package/dist/view/report-view-cache.js.map +1 -0
  1728. package/dist/view/server.cjs +99 -102
  1729. package/dist/view/server.cjs.map +1 -1
  1730. package/dist/view/server.d.cts +0 -6
  1731. package/dist/view/server.d.mts +0 -6
  1732. package/dist/view/server.d.ts +0 -6
  1733. package/dist/view/shared/types.cjs.map +1 -1
  1734. package/dist/view/site.cjs +19 -27
  1735. package/dist/view/site.cjs.map +1 -1
  1736. package/dist/view/site.d.cts +10 -12
  1737. package/dist/view/site.d.mts +10 -12
  1738. package/dist/view/site.d.ts +10 -12
  1739. package/dist/view/site.js +2 -4
  1740. package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +8 -8
  1741. package/docs-site/zh/examples/integrations/claude-sdk.mdx +8 -8
  1742. package/docs-site/zh/examples/integrations/codex-sdk.mdx +4 -4
  1743. package/docs-site/zh/examples/integrations/langgraph.mdx +6 -6
  1744. package/docs-site/zh/examples/integrations/pi-sdk.mdx +9 -9
  1745. package/docs-site/zh/explanation/adapter.mdx +3 -1
  1746. package/docs-site/zh/explanation/assert.mdx +6 -6
  1747. package/docs-site/zh/explanation/drive.mdx +1 -1
  1748. package/docs-site/zh/explanation/evals.mdx +6 -3
  1749. package/docs-site/zh/explanation/hitl.mdx +4 -2
  1750. package/docs-site/zh/explanation/judge.mdx +6 -6
  1751. package/docs-site/zh/explanation/overview.mdx +28 -29
  1752. package/docs-site/zh/explanation/record.mdx +26 -36
  1753. package/docs-site/zh/explanation/runner.mdx +9 -10
  1754. package/docs-site/zh/index.mdx +3 -3
  1755. package/docs-site/zh/introduction.mdx +1 -1
  1756. package/docs-site/zh/reference/cli.mdx +27 -30
  1757. package/docs-site/zh/reference/define-agent.mdx +0 -8
  1758. package/docs-site/zh/reference/define-config.mdx +6 -2
  1759. package/docs-site/zh/reference/define-eval.mdx +7 -5
  1760. package/docs-site/zh/reference/events.mdx +7 -4
  1761. package/docs-site/zh/reference/report-components.mdx +92 -88
  1762. package/docs-site/zh/reference/results-data.mdx +39 -49
  1763. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +1 -1
  1764. package/docs-site/zh/troubleshooting/debugging.mdx +27 -28
  1765. package/docs-site/zh/tutorials/agent-feedback-loop.mdx +6 -6
  1766. package/docs-site/zh/tutorials/agent-onboarding.mdx +2 -2
  1767. package/docs-site/zh/tutorials/authoring.mdx +6 -3
  1768. package/docs-site/zh/tutorials/ci-integration.mdx +1 -1
  1769. package/docs-site/zh/tutorials/connect-your-agent.mdx +4 -4
  1770. package/docs-site/zh/tutorials/custom-reports.mdx +148 -76
  1771. package/docs-site/zh/tutorials/deploy-report-site.mdx +16 -19
  1772. package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
  1773. package/docs-site/zh/tutorials/experiments.mdx +2 -2
  1774. package/docs-site/zh/tutorials/fixtures.mdx +5 -5
  1775. package/docs-site/zh/tutorials/handle-execution-failures.mdx +1 -1
  1776. package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +1 -1
  1777. package/docs-site/zh/tutorials/publish-report.mdx +30 -30
  1778. package/docs-site/zh/tutorials/quickstart.mdx +2 -2
  1779. package/docs-site/zh/tutorials/reporters.mdx +5 -5
  1780. package/docs-site/zh/tutorials/rerun-and-cache.mdx +5 -5
  1781. package/docs-site/zh/tutorials/sandbox-agent.mdx +2 -2
  1782. package/docs-site/zh/tutorials/sandbox-providers.mdx +3 -3
  1783. package/docs-site/zh/tutorials/theming.mdx +47 -19
  1784. package/docs-site/zh/tutorials/viewing-results.mdx +45 -82
  1785. package/docs-site/zh/tutorials/write-experiment.mdx +16 -11
  1786. package/docs-site/zh/tutorials/write-send.mdx +11 -3
  1787. package/package.json +83 -11
  1788. package/dist/assertions/record/diff-model.cjs +0 -120
  1789. package/dist/assertions/record/diff-model.cjs.map +0 -1
  1790. package/dist/assertions/record/diff-model.d.cts +0 -47
  1791. package/dist/assertions/record/diff-model.d.mts +0 -47
  1792. package/dist/assertions/record/diff-model.d.ts +0 -47
  1793. package/dist/assertions/record/diff-model.js +0 -12
  1794. package/dist/assertions/record/diff-model.js.map +0 -1
  1795. package/dist/projection/attachment-result.cjs +0 -50
  1796. package/dist/projection/attachment-result.cjs.map +0 -1
  1797. package/dist/projection/attachment-result.d.cts +0 -38
  1798. package/dist/projection/attachment-result.d.mts +0 -38
  1799. package/dist/projection/attachment-result.d.ts +0 -38
  1800. package/dist/projection/attachment-result.js +0 -6
  1801. package/dist/projection/attachment-result.js.map +0 -1
  1802. package/dist/projection/attempt-selection.cjs +0 -87
  1803. package/dist/projection/attempt-selection.cjs.map +0 -1
  1804. package/dist/projection/attempt-selection.d.cts +0 -40
  1805. package/dist/projection/attempt-selection.d.mts +0 -40
  1806. package/dist/projection/attempt-selection.d.ts +0 -40
  1807. package/dist/projection/attempt-selection.js +0 -8
  1808. package/dist/projection/attempt-selection.js.map +0 -1
  1809. package/dist/projection/coverage.cjs +0 -106
  1810. package/dist/projection/coverage.cjs.map +0 -1
  1811. package/dist/projection/coverage.d.cts +0 -43
  1812. package/dist/projection/coverage.d.mts +0 -43
  1813. package/dist/projection/coverage.d.ts +0 -43
  1814. package/dist/projection/coverage.js +0 -6
  1815. package/dist/projection/coverage.js.map +0 -1
  1816. package/dist/projection/index.cjs +0 -36
  1817. package/dist/projection/index.cjs.map +0 -1
  1818. package/dist/projection/index.d.cts +0 -25
  1819. package/dist/projection/index.d.mts +0 -25
  1820. package/dist/projection/index.d.ts +0 -25
  1821. package/dist/projection/index.js +0 -46
  1822. package/dist/projection/index.mjs +0 -46
  1823. package/dist/projection/model.cjs +0 -3
  1824. package/dist/projection/model.cjs.map +0 -1
  1825. package/dist/projection/model.d.cts +0 -49
  1826. package/dist/projection/model.d.mts +0 -49
  1827. package/dist/projection/model.d.ts +0 -49
  1828. package/dist/projection/model.js +0 -4
  1829. package/dist/projection/model.js.map +0 -1
  1830. package/dist/projection/projector.cjs +0 -111
  1831. package/dist/projection/projector.cjs.map +0 -1
  1832. package/dist/projection/projector.d.cts +0 -51
  1833. package/dist/projection/projector.d.mts +0 -51
  1834. package/dist/projection/projector.d.ts +0 -51
  1835. package/dist/projection/projector.js +0 -16
  1836. package/dist/projection/projector.js.map +0 -1
  1837. package/dist/projection/runtime.cjs +0 -246
  1838. package/dist/projection/runtime.cjs.map +0 -1
  1839. package/dist/projection/runtime.d.cts +0 -14
  1840. package/dist/projection/runtime.d.mts +0 -14
  1841. package/dist/projection/runtime.d.ts +0 -14
  1842. package/dist/projection/runtime.js +0 -6
  1843. package/dist/record/migration/errors.cjs +0 -68
  1844. package/dist/record/migration/errors.cjs.map +0 -1
  1845. package/dist/record/migration/errors.d.cts +0 -73
  1846. package/dist/record/migration/errors.d.mts +0 -73
  1847. package/dist/record/migration/errors.d.ts +0 -73
  1848. package/dist/record/migration/errors.js +0 -22
  1849. package/dist/record/migration/errors.js.map +0 -1
  1850. package/dist/record/migration/identity.cjs +0 -27
  1851. package/dist/record/migration/identity.cjs.map +0 -1
  1852. package/dist/record/migration/identity.d.cts +0 -5
  1853. package/dist/record/migration/identity.d.mts +0 -5
  1854. package/dist/record/migration/identity.d.ts +0 -5
  1855. package/dist/record/migration/identity.js +0 -8
  1856. package/dist/record/migration/internal.cjs +0 -3
  1857. package/dist/record/migration/internal.cjs.map +0 -1
  1858. package/dist/record/migration/internal.d.cts +0 -111
  1859. package/dist/record/migration/internal.d.mts +0 -111
  1860. package/dist/record/migration/internal.d.ts +0 -111
  1861. package/dist/record/migration/internal.js +0 -4
  1862. package/dist/record/migration/internal.js.map +0 -1
  1863. package/dist/record/migration/orchestrate.cjs +0 -368
  1864. package/dist/record/migration/orchestrate.cjs.map +0 -1
  1865. package/dist/record/migration/orchestrate.d.cts +0 -113
  1866. package/dist/record/migration/orchestrate.d.mts +0 -113
  1867. package/dist/record/migration/orchestrate.d.ts +0 -113
  1868. package/dist/record/migration/orchestrate.js +0 -16
  1869. package/dist/record/migration/orchestrate.js.map +0 -1
  1870. package/dist/record/migration/plan.cjs +0 -63
  1871. package/dist/record/migration/plan.cjs.map +0 -1
  1872. package/dist/record/migration/plan.d.cts +0 -32
  1873. package/dist/record/migration/plan.d.mts +0 -32
  1874. package/dist/record/migration/plan.d.ts +0 -32
  1875. package/dist/record/migration/plan.js +0 -10
  1876. package/dist/record/migration/plan.js.map +0 -1
  1877. package/dist/record/migration/registry.cjs +0 -150
  1878. package/dist/record/migration/registry.cjs.map +0 -1
  1879. package/dist/record/migration/registry.d.cts +0 -61
  1880. package/dist/record/migration/registry.d.mts +0 -61
  1881. package/dist/record/migration/registry.d.ts +0 -61
  1882. package/dist/record/migration/registry.js +0 -14
  1883. package/dist/record/migration/registry.js.map +0 -1
  1884. package/dist/record/migration/storage.cjs +0 -382
  1885. package/dist/record/migration/storage.cjs.map +0 -1
  1886. package/dist/record/migration/storage.d.cts +0 -18
  1887. package/dist/record/migration/storage.d.mts +0 -18
  1888. package/dist/record/migration/storage.d.ts +0 -18
  1889. package/dist/record/migration/storage.js +0 -6
  1890. package/dist/record/migration/storage.js.map +0 -1
  1891. package/dist/record/migration/types.cjs.map +0 -1
  1892. package/dist/record/migration/types.d.cts +0 -16
  1893. package/dist/record/migration/types.d.mts +0 -16
  1894. package/dist/record/migration/types.d.ts +0 -16
  1895. package/dist/record/reader/internal.cjs +0 -17
  1896. package/dist/record/reader/internal.cjs.map +0 -1
  1897. package/dist/record/reader/internal.d.cts +0 -26
  1898. package/dist/record/reader/internal.d.mts +0 -26
  1899. package/dist/record/reader/internal.d.ts +0 -26
  1900. package/dist/record/reader/internal.js +0 -8
  1901. package/dist/record/reader/internal.js.map +0 -1
  1902. package/dist/record/writer/runtime.cjs +0 -656
  1903. package/dist/record/writer/runtime.cjs.map +0 -1
  1904. package/dist/record/writer/runtime.d.cts +0 -7
  1905. package/dist/record/writer/runtime.d.mts +0 -7
  1906. package/dist/record/writer/runtime.d.ts +0 -7
  1907. package/dist/record/writer/runtime.js +0 -6
  1908. package/dist/report/author/identity.cjs +0 -268
  1909. package/dist/report/author/identity.cjs.map +0 -1
  1910. package/dist/report/author/identity.d.cts +0 -75
  1911. package/dist/report/author/identity.d.mts +0 -75
  1912. package/dist/report/author/identity.d.ts +0 -75
  1913. package/dist/report/author/identity.js +0 -34
  1914. package/dist/report/author/identity.js.map +0 -1
  1915. package/dist/report/author/index.cjs +0 -19
  1916. package/dist/report/author/index.cjs.map +0 -1
  1917. package/dist/report/author/index.d.cts +0 -4
  1918. package/dist/report/author/index.d.mts +0 -4
  1919. package/dist/report/author/index.d.ts +0 -4
  1920. package/dist/report/author/index.js +0 -30
  1921. package/dist/report/author/internal.cjs +0 -98
  1922. package/dist/report/author/internal.cjs.map +0 -1
  1923. package/dist/report/author/internal.d.cts +0 -91
  1924. package/dist/report/author/internal.d.mts +0 -91
  1925. package/dist/report/author/internal.d.ts +0 -91
  1926. package/dist/report/author/internal.js +0 -18
  1927. package/dist/report/author/internal.js.map +0 -1
  1928. package/dist/report/author/model.cjs +0 -467
  1929. package/dist/report/author/model.cjs.map +0 -1
  1930. package/dist/report/author/model.d.cts +0 -241
  1931. package/dist/report/author/model.d.mts +0 -241
  1932. package/dist/report/author/model.d.ts +0 -241
  1933. package/dist/report/author/model.js +0 -32
  1934. package/dist/report/author/model.js.map +0 -1
  1935. package/dist/report/execution/index.cjs +0 -20
  1936. package/dist/report/execution/index.cjs.map +0 -1
  1937. package/dist/report/execution/index.d.cts +0 -3
  1938. package/dist/report/execution/index.d.mts +0 -3
  1939. package/dist/report/execution/index.d.ts +0 -3
  1940. package/dist/report/execution/index.js +0 -30
  1941. package/dist/report/execution/problems.cjs +0 -210
  1942. package/dist/report/execution/problems.cjs.map +0 -1
  1943. package/dist/report/execution/problems.d.cts +0 -54
  1944. package/dist/report/execution/problems.d.mts +0 -54
  1945. package/dist/report/execution/problems.d.ts +0 -54
  1946. package/dist/report/execution/problems.js +0 -14
  1947. package/dist/report/execution/problems.js.map +0 -1
  1948. package/dist/report/execution/results.cjs +0 -26
  1949. package/dist/report/execution/results.cjs.map +0 -1
  1950. package/dist/report/execution/results.d.cts +0 -102
  1951. package/dist/report/execution/results.d.mts +0 -102
  1952. package/dist/report/execution/results.d.ts +0 -102
  1953. package/dist/report/execution/results.js +0 -8
  1954. package/dist/report/execution/results.js.map +0 -1
  1955. package/dist/report/host/html.cjs +0 -424
  1956. package/dist/report/host/html.cjs.map +0 -1
  1957. package/dist/report/host/html.d.cts +0 -28
  1958. package/dist/report/host/html.d.mts +0 -28
  1959. package/dist/report/host/html.d.ts +0 -28
  1960. package/dist/report/host/html.js +0 -6
  1961. package/dist/report/host/html.js.map +0 -1
  1962. package/dist/report/host/node/theme.cjs +0 -21
  1963. package/dist/report/host/node/theme.cjs.map +0 -1
  1964. package/dist/report/host/node/theme.d.cts +0 -1
  1965. package/dist/report/host/node/theme.d.mts +0 -1
  1966. package/dist/report/host/node/theme.d.ts +0 -1
  1967. package/dist/report/host/node/theme.js +0 -14
  1968. package/dist/report/host/presentation.cjs +0 -423
  1969. package/dist/report/host/presentation.cjs.map +0 -1
  1970. package/dist/report/host/presentation.d.cts +0 -42
  1971. package/dist/report/host/presentation.d.mts +0 -42
  1972. package/dist/report/host/presentation.d.ts +0 -42
  1973. package/dist/report/host/presentation.js +0 -16
  1974. package/dist/report/host/theme.cjs +0 -223
  1975. package/dist/report/host/theme.cjs.map +0 -1
  1976. package/dist/report/host/theme.d.cts +0 -64
  1977. package/dist/report/host/theme.d.mts +0 -64
  1978. package/dist/report/host/theme.d.ts +0 -64
  1979. package/dist/report/host/theme.js +0 -14
  1980. package/dist/report/host/theme.js.map +0 -1
  1981. package/dist/report/semantic/document.cjs +0 -593
  1982. package/dist/report/semantic/document.cjs.map +0 -1
  1983. package/dist/report/semantic/document.d.cts +0 -162
  1984. package/dist/report/semantic/document.d.mts +0 -162
  1985. package/dist/report/semantic/document.d.ts +0 -162
  1986. package/dist/report/semantic/document.js +0 -38
  1987. package/dist/report/semantic/document.js.map +0 -1
  1988. package/dist/report/semantic/index.cjs +0 -18
  1989. package/dist/report/semantic/index.cjs.map +0 -1
  1990. package/dist/report/semantic/index.d.cts +0 -1
  1991. package/dist/report/semantic/index.d.mts +0 -1
  1992. package/dist/report/semantic/index.d.ts +0 -1
  1993. package/dist/report/semantic/index.js +0 -38
  1994. package/dist/shared/facts.cjs +0 -24
  1995. package/dist/shared/facts.cjs.map +0 -1
  1996. package/dist/shared/facts.d.cts +0 -7
  1997. package/dist/shared/facts.d.mts +0 -7
  1998. package/dist/shared/facts.d.ts +0 -7
  1999. package/dist/shared/facts.js +0 -6
  2000. package/dist/shared/facts.js.map +0 -1
  2001. package/dist/show/json.cjs +0 -8
  2002. package/dist/show/json.cjs.map +0 -1
  2003. package/dist/show/json.d.cts +0 -2
  2004. package/dist/show/json.d.mts +0 -2
  2005. package/dist/show/json.d.ts +0 -2
  2006. package/dist/show/json.js +0 -8
  2007. package/dist/show/json.js.map +0 -1
  2008. package/dist/show/render.cjs +0 -7
  2009. package/dist/show/render.cjs.map +0 -1
  2010. package/dist/show/render.d.cts +0 -2
  2011. package/dist/show/render.d.mts +0 -2
  2012. package/dist/show/render.d.ts +0 -2
  2013. package/dist/show/render.js +0 -6
  2014. package/dist/show/render.js.map +0 -1
  2015. package/dist/sources/assemble.cjs +0 -634
  2016. package/dist/sources/assemble.cjs.map +0 -1
  2017. package/dist/sources/assemble.d.cts +0 -6
  2018. package/dist/sources/assemble.d.mts +0 -6
  2019. package/dist/sources/assemble.d.ts +0 -6
  2020. package/dist/sources/assemble.js +0 -6
  2021. package/dist/sources/assemble.js.map +0 -1
  2022. package/dist/sources/projection-model.cjs +0 -3
  2023. package/dist/sources/projection-model.cjs.map +0 -1
  2024. package/dist/sources/projection-model.d.cts +0 -327
  2025. package/dist/sources/projection-model.d.mts +0 -327
  2026. package/dist/sources/projection-model.d.ts +0 -327
  2027. package/dist/sources/projection-model.js +0 -4
  2028. package/dist/sources/projection-model.js.map +0 -1
  2029. /package/dist/{projection → coordination/host}/index.js.map +0 -0
  2030. /package/dist/{projection → coordination/host}/index.mjs.map +0 -0
  2031. /package/dist/{projection → coordination/host}/runtime.js.map +0 -0
  2032. /package/dist/{record/migration → coordination/host}/types.cjs +0 -0
  2033. /package/dist/{record/migration → coordination/host}/types.js +0 -0
  2034. /package/dist/{record/migration → coordination/host}/types.js.map +0 -0
  2035. /package/dist/{record/migration → coordination}/identity.js.map +0 -0
  2036. /package/dist/{report/author → coordination}/index.js.map +0 -0
  2037. /package/dist/{report/execution → coordination/platform}/index.js.map +0 -0
  2038. /package/dist/{report/semantic → experiment/host}/index.js.map +0 -0
  2039. /package/dist/record/{writer → host}/runtime.js.map +0 -0
  2040. /package/dist/report/{host/presentation.js.map → presentation.js.map} +0 -0
  2041. /package/dist/report/{host/node/theme.js.map → theme.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"gate-lease.js","sourceRoot":"","sources":["gate-lease.ts"],"names":[],"mappings":"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","sourcesContent":["// 实验闸租约:把实验级 `maxConcurrency` 的 N 个名额做成跨 Invocation 共用的逐槽租约。\n// 与 ./lock.ts 的用例锁同一套文件纪律(O_EXCL 独占创建、心跳续租、过期判据、rename 接管、\n// 释放即删除),建在 ../shared/entry-file-store.ts 的原语之上,不复制第三份纪律。\n// 契约见 docs/feature/experiments/architecture.md「并发 Invocation:用例锁」末条与\n// docs/runner.md#调度有界并发。\nimport { mkdir, open, rm, type FileHandle } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Effect, Fiber } from \"effect\";\nimport { claimEntryFileEffect, fsyncDirEffect, readAllEntryFilesEffect, readEntryFileEffect, slugHashEntryId, writeEntryFileEffect, } from \"../shared/entry-file-store.ts\";\nimport { CASE_LOCK_EXPIRY_MS, CASE_LOCK_HEARTBEAT_INTERVAL_MS, locksDirOf } from \"./lock.ts\";\n/** 逐槽租约文件的 JSON 形状。身份的权威在内容,文件名只须无碰撞、不承载解析。 */\nexport interface GateLeaseRecord {\n experimentId: string;\n /** 槽位序号,取值 0..N-1。 */\n slot: number;\n /** 本持有者 resolved 的名额上限 N。用于 min-N:生效名额取在场声明的最小值。 */\n declaredN: number;\n pid: number;\n host: string;\n startedAt: string; // ISO\n heartbeatAt: string; // ISO\n}\ntype GateSlotAcquired = {\n kind: \"acquired\";\n slot: number;\n takenOver: boolean;\n takenOverFrom?: GateLeaseRecord;\n record: GateLeaseRecord;\n};\ntype GateSlotAttempt = GateSlotAcquired | {\n kind: \"full\";\n holders: GateLeaseRecord[];\n};\nfunction recordOf(value: unknown): globalThis.Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as globalThis.Record<string, unknown>\n : undefined;\n}\nfunction isPositiveInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\nfunction isSlot(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\nfunction isTimestamp(value: unknown): value is string {\n return typeof value === \"string\" && Number.isFinite(Date.parse(value));\n}\nfunction errnoCode(cause: unknown): string | undefined {\n return typeof cause === \"object\" && cause !== null && \"code\" in cause && typeof cause.code === \"string\"\n ? cause.code\n : undefined;\n}\nfunction nodeIo<A>(operation: (signal: AbortSignal) => Promise<A>): Effect.Effect<A, unknown> {\n return Effect.tryPromise({ try: operation, catch: (cause) => cause });\n}\nfunction withOpenFile<A>(path: string, flags: string, use: (handle: FileHandle) => Effect.Effect<A, unknown>): Effect.Effect<A, unknown> {\n return Effect.scoped(Effect.acquireRelease(nodeIo(() => open(path, flags)), (handle) => nodeIo(() => handle.close()).pipe(Effect.orDie)).pipe(Effect.flatMap(use)));\n}\n/** 验证租约的全部持久字段;按槽读取时还会核对身份,防止错位记录冒充当前持有者。 */\nfunction decodeGateLeaseRecord(value: unknown, expected: {\n experimentId?: string;\n slot?: number;\n} = {}): GateLeaseRecord | undefined {\n const record = recordOf(value);\n if (record === undefined ||\n typeof record.experimentId !== \"string\" ||\n !isSlot(record.slot) ||\n !isPositiveInteger(record.declaredN) ||\n !isPositiveInteger(record.pid) ||\n typeof record.host !== \"string\" ||\n !isTimestamp(record.startedAt) ||\n !isTimestamp(record.heartbeatAt) ||\n (expected.experimentId !== undefined && record.experimentId !== expected.experimentId) ||\n (expected.slot !== undefined && record.slot !== expected.slot)) {\n return undefined;\n }\n return {\n experimentId: record.experimentId,\n slot: record.slot,\n declaredN: record.declaredN,\n pid: record.pid,\n host: record.host,\n startedAt: record.startedAt,\n heartbeatAt: record.heartbeatAt,\n };\n}\n/** 持有者续租心跳的周期。与用例锁同参数。 */\nexport const GATE_LEASE_HEARTBEAT_INTERVAL_MS = CASE_LOCK_HEARTBEAT_INTERVAL_MS;\n/** `heartbeatAt` 落后当前时间超过这个阈值(三个心跳周期)即视为持有者已死。 */\nexport const GATE_LEASE_EXPIRY_MS = CASE_LOCK_EXPIRY_MS;\nexport function gateLeasesDirOf(niceevalRoot: string): string {\n return locksDirOf(niceevalRoot);\n}\nfunction gateLeaseEntryId(experimentId: string, slot: number): string {\n return slugHashEntryId(`gate-${experimentId}-${slot}`, [\"gate-lease\", experimentId, String(slot)]);\n}\n/** Effect 主 API:读取该实验当前在场的全部租约记录,无副作用。 */\nexport function readGateLeasesEffect(niceevalRoot: string, experimentId: string): Effect.Effect<GateLeaseRecord[], unknown> {\n return readAllEntryFilesEffect(gateLeasesDirOf(niceevalRoot), decodeGateLeaseRecord).pipe(Effect.map((entries) => entries\n .map(({ entry }) => entry)\n .filter((entry) => entry.experimentId === experimentId)\n .sort((a, b) => a.slot - b.slot)));\n}\n/** 过期判据:只看心跳时间戳,不看 pid。 */\nexport function isGateLeaseExpired(record: GateLeaseRecord, nowMs: number): boolean {\n const heartbeatMs = Date.parse(record.heartbeatAt);\n if (Number.isNaN(heartbeatMs))\n return true;\n return nowMs - heartbeatMs > GATE_LEASE_EXPIRY_MS;\n}\n/** 本进程声明的 N:非法值收敛到 1,避免永久满位。 */\nfunction normalizeN(n: number): number {\n const floored = Math.floor(n);\n return Number.isFinite(floored) && floored >= 1 ? floored : 1;\n}\n/** min-N:有效名额取自己声明和所有新鲜租约声明的最小值。 */\nfunction effectiveSlotCount(maxConcurrency: number, leases: readonly GateLeaseRecord[], nowMs: number): number {\n let n = normalizeN(maxConcurrency);\n for (const lease of leases) {\n if (isGateLeaseExpired(lease, nowMs))\n continue;\n const declared = normalizeN(lease.declaredN);\n if (declared < n)\n n = declared;\n }\n return n;\n}\n/** O_EXCL 独占创建租约文件;存在时返回 false,不覆盖。 */\nfunction createLeaseFileExclusiveEffect(dir: string, id: string, record: GateLeaseRecord): Effect.Effect<boolean, unknown> {\n const path = join(dir, `${id}.json`);\n return nodeIo(() => mkdir(dir, { recursive: true })).pipe(Effect.zipRight(withOpenFile(path, \"wx\", (handle) => nodeIo(() => handle.writeFile(JSON.stringify(record, null, 2), \"utf-8\")).pipe(Effect.zipRight(nodeIo(() => handle.sync()))))), Effect.zipRight(fsyncDirEffect(dir)), Effect.as(true), Effect.catchAll((cause) => errnoCode(cause) === \"EEXIST\" ? Effect.succeed(false) : Effect.fail(cause)));\n}\n/** 同一持有者判定:身份(pid/host)加上取位时刻——接管重建后 `startedAt` 必然不同。 */\nfunction isSameHolder(record: GateLeaseRecord, mine: GateLeaseRecord): boolean {\n return record.pid === mine.pid && record.host === mine.host && record.startedAt === mine.startedAt;\n}\n/** 一次非阻塞取位:空槽 O_EXCL 创建,满位时只接管过期或损坏槽。 */\nexport function tryAcquireGateSlotOnceEffect(niceevalRoot: string, experimentId: string, maxConcurrency: number, identity: {\n pid: number;\n host: string;\n}, nowMs: number): Effect.Effect<GateSlotAttempt, unknown> {\n const dir = gateLeasesDirOf(niceevalRoot);\n return Effect.gen(function* () {\n const effectiveN = effectiveSlotCount(maxConcurrency, yield* readGateLeasesEffect(niceevalRoot, experimentId), nowMs);\n const stamp = new Date(nowMs).toISOString();\n const recordFor = (slot: number): GateLeaseRecord => ({\n experimentId,\n slot,\n declaredN: normalizeN(maxConcurrency),\n pid: identity.pid,\n host: identity.host,\n startedAt: stamp,\n heartbeatAt: stamp,\n });\n const acquired = (slot: number, record: GateLeaseRecord, options: {\n takenOver: boolean;\n takenOverFrom?: GateLeaseRecord;\n }): GateSlotAcquired => ({ kind: \"acquired\", slot, record, ...options });\n // 第一趟不预读占用情况:O_EXCL 本身就是判据。\n for (let slot = 0; slot < effectiveN; slot += 1) {\n const record = recordFor(slot);\n if (yield* createLeaseFileExclusiveEffect(dir, gateLeaseEntryId(experimentId, slot), record)) {\n return acquired(slot, record, { takenOver: false });\n }\n }\n // 第二趟只对坏条目或过期条目执行 rename 认领;输掉竞态后继续下一槽。\n for (let slot = 0; slot < effectiveN; slot += 1) {\n const id = gateLeaseEntryId(experimentId, slot);\n const current = yield* readEntryFileEffect(dir, id, (value) => decodeGateLeaseRecord(value, { experimentId, slot }));\n if (current === undefined) {\n if (!(yield* claimEntryFileEffect(dir, id)))\n continue;\n const record = recordFor(slot);\n if (!(yield* createLeaseFileExclusiveEffect(dir, id, record)))\n continue;\n return acquired(slot, record, { takenOver: false });\n }\n if (!isGateLeaseExpired(current, nowMs))\n continue;\n if (!(yield* claimEntryFileEffect(dir, id)))\n continue;\n const record = recordFor(slot);\n if (!(yield* createLeaseFileExclusiveEffect(dir, id, record)))\n continue;\n return acquired(slot, record, { takenOver: true, takenOverFrom: current });\n }\n const holders = (yield* readGateLeasesEffect(niceevalRoot, experimentId)).filter((lease) => !isGateLeaseExpired(lease, nowMs));\n return { kind: \"full\", holders };\n });\n}\n/** 续租只改 heartbeat;槽被接管后不写、不删别人的租约。 */\nfunction renewHeartbeatEffect(dir: string, id: string, mine: GateLeaseRecord, nowMs: number, isReleased: () => boolean): Effect.Effect<void, unknown> {\n if (isReleased())\n return Effect.void;\n return readEntryFileEffect(dir, id, (value) => decodeGateLeaseRecord(value, { experimentId: mine.experimentId, slot: mine.slot })).pipe(Effect.flatMap((current) => {\n if (current === undefined || !isSameHolder(current, mine) || isReleased())\n return Effect.void;\n return writeEntryFileEffect(dir, id, { ...current, heartbeatAt: new Date(nowMs).toISOString() });\n }));\n}\nfunction makeAbortError(signal: AbortSignal | undefined): Error {\n const reason = signal?.reason;\n if (reason instanceof Error)\n return reason;\n const err = new Error(\"aborted while waiting for experiment gate slot\");\n err.name = \"AbortError\";\n return err;\n}\nfunction awaitAbort(signal: AbortSignal | undefined): Effect.Effect<never, Error> {\n return Effect.async((resume, effectSignal) => {\n if (signal === undefined)\n return;\n const cleanup = (): void => {\n signal.removeEventListener(\"abort\", onAbort);\n effectSignal.removeEventListener(\"abort\", cleanup);\n };\n const onAbort = (): void => {\n cleanup();\n resume(Effect.fail(makeAbortError(signal)));\n };\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n effectSignal.addEventListener(\"abort\", cleanup, { once: true });\n });\n}\nfunction delayOrAbortEffect(ms: number, signal: AbortSignal | undefined): Effect.Effect<void, Error> {\n if (signal?.aborted)\n return Effect.fail(makeAbortError(signal));\n return Effect.raceFirst(Effect.sleep(ms), awaitAbort(signal)).pipe(Effect.asVoid);\n}\nexport interface GateLeaseEffectClaim {\n readonly slot: number;\n readonly release: Effect.Effect<void, unknown>;\n}\nexport interface AcquireGateSlotEffectResult {\n claim: GateLeaseEffectClaim;\n takenOver: boolean;\n takenOverFrom?: GateLeaseRecord;\n}\nconst held = new Map<string, Effect.Effect<void, unknown>>();\nfunction heldKey(niceevalRoot: string, id: string): string {\n return `${niceevalRoot} ${id}`;\n}\n/** 高层 Effect 入口:等待可中断;心跳顺序化,release 等正在飞的不可中断续租结束再删除。 */\nexport function acquireGateSlotEffect(niceevalRoot: string, experimentId: string, maxConcurrency: number, identity: {\n pid: number;\n host: string;\n}, opts: {\n signal?: AbortSignal;\n pollIntervalMs?: number;\n heartbeatIntervalMs?: number;\n onWaitStart?: (holders: GateLeaseRecord[]) => void;\n} = {}): Effect.Effect<AcquireGateSlotEffectResult, unknown> {\n const heartbeatIntervalMs = opts.heartbeatIntervalMs ?? GATE_LEASE_HEARTBEAT_INTERVAL_MS;\n const pollIntervalMs = opts.pollIntervalMs ?? heartbeatIntervalMs;\n let waitStarted = false;\n const acquireLoop = (): Effect.Effect<{\n slot: number;\n takenOver: boolean;\n takenOverFrom?: GateLeaseRecord;\n record: GateLeaseRecord;\n }, unknown> => Effect.suspend(() => {\n if (opts.signal?.aborted)\n return Effect.fail(makeAbortError(opts.signal));\n return tryAcquireGateSlotOnceEffect(niceevalRoot, experimentId, maxConcurrency, identity, Date.now()).pipe(Effect.flatMap((result) => {\n if (result.kind === \"acquired\")\n return Effect.succeed(result);\n const reportWait = waitStarted\n ? Effect.void\n : Effect.sync(() => {\n waitStarted = true;\n opts.onWaitStart?.(result.holders);\n });\n return reportWait.pipe(Effect.zipRight(delayOrAbortEffect(pollIntervalMs, opts.signal)), Effect.zipRight(acquireLoop()));\n }));\n });\n return Effect.uninterruptibleMask((restore) => restore(acquireLoop()).pipe(Effect.flatMap(({ slot, takenOver, takenOverFrom, record }) => {\n const dir = gateLeasesDirOf(niceevalRoot);\n const id = gateLeaseEntryId(experimentId, slot);\n const key = heldKey(niceevalRoot, id);\n let released = false;\n const heartbeat = Effect.forever(Effect.sleep(heartbeatIntervalMs).pipe(Effect.zipRight(Effect.suspend(() => Effect.uninterruptible(renewHeartbeatEffect(dir, id, record, Date.now(), () => released)))\n .pipe(Effect.ignore))));\n // A child inherits the parent's interruptibility. This branch still\n // runs under the acquisition mask, so restore the heartbeat before\n // forking; otherwise release would wait forever while interrupting an\n // uninterruptible sleeping fiber.\n return Effect.forkDaemon(restore(heartbeat)).pipe(Effect.map((fiber) => {\n const release = Effect.uninterruptible(Effect.suspend(() => {\n if (released)\n return Effect.void;\n released = true;\n held.delete(key);\n return Fiber.interrupt(fiber).pipe(Effect.zipRight(readEntryFileEffect(dir, id, (value) => decodeGateLeaseRecord(value, { experimentId, slot }))), Effect.flatMap((current) => current !== undefined && !isSameHolder(current, record)\n ? Effect.void\n : nodeIo(() => rm(join(dir, `${id}.json`), { force: true })).pipe(Effect.zipRight(fsyncDirEffect(dir)))));\n }));\n held.set(key, release);\n return { claim: { slot, release }, takenOver, ...(takenOverFrom === undefined ? {} : { takenOverFrom }) };\n }));\n })));\n}\n/** 强清兜底:尽力释放当前进程持有的每一条租约。 */\nexport function drainHeldGateLeasesEffect(): Effect.Effect<number> {\n const releases = [...held.values()];\n return Effect.forEach(releases, (release) => Effect.exit(release), { discard: true }).pipe(Effect.as(releases.length));\n}\n/** 当前进程仍持有的实验闸租约数量,供退出清理与可观察状态汇总。 */\nexport function pendingHeldGateLeaseCount(): number {\n return held.size;\n}\n"]}
1
+ {"version":3,"file":"gate-lease.js","sourceRoot":"","sources":["gate-lease.ts"],"names":[],"mappings":"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","sourcesContent":["// 实验闸租约:把实验级 `maxConcurrency` 的 N 个名额做成跨 Invocation 共用的逐槽租约。\n// 与 ./lock.ts 的用例锁同一套文件纪律(O_EXCL 独占创建、心跳续租、过期判据、rename 接管、\n// 释放即删除),建在 ../shared/entry-file-store.ts 的原语之上,不复制第三份纪律。\n// 契约见 docs/feature/experiments/architecture.md「并发 Invocation:用例锁」末条与\n// docs/runner.md#调度有界并发。\nimport { mkdir, open, rm, type FileHandle } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { Clock, Effect, Fiber } from \"effect\";\nimport { claimEntryFileEffect, fsyncDirEffect, readAllEntryFilesEffect, readEntryFileEffect, slugHashEntryId, writeEntryFileEffect, } from \"../shared/entry-file-store.ts\";\nimport { CASE_LOCK_EXPIRY_MS, CASE_LOCK_HEARTBEAT_INTERVAL_MS, locksDirOf } from \"./lock.ts\";\n/** 逐槽租约文件的 JSON 形状。身份的权威在内容,文件名只须无碰撞、不承载解析。 */\nexport interface GateLeaseRecord {\n experimentId: string;\n /** 槽位序号,取值 0..N-1。 */\n slot: number;\n /** 本持有者 resolved 的名额上限 N。用于 min-N:生效名额取在场声明的最小值。 */\n declaredN: number;\n pid: number;\n host: string;\n startedAt: string; // ISO\n heartbeatAt: string; // ISO\n}\ntype GateSlotAcquired = {\n kind: \"acquired\";\n slot: number;\n takenOver: boolean;\n takenOverFrom?: GateLeaseRecord;\n record: GateLeaseRecord;\n};\ntype GateSlotAttempt = GateSlotAcquired | {\n kind: \"full\";\n holders: GateLeaseRecord[];\n};\nfunction recordOf(value: unknown): globalThis.Record<string, unknown> | undefined {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? value as globalThis.Record<string, unknown>\n : undefined;\n}\nfunction isPositiveInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value > 0;\n}\nfunction isSlot(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\nfunction isTimestamp(value: unknown): value is string {\n return typeof value === \"string\" && Number.isFinite(Date.parse(value));\n}\nfunction errnoCode(cause: unknown): string | undefined {\n return typeof cause === \"object\" && cause !== null && \"code\" in cause && typeof cause.code === \"string\"\n ? cause.code\n : undefined;\n}\nfunction nodeIo<A>(operation: (signal: AbortSignal) => Promise<A>): Effect.Effect<A, unknown> {\n return Effect.tryPromise({ try: operation, catch: (cause) => cause });\n}\nfunction withOpenFile<A>(path: string, flags: string, use: (handle: FileHandle) => Effect.Effect<A, unknown>): Effect.Effect<A, unknown> {\n return Effect.scoped(Effect.acquireRelease(nodeIo(() => open(path, flags)), (handle) => nodeIo(() => handle.close()).pipe(Effect.orDie)).pipe(Effect.flatMap(use)));\n}\n/** 验证租约的全部持久字段;按槽读取时还会核对身份,防止错位记录冒充当前持有者。 */\nfunction decodeGateLeaseRecord(value: unknown, expected: {\n experimentId?: string;\n slot?: number;\n} = {}): GateLeaseRecord | undefined {\n const record = recordOf(value);\n if (record === undefined ||\n typeof record.experimentId !== \"string\" ||\n !isSlot(record.slot) ||\n !isPositiveInteger(record.declaredN) ||\n !isPositiveInteger(record.pid) ||\n typeof record.host !== \"string\" ||\n !isTimestamp(record.startedAt) ||\n !isTimestamp(record.heartbeatAt) ||\n (expected.experimentId !== undefined && record.experimentId !== expected.experimentId) ||\n (expected.slot !== undefined && record.slot !== expected.slot)) {\n return undefined;\n }\n return {\n experimentId: record.experimentId,\n slot: record.slot,\n declaredN: record.declaredN,\n pid: record.pid,\n host: record.host,\n startedAt: record.startedAt,\n heartbeatAt: record.heartbeatAt,\n };\n}\n/** 持有者续租心跳的周期。与用例锁同参数。 */\nexport const GATE_LEASE_HEARTBEAT_INTERVAL_MS = CASE_LOCK_HEARTBEAT_INTERVAL_MS;\n/** `heartbeatAt` 落后当前时间超过这个阈值(三个心跳周期)即视为持有者已死。 */\nexport const GATE_LEASE_EXPIRY_MS = CASE_LOCK_EXPIRY_MS;\nexport function gateLeasesDirOf(niceevalRoot: string): string {\n return locksDirOf(niceevalRoot);\n}\nfunction gateLeaseEntryId(experimentId: string, slot: number): string {\n return slugHashEntryId(`gate-${experimentId}-${slot}`, [\"gate-lease\", experimentId, String(slot)]);\n}\n/** Effect 主 API:读取该实验当前在场的全部租约记录,无副作用。 */\nexport function readGateLeasesEffect(niceevalRoot: string, experimentId: string): Effect.Effect<GateLeaseRecord[], unknown> {\n return readAllEntryFilesEffect(gateLeasesDirOf(niceevalRoot), decodeGateLeaseRecord).pipe(Effect.map((entries) => entries\n .map(({ entry }) => entry)\n .filter((entry) => entry.experimentId === experimentId)\n .sort((a, b) => a.slot - b.slot)));\n}\n/** 过期判据:只看心跳时间戳,不看 pid。 */\nexport function isGateLeaseExpired(record: GateLeaseRecord, nowMs: number): boolean {\n const heartbeatMs = Date.parse(record.heartbeatAt);\n if (Number.isNaN(heartbeatMs))\n return true;\n return nowMs - heartbeatMs > GATE_LEASE_EXPIRY_MS;\n}\n/** 本进程声明的 N:非法值收敛到 1,避免永久满位。 */\nfunction normalizeN(n: number): number {\n const floored = Math.floor(n);\n return Number.isFinite(floored) && floored >= 1 ? floored : 1;\n}\n/** min-N:有效名额取自己声明和所有新鲜租约声明的最小值。 */\nfunction effectiveSlotCount(maxConcurrency: number, leases: readonly GateLeaseRecord[], nowMs: number): number {\n let n = normalizeN(maxConcurrency);\n for (const lease of leases) {\n if (isGateLeaseExpired(lease, nowMs))\n continue;\n const declared = normalizeN(lease.declaredN);\n if (declared < n)\n n = declared;\n }\n return n;\n}\n/** O_EXCL 独占创建租约文件;存在时返回 false,不覆盖。 */\nfunction createLeaseFileExclusiveEffect(dir: string, id: string, record: GateLeaseRecord): Effect.Effect<boolean, unknown> {\n const path = join(dir, `${id}.json`);\n return nodeIo(() => mkdir(dir, { recursive: true })).pipe(Effect.zipRight(withOpenFile(path, \"wx\", (handle) => nodeIo(() => handle.writeFile(JSON.stringify(record, null, 2), \"utf-8\")).pipe(Effect.zipRight(nodeIo(() => handle.sync()))))), Effect.zipRight(fsyncDirEffect(dir)), Effect.as(true), Effect.catchAll((cause) => errnoCode(cause) === \"EEXIST\" ? Effect.succeed(false) : Effect.fail(cause)));\n}\n/** 同一持有者判定:身份(pid/host)加上取位时刻——接管重建后 `startedAt` 必然不同。 */\nfunction isSameHolder(record: GateLeaseRecord, mine: GateLeaseRecord): boolean {\n return record.pid === mine.pid && record.host === mine.host && record.startedAt === mine.startedAt;\n}\n/** 一次非阻塞取位:空槽 O_EXCL 创建,满位时只接管过期或损坏槽。 */\nexport function tryAcquireGateSlotOnceEffect(niceevalRoot: string, experimentId: string, maxConcurrency: number, identity: {\n pid: number;\n host: string;\n}, nowMs: number): Effect.Effect<GateSlotAttempt, unknown> {\n const dir = gateLeasesDirOf(niceevalRoot);\n return Effect.gen(function* () {\n const effectiveN = effectiveSlotCount(maxConcurrency, yield* readGateLeasesEffect(niceevalRoot, experimentId), nowMs);\n const stamp = new Date(nowMs).toISOString();\n const recordFor = (slot: number): GateLeaseRecord => ({\n experimentId,\n slot,\n declaredN: normalizeN(maxConcurrency),\n pid: identity.pid,\n host: identity.host,\n startedAt: stamp,\n heartbeatAt: stamp,\n });\n const acquired = (slot: number, record: GateLeaseRecord, options: {\n takenOver: boolean;\n takenOverFrom?: GateLeaseRecord;\n }): GateSlotAcquired => ({ kind: \"acquired\", slot, record, ...options });\n // 第一趟不预读占用情况:O_EXCL 本身就是判据。\n for (let slot = 0; slot < effectiveN; slot += 1) {\n const record = recordFor(slot);\n if (yield* createLeaseFileExclusiveEffect(dir, gateLeaseEntryId(experimentId, slot), record)) {\n return acquired(slot, record, { takenOver: false });\n }\n }\n // 第二趟只对坏条目或过期条目执行 rename 认领;输掉竞态后继续下一槽。\n for (let slot = 0; slot < effectiveN; slot += 1) {\n const id = gateLeaseEntryId(experimentId, slot);\n const current = yield* readEntryFileEffect(dir, id, (value) => decodeGateLeaseRecord(value, { experimentId, slot }));\n if (current === undefined) {\n if (!(yield* claimEntryFileEffect(dir, id)))\n continue;\n const record = recordFor(slot);\n if (!(yield* createLeaseFileExclusiveEffect(dir, id, record)))\n continue;\n return acquired(slot, record, { takenOver: false });\n }\n if (!isGateLeaseExpired(current, nowMs))\n continue;\n if (!(yield* claimEntryFileEffect(dir, id)))\n continue;\n const record = recordFor(slot);\n if (!(yield* createLeaseFileExclusiveEffect(dir, id, record)))\n continue;\n return acquired(slot, record, { takenOver: true, takenOverFrom: current });\n }\n const holders = (yield* readGateLeasesEffect(niceevalRoot, experimentId)).filter((lease) => !isGateLeaseExpired(lease, nowMs));\n return { kind: \"full\", holders };\n });\n}\n/** 续租只改 heartbeat;槽被接管后不写、不删别人的租约。 */\nfunction renewHeartbeatEffect(dir: string, id: string, mine: GateLeaseRecord, nowMs: number, isReleased: () => boolean): Effect.Effect<void, unknown> {\n if (isReleased())\n return Effect.void;\n return readEntryFileEffect(dir, id, (value) => decodeGateLeaseRecord(value, { experimentId: mine.experimentId, slot: mine.slot })).pipe(Effect.flatMap((current) => {\n if (current === undefined || !isSameHolder(current, mine) || isReleased())\n return Effect.void;\n return writeEntryFileEffect(dir, id, { ...current, heartbeatAt: new Date(nowMs).toISOString() });\n }));\n}\nfunction makeAbortError(signal: AbortSignal | undefined): Error {\n const reason = signal?.reason;\n if (reason instanceof Error)\n return reason;\n const err = new Error(\"aborted while waiting for experiment gate slot\");\n err.name = \"AbortError\";\n return err;\n}\nfunction awaitAbort(signal: AbortSignal | undefined): Effect.Effect<never, Error> {\n if (signal === undefined)\n return Effect.never;\n return Effect.async((resume, effectSignal) => {\n let completed = false;\n const cleanup = (): void => {\n signal.removeEventListener(\"abort\", onAbort);\n effectSignal.removeEventListener(\"abort\", onEffectAbort);\n };\n const cancel = (): void => {\n if (completed)\n return;\n completed = true;\n cleanup();\n };\n const onAbort = (): void => {\n if (completed)\n return;\n cancel();\n resume(Effect.fail(makeAbortError(signal)));\n };\n const onEffectAbort = (): void => cancel();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n effectSignal.addEventListener(\"abort\", onEffectAbort, { once: true });\n // Both listeners must be live before inspecting either signal: otherwise\n // an abort between inspection and registration could strand the waiter.\n if (effectSignal.aborted)\n onEffectAbort();\n else if (signal.aborted)\n onAbort();\n return Effect.sync(cancel);\n });\n}\nfunction delayOrAbortEffect(ms: number, signal: AbortSignal | undefined): Effect.Effect<void, Error> {\n if (signal?.aborted)\n return Effect.fail(makeAbortError(signal));\n return Effect.raceFirst(Effect.sleep(ms), awaitAbort(signal)).pipe(Effect.asVoid);\n}\nexport interface GateLeaseEffectClaim {\n readonly slot: number;\n readonly release: Effect.Effect<void, unknown>;\n}\nexport interface AcquireGateSlotEffectResult {\n claim: GateLeaseEffectClaim;\n takenOver: boolean;\n takenOverFrom?: GateLeaseRecord;\n}\nconst held = new Map<string, Effect.Effect<void, unknown>>();\nfunction heldKey(niceevalRoot: string, id: string): string {\n return `${niceevalRoot} ${id}`;\n}\n/** 高层 Effect 入口:等待可中断;心跳顺序化,release 等正在飞的不可中断续租结束再删除。 */\nexport function acquireGateSlotEffect(niceevalRoot: string, experimentId: string, maxConcurrency: number, identity: {\n pid: number;\n host: string;\n}, opts: {\n signal?: AbortSignal;\n pollIntervalMs?: number;\n heartbeatIntervalMs?: number;\n onWaitStart?: (holders: GateLeaseRecord[]) => void;\n} = {}): Effect.Effect<AcquireGateSlotEffectResult, unknown> {\n const heartbeatIntervalMs = opts.heartbeatIntervalMs ?? GATE_LEASE_HEARTBEAT_INTERVAL_MS;\n const pollIntervalMs = opts.pollIntervalMs ?? heartbeatIntervalMs;\n let waitStarted = false;\n const acquireLoop = (): Effect.Effect<{\n slot: number;\n takenOver: boolean;\n takenOverFrom?: GateLeaseRecord;\n record: GateLeaseRecord;\n }, unknown> => Effect.suspend(() => {\n if (opts.signal?.aborted)\n return Effect.fail(makeAbortError(opts.signal));\n return Clock.currentTimeMillis.pipe(Effect.flatMap((nowMs) => tryAcquireGateSlotOnceEffect(niceevalRoot, experimentId, maxConcurrency, identity, nowMs)), Effect.flatMap((result) => {\n if (result.kind === \"acquired\")\n return Effect.succeed(result);\n const reportWait = waitStarted\n ? Effect.void\n : Effect.sync(() => {\n waitStarted = true;\n opts.onWaitStart?.(result.holders);\n });\n return reportWait.pipe(Effect.zipRight(delayOrAbortEffect(pollIntervalMs, opts.signal)), Effect.zipRight(acquireLoop()));\n }));\n });\n return Effect.uninterruptibleMask((restore) => restore(acquireLoop()).pipe(Effect.flatMap(({ slot, takenOver, takenOverFrom, record }) => {\n const dir = gateLeasesDirOf(niceevalRoot);\n const id = gateLeaseEntryId(experimentId, slot);\n const key = heldKey(niceevalRoot, id);\n let released = false;\n const heartbeat = Effect.forever(Effect.sleep(heartbeatIntervalMs).pipe(Effect.zipRight(Effect.uninterruptible(Clock.currentTimeMillis.pipe(Effect.flatMap((nowMs) => renewHeartbeatEffect(dir, id, record, nowMs, () => released)))).pipe(Effect.ignore))));\n // A child inherits the parent's interruptibility. This branch still\n // runs under the acquisition mask, so restore the heartbeat before\n // forking; otherwise release would wait forever while interrupting an\n // uninterruptible sleeping fiber.\n return Effect.forkDaemon(restore(heartbeat)).pipe(Effect.map((fiber) => {\n const release = Effect.uninterruptible(Effect.suspend(() => {\n if (released)\n return Effect.void;\n released = true;\n held.delete(key);\n return Fiber.interrupt(fiber).pipe(Effect.zipRight(readEntryFileEffect(dir, id, (value) => decodeGateLeaseRecord(value, { experimentId, slot }))), Effect.flatMap((current) => current !== undefined && !isSameHolder(current, record)\n ? Effect.void\n : nodeIo(() => rm(join(dir, `${id}.json`), { force: true })).pipe(Effect.zipRight(fsyncDirEffect(dir)))));\n }));\n held.set(key, release);\n return { claim: { slot, release }, takenOver, ...(takenOverFrom === undefined ? {} : { takenOverFrom }) };\n }));\n })));\n}\n/** 强清兜底:尽力释放当前进程持有的每一条租约。 */\nexport function drainHeldGateLeasesEffect(): Effect.Effect<number> {\n const releases = [...held.values()];\n return Effect.forEach(releases, (release) => Effect.exit(release), { discard: true }).pipe(Effect.as(releases.length));\n}\n/** 当前进程仍持有的实验闸租约数量,供退出清理与可观察状态汇总。 */\nexport function pendingHeldGateLeaseCount(): number {\n return held.size;\n}\n"]}
@@ -33,6 +33,27 @@ const DEFAULT_EXCLUDES = [
33
33
  ".venv",
34
34
  "__pycache__",
35
35
  ];
36
+ const MAX_POLICY_ENTRIES = 256;
37
+ const MAX_POLICY_ENTRY_UTF8_BYTES = 4096;
38
+ const policyEncoder = new TextEncoder();
39
+ function compareAscii(left, right) {
40
+ return left === right ? 0 : left < right ? -1 : 1;
41
+ }
42
+ /** Reject an unrecordable policy before the collector starts, then freeze its canonical evidence form. */
43
+ function canonicalPolicyEntries(entries, name) {
44
+ if (entries.length > MAX_POLICY_ENTRIES) {
45
+ throw new Error(`defineEval({ diff }).${name} may contain at most ${MAX_POLICY_ENTRIES} entries`);
46
+ }
47
+ for (const [index, entry] of entries.entries()) {
48
+ if (typeof entry !== "string") {
49
+ throw new TypeError(`defineEval({ diff }).${name}[${index}] must be a string`);
50
+ }
51
+ if (policyEncoder.encode(entry).byteLength > MAX_POLICY_ENTRY_UTF8_BYTES) {
52
+ throw new Error(`defineEval({ diff }).${name}[${index}] exceeds ${MAX_POLICY_ENTRY_UTF8_BYTES} UTF-8 bytes`);
53
+ }
54
+ }
55
+ return Object.freeze([...new Set(entries)].sort(compareAscii));
56
+ }
36
57
  /**
37
58
  * 单个 send 窗口的证据安全上限。越界必须让 workspace.diff 失败,不能产出误导性的空窗口。
38
59
  * 字节预算只数**真正要传输的文本** before/after:二进制与超过单文件阈值的文本不内联内容、
@@ -215,8 +236,9 @@ function gitignorePathspecs(pattern, exclude) {
215
236
  }
216
237
  /** 打分类账锚点(workspace.baseline 阶段,环境层钩子之后):git init + 冻结排除清单 + 首笔 commit。 */
217
238
  async function createChangeLedger(sandbox, opts) {
218
- const excludes = [...DEFAULT_EXCLUDES, ...(opts?.ignore ?? [])];
219
- const includes = opts?.include ?? [];
239
+ const includes = canonicalPolicyEntries(opts?.include ?? [], "include");
240
+ const ignored = canonicalPolicyEntries(opts?.ignore ?? [], "ignore");
241
+ const excludes = [...DEFAULT_EXCLUDES, ...ignored];
220
242
  // 多数 provider 用固定的宿主内私有路径(每实例全新隔离文件系统,天然不冲突);宿主本身即
221
243
  // 工作树的 provider(如 local)按 sandboxId 登记专属路径,避免同机多次运行互相踩踏
222
244
  // (见 sandbox/ledger-paths.ts —— 这里不认 provider 名,只问登记表)。
@@ -260,9 +282,9 @@ async function createChangeLedger(sandbox, opts) {
260
282
  return {
261
283
  rootExecutionIdentity: ordinaryUid === "0",
262
284
  attribution: Object.freeze({
263
- defaultPolicy: "niceeval-default-excludes",
264
- include: Object.freeze([...includes]),
265
- ignore: Object.freeze([...(opts?.ignore ?? [])]),
285
+ defaultPolicy: "niceeval.sandbox-ledger/default-excludes/v1",
286
+ include: includes,
287
+ ignore: ignored,
266
288
  }),
267
289
  async commitEvalWindow(label) {
268
290
  // 有未记录变化才落这一笔;干净时不产生空的 eval 归因 commit。
@@ -1 +1 @@
1
- {"version":3,"file":"ledger.js","sourceRoot":"","sources":["ledger.ts"],"names":[],"mappings":"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","sourcesContent":["// 变更分类账(私有 git ledger):回答「**agent** 改了什么」,不是「workspace 相对空目录变了什么」。\n// 契约见 docs/feature/sandbox/architecture.md「变更归因:send 窗口与分类账」:\n// - ledger 的 git 目录在沙箱内、workdir 外(runner 私有路径),以 workdir 为 work-tree——\n// workdir 保持素净:agent 看不到 runner 的 .git,eval 需要真实 git repo 时自己 git init,\n// agent 在 workdir 里的任何 git 操作都碰不到分类账。\n// - 三类 commit 时点:锚点一笔(workspace.baseline);每次 t.send() 进入前 workdir 有未记录\n// 变化就落一笔 eval 归因;t.send() 返回后落一笔 agent 归因(send 窗口内的全部变化)。\n// - 归因排除清单 runner 私有、锚点时冻结:项目自己的 .gitignore 不参与归因判断(add -f 绕过),\n// 排除靠 pathspec,include 显式打洞加回。\n// - agent 归因增量 = 逐窗口 delta 序列(DiffWindow[]),不做跨窗口压缩。\nimport type { DiffArtifact, DiffWindow, Sandbox, WindowChange } from \"../types.ts\";\nimport type { AgentWorkspaceDiffPolicy } from \"../assertions/workspace-diff.ts\";\nimport { sandboxSupportsRootCommands } from \"../sandbox/backend.ts\";\nimport { DEFAULT_LEDGER_GIT_DIR, ledgerPathsFor } from \"../sandbox/ledger-paths.ts\";\n/**\n * ledger 的私有 git 目录:workdir 之外、runner 控制;agent 的工具默认不会去 /tmp 翻它。这是\n * 沙箱内 provider(docker/e2b/vercel)的默认值——每个实例都是全新隔离文件系统,固定路径不会\n * 跨实例踩踏。宿主本身即工作树的 provider(如 local)按 sandboxId 登记专属路径覆盖它\n * (见 sandbox/ledger-paths.ts),避免同机多次运行共享同一个 /tmp。\n */\nexport const LEDGER_GIT_DIR = DEFAULT_LEDGER_GIT_DIR;\n/** 整相导出文件的落点(与 ledger 同前缀,同样是 runner 私有路径;覆盖规则同上)。 */\nconst EXPORT_DIR = \"/tmp/.niceeval-ledger-export\";\n/** 默认归因排除清单(锚点时冻结):依赖、构建产物、包管理器缓存与用户项目里的 .niceeval 记录目录。\n * 框架自己不往 workdir 写任何东西(见 docs/observability.md「宿主侧行为断言:t.o11y」),\n * 所以这里没有框架路径要排。 */\nconst DEFAULT_EXCLUDES = [\n \".git\",\n \"node_modules\",\n \".next\",\n \"dist\",\n \"build\",\n \".turbo\",\n \".niceeval\",\n \"coverage\",\n \".cache\",\n \".pnpm-store\",\n \".npm\",\n \".yarn\",\n \"*venv*/\",\n \".venv\",\n \"__pycache__\",\n];\n/**\n * 单个 send 窗口的证据安全上限。越界必须让 workspace.diff 失败,不能产出误导性的空窗口。\n * 字节预算只数**真正要传输的文本** before/after:二进制与超过单文件阈值的文本不内联内容、\n * 只记字节数(WindowChange.elided),因此不占预算——编译产物型窗口(成百上千个 .o 加几个大\n * 文本)不该因为「按尺寸计」被判越界。\n */\nconst MAX_WINDOW_PATHS = 10000;\nconst MAX_WINDOW_TEXT_BYTES = 64 * 1024 * 1024;\n/** 单个文本 blob 的内联阈值:任一侧超过它,该条目按二进制同款处理(记字节数、内容省略)。 */\nconst MAX_FILE_TEXT_BYTES = 1024 * 1024;\n/**\n * 整相导出:一条 POSIX shell 命令枚举**全部** agent 窗口并把证据写进沙箱内导出文件,宿主随后\n * 经文件通道一次下载——provider 往返数与窗口数、文件数都无关。对沙箱环境的全部要求是 git 与\n * POSIX 工具(sh/awk/wc/sort/grep),不依赖 node、python 等运行时。\n *\n * 沙箱内不组装 JSON:导出文件直接拼接 git 原生输出——每窗口四段,`diff-tree -z`(状态 + 前后\n * blob sha + 路径,NUL 安全)、`numstat -z`(二进制识别)、`cat-file --batch-check`(全部 blob\n * 尺寸)、`cat-file --batch`(要内联的文本 blob 内容,输出自带长度帧)——解析与校验全部在宿主侧完成。\n * 需要在沙箱内做的两个判断都不解析路径列:sha 提取用 awk 取 diff-tree 原始输出的第 3/4 列\n * (路径在其后,含空格也不影响);二进制排除靠 numstat 与 diff-tree 输出的行号对齐。\n * 尺寸核算(--batch-check)先于内容读取(--batch),越界在产出任何内容前失败;预算只累计真正\n * 要传输的文本 blob(二进制与单文件超限文本只出字节数,不进 --batch 请求、不计预算)。\n * 宿主侧从 sizes + numstat 两段就能判出哪些条目内容被省略,沙箱不额外输出一份判定清单。\n */\nfunction buildExportScript(exportDir: string): string {\n return [\n \"set -eu\",\n // shellQuote:多数 provider 的 exportDir 是固定字面量(无空格);local 的 exportDir 来自\n // mkdtemp(可能落在含空格的自定义 TMPDIR 下),赋值行不加引号会被 shell 拆成多个词。\n `D=${shellQuote(exportDir)}`,\n 'rm -rf \"$D\" && mkdir -p \"$D\"',\n 'OUT=$D/export.bin',\n ': > \"$OUT\"',\n 'fail() { printf \"%s\\\\n\" \"$1\" >&2; exit 2; }',\n // 帧格式:`section <name> <bytes>` 头一行,后跟原始字节;长度前缀让内容里的任意字节都安全。\n 'emit() { printf \"section %s %s\\\\n\" \"$1\" \"$(($(wc -c < \"$2\")))\" >> \"$OUT\"; cat \"$2\" >> \"$OUT\"; }',\n 'git log --reverse --format=\"%H %s\" > \"$D/log.txt\"',\n \"while IFS= read -r line; do\",\n ' hash=${line%% *}',\n ' subject=${line#* }',\n ' case $subject in \"agent \"*) ;; *) continue ;; esac',\n ' label=${subject#agent }',\n // 非 -z 的 diff-tree 把特殊路径引号转义成单行,一行 = 一个条目:wc -l 即路径数,awk 列取 sha 不碰路径。\n ' git diff-tree -r --no-renames \"$hash^\" \"$hash\" > \"$D/dt.txt\"',\n ' n=$(($(wc -l < \"$D/dt.txt\")))',\n ` [ \"$n\" -le ${MAX_WINDOW_PATHS} ] || fail \"niceeval diff window contains $n paths; limit is ${MAX_WINDOW_PATHS}\"`,\n ' git diff-tree -r --no-renames --numstat \"$hash^\" \"$hash\" > \"$D/ns.txt\"',\n // 全部 blob 出现次数(before + after,零 sha = 无此侧,排除)→ 逐次尺寸核算。\n \" awk '$3 !~ /^0+$/ { print $3 } $4 !~ /^0+$/ { print $4 }' \\\"$D/dt.txt\\\" > \\\"$D/occ.txt\\\"\",\n ' git cat-file --batch-check < \"$D/occ.txt\" > \"$D/sizes.txt\"',\n ' if grep -q \" missing$\" \"$D/sizes.txt\"; then fail \"niceeval ledger export: blob object missing\"; fi',\n // 逐条目分类:numstat 第 1 列为 \"-\" 的行是二进制,按行号对齐标 B,其余标 T,后跟前后 blob sha。\n ' awk \\'NR==FNR { bin[FNR] = ($1 == \"-\"); next } { printf \"%s %s %s\\\\n\", (bin[FNR] ? \"B\" : \"T\"), $3, $4 }\\' \"$D/ns.txt\" \"$D/dt.txt\" > \"$D/entries.txt\"',\n // 要内联的文本 blob(去重):二进制条目与任一侧超过单文件阈值的文本条目都不请求内容,\n // 也不计入窗口预算——它们只出字节数(宿主据同一份 sizes 判成 elided)。\n ` awk -v LIMIT=${MAX_FILE_TEXT_BYTES} -v TOTAL=\"$D/total.txt\" 'NR==FNR { sz[$1] = $3; next } $1 == \"T\" { b = $2; a = $3; if (b !~ /^0+$/ && sz[b] > LIMIT) next; if (a !~ /^0+$/ && sz[a] > LIMIT) next; if (b !~ /^0+$/ && !(b in seen)) { seen[b] = 1; total += sz[b]; print b } if (a !~ /^0+$/ && !(a in seen)) { seen[a] = 1; total += sz[a]; print a } } END { print total+0 > TOTAL }' \"$D/sizes.txt\" \"$D/entries.txt\" > \"$D/text.txt\"`,\n ' bytes=$(cat \"$D/total.txt\")',\n ` [ \"$bytes\" -le ${MAX_WINDOW_TEXT_BYTES} ] || fail \"niceeval diff window transfers $bytes text blob bytes; limit is ${MAX_WINDOW_TEXT_BYTES}; narrow defineEval({ diff }) include/ignore rules\"`,\n ' git cat-file --batch < \"$D/text.txt\" > \"$D/blobs.bin\"',\n ' git diff-tree -r --no-renames -z \"$hash^\" \"$hash\" > \"$D/dtz.bin\"',\n ' git diff-tree -r --no-renames --numstat -z \"$hash^\" \"$hash\" > \"$D/nsz.bin\"',\n ' printf \"window %s %s\\\\n\" \"$hash\" \"$label\" >> \"$OUT\"',\n ' emit difftree \"$D/dtz.bin\"',\n ' emit numstat \"$D/nsz.bin\"',\n ' emit sizes \"$D/sizes.txt\"',\n ' emit blobs \"$D/blobs.bin\"',\n 'done < \"$D/log.txt\"',\n // root ledger commands may create the private export with a restrictive umask. The file is outside\n // workdir; making only this runner artifact readable lets the provider file channel fetch it.\n 'chmod 0644 \"$OUT\"',\n ].join(\"\\n\");\n}\nexport interface ChangeLedger {\n /** send 进入前:workdir 有未记录变化就落一笔 eval 归因(fixture / setup / runCommand 副作用)。 */\n commitEvalWindow(label: string): Promise<void>;\n /** send 返回后:落一笔 agent 归因——这个 send 窗口内的全部 workspace 变化(无变化也落空窗口)。 */\n commitAgentWindow(label: string): Promise<void>;\n /** workspace.diff 阶段:从分类账导出每个 send 窗口自己的 before/after,按时序。 */\n exportWindows(): Promise<DiffArtifact>;\n /** 回到创建时的题间锚点,并保留归因排除清单排除的动态环境。 */\n resetToAnchor(): Promise<void>;\n /**\n * 建账时探测到的执行身份是否为 root(仅当 provider 支持 root ledger 命令时才探测得到,\n * 否则恒为 false)。sandboxReuse 复用池据此在实例进池前拒绝(见 docs/feature/sandbox/reuse.md);\n * `resetToAnchor()` 内的同款判断作纵深防御保留。\n */\n readonly rootExecutionIdentity: boolean;\n /** Frozen semantic identity consumed by the Attempt-owned diff Attachment. */\n readonly attribution: AgentWorkspaceDiffPolicy;\n}\ninterface LedgerOptions {\n /** defineEval({ diff }) 的归因调整:ignore 追加排除,include 打洞加回(优先级最高)。 */\n include?: string[];\n ignore?: string[];\n}\n/** 每条 git 命令都带上私有 GIT_DIR + workdir work-tree;项目/全局 gitignore 一律不参与。 */\nfunction gitEnv(sandbox: Sandbox, gitDir: string): globalThis.Record<string, string> {\n return {\n GIT_DIR: gitDir,\n GIT_WORK_TREE: sandbox.workdir,\n GIT_AUTHOR_NAME: \"niceeval\",\n GIT_AUTHOR_EMAIL: \"niceeval@localhost\",\n GIT_COMMITTER_NAME: \"niceeval\",\n GIT_COMMITTER_EMAIL: \"niceeval@localhost\",\n // Internal root Git must never consume configuration or hooks writable by the Agent.\n GIT_CONFIG_NOSYSTEM: \"1\",\n GIT_CONFIG_GLOBAL: \"/dev/null\",\n GIT_CONFIG_COUNT: \"1\",\n GIT_CONFIG_KEY_0: \"core.hooksPath\",\n GIT_CONFIG_VALUE_0: \"/dev/null\",\n GIT_TERMINAL_PROMPT: \"0\",\n HOME: \"/tmp\",\n };\n}\nfunction shellQuote(s: string): string {\n return `'${s.replaceAll(\"'\", `'\\\\''`)}'`;\n}\n/**\n * Root Git can faithfully restore bytes but would otherwise recreate ordinary fixture files as root.\n * Keep a content-free metadata mirror inside the private (0700) ledger and reapply uid/gid/mode after\n * reset. The batched xargs loops preserve arbitrary Git path bytes without exposing objects to the Agent.\n */\nfunction captureBaselineMetadataScript(): string {\n return [\n 'META=\"$GIT_DIR/niceeval-baseline-metadata\"',\n 'rm -rf \"$META\" && mkdir -p \"$META/files\" \"$META/dirs\"',\n \"export META\",\n \"git ls-files -z | xargs -0 -n 100 sh -c '\",\n \" for p do\",\n ' src=\"$GIT_WORK_TREE/$p\"',\n ' ref=\"$META/files/$p\"',\n ' mkdir -p \"$(dirname \"$ref\")\" && : > \"$ref\"',\n ' owner=$(stat -c \"%u:%g\" \"$src\") && mode=$(stat -c \"%a\" \"$src\")',\n ' chown -h \"$owner\" \"$ref\" && chmod \"$mode\" \"$ref\"',\n ' d=$(dirname \"$p\")',\n ' while [ \"$d\" != \".\" ]; do',\n ' dref=\"$META/dirs/$d/.ref\"',\n ' if [ ! -e \"$dref\" ]; then',\n ' mkdir -p \"$(dirname \"$dref\")\" && : > \"$dref\"',\n ' downer=$(stat -c \"%u:%g\" \"$GIT_WORK_TREE/$d\") && dmode=$(stat -c \"%a\" \"$GIT_WORK_TREE/$d\")',\n ' chown \"$downer\" \"$dref\" && chmod \"$dmode\" \"$dref\"',\n \" fi\",\n ' d=$(dirname \"$d\")',\n \" done\",\n \" done\",\n \"' niceeval-meta\",\n // Agent and any background process share the ordinary sandbox uid. Keep both objects and the\n // metadata mirror root-private for the whole attempt; reset never opens this directory to that uid.\n 'chmod go-rwx \"$GIT_DIR\"',\n ].join(\"\\n\");\n}\nfunction restoreBaselineMetadataScript(): string {\n return [\n 'META=\"$GIT_DIR/niceeval-baseline-metadata\"',\n \"export META\",\n 'if [ -d \"$META/files\" ]; then',\n \" find \\\"$META/files\\\" -type f -print0 | xargs -0 -n 100 sh -c '\",\n \" for ref do\",\n ' p=${ref#\"$META/files/\"}',\n ' target=\"$GIT_WORK_TREE/$p\"',\n ' if [ -e \"$target\" ] || [ -L \"$target\" ]; then',\n ' owner=$(stat -c \"%u:%g\" \"$ref\") && mode=$(stat -c \"%a\" \"$ref\")',\n ' chown -h \"$owner\" \"$target\"',\n ' [ -L \"$target\" ] || chmod \"$mode\" \"$target\"',\n \" fi\",\n \" done\",\n \" ' niceeval-meta-restore\",\n \"fi\",\n // Apply directory metadata last so restrictive parent modes cannot interfere with child repair.\n 'if [ -d \"$META/dirs\" ]; then',\n \" find \\\"$META/dirs\\\" -type f -name .ref -print0 | xargs -0 -n 100 sh -c '\",\n \" for ref do\",\n ' d=${ref%/.ref}',\n ' p=${d#\"$META/dirs/\"}',\n ' target=\"$GIT_WORK_TREE/$p\"',\n ' if [ -d \"$target\" ]; then',\n ' owner=$(stat -c \"%u:%g\" \"$ref\") && mode=$(stat -c \"%a\" \"$ref\")',\n ' chown \"$owner\" \"$target\" && chmod \"$mode\" \"$target\"',\n \" fi\",\n \" done\",\n \" ' niceeval-dir-meta-restore\",\n \"fi\",\n 'chmod go-rwx \"$GIT_DIR\"',\n ].join(\"\\n\");\n}\n/**\n * 把仓库根语义的 gitignore 风格规则编译成 ledger pathspec。\n * 无斜杠的名字匹配任意深度;有斜杠的规则相对 workdir 根;目录本身与后代一起处理。\n */\nfunction gitignorePathspecs(pattern: string, exclude: boolean): string[] {\n let normalized = pattern;\n while (normalized.startsWith(\"./\"))\n normalized = normalized.slice(2);\n if (normalized.startsWith(\"/\"))\n normalized = normalized.slice(1);\n normalized = normalized.replace(/\\/+$/, \"\");\n if (!normalized)\n return [];\n const glob = normalized.includes(\"/\") ? normalized : `**/${normalized}`;\n const globs = exclude && !glob.endsWith(\"/**\") ? [glob, `${glob}/**`] : [glob];\n const magic = exclude ? \":(glob,exclude)\" : \":(glob)\";\n return [...new Set(globs)].map((value) => `${magic}${value}`);\n}\n/** 打分类账锚点(workspace.baseline 阶段,环境层钩子之后):git init + 冻结排除清单 + 首笔 commit。 */\nexport async function createChangeLedger(sandbox: Sandbox, opts?: LedgerOptions): Promise<ChangeLedger> {\n const excludes = [...DEFAULT_EXCLUDES, ...(opts?.ignore ?? [])];\n const includes = opts?.include ?? [];\n // 多数 provider 用固定的宿主内私有路径(每实例全新隔离文件系统,天然不冲突);宿主本身即\n // 工作树的 provider(如 local)按 sandboxId 登记专属路径,避免同机多次运行互相踩踏\n // (见 sandbox/ledger-paths.ts —— 这里不认 provider 名,只问登记表)。\n const paths = ledgerPathsFor(sandbox.sandboxId);\n const gitDir = paths?.gitDir ?? LEDGER_GIT_DIR;\n const exportDir = paths?.exportDir ?? EXPORT_DIR;\n const env = gitEnv(sandbox, gitDir);\n const rootCommands = sandboxSupportsRootCommands(sandbox);\n // 只给 runner 私有 ledger 命令提权,以便读取题目故意设置的受限文件。脚本不 chmod/chown\n // workdir,Agent 命令仍沿标准非 root 身份;不支持提权的 provider 保持既有用户态路径。\n const commandOptions = rootCommands ? { env, user: \"root\" as const } : { env };\n const captureMetadata = rootCommands ? ` && ${captureBaselineMetadataScript()}` : \"\";\n const lockPrivateLedger = rootCommands ? ' && chmod go-rwx \"$GIT_DIR\"' : \"\";\n let ordinaryUid: string | undefined;\n if (rootCommands) {\n // Capture before Agent setup/send can mutate the VM. A post-attempt `id` probe would not be a\n // trustworthy boundary when the configured execution identity itself is root.\n const identity = await sandbox.runShell(\"command -p id -u\", { env });\n ensureCommandSucceeded(identity, \"detect sandbox execution identity for reuse\", false);\n ordinaryUid = identity.stdout.trim();\n }\n // add -A -f:绕过项目自己的 .gitignore(项目 ignore 的文件照常记录);排除靠 pathspec\n // (runner 私有清单,agent / fixture 写 .gitignore 影响不了它);include 用第二次 add 打洞加回。\n const excludeSpecs = excludes.flatMap((pattern) => gitignorePathspecs(pattern, true)).map(shellQuote).join(\" \");\n // include 打洞:路径此刻可能还不存在(如 agent 之后才写),unmatched pathspec 不算错。\n const includeSpecs = includes.flatMap((pattern) => gitignorePathspecs(pattern, false)).map(shellQuote).join(\" \");\n const includeAdd = includeSpecs.length > 0 ? ` && { git -c advice.addEmbeddedRepo=false add -A -f -- ${includeSpecs} 2>/dev/null || true; }` : \"\";\n const rejectGitlinks = \" && nested=$(git ls-files --stage | awk '$1 == \\\"160000\\\" { sub(/^[^\\\\t]*\\\\t/, \\\"\\\"); print; exit }')\" +\n ' && if [ -n \"$nested\" ]; then printf \\'%s\\\\n\\' \"niceeval ledger cannot track nested Git repository $nested as file-level evidence; move the checkout to sandbox.workdir root, or add the whole path to defineEval({ diff: { ignore: [...] } }) when it is intentionally out of scope\" >&2; exit 2; fi';\n const addAll = `git -c advice.addEmbeddedRepo=false add -A -f -- . ${excludeSpecs}${includeAdd}${rejectGitlinks}`;\n const anchor = await sandbox.runShell(\n // The path is predictable inside an isolated VM. Remove any image/prepare-time occupant or\n // symlink, then recreate the exact runner-private directory as root 0700 before Git touches it.\n `rm -rf -- ${shellQuote(gitDir)} && mkdir -p -m 0700 -- ${shellQuote(gitDir)} && ` +\n `git init -q \"${gitDir}\" && ${addAll} && git commit -q --allow-empty -m \"anchor\" && ` +\n `(git rev-parse -q --verify niceeval-reuse-anchor >/dev/null || git tag niceeval-reuse-anchor)` +\n captureMetadata, {\n ...commandOptions,\n });\n ensureCommandSucceeded(anchor, \"create change ledger anchor\", rootCommands);\n return {\n rootExecutionIdentity: ordinaryUid === \"0\",\n attribution: Object.freeze({\n defaultPolicy: \"niceeval-default-excludes\" as const,\n include: Object.freeze([...includes]),\n ignore: Object.freeze([...(opts?.ignore ?? [])]),\n }),\n async commitEvalWindow(label: string): Promise<void> {\n // 有未记录变化才落这一笔;干净时不产生空的 eval 归因 commit。\n const result = await sandbox.runShell(`${addAll} && (git diff --cached --quiet || git commit -q -m ${shellQuote(`eval ${label}`)})${lockPrivateLedger}`, {\n ...commandOptions,\n });\n ensureCommandSucceeded(result, `commit eval window ${label}`, rootCommands);\n },\n async commitAgentWindow(label: string): Promise<void> {\n // 窗口内没有变化时也落一条(--allow-empty),diff.json 里该窗口 changes 为空对象。\n const result = await sandbox.runShell(`${addAll} && git commit -q --allow-empty -m ${shellQuote(`agent ${label}`)}${lockPrivateLedger}`, commandOptions);\n ensureCommandSucceeded(result, `commit agent window ${label}`, rootCommands);\n },\n async exportWindows(): Promise<DiffArtifact> {\n return exportAgentWindows(sandbox, commandOptions, exportDir, rootCommands);\n },\n async resetToAnchor(): Promise<void> {\n if (ordinaryUid === \"0\") {\n throw new Error(\"sandboxReuse cannot safely reuse a root-agent sandbox: the Agent could read private ledger objects from prior attempts; use a non-root execution user or disable sandboxReuse\");\n }\n // Root performs the byte reset, then reapplies the content-free baseline metadata mirror so\n // ordinary files return to their original uid/gid/mode instead of becoming root-owned. The\n // private object database stays 0700 throughout; no Agent/background process can read it.\n const result = await sandbox.runShell(`git reset -q --hard niceeval-reuse-anchor && ` +\n `git clean -fd ${excludes.map((pattern) => `-e ${shellQuote(pattern)}`).join(\" \")} && ` +\n restoreBaselineMetadataScript(), commandOptions);\n ensureCommandSucceeded(result, \"reset reusable sandbox to anchor and restore ownership\", rootCommands);\n },\n };\n}\nasync function exportAgentWindows(sandbox: Sandbox, commandOptions: {\n readonly env: globalThis.Record<string, string>;\n readonly user?: \"root\";\n}, exportDir: string, rootCommands: boolean): Promise<DiffArtifact> {\n const result = await sandbox.runShell(buildExportScript(exportDir), commandOptions);\n ensureCommandSucceeded(result, \"export agent windows\", rootCommands);\n const payload = await sandbox.readBytes(`${exportDir}/export.bin`);\n return parseExportPayload(Buffer.from(payload));\n}\nfunction ensureCommandSucceeded(result: {\n exitCode: number;\n stderr: string;\n}, operation: string, rootCommands: boolean, permissionGuidance?: string): void {\n if (result.exitCode === 0)\n return;\n const lines = result.stderr.trim().split(\"\\n\").filter(Boolean);\n const permission = lines.find((line) => /permission denied|operation not permitted/i.test(line));\n if (permission !== undefined) {\n const guidance = permissionGuidance ?? (rootCommands\n ? \"the provider declared root command support, but root ledger execution still could not read the workspace; check its root command mapping\"\n : \"this sandbox provider does not support root ledger commands; use a root-capable provider for tasks that intentionally start with unreadable files instead of chmod/chowning away the task condition\");\n throw new Error(`${operation} failed (exit ${result.exitCode}): ${permission}; ${guidance}`);\n }\n // git 可能先输出 advisory warning,再输出 niceeval 的可操作诊断;最后一行最接近失败根因。\n const detail = lines.at(-1);\n throw new Error(`${operation} failed (exit ${result.exitCode})${detail ? `: ${detail}` : \"\"}`);\n}\n// ---------- 导出文件的宿主侧解析(严格校验:帧、git 输出形状、尺寸与内容的完备性) ----------\nconst ZERO_SHA = /^0+$/;\nfunction parseExportPayload(payload: Buffer): DiffArtifact {\n const windows: DiffWindow[] = [];\n let offset = 0;\n const readLine = (): string => {\n const newline = payload.indexOf(0x0a, offset);\n if (newline === -1)\n throw new Error(\"niceeval ledger export: truncated header\");\n const line = payload.subarray(offset, newline).toString(\"utf8\");\n offset = newline + 1;\n return line;\n };\n const readSection = (expected: string): Buffer => {\n const header = readLine().split(\" \");\n if (header.length !== 3 || header[0] !== \"section\" || header[1] !== expected) {\n throw new Error(`niceeval ledger export: expected section ${expected}, got ${JSON.stringify(header.join(\" \"))}`);\n }\n const length = Number(header[2]);\n if (!isNonNegativeInteger(length) || offset + length > payload.length) {\n throw new Error(`niceeval ledger export: invalid ${expected} section length`);\n }\n const body = payload.subarray(offset, offset + length);\n offset += length;\n return body;\n };\n while (offset < payload.length) {\n const header = readLine();\n if (!header.startsWith(\"window \"))\n throw new Error(`niceeval ledger export: expected window header, got ${JSON.stringify(header)}`);\n const rest = header.slice(\"window \".length);\n const space = rest.indexOf(\" \");\n const label = space === -1 ? \"\" : rest.slice(space + 1);\n const entries = parseDiffTree(readSection(\"difftree\"), label);\n const binaryPaths = parseBinaryPaths(readSection(\"numstat\"), label);\n const sizeBySha = parseSizes(readSection(\"sizes\"), label);\n const contentBySha = parseBlobBatch(readSection(\"blobs\"), label);\n const changes: globalThis.Record<string, WindowChange> = {};\n for (const entry of entries) {\n const change: WindowChange = { status: entry.status };\n // 沙箱侧决定「哪些文本 blob 进 --batch」的两条判据在宿主侧同样成立(binary 段 + sizes 段\n // 都在导出文件里),所以这里独立重算,不需要沙箱再输出一份省略清单。\n const beforeBytes = entry.status === \"added\" ? undefined : requireSize(sizeBySha, entry.beforeSha, label, entry.path);\n const afterBytes = entry.status === \"deleted\" ? undefined : requireSize(sizeBySha, entry.afterSha, label, entry.path);\n const binary = binaryPaths.has(entry.path);\n const oversized = (beforeBytes ?? 0) > MAX_FILE_TEXT_BYTES || (afterBytes ?? 0) > MAX_FILE_TEXT_BYTES;\n if (binary || oversized) {\n change.elided = { reason: binary ? \"binary\" : \"oversized-text\" };\n if (beforeBytes !== undefined)\n change.elided.beforeBytes = beforeBytes;\n if (afterBytes !== undefined)\n change.elided.afterBytes = afterBytes;\n }\n else {\n if (entry.status !== \"added\")\n change.before = requireContent(contentBySha, entry.beforeSha, label, entry.path);\n if (entry.status !== \"deleted\")\n change.after = requireContent(contentBySha, entry.afterSha, label, entry.path);\n }\n changes[entry.path] = change;\n }\n windows.push({ window: label, changes });\n }\n return windows;\n}\ninterface DiffTreeEntry {\n path: string;\n status: WindowChange[\"status\"];\n beforeSha: string;\n afterSha: string;\n}\n/** `git diff-tree -r --no-renames -z` 原始输出:`:mode mode sha sha status NUL path NUL` 重复。 */\nfunction parseDiffTree(section: Buffer, label: string): DiffTreeEntry[] {\n const parts = section.toString(\"utf8\").split(\"\\0\");\n const entries: DiffTreeEntry[] = [];\n for (let i = 0; i < parts.length;) {\n const meta = parts[i++];\n if (!meta)\n continue;\n const path = parts[i++];\n const fields = meta.split(\" \");\n if (path === undefined || fields.length !== 5 || !fields[0]!.startsWith(\":\")) {\n throw new Error(`export window ${label}: malformed git diff-tree output`);\n }\n const code = fields[4]!;\n const status = code.startsWith(\"A\") ? \"added\" : code.startsWith(\"D\") ? \"deleted\" : \"modified\";\n entries.push({ path, status, beforeSha: fields[2]!, afterSha: fields[3]! });\n }\n return entries;\n}\n/** `git diff-tree --numstat -z`:二进制条目的 added/removed 计数是 `-`。 */\nfunction parseBinaryPaths(section: Buffer, label: string): Set<string> {\n const paths = new Set<string>();\n for (const record of section.toString(\"utf8\").split(\"\\0\")) {\n if (!record)\n continue;\n const firstTab = record.indexOf(\"\\t\");\n const secondTab = record.indexOf(\"\\t\", firstTab + 1);\n if (firstTab === -1 || secondTab === -1)\n throw new Error(`export window ${label}: malformed git --numstat output`);\n if (record.slice(0, firstTab) === \"-\" && record.slice(firstTab + 1, secondTab) === \"-\") {\n paths.add(record.slice(secondTab + 1));\n }\n }\n return paths;\n}\n/** `git cat-file --batch-check`:每行 `sha type size`(输入是逐出现次数的 sha,重复无害)。 */\nfunction parseSizes(section: Buffer, label: string): Map<string, number> {\n const sizes = new Map<string, number>();\n for (const line of section.toString(\"utf8\").split(\"\\n\")) {\n if (!line)\n continue;\n const fields = line.split(\" \");\n const size = Number(fields[fields.length - 1]);\n if (fields.length < 3 || !isNonNegativeInteger(size)) {\n throw new Error(`export window ${label}: malformed git cat-file --batch-check output`);\n }\n sizes.set(fields[0]!, size);\n }\n return sizes;\n}\n/** `git cat-file --batch`:自带长度帧——`sha type size\\n` + size 字节内容 + `\\n`。 */\nfunction parseBlobBatch(section: Buffer, label: string): Map<string, string> {\n const contents = new Map<string, string>();\n let offset = 0;\n while (offset < section.length) {\n const newline = section.indexOf(0x0a, offset);\n if (newline === -1)\n throw new Error(`export window ${label}: malformed git cat-file --batch header`);\n const fields = section.subarray(offset, newline).toString(\"utf8\").split(\" \");\n const size = Number(fields[fields.length - 1]);\n if (fields.length < 3 || !isNonNegativeInteger(size)) {\n throw new Error(`export window ${label}: malformed git cat-file --batch header`);\n }\n const contentStart = newline + 1;\n const contentEnd = contentStart + size;\n if (contentEnd >= section.length || section[contentEnd] !== 0x0a) {\n throw new Error(`export window ${label}: truncated git cat-file --batch content`);\n }\n contents.set(fields[0]!, section.subarray(contentStart, contentEnd).toString(\"utf8\"));\n offset = contentEnd + 1;\n }\n return contents;\n}\nfunction requireSize(sizes: Map<string, number>, sha: string, label: string, path: string): number {\n const size = sizes.get(sha);\n if (size === undefined || ZERO_SHA.test(sha))\n throw new Error(`export window ${label}: missing blob size for ${JSON.stringify(path)}`);\n return size;\n}\nfunction requireContent(contents: Map<string, string>, sha: string, label: string, path: string): string {\n const content = contents.get(sha);\n if (content === undefined || ZERO_SHA.test(sha))\n throw new Error(`export window ${label}: missing blob content for ${JSON.stringify(path)}`);\n return content;\n}\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n"]}
1
+ {"version":3,"file":"ledger.js","sourceRoot":"","sources":["ledger.ts"],"names":[],"mappings":"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","sourcesContent":["// 变更分类账(私有 git ledger):回答「**agent** 改了什么」,不是「workspace 相对空目录变了什么」。\n// 契约见 docs/feature/sandbox/architecture.md「变更归因:send 窗口与分类账」:\n// - ledger 的 git 目录在沙箱内、workdir 外(runner 私有路径),以 workdir 为 work-tree——\n// workdir 保持素净:agent 看不到 runner 的 .git,eval 需要真实 git repo 时自己 git init,\n// agent 在 workdir 里的任何 git 操作都碰不到分类账。\n// - 三类 commit 时点:锚点一笔(workspace.baseline);每次 t.send() 进入前 workdir 有未记录\n// 变化就落一笔 eval 归因;t.send() 返回后落一笔 agent 归因(send 窗口内的全部变化)。\n// - 归因排除清单 runner 私有、锚点时冻结:项目自己的 .gitignore 不参与归因判断(add -f 绕过),\n// 排除靠 pathspec,include 显式打洞加回。\n// - agent 归因增量 = 逐窗口 delta 序列(DiffWindow[]),不做跨窗口压缩。\nimport type { DiffArtifact, DiffWindow, Sandbox, WindowChange } from \"../types.ts\";\nimport type { AgentWorkspaceDiffPolicy } from \"../assertions/workspace-diff.ts\";\nimport { sandboxSupportsRootCommands } from \"../sandbox/backend.ts\";\nimport { DEFAULT_LEDGER_GIT_DIR, ledgerPathsFor } from \"../sandbox/ledger-paths.ts\";\n/**\n * ledger 的私有 git 目录:workdir 之外、runner 控制;agent 的工具默认不会去 /tmp 翻它。这是\n * 沙箱内 provider(docker/e2b/vercel)的默认值——每个实例都是全新隔离文件系统,固定路径不会\n * 跨实例踩踏。宿主本身即工作树的 provider(如 local)按 sandboxId 登记专属路径覆盖它\n * (见 sandbox/ledger-paths.ts),避免同机多次运行共享同一个 /tmp。\n */\nexport const LEDGER_GIT_DIR = DEFAULT_LEDGER_GIT_DIR;\n/** 整相导出文件的落点(与 ledger 同前缀,同样是 runner 私有路径;覆盖规则同上)。 */\nconst EXPORT_DIR = \"/tmp/.niceeval-ledger-export\";\n/** 默认归因排除清单(锚点时冻结):依赖、构建产物、包管理器缓存与用户项目里的 .niceeval 记录目录。\n * 框架自己不往 workdir 写任何东西(见 docs/observability.md「宿主侧行为断言:t.o11y」),\n * 所以这里没有框架路径要排。 */\nconst DEFAULT_EXCLUDES = [\n \".git\",\n \"node_modules\",\n \".next\",\n \"dist\",\n \"build\",\n \".turbo\",\n \".niceeval\",\n \"coverage\",\n \".cache\",\n \".pnpm-store\",\n \".npm\",\n \".yarn\",\n \"*venv*/\",\n \".venv\",\n \"__pycache__\",\n];\nconst MAX_POLICY_ENTRIES = 256;\nconst MAX_POLICY_ENTRY_UTF8_BYTES = 4096;\nconst policyEncoder = new TextEncoder();\nfunction compareAscii(left: string, right: string): number {\n return left === right ? 0 : left < right ? -1 : 1;\n}\n/** Reject an unrecordable policy before the collector starts, then freeze its canonical evidence form. */\nfunction canonicalPolicyEntries(entries: readonly string[], name: \"include\" | \"ignore\"): readonly string[] {\n if (entries.length > MAX_POLICY_ENTRIES) {\n throw new Error(`defineEval({ diff }).${name} may contain at most ${MAX_POLICY_ENTRIES} entries`);\n }\n for (const [index, entry] of entries.entries()) {\n if (typeof entry !== \"string\") {\n throw new TypeError(`defineEval({ diff }).${name}[${index}] must be a string`);\n }\n if (policyEncoder.encode(entry).byteLength > MAX_POLICY_ENTRY_UTF8_BYTES) {\n throw new Error(`defineEval({ diff }).${name}[${index}] exceeds ${MAX_POLICY_ENTRY_UTF8_BYTES} UTF-8 bytes`);\n }\n }\n return Object.freeze([...new Set(entries)].sort(compareAscii));\n}\n/**\n * 单个 send 窗口的证据安全上限。越界必须让 workspace.diff 失败,不能产出误导性的空窗口。\n * 字节预算只数**真正要传输的文本** before/after:二进制与超过单文件阈值的文本不内联内容、\n * 只记字节数(WindowChange.elided),因此不占预算——编译产物型窗口(成百上千个 .o 加几个大\n * 文本)不该因为「按尺寸计」被判越界。\n */\nconst MAX_WINDOW_PATHS = 10000;\nconst MAX_WINDOW_TEXT_BYTES = 64 * 1024 * 1024;\n/** 单个文本 blob 的内联阈值:任一侧超过它,该条目按二进制同款处理(记字节数、内容省略)。 */\nconst MAX_FILE_TEXT_BYTES = 1024 * 1024;\n/**\n * 整相导出:一条 POSIX shell 命令枚举**全部** agent 窗口并把证据写进沙箱内导出文件,宿主随后\n * 经文件通道一次下载——provider 往返数与窗口数、文件数都无关。对沙箱环境的全部要求是 git 与\n * POSIX 工具(sh/awk/wc/sort/grep),不依赖 node、python 等运行时。\n *\n * 沙箱内不组装 JSON:导出文件直接拼接 git 原生输出——每窗口四段,`diff-tree -z`(状态 + 前后\n * blob sha + 路径,NUL 安全)、`numstat -z`(二进制识别)、`cat-file --batch-check`(全部 blob\n * 尺寸)、`cat-file --batch`(要内联的文本 blob 内容,输出自带长度帧)——解析与校验全部在宿主侧完成。\n * 需要在沙箱内做的两个判断都不解析路径列:sha 提取用 awk 取 diff-tree 原始输出的第 3/4 列\n * (路径在其后,含空格也不影响);二进制排除靠 numstat 与 diff-tree 输出的行号对齐。\n * 尺寸核算(--batch-check)先于内容读取(--batch),越界在产出任何内容前失败;预算只累计真正\n * 要传输的文本 blob(二进制与单文件超限文本只出字节数,不进 --batch 请求、不计预算)。\n * 宿主侧从 sizes + numstat 两段就能判出哪些条目内容被省略,沙箱不额外输出一份判定清单。\n */\nfunction buildExportScript(exportDir: string): string {\n return [\n \"set -eu\",\n // shellQuote:多数 provider 的 exportDir 是固定字面量(无空格);local 的 exportDir 来自\n // mkdtemp(可能落在含空格的自定义 TMPDIR 下),赋值行不加引号会被 shell 拆成多个词。\n `D=${shellQuote(exportDir)}`,\n 'rm -rf \"$D\" && mkdir -p \"$D\"',\n 'OUT=$D/export.bin',\n ': > \"$OUT\"',\n 'fail() { printf \"%s\\\\n\" \"$1\" >&2; exit 2; }',\n // 帧格式:`section <name> <bytes>` 头一行,后跟原始字节;长度前缀让内容里的任意字节都安全。\n 'emit() { printf \"section %s %s\\\\n\" \"$1\" \"$(($(wc -c < \"$2\")))\" >> \"$OUT\"; cat \"$2\" >> \"$OUT\"; }',\n 'git log --reverse --format=\"%H %s\" > \"$D/log.txt\"',\n \"while IFS= read -r line; do\",\n ' hash=${line%% *}',\n ' subject=${line#* }',\n ' case $subject in \"agent \"*) ;; *) continue ;; esac',\n ' label=${subject#agent }',\n // 非 -z 的 diff-tree 把特殊路径引号转义成单行,一行 = 一个条目:wc -l 即路径数,awk 列取 sha 不碰路径。\n ' git diff-tree -r --no-renames \"$hash^\" \"$hash\" > \"$D/dt.txt\"',\n ' n=$(($(wc -l < \"$D/dt.txt\")))',\n ` [ \"$n\" -le ${MAX_WINDOW_PATHS} ] || fail \"niceeval diff window contains $n paths; limit is ${MAX_WINDOW_PATHS}\"`,\n ' git diff-tree -r --no-renames --numstat \"$hash^\" \"$hash\" > \"$D/ns.txt\"',\n // 全部 blob 出现次数(before + after,零 sha = 无此侧,排除)→ 逐次尺寸核算。\n \" awk '$3 !~ /^0+$/ { print $3 } $4 !~ /^0+$/ { print $4 }' \\\"$D/dt.txt\\\" > \\\"$D/occ.txt\\\"\",\n ' git cat-file --batch-check < \"$D/occ.txt\" > \"$D/sizes.txt\"',\n ' if grep -q \" missing$\" \"$D/sizes.txt\"; then fail \"niceeval ledger export: blob object missing\"; fi',\n // 逐条目分类:numstat 第 1 列为 \"-\" 的行是二进制,按行号对齐标 B,其余标 T,后跟前后 blob sha。\n ' awk \\'NR==FNR { bin[FNR] = ($1 == \"-\"); next } { printf \"%s %s %s\\\\n\", (bin[FNR] ? \"B\" : \"T\"), $3, $4 }\\' \"$D/ns.txt\" \"$D/dt.txt\" > \"$D/entries.txt\"',\n // 要内联的文本 blob(去重):二进制条目与任一侧超过单文件阈值的文本条目都不请求内容,\n // 也不计入窗口预算——它们只出字节数(宿主据同一份 sizes 判成 elided)。\n ` awk -v LIMIT=${MAX_FILE_TEXT_BYTES} -v TOTAL=\"$D/total.txt\" 'NR==FNR { sz[$1] = $3; next } $1 == \"T\" { b = $2; a = $3; if (b !~ /^0+$/ && sz[b] > LIMIT) next; if (a !~ /^0+$/ && sz[a] > LIMIT) next; if (b !~ /^0+$/ && !(b in seen)) { seen[b] = 1; total += sz[b]; print b } if (a !~ /^0+$/ && !(a in seen)) { seen[a] = 1; total += sz[a]; print a } } END { print total+0 > TOTAL }' \"$D/sizes.txt\" \"$D/entries.txt\" > \"$D/text.txt\"`,\n ' bytes=$(cat \"$D/total.txt\")',\n ` [ \"$bytes\" -le ${MAX_WINDOW_TEXT_BYTES} ] || fail \"niceeval diff window transfers $bytes text blob bytes; limit is ${MAX_WINDOW_TEXT_BYTES}; narrow defineEval({ diff }) include/ignore rules\"`,\n ' git cat-file --batch < \"$D/text.txt\" > \"$D/blobs.bin\"',\n ' git diff-tree -r --no-renames -z \"$hash^\" \"$hash\" > \"$D/dtz.bin\"',\n ' git diff-tree -r --no-renames --numstat -z \"$hash^\" \"$hash\" > \"$D/nsz.bin\"',\n ' printf \"window %s %s\\\\n\" \"$hash\" \"$label\" >> \"$OUT\"',\n ' emit difftree \"$D/dtz.bin\"',\n ' emit numstat \"$D/nsz.bin\"',\n ' emit sizes \"$D/sizes.txt\"',\n ' emit blobs \"$D/blobs.bin\"',\n 'done < \"$D/log.txt\"',\n // root ledger commands may create the private export with a restrictive umask. The file is outside\n // workdir; making only this runner artifact readable lets the provider file channel fetch it.\n 'chmod 0644 \"$OUT\"',\n ].join(\"\\n\");\n}\nexport interface ChangeLedger {\n /** send 进入前:workdir 有未记录变化就落一笔 eval 归因(fixture / setup / runCommand 副作用)。 */\n commitEvalWindow(label: string): Promise<void>;\n /** send 返回后:落一笔 agent 归因——这个 send 窗口内的全部 workspace 变化(无变化也落空窗口)。 */\n commitAgentWindow(label: string): Promise<void>;\n /** workspace.diff 阶段:从分类账导出每个 send 窗口自己的 before/after,按时序。 */\n exportWindows(): Promise<DiffArtifact>;\n /** 回到创建时的题间锚点,并保留归因排除清单排除的动态环境。 */\n resetToAnchor(): Promise<void>;\n /**\n * 建账时探测到的执行身份是否为 root(仅当 provider 支持 root ledger 命令时才探测得到,\n * 否则恒为 false)。sandboxReuse 复用池据此在实例进池前拒绝(见 docs/feature/sandbox/reuse.md);\n * `resetToAnchor()` 内的同款判断作纵深防御保留。\n */\n readonly rootExecutionIdentity: boolean;\n /** Frozen semantic identity consumed by the Attempt-owned diff Attachment. */\n readonly attribution: AgentWorkspaceDiffPolicy;\n}\ninterface LedgerOptions {\n /** defineEval({ diff }) 的归因调整:ignore 追加排除,include 打洞加回(优先级最高)。 */\n include?: string[];\n ignore?: string[];\n}\n/** 每条 git 命令都带上私有 GIT_DIR + workdir work-tree;项目/全局 gitignore 一律不参与。 */\nfunction gitEnv(sandbox: Sandbox, gitDir: string): globalThis.Record<string, string> {\n return {\n GIT_DIR: gitDir,\n GIT_WORK_TREE: sandbox.workdir,\n GIT_AUTHOR_NAME: \"niceeval\",\n GIT_AUTHOR_EMAIL: \"niceeval@localhost\",\n GIT_COMMITTER_NAME: \"niceeval\",\n GIT_COMMITTER_EMAIL: \"niceeval@localhost\",\n // Internal root Git must never consume configuration or hooks writable by the Agent.\n GIT_CONFIG_NOSYSTEM: \"1\",\n GIT_CONFIG_GLOBAL: \"/dev/null\",\n GIT_CONFIG_COUNT: \"1\",\n GIT_CONFIG_KEY_0: \"core.hooksPath\",\n GIT_CONFIG_VALUE_0: \"/dev/null\",\n GIT_TERMINAL_PROMPT: \"0\",\n HOME: \"/tmp\",\n };\n}\nfunction shellQuote(s: string): string {\n return `'${s.replaceAll(\"'\", `'\\\\''`)}'`;\n}\n/**\n * Root Git can faithfully restore bytes but would otherwise recreate ordinary fixture files as root.\n * Keep a content-free metadata mirror inside the private (0700) ledger and reapply uid/gid/mode after\n * reset. The batched xargs loops preserve arbitrary Git path bytes without exposing objects to the Agent.\n */\nfunction captureBaselineMetadataScript(): string {\n return [\n 'META=\"$GIT_DIR/niceeval-baseline-metadata\"',\n 'rm -rf \"$META\" && mkdir -p \"$META/files\" \"$META/dirs\"',\n \"export META\",\n \"git ls-files -z | xargs -0 -n 100 sh -c '\",\n \" for p do\",\n ' src=\"$GIT_WORK_TREE/$p\"',\n ' ref=\"$META/files/$p\"',\n ' mkdir -p \"$(dirname \"$ref\")\" && : > \"$ref\"',\n ' owner=$(stat -c \"%u:%g\" \"$src\") && mode=$(stat -c \"%a\" \"$src\")',\n ' chown -h \"$owner\" \"$ref\" && chmod \"$mode\" \"$ref\"',\n ' d=$(dirname \"$p\")',\n ' while [ \"$d\" != \".\" ]; do',\n ' dref=\"$META/dirs/$d/.ref\"',\n ' if [ ! -e \"$dref\" ]; then',\n ' mkdir -p \"$(dirname \"$dref\")\" && : > \"$dref\"',\n ' downer=$(stat -c \"%u:%g\" \"$GIT_WORK_TREE/$d\") && dmode=$(stat -c \"%a\" \"$GIT_WORK_TREE/$d\")',\n ' chown \"$downer\" \"$dref\" && chmod \"$dmode\" \"$dref\"',\n \" fi\",\n ' d=$(dirname \"$d\")',\n \" done\",\n \" done\",\n \"' niceeval-meta\",\n // Agent and any background process share the ordinary sandbox uid. Keep both objects and the\n // metadata mirror root-private for the whole attempt; reset never opens this directory to that uid.\n 'chmod go-rwx \"$GIT_DIR\"',\n ].join(\"\\n\");\n}\nfunction restoreBaselineMetadataScript(): string {\n return [\n 'META=\"$GIT_DIR/niceeval-baseline-metadata\"',\n \"export META\",\n 'if [ -d \"$META/files\" ]; then',\n \" find \\\"$META/files\\\" -type f -print0 | xargs -0 -n 100 sh -c '\",\n \" for ref do\",\n ' p=${ref#\"$META/files/\"}',\n ' target=\"$GIT_WORK_TREE/$p\"',\n ' if [ -e \"$target\" ] || [ -L \"$target\" ]; then',\n ' owner=$(stat -c \"%u:%g\" \"$ref\") && mode=$(stat -c \"%a\" \"$ref\")',\n ' chown -h \"$owner\" \"$target\"',\n ' [ -L \"$target\" ] || chmod \"$mode\" \"$target\"',\n \" fi\",\n \" done\",\n \" ' niceeval-meta-restore\",\n \"fi\",\n // Apply directory metadata last so restrictive parent modes cannot interfere with child repair.\n 'if [ -d \"$META/dirs\" ]; then',\n \" find \\\"$META/dirs\\\" -type f -name .ref -print0 | xargs -0 -n 100 sh -c '\",\n \" for ref do\",\n ' d=${ref%/.ref}',\n ' p=${d#\"$META/dirs/\"}',\n ' target=\"$GIT_WORK_TREE/$p\"',\n ' if [ -d \"$target\" ]; then',\n ' owner=$(stat -c \"%u:%g\" \"$ref\") && mode=$(stat -c \"%a\" \"$ref\")',\n ' chown \"$owner\" \"$target\" && chmod \"$mode\" \"$target\"',\n \" fi\",\n \" done\",\n \" ' niceeval-dir-meta-restore\",\n \"fi\",\n 'chmod go-rwx \"$GIT_DIR\"',\n ].join(\"\\n\");\n}\n/**\n * 把仓库根语义的 gitignore 风格规则编译成 ledger pathspec。\n * 无斜杠的名字匹配任意深度;有斜杠的规则相对 workdir 根;目录本身与后代一起处理。\n */\nfunction gitignorePathspecs(pattern: string, exclude: boolean): string[] {\n let normalized = pattern;\n while (normalized.startsWith(\"./\"))\n normalized = normalized.slice(2);\n if (normalized.startsWith(\"/\"))\n normalized = normalized.slice(1);\n normalized = normalized.replace(/\\/+$/, \"\");\n if (!normalized)\n return [];\n const glob = normalized.includes(\"/\") ? normalized : `**/${normalized}`;\n const globs = exclude && !glob.endsWith(\"/**\") ? [glob, `${glob}/**`] : [glob];\n const magic = exclude ? \":(glob,exclude)\" : \":(glob)\";\n return [...new Set(globs)].map((value) => `${magic}${value}`);\n}\n/** 打分类账锚点(workspace.baseline 阶段,环境层钩子之后):git init + 冻结排除清单 + 首笔 commit。 */\nexport async function createChangeLedger(sandbox: Sandbox, opts?: LedgerOptions): Promise<ChangeLedger> {\n const includes = canonicalPolicyEntries(opts?.include ?? [], \"include\");\n const ignored = canonicalPolicyEntries(opts?.ignore ?? [], \"ignore\");\n const excludes = [...DEFAULT_EXCLUDES, ...ignored];\n // 多数 provider 用固定的宿主内私有路径(每实例全新隔离文件系统,天然不冲突);宿主本身即\n // 工作树的 provider(如 local)按 sandboxId 登记专属路径,避免同机多次运行互相踩踏\n // (见 sandbox/ledger-paths.ts —— 这里不认 provider 名,只问登记表)。\n const paths = ledgerPathsFor(sandbox.sandboxId);\n const gitDir = paths?.gitDir ?? LEDGER_GIT_DIR;\n const exportDir = paths?.exportDir ?? EXPORT_DIR;\n const env = gitEnv(sandbox, gitDir);\n const rootCommands = sandboxSupportsRootCommands(sandbox);\n // 只给 runner 私有 ledger 命令提权,以便读取题目故意设置的受限文件。脚本不 chmod/chown\n // workdir,Agent 命令仍沿标准非 root 身份;不支持提权的 provider 保持既有用户态路径。\n const commandOptions = rootCommands ? { env, user: \"root\" as const } : { env };\n const captureMetadata = rootCommands ? ` && ${captureBaselineMetadataScript()}` : \"\";\n const lockPrivateLedger = rootCommands ? ' && chmod go-rwx \"$GIT_DIR\"' : \"\";\n let ordinaryUid: string | undefined;\n if (rootCommands) {\n // Capture before Agent setup/send can mutate the VM. A post-attempt `id` probe would not be a\n // trustworthy boundary when the configured execution identity itself is root.\n const identity = await sandbox.runShell(\"command -p id -u\", { env });\n ensureCommandSucceeded(identity, \"detect sandbox execution identity for reuse\", false);\n ordinaryUid = identity.stdout.trim();\n }\n // add -A -f:绕过项目自己的 .gitignore(项目 ignore 的文件照常记录);排除靠 pathspec\n // (runner 私有清单,agent / fixture 写 .gitignore 影响不了它);include 用第二次 add 打洞加回。\n const excludeSpecs = excludes.flatMap((pattern) => gitignorePathspecs(pattern, true)).map(shellQuote).join(\" \");\n // include 打洞:路径此刻可能还不存在(如 agent 之后才写),unmatched pathspec 不算错。\n const includeSpecs = includes.flatMap((pattern) => gitignorePathspecs(pattern, false)).map(shellQuote).join(\" \");\n const includeAdd = includeSpecs.length > 0 ? ` && { git -c advice.addEmbeddedRepo=false add -A -f -- ${includeSpecs} 2>/dev/null || true; }` : \"\";\n const rejectGitlinks = \" && nested=$(git ls-files --stage | awk '$1 == \\\"160000\\\" { sub(/^[^\\\\t]*\\\\t/, \\\"\\\"); print; exit }')\" +\n ' && if [ -n \"$nested\" ]; then printf \\'%s\\\\n\\' \"niceeval ledger cannot track nested Git repository $nested as file-level evidence; move the checkout to sandbox.workdir root, or add the whole path to defineEval({ diff: { ignore: [...] } }) when it is intentionally out of scope\" >&2; exit 2; fi';\n const addAll = `git -c advice.addEmbeddedRepo=false add -A -f -- . ${excludeSpecs}${includeAdd}${rejectGitlinks}`;\n const anchor = await sandbox.runShell(\n // The path is predictable inside an isolated VM. Remove any image/prepare-time occupant or\n // symlink, then recreate the exact runner-private directory as root 0700 before Git touches it.\n `rm -rf -- ${shellQuote(gitDir)} && mkdir -p -m 0700 -- ${shellQuote(gitDir)} && ` +\n `git init -q \"${gitDir}\" && ${addAll} && git commit -q --allow-empty -m \"anchor\" && ` +\n `(git rev-parse -q --verify niceeval-reuse-anchor >/dev/null || git tag niceeval-reuse-anchor)` +\n captureMetadata, {\n ...commandOptions,\n });\n ensureCommandSucceeded(anchor, \"create change ledger anchor\", rootCommands);\n return {\n rootExecutionIdentity: ordinaryUid === \"0\",\n attribution: Object.freeze({\n defaultPolicy: \"niceeval.sandbox-ledger/default-excludes/v1\" as const,\n include: includes,\n ignore: ignored,\n }),\n async commitEvalWindow(label: string): Promise<void> {\n // 有未记录变化才落这一笔;干净时不产生空的 eval 归因 commit。\n const result = await sandbox.runShell(`${addAll} && (git diff --cached --quiet || git commit -q -m ${shellQuote(`eval ${label}`)})${lockPrivateLedger}`, {\n ...commandOptions,\n });\n ensureCommandSucceeded(result, `commit eval window ${label}`, rootCommands);\n },\n async commitAgentWindow(label: string): Promise<void> {\n // 窗口内没有变化时也落一条(--allow-empty),diff.json 里该窗口 changes 为空对象。\n const result = await sandbox.runShell(`${addAll} && git commit -q --allow-empty -m ${shellQuote(`agent ${label}`)}${lockPrivateLedger}`, commandOptions);\n ensureCommandSucceeded(result, `commit agent window ${label}`, rootCommands);\n },\n async exportWindows(): Promise<DiffArtifact> {\n return exportAgentWindows(sandbox, commandOptions, exportDir, rootCommands);\n },\n async resetToAnchor(): Promise<void> {\n if (ordinaryUid === \"0\") {\n throw new Error(\"sandboxReuse cannot safely reuse a root-agent sandbox: the Agent could read private ledger objects from prior attempts; use a non-root execution user or disable sandboxReuse\");\n }\n // Root performs the byte reset, then reapplies the content-free baseline metadata mirror so\n // ordinary files return to their original uid/gid/mode instead of becoming root-owned. The\n // private object database stays 0700 throughout; no Agent/background process can read it.\n const result = await sandbox.runShell(`git reset -q --hard niceeval-reuse-anchor && ` +\n `git clean -fd ${excludes.map((pattern) => `-e ${shellQuote(pattern)}`).join(\" \")} && ` +\n restoreBaselineMetadataScript(), commandOptions);\n ensureCommandSucceeded(result, \"reset reusable sandbox to anchor and restore ownership\", rootCommands);\n },\n };\n}\nasync function exportAgentWindows(sandbox: Sandbox, commandOptions: {\n readonly env: globalThis.Record<string, string>;\n readonly user?: \"root\";\n}, exportDir: string, rootCommands: boolean): Promise<DiffArtifact> {\n const result = await sandbox.runShell(buildExportScript(exportDir), commandOptions);\n ensureCommandSucceeded(result, \"export agent windows\", rootCommands);\n const payload = await sandbox.readBytes(`${exportDir}/export.bin`);\n return parseExportPayload(Buffer.from(payload));\n}\nfunction ensureCommandSucceeded(result: {\n exitCode: number;\n stderr: string;\n}, operation: string, rootCommands: boolean, permissionGuidance?: string): void {\n if (result.exitCode === 0)\n return;\n const lines = result.stderr.trim().split(\"\\n\").filter(Boolean);\n const permission = lines.find((line) => /permission denied|operation not permitted/i.test(line));\n if (permission !== undefined) {\n const guidance = permissionGuidance ?? (rootCommands\n ? \"the provider declared root command support, but root ledger execution still could not read the workspace; check its root command mapping\"\n : \"this sandbox provider does not support root ledger commands; use a root-capable provider for tasks that intentionally start with unreadable files instead of chmod/chowning away the task condition\");\n throw new Error(`${operation} failed (exit ${result.exitCode}): ${permission}; ${guidance}`);\n }\n // git 可能先输出 advisory warning,再输出 niceeval 的可操作诊断;最后一行最接近失败根因。\n const detail = lines.at(-1);\n throw new Error(`${operation} failed (exit ${result.exitCode})${detail ? `: ${detail}` : \"\"}`);\n}\n// ---------- 导出文件的宿主侧解析(严格校验:帧、git 输出形状、尺寸与内容的完备性) ----------\nconst ZERO_SHA = /^0+$/;\nfunction parseExportPayload(payload: Buffer): DiffArtifact {\n const windows: DiffWindow[] = [];\n let offset = 0;\n const readLine = (): string => {\n const newline = payload.indexOf(0x0a, offset);\n if (newline === -1)\n throw new Error(\"niceeval ledger export: truncated header\");\n const line = payload.subarray(offset, newline).toString(\"utf8\");\n offset = newline + 1;\n return line;\n };\n const readSection = (expected: string): Buffer => {\n const header = readLine().split(\" \");\n if (header.length !== 3 || header[0] !== \"section\" || header[1] !== expected) {\n throw new Error(`niceeval ledger export: expected section ${expected}, got ${JSON.stringify(header.join(\" \"))}`);\n }\n const length = Number(header[2]);\n if (!isNonNegativeInteger(length) || offset + length > payload.length) {\n throw new Error(`niceeval ledger export: invalid ${expected} section length`);\n }\n const body = payload.subarray(offset, offset + length);\n offset += length;\n return body;\n };\n while (offset < payload.length) {\n const header = readLine();\n if (!header.startsWith(\"window \"))\n throw new Error(`niceeval ledger export: expected window header, got ${JSON.stringify(header)}`);\n const rest = header.slice(\"window \".length);\n const space = rest.indexOf(\" \");\n const label = space === -1 ? \"\" : rest.slice(space + 1);\n const entries = parseDiffTree(readSection(\"difftree\"), label);\n const binaryPaths = parseBinaryPaths(readSection(\"numstat\"), label);\n const sizeBySha = parseSizes(readSection(\"sizes\"), label);\n const contentBySha = parseBlobBatch(readSection(\"blobs\"), label);\n const changes: globalThis.Record<string, WindowChange> = {};\n for (const entry of entries) {\n const change: WindowChange = { status: entry.status };\n // 沙箱侧决定「哪些文本 blob 进 --batch」的两条判据在宿主侧同样成立(binary 段 + sizes 段\n // 都在导出文件里),所以这里独立重算,不需要沙箱再输出一份省略清单。\n const beforeBytes = entry.status === \"added\" ? undefined : requireSize(sizeBySha, entry.beforeSha, label, entry.path);\n const afterBytes = entry.status === \"deleted\" ? undefined : requireSize(sizeBySha, entry.afterSha, label, entry.path);\n const binary = binaryPaths.has(entry.path);\n const oversized = (beforeBytes ?? 0) > MAX_FILE_TEXT_BYTES || (afterBytes ?? 0) > MAX_FILE_TEXT_BYTES;\n if (binary || oversized) {\n change.elided = { reason: binary ? \"binary\" : \"oversized-text\" };\n if (beforeBytes !== undefined)\n change.elided.beforeBytes = beforeBytes;\n if (afterBytes !== undefined)\n change.elided.afterBytes = afterBytes;\n }\n else {\n if (entry.status !== \"added\")\n change.before = requireContent(contentBySha, entry.beforeSha, label, entry.path);\n if (entry.status !== \"deleted\")\n change.after = requireContent(contentBySha, entry.afterSha, label, entry.path);\n }\n changes[entry.path] = change;\n }\n windows.push({ window: label, changes });\n }\n return windows;\n}\ninterface DiffTreeEntry {\n path: string;\n status: WindowChange[\"status\"];\n beforeSha: string;\n afterSha: string;\n}\n/** `git diff-tree -r --no-renames -z` 原始输出:`:mode mode sha sha status NUL path NUL` 重复。 */\nfunction parseDiffTree(section: Buffer, label: string): DiffTreeEntry[] {\n const parts = section.toString(\"utf8\").split(\"\\0\");\n const entries: DiffTreeEntry[] = [];\n for (let i = 0; i < parts.length;) {\n const meta = parts[i++];\n if (!meta)\n continue;\n const path = parts[i++];\n const fields = meta.split(\" \");\n if (path === undefined || fields.length !== 5 || !fields[0]!.startsWith(\":\")) {\n throw new Error(`export window ${label}: malformed git diff-tree output`);\n }\n const code = fields[4]!;\n const status = code.startsWith(\"A\") ? \"added\" : code.startsWith(\"D\") ? \"deleted\" : \"modified\";\n entries.push({ path, status, beforeSha: fields[2]!, afterSha: fields[3]! });\n }\n return entries;\n}\n/** `git diff-tree --numstat -z`:二进制条目的 added/removed 计数是 `-`。 */\nfunction parseBinaryPaths(section: Buffer, label: string): Set<string> {\n const paths = new Set<string>();\n for (const record of section.toString(\"utf8\").split(\"\\0\")) {\n if (!record)\n continue;\n const firstTab = record.indexOf(\"\\t\");\n const secondTab = record.indexOf(\"\\t\", firstTab + 1);\n if (firstTab === -1 || secondTab === -1)\n throw new Error(`export window ${label}: malformed git --numstat output`);\n if (record.slice(0, firstTab) === \"-\" && record.slice(firstTab + 1, secondTab) === \"-\") {\n paths.add(record.slice(secondTab + 1));\n }\n }\n return paths;\n}\n/** `git cat-file --batch-check`:每行 `sha type size`(输入是逐出现次数的 sha,重复无害)。 */\nfunction parseSizes(section: Buffer, label: string): Map<string, number> {\n const sizes = new Map<string, number>();\n for (const line of section.toString(\"utf8\").split(\"\\n\")) {\n if (!line)\n continue;\n const fields = line.split(\" \");\n const size = Number(fields[fields.length - 1]);\n if (fields.length < 3 || !isNonNegativeInteger(size)) {\n throw new Error(`export window ${label}: malformed git cat-file --batch-check output`);\n }\n sizes.set(fields[0]!, size);\n }\n return sizes;\n}\n/** `git cat-file --batch`:自带长度帧——`sha type size\\n` + size 字节内容 + `\\n`。 */\nfunction parseBlobBatch(section: Buffer, label: string): Map<string, string> {\n const contents = new Map<string, string>();\n let offset = 0;\n while (offset < section.length) {\n const newline = section.indexOf(0x0a, offset);\n if (newline === -1)\n throw new Error(`export window ${label}: malformed git cat-file --batch header`);\n const fields = section.subarray(offset, newline).toString(\"utf8\").split(\" \");\n const size = Number(fields[fields.length - 1]);\n if (fields.length < 3 || !isNonNegativeInteger(size)) {\n throw new Error(`export window ${label}: malformed git cat-file --batch header`);\n }\n const contentStart = newline + 1;\n const contentEnd = contentStart + size;\n if (contentEnd >= section.length || section[contentEnd] !== 0x0a) {\n throw new Error(`export window ${label}: truncated git cat-file --batch content`);\n }\n contents.set(fields[0]!, section.subarray(contentStart, contentEnd).toString(\"utf8\"));\n offset = contentEnd + 1;\n }\n return contents;\n}\nfunction requireSize(sizes: Map<string, number>, sha: string, label: string, path: string): number {\n const size = sizes.get(sha);\n if (size === undefined || ZERO_SHA.test(sha))\n throw new Error(`export window ${label}: missing blob size for ${JSON.stringify(path)}`);\n return size;\n}\nfunction requireContent(contents: Map<string, string>, sha: string, label: string, path: string): string {\n const content = contents.get(sha);\n if (content === undefined || ZERO_SHA.test(sha))\n throw new Error(`export window ${label}: missing blob content for ${JSON.stringify(path)}`);\n return content;\n}\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n"]}
@@ -145,23 +145,36 @@ function makeAbortError(signal) {
145
145
  return err;
146
146
  }
147
147
  function awaitAbort(signal) {
148
+ if (signal === undefined)
149
+ return effect_1.Effect.never;
148
150
  return effect_1.Effect.async((resume, effectSignal) => {
149
- if (signal === undefined)
150
- return;
151
+ let completed = false;
151
152
  const cleanup = () => {
152
153
  signal.removeEventListener("abort", onAbort);
153
- effectSignal.removeEventListener("abort", cleanup);
154
+ effectSignal.removeEventListener("abort", onEffectAbort);
154
155
  };
155
- const onAbort = () => {
156
+ const cancel = () => {
157
+ if (completed)
158
+ return;
159
+ completed = true;
156
160
  cleanup();
161
+ };
162
+ const onAbort = () => {
163
+ if (completed)
164
+ return;
165
+ cancel();
157
166
  resume(effect_1.Effect.fail(makeAbortError(signal)));
158
167
  };
159
- if (signal.aborted) {
160
- onAbort();
161
- return;
162
- }
168
+ const onEffectAbort = () => cancel();
163
169
  signal.addEventListener("abort", onAbort, { once: true });
164
- effectSignal.addEventListener("abort", cleanup, { once: true });
170
+ effectSignal.addEventListener("abort", onEffectAbort, { once: true });
171
+ // Both listeners must be live before inspecting either signal: otherwise
172
+ // an abort between inspection and registration could strand the waiter.
173
+ if (effectSignal.aborted)
174
+ onEffectAbort();
175
+ else if (signal.aborted)
176
+ onAbort();
177
+ return effect_1.Effect.sync(cancel);
165
178
  });
166
179
  }
167
180
  /** 可被外部 AbortSignal 或 Effect interruption 立刻打断的轮询延时。 */
@@ -186,7 +199,7 @@ function acquireCaseLockEffect(niceevalRoot, experimentId, evalId, identity, opt
186
199
  const acquire = () => effect_1.Effect.suspend(() => {
187
200
  if (opts.signal?.aborted)
188
201
  return effect_1.Effect.fail(makeAbortError(opts.signal));
189
- return tryAcquireCaseLockOnceEffect(niceevalRoot, experimentId, evalId, identity, Date.now()).pipe(effect_1.Effect.flatMap((result) => {
202
+ return effect_1.Clock.currentTimeMillis.pipe(effect_1.Effect.flatMap((nowMs) => tryAcquireCaseLockOnceEffect(niceevalRoot, experimentId, evalId, identity, nowMs)), effect_1.Effect.flatMap((result) => {
190
203
  if (result.kind === "acquired")
191
204
  return effect_1.Effect.succeed({ takenOver: result.takenOver });
192
205
  const reportWait = waitStarted
@@ -206,7 +219,7 @@ function acquireCaseLockEffect(niceevalRoot, experimentId, evalId, identity, opt
206
219
  const heartbeat = effect_1.Effect.forever(effect_1.Effect.sleep(heartbeatIntervalMs).pipe(effect_1.Effect.zipRight(
207
220
  // File-system promises do not guarantee AbortSignal support. Keep one renewal uninterruptible so
208
221
  // Fiber.interrupt below waits for any started write before rm can make the path reusable.
209
- effect_1.Effect.suspend(() => effect_1.Effect.uninterruptible(renewHeartbeatEffect(niceevalRoot, experimentId, evalId, Date.now(), () => released))).pipe(effect_1.Effect.ignore))));
222
+ effect_1.Effect.uninterruptible(effect_1.Clock.currentTimeMillis.pipe(effect_1.Effect.flatMap((nowMs) => renewHeartbeatEffect(niceevalRoot, experimentId, evalId, nowMs, () => released)))).pipe(effect_1.Effect.ignore))));
210
223
  // A child inherits the parent's interruptibility. This branch still
211
224
  // runs under the acquisition mask, so restore the heartbeat before
212
225
  // forking; otherwise release would wait forever while interrupting an