@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/Volume.js ADDED
@@ -0,0 +1,152 @@
1
+ import * as volumes from "@distilled.cloud/daytona/volumes";
2
+ import { Unowned } from "alchemy/AdoptPolicy";
3
+ import { isResolved } from "alchemy/Diff";
4
+ import * as Provider from "alchemy/Provider";
5
+ import { Resource } from "alchemy/Resource";
6
+ import * as Effect from "effect/Effect";
7
+ import * as Schedule from "effect/Schedule";
8
+ import { isOwnedName, resolveName } from "./internal/Names.js";
9
+ import { waitForState, waitUntilGone } from "./internal/Wait.js";
10
+ /**
11
+ * A Daytona volume: a persistent disk, backed by object storage, that
12
+ * sandboxes mount at a path. Its files outlive every sandbox that mounts
13
+ * it, and several sandboxes can mount it at once.
14
+ *
15
+ * Declare a volume here for data your whole app shares, like a dataset or
16
+ * a package cache. For a volume per user or per session, create it at
17
+ * runtime with {@link CreateVolume}.
18
+ * @see https://www.daytona.io/docs/en/volumes/
19
+ *
20
+ * ### Creating a Volume
21
+ * **Example:** A shared cache volume
22
+ * ```typescript
23
+ * export const Cache = Daytona.Volume("Cache", {});
24
+ * ```
25
+ *
26
+ * ### Mounting a Volume
27
+ * **Example:** Mount it in a sandbox declared at deploy
28
+ * ```typescript
29
+ * export const DevBox = Daytona.Sandbox("DevBox", {
30
+ * snapshot: Base,
31
+ * mounts: [{ volume: Cache, path: "/cache" }],
32
+ * });
33
+ * ```
34
+ *
35
+ * **Example:** Mount it in sandboxes created at runtime
36
+ * ```typescript
37
+ * const cache = yield* Daytona.MountVolume(Cache, { path: "/cache" });
38
+ * const sandbox = yield* sandboxes.create({ mounts: [cache] });
39
+ * ```
40
+ *
41
+ * ### Looking up an existing volume
42
+ * `Volume.lookup` references a volume Alchemy doesn't manage (created in
43
+ * the Daytona dashboard or by another stack). It is read during plan/deploy,
44
+ * never created, updated or deleted.
45
+ *
46
+ * **Example:** Mount an existing volume
47
+ * ```typescript
48
+ * const data = Daytona.Volume.lookup({ name: "datasets" });
49
+ * ```
50
+ *
51
+ * @resource
52
+ * @product Volume
53
+ */
54
+ export const Volume = Resource("Daytona.Volume");
55
+ export const toVolumeAttributes = (v) => ({
56
+ volumeId: v.id,
57
+ name: v.name,
58
+ state: v.state,
59
+ createdAt: v.createdAt,
60
+ });
61
+ const isLive = (v) => v.state !== "deleted" && v.state !== "deleting" && v.state !== "pending_delete";
62
+ export const getVolumeByName = (name) => volumes.getVolumeByName({ name }).pipe(Effect.map((v) => (isLive(v) ? v : undefined)), Effect.catchTag("VolumeNotFound", () => Effect.undefined));
63
+ export const getVolumeById = (volumeId) => volumes.getVolume({ volumeId }).pipe(Effect.map((v) => (isLive(v) ? v : undefined)), Effect.catchTag("VolumeNotFound", () => Effect.undefined));
64
+ export const waitForVolume = (volumeId) => waitForState({
65
+ kind: "volume",
66
+ id: volumeId,
67
+ observe: volumes.getVolume({ volumeId }),
68
+ want: ["ready"],
69
+ fail: ["error"],
70
+ reason: (v) => v.errorReason,
71
+ });
72
+ /**
73
+ * The volume named `name`, created if missing. A create racing another
74
+ * caller (`VolumeAlreadyExists`) re-reads the winner.
75
+ */
76
+ export const ensureVolume = Effect.fn(function* (name) {
77
+ const existing = yield* getVolumeByName(name);
78
+ const volume = existing ??
79
+ (yield* volumes
80
+ .createVolume({ name })
81
+ .pipe(Effect.catchTag("VolumeAlreadyExists", () => volumes.getVolumeByName({ name }))));
82
+ return volume.state === "ready" ? volume : yield* waitForVolume(volume.id);
83
+ });
84
+ /**
85
+ * Delete a volume. With `wait` (deploy), retry while a sandbox still
86
+ * mounts it and wait until it is gone. At run time `wait` is off: a
87
+ * request fails at once with `VolumeInUse` and returns as soon as Daytona
88
+ * accepts the delete. Daytona releases a volume about a minute after the
89
+ * sandbox that wrote to it is deleted, which is longer than a request
90
+ * should wait.
91
+ */
92
+ export const deleteVolumeById = Effect.fn(function* (volumeId, options = { wait: true }) {
93
+ yield* volumes.deleteVolume({ volumeId }).pipe(Effect.catchTags({
94
+ VolumeNotFound: () => Effect.void,
95
+ // Refused while the volume is still being created (wait for it) or is
96
+ // already being deleted (nothing left to do).
97
+ VolumeNotReady: (error) => Effect.flatMap(getVolumeById(volumeId), (live) => live === undefined ? Effect.void : Effect.fail(error)),
98
+ }),
99
+ // VolumeInUse: a sandbox still mounts it, e.g. while a destroy deletes
100
+ // the sandboxes alongside; it frees up once they are gone.
101
+ Effect.retry({
102
+ while: (e) => e._tag === "VolumeNotReady" || (options.wait && e._tag === "VolumeInUse"),
103
+ schedule: Schedule.spaced("2 seconds"),
104
+ times: 30,
105
+ }));
106
+ if (!options.wait)
107
+ return;
108
+ yield* waitUntilGone("volume", volumeId, getVolumeById(volumeId).pipe(Effect.map((v) => v !== undefined)));
109
+ });
110
+ export const VolumeProvider = () => Provider.effect(Volume, Effect.succeed({
111
+ stables: ["volumeId", "createdAt"],
112
+ list: Effect.fn(function* () {
113
+ const all = yield* volumes.listVolumes({});
114
+ return all.filter(isLive).map(toVolumeAttributes);
115
+ }),
116
+ diff: Effect.fn(function* ({ id, news, output }) {
117
+ if (!isResolved(news) || output === undefined)
118
+ return undefined;
119
+ const name = yield* resolveName(id, news.name, news.name === undefined ? output.name : undefined);
120
+ if (name !== output.name)
121
+ return { action: "replace", deleteFirst: true };
122
+ }),
123
+ lookup: Effect.fn(function* ({ name }) {
124
+ const found = yield* getVolumeByName(name);
125
+ return found === undefined ? undefined : toVolumeAttributes(found);
126
+ }),
127
+ read: Effect.fn(function* ({ id, olds, output }) {
128
+ const name = yield* resolveName(id, olds?.name, output?.name);
129
+ const found = (output ? yield* getVolumeById(output.volumeId) : undefined) ??
130
+ (yield* getVolumeByName(name));
131
+ if (found === undefined)
132
+ return undefined;
133
+ const attrs = toVolumeAttributes(found);
134
+ return (yield* isOwnedName(id, found.name, output !== undefined)) ? attrs : Unowned(attrs);
135
+ }),
136
+ reconcile: Effect.fn(function* ({ id, news, output }) {
137
+ // Observe by id first: the name may already be taken by a peer.
138
+ const name = yield* resolveName(id, news.name, output?.name);
139
+ const byId = output ? yield* getVolumeById(output.volumeId) : undefined;
140
+ // Ensure — volumes have nothing mutable beyond existence.
141
+ const volume = byId && byId.name === name
142
+ ? byId.state === "ready"
143
+ ? byId
144
+ : yield* waitForVolume(byId.id)
145
+ : yield* ensureVolume(name);
146
+ return toVolumeAttributes(volume);
147
+ }),
148
+ delete: Effect.fn(function* ({ output }) {
149
+ yield* deleteVolumeById(output.volumeId);
150
+ }),
151
+ }));
152
+ //# sourceMappingURL=Volume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Volume.js","sources":["../src/Volume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import * as warmPools from "@distilled.cloud/daytona/warm_pools";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import * as Effect from "effect/Effect";
5
+ import { type Ref } from "./internal/Ref.ts";
6
+ import type { Providers } from "./Providers.ts";
7
+ /** A snapshot, by name. Accepts a `Daytona.Snapshot` or `{ name }`. */
8
+ export type WarmPoolSnapshot = {
9
+ readonly name: string;
10
+ };
11
+ export interface WarmPoolProps {
12
+ /** Snapshot whose sandboxes are kept warm. Changing it replaces the pool. */
13
+ snapshot: Ref<WarmPoolSnapshot>;
14
+ /** How many started sandboxes to keep ready. Updated in place. */
15
+ size: number;
16
+ /** Region to keep them in. Changing it replaces the pool. */
17
+ target?: string;
18
+ }
19
+ export interface WarmPoolAttributes {
20
+ /** Warm pool ID. */
21
+ warmPoolId: string;
22
+ /** Snapshot name. */
23
+ snapshot: string;
24
+ /** Region. */
25
+ target: string;
26
+ /** Desired pool size. */
27
+ size: number;
28
+ /** Sandboxes currently ready in the pool. */
29
+ currentSize: number;
30
+ }
31
+ export type WarmPool = Resource<"Daytona.WarmPool", WarmPoolProps, WarmPoolAttributes, never, Providers>;
32
+ /**
33
+ * Keeps started sandboxes of a {@link Snapshot} ready, so creating a
34
+ * sandbox from that snapshot hands one over instead of booting a new one.
35
+ * Daytona uses the pool automatically for matching creates.
36
+ *
37
+ * Deleting the snapshot deletes its warm pools. Daytona Cloud doesn't
38
+ * serve warm pools to every organization; where it doesn't, deploying one
39
+ * fails with `WarmPoolsUnavailable`.
40
+ * @see https://www.daytona.io/docs/en/warm-pools/
41
+ *
42
+ * ### Keeping Sandboxes Warm
43
+ * **Example:** Four ready sandboxes of a snapshot
44
+ * ```typescript
45
+ * export const Pool = Daytona.WarmPool("Pool", { snapshot: Base, size: 4 });
46
+ * ```
47
+ *
48
+ * @resource
49
+ * @product Warm Pool
50
+ */
51
+ export declare const WarmPool: import("alchemy/Resource").ResourceConstructor<WarmPool, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<WarmPool, never>, never, never> & {
52
+ Self: import("alchemy/Self").Self<WarmPool>;
53
+ Provider: Provider.Provider<WarmPool>;
54
+ Aliases: readonly string[] | undefined;
55
+ ref(id: string, options?: {
56
+ stage?: string;
57
+ stack?: string;
58
+ }): Effect.Effect<WarmPool, never, never>;
59
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<WarmPoolProps>) => Effect.Effect<WarmPool, never, Providers>);
60
+ export declare const WarmPoolProvider: () => import("effect/Layer").Layer<Provider.Provider<WarmPool>, never, warmPools.DaytonaOpContext>;
61
+ //# sourceMappingURL=WarmPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarmPool.d.ts","sources":["../src/WarmPool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,qCAAqC,CAAC;AAEjE,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,uEAAuE;AACvE,MAAM,MAAM,gBAAgB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,6EAA6E;IAC7E,QAAQ,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAChC,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAC7B,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,QAAQ;;;;;;;;qIAAiE,CAAC;AAavF,eAAO,MAAM,gBAAgB,oGAqD1B,CAAC"}
@@ -0,0 +1,81 @@
1
+ import * as warmPools from "@distilled.cloud/daytona/warm_pools";
2
+ import { isResolved } from "alchemy/Diff";
3
+ import * as Provider from "alchemy/Provider";
4
+ import { Resource } from "alchemy/Resource";
5
+ import * as Effect from "effect/Effect";
6
+ import { declarable } from "./internal/Declared.js";
7
+ import { resolved } from "./internal/Ref.js";
8
+ /**
9
+ * Keeps started sandboxes of a {@link Snapshot} ready, so creating a
10
+ * sandbox from that snapshot hands one over instead of booting a new one.
11
+ * Daytona uses the pool automatically for matching creates.
12
+ *
13
+ * Deleting the snapshot deletes its warm pools. Daytona Cloud doesn't
14
+ * serve warm pools to every organization; where it doesn't, deploying one
15
+ * fails with `WarmPoolsUnavailable`.
16
+ * @see https://www.daytona.io/docs/en/warm-pools/
17
+ *
18
+ * ### Keeping Sandboxes Warm
19
+ * **Example:** Four ready sandboxes of a snapshot
20
+ * ```typescript
21
+ * export const Pool = Daytona.WarmPool("Pool", { snapshot: Base, size: 4 });
22
+ * ```
23
+ *
24
+ * @resource
25
+ * @product Warm Pool
26
+ */
27
+ export const WarmPool = declarable()(Resource("Daytona.WarmPool"));
28
+ const toAttributes = (p) => ({
29
+ warmPoolId: p.id,
30
+ snapshot: p.snapshot,
31
+ target: p.target,
32
+ size: p.pool,
33
+ currentSize: p.currentSize,
34
+ });
35
+ const snapshotName = (snapshot) => Effect.succeed(resolved(snapshot).name);
36
+ export const WarmPoolProvider = () => Provider.effect(WarmPool, Effect.succeed({
37
+ stables: ["warmPoolId", "snapshot", "target"],
38
+ list: Effect.fn(function* () {
39
+ // Organizations Daytona doesn't serve warm pools to have none.
40
+ const pools = yield* warmPools
41
+ .listWarmPools({})
42
+ .pipe(Effect.catchTag("WarmPoolsUnavailable", () => Effect.succeed([])));
43
+ return pools.map(toAttributes);
44
+ }),
45
+ diff: Effect.fn(function* ({ news, output }) {
46
+ if (!isResolved(news) || output === undefined)
47
+ return undefined;
48
+ const snapshot = yield* snapshotName(news.snapshot);
49
+ if (snapshot !== output.snapshot ||
50
+ (news.target !== undefined && news.target !== output.target)) {
51
+ return { action: "replace" };
52
+ }
53
+ }),
54
+ read: Effect.fn(function* ({ output }) {
55
+ if (output === undefined)
56
+ return undefined;
57
+ const found = (yield* warmPools.listWarmPools({})).find((p) => p.id === output.warmPoolId);
58
+ return found ? toAttributes(found) : undefined;
59
+ }),
60
+ reconcile: Effect.fn(function* ({ news, output }) {
61
+ const snapshot = yield* snapshotName(news.snapshot);
62
+ // Observe — a pool is identified by its snapshot and region.
63
+ const pools = yield* warmPools.listWarmPools({});
64
+ const current = pools.find((p) => p.id === output?.warmPoolId) ??
65
+ pools.find((p) => p.snapshot === snapshot && (news.target === undefined || p.target === news.target));
66
+ // Ensure
67
+ if (current === undefined) {
68
+ return toAttributes(yield* warmPools.createWarmPool({ snapshot, pool: news.size, target: news.target }));
69
+ }
70
+ // Sync size
71
+ if (current.pool === news.size)
72
+ return toAttributes(current);
73
+ return toAttributes(yield* warmPools.updateWarmPool({ id: current.id, pool: news.size }));
74
+ }),
75
+ delete: Effect.fn(function* ({ output }) {
76
+ yield* warmPools
77
+ .deleteWarmPool({ id: output.warmPoolId })
78
+ .pipe(Effect.catchTag("WarmPoolNotFound", () => Effect.void));
79
+ }),
80
+ }));
81
+ //# sourceMappingURL=WarmPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WarmPool.js","sources":["../src/WarmPool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import * as webhooks from "@distilled.cloud/daytona/webhooks";
2
+ import * as Provider from "alchemy/Provider";
3
+ import { Resource } from "alchemy/Resource";
4
+ import * as Effect from "effect/Effect";
5
+ import { type OrganizationRef } from "./internal/Organization.ts";
6
+ import type { Ref } from "./internal/Ref.ts";
7
+ import type { Providers } from "./Providers.ts";
8
+ export interface WebhooksProps {
9
+ /**
10
+ * Organization to act on, e.g. a `Daytona.Organization`. Defaults to the
11
+ * credentials' organization. Changing it replaces the resource.
12
+ */
13
+ organization?: Ref<OrganizationRef>;
14
+ /**
15
+ * Bump to re-sync the organization's webhook endpoints with Daytona's
16
+ * event types on the next deploy.
17
+ */
18
+ refresh?: number;
19
+ }
20
+ export interface WebhooksAttributes {
21
+ /** Organization ID. */
22
+ organizationId: string;
23
+ /** The Svix application Daytona delivers events through. */
24
+ svixApplicationId: string;
25
+ /** Refresh counter applied. */
26
+ refreshed: number;
27
+ }
28
+ export type Webhooks = Resource<"Daytona.Webhooks", WebhooksProps, WebhooksAttributes, never, Providers>;
29
+ /**
30
+ * Turn on webhooks for the Daytona organization: sandbox, snapshot and
31
+ * volume events delivered to endpoints you register in Daytona's webhook
32
+ * portal. Daytona delivers through Svix, which owns the endpoints, so this
33
+ * resource only enables delivery; open the portal with
34
+ * `getWebhookControllerAppPortalAccess` (on {@link ReadOrganization}) to
35
+ * add endpoints. Webhooks can't be turned off again through the API, so
36
+ * destroy leaves them enabled.
37
+ * @see https://www.daytona.io/docs/en/webhooks/
38
+ *
39
+ * ### Enabling Webhooks
40
+ * **Example:** Enable delivery for the organization
41
+ * ```typescript
42
+ * export const Events = Daytona.Webhooks("Events", {});
43
+ * ```
44
+ *
45
+ * @resource
46
+ * @product Organization
47
+ */
48
+ export declare const Webhooks: import("alchemy/Resource").ResourceConstructor<Webhooks, Providers> & Effect.Effect<import("alchemy/Resource").ResourceConstructor<Webhooks, never>, never, never> & {
49
+ Self: import("alchemy/Self").Self<Webhooks>;
50
+ Provider: Provider.Provider<Webhooks>;
51
+ Aliases: readonly string[] | undefined;
52
+ ref(id: string, options?: {
53
+ stage?: string;
54
+ stack?: string;
55
+ }): Effect.Effect<Webhooks, never, never>;
56
+ } & ((id: string, props: import("./internal/Declared.ts").DeclaredProps<WebhooksProps>) => Effect.Effect<Webhooks, never, Providers>);
57
+ export declare const WebhooksProvider: () => import("effect/Layer").Layer<Provider.Provider<Webhooks>, never, webhooks.DaytonaOpContext>;
58
+ //# sourceMappingURL=Webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Webhooks.d.ts","sources":["../src/Webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,mCAAmC,CAAC;AAE9D,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,YAAY,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IACpC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,4DAA4D;IAC5D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAC7B,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,KAAK,EACL,SAAS,CACV,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,QAAQ;;;;;;;;qIAAiE,CAAC;AAcvF,eAAO,MAAM,gBAAgB,mGA0C1B,CAAC"}
@@ -0,0 +1,75 @@
1
+ import * as webhooks from "@distilled.cloud/daytona/webhooks";
2
+ import { isResolved } from "alchemy/Diff";
3
+ import * as Provider from "alchemy/Provider";
4
+ import { Resource } from "alchemy/Resource";
5
+ import * as Effect from "effect/Effect";
6
+ import { declarable } from "./internal/Declared.js";
7
+ import { movesOrganization, organizationIdFor, } from "./internal/Organization.js";
8
+ import { waitForState } from "./internal/Wait.js";
9
+ /**
10
+ * Turn on webhooks for the Daytona organization: sandbox, snapshot and
11
+ * volume events delivered to endpoints you register in Daytona's webhook
12
+ * portal. Daytona delivers through Svix, which owns the endpoints, so this
13
+ * resource only enables delivery; open the portal with
14
+ * `getWebhookControllerAppPortalAccess` (on {@link ReadOrganization}) to
15
+ * add endpoints. Webhooks can't be turned off again through the API, so
16
+ * destroy leaves them enabled.
17
+ * @see https://www.daytona.io/docs/en/webhooks/
18
+ *
19
+ * ### Enabling Webhooks
20
+ * **Example:** Enable delivery for the organization
21
+ * ```typescript
22
+ * export const Events = Daytona.Webhooks("Events", {});
23
+ * ```
24
+ *
25
+ * @resource
26
+ * @product Organization
27
+ */
28
+ export const Webhooks = declarable()(Resource("Daytona.Webhooks"));
29
+ const status = (organizationId) => webhooks.getWebhookControllerInitializationStatus({ organizationId }).pipe(Effect.map((s) => ({
30
+ ...s,
31
+ state: s.svixApplicationId ? "ready" : s.lastError ? "error" : "pending",
32
+ })),
33
+ // Before initialization Daytona has no status to report.
34
+ Effect.catchTag("WebhooksNotInitialized", () => Effect.succeed({ svixApplicationId: undefined, lastError: undefined, state: "pending" })));
35
+ export const WebhooksProvider = () => Provider.effect(Webhooks, Effect.succeed({
36
+ stables: ["organizationId", "svixApplicationId"],
37
+ nuke: { singleton: true },
38
+ list: () => Effect.succeed([]),
39
+ diff: Effect.fn(function* ({ news, output }) {
40
+ if (!isResolved(news) || output === undefined)
41
+ return undefined;
42
+ if (yield* movesOrganization(news.organization, output))
43
+ return { action: "replace" };
44
+ }),
45
+ reconcile: Effect.fn(function* ({ news, output }) {
46
+ const organizationId = yield* organizationIdFor(news.organization);
47
+ // Observe
48
+ let current = yield* status(organizationId);
49
+ // Ensure
50
+ if (current.svixApplicationId == null) {
51
+ yield* webhooks.webhookControllerInitializeWebhooks({ organizationId });
52
+ current = yield* waitForState({
53
+ kind: "webhooks",
54
+ id: organizationId,
55
+ observe: status(organizationId),
56
+ want: ["ready"],
57
+ fail: ["error"],
58
+ reason: (s) => s.lastError,
59
+ budget: "2 minutes",
60
+ });
61
+ }
62
+ // Sync
63
+ const refresh = news.refresh ?? 0;
64
+ if (output !== undefined && refresh !== output.refreshed) {
65
+ yield* webhooks.refreshWebhookControllerEndpoints({ organizationId });
66
+ }
67
+ return {
68
+ organizationId,
69
+ svixApplicationId: current.svixApplicationId ?? "",
70
+ refreshed: refresh,
71
+ };
72
+ }),
73
+ delete: () => Effect.void,
74
+ }));
75
+ //# sourceMappingURL=Webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Webhooks.js","sources":["../src/Webhooks.ts"],"names":[],"mappings":"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"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ export * from "./ApiKey.ts";
2
+ export * from "./AuthProvider.ts";
3
+ export * from "./ConnectSandbox.ts";
4
+ export * from "./ConnectSandboxHttp.ts";
5
+ export * from "./CreateSandbox.ts";
6
+ export * from "./CreateSandboxHttp.ts";
7
+ export * from "./CreateSecret.ts";
8
+ export * from "./CreateSecretHttp.ts";
9
+ export * from "./CreateSnapshot.ts";
10
+ export * from "./CreateSnapshotHttp.ts";
11
+ export * from "./CreateVolume.ts";
12
+ export * from "./CreateVolumeHttp.ts";
13
+ export * from "./Credentials.ts";
14
+ export * from "./DaytonaBindings.ts";
15
+ export * from "./IdentityProvider.ts";
16
+ export * from "./MountVolume.ts";
17
+ export * from "./Organization.ts";
18
+ export * from "./OrganizationInvitation.ts";
19
+ export * from "./OrganizationMember.ts";
20
+ export * from "./OrganizationOtelConfig.ts";
21
+ export * from "./OrganizationRole.ts";
22
+ export * from "./OrganizationSettings.ts";
23
+ export * from "./Providers.ts";
24
+ export * from "./ReadAuditLogs.ts";
25
+ export * from "./ReadOrganization.ts";
26
+ export * from "./ReadUsage.ts";
27
+ export * from "./Region.ts";
28
+ export * from "./Registry.ts";
29
+ export * from "./Runner.ts";
30
+ export * from "./Sandbox.ts";
31
+ export * from "./Secret.ts";
32
+ export * from "./Snapshot.ts";
33
+ export * from "./Volume.ts";
34
+ export * from "./WarmPool.ts";
35
+ export * from "./Webhooks.ts";
36
+ export type { Command, ConnectedSandbox, DaytonaSandbox, ExecOptions, ExecResult, PtyOpenOptions, SandboxFiles, SandboxProcess, SandboxPty, } from "./SandboxClient.ts";
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,YAAY,EACV,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,UAAU,EACV,cAAc,EACd,YAAY,EACZ,cAAc,EACd,UAAU,GACX,MAAM,oBAAoB,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,36 @@
1
+ export * from "./ApiKey.js";
2
+ export * from "./AuthProvider.js";
3
+ export * from "./ConnectSandbox.js";
4
+ export * from "./ConnectSandboxHttp.js";
5
+ export * from "./CreateSandbox.js";
6
+ export * from "./CreateSandboxHttp.js";
7
+ export * from "./CreateSecret.js";
8
+ export * from "./CreateSecretHttp.js";
9
+ export * from "./CreateSnapshot.js";
10
+ export * from "./CreateSnapshotHttp.js";
11
+ export * from "./CreateVolume.js";
12
+ export * from "./CreateVolumeHttp.js";
13
+ export * from "./Credentials.js";
14
+ export * from "./DaytonaBindings.js";
15
+ export * from "./IdentityProvider.js";
16
+ export * from "./MountVolume.js";
17
+ export * from "./Organization.js";
18
+ export * from "./OrganizationInvitation.js";
19
+ export * from "./OrganizationMember.js";
20
+ export * from "./OrganizationOtelConfig.js";
21
+ export * from "./OrganizationRole.js";
22
+ export * from "./OrganizationSettings.js";
23
+ export * from "./Providers.js";
24
+ export * from "./ReadAuditLogs.js";
25
+ export * from "./ReadOrganization.js";
26
+ export * from "./ReadUsage.js";
27
+ export * from "./Region.js";
28
+ export * from "./Registry.js";
29
+ export * from "./Runner.js";
30
+ export * from "./Sandbox.js";
31
+ export * from "./Secret.js";
32
+ export * from "./Snapshot.js";
33
+ export * from "./Volume.js";
34
+ export * from "./WarmPool.js";
35
+ export * from "./Webhooks.js";
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,16 @@
1
+ import * as BuildPlan from "@alchemy.run/docker/BuildPlan";
2
+ import * as s3 from "@distilled.cloud/aws/s3";
3
+ import * as objectStorage from "@distilled.cloud/daytona/object_storage";
4
+ import * as Effect from "effect/Effect";
5
+ /**
6
+ * Upload a plan's context files to Daytona's build-context storage and
7
+ * return the hash `buildInfo.contextHashes` takes.
8
+ *
9
+ * Daytona's builders read each context from
10
+ * `<organizationId>/<hash>/context.tar` in the bucket `getPushAccess`
11
+ * names, with the temporary credentials it returns (the layout Daytona's
12
+ * own SDKs use). The files go in one archive at their context paths; an
13
+ * archive already uploaded under the same hash is reused.
14
+ */
15
+ export declare const uploadBuildContext: (plan: BuildPlan.BuildPlan) => Effect.Effect<string, import("@distilled.cloud/aws/Errors").AccessDeniedException | import("@distilled.cloud/aws/Credentials").AwsCredentialProviderError | import("@distilled.cloud/core/errors").BadGateway | import("@distilled.cloud/core/errors").BadRequest | s3.ConditionalRequestConflict | import("@distilled.cloud/core/config").ConfigError | import("@distilled.cloud/core/errors").Conflict | import("@distilled.cloud/aws/Credentials").ConflictingSSORegion | import("@distilled.cloud/aws/Credentials").ConflictingSSOStartUrl | import("../../../../submodules/distilled/packages/aws4signer/src/index.ts").CryptoError | import("@distilled.cloud/daytona/Errors").DaytonaParseError | s3.EncryptionTypeMismatch | import("@distilled.cloud/aws/Errors").EndpointError | import("@distilled.cloud/aws/Credentials").ExpiredSSOToken | import("@distilled.cloud/aws/Errors").ExpiredTokenException | import("@distilled.cloud/core/errors").Forbidden | import("@distilled.cloud/core/errors").GatewayTimeout | import("effect/http/HttpClientError").HttpClientError | import("@distilled.cloud/aws/Errors").IncompleteSignature | import("@distilled.cloud/aws/Errors").InternalFailure | import("@distilled.cloud/core/errors").InternalServerError | s3.InvalidAccessKeyId | import("@distilled.cloud/core/protocol-http").InvalidInput | s3.InvalidRequest | import("@distilled.cloud/aws/Credentials").InvalidSSOProfile | import("@distilled.cloud/aws/Credentials").InvalidSSOToken | import("../../../../submodules/distilled/packages/aws4signer/src/index.ts").InvalidSigningHeaders | import("../../../../submodules/distilled/packages/aws4signer/src/index.ts").InvalidSigningUrl | s3.InvalidWriteOffset | import("@distilled.cloud/core/errors").Locked | import("@distilled.cloud/aws/Errors").MalformedHttpRequestException | import("@distilled.cloud/aws/Region").MissingRegion | import("@distilled.cloud/aws/Errors").NoMatchingRuleError | s3.NoSuchBucket | import("@distilled.cloud/aws/Errors").NotAuthorized | import("@distilled.cloud/core/errors").NotFound | import("@distilled.cloud/aws/Errors").OperationAborted | import("@distilled.cloud/aws/Errors").OptInRequired | import("@distilled.cloud/aws/Errors").ParseError | s3.PermanentRedirect | import("effect/PlatformError").PlatformError | s3.PreconditionFailed | import("@distilled.cloud/aws/Credentials").ProfileNotFound | import("@distilled.cloud/aws/Errors").RequestAbortedException | import("@distilled.cloud/aws/Errors").RequestEntityTooLargeException | import("@distilled.cloud/aws/Errors").RequestExpired | s3.RequestLimitExceeded | import("@distilled.cloud/aws/Errors").RequestTimeoutException | import("@distilled.cloud/core/sdk-error").SdkError | import("@distilled.cloud/core/errors").ServiceUnavailable | import("@distilled.cloud/aws/Errors").ServiceUnavailable | import("@distilled.cloud/aws/Credentials").SharedConfigError | s3.SlowDown | import("effect/ConfigProvider").SourceError | import("@distilled.cloud/aws/Credentials").SsoPortalError | import("@distilled.cloud/aws/Errors").ThrottlingException | s3.TooManyParts | import("@distilled.cloud/core/errors").TooManyRequests | import("@distilled.cloud/core/errors").Unauthorized | import("@distilled.cloud/aws/Errors").UnknownAwsError | import("@distilled.cloud/daytona/Errors").UnknownDaytonaError | import("@distilled.cloud/aws/Errors").UnknownOperationException | import("@distilled.cloud/core/errors").UnprocessableEntity | import("@distilled.cloud/aws/Errors").UnrecognizedClientException | import("@distilled.cloud/aws/Errors").ValidationError | import("@distilled.cloud/aws/Errors").ValidationException, import("effect/FileSystem").FileSystem | objectStorage.DaytonaOpContext>;
16
+ //# sourceMappingURL=BuildContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildContext.d.ts","sources":["../../src/internal/BuildContext.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAC;AAI3D,OAAO,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,KAAK,aAAa,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAQxC;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,ynHAoC7B,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { createHash } from "node:crypto";
2
+ import * as BuildPlan from "@alchemy.run/docker/BuildPlan";
3
+ import { fromCredentials } from "@distilled.cloud/aws/Credentials";
4
+ import * as AwsEndpoint from "@distilled.cloud/aws/Endpoint";
5
+ import * as s3 from "@distilled.cloud/aws/s3";
6
+ import * as objectStorage from "@distilled.cloud/daytona/object_storage";
7
+ import * as Effect from "effect/Effect";
8
+ import * as Layer from "effect/Layer";
9
+ import * as Redacted from "effect/Redacted";
10
+ import { tar } from "./Tar.js";
11
+ const redact = (value) => Redacted.isRedacted(value) ? value : Redacted.make(value);
12
+ /**
13
+ * Upload a plan's context files to Daytona's build-context storage and
14
+ * return the hash `buildInfo.contextHashes` takes.
15
+ *
16
+ * Daytona's builders read each context from
17
+ * `<organizationId>/<hash>/context.tar` in the bucket `getPushAccess`
18
+ * names, with the temporary credentials it returns (the layout Daytona's
19
+ * own SDKs use). The files go in one archive at their context paths; an
20
+ * archive already uploaded under the same hash is reused.
21
+ */
22
+ export const uploadBuildContext = Effect.fn(function* (plan) {
23
+ const hash = yield* Effect.sync(() => createHash("sha256")
24
+ .update(JSON.stringify(plan.files.map((f) => [f.path, f.mode, f.sha256])))
25
+ .digest("hex")
26
+ .slice(0, 32));
27
+ const access = yield* objectStorage.getPushAccess({});
28
+ const prefix = `${access.organizationId}/${hash}/`;
29
+ const storage = Layer.mergeAll(fromCredentials({
30
+ accessKeyId: Redacted.make(access.accessKey),
31
+ secretAccessKey: redact(access.secret),
32
+ sessionToken: redact(access.sessionToken),
33
+ }, access.region), AwsEndpoint.of(access.storageUrl));
34
+ const existing = yield* s3
35
+ .listObjectsV2({ Bucket: access.bucket, Prefix: prefix, MaxKeys: 1 })
36
+ .pipe(Effect.provide(storage));
37
+ if ((existing.KeyCount ?? 0) > 0)
38
+ return hash;
39
+ const entries = yield* Effect.forEach(plan.files, (file) => Effect.map(BuildPlan.readContextFile(file), (bytes) => ({
40
+ path: file.path,
41
+ mode: file.mode,
42
+ bytes,
43
+ })));
44
+ const body = yield* Effect.sync(() => tar(entries));
45
+ yield* s3
46
+ .putObject({ Bucket: access.bucket, Key: `${prefix}context.tar`, Body: body })
47
+ .pipe(Effect.provide(storage));
48
+ return hash;
49
+ });
50
+ //# sourceMappingURL=BuildContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildContext.js","sources":["../../src/internal/BuildContext.ts"],"names":[],"mappings":"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"}