@alchemy.run/e2b 0.0.0-stage → 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 +60 -2
  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 +78 -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,81 @@
1
1
  {
2
2
  "name": "@alchemy.run/e2b",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "2.0.0-beta.86",
4
+ "description": "E2B sandboxes, templates, snapshots, volumes and secrets for Alchemy.",
5
+ "keywords": [
6
+ "agents",
7
+ "alchemy",
8
+ "e2b",
9
+ "effect",
10
+ "firecracker",
11
+ "infrastructure-as-code",
12
+ "sandbox"
13
+ ],
14
+ "homepage": "https://alchemy.run",
15
+ "bugs": {
16
+ "url": "https://github.com/alchemy-run/alchemy/issues"
17
+ },
18
+ "license": "Apache-2.0",
19
+ "author": "Sam Goodwin <sam@alchemy.run>",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/alchemy-run/alchemy.git",
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.86",
52
+ "@distilled.cloud/core": "1.0.0-rc.19",
53
+ "@distilled.cloud/e2b": "1.0.0-rc.19"
54
+ },
55
+ "devDependencies": {
56
+ "@effect/platform-bun": "^4.1.4",
57
+ "@types/bun": "1.4.3",
58
+ "alchemy": "2.0.0-beta.86",
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.86",
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"
80
+ }
6
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
+ );