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

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,142 @@
1
+ import * as templates from "@distilled.cloud/e2b/templates";
2
+ import * as Effect from "effect/Effect";
3
+ import type * as PlatformError from "effect/PlatformError";
4
+ import * as Redacted from "effect/Redacted";
5
+ import { E2BUnexpectedResponse, TemplateBuildFailed } from "../Errors.ts";
6
+ /** Credentials for a private base image. Passed to E2B's builder for the pull only. */
7
+ export type TemplateRegistry = {
8
+ /** Any registry with username/password auth (Docker Hub, GHCR, …). */
9
+ readonly username: string;
10
+ readonly password: Redacted.Redacted<string>;
11
+ } | {
12
+ /** Amazon ECR. */
13
+ readonly awsAccessKeyId: string;
14
+ readonly awsSecretAccessKey: Redacted.Redacted<string>;
15
+ readonly awsRegion: string;
16
+ } | {
17
+ /** Google Artifact Registry / GCR. */
18
+ readonly serviceAccountJson: Redacted.Redacted<string>;
19
+ };
20
+ /** A file written into the template, from memory. */
21
+ export interface TemplateFile {
22
+ /** Absolute path in the template, e.g. `/home/user/app/config.json`. */
23
+ readonly path: string;
24
+ readonly contents: Uint8Array | string;
25
+ /** @default 0o644 */
26
+ readonly mode?: number;
27
+ }
28
+ /** E2B's own build inputs: a base plus steps, with no Dockerfile. */
29
+ export interface TemplateSteps {
30
+ /** A registry image to build on, e.g. `"python:3.12-slim"`. */
31
+ readonly image?: string;
32
+ /** Another E2B template (name or id) to build on, reusing its cached layers. */
33
+ readonly fromTemplate?: string;
34
+ /** Environment variables set in the template (`ENV`). */
35
+ readonly env?: Readonly<Record<string, string>>;
36
+ /** Files written into the template. */
37
+ readonly files?: ReadonlyArray<TemplateFile>;
38
+ /** Shell commands run as extra `RUN` steps, after `env` and `files`. */
39
+ readonly run?: ReadonlyArray<string>;
40
+ /** Credentials for a private base image. */
41
+ readonly registry?: TemplateRegistry;
42
+ /**
43
+ * Command started when the template is built and captured running in its
44
+ * snapshot, so every sandbox starts with it already up.
45
+ */
46
+ readonly startCmd?: string;
47
+ /** Command that exits 0 once `startCmd` is ready; the snapshot is taken then. */
48
+ readonly readyCmd?: string;
49
+ }
50
+ /** Where a build's template lives and how big its sandboxes are. */
51
+ export interface TemplateOptions {
52
+ /** Template name (and alias). */
53
+ readonly name: string;
54
+ /**
55
+ * Tags assigned to this build (e.g. `"v1"`). Sandboxes created from the
56
+ * template id or name boot its `default` tag.
57
+ * @default ["default"]
58
+ */
59
+ readonly tags?: ReadonlyArray<string>;
60
+ readonly cpuCount?: number;
61
+ readonly memoryMB?: number;
62
+ readonly minFreeDiskMb?: number;
63
+ /** Rebuild every layer, ignoring E2B's cache. */
64
+ readonly force?: boolean;
65
+ }
66
+ export interface TemplateBuildSpec extends TemplateSteps, TemplateOptions {
67
+ }
68
+ /** One file a `COPY` step uploads. */
69
+ export interface UploadFile {
70
+ /** Path inside the archive, `/`-separated. */
71
+ readonly path: string;
72
+ readonly mode: number;
73
+ readonly size: number;
74
+ /** Hex SHA-256 of the contents. */
75
+ readonly sha256: string;
76
+ readonly read: Effect.Effect<Uint8Array, PlatformError.PlatformError>;
77
+ }
78
+ export interface PlannedStep {
79
+ readonly type: "RUN" | "COPY" | "ENV" | "WORKDIR" | "USER";
80
+ readonly args: ReadonlyArray<string>;
81
+ readonly filesHash?: string;
82
+ }
83
+ /** A base and steps that came before `TemplateSteps`' own: a lowered Dockerfile or program. */
84
+ export interface LoweredSource {
85
+ readonly fromImage: string;
86
+ readonly steps: ReadonlyArray<PlannedStep>;
87
+ readonly uploads: ReadonlyMap<string, ReadonlyArray<UploadFile>>;
88
+ /** The start command the source declares (`ENTRYPOINT` / `CMD`). */
89
+ readonly startCmd: string | undefined;
90
+ }
91
+ export interface TemplateBuildPlan {
92
+ readonly fromImage?: string;
93
+ readonly fromTemplate?: string;
94
+ readonly steps: ReadonlyArray<PlannedStep>;
95
+ readonly startCmd?: string;
96
+ readonly readyCmd?: string;
97
+ /** Files per `COPY` hash, uploaded when E2B does not have them. */
98
+ readonly uploads: ReadonlyMap<string, ReadonlyArray<UploadFile>>;
99
+ /** Content hash of everything that determines the build. A different hash means rebuild. */
100
+ readonly hash: string;
101
+ }
102
+ export interface TemplateBuildResult {
103
+ readonly templateId: string;
104
+ readonly buildId: string;
105
+ readonly names: ReadonlyArray<string>;
106
+ readonly aliases: ReadonlyArray<string>;
107
+ readonly tags: ReadonlyArray<string>;
108
+ readonly public: boolean;
109
+ }
110
+ /** E2B's default base image, for a template with no `image`, Dockerfile or `fromTemplate`. */
111
+ export declare const DEFAULT_BASE_IMAGE = "e2bdev/base";
112
+ /**
113
+ * The content hash E2B caches a `COPY` step's files under: sha256 over the
114
+ * step, then each file's path, mode, size and content hash. Stable across
115
+ * machines (no owners or timestamps).
116
+ */
117
+ export declare const filesHash: (src: string, dest: string, files: ReadonlyArray<Pick<UploadFile, "path" | "mode" | "size" | "sha256">>) => string;
118
+ /**
119
+ * Plans a build: the lowered source (if any), then `env`, `files` and `run`
120
+ * as E2B steps, hashed.
121
+ */
122
+ export declare const planTemplateBuild: (spec: TemplateBuildSpec, lowered?: LoweredSource) => Effect.Effect<{
123
+ fromImage: string | undefined;
124
+ fromTemplate: string | undefined;
125
+ steps: PlannedStep[];
126
+ startCmd: string | undefined;
127
+ readyCmd: string | undefined;
128
+ uploads: Map<string, readonly UploadFile[]>;
129
+ hash: string;
130
+ }, E2BUnexpectedResponse, never>;
131
+ /** Polls a build until it is ready; fails with its reason and the tail of its logs. */
132
+ export declare const waitForBuild: (templateId: string, buildId: string) => Effect.Effect<templates.TemplateBuildInfo, TemplateBuildFailed | templates.E2BOpError, templates.E2BOpContext>;
133
+ /** Runs a planned build to completion. */
134
+ export declare const runTemplateBuild: (spec: TemplateBuildSpec, plan: TemplateBuildPlan) => Effect.Effect<{
135
+ templateId: string;
136
+ buildId: string;
137
+ names: templates.TemplateRequestResponseV3NamesList;
138
+ aliases: templates.TemplateRequestResponseV3AliasesList;
139
+ tags: templates.TemplateRequestResponseV3TagsList;
140
+ public: boolean;
141
+ }, E2BUnexpectedResponse | PlatformError.PlatformError | TemplateBuildFailed | templates.E2BOpError, templates.E2BOpContext>;
142
+ //# sourceMappingURL=TemplateBuild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateBuild.d.ts","sources":["../../src/internal/TemplateBuild.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Plans and runs an E2B template build. Shared by the `E2B.Template`
3
+ * resource (which lowers its Dockerfile or `main` through
4
+ * `./TemplatePlan.ts` first) and the runtime `E2B.CreateTemplate` binding.
5
+ *
6
+ * E2B builds remotely only: there is no local Docker step. The flow is
7
+ *
8
+ * 1. `createTemplate` — the template (by name) and a new build id
9
+ * 2. `getTemplateFileUploadLink` per `COPY` hash, uploading what E2B lacks
10
+ * 3. `startTemplateBuild` — base image or template, steps, start/ready command
11
+ * 4. `getTemplateBuildStatus` until the build is `ready` or `error`
12
+ *
13
+ * This module runs where a Worker runs: it imports nothing from
14
+ * `@alchemy.run/docker`.
15
+ */
16
+ import * as crypto from "node:crypto";
17
+ import * as templates from "@distilled.cloud/e2b/templates";
18
+ import * as Duration from "effect/Duration";
19
+ import * as Effect from "effect/Effect";
20
+ import * as HttpClient from "effect/http/HttpClient";
21
+ import * as HttpClientRequest from "effect/http/HttpClientRequest";
22
+ import * as Redacted from "effect/Redacted";
23
+ import * as Schedule from "effect/Schedule";
24
+ import { E2BUnexpectedResponse, TemplateBuildFailed } from "../Errors.js";
25
+ import { tarGzip } from "./Tar.js";
26
+ /** E2B's default base image, for a template with no `image`, Dockerfile or `fromTemplate`. */
27
+ export const DEFAULT_BASE_IMAGE = "e2bdev/base";
28
+ const encoder = new TextEncoder();
29
+ const sha256 = (bytes) => crypto.createHash("sha256").update(bytes).digest("hex");
30
+ /**
31
+ * The content hash E2B caches a `COPY` step's files under: sha256 over the
32
+ * step, then each file's path, mode, size and content hash. Stable across
33
+ * machines (no owners or timestamps).
34
+ */
35
+ export const filesHash = (src, dest, files) => {
36
+ const hash = crypto.createHash("sha256");
37
+ hash.update(`COPY ${src} ${dest}`);
38
+ for (const file of files) {
39
+ hash.update(`${file.path}\0${file.mode}\0${file.size}\0${file.sha256}\0`);
40
+ }
41
+ return hash.digest("hex");
42
+ };
43
+ /** `files` as `COPY` steps: each file is its own upload, named by its content. */
44
+ const fileSteps = (files) => files.map((file) => {
45
+ const bytes = typeof file.contents === "string" ? encoder.encode(file.contents) : file.contents;
46
+ const upload = {
47
+ path: `files/${sha256(bytes).slice(0, 16)}`,
48
+ mode: file.mode ?? 0o644,
49
+ size: bytes.byteLength,
50
+ sha256: sha256(bytes),
51
+ read: Effect.succeed(bytes),
52
+ };
53
+ const hash = filesHash(upload.path, file.path, [upload]);
54
+ return {
55
+ step: {
56
+ type: "COPY",
57
+ args: [upload.path, file.path, "", ""],
58
+ filesHash: hash,
59
+ },
60
+ hash,
61
+ upload,
62
+ };
63
+ });
64
+ /**
65
+ * Plans a build: the lowered source (if any), then `env`, `files` and `run`
66
+ * as E2B steps, hashed.
67
+ */
68
+ export const planTemplateBuild = (spec, lowered) => Effect.gen(function* () {
69
+ if (spec.image !== undefined && spec.fromTemplate !== undefined) {
70
+ return yield* new E2BUnexpectedResponse({
71
+ message: `template ${spec.name}: set one of image or fromTemplate`,
72
+ });
73
+ }
74
+ const uploads = new Map(lowered?.uploads ?? []);
75
+ const files = fileSteps(spec.files ?? []);
76
+ for (const file of files)
77
+ uploads.set(file.hash, [file.upload]);
78
+ const steps = [
79
+ ...(lowered?.steps ?? []),
80
+ ...(spec.env && Object.keys(spec.env).length > 0
81
+ ? [{ type: "ENV", args: Object.entries(spec.env).flat() }]
82
+ : []),
83
+ ...files.map((file) => file.step),
84
+ ...(spec.run ?? []).map((command) => ({ type: "RUN", args: [command] })),
85
+ ];
86
+ const fromTemplate = spec.fromTemplate;
87
+ const fromImage = fromTemplate !== undefined
88
+ ? undefined
89
+ : (lowered?.fromImage ?? spec.image ?? DEFAULT_BASE_IMAGE);
90
+ const startCmd = spec.startCmd ?? lowered?.startCmd;
91
+ const hash = sha256(JSON.stringify({
92
+ fromImage,
93
+ fromTemplate,
94
+ steps,
95
+ startCmd,
96
+ readyCmd: spec.readyCmd,
97
+ cpuCount: spec.cpuCount,
98
+ memoryMB: spec.memoryMB,
99
+ minFreeDiskMb: spec.minFreeDiskMb,
100
+ registry: spec.registry === undefined ? undefined : Object.keys(spec.registry).sort(),
101
+ }));
102
+ return {
103
+ fromImage,
104
+ fromTemplate,
105
+ steps,
106
+ startCmd,
107
+ readyCmd: spec.readyCmd,
108
+ uploads,
109
+ hash,
110
+ };
111
+ });
112
+ const registryOf = (registry) =>
113
+ // The registry union is opaque on the wire: secrets are unwrapped here, at
114
+ // the point of use, and never logged.
115
+ "awsAccessKeyId" in registry
116
+ ? {
117
+ type: "aws",
118
+ awsAccessKeyId: registry.awsAccessKeyId,
119
+ awsSecretAccessKey: Redacted.value(registry.awsSecretAccessKey),
120
+ awsRegion: registry.awsRegion,
121
+ }
122
+ : "serviceAccountJson" in registry
123
+ ? { type: "gcp", serviceAccountJson: Redacted.value(registry.serviceAccountJson) }
124
+ : {
125
+ type: "registry",
126
+ username: registry.username,
127
+ password: Redacted.value(registry.password),
128
+ };
129
+ /** Uploads one `COPY` context unless E2B already has it. */
130
+ const uploadContext = Effect.fn(function* (templateId, hash, files) {
131
+ const link = yield* templates.getTemplateFileUploadLink({ templateID: templateId, hash });
132
+ if (link.present)
133
+ return;
134
+ if (link.url === undefined) {
135
+ return yield* new E2BUnexpectedResponse({
136
+ message: `E2B returned no upload URL for context ${hash} of template ${templateId}`,
137
+ });
138
+ }
139
+ const archive = yield* tarGzip(yield* Effect.forEach(files, (file) => Effect.map(file.read, (contents) => ({ path: file.path, mode: file.mode, contents }))));
140
+ const client = yield* HttpClient.HttpClient;
141
+ const headers = Object.fromEntries(Object.entries(link.headers ?? {}).filter((entry) => entry[1] !== undefined));
142
+ // Raw HTTP: a presigned upload URL the API handed back, used as-is. The
143
+ // body is sized (presigned PUTs reject chunked transfer encoding), and
144
+ // carries only the headers E2B returned: the URL is signed without a
145
+ // Content-Type, so sending one fails with SignatureDoesNotMatch.
146
+ const response = yield* client
147
+ .execute(HttpClientRequest.put(link.url).pipe(HttpClientRequest.bodyUint8Array(archive), HttpClientRequest.removeHeader("content-type"), HttpClientRequest.setHeaders(headers)))
148
+ .pipe(Effect.retry({ times: 4, schedule: Schedule.exponential("500 millis") }));
149
+ if (response.status < 200 || response.status >= 300) {
150
+ const body = yield* response.text.pipe(Effect.orElseSucceed(() => ""));
151
+ return yield* new E2BUnexpectedResponse({
152
+ message: `uploading build context ${hash} for template ${templateId} failed with HTTP ${response.status}: ${body.slice(0, 500)}`,
153
+ });
154
+ }
155
+ });
156
+ /** Polls a build until it is ready; fails with its reason and the tail of its logs. */
157
+ export const waitForBuild = Effect.fn(function* (templateId, buildId) {
158
+ const status = yield* templates
159
+ .getTemplateBuildStatus({ templateID: templateId, buildID: buildId })
160
+ .pipe(Effect.repeat({
161
+ // Image pulls and dependency installs take minutes; bounded at ~20 min.
162
+ schedule: Schedule.spaced(Duration.seconds(3)),
163
+ until: (info) => info.status === "ready" || info.status === "error",
164
+ times: 400,
165
+ }));
166
+ if (status.status !== "ready") {
167
+ // `logs` is always empty on the current build path; `logEntries` has them.
168
+ const logs = (status.reason?.logEntries ?? status.logEntries)
169
+ .slice(-40)
170
+ .map((entry) => entry.message);
171
+ return yield* new TemplateBuildFailed({
172
+ message: [
173
+ `E2B template build ${buildId} failed: ${status.reason?.message ?? status.status}`,
174
+ ...logs.slice(-15).map((line) => ` ${line}`),
175
+ ].join("\n"),
176
+ templateId,
177
+ buildId,
178
+ reason: status.reason?.message,
179
+ logs,
180
+ });
181
+ }
182
+ return status;
183
+ });
184
+ /** Runs a planned build to completion. */
185
+ export const runTemplateBuild = Effect.fn(function* (spec, plan) {
186
+ const created = yield* templates.createTemplate({
187
+ name: spec.name,
188
+ tags: spec.tags === undefined ? undefined : [...spec.tags],
189
+ cpuCount: spec.cpuCount,
190
+ memoryMB: spec.memoryMB,
191
+ minFreeDiskMb: spec.minFreeDiskMb,
192
+ });
193
+ yield* Effect.forEach([...plan.uploads], ([hash, files]) => uploadContext(created.templateID, hash, files), { concurrency: 4, discard: true });
194
+ yield* templates.startTemplateBuild({
195
+ templateID: created.templateID,
196
+ buildID: created.buildID,
197
+ fromImage: plan.fromImage,
198
+ fromTemplate: plan.fromTemplate,
199
+ fromImageRegistry: spec.registry === undefined ? undefined : registryOf(spec.registry),
200
+ steps: plan.steps.map((step) => ({
201
+ type: step.type,
202
+ args: [...step.args],
203
+ filesHash: step.filesHash,
204
+ force: spec.force,
205
+ })),
206
+ startCmd: plan.startCmd,
207
+ readyCmd: plan.readyCmd,
208
+ force: spec.force,
209
+ });
210
+ yield* waitForBuild(created.templateID, created.buildID);
211
+ return {
212
+ templateId: created.templateID,
213
+ buildId: created.buildID,
214
+ names: created.names,
215
+ aliases: created.aliases,
216
+ tags: created.tags,
217
+ public: created.public,
218
+ };
219
+ });
220
+ //# sourceMappingURL=TemplateBuild.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateBuild.js","sources":["../../src/internal/TemplateBuild.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Lowers an image source (`image`, `dockerfile` + `context`, `main`) to E2B
3
+ * build steps through `@alchemy.run/docker/BuildPlan`.
4
+ *
5
+ * E2B does not run `docker build`: its builder takes a base image plus a
6
+ * list of steps (`RUN`, `COPY`, `ENV`, `WORKDIR`, `USER`) and a start
7
+ * command. `BuildPlan.plan` parses the Dockerfile, bundles `main`, collects
8
+ * the context files every `COPY` reads, and rejects what E2B's builder
9
+ * cannot run ({@link E2BCapabilities}). This module maps the plan's final
10
+ * stage onto E2B's steps, one `COPY` step and upload per source.
11
+ *
12
+ * Like E2B's own SDK, the build starts as `root` in `/` and ends as `user`
13
+ * in `/home/user` unless the Dockerfile sets `USER` / `WORKDIR` itself.
14
+ *
15
+ * Deploy-time only: `BuildPlan` bundles and reads the filesystem.
16
+ */
17
+ import * as BuildPlan from "@alchemy.run/docker/BuildPlan";
18
+ import type { ImageSourceProps } from "@alchemy.run/docker/ImageSource";
19
+ import * as Effect from "effect/Effect";
20
+ import * as FileSystem from "effect/FileSystem";
21
+ import { UnsupportedDockerfileInstruction } from "../Errors.ts";
22
+ import { type PlannedStep, type UploadFile } from "./TemplateBuild.ts";
23
+ /** What E2B's template builder can build. */
24
+ export declare const E2BCapabilities: BuildPlan.Capabilities;
25
+ /** `$VAR`, `${VAR}`, `${VAR:-default}` and `${VAR:+alt}` from ARG/ENV values, as Docker expands them. */
26
+ export declare const substitute: (text: string, vars: ReadonlyMap<string, string>) => string;
27
+ /** An exec-form argv as one shell command, for E2B's string steps. */
28
+ export declare const shellCommand: (argv: ReadonlyArray<string>) => string;
29
+ /**
30
+ * Lowers a plan's final stage to E2B steps. `args` override `ARG` defaults,
31
+ * like `docker build --build-arg`. An `ARG` becomes an `ENV` step, as in
32
+ * E2B's SDK, so `RUN` steps read it.
33
+ */
34
+ export declare const lowerPlan: (plan: BuildPlan.BuildPlan, args?: Readonly<Record<string, string>>) => Effect.Effect<{
35
+ fromImage: string;
36
+ steps: PlannedStep[];
37
+ uploads: Map<string, readonly UploadFile[]>;
38
+ startCmd: string | undefined;
39
+ }, UnsupportedDockerfileInstruction, FileSystem.FileSystem>;
40
+ export interface PlanSourceOptions {
41
+ /** Port a `main` program listens on. */
42
+ readonly port?: number;
43
+ /** Bootstrap wrapped around an Effect-native `main`. */
44
+ readonly bootstrap?: (importPath: string) => string;
45
+ /** `ARG` values. */
46
+ readonly args?: Readonly<Record<string, string>>;
47
+ /** Install lines from the program's mount capabilities (`alchemy/Mount`). */
48
+ readonly install?: ReadonlyArray<string>;
49
+ }
50
+ /** Plans an image source with E2B's capabilities and lowers it to E2B steps. */
51
+ export declare const planSource: (source: ImageSourceProps, options?: PlanSourceOptions) => Effect.Effect<{
52
+ fromImage: string;
53
+ steps: PlannedStep[];
54
+ uploads: Map<string, readonly UploadFile[]>;
55
+ startCmd: string | undefined;
56
+ }, import("@alchemy.run/docker/BuildHash").BuildHashInvalidProps | BuildPlan.BuildPlanError | import("alchemy/Bundle/Bundle").BundleError | import("@alchemy.run/docker/DockerfileParser").DockerfileSyntaxError | import("effect/PlatformError").PlatformError | BuildPlan.UnsupportedDockerfile | UnsupportedDockerfileInstruction, FileSystem.FileSystem | import("effect/Path").Path>;
57
+ //# sourceMappingURL=TemplatePlan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplatePlan.d.ts","sources":["../../src/internal/TemplatePlan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,gCAAgC,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAE5B,6CAA6C;AAC7C,eAAO,MAAM,eAAe,EAAE,SAAS,CAAC,YAqBvC,CAAC;AAEF,yGAAyG;AACzG,eAAO,MAAM,UAAU,SAAU,MAAM,QAAQ,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,KAAG,MAgB1E,CAAC;AAKJ,sEAAsE;AACtE,eAAO,MAAM,YAAY,SAAU,aAAa,CAAC,MAAM,CAAC,WAAmC,CAAC;AAE5F;;;;GAIG;AACH,eAAO,MAAM,SAAS,SAAU,SAAS,CAAC,SAAS,SAAQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;;;;2DAyHvF,CAAC;AAEL,MAAM,WAAW,iBAAiB;IAChC,wCAAwC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACpD,oBAAoB;IACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,gFAAgF;AAChF,eAAO,MAAM,UAAU,WAAY,gBAAgB,YAAW,iBAAiB;;;;;yXAY3E,CAAC"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Lowers an image source (`image`, `dockerfile` + `context`, `main`) to E2B
3
+ * build steps through `@alchemy.run/docker/BuildPlan`.
4
+ *
5
+ * E2B does not run `docker build`: its builder takes a base image plus a
6
+ * list of steps (`RUN`, `COPY`, `ENV`, `WORKDIR`, `USER`) and a start
7
+ * command. `BuildPlan.plan` parses the Dockerfile, bundles `main`, collects
8
+ * the context files every `COPY` reads, and rejects what E2B's builder
9
+ * cannot run ({@link E2BCapabilities}). This module maps the plan's final
10
+ * stage onto E2B's steps, one `COPY` step and upload per source.
11
+ *
12
+ * Like E2B's own SDK, the build starts as `root` in `/` and ends as `user`
13
+ * in `/home/user` unless the Dockerfile sets `USER` / `WORKDIR` itself.
14
+ *
15
+ * Deploy-time only: `BuildPlan` bundles and reads the filesystem.
16
+ */
17
+ import * as BuildPlan from "@alchemy.run/docker/BuildPlan";
18
+ import * as Effect from "effect/Effect";
19
+ import * as FileSystem from "effect/FileSystem";
20
+ import { UnsupportedDockerfileInstruction } from "../Errors.js";
21
+ import { filesHash, } from "./TemplateBuild.js";
22
+ /** What E2B's template builder can build. */
23
+ export const E2BCapabilities = {
24
+ target: "E2B.Template",
25
+ multiStage: false,
26
+ heredocs: false,
27
+ runMounts: false,
28
+ remoteAdd: false,
29
+ platforms: ["linux/amd64"],
30
+ // E2B's builder takes no build args or build secrets: arg values are
31
+ // written into the steps, and secret mounts fail at plan.
32
+ buildArgs: false,
33
+ secrets: false,
34
+ instructions: {
35
+ SHELL: "unsupported",
36
+ EXPOSE: "ignored",
37
+ LABEL: "ignored",
38
+ VOLUME: "ignored",
39
+ HEALTHCHECK: "ignored",
40
+ STOPSIGNAL: "ignored",
41
+ ONBUILD: "ignored",
42
+ MAINTAINER: "ignored",
43
+ },
44
+ };
45
+ /** `$VAR`, `${VAR}`, `${VAR:-default}` and `${VAR:+alt}` from ARG/ENV values, as Docker expands them. */
46
+ export const substitute = (text, vars) => text.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)(?::([-+])([^}]*))?\}|\$([A-Za-z_][A-Za-z0-9_]*)/g, (_, braced, op, word, bare) => {
47
+ const name = braced ?? bare;
48
+ const value = vars.get(name);
49
+ if (op === "-")
50
+ return value !== undefined && value !== "" ? value : (word ?? "");
51
+ if (op === "+")
52
+ return value !== undefined && value !== "" ? (word ?? "") : "";
53
+ return value ?? "";
54
+ });
55
+ const shellQuote = (word) => /^[A-Za-z0-9_\-./=:@%+,]+$/.test(word) ? word : `'${word.replace(/'/g, `'\\''`)}'`;
56
+ /** An exec-form argv as one shell command, for E2B's string steps. */
57
+ export const shellCommand = (argv) => argv.map(shellQuote).join(" ");
58
+ /**
59
+ * Lowers a plan's final stage to E2B steps. `args` override `ARG` defaults,
60
+ * like `docker build --build-arg`. An `ARG` becomes an `ENV` step, as in
61
+ * E2B's SDK, so `RUN` steps read it.
62
+ */
63
+ export const lowerPlan = (plan, args = {}) => Effect.gen(function* () {
64
+ const fs = yield* FileSystem.FileSystem;
65
+ const fail = (message, line) => Effect.fail(new UnsupportedDockerfileInstruction({ message, line }));
66
+ /** An ARG's value: the build arg, else its default, else (in a stage) the global value. */
67
+ const argValue = (name, defaultValue, vars, inherited) => args[name] ?? (defaultValue !== undefined ? substitute(defaultValue, vars) : inherited);
68
+ const global = new Map();
69
+ for (const arg of plan.dockerfile.globalArgs) {
70
+ for (const [name, defaultValue] of arg.vars) {
71
+ const value = argValue(name, defaultValue, global);
72
+ if (value !== undefined)
73
+ global.set(name, value);
74
+ }
75
+ }
76
+ const fromImage = substitute(plan.base, global);
77
+ // Global ARGs only parameterise FROM; the stage sees the ones it redeclares.
78
+ const vars = new Map();
79
+ const steps = [
80
+ { type: "USER", args: ["root"] },
81
+ { type: "WORKDIR", args: ["/"] },
82
+ ];
83
+ const uploads = new Map();
84
+ let userChanged = false;
85
+ let workdirChanged = false;
86
+ for (const instruction of plan.instructions) {
87
+ switch (instruction._tag) {
88
+ case "ARG": {
89
+ const set = [];
90
+ for (const [name, defaultValue] of instruction.vars) {
91
+ const value = argValue(name, defaultValue, vars, global.get(name));
92
+ if (value === undefined)
93
+ continue;
94
+ vars.set(name, value);
95
+ set.push(name, value);
96
+ }
97
+ if (set.length > 0)
98
+ steps.push({ type: "ENV", args: set });
99
+ break;
100
+ }
101
+ case "ENV": {
102
+ const pairs = instruction.vars.map(([name, value]) => [name, substitute(value, vars)]);
103
+ for (const [name, value] of pairs)
104
+ vars.set(name, value);
105
+ steps.push({ type: "ENV", args: pairs.flat() });
106
+ break;
107
+ }
108
+ case "RUN":
109
+ steps.push({
110
+ type: "RUN",
111
+ args: [
112
+ instruction.command.form === "exec"
113
+ ? shellCommand(instruction.command.argv)
114
+ : instruction.command.script,
115
+ ],
116
+ });
117
+ break;
118
+ case "COPY":
119
+ case "ADD": {
120
+ const flag = (name) => instruction.flags.find((candidate) => candidate.name === name)?.value ?? "";
121
+ const dest = substitute(instruction.destination, vars);
122
+ for (const raw of instruction.sources) {
123
+ const src = substitute(raw, vars);
124
+ const files = BuildPlan.filesFor(plan, { ...instruction, sources: [src] });
125
+ if (files.length === 0) {
126
+ return yield* fail(`${instruction._tag} ${src} matches no files in the build context`, instruction.line);
127
+ }
128
+ const upload = files.map((file) => ({
129
+ path: file.path,
130
+ mode: file.mode,
131
+ size: file.size,
132
+ sha256: file.sha256,
133
+ read: BuildPlan.readContextFile(file).pipe(Effect.provideService(FileSystem.FileSystem, fs)),
134
+ }));
135
+ const hash = filesHash(src, dest, upload);
136
+ uploads.set(hash, upload);
137
+ steps.push({
138
+ type: "COPY",
139
+ args: [src, dest, substitute(flag("chown"), vars), flag("chmod")],
140
+ filesHash: hash,
141
+ });
142
+ }
143
+ break;
144
+ }
145
+ case "WORKDIR":
146
+ steps.push({ type: "WORKDIR", args: [substitute(instruction.value, vars)] });
147
+ workdirChanged = true;
148
+ break;
149
+ case "USER":
150
+ steps.push({ type: "USER", args: [substitute(instruction.value, vars)] });
151
+ userChanged = true;
152
+ break;
153
+ // CMD / ENTRYPOINT are the start command; the rest are ignored
154
+ // (BuildPlan rejected what E2B does not support).
155
+ default:
156
+ break;
157
+ }
158
+ }
159
+ if (!userChanged)
160
+ steps.push({ type: "USER", args: ["user"] });
161
+ if (!workdirChanged)
162
+ steps.push({ type: "WORKDIR", args: ["/home/user"] });
163
+ const argv = BuildPlan.startCommand(plan);
164
+ return {
165
+ fromImage,
166
+ steps,
167
+ uploads,
168
+ startCmd: argv === undefined ? undefined : shellCommand(argv),
169
+ };
170
+ });
171
+ /** Plans an image source with E2B's capabilities and lowers it to E2B steps. */
172
+ export const planSource = (source, options = {}) => Effect.gen(function* () {
173
+ const plan = yield* BuildPlan.plan(source, {
174
+ capabilities: E2BCapabilities,
175
+ ...(options.port !== undefined ? { port: options.port } : {}),
176
+ ...(options.bootstrap !== undefined ? { bootstrap: options.bootstrap } : {}),
177
+ ...(options.install !== undefined && options.install.length > 0
178
+ ? { install: options.install }
179
+ : {}),
180
+ });
181
+ for (const warning of plan.warnings)
182
+ yield* Effect.logDebug(warning);
183
+ return yield* lowerPlan(plan, { ...plan.args, ...options.args });
184
+ });
185
+ //# sourceMappingURL=TemplatePlan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplatePlan.js","sources":["../../src/internal/TemplatePlan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import * as Effect from "effect/Effect";
2
+ import type { E2BAuth } from "../E2BBindings.ts";
3
+ import type { ReadWriteVolumeClient } from "../VolumeFiles.ts";
4
+ export declare const makeVolumeFiles: (auth: E2BAuth, volumeIdOf: Effect.Effect<string>) => ReadWriteVolumeClient;
5
+ //# sourceMappingURL=VolumeHttp.d.ts.map