niceeval 0.13.2 → 0.13.3

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 (494) hide show
  1. package/dist/agents/bub.cjs +4 -4
  2. package/dist/agents/bub.cjs.map +1 -1
  3. package/dist/agents/bub.d.cts +2 -2
  4. package/dist/agents/bub.d.mts +2 -2
  5. package/dist/agents/bub.d.ts +2 -2
  6. package/dist/agents/claude-code-native.cjs +213 -0
  7. package/dist/agents/claude-code-native.cjs.map +1 -0
  8. package/dist/agents/claude-code-native.d.cts +5 -0
  9. package/dist/agents/claude-code-native.d.mts +5 -0
  10. package/dist/agents/claude-code-native.d.ts +5 -0
  11. package/dist/agents/claude-code-native.js +6 -0
  12. package/dist/agents/claude-code-native.js.map +1 -0
  13. package/dist/agents/claude-code.cjs +26 -80
  14. package/dist/agents/claude-code.cjs.map +1 -1
  15. package/dist/agents/codex-app-server.cjs +314 -0
  16. package/dist/agents/codex-app-server.cjs.map +1 -0
  17. package/dist/agents/codex-app-server.d.cts +9 -0
  18. package/dist/agents/codex-app-server.d.mts +9 -0
  19. package/dist/agents/codex-app-server.d.ts +9 -0
  20. package/dist/agents/codex-app-server.js +6 -0
  21. package/dist/agents/codex-app-server.js.map +1 -0
  22. package/dist/agents/codex.cjs +19 -68
  23. package/dist/agents/codex.cjs.map +1 -1
  24. package/dist/agents/codex.d.cts +3 -3
  25. package/dist/agents/codex.d.mts +3 -3
  26. package/dist/agents/codex.d.ts +3 -3
  27. package/dist/agents/index.cjs +3 -1
  28. package/dist/agents/index.cjs.map +1 -1
  29. package/dist/agents/index.d.cts +1 -0
  30. package/dist/agents/index.d.mts +1 -0
  31. package/dist/agents/index.d.ts +1 -0
  32. package/dist/agents/index.js +84 -82
  33. package/dist/agents/index.mjs +84 -82
  34. package/dist/agents/managed-jsonl.cjs +207 -0
  35. package/dist/agents/managed-jsonl.cjs.map +1 -0
  36. package/dist/agents/managed-jsonl.d.cts +39 -0
  37. package/dist/agents/managed-jsonl.d.mts +39 -0
  38. package/dist/agents/managed-jsonl.d.ts +39 -0
  39. package/dist/agents/managed-jsonl.js +6 -0
  40. package/dist/agents/managed-jsonl.js.map +1 -0
  41. package/dist/agents/managed-process.cjs +31 -0
  42. package/dist/agents/managed-process.cjs.map +1 -0
  43. package/dist/agents/managed-process.d.cts +3 -0
  44. package/dist/agents/managed-process.d.mts +3 -0
  45. package/dist/agents/managed-process.d.ts +3 -0
  46. package/dist/agents/managed-process.js +6 -0
  47. package/dist/agents/managed-process.js.map +1 -0
  48. package/dist/agents/omp.cjs +18 -1
  49. package/dist/agents/omp.cjs.map +1 -1
  50. package/dist/agents/sdk-streams.cjs +11 -4
  51. package/dist/agents/sdk-streams.cjs.map +1 -1
  52. package/dist/agents/types.cjs.map +1 -1
  53. package/dist/agents/types.d.cts +8 -0
  54. package/dist/agents/types.d.mts +8 -0
  55. package/dist/agents/types.d.ts +8 -0
  56. package/dist/analysis/bindings.cjs +74 -19
  57. package/dist/analysis/bindings.cjs.map +1 -1
  58. package/dist/analysis/bindings.d.cts +534 -156
  59. package/dist/analysis/bindings.d.mts +534 -156
  60. package/dist/analysis/bindings.d.ts +534 -156
  61. package/dist/analysis/domain-view.cjs.map +1 -1
  62. package/dist/analysis/domain-view.d.cts +137 -8
  63. package/dist/analysis/domain-view.d.mts +137 -8
  64. package/dist/analysis/domain-view.d.ts +137 -8
  65. package/dist/analysis/index.cjs.map +1 -1
  66. package/dist/analysis/index.d.cts +1 -1
  67. package/dist/analysis/index.d.mts +1 -1
  68. package/dist/analysis/index.d.ts +1 -1
  69. package/dist/assertions/api.cjs.map +1 -1
  70. package/dist/assertions/api.d.cts +62 -0
  71. package/dist/assertions/api.d.mts +62 -0
  72. package/dist/assertions/api.d.ts +62 -0
  73. package/dist/assertions/judge.cjs +56 -5
  74. package/dist/assertions/judge.cjs.map +1 -1
  75. package/dist/assertions/match.cjs +66 -42
  76. package/dist/assertions/match.cjs.map +1 -1
  77. package/dist/assertions/match.d.cts +13 -0
  78. package/dist/assertions/match.d.mts +13 -0
  79. package/dist/assertions/match.d.ts +13 -0
  80. package/dist/assertions/record/attachment.cjs +104 -33
  81. package/dist/assertions/record/attachment.cjs.map +1 -1
  82. package/dist/assertions/record/attachment.d.cts +294 -57
  83. package/dist/assertions/record/attachment.d.mts +294 -57
  84. package/dist/assertions/record/attachment.d.ts +294 -57
  85. package/dist/assertions/record/codec.cjs +91 -17
  86. package/dist/assertions/record/codec.cjs.map +1 -1
  87. package/dist/assertions/record/codec.d.cts +280 -52
  88. package/dist/assertions/record/codec.d.mts +280 -52
  89. package/dist/assertions/record/codec.d.ts +280 -52
  90. package/dist/assertions/record/index.js +2 -0
  91. package/dist/assertions/record/model.cjs +16 -0
  92. package/dist/assertions/record/model.cjs.map +1 -1
  93. package/dist/assertions/record/model.d.cts +120 -13
  94. package/dist/assertions/record/model.d.mts +120 -13
  95. package/dist/assertions/record/model.d.ts +120 -13
  96. package/dist/assertions/record/model.js +2 -0
  97. package/dist/assertions/record/producer.cjs +70 -50
  98. package/dist/assertions/record/producer.cjs.map +1 -1
  99. package/dist/assertions/record/producer.d.cts +8 -7
  100. package/dist/assertions/record/producer.d.mts +8 -7
  101. package/dist/assertions/record/producer.d.ts +8 -7
  102. package/dist/assertions/runtime.cjs +49 -7
  103. package/dist/assertions/runtime.cjs.map +1 -1
  104. package/dist/cli/application.cjs +40 -0
  105. package/dist/cli/application.cjs.map +1 -0
  106. package/dist/cli/application.d.cts +129 -0
  107. package/dist/cli/application.d.mts +129 -0
  108. package/dist/cli/application.d.ts +129 -0
  109. package/dist/cli/application.js +24 -0
  110. package/dist/cli/application.js.map +1 -0
  111. package/dist/cli/bootstrap.cjs +10 -4
  112. package/dist/cli/bootstrap.cjs.map +1 -1
  113. package/dist/cli/node-application.cjs +123 -0
  114. package/dist/cli/node-application.cjs.map +1 -0
  115. package/dist/cli/node-application.d.cts +14 -0
  116. package/dist/cli/node-application.d.mts +14 -0
  117. package/dist/cli/node-application.d.ts +14 -0
  118. package/dist/cli/node-application.js +26 -0
  119. package/dist/cli/node-application.js.map +1 -0
  120. package/dist/cli/program.cjs +2807 -0
  121. package/dist/cli/program.cjs.map +1 -0
  122. package/dist/cli/program.d.cts +352 -0
  123. package/dist/cli/program.d.mts +352 -0
  124. package/dist/cli/program.d.ts +352 -0
  125. package/dist/cli/program.js +36 -0
  126. package/dist/cli/program.js.map +1 -0
  127. package/dist/cli/project-configuration.cjs +134 -0
  128. package/dist/cli/project-configuration.cjs.map +1 -0
  129. package/dist/cli/project-configuration.d.cts +64 -0
  130. package/dist/cli/project-configuration.d.mts +64 -0
  131. package/dist/cli/project-configuration.d.ts +64 -0
  132. package/dist/cli/project-configuration.js +22 -0
  133. package/dist/cli/project-configuration.js.map +1 -0
  134. package/dist/cli/record.cjs +20 -4
  135. package/dist/cli/record.cjs.map +1 -1
  136. package/dist/cli/record.d.cts +3 -3
  137. package/dist/cli/record.d.mts +3 -3
  138. package/dist/cli/record.d.ts +3 -3
  139. package/dist/cli.cjs +19 -3130
  140. package/dist/cli.cjs.map +1 -1
  141. package/dist/cli.d.cts +2 -148
  142. package/dist/cli.d.mts +2 -148
  143. package/dist/cli.d.ts +2 -148
  144. package/dist/cli.js +22 -30
  145. package/dist/context/assert-first.cjs +21 -15
  146. package/dist/context/assert-first.cjs.map +1 -1
  147. package/dist/context/assert-first.d.cts +1 -0
  148. package/dist/context/assert-first.d.mts +1 -0
  149. package/dist/context/assert-first.d.ts +1 -0
  150. package/dist/context/attempt-resources.cjs +13 -0
  151. package/dist/context/attempt-resources.cjs.map +1 -0
  152. package/dist/context/attempt-resources.d.cts +3 -0
  153. package/dist/context/attempt-resources.d.mts +3 -0
  154. package/dist/context/attempt-resources.d.ts +3 -0
  155. package/dist/context/attempt-resources.js +8 -0
  156. package/dist/context/attempt-resources.js.map +1 -0
  157. package/dist/context/session.cjs +4 -3
  158. package/dist/context/session.cjs.map +1 -1
  159. package/dist/context/session.d.cts +1 -0
  160. package/dist/context/session.d.mts +1 -0
  161. package/dist/context/session.d.ts +1 -0
  162. package/dist/eval/record/verdict.cjs +3 -2
  163. package/dist/eval/record/verdict.cjs.map +1 -1
  164. package/dist/experiment/host/index.cjs +1 -6
  165. package/dist/experiment/host/index.cjs.map +1 -1
  166. package/dist/experiment/host/index.d.cts +1 -0
  167. package/dist/experiment/host/index.d.mts +1 -0
  168. package/dist/experiment/host/index.d.ts +1 -0
  169. package/dist/load-config.cjs +13 -4
  170. package/dist/load-config.cjs.map +1 -1
  171. package/dist/load-config.d.cts +4 -3
  172. package/dist/load-config.d.mts +4 -3
  173. package/dist/load-config.d.ts +4 -3
  174. package/dist/load-config.js +4 -2
  175. package/dist/o11y/parsers/codex.cjs +29 -7
  176. package/dist/o11y/parsers/codex.cjs.map +1 -1
  177. package/dist/record/codec/core.d.cts +0 -2
  178. package/dist/record/codec/core.d.mts +0 -2
  179. package/dist/record/codec/core.d.ts +0 -2
  180. package/dist/record/codec/identifiers.cjs +2 -3
  181. package/dist/record/codec/identifiers.cjs.map +1 -1
  182. package/dist/record/codec/identifiers.d.cts +1 -2
  183. package/dist/record/codec/identifiers.d.mts +1 -2
  184. package/dist/record/codec/identifiers.d.ts +1 -2
  185. package/dist/record/codec/identifiers.js +10 -12
  186. package/dist/record/codec/index.js +42 -44
  187. package/dist/record/definition/attachment.cjs +1 -0
  188. package/dist/record/definition/attachment.cjs.map +1 -1
  189. package/dist/record/definition/attachment.d.cts +14 -0
  190. package/dist/record/definition/attachment.d.mts +14 -0
  191. package/dist/record/definition/attachment.d.ts +14 -0
  192. package/dist/record/family/assertions-v1.cjs +104 -0
  193. package/dist/record/family/assertions-v1.cjs.map +1 -0
  194. package/dist/record/family/assertions-v1.d.cts +2 -0
  195. package/dist/record/family/assertions-v1.d.mts +2 -0
  196. package/dist/record/family/assertions-v1.d.ts +2 -0
  197. package/dist/record/family/assertions-v1.js +6 -0
  198. package/dist/record/family/assertions-v1.js.map +1 -0
  199. package/dist/record/family/assertions.cjs +16 -5
  200. package/dist/record/family/assertions.cjs.map +1 -1
  201. package/dist/record/family/assertions.d.cts +510 -56
  202. package/dist/record/family/assertions.d.mts +510 -56
  203. package/dist/record/family/assertions.d.ts +510 -56
  204. package/dist/record/family/assertions.js +14 -10
  205. package/dist/record/family/catalog.cjs +17 -1
  206. package/dist/record/family/catalog.cjs.map +1 -1
  207. package/dist/record/family/catalog.d.cts +1292 -104
  208. package/dist/record/family/catalog.d.mts +1292 -104
  209. package/dist/record/family/catalog.d.ts +1292 -104
  210. package/dist/record/family/catalog.js +22 -20
  211. package/dist/record/family/index.js +144 -138
  212. package/dist/record/family/observability-v1.cjs +5 -0
  213. package/dist/record/family/observability-v1.cjs.map +1 -1
  214. package/dist/record/family/observability.cjs +1 -1
  215. package/dist/record/family/observability.cjs.map +1 -1
  216. package/dist/record/host/runtime.cjs +323 -173
  217. package/dist/record/host/runtime.cjs.map +1 -1
  218. package/dist/record/host/types.cjs.map +1 -1
  219. package/dist/record/host/types.d.cts +9 -7
  220. package/dist/record/host/types.d.mts +9 -7
  221. package/dist/record/host/types.d.ts +9 -7
  222. package/dist/record/model/core.cjs.map +1 -1
  223. package/dist/record/model/core.d.cts +1 -2
  224. package/dist/record/model/core.d.mts +1 -2
  225. package/dist/record/model/core.d.ts +1 -2
  226. package/dist/record/model/definition.cjs +1 -2
  227. package/dist/record/model/definition.cjs.map +1 -1
  228. package/dist/record/model/definition.d.cts +1 -7
  229. package/dist/record/model/definition.d.mts +1 -7
  230. package/dist/record/model/definition.d.ts +1 -7
  231. package/dist/record/model/identifiers.cjs +2 -3
  232. package/dist/record/model/identifiers.cjs.map +1 -1
  233. package/dist/record/model/identifiers.d.cts +1 -3
  234. package/dist/record/model/identifiers.d.mts +1 -3
  235. package/dist/record/model/identifiers.d.ts +1 -3
  236. package/dist/record/model/identifiers.js +36 -38
  237. package/dist/record/model/index.js +60 -62
  238. package/dist/record/platform/node.cjs +17 -7
  239. package/dist/record/platform/node.cjs.map +1 -1
  240. package/dist/record/platform/services.cjs.map +1 -1
  241. package/dist/record/platform/services.d.cts +8 -3
  242. package/dist/record/platform/services.d.mts +8 -3
  243. package/dist/record/platform/services.d.ts +8 -3
  244. package/dist/record/reader/format.cjs +16 -65
  245. package/dist/record/reader/format.cjs.map +1 -1
  246. package/dist/record/reader/format.d.cts +5 -9
  247. package/dist/record/reader/format.d.mts +5 -9
  248. package/dist/record/reader/format.d.ts +5 -9
  249. package/dist/record/reader/index.js +10 -8
  250. package/dist/record/reader/runtime.cjs +63 -32
  251. package/dist/record/reader/runtime.cjs.map +1 -1
  252. package/dist/record/reader/runtime.d.cts +40 -4
  253. package/dist/record/reader/runtime.d.mts +40 -4
  254. package/dist/record/reader/runtime.d.ts +40 -4
  255. package/dist/record/reader/runtime.js +6 -4
  256. package/dist/report/assets/enhance.js +5 -5
  257. package/dist/report/assets/styles.css +190 -24
  258. package/dist/report/built-in/result-components.cjs +8 -5
  259. package/dist/report/built-in/result-components.cjs.map +1 -1
  260. package/dist/report/built-in/standard.cjs +3 -0
  261. package/dist/report/built-in/standard.cjs.map +1 -1
  262. package/dist/report/built-in/standard.d.cts +2 -0
  263. package/dist/report/built-in/standard.d.mts +2 -0
  264. package/dist/report/built-in/standard.d.ts +2 -0
  265. package/dist/report/client-dist/app.js +53 -0
  266. package/dist/report/components/attempt-detail/compute.cjs +108 -231
  267. package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
  268. package/dist/report/components/attempt-detail/compute.d.cts +11 -45
  269. package/dist/report/components/attempt-detail/compute.d.mts +11 -45
  270. package/dist/report/components/attempt-detail/compute.d.ts +11 -45
  271. package/dist/report/components/attempt-detail/compute.js +2 -4
  272. package/dist/report/components/attempt-detail/content.cjs +4 -4
  273. package/dist/report/components/attempt-detail/content.cjs.map +1 -1
  274. package/dist/report/components/attempt-detail/validate.cjs +47 -4
  275. package/dist/report/components/attempt-detail/validate.cjs.map +1 -1
  276. package/dist/report/components/entity-lists/compute.cjs +9 -15
  277. package/dist/report/components/entity-lists/compute.cjs.map +1 -1
  278. package/dist/report/components/entity-lists/content.cjs +53 -40
  279. package/dist/report/components/entity-lists/content.cjs.map +1 -1
  280. package/dist/report/components/entity-lists/index.cjs +1 -3
  281. package/dist/report/components/entity-lists/index.cjs.map +1 -1
  282. package/dist/report/components/experiment-detail/compute.cjs +4 -6
  283. package/dist/report/components/experiment-detail/compute.cjs.map +1 -1
  284. package/dist/report/components/summaries/index.cjs +5 -1
  285. package/dist/report/components/summaries/index.cjs.map +1 -1
  286. package/dist/report/definition/cell.cjs +14 -7
  287. package/dist/report/definition/cell.cjs.map +1 -1
  288. package/dist/report/definition/cell.d.cts +4 -0
  289. package/dist/report/definition/cell.d.mts +4 -0
  290. package/dist/report/definition/cell.d.ts +4 -0
  291. package/dist/report/definition/primitives/assertion-evidence.cjs +96 -0
  292. package/dist/report/definition/primitives/assertion-evidence.cjs.map +1 -0
  293. package/dist/report/definition/primitives/assertion-evidence.d.cts +11 -0
  294. package/dist/report/definition/primitives/assertion-evidence.d.mts +11 -0
  295. package/dist/report/definition/primitives/assertion-evidence.d.ts +11 -0
  296. package/dist/report/definition/primitives/assertion-evidence.js +6 -0
  297. package/dist/report/definition/primitives/assertion-evidence.js.map +1 -0
  298. package/dist/report/definition/primitives/conversation.cjs +7 -0
  299. package/dist/report/definition/primitives/conversation.cjs.map +1 -1
  300. package/dist/report/definition/primitives/conversation.d.cts +2 -0
  301. package/dist/report/definition/primitives/conversation.d.mts +2 -0
  302. package/dist/report/definition/primitives/conversation.d.ts +2 -0
  303. package/dist/report/definition/primitives/turn-trace.cjs +53 -3
  304. package/dist/report/definition/primitives/turn-trace.cjs.map +1 -1
  305. package/dist/report/definition/primitives.cjs +14 -1
  306. package/dist/report/definition/primitives.cjs.map +1 -1
  307. package/dist/report/definition/report.cjs +16 -8
  308. package/dist/report/definition/report.cjs.map +1 -1
  309. package/dist/report/definition/report.d.cts +6 -0
  310. package/dist/report/definition/report.d.mts +6 -0
  311. package/dist/report/definition/report.d.ts +6 -0
  312. package/dist/report/definition/table-text.cjs +12 -3
  313. package/dist/report/definition/table-text.cjs.map +1 -1
  314. package/dist/report/definition/table-text.d.cts +6 -1
  315. package/dist/report/definition/table-text.d.mts +6 -1
  316. package/dist/report/definition/table-text.d.ts +6 -1
  317. package/dist/report/execution/model.cjs +6 -14
  318. package/dist/report/execution/model.cjs.map +1 -1
  319. package/dist/report/execution/model.d.cts +5 -10
  320. package/dist/report/execution/model.d.mts +5 -10
  321. package/dist/report/execution/model.d.ts +5 -10
  322. package/dist/report/execution/model.js +6 -6
  323. package/dist/report/execution/paths.cjs +0 -11
  324. package/dist/report/execution/paths.cjs.map +1 -1
  325. package/dist/report/execution/paths.d.cts +0 -1
  326. package/dist/report/execution/paths.d.mts +0 -1
  327. package/dist/report/execution/paths.d.ts +0 -1
  328. package/dist/report/execution/paths.js +6 -8
  329. package/dist/report/host/execute.cjs +13 -22
  330. package/dist/report/host/execute.cjs.map +1 -1
  331. package/dist/report/host/execute.d.cts +1 -4
  332. package/dist/report/host/execute.d.mts +1 -4
  333. package/dist/report/host/execute.d.ts +1 -4
  334. package/dist/report/host/from-record.cjs +3 -0
  335. package/dist/report/host/from-record.cjs.map +1 -1
  336. package/dist/report/host/from-record.d.cts +4 -1
  337. package/dist/report/host/from-record.d.mts +4 -1
  338. package/dist/report/host/from-record.d.ts +4 -1
  339. package/dist/report/host/site-assets.cjs +1 -2
  340. package/dist/report/host/site-assets.cjs.map +1 -1
  341. package/dist/report/host/site-assets.d.cts +0 -1
  342. package/dist/report/host/site-assets.d.mts +0 -1
  343. package/dist/report/host/site-assets.d.ts +0 -1
  344. package/dist/report/host/site-assets.js +2 -4
  345. package/dist/report/host/static.cjs +71 -346
  346. package/dist/report/host/static.cjs.map +1 -1
  347. package/dist/report/host/static.d.cts +1 -3
  348. package/dist/report/host/static.d.mts +1 -3
  349. package/dist/report/host/static.d.ts +1 -3
  350. package/dist/report/host/static.js +2 -2
  351. package/dist/report/host/view-session.cjs.map +1 -1
  352. package/dist/report/host/view-session.d.cts +1 -1
  353. package/dist/report/host/view-session.d.mts +1 -1
  354. package/dist/report/host/view-session.d.ts +1 -1
  355. package/dist/report/model/locale.cjs +1 -1
  356. package/dist/report/model/locale.cjs.map +1 -1
  357. package/dist/report/model/locale.d.cts +1 -1
  358. package/dist/report/model/locale.d.mts +1 -1
  359. package/dist/report/model/locale.d.ts +1 -1
  360. package/dist/report/model/pricing.cjs +2 -2
  361. package/dist/report/model/pricing.cjs.map +1 -1
  362. package/dist/report/react/enhance.js +5 -5
  363. package/dist/report/react/styles.css +190 -24
  364. package/dist/runner/adoption.cjs +4 -7
  365. package/dist/runner/adoption.cjs.map +1 -1
  366. package/dist/runner/attempt-resources.cjs +60 -0
  367. package/dist/runner/attempt-resources.cjs.map +1 -0
  368. package/dist/runner/attempt-resources.d.cts +13 -0
  369. package/dist/runner/attempt-resources.d.mts +13 -0
  370. package/dist/runner/attempt-resources.d.ts +13 -0
  371. package/dist/runner/attempt-resources.js +6 -0
  372. package/dist/runner/attempt-resources.js.map +1 -0
  373. package/dist/runner/attempt.cjs +37 -3
  374. package/dist/runner/attempt.cjs.map +1 -1
  375. package/dist/runner/feedback/failure.cjs +77 -2
  376. package/dist/runner/feedback/failure.cjs.map +1 -1
  377. package/dist/runner/feedback/failure.d.cts +2 -1
  378. package/dist/runner/feedback/failure.d.mts +2 -1
  379. package/dist/runner/feedback/failure.d.ts +2 -1
  380. package/dist/runner/project-current.cjs +2 -13
  381. package/dist/runner/project-current.cjs.map +1 -1
  382. package/dist/runner/project-current.d.cts +4 -2
  383. package/dist/runner/project-current.d.mts +4 -2
  384. package/dist/runner/project-current.d.ts +4 -2
  385. package/dist/runner/reporters/braintrust.cjs +7 -7
  386. package/dist/runner/reporters/braintrust.cjs.map +1 -1
  387. package/dist/runner/reuse-readback.cjs +3 -4
  388. package/dist/runner/reuse-readback.cjs.map +1 -1
  389. package/dist/runner/run.cjs +5 -2
  390. package/dist/runner/run.cjs.map +1 -1
  391. package/dist/sandbox/backend.cjs +32 -2
  392. package/dist/sandbox/backend.cjs.map +1 -1
  393. package/dist/sandbox/backend.d.cts +12 -1
  394. package/dist/sandbox/backend.d.mts +12 -1
  395. package/dist/sandbox/backend.d.ts +12 -1
  396. package/dist/sandbox/backend.js +28 -22
  397. package/dist/sandbox/docker.cjs +140 -0
  398. package/dist/sandbox/docker.cjs.map +1 -1
  399. package/dist/sandbox/docker.d.cts +3 -1
  400. package/dist/sandbox/docker.d.mts +3 -1
  401. package/dist/sandbox/docker.d.ts +3 -1
  402. package/dist/sandbox/e2b.cjs +42 -0
  403. package/dist/sandbox/e2b.cjs.map +1 -1
  404. package/dist/sandbox/e2b.d.cts +2 -0
  405. package/dist/sandbox/e2b.d.mts +2 -0
  406. package/dist/sandbox/e2b.d.ts +2 -0
  407. package/dist/sandbox/local.cjs +64 -0
  408. package/dist/sandbox/local.cjs.map +1 -1
  409. package/dist/sandbox/local.d.cts +3 -1
  410. package/dist/sandbox/local.d.mts +3 -1
  411. package/dist/sandbox/local.d.ts +3 -1
  412. package/dist/sandbox/managed-process.cjs +49 -0
  413. package/dist/sandbox/managed-process.cjs.map +1 -0
  414. package/dist/sandbox/managed-process.d.cts +11 -0
  415. package/dist/sandbox/managed-process.d.mts +11 -0
  416. package/dist/sandbox/managed-process.d.ts +11 -0
  417. package/dist/sandbox/managed-process.js +6 -0
  418. package/dist/sandbox/managed-process.js.map +1 -0
  419. package/dist/sandbox/types.cjs.map +1 -1
  420. package/dist/sandbox/types.d.cts +24 -0
  421. package/dist/sandbox/types.d.mts +24 -0
  422. package/dist/sandbox/types.d.ts +24 -0
  423. package/dist/sandbox/vercel.cjs +1 -0
  424. package/dist/sandbox/vercel.cjs.map +1 -1
  425. package/dist/sandbox/vercel.d.cts +1 -0
  426. package/dist/sandbox/vercel.d.mts +1 -0
  427. package/dist/sandbox/vercel.d.ts +1 -0
  428. package/dist/view/server.cjs +2 -37
  429. package/dist/view/server.cjs.map +1 -1
  430. package/dist/view/server.d.cts +0 -3
  431. package/dist/view/server.d.mts +0 -3
  432. package/dist/view/server.d.ts +0 -3
  433. package/docs-site/zh/reference/builtin-agents.mdx +7 -7
  434. package/docs-site/zh/reference/official-adapters.mdx +4 -4
  435. package/docs-site/zh/reference/report-components.mdx +2 -2
  436. package/docs-site/zh/tutorials/configuration.mdx +2 -2
  437. package/docs-site/zh/tutorials/deploy-report-site.mdx +24 -2
  438. package/docs-site/zh/tutorials/publish-report.mdx +4 -4
  439. package/docs-site/zh/tutorials/sandbox-agent.mdx +5 -5
  440. package/docs-site/zh/tutorials/theming.mdx +2 -2
  441. package/package.json +4 -6
  442. package/dist/record/migration/index.cjs +0 -5
  443. package/dist/record/migration/index.cjs.map +0 -1
  444. package/dist/record/migration/index.d.cts +0 -11
  445. package/dist/record/migration/index.d.mts +0 -11
  446. package/dist/record/migration/index.d.ts +0 -11
  447. package/dist/record/migration/index.js +0 -6
  448. package/dist/record/migration/index.js.map +0 -1
  449. package/dist/report/host/site-runtime.cjs +0 -92
  450. package/dist/report/host/site-runtime.cjs.map +0 -1
  451. package/dist/report/host/site-runtime.d.cts +0 -9
  452. package/dist/report/host/site-runtime.d.mts +0 -9
  453. package/dist/report/host/site-runtime.d.ts +0 -9
  454. package/dist/report/host/site-runtime.js +0 -10
  455. package/dist/report/host/site-runtime.js.map +0 -1
  456. package/dist/view/client-dist/app.css +0 -2
  457. package/dist/view/client-dist/app.js +0 -49
  458. package/dist/view/data.cjs +0 -3
  459. package/dist/view/data.cjs.map +0 -1
  460. package/dist/view/data.d.cts +0 -9
  461. package/dist/view/data.d.mts +0 -9
  462. package/dist/view/data.d.ts +0 -9
  463. package/dist/view/data.js +0 -4
  464. package/dist/view/data.js.map +0 -1
  465. package/dist/view/index.cjs +0 -24
  466. package/dist/view/index.cjs.map +0 -1
  467. package/dist/view/index.d.cts +0 -9
  468. package/dist/view/index.d.mts +0 -9
  469. package/dist/view/index.d.ts +0 -9
  470. package/dist/view/index.js +0 -28
  471. package/dist/view/index.js.map +0 -1
  472. package/dist/view/report-view-cache.cjs +0 -200
  473. package/dist/view/report-view-cache.cjs.map +0 -1
  474. package/dist/view/report-view-cache.d.cts +0 -67
  475. package/dist/view/report-view-cache.d.mts +0 -67
  476. package/dist/view/report-view-cache.d.ts +0 -67
  477. package/dist/view/report-view-cache.js +0 -8
  478. package/dist/view/report-view-cache.js.map +0 -1
  479. package/dist/view/shared/types.cjs +0 -3
  480. package/dist/view/shared/types.cjs.map +0 -1
  481. package/dist/view/shared/types.d.cts +0 -51
  482. package/dist/view/shared/types.d.mts +0 -51
  483. package/dist/view/shared/types.d.ts +0 -51
  484. package/dist/view/shared/types.js +0 -4
  485. package/dist/view/shared/types.js.map +0 -1
  486. package/dist/view/site.cjs +0 -32
  487. package/dist/view/site.cjs.map +0 -1
  488. package/dist/view/site.d.cts +0 -24
  489. package/dist/view/site.d.mts +0 -24
  490. package/dist/view/site.d.ts +0 -24
  491. package/dist/view/site.js +0 -8
  492. package/dist/view/site.js.map +0 -1
  493. package/dist/view/styles.css +0 -170
  494. package/dist/view/template.html +0 -17
