@alchemy.run/e2b 0.0.0 → 2.0.0-beta.86

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 (284) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +56 -4
  3. package/lib/ApiKey.d.ts +53 -0
  4. package/lib/ApiKey.d.ts.map +1 -0
  5. package/lib/ApiKey.js +107 -0
  6. package/lib/ApiKey.js.map +1 -0
  7. package/lib/AuthProvider.d.ts +60 -0
  8. package/lib/AuthProvider.d.ts.map +1 -0
  9. package/lib/AuthProvider.js +293 -0
  10. package/lib/AuthProvider.js.map +1 -0
  11. package/lib/Bootstrap.d.ts +7 -0
  12. package/lib/Bootstrap.d.ts.map +1 -0
  13. package/lib/Bootstrap.js +25 -0
  14. package/lib/Bootstrap.js.map +1 -0
  15. package/lib/ConnectSandbox.d.ts +67 -0
  16. package/lib/ConnectSandbox.d.ts.map +1 -0
  17. package/lib/ConnectSandbox.js +3 -0
  18. package/lib/ConnectSandbox.js.map +1 -0
  19. package/lib/ConnectSandboxHttp.d.ts +22 -0
  20. package/lib/ConnectSandboxHttp.d.ts.map +1 -0
  21. package/lib/ConnectSandboxHttp.js +30 -0
  22. package/lib/ConnectSandboxHttp.js.map +1 -0
  23. package/lib/Contributions.d.ts +7 -0
  24. package/lib/Contributions.d.ts.map +1 -0
  25. package/lib/Contributions.js +6 -0
  26. package/lib/Contributions.js.map +1 -0
  27. package/lib/CreateSandbox.d.ts +139 -0
  28. package/lib/CreateSandbox.d.ts.map +1 -0
  29. package/lib/CreateSandbox.js +3 -0
  30. package/lib/CreateSandbox.js.map +1 -0
  31. package/lib/CreateSandboxHttp.d.ts +22 -0
  32. package/lib/CreateSandboxHttp.d.ts.map +1 -0
  33. package/lib/CreateSandboxHttp.js +99 -0
  34. package/lib/CreateSandboxHttp.js.map +1 -0
  35. package/lib/CreateSecret.d.ts +57 -0
  36. package/lib/CreateSecret.d.ts.map +1 -0
  37. package/lib/CreateSecret.js +3 -0
  38. package/lib/CreateSecret.js.map +1 -0
  39. package/lib/CreateSecretHttp.d.ts +20 -0
  40. package/lib/CreateSecretHttp.d.ts.map +1 -0
  41. package/lib/CreateSecretHttp.js +64 -0
  42. package/lib/CreateSecretHttp.js.map +1 -0
  43. package/lib/CreateSnapshot.d.ts +53 -0
  44. package/lib/CreateSnapshot.d.ts.map +1 -0
  45. package/lib/CreateSnapshot.js +3 -0
  46. package/lib/CreateSnapshot.js.map +1 -0
  47. package/lib/CreateSnapshotHttp.d.ts +20 -0
  48. package/lib/CreateSnapshotHttp.d.ts.map +1 -0
  49. package/lib/CreateSnapshotHttp.js +41 -0
  50. package/lib/CreateSnapshotHttp.js.map +1 -0
  51. package/lib/CreateTemplate.d.ts +96 -0
  52. package/lib/CreateTemplate.d.ts.map +1 -0
  53. package/lib/CreateTemplate.js +3 -0
  54. package/lib/CreateTemplate.js.map +1 -0
  55. package/lib/CreateTemplateHttp.d.ts +20 -0
  56. package/lib/CreateTemplateHttp.d.ts.map +1 -0
  57. package/lib/CreateTemplateHttp.js +99 -0
  58. package/lib/CreateTemplateHttp.js.map +1 -0
  59. package/lib/CreateVolume.d.ts +58 -0
  60. package/lib/CreateVolume.d.ts.map +1 -0
  61. package/lib/CreateVolume.js +3 -0
  62. package/lib/CreateVolume.js.map +1 -0
  63. package/lib/CreateVolumeHttp.d.ts +20 -0
  64. package/lib/CreateVolumeHttp.d.ts.map +1 -0
  65. package/lib/CreateVolumeHttp.js +51 -0
  66. package/lib/CreateVolumeHttp.js.map +1 -0
  67. package/lib/Credentials.d.ts +18 -0
  68. package/lib/Credentials.d.ts.map +1 -0
  69. package/lib/Credentials.js +55 -0
  70. package/lib/Credentials.js.map +1 -0
  71. package/lib/E2BBindings.d.ts +35 -0
  72. package/lib/E2BBindings.d.ts.map +1 -0
  73. package/lib/E2BBindings.js +127 -0
  74. package/lib/E2BBindings.js.map +1 -0
  75. package/lib/Errors.d.ts +61 -0
  76. package/lib/Errors.d.ts.map +1 -0
  77. package/lib/Errors.js +23 -0
  78. package/lib/Errors.js.map +1 -0
  79. package/lib/InferEnv.d.ts +26 -0
  80. package/lib/InferEnv.d.ts.map +1 -0
  81. package/lib/InferEnv.js +1 -0
  82. package/lib/InferEnv.js.map +1 -0
  83. package/lib/MountVolume.d.ts +86 -0
  84. package/lib/MountVolume.d.ts.map +1 -0
  85. package/lib/MountVolume.js +3 -0
  86. package/lib/MountVolume.js.map +1 -0
  87. package/lib/MountVolumeLive.d.ts +23 -0
  88. package/lib/MountVolumeLive.d.ts.map +1 -0
  89. package/lib/MountVolumeLive.js +41 -0
  90. package/lib/MountVolumeLive.js.map +1 -0
  91. package/lib/Providers.d.ts +14 -0
  92. package/lib/Providers.d.ts.map +1 -0
  93. package/lib/Providers.js +23 -0
  94. package/lib/Providers.js.map +1 -0
  95. package/lib/ReadTeam.d.ts +41 -0
  96. package/lib/ReadTeam.d.ts.map +1 -0
  97. package/lib/ReadTeam.js +3 -0
  98. package/lib/ReadTeam.js.map +1 -0
  99. package/lib/ReadTeamHttp.d.ts +20 -0
  100. package/lib/ReadTeamHttp.d.ts.map +1 -0
  101. package/lib/ReadTeamHttp.js +40 -0
  102. package/lib/ReadTeamHttp.js.map +1 -0
  103. package/lib/ReadVolume.d.ts +25 -0
  104. package/lib/ReadVolume.d.ts.map +1 -0
  105. package/lib/ReadVolume.js +3 -0
  106. package/lib/ReadVolume.js.map +1 -0
  107. package/lib/ReadVolumeHttp.d.ts +20 -0
  108. package/lib/ReadVolumeHttp.d.ts.map +1 -0
  109. package/lib/ReadVolumeHttp.js +27 -0
  110. package/lib/ReadVolumeHttp.js.map +1 -0
  111. package/lib/ReadWebhook.d.ts +32 -0
  112. package/lib/ReadWebhook.d.ts.map +1 -0
  113. package/lib/ReadWebhook.js +3 -0
  114. package/lib/ReadWebhook.js.map +1 -0
  115. package/lib/ReadWebhookHttp.d.ts +20 -0
  116. package/lib/ReadWebhookHttp.d.ts.map +1 -0
  117. package/lib/ReadWebhookHttp.js +31 -0
  118. package/lib/ReadWebhookHttp.js.map +1 -0
  119. package/lib/ReadWriteVolume.d.ts +26 -0
  120. package/lib/ReadWriteVolume.d.ts.map +1 -0
  121. package/lib/ReadWriteVolume.js +3 -0
  122. package/lib/ReadWriteVolume.js.map +1 -0
  123. package/lib/ReadWriteVolumeHttp.d.ts +20 -0
  124. package/lib/ReadWriteVolumeHttp.d.ts.map +1 -0
  125. package/lib/ReadWriteVolumeHttp.js +27 -0
  126. package/lib/ReadWriteVolumeHttp.js.map +1 -0
  127. package/lib/Sandbox.d.ts +295 -0
  128. package/lib/Sandbox.d.ts.map +1 -0
  129. package/lib/Sandbox.js +351 -0
  130. package/lib/Sandbox.js.map +1 -0
  131. package/lib/SandboxClient.d.ts +226 -0
  132. package/lib/SandboxClient.d.ts.map +1 -0
  133. package/lib/SandboxClient.js +1 -0
  134. package/lib/SandboxClient.js.map +1 -0
  135. package/lib/SandboxEvents.d.ts +87 -0
  136. package/lib/SandboxEvents.d.ts.map +1 -0
  137. package/lib/SandboxEvents.js +39 -0
  138. package/lib/SandboxEvents.js.map +1 -0
  139. package/lib/SandboxEventsLive.d.ts +13 -0
  140. package/lib/SandboxEventsLive.d.ts.map +1 -0
  141. package/lib/SandboxEventsLive.js +80 -0
  142. package/lib/SandboxEventsLive.js.map +1 -0
  143. package/lib/Secret.d.ts +105 -0
  144. package/lib/Secret.d.ts.map +1 -0
  145. package/lib/Secret.js +161 -0
  146. package/lib/Secret.js.map +1 -0
  147. package/lib/Snapshot.d.ts +118 -0
  148. package/lib/Snapshot.d.ts.map +1 -0
  149. package/lib/Snapshot.js +158 -0
  150. package/lib/Snapshot.js.map +1 -0
  151. package/lib/Template.d.ts +313 -0
  152. package/lib/Template.d.ts.map +1 -0
  153. package/lib/Template.js +421 -0
  154. package/lib/Template.js.map +1 -0
  155. package/lib/Volume.d.ts +88 -0
  156. package/lib/Volume.d.ts.map +1 -0
  157. package/lib/Volume.js +136 -0
  158. package/lib/Volume.js.map +1 -0
  159. package/lib/VolumeFiles.d.ts +39 -0
  160. package/lib/VolumeFiles.d.ts.map +1 -0
  161. package/lib/VolumeFiles.js +1 -0
  162. package/lib/VolumeFiles.js.map +1 -0
  163. package/lib/Webhook.d.ts +83 -0
  164. package/lib/Webhook.d.ts.map +1 -0
  165. package/lib/Webhook.js +138 -0
  166. package/lib/Webhook.js.map +1 -0
  167. package/lib/WriteSecret.d.ts +34 -0
  168. package/lib/WriteSecret.d.ts.map +1 -0
  169. package/lib/WriteSecret.js +3 -0
  170. package/lib/WriteSecret.js.map +1 -0
  171. package/lib/WriteSecretHttp.d.ts +20 -0
  172. package/lib/WriteSecretHttp.d.ts.map +1 -0
  173. package/lib/WriteSecretHttp.js +37 -0
  174. package/lib/WriteSecretHttp.js.map +1 -0
  175. package/lib/WriteVolume.d.ts +25 -0
  176. package/lib/WriteVolume.d.ts.map +1 -0
  177. package/lib/WriteVolume.js +3 -0
  178. package/lib/WriteVolume.js.map +1 -0
  179. package/lib/WriteVolumeHttp.d.ts +20 -0
  180. package/lib/WriteVolumeHttp.d.ts.map +1 -0
  181. package/lib/WriteVolumeHttp.js +27 -0
  182. package/lib/WriteVolumeHttp.js.map +1 -0
  183. package/lib/index.d.ts +43 -0
  184. package/lib/index.d.ts.map +1 -0
  185. package/lib/index.js +43 -0
  186. package/lib/index.js.map +1 -0
  187. package/lib/internal/Declared.d.ts +29 -0
  188. package/lib/internal/Declared.d.ts.map +1 -0
  189. package/lib/internal/Declared.js +31 -0
  190. package/lib/internal/Declared.js.map +1 -0
  191. package/lib/internal/Login.d.ts +45 -0
  192. package/lib/internal/Login.d.ts.map +1 -0
  193. package/lib/internal/Login.js +157 -0
  194. package/lib/internal/Login.js.map +1 -0
  195. package/lib/internal/Ownership.d.ts +29 -0
  196. package/lib/internal/Ownership.d.ts.map +1 -0
  197. package/lib/internal/Ownership.js +49 -0
  198. package/lib/internal/Ownership.js.map +1 -0
  199. package/lib/internal/Program.d.ts +31 -0
  200. package/lib/internal/Program.d.ts.map +1 -0
  201. package/lib/internal/Program.js +60 -0
  202. package/lib/internal/Program.js.map +1 -0
  203. package/lib/internal/SandboxHandle.d.ts +25 -0
  204. package/lib/internal/SandboxHandle.d.ts.map +1 -0
  205. package/lib/internal/SandboxHandle.js +316 -0
  206. package/lib/internal/SandboxHandle.js.map +1 -0
  207. package/lib/internal/SnapshotBuild.d.ts +19 -0
  208. package/lib/internal/SnapshotBuild.d.ts.map +1 -0
  209. package/lib/internal/SnapshotBuild.js +49 -0
  210. package/lib/internal/SnapshotBuild.js.map +1 -0
  211. package/lib/internal/Tar.d.ts +10 -0
  212. package/lib/internal/Tar.d.ts.map +1 -0
  213. package/lib/internal/Tar.js +61 -0
  214. package/lib/internal/Tar.js.map +1 -0
  215. package/lib/internal/TemplateBuild.d.ts +142 -0
  216. package/lib/internal/TemplateBuild.d.ts.map +1 -0
  217. package/lib/internal/TemplateBuild.js +220 -0
  218. package/lib/internal/TemplateBuild.js.map +1 -0
  219. package/lib/internal/TemplatePlan.d.ts +57 -0
  220. package/lib/internal/TemplatePlan.d.ts.map +1 -0
  221. package/lib/internal/TemplatePlan.js +185 -0
  222. package/lib/internal/TemplatePlan.js.map +1 -0
  223. package/lib/internal/VolumeHttp.d.ts +5 -0
  224. package/lib/internal/VolumeHttp.d.ts.map +1 -0
  225. package/lib/internal/VolumeHttp.js +46 -0
  226. package/lib/internal/VolumeHttp.js.map +1 -0
  227. package/package.json +62 -3
  228. package/src/ApiKey.ts +148 -0
  229. package/src/AuthProvider.ts +437 -0
  230. package/src/Bootstrap.ts +51 -0
  231. package/src/ConnectSandbox.ts +71 -0
  232. package/src/ConnectSandboxHttp.ts +38 -0
  233. package/src/Contributions.ts +9 -0
  234. package/src/CreateSandbox.ts +157 -0
  235. package/src/CreateSandboxHttp.ts +131 -0
  236. package/src/CreateSecret.ts +65 -0
  237. package/src/CreateSecretHttp.ts +94 -0
  238. package/src/CreateSnapshot.ts +64 -0
  239. package/src/CreateSnapshotHttp.ts +55 -0
  240. package/src/CreateTemplate.ts +135 -0
  241. package/src/CreateTemplateHttp.ts +152 -0
  242. package/src/CreateVolume.ts +65 -0
  243. package/src/CreateVolumeHttp.ts +80 -0
  244. package/src/Credentials.ts +81 -0
  245. package/src/E2BBindings.ts +160 -0
  246. package/src/Errors.ts +47 -0
  247. package/src/InferEnv.ts +27 -0
  248. package/src/MountVolume.ts +92 -0
  249. package/src/MountVolumeLive.ts +49 -0
  250. package/src/Providers.ts +48 -0
  251. package/src/ReadTeam.ts +55 -0
  252. package/src/ReadTeamHttp.ts +44 -0
  253. package/src/ReadVolume.ts +29 -0
  254. package/src/ReadVolumeHttp.ts +32 -0
  255. package/src/ReadWebhook.ts +41 -0
  256. package/src/ReadWebhookHttp.ts +42 -0
  257. package/src/ReadWriteVolume.ts +30 -0
  258. package/src/ReadWriteVolumeHttp.ts +32 -0
  259. package/src/Sandbox.ts +581 -0
  260. package/src/SandboxClient.ts +268 -0
  261. package/src/SandboxEvents.ts +101 -0
  262. package/src/SandboxEventsLive.ts +118 -0
  263. package/src/Secret.ts +229 -0
  264. package/src/Snapshot.ts +234 -0
  265. package/src/Template.ts +636 -0
  266. package/src/Volume.ts +173 -0
  267. package/src/VolumeFiles.ts +53 -0
  268. package/src/Webhook.ts +215 -0
  269. package/src/WriteSecret.ts +39 -0
  270. package/src/WriteSecretHttp.ts +43 -0
  271. package/src/WriteVolume.ts +29 -0
  272. package/src/WriteVolumeHttp.ts +32 -0
  273. package/src/globals.d.ts +2 -0
  274. package/src/index.ts +42 -0
  275. package/src/internal/Declared.ts +80 -0
  276. package/src/internal/Login.ts +210 -0
  277. package/src/internal/Ownership.ts +67 -0
  278. package/src/internal/Program.ts +75 -0
  279. package/src/internal/SandboxHandle.ts +534 -0
  280. package/src/internal/SnapshotBuild.ts +74 -0
  281. package/src/internal/Tar.ts +74 -0
  282. package/src/internal/TemplateBuild.ts +383 -0
  283. package/src/internal/TemplatePlan.ts +230 -0
  284. package/src/internal/VolumeHttp.ts +88 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Declared.d.ts","sources":["../../src/internal/Declared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAEzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,KAAK,IAAI,GACL,MAAM,GACN,MAAM,GACN,OAAO,GACP,MAAM,GACN,MAAM,GACN,IAAI,GACJ,SAAS,GACT,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GACtB,UAAU,GACV,IAAI,GACJ,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;AAE9B;;;GAGG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,GACpC,CAAC,GACD,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAC1B,CAAC,GACD,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAC9B,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,GAClD;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAEhF,2DAA2D;AAC3D,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AAgB1F,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,UAAW,OAAO,KAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAY7D,CAAC;AAEhC;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACpB,CAAC,SAAS;IAAE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAA;CAAE,QACjC,CAAC,SAAS,MAAM,YACL,CAAC,KACV,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAM/E,CAAC"}
