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
@@ -105,12 +105,12 @@ const __niceevalExport50 = __niceevalCanonical["isDockerExecutionProfileV1"];
105
105
  export { __niceevalExport50 as isDockerExecutionProfileV1 };
106
106
  const __niceevalExport51 = __niceevalCanonical["leakGateHintsFromComposeFile"];
107
107
  export { __niceevalExport51 as leakGateHintsFromComposeFile };
108
- const __niceevalExport52 = __niceevalCanonical["localSandbox"];
109
- export { __niceevalExport52 as localSandbox };
110
- const __niceevalExport53 = __niceevalCanonical["looksLikeDigestRef"];
111
- export { __niceevalExport53 as looksLikeDigestRef };
112
- const __niceevalExport54 = __niceevalCanonical["makeDockerExecutionProfileV1"];
113
- export { __niceevalExport54 as makeDockerExecutionProfileV1 };
108
+ const __niceevalExport52 = __niceevalCanonical["looksLikeDigestRef"];
109
+ export { __niceevalExport52 as looksLikeDigestRef };
110
+ const __niceevalExport53 = __niceevalCanonical["makeDockerExecutionProfileV1"];
111
+ export { __niceevalExport53 as makeDockerExecutionProfileV1 };
112
+ const __niceevalExport54 = __niceevalCanonical["materializationScopeId"];
113
+ export { __niceevalExport54 as materializationScopeId };
114
114
  const __niceevalExport55 = __niceevalCanonical["materializeDockerComposeProviderCase"];
115
115
  export { __niceevalExport55 as materializeDockerComposeProviderCase };
116
116
  const __niceevalExport56 = __niceevalCanonical["normalizeSandboxCapture"];
@@ -137,12 +137,14 @@ const __niceevalExport66 = __niceevalCanonical["resolveFloatingImageTag"];
137
137
  export { __niceevalExport66 as resolveFloatingImageTag };
138
138
  const __niceevalExport67 = __niceevalCanonical["restoreCheckpoint"];
139
139
  export { __niceevalExport67 as restoreCheckpoint };
140
- const __niceevalExport68 = __niceevalCanonical["sandboxLayer"];
141
- export { __niceevalExport68 as sandboxLayer };
142
- const __niceevalExport69 = __niceevalCanonical["shell"];
143
- export { __niceevalExport69 as shell };
144
- const __niceevalExport70 = __niceevalCanonical["startSandboxBuilds"];
145
- export { __niceevalExport70 as startSandboxBuilds };
146
- const __niceevalExport71 = __niceevalCanonical["vercelSandbox"];
147
- export { __niceevalExport71 as vercelSandbox };
140
+ const __niceevalExport68 = __niceevalCanonical["sandboxBuildRef"];
141
+ export { __niceevalExport68 as sandboxBuildRef };
142
+ const __niceevalExport69 = __niceevalCanonical["sandboxLayer"];
143
+ export { __niceevalExport69 as sandboxLayer };
144
+ const __niceevalExport70 = __niceevalCanonical["shell"];
145
+ export { __niceevalExport70 as shell };
146
+ const __niceevalExport71 = __niceevalCanonical["startSandboxBuilds"];
147
+ export { __niceevalExport71 as startSandboxBuilds };
148
+ const __niceevalExport72 = __niceevalCanonical["vercelSandbox"];
149
+ export { __niceevalExport72 as vercelSandbox };
148
150
  //# sourceMappingURL=index.mjs.map
@@ -467,9 +467,7 @@ function assertProviderKeepable(provider, isCustomCreate) {
467
467
  }
468
468
  if (!exports.KEEPABLE_PROVIDERS.has(provider)) {
469
469
  throw new Error(`--keep-sandbox is not supported with the "${provider}" provider: ` +
470
- (provider === "local"
471
- ? "it never destroys the sandbox in the first place, so there is nothing to register for later retention — the workspace already sits exactly where the agent left it. Drop --keep-sandbox, or use a built-in cloud/container provider (docker / e2b / vercel) if you need a registry-managed retained sandbox."
472
- : `expected one of: ${[...exports.KEEPABLE_PROVIDERS].join(", ")}. Drop --keep-sandbox.`));
470
+ `expected one of: ${[...exports.KEEPABLE_PROVIDERS].join(", ")}. Drop --keep-sandbox.`);
473
471
  }
474
472
  }