@@ -1,5 +1,5 @@
1
1
  import Docker from "dockerode";
2
- import type { CommandResult, CommandOptions, SandboxReuseCapability, SuccessfulCommandResult } from "../types.mjs";
2
+ import type { CommandResult, CommandOptions, ManagedProcess, ManagedProcessStart, SandboxReuseCapability, SuccessfulCommandResult } from "../types.mjs";
3
3
  import { type SandboxProvisionErrorKind } from "./errors.mjs";
4
4
  import { type RunIdentity } from "./run-identity.mjs";
5
5
  import { type SandboxProviderBackend } from "./backend.mjs";
@@ -156,7 +156,9 @@ export declare class DockerSandbox implements SandboxProviderBackend, SandboxReu
156
156
  reason: string;
157
157
  }>>;
158
158
  setCommandDeadline: import("./backend.mjs").SandboxBackendSupport<(deadlineAt?: number) => void>;
159
+ managedProcess: import("./backend.mjs").SandboxBackendSupport<(input: ManagedProcessStart) => Promise<ManagedProcess>>;
159
160
  };
161
+ private startManagedProcess;
160
162
  constructor(options?: DockerSandboxOptions);
161
163
  /** 受管 PATH:`pathPrepend` 按声明顺序前置到 npm 全局 bin + 系统默认路径。 */
162
164
  private managedPath;
@@ -1,5 +1,5 @@
1
1
  import Docker from "dockerode";
2
- import type { CommandResult, CommandOptions, SandboxReuseCapability, SuccessfulCommandResult } from "../types.js";
2
+ import type { CommandResult, CommandOptions, ManagedProcess, ManagedProcessStart, SandboxReuseCapability, SuccessfulCommandResult } from "../types.js";
3
3
  import { type SandboxProvisionErrorKind } from "./errors.js";
4
4
  import { type RunIdentity } from "./run-identity.js";
5
5
  import { type SandboxProviderBackend } from "./backend.js";
@@ -156,7 +156,9 @@ export declare class DockerSandbox implements SandboxProviderBackend, SandboxReu
156
156
  reason: string;
157
157
  }>>;
158
158
  setCommandDeadline: import("./backend.js").SandboxBackendSupport<(deadlineAt?: number) => void>;
159
+ managedProcess: import("./backend.js").SandboxBackendSupport<(input: ManagedProcessStart) => Promise<ManagedProcess>>;
159
160
  };
161
+ private startManagedProcess;
160
162
  constructor(options?: DockerSandboxOptions);
161
163
  /** 受管 PATH:`pathPrepend` 按声明顺序前置到 npm 全局 bin + 系统默认路径。 */
162
164
  private managedPath;
@@ -24,6 +24,7 @@ const paths_ts_1 = require("./paths.cjs");
24
24
  const run_identity_ts_1 = require("./run-identity.cjs");
25
25
  const deadline_ts_1 = require("./deadline.cjs");
26
26
  const operations_ts_1 = require("./operations.cjs");
27
+ const managed_process_ts_1 = require("./managed-process.cjs");
27
28
  const backend_ts_1 = require("./backend.cjs");
28
29
  // e2b 默认用户 "user",home 在 /home/user;工作区放其下。
29
30
  const E2B_WORKDIR = "/home/user/workspace";
@@ -321,7 +322,48 @@ class E2BSandbox {
321
322
  suspend: (0, backend_ts_1.supportedBackendCapability)(() => this.suspend()),
322
323
  ensureLifetime: (0, backend_ts_1.supportedBackendCapability)((minRemainingMs) => this.ensureLifetime(minRemainingMs)),
323
324
  setCommandDeadline: (0, backend_ts_1.supportedBackendCapability)((deadlineAt) => this.setCommandDeadline(deadlineAt)),
325
+ managedProcess: (0, backend_ts_1.unsupportedBackendCapabilityBecause)("E2B managed processes are not enabled until the provider boundary has a public installed-candidate E2E owner"),
324
326
  };
