niceeval 0.13.3 → 0.13.4-canary.39

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 (487) hide show
  1. package/INDEX.md +5 -5
  2. package/dist/agents/index.cjs +2 -2
  3. package/dist/agents/index.cjs.map +1 -1
  4. package/dist/agents/project.json +6 -0
  5. package/dist/agents/streaming.cjs.map +1 -1
  6. package/dist/agents/types.cjs.map +1 -1
  7. package/dist/agents/types.d.cts +1 -1
  8. package/dist/agents/types.d.mts +1 -1
  9. package/dist/agents/types.d.ts +1 -1
  10. package/dist/analysis/bindings.d.cts +8 -8
  11. package/dist/analysis/bindings.d.mts +8 -8
  12. package/dist/analysis/bindings.d.ts +8 -8
  13. package/dist/analysis/contracts.cjs.map +1 -1
  14. package/dist/analysis/contracts.d.cts +8 -19
  15. package/dist/analysis/contracts.d.mts +8 -19
  16. package/dist/analysis/contracts.d.ts +8 -19
  17. package/dist/analysis/experiment-groups.cjs +7 -14
  18. package/dist/analysis/experiment-groups.cjs.map +1 -1
  19. package/dist/analysis/index.cjs.map +1 -1
  20. package/dist/analysis/index.d.cts +1 -1
  21. package/dist/analysis/index.d.mts +1 -1
  22. package/dist/analysis/index.d.ts +1 -1
  23. package/dist/cli/application.cjs +4 -13
  24. package/dist/cli/application.cjs.map +1 -1
  25. package/dist/cli/application.d.cts +62 -59
  26. package/dist/cli/application.d.mts +62 -59
  27. package/dist/cli/application.d.ts +62 -59
  28. package/dist/cli/application.js +6 -12
  29. package/dist/cli/bootstrap.cjs +28 -2
  30. package/dist/cli/bootstrap.cjs.map +1 -1
  31. package/dist/cli/contribution.cjs +185 -0
  32. package/dist/cli/contribution.cjs.map +1 -0
  33. package/dist/cli/contribution.d.cts +55 -0
  34. package/dist/cli/contribution.d.mts +55 -0
  35. package/dist/cli/contribution.d.ts +55 -0
  36. package/dist/cli/contribution.js +20 -0
  37. package/dist/cli/contribution.js.map +1 -0
  38. package/dist/cli/node-application.cjs +119 -87
  39. package/dist/cli/node-application.cjs.map +1 -1
  40. package/dist/cli/node-application.d.cts +2 -8
  41. package/dist/cli/node-application.d.mts +2 -8
  42. package/dist/cli/node-application.d.ts +2 -8
  43. package/dist/cli/node-application.js +12 -22
  44. package/dist/cli/program.cjs +87 -2756
  45. package/dist/cli/program.cjs.map +1 -1
  46. package/dist/cli/program.d.cts +11 -332
  47. package/dist/cli/program.d.mts +11 -332
  48. package/dist/cli/program.d.ts +11 -332
  49. package/dist/cli/program.js +4 -28
  50. package/dist/cli.cjs +0 -3
  51. package/dist/cli.cjs.map +1 -1
  52. package/dist/cli.d.cts +0 -1
  53. package/dist/cli.d.mts +0 -1
  54. package/dist/cli.d.ts +0 -1
  55. package/dist/cli.js +6 -14
  56. package/dist/define.cjs +1 -1
  57. package/dist/define.cjs.map +1 -1
  58. package/dist/docker/cache-administration.cjs +8 -0
  59. package/dist/docker/cache-administration.cjs.map +1 -0
  60. package/dist/docker/cache-administration.d.cts +33 -0
  61. package/dist/docker/cache-administration.d.mts +33 -0
  62. package/dist/docker/cache-administration.d.ts +33 -0
  63. package/dist/docker/cache-administration.js +6 -0
  64. package/dist/docker/cache-administration.js.map +1 -0
  65. package/dist/docker/cache-live.cjs +27 -0
  66. package/dist/docker/cache-live.cjs.map +1 -0
  67. package/dist/docker/cache-live.d.cts +3 -0
  68. package/dist/docker/cache-live.d.mts +3 -0
  69. package/dist/docker/cache-live.d.ts +3 -0
  70. package/dist/docker/cache-live.js +6 -0
  71. package/dist/docker/cache-live.js.map +1 -0
  72. package/dist/docker/cli/contribution.cjs +223 -0
  73. package/dist/docker/cli/contribution.cjs.map +1 -0
  74. package/dist/docker/cli/contribution.d.cts +48 -0
  75. package/dist/docker/cli/contribution.d.mts +48 -0
  76. package/dist/docker/cli/contribution.d.ts +48 -0
  77. package/dist/docker/cli/contribution.js +8 -0
  78. package/dist/docker/cli/contribution.js.map +1 -0
  79. package/dist/eval/cli/contribution.cjs +62 -0
  80. package/dist/eval/cli/contribution.cjs.map +1 -0
  81. package/dist/eval/cli/contribution.d.cts +21 -0
  82. package/dist/eval/cli/contribution.d.mts +21 -0
  83. package/dist/eval/cli/contribution.d.ts +21 -0
  84. package/dist/eval/cli/contribution.js +8 -0
  85. package/dist/eval/cli/contribution.js.map +1 -0
  86. package/dist/eval/host/index.cjs +23 -0
  87. package/dist/eval/host/index.cjs.map +1 -0
  88. package/dist/eval/host/index.d.cts +27 -0
  89. package/dist/eval/host/index.d.mts +27 -0
  90. package/dist/eval/host/index.d.ts +27 -0
  91. package/dist/eval/host/index.js +8 -0
  92. package/dist/eval/host/index.js.map +1 -0
  93. package/dist/eval/host/index.mjs +8 -0
  94. package/dist/eval/host/index.mjs.map +1 -0
  95. package/dist/experiment/host/cli/contribution.cjs +835 -0
  96. package/dist/experiment/host/cli/contribution.cjs.map +1 -0
  97. package/dist/experiment/host/cli/contribution.d.cts +329 -0
  98. package/dist/experiment/host/cli/contribution.d.mts +329 -0
  99. package/dist/experiment/host/cli/contribution.d.ts +329 -0
  100. package/dist/experiment/host/cli/contribution.js +22 -0
  101. package/dist/experiment/host/cli/contribution.js.map +1 -0
  102. package/dist/experiment/host/cli/index.cjs +9 -0
  103. package/dist/experiment/host/cli/index.cjs.map +1 -0
  104. package/dist/experiment/host/cli/index.d.cts +2 -0
  105. package/dist/experiment/host/cli/index.d.mts +2 -0
  106. package/dist/experiment/host/cli/index.d.ts +2 -0
  107. package/dist/experiment/host/cli/index.js +10 -0
  108. package/dist/experiment/host/cli/index.js.map +1 -0
  109. package/dist/experiment/host/cli/terminal.cjs +15 -0
  110. package/dist/experiment/host/cli/terminal.cjs.map +1 -0
  111. package/dist/experiment/host/cli/terminal.d.cts +14 -0
  112. package/dist/experiment/host/cli/terminal.d.mts +14 -0
  113. package/dist/experiment/host/cli/terminal.d.ts +14 -0
  114. package/dist/experiment/host/cli/terminal.js +8 -0
  115. package/dist/experiment/host/cli/terminal.js.map +1 -0
  116. package/dist/experiment/host/index.cjs +35 -58
  117. package/dist/experiment/host/index.cjs.map +1 -1
  118. package/dist/experiment/host/index.d.cts +5 -79
  119. package/dist/experiment/host/index.d.mts +5 -79
  120. package/dist/experiment/host/index.d.ts +5 -79
  121. package/dist/experiment/host/index.js +4 -2
  122. package/dist/experiment/host/index.mjs +4 -2
  123. package/dist/experiment/host/operations.cjs +678 -0
  124. package/dist/experiment/host/operations.cjs.map +1 -0
  125. package/dist/experiment/host/operations.d.cts +19 -0
  126. package/dist/experiment/host/operations.d.mts +19 -0
  127. package/dist/experiment/host/operations.d.ts +19 -0
  128. package/dist/experiment/host/operations.js +24 -0
  129. package/dist/experiment/host/operations.js.map +1 -0
  130. package/dist/experiment/host/presentation.cjs +81 -0
  131. package/dist/experiment/host/presentation.cjs.map +1 -0
  132. package/dist/experiment/host/presentation.d.cts +9 -0
  133. package/dist/experiment/host/presentation.d.mts +9 -0
  134. package/dist/experiment/host/presentation.d.ts +9 -0
  135. package/dist/experiment/host/presentation.js +8 -0
  136. package/dist/experiment/host/presentation.js.map +1 -0
  137. package/dist/experiment/host/teardown.cjs +394 -0
  138. package/dist/experiment/host/teardown.cjs.map +1 -0
  139. package/dist/experiment/host/teardown.d.cts +5 -0
  140. package/dist/experiment/host/teardown.d.mts +5 -0
  141. package/dist/experiment/host/teardown.d.ts +5 -0
  142. package/dist/experiment/host/teardown.js +8 -0
  143. package/dist/experiment/host/teardown.js.map +1 -0
  144. package/dist/experiment/host/types.cjs +9 -0
  145. package/dist/experiment/host/types.cjs.map +1 -0
  146. package/dist/experiment/host/types.d.cts +423 -0
  147. package/dist/experiment/host/types.d.mts +423 -0
  148. package/dist/experiment/host/types.d.ts +423 -0
  149. package/dist/experiment/host/types.js +6 -0
  150. package/dist/experiment/host/types.js.map +1 -0
  151. package/dist/i18n/en.cjs +8 -50
  152. package/dist/i18n/en.cjs.map +1 -1
  153. package/dist/i18n/en.d.cts +2 -6
  154. package/dist/i18n/en.d.mts +2 -6
  155. package/dist/i18n/en.d.ts +2 -6
  156. package/dist/o11y/project.json +6 -0
  157. package/dist/project/cli/contribution.cjs +66 -0
  158. package/dist/project/cli/contribution.cjs.map +1 -0
  159. package/dist/project/cli/contribution.d.cts +17 -0
  160. package/dist/project/cli/contribution.d.mts +17 -0
  161. package/dist/project/cli/contribution.d.ts +17 -0
  162. package/dist/project/cli/contribution.js +8 -0
  163. package/dist/project/cli/contribution.js.map +1 -0
  164. package/dist/project/cli/index.cjs +7 -0
  165. package/dist/project/cli/index.cjs.map +1 -0
  166. package/dist/project/cli/index.d.cts +1 -0
  167. package/dist/project/cli/index.d.mts +1 -0
  168. package/dist/project/cli/index.d.ts +1 -0
  169. package/dist/project/cli/index.js +8 -0
  170. package/dist/project/cli/index.js.map +1 -0
  171. package/dist/project/host/index.cjs +11 -0
  172. package/dist/project/host/index.cjs.map +1 -0
  173. package/dist/project/host/index.d.cts +4 -0
  174. package/dist/project/host/index.d.mts +4 -0
  175. package/dist/project/host/index.d.ts +4 -0
  176. package/dist/project/host/index.js +14 -0
  177. package/dist/project/host/index.js.map +1 -0
  178. package/dist/project/host/index.mjs +14 -0
  179. package/dist/project/host/index.mjs.map +1 -0
  180. package/dist/project/host.cjs +59 -0
  181. package/dist/project/host.cjs.map +1 -0
  182. package/dist/project/host.d.cts +17 -0
  183. package/dist/project/host.d.mts +17 -0
  184. package/dist/project/host.d.ts +17 -0
  185. package/dist/project/host.js +6 -0
  186. package/dist/project/host.js.map +1 -0
  187. package/dist/project/index.cjs +11 -0
  188. package/dist/project/index.cjs.map +1 -0
  189. package/dist/project/index.d.cts +4 -0
  190. package/dist/project/index.d.mts +4 -0
  191. package/dist/project/index.d.ts +4 -0
  192. package/dist/project/index.js +14 -0
  193. package/dist/project/index.js.map +1 -0
  194. package/dist/project/node.cjs +91 -0
  195. package/dist/project/node.cjs.map +1 -0
  196. package/dist/project/node.d.cts +6 -0
  197. package/dist/project/node.d.mts +6 -0
  198. package/dist/project/node.d.ts +6 -0
  199. package/dist/project/node.js +12 -0
  200. package/dist/project/node.js.map +1 -0
  201. package/dist/project/services.cjs +17 -0
  202. package/dist/project/services.cjs.map +1 -0
  203. package/dist/project/services.d.cts +47 -0
  204. package/dist/project/services.d.mts +47 -0
  205. package/dist/project/services.d.ts +47 -0
  206. package/dist/project/services.js +12 -0
  207. package/dist/project/services.js.map +1 -0
  208. package/dist/project/templates.cjs +28 -0
  209. package/dist/project/templates.cjs.map +1 -0
  210. package/dist/project/templates.d.cts +4 -0
  211. package/dist/project/templates.d.mts +4 -0
  212. package/dist/project/templates.d.ts +4 -0
  213. package/dist/project/templates.js +12 -0
  214. package/dist/project/templates.js.map +1 -0
  215. package/dist/project.json +6 -0
  216. package/dist/record/family/catalog.d.cts +10 -10
  217. package/dist/record/family/catalog.d.mts +10 -10
  218. package/dist/record/family/catalog.d.ts +10 -10
  219. package/dist/record/family/file-changes.d.cts +8 -8
  220. package/dist/record/family/file-changes.d.mts +8 -8
  221. package/dist/record/family/file-changes.d.ts +8 -8
  222. package/dist/record/host/cli/contribution.cjs +206 -0
  223. package/dist/record/host/cli/contribution.cjs.map +1 -0
  224. package/dist/record/host/cli/contribution.d.cts +32 -0
  225. package/dist/record/host/cli/contribution.d.mts +32 -0
  226. package/dist/record/host/cli/contribution.d.ts +32 -0
  227. package/dist/record/host/cli/contribution.js +10 -0
  228. package/dist/record/host/cli/contribution.js.map +1 -0
  229. package/dist/record/host/cli/index.cjs +8 -0
  230. package/dist/record/host/cli/index.cjs.map +1 -0
  231. package/dist/record/host/cli/index.d.cts +1 -0
  232. package/dist/record/host/cli/index.d.mts +1 -0
  233. package/dist/record/host/cli/index.d.ts +1 -0
  234. package/dist/record/host/cli/index.js +10 -0
  235. package/dist/record/host/cli/index.js.map +1 -0
  236. package/dist/record/host/cli/presentation.cjs +122 -0
  237. package/dist/record/host/cli/presentation.cjs.map +1 -0
  238. package/dist/record/host/cli/presentation.d.cts +7 -0
  239. package/dist/record/host/cli/presentation.d.mts +7 -0
  240. package/dist/record/host/cli/presentation.d.ts +7 -0
  241. package/dist/record/host/cli/presentation.js +12 -0
  242. package/dist/record/host/cli/presentation.js.map +1 -0
  243. package/dist/record/host/index.cjs.map +1 -1
  244. package/dist/record/host/index.d.cts +1 -1
  245. package/dist/record/host/index.d.mts +1 -1
  246. package/dist/record/host/index.d.ts +1 -1
  247. package/dist/record/host/runtime.cjs +184 -1
  248. package/dist/record/host/runtime.cjs.map +1 -1
  249. package/dist/record/host/types.cjs.map +1 -1
  250. package/dist/record/host/types.d.cts +120 -0
  251. package/dist/record/host/types.d.mts +120 -0
  252. package/dist/record/host/types.d.ts +120 -0
  253. package/dist/record/project.json +6 -0
  254. package/dist/report/assets/styles.css +80 -0
  255. package/dist/report/cli/contribution.cjs +325 -0
  256. package/dist/report/cli/contribution.cjs.map +1 -0
  257. package/dist/report/cli/contribution.d.cts +143 -0
  258. package/dist/report/cli/contribution.d.mts +143 -0
  259. package/dist/report/cli/contribution.d.ts +143 -0
  260. package/dist/report/cli/contribution.js +12 -0
  261. package/dist/report/cli/contribution.js.map +1 -0
  262. package/dist/report/client-dist/app.js +9 -9
  263. package/dist/report/components/attempt-detail/content.cjs +1 -1
  264. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  265. package/dist/report/components/entity-lists/compute.cjs +5 -0
  266. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  267. package/dist/report/components/entity-lists/compute.d.cts +2 -0
  268. package/dist/report/components/entity-lists/compute.d.mts +2 -0
  269. package/dist/report/components/entity-lists/compute.d.ts +2 -0
  270. package/dist/report/components/entity-lists/content.cjs +35 -12
  271. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  272. package/dist/report/components/entity-lists/index.cjs +0 -3
  273. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  274. package/dist/report/components/summaries/index.cjs +2 -4
  275. package/dist/report/components/summaries/index.cjs.map +1 -1
  276. package/dist/report/definition/cell.cjs +7 -2
  277. package/dist/report/definition/cell.cjs.map +1 -1
  278. package/dist/report/definition/cell.d.cts +2 -0
  279. package/dist/report/definition/cell.d.mts +2 -0
  280. package/dist/report/definition/cell.d.ts +2 -0
  281. package/dist/report/definition/primitives/assertion-evidence.cjs +190 -4
  282. package/dist/report/definition/primitives/assertion-evidence.cjs.map +1 -1
  283. package/dist/report/definition/primitives/assertion-evidence.d.cts +4 -0
  284. package/dist/report/definition/primitives/assertion-evidence.d.mts +4 -0
  285. package/dist/report/definition/primitives/assertion-evidence.d.ts +4 -0
  286. package/dist/report/execution/machine.cjs +2 -3
  287. package/dist/report/execution/machine.cjs.map +1 -1
  288. package/dist/report/execution/machine.d.cts +11 -8
  289. package/dist/report/execution/machine.d.mts +11 -8
  290. package/dist/report/execution/machine.d.ts +11 -8
  291. package/dist/report/host/from-record.cjs +13 -8
  292. package/dist/report/host/from-record.cjs.map +1 -1
  293. package/dist/report/host/index.cjs +5 -1
  294. package/dist/report/host/index.cjs.map +1 -1
  295. package/dist/report/host/index.d.cts +1 -0
  296. package/dist/report/host/index.d.mts +1 -0
  297. package/dist/report/host/index.d.ts +1 -0
  298. package/dist/report/host/index.js +8 -2
  299. package/dist/report/host/index.mjs +8 -2
  300. package/dist/report/host/machine.cjs +23 -22
  301. package/dist/report/host/machine.cjs.map +1 -1
  302. package/dist/report/host/machine.d.cts +1 -1
  303. package/dist/report/host/machine.d.mts +1 -1
  304. package/dist/report/host/machine.d.ts +1 -1
  305. package/dist/report/host/node/loader.cjs +4 -2
  306. package/dist/report/host/node/loader.cjs.map +1 -1
  307. package/dist/report/host/node/loader.d.cts +3 -1
  308. package/dist/report/host/node/loader.d.mts +3 -1
  309. package/dist/report/host/node/loader.d.ts +3 -1
  310. package/dist/report/host/node.cjs +44 -9
  311. package/dist/report/host/node.cjs.map +1 -1
  312. package/dist/report/host/node.d.cts +13 -3
  313. package/dist/report/host/node.d.mts +13 -3
  314. package/dist/report/host/node.d.ts +13 -3
  315. package/dist/report/host/node.js +44 -32
  316. package/dist/report/host/operations.cjs +14 -0
  317. package/dist/report/host/operations.cjs.map +1 -0
  318. package/dist/report/host/operations.d.cts +39 -0
  319. package/dist/report/host/operations.d.mts +39 -0
  320. package/dist/report/host/operations.d.ts +39 -0
  321. package/dist/report/host/operations.js +10 -0
  322. package/dist/report/host/operations.js.map +1 -0
  323. package/dist/report/model/chart/plot.cjs +1 -1
  324. package/dist/report/model/chart/plot.cjs.map +1 -1
  325. package/dist/report/model/locale.cjs +4 -0
  326. package/dist/report/model/locale.cjs.map +1 -1
  327. package/dist/report/model/locale.d.cts +3 -1
  328. package/dist/report/model/locale.d.mts +3 -1
  329. package/dist/report/model/locale.d.ts +3 -1
  330. package/dist/report/react/styles.css +80 -0
  331. package/dist/runner/build-preparation.cjs +5 -5
  332. package/dist/runner/build-preparation.cjs.map +1 -1
  333. package/dist/runner/build-preparation.d.cts +2 -3
  334. package/dist/runner/build-preparation.d.mts +2 -3
  335. package/dist/runner/build-preparation.d.ts +2 -3
  336. package/dist/runner/feedback/coordinator.cjs +18 -15
  337. package/dist/runner/feedback/coordinator.cjs.map +1 -1
  338. package/dist/runner/feedback/coordinator.d.cts +6 -0
  339. package/dist/runner/feedback/coordinator.d.mts +6 -0
  340. package/dist/runner/feedback/coordinator.d.ts +6 -0
  341. package/dist/runner/ledger.cjs +3 -13
  342. package/dist/runner/ledger.cjs.map +1 -1
  343. package/dist/runner/ledger.d.cts +1 -3
  344. package/dist/runner/ledger.d.mts +1 -3
  345. package/dist/runner/ledger.d.ts +1 -3
  346. package/dist/runner/run.cjs +63 -18
  347. package/dist/runner/run.cjs.map +1 -1
  348. package/dist/runner/session.cjs +10 -0
  349. package/dist/runner/session.cjs.map +1 -1
  350. package/dist/runner/session.d.cts +25 -0
  351. package/dist/runner/session.d.mts +25 -0
  352. package/dist/runner/session.d.ts +25 -0
  353. package/dist/runner/types.cjs.map +1 -1
  354. package/dist/runner/types.d.cts +1 -2
  355. package/dist/runner/types.d.mts +1 -2
  356. package/dist/runner/types.d.ts +1 -2
  357. package/dist/sandbox/build-coordinator.cjs +38 -19
  358. package/dist/sandbox/build-coordinator.cjs.map +1 -1
  359. package/dist/sandbox/build-coordinator.d.cts +47 -7
  360. package/dist/sandbox/build-coordinator.d.mts +47 -7
  361. package/dist/sandbox/build-coordinator.d.ts +47 -7
  362. package/dist/sandbox/build-coordinator.js +8 -4
  363. package/dist/sandbox/cli/contribution.cjs +128 -0
  364. package/dist/sandbox/cli/contribution.cjs.map +1 -0
  365. package/dist/sandbox/cli/contribution.d.cts +71 -0
  366. package/dist/sandbox/cli/contribution.d.mts +71 -0
  367. package/dist/sandbox/cli/contribution.d.ts +71 -0
  368. package/dist/sandbox/cli/contribution.js +8 -0
  369. package/dist/sandbox/cli/contribution.js.map +1 -0
  370. package/dist/sandbox/cli-commands.cjs +14 -21
  371. package/dist/sandbox/cli-commands.cjs.map +1 -1
  372. package/dist/sandbox/cli-commands.d.cts +12 -8
  373. package/dist/sandbox/cli-commands.d.mts +12 -8
  374. package/dist/sandbox/cli-commands.d.ts +12 -8
  375. package/dist/sandbox/compose.cjs +22 -2
  376. package/dist/sandbox/compose.cjs.map +1 -1
  377. package/dist/sandbox/compose.d.cts +1 -1
  378. package/dist/sandbox/compose.d.mts +1 -1
  379. package/dist/sandbox/compose.d.ts +1 -1
  380. package/dist/sandbox/docker-profile/cli.cjs +13 -9
  381. package/dist/sandbox/docker-profile/cli.cjs.map +1 -1
  382. package/dist/sandbox/docker-profile/cli.d.cts +2 -0
  383. package/dist/sandbox/docker-profile/cli.d.mts +2 -0
  384. package/dist/sandbox/docker-profile/cli.d.ts +2 -0
  385. package/dist/sandbox/docker-profile/runtime.cjs +68 -7
  386. package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
  387. package/dist/sandbox/docker-profile/runtime.d.cts +19 -1
  388. package/dist/sandbox/docker-profile/runtime.d.mts +19 -1
  389. package/dist/sandbox/docker-profile/runtime.d.ts +19 -1
  390. package/dist/sandbox/docker-profile/runtime.js +10 -8
  391. package/dist/sandbox/docker-profile/schema.cjs +68 -19
  392. package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
  393. package/dist/sandbox/docker-profile/schema.d.cts +23 -9
  394. package/dist/sandbox/docker-profile/schema.d.mts +23 -9
  395. package/dist/sandbox/docker-profile/schema.d.ts +23 -9
  396. package/dist/sandbox/docker-task-build-cache.cjs +532 -0
  397. package/dist/sandbox/docker-task-build-cache.cjs.map +1 -0
  398. package/dist/sandbox/docker-task-build-cache.d.cts +68 -0
  399. package/dist/sandbox/docker-task-build-cache.d.mts +68 -0
  400. package/dist/sandbox/docker-task-build-cache.d.ts +68 -0
  401. package/dist/sandbox/docker-task-build-cache.js +20 -0
  402. package/dist/sandbox/docker-task-build-cache.js.map +1 -0
  403. package/dist/sandbox/docker.cjs +50 -0
  404. package/dist/sandbox/docker.cjs.map +1 -1
  405. package/dist/sandbox/docker.d.cts +15 -0
  406. package/dist/sandbox/docker.d.mts +15 -0
  407. package/dist/sandbox/docker.d.ts +15 -0
  408. package/dist/sandbox/dockerfile-build.cjs +55 -5
  409. package/dist/sandbox/dockerfile-build.cjs.map +1 -1
  410. package/dist/sandbox/dockerfile-build.d.cts +2 -2
  411. package/dist/sandbox/dockerfile-build.d.mts +2 -2
  412. package/dist/sandbox/dockerfile-build.d.ts +2 -2
  413. package/dist/sandbox/index.cjs +5 -3
  414. package/dist/sandbox/index.cjs.map +1 -1
  415. package/dist/sandbox/index.d.cts +4 -3
  416. package/dist/sandbox/index.d.mts +4 -3
  417. package/dist/sandbox/index.d.ts +4 -3
  418. package/dist/sandbox/index.js +16 -14
  419. package/dist/sandbox/index.mjs +16 -14
  420. package/dist/sandbox/keep.cjs +1 -3
  421. package/dist/sandbox/keep.cjs.map +1 -1
  422. package/dist/sandbox/layer.cjs +70 -79
  423. package/dist/sandbox/layer.cjs.map +1 -1
  424. package/dist/sandbox/layer.d.cts +6 -12
  425. package/dist/sandbox/layer.d.mts +6 -12
  426. package/dist/sandbox/layer.d.ts +6 -12
  427. package/dist/sandbox/layer.js +16 -18
  428. package/dist/sandbox/ledger-paths.cjs +4 -18
  429. package/dist/sandbox/ledger-paths.cjs.map +1 -1
  430. package/dist/sandbox/ledger-paths.d.cts +3 -13
  431. package/dist/sandbox/ledger-paths.d.mts +3 -13
  432. package/dist/sandbox/ledger-paths.d.ts +3 -13
  433. package/dist/sandbox/ledger-paths.js +4 -8
  434. package/dist/sandbox/registry.cjs +1 -1
  435. package/dist/sandbox/registry.cjs.map +1 -1
  436. package/dist/sandbox/runtime.cjs +27 -37
  437. package/dist/sandbox/runtime.cjs.map +1 -1
  438. package/dist/sandbox/runtime.d.cts +1 -2
  439. package/dist/sandbox/runtime.d.mts +1 -2
  440. package/dist/sandbox/runtime.d.ts +1 -2
  441. package/dist/sandbox/runtime.js +6 -8
  442. package/dist/sandbox/types.cjs.map +1 -1
  443. package/dist/sandbox/types.d.cts +3 -3
  444. package/dist/sandbox/types.d.mts +3 -3
  445. package/dist/sandbox/types.d.ts +3 -3
  446. package/dist/sources/project.json +6 -0
  447. package/dist/vendor/remark/remark-gfm.cjs +72 -72
  448. package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
  449. package/dist/vendor/remark/remark-parse.cjs +54 -54
  450. package/dist/vendor/remark/remark-parse.cjs.map +1 -1
  451. package/dist/vendor/remark/remark.cjs +125 -125
  452. package/dist/vendor/remark/remark.cjs.map +2 -2
  453. package/docs-site/zh/README.md +1 -1
  454. package/docs-site/zh/explanation/assert.mdx +4 -0
  455. package/docs-site/zh/explanation/judge.mdx +40 -9
  456. package/docs-site/zh/reference/cli.mdx +67 -43
  457. package/docs-site/zh/reference/define-agent.mdx +2 -2
  458. package/docs-site/zh/reference/report-components.mdx +4 -3
  459. package/docs-site/zh/troubleshooting/debug-sandbox.mdx +6 -0
  460. package/docs-site/zh/troubleshooting/debugging.mdx +28 -1
  461. package/docs-site/zh/tutorials/agent-feedback-loop.mdx +4 -2
  462. package/docs-site/zh/tutorials/concurrency.mdx +2 -2
  463. package/docs-site/zh/tutorials/custom-reports.mdx +175 -9
  464. package/docs-site/zh/tutorials/docker-in-docker.mdx +52 -7
  465. package/docs-site/zh/tutorials/eval-groups.mdx +1 -2
  466. package/docs-site/zh/tutorials/evaluation-kinds.mdx +39 -6
  467. package/docs-site/zh/tutorials/nixos-managed-dind.mdx +14 -5
  468. package/docs-site/zh/tutorials/sandbox-providers.mdx +1 -28
  469. package/docs-site/zh/tutorials/sandbox-reuse.mdx +1 -1
  470. package/docs-site/zh/tutorials/viewing-results.mdx +2 -0
  471. package/package.json +24 -19
  472. package/README.md +0 -176
  473. package/README.zh.md +0 -176
  474. package/dist/cli/record.cjs +0 -246
  475. package/dist/cli/record.cjs.map +0 -1
  476. package/dist/cli/record.d.cts +0 -40
  477. package/dist/cli/record.d.mts +0 -40
  478. package/dist/cli/record.d.ts +0 -40
  479. package/dist/cli/record.js +0 -10
  480. package/dist/cli/record.js.map +0 -1
  481. package/dist/sandbox/local.cjs +0 -361
  482. package/dist/sandbox/local.cjs.map +0 -1
  483. package/dist/sandbox/local.d.cts +0 -80
  484. package/dist/sandbox/local.d.mts +0 -80
  485. package/dist/sandbox/local.d.ts +0 -80
  486. package/dist/sandbox/local.js +0 -6
  487. package/dist/sandbox/local.js.map +0 -1
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SANDBOX_BUILD_ACTIVITY = void 0;
4
+ exports.materializationScopeId = materializationScopeId;
5
+ exports.sandboxBuildRef = sandboxBuildRef;
4
6
  exports.prepareSandboxBuilds = prepareSandboxBuilds;