475
473
  //# sourceMappingURL=keep.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"keep.js","sourceRoot":"","sources":["keep.ts"],"names":[],"mappings":";;;AAWA,wCAMC;AAOD,gDAWC;AAiBD,4CAOC;AAGD,0CAuDC;AAMD,0CA8DC;AAED,oCA8CC;AAqGD,0CAuCC;AAQD,oDAyBC;AAcD,wCAsCC;AAuCD,sDAIC;AAKD,wDAaC;AAvgBD,wDAAwD;AACxD,4EAA4E;AAC5E,mEAAmE;AACnE,0BAA0B;AAC1B,mCAAuC;AAEvC,uDAA2D;AAC3D,6CAAmD;AACnD,6DAA6D;AAChD,QAAA,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvE,sEAAsE;AAC/D,KAAK,UAAU,cAAc,CAAC,OAAgB;IACjD,MAAM,OAAO,GAAG,IAAA,gCAAmB,EAAC,OAAO,CAAC,CAAC,OAAO,CAAC;IACrD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,yDAAyD,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;IACnG,CAAC;IACD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AAC1B,CAAC;AACD;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,QAAgB,EAAE,SAAiB;IAClE,QAAQ,QAAQ,EAAE,CAAC;QACf,KAAK,QAAQ;YACT,OAAO,gBAAgB,SAAS,uBAAuB,SAAS,OAAO,CAAC;QAC5E,KAAK,KAAK;YACN,OAAO,uBAAuB,SAAS,EAAE,CAAC;QAC9C,KAAK,QAAQ;YACT,OAAO,mBAAmB,SAAS,EAAE,CAAC;QAC1C;YACI,OAAO,SAAS,CAAC;IACzB,CAAC;AACL,CAAC;AACD;;;;;GAKG;AACH,MAAM,qCAAqC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACvE;;;;;;;;GAQG;AACH,SAAgB,gBAAgB,CAAC,QAAgB,EAAE,MAAc;IAC7D,QAAQ,QAAQ,EAAE,CAAC;QACf,KAAK,QAAQ;YACT,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,qCAAqC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9F;YACI,OAAO,SAAS,CAAC;IACzB,CAAC;AACL,CAAC;AAED,oEAAoE;AAC7D,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAiB;IACrE,QAAQ,QAAQ,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC;gBACD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;gBACvE,MAAM,IAAI,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;gBAClE,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACrD,CAAC;YACD,MAAM,CAAC;gBACH,OAAO,SAAS,CAAC;YACrB,CAAC;QACL,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACT,IAAI,CAAC;gBACD,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,uBAAuB,CAAC,KAAK,CAAC,CAAC;gBACxE,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC1E,IAAI,GAGS,CAAC;gBACd,OAAO,SAAS,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC/B,GAAG,GAAG,CAAC,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpH,CAAC;gBACD,IAAI,CAAC,GAAG;oBACJ,OAAO,SAAS,CAAC;gBACrB,OAAO,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACzD,CAAC;YACD,MAAM,CAAC;gBACH,OAAO,SAAS,CAAC;YACrB,CAAC;QACL,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,IAAI,CAAC;gBACD,0DAA0D;gBAC1D,0BAA0B;gBAC1B,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;gBAC/E,MAAM,GAAG,GAAI,QAIX,CAAC,GAAG,CAAC;gBACP,IAAI,OAAO,GAAG,KAAK,UAAU;oBACzB,OAAO,SAAS,CAAC;gBACrB,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC5D,IAAI,CAAC,KAAK;oBACN,OAAO,SAAS,CAAC;gBACrB,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5D,CAAC;YACD,MAAM,CAAC;gBACH,OAAO,SAAS,CAAC;YACrB,CAAC;QACL,CAAC;QACD;YACI,OAAO,SAAS,CAAC;IACzB,CAAC;AACL,CAAC;AACD;;;;GAIG;AACI,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAiB;IACrE,QAAQ,QAAQ,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG,IAAI,MAAM,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,CAAC;gBACD,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxC,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,OAAO,CAAC,EAAE,CAAC;gBACP,IAAK,CAEH,CAAC,UAAU,KAAK,GAAG;oBACjB,OAAO,cAAc,CAAC;gBAC1B,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACT,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,IAAI,GAAI,aAEZ,CAAC,IAAI,CAAC;YACR,IAAI,OAAO,IAAI,KAAK,UAAU;gBAC1B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC5E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YAC1E,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC;QAC/C,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,wEAAwE;YACxE,qDAAqD;YACrD,0DAA0D;YAC1D,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;YAC/E,MAAM,GAAG,GAAI,QAIX,CAAC,GAAG,CAAC;YACP,IAAI,OAAO,GAAG,KAAK,UAAU;gBACzB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAC9E,IAAI,KAAK,CAAC;YACV,IAAI,CAAC;gBACD,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,KAAK,EAAE,CAAC;gBACX,IAAK,KAGH,CAAC,UAAU,KAAK,GAAG,IAAK,KAExB,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBAChB,OAAO,cAAc,CAAC;gBAC1B,CAAC;gBACD,MAAM,KAAK,CAAC;YAChB,CAAC;YACD,IAAI,CAAC,KAAK;gBACN,OAAO,cAAc,CAAC;YAC1B,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD;YACI,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,gCAAgC,CAAC,CAAC;IAC/E,CAAC;AACL,CAAC;AACD,yEAAyE;AAClE,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,SAAiB;IAClE,QAAQ,QAAQ,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;YACvE,MAAM,SAAS,GAAG,IAAI,MAAM,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACvD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO;gBACpB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,wBAAwB,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,8BAA8B,CAAC,IAAI,MAAM,CAAC;gBAC1E,MAAM,8BAA8B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO;QACX,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACT,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,MAAM,GAAI,aAGd,CAAC;YACH,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBACtC,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;gBACpE,OAAO;YACX,CAAC;YACD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;gBACvC,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;gBACrE,OAAO;YACX,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACrE,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,sEAAsE;YACtE,6CAA6C;YAC7C,uDAAuD;YACvD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;YAC/E,MAAM,GAAG,GAAI,QAEX,CAAC,GAAG,CAAC;YACP,IAAI,OAAO,GAAG,KAAK,UAAU;gBACzB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACrE,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,OAAO;QACX,CAAC;QACD;YACI,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,uBAAuB,CAAC,CAAC;IACtE,CAAC;AACL,CAAC;AAkBD,KAAK,UAAU,8BAA8B,CAAC,SAA8B,EAAE,IAAY;IACtF,OAAO,eAAM,CAAC,UAAU,CAAC,oCAAoC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;AACpF,CAAC;AACD;;;;GAIG;AACH,SAAS,oCAAoC,CAAC,SAA8B,EAAE,IAAY;IACtF,MAAM,cAAc,GAAG,CAAC,QAAmC,EAAS,EAAE,CAAC,IAAI,KAAK,CAAC,+DAA+D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QAClK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,sBAAsB,QAAQ,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,QAAmC,EAA8B,EAAE,CAAC,cAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACzJ,MAAM,SAAS,GAAG,QAAQ,GAAG,GAAG,CAAC;QACjC,IAAI,SAAS,IAAI,CAAC;YACd,OAAO,eAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjD,OAAO,cAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,CAAC,QAAgB,EAAE,QAAmC,EAA8B,EAAE,CAAC,cAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACvJ,IAAI,GAAG,GAAG,QAAQ;YACd,OAAO,eAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjD,OAAO,eAAe,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACpF,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;gBAC5B,OAAO,eAAM,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ;gBACzB,OAAO,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC1C,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC;gBACtB,OAAO,eAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACrC,OAAO,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC,CAAC;IACR,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,cAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;AAClG,CAAC;AACD;;;;GAIG;AACH,SAAS,eAAe,CAAC,SAA8B,EAAE,IAAY,EAAE,SAAiB;IACpF,MAAM,UAAU,GAGF,eAAM,CAAC,UAAU,CAAC;QAC5B,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;aACf,IAAI,CAAC;YACN,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;YACvB,IAAI,EAAE,IAAI;YACV,YAAY,EAAE,IAAI;YAClB,YAAY,EAAE,IAAI;SACrB,CAAC;aACG,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACvF,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;KAC1B,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,CAAC,SAA8B,EAAE,MAA6B,EAAgD,EAAE;QAC7H,MAAM,aAAa,GAAG,GAAS,EAAE,CAAE,MAEjC,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACjB,aAAa,EAAE,CAAC;YAChB,OAAO,eAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAW,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,SAAS,GAAiD,eAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE;YACpF,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,eAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,eAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAsC,cAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,GAAG,CAAC,GAAG,EAAE;YAC5F,aAAa,EAAE,CAAC;YAChB,OAAO,WAAoB,CAAC;QAChC,CAAC,CAAC,CAAC,CAAC;QACJ,OAAO,eAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAgD,EAAE;YAClH,IAAI,OAAO,KAAK,WAAW;gBACvB,OAAO,eAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAW,CAAC,CAAC;YAC1D,IAAI,OAAO,KAAK,QAAQ;gBACpB,OAAO,eAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC;YACvD,OAAO,eAAM,CAAC,UAAU,CAAC;gBACrB,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE;gBAC9B,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;aAC1B,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAoB,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,eAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC,CAAC,CAAC;QACjK,CAAC,CAAC,CAAC,CAAC;IACR,CAAC,CAAC;IACF,OAAO,UAAU,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAAE,eAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC,CAAC,CAAC;AACvK,CAAC;AACD,0CAA0C;AACnC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,SAAiB;IACrE,QAAQ,QAAQ,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;YACvE,MAAM,IAAI,MAAM,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1D,OAAO;QACX,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACT,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,KAAK,GAAI,aAEb,CAAC,KAAK,CAAC;YACT,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;gBAC9B,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC5D,OAAO;YACX,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,wDAAwD;YACxD,uEAAuE;YACvE,yCAAyC;YACzC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;YAC/E,MAAM,GAAG,GAAI,QAIX,CAAC,GAAG,CAAC;YACP,IAAI,OAAO,GAAG,KAAK,UAAU;gBACzB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACrE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK;gBACN,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,qCAAqC,CAAC,CAAC;YACvF,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QACD;YACI,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,0BAA0B,CAAC,CAAC;IACzE,CAAC;AACL,CAAC;AACD;;;;;;GAMG;AACI,KAAK,UAAU,oBAAoB,CAAC,QAAgB,EAAE,SAAiB,EAAE,OAAe;IAC3F,QAAQ,QAAQ,EAAE,CAAC;QACf,KAAK,QAAQ;YACT,OAAO,YAAY,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC3F,KAAK,KAAK;YACN,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QAClE,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,kEAAkE;YAClE,2CAA2C;YAC3C,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;YAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;YAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;YAChD,IAAI,KAAK;gBACL,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAChC,IAAI,MAAM;gBACN,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACjC,IAAI,SAAS;gBACT,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrB,OAAO,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;QACD;YACI,MAAM,IAAI,KAAK,CAAC,aAAa,QAAQ,oCAAoC,CAAC,CAAC;IACnF,CAAC;AACL,CAAC;AACD,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,IAAc;IACnD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,uBAAuB,CAAC,oBAAoB,CAAC,CAAC;IACtE,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACtD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACP,CAAC;AACD;;;;GAIG;AACI,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,SAAiB,EAAE,OAAe,EAAE,MAAc;IACrG,QAAQ,QAAQ,EAAE,CAAC;QACf,KAAK,QAAQ;YACT,OAAO,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1D,KAAK,KAAK,CAAC,CAAC,CAAC;YACT,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACxF,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;gBACvC,GAAG,EAAE,OAAO;gBACZ,IAAI,EAAE,EAAE,OAAO,EAAE,wCAAsB,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;aAClF,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,CAAC;QACtB,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;YAC/E,MAAM,GAAG,GAAI,QAMX,CAAC,GAAG,CAAC;YACP,IAAI,OAAO,GAAG,KAAK,UAAU;gBACzB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACrE,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK;gBACN,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,iDAAiD,CAAC,CAAC;YACnG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC;gBACpC,GAAG,EAAE,IAAI;gBACT,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;gBACpB,GAAG,EAAE,OAAO;gBACZ,GAAG,EAAE,EAAE,OAAO,EAAE,wCAAsB,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;aACjF,CAAC,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;QACnC,CAAC;QACD;YACI,MAAM,IAAI,KAAK,CAAC,0DAA0D,QAAQ,GAAG,CAAC,CAAC;IAC/F,CAAC;AACL,CAAC;AACD,0DAA0D;AAC1D,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,OAAe,EAAE,MAAc;IAChF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,MAAM,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;QAC9B,GAAG,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,IAAI;QAClB,GAAG,EAAE,CAAC,WAAW,wCAAsB,EAAE,EAAE,iBAAiB,OAAO,EAAE,EAAE,WAAW,CAAC;KACtF,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpC,OAAO,MAAM,IAAI,OAAO,CAAS,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;QACxD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YAClB,gDAAgD;YAChD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,OAAO,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBAC1C,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACrE,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,cAAc,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACP,CAAC;AACD;;;;;;;;GAQG;AACH,SAAgB,qBAAqB,CAAC,QAAgB;IAClD,IAAI,0BAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAChC,OAAO,SAAS,CAAC;IACrB,OAAO,IAAI,QAAQ,0DAA0D,CAAC,GAAG,0BAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AACvH,CAAC;AACD;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,QAAgB,EAAE,cAAuB;IAC5E,IAAI,cAAc,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,0EAA0E,QAAQ,MAAM;YACpG,6FAA6F;YAC7F,0GAA0G;YAC1G,yBAAyB,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,0BAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,6CAA6C,QAAQ,cAAc;YAC/E,CAAC,QAAQ,KAAK,OAAO;gBACjB,CAAC,CAAC,8SAA8S;gBAChT,CAAC,CAAC,oBAAoB,CAAC,GAAG,0BAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC/F,CAAC;AACL,CAAC","sourcesContent":["// 留存生命周期的 sandbox/ 域内路由:in-run 的 suspend(留存提交后转休眠)与事后命令\n// (`niceeval sandbox list/enter/stop`)用的 detached 能力(不需要原来的 run 进程或 Sandbox\n// 实例还活着)。provider 名的行为分支只允许出现在 sandbox/ 内(见 docs/architecture.md);\n// 运行器与评分路径不感知 provider 名。\nimport { Clock, Effect } from \"effect\";\nimport type { Sandbox } from \"../types.ts\";\nimport { DEFAULT_LEDGER_GIT_DIR } from \"./ledger-paths.ts\";\nimport { sandboxCapabilities } from \"./backend.ts\";\n/** provider 是否参与留存(defineSandbox 自定义 provider 不参与,创建前报错)。 */\nexport const KEEPABLE_PROVIDERS = new Set([\"docker\", \"e2b\", \"vercel\"]);\n/** in-run 的休眠:留存提交成功后由 Sample release 调用(sandbox.suspend 阶段,有界计时)。 */\nexport async function suspendSandbox(sandbox: Sandbox): Promise<void> {\n const suspend = sandboxCapabilities(sandbox).suspend;\n if (suspend._tag === \"Unsupported\") {\n throw new Error(`sandbox provider has no suspend capability (sandboxId=${sandbox.sandboxId})`);\n }\n await suspend.value();\n}\n/**\n * provider 原生的进入命令(记进注册表供直连与审计;日常入口是 `niceeval sandbox enter`)。\n * `sandboxId` 对 vercel 而言是沙箱的持久 `name`——官方 CLI(独立 npm 包 `sandbox`,别名\n * `sbx`)按 name 索引,`sandbox connect <name>`(别名 `ssh`/`shell`)唤醒并打开交互式 shell,\n * 与 docker/e2b 的\"原生命令即可直连\"语义一致(vercel.com/docs/sandbox/cli-reference)。\n */\nexport function nativeEnterCommand(provider: string, sandboxId: string): string | undefined {\n switch (provider) {\n case \"docker\":\n return `docker start ${sandboxId} && docker exec -it ${sandboxId} bash`;\n case \"e2b\":\n return `e2b sandbox connect ${sandboxId}`;\n case \"vercel\":\n return `sandbox connect ${sandboxId}`;\n default:\n return undefined;\n }\n}\n/**\n * Vercel 持久沙箱的默认快照保留期限:`snapshotExpiration` 默认 2,592,000,000ms(30 天),\n * 从快照最后一次使用起算(官方文档 vercel.com/docs/sandbox/concepts/persistent-sandboxes)。\n * niceeval 的 `VercelSandbox.create()` 不传自定义 `snapshotExpiration`,这个默认值就是\n * suspend(`stop()`,自动打快照)之后实际生效的保留期限。\n */\nconst VERCEL_DEFAULT_SNAPSHOT_EXPIRATION_MS = 30 * 24 * 60 * 60 * 1000;\n/**\n * 留存提交时算出 `expiresAt`——与 `nativeEnterCommand` 同步、无 IO,在 `writeKeptEntry`\n * 原子写入之前算好:provider 声明了保留期限才写。\n *\n * - **vercel**:写 `keptAt` + 默认快照保留期(30 天)。\n * - **e2b**:不写——官方文档(\"paused sandboxes are kept indefinitely; there is no\n * automatic deletion or time-to-live limit\")明确 pause 没有自然过期时刻。\n * - **docker**:不写——docker 的留存是本地停驻容器,不是「远端保留期限」这个概念。\n */\nexport function computeExpiresAt(provider: string, keptAt: string): string | undefined {\n switch (provider) {\n case \"vercel\":\n return new Date(Date.parse(keptAt) + VERCEL_DEFAULT_SNAPSHOT_EXPIRATION_MS).toISOString();\n default:\n return undefined;\n }\n}\nexport type DetachedState = \"alive\" | \"dormant\" | \"expired\" | \"unknown\";\n/** 事后核对现场状态(docker 问本地 daemon;云 provider 按实例状态核对,查不到 = expired)。 */\nexport async function inspectDetached(provider: string, sandboxId: string): Promise<DetachedState> {\n switch (provider) {\n case \"docker\": {\n try {\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n const info = await new Docker().getContainer(sandboxId).inspect();\n return info.State?.Running ? \"alive\" : \"dormant\";\n }\n catch {\n return \"unknown\";\n }\n }\n case \"e2b\": {\n try {\n const { Sandbox: E2BSdkSandbox } = await __niceevalDynamicImport(\"e2b\");\n const paginator = E2BSdkSandbox.list({ apiKey: process.env.E2B_API_KEY });\n let hit: {\n sandboxId: string;\n state?: string;\n } | undefined;\n while (paginator.hasNext && !hit) {\n hit = (await paginator.nextItems()).find((s) => s.sandboxId === sandboxId || s.sandboxId.startsWith(sandboxId));\n }\n if (!hit)\n return \"expired\";\n return hit.state === \"running\" ? \"alive\" : \"dormant\";\n }\n catch {\n return \"unknown\";\n }\n }\n case \"vercel\": {\n try {\n // 查状态用 name + resume:false——不为了看一眼状态就把休眠的沙箱唤醒(list 是只读命令,\n // 不该有唤醒这个副作用,也不该产生唤醒的计费)。\n const { Sandbox: VSandbox } = await __niceevalDynamicImport(\"@vercel/sandbox\");\n const get = (VSandbox as unknown as {\n get?: (opts: globalThis.Record<string, unknown>) => Promise<{\n status: string;\n } | null>;\n }).get;\n if (typeof get !== \"function\")\n return \"dormant\";\n const found = await get({ name: sandboxId, resume: false });\n if (!found)\n return \"expired\";\n return found.status === \"running\" ? \"alive\" : \"dormant\";\n }\n catch {\n return \"unknown\";\n }\n }\n default:\n return \"expired\";\n }\n}\n/**\n * detached 销毁:按注册表条目的 provider 名路由,不需要 Sandbox 实例。\n * 返回 \"stopped\"(成功销毁)或 \"already-gone\"(实例已不存在,幂等);\n * 其它错误上抛——调用方保留登记项并退出 1,不能把仍活着的资源从管理面隐藏掉。\n */\nexport async function destroyDetached(provider: string, sandboxId: string): Promise<\"stopped\" | \"already-gone\"> {\n switch (provider) {\n case \"docker\": {\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n const container = new Docker().getContainer(sandboxId);\n try {\n await container.remove({ force: true });\n return \"stopped\";\n }\n catch (e) {\n if ((e as {\n statusCode?: number;\n }).statusCode === 404)\n return \"already-gone\";\n throw e;\n }\n }\n case \"e2b\": {\n const { Sandbox: E2BSdkSandbox } = await __niceevalDynamicImport(\"e2b\");\n const kill = (E2BSdkSandbox as unknown as {\n kill?: (id: string, opts?: globalThis.Record<string, unknown>) => Promise<boolean>;\n }).kill;\n if (typeof kill !== \"function\")\n throw new Error(\"this e2b SDK version has no detached kill capability\");\n const killed = await kill(sandboxId, { apiKey: process.env.E2B_API_KEY });\n return killed ? \"stopped\" : \"already-gone\";\n }\n case \"vercel\": {\n // 真正的销毁是 SDK 的 delete()(≙ 官方 CLI 的 `sandbox remove`)——stop() 只是 suspend\n // (自动打快照、之后能 Sandbox.get 恢复),把它当销毁用会把\"已删除\"的沙箱悄悄留成可恢复\n // 的休眠态,`sandbox stop` 的\"销毁\"承诺就不成立了。resume:false 避免删除前先唤醒。\n const { Sandbox: VSandbox } = await __niceevalDynamicImport(\"@vercel/sandbox\");\n const get = (VSandbox as unknown as {\n get?: (opts: globalThis.Record<string, unknown>) => Promise<{\n delete(): Promise<void>;\n } | null>;\n }).get;\n if (typeof get !== \"function\")\n throw new Error(\"this vercel SDK version has no detached get capability\");\n let found;\n try {\n found = await get({ name: sandboxId, resume: false });\n }\n catch (error) {\n if ((error as {\n statusCode?: number;\n status?: number;\n }).statusCode === 404 || (error as {\n status?: number;\n }).status === 404) {\n return \"already-gone\";\n }\n throw error;\n }\n if (!found)\n return \"already-gone\";\n await found.delete();\n return \"stopped\";\n }\n default:\n throw new Error(`provider \"${provider}\" has no detached stop channel`);\n }\n}\n/** 唤醒休眠现场(enter / history / diff 前);docker start,云 provider 按 SDK 恢复。 */\nexport async function wakeDetached(provider: string, sandboxId: string): Promise<void> {\n switch (provider) {\n case \"docker\": {\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n const container = new Docker().getContainer(sandboxId);\n const info = await container.inspect();\n if (!info.State?.Running)\n await container.start();\n if (info.Config?.Labels?.[\"niceeval.docker-access\"] === \"dind\") {\n const user = info.Config.Labels[\"niceeval.dind-readiness-user\"] || \"root\";\n await waitForDetachedDockerReadiness(container, user);\n }\n return;\n }\n case \"e2b\": {\n const { Sandbox: E2BSdkSandbox } = await __niceevalDynamicImport(\"e2b\");\n const resume = (E2BSdkSandbox as unknown as {\n resume?: (id: string, opts?: globalThis.Record<string, unknown>) => Promise<unknown>;\n connect?: (id: string, opts?: globalThis.Record<string, unknown>) => Promise<unknown>;\n });\n if (typeof resume.resume === \"function\") {\n await resume.resume(sandboxId, { apiKey: process.env.E2B_API_KEY });\n return;\n }\n if (typeof resume.connect === \"function\") {\n await resume.connect(sandboxId, { apiKey: process.env.E2B_API_KEY });\n return;\n }\n throw new Error(\"this e2b SDK version has no resume capability\");\n }\n case \"vercel\": {\n // Sandbox.get({ name, resume: true })(默认值)是 SDK 原生的恢复入口:sandbox 默认持久,\n // get() 在会话已停止时自动从最近快照恢复文件系统并起新会话——不需要另一个专门的\n // \"resume\" API(vercel.com/docs/sandbox/sdk-reference)。\n const { Sandbox: VSandbox } = await __niceevalDynamicImport(\"@vercel/sandbox\");\n const get = (VSandbox as unknown as {\n get?: (opts: globalThis.Record<string, unknown>) => Promise<unknown>;\n }).get;\n if (typeof get !== \"function\")\n throw new Error(\"this vercel SDK version has no get capability\");\n await get({ name: sandboxId, resume: true });\n return;\n }\n default:\n throw new Error(`provider \"${provider}\" has no wake channel`);\n }\n}\ninterface DockerInfoContainer {\n exec(options: globalThis.Record<string, unknown>): Promise<{\n start(options: globalThis.Record<string, unknown>): Promise<NodeJS.ReadableStream>;\n inspect(): Promise<{\n ExitCode?: number | null;\n }>;\n }>;\n}\ntype DockerInfoExecution = Awaited<ReturnType<DockerInfoContainer[\"exec\"]>>;\ntype DockerInfoProbeOutcome = {\n readonly _tag: \"completed\";\n readonly exitCode: number | null | undefined;\n} | {\n readonly _tag: \"timed-out\";\n} | {\n readonly _tag: \"failed\";\n};\nasync function waitForDetachedDockerReadiness(container: DockerInfoContainer, user: string): Promise<void> {\n return Effect.runPromise(waitForDetachedDockerReadinessEffect(container, user));\n}\n/**\n * 轮询是 NiceEval 内部策略:deadline 用 `Clock.currentTimeMillis`、间隔与竞速用 `Clock.sleep`,\n * 与原来 `Date.now()` + `setTimeout` 的 30s 窗口 / 250ms 间隔 / 剩余量封顶公式完全一致。\n * 超时或中断都在 Effect fiber 上收束,不再手工管理 timer 或 stream 之外的计时器。\n */\nfunction waitForDetachedDockerReadinessEffect(container: DockerInfoContainer, user: string): Effect.Effect<void, Error> {\n const readinessError = (lastExit: number | null | undefined): Error => new Error(`Docker DinD sandbox did not become ready after wake as user ${JSON.stringify(user)}` +\n (lastExit === undefined ? \"\" : ` (docker info exit ${lastExit ?? \"unknown\"})`));\n const pollAgain = (deadline: number, lastExit: number | null | undefined): Effect.Effect<void, Error> => Clock.currentTimeMillis.pipe(Effect.flatMap((now) => {\n const remaining = deadline - now;\n if (remaining <= 0)\n return Effect.fail(readinessError(lastExit));\n return Clock.sleep(Math.min(250, remaining)).pipe(Effect.zipRight(attempt(deadline, lastExit)));\n }));\n const attempt = (deadline: number, lastExit: number | null | undefined): Effect.Effect<void, Error> => Clock.currentTimeMillis.pipe(Effect.flatMap((now) => {\n if (now > deadline)\n return Effect.fail(readinessError(lastExit));\n return dockerInfoProbe(container, user, deadline - now).pipe(Effect.flatMap((outcome) => {\n if (outcome._tag === \"timed-out\")\n return Effect.fail(readinessError(lastExit));\n if (outcome._tag === \"failed\")\n return pollAgain(deadline, undefined);\n if (outcome.exitCode === 0)\n return Effect.succeed(undefined);\n return pollAgain(deadline, outcome.exitCode);\n }));\n }));\n return Clock.currentTimeMillis.pipe(Effect.flatMap((now) => attempt(now + 30000, undefined)));\n}\n/**\n * 单轮探测:exec `docker info` → 起 stream → 与剩余时间竞速。exec/stream/inspect 都是 dockerode\n * (Node 进程/stream 叶子),留在 Promise 面由 `tryPromise`/`async` 适配;只有「等多久」和\n * 「到点后做什么」是 NiceEval 内部的,走 Effect Clock + 中断。\n */\nfunction dockerInfoProbe(container: DockerInfoContainer, user: string, timeoutMs: number): Effect.Effect<DockerInfoProbeOutcome, never> {\n const startProbe: Effect.Effect<{\n readonly execution: DockerInfoExecution;\n readonly stream: NodeJS.ReadableStream;\n }, unknown> = Effect.tryPromise({\n try: () => container\n .exec({\n Cmd: [\"docker\", \"info\"],\n User: user,\n AttachStdout: true,\n AttachStderr: true,\n })\n .then((execution) => execution.start({}).then((stream) => ({ execution, stream }))),\n catch: (cause) => cause,\n });\n const probeOne = (execution: DockerInfoExecution, stream: NodeJS.ReadableStream): Effect.Effect<DockerInfoProbeOutcome, never> => {\n const destroyStream = (): void => (stream as NodeJS.ReadableStream & {\n destroy(): void;\n }).destroy();\n if (timeoutMs <= 0) {\n destroyStream();\n return Effect.succeed({ _tag: \"timed-out\" } as const);\n }\n const completed: Effect.Effect<\"completed\" | \"failed\", never> = Effect.async((resume) => {\n stream.on(\"end\", () => resume(Effect.succeed(\"completed\")));\n stream.on(\"error\", () => resume(Effect.succeed(\"failed\")));\n stream.resume();\n });\n const timedOut: Effect.Effect<\"timed-out\", never> = Clock.sleep(timeoutMs).pipe(Effect.map(() => {\n destroyStream();\n return \"timed-out\" as const;\n }));\n return Effect.race(completed, timedOut).pipe(Effect.flatMap((outcome): Effect.Effect<DockerInfoProbeOutcome, never> => {\n if (outcome === \"timed-out\")\n return Effect.succeed({ _tag: \"timed-out\" } as const);\n if (outcome === \"failed\")\n return Effect.succeed({ _tag: \"failed\" } as const);\n return Effect.tryPromise({\n try: () => execution.inspect(),\n catch: (cause) => cause,\n }).pipe(Effect.map((info) => ({ _tag: \"completed\" as const, exitCode: info.ExitCode })), Effect.catchAll(() => Effect.succeed({ _tag: \"failed\" } as const)));\n }));\n };\n return startProbe.pipe(Effect.flatMap(({ execution, stream }) => probeOne(execution, stream)), Effect.catchAll(() => Effect.succeed({ _tag: \"failed\" } as const)));\n}\n/** 送回休眠(enter 退出后 / history、diff 读完后)。 */\nexport async function suspendDetached(provider: string, sandboxId: string): Promise<void> {\n switch (provider) {\n case \"docker\": {\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n await new Docker().getContainer(sandboxId).stop({ t: 5 });\n return;\n }\n case \"e2b\": {\n const { Sandbox: E2BSdkSandbox } = await __niceevalDynamicImport(\"e2b\");\n const pause = (E2BSdkSandbox as unknown as {\n pause?: (id: string, opts?: globalThis.Record<string, unknown>) => Promise<unknown>;\n }).pause;\n if (typeof pause === \"function\") {\n await pause(sandboxId, { apiKey: process.env.E2B_API_KEY });\n return;\n }\n throw new Error(\"this e2b SDK version has no detached pause capability\");\n }\n case \"vercel\": {\n // suspend = stop():自动打快照保存文件系统,之后经 Sandbox.get 恢复(留存语义见\n // docs/feature/sandbox/architecture.md「留存(keep)与注册表」)。resume:false——这里\n // 只想找到已经醒着的实例去 stop 它,不需要 get() 顺手再唤醒一次。\n const { Sandbox: VSandbox } = await __niceevalDynamicImport(\"@vercel/sandbox\");\n const get = (VSandbox as unknown as {\n get?: (opts: globalThis.Record<string, unknown>) => Promise<{\n stop(): Promise<unknown>;\n } | null>;\n }).get;\n if (typeof get !== \"function\")\n throw new Error(\"this vercel SDK version has no get capability\");\n const found = await get({ name: sandboxId, resume: false });\n if (!found)\n throw new Error(`vercel sandbox \"${sandboxId}\" not found; it may already be gone`);\n await found.stop();\n return;\n }\n default:\n throw new Error(`provider \"${provider}\" has no suspend channel`);\n }\n}\n/**\n * 打开交互式 shell(`niceeval sandbox enter`的落地动作):把三家 provider 各自的原生连接\n * 命令当子进程跑,stdio 直通当前终端——不重新实现各家的 PTY 协议(docker 是 exec 直连;e2b /\n * vercel 都有官方 CLI 已经处理好 PTY 转发,niceeval 只负责唤醒、启动这个子进程、退出后回眠)。\n * 返回子进程退出码;若原生命令本身起不来(如未安装对应 CLI),抛出原始 spawn 错误,调用方\n * 据此提示改用注册表里记录的 `enter` 命令直连。\n */\nexport async function openInteractiveShell(provider: string, sandboxId: string, workdir: string): Promise<number> {\n switch (provider) {\n case \"docker\":\n return spawnAndWait(\"docker\", [\"exec\", \"-it\", \"-w\", workdir, sandboxId, \"bash\", \"-l\"]);\n case \"e2b\":\n return spawnAndWait(\"e2b\", [\"sandbox\", \"connect\", sandboxId]);\n case \"vercel\": {\n // sandbox CLI 复用 niceeval 已经在用的显式凭据(与 VercelSandbox.create 同一路径),\n // 不强制用户额外 `vercel link` / `sandbox login`。\n const args = [\"connect\", \"--workdir\", workdir];\n const token = process.env.VERCEL_API_TOKEN;\n const teamId = process.env.VERCEL_TEAM_ID;\n const projectId = process.env.VERCEL_PROJECT_ID;\n if (token)\n args.push(\"--token\", token);\n if (teamId)\n args.push(\"--scope\", teamId);\n if (projectId)\n args.push(\"--project\", projectId);\n args.push(sandboxId);\n return spawnAndWait(\"sandbox\", args);\n }\n default:\n throw new Error(`provider \"${provider}\" has no interactive enter channel`);\n }\n}\nasync function spawnAndWait(cmd: string, args: string[]): Promise<number> {\n const { spawn } = await __niceevalDynamicImport(\"node:child_process\");\n return new Promise((resolvePromise, reject) => {\n const child = spawn(cmd, args, { stdio: \"inherit\" });\n child.on(\"exit\", (code) => resolvePromise(code ?? 0));\n child.on(\"error\", (err) => reject(err));\n });\n}\n/**\n * 在留存现场里跑一条非交互命令(`sandbox history` / `diff` 用,读私有变更分类账)。docker 走\n * dockerode exec(多路复用流需要按帧解析);e2b / vercel 走各自 SDK 拿到一个可 runCommand 的\n * 实例句柄——`wakeDetached` 已经确保现场醒着,这里只负责拿句柄、跑命令、取回 stdout。\n */\nexport async function execInDetached(provider: string, sandboxId: string, workdir: string, script: string): Promise<string> {\n switch (provider) {\n case \"docker\":\n return execInDockerLedger(sandboxId, workdir, script);\n case \"e2b\": {\n const { Sandbox: E2BSdkSandbox } = await __niceevalDynamicImport(\"e2b\");\n const sbx = await E2BSdkSandbox.connect(sandboxId, { apiKey: process.env.E2B_API_KEY });\n const res = await sbx.commands.run(script, {\n cwd: workdir,\n envs: { GIT_DIR: DEFAULT_LEDGER_GIT_DIR, GIT_WORK_TREE: workdir, HOME: \"/tmp\" },\n });\n return res.stdout;\n }\n case \"vercel\": {\n const { Sandbox: VSandbox } = await __niceevalDynamicImport(\"@vercel/sandbox\");\n const get = (VSandbox as unknown as {\n get?: (opts: globalThis.Record<string, unknown>) => Promise<{\n runCommand(params: globalThis.Record<string, unknown>): Promise<{\n stdout(): Promise<string>;\n }>;\n } | null>;\n }).get;\n if (typeof get !== \"function\")\n throw new Error(\"this vercel SDK version has no get capability\");\n const found = await get({ name: sandboxId, resume: false });\n if (!found)\n throw new Error(`vercel sandbox \"${sandboxId}\" not found; the in-sandbox ledger died with it`);\n const finished = await found.runCommand({\n cmd: \"sh\",\n args: [\"-c\", script],\n cwd: workdir,\n env: { GIT_DIR: DEFAULT_LEDGER_GIT_DIR, GIT_WORK_TREE: workdir, HOME: \"/tmp\" },\n });\n return await finished.stdout();\n }\n default:\n throw new Error(`replaying the ledger has no exec channel for provider \"${provider}\"`);\n }\n}\n/** docker 分支:dockerode exec 一条命令,多路复用流按 8 字节头逐帧剥离拼回文本。 */\nasync function execInDockerLedger(sandboxId: string, workdir: string, script: string): Promise<string> {\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n const container = new Docker().getContainer(sandboxId);\n const exec = await container.exec({\n Cmd: [\"sh\", \"-c\", script],\n AttachStdout: true,\n AttachStderr: true,\n Env: [`GIT_DIR=${DEFAULT_LEDGER_GIT_DIR}`, `GIT_WORK_TREE=${workdir}`, \"HOME=/tmp\"],\n });\n const stream = await exec.start({});\n return await new Promise<string>((resolvePromise, reject) => {\n const chunks: Buffer[] = [];\n stream.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n stream.on(\"end\", () => {\n // docker 多路复用帧:每帧 8 字节头(stream type + 长度),逐帧剥掉。\n const raw = Buffer.concat(chunks);\n let out = \"\";\n let offset = 0;\n while (offset + 8 <= raw.length) {\n const size = raw.readUInt32BE(offset + 4);\n out += raw.subarray(offset + 8, offset + 8 + size).toString(\"utf-8\");\n offset += 8 + size;\n }\n resolvePromise(out || raw.toString(\"utf-8\"));\n });\n stream.on(\"error\", reject);\n });\n}\n/**\n * 事后命令(`enter`/`history`/`diff`)在 CLI 层是否可对某 provider 名执行的静态守门——\n * 留存注册表只可能出现 `KEEPABLE_PROVIDERS` 三家之一;命中之外(手改注册表、跨版本遗留的\n * provider 名)如实报出「不是 niceeval sandbox provider」,不是逐条 `if (provider === …)`。\n * 返回 undefined 表示可执行;否则给出可直接展示给用户的原因。\n *\n * callback 自定义 case 不支持留存:`niceeval sandbox` 不加载用户模块,也没有可发现的\n * detached provider 实现可以在另一个进程中恢复或销毁资源组。\n */\nexport function detachedCapabilityGap(provider: string): string | undefined {\n if (KEEPABLE_PROVIDERS.has(provider))\n return undefined;\n return `\"${provider}\" is not a niceeval sandbox provider (expected one of: ${[...KEEPABLE_PROVIDERS].join(\", \")})`;\n}\n/**\n * 创建前组合校验入口:只有可发现的内置 KEEPABLE provider 路径。\n * Runner 合流后应优先调 `assertKeepAllowedForCase`;本函数保留给尚无 planned case 的旧路径。\n */\nexport function assertProviderKeepable(provider: string, isCustomCreate: boolean): void {\n if (isCustomCreate) {\n throw new Error(`--keep-sandbox is not supported with a defineSandbox custom provider (\"${provider}\"): ` +\n `the after-the-fact 'niceeval sandbox' commands never load project code, so a detached stop ` +\n `for user-defined sandboxes cannot be recovered safely. Use a built-in provider (docker / e2b / vercel), ` +\n `or drop --keep-sandbox.`);\n }\n if (!KEEPABLE_PROVIDERS.has(provider)) {\n throw new Error(`--keep-sandbox is not supported with the \"${provider}\" provider: ` +\n (provider === \"local\"\n ? \"it never destroys the sandbox in the first place, so there is nothing to register for later retention — the workspace already sits exactly where the agent left it. Drop --keep-sandbox, or use a built-in cloud/container provider (docker / e2b / vercel) if you need a registry-managed retained sandbox.\"\n : `expected one of: ${[...KEEPABLE_PROVIDERS].join(\", \")}. Drop --keep-sandbox.`));\n }\n}\n"]}