@@ -0,0 +1,31 @@
1
+ import * as Output from "alchemy/Output";
2
+ import { isResource } from "alchemy/Resource";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Redacted from "effect/Redacted";
5
+ const isPlain = (value) => typeof value === "object" &&
6
+ value !== null &&
7
+ (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null);
8
+ /** A declaration still to be yielded: an Effect that isn't an Output or a resource. */
9
+ const isDeclaration = (value) => Effect.isEffect(value) && !Output.isOutput(value) && !isResource(value);
10
+ const hasDeclarations = (value) => isDeclaration(value) ||
11
+ (Array.isArray(value) && value.some(hasDeclarations)) ||
12
+ (isPlain(value) && !isResource(value) && Object.values(value).some(hasDeclarations));
13
+ /** Yield every declaration in `value`, at any depth. */
14
+ export const resolveDeclarations = (value) => isDeclaration(value)
15
+ ? value
16
+ : Array.isArray(value)
17
+ ? Effect.forEach(value, resolveDeclarations)
18
+ : isPlain(value) && !isResource(value) && hasDeclarations(value)
19
+ ? Effect.map(Effect.forEach(Object.entries(value), ([key, entry]) => Effect.map(resolveDeclarations(entry), (resolved) => [key, resolved])), Object.fromEntries)
20
+ : Effect.succeed(value);
21
+ /**
22
+ * Let a resource's props hold declarations of other resources, which are
23
+ * yielded when the resource is: `E2B.Sandbox("DevBox", { template: Node })`.
24
+ * Props without declarations are passed through unchanged.
25
+ */
26
+ export const declarable = () => (resource) => new Proxy(resource, {
27
+ apply: (target, self, args) => typeof args[0] === "string" && hasDeclarations(args[1])
28
+ ? Reflect.apply(target, self, [args[0], resolveDeclarations(args[1])])
29
+ : Reflect.apply(target, self, args),
30
+ });
31
+ //# sourceMappingURL=Declared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Declared.js","sources":["../../src/internal/Declared.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AA+B5C,MAAM,OAAO,GAAG,CAAC,KAAc,EAAoC,EAAE,CACnE,OAAO,KAAK,KAAK,QAAQ;IACzB,KAAK,KAAK,IAAI;IACd,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;AAE/F,uFAAuF;AACvF,MAAM,aAAa,GAAG,CAAC,KAAc,EAAqD,EAAE,CAC1F,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAE1E,MAAM,eAAe,GAAG,CAAC,KAAc,EAAW,EAAE,CAClD,aAAa,CAAC,KAAK,CAAC;IACpB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACrD,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;AAEvF,wDAAwD;AACxD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAA4C,EAAE,CAC9F,aAAa,CAAC,KAAK,CAAC;IAClB,CAAC,CAAC,KAAK;IACP,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC;QAC5C,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,KAAK,CAAC;YAC9D,CAAC,CAAC,MAAM,CAAC,GAAG,CACR,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CACrD,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAU,CAAC,CAC/E,EACD,MAAM,CAAC,WAAW,CACnB;YACH,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEhC;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GACrB,GAAsC,EAAE,CACxC,CACE,QAAW,EACiF,EAAE,CAC9F,IAAI,KAAK,CAAC,QAAiD,EAAE;IAC3D,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,IAAe,EAAE,EAAE,CACvC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;CACxC,CAAU,CAAC"}
@@ -0,0 +1,45 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Redacted from "effect/Redacted";
3
+ declare const E2BLoginError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
4
+ readonly _tag: "E2BLoginError";
5
+ } & Readonly<A>;
6
+ export declare class E2BLoginError extends E2BLoginError_base<{
7
+ readonly message: string;
8
+ readonly cause?: unknown;
9
+ }> {
10
+ }
11
+ /** The grant E2B's console hands the loopback listener. */
12
+ export interface E2BGrant {
13
+ readonly email: string;
14
+ readonly access: Redacted.Redacted<string>;
15
+ readonly refresh: Redacted.Redacted<string>;
16
+ readonly tokenEndpoint: string;
17
+ readonly revokeEndpoint: string;
18
+ readonly clientId: string;
19
+ /** Epoch millis the access token expires at. */
20
+ readonly expires: number;
21
+ }
22
+ /**
23
+ * The E2B CLI release whose login flow this mirrors. E2B's console reads
24
+ * `cliVersion` and refuses ("CLI update required") a login without a current
25
+ * one. Bump it with the E2B CLI if the console starts refusing it.
26
+ */
27
+ export declare const E2B_CLI_COMPAT_VERSION = "2.23.0";
28
+ /** A JWT's `exp`, in epoch millis; 0 when it has none, so it refreshes at once. */
29
+ export declare const jwtExpiry: (token: string) => number;
30
+ /** Parses a pasted loopback URL (the manual fallback when the listener can't be reached). */
31
+ export declare const grantFromUrl: (input: string) => Effect.Effect<E2BGrant, E2BLoginError>;
32
+ /**
33
+ * Starts the loopback listener on a free port and returns the console URL
34
+ * to open, plus the grant it receives. The listener closes with the scope.
35
+ */
36
+ export declare const startLogin: (domain: string) => Effect.Effect<{
37
+ url: string;
38
+ grant: Effect.Effect<E2BGrant, E2BLoginError, never>;
39
+ }, E2BLoginError, import("effect/Scope").Scope>;
40
+ /** Exchanges the refresh token for a fresh access token (refresh tokens may rotate). */
41
+ export declare const refreshGrant: (grant: E2BGrant) => Effect.Effect<E2BGrant, E2BLoginError>;
42
+ /** Revokes the refresh token; best effort, like `e2b auth logout`. */
43
+ export declare const revokeGrant: (grant: Pick<E2BGrant, "refresh" | "revokeEndpoint" | "clientId">) => Effect.Effect<void, never, never>;
44
+ export {};
45
+ //# sourceMappingURL=Login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Login.d.ts","sources":["../../src/internal/Login.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;;;;AAG5C,qBAAa,aAAc,SAAQ,mBAAkC;IACnE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;CAAG;AAEL,2DAA2D;AAC3D,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,WAAW,CAAC;AAM/C,mFAAmF;AACnF,eAAO,MAAM,SAAS,UAAW,MAAM,KAAG,MAWzC,CAAC;AAmCF,6FAA6F;AAC7F,eAAO,MAAM,YAAY,UAAW,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAQ9E,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,UAAU;;;+CAyCrB,CAAC;AAOH,wFAAwF;AACxF,eAAO,MAAM,YAAY,UAAW,QAAQ,KAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAkCjF,CAAC;AAEJ,sEAAsE;AACtE,eAAO,MAAM,WAAW,UAAW,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,gBAAgB,GAAG,UAAU,CAAC,sCAa7B,CAAC"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * E2B's browser login, as the E2B CLI runs it (`e2b auth login`).
3
+ *
4
+ * E2B's console signs the user in and redirects to a loopback URL with the
5
+ * OAuth grant in the query string: a short-lived JWT access token, a refresh
6
+ * token, and the token and revoke endpoints with the public client id they
7
+ * were issued to. Refresh and revoke are standard OAuth 2 requests against
8
+ * those endpoints.
9
+ */
10
+ import * as http from "node:http";
11
+ import * as Data from "effect/Data";
12
+ import * as Deferred from "effect/Deferred";
13
+ import * as Effect from "effect/Effect";
14
+ import * as FetchHttpClient from "effect/http/FetchHttpClient";
15
+ import * as HttpClient from "effect/http/HttpClient";
16
+ import * as HttpClientRequest from "effect/http/HttpClientRequest";
17
+ import * as Redacted from "effect/Redacted";
18
+ import * as Schema from "effect/Schema";
19
+ export class E2BLoginError extends Data.TaggedError("E2BLoginError") {
20
+ }
21
+ /**
22
+ * The E2B CLI release whose login flow this mirrors. E2B's console reads
23
+ * `cliVersion` and refuses ("CLI update required") a login without a current
24
+ * one. Bump it with the E2B CLI if the console starts refusing it.
25
+ */
26
+ export const E2B_CLI_COMPAT_VERSION = "2.23.0";
27
+ /** Where the console's CLI login starts, and where it shows the outcome. */
28
+ const loginBase = (domain) => `https://${domain === "e2b.app" ? "e2b.dev" : domain}/docs/api/cli`;
29
+ /** A JWT's `exp`, in epoch millis; 0 when it has none, so it refreshes at once. */
30
+ export const jwtExpiry = (token) => {
31
+ const payload = token.split(".")[1];
32
+ if (payload === undefined)
33
+ return 0;
34
+ try {
35
+ const decoded = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
36
+ return typeof decoded.exp === "number" ? decoded.exp * 1000 : 0;
37
+ }
38
+ catch {
39
+ return 0;
40
+ }
41
+ };
42
+ const isLoginError = (value) => "_tag" in value;
43
+ const grantOf = (params) => {
44
+ const error = params.get("error");
45
+ if (error)
46
+ return new E2BLoginError({ message: `E2B login failed: ${error}` });
47
+ const field = (name) => params.get(name) ?? "";
48
+ const grant = {
49
+ email: field("email"),
50
+ accessToken: field("accessToken"),
51
+ refreshToken: field("refreshToken"),
52
+ tokenEndpoint: field("tokenEndpoint"),
53
+ revokeEndpoint: field("revokeEndpoint"),
54
+ clientId: field("clientId"),
55
+ };
56
+ const missing = Object.entries(grant)
57
+ .filter(([, value]) => value === "")
58
+ .map(([key]) => key);
59
+ if (missing.length > 0) {
60
+ return new E2BLoginError({
61
+ message: `E2B login returned an incomplete grant (missing ${missing.join(", ")})`,
62
+ });
63
+ }
64
+ return {
65
+ email: grant.email,
66
+ access: Redacted.make(grant.accessToken),
67
+ refresh: Redacted.make(grant.refreshToken),
68
+ tokenEndpoint: grant.tokenEndpoint,
69
+ revokeEndpoint: grant.revokeEndpoint,
70
+ clientId: grant.clientId,
71
+ expires: jwtExpiry(grant.accessToken),
72
+ };
73
+ };
74
+ /** Parses a pasted loopback URL (the manual fallback when the listener can't be reached). */
75
+ export const grantFromUrl = (input) => Effect.gen(function* () {
76
+ const url = yield* Effect.try({
77
+ try: () => new URL(input.trim()),
78
+ catch: () => new E2BLoginError({ message: "Paste the full URL the browser was sent to" }),
79
+ });
80
+ const grant = grantOf(url.searchParams);
81
+ return isLoginError(grant) ? yield* grant : grant;
82
+ });
83
+ /**
84
+ * Starts the loopback listener on a free port and returns the console URL
85
+ * to open, plus the grant it receives. The listener closes with the scope.
86
+ */
87
+ export const startLogin = Effect.fn(function* (domain) {
88
+ const base = loginBase(domain);
89
+ const received = yield* Deferred.make();
90
+ const server = yield* Effect.acquireRelease(Effect.callback((resume) => {
91
+ const server = http.createServer((req, res) => {
92
+ const params = new URL(req.url ?? "/", "http://localhost").searchParams;
93
+ const grant = grantOf(params);
94
+ const outcome = new URL(base);
95
+ if (isLoginError(grant)) {
96
+ outcome.searchParams.set("state", "error");
97
+ outcome.searchParams.set("error", grant.message);
98
+ }
99
+ else {
100
+ outcome.searchParams.set("state", "success");
101
+ outcome.searchParams.set("email", grant.email);
102
+ }
103
+ res.writeHead(302, { Location: outcome.href, Connection: "close" });
104
+ res.end();
105
+ Deferred.doneUnsafe(received, isLoginError(grant) ? Effect.fail(grant) : Effect.succeed(grant));
106
+ });
107
+ server.once("error", (cause) => resume(Effect.fail(new E2BLoginError({ message: "Could not start the login listener", cause }))));
108
+ server.listen(0, "127.0.0.1", () => resume(Effect.succeed(server)));
109
+ }), (server) => Effect.sync(() => {
110
+ server.close();
111
+ server.closeAllConnections();
112
+ }));
113
+ const { port } = server.address();
114
+ const url = new URL(base);
115
+ url.searchParams.set("next", `http://localhost:${port}`);
116
+ url.searchParams.set("cliVersion", E2B_CLI_COMPAT_VERSION);
117
+ return { url: url.href, grant: Deferred.await(received) };
118
+ });
119
+ const TokenResponse = Schema.Struct({
120
+ access_token: Schema.String,
121
+ refresh_token: Schema.optional(Schema.String),
122
+ });
123
+ /** Exchanges the refresh token for a fresh access token (refresh tokens may rotate). */
124
+ export const refreshGrant = (grant) => Effect.gen(function* () {
125
+ const client = yield* HttpClient.HttpClient;
126
+ // Raw HTTP: the token endpoint the console's login redirect handed back.
127
+ const response = yield* client.execute(HttpClientRequest.post(grant.tokenEndpoint).pipe(HttpClientRequest.setHeader("Accept", "application/json"), HttpClientRequest.bodyUrlParams({
128
+ grant_type: "refresh_token",
129
+ refresh_token: Redacted.value(grant.refresh),
130
+ client_id: grant.clientId,
131
+ })));
132
+ if (response.status >= 400) {
133
+ const body = yield* response.text.pipe(Effect.orElseSucceed(() => ""));
134
+ return yield* new E2BLoginError({
135
+ message: `E2B token refresh failed (${response.status}): ${body.slice(0, 200)}`,
136
+ });
137
+ }
138
+ const tokens = yield* Schema.decodeUnknownEffect(TokenResponse)(yield* response.json);
139
+ return {
140
+ ...grant,
141
+ access: Redacted.make(tokens.access_token),
142
+ refresh: tokens.refresh_token === undefined ? grant.refresh : Redacted.make(tokens.refresh_token),
143
+ expires: jwtExpiry(tokens.access_token),
144
+ };
145
+ }).pipe(Effect.catchIf((e) => e._tag !== "E2BLoginError", (cause) => Effect.fail(new E2BLoginError({ message: "E2B token refresh failed", cause }))), Effect.provide(FetchHttpClient.layer));
146
+ /** Revokes the refresh token; best effort, like `e2b auth logout`. */
147
+ export const revokeGrant = (grant) => Effect.gen(function* () {
148
+ const client = yield* HttpClient.HttpClient;
149
+ yield* client.execute(
150
+ // Raw HTTP: the revoke endpoint the console's login redirect handed back.
151
+ HttpClientRequest.post(grant.revokeEndpoint).pipe(HttpClientRequest.bodyUrlParams({
152
+ token: Redacted.value(grant.refresh),
153
+ token_type_hint: "refresh_token",
154
+ client_id: grant.clientId,
155
+ })));
156
+ }).pipe(Effect.ignore, Effect.provide(FetchHttpClient.layer));
157
+ //# sourceMappingURL=Login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Login.js","sources":["../../src/internal/Login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { Stack } from "alchemy/Stack";
2
+ import { Stage } from "alchemy/Stage";
3
+ import * as Effect from "effect/Effect";
4
+ /** E2B names: letters, digits, `-` and `_`. Lowercased (secrets and templates are lowercased by E2B). */
5
+ export declare const e2bName: (id: string, name: string | undefined, maxLength?: number) => Effect.Effect<string, never, import("alchemy/ResourceContext").ResourceContext | Stack | Stage>;
6
+ /**
7
+ * Whether a name looks generated by `createPhysicalName` (lowercase, ending
8
+ * in a base32 instance suffix). Used by `list` to report only resources
9
+ * Alchemy created, for nuke.
10
+ */
11
+ export declare const isGeneratedName: (name: string | undefined) => boolean;
12
+ /** The `alchemy::stack` / `alchemy::stage` / `alchemy::id` stamp for metadata maps. */
13
+ export declare const ownershipMetadata: (id: string) => Effect.Effect<{
14
+ "alchemy::stack": string;
15
+ "alchemy::stage": string;
16
+ "alchemy::id": string;
17
+ }, never, Stack | Stage>;
18
+ /**
19
+ * The stamp runtime-created objects carry: the stack and stage that created
20
+ * them and the binding's logical id. Destroy sweeps by it.
21
+ */
22
+ export declare const runtimeMetadata: (bindingId: string) => Effect.Effect<Record<string, string>, never, Stack | Stage>;
23
+ /** Whether a metadata map carries this resource's ownership stamp. */
24
+ export declare const hasOwnershipMetadata: (id: string, metadata: Readonly<Record<string, string>> | null | undefined) => Effect.Effect<boolean, never, Stack | Stage>;
25
+ /** Whether a metadata map was stamped by any Alchemy stack (for nuke). */
26
+ export declare const hasAnyAlchemyMetadata: (metadata: Readonly<Record<string, string>> | null | undefined) => boolean;
27
+ /** User metadata with the internal `alchemy::*` keys removed. */
28
+ export declare const userMetadata: (metadata: Readonly<Record<string, string>> | null | undefined) => Record<string, string>;
29
+ //# sourceMappingURL=Ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Ownership.d.ts","sources":["../../src/internal/Ownership.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAWtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,yGAAyG;AACzG,eAAO,MAAM,OAAO,OAAQ,MAAM,QAAQ,MAAM,GAAG,SAAS,wHAGgB,CAAC;AAE7E;;;;GAIG;AACH,eAAO,MAAM,eAAe,SAAU,MAAM,GAAG,SAAS,KAAG,OACc,CAAC;AAE1E,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,OAAQ,MAAM;;;;wBAA2B,CAAC;AAExE;;;GAGG;AACH,eAAO,MAAM,eAAe,oFAQ1B,CAAC;AAEH,sEAAsE;AACtE,eAAO,MAAM,oBAAoB,6HAM/B,CAAC;AAEH,0EAA0E;AAC1E,eAAO,MAAM,qBAAqB,aACtB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,KAC5D,OAAsF,CAAC;AAE1F,iEAAiE;AACjE,eAAO,MAAM,YAAY,aACb,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,KAC5D,MAAM,CAAC,MAAM,EAAE,MAAM,CAGrB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { createPhysicalName } from "alchemy/PhysicalName";
2
+ import { Stack } from "alchemy/Stack";
3
+ import { Stage } from "alchemy/Stage";
4
+ /**
5
+ * Naming and ownership helpers shared by every E2B resource and binding.
6
+ *
7
+ * E2B has metadata only on secrets and sandboxes. Templates, snapshots,
8
+ * volumes, webhooks and API keys carry nothing but a name, so a resource
9
+ * whose name the engine generated (stack, stage, logical id, instance
10
+ * suffix) is recognised as ours by that name; an explicit, user-chosen name
11
+ * found without prior state is reported `Unowned`.
12
+ */
13
+ import { createInternalTags } from "alchemy/Tags";
14
+ import * as Effect from "effect/Effect";
15
+ /** E2B names: letters, digits, `-` and `_`. Lowercased (secrets and templates are lowercased by E2B). */
16
+ export const e2bName = (id, name, maxLength = 64) => name !== undefined
17
+ ? Effect.succeed(name)
18
+ : createPhysicalName({ id, lowercase: true, maxLength, delimiter: "-" });
19
+ /**
20
+ * Whether a name looks generated by `createPhysicalName` (lowercase, ending
21
+ * in a base32 instance suffix). Used by `list` to report only resources
22
+ * Alchemy created, for nuke.
23
+ */
24
+ export const isGeneratedName = (name) => name !== undefined && /^[a-z0-9][a-z0-9_-]*-[a-z2-7]{8,16}$/.test(name);
25
+ /** The `alchemy::stack` / `alchemy::stage` / `alchemy::id` stamp for metadata maps. */
26
+ export const ownershipMetadata = (id) => createInternalTags(id);
27
+ /**
28
+ * The stamp runtime-created objects carry: the stack and stage that created
29
+ * them and the binding's logical id. Destroy sweeps by it.
30
+ */
31
+ export const runtimeMetadata = Effect.fn(function* (bindingId) {
32
+ const stack = yield* Stack;
33
+ const stage = yield* Stage;
34
+ return {
35
+ "alchemy::stack": stack.name,
36
+ "alchemy::stage": stage,
37
+ "alchemy::binding": bindingId,
38
+ };
39
+ });
40
+ /** Whether a metadata map carries this resource's ownership stamp. */
41
+ export const hasOwnershipMetadata = Effect.fn(function* (id, metadata) {
42
+ const expected = yield* createInternalTags(id);
43
+ return Object.entries(expected).every(([key, value]) => metadata?.[key] === value);
44
+ });
45
+ /** Whether a metadata map was stamped by any Alchemy stack (for nuke). */
46
+ export const hasAnyAlchemyMetadata = (metadata) => metadata !== undefined && metadata !== null && "alchemy::stack" in metadata;
47
+ /** User metadata with the internal `alchemy::*` keys removed. */
48
+ export const userMetadata = (metadata) => Object.fromEntries(Object.entries(metadata ?? {}).filter(([key]) => !key.startsWith("alchemy::")));
49
+ //# sourceMappingURL=Ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Ownership.js","sources":["../../src/internal/Ownership.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC;;;;;;;;GAQG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,yGAAyG;AACzG,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,IAAwB,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE,CAC9E,IAAI,KAAK,SAAS;IAChB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;AAE7E;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAwB,EAAW,EAAE,CACnE,IAAI,KAAK,SAAS,IAAI,sCAAsC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE1E,uFAAuF;AACvF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAiB;IACnE,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC;IAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC;IAC3B,OAAO;QACL,gBAAgB,EAAE,KAAK,CAAC,IAAI;QAC5B,gBAAgB,EAAE,KAAK;QACvB,kBAAkB,EAAE,SAAS;KACJ,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EACrD,EAAU,EACV,QAA6D;IAE7D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEH,0EAA0E;AAC1E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAA6D,EACpD,EAAE,CAAC,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,gBAAgB,IAAI,QAAQ,CAAC;AAE1F,iEAAiE;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,QAA6D,EACrC,EAAE,CAC1B,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAC/E,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * How a template runs its `main` program.
3
+ *
4
+ * `@alchemy.run/docker/BuildPlan` bundles `main` and adds the layer that
5
+ * runs it with Bun from `/app`; E2B starts that command when it builds the
6
+ * template and captures it running in the template's snapshot, so every
7
+ * sandbox boots with it already serving on `PORT`. An Effect program (the
8
+ * class form) is wrapped in the generated bootstrap entry; an async program
9
+ * (`main` with no Effect impl) is bundled and run as-is.
10
+ */
11
+ import { Stack } from "alchemy/Stack";
12
+ import * as Effect from "effect/Effect";
13
+ /** The port a template's program serves on unless `port` says otherwise. */
14
+ export declare const DEFAULT_PORT = 3000;
15
+ /**
16
+ * The generated entry: raises the runtime flag BEFORE the user's module is
17
+ * evaluated (hence the dynamic import), then boots the program. It imports
18
+ * only `@alchemy.run/e2b/Bootstrap` and `main` — see `alchemy/Runtime/Bootstrap`.
19
+ */
20
+ export declare const makeBootstrap: (handler: string) => (importPath: string) => string;
21
+ /** The program's environment: Alchemy's runtime vars, bound env, then the user's `env`. */
22
+ export declare const programEnv: (port: number, bound: Readonly<Record<string, unknown>>, env: Readonly<Record<string, unknown>> | undefined) => Effect.Effect<{
23
+ ALCHEMY_STACK_NAME: string;
24
+ ALCHEMY_STAGE: string;
25
+ ALCHEMY_PHASE: string;
26
+ HOST: string;
27
+ PORT: string;
28
+ }, never, Stack>;
29
+ /** The template's snapshot is taken once the program answers HTTP. */
30
+ export declare const programReadyCmd: (port: number) => string;
31
+ //# sourceMappingURL=Program.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Program.d.ts","sources":["../../src/internal/Program.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAGxC,4EAA4E;AAC5E,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC;;;;GAIG;AACH,eAAO,MAAM,aAAa,YACd,MAAM,kBACH,MAAM,KAAG,MAQvB,CAAC;AAiBF,2FAA2F;AAC3F,eAAO,MAAM,UAAU;;;;;;gBAoBrB,CAAC;AAEH,sEAAsE;AACtE,eAAO,MAAM,eAAe,SAAU,MAAM,WACiD,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * How a template runs its `main` program.
3
+ *
4
+ * `@alchemy.run/docker/BuildPlan` bundles `main` and adds the layer that
5
+ * runs it with Bun from `/app`; E2B starts that command when it builds the
6
+ * template and captures it running in the template's snapshot, so every
7
+ * sandbox boots with it already serving on `PORT`. An Effect program (the
8
+ * class form) is wrapped in the generated bootstrap entry; an async program
9
+ * (`main` with no Effect impl) is bundled and run as-is.
10
+ */
11
+ import { Stack } from "alchemy/Stack";
12
+ import * as Effect from "effect/Effect";
13
+ import * as Redacted from "effect/Redacted";
14
+ /** The port a template's program serves on unless `port` says otherwise. */
15
+ export const DEFAULT_PORT = 3000;
16
+ /**
17
+ * The generated entry: raises the runtime flag BEFORE the user's module is
18
+ * evaluated (hence the dynamic import), then boots the program. It imports
19
+ * only `@alchemy.run/e2b/Bootstrap` and `main` — see `alchemy/Runtime/Bootstrap`.
20
+ */
21
+ export const makeBootstrap = (handler) => (importPath) => `
22
+ import { bootstrap } from "@alchemy.run/e2b/Bootstrap";
23
+
24
+ globalThis.__ALCHEMY_RUNTIME__ = true;
25
+ const { ${handler}: entrypoint } = await import(${JSON.stringify(importPath)});
26
+
27
+ await bootstrap(entrypoint);
28
+ `;
29
+ /**
30
+ * A value as the env var the program reads, verbatim. Bound values arrive
31
+ * already packed by the host (`packEnvValue`, so a `Redacted` keeps its
32
+ * marker); packing again would double-encode them, and a user's `env` is read
33
+ * raw (`Config`, `process.env`).
34
+ */
35
+ const envValue = (value) => value === undefined || value === null
36
+ ? undefined
37
+ : Redacted.isRedacted(value)
38
+ ? String(Redacted.value(value))
39
+ : typeof value === "string"
40
+ ? value
41
+ : JSON.stringify(value);
42
+ /** The program's environment: Alchemy's runtime vars, bound env, then the user's `env`. */
43
+ export const programEnv = Effect.fn(function* (port, bound, env) {
44
+ const stack = yield* Stack;
45
+ const values = Object.fromEntries(Object.entries({ ...bound, ...env }).flatMap(([key, value]) => {
46
+ const text = envValue(value);
47
+ return text === undefined ? [] : [[key, text]];
48
+ }));
49
+ return {
50
+ ALCHEMY_STACK_NAME: stack.name,
51
+ ALCHEMY_STAGE: stack.stage,
52
+ ALCHEMY_PHASE: "runtime",
53
+ HOST: "0.0.0.0",
54
+ PORT: String(port),
55
+ ...values,
56
+ };
57
+ });
58
+ /** The template's snapshot is taken once the program answers HTTP. */
59
+ export const programReadyCmd = (port) => `bun -e "fetch('http://127.0.0.1:${port}/').then(()=>process.exit(0),()=>process.exit(1))"`;
60
+ //# sourceMappingURL=Program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Program.js","sources":["../../src/internal/Program.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GACxB,CAAC,OAAe,EAAE,EAAE,CACpB,CAAC,UAAkB,EAAU,EAAE,CAC7B;;;;UAIM,OAAO,iCAAiC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;;;CAG3E,CAAC;AAEF;;;;;GAKG;AACH,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAsB,EAAE,CACtD,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;IACnC,CAAC,CAAC,SAAS;IACX,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAEhC,2FAA2F;AAC3F,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAC3C,IAAY,EACZ,KAAwC,EACxC,GAAkD;IAElD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAC/B,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC5D,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CACuB,CAAC;IAC5B,OAAO;QACL,kBAAkB,EAAE,KAAK,CAAC,IAAI;QAC9B,aAAa,EAAE,KAAK,CAAC,KAAK;QAC1B,aAAa,EAAE,SAAS;QACxB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;QAClB,GAAG,MAAM;KACV,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,sEAAsE;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,EAAE,CAC9C,mCAAmC,IAAI,oDAAoD,CAAC"}
@@ -0,0 +1,25 @@
1
+ import * as sandboxes from "@distilled.cloud/e2b/sandboxes";
2
+ import type { RuntimeContext } from "alchemy/RuntimeContext";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Redacted from "effect/Redacted";
5
+ import type { E2BAuth } from "../E2BBindings.ts";
6
+ import type { ConnectedSandbox, E2BSandbox } from "../SandboxClient.ts";
7
+ /**
8
+ * `allowOut` lists the only destinations a sandbox may reach: E2B allows
9
+ * everything else unless `denyOut` blocks it, so an `allowOut` without a
10
+ * `denyOut` denies all other traffic.
11
+ */
12
+ export declare const denyUnlisted: <N extends {
13
+ allowOut?: ReadonlyArray<string>;
14
+ denyOut?: ReadonlyArray<string>;
15
+ }>(network: N) => N;
16
+ /** A handle to a sandbox created or connected at runtime, from what E2B returned. */
17
+ export declare const makeSandboxHandle: (auth: E2BAuth, info: sandboxes.Sandbox, domain: string) => E2BSandbox;
18
+ /**
19
+ * A handle to a sandbox declared in the stack. Its envd token is read from
20
+ * E2B on first use (without resuming it) and kept; `trafficTokenOf` comes
21
+ * from the sandbox's attributes, since E2B returns the traffic token only
22
+ * on create and connect.
23
+ */
24
+ export declare const makeConnectedSandbox: (auth: E2BAuth, sandboxIdOf: Effect.Effect<string, never, RuntimeContext>, trafficTokenOf: Effect.Effect<Redacted.Redacted<string> | undefined, never, RuntimeContext>) => ConnectedSandbox;
25
+ //# sourceMappingURL=SandboxHandle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SandboxHandle.d.ts","sources":["../../src/internal/SandboxHandle.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,SAAS,MAAM,gCAAgC,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAK7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAMxC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAG5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,KAAK,EAEV,gBAAgB,EAEhB,UAAU,EASX,MAAM,qBAAqB,CAAC;AAqB7B;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,WAEtE,CAAC,KACT,CAGU,CAAC;AAuYd,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,SACtB,OAAO,QACP,SAAS,CAAC,OAAO,UACf,MAAM,KACb,UAmBF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,SACzB,OAAO,eACA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,kBACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,KAC1F,gBAiCF,CAAC"}