@alchemy.run/daytona 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 (274) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +80 -2
  3. package/lib/ApiKey.d.ts +99 -0
  4. package/lib/ApiKey.d.ts.map +1 -0
  5. package/lib/ApiKey.js +152 -0
  6. package/lib/ApiKey.js.map +1 -0
  7. package/lib/AuthProvider.d.ts +55 -0
  8. package/lib/AuthProvider.d.ts.map +1 -0
  9. package/lib/AuthProvider.js +280 -0
  10. package/lib/AuthProvider.js.map +1 -0
  11. package/lib/Bootstrap.d.ts +8 -0
  12. package/lib/Bootstrap.d.ts.map +1 -0
  13. package/lib/Bootstrap.js +28 -0
  14. package/lib/Bootstrap.js.map +1 -0
  15. package/lib/ConnectSandbox.d.ts +72 -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 +5 -0
  20. package/lib/ConnectSandboxHttp.d.ts.map +1 -0
  21. package/lib/ConnectSandboxHttp.js +22 -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 +86 -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 +5 -0
  32. package/lib/CreateSandboxHttp.d.ts.map +1 -0
  33. package/lib/CreateSandboxHttp.js +65 -0
  34. package/lib/CreateSandboxHttp.js.map +1 -0
  35. package/lib/CreateSecret.d.ts +56 -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 +5 -0
  40. package/lib/CreateSecretHttp.d.ts.map +1 -0
  41. package/lib/CreateSecretHttp.js +39 -0
  42. package/lib/CreateSecretHttp.js.map +1 -0
  43. package/lib/CreateSnapshot.d.ts +80 -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 +5 -0
  48. package/lib/CreateSnapshotHttp.d.ts.map +1 -0
  49. package/lib/CreateSnapshotHttp.js +47 -0
  50. package/lib/CreateSnapshotHttp.js.map +1 -0
  51. package/lib/CreateVolume.d.ts +81 -0
  52. package/lib/CreateVolume.d.ts.map +1 -0
  53. package/lib/CreateVolume.js +10 -0
  54. package/lib/CreateVolume.js.map +1 -0
  55. package/lib/CreateVolumeHttp.d.ts +5 -0
  56. package/lib/CreateVolumeHttp.d.ts.map +1 -0
  57. package/lib/CreateVolumeHttp.js +31 -0
  58. package/lib/CreateVolumeHttp.js.map +1 -0
  59. package/lib/Credentials.d.ts +9 -0
  60. package/lib/Credentials.d.ts.map +1 -0
  61. package/lib/Credentials.js +18 -0
  62. package/lib/Credentials.js.map +1 -0
  63. package/lib/DaytonaBindings.d.ts +51 -0
  64. package/lib/DaytonaBindings.d.ts.map +1 -0
  65. package/lib/DaytonaBindings.js +61 -0
  66. package/lib/DaytonaBindings.js.map +1 -0
  67. package/lib/IdentityProvider.d.ts +80 -0
  68. package/lib/IdentityProvider.d.ts.map +1 -0
  69. package/lib/IdentityProvider.js +111 -0
  70. package/lib/IdentityProvider.js.map +1 -0
  71. package/lib/MountVolume.d.ts +86 -0
  72. package/lib/MountVolume.d.ts.map +1 -0
  73. package/lib/MountVolume.js +27 -0
  74. package/lib/MountVolume.js.map +1 -0
  75. package/lib/OAuthClient.d.ts +14 -0
  76. package/lib/OAuthClient.d.ts.map +1 -0
  77. package/lib/OAuthClient.js +23 -0
  78. package/lib/OAuthClient.js.map +1 -0
  79. package/lib/Organization.d.ts +40 -0
  80. package/lib/Organization.d.ts.map +1 -0
  81. package/lib/Organization.js +80 -0
  82. package/lib/Organization.js.map +1 -0
  83. package/lib/OrganizationInvitation.d.ts +70 -0
  84. package/lib/OrganizationInvitation.d.ts.map +1 -0
  85. package/lib/OrganizationInvitation.js +109 -0
  86. package/lib/OrganizationInvitation.js.map +1 -0
  87. package/lib/OrganizationMember.d.ts +86 -0
  88. package/lib/OrganizationMember.d.ts.map +1 -0
  89. package/lib/OrganizationMember.js +109 -0
  90. package/lib/OrganizationMember.js.map +1 -0
  91. package/lib/OrganizationOtelConfig.d.ts +59 -0
  92. package/lib/OrganizationOtelConfig.d.ts.map +1 -0
  93. package/lib/OrganizationOtelConfig.js +87 -0
  94. package/lib/OrganizationOtelConfig.js.map +1 -0
  95. package/lib/OrganizationRole.d.ts +66 -0
  96. package/lib/OrganizationRole.d.ts.map +1 -0
  97. package/lib/OrganizationRole.js +106 -0
  98. package/lib/OrganizationRole.js.map +1 -0
  99. package/lib/OrganizationSettings.d.ts +76 -0
  100. package/lib/OrganizationSettings.d.ts.map +1 -0
  101. package/lib/OrganizationSettings.js +107 -0
  102. package/lib/OrganizationSettings.js.map +1 -0
  103. package/lib/Providers.d.ts +14 -0
  104. package/lib/Providers.d.ts.map +1 -0
  105. package/lib/Providers.js +53 -0
  106. package/lib/Providers.js.map +1 -0
  107. package/lib/ReadAuditLogs.d.ts +30 -0
  108. package/lib/ReadAuditLogs.d.ts.map +1 -0
  109. package/lib/ReadAuditLogs.js +17 -0
  110. package/lib/ReadAuditLogs.js.map +1 -0
  111. package/lib/ReadOrganization.d.ts +39 -0
  112. package/lib/ReadOrganization.d.ts.map +1 -0
  113. package/lib/ReadOrganization.js +39 -0
  114. package/lib/ReadOrganization.js.map +1 -0
  115. package/lib/ReadUsage.d.ts +31 -0
  116. package/lib/ReadUsage.d.ts.map +1 -0
  117. package/lib/ReadUsage.js +17 -0
  118. package/lib/ReadUsage.js.map +1 -0
  119. package/lib/Region.d.ts +78 -0
  120. package/lib/Region.d.ts.map +1 -0
  121. package/lib/Region.js +169 -0
  122. package/lib/Region.js.map +1 -0
  123. package/lib/Registry.d.ts +84 -0
  124. package/lib/Registry.d.ts.map +1 -0
  125. package/lib/Registry.js +97 -0
  126. package/lib/Registry.js.map +1 -0
  127. package/lib/Runner.d.ts +66 -0
  128. package/lib/Runner.d.ts.map +1 -0
  129. package/lib/Runner.js +116 -0
  130. package/lib/Runner.js.map +1 -0
  131. package/lib/Sandbox.d.ts +376 -0
  132. package/lib/Sandbox.d.ts.map +1 -0
  133. package/lib/Sandbox.js +565 -0
  134. package/lib/Sandbox.js.map +1 -0
  135. package/lib/SandboxClient.d.ts +258 -0
  136. package/lib/SandboxClient.d.ts.map +1 -0
  137. package/lib/SandboxClient.js +233 -0
  138. package/lib/SandboxClient.js.map +1 -0
  139. package/lib/Secret.d.ts +93 -0
  140. package/lib/Secret.d.ts.map +1 -0
  141. package/lib/Secret.js +130 -0
  142. package/lib/Secret.js.map +1 -0
  143. package/lib/Snapshot.d.ts +327 -0
  144. package/lib/Snapshot.d.ts.map +1 -0
  145. package/lib/Snapshot.js +447 -0
  146. package/lib/Snapshot.js.map +1 -0
  147. package/lib/Volume.d.ts +99 -0
  148. package/lib/Volume.d.ts.map +1 -0
  149. package/lib/Volume.js +152 -0
  150. package/lib/Volume.js.map +1 -0
  151. package/lib/WarmPool.d.ts +61 -0
  152. package/lib/WarmPool.d.ts.map +1 -0
  153. package/lib/WarmPool.js +81 -0
  154. package/lib/WarmPool.js.map +1 -0
  155. package/lib/Webhooks.d.ts +58 -0
  156. package/lib/Webhooks.d.ts.map +1 -0
  157. package/lib/Webhooks.js +75 -0
  158. package/lib/Webhooks.js.map +1 -0
  159. package/lib/index.d.ts +37 -0
  160. package/lib/index.d.ts.map +1 -0
  161. package/lib/index.js +36 -0
  162. package/lib/index.js.map +1 -0
  163. package/lib/internal/BuildContext.d.ts +16 -0
  164. package/lib/internal/BuildContext.d.ts.map +1 -0
  165. package/lib/internal/BuildContext.js +50 -0
  166. package/lib/internal/BuildContext.js.map +1 -0
  167. package/lib/internal/Declared.d.ts +29 -0
  168. package/lib/internal/Declared.d.ts.map +1 -0
  169. package/lib/internal/Declared.js +31 -0
  170. package/lib/internal/Declared.js.map +1 -0
  171. package/lib/internal/Derived.d.ts +40 -0
  172. package/lib/internal/Derived.d.ts.map +1 -0
  173. package/lib/internal/Derived.js +64 -0
  174. package/lib/internal/Derived.js.map +1 -0
  175. package/lib/internal/Errors.d.ts +4 -0
  176. package/lib/internal/Errors.d.ts.map +1 -0
  177. package/lib/internal/Errors.js +1 -0
  178. package/lib/internal/Errors.js.map +1 -0
  179. package/lib/internal/Labels.d.ts +20 -0
  180. package/lib/internal/Labels.d.ts.map +1 -0
  181. package/lib/internal/Labels.js +22 -0
  182. package/lib/internal/Labels.js.map +1 -0
  183. package/lib/internal/Names.d.ts +18 -0
  184. package/lib/internal/Names.d.ts.map +1 -0
  185. package/lib/internal/Names.js +25 -0
  186. package/lib/internal/Names.js.map +1 -0
  187. package/lib/internal/Organization.d.ts +27 -0
  188. package/lib/internal/Organization.d.ts.map +1 -0
  189. package/lib/internal/Organization.js +32 -0
  190. package/lib/internal/Organization.js.map +1 -0
  191. package/lib/internal/Process.d.ts +14 -0
  192. package/lib/internal/Process.d.ts.map +1 -0
  193. package/lib/internal/Process.js +15 -0
  194. package/lib/internal/Process.js.map +1 -0
  195. package/lib/internal/Program.d.ts +83 -0
  196. package/lib/internal/Program.d.ts.map +1 -0
  197. package/lib/internal/Program.js +169 -0
  198. package/lib/internal/Program.js.map +1 -0
  199. package/lib/internal/Ref.d.ts +14 -0
  200. package/lib/internal/Ref.d.ts.map +1 -0
  201. package/lib/internal/Ref.js +7 -0
  202. package/lib/internal/Ref.js.map +1 -0
  203. package/lib/internal/Scoped.d.ts +31 -0
  204. package/lib/internal/Scoped.d.ts.map +1 -0
  205. package/lib/internal/Scoped.js +48 -0
  206. package/lib/internal/Scoped.js.map +1 -0
  207. package/lib/internal/Tar.d.ts +13 -0
  208. package/lib/internal/Tar.d.ts.map +1 -0
  209. package/lib/internal/Tar.js +62 -0
  210. package/lib/internal/Tar.js.map +1 -0
  211. package/lib/internal/Toolbox.d.ts +11 -0
  212. package/lib/internal/Toolbox.d.ts.map +1 -0
  213. package/lib/internal/Toolbox.js +20 -0
  214. package/lib/internal/Toolbox.js.map +1 -0
  215. package/lib/internal/Wait.d.ts +49 -0
  216. package/lib/internal/Wait.d.ts.map +1 -0
  217. package/lib/internal/Wait.js +57 -0
  218. package/lib/internal/Wait.js.map +1 -0
  219. package/package.json +79 -3
  220. package/src/ApiKey.ts +221 -0
  221. package/src/AuthProvider.ts +406 -0
  222. package/src/Bootstrap.ts +55 -0
  223. package/src/ConnectSandbox.ts +76 -0
  224. package/src/ConnectSandboxHttp.ts +26 -0
  225. package/src/Contributions.ts +9 -0
  226. package/src/CreateSandbox.ts +107 -0
  227. package/src/CreateSandboxHttp.ts +97 -0
  228. package/src/CreateSecret.ts +73 -0
  229. package/src/CreateSecretHttp.ts +58 -0
  230. package/src/CreateSnapshot.ts +133 -0
  231. package/src/CreateSnapshotHttp.ts +77 -0
  232. package/src/CreateVolume.ts +104 -0
  233. package/src/CreateVolumeHttp.ts +50 -0
  234. package/src/Credentials.ts +37 -0
  235. package/src/DaytonaBindings.ts +111 -0
  236. package/src/IdentityProvider.ts +181 -0
  237. package/src/MountVolume.ts +122 -0
  238. package/src/OAuthClient.ts +27 -0
  239. package/src/Organization.ts +121 -0
  240. package/src/OrganizationInvitation.ts +174 -0
  241. package/src/OrganizationMember.ts +174 -0
  242. package/src/OrganizationOtelConfig.ts +138 -0
  243. package/src/OrganizationRole.ts +167 -0
  244. package/src/OrganizationSettings.ts +187 -0
  245. package/src/Providers.ts +93 -0
  246. package/src/ReadAuditLogs.ts +50 -0
  247. package/src/ReadOrganization.ts +83 -0
  248. package/src/ReadUsage.ts +51 -0
  249. package/src/Region.ts +226 -0
  250. package/src/Registry.ts +164 -0
  251. package/src/Runner.ts +166 -0
  252. package/src/Sandbox.ts +927 -0
  253. package/src/SandboxClient.ts +625 -0
  254. package/src/Secret.ts +203 -0
  255. package/src/Snapshot.ts +685 -0
  256. package/src/Volume.ts +229 -0
  257. package/src/WarmPool.ts +128 -0
  258. package/src/Webhooks.ts +121 -0
  259. package/src/globals.d.ts +2 -0
  260. package/src/index.ts +46 -0
  261. package/src/internal/BuildContext.ts +62 -0
  262. package/src/internal/Declared.ts +80 -0
  263. package/src/internal/Derived.ts +97 -0
  264. package/src/internal/Errors.ts +4 -0
  265. package/src/internal/Labels.ts +39 -0
  266. package/src/internal/Names.ts +37 -0
  267. package/src/internal/Organization.ts +40 -0
  268. package/src/internal/Process.ts +25 -0
  269. package/src/internal/Program.ts +239 -0
  270. package/src/internal/Ref.ts +15 -0
  271. package/src/internal/Scoped.ts +102 -0
  272. package/src/internal/Tar.ts +72 -0
  273. package/src/internal/Toolbox.ts +27 -0
  274. package/src/internal/Wait.ts +105 -0
