@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 @@
1
+ {"version":3,"file":"VolumeHttp.d.ts","sources":["../../src/internal/VolumeHttp.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAO/D,eAAO,MAAM,eAAe,SACpB,OAAO,cACD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAChC,qBA4DF,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * The volume-content client over E2B's HTTP API.
3
+ *
4
+ * Volume content is authenticated with the volume's own token, which the
5
+ * control plane returns from `getVolume` (team key). The token is fetched
6
+ * once per volume on first use and kept for the life of the runtime; a failed
7
+ * lookup is not cached, so the next call retries it.
8
+ */
9
+ import { volumeConnectionFor } from "@distilled.cloud/e2b";
10
+ import * as volumeContent from "@distilled.cloud/e2b/volume_content";
11
+ import * as volumes from "@distilled.cloud/e2b/volumes";
12
+ import * as Effect from "effect/Effect";
13
+ import * as FetchHttpClient from "effect/http/FetchHttpClient";
14
+ import * as Layer from "effect/Layer";
15
+ const decoder = new TextDecoder();
16
+ export const makeVolumeFiles = (auth, volumeIdOf) => {
17
+ let cached;
18
+ /** The volume-token connection, looked up once. */
19
+ const connection = Effect.suspend(() => cached !== undefined
20
+ ? Effect.succeed(cached)
21
+ : Effect.flatMap(volumeIdOf, (volumeId) => auth.authorize(volumes.getVolume({ volumeID: volumeId })).pipe(Effect.map((volume) => {
22
+ cached = {
23
+ volumeId,
24
+ layer: Layer.mergeAll(volumeConnectionFor(volume), FetchHttpClient.layer),
25
+ };
26
+ return cached;
27
+ }))));
28
+ /** Runs a volume-content call, given the volume id, with the volume's token. */
29
+ const inVolume = (call) => Effect.flatMap(connection, ({ volumeId, layer }) => call(volumeId).pipe(Effect.provide(layer)));
30
+ return {
31
+ read: (path) => inVolume((volumeID) => volumeContent.readVolumeFile({ volumeID, path })),
32
+ readText: (path) => inVolume((volumeID) => volumeContent.readVolumeFile({ volumeID, path })).pipe(Effect.map((bytes) => decoder.decode(bytes))),
33
+ list: (path, options) => inVolume((volumeID) => volumeContent.listVolumeDir({
34
+ volumeID,
35
+ path,
36
+ ...(options?.depth === undefined ? {} : { depth: options.depth }),
37
+ })),
38
+ stat: (path) => inVolume((volumeID) => volumeContent.statVolumePath({ volumeID, path })),
39
+ exists: (path) => inVolume((volumeID) => volumeContent.statVolumePath({ volumeID, path })).pipe(Effect.as(true), Effect.catchTag("NotFound", () => Effect.succeed(false))),
40
+ write: (path, data, options) => inVolume((volumeID) => volumeContent.writeVolumeFile({ volumeID, path, body: data, force: true, ...options })),
41
+ makeDir: (path, options) => inVolume((volumeID) => volumeContent.makeVolumeDir({ volumeID, path, force: true, ...options })),
42
+ chmod: (path, options) => inVolume((volumeID) => volumeContent.updateVolumePath({ volumeID, path, ...options })),
43
+ remove: (path) => inVolume((volumeID) => volumeContent.removeVolumePath({ volumeID, path })).pipe(Effect.asVoid, Effect.catchTag("NotFound", () => Effect.void)),
44
+ };
45
+ };
46
+ //# sourceMappingURL=VolumeHttp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeHttp.js","sources":["../../src/internal/VolumeHttp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alchemy.run/e2b",
3
- "version": "0.0.0",
3
+ "version": "2.0.0-beta.87",
4
4
  "description": "E2B sandboxes, templates, snapshots, volumes and secrets for Alchemy.",
5
5
  "keywords": [
6
6
  "agents",
@@ -11,12 +11,71 @@
11
11
  "infrastructure-as-code",
12
12
  "sandbox"
13
13
  ],
14
+ "homepage": "https://alchemy.run",
15
+ "bugs": {
16
+ "url": "https://github.com/alchemy-run/alchemy/issues"
17
+ },
14
18
  "license": "Apache-2.0",
15
19
  "author": "Sam Goodwin <sam@alchemy.run>",
16
- "homepage": "https://alchemy.run",
17
20
  "repository": {
18
21
  "type": "git",
19
22
  "url": "git+https://github.com/alchemy-run/alchemy.git",
20
23
  "directory": "packages/e2b"
24
+ },
25
+ "files": [
26
+ "lib",
27
+ "src"
28
+ ],
29
+ "type": "module",
30
+ "sideEffects": false,
31
+ "exports": {
32
+ ".": {
33
+ "types": "./lib/index.d.ts",
34
+ "bun": "./src/index.ts",
35
+ "worker": "./src/index.ts",
36
+ "default": "./lib/index.js"
37
+ },
38
+ "./internal/*": null,
39
+ "./*": {
40
+ "types": "./lib/*.d.ts",
41
+ "bun": "./src/*.ts",
42
+ "worker": "./src/*.ts",
43
+ "default": "./lib/*.js"
44
+ },
45
+ "./package.json": "./package.json"
46
+ },
47
+ "publishConfig": {
48
+ "access": "public"
49
+ },
50
+ "dependencies": {
51
+ "@alchemy.run/docker": "2.0.0-beta.87",
52
+ "@distilled.cloud/core": "1.0.0-rc.20",
53
+ "@distilled.cloud/e2b": "1.0.0-rc.20"
54
+ },
55
+ "devDependencies": {
56
+ "@effect/platform-bun": "^4.1.4",
57
+ "@types/bun": "1.4.3",
58
+ "alchemy": "2.0.0-beta.87",
59
+ "effect": "^4.1.4",
60
+ "typescript": "^7.1.0-dev.20261105.1"
61
+ },
62
+ "peerDependencies": {
63
+ "@effect/platform-bun": "^4.1.4",
64
+ "alchemy": "2.0.0-beta.87",
65
+ "effect": "^4.1.4"
66
+ },
67
+ "peerDependenciesMeta": {
68
+ "@effect/platform-bun": {
69
+ "optional": true
70
+ }
71
+ },
72
+ "alchemy": {
73
+ "contributes": [
74
+ "@alchemy.run/e2b/Contributions"
75
+ ]
76
+ },
77
+ "scripts": {
78
+ "build": "pnpm -r --filter \"{.}...\" run build:package",
79
+ "build:package": "node scripts/build.ts"
21
80
  }
22
- }
81
+ }
package/src/ApiKey.ts ADDED
@@ -0,0 +1,148 @@
1
+ import * as apiKeys from "@distilled.cloud/e2b/api_keys";
2
+ import { Unowned } from "alchemy/AdoptPolicy";
3
+ import * as Provider from "alchemy/Provider";
4
+ import { Resource } from "alchemy/Resource";
5
+ import * as Effect from "effect/Effect";
6
+ import * as Redacted from "effect/Redacted";
7
+ import { E2BUnexpectedResponse } from "./Errors.ts";
8
+ import { e2bName, isGeneratedName } from "./internal/Ownership.ts";
9
+ import type { Providers } from "./Providers.ts";
10
+
11
+ export interface ApiKeyProps {
12
+ /**
13
+ * Key name. If omitted, a unique name is generated from the stack, stage
14
+ * and logical ID. Renamed in place.
15
+ */
16
+ name?: string;
17
+ }
18
+
19
+ export interface ApiKeyAttributes {
20
+ /** E2B's API key id. */
21
+ apiKeyId: string;
22
+ name: string;
23
+ /** The key, sent as `X-API-Key`. Only shown once by E2B; Alchemy keeps it in state. */
24
+ key: Redacted.Redacted<string>;
25
+ /** The key's masked form, as the dashboard shows it. */
26
+ mask: string;
27
+ }
28
+
29
+ export interface ApiKey extends Resource<
30
+ "E2B.ApiKey",
31
+ ApiKeyProps,
32
+ ApiKeyAttributes,
33
+ never,
34
+ Providers
35
+ > {}
36
+
37
+ /**
38
+ * An E2B team API key.
39
+ *
40
+ * E2B keys are not scoped: every key reaches every sandbox, template, volume
41
+ * and secret in the team. Mint a separate key per app or CI system so you
42
+ * can revoke one without the others.
43
+ *
44
+ * E2B mints API keys only with a personal access token: set `accessToken`
45
+ * in the E2B profile, or `E2B_ACCESS_TOKEN` in CI. The team defaults to the
46
+ * token's default team. E2B shows the key once, at creation; Alchemy keeps it
47
+ * in state as a `Redacted` value. A key whose value was lost is replaced.
48
+ *
49
+ * ### Creating an API key
50
+ * **Example:** A key for CI
51
+ * ```typescript
52
+ * export const Ci = E2B.ApiKey("Ci", {});
53
+ * ```
54
+ *
55
+ * **Example:** Pass the key to a Worker as a secret
56
+ * ```typescript
57
+ * const ci = yield* Ci;
58
+ * yield* GitHub.Secret("E2B_API_KEY", { repository: "my-org/app", value: ci.key });
59
+ * ```
60
+ *
61
+ * @resource
62
+ * @product API key
63
+ */
64
+ export const ApiKey = Resource<ApiKey>("E2B.ApiKey");
65
+
66
+ const maskOf = (mask: apiKeys.IdentifierMaskingDetails) =>
67
+ `${mask.prefix}${mask.maskedValuePrefix}…${mask.maskedValueSuffix}`;
68
+
69
+ const findById = (apiKeyId: string) =>
70
+ apiKeys.listApiKeys({}).pipe(Effect.map((all) => all.find((key) => key.id === apiKeyId)));
71
+
72
+ const redact = (value: string | Redacted.Redacted<string>) =>
73
+ Redacted.isRedacted(value) ? value : Redacted.make(value);
74
+
75
+ export const ApiKeyProvider = () =>
76
+ Provider.effect(
77
+ ApiKey,
78
+ Effect.gen(function* () {
79
+ return {
80
+ stables: ["apiKeyId", "key"],
81
+ read: Effect.fn(function* ({ olds, output }) {
82
+ // E2B never returns a key's value after creation: without the
83
+ // stored value there is nothing to adopt, so a key is only ours
84
+ // through state.
85
+ if (output === undefined) return undefined;
86
+ const key = yield* findById(output.apiKeyId);
87
+ if (key === undefined) return undefined;
88
+ const attrs = { ...output, name: key.name, mask: maskOf(key.mask) };
89
+ return olds !== undefined || isGeneratedName(key.name) ? attrs : Unowned(attrs);
90
+ }),
91
+ reconcile: Effect.fn(function* ({ id, news, output, session }) {
92
+ const name = news.name ?? output?.name ?? (yield* e2bName(id, undefined));
93
+
94
+ // Observe — E2B shows a key's value only at creation, so the only
95
+ // usable key is one whose value is in state.
96
+ const held =
97
+ output === undefined
98
+ ? undefined
99
+ : { stored: output, observed: yield* findById(output.apiKeyId) };
100
+
101
+ // Ensure
102
+ if (held?.observed === undefined) {
103
+ yield* session.note(`Creating API key ${name}...`);
104
+ const created = yield* apiKeys.createApiKey({ name });
105
+ return {
106
+ apiKeyId: created.id,
107
+ name: created.name,
108
+ key: redact(created.key),
109
+ mask: maskOf(created.mask),
110
+ };
111
+ }
112
+
113
+ const { stored, observed } = held;
114
+
115
+ // Sync — the name is the only mutable aspect.
116
+ if (observed.name !== name) {
117
+ yield* apiKeys.updateApiKey({ apiKeyID: observed.id, name });
118
+ const renamed = yield* findById(observed.id);
119
+ if (renamed === undefined) {
120
+ return yield* new E2BUnexpectedResponse({
121
+ message: `E2B API key ${name} vanished after rename`,
122
+ });
123
+ }
124
+ return { ...stored, name: renamed.name, mask: maskOf(renamed.mask) };
125
+ }
126
+ return { ...stored, name: observed.name, mask: maskOf(observed.mask) };
127
+ }),
128
+ delete: Effect.fn(function* ({ output }) {
129
+ yield* apiKeys
130
+ .deleteApiKey({ apiKeyID: output.apiKeyId })
131
+ .pipe(Effect.catchTag("NotFound", () => Effect.void));
132
+ }),
133
+ // For nuke. E2B never returns a key's value, so listed keys carry an
134
+ // empty one; delete needs only the id.
135
+ list: Effect.fn(function* () {
136
+ const all = yield* apiKeys.listApiKeys({});
137
+ return all
138
+ .filter((key) => isGeneratedName(key.name))
139
+ .map((key) => ({
140
+ apiKeyId: key.id,
141
+ name: key.name,
142
+ key: Redacted.make(""),
143
+ mask: maskOf(key.mask),
144
+ }));
145
+ }),
146
+ };
147
+ }),
148
+ );