5
7
  exports.startSandboxBuilds = startSandboxBuilds;
6
8
  exports.buildFailureOrigin = buildFailureOrigin;
@@ -11,10 +13,21 @@ exports.buildFailureOrigin = buildFailureOrigin;
11
13
  // 落盘形状:docs/feature/record/architecture.md「sandboxBuilds」。
12
14
  // 内部是 Effect 协调:逐 key 结算用 Deferred、整批收工用 Fiber 观察、退避用 Clock.sleep、
13
15
  // 并发闸用 Semaphore;公开 RunningSandboxBuilds 保持 Promise ABI,只在方法边界 runPromise。
16
+ const node_crypto_1 = require("node:crypto");
14
17
  const effect_1 = require("effect");
15
18
  const errors_ts_1 = require("./errors.cjs");
16
19
  /** Run 级开放 activity key;与 Record 契约同名。 */
17
20
  exports.SANDBOX_BUILD_ACTIVITY = "sandbox.build";
21
+ function materializationScopeId(input) {
22
+ return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify([
23
+ input.providerFamily,
24
+ input.authorityFingerprint,
25
+ input.materializationProtocolVersion,
26
+ ])).digest("hex");
27
+ }
28
+ function sandboxBuildRef(scopeId, buildKey) {
29
+ return (0, node_crypto_1.createHash)("sha256").update(`${scopeId}\0${buildKey}`).digest("hex");
30
+ }
18
31
  /**
19
32
  * 对仍需 fresh 的 BuildKey 做 Run 级共享准备,等全部 key 结算。
20
33
  * 调用方负责先做携带规划、只传入未携带 attempt 引用的 key;本函数不为「查看旧结果」造假 provenance。
@@ -29,16 +42,16 @@ async function prepareSandboxBuilds(works, opts) {
29
42
  function startSandboxBuilds(works, opts) {
30
43
  const unique = dedupeWorks(works);
31
44
  if (unique.length === 0) {
32
- const empty = { locators: new Map(), records: [], failures: new Map() };
45
+ const empty = { sources: new Map(), records: [], failures: new Map() };
33
46
  return {
34
- locators: empty.locators,
47
+ sources: empty.sources,
35
48
  failures: empty.failures,
36
49
  async settled() { },
37
50
  done: Promise.resolve(empty),
38
51
  };
39
52
  }
40
53
  const maxConcurrency = Math.max(1, opts.maxConcurrency ?? 2);
41
- const locators = new Map();
54
+ const sources = new Map();
42
55
  const records = [];
43
56
  const failures = new Map();
44
57
  const prepareSignal = combineSignals([
@@ -51,14 +64,14 @@ function startSandboxBuilds(works, opts) {
51
64
  // Deferred 结算后状态保持,迟到等待方同样立即放行。
52
65
  const perKey = new Map();
53
66
  for (const work of unique) {
54
- perKey.set(work.buildKey, effect_1.Deferred.unsafeMake(effect_1.FiberId.unsafeMake()));
67
+ perKey.set(work.ref, effect_1.Deferred.unsafeMake(effect_1.FiberId.unsafeMake()));
55
68
  }
56
69
  const ctx = {
57
70
  timing: opts.timing,
58
71
  provider: opts.provider,
59
72
  buildTimeoutMs: opts.buildTimeoutMs,
60
73
  signal: prepareSignal,
61
- locators,
74
+ sources,
62
75
  records,
63
76
  failures,
64
77
  onActivity: opts.onActivity,
@@ -70,20 +83,20 @@ function startSandboxBuilds(works, opts) {
70
83
  // 的失败传播一致,且观察不打断兄弟 fiber,一条出事后其余 key 照常结算。
71
84
  const coordination = effect_1.Effect.gen(function* () {
72
85
  const gate = yield* effect_1.Effect.makeSemaphore(maxConcurrency);
73
- const fibers = yield* effect_1.Effect.forEach(unique, (work) => effect_1.Effect.fork(gate.withPermits(1)(prepareOne(work, ctx)).pipe(effect_1.Effect.ensuring(effect_1.Effect.asVoid(effect_1.Deferred.succeed(perKey.get(work.buildKey), undefined))))));
86
+ const fibers = yield* effect_1.Effect.forEach(unique, (work) => effect_1.Effect.fork(gate.withPermits(1)(prepareOne(work, ctx)).pipe(effect_1.Effect.ensuring(effect_1.Effect.asVoid(effect_1.Deferred.succeed(perKey.get(work.ref), undefined))))));
74
87
  const exits = yield* effect_1.Effect.forEach(fibers, effect_1.Fiber.await, { concurrency: "unbounded" });
75
88
  const failed = exits.find(effect_1.Exit.isFailure);
76
89
  if (failed !== undefined && effect_1.Exit.isFailure(failed))
77
90
  return yield* effect_1.Effect.failCause(failed.cause);
78
- return { locators, records, failures };
91
+ return { sources, records, failures };
79
92
  });
80
93
  // 边界:唯一一次把 Effect 驱动进公开 Promise ABI。
81
94
  const done = effect_1.Effect.runPromise(coordination);
82
95
  return {
83
- locators,
96
+ sources,
84
97
  failures,
85
- async settled(buildKey) {
86
- const deferred = perKey.get(buildKey);
98
+ async settled(ref) {
99
+ const deferred = perKey.get(ref);
87
100
  if (deferred === undefined)
88
101
  return;
89
102
  await effect_1.Effect.runPromise(effect_1.Deferred.await(deferred));
@@ -106,8 +119,8 @@ function buildFailureOrigin(failure) {
106
119
  function dedupeWorks(works) {
107
120
  const seen = new Map();
108
121
  for (const work of works) {
109
- if (!seen.has(work.buildKey))
110
- seen.set(work.buildKey, work);
122
+ if (!seen.has(work.ref))
123
+ seen.set(work.ref, work);
111
124
  }
112
125
  return [...seen.values()];
113
126
  }
@@ -123,6 +136,7 @@ function prepareOne(work, ctx) {
123
136
  });
124
137
  ctx.onActivity?.({
125
138
  status: "started",
139
+ ref: work.ref,
126
140
  buildKey: work.buildKey,
127
141
  id: parent.id,
128
142
  key: exports.SANDBOX_BUILD_ACTIVITY,
@@ -132,7 +146,7 @@ function prepareOne(work, ctx) {
132
146
  ctx.signal,
133
147
  ctx.buildTimeoutMs !== undefined ? AbortSignal.timeout(ctx.buildTimeoutMs) : undefined,
134
148
  ]);
135
- const finish = (status, locator, error) => {
149
+ const finish = (status, source, error) => {
136
150
  parent.durationMs = Math.max(0, ctx.timing.offsetNow() - startOffsetMs);
137
151
  if (status === "failed" || status === "cancelled")
138
152
  parent.failed = true;
@@ -142,15 +156,16 @@ function prepareOne(work, ctx) {
142
156
  status,
143
157
  timingNodeId: parent.id,
144
158
  inputs: work.inputs,
145
- ...(locator !== undefined ? { locator } : {}),
159
+ ...(source !== undefined ? { locator: source.locator } : {}),
146
160
  ...(error !== undefined ? { error } : {}),
147
161
  };
148
162
  ctx.records.push(record);
149
- if (locator !== undefined && (status === "hit" || status === "built")) {
150
- ctx.locators.set(work.buildKey, locator);
163
+ if (source !== undefined && (status === "hit" || status === "built")) {
164
+ ctx.sources.set(work.ref, source);
151
165
  }
152
166
  if (error !== undefined && (status === "failed" || status === "cancelled")) {
153
- ctx.failures.set(work.buildKey, {
167
+ ctx.failures.set(work.ref, {
168
+ ref: work.ref,
154
169
  buildKey: work.buildKey,
155
170
  timingNodeId: parent.id,
156
171
  status,
@@ -159,6 +174,8 @@ function prepareOne(work, ctx) {
159
174
  }
160
175
  ctx.onActivity?.({
161
176
  status: status === "failed" || status === "cancelled" ? "failed" : "done",
177
+ ref: work.ref,
178
+ outcome: status,
162
179
  buildKey: work.buildKey,
163
180
  id: parent.id,
164
181
  key: exports.SANDBOX_BUILD_ACTIVITY,
@@ -190,14 +207,16 @@ function prepareOne(work, ctx) {
190
207
  }));
191
208
  if (lookup._tag === "Left")
192
209
  return yield* finishFailure(lookup.left);
193
- if (lookup.right !== undefined) {
194
- finish("hit", lookup.right);
210
+ if (lookup.right._tag === "Hit") {
211
+ finish("hit", lookup.right.source);
195
212
  return;
196
213
  }
197
214
  // 瞬时构建失败(基线镜像拉取限流、传输层中断)退避重试:构建产物是镜像与 template,
198
215
  // 没有计费实例的泄漏面,歧义类同样可重试(case.md「Run 级构建协调」第 5 条)。
216
+ const operationId = (0, node_crypto_1.randomUUID)();
199
217
  const build = (attempt) => effect_1.Effect.tryPromise({
200
218
  try: () => ctx.provider.build(work, {
219
+ operationId,
201
220
  signal: keySignal,
202
221
  timing: ctx.timing,
203
222
  parent,
@@ -1 +1 @@
1
- {"version":3,"file":"build-coordinator.js","sourceRoot":"","sources":["build-coordinator.ts"],"names":[],"mappings":"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","sourcesContent":["// Run 级构建协调器:携带规划后只为仍需 fresh 的 BuildKey 工作。\n// single-flight、独立并发、逐 key timeout、全局准备上限、abort/cancel;\n// 写 sandbox.build timings 与 sandboxBuilds provenance;失败按依赖集合扇出。\n// 契约单源:docs/feature/sandbox/case.md「Run 级构建协调」;\n// 落盘形状:docs/feature/record/architecture.md「sandboxBuilds」。\n// 内部是 Effect 协调:逐 key 结算用 Deferred、整批收工用 Fiber 观察、退避用 Clock.sleep、\n// 并发闸用 Semaphore;公开 RunningSandboxBuilds 保持 Promise ABI,只在方法边界 runPromise。\nimport { Deferred, Duration, Effect, Exit, Fiber, FiberId, Random } from \"effect\";\nimport type { JsonValue } from \"../shared/types.ts\";\nimport type { RunTimingRecorder } from \"../runner/timing.ts\";\nimport type { SandboxBuildRecord, TimingActivity } from \"../runner/types.ts\";\nimport { classifyProvisionErrorFallback, isRetryableProvisionError } from \"./errors.ts\";\nimport type { BuildKey } from \"./identity.ts\";\n/** Run 级开放 activity key;与 Record 契约同名。 */\nexport const SANDBOX_BUILD_ACTIVITY = \"sandbox.build\" as const;\n/** 一条待协调的构建工作(同 BuildKey 只保留第一次出现的 inputs / provider)。 */\nexport interface SandboxBuildWork {\n readonly buildKey: BuildKey;\n readonly provider: string;\n /** 解析后的构建输入投影;不含凭据值。 */\n readonly inputs: JsonValue;\n /** 有界人读标签;省略时用 BuildKey 短前缀。 */\n readonly label?: string;\n}\n/** provider 侧 cache 查询与真实构建。 */\nexport interface SandboxBuildProvider {\n /** 查 provider 原生 cache / 本地 build registry;命中返回 locator。 */\n lookup(work: SandboxBuildWork, signal: AbortSignal): Promise<JsonValue | undefined>;\n /** cache miss 时调用原生构建 API。 */\n build(work: SandboxBuildWork, ctx: SandboxBuildExecutionContext): Promise<JsonValue>;\n /** 可选:Invocation abort / timeout 时取消远端 build。 */\n cancel?(work: SandboxBuildWork): Promise<void>;\n}\n/** 构建执行上下文:子 activity 挂在当前 sandbox.build 节点下。 */\nexport interface SandboxBuildExecutionContext {\n readonly signal: AbortSignal;\n readonly timing: RunTimingRecorder;\n readonly parent: TimingActivity;\n}\nexport interface PrepareSandboxBuildsOptions {\n readonly timing: RunTimingRecorder;\n readonly provider: SandboxBuildProvider;\n /** 同时 in-flight 的不同 BuildKey 上限;默认 2。不占 attempt 并发位。 */\n readonly maxConcurrency?: number;\n /** 逐 BuildKey 的 timeout(ms);省略 = 无逐 key 上限。 */\n readonly buildTimeoutMs?: number;\n /** 整段准备的全局墙钟上限(ms);省略 = 无全局上限。 */\n readonly prepareBudgetMs?: number;\n /** Invocation abort(Ctrl+C)。 */\n readonly signal?: AbortSignal;\n /**\n * 每个 BuildKey 真正开始 / 结束时回调一次(有界起止事件)。\n * 供 live feedback 投影为运行级 active 行 / 非 TTY 永久事件;不改变协调语义。\n */\n readonly onActivity?: (event: SandboxBuildActivityEvent) => void;\n /** 瞬时构建失败的退避重试上限(含首次尝试);默认 3。 */\n readonly buildAttempts?: number;\n /** 退避基数(ms),第 n 次重试睡 base × 2^n × 抖动;默认 1000。 */\n readonly buildRetryBaseMs?: number;\n}\n/** 构建协调器对外的有界 activity 事件(与 Run feedback 的 run-activity 字段对齐)。 */\nexport type SandboxBuildActivityEvent = {\n status: \"started\";\n buildKey: BuildKey;\n id: string;\n key: typeof SANDBOX_BUILD_ACTIVITY;\n label: string;\n} | {\n status: \"done\" | \"failed\";\n buildKey: BuildKey;\n id: string;\n key: typeof SANDBOX_BUILD_ACTIVITY;\n label: string;\n durationMs: number;\n};\nexport interface SandboxBuildFailure {\n readonly buildKey: BuildKey;\n readonly timingNodeId: string;\n readonly status: \"failed\" | \"cancelled\";\n readonly error: NonNullable<SandboxBuildRecord[\"error\"]>;\n}\nexport interface SandboxBuildPreparation {\n /** 成功(hit / built)的 BuildKey → locator。 */\n readonly locators: ReadonlyMap<BuildKey, JsonValue>;\n /** 实际查询或构建过的每条 provenance(不含完全携带、从未过问的 key)。 */\n readonly records: readonly SandboxBuildRecord[];\n /** 失败或取消的 BuildKey → 共用同一 Run timing origin 的错误。 */\n readonly failures: ReadonlyMap<BuildKey, SandboxBuildFailure>;\n}\n/** 进行中的 Run 级共享准备:逐 BuildKey 放行,依赖者只等自己引用的那几个 key。 */\nexport interface RunningSandboxBuilds {\n /** 已结算 key 的实时视图(随构建推进增补,不等整批收工)。 */\n readonly locators: ReadonlyMap<BuildKey, JsonValue>;\n /** 已失败 / 已取消 key 的实时视图。 */\n readonly failures: ReadonlyMap<BuildKey, SandboxBuildFailure>;\n /** 等某个 BuildKey 结算;不在本次协调范围内的 key 立即返回。 */\n settled(buildKey: BuildKey): Promise<void>;\n /** 全部 key 结算后的汇总(provenance 在这里齐全)。 */\n readonly done: Promise<SandboxBuildPreparation>;\n}\n/**\n * 对仍需 fresh 的 BuildKey 做 Run 级共享准备,等全部 key 结算。\n * 调用方负责先做携带规划、只传入未携带 attempt 引用的 key;本函数不为「查看旧结果」造假 provenance。\n */\nexport async function prepareSandboxBuilds(works: readonly SandboxBuildWork[], opts: PrepareSandboxBuildsOptions): Promise<SandboxBuildPreparation> {\n return startSandboxBuilds(works, opts).done;\n}\n/**\n * 启动 Run 级共享准备并立刻返回句柄:调用方按 BuildKey 逐个等待,\n * 只依赖已就绪 key 的 attempt 不被同批最慢的那个构建挡住(见 case.md「Run 级构建协调」第 4 条)。\n */\nexport function startSandboxBuilds(works: readonly SandboxBuildWork[], opts: PrepareSandboxBuildsOptions): RunningSandboxBuilds {\n const unique = dedupeWorks(works);\n if (unique.length === 0) {\n const empty: SandboxBuildPreparation = { locators: new Map(), records: [], failures: new Map() };\n return {\n locators: empty.locators,\n failures: empty.failures,\n async settled() { },\n done: Promise.resolve(empty),\n };\n }\n const maxConcurrency = Math.max(1, opts.maxConcurrency ?? 2);\n const locators = new Map<BuildKey, JsonValue>();\n const records: SandboxBuildRecord[] = [];\n const failures = new Map<BuildKey, SandboxBuildFailure>();\n const prepareSignal = combineSignals([\n opts.signal,\n opts.prepareBudgetMs !== undefined ? AbortSignal.timeout(opts.prepareBudgetMs) : undefined,\n ]);\n // 逐 key 的结算 Deferred:key 一结算就 settle,依赖它的 attempt 当场放行,\n // 不等同批其它 key(single-flight 仍靠这张表,同 key 的第二个 work 复用同一条)。\n // 在方法边界同步创建,settled() 在任意时刻调用都拿到同一结果;\n // Deferred 结算后状态保持,迟到等待方同样立即放行。\n const perKey = new Map<BuildKey, Deferred.Deferred<void, never>>();\n for (const work of unique) {\n perKey.set(work.buildKey, Deferred.unsafeMake(FiberId.unsafeMake()));\n }\n const ctx = {\n timing: opts.timing,\n provider: opts.provider,\n buildTimeoutMs: opts.buildTimeoutMs,\n signal: prepareSignal,\n locators,\n records,\n failures,\n onActivity: opts.onActivity,\n buildAttempts: Math.max(1, opts.buildAttempts ?? DEFAULT_BUILD_ATTEMPTS),\n buildRetryBaseMs: Math.max(0, opts.buildRetryBaseMs ?? DEFAULT_BUILD_RETRY_BASE_MS),\n };\n // 整段准备是一个 Effect 程序:每 key 一条 gate 保护的 fiber,结算挂在 ensuring 上\n // (失败/中断同样放行等待方);收尾逐 fiber 观察 exit,先到先报缺陷——与 Promise.all\n // 的失败传播一致,且观察不打断兄弟 fiber,一条出事后其余 key 照常结算。\n const coordination = Effect.gen(function* () {\n const gate = yield* Effect.makeSemaphore(maxConcurrency);\n const fibers = yield* Effect.forEach(unique, (work) => Effect.fork(gate.withPermits(1)(prepareOne(work, ctx)).pipe(Effect.ensuring(Effect.asVoid(Deferred.succeed(perKey.get(work.buildKey)!, undefined))))));\n const exits = yield* Effect.forEach(fibers, Fiber.await, { concurrency: \"unbounded\" });\n const failed = exits.find(Exit.isFailure);\n if (failed !== undefined && Exit.isFailure(failed))\n return yield* Effect.failCause(failed.cause);\n return { locators, records, failures } satisfies SandboxBuildPreparation;\n });\n // 边界:唯一一次把 Effect 驱动进公开 Promise ABI。\n const done = Effect.runPromise(coordination);\n return {\n locators,\n failures,\n async settled(buildKey) {\n const deferred = perKey.get(buildKey);\n if (deferred === undefined)\n return;\n await Effect.runPromise(Deferred.await(deferred));\n },\n done,\n };\n}\n/**\n * 从 fresh attempt 依赖表扇出构建失败 → AttemptError 形状所需字段。\n * 同一 BuildKey 的所有依赖者共用同一个 timingNodeId。\n */\nexport function buildFailureOrigin(failure: SandboxBuildFailure): {\n code: string;\n message: string;\n timingNodeId: string;\n cause?: SandboxBuildFailure[\"error\"][\"cause\"];\n} {\n return {\n code: failure.error.code,\n message: failure.error.message,\n timingNodeId: failure.timingNodeId,\n ...(failure.error.cause !== undefined ? { cause: failure.error.cause } : {}),\n };\n}\nfunction dedupeWorks(works: readonly SandboxBuildWork[]): SandboxBuildWork[] {\n const seen = new Map<BuildKey, SandboxBuildWork>();\n for (const work of works) {\n if (!seen.has(work.buildKey))\n seen.set(work.buildKey, work);\n }\n return [...seen.values()];\n}\nfunction prepareOne(work: SandboxBuildWork, ctx: {\n timing: RunTimingRecorder;\n provider: SandboxBuildProvider;\n buildTimeoutMs: number | undefined;\n signal: AbortSignal;\n locators: Map<BuildKey, JsonValue>;\n records: SandboxBuildRecord[];\n failures: Map<BuildKey, SandboxBuildFailure>;\n onActivity?: (event: SandboxBuildActivityEvent) => void;\n buildAttempts: number;\n buildRetryBaseMs: number;\n}): Effect.Effect<void> {\n return Effect.gen(function* () {\n const label = work.label ?? `build ${work.buildKey.slice(0, 12)}`;\n const startOffsetMs = ctx.timing.offsetNow();\n const parent = ctx.timing.child({\n key: SANDBOX_BUILD_ACTIVITY,\n label,\n startOffsetMs,\n durationMs: 0,\n });\n ctx.onActivity?.({\n status: \"started\",\n buildKey: work.buildKey,\n id: parent.id,\n key: SANDBOX_BUILD_ACTIVITY,\n label,\n });\n const keySignal = combineSignals([\n ctx.signal,\n ctx.buildTimeoutMs !== undefined ? AbortSignal.timeout(ctx.buildTimeoutMs) : undefined,\n ]);\n const finish = (status: SandboxBuildRecord[\"status\"], locator?: JsonValue, error?: SandboxBuildRecord[\"error\"]) => {\n parent.durationMs = Math.max(0, ctx.timing.offsetNow() - startOffsetMs);\n if (status === \"failed\" || status === \"cancelled\")\n parent.failed = true;\n const record: SandboxBuildRecord = {\n buildKey: work.buildKey,\n provider: work.provider,\n status,\n timingNodeId: parent.id,\n inputs: work.inputs,\n ...(locator !== undefined ? { locator } : {}),\n ...(error !== undefined ? { error } : {}),\n };\n ctx.records.push(record);\n if (locator !== undefined && (status === \"hit\" || status === \"built\")) {\n ctx.locators.set(work.buildKey, locator);\n }\n if (error !== undefined && (status === \"failed\" || status === \"cancelled\")) {\n ctx.failures.set(work.buildKey, {\n buildKey: work.buildKey,\n timingNodeId: parent.id,\n status,\n error,\n });\n }\n ctx.onActivity?.({\n status: status === \"failed\" || status === \"cancelled\" ? \"failed\" : \"done\",\n buildKey: work.buildKey,\n id: parent.id,\n key: SANDBOX_BUILD_ACTIVITY,\n label,\n durationMs: parent.durationMs,\n });\n };\n if (keySignal.aborted) {\n finish(\"cancelled\", undefined, abortError(keySignal, work.buildKey));\n return;\n }\n const finishFailure = (e: unknown): Effect.Effect<void> => Effect.gen(function* () {\n if (keySignal.aborted || isAbortError(e)) {\n const cancel = ctx.provider.cancel;\n if (cancel !== undefined) {\n yield* Effect.tryPromise({\n try: () => cancel(work),\n catch: () => undefined,\n }).pipe(Effect.ignore);\n }\n finish(\"cancelled\", undefined, abortError(keySignal, work.buildKey, e));\n return;\n }\n finish(\"failed\", undefined, failedError(work.buildKey, e));\n });\n const lookup = yield* Effect.either(Effect.tryPromise({\n try: () => ctx.provider.lookup(work, keySignal),\n catch: (error) => error,\n }));\n if (lookup._tag === \"Left\")\n return yield* finishFailure(lookup.left);\n if (lookup.right !== undefined) {\n finish(\"hit\", lookup.right);\n return;\n }\n // 瞬时构建失败(基线镜像拉取限流、传输层中断)退避重试:构建产物是镜像与 template,\n // 没有计费实例的泄漏面,歧义类同样可重试(case.md「Run 级构建协调」第 5 条)。\n const build = (attempt: number): Effect.Effect<JsonValue, unknown> => Effect.tryPromise({\n try: () => ctx.provider.build(work, {\n signal: keySignal,\n timing: ctx.timing,\n parent,\n }),\n catch: (error) => error,\n }).pipe(Effect.catchAll((error) => {\n const last = attempt >= ctx.buildAttempts - 1;\n if (last || keySignal.aborted || isAbortError(error) || !isTransientBuildError(error)) {\n return Effect.fail(error);\n }\n return Random.next.pipe(Effect.map((jitter) => backoffDelay(ctx.buildRetryBaseMs, attempt, jitter)), Effect.flatMap((delayMs) => sleep(delayMs, keySignal)), Effect.flatMap(() => keySignal.aborted ? Effect.fail(error) : build(attempt + 1)));\n }));\n const built = yield* Effect.either(build(0));\n if (built._tag === \"Left\")\n return yield* finishFailure(built.left);\n finish(\"built\", built.right);\n });\n}\n/** 首次尝试 + 2 次重试:与 provisioning 同一种「封顶次数」纪律,构建单次耗时更长所以更浅。 */\nconst DEFAULT_BUILD_ATTEMPTS = 3;\nconst DEFAULT_BUILD_RETRY_BASE_MS = 1000;\n/** 指数退避 + 全抖动(0.5x~1.5x),避免同一批被限流的构建同时醒来再次撞限流。 */\nfunction backoffDelay(baseMs: number, attempt: number, jitter: number): number {\n return baseMs * 2 ** attempt * (0.5 + jitter);\n}\n/** 退避睡眠:Clock 驱动的 Effect.sleep(TestClock 可验证时序),abort 时提前放行。 */\nfunction sleep(ms: number, signal: AbortSignal): Effect.Effect<void, never> {\n if (ms <= 0)\n return Effect.void;\n const timer = Effect.sleep(Duration.millis(ms));\n const abort = Effect.async<void>((resume) => {\n if (signal.aborted) {\n resume(Effect.void);\n return;\n }\n const onAbort = () => resume(Effect.void);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n return Effect.sync(() => signal.removeEventListener(\"abort\", onAbort));\n });\n return Effect.raceFirst(timer, abort);\n}\n/**\n * 构建失败的性质分类:瞬时才重试。\n * 先过与 provisioning 共用的保守瞬时分类器,再补 builder CLI 自己的文案形态——\n * registry 限流、拉取中途 EOF、TLS / IO 超时都出现在 `docker compose build` 的 stderr 里,\n * 它们不带 status code,只有文案。\n */\nfunction isTransientBuildError(e: unknown): boolean {\n if (isRetryableProvisionError(classifyProvisionErrorFallback(e)))\n return true;\n const message = e instanceof Error ? e.message : String(e);\n return /toomanyrequests|unexpected EOF|i\\/o timeout|TLS handshake timeout|failed to do request|connection reset by peer|temporary failure in name resolution|failed to copy: httpReadSeeker|EOF$/im.test(message);\n}\nfunction abortError(signal: AbortSignal, buildKey: BuildKey, cause?: unknown): NonNullable<SandboxBuildRecord[\"error\"]> {\n const timedOut = isTimeoutReason(signal.reason);\n const code = timedOut ? \"sandbox-build-timeout\" : \"sandbox-build-cancelled\";\n const message = timedOut\n ? `sandbox build timed out for BuildKey ${buildKey.slice(0, 12)}…`\n : `sandbox build cancelled for BuildKey ${buildKey.slice(0, 12)}…`;\n return {\n code,\n message,\n ...(cause !== undefined ? { cause: causeSummary(cause) } : {}),\n };\n}\nfunction isTimeoutReason(reason: unknown): boolean {\n if (reason === undefined || reason === null)\n return false;\n if (typeof DOMException !== \"undefined\" && reason instanceof DOMException && reason.name === \"TimeoutError\") {\n return true;\n }\n return reason instanceof Error && reason.name === \"TimeoutError\";\n}\nfunction failedError(buildKey: BuildKey, e: unknown): NonNullable<SandboxBuildRecord[\"error\"]> {\n return {\n code: \"sandbox-build-failed\",\n message: e instanceof Error ? e.message : `sandbox build failed for BuildKey ${buildKey.slice(0, 12)}…`,\n cause: causeSummary(e),\n };\n}\nfunction causeSummary(e: unknown): {\n name?: string;\n code?: string;\n message: string;\n} {\n if (e instanceof Error) {\n const withCode = e as Error & {\n code?: unknown;\n };\n const code = typeof withCode.code === \"string\" ? withCode.code : undefined;\n return {\n name: e.name,\n ...(code !== undefined ? { code } : {}),\n message: e.message,\n };\n }\n return { message: String(e) };\n}\nfunction isAbortError(e: unknown): boolean {\n if (e instanceof Error && e.name === \"AbortError\")\n return true;\n if (typeof DOMException !== \"undefined\" && e instanceof DOMException && e.name === \"AbortError\")\n return true;\n return false;\n}\nfunction combineSignals(signals: Array<AbortSignal | undefined>): AbortSignal {\n const active = signals.filter((s): s is AbortSignal => s !== undefined);\n if (active.length === 0)\n return new AbortController().signal;\n if (active.length === 1)\n return active[0]!;\n return AbortSignal.any(active);\n}\n"]}
1
+ {"version":3,"file":"build-coordinator.js","sourceRoot":"","sources":["build-coordinator.ts"],"names":[],"mappings":"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","sourcesContent":["// Run 级构建协调器:携带规划后只为仍需 fresh 的 BuildKey 工作。\n// single-flight、独立并发、逐 key timeout、全局准备上限、abort/cancel;\n// 写 sandbox.build timings 与 sandboxBuilds provenance;失败按依赖集合扇出。\n// 契约单源:docs/feature/sandbox/case.md「Run 级构建协调」;\n// 落盘形状:docs/feature/record/architecture.md「sandboxBuilds」。\n// 内部是 Effect 协调:逐 key 结算用 Deferred、整批收工用 Fiber 观察、退避用 Clock.sleep、\n// 并发闸用 Semaphore;公开 RunningSandboxBuilds 保持 Promise ABI,只在方法边界 runPromise。\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { Deferred, Duration, Effect, Exit, Fiber, FiberId, Random } from \"effect\";\nimport type { JsonValue } from \"../shared/types.ts\";\nimport type { RunTimingRecorder } from \"../runner/timing.ts\";\nimport type { SandboxBuildRecord, TimingActivity } from \"../runner/types.ts\";\nimport { classifyProvisionErrorFallback, isRetryableProvisionError } from \"./errors.ts\";\nimport type { BuildKey } from \"./identity.ts\";\n/** Run 级开放 activity key;与 Record 契约同名。 */\nexport const SANDBOX_BUILD_ACTIVITY = \"sandbox.build\" as const;\ndeclare const MaterializationScopeIdBrand: unique symbol;\nexport type MaterializationScopeId = string & {\n readonly [MaterializationScopeIdBrand]: true;\n};\ndeclare const SandboxBuildRefBrand: unique symbol;\nexport type SandboxBuildRef = string & {\n readonly [SandboxBuildRefBrand]: true;\n};\nexport function materializationScopeId(input: {\n readonly providerFamily: string;\n readonly authorityFingerprint: string;\n readonly materializationProtocolVersion: number;\n}): MaterializationScopeId {\n return createHash(\"sha256\").update(JSON.stringify([\n input.providerFamily,\n input.authorityFingerprint,\n input.materializationProtocolVersion,\n ])).digest(\"hex\") as MaterializationScopeId;\n}\nexport function sandboxBuildRef(scopeId: MaterializationScopeId, buildKey: BuildKey): SandboxBuildRef {\n return createHash(\"sha256\").update(`${scopeId}\\0${buildKey}`).digest(\"hex\") as SandboxBuildRef;\n}\n/** 一条待协调的构建工作(同 BuildKey 只保留第一次出现的 inputs / provider)。 */\nexport interface SandboxBuildWork {\n readonly ref: SandboxBuildRef;\n readonly scopeId: MaterializationScopeId;\n readonly buildKey: BuildKey;\n readonly provider: string;\n /** 解析后的构建输入投影;不含凭据值。 */\n readonly inputs: JsonValue;\n /** 有界人读标签;省略时用 BuildKey 短前缀。 */\n readonly label?: string;\n}\nexport interface SandboxBuildUseHandle {\n readonly locator: JsonValue;\n release(): Promise<void> | void;\n}\nexport interface SandboxBuildArtifactSource {\n readonly locator: JsonValue;\n readonly source: \"cache\" | \"build\";\n acquireUse(signal: AbortSignal): Promise<SandboxBuildUseHandle>;\n release(): Promise<void> | void;\n}\nexport type SandboxBuildLookup = {\n readonly _tag: \"Hit\";\n readonly source: SandboxBuildArtifactSource;\n} | {\n readonly _tag: \"Miss\";\n} | {\n readonly _tag: \"Unsupported\";\n};\n/** provider 侧 cache 查询与真实构建。 */\nexport interface SandboxBuildProvider {\n /** 查 provider 原生 cache / 本地 build registry;命中返回 locator。 */\n lookup(work: SandboxBuildWork, signal: AbortSignal): Promise<SandboxBuildLookup>;\n /** cache miss 时调用原生构建 API。 */\n build(work: SandboxBuildWork, ctx: SandboxBuildExecutionContext): Promise<SandboxBuildArtifactSource>;\n /** 可选:Invocation abort / timeout 时取消远端 build。 */\n cancel?(work: SandboxBuildWork): Promise<void>;\n}\n/** 构建执行上下文:子 activity 挂在当前 sandbox.build 节点下。 */\nexport interface SandboxBuildExecutionContext {\n readonly operationId: string;\n readonly signal: AbortSignal;\n readonly timing: RunTimingRecorder;\n readonly parent: TimingActivity;\n}\nexport interface PrepareSandboxBuildsOptions {\n readonly timing: RunTimingRecorder;\n readonly provider: SandboxBuildProvider;\n /** 同时 in-flight 的不同 BuildKey 上限;默认 2。不占 attempt 并发位。 */\n readonly maxConcurrency?: number;\n /** 逐 BuildKey 的 timeout(ms);省略 = 无逐 key 上限。 */\n readonly buildTimeoutMs?: number;\n /** 整段准备的全局墙钟上限(ms);省略 = 无全局上限。 */\n readonly prepareBudgetMs?: number;\n /** Invocation abort(Ctrl+C)。 */\n readonly signal?: AbortSignal;\n /**\n * 每个 BuildKey 真正开始 / 结束时回调一次(有界起止事件)。\n * 供 live feedback 投影为运行级 active 行 / 非 TTY 永久事件;不改变协调语义。\n */\n readonly onActivity?: (event: SandboxBuildActivityEvent) => void;\n /** 瞬时构建失败的退避重试上限(含首次尝试);默认 3。 */\n readonly buildAttempts?: number;\n /** 退避基数(ms),第 n 次重试睡 base × 2^n × 抖动;默认 1000。 */\n readonly buildRetryBaseMs?: number;\n}\n/** 构建协调器对外的有界 activity 事件(与 Run feedback 的 run-activity 字段对齐)。 */\nexport type SandboxBuildActivityEvent = {\n status: \"started\";\n ref: SandboxBuildRef;\n buildKey: BuildKey;\n id: string;\n key: typeof SANDBOX_BUILD_ACTIVITY;\n label: string;\n} | {\n status: \"done\" | \"failed\";\n outcome: SandboxBuildRecord[\"status\"];\n ref: SandboxBuildRef;\n buildKey: BuildKey;\n id: string;\n key: typeof SANDBOX_BUILD_ACTIVITY;\n label: string;\n durationMs: number;\n};\nexport interface SandboxBuildFailure {\n readonly ref: SandboxBuildRef;\n readonly buildKey: BuildKey;\n readonly timingNodeId: string;\n readonly status: \"failed\" | \"cancelled\";\n readonly error: NonNullable<SandboxBuildRecord[\"error\"]>;\n}\nexport interface SandboxBuildPreparation {\n /** 成功(hit / built)的 BuildKey → locator。 */\n readonly sources: ReadonlyMap<SandboxBuildRef, SandboxBuildArtifactSource>;\n /** 实际查询或构建过的每条 provenance(不含完全携带、从未过问的 key)。 */\n readonly records: readonly SandboxBuildRecord[];\n /** 失败或取消的 BuildKey → 共用同一 Run timing origin 的错误。 */\n readonly failures: ReadonlyMap<SandboxBuildRef, SandboxBuildFailure>;\n}\n/** 进行中的 Run 级共享准备:逐 BuildKey 放行,依赖者只等自己引用的那几个 key。 */\nexport interface RunningSandboxBuilds {\n /** 已结算 key 的实时视图(随构建推进增补,不等整批收工)。 */\n readonly sources: ReadonlyMap<SandboxBuildRef, SandboxBuildArtifactSource>;\n /** 已失败 / 已取消 key 的实时视图。 */\n readonly failures: ReadonlyMap<SandboxBuildRef, SandboxBuildFailure>;\n /** 等某个 BuildKey 结算;不在本次协调范围内的 key 立即返回。 */\n settled(ref: SandboxBuildRef): Promise<void>;\n /** 全部 key 结算后的汇总(provenance 在这里齐全)。 */\n readonly done: Promise<SandboxBuildPreparation>;\n}\n/**\n * 对仍需 fresh 的 BuildKey 做 Run 级共享准备,等全部 key 结算。\n * 调用方负责先做携带规划、只传入未携带 attempt 引用的 key;本函数不为「查看旧结果」造假 provenance。\n */\nexport async function prepareSandboxBuilds(works: readonly SandboxBuildWork[], opts: PrepareSandboxBuildsOptions): Promise<SandboxBuildPreparation> {\n return startSandboxBuilds(works, opts).done;\n}\n/**\n * 启动 Run 级共享准备并立刻返回句柄:调用方按 BuildKey 逐个等待,\n * 只依赖已就绪 key 的 attempt 不被同批最慢的那个构建挡住(见 case.md「Run 级构建协调」第 4 条)。\n */\nexport function startSandboxBuilds(works: readonly SandboxBuildWork[], opts: PrepareSandboxBuildsOptions): RunningSandboxBuilds {\n const unique = dedupeWorks(works);\n if (unique.length === 0) {\n const empty: SandboxBuildPreparation = { sources: new Map(), records: [], failures: new Map() };\n return {\n sources: empty.sources,\n failures: empty.failures,\n async settled() { },\n done: Promise.resolve(empty),\n };\n }\n const maxConcurrency = Math.max(1, opts.maxConcurrency ?? 2);\n const sources = new Map<SandboxBuildRef, SandboxBuildArtifactSource>();\n const records: SandboxBuildRecord[] = [];\n const failures = new Map<SandboxBuildRef, SandboxBuildFailure>();\n const prepareSignal = combineSignals([\n opts.signal,\n opts.prepareBudgetMs !== undefined ? AbortSignal.timeout(opts.prepareBudgetMs) : undefined,\n ]);\n // 逐 key 的结算 Deferred:key 一结算就 settle,依赖它的 attempt 当场放行,\n // 不等同批其它 key(single-flight 仍靠这张表,同 key 的第二个 work 复用同一条)。\n // 在方法边界同步创建,settled() 在任意时刻调用都拿到同一结果;\n // Deferred 结算后状态保持,迟到等待方同样立即放行。\n const perKey = new Map<SandboxBuildRef, Deferred.Deferred<void, never>>();\n for (const work of unique) {\n perKey.set(work.ref, Deferred.unsafeMake(FiberId.unsafeMake()));\n }\n const ctx = {\n timing: opts.timing,\n provider: opts.provider,\n buildTimeoutMs: opts.buildTimeoutMs,\n signal: prepareSignal,\n sources,\n records,\n failures,\n onActivity: opts.onActivity,\n buildAttempts: Math.max(1, opts.buildAttempts ?? DEFAULT_BUILD_ATTEMPTS),\n buildRetryBaseMs: Math.max(0, opts.buildRetryBaseMs ?? DEFAULT_BUILD_RETRY_BASE_MS),\n };\n // 整段准备是一个 Effect 程序:每 key 一条 gate 保护的 fiber,结算挂在 ensuring 上\n // (失败/中断同样放行等待方);收尾逐 fiber 观察 exit,先到先报缺陷——与 Promise.all\n // 的失败传播一致,且观察不打断兄弟 fiber,一条出事后其余 key 照常结算。\n const coordination = Effect.gen(function* () {\n const gate = yield* Effect.makeSemaphore(maxConcurrency);\n const fibers = yield* Effect.forEach(unique, (work) => Effect.fork(gate.withPermits(1)(prepareOne(work, ctx)).pipe(Effect.ensuring(Effect.asVoid(Deferred.succeed(perKey.get(work.ref)!, undefined))))));\n const exits = yield* Effect.forEach(fibers, Fiber.await, { concurrency: \"unbounded\" });\n const failed = exits.find(Exit.isFailure);\n if (failed !== undefined && Exit.isFailure(failed))\n return yield* Effect.failCause(failed.cause);\n return { sources, records, failures } satisfies SandboxBuildPreparation;\n });\n // 边界:唯一一次把 Effect 驱动进公开 Promise ABI。\n const done = Effect.runPromise(coordination);\n return {\n sources,\n failures,\n async settled(ref) {\n const deferred = perKey.get(ref);\n if (deferred === undefined)\n return;\n await Effect.runPromise(Deferred.await(deferred));\n },\n done,\n };\n}\n/**\n * 从 fresh attempt 依赖表扇出构建失败 → AttemptError 形状所需字段。\n * 同一 BuildKey 的所有依赖者共用同一个 timingNodeId。\n */\nexport function buildFailureOrigin(failure: SandboxBuildFailure): {\n code: string;\n message: string;\n timingNodeId: string;\n cause?: SandboxBuildFailure[\"error\"][\"cause\"];\n} {\n return {\n code: failure.error.code,\n message: failure.error.message,\n timingNodeId: failure.timingNodeId,\n ...(failure.error.cause !== undefined ? { cause: failure.error.cause } : {}),\n };\n}\nfunction dedupeWorks(works: readonly SandboxBuildWork[]): SandboxBuildWork[] {\n const seen = new Map<SandboxBuildRef, SandboxBuildWork>();\n for (const work of works) {\n if (!seen.has(work.ref))\n seen.set(work.ref, work);\n }\n return [...seen.values()];\n}\nfunction prepareOne(work: SandboxBuildWork, ctx: {\n timing: RunTimingRecorder;\n provider: SandboxBuildProvider;\n buildTimeoutMs: number | undefined;\n signal: AbortSignal;\n sources: Map<SandboxBuildRef, SandboxBuildArtifactSource>;\n records: SandboxBuildRecord[];\n failures: Map<SandboxBuildRef, SandboxBuildFailure>;\n onActivity?: (event: SandboxBuildActivityEvent) => void;\n buildAttempts: number;\n buildRetryBaseMs: number;\n}): Effect.Effect<void> {\n return Effect.gen(function* () {\n const label = work.label ?? `build ${work.buildKey.slice(0, 12)}`;\n const startOffsetMs = ctx.timing.offsetNow();\n const parent = ctx.timing.child({\n key: SANDBOX_BUILD_ACTIVITY,\n label,\n startOffsetMs,\n durationMs: 0,\n });\n ctx.onActivity?.({\n status: \"started\",\n ref: work.ref,\n buildKey: work.buildKey,\n id: parent.id,\n key: SANDBOX_BUILD_ACTIVITY,\n label,\n });\n const keySignal = combineSignals([\n ctx.signal,\n ctx.buildTimeoutMs !== undefined ? AbortSignal.timeout(ctx.buildTimeoutMs) : undefined,\n ]);\n const finish = (status: SandboxBuildRecord[\"status\"], source?: SandboxBuildArtifactSource, error?: SandboxBuildRecord[\"error\"]) => {\n parent.durationMs = Math.max(0, ctx.timing.offsetNow() - startOffsetMs);\n if (status === \"failed\" || status === \"cancelled\")\n parent.failed = true;\n const record: SandboxBuildRecord = {\n buildKey: work.buildKey,\n provider: work.provider,\n status,\n timingNodeId: parent.id,\n inputs: work.inputs,\n ...(source !== undefined ? { locator: source.locator } : {}),\n ...(error !== undefined ? { error } : {}),\n };\n ctx.records.push(record);\n if (source !== undefined && (status === \"hit\" || status === \"built\")) {\n ctx.sources.set(work.ref, source);\n }\n if (error !== undefined && (status === \"failed\" || status === \"cancelled\")) {\n ctx.failures.set(work.ref, {\n ref: work.ref,\n buildKey: work.buildKey,\n timingNodeId: parent.id,\n status,\n error,\n });\n }\n ctx.onActivity?.({\n status: status === \"failed\" || status === \"cancelled\" ? \"failed\" : \"done\",\n ref: work.ref,\n outcome: status,\n buildKey: work.buildKey,\n id: parent.id,\n key: SANDBOX_BUILD_ACTIVITY,\n label,\n durationMs: parent.durationMs,\n });\n };\n if (keySignal.aborted) {\n finish(\"cancelled\", undefined, abortError(keySignal, work.buildKey));\n return;\n }\n const finishFailure = (e: unknown): Effect.Effect<void> => Effect.gen(function* () {\n if (keySignal.aborted || isAbortError(e)) {\n const cancel = ctx.provider.cancel;\n if (cancel !== undefined) {\n yield* Effect.tryPromise({\n try: () => cancel(work),\n catch: () => undefined,\n }).pipe(Effect.ignore);\n }\n finish(\"cancelled\", undefined, abortError(keySignal, work.buildKey, e));\n return;\n }\n finish(\"failed\", undefined, failedError(work.buildKey, e));\n });\n const lookup = yield* Effect.either(Effect.tryPromise({\n try: () => ctx.provider.lookup(work, keySignal),\n catch: (error) => error,\n }));\n if (lookup._tag === \"Left\")\n return yield* finishFailure(lookup.left);\n if (lookup.right._tag === \"Hit\") {\n finish(\"hit\", lookup.right.source);\n return;\n }\n // 瞬时构建失败(基线镜像拉取限流、传输层中断)退避重试:构建产物是镜像与 template,\n // 没有计费实例的泄漏面,歧义类同样可重试(case.md「Run 级构建协调」第 5 条)。\n const operationId = randomUUID();\n const build = (attempt: number): Effect.Effect<SandboxBuildArtifactSource, unknown> => Effect.tryPromise({\n try: () => ctx.provider.build(work, {\n operationId,\n signal: keySignal,\n timing: ctx.timing,\n parent,\n }),\n catch: (error) => error,\n }).pipe(Effect.catchAll((error) => {\n const last = attempt >= ctx.buildAttempts - 1;\n if (last || keySignal.aborted || isAbortError(error) || !isTransientBuildError(error)) {\n return Effect.fail(error);\n }\n return Random.next.pipe(Effect.map((jitter) => backoffDelay(ctx.buildRetryBaseMs, attempt, jitter)), Effect.flatMap((delayMs) => sleep(delayMs, keySignal)), Effect.flatMap(() => keySignal.aborted ? Effect.fail(error) : build(attempt + 1)));\n }));\n const built = yield* Effect.either(build(0));\n if (built._tag === \"Left\")\n return yield* finishFailure(built.left);\n finish(\"built\", built.right);\n });\n}\n/** 首次尝试 + 2 次重试:与 provisioning 同一种「封顶次数」纪律,构建单次耗时更长所以更浅。 */\nconst DEFAULT_BUILD_ATTEMPTS = 3;\nconst DEFAULT_BUILD_RETRY_BASE_MS = 1000;\n/** 指数退避 + 全抖动(0.5x~1.5x),避免同一批被限流的构建同时醒来再次撞限流。 */\nfunction backoffDelay(baseMs: number, attempt: number, jitter: number): number {\n return baseMs * 2 ** attempt * (0.5 + jitter);\n}\n/** 退避睡眠:Clock 驱动的 Effect.sleep(TestClock 可验证时序),abort 时提前放行。 */\nfunction sleep(ms: number, signal: AbortSignal): Effect.Effect<void, never> {\n if (ms <= 0)\n return Effect.void;\n const timer = Effect.sleep(Duration.millis(ms));\n const abort = Effect.async<void>((resume) => {\n if (signal.aborted) {\n resume(Effect.void);\n return;\n }\n const onAbort = () => resume(Effect.void);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n return Effect.sync(() => signal.removeEventListener(\"abort\", onAbort));\n });\n return Effect.raceFirst(timer, abort);\n}\n/**\n * 构建失败的性质分类:瞬时才重试。\n * 先过与 provisioning 共用的保守瞬时分类器,再补 builder CLI 自己的文案形态——\n * registry 限流、拉取中途 EOF、TLS / IO 超时都出现在 `docker compose build` 的 stderr 里,\n * 它们不带 status code,只有文案。\n */\nfunction isTransientBuildError(e: unknown): boolean {\n if (isRetryableProvisionError(classifyProvisionErrorFallback(e)))\n return true;\n const message = e instanceof Error ? e.message : String(e);\n return /toomanyrequests|unexpected EOF|i\\/o timeout|TLS handshake timeout|failed to do request|connection reset by peer|temporary failure in name resolution|failed to copy: httpReadSeeker|EOF$/im.test(message);\n}\nfunction abortError(signal: AbortSignal, buildKey: BuildKey, cause?: unknown): NonNullable<SandboxBuildRecord[\"error\"]> {\n const timedOut = isTimeoutReason(signal.reason);\n const code = timedOut ? \"sandbox-build-timeout\" : \"sandbox-build-cancelled\";\n const message = timedOut\n ? `sandbox build timed out for BuildKey ${buildKey.slice(0, 12)}…`\n : `sandbox build cancelled for BuildKey ${buildKey.slice(0, 12)}…`;\n return {\n code,\n message,\n ...(cause !== undefined ? { cause: causeSummary(cause) } : {}),\n };\n}\nfunction isTimeoutReason(reason: unknown): boolean {\n if (reason === undefined || reason === null)\n return false;\n if (typeof DOMException !== \"undefined\" && reason instanceof DOMException && reason.name === \"TimeoutError\") {\n return true;\n }\n return reason instanceof Error && reason.name === \"TimeoutError\";\n}\nfunction failedError(buildKey: BuildKey, e: unknown): NonNullable<SandboxBuildRecord[\"error\"]> {\n return {\n code: \"sandbox-build-failed\",\n message: e instanceof Error ? e.message : `sandbox build failed for BuildKey ${buildKey.slice(0, 12)}…`,\n cause: causeSummary(e),\n };\n}\nfunction causeSummary(e: unknown): {\n name?: string;\n code?: string;\n message: string;\n} {\n if (e instanceof Error) {\n const withCode = e as Error & {\n code?: unknown;\n };\n const code = typeof withCode.code === \"string\" ? withCode.code : undefined;\n return {\n name: e.name,\n ...(code !== undefined ? { code } : {}),\n message: e.message,\n };\n }\n return { message: String(e) };\n}\nfunction isAbortError(e: unknown): boolean {\n if (e instanceof Error && e.name === \"AbortError\")\n return true;\n if (typeof DOMException !== \"undefined\" && e instanceof DOMException && e.name === \"AbortError\")\n return true;\n return false;\n}\nfunction combineSignals(signals: Array<AbortSignal | undefined>): AbortSignal {\n const active = signals.filter((s): s is AbortSignal => s !== undefined);\n if (active.length === 0)\n return new AbortController().signal;\n if (active.length === 1)\n return active[0]!;\n return AbortSignal.any(active);\n}\n"]}
@@ -4,8 +4,24 @@ import type { SandboxBuildRecord, TimingActivity } from "../runner/types.cjs";
4
4
  import type { BuildKey } from "./identity.cjs";