1
+ {"version":3,"file":"keep.js","sourceRoot":"","sources":["keep.ts"],"names":[],"mappings":"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","sourcesContent":["// 留存生命周期的 sandbox/ 域内路由:in-run 的 suspend(留存提交后转休眠)与事后命令\n// (`niceeval sandbox list/enter/stop`)用的 detached 能力(不需要原来的 run 进程或 Sandbox\n// 实例还活着)。provider 名的行为分支只允许出现在 sandbox/ 内(见 docs/architecture.md);\n// 运行器与评分路径不感知 provider 名。\nimport { Clock, Effect } from \"effect\";\nimport type { Sandbox } from \"../types.ts\";\nimport { DEFAULT_LEDGER_GIT_DIR } from \"./ledger-paths.ts\";\nimport { sandboxCapabilities } from \"./backend.ts\";\n/** provider 是否参与留存(defineSandbox 自定义 provider 不参与,创建前报错)。 */\nexport const KEEPABLE_PROVIDERS = new Set([\"docker\", \"e2b\", \"vercel\"]);\n/** in-run 的休眠:留存提交成功后由 Sample release 调用(sandbox.suspend 阶段,有界计时)。 */\nexport async function suspendSandbox(sandbox: Sandbox): Promise<void> {\n const suspend = sandboxCapabilities(sandbox).suspend;\n if (suspend._tag === \"Unsupported\") {\n throw new Error(`sandbox provider has no suspend capability (sandboxId=${sandbox.sandboxId})`);\n }\n await suspend.value();\n}\n/**\n * provider 原生的进入命令(记进注册表供直连与审计;日常入口是 `niceeval sandbox enter`)。\n * `sandboxId` 对 vercel 而言是沙箱的持久 `name`——官方 CLI(独立 npm 包 `sandbox`,别名\n * `sbx`)按 name 索引,`sandbox connect <name>`(别名 `ssh`/`shell`)唤醒并打开交互式 shell,\n * 与 docker/e2b 的\"原生命令即可直连\"语义一致(vercel.com/docs/sandbox/cli-reference)。\n */\nexport function nativeEnterCommand(provider: string, sandboxId: string): string | undefined {\n switch (provider) {\n case \"docker\":\n return `docker start ${sandboxId} && docker exec -it ${sandboxId} bash`;\n case \"e2b\":\n return `e2b sandbox connect ${sandboxId}`;\n case \"vercel\":\n return `sandbox connect ${sandboxId}`;\n default:\n return undefined;\n }\n}\n/**\n * Vercel 持久沙箱的默认快照保留期限:`snapshotExpiration` 默认 2,592,000,000ms(30 天),\n * 从快照最后一次使用起算(官方文档 vercel.com/docs/sandbox/concepts/persistent-sandboxes)。\n * niceeval 的 `VercelSandbox.create()` 不传自定义 `snapshotExpiration`,这个默认值就是\n * suspend(`stop()`,自动打快照)之后实际生效的保留期限。\n */\nconst VERCEL_DEFAULT_SNAPSHOT_EXPIRATION_MS = 30 * 24 * 60 * 60 * 1000;\n/**\n * 留存提交时算出 `expiresAt`——与 `nativeEnterCommand` 同步、无 IO,在 `writeKeptEntry`\n * 原子写入之前算好:provider 声明了保留期限才写。\n *\n * - **vercel**:写 `keptAt` + 默认快照保留期(30 天)。\n * - **e2b**:不写——官方文档(\"paused sandboxes are kept indefinitely; there is no\n * automatic deletion or time-to-live limit\")明确 pause 没有自然过期时刻。\n * - **docker**:不写——docker 的留存是本地停驻容器,不是「远端保留期限」这个概念。\n */\nexport function computeExpiresAt(provider: string, keptAt: string): string | undefined {\n switch (provider) {\n case \"vercel\":\n return new Date(Date.parse(keptAt) + VERCEL_DEFAULT_SNAPSHOT_EXPIRATION_MS).toISOString();\n default:\n return undefined;\n }\n}\nexport type DetachedState = \"alive\" | \"dormant\" | \"expired\" | \"unknown\";\n/** 事后核对现场状态(docker 问本地 daemon;云 provider 按实例状态核对,查不到 = expired)。 */\nexport async function inspectDetached(provider: string, sandboxId: string): Promise<DetachedState> {\n switch (provider) {\n case \"docker\": {\n try {\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n const info = await new Docker().getContainer(sandboxId).inspect();\n return info.State?.Running ? \"alive\" : \"dormant\";\n }\n catch {\n return \"unknown\";\n }\n }\n case \"e2b\": {\n try {\n const { Sandbox: E2BSdkSandbox } = await __niceevalDynamicImport(\"e2b\");\n const paginator = E2BSdkSandbox.list({ apiKey: process.env.E2B_API_KEY });\n let hit: {\n sandboxId: string;\n state?: string;\n } | undefined;\n while (paginator.hasNext && !hit) {\n hit = (await paginator.nextItems()).find((s) => s.sandboxId === sandboxId || s.sandboxId.startsWith(sandboxId));\n }\n if (!hit)\n return \"expired\";\n return hit.state === \"running\" ? \"alive\" : \"dormant\";\n }\n catch {\n return \"unknown\";\n }\n }\n case \"vercel\": {\n try {\n // 查状态用 name + resume:false——不为了看一眼状态就把休眠的沙箱唤醒(list 是只读命令,\n // 不该有唤醒这个副作用,也不该产生唤醒的计费)。\n const { Sandbox: VSandbox } = await __niceevalDynamicImport(\"@vercel/sandbox\");\n const get = (VSandbox as unknown as {\n get?: (opts: globalThis.Record<string, unknown>) => Promise<{\n status: string;\n } | null>;\n }).get;\n if (typeof get !== \"function\")\n return \"dormant\";\n const found = await get({ name: sandboxId, resume: false });\n if (!found)\n return \"expired\";\n return found.status === \"running\" ? \"alive\" : \"dormant\";\n }\n catch {\n return \"unknown\";\n }\n }\n default:\n return \"expired\";\n }\n}\n/**\n * detached 销毁:按注册表条目的 provider 名路由,不需要 Sandbox 实例。\n * 返回 \"stopped\"(成功销毁)或 \"already-gone\"(实例已不存在,幂等);\n * 其它错误上抛——调用方保留登记项并退出 1,不能把仍活着的资源从管理面隐藏掉。\n */\nexport async function destroyDetached(provider: string, sandboxId: string): Promise<\"stopped\" | \"already-gone\"> {\n switch (provider) {\n case \"docker\": {\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n const container = new Docker().getContainer(sandboxId);\n try {\n await container.remove({ force: true });\n return \"stopped\";\n }\n catch (e) {\n if ((e as {\n statusCode?: number;\n }).statusCode === 404)\n return \"already-gone\";\n throw e;\n }\n }\n case \"e2b\": {\n const { Sandbox: E2BSdkSandbox } = await __niceevalDynamicImport(\"e2b\");\n const kill = (E2BSdkSandbox as unknown as {\n kill?: (id: string, opts?: globalThis.Record<string, unknown>) => Promise<boolean>;\n }).kill;\n if (typeof kill !== \"function\")\n throw new Error(\"this e2b SDK version has no detached kill capability\");\n const killed = await kill(sandboxId, { apiKey: process.env.E2B_API_KEY });\n return killed ? \"stopped\" : \"already-gone\";\n }\n case \"vercel\": {\n // 真正的销毁是 SDK 的 delete()(≙ 官方 CLI 的 `sandbox remove`)——stop() 只是 suspend\n // (自动打快照、之后能 Sandbox.get 恢复),把它当销毁用会把\"已删除\"的沙箱悄悄留成可恢复\n // 的休眠态,`sandbox stop` 的\"销毁\"承诺就不成立了。resume:false 避免删除前先唤醒。\n const { Sandbox: VSandbox } = await __niceevalDynamicImport(\"@vercel/sandbox\");\n const get = (VSandbox as unknown as {\n get?: (opts: globalThis.Record<string, unknown>) => Promise<{\n delete(): Promise<void>;\n } | null>;\n }).get;\n if (typeof get !== \"function\")\n throw new Error(\"this vercel SDK version has no detached get capability\");\n let found;\n try {\n found = await get({ name: sandboxId, resume: false });\n }\n catch (error) {\n if ((error as {\n statusCode?: number;\n status?: number;\n }).statusCode === 404 || (error as {\n status?: number;\n }).status === 404) {\n return \"already-gone\";\n }\n throw error;\n }\n if (!found)\n return \"already-gone\";\n await found.delete();\n return \"stopped\";\n }\n default:\n throw new Error(`provider \"${provider}\" has no detached stop channel`);\n }\n}\n/** 唤醒休眠现场(enter / history / diff 前);docker start,云 provider 按 SDK 恢复。 */\nexport async function wakeDetached(provider: string, sandboxId: string): Promise<void> {\n switch (provider) {\n case \"docker\": {\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n const container = new Docker().getContainer(sandboxId);\n const info = await container.inspect();\n if (!info.State?.Running)\n await container.start();\n if (info.Config?.Labels?.[\"niceeval.docker-access\"] === \"dind\") {\n const user = info.Config.Labels[\"niceeval.dind-readiness-user\"] || \"root\";\n await waitForDetachedDockerReadiness(container, user);\n }\n return;\n }\n case \"e2b\": {\n const { Sandbox: E2BSdkSandbox } = await __niceevalDynamicImport(\"e2b\");\n const resume = (E2BSdkSandbox as unknown as {\n resume?: (id: string, opts?: globalThis.Record<string, unknown>) => Promise<unknown>;\n connect?: (id: string, opts?: globalThis.Record<string, unknown>) => Promise<unknown>;\n });\n if (typeof resume.resume === \"function\") {\n await resume.resume(sandboxId, { apiKey: process.env.E2B_API_KEY });\n return;\n }\n if (typeof resume.connect === \"function\") {\n await resume.connect(sandboxId, { apiKey: process.env.E2B_API_KEY });\n return;\n }\n throw new Error(\"this e2b SDK version has no resume capability\");\n }\n case \"vercel\": {\n // Sandbox.get({ name, resume: true })(默认值)是 SDK 原生的恢复入口:sandbox 默认持久,\n // get() 在会话已停止时自动从最近快照恢复文件系统并起新会话——不需要另一个专门的\n // \"resume\" API(vercel.com/docs/sandbox/sdk-reference)。\n const { Sandbox: VSandbox } = await __niceevalDynamicImport(\"@vercel/sandbox\");\n const get = (VSandbox as unknown as {\n get?: (opts: globalThis.Record<string, unknown>) => Promise<unknown>;\n }).get;\n if (typeof get !== \"function\")\n throw new Error(\"this vercel SDK version has no get capability\");\n await get({ name: sandboxId, resume: true });\n return;\n }\n default:\n throw new Error(`provider \"${provider}\" has no wake channel`);\n }\n}\ninterface DockerInfoContainer {\n exec(options: globalThis.Record<string, unknown>): Promise<{\n start(options: globalThis.Record<string, unknown>): Promise<NodeJS.ReadableStream>;\n inspect(): Promise<{\n ExitCode?: number | null;\n }>;\n }>;\n}\ntype DockerInfoExecution = Awaited<ReturnType<DockerInfoContainer[\"exec\"]>>;\ntype DockerInfoProbeOutcome = {\n readonly _tag: \"completed\";\n readonly exitCode: number | null | undefined;\n} | {\n readonly _tag: \"timed-out\";\n} | {\n readonly _tag: \"failed\";\n};\nasync function waitForDetachedDockerReadiness(container: DockerInfoContainer, user: string): Promise<void> {\n return Effect.runPromise(waitForDetachedDockerReadinessEffect(container, user));\n}\n/**\n * 轮询是 NiceEval 内部策略:deadline 用 `Clock.currentTimeMillis`、间隔与竞速用 `Clock.sleep`,\n * 与原来 `Date.now()` + `setTimeout` 的 30s 窗口 / 250ms 间隔 / 剩余量封顶公式完全一致。\n * 超时或中断都在 Effect fiber 上收束,不再手工管理 timer 或 stream 之外的计时器。\n */\nfunction waitForDetachedDockerReadinessEffect(container: DockerInfoContainer, user: string): Effect.Effect<void, Error> {\n const readinessError = (lastExit: number | null | undefined): Error => new Error(`Docker DinD sandbox did not become ready after wake as user ${JSON.stringify(user)}` +\n (lastExit === undefined ? \"\" : ` (docker info exit ${lastExit ?? \"unknown\"})`));\n const pollAgain = (deadline: number, lastExit: number | null | undefined): Effect.Effect<void, Error> => Clock.currentTimeMillis.pipe(Effect.flatMap((now) => {\n const remaining = deadline - now;\n if (remaining <= 0)\n return Effect.fail(readinessError(lastExit));\n return Clock.sleep(Math.min(250, remaining)).pipe(Effect.zipRight(attempt(deadline, lastExit)));\n }));\n const attempt = (deadline: number, lastExit: number | null | undefined): Effect.Effect<void, Error> => Clock.currentTimeMillis.pipe(Effect.flatMap((now) => {\n if (now > deadline)\n return Effect.fail(readinessError(lastExit));\n return dockerInfoProbe(container, user, deadline - now).pipe(Effect.flatMap((outcome) => {\n if (outcome._tag === \"timed-out\")\n return Effect.fail(readinessError(lastExit));\n if (outcome._tag === \"failed\")\n return pollAgain(deadline, undefined);\n if (outcome.exitCode === 0)\n return Effect.succeed(undefined);\n return pollAgain(deadline, outcome.exitCode);\n }));\n }));\n return Clock.currentTimeMillis.pipe(Effect.flatMap((now) => attempt(now + 30000, undefined)));\n}\n/**\n * 单轮探测:exec `docker info` → 起 stream → 与剩余时间竞速。exec/stream/inspect 都是 dockerode\n * (Node 进程/stream 叶子),留在 Promise 面由 `tryPromise`/`async` 适配;只有「等多久」和\n * 「到点后做什么」是 NiceEval 内部的,走 Effect Clock + 中断。\n */\nfunction dockerInfoProbe(container: DockerInfoContainer, user: string, timeoutMs: number): Effect.Effect<DockerInfoProbeOutcome, never> {\n const startProbe: Effect.Effect<{\n readonly execution: DockerInfoExecution;\n readonly stream: NodeJS.ReadableStream;\n }, unknown> = Effect.tryPromise({\n try: () => container\n .exec({\n Cmd: [\"docker\", \"info\"],\n User: user,\n AttachStdout: true,\n AttachStderr: true,\n })\n .then((execution) => execution.start({}).then((stream) => ({ execution, stream }))),\n catch: (cause) => cause,\n });\n const probeOne = (execution: DockerInfoExecution, stream: NodeJS.ReadableStream): Effect.Effect<DockerInfoProbeOutcome, never> => {\n const destroyStream = (): void => (stream as NodeJS.ReadableStream & {\n destroy(): void;\n }).destroy();\n if (timeoutMs <= 0) {\n destroyStream();\n return Effect.succeed({ _tag: \"timed-out\" } as const);\n }\n const completed: Effect.Effect<\"completed\" | \"failed\", never> = Effect.async((resume) => {\n stream.on(\"end\", () => resume(Effect.succeed(\"completed\")));\n stream.on(\"error\", () => resume(Effect.succeed(\"failed\")));\n stream.resume();\n });\n const timedOut: Effect.Effect<\"timed-out\", never> = Clock.sleep(timeoutMs).pipe(Effect.map(() => {\n destroyStream();\n return \"timed-out\" as const;\n }));\n return Effect.race(completed, timedOut).pipe(Effect.flatMap((outcome): Effect.Effect<DockerInfoProbeOutcome, never> => {\n if (outcome === \"timed-out\")\n return Effect.succeed({ _tag: \"timed-out\" } as const);\n if (outcome === \"failed\")\n return Effect.succeed({ _tag: \"failed\" } as const);\n return Effect.tryPromise({\n try: () => execution.inspect(),\n catch: (cause) => cause,\n }).pipe(Effect.map((info) => ({ _tag: \"completed\" as const, exitCode: info.ExitCode })), Effect.catchAll(() => Effect.succeed({ _tag: \"failed\" } as const)));\n }));\n };\n return startProbe.pipe(Effect.flatMap(({ execution, stream }) => probeOne(execution, stream)), Effect.catchAll(() => Effect.succeed({ _tag: \"failed\" } as const)));\n}\n/** 送回休眠(enter 退出后 / history、diff 读完后)。 */\nexport async function suspendDetached(provider: string, sandboxId: string): Promise<void> {\n switch (provider) {\n case \"docker\": {\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n await new Docker().getContainer(sandboxId).stop({ t: 5 });\n return;\n }\n case \"e2b\": {\n const { Sandbox: E2BSdkSandbox } = await __niceevalDynamicImport(\"e2b\");\n const pause = (E2BSdkSandbox as unknown as {\n pause?: (id: string, opts?: globalThis.Record<string, unknown>) => Promise<unknown>;\n }).pause;\n if (typeof pause === \"function\") {\n await pause(sandboxId, { apiKey: process.env.E2B_API_KEY });\n return;\n }\n throw new Error(\"this e2b SDK version has no detached pause capability\");\n }\n case \"vercel\": {\n // suspend = stop():自动打快照保存文件系统,之后经 Sandbox.get 恢复(留存语义见\n // docs/feature/sandbox/architecture.md「留存(keep)与注册表」)。resume:false——这里\n // 只想找到已经醒着的实例去 stop 它,不需要 get() 顺手再唤醒一次。\n const { Sandbox: VSandbox } = await __niceevalDynamicImport(\"@vercel/sandbox\");\n const get = (VSandbox as unknown as {\n get?: (opts: globalThis.Record<string, unknown>) => Promise<{\n stop(): Promise<unknown>;\n } | null>;\n }).get;\n if (typeof get !== \"function\")\n throw new Error(\"this vercel SDK version has no get capability\");\n const found = await get({ name: sandboxId, resume: false });\n if (!found)\n throw new Error(`vercel sandbox \"${sandboxId}\" not found; it may already be gone`);\n await found.stop();\n return;\n }\n default:\n throw new Error(`provider \"${provider}\" has no suspend channel`);\n }\n}\n/**\n * 打开交互式 shell(`niceeval sandbox enter`的落地动作):把三家 provider 各自的原生连接\n * 命令当子进程跑,stdio 直通当前终端——不重新实现各家的 PTY 协议(docker 是 exec 直连;e2b /\n * vercel 都有官方 CLI 已经处理好 PTY 转发,niceeval 只负责唤醒、启动这个子进程、退出后回眠)。\n * 返回子进程退出码;若原生命令本身起不来(如未安装对应 CLI),抛出原始 spawn 错误,调用方\n * 据此提示改用注册表里记录的 `enter` 命令直连。\n */\nexport async function openInteractiveShell(provider: string, sandboxId: string, workdir: string): Promise<number> {\n switch (provider) {\n case \"docker\":\n return spawnAndWait(\"docker\", [\"exec\", \"-it\", \"-w\", workdir, sandboxId, \"bash\", \"-l\"]);\n case \"e2b\":\n return spawnAndWait(\"e2b\", [\"sandbox\", \"connect\", sandboxId]);\n case \"vercel\": {\n // sandbox CLI 复用 niceeval 已经在用的显式凭据(与 VercelSandbox.create 同一路径),\n // 不强制用户额外 `vercel link` / `sandbox login`。\n const args = [\"connect\", \"--workdir\", workdir];\n const token = process.env.VERCEL_API_TOKEN;\n const teamId = process.env.VERCEL_TEAM_ID;\n const projectId = process.env.VERCEL_PROJECT_ID;\n if (token)\n args.push(\"--token\", token);\n if (teamId)\n args.push(\"--scope\", teamId);\n if (projectId)\n args.push(\"--project\", projectId);\n args.push(sandboxId);\n return spawnAndWait(\"sandbox\", args);\n }\n default:\n throw new Error(`provider \"${provider}\" has no interactive enter channel`);\n }\n}\nasync function spawnAndWait(cmd: string, args: string[]): Promise<number> {\n const { spawn } = await __niceevalDynamicImport(\"node:child_process\");\n return new Promise((resolvePromise, reject) => {\n const child = spawn(cmd, args, { stdio: \"inherit\" });\n child.on(\"exit\", (code) => resolvePromise(code ?? 0));\n child.on(\"error\", (err) => reject(err));\n });\n}\n/**\n * 在留存现场里跑一条非交互命令(`sandbox history` / `diff` 用,读私有变更分类账)。docker 走\n * dockerode exec(多路复用流需要按帧解析);e2b / vercel 走各自 SDK 拿到一个可 runCommand 的\n * 实例句柄——`wakeDetached` 已经确保现场醒着,这里只负责拿句柄、跑命令、取回 stdout。\n */\nexport async function execInDetached(provider: string, sandboxId: string, workdir: string, script: string): Promise<string> {\n switch (provider) {\n case \"docker\":\n return execInDockerLedger(sandboxId, workdir, script);\n case \"e2b\": {\n const { Sandbox: E2BSdkSandbox } = await __niceevalDynamicImport(\"e2b\");\n const sbx = await E2BSdkSandbox.connect(sandboxId, { apiKey: process.env.E2B_API_KEY });\n const res = await sbx.commands.run(script, {\n cwd: workdir,\n envs: { GIT_DIR: DEFAULT_LEDGER_GIT_DIR, GIT_WORK_TREE: workdir, HOME: \"/tmp\" },\n });\n return res.stdout;\n }\n case \"vercel\": {\n const { Sandbox: VSandbox } = await __niceevalDynamicImport(\"@vercel/sandbox\");\n const get = (VSandbox as unknown as {\n get?: (opts: globalThis.Record<string, unknown>) => Promise<{\n runCommand(params: globalThis.Record<string, unknown>): Promise<{\n stdout(): Promise<string>;\n }>;\n } | null>;\n }).get;\n if (typeof get !== \"function\")\n throw new Error(\"this vercel SDK version has no get capability\");\n const found = await get({ name: sandboxId, resume: false });\n if (!found)\n throw new Error(`vercel sandbox \"${sandboxId}\" not found; the in-sandbox ledger died with it`);\n const finished = await found.runCommand({\n cmd: \"sh\",\n args: [\"-c\", script],\n cwd: workdir,\n env: { GIT_DIR: DEFAULT_LEDGER_GIT_DIR, GIT_WORK_TREE: workdir, HOME: \"/tmp\" },\n });\n return await finished.stdout();\n }\n default:\n throw new Error(`replaying the ledger has no exec channel for provider \"${provider}\"`);\n }\n}\n/** docker 分支:dockerode exec 一条命令,多路复用流按 8 字节头逐帧剥离拼回文本。 */\nasync function execInDockerLedger(sandboxId: string, workdir: string, script: string): Promise<string> {\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n const container = new Docker().getContainer(sandboxId);\n const exec = await container.exec({\n Cmd: [\"sh\", \"-c\", script],\n AttachStdout: true,\n AttachStderr: true,\n Env: [`GIT_DIR=${DEFAULT_LEDGER_GIT_DIR}`, `GIT_WORK_TREE=${workdir}`, \"HOME=/tmp\"],\n });\n const stream = await exec.start({});\n return await new Promise<string>((resolvePromise, reject) => {\n const chunks: Buffer[] = [];\n stream.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n stream.on(\"end\", () => {\n // docker 多路复用帧:每帧 8 字节头(stream type + 长度),逐帧剥掉。\n const raw = Buffer.concat(chunks);\n let out = \"\";\n let offset = 0;\n while (offset + 8 <= raw.length) {\n const size = raw.readUInt32BE(offset + 4);\n out += raw.subarray(offset + 8, offset + 8 + size).toString(\"utf-8\");\n offset += 8 + size;\n }\n resolvePromise(out || raw.toString(\"utf-8\"));\n });\n stream.on(\"error\", reject);\n });\n}\n/**\n * 事后命令(`enter`/`history`/`diff`)在 CLI 层是否可对某 provider 名执行的静态守门——\n * 留存注册表只可能出现 `KEEPABLE_PROVIDERS` 三家之一;命中之外(手改注册表、跨版本遗留的\n * provider 名)如实报出「不是 niceeval sandbox provider」,不是逐条 `if (provider === …)`。\n * 返回 undefined 表示可执行;否则给出可直接展示给用户的原因。\n *\n * callback 自定义 case 不支持留存:`niceeval sandbox` 不加载用户模块,也没有可发现的\n * detached provider 实现可以在另一个进程中恢复或销毁资源组。\n */\nexport function detachedCapabilityGap(provider: string): string | undefined {\n if (KEEPABLE_PROVIDERS.has(provider))\n return undefined;\n return `\"${provider}\" is not a niceeval sandbox provider (expected one of: ${[...KEEPABLE_PROVIDERS].join(\", \")})`;\n}\n/**\n * 创建前组合校验入口:只有可发现的内置 KEEPABLE provider 路径。\n * Runner 合流后应优先调 `assertKeepAllowedForCase`;本函数保留给尚无 planned case 的旧路径。\n */\nexport function assertProviderKeepable(provider: string, isCustomCreate: boolean): void {\n if (isCustomCreate) {\n throw new Error(`--keep-sandbox is not supported with a defineSandbox custom provider (\"${provider}\"): ` +\n `the after-the-fact 'niceeval sandbox' commands never load project code, so a detached stop ` +\n `for user-defined sandboxes cannot be recovered safely. Use a built-in provider (docker / e2b / vercel), ` +\n `or drop --keep-sandbox.`);\n }\n if (!KEEPABLE_PROVIDERS.has(provider)) {\n throw new Error(`--keep-sandbox is not supported with the \"${provider}\" provider: ` +\n `expected one of: ${[...KEEPABLE_PROVIDERS].join(\", \")}. Drop --keep-sandbox.`);\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const __niceevalDynamicImport = (specifier) => import(specifier);
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.localSandbox = exports.vercelSandbox = exports.e2bSandbox = exports.dockerComposeSandbox = exports.SandboxProviderPlanningError = exports.CustomSandboxMaterializationError = void 0;
4
+ exports.vercelSandbox = exports.e2bSandbox = exports.dockerComposeSandbox = exports.SandboxProviderPlanningError = exports.CustomSandboxMaterializationError = void 0;
5
5
  exports.sandboxProviderPlan = sandboxProviderPlan;
6
6
  exports.sandboxProviderBindingOf = sandboxProviderBindingOf;
7
7
  exports.sandboxLayer = sandboxLayer;
@@ -35,8 +35,8 @@ const SANDBOX_PROVIDER_BINDINGS = new WeakMap();
35
35
  const SANDBOX_PROVIDER_PLAN = Symbol("niceeval.sandbox.provider-plan");
36
36
  // Runtime resource/privileged coverage changed without changing Dockerfile build bytes. Keep the
37
37
  // Dockerfile builder revision stable, but advance the provider-plan/fingerprint revision.
38
- const DOCKERFILE_PROVIDER_PLANNER_REVISION = "dockerfile-4";
39
- const DOCKER_IMAGE_PROVIDER_REVISION = "docker-image-3";
38
+ const DOCKERFILE_PROVIDER_PLANNER_REVISION = "dockerfile-5";
39
+ const DOCKER_IMAGE_PROVIDER_REVISION = "docker-image-4";
40
40
  class CustomSandboxMaterializationError extends effect_1.Data.TaggedError("CustomSandboxMaterializationError") {
41
41
  }
42
42
  exports.CustomSandboxMaterializationError = CustomSandboxMaterializationError;
@@ -389,8 +389,14 @@ function dockerAccess(value, path) {
389
389
  throw new TypeError(`${path}.mode must be "socket" or "dind"`);
390
390
  const isolation = nonEmptyString(value.isolation, `${path}.isolation`);
391
391
  if (isolation === "raw-privileged") {
392
- assertOnlyKeys(value, ["mode", "isolation"], path);
393
- return Object.freeze({ mode: "dind", isolation: "raw-privileged" });
392
+ assertOnlyKeys(value, ["mode", "isolation", "storageProfile"], path);
393
+ return Object.freeze({
394
+ mode: "dind",
395
+ isolation: "raw-privileged",
396
+ ...(value.storageProfile === undefined
397
+ ? {}
398
+ : { storageProfile: nonEmptyString(value.storageProfile, `${path}.storageProfile`) }),
399
+ });
394
400
  }
395
401
  if (isolation === "managed-rootless") {
396
402
  assertOnlyKeys(value, ["mode", "isolation", "profile"], path);
@@ -410,8 +416,9 @@ function dockerAccessConfiguration(value, legacyProfile, legacyPrivileged, path)
410
416
  }
411
417
  if (access.mode === "socket")
412
418
  return Object.freeze({ access, privileged: "disabled" });
413
- if (access.isolation === "raw-privileged")
414
- return Object.freeze({ access, privileged: "raw" });
419
+ if (access.isolation === "raw-privileged") {
420
+ return Object.freeze({ access, profile: access.storageProfile, privileged: "raw" });
421
+ }
415
422
  return Object.freeze({ access, profile: access.profile, privileged: "rootless" });
416
423
  }
417
424
  const profile = dockerProfileAlias(legacyProfile, path.replace(/dockerAccess$/, "profile"));
@@ -461,18 +468,19 @@ function managedDockerResources(value, path) {
461
468
  throw (0, errors_ts_1.dockerProfileError)({
462
469
  code: "sandbox.docker-profile-resources-required",
463
470
  path,
464
- message: "profile-bound Docker sandbox requires explicit CPU, memory, PID and readOnlyRootfs resources",
471
+ message: "managed Docker sandbox requires explicit CPU, memory, PID, dockerDataBytes and readOnlyRootfs resources",
465
472
  });
466
473
  }
467
474
  const resources = dockerResources(value, path);
468
475
  if (resources.cpus === undefined ||
469
476
  resources.memoryBytes === undefined ||
470
477
  resources.pidsLimit === undefined ||
478
+ resources.dockerDataBytes === undefined ||
471
479
  resources.readOnlyRootfs !== true) {
472
480
  throw (0, errors_ts_1.dockerProfileError)({
473
481
  code: "sandbox.docker-profile-resources-required",
474
482
  path,
475
- message: "profile-bound Docker sandbox requires explicit CPU, memory, PID and readOnlyRootfs: true resources",
483
+ message: "managed Docker sandbox requires explicit CPU, memory, PID, dockerDataBytes and readOnlyRootfs: true resources",
476
484
  });
477
485
  }
478
486
  return Object.freeze({
@@ -480,6 +488,7 @@ function managedDockerResources(value, path) {
480
488
  cpus: resources.cpus,
481
489
  memoryBytes: resources.memoryBytes,
482
490
  pidsLimit: resources.pidsLimit,
491
+ dockerDataBytes: resources.dockerDataBytes,
483
492
  readOnlyRootfs: true,
484
493
  });
485
494
  }
@@ -491,7 +500,32 @@ function dockerResourcesForProfile(profile, privileged, value, path) {
491
500
  message: 'privileged: "rootless" requires an explicit Docker profile alias',
492
501
  });
493
502
  }