327
+ async startManagedProcess(input) {
328
+ const output = new managed_process_ts_1.ManagedProcessOutput();
329
+ const command = input.argv.map(shell_ts_1.shellQuote).join(" ");
330
+ const script = this.pathPrepend.length === 0
331
+ ? `exec ${command}`
332
+ : `PATH=${(0, shell_ts_1.shellQuote)(this.pathPrepend.join(":"))}:"$PATH"\nexec ${command}`;
333
+ const handle = await this.sbx.commands.run(script, {
334
+ background: true,
335
+ stdin: true,
336
+ cwd: (0, paths_ts_1.resolveSandboxPath)(this.workdir, input.cwd),
337
+ envs: input.env === undefined ? undefined : { ...input.env },
338
+ ...(this.userOverride === undefined ? {} : { user: this.userOverride }),
339
+ onStdout: (chunk) => output.push({ _tag: "Stdout", bytes: new TextEncoder().encode(chunk) }),
340
+ onStderr: (chunk) => output.push({ _tag: "Stderr", bytes: new TextEncoder().encode(chunk) }),
341
+ });
342
+ const exit = handle.wait().then((result) => ({ exitCode: result.exitCode }), (error) => {
343
+ if (error instanceof e2b_1.CommandExitError)
344
+ return { exitCode: error.exitCode };
345
+ throw error;
346
+ }).finally(() => output.end());
347
+ let closeReceipt;
348
+ let terminateReceipt;
349
+ let stdinState = "open";
350
+ return {
351
+ output,
352
+ writeStdin: (bytes) => stdinState === "open" ? handle.sendStdin(bytes) : Promise.reject(new Error("managed process stdin is closed")),
353
+ closeStdin: () => closeReceipt ??= (async () => {
354
+ stdinState = "closing";
355
+ await handle.closeStdin();
356
+ stdinState = "closed";
357
+ })(),
358
+ wait: () => exit,
359
+ terminate: () => terminateReceipt ??= (async () => {
360
+ stdinState = "closing";
361
+ await handle.kill();
362
+ await exit.catch(() => undefined);
363
+ stdinState = "closed";
364
+ })(),
365
+ };
366
+ }
325
367
  constructor(sbx, id, commandTimeoutMs, lifetime, userOverride, pathPrepend = [], deadlineAt) {
326
368
  this.sbx = sbx;
327
369
  this.sandboxId = id;
@@ -1 +1 @@
1
- {"version":3,"file":"e2b.js","sourceRoot":"","sources":["e2b.ts"],"names":[],"mappings":";;;AAiSA,gDAkBC;AA+BD,wDAMC;AAxVD,wDAAwD;AACxD,qEAAqE;AACrE,EAAE;AACF,+DAA+D;AAC/D,2DAA2D;AAC3D,kEAAkE;AAClE,6BAAgG;AAChG,mCAAuC;AACvC,6CAAyC;AACzC,+CAAqC;AACrC,+CAA8D;AAC9D,yCAAoC;AAEpC,2CAAyH;AACzH,2CAAqD;AACrD,mEAAkE;AAClE,qDAA8E;AAC9E,yCAAwC;AACxC,yCAAkE;AAClE,uDAA6E;AAC7E,+CAAyE;AACzE,mDAA0D;AAC1D,6CAAqH;AACrH,4CAA4C;AAC5C,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAU3C,gHAAgH;AAChH,SAAS,mBAAmB,CAGzB,QAAkB;IACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAGtE,CAAC;IACF,OAAO,eAAM,CAAC,UAAU,CAAC,eAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAuC,CAAC;AAC5F,CAAC;AACD;;;GAGG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACnC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;SACzD,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AACD,8CAA8C;AAC9C,SAAS,uBAAuB,CAAC,OAAe,EAAE,MAAc;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,OAAO,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAE,CAAC;QACvE,aAAa,IAAI,CAAC,CAAC;IACvB,IAAI,aAAa,KAAK,OAAO,CAAC,MAAM;QAChC,OAAO,IAAI,CAAC;IAChB,IAAI,aAAa,KAAK,CAAC;QACnB,OAAO,KAAK,CAAC;IACjB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAClF,CAAC;AACD;;;;;GAKG;AACH,MAAM,oBAAoB;IACb,MAAM,CAAS;IACf,UAAU,CAAkB;IACpB,MAAM,CAAS;IACf,MAAM,CAAS;IACf,MAAM,GAAsE;QACzF,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1E,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;KAC7E,CAAC;IACe,SAAS,CAA+F;IACxG,iBAAiB,CAA6B;IAC9C,gBAAgB,CAAyB;IAC1D,YAAY,MAAc,EAAE,IAAmD;QAC3E,MAAM,EAAE,GAAG,IAAA,wBAAU,GAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,0BAA0B,EAAE,QAAQ,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,0BAA0B,EAAE,QAAQ,CAAC;QACnD,IAAI,CAAC,SAAS,GAAG;YACb,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC;QACF,IAAI,iBAA8C,CAAC;QACnD,IAAI,gBAAyC,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtD,iBAAiB,GAAG,OAAO,CAAC;YAC5B,gBAAgB,GAAG,MAAM,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,oEAAoE;QACpE,oEAAoE;QACpE,iDAAiD;QACjD,MAAM,aAAa,GAAG,IAAA,qBAAU,EAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,MAAM,aAAa,GAAG,IAAA,qBAAU,EAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,GAAG;YACV,GAAG;YACH,MAAM;YACN,KAAK;YACL,+BAA+B;YAC/B,+CAA+C;YAC/C,iCAAiC;YACjC,MAAM;YACN,kCAAkC;YAClC,IAAI;YACJ,+CAA+C,aAAa,GAAG;YAC/D,+CAA+C,aAAa,GAAG;YAC/D,wHAAwH;YACxH,4HAA4H;YAC5H,uCAAuC;SAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACQ,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAiB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjF,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAiB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1F,MAAM,CAAC,QAAgB;QACnB,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;YACjC,QAAQ;SACX,CAAC;IACN,CAAC;IACD,mDAAmD;IACnD,KAAK,CAAC,MAAM;QACR,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAU,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC9B,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAI,CAAC,QAAQ,EAAE,QAAQ,CAAW;aAC1C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;aAC5D,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC;QACtF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,+DAA+D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzI,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS;YACtB,MAAM,QAAQ,CAAC;QACnB,MAAM,OAAO,GAAI,CAAC,QAAQ,EAAE,QAAQ,CAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,kDAAkD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,SAAS,GAAI,CAAC,QAAQ,EAAE,QAAQ,CAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,sDAAsD,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;IACL,CAAC;IACO,KAAK,CAAC,OAAO,CAAC,OAAgC,EAAE,KAAa;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,0DAA0D;QAC1D,IAAI,KAAK,CAAC,QAAQ;YACd,OAAO;QACX,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACf,kDAAkD;oBAClD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC9E,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;wBACjB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;wBAChD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBAChD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBACnC,CAAC;oBACD,OAAO;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAChD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;YAC/B,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACjB,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;oBACnF,wDAAwD;oBACxD,4CAA4C;oBAC5C,0BAA0B;oBAC1B,KAAK,CAAC,oBAAoB,KAAK,eAAe,CAAC;oBAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC5F,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC9D,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;oBAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAClC,SAAS;gBACb,CAAC;gBACD,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;gBACzC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACtB,qDAAqD;gBACrD,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;gBACnB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,OAAO;YACX,CAAC;YACD,IAAI,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;gBAC7C,OAAO;YACX,gDAAgD;YAChD,uDAAuD;YACvD,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACxB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;YAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IACO,KAAK,CAAC,IAAI,CAAC,OAAgC,EAAE,KAAa;QAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,OAAO;QACX,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QACrC,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACO,aAAa;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/C,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;YACpD,OAAO;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAChC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IACO,gBAAgB;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/C,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,UAAU;YACjF,OAAO,SAAS,CAAC;QACrB,OAAO,IAAI,KAAK,CAAC,iEAAiE,UAAU,YAAY,UAAU,EAAE,CAAC,CAAC;IAC1H,CAAC;CACJ;AACD,wFAAwF;AACxF,4DAA4D;AAC5D,2DAA2D;AAC3D,kDAAkD;AAClD,yDAAyD;AACzD,MAAM,2BAA2B,GAAG,CAAC,CAAC;AACtC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAgC1C;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CAAC,KAAa;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACvC,iEAAiE;IACjE,sEAAsE;IACtE,mBAAmB;IACnB,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7G,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAC3D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACD,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,CAAC,EAAE,CAAC;gBACP,IAAI,CAAC,CAAC,CAAC,YAAY,mBAAa,CAAC;oBAC7B,MAAM,CAAC,CAAC;YAChB,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAGD;;;;;;;;GAQG;AACH,SAAS,6BAA6B,CAAC,SAAgC;IACnE,MAAM,OAAO,GAAG,CAAC,CAAS,EAAgD,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC;QAC3F,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE;QAChC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;KAC1B,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACpB,OAAO,eAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,eAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAA,YAAC,EAAC,2BAA2B,EAAE,EAAE,IAAI,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC,CAAC,EAAE,eAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,IAAA,0CAA8B,EAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,2BAA2B,GAAG,CAAC,IAAI,CAAC,IAAA,qCAAyB,EAAC,IAAI,CAAC;YACxE,OAAO,eAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,cAAK,CAAC,KAAK,CAAC,6BAA6B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC;AACD,KAAK,UAAU,uBAAuB,CAAC,SAAgC;IACnE,OAAO,eAAM,CAAC,UAAU,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAC,CAAC;AACvE,CAAC;AACD,SAAgB,sBAAsB,CAAC,CAAU;IAC7C,yCAAyC;IACzC,gEAAgE;IAChE,IAAI,CAAC,YAAY,oBAAc;QAC3B,OAAO,YAAY,CAAC;IACxB,OAAO,IAAA,0CAA8B,EAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AACD,MAAa,UAAU;IACV,OAAO,GAAG,WAAW,CAAC;IACtB,QAAQ,GAAG,IAAI,CAAC;IACjB,GAAG,CAAgB;IACnB,gBAAgB,CAAU;IAClC,8FAA8F;IACtF,UAAU,CAAiB;IAC3B,OAAO,GAAG,KAAK,CAAC;IACxB,qCAAqC;IAC7B,QAAQ,CAAqB;IACrC,mDAAmD;IAClC,YAAY,CAAU;IACvC,sDAAsD;IACrC,WAAW,CAAoB;IACvC,SAAS,CAAS;IACnB,UAAU,CAAU;IACnB,YAAY,GAAG;QACpB,YAAY,EAAE,IAAA,uCAA0B,EAAC,IAAa,CAAC;QACvD,SAAS,EAAE,yCAA4B;QACvC,OAAO,EAAE,IAAA,uCAA0B,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACzD,cAAc,EAAE,IAAA,uCAA0B,EAAC,CAAC,cAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC3G,kBAAkB,EAAE,IAAA,uCAA0B,EAAC,CAAC,UAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;KAC/G,CAAC;IACF,YAAoB,GAAkB,EAAE,EAAU,EAAE,gBAAoC,EAAE,QAA4B,EAAE,YAAgC,EAAE,cAAiC,EAAE,EAAE,UAAmB;QAC9M,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IACD,2DAA2D;IAC3D,kBAAkB,CAAC,UAAmB;QAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IACD;;;;;;;OAOG;IACH,KAAK,CAAC,cAAc,CAAC,cAAsB;QAOvC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC3C,OAAO;gBACH,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,6GAA6G;aACxH,CAAC;QACN,CAAC;QACD,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxF,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;YACnC,IAAI,MAAM,IAAI,cAAc;gBACxB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACnF,+CAA+C;YAC/C,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,OAAO,KAAK,IAAI,cAAc;gBAC1B,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE;gBACxE,CAAC,CAAC;oBACE,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,yCAAyC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,2BAA2B,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,0BAA0B,GAAG;wBAChL,cAAc,IAAI,CAAC,QAAQ,CAAC,YAAY,8BAA8B,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG;iBACjH,CAAC;QACV,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kDAAkD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACnG,CAAC;IACL,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAA6B;QAC7C,+DAA+D;QAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC;QACtC,2CAA2C;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QACvC,mEAAmE;QACnE,sEAAsE;QACtE,oDAAoD;QACpD,MAAM,QAAQ,GAAsC;YAChD,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,0BAA0B,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAA,wCAAsB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC;QACF,iEAAiE;QACjE,mEAAmE;QACnE,YAAY;QACZ,MAAM,OAAO,GAAG;YACZ,MAAM;YACN,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,CAAC;QACX,sCAAsC;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC;gBACD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpH,CAAC;YACD,OAAO,CAAC,EAAE,CAAC;gBACP,qEAAqE;gBACrE,iDAAiD;gBACjD,qDAAqD;gBACrD,4BAA4B;gBAC5B,4CAA4C;gBAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,iCAAiC,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3H,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,0BAA0B,GAAG;wBAChH,cAAc,IAAI,CAAC,QAAQ,CAAC,YAAY,wBAAwB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;wBAC9G,4GAA4G;wBAC5G,yDAAyD,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjF,CAAC;gBACD,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;QACL,4DAA4D;QAC5D,+CAA+C;QAC/C,oEAAoE;QACpE,IAAI,CAAC;YACD,+CAA+C;YAC/C,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;YAClD,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACnI,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,OAA0B,EAAE,EAAE,OAAuB,EAAE;QACjF,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,OAAuB,EAAE;QACpD,oEAAoE;QACpE,6CAA6C;QAC7C,6CAA6C;QAC7C,MAAM,KAAK,GAAG,IAAA,0BAAY,EAAC,IAAI,EAAE,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3G,iEAAiE;QACjE,gDAAgD;QAChD,+DAA+D;QAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAC9C,CAAC,CAAC,QAAQ,IAAA,qBAAU,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,aAAa,MAAM,EAAE;YACrE,CAAC,CAAC,MAAM,CAAC;QACb,MAAM,UAAU,GAAG,IAAI,oBAAoB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAClE,kGAAkG;QAClG,kGAAkG;QAClG,6DAA6D;QAC7D,MAAM,iBAAiB,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,mBAA4B,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,kBAA2B,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3L,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,kBAAkB,GAAY,IAAI,YAAY,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;QAC5F,IAAI,eAA0C,CAAC;QAC/C,IAAI,YAGmB,CAAC;QACxB,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS;YACrC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,OAAO,CAGV,CAAC,OAAO,EAAE,EAAE;gBACX,YAAY,GAAG,OAAO,CAAC;YAC3B,CAAC,CAAC,CAAC;QACP,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS;YAChC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,GAAG,EAAE;gBACH,IAAI,OAAO;oBACP,OAAO;gBACX,2FAA2F;gBAC3F,uFAAuF;gBACvF,OAAO,GAAG,IAAI,CAAC;gBACf,kBAAkB,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,YAAY,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;gBAChG,eAAe,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClC,qFAAqF;gBACrF,mFAAmF;gBACnF,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAC5K,CAAC,CAAC;QACN,MAAM,cAAc,GAAG,KAAK,IAAmB,EAAE;YAC7C,IAAI,CAAC,OAAO;gBACR,OAAO;YACX,MAAM,eAAe,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,kBAAkB,CAAC;QAC7B,CAAC,CAAC;QACF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,0FAA0F;YAC1F,IAAI,MAAM,CAAC,OAAO;gBACd,OAAQ,EAAE,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACD,MAAM,cAAc,GAAG;gBACnB,GAAG,EAAE,IAAA,6BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC;gBAC/C,IAAI,EAAE,IAAI,CAAC,GAAG;gBACd,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY;gBACpC,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,UAAU,EAAE,IAAa;aAC5B,CAAC;YACF,MAAM,cAAc,EAAE,CAAC;YACvB,6FAA6F;YAC7F,+EAA+E;YAC/E,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAsB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,cAAuB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAClN,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC;gBAC3C,mBAAmB;gBACnB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1C,CAAC,CAAC;YACH,MAAM,cAAc,EAAE,CAAC;YACvB,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS;gBAC/B,MAAM,YAAY,CAAC,MAAM,CAAC;YAC9B,IAAI,YAAY,CAAC,IAAI,KAAK,cAAc;gBACpC,MAAM,YAAY,CAAC,KAAK,CAAC;YAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;YACnC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAyB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,iBAA0B,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvK,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;gBACtC,iBAAiB;gBACjB,aAAa;gBACb,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1C,CAAC,CAAC;YACH,MAAM,cAAc,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACvC,yEAAyE;gBACzE,6CAA6C;gBAC7C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1B,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC5E,MAAM,OAAO,CAAC,KAAK,CAAC;YACxB,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;gBAC1B,MAAM,OAAO,CAAC,MAAM,CAAC;YACzB,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,cAAc,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,IAAI,OAAO,EAAE,CAAC;gBACV,MAAM,eAAe,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC9C,MAAM,kBAAkB,CAAC;YAC7B,CAAC;YACD,oEAAoE;YACpE,sEAAsE;YACtE,IAAI,CAAC,YAAY,sBAAgB,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACD,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC9B,CAAC;gBACD,OAAO,aAAa,EAAE,CAAC;oBACnB,IAAI,OAAO,EAAE,CAAC;wBACV,MAAM,eAAe,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;wBAC9C,MAAM,kBAAkB,CAAC;oBAC7B,CAAC;oBACD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpB,MAAM,aAAa,CAAC;gBACxB,CAAC;gBACD,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;YACD,kDAAkD;YAClD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,kDAAkD;gBAClD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,IAAI,wCAA0B,CAAC,+BAA+B,KAAK,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9H,CAAC;YACD,8FAA8F;YAC9F,8FAA8F;YAC9F,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,CAAC;QACZ,CAAC;gBACO,CAAC;YACL,IAAI,OAAO,KAAK,SAAS;gBACrB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IACO,GAAG,CAAC,IAAY;QACpB,OAAO,IAAA,6BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,GAAW,EAAE,OAA0B,EAAE,EAAE,OAAuB,EAAE;QACxF,OAAO,IAAA,uCAAuB,EAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACjG,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,OAAuB,EAAE;QAC3D,OAAO,IAAA,uCAAuB,EAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5F,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,IAAY;QACzB,IAAI,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACX,mCAAmC;YACnC,IAAI,IAAA,kCAAsB,EAAC,KAAK,CAAC,KAAK,SAAS;gBAC3C,MAAM,KAAK,CAAC;YAChB,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IACD,gEAAgE;IAChE,uDAAuD;IAC/C,KAAK,CAAC,mBAAmB,CAAC,KAAoC,EAAE,SAAkB;QACtF,MAAM,IAAI,GAAG,IAAA,6BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,IAAA,6BAAkB,EAAC,IAAI,EAAE,IAAI,CAAC;YACpC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC;SAC/B,CAAC,CAAC,CAAC;QACJ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YACpB,OAAO;QACX,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,OAAe;QACzC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,OAAmB;QAC9C,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,MAAoB,EAAE,UAAkB;QACrD,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,IAAA,mBAAQ,EAAC,IAAA,2BAAgB,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,SAAuB,EAAE,SAAkB,EAAE,OAE/D,EAAE;QACF,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,IAAA,kCAAiB,EAAC,IAAA,2BAAgB,EAAC,SAAS,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5H,CAAC;IACD;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,MAAoB;QACvD,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,IAAA,gBAAK,EAAC,IAAA,mBAAO,EAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,IAAA,oBAAS,EAAC,WAAW,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,SAAuB,EAAE,OAEhE,EAAE;QACF,MAAM,SAAS,GAAG,IAAA,6BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,IAAA,+CAAuB,EAAC;YAC1B,QAAQ,EAAE,IAAA,2BAAgB,EAAC,SAAS,EAAE,SAAS,CAAC;YAChD,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;YACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YAC/D,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;SAClE,CAAC,CAAC;IACP,CAAC;IACD,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;IACO,MAAM;QACV,IAAI,IAAI,CAAC,OAAO;YACZ,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,IAAI,OAAuB,CAAC;QAC5B,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO;gBAC3B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QACpC,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE;YAClB,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO;gBAC3B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAChC,MAAM,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC1B,OAAO,OAAO,CAAC;IACnB,CAAC;IACD;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACJ;AA1XD,gCA0XC;AACD,iGAAiG;AACjG,SAAS,aAAa,CAAC,KAAiB;IACpC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAgB,CAAC;AACpG,CAAC;AACD,gEAAgE;AAChE,SAAS,cAAc,CAAC,CAAU;IAC9B,IAAI,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,OAAO,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACvE,CAAC","sourcesContent":["// E2B 沙箱 provider:用 e2b SDK 把 E2B microVM 当隔离工作区跑 eval。\n// 契约对齐 ../types.ts 的 Sandbox 接口,与 DockerSandbox / VercelSandbox 可互换。\n//\n// 鉴权:E2B_API_KEY(team 级,e2b CLI `e2b auth login` 后也写在 ~/.e2b)。\n// 模板:opts.template 选 e2b 模板名/ID;省略用 e2b 默认 \"base\"。预制模板(烘焙好\n// codex/claude-code/bub 的 \"niceeval-agents\")见 sandbox/e2b/。\nimport { Sandbox as E2BSdkSandbox, CommandExitError, NotFoundError, RateLimitError } from \"e2b\";\nimport { Clock, Effect } from \"effect\";\nimport { randomUUID } from \"node:crypto\";\nimport { t } from \"../i18n/index.ts\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { CommandResult, CommandOptions, SandboxReuseCapability, SuccessfulCommandResult, } from \"../types.ts\";\nimport { classifyProvisionErrorFallback, isRetryableProvisionError, type SandboxProvisionErrorKind, } from \"./errors.ts\";\nimport { classifySandboxIoError } from \"./errors.ts\";\nimport { downloadDirectoryByList } from \"./download-directory.ts\";\nimport { collectLocalFiles, type CollectedLocalFile } from \"./local-files.ts\";\nimport { shellQuote } from \"./shell.ts\";\nimport { resolveLocalPath, resolveSandboxPath } from \"./paths.ts\";\nimport { e2bRunIdentityMetadata, type RunIdentity } from \"./run-identity.ts\";\nimport { commandLimit, SandboxCommandTimeoutError } from \"./deadline.ts\";\nimport { successfulCommandResult } from \"./operations.ts\";\nimport { supportedBackendCapability, unsupportedBackendCapability, type SandboxProviderBackend } from \"./backend.ts\";\n// e2b 默认用户 \"user\",home 在 /home/user;工作区放其下。\nconst E2B_WORKDIR = \"/home/user/workspace\";\ntype E2BCommandOutputChannel = \"stdout\" | \"stderr\";\ninterface E2BCommandOutputState {\n pending: string;\n output: string;\n markerStarted: boolean;\n complete: boolean;\n exitCode?: number;\n invalidMarkerPayload?: string;\n}\n/** SDK/event Promises stay at the boundary; Effect owns which outcome wins and interrupts its waiter fibers. */\nfunction raceCommandOutcomes<const Outcomes extends readonly [\n Promise<unknown>,\n ...Promise<unknown>[]\n]>(outcomes: Outcomes): Promise<Awaited<Outcomes[number]>> {\n const effects = outcomes.map((outcome) => Effect.promise(() => outcome)) as [\n Effect.Effect<unknown>,\n ...Effect.Effect<unknown>[]\n ];\n return Effect.runPromise(Effect.raceAll(effects)) as Promise<Awaited<Outcomes[number]>>;\n}\n/**\n * 把 marker 编成 bash 的 printf `%b` 输入。wrapper 源码与 xtrace 诊断因此不会直接包含\n * 可被 parser 当成一整帧的 prefix/suffix;实际字节仍由同一个 bash supervisor 生成。\n */\nfunction shellByteEscapes(value: string): string {\n return [...Buffer.from(value, \"utf8\")]\n .map((byte) => `\\\\x${byte.toString(16).padStart(2, \"0\")}`)\n .join(\"\");\n}\n/** 当前内容仍可能是 `digits + suffix` 的跨 chunk 前缀。 */\nfunction isCompletionFramePrefix(encoded: string, suffix: string): boolean {\n if (encoded.length === 0)\n return true;\n let firstNonDigit = 0;\n while (firstNonDigit < encoded.length && /\\d/.test(encoded[firstNonDigit]!))\n firstNonDigit += 1;\n if (firstNonDigit === encoded.length)\n return true;\n if (firstNonDigit === 0)\n return false;\n const suffixPrefix = encoded.slice(firstNonDigit);\n return suffixPrefix.length < suffix.length && suffix.startsWith(suffixPrefix);\n}\n/**\n * E2B 的 command RPC 把进程终局与 stdout/stderr event stream 绑在一起。shell 已退出、但它\n * 有意留下的后台服务仍继承管道时,SDK `wait()` 会继续等 event stream EOF。这里给直接 shell\n * 加一个不改写输出目的地的 supervisor:两路 marker 都由直接 shell 结束后写出;收到后只\n * disconnect transport,不 kill 后台服务。timeout / cancellation 仍由调用方退休整台 VM。\n */\nclass E2BCommandCompletion {\n readonly script: string;\n readonly completion: Promise<number>;\n private readonly prefix: string;\n private readonly suffix: string;\n private readonly states: globalThis.Record<E2BCommandOutputChannel, E2BCommandOutputState> = {\n stdout: { pending: \"\", output: \"\", markerStarted: false, complete: false },\n stderr: { pending: \"\", output: \"\", markerStarted: false, complete: false },\n };\n private readonly callbacks: Partial<globalThis.Record<E2BCommandOutputChannel, (chunk: string) => void | Promise<void>>>;\n private readonly resolveCompletion: (exitCode: number) => void;\n private readonly rejectCompletion: (error: Error) => void;\n constructor(script: string, opts: Pick<CommandOptions, \"onStdout\" | \"onStderr\">) {\n const id = randomUUID().replaceAll(\"-\", \"\");\n this.prefix = `__niceeval_e2b_command_${id}_exit_`;\n this.suffix = `__niceeval_e2b_command_${id}_end__`;\n this.callbacks = {\n ...(opts.onStdout ? { stdout: opts.onStdout } : {}),\n ...(opts.onStderr ? { stderr: opts.onStderr } : {}),\n };\n let resolveCompletion!: (exitCode: number) => void;\n let rejectCompletion!: (error: Error) => void;\n this.completion = new Promise<number>((resolve, reject) => {\n resolveCompletion = resolve;\n rejectCompletion = reject;\n });\n this.resolveCompletion = resolveCompletion;\n this.rejectCompletion = rejectCompletion;\n // 原脚本住在异步 subshell:它继续继承 E2B login shell 的变量、函数、cwd 与 shell option,\n // `exit` / `exec` / EXIT trap 只结束自己的 shell。外层只 wait 这个直接 shell,不会等它\n // 有意留下的孙进程;因此能在 `nohup ... &` 之后可靠写出两路终局 marker。\n const encodedPrefix = shellQuote(shellByteEscapes(this.prefix));\n const encodedSuffix = shellQuote(shellByteEscapes(this.suffix));\n this.script = [\n \"(\",\n script,\n \") &\",\n \"__niceeval_e2b_command_pid=$!\",\n \"if wait \\\"$__niceeval_e2b_command_pid\\\"; then\",\n \" __niceeval_e2b_command_exit=0\",\n \"else\",\n \" __niceeval_e2b_command_exit=$?\",\n \"fi\",\n `__niceeval_e2b_command_prefix=$(printf '%b' ${encodedPrefix})`,\n `__niceeval_e2b_command_suffix=$(printf '%b' ${encodedSuffix})`,\n `printf '%s%s%s' \\\"$__niceeval_e2b_command_prefix\\\" \\\"$__niceeval_e2b_command_exit\\\" \\\"$__niceeval_e2b_command_suffix\\\"`,\n `printf '%s%s%s' \\\"$__niceeval_e2b_command_prefix\\\" \\\"$__niceeval_e2b_command_exit\\\" \\\"$__niceeval_e2b_command_suffix\\\" >&2`,\n \"exit \\\"$__niceeval_e2b_command_exit\\\"\",\n ].join(\"\\n\");\n }\n readonly onStdout = async (chunk: string): Promise<void> => this.consume(\"stdout\", chunk);\n readonly onStderr = async (chunk: string): Promise<void> => this.consume(\"stderr\", chunk);\n result(exitCode: number): CommandResult {\n return {\n stdout: this.states.stdout.output,\n stderr: this.states.stderr.output,\n exitCode,\n };\n }\n /** SDK 在 marker 前先结束时,把为跨 chunk 匹配暂存的普通输出交还调用方。 */\n async finish(): Promise<void> {\n for (const channel of [\"stdout\", \"stderr\"] as const) {\n const state = this.states[channel];\n if (!state.complete && !state.markerStarted && state.pending.length > 0) {\n const pending = state.pending;\n state.pending = \"\";\n await this.emit(channel, pending);\n }\n }\n const invalid = ([\"stdout\", \"stderr\"] as const)\n .map((channel) => ({ channel, state: this.states[channel] }))\n .find(({ state }) => !state.complete && state.invalidMarkerPayload !== undefined);\n if (invalid !== undefined) {\n throw new Error(`e2b command completion marker carried an invalid exit code: ${JSON.stringify(invalid.state.invalidMarkerPayload)}`);\n }\n const mismatch = this.exitCodeMismatch();\n if (mismatch !== undefined)\n throw mismatch;\n const partial = ([\"stdout\", \"stderr\"] as const).filter((channel) => {\n const state = this.states[channel];\n return state.markerStarted && !state.complete;\n });\n if (partial.length > 0) {\n throw new Error(`e2b command completion marker was truncated on ${partial.join(\" and \")}`);\n }\n const completed = ([\"stdout\", \"stderr\"] as const).filter((channel) => this.states[channel].complete);\n if (completed.length === 1) {\n throw new Error(`e2b command completion marker was received only on ${completed[0]}`);\n }\n }\n private async consume(channel: E2BCommandOutputChannel, chunk: string): Promise<void> {\n const state = this.states[channel];\n // 直接 shell 已结束后的输出只能来自它留下的后台服务;command transport 到这里已经封口。\n if (state.complete)\n return;\n state.pending += chunk;\n while (!state.complete) {\n if (!state.markerStarted) {\n const markerAt = state.pending.indexOf(this.prefix);\n if (markerAt < 0) {\n // marker 可能跨 SDK chunk;只保留足以匹配 prefix 的尾巴,其余实时透传。\n const safeLength = Math.max(0, state.pending.length - this.prefix.length + 1);\n if (safeLength > 0) {\n const safe = state.pending.slice(0, safeLength);\n state.pending = state.pending.slice(safeLength);\n await this.emit(channel, safe);\n }\n return;\n }\n const before = state.pending.slice(0, markerAt);\n state.pending = state.pending.slice(markerAt);\n await this.emit(channel, before);\n state.markerStarted = true;\n }\n const encoded = state.pending.slice(this.prefix.length);\n const markerEnd = encoded.indexOf(this.suffix);\n if (markerEnd >= 0) {\n const encodedExitCode = encoded.slice(0, markerEnd);\n if (!/^\\d+$/.test(encodedExitCode) || !Number.isSafeInteger(Number(encodedExitCode))) {\n // wrapper 源码、bash -x 和 SDK 转义诊断都可能带 marker 字面量。它们不是完成帧,\n // 作为普通输出保留,并继续寻找后面的真实帧;只有 stream 结束仍没有真实帧时,\n // finish() 才把这条协议错误交给调用方。\n state.invalidMarkerPayload ??= encodedExitCode;\n const invalid = state.pending.slice(0, this.prefix.length + markerEnd + this.suffix.length);\n state.pending = encoded.slice(markerEnd + this.suffix.length);\n state.markerStarted = false;\n await this.emit(channel, invalid);\n continue;\n }\n state.exitCode = Number(encodedExitCode);\n state.complete = true;\n // suffix 后同一个 chunk 里的字节来自后台服务;它们不属于已经 settle 的直接命令。\n state.pending = \"\";\n this.maybeComplete();\n return;\n }\n if (isCompletionFramePrefix(encoded, this.suffix))\n return;\n // 当前 prefix 后的内容已经不可能组成数字帧。先把 prefix 当普通输出吐出,再从\n // 剩余文本继续扫描;这样 source/diagnostic 中的假 prefix 不会吞掉后面的真实帧。\n state.pending = encoded;\n state.markerStarted = false;\n await this.emit(channel, this.prefix);\n }\n }\n private async emit(channel: E2BCommandOutputChannel, chunk: string): Promise<void> {\n if (chunk.length === 0)\n return;\n this.states[channel].output += chunk;\n await this.callbacks[channel]?.(chunk);\n }\n private maybeComplete(): void {\n const stdoutExit = this.states.stdout.exitCode;\n const stderrExit = this.states.stderr.exitCode;\n if (stdoutExit === undefined || stderrExit === undefined)\n return;\n const mismatch = this.exitCodeMismatch();\n if (mismatch !== undefined) {\n this.rejectCompletion(mismatch);\n return;\n }\n this.resolveCompletion(stdoutExit);\n }\n private exitCodeMismatch(): Error | undefined {\n const stdoutExit = this.states.stdout.exitCode;\n const stderrExit = this.states.stderr.exitCode;\n if (stdoutExit === undefined || stderrExit === undefined || stdoutExit === stderrExit)\n return undefined;\n return new Error(`e2b command completion markers disagreed on exit code: stdout=${stdoutExit}, stderr=${stderrExit}`);\n }\n}\n/** e2b 的限流错误是 SDK 原生的 RateLimitError(HTTP 429 映射而来);见 retry.ts 的 withProvisionRetry。 */\n// 对账本身只有一次机会:retry.ts 的 withProvisionRetry 对账失败就直接放弃重试、抛回原始\n// create() 错误(见那边的注释)。对账走的这次 list 请求跟刚失败的 create() 往往挨得很近,\n// 大概率处在同一段网络抖动里——不给它自己的重试,一次瞬时失败就会把本可能自愈的 attempt\n// 判死。这里给 nextItems() 单独包一层短重试,只吃与 create() 侧同一套分类下的瞬时错误。\nconst RECONCILE_LIST_MAX_ATTEMPTS = 3;\nconst RECONCILE_LIST_RETRY_DELAY_MS = 500;\n/**\n * E2B 创建请求必须明确说明寿命是作者声明、attempt deadline 派生,还是没有 deadline 可派生。\n * 把这个区分留在类型里,运行时就不会再把「没有显式 lifetimeMs」误传成 SDK 的短默认值。\n */\nexport type E2BSandboxLifetime = {\n readonly _tag: \"ProviderDefault\";\n} | {\n readonly _tag: \"Requested\";\n readonly milliseconds: number;\n readonly source: \"explicit\" | \"attempt-deadline\";\n};\ninterface E2BSandboxCreateOptions {\n readonly timeout?: number;\n /** attempt deadline 的截止时刻(epoch ms);单条命令按剩余量取上限。 */\n readonly deadlineAt?: number;\n readonly runtime?: \"node20\" | \"node24\";\n readonly template?: string;\n /** 覆盖整个 Sandbox 的默认执行身份;省略时沿用 template 的默认用户。 */\n readonly user?: string;\n /**\n * 按序前置到受管 `PATH` 的目录;省略 = 不改 PATH(见 docs/feature/sandbox/library.md\n * 「PATH:受管变量与 pathPrepend」)。\n */\n readonly pathPrepend?: readonly string[];\n readonly provisionToken?: string;\n /** 运行时已解析的实例寿命;bounded attempt 不能退回 E2B 的 SDK 默认值。 */\n readonly lifetime: E2BSandboxLifetime;\n /** 创建期写入的运行标识(host/pid/startedAt),供强杀之后的孤儿核对按 metadata 事后收回\n * (见 docs/feature/sandbox/architecture.md「孤儿核对」)。 */\n readonly runIdentity?: RunIdentity;\n}\n/**\n * Provisioning 重试前的对账:按 metadata 里的 provision token 检索远端实例,查到即 kill。\n * 检索或销毁失败必须抛出——对账是重试的硬前置,静默放行等于盲重试,会复制计费实例\n * (见 docs/feature/sandbox/architecture.md「Provisioning 失败与重试」)。\n * 唯一的例外:实例已不存在(NotFound),视作对账完成。\n */\nexport async function reconcileProvision(token: string): Promise<void> {\n const apiKey = process.env.E2B_API_KEY;\n // Sandbox.list() 是同步方法,返回分页器(SandboxPaginator),不是 Promise<数组>——用\n // hasNext/nextItems() 翻页,不能直接 for...of。metadata 过滤走服务端 query,一次 token\n // 命中的实例数极少,通常一页打完。\n const paginator = E2BSdkSandbox.list({ apiKey, query: { metadata: { \"niceeval-provision-token\": token } } });\n while (paginator.hasNext) {\n const sandboxes = await fetchNextItemsWithRetry(paginator);\n for (const info of sandboxes) {\n try {\n await E2BSdkSandbox.kill(info.sandboxId, { apiKey });\n }\n catch (e) {\n if (!(e instanceof NotFoundError))\n throw e;\n }\n }\n }\n}\ntype E2BReconcilePaginator = ReturnType<typeof E2BSdkSandbox.list>;\ntype E2BReconcileListPage = Awaited<ReturnType<E2BReconcilePaginator[\"nextItems\"]>>;\n/**\n * `nextItems()` 按类型契约总是 resolve 成数组(SDK 内部对空响应也兜了 `?? []`),但对账这条\n * 路径线上真实撞见过它 resolve 成非数组的一次——没能复现出确切成因,不排它,原样让下面的\n * 类型守卫抛出,但换一句能定位的诊断,而不是留一条裸的 \"X is not iterable\"。\n *\n * 重试是 NiceEval 内部策略(attempt 数、delay 公式与错误分类和原来完全一致):\n * 等待用 `Effect.sleep`(Clock)、SDK Promise 在 `tryPromise` 边界适配一次,\n * 原始错误对象原样留在失败通道,耗尽重试时抛回的是同一个对象。\n */\nfunction fetchNextItemsWithRetryEffect(paginator: E2BReconcilePaginator): Effect.Effect<E2BReconcileListPage, unknown> {\n const attempt = (n: number): Effect.Effect<E2BReconcileListPage, unknown> => Effect.tryPromise({\n try: () => paginator.nextItems(),\n catch: (cause) => cause,\n }).pipe(Effect.flatMap((items) => {\n if (Array.isArray(items))\n return Effect.succeed(items);\n return Effect.fail(new Error(t(\"e2b.listNextItemsNotArray\", { type: typeof items })));\n }), Effect.catchAll((error) => {\n const kind = classifyProvisionErrorFallback(error);\n if (n >= RECONCILE_LIST_MAX_ATTEMPTS - 1 || !isRetryableProvisionError(kind))\n return Effect.fail(error);\n return Clock.sleep(RECONCILE_LIST_RETRY_DELAY_MS * 2 ** n).pipe(Effect.zipRight(attempt(n + 1)));\n }));\n return attempt(0);\n}\nasync function fetchNextItemsWithRetry(paginator: E2BReconcilePaginator): Promise<E2BReconcileListPage> {\n return Effect.runPromise(fetchNextItemsWithRetryEffect(paginator));\n}\nexport function classifyProvisionError(e: unknown): SandboxProvisionErrorKind {\n // SDK 原生限流先归拒绝类;没认出的过与文件 IO 共用的保守瞬时兜底分类器\n // (真实跑分里出现过 create 阶段 `fetch failed · other side closed`,属歧义类)。\n if (e instanceof RateLimitError)\n return \"rate_limit\";\n return classifyProvisionErrorFallback(e);\n}\nexport class E2BSandbox implements SandboxProviderBackend, SandboxReuseCapability {\n readonly workdir = E2B_WORKDIR;\n readonly otlpHost = null;\n private sbx: E2BSdkSandbox;\n private commandTimeoutMs?: number;\n /** A VM retirement is idempotent across abort, transport failure, and the scope finalizer. */\n private retirement?: Promise<void>;\n private retired = false;\n /** 已实际请求的实例寿命;复用下续期一律续到这个值(滑动窗口)。 */\n private lifetime: E2BSandboxLifetime;\n /** 起点覆盖(factory `user`);省略 = 沿用 template 的默认用户。 */\n private readonly userOverride?: string;\n /** factory `pathPrepend`;按声明顺序前置到受管 PATH,省略 = 空数组。 */\n private readonly pathPrepend: readonly string[];\n readonly sandboxId: string;\n private deadlineAt?: number;\n readonly capabilities = {\n rootCommands: supportedBackendCapability(true as const),\n appendLog: unsupportedBackendCapability,\n suspend: supportedBackendCapability(() => this.suspend()),\n ensureLifetime: supportedBackendCapability((minRemainingMs: number) => this.ensureLifetime(minRemainingMs)),\n setCommandDeadline: supportedBackendCapability((deadlineAt?: number) => this.setCommandDeadline(deadlineAt)),\n };\n private constructor(sbx: E2BSdkSandbox, id: string, commandTimeoutMs: number | undefined, lifetime: E2BSandboxLifetime, userOverride: string | undefined, pathPrepend: readonly string[] = [], deadlineAt?: number) {\n this.sbx = sbx;\n this.sandboxId = id;\n this.commandTimeoutMs = commandTimeoutMs;\n this.lifetime = lifetime;\n this.userOverride = userOverride;\n this.pathPrepend = pathPrepend;\n this.deadlineAt = deadlineAt;\n }\n /** 复用下由池在每次借出时换成承接者自己的 deadline(见 sandbox/deadline.ts)。 */\n setCommandDeadline(deadlineAt?: number): void {\n this.deadlineAt = deadlineAt;\n }\n /**\n * 寿命确认:先问远端真实到期时刻,不够再续,续完**重新问一次**。\n *\n * 两处都读 `getInfo().endAt` 而不是复读我们请求的值,是这条能力的全部要害——e2b 的账号档位\n * 会把 `setTimeout` 的请求值压到平台上限(免费档尤其明显)。拿请求值记账等于把「平台压短了」\n * 伪装成「作者声明生效了」,而症状要到 attempt 跑到一半、实例被回收时才出现,那时只剩一句\n * 无归属的 sandbox 消失。宁可在这里如实报 `ready: false` 让 runner 轮换实例。\n */\n async ensureLifetime(minRemainingMs: number): Promise<{\n ready: true;\n expiresAt?: string;\n } | {\n ready: false;\n reason: string;\n }> {\n if (this.lifetime._tag === \"ProviderDefault\") {\n return {\n ready: false,\n reason: \"the e2b sandbox has no requested lifetime; an unlimited attempt must declare lifetimeMs before sandboxReuse\",\n };\n }\n try {\n const remainingMs = async () => (await this.sbx.getInfo()).endAt.getTime() - Date.now();\n const before = await remainingMs();\n if (before >= minRemainingMs)\n return { ready: true, expiresAt: new Date(Date.now() + before).toISOString() };\n // setTimeout 是「从此刻起再活这么久」,不是增量;续到创建期实际请求的完整寿命。\n await this.sbx.setTimeout(this.lifetime.milliseconds);\n const after = await remainingMs();\n return after >= minRemainingMs\n ? { ready: true, expiresAt: new Date(Date.now() + after).toISOString() }\n : {\n ready: false,\n reason: `e2b capped this sandbox's lifetime at ${Math.round(after / 1000)}s after renewing to the ${this.lifetime.source === \"explicit\" ? \"declared\" : \"attempt-deadline-derived\"} ` +\n `lifetimeMs=${this.lifetime.milliseconds}ms; the next attempt needs ${Math.round(minRemainingMs / 1000)}s`,\n };\n }\n catch (e) {\n return { ready: false, reason: `e2b could not confirm this sandbox's lifetime: ${String(e)}` };\n }\n }\n static async create(opts: E2BSandboxCreateOptions): Promise<E2BSandbox> {\n // 单条命令没有 provider 级默认:上限恒从 attempt deadline 派生(见 deadline.ts)。\n const commandTimeoutMs = opts.timeout;\n // e2b 的 node 版本由模板决定,runtime 仅作记录(不在创建时选)。\n const apiKey = process.env.E2B_API_KEY;\n // provision token 与运行标识都经 metadata 打进实例(同一通道):歧义类失败(fetch failed ·\n // other side closed)重试前按 token 检索远端、销毁可能已创建的实例(见 reconcileProvision);\n // 运行标识供 `sandbox list --orphans` 按 metadata 过滤事后核对。\n const metadata: globalThis.Record<string, string> = {\n ...(opts.provisionToken ? { \"niceeval-provision-token\": opts.provisionToken } : {}),\n ...(opts.runIdentity ? e2bRunIdentityMetadata(opts.runIdentity) : {}),\n };\n // bounded attempt 一定携带由 runtime 派生的 timeoutMs;只有没有 deadline 可派生的\n // unlimited attempt 才允许 ProviderDefault。NiceEval 不把某个账号档位观测到的上限硬编码\n // 成全体用户的契约。\n const sdkOpts = {\n apiKey,\n ...(opts.lifetime._tag === \"Requested\" ? { timeoutMs: opts.lifetime.milliseconds } : {}),\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n } as const;\n // 有 template 就从模板起,否则用 e2b 默认 \"base\"。\n const sbx = await (async () => {\n try {\n return opts.template ? await E2BSdkSandbox.create(opts.template, sdkOpts) : await E2BSdkSandbox.create(sdkOpts);\n }\n catch (e) {\n // 声明的寿命超出账号档位上限时,e2b 返回 400「Timeout cannot be greater than N hours」。\n // 这是确定性配置死因(同一个值重试多少次都是同一个 400),而裸 SDK 栈既不说是哪个字段\n // 惹的祸、也不说上限是多少。把 provider 的理由原样带出来并指到 lifetimeMs 上——\n // 「不能静默压短」的另一半是「压不下就把原因说清楚」\n // (见 docs/feature/sandbox/reuse.md「派发前确认」)。\n if (opts.lifetime._tag === \"Requested\" && /timeout cannot be greater than/i.test(e instanceof Error ? e.message : String(e))) {\n throw new Error(`e2b rejected the ${opts.lifetime.source === \"explicit\" ? \"declared\" : \"attempt-deadline-derived\"} ` +\n `lifetimeMs=${opts.lifetime.milliseconds}ms for this account: ${e instanceof Error ? e.message : String(e)}. ` +\n \"Lower the attempt timeout or lifetimeMs to fit the plan's maximum sandbox lifetime, or raise that maximum \" +\n \"on the e2b side; niceeval will not silently shorten it.\", { cause: e });\n }\n throw e;\n }\n })();\n // kill-on-failure:实例句柄已到手,创建之后的初始化请求(如下面的 mkdir 撞 429)一旦失败,\n // 先尽力销毁实例再抛出原始错误——否则重试层按「拒绝类=远端没有实例」盲重试,就会复制一台\n // 计费实例(见 docs/feature/sandbox/architecture.md「Provisioning 失败与重试」)。\n try {\n // 备好工作区目录(模板默认 cwd 是 home,workspace 子目录可能不存在)。\n await sbx.commands.run(`mkdir -p ${E2B_WORKDIR}`);\n return new E2BSandbox(sbx, sbx.sandboxId, commandTimeoutMs, opts.lifetime, opts.user, opts.pathPrepend ?? [], opts.deadlineAt);\n }\n catch (e) {\n await sbx.kill().catch(() => { });\n throw e;\n }\n }\n async runCommand(cmd: string, args: readonly string[] = [], opts: CommandOptions = {}): Promise<CommandResult> {\n const line = [cmd, ...args.map(shellQuote)].join(\" \");\n return this.runShell(line, opts);\n }\n async runShell(script: string, opts: CommandOptions = {}): Promise<CommandResult> {\n // e2b commands.run 直接透传同名 user 参数;省略时沿用 Sandbox 默认身份(factory `user`\n // 覆盖后的身份,否则 template 默认用户)—— 跨 provider 语义一致\n // (见 docs/feature/sandbox/library.md「执行身份」)。\n const limit = commandLimit(opts, { commandTimeoutMs: this.commandTimeoutMs, deadlineAt: this.deadlineAt });\n // pathPrepend 是受管 PATH,在脚本自己的 shell 里对 `$PATH` 前置——env 走的是 SDK 的\n // envs 参数(可能被 opts.env.PATH 覆盖),而这一行在它之后执行,始终生效\n // (见 docs/feature/sandbox/library.md「PATH:受管变量与 pathPrepend」)。\n const scriptWithPath = this.pathPrepend.length > 0\n ? `PATH=${shellQuote(this.pathPrepend.join(\":\"))}:\"$PATH\"\\n${script}`\n : script;\n const completion = new E2BCommandCompletion(scriptWithPath, opts);\n // Attach a rejection handler before starting the SDK command. A malformed marker can reject while\n // commands.run() is still delivering its initial events; keeping this outcome fulfilled avoids an\n // unhandled rejection before the command handle is returned.\n const completionOutcome = completion.completion.then((exitCode) => ({ _tag: \"DirectShellExited\" as const, exitCode }), (error: unknown) => ({ _tag: \"CompletionFailed\" as const, error }));\n const signal = opts.signal;\n let aborted = false;\n let cancellationReason: unknown = new DOMException(\"sandbox command aborted\", \"AbortError\");\n let abortRetirement: Promise<void> | undefined;\n let resolveAbort: ((outcome: {\n readonly _tag: \"Aborted\";\n readonly reason: unknown;\n }) => void) | undefined;\n const abortOutcome = signal === undefined\n ? undefined\n : new Promise<{\n readonly _tag: \"Aborted\";\n readonly reason: unknown;\n }>((resolve) => {\n resolveAbort = resolve;\n });\n const onAbort = signal === undefined\n ? undefined\n : () => {\n if (aborted)\n return;\n // This flag must change synchronously. Marker delivery can finish while kill() is still in\n // flight; every success path checks it before settling and awaits the same retirement.\n aborted = true;\n cancellationReason = signal.reason ?? new DOMException(\"sandbox command aborted\", \"AbortError\");\n abortRetirement ??= this.retire();\n // Cancellation waits for retirement to settle, but a kill transport failure must not\n // replace the caller's AbortSignal reason. A later stop() may retry a failed kill.\n void abortRetirement.then(() => resolveAbort?.({ _tag: \"Aborted\", reason: cancellationReason }), () => resolveAbort?.({ _tag: \"Aborted\", reason: cancellationReason }));\n };\n const throwIfAborted = async (): Promise<void> => {\n if (!aborted)\n return;\n await abortRetirement?.catch(() => undefined);\n throw cancellationReason;\n };\n if (signal !== undefined) {\n signal.addEventListener(\"abort\", onAbort!, { once: true });\n // Close the check/listener race: AbortSignal does not replay an abort to a late listener.\n if (signal.aborted)\n onAbort!();\n }\n try {\n const commandOptions = {\n cwd: resolveSandboxPath(this.workdir, opts.cwd),\n envs: opts.env,\n user: opts.user ?? this.userOverride,\n ...(limit.timeoutMs !== undefined ? { timeoutMs: limit.timeoutMs } : {}),\n onStdout: completion.onStdout,\n onStderr: completion.onStderr,\n background: true as const,\n };\n await throwIfAborted();\n // Starting a background command is itself a remote RPC and can hang. Race handle acquisition\n // against the abort retirement, while eagerly handling a late start rejection.\n const commandStartOutcome = this.sbx.commands.run(completion.script, commandOptions).then((handle) => ({ _tag: \"HandleReady\" as const, handle }), (error: unknown) => ({ _tag: \"HandleFailed\" as const, error }));\n const startOutcome = await raceCommandOutcomes([\n commandStartOutcome,\n ...(abortOutcome ? [abortOutcome] : []),\n ]);\n await throwIfAborted();\n if (startOutcome._tag === \"Aborted\")\n throw startOutcome.reason;\n if (startOutcome._tag === \"HandleFailed\")\n throw startOutcome.error;\n const handle = startOutcome.handle;\n const streamOutcome = handle.wait().then((result) => ({ _tag: \"SdkStreamEnded\" as const, result }), (error: unknown) => ({ _tag: \"SdkStreamFailed\" as const, error }));\n const outcome = await raceCommandOutcomes([\n completionOutcome,\n streamOutcome,\n ...(abortOutcome ? [abortOutcome] : []),\n ]);\n await throwIfAborted();\n if (outcome._tag === \"DirectShellExited\") {\n // SDK 文档保证 disconnect 只断 event transport、不 kill command。直接 shell 已退出;仍持有\n // stdout/stderr 的只能是它有意留下的后台服务,正是这条路径要保留的对象。\n await handle.disconnect();\n await throwIfAborted();\n return completion.result(outcome.exitCode);\n }\n if (outcome._tag === \"CompletionFailed\" || outcome._tag === \"SdkStreamFailed\") {\n throw outcome.error;\n }\n if (outcome._tag === \"Aborted\")\n throw outcome.reason;\n await completion.finish();\n await throwIfAborted();\n return completion.result(outcome.result.exitCode);\n }\n catch (e) {\n if (aborted) {\n await abortRetirement?.catch(() => undefined);\n throw cancellationReason;\n }\n // e2b 在退出码非 0 时【抛】CommandExitError;但 Sandbox 契约要求【返回】带 exitCode 的结果\n // (与 docker / vercel 一致)——否则 agent 命令 / build / 测试一旦非 0 退出就会炸,而不是被判分。\n if (e instanceof CommandExitError) {\n try {\n await completion.finish();\n }\n catch (callbackError) {\n if (aborted) {\n await abortRetirement?.catch(() => undefined);\n throw cancellationReason;\n }\n await this.retire();\n throw callbackError;\n }\n await throwIfAborted();\n return completion.result(e.exitCode);\n }\n // 撞的是我们给的那条线时,把归属一起抛出去(runner 据此落 error.timeout)。\n if (limit.timeoutMs !== undefined && isTimeoutError(e)) {\n // SDK timeout 只保证终止入口进程,不能证明命令树已经消失;按公共契约退休整台 VM。\n await this.retire();\n throw new SandboxCommandTimeoutError(`e2b command timed out after ${limit.timeoutMs}ms`, limit.timeoutMs, limit.explicit);\n }\n // Stream transport, output callbacks, marker integrity, and disconnect failures all leave the\n // managed command tree in an unknown state. Retire the VM before exposing the original error.\n await this.retire();\n throw e;\n }\n finally {\n if (onAbort !== undefined)\n signal?.removeEventListener(\"abort\", onAbort);\n }\n }\n private abs(path: string): string {\n return resolveSandboxPath(this.workdir, path);\n }\n async runCommandOrThrow(cmd: string, args: readonly string[] = [], opts: CommandOptions = {}): Promise<SuccessfulCommandResult> {\n return successfulCommandResult(await this.runCommand(cmd, args, opts), opts.sensitiveValues);\n }\n async runShellOrThrow(script: string, opts: CommandOptions = {}): Promise<SuccessfulCommandResult> {\n return successfulCommandResult(await this.runShell(script, opts), opts.sensitiveValues);\n }\n async readText(path: string): Promise<string> {\n return this.sbx.files.read(this.abs(path), { format: \"text\" });\n }\n async pathExists(path: string): Promise<boolean> {\n try {\n return await this.sbx.files.exists(this.abs(path));\n }\n catch (error) {\n // 不把瞬时网络/服务错误伪装成“不存在”,交给统一 IO 层重试。\n if (classifySandboxIoError(error) !== \"unknown\")\n throw error;\n return false;\n }\n }\n // targetDir 已由 paths.ts 的 normalizeSandboxPaths 解析成绝对路径;这里再解析一次\n // 只是对直接使用 provider 实例(未包 normalize)的幂等防御,提到 map 外只算一次。\n private async writeCollectedFiles(files: readonly CollectedLocalFile[], targetDir?: string): Promise<void> {\n const base = resolveSandboxPath(this.workdir, targetDir);\n const entries = files.map(({ path, content }) => ({\n path: resolveSandboxPath(base, path),\n data: toArrayBuffer(content),\n }));\n if (entries.length === 0)\n return;\n await this.sbx.files.write(entries);\n }\n async writeText(path: string, content: string): Promise<void> {\n await this.sbx.files.write(this.abs(path), content);\n }\n async readBytes(path: string): Promise<Uint8Array> {\n return this.sbx.files.read(this.abs(path), { format: \"bytes\" });\n }\n async writeBytes(path: string, content: Uint8Array): Promise<void> {\n await this.sbx.files.write(this.abs(path), toArrayBuffer(content));\n }\n async uploadFile(source: string | URL, targetPath: string): Promise<void> {\n await this.writeBytes(targetPath, await readFile(resolveLocalPath(undefined, source)));\n }\n async uploadDirectory(sourceDir: string | URL, targetDir?: string, opts: {\n readonly ignore?: readonly string[];\n } = {}): Promise<void> {\n await this.writeCollectedFiles(await collectLocalFiles(resolveLocalPath(undefined, sourceDir), opts.ignore), targetDir);\n }\n /**\n * 递归下载沙箱内一个目录到本地磁盘,与 uploadDirectory 对称:两阶段模板(与 vercel provider\n * 共用)——find 列路径 + 逐文件 files.read(bytes) 独立读取,写回本地磁盘。\n */\n async downloadFile(sourcePath: string, target: string | URL): Promise<void> {\n const destination = resolveLocalPath(undefined, target);\n await mkdir(dirname(destination), { recursive: true });\n await writeFile(destination, await this.readBytes(sourcePath));\n }\n async downloadDirectory(sourceDir: string, targetDir: string | URL, opts: {\n readonly ignore?: readonly string[];\n } = {}): Promise<void> {\n const remoteDir = resolveSandboxPath(this.workdir, sourceDir);\n await downloadDirectoryByList({\n localDir: resolveLocalPath(undefined, targetDir),\n ignore: opts.ignore ?? [],\n runShell: (script) => this.runShell(script, { cwd: remoteDir }),\n readOne: (relPath) => this.readBytes(`${remoteDir}/${relPath}`),\n });\n }\n async stop(): Promise<void> {\n await this.retire();\n }\n private retire(): Promise<void> {\n if (this.retired)\n return Promise.resolve();\n if (this.retirement !== undefined)\n return this.retirement;\n let attempt!: Promise<void>;\n attempt = this.sbx.kill().then(() => {\n this.retired = true;\n if (this.retirement === attempt)\n this.retirement = undefined;\n }, (error: unknown) => {\n if (this.retirement === attempt)\n this.retirement = undefined;\n throw error;\n });\n this.retirement = attempt;\n return attempt;\n }\n /**\n * 留存休眠(suspend):e2b `pause`——文件系统与内存整体持久化,暂停期间停止计费,\n * 现场无限期保留、可 resume 找回(没有自然过期时刻,注册表不写 expiresAt)。\n * SDK 版本差异按能力探测(betaPause 是旧名),都没有则如实抛错(现场保持 alive)。\n */\n async suspend(): Promise<void> {\n await this.sbx.pause();\n }\n}\n/** Uint8Array → ArrayBuffer(e2b files.write 接受 string | ArrayBuffer | Blob | ReadableStream)。 */\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n/** e2b SDK 的命令超时:SDK 不导出可 instanceof 的类型,按错误名与文案判定(只用于归属标注)。 */\nfunction isTimeoutError(e: unknown): boolean {\n if (!(e instanceof Error))\n return false;\n return e.name === \"TimeoutError\" || /timed? ?out/i.test(e.message);\n}\n"]}
1
+ {"version":3,"file":"e2b.js","sourceRoot":"","sources":["e2b.ts"],"names":[],"mappings":";;;AAkSA,gDAkBC;AA+BD,wDAMC;AAzVD,wDAAwD;AACxD,qEAAqE;AACrE,EAAE;AACF,+DAA+D;AAC/D,2DAA2D;AAC3D,kEAAkE;AAClE,6BAAgG;AAChG,mCAAuC;AACvC,6CAAyC;AACzC,+CAAqC;AACrC,+CAA8D;AAC9D,yCAAoC;AAEpC,2CAAyH;AACzH,2CAAqD;AACrD,mEAAkE;AAClE,qDAA8E;AAC9E,yCAAwC;AACxC,yCAAkE;AAClE,uDAA6E;AAC7E,+CAAyE;AACzE,mDAA0D;AAC1D,6DAA4D;AAC5D,6CAA0J;AAC1J,4CAA4C;AAC5C,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAU3C,gHAAgH;AAChH,SAAS,mBAAmB,CAGzB,QAAkB;IACjB,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAGtE,CAAC;IACF,OAAO,eAAM,CAAC,UAAU,CAAC,eAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAuC,CAAC;AAC5F,CAAC;AACD;;;GAGG;AACH,SAAS,gBAAgB,CAAC,KAAa;IACnC,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SACjC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;SACzD,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AACD,8CAA8C;AAC9C,SAAS,uBAAuB,CAAC,OAAe,EAAE,MAAc;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,OAAO,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAE,CAAC;QACvE,aAAa,IAAI,CAAC,CAAC;IACvB,IAAI,aAAa,KAAK,OAAO,CAAC,MAAM;QAChC,OAAO,IAAI,CAAC;IAChB,IAAI,aAAa,KAAK,CAAC;QACnB,OAAO,KAAK,CAAC;IACjB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,YAAY,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAClF,CAAC;AACD;;;;;GAKG;AACH,MAAM,oBAAoB;IACb,MAAM,CAAS;IACf,UAAU,CAAkB;IACpB,MAAM,CAAS;IACf,MAAM,CAAS;IACf,MAAM,GAAsE;QACzF,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1E,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;KAC7E,CAAC;IACe,SAAS,CAA+F;IACxG,iBAAiB,CAA6B;IAC9C,gBAAgB,CAAyB;IAC1D,YAAY,MAAc,EAAE,IAAmD;QAC3E,MAAM,EAAE,GAAG,IAAA,wBAAU,GAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,GAAG,0BAA0B,EAAE,QAAQ,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,0BAA0B,EAAE,QAAQ,CAAC;QACnD,IAAI,CAAC,SAAS,GAAG;YACb,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAC;QACF,IAAI,iBAA8C,CAAC;QACnD,IAAI,gBAAyC,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACtD,iBAAiB,GAAG,OAAO,CAAC;YAC5B,gBAAgB,GAAG,MAAM,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAC3C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,oEAAoE;QACpE,oEAAoE;QACpE,iDAAiD;QACjD,MAAM,aAAa,GAAG,IAAA,qBAAU,EAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,MAAM,aAAa,GAAG,IAAA,qBAAU,EAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,GAAG;YACV,GAAG;YACH,MAAM;YACN,KAAK;YACL,+BAA+B;YAC/B,+CAA+C;YAC/C,iCAAiC;YACjC,MAAM;YACN,kCAAkC;YAClC,IAAI;YACJ,+CAA+C,aAAa,GAAG;YAC/D,+CAA+C,aAAa,GAAG;YAC/D,wHAAwH;YACxH,4HAA4H;YAC5H,uCAAuC;SAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACQ,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAiB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACjF,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAiB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1F,MAAM,CAAC,QAAgB;QACnB,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;YACjC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM;YACjC,QAAQ;SACX,CAAC;IACN,CAAC;IACD,mDAAmD;IACnD,KAAK,CAAC,MAAM;QACR,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAU,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC9B,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;QACD,MAAM,OAAO,GAAI,CAAC,QAAQ,EAAE,QAAQ,CAAW;aAC1C,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;aAC5D,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC;QACtF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,+DAA+D,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACzI,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS;YACtB,MAAM,QAAQ,CAAC;QACnB,MAAM,OAAO,GAAI,CAAC,QAAQ,EAAE,QAAQ,CAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO,KAAK,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;QAClD,CAAC,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,kDAAkD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,MAAM,SAAS,GAAI,CAAC,QAAQ,EAAE,QAAQ,CAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,sDAAsD,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;IACL,CAAC;IACO,KAAK,CAAC,OAAO,CAAC,OAAgC,EAAE,KAAa;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACnC,0DAA0D;QAC1D,IAAI,KAAK,CAAC,QAAQ;YACd,OAAO;QACX,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACpD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACf,kDAAkD;oBAClD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC9E,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;wBACjB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;wBAChD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBAChD,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;oBACnC,CAAC;oBACD,OAAO;gBACX,CAAC;gBACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAChD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC9C,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;YAC/B,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACjB,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;oBACnF,wDAAwD;oBACxD,4CAA4C;oBAC5C,0BAA0B;oBAC1B,KAAK,CAAC,oBAAoB,KAAK,eAAe,CAAC;oBAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC5F,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC9D,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;oBAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAClC,SAAS;gBACb,CAAC;gBACD,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;gBACzC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACtB,qDAAqD;gBACrD,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;gBACnB,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,OAAO;YACX,CAAC;YACD,IAAI,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC;gBAC7C,OAAO;YACX,gDAAgD;YAChD,uDAAuD;YACvD,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;YACxB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;YAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;IACL,CAAC;IACO,KAAK,CAAC,IAAI,CAAC,OAAgC,EAAE,KAAa;QAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAClB,OAAO;QACX,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;QACrC,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IACO,aAAa;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/C,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS;YACpD,OAAO;QACX,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAChC,OAAO;QACX,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACvC,CAAC;IACO,gBAAgB;QACpB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC/C,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,UAAU;YACjF,OAAO,SAAS,CAAC;QACrB,OAAO,IAAI,KAAK,CAAC,iEAAiE,UAAU,YAAY,UAAU,EAAE,CAAC,CAAC;IAC1H,CAAC;CACJ;AACD,wFAAwF;AACxF,4DAA4D;AAC5D,2DAA2D;AAC3D,kDAAkD;AAClD,yDAAyD;AACzD,MAAM,2BAA2B,GAAG,CAAC,CAAC;AACtC,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAgC1C;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CAAC,KAAa;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACvC,iEAAiE;IACjE,sEAAsE;IACtE,mBAAmB;IACnB,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC7G,OAAO,SAAS,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAC3D,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACD,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,CAAC,EAAE,CAAC;gBACP,IAAI,CAAC,CAAC,CAAC,YAAY,mBAAa,CAAC;oBAC7B,MAAM,CAAC,CAAC;YAChB,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAGD;;;;;;;;GAQG;AACH,SAAS,6BAA6B,CAAC,SAAgC;IACnE,MAAM,OAAO,GAAG,CAAC,CAAS,EAAgD,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC;QAC3F,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE;QAChC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;KAC1B,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACpB,OAAO,eAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,eAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAA,YAAC,EAAC,2BAA2B,EAAE,EAAE,IAAI,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,CAAC,CAAC,EAAE,eAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,IAAA,0CAA8B,EAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,2BAA2B,GAAG,CAAC,IAAI,CAAC,IAAA,qCAAyB,EAAC,IAAI,CAAC;YACxE,OAAO,eAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,cAAK,CAAC,KAAK,CAAC,6BAA6B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC;AACD,KAAK,UAAU,uBAAuB,CAAC,SAAgC;IACnE,OAAO,eAAM,CAAC,UAAU,CAAC,6BAA6B,CAAC,SAAS,CAAC,CAAC,CAAC;AACvE,CAAC;AACD,SAAgB,sBAAsB,CAAC,CAAU;IAC7C,yCAAyC;IACzC,gEAAgE;IAChE,IAAI,CAAC,YAAY,oBAAc;QAC3B,OAAO,YAAY,CAAC;IACxB,OAAO,IAAA,0CAA8B,EAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AACD,MAAa,UAAU;IACV,OAAO,GAAG,WAAW,CAAC;IACtB,QAAQ,GAAG,IAAI,CAAC;IACjB,GAAG,CAAgB;IACnB,gBAAgB,CAAU;IAClC,8FAA8F;IACtF,UAAU,CAAiB;IAC3B,OAAO,GAAG,KAAK,CAAC;IACxB,qCAAqC;IAC7B,QAAQ,CAAqB;IACrC,mDAAmD;IAClC,YAAY,CAAU;IACvC,sDAAsD;IACrC,WAAW,CAAoB;IACvC,SAAS,CAAS;IACnB,UAAU,CAAU;IACnB,YAAY,GAAG;QACpB,YAAY,EAAE,IAAA,uCAA0B,EAAC,IAAa,CAAC;QACvD,SAAS,EAAE,yCAA4B;QACvC,OAAO,EAAE,IAAA,uCAA0B,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACzD,cAAc,EAAE,IAAA,uCAA0B,EAAC,CAAC,cAAsB,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QAC3G,kBAAkB,EAAE,IAAA,uCAA0B,EAAC,CAAC,UAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC5G,cAAc,EAAE,IAAA,gDAAmC,EAAC,8GAA8G,CAAC;KACtK,CAAC;IACM,KAAK,CAAC,mBAAmB,CAAC,KAA0B;QACxD,MAAM,MAAM,GAAG,IAAI,yCAAoB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YACxC,CAAC,CAAC,QAAQ,OAAO,EAAE;YACnB,CAAC,CAAC,QAAQ,IAAA,qBAAU,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,kBAAkB,OAAO,EAAE,CAAC;QAChF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;YAC/C,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,IAAA,6BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC;YAChD,IAAI,EAAE,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE;YAC5D,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;YACvE,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5F,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;SAC/F,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAY,CAAA,EAAE,CAAC,KAAc,EAAE,EAAE;YACrG,IAAI,KAAK,YAAY,sBAAgB;gBACjC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAW,CAAC;YACjD,MAAM,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAC/B,IAAI,YAAuC,CAAC;QAC5C,IAAI,gBAA2C,CAAC;QAChD,IAAI,UAAU,GAAkC,MAAM,CAAC;QACvD,OAAO;YACH,MAAM;YACN,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACrI,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,KAAK,CAAC,KAAK,IAAI,EAAE;gBAC3C,UAAU,GAAG,SAAS,CAAC;gBACvB,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1B,UAAU,GAAG,QAAQ,CAAC;YAC1B,CAAC,CAAC,EAAE;YACJ,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;YAChB,SAAS,EAAE,GAAG,EAAE,CAAC,gBAAgB,KAAK,CAAC,KAAK,IAAI,EAAE;gBAC9C,UAAU,GAAG,SAAS,CAAC;gBACvB,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBACpB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAClC,UAAU,GAAG,QAAQ,CAAC;YAC1B,CAAC,CAAC,EAAE;SACP,CAAC;IACN,CAAC;IACD,YAAoB,GAAkB,EAAE,EAAU,EAAE,gBAAoC,EAAE,QAA4B,EAAE,YAAgC,EAAE,cAAiC,EAAE,EAAE,UAAmB;QAC9M,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IACD,2DAA2D;IAC3D,kBAAkB,CAAC,UAAmB;QAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IACjC,CAAC;IACD;;;;;;;OAOG;IACH,KAAK,CAAC,cAAc,CAAC,cAAsB;QAOvC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC3C,OAAO;gBACH,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,6GAA6G;aACxH,CAAC;QACN,CAAC;QACD,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxF,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;YACnC,IAAI,MAAM,IAAI,cAAc;gBACxB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACnF,+CAA+C;YAC/C,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,OAAO,KAAK,IAAI,cAAc;gBAC1B,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,WAAW,EAAE,EAAE;gBACxE,CAAC,CAAC;oBACE,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,yCAAyC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,2BAA2B,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,0BAA0B,GAAG;wBAChL,cAAc,IAAI,CAAC,QAAQ,CAAC,YAAY,8BAA8B,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG;iBACjH,CAAC;QACV,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kDAAkD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACnG,CAAC;IACL,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAA6B;QAC7C,+DAA+D;QAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC;QACtC,2CAA2C;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QACvC,mEAAmE;QACnE,sEAAsE;QACtE,oDAAoD;QACpD,MAAM,QAAQ,GAAsC;YAChD,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,0BAA0B,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAA,wCAAsB,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC;QACF,iEAAiE;QACjE,mEAAmE;QACnE,YAAY;QACZ,MAAM,OAAO,GAAG;YACZ,MAAM;YACN,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,CAAC;QACX,sCAAsC;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC;gBACD,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpH,CAAC;YACD,OAAO,CAAC,EAAE,CAAC;gBACP,qEAAqE;gBACrE,iDAAiD;gBACjD,qDAAqD;gBACrD,4BAA4B;gBAC5B,4CAA4C;gBAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,iCAAiC,CAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3H,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,0BAA0B,GAAG;wBAChH,cAAc,IAAI,CAAC,QAAQ,CAAC,YAAY,wBAAwB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI;wBAC9G,4GAA4G;wBAC5G,yDAAyD,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBACjF,CAAC;gBACD,MAAM,CAAC,CAAC;YACZ,CAAC;QACL,CAAC,CAAC,EAAE,CAAC;QACL,4DAA4D;QAC5D,+CAA+C;QAC/C,oEAAoE;QACpE,IAAI,CAAC;YACD,+CAA+C;YAC/C,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;YAClD,OAAO,IAAI,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACnI,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,GAAW,EAAE,OAA0B,EAAE,EAAE,OAAuB,EAAE;QACjF,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,OAAuB,EAAE;QACpD,oEAAoE;QACpE,6CAA6C;QAC7C,6CAA6C;QAC7C,MAAM,KAAK,GAAG,IAAA,0BAAY,EAAC,IAAI,EAAE,EAAE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3G,iEAAiE;QACjE,gDAAgD;QAChD,+DAA+D;QAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAC9C,CAAC,CAAC,QAAQ,IAAA,qBAAU,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,aAAa,MAAM,EAAE;YACrE,CAAC,CAAC,MAAM,CAAC;QACb,MAAM,UAAU,GAAG,IAAI,oBAAoB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAClE,kGAAkG;QAClG,kGAAkG;QAClG,6DAA6D;QAC7D,MAAM,iBAAiB,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,mBAA4B,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,kBAA2B,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC3L,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,kBAAkB,GAAY,IAAI,YAAY,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;QAC5F,IAAI,eAA0C,CAAC;QAC/C,IAAI,YAGmB,CAAC;QACxB,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS;YACrC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,OAAO,CAGV,CAAC,OAAO,EAAE,EAAE;gBACX,YAAY,GAAG,OAAO,CAAC;YAC3B,CAAC,CAAC,CAAC;QACP,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS;YAChC,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,GAAG,EAAE;gBACH,IAAI,OAAO;oBACP,OAAO;gBACX,2FAA2F;gBAC3F,uFAAuF;gBACvF,OAAO,GAAG,IAAI,CAAC;gBACf,kBAAkB,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,YAAY,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;gBAChG,eAAe,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClC,qFAAqF;gBACrF,mFAAmF;gBACnF,KAAK,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;YAC5K,CAAC,CAAC;QACN,MAAM,cAAc,GAAG,KAAK,IAAmB,EAAE;YAC7C,IAAI,CAAC,OAAO;gBACR,OAAO;YACX,MAAM,eAAe,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC9C,MAAM,kBAAkB,CAAC;QAC7B,CAAC,CAAC;QACF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,0FAA0F;YAC1F,IAAI,MAAM,CAAC,OAAO;gBACd,OAAQ,EAAE,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACD,MAAM,cAAc,GAAG;gBACnB,GAAG,EAAE,IAAA,6BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC;gBAC/C,IAAI,EAAE,IAAI,CAAC,GAAG;gBACd,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY;gBACpC,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,UAAU,EAAE,IAAa;aAC5B,CAAC;YACF,MAAM,cAAc,EAAE,CAAC;YACvB,6FAA6F;YAC7F,+EAA+E;YAC/E,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAsB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,cAAuB,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAClN,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC;gBAC3C,mBAAmB;gBACnB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1C,CAAC,CAAC;YACH,MAAM,cAAc,EAAE,CAAC;YACvB,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS;gBAC/B,MAAM,YAAY,CAAC,MAAM,CAAC;YAC9B,IAAI,YAAY,CAAC,IAAI,KAAK,cAAc;gBACpC,MAAM,YAAY,CAAC,KAAK,CAAC;YAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;YACnC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,gBAAyB,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,iBAA0B,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvK,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;gBACtC,iBAAiB;gBACjB,aAAa;gBACb,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1C,CAAC,CAAC;YACH,MAAM,cAAc,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACvC,yEAAyE;gBACzE,6CAA6C;gBAC7C,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1B,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBAC5E,MAAM,OAAO,CAAC,KAAK,CAAC;YACxB,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;gBAC1B,MAAM,OAAO,CAAC,MAAM,CAAC;YACzB,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,cAAc,EAAE,CAAC;YACvB,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACP,IAAI,OAAO,EAAE,CAAC;gBACV,MAAM,eAAe,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC9C,MAAM,kBAAkB,CAAC;YAC7B,CAAC;YACD,oEAAoE;YACpE,sEAAsE;YACtE,IAAI,CAAC,YAAY,sBAAgB,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACD,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC9B,CAAC;gBACD,OAAO,aAAa,EAAE,CAAC;oBACnB,IAAI,OAAO,EAAE,CAAC;wBACV,MAAM,eAAe,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;wBAC9C,MAAM,kBAAkB,CAAC;oBAC7B,CAAC;oBACD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBACpB,MAAM,aAAa,CAAC;gBACxB,CAAC;gBACD,MAAM,cAAc,EAAE,CAAC;gBACvB,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;YACD,kDAAkD;YAClD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,kDAAkD;gBAClD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,IAAI,wCAA0B,CAAC,+BAA+B,KAAK,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9H,CAAC;YACD,8FAA8F;YAC9F,8FAA8F;YAC9F,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,CAAC,CAAC;QACZ,CAAC;gBACO,CAAC;YACL,IAAI,OAAO,KAAK,SAAS;gBACrB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IACO,GAAG,CAAC,IAAY;QACpB,OAAO,IAAA,6BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAClD,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,GAAW,EAAE,OAA0B,EAAE,EAAE,OAAuB,EAAE;QACxF,OAAO,IAAA,uCAAuB,EAAC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACjG,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,OAAuB,EAAE;QAC3D,OAAO,IAAA,uCAAuB,EAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5F,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,IAAY;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,IAAY;QACzB,IAAI,CAAC;YACD,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACX,mCAAmC;YACnC,IAAI,IAAA,kCAAsB,EAAC,KAAK,CAAC,KAAK,SAAS;gBAC3C,MAAM,KAAK,CAAC;YAChB,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IACD,gEAAgE;IAChE,uDAAuD;IAC/C,KAAK,CAAC,mBAAmB,CAAC,KAAoC,EAAE,SAAkB;QACtF,MAAM,IAAI,GAAG,IAAA,6BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,IAAA,6BAAkB,EAAC,IAAI,EAAE,IAAI,CAAC;YACpC,IAAI,EAAE,aAAa,CAAC,OAAO,CAAC;SAC/B,CAAC,CAAC,CAAC;QACJ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YACpB,OAAO;QACX,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,OAAe;QACzC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,SAAS,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,OAAmB;QAC9C,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,MAAoB,EAAE,UAAkB;QACrD,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,IAAA,mBAAQ,EAAC,IAAA,2BAAgB,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,KAAK,CAAC,eAAe,CAAC,SAAuB,EAAE,SAAkB,EAAE,OAE/D,EAAE;QACF,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,IAAA,kCAAiB,EAAC,IAAA,2BAAgB,EAAC,SAAS,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5H,CAAC;IACD;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,UAAkB,EAAE,MAAoB;QACvD,MAAM,WAAW,GAAG,IAAA,2BAAgB,EAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,IAAA,gBAAK,EAAC,IAAA,mBAAO,EAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,MAAM,IAAA,oBAAS,EAAC,WAAW,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,SAAuB,EAAE,OAEhE,EAAE;QACF,MAAM,SAAS,GAAG,IAAA,6BAAkB,EAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,IAAA,+CAAuB,EAAC;YAC1B,QAAQ,EAAE,IAAA,2BAAgB,EAAC,SAAS,EAAE,SAAS,CAAC;YAChD,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;YACzB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;YAC/D,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;SAClE,CAAC,CAAC;IACP,CAAC;IACD,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;IACO,MAAM;QACV,IAAI,IAAI,CAAC,OAAO;YACZ,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS;YAC7B,OAAO,IAAI,CAAC,UAAU,CAAC;QAC3B,IAAI,OAAuB,CAAC;QAC5B,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO;gBAC3B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QACpC,CAAC,EAAE,CAAC,KAAc,EAAE,EAAE;YAClB,IAAI,IAAI,CAAC,UAAU,KAAK,OAAO;gBAC3B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAChC,MAAM,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC1B,OAAO,OAAO,CAAC;IACnB,CAAC;IACD;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACT,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACJ;AAnaD,gCAmaC;AACD,iGAAiG;AACjG,SAAS,aAAa,CAAC,KAAiB;IACpC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAgB,CAAC;AACpG,CAAC;AACD,gEAAgE;AAChE,SAAS,cAAc,CAAC,CAAU;IAC9B,IAAI,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,OAAO,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACvE,CAAC","sourcesContent":["// E2B 沙箱 provider:用 e2b SDK 把 E2B microVM 当隔离工作区跑 eval。\n// 契约对齐 ../types.ts 的 Sandbox 接口,与 DockerSandbox / VercelSandbox 可互换。\n//\n// 鉴权:E2B_API_KEY(team 级,e2b CLI `e2b auth login` 后也写在 ~/.e2b)。\n// 模板:opts.template 选 e2b 模板名/ID;省略用 e2b 默认 \"base\"。预制模板(烘焙好\n// codex/claude-code/bub 的 \"niceeval-agents\")见 sandbox/e2b/。\nimport { Sandbox as E2BSdkSandbox, CommandExitError, NotFoundError, RateLimitError } from \"e2b\";\nimport { Clock, Effect } from \"effect\";\nimport { randomUUID } from \"node:crypto\";\nimport { t } from \"../i18n/index.ts\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { CommandResult, CommandOptions, ManagedProcess, ManagedProcessStart, SandboxReuseCapability, SuccessfulCommandResult, } from \"../types.ts\";\nimport { classifyProvisionErrorFallback, isRetryableProvisionError, type SandboxProvisionErrorKind, } from \"./errors.ts\";\nimport { classifySandboxIoError } from \"./errors.ts\";\nimport { downloadDirectoryByList } from \"./download-directory.ts\";\nimport { collectLocalFiles, type CollectedLocalFile } from \"./local-files.ts\";\nimport { shellQuote } from \"./shell.ts\";\nimport { resolveLocalPath, resolveSandboxPath } from \"./paths.ts\";\nimport { e2bRunIdentityMetadata, type RunIdentity } from \"./run-identity.ts\";\nimport { commandLimit, SandboxCommandTimeoutError } from \"./deadline.ts\";\nimport { successfulCommandResult } from \"./operations.ts\";\nimport { ManagedProcessOutput } from \"./managed-process.ts\";\nimport { supportedBackendCapability, unsupportedBackendCapability, unsupportedBackendCapabilityBecause, type SandboxProviderBackend } from \"./backend.ts\";\n// e2b 默认用户 \"user\",home 在 /home/user;工作区放其下。\nconst E2B_WORKDIR = \"/home/user/workspace\";\ntype E2BCommandOutputChannel = \"stdout\" | \"stderr\";\ninterface E2BCommandOutputState {\n pending: string;\n output: string;\n markerStarted: boolean;\n complete: boolean;\n exitCode?: number;\n invalidMarkerPayload?: string;\n}\n/** SDK/event Promises stay at the boundary; Effect owns which outcome wins and interrupts its waiter fibers. */\nfunction raceCommandOutcomes<const Outcomes extends readonly [\n Promise<unknown>,\n ...Promise<unknown>[]\n]>(outcomes: Outcomes): Promise<Awaited<Outcomes[number]>> {\n const effects = outcomes.map((outcome) => Effect.promise(() => outcome)) as [\n Effect.Effect<unknown>,\n ...Effect.Effect<unknown>[]\n ];\n return Effect.runPromise(Effect.raceAll(effects)) as Promise<Awaited<Outcomes[number]>>;\n}\n/**\n * 把 marker 编成 bash 的 printf `%b` 输入。wrapper 源码与 xtrace 诊断因此不会直接包含\n * 可被 parser 当成一整帧的 prefix/suffix;实际字节仍由同一个 bash supervisor 生成。\n */\nfunction shellByteEscapes(value: string): string {\n return [...Buffer.from(value, \"utf8\")]\n .map((byte) => `\\\\x${byte.toString(16).padStart(2, \"0\")}`)\n .join(\"\");\n}\n/** 当前内容仍可能是 `digits + suffix` 的跨 chunk 前缀。 */\nfunction isCompletionFramePrefix(encoded: string, suffix: string): boolean {\n if (encoded.length === 0)\n return true;\n let firstNonDigit = 0;\n while (firstNonDigit < encoded.length && /\\d/.test(encoded[firstNonDigit]!))\n firstNonDigit += 1;\n if (firstNonDigit === encoded.length)\n return true;\n if (firstNonDigit === 0)\n return false;\n const suffixPrefix = encoded.slice(firstNonDigit);\n return suffixPrefix.length < suffix.length && suffix.startsWith(suffixPrefix);\n}\n/**\n * E2B 的 command RPC 把进程终局与 stdout/stderr event stream 绑在一起。shell 已退出、但它\n * 有意留下的后台服务仍继承管道时,SDK `wait()` 会继续等 event stream EOF。这里给直接 shell\n * 加一个不改写输出目的地的 supervisor:两路 marker 都由直接 shell 结束后写出;收到后只\n * disconnect transport,不 kill 后台服务。timeout / cancellation 仍由调用方退休整台 VM。\n */\nclass E2BCommandCompletion {\n readonly script: string;\n readonly completion: Promise<number>;\n private readonly prefix: string;\n private readonly suffix: string;\n private readonly states: globalThis.Record<E2BCommandOutputChannel, E2BCommandOutputState> = {\n stdout: { pending: \"\", output: \"\", markerStarted: false, complete: false },\n stderr: { pending: \"\", output: \"\", markerStarted: false, complete: false },\n };\n private readonly callbacks: Partial<globalThis.Record<E2BCommandOutputChannel, (chunk: string) => void | Promise<void>>>;\n private readonly resolveCompletion: (exitCode: number) => void;\n private readonly rejectCompletion: (error: Error) => void;\n constructor(script: string, opts: Pick<CommandOptions, \"onStdout\" | \"onStderr\">) {\n const id = randomUUID().replaceAll(\"-\", \"\");\n this.prefix = `__niceeval_e2b_command_${id}_exit_`;\n this.suffix = `__niceeval_e2b_command_${id}_end__`;\n this.callbacks = {\n ...(opts.onStdout ? { stdout: opts.onStdout } : {}),\n ...(opts.onStderr ? { stderr: opts.onStderr } : {}),\n };\n let resolveCompletion!: (exitCode: number) => void;\n let rejectCompletion!: (error: Error) => void;\n this.completion = new Promise<number>((resolve, reject) => {\n resolveCompletion = resolve;\n rejectCompletion = reject;\n });\n this.resolveCompletion = resolveCompletion;\n this.rejectCompletion = rejectCompletion;\n // 原脚本住在异步 subshell:它继续继承 E2B login shell 的变量、函数、cwd 与 shell option,\n // `exit` / `exec` / EXIT trap 只结束自己的 shell。外层只 wait 这个直接 shell,不会等它\n // 有意留下的孙进程;因此能在 `nohup ... &` 之后可靠写出两路终局 marker。\n const encodedPrefix = shellQuote(shellByteEscapes(this.prefix));\n const encodedSuffix = shellQuote(shellByteEscapes(this.suffix));\n this.script = [\n \"(\",\n script,\n \") &\",\n \"__niceeval_e2b_command_pid=$!\",\n \"if wait \\\"$__niceeval_e2b_command_pid\\\"; then\",\n \" __niceeval_e2b_command_exit=0\",\n \"else\",\n \" __niceeval_e2b_command_exit=$?\",\n \"fi\",\n `__niceeval_e2b_command_prefix=$(printf '%b' ${encodedPrefix})`,\n `__niceeval_e2b_command_suffix=$(printf '%b' ${encodedSuffix})`,\n `printf '%s%s%s' \\\"$__niceeval_e2b_command_prefix\\\" \\\"$__niceeval_e2b_command_exit\\\" \\\"$__niceeval_e2b_command_suffix\\\"`,\n `printf '%s%s%s' \\\"$__niceeval_e2b_command_prefix\\\" \\\"$__niceeval_e2b_command_exit\\\" \\\"$__niceeval_e2b_command_suffix\\\" >&2`,\n \"exit \\\"$__niceeval_e2b_command_exit\\\"\",\n ].join(\"\\n\");\n }\n readonly onStdout = async (chunk: string): Promise<void> => this.consume(\"stdout\", chunk);\n readonly onStderr = async (chunk: string): Promise<void> => this.consume(\"stderr\", chunk);\n result(exitCode: number): CommandResult {\n return {\n stdout: this.states.stdout.output,\n stderr: this.states.stderr.output,\n exitCode,\n };\n }\n /** SDK 在 marker 前先结束时,把为跨 chunk 匹配暂存的普通输出交还调用方。 */\n async finish(): Promise<void> {\n for (const channel of [\"stdout\", \"stderr\"] as const) {\n const state = this.states[channel];\n if (!state.complete && !state.markerStarted && state.pending.length > 0) {\n const pending = state.pending;\n state.pending = \"\";\n await this.emit(channel, pending);\n }\n }\n const invalid = ([\"stdout\", \"stderr\"] as const)\n .map((channel) => ({ channel, state: this.states[channel] }))\n .find(({ state }) => !state.complete && state.invalidMarkerPayload !== undefined);\n if (invalid !== undefined) {\n throw new Error(`e2b command completion marker carried an invalid exit code: ${JSON.stringify(invalid.state.invalidMarkerPayload)}`);\n }\n const mismatch = this.exitCodeMismatch();\n if (mismatch !== undefined)\n throw mismatch;\n const partial = ([\"stdout\", \"stderr\"] as const).filter((channel) => {\n const state = this.states[channel];\n return state.markerStarted && !state.complete;\n });\n if (partial.length > 0) {\n throw new Error(`e2b command completion marker was truncated on ${partial.join(\" and \")}`);\n }\n const completed = ([\"stdout\", \"stderr\"] as const).filter((channel) => this.states[channel].complete);\n if (completed.length === 1) {\n throw new Error(`e2b command completion marker was received only on ${completed[0]}`);\n }\n }\n private async consume(channel: E2BCommandOutputChannel, chunk: string): Promise<void> {\n const state = this.states[channel];\n // 直接 shell 已结束后的输出只能来自它留下的后台服务;command transport 到这里已经封口。\n if (state.complete)\n return;\n state.pending += chunk;\n while (!state.complete) {\n if (!state.markerStarted) {\n const markerAt = state.pending.indexOf(this.prefix);\n if (markerAt < 0) {\n // marker 可能跨 SDK chunk;只保留足以匹配 prefix 的尾巴,其余实时透传。\n const safeLength = Math.max(0, state.pending.length - this.prefix.length + 1);\n if (safeLength > 0) {\n const safe = state.pending.slice(0, safeLength);\n state.pending = state.pending.slice(safeLength);\n await this.emit(channel, safe);\n }\n return;\n }\n const before = state.pending.slice(0, markerAt);\n state.pending = state.pending.slice(markerAt);\n await this.emit(channel, before);\n state.markerStarted = true;\n }\n const encoded = state.pending.slice(this.prefix.length);\n const markerEnd = encoded.indexOf(this.suffix);\n if (markerEnd >= 0) {\n const encodedExitCode = encoded.slice(0, markerEnd);\n if (!/^\\d+$/.test(encodedExitCode) || !Number.isSafeInteger(Number(encodedExitCode))) {\n // wrapper 源码、bash -x 和 SDK 转义诊断都可能带 marker 字面量。它们不是完成帧,\n // 作为普通输出保留,并继续寻找后面的真实帧;只有 stream 结束仍没有真实帧时,\n // finish() 才把这条协议错误交给调用方。\n state.invalidMarkerPayload ??= encodedExitCode;\n const invalid = state.pending.slice(0, this.prefix.length + markerEnd + this.suffix.length);\n state.pending = encoded.slice(markerEnd + this.suffix.length);\n state.markerStarted = false;\n await this.emit(channel, invalid);\n continue;\n }\n state.exitCode = Number(encodedExitCode);\n state.complete = true;\n // suffix 后同一个 chunk 里的字节来自后台服务;它们不属于已经 settle 的直接命令。\n state.pending = \"\";\n this.maybeComplete();\n return;\n }\n if (isCompletionFramePrefix(encoded, this.suffix))\n return;\n // 当前 prefix 后的内容已经不可能组成数字帧。先把 prefix 当普通输出吐出,再从\n // 剩余文本继续扫描;这样 source/diagnostic 中的假 prefix 不会吞掉后面的真实帧。\n state.pending = encoded;\n state.markerStarted = false;\n await this.emit(channel, this.prefix);\n }\n }\n private async emit(channel: E2BCommandOutputChannel, chunk: string): Promise<void> {\n if (chunk.length === 0)\n return;\n this.states[channel].output += chunk;\n await this.callbacks[channel]?.(chunk);\n }\n private maybeComplete(): void {\n const stdoutExit = this.states.stdout.exitCode;\n const stderrExit = this.states.stderr.exitCode;\n if (stdoutExit === undefined || stderrExit === undefined)\n return;\n const mismatch = this.exitCodeMismatch();\n if (mismatch !== undefined) {\n this.rejectCompletion(mismatch);\n return;\n }\n this.resolveCompletion(stdoutExit);\n }\n private exitCodeMismatch(): Error | undefined {\n const stdoutExit = this.states.stdout.exitCode;\n const stderrExit = this.states.stderr.exitCode;\n if (stdoutExit === undefined || stderrExit === undefined || stdoutExit === stderrExit)\n return undefined;\n return new Error(`e2b command completion markers disagreed on exit code: stdout=${stdoutExit}, stderr=${stderrExit}`);\n }\n}\n/** e2b 的限流错误是 SDK 原生的 RateLimitError(HTTP 429 映射而来);见 retry.ts 的 withProvisionRetry。 */\n// 对账本身只有一次机会:retry.ts 的 withProvisionRetry 对账失败就直接放弃重试、抛回原始\n// create() 错误(见那边的注释)。对账走的这次 list 请求跟刚失败的 create() 往往挨得很近,\n// 大概率处在同一段网络抖动里——不给它自己的重试,一次瞬时失败就会把本可能自愈的 attempt\n// 判死。这里给 nextItems() 单独包一层短重试,只吃与 create() 侧同一套分类下的瞬时错误。\nconst RECONCILE_LIST_MAX_ATTEMPTS = 3;\nconst RECONCILE_LIST_RETRY_DELAY_MS = 500;\n/**\n * E2B 创建请求必须明确说明寿命是作者声明、attempt deadline 派生,还是没有 deadline 可派生。\n * 把这个区分留在类型里,运行时就不会再把「没有显式 lifetimeMs」误传成 SDK 的短默认值。\n */\nexport type E2BSandboxLifetime = {\n readonly _tag: \"ProviderDefault\";\n} | {\n readonly _tag: \"Requested\";\n readonly milliseconds: number;\n readonly source: \"explicit\" | \"attempt-deadline\";\n};\ninterface E2BSandboxCreateOptions {\n readonly timeout?: number;\n /** attempt deadline 的截止时刻(epoch ms);单条命令按剩余量取上限。 */\n readonly deadlineAt?: number;\n readonly runtime?: \"node20\" | \"node24\";\n readonly template?: string;\n /** 覆盖整个 Sandbox 的默认执行身份;省略时沿用 template 的默认用户。 */\n readonly user?: string;\n /**\n * 按序前置到受管 `PATH` 的目录;省略 = 不改 PATH(见 docs/feature/sandbox/library.md\n * 「PATH:受管变量与 pathPrepend」)。\n */\n readonly pathPrepend?: readonly string[];\n readonly provisionToken?: string;\n /** 运行时已解析的实例寿命;bounded attempt 不能退回 E2B 的 SDK 默认值。 */\n readonly lifetime: E2BSandboxLifetime;\n /** 创建期写入的运行标识(host/pid/startedAt),供强杀之后的孤儿核对按 metadata 事后收回\n * (见 docs/feature/sandbox/architecture.md「孤儿核对」)。 */\n readonly runIdentity?: RunIdentity;\n}\n/**\n * Provisioning 重试前的对账:按 metadata 里的 provision token 检索远端实例,查到即 kill。\n * 检索或销毁失败必须抛出——对账是重试的硬前置,静默放行等于盲重试,会复制计费实例\n * (见 docs/feature/sandbox/architecture.md「Provisioning 失败与重试」)。\n * 唯一的例外:实例已不存在(NotFound),视作对账完成。\n */\nexport async function reconcileProvision(token: string): Promise<void> {\n const apiKey = process.env.E2B_API_KEY;\n // Sandbox.list() 是同步方法,返回分页器(SandboxPaginator),不是 Promise<数组>——用\n // hasNext/nextItems() 翻页,不能直接 for...of。metadata 过滤走服务端 query,一次 token\n // 命中的实例数极少,通常一页打完。\n const paginator = E2BSdkSandbox.list({ apiKey, query: { metadata: { \"niceeval-provision-token\": token } } });\n while (paginator.hasNext) {\n const sandboxes = await fetchNextItemsWithRetry(paginator);\n for (const info of sandboxes) {\n try {\n await E2BSdkSandbox.kill(info.sandboxId, { apiKey });\n }\n catch (e) {\n if (!(e instanceof NotFoundError))\n throw e;\n }\n }\n }\n}\ntype E2BReconcilePaginator = ReturnType<typeof E2BSdkSandbox.list>;\ntype E2BReconcileListPage = Awaited<ReturnType<E2BReconcilePaginator[\"nextItems\"]>>;\n/**\n * `nextItems()` 按类型契约总是 resolve 成数组(SDK 内部对空响应也兜了 `?? []`),但对账这条\n * 路径线上真实撞见过它 resolve 成非数组的一次——没能复现出确切成因,不排它,原样让下面的\n * 类型守卫抛出,但换一句能定位的诊断,而不是留一条裸的 \"X is not iterable\"。\n *\n * 重试是 NiceEval 内部策略(attempt 数、delay 公式与错误分类和原来完全一致):\n * 等待用 `Effect.sleep`(Clock)、SDK Promise 在 `tryPromise` 边界适配一次,\n * 原始错误对象原样留在失败通道,耗尽重试时抛回的是同一个对象。\n */\nfunction fetchNextItemsWithRetryEffect(paginator: E2BReconcilePaginator): Effect.Effect<E2BReconcileListPage, unknown> {\n const attempt = (n: number): Effect.Effect<E2BReconcileListPage, unknown> => Effect.tryPromise({\n try: () => paginator.nextItems(),\n catch: (cause) => cause,\n }).pipe(Effect.flatMap((items) => {\n if (Array.isArray(items))\n return Effect.succeed(items);\n return Effect.fail(new Error(t(\"e2b.listNextItemsNotArray\", { type: typeof items })));\n }), Effect.catchAll((error) => {\n const kind = classifyProvisionErrorFallback(error);\n if (n >= RECONCILE_LIST_MAX_ATTEMPTS - 1 || !isRetryableProvisionError(kind))\n return Effect.fail(error);\n return Clock.sleep(RECONCILE_LIST_RETRY_DELAY_MS * 2 ** n).pipe(Effect.zipRight(attempt(n + 1)));\n }));\n return attempt(0);\n}\nasync function fetchNextItemsWithRetry(paginator: E2BReconcilePaginator): Promise<E2BReconcileListPage> {\n return Effect.runPromise(fetchNextItemsWithRetryEffect(paginator));\n}\nexport function classifyProvisionError(e: unknown): SandboxProvisionErrorKind {\n // SDK 原生限流先归拒绝类;没认出的过与文件 IO 共用的保守瞬时兜底分类器\n // (真实跑分里出现过 create 阶段 `fetch failed · other side closed`,属歧义类)。\n if (e instanceof RateLimitError)\n return \"rate_limit\";\n return classifyProvisionErrorFallback(e);\n}\nexport class E2BSandbox implements SandboxProviderBackend, SandboxReuseCapability {\n readonly workdir = E2B_WORKDIR;\n readonly otlpHost = null;\n private sbx: E2BSdkSandbox;\n private commandTimeoutMs?: number;\n /** A VM retirement is idempotent across abort, transport failure, and the scope finalizer. */\n private retirement?: Promise<void>;\n private retired = false;\n /** 已实际请求的实例寿命;复用下续期一律续到这个值(滑动窗口)。 */\n private lifetime: E2BSandboxLifetime;\n /** 起点覆盖(factory `user`);省略 = 沿用 template 的默认用户。 */\n private readonly userOverride?: string;\n /** factory `pathPrepend`;按声明顺序前置到受管 PATH,省略 = 空数组。 */\n private readonly pathPrepend: readonly string[];\n readonly sandboxId: string;\n private deadlineAt?: number;\n readonly capabilities = {\n rootCommands: supportedBackendCapability(true as const),\n appendLog: unsupportedBackendCapability,\n suspend: supportedBackendCapability(() => this.suspend()),\n ensureLifetime: supportedBackendCapability((minRemainingMs: number) => this.ensureLifetime(minRemainingMs)),\n setCommandDeadline: supportedBackendCapability((deadlineAt?: number) => this.setCommandDeadline(deadlineAt)),\n managedProcess: unsupportedBackendCapabilityBecause(\"E2B managed processes are not enabled until the provider boundary has a public installed-candidate E2E owner\"),\n };\n private async startManagedProcess(input: ManagedProcessStart): Promise<ManagedProcess> {\n const output = new ManagedProcessOutput();\n const command = input.argv.map(shellQuote).join(\" \");\n const script = this.pathPrepend.length === 0\n ? `exec ${command}`\n : `PATH=${shellQuote(this.pathPrepend.join(\":\"))}:\"$PATH\"\\nexec ${command}`;\n const handle = await this.sbx.commands.run(script, {\n background: true,\n stdin: true,\n cwd: resolveSandboxPath(this.workdir, input.cwd),\n envs: input.env === undefined ? undefined : { ...input.env },\n ...(this.userOverride === undefined ? {} : { user: this.userOverride }),\n onStdout: (chunk) => output.push({ _tag: \"Stdout\", bytes: new TextEncoder().encode(chunk) }),\n onStderr: (chunk) => output.push({ _tag: \"Stderr\", bytes: new TextEncoder().encode(chunk) }),\n });\n const exit = handle.wait().then((result) => ({ exitCode: result.exitCode } as const), (error: unknown) => {\n if (error instanceof CommandExitError)\n return { exitCode: error.exitCode } as const;\n throw error;\n }).finally(() => output.end());\n let closeReceipt: Promise<void> | undefined;\n let terminateReceipt: Promise<void> | undefined;\n let stdinState: \"open\" | \"closing\" | \"closed\" = \"open\";\n return {\n output,\n writeStdin: (bytes) => stdinState === \"open\" ? handle.sendStdin(bytes) : Promise.reject(new Error(\"managed process stdin is closed\")),\n closeStdin: () => closeReceipt ??= (async () => {\n stdinState = \"closing\";\n await handle.closeStdin();\n stdinState = \"closed\";\n })(),\n wait: () => exit,\n terminate: () => terminateReceipt ??= (async () => {\n stdinState = \"closing\";\n await handle.kill();\n await exit.catch(() => undefined);\n stdinState = \"closed\";\n })(),\n };\n }\n private constructor(sbx: E2BSdkSandbox, id: string, commandTimeoutMs: number | undefined, lifetime: E2BSandboxLifetime, userOverride: string | undefined, pathPrepend: readonly string[] = [], deadlineAt?: number) {\n this.sbx = sbx;\n this.sandboxId = id;\n this.commandTimeoutMs = commandTimeoutMs;\n this.lifetime = lifetime;\n this.userOverride = userOverride;\n this.pathPrepend = pathPrepend;\n this.deadlineAt = deadlineAt;\n }\n /** 复用下由池在每次借出时换成承接者自己的 deadline(见 sandbox/deadline.ts)。 */\n setCommandDeadline(deadlineAt?: number): void {\n this.deadlineAt = deadlineAt;\n }\n /**\n * 寿命确认:先问远端真实到期时刻,不够再续,续完**重新问一次**。\n *\n * 两处都读 `getInfo().endAt` 而不是复读我们请求的值,是这条能力的全部要害——e2b 的账号档位\n * 会把 `setTimeout` 的请求值压到平台上限(免费档尤其明显)。拿请求值记账等于把「平台压短了」\n * 伪装成「作者声明生效了」,而症状要到 attempt 跑到一半、实例被回收时才出现,那时只剩一句\n * 无归属的 sandbox 消失。宁可在这里如实报 `ready: false` 让 runner 轮换实例。\n */\n async ensureLifetime(minRemainingMs: number): Promise<{\n ready: true;\n expiresAt?: string;\n } | {\n ready: false;\n reason: string;\n }> {\n if (this.lifetime._tag === \"ProviderDefault\") {\n return {\n ready: false,\n reason: \"the e2b sandbox has no requested lifetime; an unlimited attempt must declare lifetimeMs before sandboxReuse\",\n };\n }\n try {\n const remainingMs = async () => (await this.sbx.getInfo()).endAt.getTime() - Date.now();\n const before = await remainingMs();\n if (before >= minRemainingMs)\n return { ready: true, expiresAt: new Date(Date.now() + before).toISOString() };\n // setTimeout 是「从此刻起再活这么久」,不是增量;续到创建期实际请求的完整寿命。\n await this.sbx.setTimeout(this.lifetime.milliseconds);\n const after = await remainingMs();\n return after >= minRemainingMs\n ? { ready: true, expiresAt: new Date(Date.now() + after).toISOString() }\n : {\n ready: false,\n reason: `e2b capped this sandbox's lifetime at ${Math.round(after / 1000)}s after renewing to the ${this.lifetime.source === \"explicit\" ? \"declared\" : \"attempt-deadline-derived\"} ` +\n `lifetimeMs=${this.lifetime.milliseconds}ms; the next attempt needs ${Math.round(minRemainingMs / 1000)}s`,\n };\n }\n catch (e) {\n return { ready: false, reason: `e2b could not confirm this sandbox's lifetime: ${String(e)}` };\n }\n }\n static async create(opts: E2BSandboxCreateOptions): Promise<E2BSandbox> {\n // 单条命令没有 provider 级默认:上限恒从 attempt deadline 派生(见 deadline.ts)。\n const commandTimeoutMs = opts.timeout;\n // e2b 的 node 版本由模板决定,runtime 仅作记录(不在创建时选)。\n const apiKey = process.env.E2B_API_KEY;\n // provision token 与运行标识都经 metadata 打进实例(同一通道):歧义类失败(fetch failed ·\n // other side closed)重试前按 token 检索远端、销毁可能已创建的实例(见 reconcileProvision);\n // 运行标识供 `sandbox list --orphans` 按 metadata 过滤事后核对。\n const metadata: globalThis.Record<string, string> = {\n ...(opts.provisionToken ? { \"niceeval-provision-token\": opts.provisionToken } : {}),\n ...(opts.runIdentity ? e2bRunIdentityMetadata(opts.runIdentity) : {}),\n };\n // bounded attempt 一定携带由 runtime 派生的 timeoutMs;只有没有 deadline 可派生的\n // unlimited attempt 才允许 ProviderDefault。NiceEval 不把某个账号档位观测到的上限硬编码\n // 成全体用户的契约。\n const sdkOpts = {\n apiKey,\n ...(opts.lifetime._tag === \"Requested\" ? { timeoutMs: opts.lifetime.milliseconds } : {}),\n ...(Object.keys(metadata).length > 0 ? { metadata } : {}),\n } as const;\n // 有 template 就从模板起,否则用 e2b 默认 \"base\"。\n const sbx = await (async () => {\n try {\n return opts.template ? await E2BSdkSandbox.create(opts.template, sdkOpts) : await E2BSdkSandbox.create(sdkOpts);\n }\n catch (e) {\n // 声明的寿命超出账号档位上限时,e2b 返回 400「Timeout cannot be greater than N hours」。\n // 这是确定性配置死因(同一个值重试多少次都是同一个 400),而裸 SDK 栈既不说是哪个字段\n // 惹的祸、也不说上限是多少。把 provider 的理由原样带出来并指到 lifetimeMs 上——\n // 「不能静默压短」的另一半是「压不下就把原因说清楚」\n // (见 docs/feature/sandbox/reuse.md「派发前确认」)。\n if (opts.lifetime._tag === \"Requested\" && /timeout cannot be greater than/i.test(e instanceof Error ? e.message : String(e))) {\n throw new Error(`e2b rejected the ${opts.lifetime.source === \"explicit\" ? \"declared\" : \"attempt-deadline-derived\"} ` +\n `lifetimeMs=${opts.lifetime.milliseconds}ms for this account: ${e instanceof Error ? e.message : String(e)}. ` +\n \"Lower the attempt timeout or lifetimeMs to fit the plan's maximum sandbox lifetime, or raise that maximum \" +\n \"on the e2b side; niceeval will not silently shorten it.\", { cause: e });\n }\n throw e;\n }\n })();\n // kill-on-failure:实例句柄已到手,创建之后的初始化请求(如下面的 mkdir 撞 429)一旦失败,\n // 先尽力销毁实例再抛出原始错误——否则重试层按「拒绝类=远端没有实例」盲重试,就会复制一台\n // 计费实例(见 docs/feature/sandbox/architecture.md「Provisioning 失败与重试」)。\n try {\n // 备好工作区目录(模板默认 cwd 是 home,workspace 子目录可能不存在)。\n await sbx.commands.run(`mkdir -p ${E2B_WORKDIR}`);\n return new E2BSandbox(sbx, sbx.sandboxId, commandTimeoutMs, opts.lifetime, opts.user, opts.pathPrepend ?? [], opts.deadlineAt);\n }\n catch (e) {\n await sbx.kill().catch(() => { });\n throw e;\n }\n }\n async runCommand(cmd: string, args: readonly string[] = [], opts: CommandOptions = {}): Promise<CommandResult> {\n const line = [cmd, ...args.map(shellQuote)].join(\" \");\n return this.runShell(line, opts);\n }\n async runShell(script: string, opts: CommandOptions = {}): Promise<CommandResult> {\n // e2b commands.run 直接透传同名 user 参数;省略时沿用 Sandbox 默认身份(factory `user`\n // 覆盖后的身份,否则 template 默认用户)—— 跨 provider 语义一致\n // (见 docs/feature/sandbox/library.md「执行身份」)。\n const limit = commandLimit(opts, { commandTimeoutMs: this.commandTimeoutMs, deadlineAt: this.deadlineAt });\n // pathPrepend 是受管 PATH,在脚本自己的 shell 里对 `$PATH` 前置——env 走的是 SDK 的\n // envs 参数(可能被 opts.env.PATH 覆盖),而这一行在它之后执行,始终生效\n // (见 docs/feature/sandbox/library.md「PATH:受管变量与 pathPrepend」)。\n const scriptWithPath = this.pathPrepend.length > 0\n ? `PATH=${shellQuote(this.pathPrepend.join(\":\"))}:\"$PATH\"\\n${script}`\n : script;\n const completion = new E2BCommandCompletion(scriptWithPath, opts);\n // Attach a rejection handler before starting the SDK command. A malformed marker can reject while\n // commands.run() is still delivering its initial events; keeping this outcome fulfilled avoids an\n // unhandled rejection before the command handle is returned.\n const completionOutcome = completion.completion.then((exitCode) => ({ _tag: \"DirectShellExited\" as const, exitCode }), (error: unknown) => ({ _tag: \"CompletionFailed\" as const, error }));\n const signal = opts.signal;\n let aborted = false;\n let cancellationReason: unknown = new DOMException(\"sandbox command aborted\", \"AbortError\");\n let abortRetirement: Promise<void> | undefined;\n let resolveAbort: ((outcome: {\n readonly _tag: \"Aborted\";\n readonly reason: unknown;\n }) => void) | undefined;\n const abortOutcome = signal === undefined\n ? undefined\n : new Promise<{\n readonly _tag: \"Aborted\";\n readonly reason: unknown;\n }>((resolve) => {\n resolveAbort = resolve;\n });\n const onAbort = signal === undefined\n ? undefined\n : () => {\n if (aborted)\n return;\n // This flag must change synchronously. Marker delivery can finish while kill() is still in\n // flight; every success path checks it before settling and awaits the same retirement.\n aborted = true;\n cancellationReason = signal.reason ?? new DOMException(\"sandbox command aborted\", \"AbortError\");\n abortRetirement ??= this.retire();\n // Cancellation waits for retirement to settle, but a kill transport failure must not\n // replace the caller's AbortSignal reason. A later stop() may retry a failed kill.\n void abortRetirement.then(() => resolveAbort?.({ _tag: \"Aborted\", reason: cancellationReason }), () => resolveAbort?.({ _tag: \"Aborted\", reason: cancellationReason }));\n };\n const throwIfAborted = async (): Promise<void> => {\n if (!aborted)\n return;\n await abortRetirement?.catch(() => undefined);\n throw cancellationReason;\n };\n if (signal !== undefined) {\n signal.addEventListener(\"abort\", onAbort!, { once: true });\n // Close the check/listener race: AbortSignal does not replay an abort to a late listener.\n if (signal.aborted)\n onAbort!();\n }\n try {\n const commandOptions = {\n cwd: resolveSandboxPath(this.workdir, opts.cwd),\n envs: opts.env,\n user: opts.user ?? this.userOverride,\n ...(limit.timeoutMs !== undefined ? { timeoutMs: limit.timeoutMs } : {}),\n onStdout: completion.onStdout,\n onStderr: completion.onStderr,\n background: true as const,\n };\n await throwIfAborted();\n // Starting a background command is itself a remote RPC and can hang. Race handle acquisition\n // against the abort retirement, while eagerly handling a late start rejection.\n const commandStartOutcome = this.sbx.commands.run(completion.script, commandOptions).then((handle) => ({ _tag: \"HandleReady\" as const, handle }), (error: unknown) => ({ _tag: \"HandleFailed\" as const, error }));\n const startOutcome = await raceCommandOutcomes([\n commandStartOutcome,\n ...(abortOutcome ? [abortOutcome] : []),\n ]);\n await throwIfAborted();\n if (startOutcome._tag === \"Aborted\")\n throw startOutcome.reason;\n if (startOutcome._tag === \"HandleFailed\")\n throw startOutcome.error;\n const handle = startOutcome.handle;\n const streamOutcome = handle.wait().then((result) => ({ _tag: \"SdkStreamEnded\" as const, result }), (error: unknown) => ({ _tag: \"SdkStreamFailed\" as const, error }));\n const outcome = await raceCommandOutcomes([\n completionOutcome,\n streamOutcome,\n ...(abortOutcome ? [abortOutcome] : []),\n ]);\n await throwIfAborted();\n if (outcome._tag === \"DirectShellExited\") {\n // SDK 文档保证 disconnect 只断 event transport、不 kill command。直接 shell 已退出;仍持有\n // stdout/stderr 的只能是它有意留下的后台服务,正是这条路径要保留的对象。\n await handle.disconnect();\n await throwIfAborted();\n return completion.result(outcome.exitCode);\n }\n if (outcome._tag === \"CompletionFailed\" || outcome._tag === \"SdkStreamFailed\") {\n throw outcome.error;\n }\n if (outcome._tag === \"Aborted\")\n throw outcome.reason;\n await completion.finish();\n await throwIfAborted();\n return completion.result(outcome.result.exitCode);\n }\n catch (e) {\n if (aborted) {\n await abortRetirement?.catch(() => undefined);\n throw cancellationReason;\n }\n // e2b 在退出码非 0 时【抛】CommandExitError;但 Sandbox 契约要求【返回】带 exitCode 的结果\n // (与 docker / vercel 一致)——否则 agent 命令 / build / 测试一旦非 0 退出就会炸,而不是被判分。\n if (e instanceof CommandExitError) {\n try {\n await completion.finish();\n }\n catch (callbackError) {\n if (aborted) {\n await abortRetirement?.catch(() => undefined);\n throw cancellationReason;\n }\n await this.retire();\n throw callbackError;\n }\n await throwIfAborted();\n return completion.result(e.exitCode);\n }\n // 撞的是我们给的那条线时,把归属一起抛出去(runner 据此落 error.timeout)。\n if (limit.timeoutMs !== undefined && isTimeoutError(e)) {\n // SDK timeout 只保证终止入口进程,不能证明命令树已经消失;按公共契约退休整台 VM。\n await this.retire();\n throw new SandboxCommandTimeoutError(`e2b command timed out after ${limit.timeoutMs}ms`, limit.timeoutMs, limit.explicit);\n }\n // Stream transport, output callbacks, marker integrity, and disconnect failures all leave the\n // managed command tree in an unknown state. Retire the VM before exposing the original error.\n await this.retire();\n throw e;\n }\n finally {\n if (onAbort !== undefined)\n signal?.removeEventListener(\"abort\", onAbort);\n }\n }\n private abs(path: string): string {\n return resolveSandboxPath(this.workdir, path);\n }\n async runCommandOrThrow(cmd: string, args: readonly string[] = [], opts: CommandOptions = {}): Promise<SuccessfulCommandResult> {\n return successfulCommandResult(await this.runCommand(cmd, args, opts), opts.sensitiveValues);\n }\n async runShellOrThrow(script: string, opts: CommandOptions = {}): Promise<SuccessfulCommandResult> {\n return successfulCommandResult(await this.runShell(script, opts), opts.sensitiveValues);\n }\n async readText(path: string): Promise<string> {\n return this.sbx.files.read(this.abs(path), { format: \"text\" });\n }\n async pathExists(path: string): Promise<boolean> {\n try {\n return await this.sbx.files.exists(this.abs(path));\n }\n catch (error) {\n // 不把瞬时网络/服务错误伪装成“不存在”,交给统一 IO 层重试。\n if (classifySandboxIoError(error) !== \"unknown\")\n throw error;\n return false;\n }\n }\n // targetDir 已由 paths.ts 的 normalizeSandboxPaths 解析成绝对路径;这里再解析一次\n // 只是对直接使用 provider 实例(未包 normalize)的幂等防御,提到 map 外只算一次。\n private async writeCollectedFiles(files: readonly CollectedLocalFile[], targetDir?: string): Promise<void> {\n const base = resolveSandboxPath(this.workdir, targetDir);\n const entries = files.map(({ path, content }) => ({\n path: resolveSandboxPath(base, path),\n data: toArrayBuffer(content),\n }));\n if (entries.length === 0)\n return;\n await this.sbx.files.write(entries);\n }\n async writeText(path: string, content: string): Promise<void> {\n await this.sbx.files.write(this.abs(path), content);\n }\n async readBytes(path: string): Promise<Uint8Array> {\n return this.sbx.files.read(this.abs(path), { format: \"bytes\" });\n }\n async writeBytes(path: string, content: Uint8Array): Promise<void> {\n await this.sbx.files.write(this.abs(path), toArrayBuffer(content));\n }\n async uploadFile(source: string | URL, targetPath: string): Promise<void> {\n await this.writeBytes(targetPath, await readFile(resolveLocalPath(undefined, source)));\n }\n async uploadDirectory(sourceDir: string | URL, targetDir?: string, opts: {\n readonly ignore?: readonly string[];\n } = {}): Promise<void> {\n await this.writeCollectedFiles(await collectLocalFiles(resolveLocalPath(undefined, sourceDir), opts.ignore), targetDir);\n }\n /**\n * 递归下载沙箱内一个目录到本地磁盘,与 uploadDirectory 对称:两阶段模板(与 vercel provider\n * 共用)——find 列路径 + 逐文件 files.read(bytes) 独立读取,写回本地磁盘。\n */\n async downloadFile(sourcePath: string, target: string | URL): Promise<void> {\n const destination = resolveLocalPath(undefined, target);\n await mkdir(dirname(destination), { recursive: true });\n await writeFile(destination, await this.readBytes(sourcePath));\n }\n async downloadDirectory(sourceDir: string, targetDir: string | URL, opts: {\n readonly ignore?: readonly string[];\n } = {}): Promise<void> {\n const remoteDir = resolveSandboxPath(this.workdir, sourceDir);\n await downloadDirectoryByList({\n localDir: resolveLocalPath(undefined, targetDir),\n ignore: opts.ignore ?? [],\n runShell: (script) => this.runShell(script, { cwd: remoteDir }),\n readOne: (relPath) => this.readBytes(`${remoteDir}/${relPath}`),\n });\n }\n async stop(): Promise<void> {\n await this.retire();\n }\n private retire(): Promise<void> {\n if (this.retired)\n return Promise.resolve();\n if (this.retirement !== undefined)\n return this.retirement;\n let attempt!: Promise<void>;\n attempt = this.sbx.kill().then(() => {\n this.retired = true;\n if (this.retirement === attempt)\n this.retirement = undefined;\n }, (error: unknown) => {\n if (this.retirement === attempt)\n this.retirement = undefined;\n throw error;\n });\n this.retirement = attempt;\n return attempt;\n }\n /**\n * 留存休眠(suspend):e2b `pause`——文件系统与内存整体持久化,暂停期间停止计费,\n * 现场无限期保留、可 resume 找回(没有自然过期时刻,注册表不写 expiresAt)。\n * SDK 版本差异按能力探测(betaPause 是旧名),都没有则如实抛错(现场保持 alive)。\n */\n async suspend(): Promise<void> {\n await this.sbx.pause();\n }\n}\n/** Uint8Array → ArrayBuffer(e2b files.write 接受 string | ArrayBuffer | Blob | ReadableStream)。 */\nfunction toArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer;\n}\n/** e2b SDK 的命令超时:SDK 不导出可 instanceof 的类型,按错误名与文案判定(只用于归属标注)。 */\nfunction isTimeoutError(e: unknown): boolean {\n if (!(e instanceof Error))\n return false;\n return e.name === \"TimeoutError\" || /timed? ?out/i.test(e.message);\n}\n"]}
@@ -69,7 +69,9 @@ export declare class E2BSandbox implements SandboxProviderBackend, SandboxReuseC
69
69
  reason: string;
70
70
  }>>;