5
5
  /** Run 级开放 activity key;与 Record 契约同名。 */
6
6
  export declare const SANDBOX_BUILD_ACTIVITY: "sandbox.build";
7
+ declare const MaterializationScopeIdBrand: unique symbol;
8
+ export type MaterializationScopeId = string & {
9
+ readonly [MaterializationScopeIdBrand]: true;
10
+ };
11
+ declare const SandboxBuildRefBrand: unique symbol;
12
+ export type SandboxBuildRef = string & {
13
+ readonly [SandboxBuildRefBrand]: true;
14
+ };
15
+ export declare function materializationScopeId(input: {
16
+ readonly providerFamily: string;
17
+ readonly authorityFingerprint: string;
18
+ readonly materializationProtocolVersion: number;
19
+ }): MaterializationScopeId;
20
+ export declare function sandboxBuildRef(scopeId: MaterializationScopeId, buildKey: BuildKey): SandboxBuildRef;
7
21
  /** 一条待协调的构建工作(同 BuildKey 只保留第一次出现的 inputs / provider)。 */
8
22
  export interface SandboxBuildWork {
23
+ readonly ref: SandboxBuildRef;
24
+ readonly scopeId: MaterializationScopeId;
9
25
  readonly buildKey: BuildKey;
10
26
  readonly provider: string;
11
27
  /** 解析后的构建输入投影;不含凭据值。 */
@@ -13,17 +29,36 @@ export interface SandboxBuildWork {
13
29
  /** 有界人读标签;省略时用 BuildKey 短前缀。 */
14
30
  readonly label?: string;
15
31
  }
32
+ export interface SandboxBuildUseHandle {
33
+ readonly locator: JsonValue;
34
+ release(): Promise<void> | void;
35
+ }
36
+ export interface SandboxBuildArtifactSource {
37
+ readonly locator: JsonValue;
38
+ readonly source: "cache" | "build";
39
+ acquireUse(signal: AbortSignal): Promise<SandboxBuildUseHandle>;
40
+ release(): Promise<void> | void;
41
+ }
42
+ export type SandboxBuildLookup = {
43
+ readonly _tag: "Hit";
44
+ readonly source: SandboxBuildArtifactSource;
45
+ } | {
46
+ readonly _tag: "Miss";
47
+ } | {
48
+ readonly _tag: "Unsupported";
49
+ };
16
50
  /** provider 侧 cache 查询与真实构建。 */
17
51
  export interface SandboxBuildProvider {
18
52
  /** 查 provider 原生 cache / 本地 build registry;命中返回 locator。 */
19
- lookup(work: SandboxBuildWork, signal: AbortSignal): Promise<JsonValue | undefined>;
53
+ lookup(work: SandboxBuildWork, signal: AbortSignal): Promise<SandboxBuildLookup>;
20
54
  /** cache miss 时调用原生构建 API。 */
21
- build(work: SandboxBuildWork, ctx: SandboxBuildExecutionContext): Promise<JsonValue>;
55
+ build(work: SandboxBuildWork, ctx: SandboxBuildExecutionContext): Promise<SandboxBuildArtifactSource>;
22
56
  /** 可选:Invocation abort / timeout 时取消远端 build。 */
23
57
  cancel?(work: SandboxBuildWork): Promise<void>;
24
58
  }
25
59
  /** 构建执行上下文:子 activity 挂在当前 sandbox.build 节点下。 */
26
60
  export interface SandboxBuildExecutionContext {
61
+ readonly operationId: string;
27
62
  readonly signal: AbortSignal;
28
63
  readonly timing: RunTimingRecorder;
29
64
  readonly parent: TimingActivity;
@@ -52,12 +87,15 @@ export interface PrepareSandboxBuildsOptions {
52
87
  /** 构建协调器对外的有界 activity 事件(与 Run feedback 的 run-activity 字段对齐)。 */
53
88
  export type SandboxBuildActivityEvent = {
54
89
  status: "started";
90
+ ref: SandboxBuildRef;
55
91
  buildKey: BuildKey;
56
92
  id: string;
57
93
  key: typeof SANDBOX_BUILD_ACTIVITY;
58
94
  label: string;
59
95
  } | {
60
96
  status: "done" | "failed";
97
+ outcome: SandboxBuildRecord["status"];
98
+ ref: SandboxBuildRef;
61
99
  buildKey: BuildKey;
62
100
  id: string;
63
101
  key: typeof SANDBOX_BUILD_ACTIVITY;
@@ -65,6 +103,7 @@ export type SandboxBuildActivityEvent = {
65
103
  durationMs: number;
66
104
  };
67
105
  export interface SandboxBuildFailure {
106
+ readonly ref: SandboxBuildRef;
68
107
  readonly buildKey: BuildKey;
69
108
  readonly timingNodeId: string;
70
109
  readonly status: "failed" | "cancelled";
@@ -72,20 +111,20 @@ export interface SandboxBuildFailure {
72
111
  }
73
112
  export interface SandboxBuildPreparation {
74
113
  /** 成功(hit / built)的 BuildKey → locator。 */
75
- readonly locators: ReadonlyMap<BuildKey, JsonValue>;
114
+ readonly sources: ReadonlyMap<SandboxBuildRef, SandboxBuildArtifactSource>;
76
115
  /** 实际查询或构建过的每条 provenance(不含完全携带、从未过问的 key)。 */
77
116
  readonly records: readonly SandboxBuildRecord[];
78
117
  /** 失败或取消的 BuildKey → 共用同一 Run timing origin 的错误。 */
79
- readonly failures: ReadonlyMap<BuildKey, SandboxBuildFailure>;
118
+ readonly failures: ReadonlyMap<SandboxBuildRef, SandboxBuildFailure>;
80
119
  }
81
120
  /** 进行中的 Run 级共享准备:逐 BuildKey 放行,依赖者只等自己引用的那几个 key。 */
82
121
  export interface RunningSandboxBuilds {
83
122
  /** 已结算 key 的实时视图(随构建推进增补,不等整批收工)。 */
84
- readonly locators: ReadonlyMap<BuildKey, JsonValue>;
123
+ readonly sources: ReadonlyMap<SandboxBuildRef, SandboxBuildArtifactSource>;
85
124
  /** 已失败 / 已取消 key 的实时视图。 */
86
- readonly failures: ReadonlyMap<BuildKey, SandboxBuildFailure>;
125
+ readonly failures: ReadonlyMap<SandboxBuildRef, SandboxBuildFailure>;
87
126
  /** 等某个 BuildKey 结算;不在本次协调范围内的 key 立即返回。 */
88
- settled(buildKey: BuildKey): Promise<void>;
127
+ settled(ref: SandboxBuildRef): Promise<void>;
89
128
  /** 全部 key 结算后的汇总(provenance 在这里齐全)。 */
90
129
  readonly done: Promise<SandboxBuildPreparation>;
91
130
  }
@@ -109,3 +148,4 @@ export declare function buildFailureOrigin(failure: SandboxBuildFailure): {
109
148
  timingNodeId: string;
110
149
  cause?: SandboxBuildFailure["error"]["cause"];
111
150
  };
151
+ export {};
@@ -4,8 +4,24 @@ import type { SandboxBuildRecord, TimingActivity } from "../runner/types.mjs";
4
4
  import type { BuildKey } from "./identity.mjs";
5
5
  /** Run 级开放 activity key;与 Record 契约同名。 */
6
6
  export declare const SANDBOX_BUILD_ACTIVITY: "sandbox.build";
7
+ declare const MaterializationScopeIdBrand: unique symbol;
8
+ export type MaterializationScopeId = string & {
9
+ readonly [MaterializationScopeIdBrand]: true;
10
+ };
11
+ declare const SandboxBuildRefBrand: unique symbol;
12
+ export type SandboxBuildRef = string & {
13
+ readonly [SandboxBuildRefBrand]: true;
14
+ };
15
+ export declare function materializationScopeId(input: {
16
+ readonly providerFamily: string;
17
+ readonly authorityFingerprint: string;
18
+ readonly materializationProtocolVersion: number;
19
+ }): MaterializationScopeId;
20
+ export declare function sandboxBuildRef(scopeId: MaterializationScopeId, buildKey: BuildKey): SandboxBuildRef;
7
21
  /** 一条待协调的构建工作(同 BuildKey 只保留第一次出现的 inputs / provider)。 */
8
22
  export interface SandboxBuildWork {
23
+ readonly ref: SandboxBuildRef;
24
+ readonly scopeId: MaterializationScopeId;
9
25
  readonly buildKey: BuildKey;
10
26
  readonly provider: string;
11
27
  /** 解析后的构建输入投影;不含凭据值。 */
@@ -13,17 +29,36 @@ export interface SandboxBuildWork {
13
29
  /** 有界人读标签;省略时用 BuildKey 短前缀。 */
14
30
  readonly label?: string;
15
31
  }
32
+ export interface SandboxBuildUseHandle {
33
+ readonly locator: JsonValue;
34
+ release(): Promise<void> | void;
35
+ }
36
+ export interface SandboxBuildArtifactSource {
37
+ readonly locator: JsonValue;
38
+ readonly source: "cache" | "build";
39
+ acquireUse(signal: AbortSignal): Promise<SandboxBuildUseHandle>;
40
+ release(): Promise<void> | void;
41
+ }
42
+ export type SandboxBuildLookup = {
43
+ readonly _tag: "Hit";
44
+ readonly source: SandboxBuildArtifactSource;
45
+ } | {
46
+ readonly _tag: "Miss";
47
+ } | {
48
+ readonly _tag: "Unsupported";
49
+ };
16
50
  /** provider 侧 cache 查询与真实构建。 */
17
51
  export interface SandboxBuildProvider {
18
52
  /** 查 provider 原生 cache / 本地 build registry;命中返回 locator。 */
19
- lookup(work: SandboxBuildWork, signal: AbortSignal): Promise<JsonValue | undefined>;
53
+ lookup(work: SandboxBuildWork, signal: AbortSignal): Promise<SandboxBuildLookup>;
20
54
  /** cache miss 时调用原生构建 API。 */
21
- build(work: SandboxBuildWork, ctx: SandboxBuildExecutionContext): Promise<JsonValue>;
55
+ build(work: SandboxBuildWork, ctx: SandboxBuildExecutionContext): Promise<SandboxBuildArtifactSource>;
22
56
  /** 可选:Invocation abort / timeout 时取消远端 build。 */
23
57
  cancel?(work: SandboxBuildWork): Promise<void>;
24
58
  }
25
59
  /** 构建执行上下文:子 activity 挂在当前 sandbox.build 节点下。 */
26
60
  export interface SandboxBuildExecutionContext {
61
+ readonly operationId: string;
27
62
  readonly signal: AbortSignal;
28
63
  readonly timing: RunTimingRecorder;
29
64
  readonly parent: TimingActivity;
@@ -52,12 +87,15 @@ export interface PrepareSandboxBuildsOptions {
52
87
  /** 构建协调器对外的有界 activity 事件(与 Run feedback 的 run-activity 字段对齐)。 */
53
88
  export type SandboxBuildActivityEvent = {
54
89
  status: "started";
90
+ ref: SandboxBuildRef;
55
91
  buildKey: BuildKey;
56
92
  id: string;
57
93
  key: typeof SANDBOX_BUILD_ACTIVITY;
58
94
  label: string;
59
95
  } | {
60
96
  status: "done" | "failed";
97
+ outcome: SandboxBuildRecord["status"];
98
+ ref: SandboxBuildRef;
61
99
  buildKey: BuildKey;
62
100
  id: string;
63
101
  key: typeof SANDBOX_BUILD_ACTIVITY;
@@ -65,6 +103,7 @@ export type SandboxBuildActivityEvent = {
65
103
  durationMs: number;
66
104
  };
67
105
  export interface SandboxBuildFailure {
106
+ readonly ref: SandboxBuildRef;
68
107
  readonly buildKey: BuildKey;
69
108
  readonly timingNodeId: string;
70
109
  readonly status: "failed" | "cancelled";
@@ -72,20 +111,20 @@ export interface SandboxBuildFailure {
72
111
  }
73
112
  export interface SandboxBuildPreparation {
74
113
  /** 成功(hit / built)的 BuildKey → locator。 */
75
- readonly locators: ReadonlyMap<BuildKey, JsonValue>;
114
+ readonly sources: ReadonlyMap<SandboxBuildRef, SandboxBuildArtifactSource>;
76
115
  /** 实际查询或构建过的每条 provenance(不含完全携带、从未过问的 key)。 */
77
116
  readonly records: readonly SandboxBuildRecord[];
78
117
  /** 失败或取消的 BuildKey → 共用同一 Run timing origin 的错误。 */
79
- readonly failures: ReadonlyMap<BuildKey, SandboxBuildFailure>;
118
+ readonly failures: ReadonlyMap<SandboxBuildRef, SandboxBuildFailure>;
80
119
  }
81
120
  /** 进行中的 Run 级共享准备:逐 BuildKey 放行,依赖者只等自己引用的那几个 key。 */
82
121
  export interface RunningSandboxBuilds {
83
122
  /** 已结算 key 的实时视图(随构建推进增补,不等整批收工)。 */
84
- readonly locators: ReadonlyMap<BuildKey, JsonValue>;
123
+ readonly sources: ReadonlyMap<SandboxBuildRef, SandboxBuildArtifactSource>;
85
124
  /** 已失败 / 已取消 key 的实时视图。 */
86
- readonly failures: ReadonlyMap<BuildKey, SandboxBuildFailure>;
125
+ readonly failures: ReadonlyMap<SandboxBuildRef, SandboxBuildFailure>;
87
126
  /** 等某个 BuildKey 结算;不在本次协调范围内的 key 立即返回。 */
88
- settled(buildKey: BuildKey): Promise<void>;
127
+ settled(ref: SandboxBuildRef): Promise<void>;
89
128
  /** 全部 key 结算后的汇总(provenance 在这里齐全)。 */
90
129
  readonly done: Promise<SandboxBuildPreparation>;
91
130
  }
@@ -109,3 +148,4 @@ export declare function buildFailureOrigin(failure: SandboxBuildFailure): {
109
148
  timingNodeId: string;
110
149
  cause?: SandboxBuildFailure["error"]["cause"];
111
150
  };
151
+ export {};