494
- return profile === undefined ? dockerResources(value, path) : managedDockerResources(value, path);
503
+ const resources = dockerResources(value, path);
504
+ if (resources.dockerDataBytes !== undefined && privileged === "disabled") {
505
+ throw (0, errors_ts_1.dockerProfileError)({
506
+ code: "sandbox.docker-profile-required",
507
+ path: `${path}.dockerDataBytes`,
508
+ message: "dockerDataBytes is only available to profile-bound DinD",
509
+ });
510
+ }
511
+ if (privileged === "raw") {
512
+ if (resources.dockerDataBytes !== undefined && profile === undefined) {
513
+ throw (0, errors_ts_1.dockerProfileError)({
514
+ code: "sandbox.docker-profile-required",
515
+ path: `${path}.dockerDataBytes`,
516
+ message: "raw privileged DinD with dockerDataBytes requires dockerAccess.storageProfile",
517
+ });
518
+ }
519
+ if (profile !== undefined && resources.dockerDataBytes === undefined) {
520
+ throw (0, errors_ts_1.dockerProfileError)({
521
+ code: "sandbox.docker-profile-resources-required",
522
+ path,
523
+ message: "dockerAccess.storageProfile requires resources.dockerDataBytes",
524
+ });
525
+ }
526
+ return resources;
527
+ }
528
+ return profile === undefined ? resources : managedDockerResources(value, path);
495
529
  }