package/lib/Sandbox.js ADDED
@@ -0,0 +1,565 @@
1
+ import * as sandboxes from "@distilled.cloud/daytona/sandbox";
2
+ import { Unowned } from "alchemy/AdoptPolicy";
3
+ import { deepEqual, isResolved } from "alchemy/Diff";
4
+ import { Platform } from "alchemy/Platform";
5
+ import * as Provider from "alchemy/Provider";
6
+ import { createHostRuntimeContext, } from "alchemy/Runtime/Process";
7
+ import { Stack } from "alchemy/Stack";
8
+ import * as Effect from "effect/Effect";
9
+ import * as Stream from "effect/Stream";
10
+ import { capabilitiesOf, checkSupport, ensureDerivedSnapshot, installLinesOf, isMountCapability, } from "./internal/Derived.js";
11
+ import { ALCHEMY_LABEL_PREFIX, createInternalLabels, definedLabels, hasAlchemyLabels, userLabels, } from "./internal/Labels.js";
12
+ import { resolveName } from "./internal/Names.js";
13
+ import { bundleProgram, DEFAULT_PORT, deployProgram, isProgramRunning, } from "./internal/Program.js";
14
+ import { resolved } from "./internal/Ref.js";
15
+ import { toMinutes, waitForState, waitUntilGone } from "./internal/Wait.js";
16
+ import { deleteSnapshotByName } from "./Snapshot.js";
17
+ /**
18
+ * A long-lived Daytona sandbox: an isolated machine with its own
19
+ * filesystem, processes and network, for a dev box, a preview environment
20
+ * or a persistent agent workspace. Its disk survives stops; Daytona stops
21
+ * it when idle and archives it later, and deploy starts it again.
22
+ *
23
+ * The class form runs an Effect program in the sandbox: give it `main`
24
+ * and an implementation, and Alchemy bundles the program, uploads it and
25
+ * runs it with Node, served on the sandbox's preview URL (`url`). A code
26
+ * change uploads the new bundle and restarts the process; the sandbox and
27
+ * its URL stay the same. The process lives as long as the sandbox runs,
28
+ * so a sandbox with `main` never auto-stops unless `autoStopInterval` says
29
+ * so; if it stopped anyway, the next deploy starts it and the program.
30
+ *
31
+ * For sandboxes created per request or per task, use
32
+ * {@link CreateSandbox} at runtime instead; for one declared here, use
33
+ * {@link ConnectSandbox} to run commands in it from a Worker.
34
+ * @see https://www.daytona.io/docs/en/sandboxes/
35
+ *
36
+ * ### Creating a Sandbox
37
+ * **Example:** A dev box from a snapshot
38
+ * ```typescript
39
+ * export const DevBox = Daytona.Sandbox("DevBox", {
40
+ * snapshot: Base,
41
+ * autoStopInterval: "30 minutes",
42
+ * });
43
+ * ```
44
+ *
45
+ * ### Restricting the Network
46
+ * **Example:** Only GitHub and npm are reachable
47
+ * ```typescript
48
+ * export const Locked = Daytona.Sandbox("Locked", {
49
+ * snapshot: Base,
50
+ * domainAllowList: ["github.com", "registry.npmjs.org"],
51
+ * });
52
+ * ```
53
+ *
54
+ * ### Volumes and Secrets
55
+ * **Example:** A shared cache volume and an npm token only sent to npm
56
+ * ```typescript
57
+ * export const Builder = Daytona.Sandbox("Builder", {
58
+ * snapshot: Base,
59
+ * mounts: [{ volume: Cache, path: "/cache" }],
60
+ * secrets: { NPM_TOKEN: NpmToken },
61
+ * });
62
+ * ```
63
+ *
64
+ * ### Running a Program
65
+ * **Example:** An HTTP server with a mounted volume
66
+ * ```typescript
67
+ * export default class Agent extends Daytona.Sandbox<Agent>()(
68
+ * "Agent",
69
+ * { snapshot: Base, main: import.meta.url, public: true },
70
+ * Effect.gen(function* () {
71
+ * const data = yield* Daytona.MountVolume(Data, { path: "/data" });
72
+ * const fs = yield* FileSystem.FileSystem;
73
+ * return {
74
+ * fetch: Effect.gen(function* () {
75
+ * return yield* HttpServerResponse.json(yield* fs.readDirectory(data.path));
76
+ * }),
77
+ * };
78
+ * }).pipe(Effect.provide(Daytona.MountVolumeLive)),
79
+ * ) {}
80
+ * ```
81
+ *
82
+ * A mount binding that needs a client in the image (an `alchemy/Mount`
83
+ * capability) makes the sandbox boot from a derived snapshot: its snapshot
84
+ * plus the client's install lines, built on Daytona, named from a hash and
85
+ * deleted with the sandbox. Sandboxes provide FUSE; a client that needs
86
+ * NFS fails with `MountUnsupported`.
87
+ *
88
+ * The program reaches the internet as its sandbox does. Below Daytona's
89
+ * Tier 3, sandboxes reach only an allowlist of essential services
90
+ * (package registries, GitHub, AI APIs, Daytona's API), so bindings that
91
+ * manage sandboxes work but toolbox calls are refused.
92
+ *
93
+ * ### GPUs
94
+ * A GPU sandbox boots from a GPU snapshot, such as Daytona's `daytona-gpu`
95
+ * (one H100) in its `earth` region, and must be ephemeral. The
96
+ * organization needs GPU credits in its wallet.
97
+ *
98
+ * **Example:** An ephemeral H100 sandbox on spot capacity
99
+ * ```typescript
100
+ * export const Trainer = Daytona.Sandbox("Trainer", {
101
+ * snapshot: { name: "daytona-gpu" },
102
+ * target: "earth",
103
+ * autoDeleteInterval: 0,
104
+ * spot: true,
105
+ * });
106
+ * ```
107
+ *
108
+ * ### Limiting Its Lifetime
109
+ * **Example:** Destroyed two hours after it is created
110
+ * ```typescript
111
+ * export const Scratch = Daytona.Sandbox("Scratch", { ttl: "2 hours" });
112
+ * ```
113
+ *
114
+ * ### Sharing a Runner
115
+ * **Example:** A database and an app on one local network
116
+ * ```typescript
117
+ * export const Db = Daytona.Sandbox("Db", { autoDeleteInterval: 0 });
118
+ * export const App = Daytona.Sandbox("App", {
119
+ * autoDeleteInterval: 0,
120
+ * linkedSandbox: Db,
121
+ * });
122
+ * ```
123
+ *
124
+ * ### Looking up an existing sandbox
125
+ * `Sandbox.lookup` references a sandbox Alchemy doesn't manage (created in
126
+ * the Daytona dashboard or by another stack). It is read during plan/deploy,
127
+ * never created, updated or deleted.
128
+ * `url` and `program` are `undefined`: they come from the deploy that started
129
+ * the sandbox's program.
130
+ *
131
+ * **Example:** Reference an existing sandbox
132
+ * ```typescript
133
+ * const box = Daytona.Sandbox.lookup({ name: "research" });
134
+ * ```
135
+ *
136
+ * @resource
137
+ * @product Sandbox
138
+ */
139
+ export const Sandbox = Platform("Daytona.Sandbox", {
140
+ createRuntimeContext: createHostRuntimeContext("Daytona.Sandbox"),
141
+ // A declaration passed as a prop (`snapshot: Base`) is an Effect until
142
+ // yielded. Yield it here so it is registered and the prop resolves to
143
+ // its attributes, as with `yield* Snapshot(...)` inside Effect.gen.
144
+ transformProps: (_id, props) => Effect.gen(function* () {
145
+ if (globalThis.__ALCHEMY_RUNTIME__)
146
+ return props;
147
+ const ref = (value) => Effect.isEffect(value)
148
+ ? value
149
+ : Effect.succeed(value);
150
+ return {
151
+ ...props,
152
+ snapshot: props.snapshot === undefined ? undefined : yield* ref(props.snapshot),
153
+ linkedSandbox: props.linkedSandbox === undefined ? undefined : yield* ref(props.linkedSandbox),
154
+ secrets: props.secrets === undefined
155
+ ? undefined
156
+ : Object.fromEntries(yield* Effect.forEach(Object.entries(props.secrets), ([key, value]) => Effect.map(ref(value), (resolved) => [key, resolved]))),
157
+ mounts: props.mounts === undefined
158
+ ? undefined
159
+ : yield* Effect.forEach(props.mounts, (mount) => Effect.map(ref(mount.volume), (volume) => ({ ...mount, volume }))),
160
+ };
161
+ }),
162
+ });
163
+ const resolveRef = (ref) => Effect.succeed(resolved(ref));
164
+ const csv = (list) => (list === undefined ? undefined : list.join(","));
165
+ const fromCsv = (value) => value === undefined || value === ""
166
+ ? []
167
+ : value
168
+ .split(",")
169
+ .map((s) => s.trim())
170
+ .sort();
171
+ export const toSandboxAttributes = (s) => ({
172
+ sandboxId: s.id,
173
+ name: s.name,
174
+ organizationId: s.organizationId,
175
+ snapshot: s.snapshot,
176
+ state: s.state,
177
+ target: s.target,
178
+ cpu: s.cpu,
179
+ memory: s.memory,
180
+ disk: s.disk,
181
+ gpu: s.gpu,
182
+ sandboxClass: s.sandboxClass,
183
+ autoDestroyAt: s.autoDestroyAt,
184
+ linkedSandboxId: s.linkedSandboxId,
185
+ labels: userLabels(s.labels),
186
+ public: s.public,
187
+ toolboxProxyUrl: s.toolboxProxyUrl,
188
+ url: undefined,
189
+ program: undefined,
190
+ derivedSnapshot: undefined,
191
+ });
192
+ /**
193
+ * The snapshot the sandbox was declared with. A sandbox booted from a
194
+ * derived snapshot reports that one, so the declared base is read from
195
+ * the last deploy's props.
196
+ */
197
+ const bootedFrom = Effect.fn(function* (olds, output) {
198
+ if (output.derivedSnapshot === undefined)
199
+ return output.snapshot;
200
+ return olds?.snapshot ? (yield* resolveRef(olds.snapshot)).name : undefined;
201
+ });
202
+ /** The bindings still attached (a removed binding arrives as a `delete`). */
203
+ const activeBindings = (bindings) => bindings.filter((binding) => binding.action !== "delete");
204
+ /**
205
+ * Every volume the sandbox mounts: its `mounts` and what bindings added, in
206
+ * a stable order. At plan, a volume created in the same deploy has no id
207
+ * yet; it compares as unresolved, which differs from any mounted volume.
208
+ */
209
+ const allMounts = Effect.fn(function* (props, bindings) {
210
+ const declared = yield* Effect.forEach(props?.mounts ?? [], (m) => Effect.map(resolveRef(m.volume), (v) => ({
211
+ volumeId: typeof v?.volumeId === "string" ? v.volumeId : "(unresolved)",
212
+ path: m.path,
213
+ subpath: m.subpath,
214
+ })));
215
+ const bound = activeBindings(bindings)
216
+ .flatMap((b) => (b.data?.mounts ?? []).filter((m) => !isMountCapability(m)))
217
+ .map((m) => m)
218
+ .map((m) => ({ ...m, volumeId: typeof m.volumeId === "string" ? m.volumeId : "(unresolved)" }));
219
+ const seen = new Set();
220
+ return [...declared, ...bound]
221
+ .filter((m) => {
222
+ const key = `${m.volumeId}:${m.path}:${m.subpath ?? ""}`;
223
+ if (seen.has(key))
224
+ return false;
225
+ seen.add(key);
226
+ return true;
227
+ })
228
+ .sort((a, b) => a.path.localeCompare(b.path));
229
+ });
230
+ /** The program's environment: bindings' env, alchemy's, the port, then the props'. */
231
+ const bindingEnv = (bindings) => activeBindings(bindings).reduce((acc, binding) => ({ ...acc, ...binding.data?.env }), {});
232
+ const isGone = (s) => s.state === "destroyed" || s.state === "destroying";
233
+ export const getSandbox = (idOrName) => sandboxes.getSandbox({ sandboxIdOrName: idOrName }).pipe(Effect.map((s) => (isGone(s) ? undefined : s)), Effect.catchTag("SandboxNotFound", () => Effect.undefined));
234
+ const TRANSITIONS = {
235
+ started: ["started"],
236
+ stopped: ["stopped"],
237
+ // Archiving moves the disk to object storage in the background, and can
238
+ // take many minutes; the sandbox is on its way once Daytona accepts it.
239
+ archived: ["archived", "archiving"],
240
+ };
241
+ export const waitForSandbox = (idOrName, want = "started") => waitForState({
242
+ kind: "sandbox",
243
+ id: idOrName,
244
+ observe: sandboxes.getSandbox({ sandboxIdOrName: idOrName }),
245
+ want: TRANSITIONS[want] ?? [want],
246
+ fail: ["error", "build_failed", "destroyed"],
247
+ reason: (s) => s.errorReason,
248
+ budget: "10 minutes",
249
+ });
250
+ /** Move a sandbox to the run state it should be in. */
251
+ export const syncRunState = Effect.fn(function* (current, want) {
252
+ const id = current.id;
253
+ let state = current.state;
254
+ if (want === "archived" && state === "archiving")
255
+ return current;
256
+ // Let an in-flight transition land first.
257
+ if (state && !["started", "stopped", "archived", "paused", "error"].includes(state)) {
258
+ state = (yield* waitForState({
259
+ kind: "sandbox",
260
+ id,
261
+ observe: sandboxes.getSandbox({ sandboxIdOrName: id }),
262
+ want: ["started", "stopped", "archived", "paused", "error"],
263
+ budget: "10 minutes",
264
+ })).state;
265
+ }
266
+ if (state === "error") {
267
+ if (current.recoverable) {
268
+ yield* sandboxes.recoverSandbox({ sandboxIdOrName: id });
269
+ state = (yield* waitForSandbox(id, "started")).state;
270
+ }
271
+ else {
272
+ return yield* waitForSandbox(id, "started");
273
+ }
274
+ }
275
+ if (state === want)
276
+ return yield* sandboxes.getSandbox({ sandboxIdOrName: id });
277
+ if (want === "started") {
278
+ yield* sandboxes.startSandbox({ sandboxIdOrName: id });
279
+ return yield* waitForSandbox(id, "started");
280
+ }
281
+ if (want === "stopped") {
282
+ if (state === "archived") {
283
+ // An archived sandbox only leaves the archive by starting.
284
+ yield* sandboxes.startSandbox({ sandboxIdOrName: id });
285
+ yield* waitForSandbox(id, "started");
286
+ }
287
+ yield* sandboxes.stopSandbox({ sandboxIdOrName: id });
288
+ return yield* waitForSandbox(id, "stopped");
289
+ }
290
+ if (state === "started" || state === "paused") {
291
+ yield* sandboxes.stopSandbox({ sandboxIdOrName: id });
292
+ yield* waitForSandbox(id, "stopped");
293
+ }
294
+ yield* sandboxes.archiveSandbox({ sandboxIdOrName: id });
295
+ return yield* waitForSandbox(id, "archived");
296
+ });
297
+ export const deleteSandboxById = Effect.fn(function* (idOrName) {
298
+ yield* sandboxes
299
+ .deleteSandbox({ sandboxIdOrName: idOrName })
300
+ .pipe(Effect.catchTag("SandboxNotFound", () => Effect.void));
301
+ yield* waitUntilGone("sandbox", idOrName, getSandbox(idOrName).pipe(Effect.map((s) => s !== undefined)), "5 minutes");
302
+ });
303
+ const resolveCreate = Effect.fn(function* (name, news, labels, mounts) {
304
+ const snapshot = news.snapshot ? (yield* resolveRef(news.snapshot)).name : undefined;
305
+ const volumes = mounts.length > 0
306
+ ? mounts.map((m) => ({ volumeId: m.volumeId, mountPath: m.path, subpath: m.subpath }))
307
+ : undefined;
308
+ const secrets = news.secrets
309
+ ? yield* Effect.forEach(Object.entries(news.secrets), ([env, ref]) => Effect.map(resolveRef(ref), (s) => ({ [env]: s.name })))
310
+ : undefined;
311
+ const linkedSandbox = news.linkedSandbox
312
+ ? (yield* resolveRef(news.linkedSandbox)).sandboxId
313
+ : undefined;
314
+ return {
315
+ name,
316
+ snapshot,
317
+ linkedSandbox,
318
+ otelEndpointOverride: news.otelEndpointOverride,
319
+ ttlMinutes: toMinutes(news.ttl),
320
+ queueTimeout: toMinutes(news.queueTimeout),
321
+ user: news.user,
322
+ // A program's env is the process's, written at deploy, not the sandbox's.
323
+ env: news.main === undefined ? news.env : undefined,
324
+ labels,
325
+ public: news.public,
326
+ networkBlockAll: news.networkBlockAll,
327
+ networkAllowList: csv(news.networkAllowList),
328
+ domainAllowList: csv(news.domainAllowList),
329
+ outboundProxyUrl: news.outboundProxyUrl,
330
+ target: news.target,
331
+ spot: news.spot,
332
+ kvm: news.kvm,
333
+ volumes,
334
+ secrets,
335
+ // A program serves for as long as the sandbox runs: don't stop it when idle.
336
+ autoStopInterval: toMinutes(news.autoStopInterval ?? (news.main !== undefined ? 0 : undefined)),
337
+ autoPauseInterval: toMinutes(news.autoPauseInterval),
338
+ autoArchiveInterval: toMinutes(news.autoArchiveInterval),
339
+ autoDeleteInterval: toMinutes(news.autoDeleteInterval),
340
+ };
341
+ });
342
+ export const SandboxProvider = () => Provider.effect(Sandbox, Effect.gen(function* () {
343
+ const stack = yield* Stack;
344
+ // The bundled program's bootstrap reads these to rebuild the Stack at runtime.
345
+ const alchemyEnv = {
346
+ ALCHEMY_STACK_NAME: stack.name,
347
+ ALCHEMY_STAGE: stack.stage,
348
+ ALCHEMY_PHASE: "runtime",
349
+ HOST: "0.0.0.0",
350
+ };
351
+ return {
352
+ stables: ["sandboxId", "organizationId", "toolboxProxyUrl"],
353
+ list: Effect.fn(function* () {
354
+ const all = yield* sandboxes.listSandboxes.items({}).pipe(Stream.runCollect);
355
+ return Array.from(all)
356
+ .filter((s) => !isGone(s) &&
357
+ Object.keys(s.labels ?? {}).some((k) => k.startsWith(ALCHEMY_LABEL_PREFIX)))
358
+ .map(toSandboxAttributes);
359
+ }),
360
+ diff: Effect.fn(function* ({ id, olds, news, output, oldBindings, newBindings }) {
361
+ if (output === undefined)
362
+ return undefined;
363
+ // A program's props are partly unresolved at plan (its bindings' env
364
+ // holds Outputs), so each field is compared once it is known.
365
+ const props = news;
366
+ const known = isResolved;
367
+ const name = known(props.name)
368
+ ? yield* resolveName(id, props.name, props.name === undefined ? output.name : undefined)
369
+ : output.name;
370
+ const snapshot = props.snapshot && known(props.snapshot)
371
+ ? (yield* resolveRef(props.snapshot)).name
372
+ : undefined;
373
+ const linked = props.linkedSandbox && known(props.linkedSandbox)
374
+ ? (yield* resolveRef(props.linkedSandbox)).sandboxId
375
+ : undefined;
376
+ const replace = name !== output.name ||
377
+ (snapshot !== undefined && snapshot !== (yield* bootedFrom(olds, output))) ||
378
+ (known(props.user) && props.user !== olds?.user) ||
379
+ // A sandbox env is set at create; a program's restarts the program.
380
+ (props.main === undefined) !== (olds?.main === undefined) ||
381
+ (props.main === undefined &&
382
+ known(props.env) &&
383
+ !deepEqual(props.env ?? {}, olds?.env ?? {})) ||
384
+ (known(props.outboundProxyUrl) && props.outboundProxyUrl !== olds?.outboundProxyUrl) ||
385
+ (known(props.target) && props.target !== undefined && props.target !== output.target) ||
386
+ props.spot !== olds?.spot ||
387
+ props.kvm !== olds?.kvm ||
388
+ (known(props.otelEndpointOverride) &&
389
+ props.otelEndpointOverride !== olds?.otelEndpointOverride) ||
390
+ (linked !== undefined && linked !== output.linkedSandboxId) ||
391
+ !deepEqual(yield* allMounts(props, Array.isArray(newBindings) ? newBindings : []), yield* allMounts(olds, oldBindings ?? []));
392
+ // A change to the clients bindings need rebuilds the derived snapshot.
393
+ // Bindings may hold Outputs at plan; capabilities are plain data.
394
+ const caps = capabilitiesOf((Array.isArray(newBindings) ? newBindings : []));
395
+ yield* checkSupport(caps);
396
+ const installChanged = !deepEqual(installLinesOf(caps), installLinesOf(capabilitiesOf(oldBindings ?? [])));
397
+ if (replace || installChanged) {
398
+ return { action: "replace", deleteFirst: name === output.name };
399
+ }
400
+ // The bundle depends only on `main`, `handler` and `build`, which are plain.
401
+ if (typeof props.main === "string") {
402
+ // A code change, or a process that ended (the sandbox restarted),
403
+ // redeploys the program in place.
404
+ const { hash } = yield* bundleProgram({ ...props, main: props.main });
405
+ if (output.program === undefined || hash !== output.program.codeHash) {
406
+ return { action: "update" };
407
+ }
408
+ if (!(yield* isProgramRunning(output.sandboxId, output.program))) {
409
+ return { action: "update" };
410
+ }
411
+ }
412
+ }),
413
+ lookup: Effect.fn(function* ({ name }) {
414
+ const found = yield* getSandbox(name);
415
+ return found === undefined
416
+ ? undefined
417
+ : {
418
+ ...toSandboxAttributes(found),
419
+ url: undefined,
420
+ program: undefined,
421
+ derivedSnapshot: undefined,
422
+ };
423
+ }),
424
+ read: Effect.fn(function* ({ id, olds, output }) {
425
+ const found = yield* getSandbox(output?.sandboxId ?? (yield* resolveName(id, olds?.name, output?.name)));
426
+ if (found === undefined)
427
+ return undefined;
428
+ // The program isn't visible on the sandbox; keep what the last deploy recorded.
429
+ const attrs = {
430
+ ...toSandboxAttributes(found),
431
+ url: output?.url,
432
+ program: output?.program,
433
+ derivedSnapshot: output?.derivedSnapshot,
434
+ };
435
+ return (yield* hasAlchemyLabels(id, found.labels)) ? attrs : Unowned(attrs);
436
+ }),
437
+ reconcile: Effect.fn(function* ({ id, news, olds, output, bindings, session }) {
438
+ const name = yield* resolveName(id, news.name, output?.name);
439
+ const labels = { ...news.labels, ...(yield* createInternalLabels(id)) };
440
+ const mounts = yield* allMounts(news, bindings);
441
+ const base = yield* resolveCreate(name, news, labels, mounts);
442
+ // Clients bindings need are installed into a snapshot derived from the base.
443
+ const caps = capabilitiesOf(bindings);
444
+ yield* checkSupport(caps);
445
+ const derivedSnapshot = caps.length > 0
446
+ ? yield* ensureDerivedSnapshot({
447
+ sandboxName: name,
448
+ snapshot: base.snapshot,
449
+ caps,
450
+ note: session.note,
451
+ })
452
+ : undefined;
453
+ const request = derivedSnapshot ? { ...base, snapshot: derivedSnapshot } : base;
454
+ // Observe
455
+ let current = yield* getSandbox(output?.sandboxId ?? name);
456
+ const created = current === undefined;
457
+ // Ensure
458
+ if (current === undefined) {
459
+ yield* session.note(`Creating sandbox ${name}...`);
460
+ current = yield* sandboxes
461
+ .createSandbox(request)
462
+ .pipe(Effect.catchTag("SandboxAlreadyExists", () => sandboxes.getSandbox({ sandboxIdOrName: name })));
463
+ current = yield* waitForSandbox(current.id, "started");
464
+ }
465
+ const sandboxId = current.id;
466
+ // Sync labels against the observed set.
467
+ if (!deepEqual(definedLabels(current.labels), labels)) {
468
+ yield* sandboxes.replaceLabels({ sandboxIdOrName: sandboxId, labels });
469
+ }
470
+ // Sync network.
471
+ const network = {
472
+ networkBlockAll: news.networkBlockAll ?? false,
473
+ networkAllowList: fromCsv(request.networkAllowList),
474
+ domainAllowList: fromCsv(request.domainAllowList),
475
+ };
476
+ if (network.networkBlockAll !== current.networkBlockAll ||
477
+ !deepEqual(network.networkAllowList, fromCsv(current.networkAllowList)) ||
478
+ !deepEqual(network.domainAllowList, fromCsv(current.domainAllowList))) {
479
+ yield* sandboxes.updateNetworkSettings({
480
+ sandboxIdOrName: sandboxId,
481
+ networkBlockAll: network.networkBlockAll,
482
+ networkAllowList: network.networkAllowList.join(","),
483
+ domainAllowList: network.domainAllowList.join(","),
484
+ });
485
+ }
486
+ // Sync public previews.
487
+ if ((news.public ?? false) !== current.public) {
488
+ yield* sandboxes.updatePublicStatus({
489
+ sandboxIdOrName: sandboxId,
490
+ isPublic: news.public ?? false,
491
+ });
492
+ }
493
+ // Sync lifecycle intervals that were declared.
494
+ const intervals = [
495
+ [request.autoStopInterval, current.autoStopInterval, sandboxes.setAutostopInterval],
496
+ [request.autoPauseInterval, current.autoPauseInterval, sandboxes.setAutoPauseInterval],
497
+ [
498
+ request.autoArchiveInterval,
499
+ current.autoArchiveInterval,
500
+ sandboxes.setAutoArchiveInterval,
501
+ ],
502
+ [
503
+ request.autoDeleteInterval,
504
+ current.autoDeleteInterval,
505
+ sandboxes.setAutoDeleteInterval,
506
+ ],
507
+ ];
508
+ for (const [want, have, set] of intervals) {
509
+ if (want !== undefined && want !== have) {
510
+ yield* set({ sandboxIdOrName: sandboxId, interval: want });
511
+ }
512
+ }
513
+ // Sync the TTL. Daytona reports only when it fires, and setting it
514
+ // restarts the clock, so it's written when the declared TTL changes
515
+ // (or on adoption).
516
+ if (!created &&
517
+ request.ttlMinutes !== undefined &&
518
+ (olds === undefined || request.ttlMinutes !== toMinutes(olds.ttl))) {
519
+ yield* sandboxes.setTtl({ sandboxIdOrName: sandboxId, ttlMinutes: request.ttlMinutes });
520
+ }
521
+ else if (!created && request.ttlMinutes === undefined && olds?.ttl !== undefined) {
522
+ yield* sandboxes.setTtl({ sandboxIdOrName: sandboxId, ttlMinutes: 0 });
523
+ }
524
+ // Sync secrets. Daytona doesn't report a sandbox's mounted secrets,
525
+ // so the declared set is written whenever it differs from the last
526
+ // deploy (or on adoption, when there is no last deploy).
527
+ if (request.secrets !== undefined || olds?.secrets !== undefined) {
528
+ const previous = olds?.secrets
529
+ ? yield* resolveCreate(name, olds, labels, mounts)
530
+ : undefined;
531
+ if (olds === undefined || !deepEqual(previous?.secrets ?? [], request.secrets ?? [])) {
532
+ yield* sandboxes.updateSandboxSecrets({
533
+ sandboxIdOrName: sandboxId,
534
+ secrets: request.secrets ?? [],
535
+ });
536
+ }
537
+ }
538
+ // Sync run state last, from a fresh observation.
539
+ const final = yield* syncRunState(yield* sandboxes.getSandbox({ sandboxIdOrName: sandboxId }), news.state ?? "started");
540
+ const attrs = { ...toSandboxAttributes(final), derivedSnapshot };
541
+ // Deploy the program into the running sandbox.
542
+ if (news.main === undefined || final.state !== "started")
543
+ return attrs;
544
+ const port = news.port ?? DEFAULT_PORT;
545
+ const program = yield* deployProgram({
546
+ id,
547
+ sandboxId,
548
+ toolboxProxyUrl: final.toolboxProxyUrl,
549
+ source: { ...news, main: news.main },
550
+ port,
551
+ env: { ...bindingEnv(bindings), ...alchemyEnv, PORT: String(port), ...news.env },
552
+ // A replaced sandbox runs nothing yet.
553
+ previous: output?.sandboxId === sandboxId ? output.program : undefined,
554
+ note: session.note,
555
+ });
556
+ return { ...attrs, url: program.url, program: program.state };
557
+ }),
558
+ delete: Effect.fn(function* ({ output }) {
559
+ yield* deleteSandboxById(output.sandboxId);
560
+ if (output.derivedSnapshot)
561
+ yield* deleteSnapshotByName(output.derivedSnapshot);
562
+ }),
563
+ };
564
+ }));
565
+ //# sourceMappingURL=Sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sandbox.js","sources":["../src/Sandbox.ts"],"names":[],"mappings":"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"}