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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +76 -4
  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 +64 -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
@@ -0,0 +1,447 @@
1
+ import { createHash } from "node:crypto";
2
+ import * as BuildPlan from "@alchemy.run/docker/BuildPlan";
3
+ import * as DockerfileParser from "@alchemy.run/docker/DockerfileParser";
4
+ import { computeStaticSourceHash, makeContainerImageSource, } from "@alchemy.run/docker/ImageSource";
5
+ import * as dockerRegistry from "@distilled.cloud/daytona/docker_registry";
6
+ import * as sandboxes from "@distilled.cloud/daytona/sandbox";
7
+ import * as snapshots from "@distilled.cloud/daytona/snapshots";
8
+ import { Unowned } from "alchemy/AdoptPolicy";
9
+ import { isResolved } from "alchemy/Diff";
10
+ import * as Provider from "alchemy/Provider";
11
+ import { Resource } from "alchemy/Resource";
12
+ import * as Data from "effect/Data";
13
+ import * as Effect from "effect/Effect";
14
+ import * as Stream from "effect/Stream";
15
+ import { uploadBuildContext } from "./internal/BuildContext.js";
16
+ import { declarable } from "./internal/Declared.js";
17
+ import { createInternalLabels } from "./internal/Labels.js";
18
+ import { isOwnedName, resolveName } from "./internal/Names.js";
19
+ import { runCommand } from "./internal/Process.js";
20
+ import { resolved } from "./internal/Ref.js";
21
+ import { waitForState, waitUntilGone } from "./internal/Wait.js";
22
+ /**
23
+ * A Daytona snapshot: the image sandboxes boot from, with its default
24
+ * size. Pull one from a registry, build one from a Dockerfile on
25
+ * Daytona's builders, or capture one from a sandbox after running setup
26
+ * commands in it (a warm base to fork from).
27
+ *
28
+ * Snapshots are immutable: changing what one is built from replaces it.
29
+ * Daytona deactivates a snapshot after two weeks without use; deploy
30
+ * reactivates it.
31
+ * @see https://www.daytona.io/docs/en/snapshots/
32
+ *
33
+ * ### Pulling an Image
34
+ * **Example:** A public image with a size
35
+ * ```typescript
36
+ * export const Node = Daytona.Snapshot("Node", {
37
+ * image: "node:22-bookworm",
38
+ * cpu: 2,
39
+ * memory: 4,
40
+ * disk: 10,
41
+ * });
42
+ * ```
43
+ *
44
+ * ### Building from a Dockerfile
45
+ * **Example:** An inline Dockerfile built by Daytona
46
+ * ```typescript
47
+ * export const Base = Daytona.Snapshot("Base", {
48
+ * dockerfile: Dockerfile.inline`
49
+ * FROM node:22-bookworm
50
+ * RUN apt-get update && apt-get install -y git ripgrep
51
+ * `,
52
+ * cpu: 2,
53
+ * memory: 4,
54
+ * });
55
+ * ```
56
+ *
57
+ * ### Building a Directory
58
+ * **Example:** A Dockerfile and the files it copies
59
+ * ```typescript
60
+ * export const App = Daytona.Snapshot("App", {
61
+ * context: "./sandbox",
62
+ * build: { args: { NODE_ENV: "production" } },
63
+ * });
64
+ * ```
65
+ *
66
+ * ### Building with Local Docker
67
+ * **Example:** A build that reads a private npm token
68
+ * ```typescript
69
+ * export const App = Daytona.Snapshot("App", {
70
+ * context: "./sandbox",
71
+ * build: {
72
+ * remote: false,
73
+ * secrets: { npmrc: Redacted.make(process.env.NPM_TOKEN!) },
74
+ * },
75
+ * });
76
+ * ```
77
+ *
78
+ * ### A Warm Base to Fork From
79
+ * **Example:** Clone and install once, then start every sandbox from it
80
+ * ```typescript
81
+ * export const Warm = Daytona.Snapshot("Warm", {
82
+ * from: Base,
83
+ * run: [
84
+ * "git clone https://github.com/alchemy-run/alchemy /home/daytona/alchemy",
85
+ * "cd /home/daytona/alchemy && pnpm install",
86
+ * ],
87
+ * });
88
+ * ```
89
+ *
90
+ * ### Looking up an existing snapshot
91
+ * `Snapshot.lookup` references a snapshot Alchemy doesn't manage (created in
92
+ * the Daytona dashboard or by another stack). It is read during plan/deploy,
93
+ * never created, updated or deleted.
94
+ * `buildHash` is empty: the image wasn't built by this stack.
95
+ *
96
+ * **Example:** Start a sandbox from an existing snapshot
97
+ * ```typescript
98
+ * const base = Daytona.Snapshot.lookup({ name: "python-ml" });
99
+ * ```
100
+ *
101
+ * @resource
102
+ * @product Snapshot
103
+ */
104
+ export const Snapshot = declarable()(Resource("Daytona.Snapshot"));
105
+ /**
106
+ * What Daytona's builders can build: any Dockerfile, for amd64. Daytona's
107
+ * build request has no field for build arguments, so the plan bakes them
108
+ * into `ARG` defaults, nor for BuildKit secrets, so the plan rejects them.
109
+ */
110
+ export const capabilities = {
111
+ target: "Daytona.Snapshot",
112
+ buildArgs: false,
113
+ secrets: false,
114
+ platforms: ["linux/amd64"],
115
+ };
116
+ /** The snapshot props name more than one of `image`, `dockerfile` and `from`, or none. */
117
+ export class SnapshotSourceInvalid extends Data.TaggedError("Daytona.SnapshotSourceInvalid") {
118
+ }
119
+ /** A runtime build's Dockerfile copies local files, which only a deploy-time `context` can provide. */
120
+ export class SnapshotContextUnsupported extends Data.TaggedError("Daytona.SnapshotContextUnsupported") {
121
+ get message() {
122
+ return `A snapshot built at runtime can't copy local files (${this.line.trim()}). Declare it with Daytona.Snapshot and a \`context\`, or fetch the files in a RUN step.`;
123
+ }
124
+ }
125
+ /** A `run` command exited non-zero while building a snapshot from a sandbox. */
126
+ export class SnapshotRunFailed extends Data.TaggedError("Daytona.SnapshotRunFailed") {
127
+ get message() {
128
+ return `\`${this.command}\` exited ${this.exitCode} while building the snapshot:\n${this.output.slice(-2000)}`;
129
+ }
130
+ }
131
+ /** The image has no tag, or a moving one Daytona rejects. */
132
+ export class SnapshotImageTagInvalid extends Data.TaggedError("Daytona.SnapshotImageTagInvalid") {
133
+ get message() {
134
+ return `Daytona needs an image with a fixed tag or digest; got ${this.image} (latest, lts and stable are rejected)`;
135
+ }
136
+ }
137
+ const sha256 = (value) => Effect.sync(() => createHash("sha256").update(JSON.stringify(value)).digest("hex"));
138
+ const refName = (ref) => Effect.succeed(ref === undefined ? undefined : resolved(ref).name);
139
+ const checkImage = (image) => {
140
+ const last = image.split("/").at(-1) ?? image;
141
+ const tag = image.includes("@")
142
+ ? "digest"
143
+ : last.includes(":")
144
+ ? last.split(":").at(-1)
145
+ : undefined;
146
+ return tag === undefined || ["latest", "lts", "stable"].includes(tag)
147
+ ? Effect.fail(new SnapshotImageTagInvalid({ image }))
148
+ : Effect.void;
149
+ };
150
+ /** The Dockerfile's text for Daytona; the plan has baked build arguments in. */
151
+ const dockerfileText = (plan) => DockerfileParser.render(plan.dockerfile);
152
+ /**
153
+ * Check Dockerfile content built at runtime (a Worker has no file system,
154
+ * so there is no context to copy from).
155
+ */
156
+ export const checkRuntimeDockerfile = Effect.fn(function* (content) {
157
+ const parsed = yield* DockerfileParser.parse(content);
158
+ const { violations } = BuildPlan.check(parsed, capabilities, "linux/amd64");
159
+ if (violations.length > 0) {
160
+ return yield* new BuildPlan.UnsupportedDockerfile({
161
+ target: capabilities.target,
162
+ violations,
163
+ message: violations.map((v) => `line ${v.line}: ${v.instruction}: ${v.reason}`).join("\n"),
164
+ });
165
+ }
166
+ for (const stage of parsed.stages) {
167
+ for (const instruction of stage.instructions) {
168
+ if (instruction._tag !== "COPY" && instruction._tag !== "ADD")
169
+ continue;
170
+ if (instruction.flags.some((flag) => flag.name === "from"))
171
+ continue;
172
+ const local = instruction.sources.filter((source) => !/^(https?:\/\/|git@)/.test(source) && !source.startsWith("<<"));
173
+ if (local.length > 0)
174
+ return yield* new SnapshotContextUnsupported({ line: instruction.raw });
175
+ }
176
+ }
177
+ });
178
+ /** What the snapshot is built from, resolved; its hash decides rebuilds. */
179
+ const resolveSource = Effect.fn(function* (news) {
180
+ const fromDockerfile = news.dockerfile !== undefined || news.context !== undefined;
181
+ const sources = [news.image, fromDockerfile ? true : undefined, news.from].filter((s) => s !== undefined);
182
+ if (sources.length !== 1) {
183
+ return yield* new SnapshotSourceInvalid({
184
+ message: "Daytona.Snapshot takes exactly one of `image`, `dockerfile`/`context` or `from`",
185
+ });
186
+ }
187
+ if (news.image !== undefined)
188
+ yield* checkImage(news.image);
189
+ // A Dockerfile builds on Daytona unless it asks for local Docker, or
190
+ // has build secrets (Daytona's builders can't receive them).
191
+ const remote = news.build?.remote ?? news.build?.secrets === undefined;
192
+ const local = fromDockerfile && !remote
193
+ ? {
194
+ dockerfile: news.dockerfile,
195
+ context: news.context,
196
+ build: { args: news.build?.args, secrets: news.build?.secrets },
197
+ }
198
+ : undefined;
199
+ const plan = fromDockerfile && remote
200
+ ? yield* BuildPlan.plan({ dockerfile: news.dockerfile, context: news.context, build: { args: news.build?.args } }, { capabilities })
201
+ : undefined;
202
+ const sizing = {
203
+ entrypoint: news.entrypoint,
204
+ cpu: news.cpu,
205
+ memory: news.memory,
206
+ disk: news.disk,
207
+ gpu: news.gpu,
208
+ gpuType: news.gpuType,
209
+ regionId: news.regionId,
210
+ sandboxClass: news.sandboxClass,
211
+ };
212
+ const source = {
213
+ image: news.image,
214
+ dockerfile: plan ? dockerfileText(plan) : undefined,
215
+ from: yield* refName(news.from),
216
+ run: news.run ?? [],
217
+ ...sizing,
218
+ };
219
+ const buildHash = yield* sha256({
220
+ image: source.image,
221
+ plan: plan?.hash,
222
+ local: local ? yield* computeStaticSourceHash(local, "linux/amd64") : undefined,
223
+ from: source.from,
224
+ run: source.run,
225
+ ...sizing,
226
+ });
227
+ return { source, plan, local, buildHash };
228
+ });
229
+ export const toSnapshotAttributes = (s, buildHash) => ({
230
+ snapshotId: s.id,
231
+ name: s.name,
232
+ state: s.state,
233
+ imageName: s.imageName,
234
+ ref: s.ref,
235
+ cpu: s.cpu,
236
+ memory: s.mem,
237
+ disk: s.disk,
238
+ gpu: s.gpu,
239
+ sourceSandboxId: s.sourceSandboxId ?? undefined,
240
+ buildHash,
241
+ });
242
+ export const getSnapshot = (idOrName) => snapshots
243
+ .getSnapshot({ id: idOrName })
244
+ .pipe(Effect.catchTag("SnapshotNotFound", () => Effect.undefined));
245
+ /** Wait for a snapshot to become usable, reactivating it when Daytona has deactivated it. */
246
+ export const waitForSnapshot = Effect.fn(function* (idOrName) {
247
+ const current = yield* snapshots.getSnapshot({ id: idOrName });
248
+ if (current.state === "inactive")
249
+ yield* snapshots.activateSnapshot({ id: current.id });
250
+ return yield* waitForState({
251
+ kind: "snapshot",
252
+ id: idOrName,
253
+ observe: snapshots.getSnapshot({ id: idOrName }),
254
+ want: ["active"],
255
+ fail: ["error", "build_failed"],
256
+ reason: (s) => s.errorReason,
257
+ budget: "30 minutes",
258
+ });
259
+ });
260
+ /** Delete a snapshot by name (Daytona deletes by id). Deleting a missing one succeeds. */
261
+ export const deleteSnapshotByName = Effect.fn(function* (name) {
262
+ const found = yield* getSnapshot(name);
263
+ if (found !== undefined)
264
+ yield* deleteSnapshot(found.id);
265
+ });
266
+ export const deleteSnapshot = Effect.fn(function* (idOrName) {
267
+ yield* snapshots
268
+ .removeSnapshot({ id: idOrName })
269
+ .pipe(Effect.catchTag("SnapshotNotFound", () => Effect.void));
270
+ yield* waitUntilGone("snapshot", idOrName, getSnapshot(idOrName).pipe(Effect.map((s) => s !== undefined)), "5 minutes");
271
+ });
272
+ /**
273
+ * Start a sandbox from `from`, run the commands in it and capture it as a
274
+ * snapshot named `name`. The build sandbox is deleted whatever happens, and
275
+ * deletes itself after an hour if this process dies first.
276
+ */
277
+ export const captureSnapshot = Effect.fn(function* (input) {
278
+ const build = yield* Effect.acquireRelease(sandboxes.createSandbox({
279
+ name: `${input.name}-build`.slice(0, 63),
280
+ snapshot: input.from,
281
+ labels: { ...input.labels, "alchemy.role": "snapshot-build" },
282
+ autoDeleteInterval: 60,
283
+ }), (sandbox) => sandboxes.deleteSandbox({ sandboxIdOrName: sandbox.id }).pipe(Effect.catchTag("SandboxNotFound", () => Effect.void), Effect.ignore));
284
+ const started = yield* waitForState({
285
+ kind: "sandbox",
286
+ id: build.id,
287
+ observe: sandboxes.getSandbox({ sandboxIdOrName: build.id }),
288
+ want: ["started"],
289
+ fail: ["error", "build_failed", "destroyed"],
290
+ reason: (s) => s.errorReason,
291
+ });
292
+ for (const command of input.run) {
293
+ yield* input.note(`Running \`${command}\` in the snapshot build sandbox...`);
294
+ const result = yield* runCommand(started.id, started.toolboxProxyUrl, {
295
+ command,
296
+ timeout: 1800,
297
+ });
298
+ if ((result.exitCode ?? 0) !== 0) {
299
+ return yield* new SnapshotRunFailed({
300
+ command,
301
+ exitCode: result.exitCode ?? -1,
302
+ output: result.result,
303
+ });
304
+ }
305
+ }
306
+ yield* input.note(`Capturing snapshot ${input.name}...`);
307
+ yield* sandboxes.createSandboxSnapshot({ sandboxIdOrName: started.id, name: input.name });
308
+ return yield* waitForSnapshot(input.name);
309
+ }, Effect.scoped);
310
+ /**
311
+ * Build a snapshot named `name` and wait until it is active: pull or
312
+ * build on Daytona's builders, or capture it from a `from` sandbox after
313
+ * running `run`. Shared by the resource and the runtime binding.
314
+ */
315
+ export const buildSnapshot = Effect.fn(function* (input) {
316
+ const { name, source } = input;
317
+ if (source.from !== undefined) {
318
+ return yield* captureSnapshot({
319
+ labels: input.labels,
320
+ name,
321
+ from: source.from,
322
+ run: source.run ?? [],
323
+ note: input.note,
324
+ });
325
+ }
326
+ if (source.image !== undefined)
327
+ yield* checkImage(source.image);
328
+ yield* input.note(source.dockerfile !== undefined
329
+ ? `Building snapshot ${name} on Daytona...`
330
+ : `Pulling ${source.image} into snapshot ${name}...`);
331
+ yield* snapshots
332
+ .createSnapshot({
333
+ name,
334
+ imageName: source.image,
335
+ buildInfo: source.dockerfile !== undefined
336
+ ? { dockerfileContent: source.dockerfile, contextHashes: source.contextHashes }
337
+ : undefined,
338
+ entrypoint: source.entrypoint,
339
+ cpu: source.cpu,
340
+ memory: source.memory,
341
+ disk: source.disk,
342
+ gpu: source.gpu,
343
+ gpuType: source.gpuType,
344
+ regionId: source.regionId,
345
+ sandboxClass: source.sandboxClass,
346
+ })
347
+ .pipe(Effect.catchTag("SnapshotAlreadyExists", () => Effect.void));
348
+ return yield* waitForSnapshot(name);
349
+ });
350
+ /**
351
+ * Daytona's transient registry as a push target: a short-lived robot
352
+ * account scoped to the organization's own project, which Daytona pulls
353
+ * snapshots from without a registry entry.
354
+ */
355
+ const transientRegistry = Effect.fn(function* (name, regionId) {
356
+ const access = yield* dockerRegistry.getTransientPushAccess({ regionId });
357
+ return {
358
+ repositoryUri: Effect.succeed(`${access.registryUrl}/${access.project}/${name}`),
359
+ // Pushes are content-addressed and the registry can't be listed with
360
+ // this account; pushing an existing tag is a no-op upload.
361
+ hasTag: () => Effect.succeed(false),
362
+ credentials: Effect.succeed({
363
+ server: access.registryUrl,
364
+ username: access.username,
365
+ password: access.secret,
366
+ }),
367
+ };
368
+ });
369
+ export const SnapshotProvider = () => Provider.effect(Snapshot, Effect.gen(function* () {
370
+ const images = yield* makeContainerImageSource;
371
+ return {
372
+ stables: ["snapshotId"],
373
+ list: Effect.fn(function* () {
374
+ const all = yield* snapshots.getAllSnapshots.items({}).pipe(Stream.runCollect);
375
+ return Array.from(all)
376
+ .filter((s) => !s.general)
377
+ .map((s) => toSnapshotAttributes(s, ""));
378
+ }),
379
+ diff: Effect.fn(function* ({ id, news, output }) {
380
+ if (!isResolved(news) || output === undefined)
381
+ return undefined;
382
+ const name = yield* resolveName(id, news.name, news.name === undefined ? output.name : undefined);
383
+ const { buildHash } = yield* resolveSource(news);
384
+ if (name !== output.name || buildHash !== output.buildHash) {
385
+ // Sandboxes reference snapshots by name, so a pinned name is freed first.
386
+ return { action: "replace", deleteFirst: name === output.name };
387
+ }
388
+ }),
389
+ lookup: Effect.fn(function* ({ name }) {
390
+ const found = yield* getSnapshot(name);
391
+ return found === undefined ? undefined : toSnapshotAttributes(found, "");
392
+ }),
393
+ read: Effect.fn(function* ({ id, olds, output }) {
394
+ const name = yield* resolveName(id, olds?.name, output?.name);
395
+ const found = (output ? yield* getSnapshot(output.snapshotId) : undefined) ??
396
+ (yield* getSnapshot(name));
397
+ if (found === undefined)
398
+ return undefined;
399
+ const attrs = toSnapshotAttributes(found, output?.buildHash ?? "");
400
+ return (yield* isOwnedName(id, found.name, output !== undefined))
401
+ ? attrs
402
+ : Unowned(attrs);
403
+ }),
404
+ reconcile: Effect.fn(function* ({ id, news, output, session }) {
405
+ const name = yield* resolveName(id, news.name, output?.name);
406
+ const { source, plan, local, buildHash } = yield* resolveSource(news);
407
+ // Observe
408
+ const current = yield* getSnapshot(output?.snapshotId ?? name);
409
+ if (current !== undefined && current.name === name) {
410
+ // Ensure usable: reactivate a snapshot Daytona deactivated after
411
+ // two weeks unused, and wait out a build already in flight.
412
+ const ready = current.state === "active" ? current : yield* waitForSnapshot(current.id);
413
+ return toSnapshotAttributes(ready, output?.buildHash ?? buildHash);
414
+ }
415
+ // Ensure — a local build pushes its image to Daytona's registry,
416
+ // which the snapshot then pulls.
417
+ if (local !== undefined) {
418
+ yield* session.note(`Building ${name} with local Docker...`);
419
+ const pushed = yield* images.resolve({ id, source: local, session, platform: "linux/amd64", bootstrap: () => "" }, yield* transientRegistry(name, news.regionId));
420
+ const built = yield* buildSnapshot({
421
+ name,
422
+ source: { ...source, dockerfile: undefined, image: pushed.imageUri },
423
+ labels: yield* createInternalLabels(id),
424
+ note: session.note,
425
+ });
426
+ return toSnapshotAttributes(built, buildHash);
427
+ }
428
+ // Ensure — upload what the Dockerfile copies, then build.
429
+ for (const warning of plan?.warnings ?? [])
430
+ yield* session.note(warning);
431
+ const contextHashes = plan !== undefined && plan.files.length > 0
432
+ ? [yield* uploadBuildContext(plan)]
433
+ : undefined;
434
+ const built = yield* buildSnapshot({
435
+ name,
436
+ source: { ...source, contextHashes },
437
+ labels: yield* createInternalLabels(id),
438
+ note: session.note,
439
+ });
440
+ return toSnapshotAttributes(built, buildHash);
441
+ }),
442
+ delete: Effect.fn(function* ({ output }) {
443
+ yield* deleteSnapshot(output.snapshotId);
444
+ }),
445
+ };
446
+ }));
447
+ //# sourceMappingURL=Snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Snapshot.js","sources":["../src/Snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import * as volumes from "@distilled.cloud/daytona/volumes";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import * as Effect from "effect/Effect";
5
+ import type { Providers } from "./Providers.ts";
6
+ export interface VolumeProps {
7
+ /**
8
+ * Volume name, unique in the organization. If omitted, a unique name is
9
+ * generated from the stack, stage and logical ID. Changing it replaces
10
+ * the volume (and its files).
11
+ */
12
+ name?: string;
13
+ }
14
+ export interface VolumeAttributes {
15
+ /** Volume ID. */
16
+ volumeId: string;
17
+ /** Volume name. */
18
+ name: string;
19
+ /** Volume state (`ready` once usable). */
20
+ state: volumes.VolumeState;
21
+ /** When the volume was created. */
22
+ createdAt: string;
23
+ }
24
+ export type Volume = Resource<"Daytona.Volume", VolumeProps, VolumeAttributes, never, Providers, VolumeLookup>;
25
+ /**
26
+ * Props for {@link Volume.lookup}: find a volume this stack
27
+ * doesn't manage by its name.
28
+ */
29
+ export interface VolumeLookup {
30
+ /** Volume name. */
31
+ name: string;
32
+ }
33
+ /**
34
+ * A Daytona volume: a persistent disk, backed by object storage, that
35
+ * sandboxes mount at a path. Its files outlive every sandbox that mounts
36
+ * it, and several sandboxes can mount it at once.
37
+ *
38
+ * Declare a volume here for data your whole app shares, like a dataset or
39
+ * a package cache. For a volume per user or per session, create it at
40
+ * runtime with {@link CreateVolume}.
41
+ * @see https://www.daytona.io/docs/en/volumes/
42
+ *
43
+ * ### Creating a Volume
44
+ * **Example:** A shared cache volume
45
+ * ```typescript
46
+ * export const Cache = Daytona.Volume("Cache", {});
47
+ * ```
48
+ *
49
+ * ### Mounting a Volume
50
+ * **Example:** Mount it in a sandbox declared at deploy
51
+ * ```typescript
52
+ * export const DevBox = Daytona.Sandbox("DevBox", {
53
+ * snapshot: Base,
54
+ * mounts: [{ volume: Cache, path: "/cache" }],
55
+ * });
56
+ * ```
57
+ *
58
+ * **Example:** Mount it in sandboxes created at runtime
59
+ * ```typescript
60
+ * const cache = yield* Daytona.MountVolume(Cache, { path: "/cache" });
61
+ * const sandbox = yield* sandboxes.create({ mounts: [cache] });
62
+ * ```
63
+ *
64
+ * ### Looking up an existing volume
65
+ * `Volume.lookup` references a volume Alchemy doesn't manage (created in
66
+ * the Daytona dashboard or by another stack). It is read during plan/deploy,
67
+ * never created, updated or deleted.
68
+ *
69
+ * **Example:** Mount an existing volume
70
+ * ```typescript
71
+ * const data = Daytona.Volume.lookup({ name: "datasets" });
72
+ * ```
73
+ *
74
+ * @resource
75
+ * @product Volume
76
+ */
77
+ export declare const Volume: import("alchemy/Resource").ResourceClass<Volume>;
78
+ export declare const toVolumeAttributes: (v: volumes.VolumeDto) => VolumeAttributes;
79
+ export declare const getVolumeByName: (name: string) => Effect.Effect<volumes.VolumeDto | undefined, volumes.DaytonaOpError, volumes.DaytonaOpContext>;
80
+ export declare const getVolumeById: (volumeId: string) => Effect.Effect<volumes.VolumeDto | undefined, volumes.DaytonaOpError, volumes.DaytonaOpContext>;
81
+ export declare const waitForVolume: (volumeId: string) => Effect.Effect<volumes.VolumeDto, import("./internal/Wait.ts").StateFailed | import("./internal/Wait.ts").StateTimeout | volumes.GetVolumeError, volumes.DaytonaOpContext>;
82
+ /**
83
+ * The volume named `name`, created if missing. A create racing another
84
+ * caller (`VolumeAlreadyExists`) re-reads the winner.
85
+ */
86
+ export declare const ensureVolume: (name: string) => Effect.Effect<volumes.VolumeDto, import("@distilled.cloud/core/errors").BadGateway | import("@distilled.cloud/core/errors").BadRequest | import("@distilled.cloud/core/config").ConfigError | import("@distilled.cloud/core/errors").Conflict | import("@distilled.cloud/daytona/Errors").DaytonaParseError | import("@distilled.cloud/core/errors").Forbidden | import("@distilled.cloud/core/errors").GatewayTimeout | import("effect/http/HttpClientError").HttpClientError | import("@distilled.cloud/core/errors").InternalServerError | import("@distilled.cloud/core/protocol-http").InvalidInput | import("@distilled.cloud/core/errors").Locked | import("@distilled.cloud/core/errors").NotFound | import("@distilled.cloud/core/sdk-error").SdkError | import("@distilled.cloud/core/errors").ServiceUnavailable | import("./internal/Wait.ts").StateFailed | import("./internal/Wait.ts").StateTimeout | import("@distilled.cloud/core/errors").TooManyRequests | import("@distilled.cloud/core/errors").Unauthorized | import("@distilled.cloud/daytona/Errors").UnknownDaytonaError | import("@distilled.cloud/core/errors").UnprocessableEntity | volumes.VolumeNotFound, volumes.DaytonaOpContext>;
87
+ /**
88
+ * Delete a volume. With `wait` (deploy), retry while a sandbox still
89
+ * mounts it and wait until it is gone. At run time `wait` is off: a
90
+ * request fails at once with `VolumeInUse` and returns as soon as Daytona
91
+ * accepts the delete. Daytona releases a volume about a minute after the
92
+ * sandbox that wrote to it is deleted, which is longer than a request
93
+ * should wait.
94
+ */
95
+ export declare const deleteVolumeById: (volumeId: string, options?: {
96
+ readonly wait: boolean;
97
+ } | undefined) => Effect.Effect<void, import("./internal/Wait.ts").StateTimeout | volumes.VolumeInUse | volumes.VolumeNotReady | volumes.DaytonaOpError, volumes.DaytonaOpContext>;
98
+ export declare const VolumeProvider: () => import("effect/Layer").Layer<Provider.Provider<Volume>, never, import("alchemy/Stack").Stack | import("alchemy/Stage").Stage | volumes.DaytonaOpContext>;
99
+ //# sourceMappingURL=Volume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Volume.d.ts","sources":["../src/Volume.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kCAAkC,CAAC;AAG5D,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAIxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC;IAC3B,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,MAAM,GAAG,QAAQ,CAC3B,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,KAAK,EACL,SAAS,EACT,YAAY,CACb,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,eAAO,MAAM,MAAM,kDAAqC,CAAC;AAEzD,eAAO,MAAM,kBAAkB,MAAO,OAAO,CAAC,SAAS,KAAG,gBAKxD,CAAC;AAKH,eAAO,MAAM,eAAe,SAAU,MAAM,mGAIzC,CAAC;AAEJ,eAAO,MAAM,aAAa,aAAc,MAAM,mGAI3C,CAAC;AAEJ,eAAO,MAAM,aAAa,aAAc,MAAM,8KAQ1C,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,YAAY,sqCAQvB,CAAC;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;mBAED,OAAO;kLA0BjC,CAAC;AAEH,eAAO,MAAM,cAAc,gKAiDxB,CAAC"}