496
530
  function readinessIdentity(readiness) {
497
531
  return readiness === undefined
@@ -523,7 +557,7 @@ function dockerResources(value, path) {
523
557
  if (value === undefined)
524
558
  return Object.freeze({});
525
559
  assertRecord(value, path);
526
- assertOnlyKeys(value, ["cpus", "memoryBytes", "pidsLimit", "readOnlyRootfs", "tmpfs"], path);
560
+ assertOnlyKeys(value, ["cpus", "memoryBytes", "pidsLimit", "dockerDataBytes", "readOnlyRootfs", "tmpfs"], path);
527
561
  if (value.readOnlyRootfs !== undefined && typeof value.readOnlyRootfs !== "boolean") {
528
562
  throw new TypeError(`${path}.readOnlyRootfs must be a boolean`);
529
563
  }
@@ -534,6 +568,9 @@ function dockerResources(value, path) {
534
568
  if (!(0, node_path_1.isAbsolute)(mountPath) || (0, node_path_1.resolve)(mountPath) !== mountPath || mountPath === "/") {
535
569
  throw new TypeError(`${path}.tmpfs keys must be normalized absolute paths other than /`);
536
570
  }
571
+ if (mountPath === "/var/lib/docker") {
572
+ throw new TypeError(`${path}.tmpfs must not contain /var/lib/docker; use dockerDataBytes`);
573
+ }
537
574
  const entry = value.tmpfs[mountPath];
538
575
  assertRecord(entry, `${path}.tmpfs.${mountPath}`);
539
576
  assertOnlyKeys(entry, ["sizeBytes", "mode", "uid", "gid", "executable"], `${path}.tmpfs.${mountPath}`);
@@ -564,6 +601,9 @@ function dockerResources(value, path) {
564
601
  ...(value.pidsLimit === undefined
565
602
  ? {}
566
603
  : { pidsLimit: positiveSafeInteger(value.pidsLimit, `${path}.pidsLimit`) }),
604
+ ...(value.dockerDataBytes === undefined
605
+ ? {}
606
+ : { dockerDataBytes: positiveSafeInteger(value.dockerDataBytes, `${path}.dockerDataBytes`) }),
567
607
  ...(value.readOnlyRootfs === true ? { readOnlyRootfs: true } : {}),
568
608
  ...(Object.keys(tmpfs).length === 0 ? {} : { tmpfs: Object.freeze(tmpfs) }),
569
609
  });
@@ -839,16 +879,6 @@ const vercelProviderModule = Object.freeze({
839
879
  materialize: (plan, context) => effect_1.Effect.flatMap(loadProviderRuntime(), (runtime) => runtime.materializeVercelProviderPlan(plan, context)),
840
880
  collectBuildPreparation: noBuildPreparation,
841
881
  });
842
- const localProviderModule = Object.freeze({
843
- id: "niceeval/local-directory",
844
- capabilities: Object.freeze({
845
- retention: Object.freeze({ _tag: "DestroyOnly" }),
846
- reuse: Object.freeze({ _tag: "Unsupported", reason: "local sandbox state is shared with the host" }),
847
- sessionLimit: Object.freeze({ _tag: "Unlimited" }),
848
- }),
849
- materialize: (plan, context) => effect_1.Effect.flatMap(loadProviderRuntime(), (runtime) => runtime.materializeLocalProviderPlan(plan, context)),
850
- collectBuildPreparation: noBuildPreparation,
851
- });
852
882
  function customProviderModule(name, create) {
853
883
  return Object.freeze({
854
884
  id: `custom-provider:${name}`,
@@ -876,12 +906,27 @@ function customCaseProviderModule(materialize) {
876
906
  /** Built-in factory 集合只属于 provider 侧;测试通过 services 注入,不改全局状态。 */
877
907
  function createBuiltinSandboxFactories(services) {
878
908
  const dockerTarget = () => effect_1.Effect.flatMap(services.dockerBuildPlatform, targetFromDocker);
879
- const dockerTargetForProfile = (profile) => profile === undefined
909
+ const dockerTargetForProfile = (profile, privileged, resources) => profile === undefined
880
910
  ? effect_1.Effect.map(dockerTarget(), (target) => ({ target }))
881
911
  : effect_1.Effect.flatMap(effect_1.Effect.tryPromise({
882
912
  try: async () => (await __niceevalDynamicImport("./docker-profile/runtime.cjs")).attestDockerProfile(profile),
883
913
  catch: (cause) => providerPlanningError("sandbox.docker-profile-attestation-failed", "docker", cause instanceof Error ? cause.message : String(cause), [`Run niceeval docker profile doctor ${profile}.`]),
884
- }), (profileBinding) => effect_1.Effect.map(targetFromDocker(profileBinding.platform), (target) => ({ target, profileBinding })));
914
+ }), (profileBinding) => {
915
+ const rawStorage = profileBinding.profile.securityLevel === "raw-dind-storage/v1";
916
+ if ((privileged === "raw") !== rawStorage) {
917
+ return effect_1.Effect.fail(providerPlanningError("sandbox.docker-profile-attestation-failed", "docker", privileged === "raw"
918
+ ? `Docker storage profile ${profile} must declare raw-dind-storage/v1`
919
+ : `Managed Docker profile ${profile} must declare a managed rootless security level`, [`Run niceeval docker profile doctor ${profile}.`]));
920
+ }
921
+ const capacity = profileBinding.profile.capacity;
922
+ if ((resources.cpus ?? 0) > capacity.cpus ||
923
+ (resources.memoryBytes ?? 0) > capacity.memoryBytes ||
924
+ (resources.pidsLimit ?? 0) > capacity.pids ||
925
+ (resources.dockerDataBytes ?? 0) > capacity.ephemeralDiskBytes) {
926
+ return effect_1.Effect.fail(providerPlanningError("sandbox.docker-profile-attestation-failed", "docker", `Docker profile ${profile} does not have capacity for the declared container resource vector`, [`Reduce resources or select another Docker profile.`]));
927
+ }
928
+ return effect_1.Effect.map(targetFromDocker(profileBinding.platform), (target) => ({ target, profileBinding }));
929
+ });
885
930
  return Object.freeze({
886
931
  dockerComposeSandbox(options) {
887
932
  assertRecord(options, "dockerComposeSandbox options");
@@ -1066,7 +1111,7 @@ function createBuiltinSandboxFactories(services) {
1066
1111
  ...(targetStage === undefined ? [] : [{ name: "target", value: targetStage }]),
1067
1112
  ], contextLocator.redaction === undefined ? [] : [contextLocator.redaction]),
1068
1113
  leakGate: { _tag: "Dockerfile", context, dockerfile },
1069
- plan: ({ authorBaseDir }) => effect_1.Effect.flatMap(dockerTargetForProfile(profile), ({ target, profileBinding }) => effect_1.Effect.gen(function* () {
1114
+ plan: ({ authorBaseDir }) => effect_1.Effect.flatMap(dockerTargetForProfile(profile, privileged, resources), ({ target, profileBinding }) => effect_1.Effect.gen(function* () {
1070
1115
  const plannedContext = yield* effect_1.Effect.try({
1071
1116
  try: () => plannedLocation(context, authorBaseDir),
1072
1117
  catch: (cause) => providerPlanningError("sandbox.build-identity-unavailable", "docker", cause instanceof Error ? cause.message : String(cause), ["Make the Dockerfile and its filtered build context readable during physical planning."]),
@@ -1210,7 +1255,7 @@ function createBuiltinSandboxFactories(services) {
1210
1255
  privateFingerprintIdentity: identity,
1211
1256
  commandPlanLocator: configuredDockerImageLocator(image),
1212
1257
  leakGate: { _tag: "None" },
1213
- plan: () => effect_1.Effect.map(dockerTargetForProfile(profile), ({ target, profileBinding }) => {
1258
+ plan: () => effect_1.Effect.map(dockerTargetForProfile(profile, privileged, resources), ({ target, profileBinding }) => {
1214
1259
  return sandboxProviderPlan({
1215
1260
  provider: "docker",
1216
1261
  plannerRevision: DOCKER_IMAGE_PROVIDER_REVISION,
@@ -1360,73 +1405,19 @@ function createBuiltinSandboxFactories(services) {
1360
1405
  },
1361
1406
  });
1362
1407
  },
1363
- localSandbox(options = {}) {
1364
- assertRecord(options, "localSandbox options");
1365
- assertOnlyKeys(options, ["dir", "pathPrepend"], "localSandbox options");
1366
- const directory = options.dir === undefined
1367
- ? Object.freeze({ _tag: "AuthorBaseDir" })
1368
- : Object.freeze({
1369
- _tag: "Configured",
1370
- value: nonEmptyString(options.dir, "localSandbox options.dir"),
1371
- });
1372
- const pathPrepend = pathPrependList(options.pathPrepend, "localSandbox options.pathPrepend");
1373
- const identity = { provider: "local", kind: "directory", directory, ...pathPrependIdentityField(pathPrepend) };
1374
- return defineSandboxTemplate({
1375
- provider: "local",
1376
- kind: "directory",
1377
- publishableIdentity: { directory: { _tag: directory._tag }, ...pathPrependIdentityField(pathPrepend) },
1378
- privateFingerprintIdentity: identity,
1379
- commandPlanLocator: directory._tag === "AuthorBaseDir"
1380
- ? configuredLocator([{ name: "dir", value: "author-base-dir" }])
1381
- : configuredPathLocator(),
1382
- leakGate: { _tag: "None" },
1383
- plan: ({ authorBaseDir }) => {
1384
- const configured = directory._tag === "AuthorBaseDir"
1385
- ? authorBaseDir
1386
- : (0, node_path_1.resolve)(authorBaseDir, directory.value);
1387
- return effect_1.Effect.succeed(sandboxProviderPlan({
1388
- provider: "local",
1389
- plannerRevision: "local-directory-1",
1390
- caseKind: "prebuilt",
1391
- target: { platform: services.hostPlatform, source: "host" },
1392
- scheduling: exclusiveScheduling("local-worktree"),
1393
- module: localProviderModule,
1394
- build: providerBuildPlan({
1395
- caseKind: "prebuilt",
1396
- materializerRevision: "local-directory-1",
1397
- buildKeys: [],
1398
- caseParams: { directory: configured, ...pathPrependIdentityField(pathPrepend) },
1399
- }),
1400
- runtimePlan: Object.freeze({ directory: configured, pathPrepend }),
1401
- publishableIdentity: { directory: { _tag: directory._tag }, ...pathPrependIdentityField(pathPrepend) },
1402
- privateFingerprintIdentity: { directory: configured, ...pathPrependIdentityField(pathPrepend) },
1403
- }));
1404
- },
1405
- });
1406
- },
1407
1408
  });
1408
1409
  }
1409
- function hostPlatform() {
1410
- const arch = normalizeArch(process.arch);
1411
- return process.platform === "linux"
1412
- ? Object.freeze({ _tag: "Linux", os: "linux", arch, libc: "gnu" })
1413
- : process.platform === "darwin"
1414
- ? Object.freeze({ _tag: "Darwin", os: "darwin", arch })
1415
- : Object.freeze({ _tag: "Windows", os: "windows", arch });
1416
- }
1417
1410
  const LIVE_FACTORIES = createBuiltinSandboxFactories({
1418
1411
  dockerBuildPlatform: effect_1.Effect.tryPromise({
1419
1412
  try: () => (0, compose_ts_1.detectDockerBuildPlatform)(),
1420
1413
  catch: (cause) => providerPlanningError("sandbox.target-platform-unavailable", "docker", cause instanceof Error ? cause.message : String(cause), ["Make the Docker control plane available or set DOCKER_DEFAULT_PLATFORM."]),
1421
1414
  }),
1422
- hostPlatform: hostPlatform(),
1423
1415
  });
1424
1416
  exports.dockerComposeSandbox = LIVE_FACTORIES.dockerComposeSandbox;
1425
1417
  const dockerfileSourceLayer = LIVE_FACTORIES.dockerfileSourceLayer;
1426
1418
  const dockerImageSourceLayer = LIVE_FACTORIES.dockerImageSourceLayer;
1427
1419
  exports.e2bSandbox = LIVE_FACTORIES.e2bSandbox;
1428
1420
  exports.vercelSandbox = LIVE_FACTORIES.vercelSandbox;
1429
- exports.localSandbox = LIVE_FACTORIES.localSandbox;
1430
1421
  /**
1431
1422
  * 统一的单容器 Docker factory。Docker access用判别联合选择显式socket、raw DinD或managed DinD;
1432
1423
  * 宿主路径/profile只保存到私有runtime binding。本函数不连接Docker,provider接线由后续层负责。