71
71
  setCommandDeadline: import("./backend.cjs").SandboxBackendSupport<(deadlineAt?: number) => void>;
72
+ managedProcess: import("./backend.cjs").SandboxBackendSupport<never>;
72
73
  };
74
+ private startManagedProcess;
73
75
  private constructor();
74
76
  /** 复用下由池在每次借出时换成承接者自己的 deadline(见 sandbox/deadline.ts)。 */
75
77
  setCommandDeadline(deadlineAt?: number): void;
@@ -69,7 +69,9 @@ export declare class E2BSandbox implements SandboxProviderBackend, SandboxReuseC
69
69
  reason: string;
70
70
  }>>;
71
71
  setCommandDeadline: import("./backend.mjs").SandboxBackendSupport<(deadlineAt?: number) => void>;
72
+ managedProcess: import("./backend.mjs").SandboxBackendSupport<never>;
72
73
  };
74
+ private startManagedProcess;
73
75
  private constructor();
74
76
  /** 复用下由池在每次借出时换成承接者自己的 deadline(见 sandbox/deadline.ts)。 */
75
77
  setCommandDeadline(deadlineAt?: number): void;
@@ -69,7 +69,9 @@ export declare class E2BSandbox implements SandboxProviderBackend, SandboxReuseC
69
69
  reason: string;
70
70
  }>>;
71
71
  setCommandDeadline: import("./backend.js").SandboxBackendSupport<(deadlineAt?: number) => void>;
72
+ managedProcess: import("./backend.js").SandboxBackendSupport<never>;
72
73
  };
74
+ private startManagedProcess;
73
75
  private constructor();
74
76
  /** 复用下由池在每次借出时换成承接者自己的 deadline(见 sandbox/deadline.ts)。 */
75
77
  setCommandDeadline(deadlineAt?: number): void;
@@ -26,6 +26,7 @@ const operations_ts_1 = require("./operations.cjs");
26
26
  const backend_ts_1 = require("./backend.cjs");
27
27
  const ledger_paths_ts_1 = require("./ledger-paths.cjs");
28
28
  const index_ts_1 = require("../i18n/index.cjs");
29
+ const managed_process_ts_1 = require("./managed-process.cjs");
29
30
  const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
30
31
  /** 从给定目录向上解析 git 仓库根;不在任何 git 仓库内时给出两条出路。 */
31
32
  async function resolveGitRoot(cwd) {
@@ -160,7 +161,70 @@ class LocalSandbox {
160
161
  suspend: backend_ts_1.unsupportedBackendCapability,
161
162
  ensureLifetime: backend_ts_1.unsupportedBackendCapability,
162
163
  setCommandDeadline: (0, backend_ts_1.supportedBackendCapability)((deadlineAt) => this.setCommandDeadline(deadlineAt)),
164
+ managedProcess: (0, backend_ts_1.supportedBackendCapability)((input) => this.startManagedProcess(input)),
163
165
  };
166
+ async startManagedProcess(input) {
167
+ const [command, ...args] = input.argv;
168
+ const output = new managed_process_ts_1.ManagedProcessOutput();
169
+ const env = {
170
+ ...process.env,
171
+ ...input.env,
172
+ ...(this.pathPrepend.length === 0
173
+ ? {}
174
+ : { PATH: `${this.pathPrepend.join(":")}:${process.env.PATH ?? ""}` }),
175
+ };
176
+ const posix = process.platform !== "win32";
177
+ const child = (0, node_child_process_1.spawn)(command, args, {
178
+ cwd: (0, paths_ts_1.resolveSandboxPath)(this.workdir, input.cwd),
179
+ env,
180
+ detached: posix,
181
+ stdio: ["pipe", "pipe", "pipe"],
182
+ });
183
+ child.stdout.on("data", (bytes) => output.push({ _tag: "Stdout", bytes: new Uint8Array(bytes) }));
184
+ child.stderr.on("data", (bytes) => output.push({ _tag: "Stderr", bytes: new Uint8Array(bytes) }));
185
+ const exit = new Promise((resolve, reject) => {
186
+ child.once("error", (error) => { output.end(); reject(error); });
187
+ child.once("close", (exitCode, signal) => {
188
+ output.end();
189
+ resolve({ exitCode, ...(signal === null ? {} : { signal }) });
190
+ });
191
+ });
192
+ const terminate = async () => {
193
+ stdinState = "closing";
194
+ if (child.exitCode !== null || child.signalCode !== null)
195
+ return;
196
+ if (posix && child.pid !== undefined) {
197
+ try {
198
+ process.kill(-child.pid, "SIGKILL");
199
+ }
200
+ catch {
201
+ child.kill("SIGKILL");
202
+ }
203
+ }
204
+ else
205
+ child.kill("SIGKILL");
206
+ await exit.catch(() => undefined);
207
+ };
208
+ let stdinState = "open";
209
+ let closeReceipt;
210
+ let terminateReceipt;
211
+ return {
212
+ output,
213
+ writeStdin: (bytes) => new Promise((resolve, reject) => {
214
+ if (stdinState !== "open") {
215
+ reject(new Error("managed process stdin is closed"));
216
+ return;
217
+ }
218
+ child.stdin.write(bytes, (error) => error ? reject(error) : resolve());
219
+ }),
220
+ closeStdin: () => closeReceipt ??= new Promise((resolve) => {
221
+ stdinState = "closing";
222
+ child.stdin.end(() => { stdinState = "closed"; resolve(); });
223
+ }),
224
+ wait: () => exit,
225
+ terminate: () => terminateReceipt ??= terminate(),
226
+ };
227
+ }
164
228
  constructor(workdir, ledgerBase, pathPrepend, timeout, deadlineAt) {
165
229
  this.workdir = workdir;
166
230
  this.ledgerBase = ledgerBase;